From 87245f71986d9a10fccca4b17523f6d54b4dab72 Mon Sep 17 00:00:00 2001 From: Prashant Jaikumar Date: Mon, 17 Jun 2019 17:09:24 -0700 Subject: [PATCH 001/758] Fix BoringSSL pod name --- test/cpp/cocoapods/Podfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/cpp/cocoapods/Podfile b/test/cpp/cocoapods/Podfile index 8d8cdaaadd4..7300a6e5775 100644 --- a/test/cpp/cocoapods/Podfile +++ b/test/cpp/cocoapods/Podfile @@ -14,7 +14,7 @@ GRPC_LOCAL_SRC = '../../..' pod 'gRPC-Core', :path => GRPC_LOCAL_SRC pod 'gRPC-Core/Tests', :path => GRPC_LOCAL_SRC pod 'gRPC-C++', :path => GRPC_LOCAL_SRC - pod 'BoringSSL', :podspec => "#{GRPC_LOCAL_SRC}/src/objective-c", :inhibit_warnings => true + pod 'BoringSSL-GRPC', :podspec => "#{GRPC_LOCAL_SRC}/src/objective-c", :inhibit_warnings => true end end From b48de5845e2996aa94ba9591f92d9a8fcfb40a34 Mon Sep 17 00:00:00 2001 From: Prashant Jaikumar Date: Tue, 24 Sep 2019 17:40:25 -0700 Subject: [PATCH 002/758] Update CFStream documentation --- src/objective-c/README-CFSTREAM.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/objective-c/README-CFSTREAM.md b/src/objective-c/README-CFSTREAM.md index 184d5679cbb..d4d26828534 100644 --- a/src/objective-c/README-CFSTREAM.md +++ b/src/objective-c/README-CFSTREAM.md @@ -1,7 +1,7 @@ [![Cocoapods](https://img.shields.io/cocoapods/v/gRPC.svg)](https://cocoapods.org/pods/gRPC) # gRPC Objective-C with CFStream -gRPC Objective-C library now provides the option to use Apple's CFStream API (rather than TCP +gRPC now provides the option to use Apple's CFStream API (rather than TCP sockets) for networking. Using CFStream resolves a bunch of network connectivity transition issues (see the [doc](https://github.com/grpc/grpc/blob/master/src/objective-c/NetworkTransitionBehavior.md) for more information). @@ -14,8 +14,11 @@ As of v1.21.0, CFStream integration is now the default networking stack being us Objective-C on iOS layer. You get to use it automatically without special configuration needed. See below on how to disable CFStream in case of problem. +As of v1.23.0, CFStream is enabled by default on iOS for all wrapped languages. See below on how to +disable CFStream in case of a problem. + ## Usage -If you use gRPC Objective-C library on iOS, CFStream is on automatically. If you use it on other +If you use gRPC on iOS, CFStream is on automatically. If you use it on other platforms, you can turn it on with macro `GRPC_CFSTREAM=1` for the pod 'gRPC-Core' and 'gRPC'. In case of problem and you want to disable CFStream on iOS, you can set environment variable "grpc\_cfstream=0". From 1fe8f0352d3b923e350aa31b01feb269094c4a27 Mon Sep 17 00:00:00 2001 From: Yannic Bonenberger Date: Thu, 24 Oct 2019 17:20:32 +0200 Subject: [PATCH 003/758] Add config for Bazel CI This PR adds a simple config to test parts of gRPC on Ubuntu 16.04. We will add more platforms (macOS, Windows, RBE, ...) when the build is green. See #19171 --- .bazelci/presubmit.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 .bazelci/presubmit.yml diff --git a/.bazelci/presubmit.yml b/.bazelci/presubmit.yml new file mode 100644 index 00000000000..9920bc9adfc --- /dev/null +++ b/.bazelci/presubmit.yml @@ -0,0 +1,12 @@ +--- +# TODO(yannic): Ideally, we should also enable buildifier and all platforms should test `//...`. +platforms: + ubuntu1604: + build_targets: + - //:all + - //src/proto/... + - //src/python/... + test_targets: + - //:all + - //src/proto/... + - //src/python/... From dfd3c3ad1b9e8c730d60f458497a18ccabf383f6 Mon Sep 17 00:00:00 2001 From: Yannic Date: Thu, 24 Oct 2019 19:05:43 +0200 Subject: [PATCH 004/758] Add description about Bazel CI --- .bazelci/presubmit.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/.bazelci/presubmit.yml b/.bazelci/presubmit.yml index 9920bc9adfc..386655d16bc 100644 --- a/.bazelci/presubmit.yml +++ b/.bazelci/presubmit.yml @@ -1,3 +1,14 @@ +# Configuration file for Bazel CI [1]. +# +# Also testing on Bazel CI in addition of our normal CI workflow +# ensures that gRPC is tested agains Bazel@HEAD and stays compatible +# with the latest release. +# +# See [2,3] in case you have questions. +# +# [1] https://github.com/bazelbuild/continuous-integration +# [2] https://github.com/grpc/grpc/issues/19171 +# [3] https://github.com/grpc/grpc/pull/20784 --- # TODO(yannic): Ideally, we should also enable buildifier and all platforms should test `//...`. platforms: From 6f424fa39a6509727614243af25a1ca3656e54b3 Mon Sep 17 00:00:00 2001 From: Yannic Date: Thu, 24 Oct 2019 19:30:59 +0200 Subject: [PATCH 005/758] s/agains/against --- .bazelci/presubmit.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.bazelci/presubmit.yml b/.bazelci/presubmit.yml index 386655d16bc..ab0bfd3a19d 100644 --- a/.bazelci/presubmit.yml +++ b/.bazelci/presubmit.yml @@ -1,7 +1,7 @@ # Configuration file for Bazel CI [1]. # # Also testing on Bazel CI in addition of our normal CI workflow -# ensures that gRPC is tested agains Bazel@HEAD and stays compatible +# ensures that gRPC is tested against Bazel@HEAD and stays compatible # with the latest release. # # See [2,3] in case you have questions. From 561281f268e84f28ccf51da9386baca091352085 Mon Sep 17 00:00:00 2001 From: Kevin Freeman Date: Tue, 29 Oct 2019 19:18:41 -0700 Subject: [PATCH 006/758] Add GRPC_ARG_HTTP_PROXY channel argument. Introduce the GRPC_ARG_HTTP_PROXY channel argument so that HTTP proxy settings can be controlled per channel. --- include/grpc/impl/codegen/grpc_types.h | 3 +++ src/core/ext/filters/client_channel/http_proxy.cc | 11 +++++++---- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/include/grpc/impl/codegen/grpc_types.h b/include/grpc/impl/codegen/grpc_types.h index cb28de0f9b1..4aa1e785ca8 100644 --- a/include/grpc/impl/codegen/grpc_types.h +++ b/include/grpc/impl/codegen/grpc_types.h @@ -373,6 +373,9 @@ typedef struct { "grpc.disable_client_authority_filter" /** If set to zero, disables use of http proxies. Enabled by default. */ #define GRPC_ARG_ENABLE_HTTP_PROXY "grpc.enable_http_proxy" +/** Channel arg to set http proxy per channel. If set, the channel arg + * value will be prefered over the http_proxy envrionment settings. */ +#define GRPC_ARG_HTTP_PROXY "grpc.http_proxy" /** If set to non zero, surfaces the user agent string to the server. User agent is surfaced by default. */ #define GRPC_ARG_SURFACE_USER_AGENT "grpc.surface_user_agent" diff --git a/src/core/ext/filters/client_channel/http_proxy.cc b/src/core/ext/filters/client_channel/http_proxy.cc index 1c4a227576a..5034a840b0f 100644 --- a/src/core/ext/filters/client_channel/http_proxy.cc +++ b/src/core/ext/filters/client_channel/http_proxy.cc @@ -42,16 +42,19 @@ * credentials if present in the 'http_proxy' env var, otherwise leaves it * unchanged. It is caller's responsibility to gpr_free user_cred. */ -static char* get_http_proxy_server(char** user_cred) { +static char* get_http_proxy_server(const grpc_channel_args* args, char** user_cred) { GPR_ASSERT(user_cred != nullptr); char* proxy_name = nullptr; char** authority_strs = nullptr; size_t authority_nstrs; - /* Prefer using 'grpc_proxy'. Fallback on 'http_proxy' if it is not set. + /* Check channel arguments in case a per channel proxy is set. Otherwise, + * prefer using 'grpc_proxy'. Fallback on 'http_proxy' if it is not set. * Also prefer using 'https_proxy' with fallback on 'http_proxy'. The * fallback behavior can be removed if there's a demand for it. */ - char* uri_str = gpr_getenv("grpc_proxy"); + const grpc_arg* arg = grpc_channel_args_find(args, GRPC_ARG_HTTP_PROXY); + char* uri_str = gpr_strdup(grpc_channel_arg_get_string(arg)); + if (uri_str == nullptr) uri_str = gpr_getenv("grpc_proxy"); if (uri_str == nullptr) uri_str = gpr_getenv("https_proxy"); if (uri_str == nullptr) uri_str = gpr_getenv("http_proxy"); if (uri_str == nullptr) return nullptr; @@ -108,7 +111,7 @@ static bool proxy_mapper_map_name(grpc_proxy_mapper* /*mapper*/, return false; } char* user_cred = nullptr; - *name_to_resolve = get_http_proxy_server(&user_cred); + *name_to_resolve = get_http_proxy_server(args, &user_cred); if (*name_to_resolve == nullptr) return false; char* no_proxy_str = nullptr; grpc_uri* uri = grpc_uri_parse(server_uri, false /* suppress_errors */); From 4ba9b6d44ed0a33d6dff0fb0e27f38597d6316c1 Mon Sep 17 00:00:00 2001 From: Yoshihiro Saito Date: Wed, 30 Oct 2019 15:47:38 +0900 Subject: [PATCH 007/758] Fix to use immutable string literal --- src/ruby/lib/grpc/generic/rpc_server.rb | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/src/ruby/lib/grpc/generic/rpc_server.rb b/src/ruby/lib/grpc/generic/rpc_server.rb index 2914d0f849f..2731680958a 100644 --- a/src/ruby/lib/grpc/generic/rpc_server.rb +++ b/src/ruby/lib/grpc/generic/rpc_server.rb @@ -391,22 +391,21 @@ module GRPC # register signal handlers signals.each do |sig| # input validation - if sig.class == String - sig.upcase! - if sig.start_with?('SIG') - # cut out the SIG prefix to see if valid signal - sig = sig[3..-1] - end - end + target_sig = if sig.class == String + # cut out the SIG prefix to see if valid signal + sig.upcase.start_with?('SIG') ? sig.upcase[3..-1] : sig.upcase + else + sig + end # register signal traps for all valid signals - if valid_signals.value?(sig) || valid_signals.key?(sig) - Signal.trap(sig) do + if valid_signals.value?(target_sig) || valid_signals.key?(target_sig) + Signal.trap(target_sig) do @stop_server = true @stop_server_cv.broadcast end else - fail "#{sig} not a valid signal" + fail "#{target_sig} not a valid signal" end end From 743824be5cea693e6ce597f6a4696f2f42edf60a Mon Sep 17 00:00:00 2001 From: Kevin Freeman Date: Wed, 30 Oct 2019 14:42:07 -0700 Subject: [PATCH 008/758] Fix review comments: - Clarify comments - Simplify code by using grpc_channel_args_find_string function --- include/grpc/impl/codegen/grpc_types.h | 2 +- src/core/ext/filters/client_channel/http_proxy.cc | 14 ++++++++------ 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/include/grpc/impl/codegen/grpc_types.h b/include/grpc/impl/codegen/grpc_types.h index 4aa1e785ca8..d3a723532ff 100644 --- a/include/grpc/impl/codegen/grpc_types.h +++ b/include/grpc/impl/codegen/grpc_types.h @@ -374,7 +374,7 @@ typedef struct { /** If set to zero, disables use of http proxies. Enabled by default. */ #define GRPC_ARG_ENABLE_HTTP_PROXY "grpc.enable_http_proxy" /** Channel arg to set http proxy per channel. If set, the channel arg - * value will be prefered over the http_proxy envrionment settings. */ + * value will be prefered over the envrionment variable settings. */ #define GRPC_ARG_HTTP_PROXY "grpc.http_proxy" /** If set to non zero, surfaces the user agent string to the server. User agent is surfaced by default. */ diff --git a/src/core/ext/filters/client_channel/http_proxy.cc b/src/core/ext/filters/client_channel/http_proxy.cc index 5034a840b0f..a710169c47f 100644 --- a/src/core/ext/filters/client_channel/http_proxy.cc +++ b/src/core/ext/filters/client_channel/http_proxy.cc @@ -47,13 +47,15 @@ static char* get_http_proxy_server(const grpc_channel_args* args, char** user_cr char* proxy_name = nullptr; char** authority_strs = nullptr; size_t authority_nstrs; - /* Check channel arguments in case a per channel proxy is set. Otherwise, - * prefer using 'grpc_proxy'. Fallback on 'http_proxy' if it is not set. - * Also prefer using 'https_proxy' with fallback on 'http_proxy'. The - * fallback behavior can be removed if there's a demand for it. + /* We check the following places to determine the HTTP proxy to use, stopping + * at the first one that is set: + * 1. GRPC_ARG_HTTP_PROXY channel arg + * 2. grpc_proxy environment variable + * 3. https_proxy environment variable + * 4. http_proxy environment variable + * If none of the above are set, then no HTTP proxy will be used. */ - const grpc_arg* arg = grpc_channel_args_find(args, GRPC_ARG_HTTP_PROXY); - char* uri_str = gpr_strdup(grpc_channel_arg_get_string(arg)); + char* uri_str = gpr_strdup(grpc_channel_args_find_string(args, GRPC_ARG_HTTP_PROXY)); if (uri_str == nullptr) uri_str = gpr_getenv("grpc_proxy"); if (uri_str == nullptr) uri_str = gpr_getenv("https_proxy"); if (uri_str == nullptr) uri_str = gpr_getenv("http_proxy"); From 6d61f63172ba8150f4055ce50f687ca8ad30965f Mon Sep 17 00:00:00 2001 From: Muxi Yan Date: Wed, 13 Nov 2019 14:27:58 -0800 Subject: [PATCH 009/758] Provide script to upgrade BoringSSL in Objective-C --- .gitignore | 2 +- ...erate_grpc_shadow_boringssl_symbol_list.sh | 66 +- tools/distrib/upgrade_boringssl_objc.sh | 48 + .../Dockerfile | 22 + .../generate_boringssl_prefix_header.sh | 28 + ...7f02881e96e51f1873afcf384d02f782b48967ca.h | 3243 +++++++++++++++++ 6 files changed, 3364 insertions(+), 45 deletions(-) mode change 100755 => 100644 tools/distrib/generate_grpc_shadow_boringssl_symbol_list.sh create mode 100755 tools/distrib/upgrade_boringssl_objc.sh create mode 100644 tools/dockerfile/grpc_objc/generate_boringssl_prefix_header/Dockerfile create mode 100755 tools/dockerfile/grpc_objc/generate_boringssl_prefix_header/generate_boringssl_prefix_header.sh create mode 100644 tools/dockerfile/grpc_objc/generate_boringssl_prefix_header/output/boringssl_prefix_symbols-7f02881e96e51f1873afcf384d02f782b48967ca.h diff --git a/.gitignore b/.gitignore index 06e8706f9a8..ace0e038a8f 100644 --- a/.gitignore +++ b/.gitignore @@ -95,6 +95,7 @@ DerivedData *.pbobjc.* *.pbrpc.* src/objective-c/**/Build +boringssl_prefix_header_out # Cocoapods artifacts Pods/ @@ -150,4 +151,3 @@ BenchmarkDotNet.Artifacts/ # pyenv config .python-version - diff --git a/tools/distrib/generate_grpc_shadow_boringssl_symbol_list.sh b/tools/distrib/generate_grpc_shadow_boringssl_symbol_list.sh old mode 100755 new mode 100644 index c1ee161daee..36cbfe8aa84 --- a/tools/distrib/generate_grpc_shadow_boringssl_symbol_list.sh +++ b/tools/distrib/generate_grpc_shadow_boringssl_symbol_list.sh @@ -15,49 +15,27 @@ # Generate the list of boringssl symbols that need to be shadowed based on the # current boringssl submodule. Requires local toolchain to build boringssl. -set -e - -cd $(dirname $0) - -symbol_list="../../src/objective-c/grpc_shadow_boringssl_symbol_list" - -ssl_lib='../../third_party/boringssl/build/ssl/libssl.a' -crypto_lib='../../third_party/boringssl/build/crypto/libcrypto.a' - -# Generate boringssl archives -( cd ../../third_party/boringssl ; mkdir -p build ; cd build ; cmake .. ; make -j ssl crypto ) - -# Generate shadow_boringssl.h -unameOut="$(uname -s)" -case "${unameOut}" in - Linux*) - outputs="$(nm $ssl_lib)"$'\n'"$(nm $crypto_lib)" - symbols=$(echo "$outputs" | - grep '^[0-9a-f]* [A-Z] ' | # Only public symbols - grep -v '^[0-9a-f]* [A-Z] _' | # Remove all symbols which look like for C++ - sed 's/[0-9a-f]* [A-Z] \(.*\)/\1/g' | # Extract the symbol names - sort) # Sort symbol names - ;; - Darwin*) - outputs="$(nm -C $ssl_lib)"$'\n'"$(nm -C $crypto_lib)" - symbols=$(echo "$outputs" | - grep '^[0-9a-f]* [A-Z] ' | # Only public symbols - grep -v ' bssl::' | # Filter BoringSSL symbols since they are already namespaced - sed 's/(.*//g' | # Remove parenthesis from C++ symbols - grep '^[0-9a-f]* [A-Z] _' | # Filter symbols that is not prefixed with '_' - sed 's/[0-9a-f]* [A-Z] _\(.*\)/\1/g' | # Extract the symbol names - sort) # Sort symbol names - ;; - *) - echo "Supports only Linux and Darwin but this system is $unameOut" - exit 1 - ;; -esac - -commit=$(git submodule | grep "boringssl " | awk '{print $1}' | head -n 1) - -echo "# Automatically generated by tools/distrib/generate_grpc_shadow_boringssl_symbol_list.sh" > $symbol_list -echo $commit >> $symbol_list -echo "$symbols" >> $symbol_list + +cd "$(dirname $0)" +cd ../../third_party/boringssl + +BORINGSSL_COMMIT=$(git rev-parse HEAD) + +# Do the following in grpc root directory +cd ../.. + +docker build tools/dockerfile/grpc_objc/generate_boringssl_prefix_header -t grpc/boringssl_prefix_header +mkdir ./boringssl_prefix_header_out +docker run -it --rm -v $(pwd)/boringssl_prefix_header_out:/output grpc/boringssl_prefix_header $BORINGSSL_COMMIT + +# increase the minor version by 1 +POD_VER=$(cat templates/src/objective-c/BoringSSL-GRPC.podspec.template | grep 'version = ' | perl -pe '($_)=/([0-9]+([.][0-9]+)+)/') +POD_VER_NEW="${POD_VER%.*}.$((${POD_VER##*.}+1))" +sed -i.grpc_back -e "s/version = '$POD_VER'/version = '$POD_VER_NEW'/g" templates/src/objective-c/BoringSSL-GRPC.podspec.template +rm templates/src/objective-c/BoringSSL-GRPC.podspec.template.grpc_back + +RED=$'\e[1;31m' +DEFAULT=$'\e[0m' +echo "${RED}Generated prefix header at /boringssl_prefix_header_out/boringssl_prefix_symbols-$BORINGSSL_COMMIT.h. Upload it to gRPC Team Cloud Storage at location gs://grpc_boringssl_prefix_headers. Regenerate the project.${DEFAULT}" exit 0 diff --git a/tools/distrib/upgrade_boringssl_objc.sh b/tools/distrib/upgrade_boringssl_objc.sh new file mode 100755 index 00000000000..b8750f21d45 --- /dev/null +++ b/tools/distrib/upgrade_boringssl_objc.sh @@ -0,0 +1,48 @@ +#!/bin/bash +# Copyright 2018 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Generate the list of boringssl symbols that need to be shadowed based on the +# current boringssl submodule. Requires local toolchain to build boringssl. + +set -e + +cd "$(dirname $0)" +cd ../../third_party/boringssl + +BORINGSSL_COMMIT=$(git rev-parse HEAD) + +# Do the following in grpc root directory +cd ../.. + +docker build tools/dockerfile/grpc_objc/generate_boringssl_prefix_header -t grpc/boringssl_prefix_header +mkdir -p ./boringssl_prefix_header_out +docker run -it --rm -v $(pwd)/boringssl_prefix_header_out:/output grpc/boringssl_prefix_header $BORINGSSL_COMMIT + +# increase the minor version by 1 +POD_VER=$(cat templates/src/objective-c/BoringSSL-GRPC.podspec.template | grep 'version = ' | perl -pe '($_)=/([0-9]+([.][0-9]+)+)/') +POD_VER_NEW="${POD_VER%.*}.$((${POD_VER##*.}+1))" +sed -i.grpc_back -e "s/version = '$POD_VER'/version = '$POD_VER_NEW'/g" templates/src/objective-c/BoringSSL-GRPC.podspec.template +sed -i.grpc_back -e "s/dependency 'BoringSSL-GRPC', '$POD_VER'/dependency 'BoringSSL-GRPC', '$POD_VER_NEW'/g" templates/gRPC-Core.podspec.template +rm templates/src/objective-c/BoringSSL-GRPC.podspec.template.grpc_back templates/gRPC-Core.podspec.template.grpc_back + +RED=$'\e[1;31m' +DEFAULT=$'\e[0m' +echo "" +echo "Upgrade is completed." +echo "${RED}TODOs:" +echo "1. The script generated prefix header at /boringssl_prefix_header_out/boringssl_prefix_symbols-$BORINGSSL_COMMIT.h. Upload it to gRPC Team Cloud Storage at location gs://grpc_boringssl_prefix_headers." +echo "2. Regenerate the project.${DEFAULT}" + +exit 0 diff --git a/tools/dockerfile/grpc_objc/generate_boringssl_prefix_header/Dockerfile b/tools/dockerfile/grpc_objc/generate_boringssl_prefix_header/Dockerfile new file mode 100644 index 00000000000..b56cf9a6e1a --- /dev/null +++ b/tools/dockerfile/grpc_objc/generate_boringssl_prefix_header/Dockerfile @@ -0,0 +1,22 @@ +FROM debian:buster + +ENV BORINGSSL_COMMIT=master + +RUN apt-get update && apt-get install -y \ + autoconf \ + cmake \ + curl \ + g++ \ + gcc \ + git \ + gnupg \ + golang \ + perl + +COPY generate_boringssl_prefix_header.sh / + +VOLUME /output + +WORKDIR / + +ENTRYPOINT ["/generate_boringssl_prefix_header.sh"] diff --git a/tools/dockerfile/grpc_objc/generate_boringssl_prefix_header/generate_boringssl_prefix_header.sh b/tools/dockerfile/grpc_objc/generate_boringssl_prefix_header/generate_boringssl_prefix_header.sh new file mode 100755 index 00000000000..691aee30cce --- /dev/null +++ b/tools/dockerfile/grpc_objc/generate_boringssl_prefix_header/generate_boringssl_prefix_header.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +[ $# == 1 ] || { echo "Usage: generate_boringssl_prefix_header.sh " ; exit 1 ; } + +git clone -n https://github.com/google/boringssl.git +cd boringssl +git checkout $1 || { echo "Unable to checkout the commit $1" ; exit 1 ; } +mkdir build +cd build +cmake .. + +# gcc crashes on docker when using -j with too many cores. Limiting to 2 seems to be fine. +make -j2 + +[ -f ssl/libssl.a ] || { echo "Failed to build libssl.a" ; exit 1 ; } +[ -f crypto/libcrypto.a ] || { echo "Failed to build libcrypto.a" ; exit 1 ; } + +go run ../util/read_symbols.go ssl/libssl.a > ./symbols.txt +go run ../util/read_symbols.go crypto/libcrypto.a >> ./symbols.txt + +cmake .. -DBORINGSSL_PREFIX=GRPC -DBORINGSSL_PREFIX_SYMBOLS=symbols.txt +make boringssl_prefix_symbols + +[ -f symbol_prefix_include/boringssl_prefix_symbols.h ] || { echo "Failed to build boringssl_prefix_symbols.sh" ; exit 1 ; } + +cp symbol_prefix_include/boringssl_prefix_symbols.h /output/boringssl_prefix_symbols-$1.h + +exit 0 diff --git a/tools/dockerfile/grpc_objc/generate_boringssl_prefix_header/output/boringssl_prefix_symbols-7f02881e96e51f1873afcf384d02f782b48967ca.h b/tools/dockerfile/grpc_objc/generate_boringssl_prefix_header/output/boringssl_prefix_symbols-7f02881e96e51f1873afcf384d02f782b48967ca.h new file mode 100644 index 00000000000..173b2d432f8 --- /dev/null +++ b/tools/dockerfile/grpc_objc/generate_boringssl_prefix_header/output/boringssl_prefix_symbols-7f02881e96e51f1873afcf384d02f782b48967ca.h @@ -0,0 +1,3243 @@ +// Copyright (c) 2018, Google Inc. +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION +// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +// BORINGSSL_ADD_PREFIX pastes two identifiers into one. It performs one +// iteration of macro expansion on its arguments before pasting. +#define BORINGSSL_ADD_PREFIX(a, b) BORINGSSL_ADD_PREFIX_INNER(a, b) +#define BORINGSSL_ADD_PREFIX_INNER(a, b) a ## _ ## b + +#define BIO_f_ssl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_f_ssl) +#define BIO_set_ssl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_ssl) +#define DTLS_client_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DTLS_client_method) +#define DTLS_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DTLS_method) +#define DTLS_server_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DTLS_server_method) +#define DTLS_with_buffers_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DTLS_with_buffers_method) +#define DTLSv1_2_client_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DTLSv1_2_client_method) +#define DTLSv1_2_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DTLSv1_2_method) +#define DTLSv1_2_server_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DTLSv1_2_server_method) +#define DTLSv1_client_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DTLSv1_client_method) +#define DTLSv1_get_timeout BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DTLSv1_get_timeout) +#define DTLSv1_handle_timeout BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DTLSv1_handle_timeout) +#define DTLSv1_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DTLSv1_method) +#define DTLSv1_server_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DTLSv1_server_method) +#define DTLSv1_set_initial_timeout_duration BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DTLSv1_set_initial_timeout_duration) +#define ERR_load_SSL_strings BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_load_SSL_strings) +#define OPENSSL_init_ssl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_init_ssl) +#define PEM_read_SSL_SESSION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_SSL_SESSION) +#define PEM_read_bio_SSL_SESSION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_SSL_SESSION) +#define PEM_write_SSL_SESSION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_SSL_SESSION) +#define PEM_write_bio_SSL_SESSION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_SSL_SESSION) +#define SSL_CIPHER_description BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_description) +#define SSL_CIPHER_get_auth_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_get_auth_nid) +#define SSL_CIPHER_get_bits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_get_bits) +#define SSL_CIPHER_get_cipher_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_get_cipher_nid) +#define SSL_CIPHER_get_digest_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_get_digest_nid) +#define SSL_CIPHER_get_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_get_id) +#define SSL_CIPHER_get_kx_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_get_kx_name) +#define SSL_CIPHER_get_kx_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_get_kx_nid) +#define SSL_CIPHER_get_max_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_get_max_version) +#define SSL_CIPHER_get_min_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_get_min_version) +#define SSL_CIPHER_get_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_get_name) +#define SSL_CIPHER_get_prf_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_get_prf_nid) +#define SSL_CIPHER_get_rfc_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_get_rfc_name) +#define SSL_CIPHER_get_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_get_value) +#define SSL_CIPHER_get_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_get_version) +#define SSL_CIPHER_is_aead BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_is_aead) +#define SSL_CIPHER_is_block_cipher BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_is_block_cipher) +#define SSL_CIPHER_standard_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_standard_name) +#define SSL_COMP_add_compression_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_COMP_add_compression_method) +#define SSL_COMP_free_compression_methods BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_COMP_free_compression_methods) +#define SSL_COMP_get0_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_COMP_get0_name) +#define SSL_COMP_get_compression_methods BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_COMP_get_compression_methods) +#define SSL_COMP_get_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_COMP_get_id) +#define SSL_COMP_get_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_COMP_get_name) +#define SSL_CTX_add0_chain_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_add0_chain_cert) +#define SSL_CTX_add1_chain_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_add1_chain_cert) +#define SSL_CTX_add_cert_compression_alg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_add_cert_compression_alg) +#define SSL_CTX_add_client_CA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_add_client_CA) +#define SSL_CTX_add_extra_chain_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_add_extra_chain_cert) +#define SSL_CTX_add_session BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_add_session) +#define SSL_CTX_check_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_check_private_key) +#define SSL_CTX_cipher_in_group BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_cipher_in_group) +#define SSL_CTX_clear_chain_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_clear_chain_certs) +#define SSL_CTX_clear_extra_chain_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_clear_extra_chain_certs) +#define SSL_CTX_clear_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_clear_mode) +#define SSL_CTX_clear_options BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_clear_options) +#define SSL_CTX_enable_ocsp_stapling BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_enable_ocsp_stapling) +#define SSL_CTX_enable_pq_experiment_signal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_enable_pq_experiment_signal) +#define SSL_CTX_enable_signed_cert_timestamps BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_enable_signed_cert_timestamps) +#define SSL_CTX_enable_tls_channel_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_enable_tls_channel_id) +#define SSL_CTX_flush_sessions BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_flush_sessions) +#define SSL_CTX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_free) +#define SSL_CTX_get0_certificate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get0_certificate) +#define SSL_CTX_get0_chain_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get0_chain_certs) +#define SSL_CTX_get0_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get0_param) +#define SSL_CTX_get0_privatekey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get0_privatekey) +#define SSL_CTX_get_cert_store BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_cert_store) +#define SSL_CTX_get_channel_id_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_channel_id_cb) +#define SSL_CTX_get_ciphers BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_ciphers) +#define SSL_CTX_get_client_CA_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_client_CA_list) +#define SSL_CTX_get_default_passwd_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_default_passwd_cb) +#define SSL_CTX_get_default_passwd_cb_userdata BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_default_passwd_cb_userdata) +#define SSL_CTX_get_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_ex_data) +#define SSL_CTX_get_ex_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_ex_new_index) +#define SSL_CTX_get_extra_chain_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_extra_chain_certs) +#define SSL_CTX_get_info_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_info_callback) +#define SSL_CTX_get_keylog_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_keylog_callback) +#define SSL_CTX_get_max_cert_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_max_cert_list) +#define SSL_CTX_get_max_proto_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_max_proto_version) +#define SSL_CTX_get_min_proto_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_min_proto_version) +#define SSL_CTX_get_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_mode) +#define SSL_CTX_get_options BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_options) +#define SSL_CTX_get_quiet_shutdown BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_quiet_shutdown) +#define SSL_CTX_get_read_ahead BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_read_ahead) +#define SSL_CTX_get_session_cache_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_session_cache_mode) +#define SSL_CTX_get_timeout BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_timeout) +#define SSL_CTX_get_tlsext_ticket_keys BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_tlsext_ticket_keys) +#define SSL_CTX_get_verify_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_verify_callback) +#define SSL_CTX_get_verify_depth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_verify_depth) +#define SSL_CTX_get_verify_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_verify_mode) +#define SSL_CTX_load_verify_locations BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_load_verify_locations) +#define SSL_CTX_need_tmp_RSA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_need_tmp_RSA) +#define SSL_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_new) +#define SSL_CTX_remove_session BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_remove_session) +#define SSL_CTX_sess_accept BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_accept) +#define SSL_CTX_sess_accept_good BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_accept_good) +#define SSL_CTX_sess_accept_renegotiate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_accept_renegotiate) +#define SSL_CTX_sess_cache_full BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_cache_full) +#define SSL_CTX_sess_cb_hits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_cb_hits) +#define SSL_CTX_sess_connect BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_connect) +#define SSL_CTX_sess_connect_good BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_connect_good) +#define SSL_CTX_sess_connect_renegotiate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_connect_renegotiate) +#define SSL_CTX_sess_get_cache_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_get_cache_size) +#define SSL_CTX_sess_get_get_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_get_get_cb) +#define SSL_CTX_sess_get_new_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_get_new_cb) +#define SSL_CTX_sess_get_remove_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_get_remove_cb) +#define SSL_CTX_sess_hits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_hits) +#define SSL_CTX_sess_misses BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_misses) +#define SSL_CTX_sess_number BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_number) +#define SSL_CTX_sess_set_cache_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_set_cache_size) +#define SSL_CTX_sess_set_get_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_set_get_cb) +#define SSL_CTX_sess_set_new_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_set_new_cb) +#define SSL_CTX_sess_set_remove_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_set_remove_cb) +#define SSL_CTX_sess_timeouts BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_timeouts) +#define SSL_CTX_set0_buffer_pool BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set0_buffer_pool) +#define SSL_CTX_set0_chain BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set0_chain) +#define SSL_CTX_set0_client_CAs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set0_client_CAs) +#define SSL_CTX_set0_verify_cert_store BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set0_verify_cert_store) +#define SSL_CTX_set1_chain BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set1_chain) +#define SSL_CTX_set1_curves BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set1_curves) +#define SSL_CTX_set1_curves_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set1_curves_list) +#define SSL_CTX_set1_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set1_param) +#define SSL_CTX_set1_sigalgs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set1_sigalgs) +#define SSL_CTX_set1_sigalgs_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set1_sigalgs_list) +#define SSL_CTX_set1_tls_channel_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set1_tls_channel_id) +#define SSL_CTX_set1_verify_cert_store BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set1_verify_cert_store) +#define SSL_CTX_set_allow_unknown_alpn_protos BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_allow_unknown_alpn_protos) +#define SSL_CTX_set_alpn_protos BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_alpn_protos) +#define SSL_CTX_set_alpn_select_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_alpn_select_cb) +#define SSL_CTX_set_cert_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_cert_cb) +#define SSL_CTX_set_cert_store BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_cert_store) +#define SSL_CTX_set_cert_verify_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_cert_verify_callback) +#define SSL_CTX_set_chain_and_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_chain_and_key) +#define SSL_CTX_set_channel_id_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_channel_id_cb) +#define SSL_CTX_set_cipher_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_cipher_list) +#define SSL_CTX_set_client_CA_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_client_CA_list) +#define SSL_CTX_set_client_cert_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_client_cert_cb) +#define SSL_CTX_set_current_time_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_current_time_cb) +#define SSL_CTX_set_custom_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_custom_verify) +#define SSL_CTX_set_default_passwd_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_default_passwd_cb) +#define SSL_CTX_set_default_passwd_cb_userdata BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_default_passwd_cb_userdata) +#define SSL_CTX_set_default_verify_paths BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_default_verify_paths) +#define SSL_CTX_set_dos_protection_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_dos_protection_cb) +#define SSL_CTX_set_early_data_enabled BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_early_data_enabled) +#define SSL_CTX_set_ed25519_enabled BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_ed25519_enabled) +#define SSL_CTX_set_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_ex_data) +#define SSL_CTX_set_false_start_allowed_without_alpn BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_false_start_allowed_without_alpn) +#define SSL_CTX_set_grease_enabled BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_grease_enabled) +#define SSL_CTX_set_ignore_tls13_downgrade BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_ignore_tls13_downgrade) +#define SSL_CTX_set_info_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_info_callback) +#define SSL_CTX_set_keylog_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_keylog_callback) +#define SSL_CTX_set_max_cert_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_max_cert_list) +#define SSL_CTX_set_max_proto_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_max_proto_version) +#define SSL_CTX_set_max_send_fragment BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_max_send_fragment) +#define SSL_CTX_set_min_proto_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_min_proto_version) +#define SSL_CTX_set_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_mode) +#define SSL_CTX_set_msg_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_msg_callback) +#define SSL_CTX_set_msg_callback_arg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_msg_callback_arg) +#define SSL_CTX_set_next_proto_select_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_next_proto_select_cb) +#define SSL_CTX_set_next_protos_advertised_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_next_protos_advertised_cb) +#define SSL_CTX_set_ocsp_response BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_ocsp_response) +#define SSL_CTX_set_options BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_options) +#define SSL_CTX_set_private_key_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_private_key_method) +#define SSL_CTX_set_psk_client_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_psk_client_callback) +#define SSL_CTX_set_psk_server_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_psk_server_callback) +#define SSL_CTX_set_purpose BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_purpose) +#define SSL_CTX_set_quic_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_quic_method) +#define SSL_CTX_set_quiet_shutdown BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_quiet_shutdown) +#define SSL_CTX_set_read_ahead BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_read_ahead) +#define SSL_CTX_set_retain_only_sha256_of_client_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_retain_only_sha256_of_client_certs) +#define SSL_CTX_set_reverify_on_resume BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_reverify_on_resume) +#define SSL_CTX_set_rsa_pss_rsae_certs_enabled BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_rsa_pss_rsae_certs_enabled) +#define SSL_CTX_set_select_certificate_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_select_certificate_cb) +#define SSL_CTX_set_session_cache_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_session_cache_mode) +#define SSL_CTX_set_session_id_context BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_session_id_context) +#define SSL_CTX_set_session_psk_dhe_timeout BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_session_psk_dhe_timeout) +#define SSL_CTX_set_signed_cert_timestamp_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_signed_cert_timestamp_list) +#define SSL_CTX_set_signing_algorithm_prefs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_signing_algorithm_prefs) +#define SSL_CTX_set_srtp_profiles BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_srtp_profiles) +#define SSL_CTX_set_strict_cipher_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_strict_cipher_list) +#define SSL_CTX_set_ticket_aead_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_ticket_aead_method) +#define SSL_CTX_set_timeout BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_timeout) +#define SSL_CTX_set_tls_channel_id_enabled BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_tls_channel_id_enabled) +#define SSL_CTX_set_tlsext_servername_arg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_tlsext_servername_arg) +#define SSL_CTX_set_tlsext_servername_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_tlsext_servername_callback) +#define SSL_CTX_set_tlsext_status_arg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_tlsext_status_arg) +#define SSL_CTX_set_tlsext_status_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_tlsext_status_cb) +#define SSL_CTX_set_tlsext_ticket_key_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_tlsext_ticket_key_cb) +#define SSL_CTX_set_tlsext_ticket_keys BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_tlsext_ticket_keys) +#define SSL_CTX_set_tlsext_use_srtp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_tlsext_use_srtp) +#define SSL_CTX_set_tmp_dh BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_tmp_dh) +#define SSL_CTX_set_tmp_dh_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_tmp_dh_callback) +#define SSL_CTX_set_tmp_ecdh BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_tmp_ecdh) +#define SSL_CTX_set_tmp_rsa BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_tmp_rsa) +#define SSL_CTX_set_tmp_rsa_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_tmp_rsa_callback) +#define SSL_CTX_set_trust BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_trust) +#define SSL_CTX_set_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_verify) +#define SSL_CTX_set_verify_algorithm_prefs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_verify_algorithm_prefs) +#define SSL_CTX_set_verify_depth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_verify_depth) +#define SSL_CTX_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_up_ref) +#define SSL_CTX_use_PrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_use_PrivateKey) +#define SSL_CTX_use_PrivateKey_ASN1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_use_PrivateKey_ASN1) +#define SSL_CTX_use_PrivateKey_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_use_PrivateKey_file) +#define SSL_CTX_use_RSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_use_RSAPrivateKey) +#define SSL_CTX_use_RSAPrivateKey_ASN1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_use_RSAPrivateKey_ASN1) +#define SSL_CTX_use_RSAPrivateKey_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_use_RSAPrivateKey_file) +#define SSL_CTX_use_certificate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_use_certificate) +#define SSL_CTX_use_certificate_ASN1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_use_certificate_ASN1) +#define SSL_CTX_use_certificate_chain_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_use_certificate_chain_file) +#define SSL_CTX_use_certificate_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_use_certificate_file) +#define SSL_CTX_use_psk_identity_hint BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_use_psk_identity_hint) +#define SSL_SESSION_early_data_capable BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_early_data_capable) +#define SSL_SESSION_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_free) +#define SSL_SESSION_from_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_from_bytes) +#define SSL_SESSION_get0_cipher BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get0_cipher) +#define SSL_SESSION_get0_id_context BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get0_id_context) +#define SSL_SESSION_get0_ocsp_response BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get0_ocsp_response) +#define SSL_SESSION_get0_peer BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get0_peer) +#define SSL_SESSION_get0_peer_certificates BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get0_peer_certificates) +#define SSL_SESSION_get0_peer_sha256 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get0_peer_sha256) +#define SSL_SESSION_get0_signed_cert_timestamp_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get0_signed_cert_timestamp_list) +#define SSL_SESSION_get0_ticket BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get0_ticket) +#define SSL_SESSION_get_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get_ex_data) +#define SSL_SESSION_get_ex_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get_ex_new_index) +#define SSL_SESSION_get_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get_id) +#define SSL_SESSION_get_master_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get_master_key) +#define SSL_SESSION_get_protocol_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get_protocol_version) +#define SSL_SESSION_get_ticket_lifetime_hint BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get_ticket_lifetime_hint) +#define SSL_SESSION_get_time BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get_time) +#define SSL_SESSION_get_timeout BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get_timeout) +#define SSL_SESSION_get_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get_version) +#define SSL_SESSION_has_peer_sha256 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_has_peer_sha256) +#define SSL_SESSION_has_ticket BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_has_ticket) +#define SSL_SESSION_is_resumable BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_is_resumable) +#define SSL_SESSION_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_new) +#define SSL_SESSION_set1_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_set1_id) +#define SSL_SESSION_set1_id_context BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_set1_id_context) +#define SSL_SESSION_set_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_set_ex_data) +#define SSL_SESSION_set_protocol_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_set_protocol_version) +#define SSL_SESSION_set_ticket BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_set_ticket) +#define SSL_SESSION_set_time BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_set_time) +#define SSL_SESSION_set_timeout BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_set_timeout) +#define SSL_SESSION_should_be_single_use BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_should_be_single_use) +#define SSL_SESSION_to_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_to_bytes) +#define SSL_SESSION_to_bytes_for_ticket BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_to_bytes_for_ticket) +#define SSL_SESSION_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_up_ref) +#define SSL_accept BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_accept) +#define SSL_add0_chain_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_add0_chain_cert) +#define SSL_add1_chain_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_add1_chain_cert) +#define SSL_add_client_CA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_add_client_CA) +#define SSL_add_file_cert_subjects_to_stack BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_add_file_cert_subjects_to_stack) +#define SSL_alert_desc_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_alert_desc_string) +#define SSL_alert_desc_string_long BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_alert_desc_string_long) +#define SSL_alert_from_verify_result BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_alert_from_verify_result) +#define SSL_alert_type_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_alert_type_string) +#define SSL_alert_type_string_long BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_alert_type_string_long) +#define SSL_cache_hit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_cache_hit) +#define SSL_certs_clear BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_certs_clear) +#define SSL_check_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_check_private_key) +#define SSL_clear BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_clear) +#define SSL_clear_chain_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_clear_chain_certs) +#define SSL_clear_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_clear_mode) +#define SSL_clear_options BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_clear_options) +#define SSL_connect BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_connect) +#define SSL_cutthrough_complete BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_cutthrough_complete) +#define SSL_delegated_credential_used BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_delegated_credential_used) +#define SSL_do_handshake BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_do_handshake) +#define SSL_dup_CA_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_dup_CA_list) +#define SSL_early_callback_ctx_extension_get BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_early_callback_ctx_extension_get) +#define SSL_early_data_accepted BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_early_data_accepted) +#define SSL_enable_ocsp_stapling BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_enable_ocsp_stapling) +#define SSL_enable_signed_cert_timestamps BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_enable_signed_cert_timestamps) +#define SSL_enable_tls_channel_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_enable_tls_channel_id) +#define SSL_error_description BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_error_description) +#define SSL_export_keying_material BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_export_keying_material) +#define SSL_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_free) +#define SSL_generate_key_block BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_generate_key_block) +#define SSL_get0_alpn_selected BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get0_alpn_selected) +#define SSL_get0_certificate_types BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get0_certificate_types) +#define SSL_get0_chain_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get0_chain_certs) +#define SSL_get0_next_proto_negotiated BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get0_next_proto_negotiated) +#define SSL_get0_ocsp_response BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get0_ocsp_response) +#define SSL_get0_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get0_param) +#define SSL_get0_peer_certificates BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get0_peer_certificates) +#define SSL_get0_peer_verify_algorithms BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get0_peer_verify_algorithms) +#define SSL_get0_server_requested_CAs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get0_server_requested_CAs) +#define SSL_get0_session_id_context BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get0_session_id_context) +#define SSL_get0_signed_cert_timestamp_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get0_signed_cert_timestamp_list) +#define SSL_get1_session BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get1_session) +#define SSL_get_SSL_CTX BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_SSL_CTX) +#define SSL_get_certificate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_certificate) +#define SSL_get_cipher_by_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_cipher_by_value) +#define SSL_get_cipher_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_cipher_list) +#define SSL_get_ciphers BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_ciphers) +#define SSL_get_client_CA_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_client_CA_list) +#define SSL_get_client_random BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_client_random) +#define SSL_get_current_cipher BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_current_cipher) +#define SSL_get_current_compression BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_current_compression) +#define SSL_get_current_expansion BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_current_expansion) +#define SSL_get_curve_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_curve_id) +#define SSL_get_curve_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_curve_name) +#define SSL_get_default_timeout BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_default_timeout) +#define SSL_get_early_data_reason BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_early_data_reason) +#define SSL_get_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_error) +#define SSL_get_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_ex_data) +#define SSL_get_ex_data_X509_STORE_CTX_idx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_ex_data_X509_STORE_CTX_idx) +#define SSL_get_ex_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_ex_new_index) +#define SSL_get_extms_support BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_extms_support) +#define SSL_get_fd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_fd) +#define SSL_get_finished BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_finished) +#define SSL_get_info_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_info_callback) +#define SSL_get_ivs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_ivs) +#define SSL_get_key_block_len BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_key_block_len) +#define SSL_get_max_cert_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_max_cert_list) +#define SSL_get_max_proto_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_max_proto_version) +#define SSL_get_min_proto_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_min_proto_version) +#define SSL_get_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_mode) +#define SSL_get_negotiated_token_binding_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_negotiated_token_binding_param) +#define SSL_get_options BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_options) +#define SSL_get_peer_cert_chain BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_peer_cert_chain) +#define SSL_get_peer_certificate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_peer_certificate) +#define SSL_get_peer_finished BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_peer_finished) +#define SSL_get_peer_full_cert_chain BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_peer_full_cert_chain) +#define SSL_get_peer_quic_transport_params BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_peer_quic_transport_params) +#define SSL_get_peer_signature_algorithm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_peer_signature_algorithm) +#define SSL_get_pending_cipher BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_pending_cipher) +#define SSL_get_privatekey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_privatekey) +#define SSL_get_psk_identity BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_psk_identity) +#define SSL_get_psk_identity_hint BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_psk_identity_hint) +#define SSL_get_quiet_shutdown BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_quiet_shutdown) +#define SSL_get_rbio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_rbio) +#define SSL_get_read_ahead BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_read_ahead) +#define SSL_get_read_sequence BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_read_sequence) +#define SSL_get_rfd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_rfd) +#define SSL_get_secure_renegotiation_support BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_secure_renegotiation_support) +#define SSL_get_selected_srtp_profile BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_selected_srtp_profile) +#define SSL_get_server_random BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_server_random) +#define SSL_get_server_tmp_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_server_tmp_key) +#define SSL_get_servername BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_servername) +#define SSL_get_servername_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_servername_type) +#define SSL_get_session BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_session) +#define SSL_get_shared_ciphers BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_shared_ciphers) +#define SSL_get_shutdown BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_shutdown) +#define SSL_get_signature_algorithm_digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_signature_algorithm_digest) +#define SSL_get_signature_algorithm_key_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_signature_algorithm_key_type) +#define SSL_get_signature_algorithm_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_signature_algorithm_name) +#define SSL_get_srtp_profiles BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_srtp_profiles) +#define SSL_get_ticket_age_skew BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_ticket_age_skew) +#define SSL_get_tls_channel_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_tls_channel_id) +#define SSL_get_tls_unique BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_tls_unique) +#define SSL_get_tlsext_status_ocsp_resp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_tlsext_status_ocsp_resp) +#define SSL_get_tlsext_status_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_tlsext_status_type) +#define SSL_get_verify_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_verify_callback) +#define SSL_get_verify_depth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_verify_depth) +#define SSL_get_verify_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_verify_mode) +#define SSL_get_verify_result BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_verify_result) +#define SSL_get_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_version) +#define SSL_get_wbio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_wbio) +#define SSL_get_wfd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_wfd) +#define SSL_get_write_sequence BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_write_sequence) +#define SSL_in_early_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_in_early_data) +#define SSL_in_false_start BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_in_false_start) +#define SSL_in_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_in_init) +#define SSL_is_dtls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_is_dtls) +#define SSL_is_init_finished BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_is_init_finished) +#define SSL_is_server BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_is_server) +#define SSL_is_signature_algorithm_rsa_pss BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_is_signature_algorithm_rsa_pss) +#define SSL_is_tls13_downgrade BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_is_tls13_downgrade) +#define SSL_is_token_binding_negotiated BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_is_token_binding_negotiated) +#define SSL_key_update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_key_update) +#define SSL_library_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_library_init) +#define SSL_load_client_CA_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_load_client_CA_file) +#define SSL_load_error_strings BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_load_error_strings) +#define SSL_magic_pending_session_ptr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_magic_pending_session_ptr) +#define SSL_max_seal_overhead BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_max_seal_overhead) +#define SSL_need_tmp_RSA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_need_tmp_RSA) +#define SSL_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_new) +#define SSL_num_renegotiations BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_num_renegotiations) +#define SSL_peek BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_peek) +#define SSL_pending BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_pending) +#define SSL_pq_experiment_signal_seen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_pq_experiment_signal_seen) +#define SSL_process_quic_post_handshake BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_process_quic_post_handshake) +#define SSL_provide_quic_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_provide_quic_data) +#define SSL_quic_max_handshake_flight_len BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_quic_max_handshake_flight_len) +#define SSL_quic_read_level BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_quic_read_level) +#define SSL_quic_write_level BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_quic_write_level) +#define SSL_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_read) +#define SSL_renegotiate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_renegotiate) +#define SSL_renegotiate_pending BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_renegotiate_pending) +#define SSL_reset_early_data_reject BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_reset_early_data_reject) +#define SSL_select_next_proto BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_select_next_proto) +#define SSL_send_fatal_alert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_send_fatal_alert) +#define SSL_session_reused BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_session_reused) +#define SSL_set0_chain BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set0_chain) +#define SSL_set0_client_CAs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set0_client_CAs) +#define SSL_set0_rbio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set0_rbio) +#define SSL_set0_verify_cert_store BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set0_verify_cert_store) +#define SSL_set0_wbio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set0_wbio) +#define SSL_set1_chain BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set1_chain) +#define SSL_set1_curves BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set1_curves) +#define SSL_set1_curves_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set1_curves_list) +#define SSL_set1_delegated_credential BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set1_delegated_credential) +#define SSL_set1_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set1_param) +#define SSL_set1_sigalgs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set1_sigalgs) +#define SSL_set1_sigalgs_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set1_sigalgs_list) +#define SSL_set1_tls_channel_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set1_tls_channel_id) +#define SSL_set1_verify_cert_store BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set1_verify_cert_store) +#define SSL_set_SSL_CTX BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_SSL_CTX) +#define SSL_set_accept_state BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_accept_state) +#define SSL_set_alpn_protos BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_alpn_protos) +#define SSL_set_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_bio) +#define SSL_set_cert_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_cert_cb) +#define SSL_set_chain_and_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_chain_and_key) +#define SSL_set_cipher_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_cipher_list) +#define SSL_set_client_CA_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_client_CA_list) +#define SSL_set_connect_state BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_connect_state) +#define SSL_set_custom_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_custom_verify) +#define SSL_set_early_data_enabled BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_early_data_enabled) +#define SSL_set_enforce_rsa_key_usage BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_enforce_rsa_key_usage) +#define SSL_set_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_ex_data) +#define SSL_set_fd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_fd) +#define SSL_set_ignore_tls13_downgrade BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_ignore_tls13_downgrade) +#define SSL_set_info_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_info_callback) +#define SSL_set_jdk11_workaround BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_jdk11_workaround) +#define SSL_set_max_cert_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_max_cert_list) +#define SSL_set_max_proto_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_max_proto_version) +#define SSL_set_max_send_fragment BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_max_send_fragment) +#define SSL_set_min_proto_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_min_proto_version) +#define SSL_set_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_mode) +#define SSL_set_msg_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_msg_callback) +#define SSL_set_msg_callback_arg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_msg_callback_arg) +#define SSL_set_mtu BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_mtu) +#define SSL_set_ocsp_response BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_ocsp_response) +#define SSL_set_options BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_options) +#define SSL_set_private_key_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_private_key_method) +#define SSL_set_psk_client_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_psk_client_callback) +#define SSL_set_psk_server_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_psk_server_callback) +#define SSL_set_purpose BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_purpose) +#define SSL_set_quic_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_quic_method) +#define SSL_set_quic_transport_params BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_quic_transport_params) +#define SSL_set_quiet_shutdown BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_quiet_shutdown) +#define SSL_set_read_ahead BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_read_ahead) +#define SSL_set_renegotiate_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_renegotiate_mode) +#define SSL_set_retain_only_sha256_of_client_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_retain_only_sha256_of_client_certs) +#define SSL_set_rfd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_rfd) +#define SSL_set_session BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_session) +#define SSL_set_session_id_context BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_session_id_context) +#define SSL_set_shed_handshake_config BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_shed_handshake_config) +#define SSL_set_shutdown BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_shutdown) +#define SSL_set_signed_cert_timestamp_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_signed_cert_timestamp_list) +#define SSL_set_signing_algorithm_prefs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_signing_algorithm_prefs) +#define SSL_set_srtp_profiles BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_srtp_profiles) +#define SSL_set_state BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_state) +#define SSL_set_strict_cipher_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_strict_cipher_list) +#define SSL_set_tls_channel_id_enabled BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_tls_channel_id_enabled) +#define SSL_set_tlsext_host_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_tlsext_host_name) +#define SSL_set_tlsext_status_ocsp_resp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_tlsext_status_ocsp_resp) +#define SSL_set_tlsext_status_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_tlsext_status_type) +#define SSL_set_tlsext_use_srtp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_tlsext_use_srtp) +#define SSL_set_tmp_dh BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_tmp_dh) +#define SSL_set_tmp_dh_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_tmp_dh_callback) +#define SSL_set_tmp_ecdh BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_tmp_ecdh) +#define SSL_set_tmp_rsa BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_tmp_rsa) +#define SSL_set_tmp_rsa_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_tmp_rsa_callback) +#define SSL_set_token_binding_params BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_token_binding_params) +#define SSL_set_trust BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_trust) +#define SSL_set_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_verify) +#define SSL_set_verify_depth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_verify_depth) +#define SSL_set_verify_result BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_verify_result) +#define SSL_set_wfd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_wfd) +#define SSL_shutdown BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_shutdown) +#define SSL_state BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_state) +#define SSL_state_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_state_string) +#define SSL_state_string_long BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_state_string_long) +#define SSL_total_renegotiations BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_total_renegotiations) +#define SSL_use_PrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_use_PrivateKey) +#define SSL_use_PrivateKey_ASN1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_use_PrivateKey_ASN1) +#define SSL_use_PrivateKey_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_use_PrivateKey_file) +#define SSL_use_RSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_use_RSAPrivateKey) +#define SSL_use_RSAPrivateKey_ASN1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_use_RSAPrivateKey_ASN1) +#define SSL_use_RSAPrivateKey_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_use_RSAPrivateKey_file) +#define SSL_use_certificate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_use_certificate) +#define SSL_use_certificate_ASN1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_use_certificate_ASN1) +#define SSL_use_certificate_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_use_certificate_file) +#define SSL_use_psk_identity_hint BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_use_psk_identity_hint) +#define SSL_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_version) +#define SSL_want BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_want) +#define SSL_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_write) +#define SSLv23_client_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSLv23_client_method) +#define SSLv23_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSLv23_method) +#define SSLv23_server_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSLv23_server_method) +#define TLS_client_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TLS_client_method) +#define TLS_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TLS_method) +#define TLS_server_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TLS_server_method) +#define TLS_with_buffers_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TLS_with_buffers_method) +#define TLSv1_1_client_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TLSv1_1_client_method) +#define TLSv1_1_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TLSv1_1_method) +#define TLSv1_1_server_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TLSv1_1_server_method) +#define TLSv1_2_client_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TLSv1_2_client_method) +#define TLSv1_2_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TLSv1_2_method) +#define TLSv1_2_server_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TLSv1_2_server_method) +#define TLSv1_client_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TLSv1_client_method) +#define TLSv1_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TLSv1_method) +#define TLSv1_server_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TLSv1_server_method) +#define d2i_SSL_SESSION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_SSL_SESSION) +#define d2i_SSL_SESSION_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_SSL_SESSION_bio) +#define i2d_SSL_SESSION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_SSL_SESSION) +#define i2d_SSL_SESSION_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_SSL_SESSION_bio) +#define sk_CRYPTO_BUFFER_call_copy_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_CRYPTO_BUFFER_call_copy_func) +#define sk_CRYPTO_BUFFER_call_free_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_CRYPTO_BUFFER_call_free_func) +#define sk_CRYPTO_BUFFER_deep_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_CRYPTO_BUFFER_deep_copy) +#define sk_CRYPTO_BUFFER_new_null BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_CRYPTO_BUFFER_new_null) +#define sk_CRYPTO_BUFFER_num BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_CRYPTO_BUFFER_num) +#define sk_CRYPTO_BUFFER_push BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_CRYPTO_BUFFER_push) +#define sk_CRYPTO_BUFFER_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_CRYPTO_BUFFER_set) +#define sk_CRYPTO_BUFFER_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_CRYPTO_BUFFER_value) +#define sk_SRTP_PROTECTION_PROFILE_new_null BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_SRTP_PROTECTION_PROFILE_new_null) +#define sk_SRTP_PROTECTION_PROFILE_num BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_SRTP_PROTECTION_PROFILE_num) +#define sk_SRTP_PROTECTION_PROFILE_push BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_SRTP_PROTECTION_PROFILE_push) +#define sk_SSL_CIPHER_call_cmp_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_SSL_CIPHER_call_cmp_func) +#define sk_SSL_CIPHER_delete BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_SSL_CIPHER_delete) +#define sk_SSL_CIPHER_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_SSL_CIPHER_dup) +#define sk_SSL_CIPHER_find BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_SSL_CIPHER_find) +#define sk_SSL_CIPHER_new_null BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_SSL_CIPHER_new_null) +#define sk_SSL_CIPHER_num BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_SSL_CIPHER_num) +#define sk_SSL_CIPHER_push BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_SSL_CIPHER_push) +#define sk_SSL_CIPHER_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_SSL_CIPHER_value) +#define sk_X509_NAME_call_cmp_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_NAME_call_cmp_func) +#define sk_X509_NAME_call_copy_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_NAME_call_copy_func) +#define sk_X509_NAME_call_free_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_NAME_call_free_func) +#define sk_X509_NAME_deep_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_NAME_deep_copy) +#define sk_X509_NAME_find BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_NAME_find) +#define sk_X509_NAME_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_NAME_free) +#define sk_X509_NAME_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_NAME_new) +#define sk_X509_NAME_new_null BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_NAME_new_null) +#define sk_X509_NAME_pop_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_NAME_pop_free) +#define sk_X509_NAME_push BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_NAME_push) +#define sk_X509_NAME_set_cmp_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_NAME_set_cmp_func) +#define sk_X509_NAME_sort BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_NAME_sort) +#define sk_X509_call_free_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_call_free_func) +#define sk_X509_new_null BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_new_null) +#define sk_X509_num BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_num) +#define sk_X509_pop_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_pop_free) +#define sk_X509_shift BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_shift) +#define sk_X509_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_value) +#define ACCESS_DESCRIPTION_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ACCESS_DESCRIPTION_free) +#define ACCESS_DESCRIPTION_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ACCESS_DESCRIPTION_it) +#define ACCESS_DESCRIPTION_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ACCESS_DESCRIPTION_new) +#define AES_CMAC BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AES_CMAC) +#define AES_cbc_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AES_cbc_encrypt) +#define AES_cfb128_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AES_cfb128_encrypt) +#define AES_ctr128_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AES_ctr128_encrypt) +#define AES_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AES_decrypt) +#define AES_ecb_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AES_ecb_encrypt) +#define AES_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AES_encrypt) +#define AES_ofb128_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AES_ofb128_encrypt) +#define AES_set_decrypt_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AES_set_decrypt_key) +#define AES_set_encrypt_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AES_set_encrypt_key) +#define AES_unwrap_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AES_unwrap_key) +#define AES_unwrap_key_padded BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AES_unwrap_key_padded) +#define AES_wrap_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AES_wrap_key) +#define AES_wrap_key_padded BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AES_wrap_key_padded) +#define ASN1_ANY_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_ANY_it) +#define ASN1_BIT_STRING_check BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_BIT_STRING_check) +#define ASN1_BIT_STRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_BIT_STRING_free) +#define ASN1_BIT_STRING_get_bit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_BIT_STRING_get_bit) +#define ASN1_BIT_STRING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_BIT_STRING_it) +#define ASN1_BIT_STRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_BIT_STRING_new) +#define ASN1_BIT_STRING_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_BIT_STRING_set) +#define ASN1_BIT_STRING_set_bit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_BIT_STRING_set_bit) +#define ASN1_BMPSTRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_BMPSTRING_free) +#define ASN1_BMPSTRING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_BMPSTRING_it) +#define ASN1_BMPSTRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_BMPSTRING_new) +#define ASN1_BOOLEAN_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_BOOLEAN_it) +#define ASN1_ENUMERATED_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_ENUMERATED_free) +#define ASN1_ENUMERATED_get BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_ENUMERATED_get) +#define ASN1_ENUMERATED_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_ENUMERATED_it) +#define ASN1_ENUMERATED_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_ENUMERATED_new) +#define ASN1_ENUMERATED_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_ENUMERATED_set) +#define ASN1_ENUMERATED_to_BN BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_ENUMERATED_to_BN) +#define ASN1_FBOOLEAN_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_FBOOLEAN_it) +#define ASN1_GENERALIZEDTIME_adj BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_GENERALIZEDTIME_adj) +#define ASN1_GENERALIZEDTIME_check BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_GENERALIZEDTIME_check) +#define ASN1_GENERALIZEDTIME_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_GENERALIZEDTIME_free) +#define ASN1_GENERALIZEDTIME_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_GENERALIZEDTIME_it) +#define ASN1_GENERALIZEDTIME_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_GENERALIZEDTIME_new) +#define ASN1_GENERALIZEDTIME_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_GENERALIZEDTIME_print) +#define ASN1_GENERALIZEDTIME_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_GENERALIZEDTIME_set) +#define ASN1_GENERALIZEDTIME_set_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_GENERALIZEDTIME_set_string) +#define ASN1_GENERALSTRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_GENERALSTRING_free) +#define ASN1_GENERALSTRING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_GENERALSTRING_it) +#define ASN1_GENERALSTRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_GENERALSTRING_new) +#define ASN1_IA5STRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_IA5STRING_free) +#define ASN1_IA5STRING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_IA5STRING_it) +#define ASN1_IA5STRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_IA5STRING_new) +#define ASN1_INTEGER_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_INTEGER_cmp) +#define ASN1_INTEGER_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_INTEGER_dup) +#define ASN1_INTEGER_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_INTEGER_free) +#define ASN1_INTEGER_get BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_INTEGER_get) +#define ASN1_INTEGER_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_INTEGER_it) +#define ASN1_INTEGER_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_INTEGER_new) +#define ASN1_INTEGER_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_INTEGER_set) +#define ASN1_INTEGER_set_uint64 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_INTEGER_set_uint64) +#define ASN1_INTEGER_to_BN BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_INTEGER_to_BN) +#define ASN1_NULL_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_NULL_free) +#define ASN1_NULL_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_NULL_it) +#define ASN1_NULL_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_NULL_new) +#define ASN1_OBJECT_create BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_OBJECT_create) +#define ASN1_OBJECT_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_OBJECT_free) +#define ASN1_OBJECT_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_OBJECT_it) +#define ASN1_OBJECT_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_OBJECT_new) +#define ASN1_OCTET_STRING_NDEF_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_OCTET_STRING_NDEF_it) +#define ASN1_OCTET_STRING_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_OCTET_STRING_cmp) +#define ASN1_OCTET_STRING_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_OCTET_STRING_dup) +#define ASN1_OCTET_STRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_OCTET_STRING_free) +#define ASN1_OCTET_STRING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_OCTET_STRING_it) +#define ASN1_OCTET_STRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_OCTET_STRING_new) +#define ASN1_OCTET_STRING_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_OCTET_STRING_set) +#define ASN1_PRINTABLESTRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_PRINTABLESTRING_free) +#define ASN1_PRINTABLESTRING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_PRINTABLESTRING_it) +#define ASN1_PRINTABLESTRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_PRINTABLESTRING_new) +#define ASN1_PRINTABLE_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_PRINTABLE_free) +#define ASN1_PRINTABLE_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_PRINTABLE_it) +#define ASN1_PRINTABLE_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_PRINTABLE_new) +#define ASN1_PRINTABLE_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_PRINTABLE_type) +#define ASN1_SEQUENCE_ANY_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_SEQUENCE_ANY_it) +#define ASN1_SEQUENCE_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_SEQUENCE_it) +#define ASN1_SET_ANY_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_SET_ANY_it) +#define ASN1_STRING_TABLE_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_TABLE_add) +#define ASN1_STRING_TABLE_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_TABLE_cleanup) +#define ASN1_STRING_TABLE_get BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_TABLE_get) +#define ASN1_STRING_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_cmp) +#define ASN1_STRING_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_copy) +#define ASN1_STRING_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_data) +#define ASN1_STRING_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_dup) +#define ASN1_STRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_free) +#define ASN1_STRING_get0_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_get0_data) +#define ASN1_STRING_get_default_mask BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_get_default_mask) +#define ASN1_STRING_length BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_length) +#define ASN1_STRING_length_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_length_set) +#define ASN1_STRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_new) +#define ASN1_STRING_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_print) +#define ASN1_STRING_print_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_print_ex) +#define ASN1_STRING_print_ex_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_print_ex_fp) +#define ASN1_STRING_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_set) +#define ASN1_STRING_set0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_set0) +#define ASN1_STRING_set_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_set_by_NID) +#define ASN1_STRING_set_default_mask BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_set_default_mask) +#define ASN1_STRING_set_default_mask_asc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_set_default_mask_asc) +#define ASN1_STRING_to_UTF8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_to_UTF8) +#define ASN1_STRING_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_type) +#define ASN1_STRING_type_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_type_new) +#define ASN1_T61STRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_T61STRING_free) +#define ASN1_T61STRING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_T61STRING_it) +#define ASN1_T61STRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_T61STRING_new) +#define ASN1_TBOOLEAN_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TBOOLEAN_it) +#define ASN1_TIME_adj BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TIME_adj) +#define ASN1_TIME_check BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TIME_check) +#define ASN1_TIME_diff BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TIME_diff) +#define ASN1_TIME_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TIME_free) +#define ASN1_TIME_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TIME_it) +#define ASN1_TIME_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TIME_new) +#define ASN1_TIME_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TIME_print) +#define ASN1_TIME_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TIME_set) +#define ASN1_TIME_set_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TIME_set_string) +#define ASN1_TIME_to_generalizedtime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TIME_to_generalizedtime) +#define ASN1_TYPE_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TYPE_cmp) +#define ASN1_TYPE_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TYPE_free) +#define ASN1_TYPE_get BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TYPE_get) +#define ASN1_TYPE_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TYPE_new) +#define ASN1_TYPE_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TYPE_set) +#define ASN1_TYPE_set1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TYPE_set1) +#define ASN1_UNIVERSALSTRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_UNIVERSALSTRING_free) +#define ASN1_UNIVERSALSTRING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_UNIVERSALSTRING_it) +#define ASN1_UNIVERSALSTRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_UNIVERSALSTRING_new) +#define ASN1_UTCTIME_adj BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_UTCTIME_adj) +#define ASN1_UTCTIME_check BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_UTCTIME_check) +#define ASN1_UTCTIME_cmp_time_t BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_UTCTIME_cmp_time_t) +#define ASN1_UTCTIME_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_UTCTIME_free) +#define ASN1_UTCTIME_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_UTCTIME_it) +#define ASN1_UTCTIME_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_UTCTIME_new) +#define ASN1_UTCTIME_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_UTCTIME_print) +#define ASN1_UTCTIME_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_UTCTIME_set) +#define ASN1_UTCTIME_set_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_UTCTIME_set_string) +#define ASN1_UTF8STRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_UTF8STRING_free) +#define ASN1_UTF8STRING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_UTF8STRING_it) +#define ASN1_UTF8STRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_UTF8STRING_new) +#define ASN1_VISIBLESTRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_VISIBLESTRING_free) +#define ASN1_VISIBLESTRING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_VISIBLESTRING_it) +#define ASN1_VISIBLESTRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_VISIBLESTRING_new) +#define ASN1_digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_digest) +#define ASN1_generate_nconf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_generate_nconf) +#define ASN1_generate_v3 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_generate_v3) +#define ASN1_get_object BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_get_object) +#define ASN1_item_d2i BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_d2i) +#define ASN1_item_d2i_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_d2i_bio) +#define ASN1_item_d2i_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_d2i_fp) +#define ASN1_item_digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_digest) +#define ASN1_item_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_dup) +#define ASN1_item_ex_d2i BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_ex_d2i) +#define ASN1_item_ex_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_ex_free) +#define ASN1_item_ex_i2d BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_ex_i2d) +#define ASN1_item_ex_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_ex_new) +#define ASN1_item_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_free) +#define ASN1_item_i2d BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_i2d) +#define ASN1_item_i2d_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_i2d_bio) +#define ASN1_item_i2d_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_i2d_fp) +#define ASN1_item_ndef_i2d BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_ndef_i2d) +#define ASN1_item_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_new) +#define ASN1_item_pack BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_pack) +#define ASN1_item_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_sign) +#define ASN1_item_sign_ctx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_sign_ctx) +#define ASN1_item_unpack BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_unpack) +#define ASN1_item_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_verify) +#define ASN1_mbstring_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_mbstring_copy) +#define ASN1_mbstring_ncopy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_mbstring_ncopy) +#define ASN1_object_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_object_size) +#define ASN1_primitive_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_primitive_free) +#define ASN1_primitive_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_primitive_new) +#define ASN1_put_eoc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_put_eoc) +#define ASN1_put_object BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_put_object) +#define ASN1_tag2bit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_tag2bit) +#define ASN1_tag2str BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_tag2str) +#define ASN1_template_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_template_free) +#define ASN1_template_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_template_new) +#define AUTHORITY_INFO_ACCESS_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AUTHORITY_INFO_ACCESS_free) +#define AUTHORITY_INFO_ACCESS_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AUTHORITY_INFO_ACCESS_it) +#define AUTHORITY_INFO_ACCESS_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AUTHORITY_INFO_ACCESS_new) +#define AUTHORITY_KEYID_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AUTHORITY_KEYID_free) +#define AUTHORITY_KEYID_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AUTHORITY_KEYID_it) +#define AUTHORITY_KEYID_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AUTHORITY_KEYID_new) +#define BASIC_CONSTRAINTS_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BASIC_CONSTRAINTS_free) +#define BASIC_CONSTRAINTS_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BASIC_CONSTRAINTS_it) +#define BASIC_CONSTRAINTS_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BASIC_CONSTRAINTS_new) +#define BIO_append_filename BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_append_filename) +#define BIO_callback_ctrl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_callback_ctrl) +#define BIO_clear_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_clear_flags) +#define BIO_clear_retry_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_clear_retry_flags) +#define BIO_copy_next_retry BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_copy_next_retry) +#define BIO_ctrl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_ctrl) +#define BIO_ctrl_get_read_request BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_ctrl_get_read_request) +#define BIO_ctrl_get_write_guarantee BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_ctrl_get_write_guarantee) +#define BIO_ctrl_pending BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_ctrl_pending) +#define BIO_do_connect BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_do_connect) +#define BIO_eof BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_eof) +#define BIO_find_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_find_type) +#define BIO_flush BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_flush) +#define BIO_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_free) +#define BIO_free_all BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_free_all) +#define BIO_get_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_get_data) +#define BIO_get_fd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_get_fd) +#define BIO_get_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_get_fp) +#define BIO_get_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_get_init) +#define BIO_get_mem_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_get_mem_data) +#define BIO_get_mem_ptr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_get_mem_ptr) +#define BIO_get_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_get_new_index) +#define BIO_get_retry_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_get_retry_flags) +#define BIO_get_retry_reason BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_get_retry_reason) +#define BIO_get_shutdown BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_get_shutdown) +#define BIO_gets BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_gets) +#define BIO_hexdump BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_hexdump) +#define BIO_indent BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_indent) +#define BIO_int_ctrl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_int_ctrl) +#define BIO_mem_contents BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_mem_contents) +#define BIO_meth_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_meth_free) +#define BIO_meth_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_meth_new) +#define BIO_meth_set_create BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_meth_set_create) +#define BIO_meth_set_ctrl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_meth_set_ctrl) +#define BIO_meth_set_destroy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_meth_set_destroy) +#define BIO_meth_set_gets BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_meth_set_gets) +#define BIO_meth_set_puts BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_meth_set_puts) +#define BIO_meth_set_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_meth_set_read) +#define BIO_meth_set_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_meth_set_write) +#define BIO_method_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_method_type) +#define BIO_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_new) +#define BIO_new_bio_pair BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_new_bio_pair) +#define BIO_new_connect BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_new_connect) +#define BIO_new_fd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_new_fd) +#define BIO_new_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_new_file) +#define BIO_new_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_new_fp) +#define BIO_new_mem_buf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_new_mem_buf) +#define BIO_new_socket BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_new_socket) +#define BIO_next BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_next) +#define BIO_number_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_number_read) +#define BIO_number_written BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_number_written) +#define BIO_pending BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_pending) +#define BIO_pop BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_pop) +#define BIO_printf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_printf) +#define BIO_ptr_ctrl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_ptr_ctrl) +#define BIO_push BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_push) +#define BIO_puts BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_puts) +#define BIO_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_read) +#define BIO_read_asn1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_read_asn1) +#define BIO_read_filename BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_read_filename) +#define BIO_reset BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_reset) +#define BIO_rw_filename BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_rw_filename) +#define BIO_s_connect BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_s_connect) +#define BIO_s_fd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_s_fd) +#define BIO_s_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_s_file) +#define BIO_s_mem BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_s_mem) +#define BIO_s_socket BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_s_socket) +#define BIO_set_close BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_close) +#define BIO_set_conn_hostname BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_conn_hostname) +#define BIO_set_conn_int_port BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_conn_int_port) +#define BIO_set_conn_port BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_conn_port) +#define BIO_set_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_data) +#define BIO_set_fd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_fd) +#define BIO_set_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_flags) +#define BIO_set_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_fp) +#define BIO_set_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_init) +#define BIO_set_mem_buf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_mem_buf) +#define BIO_set_mem_eof_return BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_mem_eof_return) +#define BIO_set_nbio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_nbio) +#define BIO_set_retry_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_retry_read) +#define BIO_set_retry_special BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_retry_special) +#define BIO_set_retry_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_retry_write) +#define BIO_set_shutdown BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_shutdown) +#define BIO_set_write_buffer_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_write_buffer_size) +#define BIO_should_io_special BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_should_io_special) +#define BIO_should_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_should_read) +#define BIO_should_retry BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_should_retry) +#define BIO_should_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_should_write) +#define BIO_shutdown_wr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_shutdown_wr) +#define BIO_snprintf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_snprintf) +#define BIO_test_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_test_flags) +#define BIO_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_up_ref) +#define BIO_vfree BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_vfree) +#define BIO_vsnprintf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_vsnprintf) +#define BIO_wpending BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_wpending) +#define BIO_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_write) +#define BIO_write_all BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_write_all) +#define BIO_write_filename BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_write_filename) +#define BN_BLINDING_convert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_BLINDING_convert) +#define BN_BLINDING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_BLINDING_free) +#define BN_BLINDING_invert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_BLINDING_invert) +#define BN_BLINDING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_BLINDING_new) +#define BN_CTX_end BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_CTX_end) +#define BN_CTX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_CTX_free) +#define BN_CTX_get BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_CTX_get) +#define BN_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_CTX_new) +#define BN_CTX_start BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_CTX_start) +#define BN_GENCB_call BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_GENCB_call) +#define BN_GENCB_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_GENCB_set) +#define BN_MONT_CTX_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_MONT_CTX_copy) +#define BN_MONT_CTX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_MONT_CTX_free) +#define BN_MONT_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_MONT_CTX_new) +#define BN_MONT_CTX_new_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_MONT_CTX_new_consttime) +#define BN_MONT_CTX_new_for_modulus BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_MONT_CTX_new_for_modulus) +#define BN_MONT_CTX_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_MONT_CTX_set) +#define BN_MONT_CTX_set_locked BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_MONT_CTX_set_locked) +#define BN_abs_is_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_abs_is_word) +#define BN_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_add) +#define BN_add_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_add_word) +#define BN_asc2bn BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_asc2bn) +#define BN_bin2bn BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_bin2bn) +#define BN_bn2bin BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_bn2bin) +#define BN_bn2bin_padded BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_bn2bin_padded) +#define BN_bn2binpad BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_bn2binpad) +#define BN_bn2cbb_padded BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_bn2cbb_padded) +#define BN_bn2dec BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_bn2dec) +#define BN_bn2hex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_bn2hex) +#define BN_bn2le_padded BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_bn2le_padded) +#define BN_bn2mpi BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_bn2mpi) +#define BN_clear BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_clear) +#define BN_clear_bit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_clear_bit) +#define BN_clear_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_clear_free) +#define BN_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_cmp) +#define BN_cmp_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_cmp_word) +#define BN_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_copy) +#define BN_count_low_zero_bits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_count_low_zero_bits) +#define BN_dec2bn BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_dec2bn) +#define BN_div BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_div) +#define BN_div_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_div_word) +#define BN_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_dup) +#define BN_enhanced_miller_rabin_primality_test BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_enhanced_miller_rabin_primality_test) +#define BN_equal_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_equal_consttime) +#define BN_exp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_exp) +#define BN_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_free) +#define BN_from_montgomery BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_from_montgomery) +#define BN_gcd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_gcd) +#define BN_generate_prime_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_generate_prime_ex) +#define BN_get_rfc3526_prime_1536 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_get_rfc3526_prime_1536) +#define BN_get_u64 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_get_u64) +#define BN_get_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_get_word) +#define BN_hex2bn BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_hex2bn) +#define BN_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_init) +#define BN_is_bit_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_is_bit_set) +#define BN_is_negative BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_is_negative) +#define BN_is_odd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_is_odd) +#define BN_is_one BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_is_one) +#define BN_is_pow2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_is_pow2) +#define BN_is_prime_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_is_prime_ex) +#define BN_is_prime_fasttest_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_is_prime_fasttest_ex) +#define BN_is_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_is_word) +#define BN_is_zero BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_is_zero) +#define BN_le2bn BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_le2bn) +#define BN_lshift BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_lshift) +#define BN_lshift1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_lshift1) +#define BN_marshal_asn1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_marshal_asn1) +#define BN_mask_bits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mask_bits) +#define BN_mod_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_add) +#define BN_mod_add_quick BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_add_quick) +#define BN_mod_exp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_exp) +#define BN_mod_exp2_mont BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_exp2_mont) +#define BN_mod_exp_mont BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_exp_mont) +#define BN_mod_exp_mont_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_exp_mont_consttime) +#define BN_mod_exp_mont_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_exp_mont_word) +#define BN_mod_inverse BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_inverse) +#define BN_mod_inverse_blinded BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_inverse_blinded) +#define BN_mod_inverse_odd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_inverse_odd) +#define BN_mod_lshift BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_lshift) +#define BN_mod_lshift1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_lshift1) +#define BN_mod_lshift1_quick BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_lshift1_quick) +#define BN_mod_lshift_quick BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_lshift_quick) +#define BN_mod_mul BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_mul) +#define BN_mod_mul_montgomery BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_mul_montgomery) +#define BN_mod_pow2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_pow2) +#define BN_mod_sqr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_sqr) +#define BN_mod_sqrt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_sqrt) +#define BN_mod_sub BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_sub) +#define BN_mod_sub_quick BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_sub_quick) +#define BN_mod_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_word) +#define BN_mpi2bn BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mpi2bn) +#define BN_mul BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mul) +#define BN_mul_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mul_word) +#define BN_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_new) +#define BN_nnmod BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_nnmod) +#define BN_nnmod_pow2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_nnmod_pow2) +#define BN_num_bits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_num_bits) +#define BN_num_bits_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_num_bits_word) +#define BN_num_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_num_bytes) +#define BN_one BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_one) +#define BN_parse_asn1_unsigned BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_parse_asn1_unsigned) +#define BN_primality_test BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_primality_test) +#define BN_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_print) +#define BN_print_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_print_fp) +#define BN_pseudo_rand BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_pseudo_rand) +#define BN_pseudo_rand_range BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_pseudo_rand_range) +#define BN_rand BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_rand) +#define BN_rand_range BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_rand_range) +#define BN_rand_range_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_rand_range_ex) +#define BN_rshift BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_rshift) +#define BN_rshift1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_rshift1) +#define BN_set_bit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_set_bit) +#define BN_set_negative BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_set_negative) +#define BN_set_u64 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_set_u64) +#define BN_set_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_set_word) +#define BN_sqr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_sqr) +#define BN_sqrt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_sqrt) +#define BN_sub BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_sub) +#define BN_sub_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_sub_word) +#define BN_to_ASN1_ENUMERATED BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_to_ASN1_ENUMERATED) +#define BN_to_ASN1_INTEGER BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_to_ASN1_INTEGER) +#define BN_to_montgomery BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_to_montgomery) +#define BN_uadd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_uadd) +#define BN_ucmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_ucmp) +#define BN_usub BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_usub) +#define BN_value_one BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_value_one) +#define BN_zero BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_zero) +#define BORINGSSL_function_hit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BORINGSSL_function_hit) +#define BORINGSSL_self_test BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BORINGSSL_self_test) +#define BUF_MEM_append BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BUF_MEM_append) +#define BUF_MEM_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BUF_MEM_free) +#define BUF_MEM_grow BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BUF_MEM_grow) +#define BUF_MEM_grow_clean BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BUF_MEM_grow_clean) +#define BUF_MEM_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BUF_MEM_new) +#define BUF_MEM_reserve BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BUF_MEM_reserve) +#define BUF_memdup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BUF_memdup) +#define BUF_strdup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BUF_strdup) +#define BUF_strlcat BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BUF_strlcat) +#define BUF_strlcpy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BUF_strlcpy) +#define BUF_strndup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BUF_strndup) +#define BUF_strnlen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BUF_strnlen) +#define CBB_add_asn1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_asn1) +#define CBB_add_asn1_bool BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_asn1_bool) +#define CBB_add_asn1_octet_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_asn1_octet_string) +#define CBB_add_asn1_oid_from_text BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_asn1_oid_from_text) +#define CBB_add_asn1_uint64 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_asn1_uint64) +#define CBB_add_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_bytes) +#define CBB_add_space BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_space) +#define CBB_add_u16 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_u16) +#define CBB_add_u16_length_prefixed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_u16_length_prefixed) +#define CBB_add_u24 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_u24) +#define CBB_add_u24_length_prefixed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_u24_length_prefixed) +#define CBB_add_u32 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_u32) +#define CBB_add_u64 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_u64) +#define CBB_add_u8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_u8) +#define CBB_add_u8_length_prefixed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_u8_length_prefixed) +#define CBB_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_cleanup) +#define CBB_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_data) +#define CBB_did_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_did_write) +#define CBB_discard_child BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_discard_child) +#define CBB_finish BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_finish) +#define CBB_finish_i2d BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_finish_i2d) +#define CBB_flush BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_flush) +#define CBB_flush_asn1_set_of BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_flush_asn1_set_of) +#define CBB_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_init) +#define CBB_init_fixed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_init_fixed) +#define CBB_len BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_len) +#define CBB_reserve BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_reserve) +#define CBB_zero BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_zero) +#define CBS_asn1_ber_to_der BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_asn1_ber_to_der) +#define CBS_asn1_bitstring_has_bit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_asn1_bitstring_has_bit) +#define CBS_asn1_oid_to_text BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_asn1_oid_to_text) +#define CBS_contains_zero_byte BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_contains_zero_byte) +#define CBS_copy_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_copy_bytes) +#define CBS_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_data) +#define CBS_get_any_asn1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_any_asn1) +#define CBS_get_any_asn1_element BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_any_asn1_element) +#define CBS_get_any_ber_asn1_element BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_any_ber_asn1_element) +#define CBS_get_asn1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_asn1) +#define CBS_get_asn1_bool BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_asn1_bool) +#define CBS_get_asn1_element BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_asn1_element) +#define CBS_get_asn1_implicit_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_asn1_implicit_string) +#define CBS_get_asn1_uint64 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_asn1_uint64) +#define CBS_get_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_bytes) +#define CBS_get_last_u8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_last_u8) +#define CBS_get_optional_asn1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_optional_asn1) +#define CBS_get_optional_asn1_bool BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_optional_asn1_bool) +#define CBS_get_optional_asn1_octet_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_optional_asn1_octet_string) +#define CBS_get_optional_asn1_uint64 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_optional_asn1_uint64) +#define CBS_get_u16 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_u16) +#define CBS_get_u16_length_prefixed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_u16_length_prefixed) +#define CBS_get_u24 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_u24) +#define CBS_get_u24_length_prefixed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_u24_length_prefixed) +#define CBS_get_u32 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_u32) +#define CBS_get_u64 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_u64) +#define CBS_get_u8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_u8) +#define CBS_get_u8_length_prefixed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_u8_length_prefixed) +#define CBS_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_init) +#define CBS_is_valid_asn1_bitstring BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_is_valid_asn1_bitstring) +#define CBS_len BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_len) +#define CBS_mem_equal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_mem_equal) +#define CBS_peek_asn1_tag BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_peek_asn1_tag) +#define CBS_skip BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_skip) +#define CBS_stow BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_stow) +#define CBS_strdup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_strdup) +#define CERTIFICATEPOLICIES_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CERTIFICATEPOLICIES_free) +#define CERTIFICATEPOLICIES_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CERTIFICATEPOLICIES_it) +#define CERTIFICATEPOLICIES_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CERTIFICATEPOLICIES_new) +#define CMAC_CTX_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CMAC_CTX_copy) +#define CMAC_CTX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CMAC_CTX_free) +#define CMAC_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CMAC_CTX_new) +#define CMAC_Final BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CMAC_Final) +#define CMAC_Init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CMAC_Init) +#define CMAC_Reset BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CMAC_Reset) +#define CMAC_Update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CMAC_Update) +#define CONF_VALUE_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CONF_VALUE_new) +#define CONF_modules_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CONF_modules_free) +#define CONF_modules_load_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CONF_modules_load_file) +#define CONF_parse_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CONF_parse_list) +#define CRL_DIST_POINTS_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRL_DIST_POINTS_free) +#define CRL_DIST_POINTS_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRL_DIST_POINTS_it) +#define CRL_DIST_POINTS_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRL_DIST_POINTS_new) +#define CRYPTO_BUFFER_POOL_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_BUFFER_POOL_free) +#define CRYPTO_BUFFER_POOL_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_BUFFER_POOL_new) +#define CRYPTO_BUFFER_alloc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_BUFFER_alloc) +#define CRYPTO_BUFFER_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_BUFFER_data) +#define CRYPTO_BUFFER_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_BUFFER_free) +#define CRYPTO_BUFFER_init_CBS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_BUFFER_init_CBS) +#define CRYPTO_BUFFER_len BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_BUFFER_len) +#define CRYPTO_BUFFER_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_BUFFER_new) +#define CRYPTO_BUFFER_new_from_CBS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_BUFFER_new_from_CBS) +#define CRYPTO_BUFFER_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_BUFFER_up_ref) +#define CRYPTO_MUTEX_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_MUTEX_cleanup) +#define CRYPTO_MUTEX_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_MUTEX_init) +#define CRYPTO_MUTEX_lock_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_MUTEX_lock_read) +#define CRYPTO_MUTEX_lock_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_MUTEX_lock_write) +#define CRYPTO_MUTEX_unlock_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_MUTEX_unlock_read) +#define CRYPTO_MUTEX_unlock_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_MUTEX_unlock_write) +#define CRYPTO_POLYVAL_finish BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_POLYVAL_finish) +#define CRYPTO_POLYVAL_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_POLYVAL_init) +#define CRYPTO_POLYVAL_update_blocks BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_POLYVAL_update_blocks) +#define CRYPTO_STATIC_MUTEX_lock_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_STATIC_MUTEX_lock_read) +#define CRYPTO_STATIC_MUTEX_lock_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_STATIC_MUTEX_lock_write) +#define CRYPTO_STATIC_MUTEX_unlock_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_STATIC_MUTEX_unlock_read) +#define CRYPTO_STATIC_MUTEX_unlock_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_STATIC_MUTEX_unlock_write) +#define CRYPTO_THREADID_current BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_THREADID_current) +#define CRYPTO_THREADID_set_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_THREADID_set_callback) +#define CRYPTO_THREADID_set_numeric BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_THREADID_set_numeric) +#define CRYPTO_THREADID_set_pointer BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_THREADID_set_pointer) +#define CRYPTO_cbc128_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_cbc128_decrypt) +#define CRYPTO_cbc128_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_cbc128_encrypt) +#define CRYPTO_cfb128_1_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_cfb128_1_encrypt) +#define CRYPTO_cfb128_8_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_cfb128_8_encrypt) +#define CRYPTO_cfb128_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_cfb128_encrypt) +#define CRYPTO_chacha_20 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_chacha_20) +#define CRYPTO_cleanup_all_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_cleanup_all_ex_data) +#define CRYPTO_ctr128_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_ctr128_encrypt) +#define CRYPTO_ctr128_encrypt_ctr32 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_ctr128_encrypt_ctr32) +#define CRYPTO_free_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_free_ex_data) +#define CRYPTO_gcm128_aad BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_gcm128_aad) +#define CRYPTO_gcm128_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_gcm128_decrypt) +#define CRYPTO_gcm128_decrypt_ctr32 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_gcm128_decrypt_ctr32) +#define CRYPTO_gcm128_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_gcm128_encrypt) +#define CRYPTO_gcm128_encrypt_ctr32 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_gcm128_encrypt_ctr32) +#define CRYPTO_gcm128_finish BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_gcm128_finish) +#define CRYPTO_gcm128_init_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_gcm128_init_key) +#define CRYPTO_gcm128_setiv BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_gcm128_setiv) +#define CRYPTO_gcm128_tag BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_gcm128_tag) +#define CRYPTO_get_dynlock_create_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_get_dynlock_create_callback) +#define CRYPTO_get_dynlock_destroy_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_get_dynlock_destroy_callback) +#define CRYPTO_get_dynlock_lock_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_get_dynlock_lock_callback) +#define CRYPTO_get_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_get_ex_data) +#define CRYPTO_get_ex_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_get_ex_new_index) +#define CRYPTO_get_lock_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_get_lock_name) +#define CRYPTO_get_locking_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_get_locking_callback) +#define CRYPTO_get_thread_local BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_get_thread_local) +#define CRYPTO_ghash_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_ghash_init) +#define CRYPTO_has_asm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_has_asm) +#define CRYPTO_hchacha20 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_hchacha20) +#define CRYPTO_is_confidential_build BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_is_confidential_build) +#define CRYPTO_library_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_library_init) +#define CRYPTO_malloc_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_malloc_init) +#define CRYPTO_memcmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_memcmp) +#define CRYPTO_new_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_new_ex_data) +#define CRYPTO_num_locks BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_num_locks) +#define CRYPTO_ofb128_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_ofb128_encrypt) +#define CRYPTO_once BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_once) +#define CRYPTO_poly1305_finish BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_poly1305_finish) +#define CRYPTO_poly1305_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_poly1305_init) +#define CRYPTO_poly1305_update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_poly1305_update) +#define CRYPTO_rdrand BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_rdrand) +#define CRYPTO_rdrand_multiple8_buf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_rdrand_multiple8_buf) +#define CRYPTO_refcount_dec_and_test_zero BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_refcount_dec_and_test_zero) +#define CRYPTO_refcount_inc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_refcount_inc) +#define CRYPTO_set_add_lock_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_set_add_lock_callback) +#define CRYPTO_set_dynlock_create_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_set_dynlock_create_callback) +#define CRYPTO_set_dynlock_destroy_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_set_dynlock_destroy_callback) +#define CRYPTO_set_dynlock_lock_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_set_dynlock_lock_callback) +#define CRYPTO_set_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_set_ex_data) +#define CRYPTO_set_id_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_set_id_callback) +#define CRYPTO_set_locking_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_set_locking_callback) +#define CRYPTO_set_thread_local BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_set_thread_local) +#define CRYPTO_sysrand BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_sysrand) +#define CRYPTO_tls1_prf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_tls1_prf) +#define CTR_DRBG_clear BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CTR_DRBG_clear) +#define CTR_DRBG_generate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CTR_DRBG_generate) +#define CTR_DRBG_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CTR_DRBG_init) +#define CTR_DRBG_reseed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CTR_DRBG_reseed) +#define ChaCha20_ctr32 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ChaCha20_ctr32) +#define DES_decrypt3 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DES_decrypt3) +#define DES_ecb3_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DES_ecb3_encrypt) +#define DES_ecb_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DES_ecb_encrypt) +#define DES_ede2_cbc_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DES_ede2_cbc_encrypt) +#define DES_ede3_cbc_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DES_ede3_cbc_encrypt) +#define DES_encrypt3 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DES_encrypt3) +#define DES_ncbc_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DES_ncbc_encrypt) +#define DES_set_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DES_set_key) +#define DES_set_key_unchecked BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DES_set_key_unchecked) +#define DES_set_odd_parity BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DES_set_odd_parity) +#define DH_check BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_check) +#define DH_check_pub_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_check_pub_key) +#define DH_compute_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_compute_key) +#define DH_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_free) +#define DH_generate_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_generate_key) +#define DH_generate_parameters_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_generate_parameters_ex) +#define DH_get0_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_get0_key) +#define DH_get0_pqg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_get0_pqg) +#define DH_get_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_get_ex_data) +#define DH_get_ex_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_get_ex_new_index) +#define DH_marshal_parameters BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_marshal_parameters) +#define DH_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_new) +#define DH_num_bits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_num_bits) +#define DH_parse_parameters BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_parse_parameters) +#define DH_set0_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_set0_key) +#define DH_set0_pqg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_set0_pqg) +#define DH_set_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_set_ex_data) +#define DH_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_size) +#define DH_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_up_ref) +#define DHparams_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DHparams_dup) +#define DIRECTORYSTRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DIRECTORYSTRING_free) +#define DIRECTORYSTRING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DIRECTORYSTRING_it) +#define DIRECTORYSTRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DIRECTORYSTRING_new) +#define DISPLAYTEXT_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DISPLAYTEXT_free) +#define DISPLAYTEXT_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DISPLAYTEXT_it) +#define DISPLAYTEXT_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DISPLAYTEXT_new) +#define DIST_POINT_NAME_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DIST_POINT_NAME_free) +#define DIST_POINT_NAME_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DIST_POINT_NAME_it) +#define DIST_POINT_NAME_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DIST_POINT_NAME_new) +#define DIST_POINT_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DIST_POINT_free) +#define DIST_POINT_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DIST_POINT_it) +#define DIST_POINT_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DIST_POINT_new) +#define DIST_POINT_set_dpname BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DIST_POINT_set_dpname) +#define DSA_SIG_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_SIG_free) +#define DSA_SIG_marshal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_SIG_marshal) +#define DSA_SIG_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_SIG_new) +#define DSA_SIG_parse BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_SIG_parse) +#define DSA_check_signature BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_check_signature) +#define DSA_do_check_signature BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_do_check_signature) +#define DSA_do_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_do_sign) +#define DSA_do_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_do_verify) +#define DSA_dup_DH BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_dup_DH) +#define DSA_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_free) +#define DSA_generate_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_generate_key) +#define DSA_generate_parameters_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_generate_parameters_ex) +#define DSA_get0_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_get0_key) +#define DSA_get0_pqg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_get0_pqg) +#define DSA_get_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_get_ex_data) +#define DSA_get_ex_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_get_ex_new_index) +#define DSA_marshal_parameters BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_marshal_parameters) +#define DSA_marshal_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_marshal_private_key) +#define DSA_marshal_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_marshal_public_key) +#define DSA_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_new) +#define DSA_parse_parameters BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_parse_parameters) +#define DSA_parse_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_parse_private_key) +#define DSA_parse_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_parse_public_key) +#define DSA_set0_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_set0_key) +#define DSA_set0_pqg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_set0_pqg) +#define DSA_set_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_set_ex_data) +#define DSA_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_sign) +#define DSA_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_size) +#define DSA_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_up_ref) +#define DSA_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_verify) +#define DSAparams_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSAparams_dup) +#define ECDH_compute_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDH_compute_key) +#define ECDH_compute_key_fips BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDH_compute_key_fips) +#define ECDSA_SIG_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDSA_SIG_free) +#define ECDSA_SIG_from_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDSA_SIG_from_bytes) +#define ECDSA_SIG_get0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDSA_SIG_get0) +#define ECDSA_SIG_marshal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDSA_SIG_marshal) +#define ECDSA_SIG_max_len BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDSA_SIG_max_len) +#define ECDSA_SIG_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDSA_SIG_new) +#define ECDSA_SIG_parse BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDSA_SIG_parse) +#define ECDSA_SIG_set0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDSA_SIG_set0) +#define ECDSA_SIG_to_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDSA_SIG_to_bytes) +#define ECDSA_do_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDSA_do_sign) +#define ECDSA_do_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDSA_do_verify) +#define ECDSA_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDSA_sign) +#define ECDSA_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDSA_size) +#define ECDSA_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDSA_verify) +#define EC_GFp_mont_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GFp_mont_method) +#define EC_GFp_nistp224_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GFp_nistp224_method) +#define EC_GFp_nistp256_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GFp_nistp256_method) +#define EC_GFp_nistz256_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GFp_nistz256_method) +#define EC_GROUP_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_cmp) +#define EC_GROUP_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_dup) +#define EC_GROUP_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_free) +#define EC_GROUP_get0_generator BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_get0_generator) +#define EC_GROUP_get0_order BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_get0_order) +#define EC_GROUP_get_cofactor BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_get_cofactor) +#define EC_GROUP_get_curve_GFp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_get_curve_GFp) +#define EC_GROUP_get_curve_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_get_curve_name) +#define EC_GROUP_get_degree BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_get_degree) +#define EC_GROUP_get_order BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_get_order) +#define EC_GROUP_method_of BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_method_of) +#define EC_GROUP_new_by_curve_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_new_by_curve_name) +#define EC_GROUP_new_curve_GFp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_new_curve_GFp) +#define EC_GROUP_order_bits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_order_bits) +#define EC_GROUP_set_asn1_flag BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_set_asn1_flag) +#define EC_GROUP_set_generator BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_set_generator) +#define EC_GROUP_set_point_conversion_form BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_set_point_conversion_form) +#define EC_KEY_check_fips BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_check_fips) +#define EC_KEY_check_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_check_key) +#define EC_KEY_derive_from_secret BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_derive_from_secret) +#define EC_KEY_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_dup) +#define EC_KEY_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_free) +#define EC_KEY_generate_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_generate_key) +#define EC_KEY_generate_key_fips BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_generate_key_fips) +#define EC_KEY_get0_group BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_get0_group) +#define EC_KEY_get0_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_get0_private_key) +#define EC_KEY_get0_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_get0_public_key) +#define EC_KEY_get_conv_form BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_get_conv_form) +#define EC_KEY_get_enc_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_get_enc_flags) +#define EC_KEY_get_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_get_ex_data) +#define EC_KEY_get_ex_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_get_ex_new_index) +#define EC_KEY_is_opaque BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_is_opaque) +#define EC_KEY_key2buf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_key2buf) +#define EC_KEY_marshal_curve_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_marshal_curve_name) +#define EC_KEY_marshal_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_marshal_private_key) +#define EC_KEY_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_new) +#define EC_KEY_new_by_curve_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_new_by_curve_name) +#define EC_KEY_new_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_new_method) +#define EC_KEY_parse_curve_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_parse_curve_name) +#define EC_KEY_parse_parameters BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_parse_parameters) +#define EC_KEY_parse_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_parse_private_key) +#define EC_KEY_set_asn1_flag BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_set_asn1_flag) +#define EC_KEY_set_conv_form BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_set_conv_form) +#define EC_KEY_set_enc_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_set_enc_flags) +#define EC_KEY_set_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_set_ex_data) +#define EC_KEY_set_group BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_set_group) +#define EC_KEY_set_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_set_private_key) +#define EC_KEY_set_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_set_public_key) +#define EC_KEY_set_public_key_affine_coordinates BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_set_public_key_affine_coordinates) +#define EC_KEY_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_up_ref) +#define EC_METHOD_get_field_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_METHOD_get_field_type) +#define EC_POINT_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_add) +#define EC_POINT_clear_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_clear_free) +#define EC_POINT_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_cmp) +#define EC_POINT_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_copy) +#define EC_POINT_dbl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_dbl) +#define EC_POINT_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_dup) +#define EC_POINT_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_free) +#define EC_POINT_get_affine_coordinates_GFp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_get_affine_coordinates_GFp) +#define EC_POINT_invert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_invert) +#define EC_POINT_is_at_infinity BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_is_at_infinity) +#define EC_POINT_is_on_curve BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_is_on_curve) +#define EC_POINT_mul BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_mul) +#define EC_POINT_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_new) +#define EC_POINT_oct2point BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_oct2point) +#define EC_POINT_point2cbb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_point2cbb) +#define EC_POINT_point2oct BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_point2oct) +#define EC_POINT_set_affine_coordinates_GFp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_set_affine_coordinates_GFp) +#define EC_POINT_set_compressed_coordinates_GFp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_set_compressed_coordinates_GFp) +#define EC_POINT_set_to_infinity BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_set_to_infinity) +#define EC_curve_nid2nist BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_curve_nid2nist) +#define EC_curve_nist2nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_curve_nist2nid) +#define EC_get_builtin_curves BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_get_builtin_curves) +#define ED25519_keypair BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ED25519_keypair) +#define ED25519_keypair_from_seed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ED25519_keypair_from_seed) +#define ED25519_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ED25519_sign) +#define ED25519_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ED25519_verify) +#define EDIPARTYNAME_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EDIPARTYNAME_free) +#define EDIPARTYNAME_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EDIPARTYNAME_it) +#define EDIPARTYNAME_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EDIPARTYNAME_new) +#define ENGINE_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ENGINE_free) +#define ENGINE_get_ECDSA_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ENGINE_get_ECDSA_method) +#define ENGINE_get_RSA_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ENGINE_get_RSA_method) +#define ENGINE_load_builtin_engines BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ENGINE_load_builtin_engines) +#define ENGINE_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ENGINE_new) +#define ENGINE_register_all_complete BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ENGINE_register_all_complete) +#define ENGINE_set_ECDSA_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ENGINE_set_ECDSA_method) +#define ENGINE_set_RSA_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ENGINE_set_RSA_method) +#define ERR_SAVE_STATE_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_SAVE_STATE_free) +#define ERR_add_error_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_add_error_data) +#define ERR_add_error_dataf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_add_error_dataf) +#define ERR_clear_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_clear_error) +#define ERR_clear_system_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_clear_system_error) +#define ERR_error_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_error_string) +#define ERR_error_string_n BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_error_string_n) +#define ERR_free_strings BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_free_strings) +#define ERR_func_error_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_func_error_string) +#define ERR_get_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_get_error) +#define ERR_get_error_line BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_get_error_line) +#define ERR_get_error_line_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_get_error_line_data) +#define ERR_get_next_error_library BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_get_next_error_library) +#define ERR_lib_error_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_lib_error_string) +#define ERR_load_BIO_strings BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_load_BIO_strings) +#define ERR_load_ERR_strings BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_load_ERR_strings) +#define ERR_load_RAND_strings BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_load_RAND_strings) +#define ERR_load_crypto_strings BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_load_crypto_strings) +#define ERR_peek_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_peek_error) +#define ERR_peek_error_line BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_peek_error_line) +#define ERR_peek_error_line_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_peek_error_line_data) +#define ERR_peek_last_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_peek_last_error) +#define ERR_peek_last_error_line BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_peek_last_error_line) +#define ERR_peek_last_error_line_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_peek_last_error_line_data) +#define ERR_pop_to_mark BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_pop_to_mark) +#define ERR_print_errors BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_print_errors) +#define ERR_print_errors_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_print_errors_cb) +#define ERR_print_errors_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_print_errors_fp) +#define ERR_put_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_put_error) +#define ERR_reason_error_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_reason_error_string) +#define ERR_remove_state BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_remove_state) +#define ERR_remove_thread_state BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_remove_thread_state) +#define ERR_restore_state BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_restore_state) +#define ERR_save_state BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_save_state) +#define ERR_set_mark BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_set_mark) +#define EVP_AEAD_CTX_aead BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_CTX_aead) +#define EVP_AEAD_CTX_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_CTX_cleanup) +#define EVP_AEAD_CTX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_CTX_free) +#define EVP_AEAD_CTX_get_iv BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_CTX_get_iv) +#define EVP_AEAD_CTX_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_CTX_init) +#define EVP_AEAD_CTX_init_with_direction BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_CTX_init_with_direction) +#define EVP_AEAD_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_CTX_new) +#define EVP_AEAD_CTX_open BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_CTX_open) +#define EVP_AEAD_CTX_open_gather BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_CTX_open_gather) +#define EVP_AEAD_CTX_seal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_CTX_seal) +#define EVP_AEAD_CTX_seal_scatter BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_CTX_seal_scatter) +#define EVP_AEAD_CTX_tag_len BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_CTX_tag_len) +#define EVP_AEAD_CTX_zero BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_CTX_zero) +#define EVP_AEAD_key_length BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_key_length) +#define EVP_AEAD_max_overhead BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_max_overhead) +#define EVP_AEAD_max_tag_len BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_max_tag_len) +#define EVP_AEAD_nonce_length BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_nonce_length) +#define EVP_BytesToKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_BytesToKey) +#define EVP_CIPHER_CTX_block_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_block_size) +#define EVP_CIPHER_CTX_cipher BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_cipher) +#define EVP_CIPHER_CTX_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_cleanup) +#define EVP_CIPHER_CTX_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_copy) +#define EVP_CIPHER_CTX_ctrl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_ctrl) +#define EVP_CIPHER_CTX_encrypting BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_encrypting) +#define EVP_CIPHER_CTX_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_flags) +#define EVP_CIPHER_CTX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_free) +#define EVP_CIPHER_CTX_get_app_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_get_app_data) +#define EVP_CIPHER_CTX_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_init) +#define EVP_CIPHER_CTX_iv_length BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_iv_length) +#define EVP_CIPHER_CTX_key_length BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_key_length) +#define EVP_CIPHER_CTX_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_mode) +#define EVP_CIPHER_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_new) +#define EVP_CIPHER_CTX_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_nid) +#define EVP_CIPHER_CTX_reset BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_reset) +#define EVP_CIPHER_CTX_set_app_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_set_app_data) +#define EVP_CIPHER_CTX_set_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_set_flags) +#define EVP_CIPHER_CTX_set_key_length BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_set_key_length) +#define EVP_CIPHER_CTX_set_padding BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_set_padding) +#define EVP_CIPHER_block_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_block_size) +#define EVP_CIPHER_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_flags) +#define EVP_CIPHER_iv_length BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_iv_length) +#define EVP_CIPHER_key_length BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_key_length) +#define EVP_CIPHER_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_mode) +#define EVP_CIPHER_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_nid) +#define EVP_Cipher BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_Cipher) +#define EVP_CipherFinal_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CipherFinal_ex) +#define EVP_CipherInit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CipherInit) +#define EVP_CipherInit_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CipherInit_ex) +#define EVP_CipherUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CipherUpdate) +#define EVP_DecodeBase64 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DecodeBase64) +#define EVP_DecodeBlock BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DecodeBlock) +#define EVP_DecodeFinal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DecodeFinal) +#define EVP_DecodeInit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DecodeInit) +#define EVP_DecodeUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DecodeUpdate) +#define EVP_DecodedLength BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DecodedLength) +#define EVP_DecryptFinal_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DecryptFinal_ex) +#define EVP_DecryptInit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DecryptInit) +#define EVP_DecryptInit_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DecryptInit_ex) +#define EVP_DecryptUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DecryptUpdate) +#define EVP_Digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_Digest) +#define EVP_DigestFinal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DigestFinal) +#define EVP_DigestFinalXOF BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DigestFinalXOF) +#define EVP_DigestFinal_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DigestFinal_ex) +#define EVP_DigestInit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DigestInit) +#define EVP_DigestInit_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DigestInit_ex) +#define EVP_DigestSign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DigestSign) +#define EVP_DigestSignFinal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DigestSignFinal) +#define EVP_DigestSignInit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DigestSignInit) +#define EVP_DigestSignUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DigestSignUpdate) +#define EVP_DigestUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DigestUpdate) +#define EVP_DigestVerify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DigestVerify) +#define EVP_DigestVerifyFinal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DigestVerifyFinal) +#define EVP_DigestVerifyInit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DigestVerifyInit) +#define EVP_DigestVerifyUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DigestVerifyUpdate) +#define EVP_EncodeBlock BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_EncodeBlock) +#define EVP_EncodeFinal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_EncodeFinal) +#define EVP_EncodeInit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_EncodeInit) +#define EVP_EncodeUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_EncodeUpdate) +#define EVP_EncodedLength BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_EncodedLength) +#define EVP_EncryptFinal_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_EncryptFinal_ex) +#define EVP_EncryptInit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_EncryptInit) +#define EVP_EncryptInit_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_EncryptInit_ex) +#define EVP_EncryptUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_EncryptUpdate) +#define EVP_MD_CTX_block_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_CTX_block_size) +#define EVP_MD_CTX_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_CTX_cleanup) +#define EVP_MD_CTX_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_CTX_copy) +#define EVP_MD_CTX_copy_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_CTX_copy_ex) +#define EVP_MD_CTX_create BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_CTX_create) +#define EVP_MD_CTX_destroy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_CTX_destroy) +#define EVP_MD_CTX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_CTX_free) +#define EVP_MD_CTX_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_CTX_init) +#define EVP_MD_CTX_md BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_CTX_md) +#define EVP_MD_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_CTX_new) +#define EVP_MD_CTX_reset BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_CTX_reset) +#define EVP_MD_CTX_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_CTX_size) +#define EVP_MD_CTX_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_CTX_type) +#define EVP_MD_block_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_block_size) +#define EVP_MD_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_flags) +#define EVP_MD_meth_get_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_meth_get_flags) +#define EVP_MD_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_size) +#define EVP_MD_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_type) +#define EVP_PBE_scrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PBE_scrypt) +#define EVP_PKCS82PKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKCS82PKEY) +#define EVP_PKEY2PKCS8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY2PKCS8) +#define EVP_PKEY_CTX_ctrl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_ctrl) +#define EVP_PKEY_CTX_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_dup) +#define EVP_PKEY_CTX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_free) +#define EVP_PKEY_CTX_get0_pkey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_get0_pkey) +#define EVP_PKEY_CTX_get0_rsa_oaep_label BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_get0_rsa_oaep_label) +#define EVP_PKEY_CTX_get_rsa_mgf1_md BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_get_rsa_mgf1_md) +#define EVP_PKEY_CTX_get_rsa_oaep_md BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_get_rsa_oaep_md) +#define EVP_PKEY_CTX_get_rsa_padding BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_get_rsa_padding) +#define EVP_PKEY_CTX_get_rsa_pss_saltlen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_get_rsa_pss_saltlen) +#define EVP_PKEY_CTX_get_signature_md BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_get_signature_md) +#define EVP_PKEY_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_new) +#define EVP_PKEY_CTX_new_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_new_id) +#define EVP_PKEY_CTX_set0_rsa_oaep_label BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_set0_rsa_oaep_label) +#define EVP_PKEY_CTX_set_ec_param_enc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_set_ec_param_enc) +#define EVP_PKEY_CTX_set_ec_paramgen_curve_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_set_ec_paramgen_curve_nid) +#define EVP_PKEY_CTX_set_rsa_keygen_bits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_set_rsa_keygen_bits) +#define EVP_PKEY_CTX_set_rsa_keygen_pubexp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_set_rsa_keygen_pubexp) +#define EVP_PKEY_CTX_set_rsa_mgf1_md BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_set_rsa_mgf1_md) +#define EVP_PKEY_CTX_set_rsa_oaep_md BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_set_rsa_oaep_md) +#define EVP_PKEY_CTX_set_rsa_padding BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_set_rsa_padding) +#define EVP_PKEY_CTX_set_rsa_pss_saltlen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_set_rsa_pss_saltlen) +#define EVP_PKEY_CTX_set_signature_md BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_set_signature_md) +#define EVP_PKEY_assign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_assign) +#define EVP_PKEY_assign_DSA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_assign_DSA) +#define EVP_PKEY_assign_EC_KEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_assign_EC_KEY) +#define EVP_PKEY_assign_RSA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_assign_RSA) +#define EVP_PKEY_base_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_base_id) +#define EVP_PKEY_bits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_bits) +#define EVP_PKEY_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_cmp) +#define EVP_PKEY_cmp_parameters BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_cmp_parameters) +#define EVP_PKEY_copy_parameters BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_copy_parameters) +#define EVP_PKEY_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_decrypt) +#define EVP_PKEY_decrypt_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_decrypt_init) +#define EVP_PKEY_derive BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_derive) +#define EVP_PKEY_derive_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_derive_init) +#define EVP_PKEY_derive_set_peer BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_derive_set_peer) +#define EVP_PKEY_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_encrypt) +#define EVP_PKEY_encrypt_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_encrypt_init) +#define EVP_PKEY_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_free) +#define EVP_PKEY_get0_DH BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_get0_DH) +#define EVP_PKEY_get0_DSA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_get0_DSA) +#define EVP_PKEY_get0_EC_KEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_get0_EC_KEY) +#define EVP_PKEY_get0_RSA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_get0_RSA) +#define EVP_PKEY_get1_DH BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_get1_DH) +#define EVP_PKEY_get1_DSA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_get1_DSA) +#define EVP_PKEY_get1_EC_KEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_get1_EC_KEY) +#define EVP_PKEY_get1_RSA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_get1_RSA) +#define EVP_PKEY_get1_tls_encodedpoint BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_get1_tls_encodedpoint) +#define EVP_PKEY_get_raw_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_get_raw_private_key) +#define EVP_PKEY_get_raw_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_get_raw_public_key) +#define EVP_PKEY_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_id) +#define EVP_PKEY_is_opaque BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_is_opaque) +#define EVP_PKEY_keygen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_keygen) +#define EVP_PKEY_keygen_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_keygen_init) +#define EVP_PKEY_missing_parameters BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_missing_parameters) +#define EVP_PKEY_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_new) +#define EVP_PKEY_new_raw_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_new_raw_private_key) +#define EVP_PKEY_new_raw_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_new_raw_public_key) +#define EVP_PKEY_paramgen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_paramgen) +#define EVP_PKEY_paramgen_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_paramgen_init) +#define EVP_PKEY_print_params BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_print_params) +#define EVP_PKEY_print_private BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_print_private) +#define EVP_PKEY_print_public BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_print_public) +#define EVP_PKEY_set1_DSA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_set1_DSA) +#define EVP_PKEY_set1_EC_KEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_set1_EC_KEY) +#define EVP_PKEY_set1_RSA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_set1_RSA) +#define EVP_PKEY_set1_tls_encodedpoint BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_set1_tls_encodedpoint) +#define EVP_PKEY_set_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_set_type) +#define EVP_PKEY_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_sign) +#define EVP_PKEY_sign_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_sign_init) +#define EVP_PKEY_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_size) +#define EVP_PKEY_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_type) +#define EVP_PKEY_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_up_ref) +#define EVP_PKEY_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_verify) +#define EVP_PKEY_verify_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_verify_init) +#define EVP_PKEY_verify_recover BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_verify_recover) +#define EVP_PKEY_verify_recover_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_verify_recover_init) +#define EVP_SignFinal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_SignFinal) +#define EVP_SignInit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_SignInit) +#define EVP_SignInit_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_SignInit_ex) +#define EVP_SignUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_SignUpdate) +#define EVP_VerifyFinal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_VerifyFinal) +#define EVP_VerifyInit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_VerifyInit) +#define EVP_VerifyInit_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_VerifyInit_ex) +#define EVP_VerifyUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_VerifyUpdate) +#define EVP_add_cipher_alias BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_add_cipher_alias) +#define EVP_add_digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_add_digest) +#define EVP_aead_aes_128_cbc_sha1_tls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_128_cbc_sha1_tls) +#define EVP_aead_aes_128_cbc_sha1_tls_implicit_iv BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_128_cbc_sha1_tls_implicit_iv) +#define EVP_aead_aes_128_cbc_sha256_tls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_128_cbc_sha256_tls) +#define EVP_aead_aes_128_ccm_bluetooth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_128_ccm_bluetooth) +#define EVP_aead_aes_128_ccm_bluetooth_8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_128_ccm_bluetooth_8) +#define EVP_aead_aes_128_ctr_hmac_sha256 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_128_ctr_hmac_sha256) +#define EVP_aead_aes_128_gcm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_128_gcm) +#define EVP_aead_aes_128_gcm_siv BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_128_gcm_siv) +#define EVP_aead_aes_128_gcm_tls12 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_128_gcm_tls12) +#define EVP_aead_aes_128_gcm_tls13 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_128_gcm_tls13) +#define EVP_aead_aes_192_gcm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_192_gcm) +#define EVP_aead_aes_256_cbc_sha1_tls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_256_cbc_sha1_tls) +#define EVP_aead_aes_256_cbc_sha1_tls_implicit_iv BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_256_cbc_sha1_tls_implicit_iv) +#define EVP_aead_aes_256_cbc_sha256_tls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_256_cbc_sha256_tls) +#define EVP_aead_aes_256_cbc_sha384_tls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_256_cbc_sha384_tls) +#define EVP_aead_aes_256_ctr_hmac_sha256 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_256_ctr_hmac_sha256) +#define EVP_aead_aes_256_gcm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_256_gcm) +#define EVP_aead_aes_256_gcm_siv BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_256_gcm_siv) +#define EVP_aead_aes_256_gcm_tls12 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_256_gcm_tls12) +#define EVP_aead_aes_256_gcm_tls13 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_256_gcm_tls13) +#define EVP_aead_chacha20_poly1305 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_chacha20_poly1305) +#define EVP_aead_des_ede3_cbc_sha1_tls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_des_ede3_cbc_sha1_tls) +#define EVP_aead_des_ede3_cbc_sha1_tls_implicit_iv BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_des_ede3_cbc_sha1_tls_implicit_iv) +#define EVP_aead_null_sha1_tls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_null_sha1_tls) +#define EVP_aead_xchacha20_poly1305 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_xchacha20_poly1305) +#define EVP_aes_128_cbc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_128_cbc) +#define EVP_aes_128_ctr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_128_ctr) +#define EVP_aes_128_ecb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_128_ecb) +#define EVP_aes_128_gcm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_128_gcm) +#define EVP_aes_128_ofb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_128_ofb) +#define EVP_aes_192_cbc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_192_cbc) +#define EVP_aes_192_ctr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_192_ctr) +#define EVP_aes_192_ecb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_192_ecb) +#define EVP_aes_192_gcm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_192_gcm) +#define EVP_aes_192_ofb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_192_ofb) +#define EVP_aes_256_cbc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_256_cbc) +#define EVP_aes_256_ctr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_256_ctr) +#define EVP_aes_256_ecb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_256_ecb) +#define EVP_aes_256_gcm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_256_gcm) +#define EVP_aes_256_ofb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_256_ofb) +#define EVP_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_cleanup) +#define EVP_des_cbc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_des_cbc) +#define EVP_des_ecb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_des_ecb) +#define EVP_des_ede BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_des_ede) +#define EVP_des_ede3 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_des_ede3) +#define EVP_des_ede3_cbc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_des_ede3_cbc) +#define EVP_des_ede3_ecb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_des_ede3_ecb) +#define EVP_des_ede_cbc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_des_ede_cbc) +#define EVP_enc_null BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_enc_null) +#define EVP_get_cipherbyname BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_get_cipherbyname) +#define EVP_get_cipherbynid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_get_cipherbynid) +#define EVP_get_digestbyname BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_get_digestbyname) +#define EVP_get_digestbynid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_get_digestbynid) +#define EVP_get_digestbyobj BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_get_digestbyobj) +#define EVP_has_aes_hardware BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_has_aes_hardware) +#define EVP_marshal_digest_algorithm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_marshal_digest_algorithm) +#define EVP_marshal_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_marshal_private_key) +#define EVP_marshal_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_marshal_public_key) +#define EVP_md4 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_md4) +#define EVP_md5 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_md5) +#define EVP_md5_sha1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_md5_sha1) +#define EVP_parse_digest_algorithm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_parse_digest_algorithm) +#define EVP_parse_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_parse_private_key) +#define EVP_parse_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_parse_public_key) +#define EVP_rc2_40_cbc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_rc2_40_cbc) +#define EVP_rc2_cbc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_rc2_cbc) +#define EVP_rc4 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_rc4) +#define EVP_sha1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_sha1) +#define EVP_sha224 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_sha224) +#define EVP_sha256 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_sha256) +#define EVP_sha384 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_sha384) +#define EVP_sha512 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_sha512) +#define EVP_tls_cbc_copy_mac BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_tls_cbc_copy_mac) +#define EVP_tls_cbc_digest_record BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_tls_cbc_digest_record) +#define EVP_tls_cbc_record_digest_supported BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_tls_cbc_record_digest_supported) +#define EVP_tls_cbc_remove_padding BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_tls_cbc_remove_padding) +#define EXTENDED_KEY_USAGE_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EXTENDED_KEY_USAGE_free) +#define EXTENDED_KEY_USAGE_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EXTENDED_KEY_USAGE_it) +#define EXTENDED_KEY_USAGE_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EXTENDED_KEY_USAGE_new) +#define FIPS_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, FIPS_mode) +#define FIPS_mode_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, FIPS_mode_set) +#define GENERAL_NAMES_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_NAMES_free) +#define GENERAL_NAMES_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_NAMES_it) +#define GENERAL_NAMES_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_NAMES_new) +#define GENERAL_NAME_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_NAME_cmp) +#define GENERAL_NAME_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_NAME_dup) +#define GENERAL_NAME_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_NAME_free) +#define GENERAL_NAME_get0_otherName BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_NAME_get0_otherName) +#define GENERAL_NAME_get0_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_NAME_get0_value) +#define GENERAL_NAME_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_NAME_it) +#define GENERAL_NAME_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_NAME_new) +#define GENERAL_NAME_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_NAME_print) +#define GENERAL_NAME_set0_othername BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_NAME_set0_othername) +#define GENERAL_NAME_set0_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_NAME_set0_value) +#define GENERAL_SUBTREE_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_SUBTREE_free) +#define GENERAL_SUBTREE_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_SUBTREE_it) +#define GENERAL_SUBTREE_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_SUBTREE_new) +#define HKDF BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HKDF) +#define HKDF_expand BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HKDF_expand) +#define HKDF_extract BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HKDF_extract) +#define HMAC BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HMAC) +#define HMAC_CTX_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HMAC_CTX_cleanup) +#define HMAC_CTX_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HMAC_CTX_copy) +#define HMAC_CTX_copy_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HMAC_CTX_copy_ex) +#define HMAC_CTX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HMAC_CTX_free) +#define HMAC_CTX_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HMAC_CTX_init) +#define HMAC_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HMAC_CTX_new) +#define HMAC_CTX_reset BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HMAC_CTX_reset) +#define HMAC_Final BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HMAC_Final) +#define HMAC_Init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HMAC_Init) +#define HMAC_Init_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HMAC_Init_ex) +#define HMAC_Update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HMAC_Update) +#define HMAC_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HMAC_size) +#define HRSS_decap BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HRSS_decap) +#define HRSS_encap BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HRSS_encap) +#define HRSS_generate_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HRSS_generate_key) +#define HRSS_marshal_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HRSS_marshal_public_key) +#define HRSS_parse_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HRSS_parse_public_key) +#define HRSS_poly2_rotr_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HRSS_poly2_rotr_consttime) +#define HRSS_poly3_invert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HRSS_poly3_invert) +#define HRSS_poly3_mul BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HRSS_poly3_mul) +#define ISSUING_DIST_POINT_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ISSUING_DIST_POINT_free) +#define ISSUING_DIST_POINT_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ISSUING_DIST_POINT_it) +#define ISSUING_DIST_POINT_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ISSUING_DIST_POINT_new) +#define MD4 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, MD4) +#define MD4_Final BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, MD4_Final) +#define MD4_Init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, MD4_Init) +#define MD4_Transform BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, MD4_Transform) +#define MD4_Update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, MD4_Update) +#define MD5 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, MD5) +#define MD5_Final BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, MD5_Final) +#define MD5_Init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, MD5_Init) +#define MD5_Transform BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, MD5_Transform) +#define MD5_Update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, MD5_Update) +#define METHOD_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, METHOD_ref) +#define METHOD_unref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, METHOD_unref) +#define NAME_CONSTRAINTS_check BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NAME_CONSTRAINTS_check) +#define NAME_CONSTRAINTS_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NAME_CONSTRAINTS_free) +#define NAME_CONSTRAINTS_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NAME_CONSTRAINTS_it) +#define NAME_CONSTRAINTS_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NAME_CONSTRAINTS_new) +#define NCONF_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NCONF_free) +#define NCONF_get_section BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NCONF_get_section) +#define NCONF_get_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NCONF_get_string) +#define NCONF_load BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NCONF_load) +#define NCONF_load_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NCONF_load_bio) +#define NCONF_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NCONF_new) +#define NETSCAPE_SPKAC_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NETSCAPE_SPKAC_free) +#define NETSCAPE_SPKAC_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NETSCAPE_SPKAC_it) +#define NETSCAPE_SPKAC_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NETSCAPE_SPKAC_new) +#define NETSCAPE_SPKI_b64_decode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NETSCAPE_SPKI_b64_decode) +#define NETSCAPE_SPKI_b64_encode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NETSCAPE_SPKI_b64_encode) +#define NETSCAPE_SPKI_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NETSCAPE_SPKI_free) +#define NETSCAPE_SPKI_get_pubkey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NETSCAPE_SPKI_get_pubkey) +#define NETSCAPE_SPKI_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NETSCAPE_SPKI_it) +#define NETSCAPE_SPKI_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NETSCAPE_SPKI_new) +#define NETSCAPE_SPKI_set_pubkey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NETSCAPE_SPKI_set_pubkey) +#define NETSCAPE_SPKI_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NETSCAPE_SPKI_sign) +#define NETSCAPE_SPKI_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NETSCAPE_SPKI_verify) +#define NOTICEREF_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NOTICEREF_free) +#define NOTICEREF_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NOTICEREF_it) +#define NOTICEREF_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NOTICEREF_new) +#define OBJ_cbs2nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_cbs2nid) +#define OBJ_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_cleanup) +#define OBJ_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_cmp) +#define OBJ_create BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_create) +#define OBJ_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_dup) +#define OBJ_find_sigid_algs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_find_sigid_algs) +#define OBJ_find_sigid_by_algs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_find_sigid_by_algs) +#define OBJ_get0_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_get0_data) +#define OBJ_length BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_length) +#define OBJ_ln2nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_ln2nid) +#define OBJ_nid2cbb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_nid2cbb) +#define OBJ_nid2ln BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_nid2ln) +#define OBJ_nid2obj BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_nid2obj) +#define OBJ_nid2sn BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_nid2sn) +#define OBJ_obj2nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_obj2nid) +#define OBJ_obj2txt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_obj2txt) +#define OBJ_sn2nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_sn2nid) +#define OBJ_txt2nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_txt2nid) +#define OBJ_txt2obj BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_txt2obj) +#define OPENSSL_add_all_algorithms_conf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_add_all_algorithms_conf) +#define OPENSSL_built_in_curves BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_built_in_curves) +#define OPENSSL_cleanse BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_cleanse) +#define OPENSSL_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_cleanup) +#define OPENSSL_clear_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_clear_free) +#define OPENSSL_config BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_config) +#define OPENSSL_cpuid_setup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_cpuid_setup) +#define OPENSSL_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_free) +#define OPENSSL_gmtime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_gmtime) +#define OPENSSL_gmtime_adj BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_gmtime_adj) +#define OPENSSL_gmtime_diff BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_gmtime_diff) +#define OPENSSL_hash32 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_hash32) +#define OPENSSL_ia32cap_P BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_ia32cap_P) +#define OPENSSL_init_crypto BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_init_crypto) +#define OPENSSL_load_builtin_modules BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_load_builtin_modules) +#define OPENSSL_malloc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_malloc) +#define OPENSSL_malloc_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_malloc_init) +#define OPENSSL_no_config BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_no_config) +#define OPENSSL_realloc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_realloc) +#define OPENSSL_strcasecmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_strcasecmp) +#define OPENSSL_strdup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_strdup) +#define OPENSSL_strncasecmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_strncasecmp) +#define OPENSSL_strnlen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_strnlen) +#define OPENSSL_tolower BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_tolower) +#define OTHERNAME_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OTHERNAME_cmp) +#define OTHERNAME_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OTHERNAME_free) +#define OTHERNAME_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OTHERNAME_it) +#define OTHERNAME_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OTHERNAME_new) +#define OpenSSL_add_all_algorithms BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OpenSSL_add_all_algorithms) +#define OpenSSL_add_all_ciphers BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OpenSSL_add_all_ciphers) +#define OpenSSL_add_all_digests BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OpenSSL_add_all_digests) +#define OpenSSL_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OpenSSL_version) +#define OpenSSL_version_num BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OpenSSL_version_num) +#define PEM_ASN1_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_ASN1_read) +#define PEM_ASN1_read_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_ASN1_read_bio) +#define PEM_ASN1_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_ASN1_write) +#define PEM_ASN1_write_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_ASN1_write_bio) +#define PEM_X509_INFO_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_X509_INFO_read) +#define PEM_X509_INFO_read_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_X509_INFO_read_bio) +#define PEM_X509_INFO_write_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_X509_INFO_write_bio) +#define PEM_bytes_read_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_bytes_read_bio) +#define PEM_def_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_def_callback) +#define PEM_dek_info BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_dek_info) +#define PEM_do_header BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_do_header) +#define PEM_get_EVP_CIPHER_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_get_EVP_CIPHER_INFO) +#define PEM_proc_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_proc_type) +#define PEM_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read) +#define PEM_read_DHparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_DHparams) +#define PEM_read_DSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_DSAPrivateKey) +#define PEM_read_DSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_DSA_PUBKEY) +#define PEM_read_DSAparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_DSAparams) +#define PEM_read_ECPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_ECPrivateKey) +#define PEM_read_EC_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_EC_PUBKEY) +#define PEM_read_PKCS7 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_PKCS7) +#define PEM_read_PKCS8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_PKCS8) +#define PEM_read_PKCS8_PRIV_KEY_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_PKCS8_PRIV_KEY_INFO) +#define PEM_read_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_PUBKEY) +#define PEM_read_PrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_PrivateKey) +#define PEM_read_RSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_RSAPrivateKey) +#define PEM_read_RSAPublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_RSAPublicKey) +#define PEM_read_RSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_RSA_PUBKEY) +#define PEM_read_X509 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_X509) +#define PEM_read_X509_AUX BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_X509_AUX) +#define PEM_read_X509_CRL BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_X509_CRL) +#define PEM_read_X509_REQ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_X509_REQ) +#define PEM_read_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio) +#define PEM_read_bio_DHparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_DHparams) +#define PEM_read_bio_DSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_DSAPrivateKey) +#define PEM_read_bio_DSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_DSA_PUBKEY) +#define PEM_read_bio_DSAparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_DSAparams) +#define PEM_read_bio_ECPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_ECPrivateKey) +#define PEM_read_bio_EC_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_EC_PUBKEY) +#define PEM_read_bio_PKCS7 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_PKCS7) +#define PEM_read_bio_PKCS8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_PKCS8) +#define PEM_read_bio_PKCS8_PRIV_KEY_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_PKCS8_PRIV_KEY_INFO) +#define PEM_read_bio_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_PUBKEY) +#define PEM_read_bio_PrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_PrivateKey) +#define PEM_read_bio_RSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_RSAPrivateKey) +#define PEM_read_bio_RSAPublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_RSAPublicKey) +#define PEM_read_bio_RSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_RSA_PUBKEY) +#define PEM_read_bio_X509 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_X509) +#define PEM_read_bio_X509_AUX BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_X509_AUX) +#define PEM_read_bio_X509_CRL BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_X509_CRL) +#define PEM_read_bio_X509_REQ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_X509_REQ) +#define PEM_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write) +#define PEM_write_DHparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_DHparams) +#define PEM_write_DSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_DSAPrivateKey) +#define PEM_write_DSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_DSA_PUBKEY) +#define PEM_write_DSAparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_DSAparams) +#define PEM_write_ECPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_ECPrivateKey) +#define PEM_write_EC_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_EC_PUBKEY) +#define PEM_write_PKCS7 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_PKCS7) +#define PEM_write_PKCS8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_PKCS8) +#define PEM_write_PKCS8PrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_PKCS8PrivateKey) +#define PEM_write_PKCS8PrivateKey_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_PKCS8PrivateKey_nid) +#define PEM_write_PKCS8_PRIV_KEY_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_PKCS8_PRIV_KEY_INFO) +#define PEM_write_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_PUBKEY) +#define PEM_write_PrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_PrivateKey) +#define PEM_write_RSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_RSAPrivateKey) +#define PEM_write_RSAPublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_RSAPublicKey) +#define PEM_write_RSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_RSA_PUBKEY) +#define PEM_write_X509 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_X509) +#define PEM_write_X509_AUX BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_X509_AUX) +#define PEM_write_X509_CRL BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_X509_CRL) +#define PEM_write_X509_REQ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_X509_REQ) +#define PEM_write_X509_REQ_NEW BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_X509_REQ_NEW) +#define PEM_write_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio) +#define PEM_write_bio_DHparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_DHparams) +#define PEM_write_bio_DSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_DSAPrivateKey) +#define PEM_write_bio_DSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_DSA_PUBKEY) +#define PEM_write_bio_DSAparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_DSAparams) +#define PEM_write_bio_ECPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_ECPrivateKey) +#define PEM_write_bio_EC_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_EC_PUBKEY) +#define PEM_write_bio_PKCS7 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_PKCS7) +#define PEM_write_bio_PKCS8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_PKCS8) +#define PEM_write_bio_PKCS8PrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_PKCS8PrivateKey) +#define PEM_write_bio_PKCS8PrivateKey_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_PKCS8PrivateKey_nid) +#define PEM_write_bio_PKCS8_PRIV_KEY_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_PKCS8_PRIV_KEY_INFO) +#define PEM_write_bio_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_PUBKEY) +#define PEM_write_bio_PrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_PrivateKey) +#define PEM_write_bio_RSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_RSAPrivateKey) +#define PEM_write_bio_RSAPublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_RSAPublicKey) +#define PEM_write_bio_RSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_RSA_PUBKEY) +#define PEM_write_bio_X509 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_X509) +#define PEM_write_bio_X509_AUX BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_X509_AUX) +#define PEM_write_bio_X509_CRL BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_X509_CRL) +#define PEM_write_bio_X509_REQ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_X509_REQ) +#define PEM_write_bio_X509_REQ_NEW BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_X509_REQ_NEW) +#define PKCS12_PBE_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS12_PBE_add) +#define PKCS12_create BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS12_create) +#define PKCS12_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS12_free) +#define PKCS12_get_key_and_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS12_get_key_and_certs) +#define PKCS12_parse BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS12_parse) +#define PKCS12_verify_mac BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS12_verify_mac) +#define PKCS5_PBKDF2_HMAC BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS5_PBKDF2_HMAC) +#define PKCS5_PBKDF2_HMAC_SHA1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS5_PBKDF2_HMAC_SHA1) +#define PKCS5_pbe2_decrypt_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS5_pbe2_decrypt_init) +#define PKCS5_pbe2_encrypt_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS5_pbe2_encrypt_init) +#define PKCS7_bundle_CRLs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS7_bundle_CRLs) +#define PKCS7_bundle_certificates BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS7_bundle_certificates) +#define PKCS7_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS7_free) +#define PKCS7_get_CRLs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS7_get_CRLs) +#define PKCS7_get_PEM_CRLs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS7_get_PEM_CRLs) +#define PKCS7_get_PEM_certificates BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS7_get_PEM_certificates) +#define PKCS7_get_certificates BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS7_get_certificates) +#define PKCS7_get_raw_certificates BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS7_get_raw_certificates) +#define PKCS7_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS7_sign) +#define PKCS7_type_is_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS7_type_is_data) +#define PKCS7_type_is_digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS7_type_is_digest) +#define PKCS7_type_is_encrypted BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS7_type_is_encrypted) +#define PKCS7_type_is_enveloped BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS7_type_is_enveloped) +#define PKCS7_type_is_signed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS7_type_is_signed) +#define PKCS7_type_is_signedAndEnveloped BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS7_type_is_signedAndEnveloped) +#define PKCS8_PRIV_KEY_INFO_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS8_PRIV_KEY_INFO_free) +#define PKCS8_PRIV_KEY_INFO_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS8_PRIV_KEY_INFO_it) +#define PKCS8_PRIV_KEY_INFO_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS8_PRIV_KEY_INFO_new) +#define PKCS8_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS8_decrypt) +#define PKCS8_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS8_encrypt) +#define PKCS8_marshal_encrypted_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS8_marshal_encrypted_private_key) +#define PKCS8_parse_encrypted_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS8_parse_encrypted_private_key) +#define PKCS8_pkey_get0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS8_pkey_get0) +#define PKCS8_pkey_set0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS8_pkey_set0) +#define PKEY_USAGE_PERIOD_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKEY_USAGE_PERIOD_free) +#define PKEY_USAGE_PERIOD_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKEY_USAGE_PERIOD_it) +#define PKEY_USAGE_PERIOD_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKEY_USAGE_PERIOD_new) +#define POLICYINFO_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, POLICYINFO_free) +#define POLICYINFO_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, POLICYINFO_it) +#define POLICYINFO_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, POLICYINFO_new) +#define POLICYQUALINFO_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, POLICYQUALINFO_free) +#define POLICYQUALINFO_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, POLICYQUALINFO_it) +#define POLICYQUALINFO_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, POLICYQUALINFO_new) +#define POLICY_CONSTRAINTS_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, POLICY_CONSTRAINTS_free) +#define POLICY_CONSTRAINTS_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, POLICY_CONSTRAINTS_it) +#define POLICY_CONSTRAINTS_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, POLICY_CONSTRAINTS_new) +#define POLICY_MAPPINGS_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, POLICY_MAPPINGS_it) +#define POLICY_MAPPING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, POLICY_MAPPING_free) +#define POLICY_MAPPING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, POLICY_MAPPING_it) +#define POLICY_MAPPING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, POLICY_MAPPING_new) +#define PROXY_CERT_INFO_EXTENSION_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PROXY_CERT_INFO_EXTENSION_free) +#define PROXY_CERT_INFO_EXTENSION_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PROXY_CERT_INFO_EXTENSION_it) +#define PROXY_CERT_INFO_EXTENSION_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PROXY_CERT_INFO_EXTENSION_new) +#define PROXY_POLICY_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PROXY_POLICY_free) +#define PROXY_POLICY_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PROXY_POLICY_it) +#define PROXY_POLICY_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PROXY_POLICY_new) +#define RAND_SSLeay BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_SSLeay) +#define RAND_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_add) +#define RAND_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_bytes) +#define RAND_bytes_with_additional_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_bytes_with_additional_data) +#define RAND_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_cleanup) +#define RAND_egd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_egd) +#define RAND_enable_fork_unsafe_buffering BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_enable_fork_unsafe_buffering) +#define RAND_file_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_file_name) +#define RAND_get_rand_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_get_rand_method) +#define RAND_load_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_load_file) +#define RAND_poll BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_poll) +#define RAND_pseudo_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_pseudo_bytes) +#define RAND_seed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_seed) +#define RAND_set_rand_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_set_rand_method) +#define RAND_set_urandom_fd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_set_urandom_fd) +#define RAND_status BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_status) +#define RC4 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RC4) +#define RC4_set_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RC4_set_key) +#define RSAPrivateKey_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSAPrivateKey_dup) +#define RSAPublicKey_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSAPublicKey_dup) +#define RSAZ_1024_mod_exp_avx2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSAZ_1024_mod_exp_avx2) +#define RSA_PSS_PARAMS_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_PSS_PARAMS_free) +#define RSA_PSS_PARAMS_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_PSS_PARAMS_it) +#define RSA_PSS_PARAMS_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_PSS_PARAMS_new) +#define RSA_add_pkcs1_prefix BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_add_pkcs1_prefix) +#define RSA_bits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_bits) +#define RSA_blinding_on BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_blinding_on) +#define RSA_check_fips BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_check_fips) +#define RSA_check_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_check_key) +#define RSA_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_decrypt) +#define RSA_default_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_default_method) +#define RSA_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_encrypt) +#define RSA_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_flags) +#define RSA_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_free) +#define RSA_generate_key_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_generate_key_ex) +#define RSA_generate_key_fips BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_generate_key_fips) +#define RSA_get0_crt_params BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_get0_crt_params) +#define RSA_get0_factors BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_get0_factors) +#define RSA_get0_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_get0_key) +#define RSA_get_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_get_ex_data) +#define RSA_get_ex_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_get_ex_new_index) +#define RSA_is_opaque BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_is_opaque) +#define RSA_marshal_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_marshal_private_key) +#define RSA_marshal_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_marshal_public_key) +#define RSA_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_new) +#define RSA_new_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_new_method) +#define RSA_padding_add_PKCS1_OAEP_mgf1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_padding_add_PKCS1_OAEP_mgf1) +#define RSA_padding_add_PKCS1_PSS_mgf1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_padding_add_PKCS1_PSS_mgf1) +#define RSA_padding_add_PKCS1_type_1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_padding_add_PKCS1_type_1) +#define RSA_padding_add_PKCS1_type_2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_padding_add_PKCS1_type_2) +#define RSA_padding_add_none BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_padding_add_none) +#define RSA_padding_check_PKCS1_OAEP_mgf1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_padding_check_PKCS1_OAEP_mgf1) +#define RSA_padding_check_PKCS1_type_1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_padding_check_PKCS1_type_1) +#define RSA_padding_check_PKCS1_type_2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_padding_check_PKCS1_type_2) +#define RSA_parse_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_parse_private_key) +#define RSA_parse_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_parse_public_key) +#define RSA_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_print) +#define RSA_private_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_private_decrypt) +#define RSA_private_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_private_encrypt) +#define RSA_private_key_from_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_private_key_from_bytes) +#define RSA_private_key_to_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_private_key_to_bytes) +#define RSA_private_transform BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_private_transform) +#define RSA_public_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_public_decrypt) +#define RSA_public_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_public_encrypt) +#define RSA_public_key_from_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_public_key_from_bytes) +#define RSA_public_key_to_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_public_key_to_bytes) +#define RSA_set0_crt_params BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_set0_crt_params) +#define RSA_set0_factors BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_set0_factors) +#define RSA_set0_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_set0_key) +#define RSA_set_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_set_ex_data) +#define RSA_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_sign) +#define RSA_sign_pss_mgf1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_sign_pss_mgf1) +#define RSA_sign_raw BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_sign_raw) +#define RSA_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_size) +#define RSA_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_up_ref) +#define RSA_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_verify) +#define RSA_verify_PKCS1_PSS_mgf1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_verify_PKCS1_PSS_mgf1) +#define RSA_verify_pss_mgf1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_verify_pss_mgf1) +#define RSA_verify_raw BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_verify_raw) +#define SHA1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA1) +#define SHA1_Final BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA1_Final) +#define SHA1_Init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA1_Init) +#define SHA1_Transform BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA1_Transform) +#define SHA1_Update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA1_Update) +#define SHA224 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA224) +#define SHA224_Final BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA224_Final) +#define SHA224_Init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA224_Init) +#define SHA224_Update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA224_Update) +#define SHA256 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA256) +#define SHA256_Final BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA256_Final) +#define SHA256_Init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA256_Init) +#define SHA256_Transform BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA256_Transform) +#define SHA256_TransformBlocks BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA256_TransformBlocks) +#define SHA256_Update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA256_Update) +#define SHA384 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA384) +#define SHA384_Final BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA384_Final) +#define SHA384_Init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA384_Init) +#define SHA384_Update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA384_Update) +#define SHA512 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA512) +#define SHA512_Final BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA512_Final) +#define SHA512_Init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA512_Init) +#define SHA512_Transform BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA512_Transform) +#define SHA512_Update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA512_Update) +#define SIPHASH_24 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SIPHASH_24) +#define SPAKE2_CTX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SPAKE2_CTX_free) +#define SPAKE2_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SPAKE2_CTX_new) +#define SPAKE2_generate_msg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SPAKE2_generate_msg) +#define SPAKE2_process_msg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SPAKE2_process_msg) +#define SSLeay BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSLeay) +#define SSLeay_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSLeay_version) +#define SXNETID_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SXNETID_free) +#define SXNETID_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SXNETID_it) +#define SXNETID_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SXNETID_new) +#define SXNET_add_id_INTEGER BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SXNET_add_id_INTEGER) +#define SXNET_add_id_asc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SXNET_add_id_asc) +#define SXNET_add_id_ulong BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SXNET_add_id_ulong) +#define SXNET_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SXNET_free) +#define SXNET_get_id_INTEGER BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SXNET_get_id_INTEGER) +#define SXNET_get_id_asc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SXNET_get_id_asc) +#define SXNET_get_id_ulong BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SXNET_get_id_ulong) +#define SXNET_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SXNET_it) +#define SXNET_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SXNET_new) +#define USERNOTICE_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, USERNOTICE_free) +#define USERNOTICE_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, USERNOTICE_it) +#define USERNOTICE_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, USERNOTICE_new) +#define UTF8_getc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, UTF8_getc) +#define UTF8_putc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, UTF8_putc) +#define X25519 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X25519) +#define X25519_keypair BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X25519_keypair) +#define X25519_public_from_private BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X25519_public_from_private) +#define X509V3_EXT_CRL_add_nconf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_CRL_add_nconf) +#define X509V3_EXT_REQ_add_nconf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_REQ_add_nconf) +#define X509V3_EXT_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_add) +#define X509V3_EXT_add_alias BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_add_alias) +#define X509V3_EXT_add_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_add_list) +#define X509V3_EXT_add_nconf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_add_nconf) +#define X509V3_EXT_add_nconf_sk BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_add_nconf_sk) +#define X509V3_EXT_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_cleanup) +#define X509V3_EXT_d2i BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_d2i) +#define X509V3_EXT_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_free) +#define X509V3_EXT_get BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_get) +#define X509V3_EXT_get_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_get_nid) +#define X509V3_EXT_i2d BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_i2d) +#define X509V3_EXT_nconf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_nconf) +#define X509V3_EXT_nconf_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_nconf_nid) +#define X509V3_EXT_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_print) +#define X509V3_EXT_print_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_print_fp) +#define X509V3_EXT_val_prn BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_val_prn) +#define X509V3_NAME_from_section BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_NAME_from_section) +#define X509V3_add1_i2d BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_add1_i2d) +#define X509V3_add_standard_extensions BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_add_standard_extensions) +#define X509V3_add_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_add_value) +#define X509V3_add_value_bool BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_add_value_bool) +#define X509V3_add_value_bool_nf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_add_value_bool_nf) +#define X509V3_add_value_int BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_add_value_int) +#define X509V3_add_value_uchar BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_add_value_uchar) +#define X509V3_conf_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_conf_free) +#define X509V3_extensions_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_extensions_print) +#define X509V3_get_d2i BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_get_d2i) +#define X509V3_get_section BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_get_section) +#define X509V3_get_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_get_string) +#define X509V3_get_value_bool BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_get_value_bool) +#define X509V3_get_value_int BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_get_value_int) +#define X509V3_parse_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_parse_list) +#define X509V3_section_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_section_free) +#define X509V3_set_ctx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_set_ctx) +#define X509V3_set_nconf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_set_nconf) +#define X509V3_string_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_string_free) +#define X509_ALGORS_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ALGORS_it) +#define X509_ALGOR_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ALGOR_cmp) +#define X509_ALGOR_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ALGOR_dup) +#define X509_ALGOR_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ALGOR_free) +#define X509_ALGOR_get0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ALGOR_get0) +#define X509_ALGOR_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ALGOR_it) +#define X509_ALGOR_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ALGOR_new) +#define X509_ALGOR_set0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ALGOR_set0) +#define X509_ALGOR_set_md BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ALGOR_set_md) +#define X509_ATTRIBUTE_SET_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ATTRIBUTE_SET_it) +#define X509_ATTRIBUTE_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ATTRIBUTE_count) +#define X509_ATTRIBUTE_create BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ATTRIBUTE_create) +#define X509_ATTRIBUTE_create_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ATTRIBUTE_create_by_NID) +#define X509_ATTRIBUTE_create_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ATTRIBUTE_create_by_OBJ) +#define X509_ATTRIBUTE_create_by_txt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ATTRIBUTE_create_by_txt) +#define X509_ATTRIBUTE_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ATTRIBUTE_dup) +#define X509_ATTRIBUTE_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ATTRIBUTE_free) +#define X509_ATTRIBUTE_get0_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ATTRIBUTE_get0_data) +#define X509_ATTRIBUTE_get0_object BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ATTRIBUTE_get0_object) +#define X509_ATTRIBUTE_get0_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ATTRIBUTE_get0_type) +#define X509_ATTRIBUTE_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ATTRIBUTE_it) +#define X509_ATTRIBUTE_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ATTRIBUTE_new) +#define X509_ATTRIBUTE_set1_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ATTRIBUTE_set1_data) +#define X509_ATTRIBUTE_set1_object BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ATTRIBUTE_set1_object) +#define X509_CERT_AUX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CERT_AUX_free) +#define X509_CERT_AUX_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CERT_AUX_it) +#define X509_CERT_AUX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CERT_AUX_new) +#define X509_CERT_AUX_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CERT_AUX_print) +#define X509_CINF_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CINF_free) +#define X509_CINF_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CINF_it) +#define X509_CINF_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CINF_new) +#define X509_CRL_INFO_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_INFO_free) +#define X509_CRL_INFO_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_INFO_it) +#define X509_CRL_INFO_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_INFO_new) +#define X509_CRL_METHOD_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_METHOD_free) +#define X509_CRL_METHOD_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_METHOD_new) +#define X509_CRL_add0_revoked BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_add0_revoked) +#define X509_CRL_add1_ext_i2d BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_add1_ext_i2d) +#define X509_CRL_add_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_add_ext) +#define X509_CRL_check_suiteb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_check_suiteb) +#define X509_CRL_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_cmp) +#define X509_CRL_delete_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_delete_ext) +#define X509_CRL_diff BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_diff) +#define X509_CRL_digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_digest) +#define X509_CRL_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_dup) +#define X509_CRL_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_free) +#define X509_CRL_get0_by_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_get0_by_cert) +#define X509_CRL_get0_by_serial BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_get0_by_serial) +#define X509_CRL_get0_lastUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_get0_lastUpdate) +#define X509_CRL_get0_nextUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_get0_nextUpdate) +#define X509_CRL_get0_signature BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_get0_signature) +#define X509_CRL_get_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_get_ext) +#define X509_CRL_get_ext_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_get_ext_by_NID) +#define X509_CRL_get_ext_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_get_ext_by_OBJ) +#define X509_CRL_get_ext_by_critical BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_get_ext_by_critical) +#define X509_CRL_get_ext_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_get_ext_count) +#define X509_CRL_get_ext_d2i BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_get_ext_d2i) +#define X509_CRL_get_meth_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_get_meth_data) +#define X509_CRL_get_signature_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_get_signature_nid) +#define X509_CRL_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_it) +#define X509_CRL_match BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_match) +#define X509_CRL_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_new) +#define X509_CRL_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_print) +#define X509_CRL_print_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_print_fp) +#define X509_CRL_set_default_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_set_default_method) +#define X509_CRL_set_issuer_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_set_issuer_name) +#define X509_CRL_set_lastUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_set_lastUpdate) +#define X509_CRL_set_meth_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_set_meth_data) +#define X509_CRL_set_nextUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_set_nextUpdate) +#define X509_CRL_set_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_set_version) +#define X509_CRL_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_sign) +#define X509_CRL_sign_ctx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_sign_ctx) +#define X509_CRL_sort BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_sort) +#define X509_CRL_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_up_ref) +#define X509_CRL_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_verify) +#define X509_EXTENSIONS_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_EXTENSIONS_it) +#define X509_EXTENSION_create_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_EXTENSION_create_by_NID) +#define X509_EXTENSION_create_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_EXTENSION_create_by_OBJ) +#define X509_EXTENSION_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_EXTENSION_dup) +#define X509_EXTENSION_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_EXTENSION_free) +#define X509_EXTENSION_get_critical BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_EXTENSION_get_critical) +#define X509_EXTENSION_get_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_EXTENSION_get_data) +#define X509_EXTENSION_get_object BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_EXTENSION_get_object) +#define X509_EXTENSION_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_EXTENSION_it) +#define X509_EXTENSION_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_EXTENSION_new) +#define X509_EXTENSION_set_critical BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_EXTENSION_set_critical) +#define X509_EXTENSION_set_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_EXTENSION_set_data) +#define X509_EXTENSION_set_object BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_EXTENSION_set_object) +#define X509_INFO_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_INFO_free) +#define X509_INFO_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_INFO_new) +#define X509_LOOKUP_by_alias BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_LOOKUP_by_alias) +#define X509_LOOKUP_by_fingerprint BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_LOOKUP_by_fingerprint) +#define X509_LOOKUP_by_issuer_serial BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_LOOKUP_by_issuer_serial) +#define X509_LOOKUP_by_subject BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_LOOKUP_by_subject) +#define X509_LOOKUP_ctrl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_LOOKUP_ctrl) +#define X509_LOOKUP_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_LOOKUP_file) +#define X509_LOOKUP_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_LOOKUP_free) +#define X509_LOOKUP_hash_dir BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_LOOKUP_hash_dir) +#define X509_LOOKUP_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_LOOKUP_init) +#define X509_LOOKUP_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_LOOKUP_new) +#define X509_LOOKUP_shutdown BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_LOOKUP_shutdown) +#define X509_NAME_ENTRIES_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_ENTRIES_it) +#define X509_NAME_ENTRY_create_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_ENTRY_create_by_NID) +#define X509_NAME_ENTRY_create_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_ENTRY_create_by_OBJ) +#define X509_NAME_ENTRY_create_by_txt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_ENTRY_create_by_txt) +#define X509_NAME_ENTRY_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_ENTRY_dup) +#define X509_NAME_ENTRY_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_ENTRY_free) +#define X509_NAME_ENTRY_get_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_ENTRY_get_data) +#define X509_NAME_ENTRY_get_object BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_ENTRY_get_object) +#define X509_NAME_ENTRY_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_ENTRY_it) +#define X509_NAME_ENTRY_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_ENTRY_new) +#define X509_NAME_ENTRY_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_ENTRY_set) +#define X509_NAME_ENTRY_set_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_ENTRY_set_data) +#define X509_NAME_ENTRY_set_object BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_ENTRY_set_object) +#define X509_NAME_INTERNAL_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_INTERNAL_it) +#define X509_NAME_add_entry BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_add_entry) +#define X509_NAME_add_entry_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_add_entry_by_NID) +#define X509_NAME_add_entry_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_add_entry_by_OBJ) +#define X509_NAME_add_entry_by_txt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_add_entry_by_txt) +#define X509_NAME_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_cmp) +#define X509_NAME_delete_entry BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_delete_entry) +#define X509_NAME_digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_digest) +#define X509_NAME_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_dup) +#define X509_NAME_entry_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_entry_count) +#define X509_NAME_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_free) +#define X509_NAME_get0_der BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_get0_der) +#define X509_NAME_get_entry BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_get_entry) +#define X509_NAME_get_index_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_get_index_by_NID) +#define X509_NAME_get_index_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_get_index_by_OBJ) +#define X509_NAME_get_text_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_get_text_by_NID) +#define X509_NAME_get_text_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_get_text_by_OBJ) +#define X509_NAME_hash BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_hash) +#define X509_NAME_hash_old BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_hash_old) +#define X509_NAME_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_it) +#define X509_NAME_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_new) +#define X509_NAME_oneline BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_oneline) +#define X509_NAME_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_print) +#define X509_NAME_print_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_print_ex) +#define X509_NAME_print_ex_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_print_ex_fp) +#define X509_NAME_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_set) +#define X509_OBJECT_free_contents BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_OBJECT_free_contents) +#define X509_OBJECT_get0_X509 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_OBJECT_get0_X509) +#define X509_OBJECT_get_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_OBJECT_get_type) +#define X509_OBJECT_idx_by_subject BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_OBJECT_idx_by_subject) +#define X509_OBJECT_retrieve_by_subject BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_OBJECT_retrieve_by_subject) +#define X509_OBJECT_retrieve_match BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_OBJECT_retrieve_match) +#define X509_OBJECT_up_ref_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_OBJECT_up_ref_count) +#define X509_PKEY_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PKEY_free) +#define X509_PKEY_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PKEY_new) +#define X509_POLICY_NODE_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_POLICY_NODE_print) +#define X509_PUBKEY_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PUBKEY_free) +#define X509_PUBKEY_get BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PUBKEY_get) +#define X509_PUBKEY_get0_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PUBKEY_get0_param) +#define X509_PUBKEY_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PUBKEY_it) +#define X509_PUBKEY_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PUBKEY_new) +#define X509_PUBKEY_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PUBKEY_set) +#define X509_PUBKEY_set0_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PUBKEY_set0_param) +#define X509_PURPOSE_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PURPOSE_add) +#define X509_PURPOSE_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PURPOSE_cleanup) +#define X509_PURPOSE_get0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PURPOSE_get0) +#define X509_PURPOSE_get0_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PURPOSE_get0_name) +#define X509_PURPOSE_get0_sname BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PURPOSE_get0_sname) +#define X509_PURPOSE_get_by_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PURPOSE_get_by_id) +#define X509_PURPOSE_get_by_sname BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PURPOSE_get_by_sname) +#define X509_PURPOSE_get_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PURPOSE_get_count) +#define X509_PURPOSE_get_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PURPOSE_get_id) +#define X509_PURPOSE_get_trust BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PURPOSE_get_trust) +#define X509_PURPOSE_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PURPOSE_set) +#define X509_REQ_INFO_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_INFO_free) +#define X509_REQ_INFO_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_INFO_it) +#define X509_REQ_INFO_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_INFO_new) +#define X509_REQ_add1_attr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_add1_attr) +#define X509_REQ_add1_attr_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_add1_attr_by_NID) +#define X509_REQ_add1_attr_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_add1_attr_by_OBJ) +#define X509_REQ_add1_attr_by_txt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_add1_attr_by_txt) +#define X509_REQ_add_extensions BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_add_extensions) +#define X509_REQ_add_extensions_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_add_extensions_nid) +#define X509_REQ_check_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_check_private_key) +#define X509_REQ_delete_attr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_delete_attr) +#define X509_REQ_digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_digest) +#define X509_REQ_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_dup) +#define X509_REQ_extension_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_extension_nid) +#define X509_REQ_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_free) +#define X509_REQ_get0_signature BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_get0_signature) +#define X509_REQ_get1_email BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_get1_email) +#define X509_REQ_get_attr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_get_attr) +#define X509_REQ_get_attr_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_get_attr_by_NID) +#define X509_REQ_get_attr_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_get_attr_by_OBJ) +#define X509_REQ_get_attr_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_get_attr_count) +#define X509_REQ_get_extension_nids BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_get_extension_nids) +#define X509_REQ_get_extensions BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_get_extensions) +#define X509_REQ_get_pubkey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_get_pubkey) +#define X509_REQ_get_signature_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_get_signature_nid) +#define X509_REQ_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_it) +#define X509_REQ_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_new) +#define X509_REQ_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_print) +#define X509_REQ_print_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_print_ex) +#define X509_REQ_print_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_print_fp) +#define X509_REQ_set_extension_nids BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_set_extension_nids) +#define X509_REQ_set_pubkey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_set_pubkey) +#define X509_REQ_set_subject_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_set_subject_name) +#define X509_REQ_set_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_set_version) +#define X509_REQ_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_sign) +#define X509_REQ_sign_ctx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_sign_ctx) +#define X509_REQ_to_X509 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_to_X509) +#define X509_REQ_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_verify) +#define X509_REVOKED_add1_ext_i2d BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_add1_ext_i2d) +#define X509_REVOKED_add_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_add_ext) +#define X509_REVOKED_delete_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_delete_ext) +#define X509_REVOKED_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_dup) +#define X509_REVOKED_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_free) +#define X509_REVOKED_get0_revocationDate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_get0_revocationDate) +#define X509_REVOKED_get0_serialNumber BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_get0_serialNumber) +#define X509_REVOKED_get_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_get_ext) +#define X509_REVOKED_get_ext_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_get_ext_by_NID) +#define X509_REVOKED_get_ext_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_get_ext_by_OBJ) +#define X509_REVOKED_get_ext_by_critical BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_get_ext_by_critical) +#define X509_REVOKED_get_ext_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_get_ext_count) +#define X509_REVOKED_get_ext_d2i BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_get_ext_d2i) +#define X509_REVOKED_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_it) +#define X509_REVOKED_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_new) +#define X509_REVOKED_set_revocationDate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_set_revocationDate) +#define X509_REVOKED_set_serialNumber BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_set_serialNumber) +#define X509_SIG_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_SIG_free) +#define X509_SIG_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_SIG_it) +#define X509_SIG_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_SIG_new) +#define X509_STORE_CTX_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_cleanup) +#define X509_STORE_CTX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_free) +#define X509_STORE_CTX_get0_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get0_cert) +#define X509_STORE_CTX_get0_current_crl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get0_current_crl) +#define X509_STORE_CTX_get0_current_issuer BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get0_current_issuer) +#define X509_STORE_CTX_get0_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get0_param) +#define X509_STORE_CTX_get0_parent_ctx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get0_parent_ctx) +#define X509_STORE_CTX_get0_policy_tree BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get0_policy_tree) +#define X509_STORE_CTX_get0_store BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get0_store) +#define X509_STORE_CTX_get0_untrusted BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get0_untrusted) +#define X509_STORE_CTX_get1_chain BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get1_chain) +#define X509_STORE_CTX_get1_issuer BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get1_issuer) +#define X509_STORE_CTX_get_chain BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get_chain) +#define X509_STORE_CTX_get_current_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get_current_cert) +#define X509_STORE_CTX_get_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get_error) +#define X509_STORE_CTX_get_error_depth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get_error_depth) +#define X509_STORE_CTX_get_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get_ex_data) +#define X509_STORE_CTX_get_ex_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get_ex_new_index) +#define X509_STORE_CTX_get_explicit_policy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get_explicit_policy) +#define X509_STORE_CTX_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_init) +#define X509_STORE_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_new) +#define X509_STORE_CTX_purpose_inherit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_purpose_inherit) +#define X509_STORE_CTX_set0_crls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_set0_crls) +#define X509_STORE_CTX_set0_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_set0_param) +#define X509_STORE_CTX_set_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_set_cert) +#define X509_STORE_CTX_set_chain BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_set_chain) +#define X509_STORE_CTX_set_default BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_set_default) +#define X509_STORE_CTX_set_depth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_set_depth) +#define X509_STORE_CTX_set_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_set_error) +#define X509_STORE_CTX_set_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_set_ex_data) +#define X509_STORE_CTX_set_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_set_flags) +#define X509_STORE_CTX_set_purpose BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_set_purpose) +#define X509_STORE_CTX_set_time BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_set_time) +#define X509_STORE_CTX_set_trust BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_set_trust) +#define X509_STORE_CTX_set_verify_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_set_verify_cb) +#define X509_STORE_CTX_trusted_stack BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_trusted_stack) +#define X509_STORE_CTX_zero BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_zero) +#define X509_STORE_add_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_add_cert) +#define X509_STORE_add_crl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_add_crl) +#define X509_STORE_add_lookup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_add_lookup) +#define X509_STORE_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_free) +#define X509_STORE_get0_objects BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get0_objects) +#define X509_STORE_get0_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get0_param) +#define X509_STORE_get1_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get1_certs) +#define X509_STORE_get1_crls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get1_crls) +#define X509_STORE_get_by_subject BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get_by_subject) +#define X509_STORE_get_cert_crl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get_cert_crl) +#define X509_STORE_get_check_crl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get_check_crl) +#define X509_STORE_get_check_issued BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get_check_issued) +#define X509_STORE_get_check_revocation BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get_check_revocation) +#define X509_STORE_get_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get_cleanup) +#define X509_STORE_get_get_crl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get_get_crl) +#define X509_STORE_get_get_issuer BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get_get_issuer) +#define X509_STORE_get_lookup_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get_lookup_certs) +#define X509_STORE_get_lookup_crls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get_lookup_crls) +#define X509_STORE_get_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get_verify) +#define X509_STORE_get_verify_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get_verify_cb) +#define X509_STORE_load_locations BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_load_locations) +#define X509_STORE_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_new) +#define X509_STORE_set0_additional_untrusted BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set0_additional_untrusted) +#define X509_STORE_set1_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set1_param) +#define X509_STORE_set_cert_crl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_cert_crl) +#define X509_STORE_set_check_crl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_check_crl) +#define X509_STORE_set_check_issued BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_check_issued) +#define X509_STORE_set_check_revocation BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_check_revocation) +#define X509_STORE_set_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_cleanup) +#define X509_STORE_set_default_paths BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_default_paths) +#define X509_STORE_set_depth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_depth) +#define X509_STORE_set_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_flags) +#define X509_STORE_set_get_crl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_get_crl) +#define X509_STORE_set_get_issuer BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_get_issuer) +#define X509_STORE_set_lookup_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_lookup_certs) +#define X509_STORE_set_lookup_crls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_lookup_crls) +#define X509_STORE_set_purpose BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_purpose) +#define X509_STORE_set_trust BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_trust) +#define X509_STORE_set_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_verify) +#define X509_STORE_set_verify_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_verify_cb) +#define X509_STORE_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_up_ref) +#define X509_TRUST_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_TRUST_add) +#define X509_TRUST_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_TRUST_cleanup) +#define X509_TRUST_get0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_TRUST_get0) +#define X509_TRUST_get0_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_TRUST_get0_name) +#define X509_TRUST_get_by_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_TRUST_get_by_id) +#define X509_TRUST_get_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_TRUST_get_count) +#define X509_TRUST_get_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_TRUST_get_flags) +#define X509_TRUST_get_trust BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_TRUST_get_trust) +#define X509_TRUST_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_TRUST_set) +#define X509_TRUST_set_default BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_TRUST_set_default) +#define X509_VAL_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VAL_free) +#define X509_VAL_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VAL_it) +#define X509_VAL_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VAL_new) +#define X509_VERIFY_PARAM_add0_policy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_add0_policy) +#define X509_VERIFY_PARAM_add0_table BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_add0_table) +#define X509_VERIFY_PARAM_add1_host BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_add1_host) +#define X509_VERIFY_PARAM_clear_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_clear_flags) +#define X509_VERIFY_PARAM_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_free) +#define X509_VERIFY_PARAM_get0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_get0) +#define X509_VERIFY_PARAM_get0_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_get0_name) +#define X509_VERIFY_PARAM_get0_peername BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_get0_peername) +#define X509_VERIFY_PARAM_get_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_get_count) +#define X509_VERIFY_PARAM_get_depth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_get_depth) +#define X509_VERIFY_PARAM_get_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_get_flags) +#define X509_VERIFY_PARAM_inherit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_inherit) +#define X509_VERIFY_PARAM_lookup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_lookup) +#define X509_VERIFY_PARAM_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_new) +#define X509_VERIFY_PARAM_set1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_set1) +#define X509_VERIFY_PARAM_set1_email BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_set1_email) +#define X509_VERIFY_PARAM_set1_host BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_set1_host) +#define X509_VERIFY_PARAM_set1_ip BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_set1_ip) +#define X509_VERIFY_PARAM_set1_ip_asc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_set1_ip_asc) +#define X509_VERIFY_PARAM_set1_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_set1_name) +#define X509_VERIFY_PARAM_set1_policies BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_set1_policies) +#define X509_VERIFY_PARAM_set_depth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_set_depth) +#define X509_VERIFY_PARAM_set_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_set_flags) +#define X509_VERIFY_PARAM_set_hostflags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_set_hostflags) +#define X509_VERIFY_PARAM_set_purpose BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_set_purpose) +#define X509_VERIFY_PARAM_set_time BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_set_time) +#define X509_VERIFY_PARAM_set_trust BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_set_trust) +#define X509_VERIFY_PARAM_table_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_table_cleanup) +#define X509_add1_ext_i2d BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_add1_ext_i2d) +#define X509_add1_reject_object BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_add1_reject_object) +#define X509_add1_trust_object BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_add1_trust_object) +#define X509_add_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_add_ext) +#define X509_alias_get0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_alias_get0) +#define X509_alias_set1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_alias_set1) +#define X509_chain_check_suiteb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_chain_check_suiteb) +#define X509_chain_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_chain_up_ref) +#define X509_check_akid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_check_akid) +#define X509_check_ca BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_check_ca) +#define X509_check_email BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_check_email) +#define X509_check_host BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_check_host) +#define X509_check_ip BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_check_ip) +#define X509_check_ip_asc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_check_ip_asc) +#define X509_check_issued BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_check_issued) +#define X509_check_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_check_private_key) +#define X509_check_purpose BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_check_purpose) +#define X509_check_trust BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_check_trust) +#define X509_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_cmp) +#define X509_cmp_current_time BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_cmp_current_time) +#define X509_cmp_time BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_cmp_time) +#define X509_delete_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_delete_ext) +#define X509_digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_digest) +#define X509_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_dup) +#define X509_email_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_email_free) +#define X509_find_by_issuer_and_serial BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_find_by_issuer_and_serial) +#define X509_find_by_subject BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_find_by_subject) +#define X509_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_free) +#define X509_get0_extensions BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get0_extensions) +#define X509_get0_notAfter BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get0_notAfter) +#define X509_get0_notBefore BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get0_notBefore) +#define X509_get0_pubkey_bitstr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get0_pubkey_bitstr) +#define X509_get0_signature BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get0_signature) +#define X509_get0_tbs_sigalg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get0_tbs_sigalg) +#define X509_get1_email BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get1_email) +#define X509_get1_ocsp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get1_ocsp) +#define X509_get_default_cert_area BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_default_cert_area) +#define X509_get_default_cert_dir BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_default_cert_dir) +#define X509_get_default_cert_dir_env BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_default_cert_dir_env) +#define X509_get_default_cert_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_default_cert_file) +#define X509_get_default_cert_file_env BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_default_cert_file_env) +#define X509_get_default_private_dir BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_default_private_dir) +#define X509_get_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_ex_data) +#define X509_get_ex_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_ex_new_index) +#define X509_get_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_ext) +#define X509_get_ext_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_ext_by_NID) +#define X509_get_ext_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_ext_by_OBJ) +#define X509_get_ext_by_critical BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_ext_by_critical) +#define X509_get_ext_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_ext_count) +#define X509_get_ext_d2i BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_ext_d2i) +#define X509_get_extended_key_usage BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_extended_key_usage) +#define X509_get_extension_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_extension_flags) +#define X509_get_issuer_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_issuer_name) +#define X509_get_key_usage BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_key_usage) +#define X509_get_pubkey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_pubkey) +#define X509_get_serialNumber BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_serialNumber) +#define X509_get_signature_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_signature_nid) +#define X509_get_subject_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_subject_name) +#define X509_gmtime_adj BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_gmtime_adj) +#define X509_issuer_and_serial_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_issuer_and_serial_cmp) +#define X509_issuer_and_serial_hash BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_issuer_and_serial_hash) +#define X509_issuer_name_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_issuer_name_cmp) +#define X509_issuer_name_hash BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_issuer_name_hash) +#define X509_issuer_name_hash_old BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_issuer_name_hash_old) +#define X509_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_it) +#define X509_keyid_get0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_keyid_get0) +#define X509_keyid_set1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_keyid_set1) +#define X509_load_cert_crl_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_load_cert_crl_file) +#define X509_load_cert_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_load_cert_file) +#define X509_load_crl_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_load_crl_file) +#define X509_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_new) +#define X509_ocspid_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ocspid_print) +#define X509_parse_from_buffer BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_parse_from_buffer) +#define X509_policy_check BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_policy_check) +#define X509_policy_level_get0_node BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_policy_level_get0_node) +#define X509_policy_level_node_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_policy_level_node_count) +#define X509_policy_node_get0_parent BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_policy_node_get0_parent) +#define X509_policy_node_get0_policy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_policy_node_get0_policy) +#define X509_policy_node_get0_qualifiers BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_policy_node_get0_qualifiers) +#define X509_policy_tree_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_policy_tree_free) +#define X509_policy_tree_get0_level BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_policy_tree_get0_level) +#define X509_policy_tree_get0_policies BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_policy_tree_get0_policies) +#define X509_policy_tree_get0_user_policies BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_policy_tree_get0_user_policies) +#define X509_policy_tree_level_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_policy_tree_level_count) +#define X509_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_print) +#define X509_print_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_print_ex) +#define X509_print_ex_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_print_ex_fp) +#define X509_print_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_print_fp) +#define X509_pubkey_digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_pubkey_digest) +#define X509_reject_clear BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_reject_clear) +#define X509_set_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_set_ex_data) +#define X509_set_issuer_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_set_issuer_name) +#define X509_set_notAfter BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_set_notAfter) +#define X509_set_notBefore BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_set_notBefore) +#define X509_set_pubkey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_set_pubkey) +#define X509_set_serialNumber BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_set_serialNumber) +#define X509_set_subject_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_set_subject_name) +#define X509_set_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_set_version) +#define X509_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_sign) +#define X509_sign_ctx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_sign_ctx) +#define X509_signature_dump BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_signature_dump) +#define X509_signature_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_signature_print) +#define X509_subject_name_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_subject_name_cmp) +#define X509_subject_name_hash BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_subject_name_hash) +#define X509_subject_name_hash_old BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_subject_name_hash_old) +#define X509_supported_extension BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_supported_extension) +#define X509_time_adj BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_time_adj) +#define X509_time_adj_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_time_adj_ex) +#define X509_to_X509_REQ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_to_X509_REQ) +#define X509_trust_clear BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_trust_clear) +#define X509_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_up_ref) +#define X509_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_verify) +#define X509_verify_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_verify_cert) +#define X509_verify_cert_error_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_verify_cert_error_string) +#define X509at_add1_attr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509at_add1_attr) +#define X509at_add1_attr_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509at_add1_attr_by_NID) +#define X509at_add1_attr_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509at_add1_attr_by_OBJ) +#define X509at_add1_attr_by_txt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509at_add1_attr_by_txt) +#define X509at_delete_attr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509at_delete_attr) +#define X509at_get0_data_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509at_get0_data_by_OBJ) +#define X509at_get_attr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509at_get_attr) +#define X509at_get_attr_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509at_get_attr_by_NID) +#define X509at_get_attr_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509at_get_attr_by_OBJ) +#define X509at_get_attr_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509at_get_attr_count) +#define X509v3_add_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509v3_add_ext) +#define X509v3_delete_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509v3_delete_ext) +#define X509v3_get_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509v3_get_ext) +#define X509v3_get_ext_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509v3_get_ext_by_NID) +#define X509v3_get_ext_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509v3_get_ext_by_OBJ) +#define X509v3_get_ext_by_critical BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509v3_get_ext_by_critical) +#define X509v3_get_ext_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509v3_get_ext_count) +#define a2i_GENERAL_NAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, a2i_GENERAL_NAME) +#define a2i_IPADDRESS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, a2i_IPADDRESS) +#define a2i_IPADDRESS_NC BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, a2i_IPADDRESS_NC) +#define a2i_ipadd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, a2i_ipadd) +#define abi_test_bad_unwind_temporary BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_bad_unwind_temporary) +#define abi_test_bad_unwind_wrong_register BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_bad_unwind_wrong_register) +#define abi_test_clobber_r10 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_r10) +#define abi_test_clobber_r11 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_r11) +#define abi_test_clobber_r12 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_r12) +#define abi_test_clobber_r13 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_r13) +#define abi_test_clobber_r14 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_r14) +#define abi_test_clobber_r15 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_r15) +#define abi_test_clobber_r8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_r8) +#define abi_test_clobber_r9 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_r9) +#define abi_test_clobber_rax BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_rax) +#define abi_test_clobber_rbp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_rbp) +#define abi_test_clobber_rbx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_rbx) +#define abi_test_clobber_rcx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_rcx) +#define abi_test_clobber_rdi BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_rdi) +#define abi_test_clobber_rdx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_rdx) +#define abi_test_clobber_rsi BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_rsi) +#define abi_test_clobber_xmm0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm0) +#define abi_test_clobber_xmm1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm1) +#define abi_test_clobber_xmm10 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm10) +#define abi_test_clobber_xmm11 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm11) +#define abi_test_clobber_xmm12 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm12) +#define abi_test_clobber_xmm13 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm13) +#define abi_test_clobber_xmm14 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm14) +#define abi_test_clobber_xmm15 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm15) +#define abi_test_clobber_xmm2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm2) +#define abi_test_clobber_xmm3 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm3) +#define abi_test_clobber_xmm4 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm4) +#define abi_test_clobber_xmm5 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm5) +#define abi_test_clobber_xmm6 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm6) +#define abi_test_clobber_xmm7 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm7) +#define abi_test_clobber_xmm8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm8) +#define abi_test_clobber_xmm9 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm9) +#define abi_test_get_and_clear_direction_flag BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_get_and_clear_direction_flag) +#define abi_test_set_direction_flag BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_set_direction_flag) +#define abi_test_trampoline BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_trampoline) +#define abi_test_unwind_return BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_unwind_return) +#define abi_test_unwind_start BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_unwind_start) +#define abi_test_unwind_stop BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_unwind_stop) +#define aes128gcmsiv_aes_ks BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes128gcmsiv_aes_ks) +#define aes128gcmsiv_aes_ks_enc_x1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes128gcmsiv_aes_ks_enc_x1) +#define aes128gcmsiv_dec BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes128gcmsiv_dec) +#define aes128gcmsiv_ecb_enc_block BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes128gcmsiv_ecb_enc_block) +#define aes128gcmsiv_enc_msg_x4 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes128gcmsiv_enc_msg_x4) +#define aes128gcmsiv_enc_msg_x8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes128gcmsiv_enc_msg_x8) +#define aes128gcmsiv_kdf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes128gcmsiv_kdf) +#define aes256gcmsiv_aes_ks BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes256gcmsiv_aes_ks) +#define aes256gcmsiv_aes_ks_enc_x1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes256gcmsiv_aes_ks_enc_x1) +#define aes256gcmsiv_dec BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes256gcmsiv_dec) +#define aes256gcmsiv_ecb_enc_block BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes256gcmsiv_ecb_enc_block) +#define aes256gcmsiv_enc_msg_x4 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes256gcmsiv_enc_msg_x4) +#define aes256gcmsiv_enc_msg_x8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes256gcmsiv_enc_msg_x8) +#define aes256gcmsiv_kdf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes256gcmsiv_kdf) +#define aes_ctr_set_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_ctr_set_key) +#define aes_hw_cbc_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_hw_cbc_encrypt) +#define aes_hw_ctr32_encrypt_blocks BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_hw_ctr32_encrypt_blocks) +#define aes_hw_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_hw_decrypt) +#define aes_hw_ecb_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_hw_ecb_encrypt) +#define aes_hw_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_hw_encrypt) +#define aes_hw_set_decrypt_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_hw_set_decrypt_key) +#define aes_hw_set_encrypt_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_hw_set_encrypt_key) +#define aes_nohw_cbc_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_nohw_cbc_encrypt) +#define aes_nohw_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_nohw_decrypt) +#define aes_nohw_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_nohw_encrypt) +#define aes_nohw_set_decrypt_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_nohw_set_decrypt_key) +#define aes_nohw_set_encrypt_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_nohw_set_encrypt_key) +#define aesgcmsiv_htable6_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aesgcmsiv_htable6_init) +#define aesgcmsiv_htable_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aesgcmsiv_htable_init) +#define aesgcmsiv_htable_polyval BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aesgcmsiv_htable_polyval) +#define aesgcmsiv_polyval_horner BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aesgcmsiv_polyval_horner) +#define aesni_gcm_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aesni_gcm_decrypt) +#define aesni_gcm_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aesni_gcm_encrypt) +#define asn1_do_adb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_do_adb) +#define asn1_enc_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_enc_free) +#define asn1_enc_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_enc_init) +#define asn1_enc_restore BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_enc_restore) +#define asn1_enc_save BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_enc_save) +#define asn1_ex_c2i BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_ex_c2i) +#define asn1_ex_i2c BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_ex_i2c) +#define asn1_generalizedtime_to_tm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_generalizedtime_to_tm) +#define asn1_get_choice_selector BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_get_choice_selector) +#define asn1_get_field_ptr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_get_field_ptr) +#define asn1_item_combine_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_item_combine_free) +#define asn1_refcount_dec_and_test_zero BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_refcount_dec_and_test_zero) +#define asn1_refcount_set_one BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_refcount_set_one) +#define asn1_set_choice_selector BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_set_choice_selector) +#define asn1_utctime_to_tm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_utctime_to_tm) +#define beeu_mod_inverse_vartime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, beeu_mod_inverse_vartime) +#define bio_clear_socket_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bio_clear_socket_error) +#define bio_fd_should_retry BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bio_fd_should_retry) +#define bio_ip_and_port_to_socket_and_addr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bio_ip_and_port_to_socket_and_addr) +#define bio_sock_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bio_sock_error) +#define bio_socket_nbio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bio_socket_nbio) +#define bn_abs_sub_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_abs_sub_consttime) +#define bn_add_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_add_words) +#define bn_copy_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_copy_words) +#define bn_div_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_div_consttime) +#define bn_expand BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_expand) +#define bn_fits_in_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_fits_in_words) +#define bn_from_montgomery BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_from_montgomery) +#define bn_from_montgomery_small BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_from_montgomery_small) +#define bn_gather5 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_gather5) +#define bn_in_range_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_in_range_words) +#define bn_is_bit_set_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_is_bit_set_words) +#define bn_is_relatively_prime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_is_relatively_prime) +#define bn_jacobi BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_jacobi) +#define bn_lcm_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_lcm_consttime) +#define bn_less_than_montgomery_R BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_less_than_montgomery_R) +#define bn_less_than_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_less_than_words) +#define bn_miller_rabin_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_miller_rabin_init) +#define bn_miller_rabin_iteration BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_miller_rabin_iteration) +#define bn_minimal_width BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_minimal_width) +#define bn_mod_add_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mod_add_consttime) +#define bn_mod_add_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mod_add_words) +#define bn_mod_exp_base_2_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mod_exp_base_2_consttime) +#define bn_mod_exp_mont_small BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mod_exp_mont_small) +#define bn_mod_inverse_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mod_inverse_consttime) +#define bn_mod_inverse_prime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mod_inverse_prime) +#define bn_mod_inverse_prime_mont_small BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mod_inverse_prime_mont_small) +#define bn_mod_inverse_secret_prime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mod_inverse_secret_prime) +#define bn_mod_lshift1_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mod_lshift1_consttime) +#define bn_mod_lshift_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mod_lshift_consttime) +#define bn_mod_mul_montgomery_small BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mod_mul_montgomery_small) +#define bn_mod_sub_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mod_sub_consttime) +#define bn_mod_sub_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mod_sub_words) +#define bn_mod_u16_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mod_u16_consttime) +#define bn_mont_n0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mont_n0) +#define bn_mul_add_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mul_add_words) +#define bn_mul_comba4 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mul_comba4) +#define bn_mul_comba8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mul_comba8) +#define bn_mul_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mul_consttime) +#define bn_mul_mont BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mul_mont) +#define bn_mul_mont_gather5 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mul_mont_gather5) +#define bn_mul_small BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mul_small) +#define bn_mul_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mul_words) +#define bn_odd_number_is_obviously_composite BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_odd_number_is_obviously_composite) +#define bn_one_to_montgomery BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_one_to_montgomery) +#define bn_power5 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_power5) +#define bn_rand_range_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_rand_range_words) +#define bn_rand_secret_range BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_rand_secret_range) +#define bn_reduce_once BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_reduce_once) +#define bn_reduce_once_in_place BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_reduce_once_in_place) +#define bn_resize_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_resize_words) +#define bn_rshift1_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_rshift1_words) +#define bn_rshift_secret_shift BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_rshift_secret_shift) +#define bn_rshift_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_rshift_words) +#define bn_scatter5 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_scatter5) +#define bn_select_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_select_words) +#define bn_set_minimal_width BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_set_minimal_width) +#define bn_set_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_set_words) +#define bn_sqr8x_internal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_sqr8x_internal) +#define bn_sqr_comba4 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_sqr_comba4) +#define bn_sqr_comba8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_sqr_comba8) +#define bn_sqr_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_sqr_consttime) +#define bn_sqr_small BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_sqr_small) +#define bn_sqr_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_sqr_words) +#define bn_sqrx8x_internal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_sqrx8x_internal) +#define bn_sub_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_sub_words) +#define bn_to_montgomery_small BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_to_montgomery_small) +#define bn_uadd_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_uadd_consttime) +#define bn_usub_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_usub_consttime) +#define bn_wexpand BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_wexpand) +#define boringssl_fips_self_test BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, boringssl_fips_self_test) +#define c2i_ASN1_BIT_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, c2i_ASN1_BIT_STRING) +#define c2i_ASN1_INTEGER BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, c2i_ASN1_INTEGER) +#define c2i_ASN1_OBJECT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, c2i_ASN1_OBJECT) +#define cbb_add_latin1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, cbb_add_latin1) +#define cbb_add_ucs2_be BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, cbb_add_ucs2_be) +#define cbb_add_utf32_be BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, cbb_add_utf32_be) +#define cbb_add_utf8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, cbb_add_utf8) +#define cbb_get_utf8_len BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, cbb_get_utf8_len) +#define cbs_get_latin1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, cbs_get_latin1) +#define cbs_get_ucs2_be BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, cbs_get_ucs2_be) +#define cbs_get_utf32_be BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, cbs_get_utf32_be) +#define cbs_get_utf8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, cbs_get_utf8) +#define chacha20_poly1305_open BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, chacha20_poly1305_open) +#define chacha20_poly1305_seal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, chacha20_poly1305_seal) +#define crypto_gcm_clmul_enabled BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, crypto_gcm_clmul_enabled) +#define d2i_ACCESS_DESCRIPTION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ACCESS_DESCRIPTION) +#define d2i_ASN1_BIT_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_BIT_STRING) +#define d2i_ASN1_BMPSTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_BMPSTRING) +#define d2i_ASN1_BOOLEAN BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_BOOLEAN) +#define d2i_ASN1_ENUMERATED BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_ENUMERATED) +#define d2i_ASN1_GENERALIZEDTIME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_GENERALIZEDTIME) +#define d2i_ASN1_GENERALSTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_GENERALSTRING) +#define d2i_ASN1_IA5STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_IA5STRING) +#define d2i_ASN1_INTEGER BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_INTEGER) +#define d2i_ASN1_NULL BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_NULL) +#define d2i_ASN1_OBJECT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_OBJECT) +#define d2i_ASN1_OCTET_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_OCTET_STRING) +#define d2i_ASN1_PRINTABLE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_PRINTABLE) +#define d2i_ASN1_PRINTABLESTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_PRINTABLESTRING) +#define d2i_ASN1_SEQUENCE_ANY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_SEQUENCE_ANY) +#define d2i_ASN1_SET_ANY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_SET_ANY) +#define d2i_ASN1_T61STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_T61STRING) +#define d2i_ASN1_TIME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_TIME) +#define d2i_ASN1_TYPE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_TYPE) +#define d2i_ASN1_UNIVERSALSTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_UNIVERSALSTRING) +#define d2i_ASN1_UTCTIME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_UTCTIME) +#define d2i_ASN1_UTF8STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_UTF8STRING) +#define d2i_ASN1_VISIBLESTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_VISIBLESTRING) +#define d2i_AUTHORITY_INFO_ACCESS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_AUTHORITY_INFO_ACCESS) +#define d2i_AUTHORITY_KEYID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_AUTHORITY_KEYID) +#define d2i_AutoPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_AutoPrivateKey) +#define d2i_BASIC_CONSTRAINTS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_BASIC_CONSTRAINTS) +#define d2i_CERTIFICATEPOLICIES BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_CERTIFICATEPOLICIES) +#define d2i_CRL_DIST_POINTS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_CRL_DIST_POINTS) +#define d2i_DHparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DHparams) +#define d2i_DHparams_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DHparams_bio) +#define d2i_DIRECTORYSTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DIRECTORYSTRING) +#define d2i_DISPLAYTEXT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DISPLAYTEXT) +#define d2i_DIST_POINT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DIST_POINT) +#define d2i_DIST_POINT_NAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DIST_POINT_NAME) +#define d2i_DSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DSAPrivateKey) +#define d2i_DSAPrivateKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DSAPrivateKey_bio) +#define d2i_DSAPrivateKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DSAPrivateKey_fp) +#define d2i_DSAPublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DSAPublicKey) +#define d2i_DSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DSA_PUBKEY) +#define d2i_DSA_PUBKEY_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DSA_PUBKEY_bio) +#define d2i_DSA_PUBKEY_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DSA_PUBKEY_fp) +#define d2i_DSA_SIG BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DSA_SIG) +#define d2i_DSAparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DSAparams) +#define d2i_ECDSA_SIG BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ECDSA_SIG) +#define d2i_ECParameters BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ECParameters) +#define d2i_ECPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ECPrivateKey) +#define d2i_ECPrivateKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ECPrivateKey_bio) +#define d2i_ECPrivateKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ECPrivateKey_fp) +#define d2i_EC_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_EC_PUBKEY) +#define d2i_EC_PUBKEY_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_EC_PUBKEY_bio) +#define d2i_EC_PUBKEY_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_EC_PUBKEY_fp) +#define d2i_EDIPARTYNAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_EDIPARTYNAME) +#define d2i_EXTENDED_KEY_USAGE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_EXTENDED_KEY_USAGE) +#define d2i_GENERAL_NAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_GENERAL_NAME) +#define d2i_GENERAL_NAMES BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_GENERAL_NAMES) +#define d2i_ISSUING_DIST_POINT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ISSUING_DIST_POINT) +#define d2i_NETSCAPE_SPKAC BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_NETSCAPE_SPKAC) +#define d2i_NETSCAPE_SPKI BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_NETSCAPE_SPKI) +#define d2i_NOTICEREF BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_NOTICEREF) +#define d2i_OTHERNAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_OTHERNAME) +#define d2i_PKCS12 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PKCS12) +#define d2i_PKCS12_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PKCS12_bio) +#define d2i_PKCS12_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PKCS12_fp) +#define d2i_PKCS7 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PKCS7) +#define d2i_PKCS7_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PKCS7_bio) +#define d2i_PKCS8PrivateKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PKCS8PrivateKey_bio) +#define d2i_PKCS8PrivateKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PKCS8PrivateKey_fp) +#define d2i_PKCS8_PRIV_KEY_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PKCS8_PRIV_KEY_INFO) +#define d2i_PKCS8_PRIV_KEY_INFO_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PKCS8_PRIV_KEY_INFO_bio) +#define d2i_PKCS8_PRIV_KEY_INFO_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PKCS8_PRIV_KEY_INFO_fp) +#define d2i_PKCS8_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PKCS8_bio) +#define d2i_PKCS8_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PKCS8_fp) +#define d2i_PKEY_USAGE_PERIOD BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PKEY_USAGE_PERIOD) +#define d2i_POLICYINFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_POLICYINFO) +#define d2i_POLICYQUALINFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_POLICYQUALINFO) +#define d2i_PROXY_CERT_INFO_EXTENSION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PROXY_CERT_INFO_EXTENSION) +#define d2i_PROXY_POLICY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PROXY_POLICY) +#define d2i_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PUBKEY) +#define d2i_PUBKEY_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PUBKEY_bio) +#define d2i_PUBKEY_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PUBKEY_fp) +#define d2i_PrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PrivateKey) +#define d2i_PrivateKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PrivateKey_bio) +#define d2i_PrivateKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PrivateKey_fp) +#define d2i_PublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PublicKey) +#define d2i_RSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_RSAPrivateKey) +#define d2i_RSAPrivateKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_RSAPrivateKey_bio) +#define d2i_RSAPrivateKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_RSAPrivateKey_fp) +#define d2i_RSAPublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_RSAPublicKey) +#define d2i_RSAPublicKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_RSAPublicKey_bio) +#define d2i_RSAPublicKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_RSAPublicKey_fp) +#define d2i_RSA_PSS_PARAMS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_RSA_PSS_PARAMS) +#define d2i_RSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_RSA_PUBKEY) +#define d2i_RSA_PUBKEY_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_RSA_PUBKEY_bio) +#define d2i_RSA_PUBKEY_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_RSA_PUBKEY_fp) +#define d2i_SXNET BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_SXNET) +#define d2i_SXNETID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_SXNETID) +#define d2i_USERNOTICE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_USERNOTICE) +#define d2i_X509 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509) +#define d2i_X509_ALGOR BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_ALGOR) +#define d2i_X509_ALGORS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_ALGORS) +#define d2i_X509_ATTRIBUTE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_ATTRIBUTE) +#define d2i_X509_AUX BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_AUX) +#define d2i_X509_CERT_AUX BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_CERT_AUX) +#define d2i_X509_CINF BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_CINF) +#define d2i_X509_CRL BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_CRL) +#define d2i_X509_CRL_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_CRL_INFO) +#define d2i_X509_CRL_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_CRL_bio) +#define d2i_X509_CRL_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_CRL_fp) +#define d2i_X509_EXTENSION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_EXTENSION) +#define d2i_X509_EXTENSIONS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_EXTENSIONS) +#define d2i_X509_NAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_NAME) +#define d2i_X509_NAME_ENTRY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_NAME_ENTRY) +#define d2i_X509_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_PUBKEY) +#define d2i_X509_REQ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_REQ) +#define d2i_X509_REQ_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_REQ_INFO) +#define d2i_X509_REQ_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_REQ_bio) +#define d2i_X509_REQ_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_REQ_fp) +#define d2i_X509_REVOKED BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_REVOKED) +#define d2i_X509_SIG BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_SIG) +#define d2i_X509_VAL BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_VAL) +#define d2i_X509_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_bio) +#define d2i_X509_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_fp) +#define dsa_asn1_meth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, dsa_asn1_meth) +#define ec_GFp_mont_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_mont_add) +#define ec_GFp_mont_bignum_to_felem BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_mont_bignum_to_felem) +#define ec_GFp_mont_dbl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_mont_dbl) +#define ec_GFp_mont_felem_mul BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_mont_felem_mul) +#define ec_GFp_mont_felem_sqr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_mont_felem_sqr) +#define ec_GFp_mont_felem_to_bignum BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_mont_felem_to_bignum) +#define ec_GFp_mont_group_finish BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_mont_group_finish) +#define ec_GFp_mont_group_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_mont_group_init) +#define ec_GFp_mont_group_set_curve BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_mont_group_set_curve) +#define ec_GFp_mont_mul BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_mont_mul) +#define ec_GFp_mont_mul_base BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_mont_mul_base) +#define ec_GFp_mont_mul_public BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_mont_mul_public) +#define ec_GFp_nistp_recode_scalar_bits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_nistp_recode_scalar_bits) +#define ec_GFp_simple_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_simple_cmp) +#define ec_GFp_simple_cmp_x_coordinate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_simple_cmp_x_coordinate) +#define ec_GFp_simple_group_finish BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_simple_group_finish) +#define ec_GFp_simple_group_get_curve BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_simple_group_get_curve) +#define ec_GFp_simple_group_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_simple_group_init) +#define ec_GFp_simple_group_set_curve BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_simple_group_set_curve) +#define ec_GFp_simple_invert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_simple_invert) +#define ec_GFp_simple_is_at_infinity BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_simple_is_at_infinity) +#define ec_GFp_simple_is_on_curve BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_simple_is_on_curve) +#define ec_GFp_simple_mont_inv_mod_ord_vartime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_simple_mont_inv_mod_ord_vartime) +#define ec_GFp_simple_point_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_simple_point_copy) +#define ec_GFp_simple_point_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_simple_point_init) +#define ec_GFp_simple_point_set_affine_coordinates BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_simple_point_set_affine_coordinates) +#define ec_GFp_simple_point_set_to_infinity BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_simple_point_set_to_infinity) +#define ec_asn1_meth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_asn1_meth) +#define ec_bignum_to_felem BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_bignum_to_felem) +#define ec_bignum_to_scalar BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_bignum_to_scalar) +#define ec_cmp_x_coordinate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_cmp_x_coordinate) +#define ec_compute_wNAF BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_compute_wNAF) +#define ec_felem_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_felem_add) +#define ec_felem_equal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_felem_equal) +#define ec_felem_neg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_felem_neg) +#define ec_felem_non_zero_mask BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_felem_non_zero_mask) +#define ec_felem_select BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_felem_select) +#define ec_felem_sub BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_felem_sub) +#define ec_felem_to_bignum BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_felem_to_bignum) +#define ec_get_x_coordinate_as_scalar BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_get_x_coordinate_as_scalar) +#define ec_group_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_group_new) +#define ec_pkey_meth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_pkey_meth) +#define ec_point_get_affine_coordinate_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_point_get_affine_coordinate_bytes) +#define ec_point_mul_scalar BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_point_mul_scalar) +#define ec_point_mul_scalar_base BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_point_mul_scalar_base) +#define ec_point_mul_scalar_public BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_point_mul_scalar_public) +#define ec_random_nonzero_scalar BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_random_nonzero_scalar) +#define ec_scalar_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_scalar_add) +#define ec_scalar_equal_vartime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_scalar_equal_vartime) +#define ec_scalar_from_montgomery BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_scalar_from_montgomery) +#define ec_scalar_inv_montgomery BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_scalar_inv_montgomery) +#define ec_scalar_inv_montgomery_vartime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_scalar_inv_montgomery_vartime) +#define ec_scalar_is_zero BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_scalar_is_zero) +#define ec_scalar_mul_montgomery BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_scalar_mul_montgomery) +#define ec_scalar_to_montgomery BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_scalar_to_montgomery) +#define ec_simple_scalar_inv_montgomery BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_simple_scalar_inv_montgomery) +#define ecp_nistz256_avx2_select_w7 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ecp_nistz256_avx2_select_w7) +#define ecp_nistz256_mul_mont BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ecp_nistz256_mul_mont) +#define ecp_nistz256_neg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ecp_nistz256_neg) +#define ecp_nistz256_ord_mul_mont BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ecp_nistz256_ord_mul_mont) +#define ecp_nistz256_ord_sqr_mont BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ecp_nistz256_ord_sqr_mont) +#define ecp_nistz256_point_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ecp_nistz256_point_add) +#define ecp_nistz256_point_add_affine BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ecp_nistz256_point_add_affine) +#define ecp_nistz256_point_double BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ecp_nistz256_point_double) +#define ecp_nistz256_select_w5 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ecp_nistz256_select_w5) +#define ecp_nistz256_select_w7 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ecp_nistz256_select_w7) +#define ecp_nistz256_sqr_mont BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ecp_nistz256_sqr_mont) +#define ed25519_asn1_meth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ed25519_asn1_meth) +#define ed25519_pkey_meth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ed25519_pkey_meth) +#define gcm_ghash_4bit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, gcm_ghash_4bit) +#define gcm_ghash_avx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, gcm_ghash_avx) +#define gcm_ghash_clmul BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, gcm_ghash_clmul) +#define gcm_ghash_ssse3 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, gcm_ghash_ssse3) +#define gcm_gmult_4bit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, gcm_gmult_4bit) +#define gcm_gmult_avx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, gcm_gmult_avx) +#define gcm_gmult_clmul BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, gcm_gmult_clmul) +#define gcm_gmult_ssse3 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, gcm_gmult_ssse3) +#define gcm_init_4bit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, gcm_init_4bit) +#define gcm_init_avx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, gcm_init_avx) +#define gcm_init_clmul BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, gcm_init_clmul) +#define gcm_init_ssse3 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, gcm_init_ssse3) +#define i2a_ACCESS_DESCRIPTION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2a_ACCESS_DESCRIPTION) +#define i2a_ASN1_ENUMERATED BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2a_ASN1_ENUMERATED) +#define i2a_ASN1_INTEGER BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2a_ASN1_INTEGER) +#define i2a_ASN1_OBJECT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2a_ASN1_OBJECT) +#define i2a_ASN1_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2a_ASN1_STRING) +#define i2c_ASN1_BIT_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2c_ASN1_BIT_STRING) +#define i2c_ASN1_INTEGER BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2c_ASN1_INTEGER) +#define i2d_ACCESS_DESCRIPTION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ACCESS_DESCRIPTION) +#define i2d_ASN1_BIT_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_BIT_STRING) +#define i2d_ASN1_BMPSTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_BMPSTRING) +#define i2d_ASN1_BOOLEAN BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_BOOLEAN) +#define i2d_ASN1_ENUMERATED BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_ENUMERATED) +#define i2d_ASN1_GENERALIZEDTIME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_GENERALIZEDTIME) +#define i2d_ASN1_GENERALSTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_GENERALSTRING) +#define i2d_ASN1_IA5STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_IA5STRING) +#define i2d_ASN1_INTEGER BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_INTEGER) +#define i2d_ASN1_NULL BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_NULL) +#define i2d_ASN1_OBJECT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_OBJECT) +#define i2d_ASN1_OCTET_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_OCTET_STRING) +#define i2d_ASN1_PRINTABLE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_PRINTABLE) +#define i2d_ASN1_PRINTABLESTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_PRINTABLESTRING) +#define i2d_ASN1_SEQUENCE_ANY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_SEQUENCE_ANY) +#define i2d_ASN1_SET_ANY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_SET_ANY) +#define i2d_ASN1_T61STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_T61STRING) +#define i2d_ASN1_TIME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_TIME) +#define i2d_ASN1_TYPE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_TYPE) +#define i2d_ASN1_UNIVERSALSTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_UNIVERSALSTRING) +#define i2d_ASN1_UTCTIME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_UTCTIME) +#define i2d_ASN1_UTF8STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_UTF8STRING) +#define i2d_ASN1_VISIBLESTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_VISIBLESTRING) +#define i2d_AUTHORITY_INFO_ACCESS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_AUTHORITY_INFO_ACCESS) +#define i2d_AUTHORITY_KEYID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_AUTHORITY_KEYID) +#define i2d_BASIC_CONSTRAINTS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_BASIC_CONSTRAINTS) +#define i2d_CERTIFICATEPOLICIES BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_CERTIFICATEPOLICIES) +#define i2d_CRL_DIST_POINTS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_CRL_DIST_POINTS) +#define i2d_DHparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DHparams) +#define i2d_DHparams_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DHparams_bio) +#define i2d_DIRECTORYSTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DIRECTORYSTRING) +#define i2d_DISPLAYTEXT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DISPLAYTEXT) +#define i2d_DIST_POINT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DIST_POINT) +#define i2d_DIST_POINT_NAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DIST_POINT_NAME) +#define i2d_DSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DSAPrivateKey) +#define i2d_DSAPrivateKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DSAPrivateKey_bio) +#define i2d_DSAPrivateKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DSAPrivateKey_fp) +#define i2d_DSAPublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DSAPublicKey) +#define i2d_DSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DSA_PUBKEY) +#define i2d_DSA_PUBKEY_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DSA_PUBKEY_bio) +#define i2d_DSA_PUBKEY_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DSA_PUBKEY_fp) +#define i2d_DSA_SIG BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DSA_SIG) +#define i2d_DSAparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DSAparams) +#define i2d_ECDSA_SIG BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ECDSA_SIG) +#define i2d_ECParameters BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ECParameters) +#define i2d_ECPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ECPrivateKey) +#define i2d_ECPrivateKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ECPrivateKey_bio) +#define i2d_ECPrivateKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ECPrivateKey_fp) +#define i2d_EC_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_EC_PUBKEY) +#define i2d_EC_PUBKEY_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_EC_PUBKEY_bio) +#define i2d_EC_PUBKEY_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_EC_PUBKEY_fp) +#define i2d_EDIPARTYNAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_EDIPARTYNAME) +#define i2d_EXTENDED_KEY_USAGE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_EXTENDED_KEY_USAGE) +#define i2d_GENERAL_NAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_GENERAL_NAME) +#define i2d_GENERAL_NAMES BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_GENERAL_NAMES) +#define i2d_ISSUING_DIST_POINT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ISSUING_DIST_POINT) +#define i2d_NETSCAPE_SPKAC BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_NETSCAPE_SPKAC) +#define i2d_NETSCAPE_SPKI BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_NETSCAPE_SPKI) +#define i2d_NOTICEREF BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_NOTICEREF) +#define i2d_OTHERNAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_OTHERNAME) +#define i2d_PKCS12 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS12) +#define i2d_PKCS12_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS12_bio) +#define i2d_PKCS12_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS12_fp) +#define i2d_PKCS7 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS7) +#define i2d_PKCS7_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS7_bio) +#define i2d_PKCS8PrivateKeyInfo_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS8PrivateKeyInfo_bio) +#define i2d_PKCS8PrivateKeyInfo_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS8PrivateKeyInfo_fp) +#define i2d_PKCS8PrivateKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS8PrivateKey_bio) +#define i2d_PKCS8PrivateKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS8PrivateKey_fp) +#define i2d_PKCS8PrivateKey_nid_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS8PrivateKey_nid_bio) +#define i2d_PKCS8PrivateKey_nid_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS8PrivateKey_nid_fp) +#define i2d_PKCS8_PRIV_KEY_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS8_PRIV_KEY_INFO) +#define i2d_PKCS8_PRIV_KEY_INFO_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS8_PRIV_KEY_INFO_bio) +#define i2d_PKCS8_PRIV_KEY_INFO_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS8_PRIV_KEY_INFO_fp) +#define i2d_PKCS8_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS8_bio) +#define i2d_PKCS8_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS8_fp) +#define i2d_PKEY_USAGE_PERIOD BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKEY_USAGE_PERIOD) +#define i2d_POLICYINFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_POLICYINFO) +#define i2d_POLICYQUALINFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_POLICYQUALINFO) +#define i2d_PROXY_CERT_INFO_EXTENSION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PROXY_CERT_INFO_EXTENSION) +#define i2d_PROXY_POLICY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PROXY_POLICY) +#define i2d_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PUBKEY) +#define i2d_PUBKEY_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PUBKEY_bio) +#define i2d_PUBKEY_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PUBKEY_fp) +#define i2d_PrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PrivateKey) +#define i2d_PrivateKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PrivateKey_bio) +#define i2d_PrivateKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PrivateKey_fp) +#define i2d_PublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PublicKey) +#define i2d_RSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_RSAPrivateKey) +#define i2d_RSAPrivateKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_RSAPrivateKey_bio) +#define i2d_RSAPrivateKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_RSAPrivateKey_fp) +#define i2d_RSAPublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_RSAPublicKey) +#define i2d_RSAPublicKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_RSAPublicKey_bio) +#define i2d_RSAPublicKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_RSAPublicKey_fp) +#define i2d_RSA_PSS_PARAMS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_RSA_PSS_PARAMS) +#define i2d_RSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_RSA_PUBKEY) +#define i2d_RSA_PUBKEY_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_RSA_PUBKEY_bio) +#define i2d_RSA_PUBKEY_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_RSA_PUBKEY_fp) +#define i2d_SXNET BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_SXNET) +#define i2d_SXNETID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_SXNETID) +#define i2d_USERNOTICE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_USERNOTICE) +#define i2d_X509 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509) +#define i2d_X509_ALGOR BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_ALGOR) +#define i2d_X509_ALGORS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_ALGORS) +#define i2d_X509_ATTRIBUTE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_ATTRIBUTE) +#define i2d_X509_AUX BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_AUX) +#define i2d_X509_CERT_AUX BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_CERT_AUX) +#define i2d_X509_CINF BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_CINF) +#define i2d_X509_CRL BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_CRL) +#define i2d_X509_CRL_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_CRL_INFO) +#define i2d_X509_CRL_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_CRL_bio) +#define i2d_X509_CRL_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_CRL_fp) +#define i2d_X509_EXTENSION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_EXTENSION) +#define i2d_X509_EXTENSIONS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_EXTENSIONS) +#define i2d_X509_NAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_NAME) +#define i2d_X509_NAME_ENTRY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_NAME_ENTRY) +#define i2d_X509_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_PUBKEY) +#define i2d_X509_REQ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_REQ) +#define i2d_X509_REQ_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_REQ_INFO) +#define i2d_X509_REQ_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_REQ_bio) +#define i2d_X509_REQ_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_REQ_fp) +#define i2d_X509_REVOKED BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_REVOKED) +#define i2d_X509_SIG BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_SIG) +#define i2d_X509_VAL BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_VAL) +#define i2d_X509_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_bio) +#define i2d_X509_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_fp) +#define i2d_re_X509_CRL_tbs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_re_X509_CRL_tbs) +#define i2d_re_X509_REQ_tbs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_re_X509_REQ_tbs) +#define i2d_re_X509_tbs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_re_X509_tbs) +#define i2o_ECPublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2o_ECPublicKey) +#define i2s_ASN1_ENUMERATED BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2s_ASN1_ENUMERATED) +#define i2s_ASN1_ENUMERATED_TABLE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2s_ASN1_ENUMERATED_TABLE) +#define i2s_ASN1_INTEGER BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2s_ASN1_INTEGER) +#define i2s_ASN1_OCTET_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2s_ASN1_OCTET_STRING) +#define i2t_ASN1_OBJECT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2t_ASN1_OBJECT) +#define i2v_ASN1_BIT_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2v_ASN1_BIT_STRING) +#define i2v_GENERAL_NAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2v_GENERAL_NAME) +#define i2v_GENERAL_NAMES BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2v_GENERAL_NAMES) +#define kBoringSSLRSASqrtTwo BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, kBoringSSLRSASqrtTwo) +#define kBoringSSLRSASqrtTwoLen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, kBoringSSLRSASqrtTwoLen) +#define kOpenSSLReasonStringData BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, kOpenSSLReasonStringData) +#define kOpenSSLReasonValues BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, kOpenSSLReasonValues) +#define kOpenSSLReasonValuesLen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, kOpenSSLReasonValuesLen) +#define level_add_node BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, level_add_node) +#define level_find_node BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, level_find_node) +#define lh_delete BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, lh_delete) +#define lh_doall_arg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, lh_doall_arg) +#define lh_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, lh_free) +#define lh_insert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, lh_insert) +#define lh_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, lh_new) +#define lh_num_items BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, lh_num_items) +#define lh_retrieve BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, lh_retrieve) +#define lh_retrieve_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, lh_retrieve_key) +#define lh_strhash BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, lh_strhash) +#define md4_block_data_order BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, md4_block_data_order) +#define md5_block_asm_data_order BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, md5_block_asm_data_order) +#define o2i_ECPublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, o2i_ECPublicKey) +#define pkcs12_iterations_acceptable BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, pkcs12_iterations_acceptable) +#define pkcs12_key_gen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, pkcs12_key_gen) +#define pkcs12_pbe_encrypt_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, pkcs12_pbe_encrypt_init) +#define pkcs7_bundle BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, pkcs7_bundle) +#define pkcs7_parse_header BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, pkcs7_parse_header) +#define pkcs8_pbe_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, pkcs8_pbe_decrypt) +#define policy_cache_find_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, policy_cache_find_data) +#define policy_cache_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, policy_cache_free) +#define policy_cache_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, policy_cache_set) +#define policy_cache_set_mapping BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, policy_cache_set_mapping) +#define policy_data_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, policy_data_free) +#define policy_data_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, policy_data_new) +#define policy_node_cmp_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, policy_node_cmp_new) +#define policy_node_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, policy_node_free) +#define policy_node_match BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, policy_node_match) +#define poly_Rq_mul BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, poly_Rq_mul) +#define rand_fork_unsafe_buffering_enabled BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, rand_fork_unsafe_buffering_enabled) +#define rsa_asn1_meth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, rsa_asn1_meth) +#define rsa_default_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, rsa_default_decrypt) +#define rsa_default_private_transform BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, rsa_default_private_transform) +#define rsa_default_sign_raw BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, rsa_default_sign_raw) +#define rsa_default_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, rsa_default_size) +#define rsa_pkey_meth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, rsa_pkey_meth) +#define rsaz_1024_gather5_avx2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, rsaz_1024_gather5_avx2) +#define rsaz_1024_mul_avx2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, rsaz_1024_mul_avx2) +#define rsaz_1024_norm2red_avx2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, rsaz_1024_norm2red_avx2) +#define rsaz_1024_red2norm_avx2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, rsaz_1024_red2norm_avx2) +#define rsaz_1024_scatter5_avx2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, rsaz_1024_scatter5_avx2) +#define rsaz_1024_sqr_avx2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, rsaz_1024_sqr_avx2) +#define s2i_ASN1_INTEGER BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, s2i_ASN1_INTEGER) +#define s2i_ASN1_OCTET_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, s2i_ASN1_OCTET_STRING) +#define sha1_block_data_order BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sha1_block_data_order) +#define sha256_block_data_order BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sha256_block_data_order) +#define sha512_block_data_order BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sha512_block_data_order) +#define sk_deep_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_deep_copy) +#define sk_delete BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_delete) +#define sk_delete_ptr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_delete_ptr) +#define sk_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_dup) +#define sk_find BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_find) +#define sk_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_free) +#define sk_insert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_insert) +#define sk_is_sorted BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_is_sorted) +#define sk_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_new) +#define sk_new_null BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_new_null) +#define sk_num BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_num) +#define sk_pop BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_pop) +#define sk_pop_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_pop_free) +#define sk_pop_free_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_pop_free_ex) +#define sk_push BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_push) +#define sk_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_set) +#define sk_set_cmp_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_set_cmp_func) +#define sk_shift BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_shift) +#define sk_sort BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_sort) +#define sk_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_value) +#define sk_zero BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_zero) +#define tree_find_sk BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, tree_find_sk) +#define v2i_ASN1_BIT_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v2i_ASN1_BIT_STRING) +#define v2i_GENERAL_NAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v2i_GENERAL_NAME) +#define v2i_GENERAL_NAMES BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v2i_GENERAL_NAMES) +#define v2i_GENERAL_NAME_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v2i_GENERAL_NAME_ex) +#define v3_akey_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_akey_id) +#define v3_alt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_alt) +#define v3_bcons BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_bcons) +#define v3_cpols BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_cpols) +#define v3_crl_invdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_crl_invdate) +#define v3_crl_num BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_crl_num) +#define v3_crl_reason BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_crl_reason) +#define v3_crld BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_crld) +#define v3_delta_crl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_delta_crl) +#define v3_ext_ku BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_ext_ku) +#define v3_freshest_crl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_freshest_crl) +#define v3_idp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_idp) +#define v3_info BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_info) +#define v3_inhibit_anyp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_inhibit_anyp) +#define v3_key_usage BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_key_usage) +#define v3_name_constraints BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_name_constraints) +#define v3_ns_ia5_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_ns_ia5_list) +#define v3_nscert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_nscert) +#define v3_ocsp_accresp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_ocsp_accresp) +#define v3_ocsp_nocheck BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_ocsp_nocheck) +#define v3_pci BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_pci) +#define v3_pkey_usage_period BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_pkey_usage_period) +#define v3_policy_constraints BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_policy_constraints) +#define v3_policy_mappings BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_policy_mappings) +#define v3_sinfo BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_sinfo) +#define v3_skey_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_skey_id) +#define v3_sxnet BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_sxnet) +#define vpaes_cbc_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, vpaes_cbc_encrypt) +#define vpaes_ctr32_encrypt_blocks BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, vpaes_ctr32_encrypt_blocks) +#define vpaes_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, vpaes_decrypt) +#define vpaes_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, vpaes_encrypt) +#define vpaes_set_decrypt_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, vpaes_set_decrypt_key) +#define vpaes_set_encrypt_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, vpaes_set_encrypt_key) +#define x25519_asn1_meth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x25519_asn1_meth) +#define x25519_ge_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x25519_ge_add) +#define x25519_ge_frombytes_vartime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x25519_ge_frombytes_vartime) +#define x25519_ge_p1p1_to_p2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x25519_ge_p1p1_to_p2) +#define x25519_ge_p1p1_to_p3 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x25519_ge_p1p1_to_p3) +#define x25519_ge_p3_to_cached BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x25519_ge_p3_to_cached) +#define x25519_ge_scalarmult BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x25519_ge_scalarmult) +#define x25519_ge_scalarmult_base BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x25519_ge_scalarmult_base) +#define x25519_ge_scalarmult_small_precomp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x25519_ge_scalarmult_small_precomp) +#define x25519_ge_sub BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x25519_ge_sub) +#define x25519_ge_tobytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x25519_ge_tobytes) +#define x25519_pkey_meth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x25519_pkey_meth) +#define x25519_sc_reduce BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x25519_sc_reduce) +#define x509_digest_sign_algorithm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x509_digest_sign_algorithm) +#define x509_digest_verify_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x509_digest_verify_init) +#define x509_print_rsa_pss_params BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x509_print_rsa_pss_params) +#define x509_rsa_ctx_to_pss BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x509_rsa_ctx_to_pss) +#define x509_rsa_pss_to_ctx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x509_rsa_pss_to_ctx) +#define x509v3_bytes_to_hex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x509v3_bytes_to_hex) +#define x509v3_hex_to_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x509v3_hex_to_bytes) +#define x509v3_looks_like_dns_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x509v3_looks_like_dns_name) +#define x509v3_name_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x509v3_name_cmp) From 22bf0399d2d41c0bbc60255f9f61a1c1f73dfa77 Mon Sep 17 00:00:00 2001 From: Muxi Yan Date: Wed, 13 Nov 2019 14:53:11 -0800 Subject: [PATCH 010/758] Update podspec for boringssl prefixing --- templates/gRPC-Core.podspec.template | 2 +- .../BoringSSL-GRPC.podspec.template | 27 +++++-------------- 2 files changed, 8 insertions(+), 21 deletions(-) diff --git a/templates/gRPC-Core.podspec.template b/templates/gRPC-Core.podspec.template index 9bebbdf4097..bad6e190c36 100644 --- a/templates/gRPC-Core.podspec.template +++ b/templates/gRPC-Core.podspec.template @@ -175,7 +175,7 @@ ss.libraries = 'z' ss.dependency "#{s.name}/Interface", version ss.dependency 'BoringSSL-GRPC', '0.0.5' - ss.compiler_flags = '-DGRPC_SHADOW_BORINGSSL_SYMBOLS' + ss.compiler_flags = '-DBORINGSSL_PREFIX=GRPC' ss.source_files = ${ruby_multiline_list(grpc_private_files(libs), 22)} diff --git a/templates/src/objective-c/BoringSSL-GRPC.podspec.template b/templates/src/objective-c/BoringSSL-GRPC.podspec.template index 94c07657d4d..39b52eed146 100644 --- a/templates/src/objective-c/BoringSSL-GRPC.podspec.template +++ b/templates/src/objective-c/BoringSSL-GRPC.podspec.template @@ -1,8 +1,6 @@ %YAML 1.2 --- | <%! - def expand_symbol_list(symbol_list): - return ',\n '.join("'#define %s GRPC_SHADOW_%s'" % (symbol, symbol) for symbol in symbol_list) import subprocess boringssl_commit = subprocess.check_output(['git', 'rev-parse', 'HEAD'], cwd='third_party/boringssl').decode().strip() %> @@ -119,7 +117,7 @@ # We don't need to inhibit all warnings; only -Wno-shorten-64-to-32. But Cocoapods' linter doesn't # want that for some reason. - s.compiler_flags = '-DOPENSSL_NO_ASM', '-GCC_WARN_INHIBIT_ALL_WARNINGS', '-w' + s.compiler_flags = '-DOPENSSL_NO_ASM', '-GCC_WARN_INHIBIT_ALL_WARNINGS', '-w', '-DBORINGSSL_PREFIX=GRPC' s.requires_arc = false # Like many other C libraries, BoringSSL has its public headers under `include//` and its @@ -225,25 +223,14 @@ % endfor EOF - # The symbol prefixing mechanism is performed by redefining BoringSSL symbols with "#define - # SOME_BORINGSSL_SYMBOL GRPC_SHADOW_SOME_BORINGSSL_SYMBOL". Unfortunately, some symbols are - # already redefined as macros in BoringSSL headers in the form "#define SOME_BORINGSSL_SYMBOL - # SOME_BORINGSSL_SYMBOL" Such type of redefinition will cause "SOME_BORINGSSL_SYMBOL redefined" - # error when using together with our prefix header. So the workaround in the below lines removes - # all such type of #define directives. - sed -i'.back' '/^#define \\([A-Za-z0-9_]*\\) \\1/d' include/openssl/*.h - # Remove lines of the format below for the same reason above - # #define SOME_BORINGSSL_SYMBOL ${"\\"} - # SOME_BORINGSSL_SYMBOL - sed -i'.back' '/^#define.*\\\\$/{N;/^#define \\([A-Za-z0-9_]*\\) *\\\\\\n *\\1/d;}' include/openssl/*.h + # Grab prefix header from GCS + curl -o include/openssl/boringssl_prefix_symbols.h https://storage.googleapis.com/grpc_boringssl_prefix_headers/boringssl_prefix_symbols-${boringssl_commit}.h # We are renaming openssl to openssl_grpc so that there is no conflict with openssl if it exists find . -type f \\( -path '*.h' -or -path '*.cc' -or -path '*.c' \\) -print0 | xargs -0 -L1 sed -E -i'.grpc_back' 's;#include ;#include ;g' + END_OF_COMMAND end From 0b0627c6819c2a852810f5f136baa35b01cfd7a8 Mon Sep 17 00:00:00 2001 From: Muxi Yan Date: Wed, 13 Nov 2019 14:55:05 -0800 Subject: [PATCH 011/758] generate projects --- gRPC-Core.podspec | 2 +- src/objective-c/BoringSSL-GRPC.podspec | 3287 +----------------------- 2 files changed, 8 insertions(+), 3281 deletions(-) diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec index 04e30e692cd..56424513c2b 100644 --- a/gRPC-Core.podspec +++ b/gRPC-Core.podspec @@ -186,7 +186,7 @@ Pod::Spec.new do |s| ss.libraries = 'z' ss.dependency "#{s.name}/Interface", version ss.dependency 'BoringSSL-GRPC', '0.0.5' - ss.compiler_flags = '-DGRPC_SHADOW_BORINGSSL_SYMBOLS' + ss.compiler_flags = '-DBORINGSSL_PREFIX=GRPC' ss.source_files = 'src/core/ext/filters/census/grpc_context.cc', 'src/core/ext/filters/client_channel/backend_metric.cc', diff --git a/src/objective-c/BoringSSL-GRPC.podspec b/src/objective-c/BoringSSL-GRPC.podspec index 6b53dc892d8..e476c2836dc 100644 --- a/src/objective-c/BoringSSL-GRPC.podspec +++ b/src/objective-c/BoringSSL-GRPC.podspec @@ -112,7 +112,7 @@ Pod::Spec.new do |s| # We don't need to inhibit all warnings; only -Wno-shorten-64-to-32. But Cocoapods' linter doesn't # want that for some reason. - s.compiler_flags = '-DOPENSSL_NO_ASM', '-GCC_WARN_INHIBIT_ALL_WARNINGS', '-w' + s.compiler_flags = '-DOPENSSL_NO_ASM', '-GCC_WARN_INHIBIT_ALL_WARNINGS', '-w', '-DBORINGSSL_PREFIX=GRPC' s.requires_arc = false # Like many other C libraries, BoringSSL has its public headers under `include//` and its @@ -1622,3287 +1622,14 @@ Pod::Spec.new do |s| EOF - # The symbol prefixing mechanism is performed by redefining BoringSSL symbols with "#define - # SOME_BORINGSSL_SYMBOL GRPC_SHADOW_SOME_BORINGSSL_SYMBOL". Unfortunately, some symbols are - # already redefined as macros in BoringSSL headers in the form "#define SOME_BORINGSSL_SYMBOL - # SOME_BORINGSSL_SYMBOL" Such type of redefinition will cause "SOME_BORINGSSL_SYMBOL redefined" - # error when using together with our prefix header. So the workaround in the below lines removes - # all such type of #define directives. - sed -i'.back' '/^#define \\([A-Za-z0-9_]*\\) \\1/d' include/openssl/*.h - # Remove lines of the format below for the same reason above - # #define SOME_BORINGSSL_SYMBOL \ - # SOME_BORINGSSL_SYMBOL - sed -i'.back' '/^#define.*\\\\$/{N;/^#define \\([A-Za-z0-9_]*\\) *\\\\\\n *\\1/d;}' include/openssl/*.h + # Grab prefix header from GCS + curl -o include/openssl/boringssl_prefix_symbols.h https://storage.googleapis.com/grpc_boringssl_prefix_headers/boringssl_prefix_symbols-7f02881e96e51f1873afcf384d02f782b48967ca.h # We are renaming openssl to openssl_grpc so that there is no conflict with openssl if it exists find . -type f \\( -path '*.h' -or -path '*.cc' -or -path '*.c' \\) -print0 | xargs -0 -L1 sed -E -i'.grpc_back' 's;#include ;#include ;g' + END_OF_COMMAND end From 771dd2454886356234ae449040f4324023414715 Mon Sep 17 00:00:00 2001 From: Muxi Yan Date: Wed, 13 Nov 2019 15:02:57 -0800 Subject: [PATCH 012/758] Remove gRPC's custom prefix headers --- .../lib/security/credentials/jwt/json_token.h | 2 - .../security/credentials/jwt/jwt_verifier.cc | 2 - src/core/tsi/alts/crypt/aes_gcm.cc | 2 - src/core/tsi/grpc_shadow_boringssl.h | 3297 ----------------- src/core/tsi/ssl/session_cache/ssl_session.h | 2 - .../tsi/ssl/session_cache/ssl_session_cache.h | 2 - src/core/tsi/ssl_transport_security.cc | 2 - src/core/tsi/ssl_types.h | 2 - .../grpc_shadow_boringssl_symbol_list | 3265 ---------------- .../core/tsi/grpc_shadow_boringssl.h.template | 40 - .../BoringSSL-GRPC.podspec.template-e | 249 ++ .../buildgen/plugins/grpc_shadow_boringssl.py | 32 - 12 files changed, 249 insertions(+), 6648 deletions(-) delete mode 100644 src/core/tsi/grpc_shadow_boringssl.h delete mode 100644 src/objective-c/grpc_shadow_boringssl_symbol_list delete mode 100644 templates/src/core/tsi/grpc_shadow_boringssl.h.template create mode 100644 templates/src/objective-c/BoringSSL-GRPC.podspec.template-e delete mode 100644 tools/buildgen/plugins/grpc_shadow_boringssl.py diff --git a/src/core/lib/security/credentials/jwt/json_token.h b/src/core/lib/security/credentials/jwt/json_token.h index 20390f3096a..02d997d0af0 100644 --- a/src/core/lib/security/credentials/jwt/json_token.h +++ b/src/core/lib/security/credentials/jwt/json_token.h @@ -21,8 +21,6 @@ #include -#include "src/core/tsi/grpc_shadow_boringssl.h" - #include #include diff --git a/src/core/lib/security/credentials/jwt/jwt_verifier.cc b/src/core/lib/security/credentials/jwt/jwt_verifier.cc index 9f3c24c8458..aca615c2987 100644 --- a/src/core/lib/security/credentials/jwt/jwt_verifier.cc +++ b/src/core/lib/security/credentials/jwt/jwt_verifier.cc @@ -18,8 +18,6 @@ #include -#include "src/core/tsi/grpc_shadow_boringssl.h" - #include "src/core/lib/security/credentials/jwt/jwt_verifier.h" #include diff --git a/src/core/tsi/alts/crypt/aes_gcm.cc b/src/core/tsi/alts/crypt/aes_gcm.cc index c638ce76eed..02b1ac4492f 100644 --- a/src/core/tsi/alts/crypt/aes_gcm.cc +++ b/src/core/tsi/alts/crypt/aes_gcm.cc @@ -18,8 +18,6 @@ #include -#include "src/core/tsi/grpc_shadow_boringssl.h" - #include "src/core/tsi/alts/crypt/gsec.h" #include diff --git a/src/core/tsi/grpc_shadow_boringssl.h b/src/core/tsi/grpc_shadow_boringssl.h deleted file mode 100644 index d1ec79e1bc6..00000000000 --- a/src/core/tsi/grpc_shadow_boringssl.h +++ /dev/null @@ -1,3297 +0,0 @@ - -/* - * - * Copyright 2018 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -// This file is autogenerated from a template file. Please make -// modifications to -// `templates/src/objective-c/tsi/grpc_shadow_boringssl.h.template` -// instead. This file can be regenerated from the template by running -// `tools/buildgen/generate_projects.sh`. - -#ifndef GRPC_CORE_TSI_GRPC_SHADOW_BORINGSSL_H -#define GRPC_CORE_TSI_GRPC_SHADOW_BORINGSSL_H - -#ifdef GRPC_SHADOW_BORINGSSL_SYMBOLS - -#define ACCESS_DESCRIPTION_free GRPC_SHADOW_ACCESS_DESCRIPTION_free -#define ACCESS_DESCRIPTION_it GRPC_SHADOW_ACCESS_DESCRIPTION_it -#define ACCESS_DESCRIPTION_new GRPC_SHADOW_ACCESS_DESCRIPTION_new -#define AES_CMAC GRPC_SHADOW_AES_CMAC -#define AES_cbc_encrypt GRPC_SHADOW_AES_cbc_encrypt -#define AES_cfb128_encrypt GRPC_SHADOW_AES_cfb128_encrypt -#define AES_ctr128_encrypt GRPC_SHADOW_AES_ctr128_encrypt -#define AES_decrypt GRPC_SHADOW_AES_decrypt -#define AES_ecb_encrypt GRPC_SHADOW_AES_ecb_encrypt -#define AES_encrypt GRPC_SHADOW_AES_encrypt -#define AES_ofb128_encrypt GRPC_SHADOW_AES_ofb128_encrypt -#define AES_set_decrypt_key GRPC_SHADOW_AES_set_decrypt_key -#define AES_set_encrypt_key GRPC_SHADOW_AES_set_encrypt_key -#define AES_unwrap_key GRPC_SHADOW_AES_unwrap_key -#define AES_unwrap_key_padded GRPC_SHADOW_AES_unwrap_key_padded -#define AES_wrap_key GRPC_SHADOW_AES_wrap_key -#define AES_wrap_key_padded GRPC_SHADOW_AES_wrap_key_padded -#define ASN1_ANY_it GRPC_SHADOW_ASN1_ANY_it -#define ASN1_BIT_STRING_check GRPC_SHADOW_ASN1_BIT_STRING_check -#define ASN1_BIT_STRING_free GRPC_SHADOW_ASN1_BIT_STRING_free -#define ASN1_BIT_STRING_get_bit GRPC_SHADOW_ASN1_BIT_STRING_get_bit -#define ASN1_BIT_STRING_it GRPC_SHADOW_ASN1_BIT_STRING_it -#define ASN1_BIT_STRING_new GRPC_SHADOW_ASN1_BIT_STRING_new -#define ASN1_BIT_STRING_set GRPC_SHADOW_ASN1_BIT_STRING_set -#define ASN1_BIT_STRING_set_bit GRPC_SHADOW_ASN1_BIT_STRING_set_bit -#define ASN1_BMPSTRING_free GRPC_SHADOW_ASN1_BMPSTRING_free -#define ASN1_BMPSTRING_it GRPC_SHADOW_ASN1_BMPSTRING_it -#define ASN1_BMPSTRING_new GRPC_SHADOW_ASN1_BMPSTRING_new -#define ASN1_BOOLEAN_it GRPC_SHADOW_ASN1_BOOLEAN_it -#define ASN1_ENUMERATED_free GRPC_SHADOW_ASN1_ENUMERATED_free -#define ASN1_ENUMERATED_get GRPC_SHADOW_ASN1_ENUMERATED_get -#define ASN1_ENUMERATED_it GRPC_SHADOW_ASN1_ENUMERATED_it -#define ASN1_ENUMERATED_new GRPC_SHADOW_ASN1_ENUMERATED_new -#define ASN1_ENUMERATED_set GRPC_SHADOW_ASN1_ENUMERATED_set -#define ASN1_ENUMERATED_to_BN GRPC_SHADOW_ASN1_ENUMERATED_to_BN -#define ASN1_FBOOLEAN_it GRPC_SHADOW_ASN1_FBOOLEAN_it -#define ASN1_GENERALIZEDTIME_adj GRPC_SHADOW_ASN1_GENERALIZEDTIME_adj -#define ASN1_GENERALIZEDTIME_check GRPC_SHADOW_ASN1_GENERALIZEDTIME_check -#define ASN1_GENERALIZEDTIME_free GRPC_SHADOW_ASN1_GENERALIZEDTIME_free -#define ASN1_GENERALIZEDTIME_it GRPC_SHADOW_ASN1_GENERALIZEDTIME_it -#define ASN1_GENERALIZEDTIME_new GRPC_SHADOW_ASN1_GENERALIZEDTIME_new -#define ASN1_GENERALIZEDTIME_print GRPC_SHADOW_ASN1_GENERALIZEDTIME_print -#define ASN1_GENERALIZEDTIME_set GRPC_SHADOW_ASN1_GENERALIZEDTIME_set -#define ASN1_GENERALIZEDTIME_set_string GRPC_SHADOW_ASN1_GENERALIZEDTIME_set_string -#define ASN1_GENERALSTRING_free GRPC_SHADOW_ASN1_GENERALSTRING_free -#define ASN1_GENERALSTRING_it GRPC_SHADOW_ASN1_GENERALSTRING_it -#define ASN1_GENERALSTRING_new GRPC_SHADOW_ASN1_GENERALSTRING_new -#define ASN1_IA5STRING_free GRPC_SHADOW_ASN1_IA5STRING_free -#define ASN1_IA5STRING_it GRPC_SHADOW_ASN1_IA5STRING_it -#define ASN1_IA5STRING_new GRPC_SHADOW_ASN1_IA5STRING_new -#define ASN1_INTEGER_cmp GRPC_SHADOW_ASN1_INTEGER_cmp -#define ASN1_INTEGER_dup GRPC_SHADOW_ASN1_INTEGER_dup -#define ASN1_INTEGER_free GRPC_SHADOW_ASN1_INTEGER_free -#define ASN1_INTEGER_get GRPC_SHADOW_ASN1_INTEGER_get -#define ASN1_INTEGER_it GRPC_SHADOW_ASN1_INTEGER_it -#define ASN1_INTEGER_new GRPC_SHADOW_ASN1_INTEGER_new -#define ASN1_INTEGER_set GRPC_SHADOW_ASN1_INTEGER_set -#define ASN1_INTEGER_set_uint64 GRPC_SHADOW_ASN1_INTEGER_set_uint64 -#define ASN1_INTEGER_to_BN GRPC_SHADOW_ASN1_INTEGER_to_BN -#define ASN1_NULL_free GRPC_SHADOW_ASN1_NULL_free -#define ASN1_NULL_it GRPC_SHADOW_ASN1_NULL_it -#define ASN1_NULL_new GRPC_SHADOW_ASN1_NULL_new -#define ASN1_OBJECT_create GRPC_SHADOW_ASN1_OBJECT_create -#define ASN1_OBJECT_free GRPC_SHADOW_ASN1_OBJECT_free -#define ASN1_OBJECT_it GRPC_SHADOW_ASN1_OBJECT_it -#define ASN1_OBJECT_new GRPC_SHADOW_ASN1_OBJECT_new -#define ASN1_OCTET_STRING_NDEF_it GRPC_SHADOW_ASN1_OCTET_STRING_NDEF_it -#define ASN1_OCTET_STRING_cmp GRPC_SHADOW_ASN1_OCTET_STRING_cmp -#define ASN1_OCTET_STRING_dup GRPC_SHADOW_ASN1_OCTET_STRING_dup -#define ASN1_OCTET_STRING_free GRPC_SHADOW_ASN1_OCTET_STRING_free -#define ASN1_OCTET_STRING_it GRPC_SHADOW_ASN1_OCTET_STRING_it -#define ASN1_OCTET_STRING_new GRPC_SHADOW_ASN1_OCTET_STRING_new -#define ASN1_OCTET_STRING_set GRPC_SHADOW_ASN1_OCTET_STRING_set -#define ASN1_PRINTABLESTRING_free GRPC_SHADOW_ASN1_PRINTABLESTRING_free -#define ASN1_PRINTABLESTRING_it GRPC_SHADOW_ASN1_PRINTABLESTRING_it -#define ASN1_PRINTABLESTRING_new GRPC_SHADOW_ASN1_PRINTABLESTRING_new -#define ASN1_PRINTABLE_free GRPC_SHADOW_ASN1_PRINTABLE_free -#define ASN1_PRINTABLE_it GRPC_SHADOW_ASN1_PRINTABLE_it -#define ASN1_PRINTABLE_new GRPC_SHADOW_ASN1_PRINTABLE_new -#define ASN1_PRINTABLE_type GRPC_SHADOW_ASN1_PRINTABLE_type -#define ASN1_SEQUENCE_ANY_it GRPC_SHADOW_ASN1_SEQUENCE_ANY_it -#define ASN1_SEQUENCE_it GRPC_SHADOW_ASN1_SEQUENCE_it -#define ASN1_SET_ANY_it GRPC_SHADOW_ASN1_SET_ANY_it -#define ASN1_STRING_TABLE_add GRPC_SHADOW_ASN1_STRING_TABLE_add -#define ASN1_STRING_TABLE_cleanup GRPC_SHADOW_ASN1_STRING_TABLE_cleanup -#define ASN1_STRING_TABLE_get GRPC_SHADOW_ASN1_STRING_TABLE_get -#define ASN1_STRING_cmp GRPC_SHADOW_ASN1_STRING_cmp -#define ASN1_STRING_copy GRPC_SHADOW_ASN1_STRING_copy -#define ASN1_STRING_data GRPC_SHADOW_ASN1_STRING_data -#define ASN1_STRING_dup GRPC_SHADOW_ASN1_STRING_dup -#define ASN1_STRING_free GRPC_SHADOW_ASN1_STRING_free -#define ASN1_STRING_get0_data GRPC_SHADOW_ASN1_STRING_get0_data -#define ASN1_STRING_get_default_mask GRPC_SHADOW_ASN1_STRING_get_default_mask -#define ASN1_STRING_length GRPC_SHADOW_ASN1_STRING_length -#define ASN1_STRING_length_set GRPC_SHADOW_ASN1_STRING_length_set -#define ASN1_STRING_new GRPC_SHADOW_ASN1_STRING_new -#define ASN1_STRING_print GRPC_SHADOW_ASN1_STRING_print -#define ASN1_STRING_print_ex GRPC_SHADOW_ASN1_STRING_print_ex -#define ASN1_STRING_print_ex_fp GRPC_SHADOW_ASN1_STRING_print_ex_fp -#define ASN1_STRING_set GRPC_SHADOW_ASN1_STRING_set -#define ASN1_STRING_set0 GRPC_SHADOW_ASN1_STRING_set0 -#define ASN1_STRING_set_by_NID GRPC_SHADOW_ASN1_STRING_set_by_NID -#define ASN1_STRING_set_default_mask GRPC_SHADOW_ASN1_STRING_set_default_mask -#define ASN1_STRING_set_default_mask_asc GRPC_SHADOW_ASN1_STRING_set_default_mask_asc -#define ASN1_STRING_to_UTF8 GRPC_SHADOW_ASN1_STRING_to_UTF8 -#define ASN1_STRING_type GRPC_SHADOW_ASN1_STRING_type -#define ASN1_STRING_type_new GRPC_SHADOW_ASN1_STRING_type_new -#define ASN1_T61STRING_free GRPC_SHADOW_ASN1_T61STRING_free -#define ASN1_T61STRING_it GRPC_SHADOW_ASN1_T61STRING_it -#define ASN1_T61STRING_new GRPC_SHADOW_ASN1_T61STRING_new -#define ASN1_TBOOLEAN_it GRPC_SHADOW_ASN1_TBOOLEAN_it -#define ASN1_TIME_adj GRPC_SHADOW_ASN1_TIME_adj -#define ASN1_TIME_check GRPC_SHADOW_ASN1_TIME_check -#define ASN1_TIME_diff GRPC_SHADOW_ASN1_TIME_diff -#define ASN1_TIME_free GRPC_SHADOW_ASN1_TIME_free -#define ASN1_TIME_it GRPC_SHADOW_ASN1_TIME_it -#define ASN1_TIME_new GRPC_SHADOW_ASN1_TIME_new -#define ASN1_TIME_print GRPC_SHADOW_ASN1_TIME_print -#define ASN1_TIME_set GRPC_SHADOW_ASN1_TIME_set -#define ASN1_TIME_set_string GRPC_SHADOW_ASN1_TIME_set_string -#define ASN1_TIME_to_generalizedtime GRPC_SHADOW_ASN1_TIME_to_generalizedtime -#define ASN1_TYPE_cmp GRPC_SHADOW_ASN1_TYPE_cmp -#define ASN1_TYPE_free GRPC_SHADOW_ASN1_TYPE_free -#define ASN1_TYPE_get GRPC_SHADOW_ASN1_TYPE_get -#define ASN1_TYPE_new GRPC_SHADOW_ASN1_TYPE_new -#define ASN1_TYPE_set GRPC_SHADOW_ASN1_TYPE_set -#define ASN1_TYPE_set1 GRPC_SHADOW_ASN1_TYPE_set1 -#define ASN1_UNIVERSALSTRING_free GRPC_SHADOW_ASN1_UNIVERSALSTRING_free -#define ASN1_UNIVERSALSTRING_it GRPC_SHADOW_ASN1_UNIVERSALSTRING_it -#define ASN1_UNIVERSALSTRING_new GRPC_SHADOW_ASN1_UNIVERSALSTRING_new -#define ASN1_UTCTIME_adj GRPC_SHADOW_ASN1_UTCTIME_adj -#define ASN1_UTCTIME_check GRPC_SHADOW_ASN1_UTCTIME_check -#define ASN1_UTCTIME_cmp_time_t GRPC_SHADOW_ASN1_UTCTIME_cmp_time_t -#define ASN1_UTCTIME_free GRPC_SHADOW_ASN1_UTCTIME_free -#define ASN1_UTCTIME_it GRPC_SHADOW_ASN1_UTCTIME_it -#define ASN1_UTCTIME_new GRPC_SHADOW_ASN1_UTCTIME_new -#define ASN1_UTCTIME_print GRPC_SHADOW_ASN1_UTCTIME_print -#define ASN1_UTCTIME_set GRPC_SHADOW_ASN1_UTCTIME_set -#define ASN1_UTCTIME_set_string GRPC_SHADOW_ASN1_UTCTIME_set_string -#define ASN1_UTF8STRING_free GRPC_SHADOW_ASN1_UTF8STRING_free -#define ASN1_UTF8STRING_it GRPC_SHADOW_ASN1_UTF8STRING_it -#define ASN1_UTF8STRING_new GRPC_SHADOW_ASN1_UTF8STRING_new -#define ASN1_VISIBLESTRING_free GRPC_SHADOW_ASN1_VISIBLESTRING_free -#define ASN1_VISIBLESTRING_it GRPC_SHADOW_ASN1_VISIBLESTRING_it -#define ASN1_VISIBLESTRING_new GRPC_SHADOW_ASN1_VISIBLESTRING_new -#define ASN1_digest GRPC_SHADOW_ASN1_digest -#define ASN1_generate_nconf GRPC_SHADOW_ASN1_generate_nconf -#define ASN1_generate_v3 GRPC_SHADOW_ASN1_generate_v3 -#define ASN1_get_object GRPC_SHADOW_ASN1_get_object -#define ASN1_item_d2i GRPC_SHADOW_ASN1_item_d2i -#define ASN1_item_d2i_bio GRPC_SHADOW_ASN1_item_d2i_bio -#define ASN1_item_d2i_fp GRPC_SHADOW_ASN1_item_d2i_fp -#define ASN1_item_digest GRPC_SHADOW_ASN1_item_digest -#define ASN1_item_dup GRPC_SHADOW_ASN1_item_dup -#define ASN1_item_ex_d2i GRPC_SHADOW_ASN1_item_ex_d2i -#define ASN1_item_ex_free GRPC_SHADOW_ASN1_item_ex_free -#define ASN1_item_ex_i2d GRPC_SHADOW_ASN1_item_ex_i2d -#define ASN1_item_ex_new GRPC_SHADOW_ASN1_item_ex_new -#define ASN1_item_free GRPC_SHADOW_ASN1_item_free -#define ASN1_item_i2d GRPC_SHADOW_ASN1_item_i2d -#define ASN1_item_i2d_bio GRPC_SHADOW_ASN1_item_i2d_bio -#define ASN1_item_i2d_fp GRPC_SHADOW_ASN1_item_i2d_fp -#define ASN1_item_ndef_i2d GRPC_SHADOW_ASN1_item_ndef_i2d -#define ASN1_item_new GRPC_SHADOW_ASN1_item_new -#define ASN1_item_pack GRPC_SHADOW_ASN1_item_pack -#define ASN1_item_sign GRPC_SHADOW_ASN1_item_sign -#define ASN1_item_sign_ctx GRPC_SHADOW_ASN1_item_sign_ctx -#define ASN1_item_unpack GRPC_SHADOW_ASN1_item_unpack -#define ASN1_item_verify GRPC_SHADOW_ASN1_item_verify -#define ASN1_mbstring_copy GRPC_SHADOW_ASN1_mbstring_copy -#define ASN1_mbstring_ncopy GRPC_SHADOW_ASN1_mbstring_ncopy -#define ASN1_object_size GRPC_SHADOW_ASN1_object_size -#define ASN1_primitive_free GRPC_SHADOW_ASN1_primitive_free -#define ASN1_primitive_new GRPC_SHADOW_ASN1_primitive_new -#define ASN1_put_eoc GRPC_SHADOW_ASN1_put_eoc -#define ASN1_put_object GRPC_SHADOW_ASN1_put_object -#define ASN1_tag2bit GRPC_SHADOW_ASN1_tag2bit -#define ASN1_tag2str GRPC_SHADOW_ASN1_tag2str -#define ASN1_template_free GRPC_SHADOW_ASN1_template_free -#define ASN1_template_new GRPC_SHADOW_ASN1_template_new -#define AUTHORITY_INFO_ACCESS_free GRPC_SHADOW_AUTHORITY_INFO_ACCESS_free -#define AUTHORITY_INFO_ACCESS_it GRPC_SHADOW_AUTHORITY_INFO_ACCESS_it -#define AUTHORITY_INFO_ACCESS_new GRPC_SHADOW_AUTHORITY_INFO_ACCESS_new -#define AUTHORITY_KEYID_free GRPC_SHADOW_AUTHORITY_KEYID_free -#define AUTHORITY_KEYID_it GRPC_SHADOW_AUTHORITY_KEYID_it -#define AUTHORITY_KEYID_new GRPC_SHADOW_AUTHORITY_KEYID_new -#define BASIC_CONSTRAINTS_free GRPC_SHADOW_BASIC_CONSTRAINTS_free -#define BASIC_CONSTRAINTS_it GRPC_SHADOW_BASIC_CONSTRAINTS_it -#define BASIC_CONSTRAINTS_new GRPC_SHADOW_BASIC_CONSTRAINTS_new -#define BIO_append_filename GRPC_SHADOW_BIO_append_filename -#define BIO_callback_ctrl GRPC_SHADOW_BIO_callback_ctrl -#define BIO_clear_flags GRPC_SHADOW_BIO_clear_flags -#define BIO_clear_retry_flags GRPC_SHADOW_BIO_clear_retry_flags -#define BIO_copy_next_retry GRPC_SHADOW_BIO_copy_next_retry -#define BIO_ctrl GRPC_SHADOW_BIO_ctrl -#define BIO_ctrl_get_read_request GRPC_SHADOW_BIO_ctrl_get_read_request -#define BIO_ctrl_get_write_guarantee GRPC_SHADOW_BIO_ctrl_get_write_guarantee -#define BIO_ctrl_pending GRPC_SHADOW_BIO_ctrl_pending -#define BIO_do_connect GRPC_SHADOW_BIO_do_connect -#define BIO_eof GRPC_SHADOW_BIO_eof -#define BIO_f_ssl GRPC_SHADOW_BIO_f_ssl -#define BIO_find_type GRPC_SHADOW_BIO_find_type -#define BIO_flush GRPC_SHADOW_BIO_flush -#define BIO_free GRPC_SHADOW_BIO_free -#define BIO_free_all GRPC_SHADOW_BIO_free_all -#define BIO_get_data GRPC_SHADOW_BIO_get_data -#define BIO_get_fd GRPC_SHADOW_BIO_get_fd -#define BIO_get_fp GRPC_SHADOW_BIO_get_fp -#define BIO_get_init GRPC_SHADOW_BIO_get_init -#define BIO_get_mem_data GRPC_SHADOW_BIO_get_mem_data -#define BIO_get_mem_ptr GRPC_SHADOW_BIO_get_mem_ptr -#define BIO_get_new_index GRPC_SHADOW_BIO_get_new_index -#define BIO_get_retry_flags GRPC_SHADOW_BIO_get_retry_flags -#define BIO_get_retry_reason GRPC_SHADOW_BIO_get_retry_reason -#define BIO_get_shutdown GRPC_SHADOW_BIO_get_shutdown -#define BIO_gets GRPC_SHADOW_BIO_gets -#define BIO_hexdump GRPC_SHADOW_BIO_hexdump -#define BIO_indent GRPC_SHADOW_BIO_indent -#define BIO_int_ctrl GRPC_SHADOW_BIO_int_ctrl -#define BIO_mem_contents GRPC_SHADOW_BIO_mem_contents -#define BIO_meth_free GRPC_SHADOW_BIO_meth_free -#define BIO_meth_new GRPC_SHADOW_BIO_meth_new -#define BIO_meth_set_create GRPC_SHADOW_BIO_meth_set_create -#define BIO_meth_set_ctrl GRPC_SHADOW_BIO_meth_set_ctrl -#define BIO_meth_set_destroy GRPC_SHADOW_BIO_meth_set_destroy -#define BIO_meth_set_gets GRPC_SHADOW_BIO_meth_set_gets -#define BIO_meth_set_puts GRPC_SHADOW_BIO_meth_set_puts -#define BIO_meth_set_read GRPC_SHADOW_BIO_meth_set_read -#define BIO_meth_set_write GRPC_SHADOW_BIO_meth_set_write -#define BIO_method_type GRPC_SHADOW_BIO_method_type -#define BIO_new GRPC_SHADOW_BIO_new -#define BIO_new_bio_pair GRPC_SHADOW_BIO_new_bio_pair -#define BIO_new_connect GRPC_SHADOW_BIO_new_connect -#define BIO_new_fd GRPC_SHADOW_BIO_new_fd -#define BIO_new_file GRPC_SHADOW_BIO_new_file -#define BIO_new_fp GRPC_SHADOW_BIO_new_fp -#define BIO_new_mem_buf GRPC_SHADOW_BIO_new_mem_buf -#define BIO_new_socket GRPC_SHADOW_BIO_new_socket -#define BIO_next GRPC_SHADOW_BIO_next -#define BIO_number_read GRPC_SHADOW_BIO_number_read -#define BIO_number_written GRPC_SHADOW_BIO_number_written -#define BIO_pending GRPC_SHADOW_BIO_pending -#define BIO_pop GRPC_SHADOW_BIO_pop -#define BIO_printf GRPC_SHADOW_BIO_printf -#define BIO_ptr_ctrl GRPC_SHADOW_BIO_ptr_ctrl -#define BIO_push GRPC_SHADOW_BIO_push -#define BIO_puts GRPC_SHADOW_BIO_puts -#define BIO_read GRPC_SHADOW_BIO_read -#define BIO_read_asn1 GRPC_SHADOW_BIO_read_asn1 -#define BIO_read_filename GRPC_SHADOW_BIO_read_filename -#define BIO_reset GRPC_SHADOW_BIO_reset -#define BIO_rw_filename GRPC_SHADOW_BIO_rw_filename -#define BIO_s_connect GRPC_SHADOW_BIO_s_connect -#define BIO_s_fd GRPC_SHADOW_BIO_s_fd -#define BIO_s_file GRPC_SHADOW_BIO_s_file -#define BIO_s_mem GRPC_SHADOW_BIO_s_mem -#define BIO_s_socket GRPC_SHADOW_BIO_s_socket -#define BIO_set_close GRPC_SHADOW_BIO_set_close -#define BIO_set_conn_hostname GRPC_SHADOW_BIO_set_conn_hostname -#define BIO_set_conn_int_port GRPC_SHADOW_BIO_set_conn_int_port -#define BIO_set_conn_port GRPC_SHADOW_BIO_set_conn_port -#define BIO_set_data GRPC_SHADOW_BIO_set_data -#define BIO_set_fd GRPC_SHADOW_BIO_set_fd -#define BIO_set_flags GRPC_SHADOW_BIO_set_flags -#define BIO_set_fp GRPC_SHADOW_BIO_set_fp -#define BIO_set_init GRPC_SHADOW_BIO_set_init -#define BIO_set_mem_buf GRPC_SHADOW_BIO_set_mem_buf -#define BIO_set_mem_eof_return GRPC_SHADOW_BIO_set_mem_eof_return -#define BIO_set_nbio GRPC_SHADOW_BIO_set_nbio -#define BIO_set_retry_read GRPC_SHADOW_BIO_set_retry_read -#define BIO_set_retry_special GRPC_SHADOW_BIO_set_retry_special -#define BIO_set_retry_write GRPC_SHADOW_BIO_set_retry_write -#define BIO_set_shutdown GRPC_SHADOW_BIO_set_shutdown -#define BIO_set_ssl GRPC_SHADOW_BIO_set_ssl -#define BIO_set_write_buffer_size GRPC_SHADOW_BIO_set_write_buffer_size -#define BIO_should_io_special GRPC_SHADOW_BIO_should_io_special -#define BIO_should_read GRPC_SHADOW_BIO_should_read -#define BIO_should_retry GRPC_SHADOW_BIO_should_retry -#define BIO_should_write GRPC_SHADOW_BIO_should_write -#define BIO_shutdown_wr GRPC_SHADOW_BIO_shutdown_wr -#define BIO_snprintf GRPC_SHADOW_BIO_snprintf -#define BIO_test_flags GRPC_SHADOW_BIO_test_flags -#define BIO_up_ref GRPC_SHADOW_BIO_up_ref -#define BIO_vfree GRPC_SHADOW_BIO_vfree -#define BIO_vsnprintf GRPC_SHADOW_BIO_vsnprintf -#define BIO_wpending GRPC_SHADOW_BIO_wpending -#define BIO_write GRPC_SHADOW_BIO_write -#define BIO_write_all GRPC_SHADOW_BIO_write_all -#define BIO_write_filename GRPC_SHADOW_BIO_write_filename -#define BN_BLINDING_convert GRPC_SHADOW_BN_BLINDING_convert -#define BN_BLINDING_free GRPC_SHADOW_BN_BLINDING_free -#define BN_BLINDING_invert GRPC_SHADOW_BN_BLINDING_invert -#define BN_BLINDING_new GRPC_SHADOW_BN_BLINDING_new -#define BN_CTX_end GRPC_SHADOW_BN_CTX_end -#define BN_CTX_free GRPC_SHADOW_BN_CTX_free -#define BN_CTX_get GRPC_SHADOW_BN_CTX_get -#define BN_CTX_new GRPC_SHADOW_BN_CTX_new -#define BN_CTX_start GRPC_SHADOW_BN_CTX_start -#define BN_GENCB_call GRPC_SHADOW_BN_GENCB_call -#define BN_GENCB_set GRPC_SHADOW_BN_GENCB_set -#define BN_MONT_CTX_copy GRPC_SHADOW_BN_MONT_CTX_copy -#define BN_MONT_CTX_free GRPC_SHADOW_BN_MONT_CTX_free -#define BN_MONT_CTX_new GRPC_SHADOW_BN_MONT_CTX_new -#define BN_MONT_CTX_new_consttime GRPC_SHADOW_BN_MONT_CTX_new_consttime -#define BN_MONT_CTX_new_for_modulus GRPC_SHADOW_BN_MONT_CTX_new_for_modulus -#define BN_MONT_CTX_set GRPC_SHADOW_BN_MONT_CTX_set -#define BN_MONT_CTX_set_locked GRPC_SHADOW_BN_MONT_CTX_set_locked -#define BN_abs_is_word GRPC_SHADOW_BN_abs_is_word -#define BN_add GRPC_SHADOW_BN_add -#define BN_add_word GRPC_SHADOW_BN_add_word -#define BN_asc2bn GRPC_SHADOW_BN_asc2bn -#define BN_bin2bn GRPC_SHADOW_BN_bin2bn -#define BN_bn2bin GRPC_SHADOW_BN_bn2bin -#define BN_bn2bin_padded GRPC_SHADOW_BN_bn2bin_padded -#define BN_bn2binpad GRPC_SHADOW_BN_bn2binpad -#define BN_bn2cbb_padded GRPC_SHADOW_BN_bn2cbb_padded -#define BN_bn2dec GRPC_SHADOW_BN_bn2dec -#define BN_bn2hex GRPC_SHADOW_BN_bn2hex -#define BN_bn2le_padded GRPC_SHADOW_BN_bn2le_padded -#define BN_bn2mpi GRPC_SHADOW_BN_bn2mpi -#define BN_clear GRPC_SHADOW_BN_clear -#define BN_clear_bit GRPC_SHADOW_BN_clear_bit -#define BN_clear_free GRPC_SHADOW_BN_clear_free -#define BN_cmp GRPC_SHADOW_BN_cmp -#define BN_cmp_word GRPC_SHADOW_BN_cmp_word -#define BN_copy GRPC_SHADOW_BN_copy -#define BN_count_low_zero_bits GRPC_SHADOW_BN_count_low_zero_bits -#define BN_dec2bn GRPC_SHADOW_BN_dec2bn -#define BN_div GRPC_SHADOW_BN_div -#define BN_div_word GRPC_SHADOW_BN_div_word -#define BN_dup GRPC_SHADOW_BN_dup -#define BN_enhanced_miller_rabin_primality_test GRPC_SHADOW_BN_enhanced_miller_rabin_primality_test -#define BN_equal_consttime GRPC_SHADOW_BN_equal_consttime -#define BN_exp GRPC_SHADOW_BN_exp -#define BN_free GRPC_SHADOW_BN_free -#define BN_from_montgomery GRPC_SHADOW_BN_from_montgomery -#define BN_gcd GRPC_SHADOW_BN_gcd -#define BN_generate_prime_ex GRPC_SHADOW_BN_generate_prime_ex -#define BN_get_rfc3526_prime_1536 GRPC_SHADOW_BN_get_rfc3526_prime_1536 -#define BN_get_u64 GRPC_SHADOW_BN_get_u64 -#define BN_get_word GRPC_SHADOW_BN_get_word -#define BN_hex2bn GRPC_SHADOW_BN_hex2bn -#define BN_init GRPC_SHADOW_BN_init -#define BN_is_bit_set GRPC_SHADOW_BN_is_bit_set -#define BN_is_negative GRPC_SHADOW_BN_is_negative -#define BN_is_odd GRPC_SHADOW_BN_is_odd -#define BN_is_one GRPC_SHADOW_BN_is_one -#define BN_is_pow2 GRPC_SHADOW_BN_is_pow2 -#define BN_is_prime_ex GRPC_SHADOW_BN_is_prime_ex -#define BN_is_prime_fasttest_ex GRPC_SHADOW_BN_is_prime_fasttest_ex -#define BN_is_word GRPC_SHADOW_BN_is_word -#define BN_is_zero GRPC_SHADOW_BN_is_zero -#define BN_le2bn GRPC_SHADOW_BN_le2bn -#define BN_lshift GRPC_SHADOW_BN_lshift -#define BN_lshift1 GRPC_SHADOW_BN_lshift1 -#define BN_marshal_asn1 GRPC_SHADOW_BN_marshal_asn1 -#define BN_mask_bits GRPC_SHADOW_BN_mask_bits -#define BN_mod_add GRPC_SHADOW_BN_mod_add -#define BN_mod_add_quick GRPC_SHADOW_BN_mod_add_quick -#define BN_mod_exp GRPC_SHADOW_BN_mod_exp -#define BN_mod_exp2_mont GRPC_SHADOW_BN_mod_exp2_mont -#define BN_mod_exp_mont GRPC_SHADOW_BN_mod_exp_mont -#define BN_mod_exp_mont_consttime GRPC_SHADOW_BN_mod_exp_mont_consttime -#define BN_mod_exp_mont_word GRPC_SHADOW_BN_mod_exp_mont_word -#define BN_mod_inverse GRPC_SHADOW_BN_mod_inverse -#define BN_mod_inverse_blinded GRPC_SHADOW_BN_mod_inverse_blinded -#define BN_mod_inverse_odd GRPC_SHADOW_BN_mod_inverse_odd -#define BN_mod_lshift GRPC_SHADOW_BN_mod_lshift -#define BN_mod_lshift1 GRPC_SHADOW_BN_mod_lshift1 -#define BN_mod_lshift1_quick GRPC_SHADOW_BN_mod_lshift1_quick -#define BN_mod_lshift_quick GRPC_SHADOW_BN_mod_lshift_quick -#define BN_mod_mul GRPC_SHADOW_BN_mod_mul -#define BN_mod_mul_montgomery GRPC_SHADOW_BN_mod_mul_montgomery -#define BN_mod_pow2 GRPC_SHADOW_BN_mod_pow2 -#define BN_mod_sqr GRPC_SHADOW_BN_mod_sqr -#define BN_mod_sqrt GRPC_SHADOW_BN_mod_sqrt -#define BN_mod_sub GRPC_SHADOW_BN_mod_sub -#define BN_mod_sub_quick GRPC_SHADOW_BN_mod_sub_quick -#define BN_mod_word GRPC_SHADOW_BN_mod_word -#define BN_mpi2bn GRPC_SHADOW_BN_mpi2bn -#define BN_mul GRPC_SHADOW_BN_mul -#define BN_mul_word GRPC_SHADOW_BN_mul_word -#define BN_new GRPC_SHADOW_BN_new -#define BN_nnmod GRPC_SHADOW_BN_nnmod -#define BN_nnmod_pow2 GRPC_SHADOW_BN_nnmod_pow2 -#define BN_num_bits GRPC_SHADOW_BN_num_bits -#define BN_num_bits_word GRPC_SHADOW_BN_num_bits_word -#define BN_num_bytes GRPC_SHADOW_BN_num_bytes -#define BN_one GRPC_SHADOW_BN_one -#define BN_parse_asn1_unsigned GRPC_SHADOW_BN_parse_asn1_unsigned -#define BN_primality_test GRPC_SHADOW_BN_primality_test -#define BN_print GRPC_SHADOW_BN_print -#define BN_print_fp GRPC_SHADOW_BN_print_fp -#define BN_pseudo_rand GRPC_SHADOW_BN_pseudo_rand -#define BN_pseudo_rand_range GRPC_SHADOW_BN_pseudo_rand_range -#define BN_rand GRPC_SHADOW_BN_rand -#define BN_rand_range GRPC_SHADOW_BN_rand_range -#define BN_rand_range_ex GRPC_SHADOW_BN_rand_range_ex -#define BN_rshift GRPC_SHADOW_BN_rshift -#define BN_rshift1 GRPC_SHADOW_BN_rshift1 -#define BN_set_bit GRPC_SHADOW_BN_set_bit -#define BN_set_negative GRPC_SHADOW_BN_set_negative -#define BN_set_u64 GRPC_SHADOW_BN_set_u64 -#define BN_set_word GRPC_SHADOW_BN_set_word -#define BN_sqr GRPC_SHADOW_BN_sqr -#define BN_sqrt GRPC_SHADOW_BN_sqrt -#define BN_sub GRPC_SHADOW_BN_sub -#define BN_sub_word GRPC_SHADOW_BN_sub_word -#define BN_to_ASN1_ENUMERATED GRPC_SHADOW_BN_to_ASN1_ENUMERATED -#define BN_to_ASN1_INTEGER GRPC_SHADOW_BN_to_ASN1_INTEGER -#define BN_to_montgomery GRPC_SHADOW_BN_to_montgomery -#define BN_uadd GRPC_SHADOW_BN_uadd -#define BN_ucmp GRPC_SHADOW_BN_ucmp -#define BN_usub GRPC_SHADOW_BN_usub -#define BN_value_one GRPC_SHADOW_BN_value_one -#define BN_zero GRPC_SHADOW_BN_zero -#define BORINGSSL_function_hit GRPC_SHADOW_BORINGSSL_function_hit -#define BORINGSSL_self_test GRPC_SHADOW_BORINGSSL_self_test -#define BUF_MEM_append GRPC_SHADOW_BUF_MEM_append -#define BUF_MEM_free GRPC_SHADOW_BUF_MEM_free -#define BUF_MEM_grow GRPC_SHADOW_BUF_MEM_grow -#define BUF_MEM_grow_clean GRPC_SHADOW_BUF_MEM_grow_clean -#define BUF_MEM_new GRPC_SHADOW_BUF_MEM_new -#define BUF_MEM_reserve GRPC_SHADOW_BUF_MEM_reserve -#define BUF_memdup GRPC_SHADOW_BUF_memdup -#define BUF_strdup GRPC_SHADOW_BUF_strdup -#define BUF_strlcat GRPC_SHADOW_BUF_strlcat -#define BUF_strlcpy GRPC_SHADOW_BUF_strlcpy -#define BUF_strndup GRPC_SHADOW_BUF_strndup -#define BUF_strnlen GRPC_SHADOW_BUF_strnlen -#define CBB_add_asn1 GRPC_SHADOW_CBB_add_asn1 -#define CBB_add_asn1_bool GRPC_SHADOW_CBB_add_asn1_bool -#define CBB_add_asn1_octet_string GRPC_SHADOW_CBB_add_asn1_octet_string -#define CBB_add_asn1_oid_from_text GRPC_SHADOW_CBB_add_asn1_oid_from_text -#define CBB_add_asn1_uint64 GRPC_SHADOW_CBB_add_asn1_uint64 -#define CBB_add_bytes GRPC_SHADOW_CBB_add_bytes -#define CBB_add_space GRPC_SHADOW_CBB_add_space -#define CBB_add_u16 GRPC_SHADOW_CBB_add_u16 -#define CBB_add_u16_length_prefixed GRPC_SHADOW_CBB_add_u16_length_prefixed -#define CBB_add_u24 GRPC_SHADOW_CBB_add_u24 -#define CBB_add_u24_length_prefixed GRPC_SHADOW_CBB_add_u24_length_prefixed -#define CBB_add_u32 GRPC_SHADOW_CBB_add_u32 -#define CBB_add_u64 GRPC_SHADOW_CBB_add_u64 -#define CBB_add_u8 GRPC_SHADOW_CBB_add_u8 -#define CBB_add_u8_length_prefixed GRPC_SHADOW_CBB_add_u8_length_prefixed -#define CBB_cleanup GRPC_SHADOW_CBB_cleanup -#define CBB_data GRPC_SHADOW_CBB_data -#define CBB_did_write GRPC_SHADOW_CBB_did_write -#define CBB_discard_child GRPC_SHADOW_CBB_discard_child -#define CBB_finish GRPC_SHADOW_CBB_finish -#define CBB_finish_i2d GRPC_SHADOW_CBB_finish_i2d -#define CBB_flush GRPC_SHADOW_CBB_flush -#define CBB_flush_asn1_set_of GRPC_SHADOW_CBB_flush_asn1_set_of -#define CBB_init GRPC_SHADOW_CBB_init -#define CBB_init_fixed GRPC_SHADOW_CBB_init_fixed -#define CBB_len GRPC_SHADOW_CBB_len -#define CBB_reserve GRPC_SHADOW_CBB_reserve -#define CBB_zero GRPC_SHADOW_CBB_zero -#define CBS_asn1_ber_to_der GRPC_SHADOW_CBS_asn1_ber_to_der -#define CBS_asn1_bitstring_has_bit GRPC_SHADOW_CBS_asn1_bitstring_has_bit -#define CBS_asn1_oid_to_text GRPC_SHADOW_CBS_asn1_oid_to_text -#define CBS_contains_zero_byte GRPC_SHADOW_CBS_contains_zero_byte -#define CBS_copy_bytes GRPC_SHADOW_CBS_copy_bytes -#define CBS_data GRPC_SHADOW_CBS_data -#define CBS_get_any_asn1 GRPC_SHADOW_CBS_get_any_asn1 -#define CBS_get_any_asn1_element GRPC_SHADOW_CBS_get_any_asn1_element -#define CBS_get_any_ber_asn1_element GRPC_SHADOW_CBS_get_any_ber_asn1_element -#define CBS_get_asn1 GRPC_SHADOW_CBS_get_asn1 -#define CBS_get_asn1_bool GRPC_SHADOW_CBS_get_asn1_bool -#define CBS_get_asn1_element GRPC_SHADOW_CBS_get_asn1_element -#define CBS_get_asn1_implicit_string GRPC_SHADOW_CBS_get_asn1_implicit_string -#define CBS_get_asn1_uint64 GRPC_SHADOW_CBS_get_asn1_uint64 -#define CBS_get_bytes GRPC_SHADOW_CBS_get_bytes -#define CBS_get_last_u8 GRPC_SHADOW_CBS_get_last_u8 -#define CBS_get_optional_asn1 GRPC_SHADOW_CBS_get_optional_asn1 -#define CBS_get_optional_asn1_bool GRPC_SHADOW_CBS_get_optional_asn1_bool -#define CBS_get_optional_asn1_octet_string GRPC_SHADOW_CBS_get_optional_asn1_octet_string -#define CBS_get_optional_asn1_uint64 GRPC_SHADOW_CBS_get_optional_asn1_uint64 -#define CBS_get_u16 GRPC_SHADOW_CBS_get_u16 -#define CBS_get_u16_length_prefixed GRPC_SHADOW_CBS_get_u16_length_prefixed -#define CBS_get_u24 GRPC_SHADOW_CBS_get_u24 -#define CBS_get_u24_length_prefixed GRPC_SHADOW_CBS_get_u24_length_prefixed -#define CBS_get_u32 GRPC_SHADOW_CBS_get_u32 -#define CBS_get_u64 GRPC_SHADOW_CBS_get_u64 -#define CBS_get_u8 GRPC_SHADOW_CBS_get_u8 -#define CBS_get_u8_length_prefixed GRPC_SHADOW_CBS_get_u8_length_prefixed -#define CBS_init GRPC_SHADOW_CBS_init -#define CBS_is_valid_asn1_bitstring GRPC_SHADOW_CBS_is_valid_asn1_bitstring -#define CBS_len GRPC_SHADOW_CBS_len -#define CBS_mem_equal GRPC_SHADOW_CBS_mem_equal -#define CBS_peek_asn1_tag GRPC_SHADOW_CBS_peek_asn1_tag -#define CBS_skip GRPC_SHADOW_CBS_skip -#define CBS_stow GRPC_SHADOW_CBS_stow -#define CBS_strdup GRPC_SHADOW_CBS_strdup -#define CERTIFICATEPOLICIES_free GRPC_SHADOW_CERTIFICATEPOLICIES_free -#define CERTIFICATEPOLICIES_it GRPC_SHADOW_CERTIFICATEPOLICIES_it -#define CERTIFICATEPOLICIES_new GRPC_SHADOW_CERTIFICATEPOLICIES_new -#define CMAC_CTX_copy GRPC_SHADOW_CMAC_CTX_copy -#define CMAC_CTX_free GRPC_SHADOW_CMAC_CTX_free -#define CMAC_CTX_new GRPC_SHADOW_CMAC_CTX_new -#define CMAC_Final GRPC_SHADOW_CMAC_Final -#define CMAC_Init GRPC_SHADOW_CMAC_Init -#define CMAC_Reset GRPC_SHADOW_CMAC_Reset -#define CMAC_Update GRPC_SHADOW_CMAC_Update -#define CONF_VALUE_new GRPC_SHADOW_CONF_VALUE_new -#define CONF_modules_free GRPC_SHADOW_CONF_modules_free -#define CONF_modules_load_file GRPC_SHADOW_CONF_modules_load_file -#define CONF_parse_list GRPC_SHADOW_CONF_parse_list -#define CRL_DIST_POINTS_free GRPC_SHADOW_CRL_DIST_POINTS_free -#define CRL_DIST_POINTS_it GRPC_SHADOW_CRL_DIST_POINTS_it -#define CRL_DIST_POINTS_new GRPC_SHADOW_CRL_DIST_POINTS_new -#define CRYPTO_BUFFER_POOL_free GRPC_SHADOW_CRYPTO_BUFFER_POOL_free -#define CRYPTO_BUFFER_POOL_new GRPC_SHADOW_CRYPTO_BUFFER_POOL_new -#define CRYPTO_BUFFER_alloc GRPC_SHADOW_CRYPTO_BUFFER_alloc -#define CRYPTO_BUFFER_data GRPC_SHADOW_CRYPTO_BUFFER_data -#define CRYPTO_BUFFER_free GRPC_SHADOW_CRYPTO_BUFFER_free -#define CRYPTO_BUFFER_init_CBS GRPC_SHADOW_CRYPTO_BUFFER_init_CBS -#define CRYPTO_BUFFER_len GRPC_SHADOW_CRYPTO_BUFFER_len -#define CRYPTO_BUFFER_new GRPC_SHADOW_CRYPTO_BUFFER_new -#define CRYPTO_BUFFER_new_from_CBS GRPC_SHADOW_CRYPTO_BUFFER_new_from_CBS -#define CRYPTO_BUFFER_up_ref GRPC_SHADOW_CRYPTO_BUFFER_up_ref -#define CRYPTO_MUTEX_cleanup GRPC_SHADOW_CRYPTO_MUTEX_cleanup -#define CRYPTO_MUTEX_init GRPC_SHADOW_CRYPTO_MUTEX_init -#define CRYPTO_MUTEX_lock_read GRPC_SHADOW_CRYPTO_MUTEX_lock_read -#define CRYPTO_MUTEX_lock_write GRPC_SHADOW_CRYPTO_MUTEX_lock_write -#define CRYPTO_MUTEX_unlock_read GRPC_SHADOW_CRYPTO_MUTEX_unlock_read -#define CRYPTO_MUTEX_unlock_write GRPC_SHADOW_CRYPTO_MUTEX_unlock_write -#define CRYPTO_POLYVAL_finish GRPC_SHADOW_CRYPTO_POLYVAL_finish -#define CRYPTO_POLYVAL_init GRPC_SHADOW_CRYPTO_POLYVAL_init -#define CRYPTO_POLYVAL_update_blocks GRPC_SHADOW_CRYPTO_POLYVAL_update_blocks -#define CRYPTO_STATIC_MUTEX_lock_read GRPC_SHADOW_CRYPTO_STATIC_MUTEX_lock_read -#define CRYPTO_STATIC_MUTEX_lock_write GRPC_SHADOW_CRYPTO_STATIC_MUTEX_lock_write -#define CRYPTO_STATIC_MUTEX_unlock_read GRPC_SHADOW_CRYPTO_STATIC_MUTEX_unlock_read -#define CRYPTO_STATIC_MUTEX_unlock_write GRPC_SHADOW_CRYPTO_STATIC_MUTEX_unlock_write -#define CRYPTO_THREADID_current GRPC_SHADOW_CRYPTO_THREADID_current -#define CRYPTO_THREADID_set_callback GRPC_SHADOW_CRYPTO_THREADID_set_callback -#define CRYPTO_THREADID_set_numeric GRPC_SHADOW_CRYPTO_THREADID_set_numeric -#define CRYPTO_THREADID_set_pointer GRPC_SHADOW_CRYPTO_THREADID_set_pointer -#define CRYPTO_cbc128_decrypt GRPC_SHADOW_CRYPTO_cbc128_decrypt -#define CRYPTO_cbc128_encrypt GRPC_SHADOW_CRYPTO_cbc128_encrypt -#define CRYPTO_cfb128_1_encrypt GRPC_SHADOW_CRYPTO_cfb128_1_encrypt -#define CRYPTO_cfb128_8_encrypt GRPC_SHADOW_CRYPTO_cfb128_8_encrypt -#define CRYPTO_cfb128_encrypt GRPC_SHADOW_CRYPTO_cfb128_encrypt -#define CRYPTO_chacha_20 GRPC_SHADOW_CRYPTO_chacha_20 -#define CRYPTO_cleanup_all_ex_data GRPC_SHADOW_CRYPTO_cleanup_all_ex_data -#define CRYPTO_ctr128_encrypt GRPC_SHADOW_CRYPTO_ctr128_encrypt -#define CRYPTO_ctr128_encrypt_ctr32 GRPC_SHADOW_CRYPTO_ctr128_encrypt_ctr32 -#define CRYPTO_free_ex_data GRPC_SHADOW_CRYPTO_free_ex_data -#define CRYPTO_gcm128_aad GRPC_SHADOW_CRYPTO_gcm128_aad -#define CRYPTO_gcm128_decrypt GRPC_SHADOW_CRYPTO_gcm128_decrypt -#define CRYPTO_gcm128_decrypt_ctr32 GRPC_SHADOW_CRYPTO_gcm128_decrypt_ctr32 -#define CRYPTO_gcm128_encrypt GRPC_SHADOW_CRYPTO_gcm128_encrypt -#define CRYPTO_gcm128_encrypt_ctr32 GRPC_SHADOW_CRYPTO_gcm128_encrypt_ctr32 -#define CRYPTO_gcm128_finish GRPC_SHADOW_CRYPTO_gcm128_finish -#define CRYPTO_gcm128_init_key GRPC_SHADOW_CRYPTO_gcm128_init_key -#define CRYPTO_gcm128_setiv GRPC_SHADOW_CRYPTO_gcm128_setiv -#define CRYPTO_gcm128_tag GRPC_SHADOW_CRYPTO_gcm128_tag -#define CRYPTO_get_dynlock_create_callback GRPC_SHADOW_CRYPTO_get_dynlock_create_callback -#define CRYPTO_get_dynlock_destroy_callback GRPC_SHADOW_CRYPTO_get_dynlock_destroy_callback -#define CRYPTO_get_dynlock_lock_callback GRPC_SHADOW_CRYPTO_get_dynlock_lock_callback -#define CRYPTO_get_ex_data GRPC_SHADOW_CRYPTO_get_ex_data -#define CRYPTO_get_ex_new_index GRPC_SHADOW_CRYPTO_get_ex_new_index -#define CRYPTO_get_lock_name GRPC_SHADOW_CRYPTO_get_lock_name -#define CRYPTO_get_locking_callback GRPC_SHADOW_CRYPTO_get_locking_callback -#define CRYPTO_get_thread_local GRPC_SHADOW_CRYPTO_get_thread_local -#define CRYPTO_ghash_init GRPC_SHADOW_CRYPTO_ghash_init -#define CRYPTO_has_asm GRPC_SHADOW_CRYPTO_has_asm -#define CRYPTO_hchacha20 GRPC_SHADOW_CRYPTO_hchacha20 -#define CRYPTO_is_confidential_build GRPC_SHADOW_CRYPTO_is_confidential_build -#define CRYPTO_library_init GRPC_SHADOW_CRYPTO_library_init -#define CRYPTO_malloc_init GRPC_SHADOW_CRYPTO_malloc_init -#define CRYPTO_memcmp GRPC_SHADOW_CRYPTO_memcmp -#define CRYPTO_new_ex_data GRPC_SHADOW_CRYPTO_new_ex_data -#define CRYPTO_num_locks GRPC_SHADOW_CRYPTO_num_locks -#define CRYPTO_ofb128_encrypt GRPC_SHADOW_CRYPTO_ofb128_encrypt -#define CRYPTO_once GRPC_SHADOW_CRYPTO_once -#define CRYPTO_poly1305_finish GRPC_SHADOW_CRYPTO_poly1305_finish -#define CRYPTO_poly1305_init GRPC_SHADOW_CRYPTO_poly1305_init -#define CRYPTO_poly1305_update GRPC_SHADOW_CRYPTO_poly1305_update -#define CRYPTO_rdrand GRPC_SHADOW_CRYPTO_rdrand -#define CRYPTO_rdrand_multiple8_buf GRPC_SHADOW_CRYPTO_rdrand_multiple8_buf -#define CRYPTO_refcount_dec_and_test_zero GRPC_SHADOW_CRYPTO_refcount_dec_and_test_zero -#define CRYPTO_refcount_inc GRPC_SHADOW_CRYPTO_refcount_inc -#define CRYPTO_set_add_lock_callback GRPC_SHADOW_CRYPTO_set_add_lock_callback -#define CRYPTO_set_dynlock_create_callback GRPC_SHADOW_CRYPTO_set_dynlock_create_callback -#define CRYPTO_set_dynlock_destroy_callback GRPC_SHADOW_CRYPTO_set_dynlock_destroy_callback -#define CRYPTO_set_dynlock_lock_callback GRPC_SHADOW_CRYPTO_set_dynlock_lock_callback -#define CRYPTO_set_ex_data GRPC_SHADOW_CRYPTO_set_ex_data -#define CRYPTO_set_id_callback GRPC_SHADOW_CRYPTO_set_id_callback -#define CRYPTO_set_locking_callback GRPC_SHADOW_CRYPTO_set_locking_callback -#define CRYPTO_set_thread_local GRPC_SHADOW_CRYPTO_set_thread_local -#define CRYPTO_sysrand GRPC_SHADOW_CRYPTO_sysrand -#define CRYPTO_tls1_prf GRPC_SHADOW_CRYPTO_tls1_prf -#define CTR_DRBG_clear GRPC_SHADOW_CTR_DRBG_clear -#define CTR_DRBG_generate GRPC_SHADOW_CTR_DRBG_generate -#define CTR_DRBG_init GRPC_SHADOW_CTR_DRBG_init -#define CTR_DRBG_reseed GRPC_SHADOW_CTR_DRBG_reseed -#define ChaCha20_ctr32 GRPC_SHADOW_ChaCha20_ctr32 -#define DES_decrypt3 GRPC_SHADOW_DES_decrypt3 -#define DES_ecb3_encrypt GRPC_SHADOW_DES_ecb3_encrypt -#define DES_ecb_encrypt GRPC_SHADOW_DES_ecb_encrypt -#define DES_ede2_cbc_encrypt GRPC_SHADOW_DES_ede2_cbc_encrypt -#define DES_ede3_cbc_encrypt GRPC_SHADOW_DES_ede3_cbc_encrypt -#define DES_encrypt3 GRPC_SHADOW_DES_encrypt3 -#define DES_ncbc_encrypt GRPC_SHADOW_DES_ncbc_encrypt -#define DES_set_key GRPC_SHADOW_DES_set_key -#define DES_set_key_unchecked GRPC_SHADOW_DES_set_key_unchecked -#define DES_set_odd_parity GRPC_SHADOW_DES_set_odd_parity -#define DH_check GRPC_SHADOW_DH_check -#define DH_check_pub_key GRPC_SHADOW_DH_check_pub_key -#define DH_compute_key GRPC_SHADOW_DH_compute_key -#define DH_free GRPC_SHADOW_DH_free -#define DH_generate_key GRPC_SHADOW_DH_generate_key -#define DH_generate_parameters_ex GRPC_SHADOW_DH_generate_parameters_ex -#define DH_get0_key GRPC_SHADOW_DH_get0_key -#define DH_get0_pqg GRPC_SHADOW_DH_get0_pqg -#define DH_get_ex_data GRPC_SHADOW_DH_get_ex_data -#define DH_get_ex_new_index GRPC_SHADOW_DH_get_ex_new_index -#define DH_marshal_parameters GRPC_SHADOW_DH_marshal_parameters -#define DH_new GRPC_SHADOW_DH_new -#define DH_num_bits GRPC_SHADOW_DH_num_bits -#define DH_parse_parameters GRPC_SHADOW_DH_parse_parameters -#define DH_set0_key GRPC_SHADOW_DH_set0_key -#define DH_set0_pqg GRPC_SHADOW_DH_set0_pqg -#define DH_set_ex_data GRPC_SHADOW_DH_set_ex_data -#define DH_size GRPC_SHADOW_DH_size -#define DH_up_ref GRPC_SHADOW_DH_up_ref -#define DHparams_dup GRPC_SHADOW_DHparams_dup -#define DIRECTORYSTRING_free GRPC_SHADOW_DIRECTORYSTRING_free -#define DIRECTORYSTRING_it GRPC_SHADOW_DIRECTORYSTRING_it -#define DIRECTORYSTRING_new GRPC_SHADOW_DIRECTORYSTRING_new -#define DISPLAYTEXT_free GRPC_SHADOW_DISPLAYTEXT_free -#define DISPLAYTEXT_it GRPC_SHADOW_DISPLAYTEXT_it -#define DISPLAYTEXT_new GRPC_SHADOW_DISPLAYTEXT_new -#define DIST_POINT_NAME_free GRPC_SHADOW_DIST_POINT_NAME_free -#define DIST_POINT_NAME_it GRPC_SHADOW_DIST_POINT_NAME_it -#define DIST_POINT_NAME_new GRPC_SHADOW_DIST_POINT_NAME_new -#define DIST_POINT_free GRPC_SHADOW_DIST_POINT_free -#define DIST_POINT_it GRPC_SHADOW_DIST_POINT_it -#define DIST_POINT_new GRPC_SHADOW_DIST_POINT_new -#define DIST_POINT_set_dpname GRPC_SHADOW_DIST_POINT_set_dpname -#define DSA_SIG_free GRPC_SHADOW_DSA_SIG_free -#define DSA_SIG_marshal GRPC_SHADOW_DSA_SIG_marshal -#define DSA_SIG_new GRPC_SHADOW_DSA_SIG_new -#define DSA_SIG_parse GRPC_SHADOW_DSA_SIG_parse -#define DSA_check_signature GRPC_SHADOW_DSA_check_signature -#define DSA_do_check_signature GRPC_SHADOW_DSA_do_check_signature -#define DSA_do_sign GRPC_SHADOW_DSA_do_sign -#define DSA_do_verify GRPC_SHADOW_DSA_do_verify -#define DSA_dup_DH GRPC_SHADOW_DSA_dup_DH -#define DSA_free GRPC_SHADOW_DSA_free -#define DSA_generate_key GRPC_SHADOW_DSA_generate_key -#define DSA_generate_parameters_ex GRPC_SHADOW_DSA_generate_parameters_ex -#define DSA_get0_key GRPC_SHADOW_DSA_get0_key -#define DSA_get0_pqg GRPC_SHADOW_DSA_get0_pqg -#define DSA_get_ex_data GRPC_SHADOW_DSA_get_ex_data -#define DSA_get_ex_new_index GRPC_SHADOW_DSA_get_ex_new_index -#define DSA_marshal_parameters GRPC_SHADOW_DSA_marshal_parameters -#define DSA_marshal_private_key GRPC_SHADOW_DSA_marshal_private_key -#define DSA_marshal_public_key GRPC_SHADOW_DSA_marshal_public_key -#define DSA_new GRPC_SHADOW_DSA_new -#define DSA_parse_parameters GRPC_SHADOW_DSA_parse_parameters -#define DSA_parse_private_key GRPC_SHADOW_DSA_parse_private_key -#define DSA_parse_public_key GRPC_SHADOW_DSA_parse_public_key -#define DSA_set0_key GRPC_SHADOW_DSA_set0_key -#define DSA_set0_pqg GRPC_SHADOW_DSA_set0_pqg -#define DSA_set_ex_data GRPC_SHADOW_DSA_set_ex_data -#define DSA_sign GRPC_SHADOW_DSA_sign -#define DSA_size GRPC_SHADOW_DSA_size -#define DSA_up_ref GRPC_SHADOW_DSA_up_ref -#define DSA_verify GRPC_SHADOW_DSA_verify -#define DSAparams_dup GRPC_SHADOW_DSAparams_dup -#define DTLS_client_method GRPC_SHADOW_DTLS_client_method -#define DTLS_method GRPC_SHADOW_DTLS_method -#define DTLS_server_method GRPC_SHADOW_DTLS_server_method -#define DTLS_with_buffers_method GRPC_SHADOW_DTLS_with_buffers_method -#define DTLSv1_2_client_method GRPC_SHADOW_DTLSv1_2_client_method -#define DTLSv1_2_method GRPC_SHADOW_DTLSv1_2_method -#define DTLSv1_2_server_method GRPC_SHADOW_DTLSv1_2_server_method -#define DTLSv1_client_method GRPC_SHADOW_DTLSv1_client_method -#define DTLSv1_get_timeout GRPC_SHADOW_DTLSv1_get_timeout -#define DTLSv1_handle_timeout GRPC_SHADOW_DTLSv1_handle_timeout -#define DTLSv1_method GRPC_SHADOW_DTLSv1_method -#define DTLSv1_server_method GRPC_SHADOW_DTLSv1_server_method -#define DTLSv1_set_initial_timeout_duration GRPC_SHADOW_DTLSv1_set_initial_timeout_duration -#define ECDH_compute_key GRPC_SHADOW_ECDH_compute_key -#define ECDH_compute_key_fips GRPC_SHADOW_ECDH_compute_key_fips -#define ECDSA_SIG_free GRPC_SHADOW_ECDSA_SIG_free -#define ECDSA_SIG_from_bytes GRPC_SHADOW_ECDSA_SIG_from_bytes -#define ECDSA_SIG_get0 GRPC_SHADOW_ECDSA_SIG_get0 -#define ECDSA_SIG_marshal GRPC_SHADOW_ECDSA_SIG_marshal -#define ECDSA_SIG_max_len GRPC_SHADOW_ECDSA_SIG_max_len -#define ECDSA_SIG_new GRPC_SHADOW_ECDSA_SIG_new -#define ECDSA_SIG_parse GRPC_SHADOW_ECDSA_SIG_parse -#define ECDSA_SIG_set0 GRPC_SHADOW_ECDSA_SIG_set0 -#define ECDSA_SIG_to_bytes GRPC_SHADOW_ECDSA_SIG_to_bytes -#define ECDSA_do_sign GRPC_SHADOW_ECDSA_do_sign -#define ECDSA_do_verify GRPC_SHADOW_ECDSA_do_verify -#define ECDSA_sign GRPC_SHADOW_ECDSA_sign -#define ECDSA_size GRPC_SHADOW_ECDSA_size -#define ECDSA_verify GRPC_SHADOW_ECDSA_verify -#define EC_GFp_mont_method GRPC_SHADOW_EC_GFp_mont_method -#define EC_GFp_nistp224_method GRPC_SHADOW_EC_GFp_nistp224_method -#define EC_GFp_nistp256_method GRPC_SHADOW_EC_GFp_nistp256_method -#define EC_GFp_nistz256_method GRPC_SHADOW_EC_GFp_nistz256_method -#define EC_GROUP_cmp GRPC_SHADOW_EC_GROUP_cmp -#define EC_GROUP_dup GRPC_SHADOW_EC_GROUP_dup -#define EC_GROUP_free GRPC_SHADOW_EC_GROUP_free -#define EC_GROUP_get0_generator GRPC_SHADOW_EC_GROUP_get0_generator -#define EC_GROUP_get0_order GRPC_SHADOW_EC_GROUP_get0_order -#define EC_GROUP_get_cofactor GRPC_SHADOW_EC_GROUP_get_cofactor -#define EC_GROUP_get_curve_GFp GRPC_SHADOW_EC_GROUP_get_curve_GFp -#define EC_GROUP_get_curve_name GRPC_SHADOW_EC_GROUP_get_curve_name -#define EC_GROUP_get_degree GRPC_SHADOW_EC_GROUP_get_degree -#define EC_GROUP_get_order GRPC_SHADOW_EC_GROUP_get_order -#define EC_GROUP_method_of GRPC_SHADOW_EC_GROUP_method_of -#define EC_GROUP_new_by_curve_name GRPC_SHADOW_EC_GROUP_new_by_curve_name -#define EC_GROUP_new_curve_GFp GRPC_SHADOW_EC_GROUP_new_curve_GFp -#define EC_GROUP_order_bits GRPC_SHADOW_EC_GROUP_order_bits -#define EC_GROUP_set_asn1_flag GRPC_SHADOW_EC_GROUP_set_asn1_flag -#define EC_GROUP_set_generator GRPC_SHADOW_EC_GROUP_set_generator -#define EC_GROUP_set_point_conversion_form GRPC_SHADOW_EC_GROUP_set_point_conversion_form -#define EC_KEY_check_fips GRPC_SHADOW_EC_KEY_check_fips -#define EC_KEY_check_key GRPC_SHADOW_EC_KEY_check_key -#define EC_KEY_derive_from_secret GRPC_SHADOW_EC_KEY_derive_from_secret -#define EC_KEY_dup GRPC_SHADOW_EC_KEY_dup -#define EC_KEY_free GRPC_SHADOW_EC_KEY_free -#define EC_KEY_generate_key GRPC_SHADOW_EC_KEY_generate_key -#define EC_KEY_generate_key_fips GRPC_SHADOW_EC_KEY_generate_key_fips -#define EC_KEY_get0_group GRPC_SHADOW_EC_KEY_get0_group -#define EC_KEY_get0_private_key GRPC_SHADOW_EC_KEY_get0_private_key -#define EC_KEY_get0_public_key GRPC_SHADOW_EC_KEY_get0_public_key -#define EC_KEY_get_conv_form GRPC_SHADOW_EC_KEY_get_conv_form -#define EC_KEY_get_enc_flags GRPC_SHADOW_EC_KEY_get_enc_flags -#define EC_KEY_get_ex_data GRPC_SHADOW_EC_KEY_get_ex_data -#define EC_KEY_get_ex_new_index GRPC_SHADOW_EC_KEY_get_ex_new_index -#define EC_KEY_is_opaque GRPC_SHADOW_EC_KEY_is_opaque -#define EC_KEY_key2buf GRPC_SHADOW_EC_KEY_key2buf -#define EC_KEY_marshal_curve_name GRPC_SHADOW_EC_KEY_marshal_curve_name -#define EC_KEY_marshal_private_key GRPC_SHADOW_EC_KEY_marshal_private_key -#define EC_KEY_new GRPC_SHADOW_EC_KEY_new -#define EC_KEY_new_by_curve_name GRPC_SHADOW_EC_KEY_new_by_curve_name -#define EC_KEY_new_method GRPC_SHADOW_EC_KEY_new_method -#define EC_KEY_parse_curve_name GRPC_SHADOW_EC_KEY_parse_curve_name -#define EC_KEY_parse_parameters GRPC_SHADOW_EC_KEY_parse_parameters -#define EC_KEY_parse_private_key GRPC_SHADOW_EC_KEY_parse_private_key -#define EC_KEY_set_asn1_flag GRPC_SHADOW_EC_KEY_set_asn1_flag -#define EC_KEY_set_conv_form GRPC_SHADOW_EC_KEY_set_conv_form -#define EC_KEY_set_enc_flags GRPC_SHADOW_EC_KEY_set_enc_flags -#define EC_KEY_set_ex_data GRPC_SHADOW_EC_KEY_set_ex_data -#define EC_KEY_set_group GRPC_SHADOW_EC_KEY_set_group -#define EC_KEY_set_private_key GRPC_SHADOW_EC_KEY_set_private_key -#define EC_KEY_set_public_key GRPC_SHADOW_EC_KEY_set_public_key -#define EC_KEY_set_public_key_affine_coordinates GRPC_SHADOW_EC_KEY_set_public_key_affine_coordinates -#define EC_KEY_up_ref GRPC_SHADOW_EC_KEY_up_ref -#define EC_METHOD_get_field_type GRPC_SHADOW_EC_METHOD_get_field_type -#define EC_POINT_add GRPC_SHADOW_EC_POINT_add -#define EC_POINT_clear_free GRPC_SHADOW_EC_POINT_clear_free -#define EC_POINT_cmp GRPC_SHADOW_EC_POINT_cmp -#define EC_POINT_copy GRPC_SHADOW_EC_POINT_copy -#define EC_POINT_dbl GRPC_SHADOW_EC_POINT_dbl -#define EC_POINT_dup GRPC_SHADOW_EC_POINT_dup -#define EC_POINT_free GRPC_SHADOW_EC_POINT_free -#define EC_POINT_get_affine_coordinates_GFp GRPC_SHADOW_EC_POINT_get_affine_coordinates_GFp -#define EC_POINT_invert GRPC_SHADOW_EC_POINT_invert -#define EC_POINT_is_at_infinity GRPC_SHADOW_EC_POINT_is_at_infinity -#define EC_POINT_is_on_curve GRPC_SHADOW_EC_POINT_is_on_curve -#define EC_POINT_mul GRPC_SHADOW_EC_POINT_mul -#define EC_POINT_new GRPC_SHADOW_EC_POINT_new -#define EC_POINT_oct2point GRPC_SHADOW_EC_POINT_oct2point -#define EC_POINT_point2cbb GRPC_SHADOW_EC_POINT_point2cbb -#define EC_POINT_point2oct GRPC_SHADOW_EC_POINT_point2oct -#define EC_POINT_set_affine_coordinates_GFp GRPC_SHADOW_EC_POINT_set_affine_coordinates_GFp -#define EC_POINT_set_compressed_coordinates_GFp GRPC_SHADOW_EC_POINT_set_compressed_coordinates_GFp -#define EC_POINT_set_to_infinity GRPC_SHADOW_EC_POINT_set_to_infinity -#define EC_curve_nid2nist GRPC_SHADOW_EC_curve_nid2nist -#define EC_curve_nist2nid GRPC_SHADOW_EC_curve_nist2nid -#define EC_get_builtin_curves GRPC_SHADOW_EC_get_builtin_curves -#define ED25519_keypair GRPC_SHADOW_ED25519_keypair -#define ED25519_keypair_from_seed GRPC_SHADOW_ED25519_keypair_from_seed -#define ED25519_sign GRPC_SHADOW_ED25519_sign -#define ED25519_verify GRPC_SHADOW_ED25519_verify -#define EDIPARTYNAME_free GRPC_SHADOW_EDIPARTYNAME_free -#define EDIPARTYNAME_it GRPC_SHADOW_EDIPARTYNAME_it -#define EDIPARTYNAME_new GRPC_SHADOW_EDIPARTYNAME_new -#define ENGINE_free GRPC_SHADOW_ENGINE_free -#define ENGINE_get_ECDSA_method GRPC_SHADOW_ENGINE_get_ECDSA_method -#define ENGINE_get_RSA_method GRPC_SHADOW_ENGINE_get_RSA_method -#define ENGINE_load_builtin_engines GRPC_SHADOW_ENGINE_load_builtin_engines -#define ENGINE_new GRPC_SHADOW_ENGINE_new -#define ENGINE_register_all_complete GRPC_SHADOW_ENGINE_register_all_complete -#define ENGINE_set_ECDSA_method GRPC_SHADOW_ENGINE_set_ECDSA_method -#define ENGINE_set_RSA_method GRPC_SHADOW_ENGINE_set_RSA_method -#define ERR_SAVE_STATE_free GRPC_SHADOW_ERR_SAVE_STATE_free -#define ERR_add_error_data GRPC_SHADOW_ERR_add_error_data -#define ERR_add_error_dataf GRPC_SHADOW_ERR_add_error_dataf -#define ERR_clear_error GRPC_SHADOW_ERR_clear_error -#define ERR_clear_system_error GRPC_SHADOW_ERR_clear_system_error -#define ERR_error_string GRPC_SHADOW_ERR_error_string -#define ERR_error_string_n GRPC_SHADOW_ERR_error_string_n -#define ERR_free_strings GRPC_SHADOW_ERR_free_strings -#define ERR_func_error_string GRPC_SHADOW_ERR_func_error_string -#define ERR_get_error GRPC_SHADOW_ERR_get_error -#define ERR_get_error_line GRPC_SHADOW_ERR_get_error_line -#define ERR_get_error_line_data GRPC_SHADOW_ERR_get_error_line_data -#define ERR_get_next_error_library GRPC_SHADOW_ERR_get_next_error_library -#define ERR_lib_error_string GRPC_SHADOW_ERR_lib_error_string -#define ERR_load_BIO_strings GRPC_SHADOW_ERR_load_BIO_strings -#define ERR_load_ERR_strings GRPC_SHADOW_ERR_load_ERR_strings -#define ERR_load_RAND_strings GRPC_SHADOW_ERR_load_RAND_strings -#define ERR_load_SSL_strings GRPC_SHADOW_ERR_load_SSL_strings -#define ERR_load_crypto_strings GRPC_SHADOW_ERR_load_crypto_strings -#define ERR_peek_error GRPC_SHADOW_ERR_peek_error -#define ERR_peek_error_line GRPC_SHADOW_ERR_peek_error_line -#define ERR_peek_error_line_data GRPC_SHADOW_ERR_peek_error_line_data -#define ERR_peek_last_error GRPC_SHADOW_ERR_peek_last_error -#define ERR_peek_last_error_line GRPC_SHADOW_ERR_peek_last_error_line -#define ERR_peek_last_error_line_data GRPC_SHADOW_ERR_peek_last_error_line_data -#define ERR_pop_to_mark GRPC_SHADOW_ERR_pop_to_mark -#define ERR_print_errors GRPC_SHADOW_ERR_print_errors -#define ERR_print_errors_cb GRPC_SHADOW_ERR_print_errors_cb -#define ERR_print_errors_fp GRPC_SHADOW_ERR_print_errors_fp -#define ERR_put_error GRPC_SHADOW_ERR_put_error -#define ERR_reason_error_string GRPC_SHADOW_ERR_reason_error_string -#define ERR_remove_state GRPC_SHADOW_ERR_remove_state -#define ERR_remove_thread_state GRPC_SHADOW_ERR_remove_thread_state -#define ERR_restore_state GRPC_SHADOW_ERR_restore_state -#define ERR_save_state GRPC_SHADOW_ERR_save_state -#define ERR_set_mark GRPC_SHADOW_ERR_set_mark -#define EVP_AEAD_CTX_aead GRPC_SHADOW_EVP_AEAD_CTX_aead -#define EVP_AEAD_CTX_cleanup GRPC_SHADOW_EVP_AEAD_CTX_cleanup -#define EVP_AEAD_CTX_free GRPC_SHADOW_EVP_AEAD_CTX_free -#define EVP_AEAD_CTX_get_iv GRPC_SHADOW_EVP_AEAD_CTX_get_iv -#define EVP_AEAD_CTX_init GRPC_SHADOW_EVP_AEAD_CTX_init -#define EVP_AEAD_CTX_init_with_direction GRPC_SHADOW_EVP_AEAD_CTX_init_with_direction -#define EVP_AEAD_CTX_new GRPC_SHADOW_EVP_AEAD_CTX_new -#define EVP_AEAD_CTX_open GRPC_SHADOW_EVP_AEAD_CTX_open -#define EVP_AEAD_CTX_open_gather GRPC_SHADOW_EVP_AEAD_CTX_open_gather -#define EVP_AEAD_CTX_seal GRPC_SHADOW_EVP_AEAD_CTX_seal -#define EVP_AEAD_CTX_seal_scatter GRPC_SHADOW_EVP_AEAD_CTX_seal_scatter -#define EVP_AEAD_CTX_tag_len GRPC_SHADOW_EVP_AEAD_CTX_tag_len -#define EVP_AEAD_CTX_zero GRPC_SHADOW_EVP_AEAD_CTX_zero -#define EVP_AEAD_key_length GRPC_SHADOW_EVP_AEAD_key_length -#define EVP_AEAD_max_overhead GRPC_SHADOW_EVP_AEAD_max_overhead -#define EVP_AEAD_max_tag_len GRPC_SHADOW_EVP_AEAD_max_tag_len -#define EVP_AEAD_nonce_length GRPC_SHADOW_EVP_AEAD_nonce_length -#define EVP_BytesToKey GRPC_SHADOW_EVP_BytesToKey -#define EVP_CIPHER_CTX_block_size GRPC_SHADOW_EVP_CIPHER_CTX_block_size -#define EVP_CIPHER_CTX_cipher GRPC_SHADOW_EVP_CIPHER_CTX_cipher -#define EVP_CIPHER_CTX_cleanup GRPC_SHADOW_EVP_CIPHER_CTX_cleanup -#define EVP_CIPHER_CTX_copy GRPC_SHADOW_EVP_CIPHER_CTX_copy -#define EVP_CIPHER_CTX_ctrl GRPC_SHADOW_EVP_CIPHER_CTX_ctrl -#define EVP_CIPHER_CTX_encrypting GRPC_SHADOW_EVP_CIPHER_CTX_encrypting -#define EVP_CIPHER_CTX_flags GRPC_SHADOW_EVP_CIPHER_CTX_flags -#define EVP_CIPHER_CTX_free GRPC_SHADOW_EVP_CIPHER_CTX_free -#define EVP_CIPHER_CTX_get_app_data GRPC_SHADOW_EVP_CIPHER_CTX_get_app_data -#define EVP_CIPHER_CTX_init GRPC_SHADOW_EVP_CIPHER_CTX_init -#define EVP_CIPHER_CTX_iv_length GRPC_SHADOW_EVP_CIPHER_CTX_iv_length -#define EVP_CIPHER_CTX_key_length GRPC_SHADOW_EVP_CIPHER_CTX_key_length -#define EVP_CIPHER_CTX_mode GRPC_SHADOW_EVP_CIPHER_CTX_mode -#define EVP_CIPHER_CTX_new GRPC_SHADOW_EVP_CIPHER_CTX_new -#define EVP_CIPHER_CTX_nid GRPC_SHADOW_EVP_CIPHER_CTX_nid -#define EVP_CIPHER_CTX_reset GRPC_SHADOW_EVP_CIPHER_CTX_reset -#define EVP_CIPHER_CTX_set_app_data GRPC_SHADOW_EVP_CIPHER_CTX_set_app_data -#define EVP_CIPHER_CTX_set_flags GRPC_SHADOW_EVP_CIPHER_CTX_set_flags -#define EVP_CIPHER_CTX_set_key_length GRPC_SHADOW_EVP_CIPHER_CTX_set_key_length -#define EVP_CIPHER_CTX_set_padding GRPC_SHADOW_EVP_CIPHER_CTX_set_padding -#define EVP_CIPHER_block_size GRPC_SHADOW_EVP_CIPHER_block_size -#define EVP_CIPHER_flags GRPC_SHADOW_EVP_CIPHER_flags -#define EVP_CIPHER_iv_length GRPC_SHADOW_EVP_CIPHER_iv_length -#define EVP_CIPHER_key_length GRPC_SHADOW_EVP_CIPHER_key_length -#define EVP_CIPHER_mode GRPC_SHADOW_EVP_CIPHER_mode -#define EVP_CIPHER_nid GRPC_SHADOW_EVP_CIPHER_nid -#define EVP_Cipher GRPC_SHADOW_EVP_Cipher -#define EVP_CipherFinal_ex GRPC_SHADOW_EVP_CipherFinal_ex -#define EVP_CipherInit GRPC_SHADOW_EVP_CipherInit -#define EVP_CipherInit_ex GRPC_SHADOW_EVP_CipherInit_ex -#define EVP_CipherUpdate GRPC_SHADOW_EVP_CipherUpdate -#define EVP_DecodeBase64 GRPC_SHADOW_EVP_DecodeBase64 -#define EVP_DecodeBlock GRPC_SHADOW_EVP_DecodeBlock -#define EVP_DecodeFinal GRPC_SHADOW_EVP_DecodeFinal -#define EVP_DecodeInit GRPC_SHADOW_EVP_DecodeInit -#define EVP_DecodeUpdate GRPC_SHADOW_EVP_DecodeUpdate -#define EVP_DecodedLength GRPC_SHADOW_EVP_DecodedLength -#define EVP_DecryptFinal_ex GRPC_SHADOW_EVP_DecryptFinal_ex -#define EVP_DecryptInit GRPC_SHADOW_EVP_DecryptInit -#define EVP_DecryptInit_ex GRPC_SHADOW_EVP_DecryptInit_ex -#define EVP_DecryptUpdate GRPC_SHADOW_EVP_DecryptUpdate -#define EVP_Digest GRPC_SHADOW_EVP_Digest -#define EVP_DigestFinal GRPC_SHADOW_EVP_DigestFinal -#define EVP_DigestFinalXOF GRPC_SHADOW_EVP_DigestFinalXOF -#define EVP_DigestFinal_ex GRPC_SHADOW_EVP_DigestFinal_ex -#define EVP_DigestInit GRPC_SHADOW_EVP_DigestInit -#define EVP_DigestInit_ex GRPC_SHADOW_EVP_DigestInit_ex -#define EVP_DigestSign GRPC_SHADOW_EVP_DigestSign -#define EVP_DigestSignFinal GRPC_SHADOW_EVP_DigestSignFinal -#define EVP_DigestSignInit GRPC_SHADOW_EVP_DigestSignInit -#define EVP_DigestSignUpdate GRPC_SHADOW_EVP_DigestSignUpdate -#define EVP_DigestUpdate GRPC_SHADOW_EVP_DigestUpdate -#define EVP_DigestVerify GRPC_SHADOW_EVP_DigestVerify -#define EVP_DigestVerifyFinal GRPC_SHADOW_EVP_DigestVerifyFinal -#define EVP_DigestVerifyInit GRPC_SHADOW_EVP_DigestVerifyInit -#define EVP_DigestVerifyUpdate GRPC_SHADOW_EVP_DigestVerifyUpdate -#define EVP_EncodeBlock GRPC_SHADOW_EVP_EncodeBlock -#define EVP_EncodeFinal GRPC_SHADOW_EVP_EncodeFinal -#define EVP_EncodeInit GRPC_SHADOW_EVP_EncodeInit -#define EVP_EncodeUpdate GRPC_SHADOW_EVP_EncodeUpdate -#define EVP_EncodedLength GRPC_SHADOW_EVP_EncodedLength -#define EVP_EncryptFinal_ex GRPC_SHADOW_EVP_EncryptFinal_ex -#define EVP_EncryptInit GRPC_SHADOW_EVP_EncryptInit -#define EVP_EncryptInit_ex GRPC_SHADOW_EVP_EncryptInit_ex -#define EVP_EncryptUpdate GRPC_SHADOW_EVP_EncryptUpdate -#define EVP_MD_CTX_block_size GRPC_SHADOW_EVP_MD_CTX_block_size -#define EVP_MD_CTX_cleanup GRPC_SHADOW_EVP_MD_CTX_cleanup -#define EVP_MD_CTX_copy GRPC_SHADOW_EVP_MD_CTX_copy -#define EVP_MD_CTX_copy_ex GRPC_SHADOW_EVP_MD_CTX_copy_ex -#define EVP_MD_CTX_create GRPC_SHADOW_EVP_MD_CTX_create -#define EVP_MD_CTX_destroy GRPC_SHADOW_EVP_MD_CTX_destroy -#define EVP_MD_CTX_free GRPC_SHADOW_EVP_MD_CTX_free -#define EVP_MD_CTX_init GRPC_SHADOW_EVP_MD_CTX_init -#define EVP_MD_CTX_md GRPC_SHADOW_EVP_MD_CTX_md -#define EVP_MD_CTX_new GRPC_SHADOW_EVP_MD_CTX_new -#define EVP_MD_CTX_reset GRPC_SHADOW_EVP_MD_CTX_reset -#define EVP_MD_CTX_size GRPC_SHADOW_EVP_MD_CTX_size -#define EVP_MD_CTX_type GRPC_SHADOW_EVP_MD_CTX_type -#define EVP_MD_block_size GRPC_SHADOW_EVP_MD_block_size -#define EVP_MD_flags GRPC_SHADOW_EVP_MD_flags -#define EVP_MD_meth_get_flags GRPC_SHADOW_EVP_MD_meth_get_flags -#define EVP_MD_size GRPC_SHADOW_EVP_MD_size -#define EVP_MD_type GRPC_SHADOW_EVP_MD_type -#define EVP_PBE_scrypt GRPC_SHADOW_EVP_PBE_scrypt -#define EVP_PKCS82PKEY GRPC_SHADOW_EVP_PKCS82PKEY -#define EVP_PKEY2PKCS8 GRPC_SHADOW_EVP_PKEY2PKCS8 -#define EVP_PKEY_CTX_ctrl GRPC_SHADOW_EVP_PKEY_CTX_ctrl -#define EVP_PKEY_CTX_dup GRPC_SHADOW_EVP_PKEY_CTX_dup -#define EVP_PKEY_CTX_free GRPC_SHADOW_EVP_PKEY_CTX_free -#define EVP_PKEY_CTX_get0_pkey GRPC_SHADOW_EVP_PKEY_CTX_get0_pkey -#define EVP_PKEY_CTX_get0_rsa_oaep_label GRPC_SHADOW_EVP_PKEY_CTX_get0_rsa_oaep_label -#define EVP_PKEY_CTX_get_rsa_mgf1_md GRPC_SHADOW_EVP_PKEY_CTX_get_rsa_mgf1_md -#define EVP_PKEY_CTX_get_rsa_oaep_md GRPC_SHADOW_EVP_PKEY_CTX_get_rsa_oaep_md -#define EVP_PKEY_CTX_get_rsa_padding GRPC_SHADOW_EVP_PKEY_CTX_get_rsa_padding -#define EVP_PKEY_CTX_get_rsa_pss_saltlen GRPC_SHADOW_EVP_PKEY_CTX_get_rsa_pss_saltlen -#define EVP_PKEY_CTX_get_signature_md GRPC_SHADOW_EVP_PKEY_CTX_get_signature_md -#define EVP_PKEY_CTX_new GRPC_SHADOW_EVP_PKEY_CTX_new -#define EVP_PKEY_CTX_new_id GRPC_SHADOW_EVP_PKEY_CTX_new_id -#define EVP_PKEY_CTX_set0_rsa_oaep_label GRPC_SHADOW_EVP_PKEY_CTX_set0_rsa_oaep_label -#define EVP_PKEY_CTX_set_ec_param_enc GRPC_SHADOW_EVP_PKEY_CTX_set_ec_param_enc -#define EVP_PKEY_CTX_set_ec_paramgen_curve_nid GRPC_SHADOW_EVP_PKEY_CTX_set_ec_paramgen_curve_nid -#define EVP_PKEY_CTX_set_rsa_keygen_bits GRPC_SHADOW_EVP_PKEY_CTX_set_rsa_keygen_bits -#define EVP_PKEY_CTX_set_rsa_keygen_pubexp GRPC_SHADOW_EVP_PKEY_CTX_set_rsa_keygen_pubexp -#define EVP_PKEY_CTX_set_rsa_mgf1_md GRPC_SHADOW_EVP_PKEY_CTX_set_rsa_mgf1_md -#define EVP_PKEY_CTX_set_rsa_oaep_md GRPC_SHADOW_EVP_PKEY_CTX_set_rsa_oaep_md -#define EVP_PKEY_CTX_set_rsa_padding GRPC_SHADOW_EVP_PKEY_CTX_set_rsa_padding -#define EVP_PKEY_CTX_set_rsa_pss_saltlen GRPC_SHADOW_EVP_PKEY_CTX_set_rsa_pss_saltlen -#define EVP_PKEY_CTX_set_signature_md GRPC_SHADOW_EVP_PKEY_CTX_set_signature_md -#define EVP_PKEY_assign GRPC_SHADOW_EVP_PKEY_assign -#define EVP_PKEY_assign_DSA GRPC_SHADOW_EVP_PKEY_assign_DSA -#define EVP_PKEY_assign_EC_KEY GRPC_SHADOW_EVP_PKEY_assign_EC_KEY -#define EVP_PKEY_assign_RSA GRPC_SHADOW_EVP_PKEY_assign_RSA -#define EVP_PKEY_base_id GRPC_SHADOW_EVP_PKEY_base_id -#define EVP_PKEY_bits GRPC_SHADOW_EVP_PKEY_bits -#define EVP_PKEY_cmp GRPC_SHADOW_EVP_PKEY_cmp -#define EVP_PKEY_cmp_parameters GRPC_SHADOW_EVP_PKEY_cmp_parameters -#define EVP_PKEY_copy_parameters GRPC_SHADOW_EVP_PKEY_copy_parameters -#define EVP_PKEY_decrypt GRPC_SHADOW_EVP_PKEY_decrypt -#define EVP_PKEY_decrypt_init GRPC_SHADOW_EVP_PKEY_decrypt_init -#define EVP_PKEY_derive GRPC_SHADOW_EVP_PKEY_derive -#define EVP_PKEY_derive_init GRPC_SHADOW_EVP_PKEY_derive_init -#define EVP_PKEY_derive_set_peer GRPC_SHADOW_EVP_PKEY_derive_set_peer -#define EVP_PKEY_encrypt GRPC_SHADOW_EVP_PKEY_encrypt -#define EVP_PKEY_encrypt_init GRPC_SHADOW_EVP_PKEY_encrypt_init -#define EVP_PKEY_free GRPC_SHADOW_EVP_PKEY_free -#define EVP_PKEY_get0_DH GRPC_SHADOW_EVP_PKEY_get0_DH -#define EVP_PKEY_get0_DSA GRPC_SHADOW_EVP_PKEY_get0_DSA -#define EVP_PKEY_get0_EC_KEY GRPC_SHADOW_EVP_PKEY_get0_EC_KEY -#define EVP_PKEY_get0_RSA GRPC_SHADOW_EVP_PKEY_get0_RSA -#define EVP_PKEY_get1_DH GRPC_SHADOW_EVP_PKEY_get1_DH -#define EVP_PKEY_get1_DSA GRPC_SHADOW_EVP_PKEY_get1_DSA -#define EVP_PKEY_get1_EC_KEY GRPC_SHADOW_EVP_PKEY_get1_EC_KEY -#define EVP_PKEY_get1_RSA GRPC_SHADOW_EVP_PKEY_get1_RSA -#define EVP_PKEY_get1_tls_encodedpoint GRPC_SHADOW_EVP_PKEY_get1_tls_encodedpoint -#define EVP_PKEY_get_raw_private_key GRPC_SHADOW_EVP_PKEY_get_raw_private_key -#define EVP_PKEY_get_raw_public_key GRPC_SHADOW_EVP_PKEY_get_raw_public_key -#define EVP_PKEY_id GRPC_SHADOW_EVP_PKEY_id -#define EVP_PKEY_is_opaque GRPC_SHADOW_EVP_PKEY_is_opaque -#define EVP_PKEY_keygen GRPC_SHADOW_EVP_PKEY_keygen -#define EVP_PKEY_keygen_init GRPC_SHADOW_EVP_PKEY_keygen_init -#define EVP_PKEY_missing_parameters GRPC_SHADOW_EVP_PKEY_missing_parameters -#define EVP_PKEY_new GRPC_SHADOW_EVP_PKEY_new -#define EVP_PKEY_new_raw_private_key GRPC_SHADOW_EVP_PKEY_new_raw_private_key -#define EVP_PKEY_new_raw_public_key GRPC_SHADOW_EVP_PKEY_new_raw_public_key -#define EVP_PKEY_paramgen GRPC_SHADOW_EVP_PKEY_paramgen -#define EVP_PKEY_paramgen_init GRPC_SHADOW_EVP_PKEY_paramgen_init -#define EVP_PKEY_print_params GRPC_SHADOW_EVP_PKEY_print_params -#define EVP_PKEY_print_private GRPC_SHADOW_EVP_PKEY_print_private -#define EVP_PKEY_print_public GRPC_SHADOW_EVP_PKEY_print_public -#define EVP_PKEY_set1_DSA GRPC_SHADOW_EVP_PKEY_set1_DSA -#define EVP_PKEY_set1_EC_KEY GRPC_SHADOW_EVP_PKEY_set1_EC_KEY -#define EVP_PKEY_set1_RSA GRPC_SHADOW_EVP_PKEY_set1_RSA -#define EVP_PKEY_set1_tls_encodedpoint GRPC_SHADOW_EVP_PKEY_set1_tls_encodedpoint -#define EVP_PKEY_set_type GRPC_SHADOW_EVP_PKEY_set_type -#define EVP_PKEY_sign GRPC_SHADOW_EVP_PKEY_sign -#define EVP_PKEY_sign_init GRPC_SHADOW_EVP_PKEY_sign_init -#define EVP_PKEY_size GRPC_SHADOW_EVP_PKEY_size -#define EVP_PKEY_type GRPC_SHADOW_EVP_PKEY_type -#define EVP_PKEY_up_ref GRPC_SHADOW_EVP_PKEY_up_ref -#define EVP_PKEY_verify GRPC_SHADOW_EVP_PKEY_verify -#define EVP_PKEY_verify_init GRPC_SHADOW_EVP_PKEY_verify_init -#define EVP_PKEY_verify_recover GRPC_SHADOW_EVP_PKEY_verify_recover -#define EVP_PKEY_verify_recover_init GRPC_SHADOW_EVP_PKEY_verify_recover_init -#define EVP_SignFinal GRPC_SHADOW_EVP_SignFinal -#define EVP_SignInit GRPC_SHADOW_EVP_SignInit -#define EVP_SignInit_ex GRPC_SHADOW_EVP_SignInit_ex -#define EVP_SignUpdate GRPC_SHADOW_EVP_SignUpdate -#define EVP_VerifyFinal GRPC_SHADOW_EVP_VerifyFinal -#define EVP_VerifyInit GRPC_SHADOW_EVP_VerifyInit -#define EVP_VerifyInit_ex GRPC_SHADOW_EVP_VerifyInit_ex -#define EVP_VerifyUpdate GRPC_SHADOW_EVP_VerifyUpdate -#define EVP_add_cipher_alias GRPC_SHADOW_EVP_add_cipher_alias -#define EVP_add_digest GRPC_SHADOW_EVP_add_digest -#define EVP_aead_aes_128_cbc_sha1_tls GRPC_SHADOW_EVP_aead_aes_128_cbc_sha1_tls -#define EVP_aead_aes_128_cbc_sha1_tls_implicit_iv GRPC_SHADOW_EVP_aead_aes_128_cbc_sha1_tls_implicit_iv -#define EVP_aead_aes_128_cbc_sha256_tls GRPC_SHADOW_EVP_aead_aes_128_cbc_sha256_tls -#define EVP_aead_aes_128_ccm_bluetooth GRPC_SHADOW_EVP_aead_aes_128_ccm_bluetooth -#define EVP_aead_aes_128_ccm_bluetooth_8 GRPC_SHADOW_EVP_aead_aes_128_ccm_bluetooth_8 -#define EVP_aead_aes_128_ctr_hmac_sha256 GRPC_SHADOW_EVP_aead_aes_128_ctr_hmac_sha256 -#define EVP_aead_aes_128_gcm GRPC_SHADOW_EVP_aead_aes_128_gcm -#define EVP_aead_aes_128_gcm_siv GRPC_SHADOW_EVP_aead_aes_128_gcm_siv -#define EVP_aead_aes_128_gcm_tls12 GRPC_SHADOW_EVP_aead_aes_128_gcm_tls12 -#define EVP_aead_aes_128_gcm_tls13 GRPC_SHADOW_EVP_aead_aes_128_gcm_tls13 -#define EVP_aead_aes_192_gcm GRPC_SHADOW_EVP_aead_aes_192_gcm -#define EVP_aead_aes_256_cbc_sha1_tls GRPC_SHADOW_EVP_aead_aes_256_cbc_sha1_tls -#define EVP_aead_aes_256_cbc_sha1_tls_implicit_iv GRPC_SHADOW_EVP_aead_aes_256_cbc_sha1_tls_implicit_iv -#define EVP_aead_aes_256_cbc_sha256_tls GRPC_SHADOW_EVP_aead_aes_256_cbc_sha256_tls -#define EVP_aead_aes_256_cbc_sha384_tls GRPC_SHADOW_EVP_aead_aes_256_cbc_sha384_tls -#define EVP_aead_aes_256_ctr_hmac_sha256 GRPC_SHADOW_EVP_aead_aes_256_ctr_hmac_sha256 -#define EVP_aead_aes_256_gcm GRPC_SHADOW_EVP_aead_aes_256_gcm -#define EVP_aead_aes_256_gcm_siv GRPC_SHADOW_EVP_aead_aes_256_gcm_siv -#define EVP_aead_aes_256_gcm_tls12 GRPC_SHADOW_EVP_aead_aes_256_gcm_tls12 -#define EVP_aead_aes_256_gcm_tls13 GRPC_SHADOW_EVP_aead_aes_256_gcm_tls13 -#define EVP_aead_chacha20_poly1305 GRPC_SHADOW_EVP_aead_chacha20_poly1305 -#define EVP_aead_des_ede3_cbc_sha1_tls GRPC_SHADOW_EVP_aead_des_ede3_cbc_sha1_tls -#define EVP_aead_des_ede3_cbc_sha1_tls_implicit_iv GRPC_SHADOW_EVP_aead_des_ede3_cbc_sha1_tls_implicit_iv -#define EVP_aead_null_sha1_tls GRPC_SHADOW_EVP_aead_null_sha1_tls -#define EVP_aead_xchacha20_poly1305 GRPC_SHADOW_EVP_aead_xchacha20_poly1305 -#define EVP_aes_128_cbc GRPC_SHADOW_EVP_aes_128_cbc -#define EVP_aes_128_ctr GRPC_SHADOW_EVP_aes_128_ctr -#define EVP_aes_128_ecb GRPC_SHADOW_EVP_aes_128_ecb -#define EVP_aes_128_gcm GRPC_SHADOW_EVP_aes_128_gcm -#define EVP_aes_128_ofb GRPC_SHADOW_EVP_aes_128_ofb -#define EVP_aes_192_cbc GRPC_SHADOW_EVP_aes_192_cbc -#define EVP_aes_192_ctr GRPC_SHADOW_EVP_aes_192_ctr -#define EVP_aes_192_ecb GRPC_SHADOW_EVP_aes_192_ecb -#define EVP_aes_192_gcm GRPC_SHADOW_EVP_aes_192_gcm -#define EVP_aes_192_ofb GRPC_SHADOW_EVP_aes_192_ofb -#define EVP_aes_256_cbc GRPC_SHADOW_EVP_aes_256_cbc -#define EVP_aes_256_ctr GRPC_SHADOW_EVP_aes_256_ctr -#define EVP_aes_256_ecb GRPC_SHADOW_EVP_aes_256_ecb -#define EVP_aes_256_gcm GRPC_SHADOW_EVP_aes_256_gcm -#define EVP_aes_256_ofb GRPC_SHADOW_EVP_aes_256_ofb -#define EVP_cleanup GRPC_SHADOW_EVP_cleanup -#define EVP_des_cbc GRPC_SHADOW_EVP_des_cbc -#define EVP_des_ecb GRPC_SHADOW_EVP_des_ecb -#define EVP_des_ede GRPC_SHADOW_EVP_des_ede -#define EVP_des_ede3 GRPC_SHADOW_EVP_des_ede3 -#define EVP_des_ede3_cbc GRPC_SHADOW_EVP_des_ede3_cbc -#define EVP_des_ede3_ecb GRPC_SHADOW_EVP_des_ede3_ecb -#define EVP_des_ede_cbc GRPC_SHADOW_EVP_des_ede_cbc -#define EVP_enc_null GRPC_SHADOW_EVP_enc_null -#define EVP_get_cipherbyname GRPC_SHADOW_EVP_get_cipherbyname -#define EVP_get_cipherbynid GRPC_SHADOW_EVP_get_cipherbynid -#define EVP_get_digestbyname GRPC_SHADOW_EVP_get_digestbyname -#define EVP_get_digestbynid GRPC_SHADOW_EVP_get_digestbynid -#define EVP_get_digestbyobj GRPC_SHADOW_EVP_get_digestbyobj -#define EVP_has_aes_hardware GRPC_SHADOW_EVP_has_aes_hardware -#define EVP_marshal_digest_algorithm GRPC_SHADOW_EVP_marshal_digest_algorithm -#define EVP_marshal_private_key GRPC_SHADOW_EVP_marshal_private_key -#define EVP_marshal_public_key GRPC_SHADOW_EVP_marshal_public_key -#define EVP_md4 GRPC_SHADOW_EVP_md4 -#define EVP_md5 GRPC_SHADOW_EVP_md5 -#define EVP_md5_sha1 GRPC_SHADOW_EVP_md5_sha1 -#define EVP_parse_digest_algorithm GRPC_SHADOW_EVP_parse_digest_algorithm -#define EVP_parse_private_key GRPC_SHADOW_EVP_parse_private_key -#define EVP_parse_public_key GRPC_SHADOW_EVP_parse_public_key -#define EVP_rc2_40_cbc GRPC_SHADOW_EVP_rc2_40_cbc -#define EVP_rc2_cbc GRPC_SHADOW_EVP_rc2_cbc -#define EVP_rc4 GRPC_SHADOW_EVP_rc4 -#define EVP_sha1 GRPC_SHADOW_EVP_sha1 -#define EVP_sha224 GRPC_SHADOW_EVP_sha224 -#define EVP_sha256 GRPC_SHADOW_EVP_sha256 -#define EVP_sha384 GRPC_SHADOW_EVP_sha384 -#define EVP_sha512 GRPC_SHADOW_EVP_sha512 -#define EVP_tls_cbc_copy_mac GRPC_SHADOW_EVP_tls_cbc_copy_mac -#define EVP_tls_cbc_digest_record GRPC_SHADOW_EVP_tls_cbc_digest_record -#define EVP_tls_cbc_record_digest_supported GRPC_SHADOW_EVP_tls_cbc_record_digest_supported -#define EVP_tls_cbc_remove_padding GRPC_SHADOW_EVP_tls_cbc_remove_padding -#define EXTENDED_KEY_USAGE_free GRPC_SHADOW_EXTENDED_KEY_USAGE_free -#define EXTENDED_KEY_USAGE_it GRPC_SHADOW_EXTENDED_KEY_USAGE_it -#define EXTENDED_KEY_USAGE_new GRPC_SHADOW_EXTENDED_KEY_USAGE_new -#define FIPS_mode GRPC_SHADOW_FIPS_mode -#define FIPS_mode_set GRPC_SHADOW_FIPS_mode_set -#define GENERAL_NAMES_free GRPC_SHADOW_GENERAL_NAMES_free -#define GENERAL_NAMES_it GRPC_SHADOW_GENERAL_NAMES_it -#define GENERAL_NAMES_new GRPC_SHADOW_GENERAL_NAMES_new -#define GENERAL_NAME_cmp GRPC_SHADOW_GENERAL_NAME_cmp -#define GENERAL_NAME_dup GRPC_SHADOW_GENERAL_NAME_dup -#define GENERAL_NAME_free GRPC_SHADOW_GENERAL_NAME_free -#define GENERAL_NAME_get0_otherName GRPC_SHADOW_GENERAL_NAME_get0_otherName -#define GENERAL_NAME_get0_value GRPC_SHADOW_GENERAL_NAME_get0_value -#define GENERAL_NAME_it GRPC_SHADOW_GENERAL_NAME_it -#define GENERAL_NAME_new GRPC_SHADOW_GENERAL_NAME_new -#define GENERAL_NAME_print GRPC_SHADOW_GENERAL_NAME_print -#define GENERAL_NAME_set0_othername GRPC_SHADOW_GENERAL_NAME_set0_othername -#define GENERAL_NAME_set0_value GRPC_SHADOW_GENERAL_NAME_set0_value -#define GENERAL_SUBTREE_free GRPC_SHADOW_GENERAL_SUBTREE_free -#define GENERAL_SUBTREE_it GRPC_SHADOW_GENERAL_SUBTREE_it -#define GENERAL_SUBTREE_new GRPC_SHADOW_GENERAL_SUBTREE_new -#define HKDF GRPC_SHADOW_HKDF -#define HKDF_expand GRPC_SHADOW_HKDF_expand -#define HKDF_extract GRPC_SHADOW_HKDF_extract -#define HMAC GRPC_SHADOW_HMAC -#define HMAC_CTX_cleanup GRPC_SHADOW_HMAC_CTX_cleanup -#define HMAC_CTX_copy GRPC_SHADOW_HMAC_CTX_copy -#define HMAC_CTX_copy_ex GRPC_SHADOW_HMAC_CTX_copy_ex -#define HMAC_CTX_free GRPC_SHADOW_HMAC_CTX_free -#define HMAC_CTX_init GRPC_SHADOW_HMAC_CTX_init -#define HMAC_CTX_new GRPC_SHADOW_HMAC_CTX_new -#define HMAC_CTX_reset GRPC_SHADOW_HMAC_CTX_reset -#define HMAC_Final GRPC_SHADOW_HMAC_Final -#define HMAC_Init GRPC_SHADOW_HMAC_Init -#define HMAC_Init_ex GRPC_SHADOW_HMAC_Init_ex -#define HMAC_Update GRPC_SHADOW_HMAC_Update -#define HMAC_size GRPC_SHADOW_HMAC_size -#define HRSS_decap GRPC_SHADOW_HRSS_decap -#define HRSS_encap GRPC_SHADOW_HRSS_encap -#define HRSS_generate_key GRPC_SHADOW_HRSS_generate_key -#define HRSS_marshal_public_key GRPC_SHADOW_HRSS_marshal_public_key -#define HRSS_parse_public_key GRPC_SHADOW_HRSS_parse_public_key -#define HRSS_poly2_rotr_consttime GRPC_SHADOW_HRSS_poly2_rotr_consttime -#define HRSS_poly3_invert GRPC_SHADOW_HRSS_poly3_invert -#define HRSS_poly3_mul GRPC_SHADOW_HRSS_poly3_mul -#define ISSUING_DIST_POINT_free GRPC_SHADOW_ISSUING_DIST_POINT_free -#define ISSUING_DIST_POINT_it GRPC_SHADOW_ISSUING_DIST_POINT_it -#define ISSUING_DIST_POINT_new GRPC_SHADOW_ISSUING_DIST_POINT_new -#define MD4 GRPC_SHADOW_MD4 -#define MD4_Final GRPC_SHADOW_MD4_Final -#define MD4_Init GRPC_SHADOW_MD4_Init -#define MD4_Transform GRPC_SHADOW_MD4_Transform -#define MD4_Update GRPC_SHADOW_MD4_Update -#define MD5 GRPC_SHADOW_MD5 -#define MD5_Final GRPC_SHADOW_MD5_Final -#define MD5_Init GRPC_SHADOW_MD5_Init -#define MD5_Transform GRPC_SHADOW_MD5_Transform -#define MD5_Update GRPC_SHADOW_MD5_Update -#define METHOD_ref GRPC_SHADOW_METHOD_ref -#define METHOD_unref GRPC_SHADOW_METHOD_unref -#define NAME_CONSTRAINTS_check GRPC_SHADOW_NAME_CONSTRAINTS_check -#define NAME_CONSTRAINTS_free GRPC_SHADOW_NAME_CONSTRAINTS_free -#define NAME_CONSTRAINTS_it GRPC_SHADOW_NAME_CONSTRAINTS_it -#define NAME_CONSTRAINTS_new GRPC_SHADOW_NAME_CONSTRAINTS_new -#define NCONF_free GRPC_SHADOW_NCONF_free -#define NCONF_get_section GRPC_SHADOW_NCONF_get_section -#define NCONF_get_string GRPC_SHADOW_NCONF_get_string -#define NCONF_load GRPC_SHADOW_NCONF_load -#define NCONF_load_bio GRPC_SHADOW_NCONF_load_bio -#define NCONF_new GRPC_SHADOW_NCONF_new -#define NETSCAPE_SPKAC_free GRPC_SHADOW_NETSCAPE_SPKAC_free -#define NETSCAPE_SPKAC_it GRPC_SHADOW_NETSCAPE_SPKAC_it -#define NETSCAPE_SPKAC_new GRPC_SHADOW_NETSCAPE_SPKAC_new -#define NETSCAPE_SPKI_b64_decode GRPC_SHADOW_NETSCAPE_SPKI_b64_decode -#define NETSCAPE_SPKI_b64_encode GRPC_SHADOW_NETSCAPE_SPKI_b64_encode -#define NETSCAPE_SPKI_free GRPC_SHADOW_NETSCAPE_SPKI_free -#define NETSCAPE_SPKI_get_pubkey GRPC_SHADOW_NETSCAPE_SPKI_get_pubkey -#define NETSCAPE_SPKI_it GRPC_SHADOW_NETSCAPE_SPKI_it -#define NETSCAPE_SPKI_new GRPC_SHADOW_NETSCAPE_SPKI_new -#define NETSCAPE_SPKI_set_pubkey GRPC_SHADOW_NETSCAPE_SPKI_set_pubkey -#define NETSCAPE_SPKI_sign GRPC_SHADOW_NETSCAPE_SPKI_sign -#define NETSCAPE_SPKI_verify GRPC_SHADOW_NETSCAPE_SPKI_verify -#define NOTICEREF_free GRPC_SHADOW_NOTICEREF_free -#define NOTICEREF_it GRPC_SHADOW_NOTICEREF_it -#define NOTICEREF_new GRPC_SHADOW_NOTICEREF_new -#define OBJ_cbs2nid GRPC_SHADOW_OBJ_cbs2nid -#define OBJ_cleanup GRPC_SHADOW_OBJ_cleanup -#define OBJ_cmp GRPC_SHADOW_OBJ_cmp -#define OBJ_create GRPC_SHADOW_OBJ_create -#define OBJ_dup GRPC_SHADOW_OBJ_dup -#define OBJ_find_sigid_algs GRPC_SHADOW_OBJ_find_sigid_algs -#define OBJ_find_sigid_by_algs GRPC_SHADOW_OBJ_find_sigid_by_algs -#define OBJ_get0_data GRPC_SHADOW_OBJ_get0_data -#define OBJ_length GRPC_SHADOW_OBJ_length -#define OBJ_ln2nid GRPC_SHADOW_OBJ_ln2nid -#define OBJ_nid2cbb GRPC_SHADOW_OBJ_nid2cbb -#define OBJ_nid2ln GRPC_SHADOW_OBJ_nid2ln -#define OBJ_nid2obj GRPC_SHADOW_OBJ_nid2obj -#define OBJ_nid2sn GRPC_SHADOW_OBJ_nid2sn -#define OBJ_obj2nid GRPC_SHADOW_OBJ_obj2nid -#define OBJ_obj2txt GRPC_SHADOW_OBJ_obj2txt -#define OBJ_sn2nid GRPC_SHADOW_OBJ_sn2nid -#define OBJ_txt2nid GRPC_SHADOW_OBJ_txt2nid -#define OBJ_txt2obj GRPC_SHADOW_OBJ_txt2obj -#define OPENSSL_add_all_algorithms_conf GRPC_SHADOW_OPENSSL_add_all_algorithms_conf -#define OPENSSL_built_in_curves GRPC_SHADOW_OPENSSL_built_in_curves -#define OPENSSL_cleanse GRPC_SHADOW_OPENSSL_cleanse -#define OPENSSL_cleanup GRPC_SHADOW_OPENSSL_cleanup -#define OPENSSL_clear_free GRPC_SHADOW_OPENSSL_clear_free -#define OPENSSL_config GRPC_SHADOW_OPENSSL_config -#define OPENSSL_cpuid_setup GRPC_SHADOW_OPENSSL_cpuid_setup -#define OPENSSL_free GRPC_SHADOW_OPENSSL_free -#define OPENSSL_gmtime GRPC_SHADOW_OPENSSL_gmtime -#define OPENSSL_gmtime_adj GRPC_SHADOW_OPENSSL_gmtime_adj -#define OPENSSL_gmtime_diff GRPC_SHADOW_OPENSSL_gmtime_diff -#define OPENSSL_hash32 GRPC_SHADOW_OPENSSL_hash32 -#define OPENSSL_ia32cap_P GRPC_SHADOW_OPENSSL_ia32cap_P -#define OPENSSL_init_crypto GRPC_SHADOW_OPENSSL_init_crypto -#define OPENSSL_init_ssl GRPC_SHADOW_OPENSSL_init_ssl -#define OPENSSL_load_builtin_modules GRPC_SHADOW_OPENSSL_load_builtin_modules -#define OPENSSL_malloc GRPC_SHADOW_OPENSSL_malloc -#define OPENSSL_malloc_init GRPC_SHADOW_OPENSSL_malloc_init -#define OPENSSL_no_config GRPC_SHADOW_OPENSSL_no_config -#define OPENSSL_realloc GRPC_SHADOW_OPENSSL_realloc -#define OPENSSL_strcasecmp GRPC_SHADOW_OPENSSL_strcasecmp -#define OPENSSL_strdup GRPC_SHADOW_OPENSSL_strdup -#define OPENSSL_strncasecmp GRPC_SHADOW_OPENSSL_strncasecmp -#define OPENSSL_strnlen GRPC_SHADOW_OPENSSL_strnlen -#define OPENSSL_tolower GRPC_SHADOW_OPENSSL_tolower -#define OTHERNAME_cmp GRPC_SHADOW_OTHERNAME_cmp -#define OTHERNAME_free GRPC_SHADOW_OTHERNAME_free -#define OTHERNAME_it GRPC_SHADOW_OTHERNAME_it -#define OTHERNAME_new GRPC_SHADOW_OTHERNAME_new -#define OpenSSL_add_all_algorithms GRPC_SHADOW_OpenSSL_add_all_algorithms -#define OpenSSL_add_all_ciphers GRPC_SHADOW_OpenSSL_add_all_ciphers -#define OpenSSL_add_all_digests GRPC_SHADOW_OpenSSL_add_all_digests -#define OpenSSL_version GRPC_SHADOW_OpenSSL_version -#define OpenSSL_version_num GRPC_SHADOW_OpenSSL_version_num -#define PEM_ASN1_read GRPC_SHADOW_PEM_ASN1_read -#define PEM_ASN1_read_bio GRPC_SHADOW_PEM_ASN1_read_bio -#define PEM_ASN1_write GRPC_SHADOW_PEM_ASN1_write -#define PEM_ASN1_write_bio GRPC_SHADOW_PEM_ASN1_write_bio -#define PEM_X509_INFO_read GRPC_SHADOW_PEM_X509_INFO_read -#define PEM_X509_INFO_read_bio GRPC_SHADOW_PEM_X509_INFO_read_bio -#define PEM_X509_INFO_write_bio GRPC_SHADOW_PEM_X509_INFO_write_bio -#define PEM_bytes_read_bio GRPC_SHADOW_PEM_bytes_read_bio -#define PEM_def_callback GRPC_SHADOW_PEM_def_callback -#define PEM_dek_info GRPC_SHADOW_PEM_dek_info -#define PEM_do_header GRPC_SHADOW_PEM_do_header -#define PEM_get_EVP_CIPHER_INFO GRPC_SHADOW_PEM_get_EVP_CIPHER_INFO -#define PEM_proc_type GRPC_SHADOW_PEM_proc_type -#define PEM_read GRPC_SHADOW_PEM_read -#define PEM_read_DHparams GRPC_SHADOW_PEM_read_DHparams -#define PEM_read_DSAPrivateKey GRPC_SHADOW_PEM_read_DSAPrivateKey -#define PEM_read_DSA_PUBKEY GRPC_SHADOW_PEM_read_DSA_PUBKEY -#define PEM_read_DSAparams GRPC_SHADOW_PEM_read_DSAparams -#define PEM_read_ECPrivateKey GRPC_SHADOW_PEM_read_ECPrivateKey -#define PEM_read_EC_PUBKEY GRPC_SHADOW_PEM_read_EC_PUBKEY -#define PEM_read_PKCS7 GRPC_SHADOW_PEM_read_PKCS7 -#define PEM_read_PKCS8 GRPC_SHADOW_PEM_read_PKCS8 -#define PEM_read_PKCS8_PRIV_KEY_INFO GRPC_SHADOW_PEM_read_PKCS8_PRIV_KEY_INFO -#define PEM_read_PUBKEY GRPC_SHADOW_PEM_read_PUBKEY -#define PEM_read_PrivateKey GRPC_SHADOW_PEM_read_PrivateKey -#define PEM_read_RSAPrivateKey GRPC_SHADOW_PEM_read_RSAPrivateKey -#define PEM_read_RSAPublicKey GRPC_SHADOW_PEM_read_RSAPublicKey -#define PEM_read_RSA_PUBKEY GRPC_SHADOW_PEM_read_RSA_PUBKEY -#define PEM_read_SSL_SESSION GRPC_SHADOW_PEM_read_SSL_SESSION -#define PEM_read_X509 GRPC_SHADOW_PEM_read_X509 -#define PEM_read_X509_AUX GRPC_SHADOW_PEM_read_X509_AUX -#define PEM_read_X509_CRL GRPC_SHADOW_PEM_read_X509_CRL -#define PEM_read_X509_REQ GRPC_SHADOW_PEM_read_X509_REQ -#define PEM_read_bio GRPC_SHADOW_PEM_read_bio -#define PEM_read_bio_DHparams GRPC_SHADOW_PEM_read_bio_DHparams -#define PEM_read_bio_DSAPrivateKey GRPC_SHADOW_PEM_read_bio_DSAPrivateKey -#define PEM_read_bio_DSA_PUBKEY GRPC_SHADOW_PEM_read_bio_DSA_PUBKEY -#define PEM_read_bio_DSAparams GRPC_SHADOW_PEM_read_bio_DSAparams -#define PEM_read_bio_ECPrivateKey GRPC_SHADOW_PEM_read_bio_ECPrivateKey -#define PEM_read_bio_EC_PUBKEY GRPC_SHADOW_PEM_read_bio_EC_PUBKEY -#define PEM_read_bio_PKCS7 GRPC_SHADOW_PEM_read_bio_PKCS7 -#define PEM_read_bio_PKCS8 GRPC_SHADOW_PEM_read_bio_PKCS8 -#define PEM_read_bio_PKCS8_PRIV_KEY_INFO GRPC_SHADOW_PEM_read_bio_PKCS8_PRIV_KEY_INFO -#define PEM_read_bio_PUBKEY GRPC_SHADOW_PEM_read_bio_PUBKEY -#define PEM_read_bio_PrivateKey GRPC_SHADOW_PEM_read_bio_PrivateKey -#define PEM_read_bio_RSAPrivateKey GRPC_SHADOW_PEM_read_bio_RSAPrivateKey -#define PEM_read_bio_RSAPublicKey GRPC_SHADOW_PEM_read_bio_RSAPublicKey -#define PEM_read_bio_RSA_PUBKEY GRPC_SHADOW_PEM_read_bio_RSA_PUBKEY -#define PEM_read_bio_SSL_SESSION GRPC_SHADOW_PEM_read_bio_SSL_SESSION -#define PEM_read_bio_X509 GRPC_SHADOW_PEM_read_bio_X509 -#define PEM_read_bio_X509_AUX GRPC_SHADOW_PEM_read_bio_X509_AUX -#define PEM_read_bio_X509_CRL GRPC_SHADOW_PEM_read_bio_X509_CRL -#define PEM_read_bio_X509_REQ GRPC_SHADOW_PEM_read_bio_X509_REQ -#define PEM_write GRPC_SHADOW_PEM_write -#define PEM_write_DHparams GRPC_SHADOW_PEM_write_DHparams -#define PEM_write_DSAPrivateKey GRPC_SHADOW_PEM_write_DSAPrivateKey -#define PEM_write_DSA_PUBKEY GRPC_SHADOW_PEM_write_DSA_PUBKEY -#define PEM_write_DSAparams GRPC_SHADOW_PEM_write_DSAparams -#define PEM_write_ECPrivateKey GRPC_SHADOW_PEM_write_ECPrivateKey -#define PEM_write_EC_PUBKEY GRPC_SHADOW_PEM_write_EC_PUBKEY -#define PEM_write_PKCS7 GRPC_SHADOW_PEM_write_PKCS7 -#define PEM_write_PKCS8 GRPC_SHADOW_PEM_write_PKCS8 -#define PEM_write_PKCS8PrivateKey GRPC_SHADOW_PEM_write_PKCS8PrivateKey -#define PEM_write_PKCS8PrivateKey_nid GRPC_SHADOW_PEM_write_PKCS8PrivateKey_nid -#define PEM_write_PKCS8_PRIV_KEY_INFO GRPC_SHADOW_PEM_write_PKCS8_PRIV_KEY_INFO -#define PEM_write_PUBKEY GRPC_SHADOW_PEM_write_PUBKEY -#define PEM_write_PrivateKey GRPC_SHADOW_PEM_write_PrivateKey -#define PEM_write_RSAPrivateKey GRPC_SHADOW_PEM_write_RSAPrivateKey -#define PEM_write_RSAPublicKey GRPC_SHADOW_PEM_write_RSAPublicKey -#define PEM_write_RSA_PUBKEY GRPC_SHADOW_PEM_write_RSA_PUBKEY -#define PEM_write_SSL_SESSION GRPC_SHADOW_PEM_write_SSL_SESSION -#define PEM_write_X509 GRPC_SHADOW_PEM_write_X509 -#define PEM_write_X509_AUX GRPC_SHADOW_PEM_write_X509_AUX -#define PEM_write_X509_CRL GRPC_SHADOW_PEM_write_X509_CRL -#define PEM_write_X509_REQ GRPC_SHADOW_PEM_write_X509_REQ -#define PEM_write_X509_REQ_NEW GRPC_SHADOW_PEM_write_X509_REQ_NEW -#define PEM_write_bio GRPC_SHADOW_PEM_write_bio -#define PEM_write_bio_DHparams GRPC_SHADOW_PEM_write_bio_DHparams -#define PEM_write_bio_DSAPrivateKey GRPC_SHADOW_PEM_write_bio_DSAPrivateKey -#define PEM_write_bio_DSA_PUBKEY GRPC_SHADOW_PEM_write_bio_DSA_PUBKEY -#define PEM_write_bio_DSAparams GRPC_SHADOW_PEM_write_bio_DSAparams -#define PEM_write_bio_ECPrivateKey GRPC_SHADOW_PEM_write_bio_ECPrivateKey -#define PEM_write_bio_EC_PUBKEY GRPC_SHADOW_PEM_write_bio_EC_PUBKEY -#define PEM_write_bio_PKCS7 GRPC_SHADOW_PEM_write_bio_PKCS7 -#define PEM_write_bio_PKCS8 GRPC_SHADOW_PEM_write_bio_PKCS8 -#define PEM_write_bio_PKCS8PrivateKey GRPC_SHADOW_PEM_write_bio_PKCS8PrivateKey -#define PEM_write_bio_PKCS8PrivateKey_nid GRPC_SHADOW_PEM_write_bio_PKCS8PrivateKey_nid -#define PEM_write_bio_PKCS8_PRIV_KEY_INFO GRPC_SHADOW_PEM_write_bio_PKCS8_PRIV_KEY_INFO -#define PEM_write_bio_PUBKEY GRPC_SHADOW_PEM_write_bio_PUBKEY -#define PEM_write_bio_PrivateKey GRPC_SHADOW_PEM_write_bio_PrivateKey -#define PEM_write_bio_RSAPrivateKey GRPC_SHADOW_PEM_write_bio_RSAPrivateKey -#define PEM_write_bio_RSAPublicKey GRPC_SHADOW_PEM_write_bio_RSAPublicKey -#define PEM_write_bio_RSA_PUBKEY GRPC_SHADOW_PEM_write_bio_RSA_PUBKEY -#define PEM_write_bio_SSL_SESSION GRPC_SHADOW_PEM_write_bio_SSL_SESSION -#define PEM_write_bio_X509 GRPC_SHADOW_PEM_write_bio_X509 -#define PEM_write_bio_X509_AUX GRPC_SHADOW_PEM_write_bio_X509_AUX -#define PEM_write_bio_X509_CRL GRPC_SHADOW_PEM_write_bio_X509_CRL -#define PEM_write_bio_X509_REQ GRPC_SHADOW_PEM_write_bio_X509_REQ -#define PEM_write_bio_X509_REQ_NEW GRPC_SHADOW_PEM_write_bio_X509_REQ_NEW -#define PKCS12_PBE_add GRPC_SHADOW_PKCS12_PBE_add -#define PKCS12_create GRPC_SHADOW_PKCS12_create -#define PKCS12_free GRPC_SHADOW_PKCS12_free -#define PKCS12_get_key_and_certs GRPC_SHADOW_PKCS12_get_key_and_certs -#define PKCS12_parse GRPC_SHADOW_PKCS12_parse -#define PKCS12_verify_mac GRPC_SHADOW_PKCS12_verify_mac -#define PKCS5_PBKDF2_HMAC GRPC_SHADOW_PKCS5_PBKDF2_HMAC -#define PKCS5_PBKDF2_HMAC_SHA1 GRPC_SHADOW_PKCS5_PBKDF2_HMAC_SHA1 -#define PKCS5_pbe2_decrypt_init GRPC_SHADOW_PKCS5_pbe2_decrypt_init -#define PKCS5_pbe2_encrypt_init GRPC_SHADOW_PKCS5_pbe2_encrypt_init -#define PKCS7_bundle_CRLs GRPC_SHADOW_PKCS7_bundle_CRLs -#define PKCS7_bundle_certificates GRPC_SHADOW_PKCS7_bundle_certificates -#define PKCS7_free GRPC_SHADOW_PKCS7_free -#define PKCS7_get_CRLs GRPC_SHADOW_PKCS7_get_CRLs -#define PKCS7_get_PEM_CRLs GRPC_SHADOW_PKCS7_get_PEM_CRLs -#define PKCS7_get_PEM_certificates GRPC_SHADOW_PKCS7_get_PEM_certificates -#define PKCS7_get_certificates GRPC_SHADOW_PKCS7_get_certificates -#define PKCS7_get_raw_certificates GRPC_SHADOW_PKCS7_get_raw_certificates -#define PKCS7_sign GRPC_SHADOW_PKCS7_sign -#define PKCS7_type_is_data GRPC_SHADOW_PKCS7_type_is_data -#define PKCS7_type_is_digest GRPC_SHADOW_PKCS7_type_is_digest -#define PKCS7_type_is_encrypted GRPC_SHADOW_PKCS7_type_is_encrypted -#define PKCS7_type_is_enveloped GRPC_SHADOW_PKCS7_type_is_enveloped -#define PKCS7_type_is_signed GRPC_SHADOW_PKCS7_type_is_signed -#define PKCS7_type_is_signedAndEnveloped GRPC_SHADOW_PKCS7_type_is_signedAndEnveloped -#define PKCS8_PRIV_KEY_INFO_free GRPC_SHADOW_PKCS8_PRIV_KEY_INFO_free -#define PKCS8_PRIV_KEY_INFO_it GRPC_SHADOW_PKCS8_PRIV_KEY_INFO_it -#define PKCS8_PRIV_KEY_INFO_new GRPC_SHADOW_PKCS8_PRIV_KEY_INFO_new -#define PKCS8_decrypt GRPC_SHADOW_PKCS8_decrypt -#define PKCS8_encrypt GRPC_SHADOW_PKCS8_encrypt -#define PKCS8_marshal_encrypted_private_key GRPC_SHADOW_PKCS8_marshal_encrypted_private_key -#define PKCS8_parse_encrypted_private_key GRPC_SHADOW_PKCS8_parse_encrypted_private_key -#define PKCS8_pkey_get0 GRPC_SHADOW_PKCS8_pkey_get0 -#define PKCS8_pkey_set0 GRPC_SHADOW_PKCS8_pkey_set0 -#define PKEY_USAGE_PERIOD_free GRPC_SHADOW_PKEY_USAGE_PERIOD_free -#define PKEY_USAGE_PERIOD_it GRPC_SHADOW_PKEY_USAGE_PERIOD_it -#define PKEY_USAGE_PERIOD_new GRPC_SHADOW_PKEY_USAGE_PERIOD_new -#define POLICYINFO_free GRPC_SHADOW_POLICYINFO_free -#define POLICYINFO_it GRPC_SHADOW_POLICYINFO_it -#define POLICYINFO_new GRPC_SHADOW_POLICYINFO_new -#define POLICYQUALINFO_free GRPC_SHADOW_POLICYQUALINFO_free -#define POLICYQUALINFO_it GRPC_SHADOW_POLICYQUALINFO_it -#define POLICYQUALINFO_new GRPC_SHADOW_POLICYQUALINFO_new -#define POLICY_CONSTRAINTS_free GRPC_SHADOW_POLICY_CONSTRAINTS_free -#define POLICY_CONSTRAINTS_it GRPC_SHADOW_POLICY_CONSTRAINTS_it -#define POLICY_CONSTRAINTS_new GRPC_SHADOW_POLICY_CONSTRAINTS_new -#define POLICY_MAPPINGS_it GRPC_SHADOW_POLICY_MAPPINGS_it -#define POLICY_MAPPING_free GRPC_SHADOW_POLICY_MAPPING_free -#define POLICY_MAPPING_it GRPC_SHADOW_POLICY_MAPPING_it -#define POLICY_MAPPING_new GRPC_SHADOW_POLICY_MAPPING_new -#define PROXY_CERT_INFO_EXTENSION_free GRPC_SHADOW_PROXY_CERT_INFO_EXTENSION_free -#define PROXY_CERT_INFO_EXTENSION_it GRPC_SHADOW_PROXY_CERT_INFO_EXTENSION_it -#define PROXY_CERT_INFO_EXTENSION_new GRPC_SHADOW_PROXY_CERT_INFO_EXTENSION_new -#define PROXY_POLICY_free GRPC_SHADOW_PROXY_POLICY_free -#define PROXY_POLICY_it GRPC_SHADOW_PROXY_POLICY_it -#define PROXY_POLICY_new GRPC_SHADOW_PROXY_POLICY_new -#define RAND_SSLeay GRPC_SHADOW_RAND_SSLeay -#define RAND_add GRPC_SHADOW_RAND_add -#define RAND_bytes GRPC_SHADOW_RAND_bytes -#define RAND_bytes_with_additional_data GRPC_SHADOW_RAND_bytes_with_additional_data -#define RAND_cleanup GRPC_SHADOW_RAND_cleanup -#define RAND_egd GRPC_SHADOW_RAND_egd -#define RAND_enable_fork_unsafe_buffering GRPC_SHADOW_RAND_enable_fork_unsafe_buffering -#define RAND_file_name GRPC_SHADOW_RAND_file_name -#define RAND_get_rand_method GRPC_SHADOW_RAND_get_rand_method -#define RAND_load_file GRPC_SHADOW_RAND_load_file -#define RAND_poll GRPC_SHADOW_RAND_poll -#define RAND_pseudo_bytes GRPC_SHADOW_RAND_pseudo_bytes -#define RAND_seed GRPC_SHADOW_RAND_seed -#define RAND_set_rand_method GRPC_SHADOW_RAND_set_rand_method -#define RAND_set_urandom_fd GRPC_SHADOW_RAND_set_urandom_fd -#define RAND_status GRPC_SHADOW_RAND_status -#define RC4 GRPC_SHADOW_RC4 -#define RC4_set_key GRPC_SHADOW_RC4_set_key -#define RSAPrivateKey_dup GRPC_SHADOW_RSAPrivateKey_dup -#define RSAPublicKey_dup GRPC_SHADOW_RSAPublicKey_dup -#define RSAZ_1024_mod_exp_avx2 GRPC_SHADOW_RSAZ_1024_mod_exp_avx2 -#define RSA_PSS_PARAMS_free GRPC_SHADOW_RSA_PSS_PARAMS_free -#define RSA_PSS_PARAMS_it GRPC_SHADOW_RSA_PSS_PARAMS_it -#define RSA_PSS_PARAMS_new GRPC_SHADOW_RSA_PSS_PARAMS_new -#define RSA_add_pkcs1_prefix GRPC_SHADOW_RSA_add_pkcs1_prefix -#define RSA_bits GRPC_SHADOW_RSA_bits -#define RSA_blinding_on GRPC_SHADOW_RSA_blinding_on -#define RSA_check_fips GRPC_SHADOW_RSA_check_fips -#define RSA_check_key GRPC_SHADOW_RSA_check_key -#define RSA_decrypt GRPC_SHADOW_RSA_decrypt -#define RSA_default_method GRPC_SHADOW_RSA_default_method -#define RSA_encrypt GRPC_SHADOW_RSA_encrypt -#define RSA_flags GRPC_SHADOW_RSA_flags -#define RSA_free GRPC_SHADOW_RSA_free -#define RSA_generate_key_ex GRPC_SHADOW_RSA_generate_key_ex -#define RSA_generate_key_fips GRPC_SHADOW_RSA_generate_key_fips -#define RSA_get0_crt_params GRPC_SHADOW_RSA_get0_crt_params -#define RSA_get0_factors GRPC_SHADOW_RSA_get0_factors -#define RSA_get0_key GRPC_SHADOW_RSA_get0_key -#define RSA_get_ex_data GRPC_SHADOW_RSA_get_ex_data -#define RSA_get_ex_new_index GRPC_SHADOW_RSA_get_ex_new_index -#define RSA_is_opaque GRPC_SHADOW_RSA_is_opaque -#define RSA_marshal_private_key GRPC_SHADOW_RSA_marshal_private_key -#define RSA_marshal_public_key GRPC_SHADOW_RSA_marshal_public_key -#define RSA_new GRPC_SHADOW_RSA_new -#define RSA_new_method GRPC_SHADOW_RSA_new_method -#define RSA_padding_add_PKCS1_OAEP_mgf1 GRPC_SHADOW_RSA_padding_add_PKCS1_OAEP_mgf1 -#define RSA_padding_add_PKCS1_PSS_mgf1 GRPC_SHADOW_RSA_padding_add_PKCS1_PSS_mgf1 -#define RSA_padding_add_PKCS1_type_1 GRPC_SHADOW_RSA_padding_add_PKCS1_type_1 -#define RSA_padding_add_PKCS1_type_2 GRPC_SHADOW_RSA_padding_add_PKCS1_type_2 -#define RSA_padding_add_none GRPC_SHADOW_RSA_padding_add_none -#define RSA_padding_check_PKCS1_OAEP_mgf1 GRPC_SHADOW_RSA_padding_check_PKCS1_OAEP_mgf1 -#define RSA_padding_check_PKCS1_type_1 GRPC_SHADOW_RSA_padding_check_PKCS1_type_1 -#define RSA_padding_check_PKCS1_type_2 GRPC_SHADOW_RSA_padding_check_PKCS1_type_2 -#define RSA_parse_private_key GRPC_SHADOW_RSA_parse_private_key -#define RSA_parse_public_key GRPC_SHADOW_RSA_parse_public_key -#define RSA_print GRPC_SHADOW_RSA_print -#define RSA_private_decrypt GRPC_SHADOW_RSA_private_decrypt -#define RSA_private_encrypt GRPC_SHADOW_RSA_private_encrypt -#define RSA_private_key_from_bytes GRPC_SHADOW_RSA_private_key_from_bytes -#define RSA_private_key_to_bytes GRPC_SHADOW_RSA_private_key_to_bytes -#define RSA_private_transform GRPC_SHADOW_RSA_private_transform -#define RSA_public_decrypt GRPC_SHADOW_RSA_public_decrypt -#define RSA_public_encrypt GRPC_SHADOW_RSA_public_encrypt -#define RSA_public_key_from_bytes GRPC_SHADOW_RSA_public_key_from_bytes -#define RSA_public_key_to_bytes GRPC_SHADOW_RSA_public_key_to_bytes -#define RSA_set0_crt_params GRPC_SHADOW_RSA_set0_crt_params -#define RSA_set0_factors GRPC_SHADOW_RSA_set0_factors -#define RSA_set0_key GRPC_SHADOW_RSA_set0_key -#define RSA_set_ex_data GRPC_SHADOW_RSA_set_ex_data -#define RSA_sign GRPC_SHADOW_RSA_sign -#define RSA_sign_pss_mgf1 GRPC_SHADOW_RSA_sign_pss_mgf1 -#define RSA_sign_raw GRPC_SHADOW_RSA_sign_raw -#define RSA_size GRPC_SHADOW_RSA_size -#define RSA_up_ref GRPC_SHADOW_RSA_up_ref -#define RSA_verify GRPC_SHADOW_RSA_verify -#define RSA_verify_PKCS1_PSS_mgf1 GRPC_SHADOW_RSA_verify_PKCS1_PSS_mgf1 -#define RSA_verify_pss_mgf1 GRPC_SHADOW_RSA_verify_pss_mgf1 -#define RSA_verify_raw GRPC_SHADOW_RSA_verify_raw -#define SHA1 GRPC_SHADOW_SHA1 -#define SHA1_Final GRPC_SHADOW_SHA1_Final -#define SHA1_Init GRPC_SHADOW_SHA1_Init -#define SHA1_Transform GRPC_SHADOW_SHA1_Transform -#define SHA1_Update GRPC_SHADOW_SHA1_Update -#define SHA224 GRPC_SHADOW_SHA224 -#define SHA224_Final GRPC_SHADOW_SHA224_Final -#define SHA224_Init GRPC_SHADOW_SHA224_Init -#define SHA224_Update GRPC_SHADOW_SHA224_Update -#define SHA256 GRPC_SHADOW_SHA256 -#define SHA256_Final GRPC_SHADOW_SHA256_Final -#define SHA256_Init GRPC_SHADOW_SHA256_Init -#define SHA256_Transform GRPC_SHADOW_SHA256_Transform -#define SHA256_TransformBlocks GRPC_SHADOW_SHA256_TransformBlocks -#define SHA256_Update GRPC_SHADOW_SHA256_Update -#define SHA384 GRPC_SHADOW_SHA384 -#define SHA384_Final GRPC_SHADOW_SHA384_Final -#define SHA384_Init GRPC_SHADOW_SHA384_Init -#define SHA384_Update GRPC_SHADOW_SHA384_Update -#define SHA512 GRPC_SHADOW_SHA512 -#define SHA512_Final GRPC_SHADOW_SHA512_Final -#define SHA512_Init GRPC_SHADOW_SHA512_Init -#define SHA512_Transform GRPC_SHADOW_SHA512_Transform -#define SHA512_Update GRPC_SHADOW_SHA512_Update -#define SIPHASH_24 GRPC_SHADOW_SIPHASH_24 -#define SPAKE2_CTX_free GRPC_SHADOW_SPAKE2_CTX_free -#define SPAKE2_CTX_new GRPC_SHADOW_SPAKE2_CTX_new -#define SPAKE2_generate_msg GRPC_SHADOW_SPAKE2_generate_msg -#define SPAKE2_process_msg GRPC_SHADOW_SPAKE2_process_msg -#define SSL_CIPHER_description GRPC_SHADOW_SSL_CIPHER_description -#define SSL_CIPHER_get_auth_nid GRPC_SHADOW_SSL_CIPHER_get_auth_nid -#define SSL_CIPHER_get_bits GRPC_SHADOW_SSL_CIPHER_get_bits -#define SSL_CIPHER_get_cipher_nid GRPC_SHADOW_SSL_CIPHER_get_cipher_nid -#define SSL_CIPHER_get_digest_nid GRPC_SHADOW_SSL_CIPHER_get_digest_nid -#define SSL_CIPHER_get_id GRPC_SHADOW_SSL_CIPHER_get_id -#define SSL_CIPHER_get_kx_name GRPC_SHADOW_SSL_CIPHER_get_kx_name -#define SSL_CIPHER_get_kx_nid GRPC_SHADOW_SSL_CIPHER_get_kx_nid -#define SSL_CIPHER_get_max_version GRPC_SHADOW_SSL_CIPHER_get_max_version -#define SSL_CIPHER_get_min_version GRPC_SHADOW_SSL_CIPHER_get_min_version -#define SSL_CIPHER_get_name GRPC_SHADOW_SSL_CIPHER_get_name -#define SSL_CIPHER_get_prf_nid GRPC_SHADOW_SSL_CIPHER_get_prf_nid -#define SSL_CIPHER_get_rfc_name GRPC_SHADOW_SSL_CIPHER_get_rfc_name -#define SSL_CIPHER_get_value GRPC_SHADOW_SSL_CIPHER_get_value -#define SSL_CIPHER_get_version GRPC_SHADOW_SSL_CIPHER_get_version -#define SSL_CIPHER_is_aead GRPC_SHADOW_SSL_CIPHER_is_aead -#define SSL_CIPHER_is_block_cipher GRPC_SHADOW_SSL_CIPHER_is_block_cipher -#define SSL_CIPHER_standard_name GRPC_SHADOW_SSL_CIPHER_standard_name -#define SSL_COMP_add_compression_method GRPC_SHADOW_SSL_COMP_add_compression_method -#define SSL_COMP_free_compression_methods GRPC_SHADOW_SSL_COMP_free_compression_methods -#define SSL_COMP_get0_name GRPC_SHADOW_SSL_COMP_get0_name -#define SSL_COMP_get_compression_methods GRPC_SHADOW_SSL_COMP_get_compression_methods -#define SSL_COMP_get_id GRPC_SHADOW_SSL_COMP_get_id -#define SSL_COMP_get_name GRPC_SHADOW_SSL_COMP_get_name -#define SSL_CTX_add0_chain_cert GRPC_SHADOW_SSL_CTX_add0_chain_cert -#define SSL_CTX_add1_chain_cert GRPC_SHADOW_SSL_CTX_add1_chain_cert -#define SSL_CTX_add_cert_compression_alg GRPC_SHADOW_SSL_CTX_add_cert_compression_alg -#define SSL_CTX_add_client_CA GRPC_SHADOW_SSL_CTX_add_client_CA -#define SSL_CTX_add_extra_chain_cert GRPC_SHADOW_SSL_CTX_add_extra_chain_cert -#define SSL_CTX_add_session GRPC_SHADOW_SSL_CTX_add_session -#define SSL_CTX_check_private_key GRPC_SHADOW_SSL_CTX_check_private_key -#define SSL_CTX_cipher_in_group GRPC_SHADOW_SSL_CTX_cipher_in_group -#define SSL_CTX_clear_chain_certs GRPC_SHADOW_SSL_CTX_clear_chain_certs -#define SSL_CTX_clear_extra_chain_certs GRPC_SHADOW_SSL_CTX_clear_extra_chain_certs -#define SSL_CTX_clear_mode GRPC_SHADOW_SSL_CTX_clear_mode -#define SSL_CTX_clear_options GRPC_SHADOW_SSL_CTX_clear_options -#define SSL_CTX_enable_ocsp_stapling GRPC_SHADOW_SSL_CTX_enable_ocsp_stapling -#define SSL_CTX_enable_pq_experiment_signal GRPC_SHADOW_SSL_CTX_enable_pq_experiment_signal -#define SSL_CTX_enable_signed_cert_timestamps GRPC_SHADOW_SSL_CTX_enable_signed_cert_timestamps -#define SSL_CTX_enable_tls_channel_id GRPC_SHADOW_SSL_CTX_enable_tls_channel_id -#define SSL_CTX_flush_sessions GRPC_SHADOW_SSL_CTX_flush_sessions -#define SSL_CTX_free GRPC_SHADOW_SSL_CTX_free -#define SSL_CTX_get0_certificate GRPC_SHADOW_SSL_CTX_get0_certificate -#define SSL_CTX_get0_chain_certs GRPC_SHADOW_SSL_CTX_get0_chain_certs -#define SSL_CTX_get0_param GRPC_SHADOW_SSL_CTX_get0_param -#define SSL_CTX_get0_privatekey GRPC_SHADOW_SSL_CTX_get0_privatekey -#define SSL_CTX_get_cert_store GRPC_SHADOW_SSL_CTX_get_cert_store -#define SSL_CTX_get_channel_id_cb GRPC_SHADOW_SSL_CTX_get_channel_id_cb -#define SSL_CTX_get_ciphers GRPC_SHADOW_SSL_CTX_get_ciphers -#define SSL_CTX_get_client_CA_list GRPC_SHADOW_SSL_CTX_get_client_CA_list -#define SSL_CTX_get_default_passwd_cb GRPC_SHADOW_SSL_CTX_get_default_passwd_cb -#define SSL_CTX_get_default_passwd_cb_userdata GRPC_SHADOW_SSL_CTX_get_default_passwd_cb_userdata -#define SSL_CTX_get_ex_data GRPC_SHADOW_SSL_CTX_get_ex_data -#define SSL_CTX_get_ex_new_index GRPC_SHADOW_SSL_CTX_get_ex_new_index -#define SSL_CTX_get_extra_chain_certs GRPC_SHADOW_SSL_CTX_get_extra_chain_certs -#define SSL_CTX_get_info_callback GRPC_SHADOW_SSL_CTX_get_info_callback -#define SSL_CTX_get_keylog_callback GRPC_SHADOW_SSL_CTX_get_keylog_callback -#define SSL_CTX_get_max_cert_list GRPC_SHADOW_SSL_CTX_get_max_cert_list -#define SSL_CTX_get_max_proto_version GRPC_SHADOW_SSL_CTX_get_max_proto_version -#define SSL_CTX_get_min_proto_version GRPC_SHADOW_SSL_CTX_get_min_proto_version -#define SSL_CTX_get_mode GRPC_SHADOW_SSL_CTX_get_mode -#define SSL_CTX_get_options GRPC_SHADOW_SSL_CTX_get_options -#define SSL_CTX_get_quiet_shutdown GRPC_SHADOW_SSL_CTX_get_quiet_shutdown -#define SSL_CTX_get_read_ahead GRPC_SHADOW_SSL_CTX_get_read_ahead -#define SSL_CTX_get_session_cache_mode GRPC_SHADOW_SSL_CTX_get_session_cache_mode -#define SSL_CTX_get_timeout GRPC_SHADOW_SSL_CTX_get_timeout -#define SSL_CTX_get_tlsext_ticket_keys GRPC_SHADOW_SSL_CTX_get_tlsext_ticket_keys -#define SSL_CTX_get_verify_callback GRPC_SHADOW_SSL_CTX_get_verify_callback -#define SSL_CTX_get_verify_depth GRPC_SHADOW_SSL_CTX_get_verify_depth -#define SSL_CTX_get_verify_mode GRPC_SHADOW_SSL_CTX_get_verify_mode -#define SSL_CTX_load_verify_locations GRPC_SHADOW_SSL_CTX_load_verify_locations -#define SSL_CTX_need_tmp_RSA GRPC_SHADOW_SSL_CTX_need_tmp_RSA -#define SSL_CTX_new GRPC_SHADOW_SSL_CTX_new -#define SSL_CTX_remove_session GRPC_SHADOW_SSL_CTX_remove_session -#define SSL_CTX_sess_accept GRPC_SHADOW_SSL_CTX_sess_accept -#define SSL_CTX_sess_accept_good GRPC_SHADOW_SSL_CTX_sess_accept_good -#define SSL_CTX_sess_accept_renegotiate GRPC_SHADOW_SSL_CTX_sess_accept_renegotiate -#define SSL_CTX_sess_cache_full GRPC_SHADOW_SSL_CTX_sess_cache_full -#define SSL_CTX_sess_cb_hits GRPC_SHADOW_SSL_CTX_sess_cb_hits -#define SSL_CTX_sess_connect GRPC_SHADOW_SSL_CTX_sess_connect -#define SSL_CTX_sess_connect_good GRPC_SHADOW_SSL_CTX_sess_connect_good -#define SSL_CTX_sess_connect_renegotiate GRPC_SHADOW_SSL_CTX_sess_connect_renegotiate -#define SSL_CTX_sess_get_cache_size GRPC_SHADOW_SSL_CTX_sess_get_cache_size -#define SSL_CTX_sess_get_get_cb GRPC_SHADOW_SSL_CTX_sess_get_get_cb -#define SSL_CTX_sess_get_new_cb GRPC_SHADOW_SSL_CTX_sess_get_new_cb -#define SSL_CTX_sess_get_remove_cb GRPC_SHADOW_SSL_CTX_sess_get_remove_cb -#define SSL_CTX_sess_hits GRPC_SHADOW_SSL_CTX_sess_hits -#define SSL_CTX_sess_misses GRPC_SHADOW_SSL_CTX_sess_misses -#define SSL_CTX_sess_number GRPC_SHADOW_SSL_CTX_sess_number -#define SSL_CTX_sess_set_cache_size GRPC_SHADOW_SSL_CTX_sess_set_cache_size -#define SSL_CTX_sess_set_get_cb GRPC_SHADOW_SSL_CTX_sess_set_get_cb -#define SSL_CTX_sess_set_new_cb GRPC_SHADOW_SSL_CTX_sess_set_new_cb -#define SSL_CTX_sess_set_remove_cb GRPC_SHADOW_SSL_CTX_sess_set_remove_cb -#define SSL_CTX_sess_timeouts GRPC_SHADOW_SSL_CTX_sess_timeouts -#define SSL_CTX_set0_buffer_pool GRPC_SHADOW_SSL_CTX_set0_buffer_pool -#define SSL_CTX_set0_chain GRPC_SHADOW_SSL_CTX_set0_chain -#define SSL_CTX_set0_client_CAs GRPC_SHADOW_SSL_CTX_set0_client_CAs -#define SSL_CTX_set0_verify_cert_store GRPC_SHADOW_SSL_CTX_set0_verify_cert_store -#define SSL_CTX_set1_chain GRPC_SHADOW_SSL_CTX_set1_chain -#define SSL_CTX_set1_curves GRPC_SHADOW_SSL_CTX_set1_curves -#define SSL_CTX_set1_curves_list GRPC_SHADOW_SSL_CTX_set1_curves_list -#define SSL_CTX_set1_param GRPC_SHADOW_SSL_CTX_set1_param -#define SSL_CTX_set1_sigalgs GRPC_SHADOW_SSL_CTX_set1_sigalgs -#define SSL_CTX_set1_sigalgs_list GRPC_SHADOW_SSL_CTX_set1_sigalgs_list -#define SSL_CTX_set1_tls_channel_id GRPC_SHADOW_SSL_CTX_set1_tls_channel_id -#define SSL_CTX_set1_verify_cert_store GRPC_SHADOW_SSL_CTX_set1_verify_cert_store -#define SSL_CTX_set_allow_unknown_alpn_protos GRPC_SHADOW_SSL_CTX_set_allow_unknown_alpn_protos -#define SSL_CTX_set_alpn_protos GRPC_SHADOW_SSL_CTX_set_alpn_protos -#define SSL_CTX_set_alpn_select_cb GRPC_SHADOW_SSL_CTX_set_alpn_select_cb -#define SSL_CTX_set_cert_cb GRPC_SHADOW_SSL_CTX_set_cert_cb -#define SSL_CTX_set_cert_store GRPC_SHADOW_SSL_CTX_set_cert_store -#define SSL_CTX_set_cert_verify_callback GRPC_SHADOW_SSL_CTX_set_cert_verify_callback -#define SSL_CTX_set_chain_and_key GRPC_SHADOW_SSL_CTX_set_chain_and_key -#define SSL_CTX_set_channel_id_cb GRPC_SHADOW_SSL_CTX_set_channel_id_cb -#define SSL_CTX_set_cipher_list GRPC_SHADOW_SSL_CTX_set_cipher_list -#define SSL_CTX_set_client_CA_list GRPC_SHADOW_SSL_CTX_set_client_CA_list -#define SSL_CTX_set_client_cert_cb GRPC_SHADOW_SSL_CTX_set_client_cert_cb -#define SSL_CTX_set_current_time_cb GRPC_SHADOW_SSL_CTX_set_current_time_cb -#define SSL_CTX_set_custom_verify GRPC_SHADOW_SSL_CTX_set_custom_verify -#define SSL_CTX_set_default_passwd_cb GRPC_SHADOW_SSL_CTX_set_default_passwd_cb -#define SSL_CTX_set_default_passwd_cb_userdata GRPC_SHADOW_SSL_CTX_set_default_passwd_cb_userdata -#define SSL_CTX_set_default_verify_paths GRPC_SHADOW_SSL_CTX_set_default_verify_paths -#define SSL_CTX_set_dos_protection_cb GRPC_SHADOW_SSL_CTX_set_dos_protection_cb -#define SSL_CTX_set_early_data_enabled GRPC_SHADOW_SSL_CTX_set_early_data_enabled -#define SSL_CTX_set_ed25519_enabled GRPC_SHADOW_SSL_CTX_set_ed25519_enabled -#define SSL_CTX_set_ex_data GRPC_SHADOW_SSL_CTX_set_ex_data -#define SSL_CTX_set_false_start_allowed_without_alpn GRPC_SHADOW_SSL_CTX_set_false_start_allowed_without_alpn -#define SSL_CTX_set_grease_enabled GRPC_SHADOW_SSL_CTX_set_grease_enabled -#define SSL_CTX_set_ignore_tls13_downgrade GRPC_SHADOW_SSL_CTX_set_ignore_tls13_downgrade -#define SSL_CTX_set_info_callback GRPC_SHADOW_SSL_CTX_set_info_callback -#define SSL_CTX_set_keylog_callback GRPC_SHADOW_SSL_CTX_set_keylog_callback -#define SSL_CTX_set_max_cert_list GRPC_SHADOW_SSL_CTX_set_max_cert_list -#define SSL_CTX_set_max_proto_version GRPC_SHADOW_SSL_CTX_set_max_proto_version -#define SSL_CTX_set_max_send_fragment GRPC_SHADOW_SSL_CTX_set_max_send_fragment -#define SSL_CTX_set_min_proto_version GRPC_SHADOW_SSL_CTX_set_min_proto_version -#define SSL_CTX_set_mode GRPC_SHADOW_SSL_CTX_set_mode -#define SSL_CTX_set_msg_callback GRPC_SHADOW_SSL_CTX_set_msg_callback -#define SSL_CTX_set_msg_callback_arg GRPC_SHADOW_SSL_CTX_set_msg_callback_arg -#define SSL_CTX_set_next_proto_select_cb GRPC_SHADOW_SSL_CTX_set_next_proto_select_cb -#define SSL_CTX_set_next_protos_advertised_cb GRPC_SHADOW_SSL_CTX_set_next_protos_advertised_cb -#define SSL_CTX_set_ocsp_response GRPC_SHADOW_SSL_CTX_set_ocsp_response -#define SSL_CTX_set_options GRPC_SHADOW_SSL_CTX_set_options -#define SSL_CTX_set_private_key_method GRPC_SHADOW_SSL_CTX_set_private_key_method -#define SSL_CTX_set_psk_client_callback GRPC_SHADOW_SSL_CTX_set_psk_client_callback -#define SSL_CTX_set_psk_server_callback GRPC_SHADOW_SSL_CTX_set_psk_server_callback -#define SSL_CTX_set_purpose GRPC_SHADOW_SSL_CTX_set_purpose -#define SSL_CTX_set_quic_method GRPC_SHADOW_SSL_CTX_set_quic_method -#define SSL_CTX_set_quiet_shutdown GRPC_SHADOW_SSL_CTX_set_quiet_shutdown -#define SSL_CTX_set_read_ahead GRPC_SHADOW_SSL_CTX_set_read_ahead -#define SSL_CTX_set_retain_only_sha256_of_client_certs GRPC_SHADOW_SSL_CTX_set_retain_only_sha256_of_client_certs -#define SSL_CTX_set_reverify_on_resume GRPC_SHADOW_SSL_CTX_set_reverify_on_resume -#define SSL_CTX_set_rsa_pss_rsae_certs_enabled GRPC_SHADOW_SSL_CTX_set_rsa_pss_rsae_certs_enabled -#define SSL_CTX_set_select_certificate_cb GRPC_SHADOW_SSL_CTX_set_select_certificate_cb -#define SSL_CTX_set_session_cache_mode GRPC_SHADOW_SSL_CTX_set_session_cache_mode -#define SSL_CTX_set_session_id_context GRPC_SHADOW_SSL_CTX_set_session_id_context -#define SSL_CTX_set_session_psk_dhe_timeout GRPC_SHADOW_SSL_CTX_set_session_psk_dhe_timeout -#define SSL_CTX_set_signed_cert_timestamp_list GRPC_SHADOW_SSL_CTX_set_signed_cert_timestamp_list -#define SSL_CTX_set_signing_algorithm_prefs GRPC_SHADOW_SSL_CTX_set_signing_algorithm_prefs -#define SSL_CTX_set_srtp_profiles GRPC_SHADOW_SSL_CTX_set_srtp_profiles -#define SSL_CTX_set_strict_cipher_list GRPC_SHADOW_SSL_CTX_set_strict_cipher_list -#define SSL_CTX_set_ticket_aead_method GRPC_SHADOW_SSL_CTX_set_ticket_aead_method -#define SSL_CTX_set_timeout GRPC_SHADOW_SSL_CTX_set_timeout -#define SSL_CTX_set_tls_channel_id_enabled GRPC_SHADOW_SSL_CTX_set_tls_channel_id_enabled -#define SSL_CTX_set_tlsext_servername_arg GRPC_SHADOW_SSL_CTX_set_tlsext_servername_arg -#define SSL_CTX_set_tlsext_servername_callback GRPC_SHADOW_SSL_CTX_set_tlsext_servername_callback -#define SSL_CTX_set_tlsext_status_arg GRPC_SHADOW_SSL_CTX_set_tlsext_status_arg -#define SSL_CTX_set_tlsext_status_cb GRPC_SHADOW_SSL_CTX_set_tlsext_status_cb -#define SSL_CTX_set_tlsext_ticket_key_cb GRPC_SHADOW_SSL_CTX_set_tlsext_ticket_key_cb -#define SSL_CTX_set_tlsext_ticket_keys GRPC_SHADOW_SSL_CTX_set_tlsext_ticket_keys -#define SSL_CTX_set_tlsext_use_srtp GRPC_SHADOW_SSL_CTX_set_tlsext_use_srtp -#define SSL_CTX_set_tmp_dh GRPC_SHADOW_SSL_CTX_set_tmp_dh -#define SSL_CTX_set_tmp_dh_callback GRPC_SHADOW_SSL_CTX_set_tmp_dh_callback -#define SSL_CTX_set_tmp_ecdh GRPC_SHADOW_SSL_CTX_set_tmp_ecdh -#define SSL_CTX_set_tmp_rsa GRPC_SHADOW_SSL_CTX_set_tmp_rsa -#define SSL_CTX_set_tmp_rsa_callback GRPC_SHADOW_SSL_CTX_set_tmp_rsa_callback -#define SSL_CTX_set_trust GRPC_SHADOW_SSL_CTX_set_trust -#define SSL_CTX_set_verify GRPC_SHADOW_SSL_CTX_set_verify -#define SSL_CTX_set_verify_algorithm_prefs GRPC_SHADOW_SSL_CTX_set_verify_algorithm_prefs -#define SSL_CTX_set_verify_depth GRPC_SHADOW_SSL_CTX_set_verify_depth -#define SSL_CTX_up_ref GRPC_SHADOW_SSL_CTX_up_ref -#define SSL_CTX_use_PrivateKey GRPC_SHADOW_SSL_CTX_use_PrivateKey -#define SSL_CTX_use_PrivateKey_ASN1 GRPC_SHADOW_SSL_CTX_use_PrivateKey_ASN1 -#define SSL_CTX_use_PrivateKey_file GRPC_SHADOW_SSL_CTX_use_PrivateKey_file -#define SSL_CTX_use_RSAPrivateKey GRPC_SHADOW_SSL_CTX_use_RSAPrivateKey -#define SSL_CTX_use_RSAPrivateKey_ASN1 GRPC_SHADOW_SSL_CTX_use_RSAPrivateKey_ASN1 -#define SSL_CTX_use_RSAPrivateKey_file GRPC_SHADOW_SSL_CTX_use_RSAPrivateKey_file -#define SSL_CTX_use_certificate GRPC_SHADOW_SSL_CTX_use_certificate -#define SSL_CTX_use_certificate_ASN1 GRPC_SHADOW_SSL_CTX_use_certificate_ASN1 -#define SSL_CTX_use_certificate_chain_file GRPC_SHADOW_SSL_CTX_use_certificate_chain_file -#define SSL_CTX_use_certificate_file GRPC_SHADOW_SSL_CTX_use_certificate_file -#define SSL_CTX_use_psk_identity_hint GRPC_SHADOW_SSL_CTX_use_psk_identity_hint -#define SSL_SESSION_early_data_capable GRPC_SHADOW_SSL_SESSION_early_data_capable -#define SSL_SESSION_free GRPC_SHADOW_SSL_SESSION_free -#define SSL_SESSION_from_bytes GRPC_SHADOW_SSL_SESSION_from_bytes -#define SSL_SESSION_get0_cipher GRPC_SHADOW_SSL_SESSION_get0_cipher -#define SSL_SESSION_get0_id_context GRPC_SHADOW_SSL_SESSION_get0_id_context -#define SSL_SESSION_get0_ocsp_response GRPC_SHADOW_SSL_SESSION_get0_ocsp_response -#define SSL_SESSION_get0_peer GRPC_SHADOW_SSL_SESSION_get0_peer -#define SSL_SESSION_get0_peer_certificates GRPC_SHADOW_SSL_SESSION_get0_peer_certificates -#define SSL_SESSION_get0_peer_sha256 GRPC_SHADOW_SSL_SESSION_get0_peer_sha256 -#define SSL_SESSION_get0_signed_cert_timestamp_list GRPC_SHADOW_SSL_SESSION_get0_signed_cert_timestamp_list -#define SSL_SESSION_get0_ticket GRPC_SHADOW_SSL_SESSION_get0_ticket -#define SSL_SESSION_get_ex_data GRPC_SHADOW_SSL_SESSION_get_ex_data -#define SSL_SESSION_get_ex_new_index GRPC_SHADOW_SSL_SESSION_get_ex_new_index -#define SSL_SESSION_get_id GRPC_SHADOW_SSL_SESSION_get_id -#define SSL_SESSION_get_master_key GRPC_SHADOW_SSL_SESSION_get_master_key -#define SSL_SESSION_get_protocol_version GRPC_SHADOW_SSL_SESSION_get_protocol_version -#define SSL_SESSION_get_ticket_lifetime_hint GRPC_SHADOW_SSL_SESSION_get_ticket_lifetime_hint -#define SSL_SESSION_get_time GRPC_SHADOW_SSL_SESSION_get_time -#define SSL_SESSION_get_timeout GRPC_SHADOW_SSL_SESSION_get_timeout -#define SSL_SESSION_get_version GRPC_SHADOW_SSL_SESSION_get_version -#define SSL_SESSION_has_peer_sha256 GRPC_SHADOW_SSL_SESSION_has_peer_sha256 -#define SSL_SESSION_has_ticket GRPC_SHADOW_SSL_SESSION_has_ticket -#define SSL_SESSION_is_resumable GRPC_SHADOW_SSL_SESSION_is_resumable -#define SSL_SESSION_new GRPC_SHADOW_SSL_SESSION_new -#define SSL_SESSION_set1_id GRPC_SHADOW_SSL_SESSION_set1_id -#define SSL_SESSION_set1_id_context GRPC_SHADOW_SSL_SESSION_set1_id_context -#define SSL_SESSION_set_ex_data GRPC_SHADOW_SSL_SESSION_set_ex_data -#define SSL_SESSION_set_protocol_version GRPC_SHADOW_SSL_SESSION_set_protocol_version -#define SSL_SESSION_set_ticket GRPC_SHADOW_SSL_SESSION_set_ticket -#define SSL_SESSION_set_time GRPC_SHADOW_SSL_SESSION_set_time -#define SSL_SESSION_set_timeout GRPC_SHADOW_SSL_SESSION_set_timeout -#define SSL_SESSION_should_be_single_use GRPC_SHADOW_SSL_SESSION_should_be_single_use -#define SSL_SESSION_to_bytes GRPC_SHADOW_SSL_SESSION_to_bytes -#define SSL_SESSION_to_bytes_for_ticket GRPC_SHADOW_SSL_SESSION_to_bytes_for_ticket -#define SSL_SESSION_up_ref GRPC_SHADOW_SSL_SESSION_up_ref -#define SSL_accept GRPC_SHADOW_SSL_accept -#define SSL_add0_chain_cert GRPC_SHADOW_SSL_add0_chain_cert -#define SSL_add1_chain_cert GRPC_SHADOW_SSL_add1_chain_cert -#define SSL_add_client_CA GRPC_SHADOW_SSL_add_client_CA -#define SSL_add_file_cert_subjects_to_stack GRPC_SHADOW_SSL_add_file_cert_subjects_to_stack -#define SSL_alert_desc_string GRPC_SHADOW_SSL_alert_desc_string -#define SSL_alert_desc_string_long GRPC_SHADOW_SSL_alert_desc_string_long -#define SSL_alert_from_verify_result GRPC_SHADOW_SSL_alert_from_verify_result -#define SSL_alert_type_string GRPC_SHADOW_SSL_alert_type_string -#define SSL_alert_type_string_long GRPC_SHADOW_SSL_alert_type_string_long -#define SSL_cache_hit GRPC_SHADOW_SSL_cache_hit -#define SSL_certs_clear GRPC_SHADOW_SSL_certs_clear -#define SSL_check_private_key GRPC_SHADOW_SSL_check_private_key -#define SSL_clear GRPC_SHADOW_SSL_clear -#define SSL_clear_chain_certs GRPC_SHADOW_SSL_clear_chain_certs -#define SSL_clear_mode GRPC_SHADOW_SSL_clear_mode -#define SSL_clear_options GRPC_SHADOW_SSL_clear_options -#define SSL_connect GRPC_SHADOW_SSL_connect -#define SSL_cutthrough_complete GRPC_SHADOW_SSL_cutthrough_complete -#define SSL_delegated_credential_used GRPC_SHADOW_SSL_delegated_credential_used -#define SSL_do_handshake GRPC_SHADOW_SSL_do_handshake -#define SSL_dup_CA_list GRPC_SHADOW_SSL_dup_CA_list -#define SSL_early_callback_ctx_extension_get GRPC_SHADOW_SSL_early_callback_ctx_extension_get -#define SSL_early_data_accepted GRPC_SHADOW_SSL_early_data_accepted -#define SSL_enable_ocsp_stapling GRPC_SHADOW_SSL_enable_ocsp_stapling -#define SSL_enable_signed_cert_timestamps GRPC_SHADOW_SSL_enable_signed_cert_timestamps -#define SSL_enable_tls_channel_id GRPC_SHADOW_SSL_enable_tls_channel_id -#define SSL_error_description GRPC_SHADOW_SSL_error_description -#define SSL_export_keying_material GRPC_SHADOW_SSL_export_keying_material -#define SSL_free GRPC_SHADOW_SSL_free -#define SSL_generate_key_block GRPC_SHADOW_SSL_generate_key_block -#define SSL_get0_alpn_selected GRPC_SHADOW_SSL_get0_alpn_selected -#define SSL_get0_certificate_types GRPC_SHADOW_SSL_get0_certificate_types -#define SSL_get0_chain_certs GRPC_SHADOW_SSL_get0_chain_certs -#define SSL_get0_next_proto_negotiated GRPC_SHADOW_SSL_get0_next_proto_negotiated -#define SSL_get0_ocsp_response GRPC_SHADOW_SSL_get0_ocsp_response -#define SSL_get0_param GRPC_SHADOW_SSL_get0_param -#define SSL_get0_peer_certificates GRPC_SHADOW_SSL_get0_peer_certificates -#define SSL_get0_peer_verify_algorithms GRPC_SHADOW_SSL_get0_peer_verify_algorithms -#define SSL_get0_server_requested_CAs GRPC_SHADOW_SSL_get0_server_requested_CAs -#define SSL_get0_session_id_context GRPC_SHADOW_SSL_get0_session_id_context -#define SSL_get0_signed_cert_timestamp_list GRPC_SHADOW_SSL_get0_signed_cert_timestamp_list -#define SSL_get1_session GRPC_SHADOW_SSL_get1_session -#define SSL_get_SSL_CTX GRPC_SHADOW_SSL_get_SSL_CTX -#define SSL_get_certificate GRPC_SHADOW_SSL_get_certificate -#define SSL_get_cipher_by_value GRPC_SHADOW_SSL_get_cipher_by_value -#define SSL_get_cipher_list GRPC_SHADOW_SSL_get_cipher_list -#define SSL_get_ciphers GRPC_SHADOW_SSL_get_ciphers -#define SSL_get_client_CA_list GRPC_SHADOW_SSL_get_client_CA_list -#define SSL_get_client_random GRPC_SHADOW_SSL_get_client_random -#define SSL_get_current_cipher GRPC_SHADOW_SSL_get_current_cipher -#define SSL_get_current_compression GRPC_SHADOW_SSL_get_current_compression -#define SSL_get_current_expansion GRPC_SHADOW_SSL_get_current_expansion -#define SSL_get_curve_id GRPC_SHADOW_SSL_get_curve_id -#define SSL_get_curve_name GRPC_SHADOW_SSL_get_curve_name -#define SSL_get_default_timeout GRPC_SHADOW_SSL_get_default_timeout -#define SSL_get_early_data_reason GRPC_SHADOW_SSL_get_early_data_reason -#define SSL_get_error GRPC_SHADOW_SSL_get_error -#define SSL_get_ex_data GRPC_SHADOW_SSL_get_ex_data -#define SSL_get_ex_data_X509_STORE_CTX_idx GRPC_SHADOW_SSL_get_ex_data_X509_STORE_CTX_idx -#define SSL_get_ex_new_index GRPC_SHADOW_SSL_get_ex_new_index -#define SSL_get_extms_support GRPC_SHADOW_SSL_get_extms_support -#define SSL_get_fd GRPC_SHADOW_SSL_get_fd -#define SSL_get_finished GRPC_SHADOW_SSL_get_finished -#define SSL_get_info_callback GRPC_SHADOW_SSL_get_info_callback -#define SSL_get_ivs GRPC_SHADOW_SSL_get_ivs -#define SSL_get_key_block_len GRPC_SHADOW_SSL_get_key_block_len -#define SSL_get_max_cert_list GRPC_SHADOW_SSL_get_max_cert_list -#define SSL_get_max_proto_version GRPC_SHADOW_SSL_get_max_proto_version -#define SSL_get_min_proto_version GRPC_SHADOW_SSL_get_min_proto_version -#define SSL_get_mode GRPC_SHADOW_SSL_get_mode -#define SSL_get_negotiated_token_binding_param GRPC_SHADOW_SSL_get_negotiated_token_binding_param -#define SSL_get_options GRPC_SHADOW_SSL_get_options -#define SSL_get_peer_cert_chain GRPC_SHADOW_SSL_get_peer_cert_chain -#define SSL_get_peer_certificate GRPC_SHADOW_SSL_get_peer_certificate -#define SSL_get_peer_finished GRPC_SHADOW_SSL_get_peer_finished -#define SSL_get_peer_full_cert_chain GRPC_SHADOW_SSL_get_peer_full_cert_chain -#define SSL_get_peer_quic_transport_params GRPC_SHADOW_SSL_get_peer_quic_transport_params -#define SSL_get_peer_signature_algorithm GRPC_SHADOW_SSL_get_peer_signature_algorithm -#define SSL_get_pending_cipher GRPC_SHADOW_SSL_get_pending_cipher -#define SSL_get_privatekey GRPC_SHADOW_SSL_get_privatekey -#define SSL_get_psk_identity GRPC_SHADOW_SSL_get_psk_identity -#define SSL_get_psk_identity_hint GRPC_SHADOW_SSL_get_psk_identity_hint -#define SSL_get_quiet_shutdown GRPC_SHADOW_SSL_get_quiet_shutdown -#define SSL_get_rbio GRPC_SHADOW_SSL_get_rbio -#define SSL_get_read_ahead GRPC_SHADOW_SSL_get_read_ahead -#define SSL_get_read_sequence GRPC_SHADOW_SSL_get_read_sequence -#define SSL_get_rfd GRPC_SHADOW_SSL_get_rfd -#define SSL_get_secure_renegotiation_support GRPC_SHADOW_SSL_get_secure_renegotiation_support -#define SSL_get_selected_srtp_profile GRPC_SHADOW_SSL_get_selected_srtp_profile -#define SSL_get_server_random GRPC_SHADOW_SSL_get_server_random -#define SSL_get_server_tmp_key GRPC_SHADOW_SSL_get_server_tmp_key -#define SSL_get_servername GRPC_SHADOW_SSL_get_servername -#define SSL_get_servername_type GRPC_SHADOW_SSL_get_servername_type -#define SSL_get_session GRPC_SHADOW_SSL_get_session -#define SSL_get_shared_ciphers GRPC_SHADOW_SSL_get_shared_ciphers -#define SSL_get_shutdown GRPC_SHADOW_SSL_get_shutdown -#define SSL_get_signature_algorithm_digest GRPC_SHADOW_SSL_get_signature_algorithm_digest -#define SSL_get_signature_algorithm_key_type GRPC_SHADOW_SSL_get_signature_algorithm_key_type -#define SSL_get_signature_algorithm_name GRPC_SHADOW_SSL_get_signature_algorithm_name -#define SSL_get_srtp_profiles GRPC_SHADOW_SSL_get_srtp_profiles -#define SSL_get_ticket_age_skew GRPC_SHADOW_SSL_get_ticket_age_skew -#define SSL_get_tls_channel_id GRPC_SHADOW_SSL_get_tls_channel_id -#define SSL_get_tls_unique GRPC_SHADOW_SSL_get_tls_unique -#define SSL_get_tlsext_status_ocsp_resp GRPC_SHADOW_SSL_get_tlsext_status_ocsp_resp -#define SSL_get_tlsext_status_type GRPC_SHADOW_SSL_get_tlsext_status_type -#define SSL_get_verify_callback GRPC_SHADOW_SSL_get_verify_callback -#define SSL_get_verify_depth GRPC_SHADOW_SSL_get_verify_depth -#define SSL_get_verify_mode GRPC_SHADOW_SSL_get_verify_mode -#define SSL_get_verify_result GRPC_SHADOW_SSL_get_verify_result -#define SSL_get_version GRPC_SHADOW_SSL_get_version -#define SSL_get_wbio GRPC_SHADOW_SSL_get_wbio -#define SSL_get_wfd GRPC_SHADOW_SSL_get_wfd -#define SSL_get_write_sequence GRPC_SHADOW_SSL_get_write_sequence -#define SSL_in_early_data GRPC_SHADOW_SSL_in_early_data -#define SSL_in_false_start GRPC_SHADOW_SSL_in_false_start -#define SSL_in_init GRPC_SHADOW_SSL_in_init -#define SSL_is_dtls GRPC_SHADOW_SSL_is_dtls -#define SSL_is_init_finished GRPC_SHADOW_SSL_is_init_finished -#define SSL_is_server GRPC_SHADOW_SSL_is_server -#define SSL_is_signature_algorithm_rsa_pss GRPC_SHADOW_SSL_is_signature_algorithm_rsa_pss -#define SSL_is_tls13_downgrade GRPC_SHADOW_SSL_is_tls13_downgrade -#define SSL_is_token_binding_negotiated GRPC_SHADOW_SSL_is_token_binding_negotiated -#define SSL_key_update GRPC_SHADOW_SSL_key_update -#define SSL_library_init GRPC_SHADOW_SSL_library_init -#define SSL_load_client_CA_file GRPC_SHADOW_SSL_load_client_CA_file -#define SSL_load_error_strings GRPC_SHADOW_SSL_load_error_strings -#define SSL_magic_pending_session_ptr GRPC_SHADOW_SSL_magic_pending_session_ptr -#define SSL_max_seal_overhead GRPC_SHADOW_SSL_max_seal_overhead -#define SSL_need_tmp_RSA GRPC_SHADOW_SSL_need_tmp_RSA -#define SSL_new GRPC_SHADOW_SSL_new -#define SSL_num_renegotiations GRPC_SHADOW_SSL_num_renegotiations -#define SSL_peek GRPC_SHADOW_SSL_peek -#define SSL_pending GRPC_SHADOW_SSL_pending -#define SSL_pq_experiment_signal_seen GRPC_SHADOW_SSL_pq_experiment_signal_seen -#define SSL_process_quic_post_handshake GRPC_SHADOW_SSL_process_quic_post_handshake -#define SSL_provide_quic_data GRPC_SHADOW_SSL_provide_quic_data -#define SSL_quic_max_handshake_flight_len GRPC_SHADOW_SSL_quic_max_handshake_flight_len -#define SSL_quic_read_level GRPC_SHADOW_SSL_quic_read_level -#define SSL_quic_write_level GRPC_SHADOW_SSL_quic_write_level -#define SSL_read GRPC_SHADOW_SSL_read -#define SSL_renegotiate GRPC_SHADOW_SSL_renegotiate -#define SSL_renegotiate_pending GRPC_SHADOW_SSL_renegotiate_pending -#define SSL_reset_early_data_reject GRPC_SHADOW_SSL_reset_early_data_reject -#define SSL_select_next_proto GRPC_SHADOW_SSL_select_next_proto -#define SSL_send_fatal_alert GRPC_SHADOW_SSL_send_fatal_alert -#define SSL_session_reused GRPC_SHADOW_SSL_session_reused -#define SSL_set0_chain GRPC_SHADOW_SSL_set0_chain -#define SSL_set0_client_CAs GRPC_SHADOW_SSL_set0_client_CAs -#define SSL_set0_rbio GRPC_SHADOW_SSL_set0_rbio -#define SSL_set0_verify_cert_store GRPC_SHADOW_SSL_set0_verify_cert_store -#define SSL_set0_wbio GRPC_SHADOW_SSL_set0_wbio -#define SSL_set1_chain GRPC_SHADOW_SSL_set1_chain -#define SSL_set1_curves GRPC_SHADOW_SSL_set1_curves -#define SSL_set1_curves_list GRPC_SHADOW_SSL_set1_curves_list -#define SSL_set1_delegated_credential GRPC_SHADOW_SSL_set1_delegated_credential -#define SSL_set1_param GRPC_SHADOW_SSL_set1_param -#define SSL_set1_sigalgs GRPC_SHADOW_SSL_set1_sigalgs -#define SSL_set1_sigalgs_list GRPC_SHADOW_SSL_set1_sigalgs_list -#define SSL_set1_tls_channel_id GRPC_SHADOW_SSL_set1_tls_channel_id -#define SSL_set1_verify_cert_store GRPC_SHADOW_SSL_set1_verify_cert_store -#define SSL_set_SSL_CTX GRPC_SHADOW_SSL_set_SSL_CTX -#define SSL_set_accept_state GRPC_SHADOW_SSL_set_accept_state -#define SSL_set_alpn_protos GRPC_SHADOW_SSL_set_alpn_protos -#define SSL_set_bio GRPC_SHADOW_SSL_set_bio -#define SSL_set_cert_cb GRPC_SHADOW_SSL_set_cert_cb -#define SSL_set_chain_and_key GRPC_SHADOW_SSL_set_chain_and_key -#define SSL_set_cipher_list GRPC_SHADOW_SSL_set_cipher_list -#define SSL_set_client_CA_list GRPC_SHADOW_SSL_set_client_CA_list -#define SSL_set_connect_state GRPC_SHADOW_SSL_set_connect_state -#define SSL_set_custom_verify GRPC_SHADOW_SSL_set_custom_verify -#define SSL_set_early_data_enabled GRPC_SHADOW_SSL_set_early_data_enabled -#define SSL_set_enforce_rsa_key_usage GRPC_SHADOW_SSL_set_enforce_rsa_key_usage -#define SSL_set_ex_data GRPC_SHADOW_SSL_set_ex_data -#define SSL_set_fd GRPC_SHADOW_SSL_set_fd -#define SSL_set_ignore_tls13_downgrade GRPC_SHADOW_SSL_set_ignore_tls13_downgrade -#define SSL_set_info_callback GRPC_SHADOW_SSL_set_info_callback -#define SSL_set_jdk11_workaround GRPC_SHADOW_SSL_set_jdk11_workaround -#define SSL_set_max_cert_list GRPC_SHADOW_SSL_set_max_cert_list -#define SSL_set_max_proto_version GRPC_SHADOW_SSL_set_max_proto_version -#define SSL_set_max_send_fragment GRPC_SHADOW_SSL_set_max_send_fragment -#define SSL_set_min_proto_version GRPC_SHADOW_SSL_set_min_proto_version -#define SSL_set_mode GRPC_SHADOW_SSL_set_mode -#define SSL_set_msg_callback GRPC_SHADOW_SSL_set_msg_callback -#define SSL_set_msg_callback_arg GRPC_SHADOW_SSL_set_msg_callback_arg -#define SSL_set_mtu GRPC_SHADOW_SSL_set_mtu -#define SSL_set_ocsp_response GRPC_SHADOW_SSL_set_ocsp_response -#define SSL_set_options GRPC_SHADOW_SSL_set_options -#define SSL_set_private_key_method GRPC_SHADOW_SSL_set_private_key_method -#define SSL_set_psk_client_callback GRPC_SHADOW_SSL_set_psk_client_callback -#define SSL_set_psk_server_callback GRPC_SHADOW_SSL_set_psk_server_callback -#define SSL_set_purpose GRPC_SHADOW_SSL_set_purpose -#define SSL_set_quic_method GRPC_SHADOW_SSL_set_quic_method -#define SSL_set_quic_transport_params GRPC_SHADOW_SSL_set_quic_transport_params -#define SSL_set_quiet_shutdown GRPC_SHADOW_SSL_set_quiet_shutdown -#define SSL_set_read_ahead GRPC_SHADOW_SSL_set_read_ahead -#define SSL_set_renegotiate_mode GRPC_SHADOW_SSL_set_renegotiate_mode -#define SSL_set_retain_only_sha256_of_client_certs GRPC_SHADOW_SSL_set_retain_only_sha256_of_client_certs -#define SSL_set_rfd GRPC_SHADOW_SSL_set_rfd -#define SSL_set_session GRPC_SHADOW_SSL_set_session -#define SSL_set_session_id_context GRPC_SHADOW_SSL_set_session_id_context -#define SSL_set_shed_handshake_config GRPC_SHADOW_SSL_set_shed_handshake_config -#define SSL_set_shutdown GRPC_SHADOW_SSL_set_shutdown -#define SSL_set_signed_cert_timestamp_list GRPC_SHADOW_SSL_set_signed_cert_timestamp_list -#define SSL_set_signing_algorithm_prefs GRPC_SHADOW_SSL_set_signing_algorithm_prefs -#define SSL_set_srtp_profiles GRPC_SHADOW_SSL_set_srtp_profiles -#define SSL_set_state GRPC_SHADOW_SSL_set_state -#define SSL_set_strict_cipher_list GRPC_SHADOW_SSL_set_strict_cipher_list -#define SSL_set_tls_channel_id_enabled GRPC_SHADOW_SSL_set_tls_channel_id_enabled -#define SSL_set_tlsext_host_name GRPC_SHADOW_SSL_set_tlsext_host_name -#define SSL_set_tlsext_status_ocsp_resp GRPC_SHADOW_SSL_set_tlsext_status_ocsp_resp -#define SSL_set_tlsext_status_type GRPC_SHADOW_SSL_set_tlsext_status_type -#define SSL_set_tlsext_use_srtp GRPC_SHADOW_SSL_set_tlsext_use_srtp -#define SSL_set_tmp_dh GRPC_SHADOW_SSL_set_tmp_dh -#define SSL_set_tmp_dh_callback GRPC_SHADOW_SSL_set_tmp_dh_callback -#define SSL_set_tmp_ecdh GRPC_SHADOW_SSL_set_tmp_ecdh -#define SSL_set_tmp_rsa GRPC_SHADOW_SSL_set_tmp_rsa -#define SSL_set_tmp_rsa_callback GRPC_SHADOW_SSL_set_tmp_rsa_callback -#define SSL_set_token_binding_params GRPC_SHADOW_SSL_set_token_binding_params -#define SSL_set_trust GRPC_SHADOW_SSL_set_trust -#define SSL_set_verify GRPC_SHADOW_SSL_set_verify -#define SSL_set_verify_depth GRPC_SHADOW_SSL_set_verify_depth -#define SSL_set_verify_result GRPC_SHADOW_SSL_set_verify_result -#define SSL_set_wfd GRPC_SHADOW_SSL_set_wfd -#define SSL_shutdown GRPC_SHADOW_SSL_shutdown -#define SSL_state GRPC_SHADOW_SSL_state -#define SSL_state_string GRPC_SHADOW_SSL_state_string -#define SSL_state_string_long GRPC_SHADOW_SSL_state_string_long -#define SSL_total_renegotiations GRPC_SHADOW_SSL_total_renegotiations -#define SSL_use_PrivateKey GRPC_SHADOW_SSL_use_PrivateKey -#define SSL_use_PrivateKey_ASN1 GRPC_SHADOW_SSL_use_PrivateKey_ASN1 -#define SSL_use_PrivateKey_file GRPC_SHADOW_SSL_use_PrivateKey_file -#define SSL_use_RSAPrivateKey GRPC_SHADOW_SSL_use_RSAPrivateKey -#define SSL_use_RSAPrivateKey_ASN1 GRPC_SHADOW_SSL_use_RSAPrivateKey_ASN1 -#define SSL_use_RSAPrivateKey_file GRPC_SHADOW_SSL_use_RSAPrivateKey_file -#define SSL_use_certificate GRPC_SHADOW_SSL_use_certificate -#define SSL_use_certificate_ASN1 GRPC_SHADOW_SSL_use_certificate_ASN1 -#define SSL_use_certificate_file GRPC_SHADOW_SSL_use_certificate_file -#define SSL_use_psk_identity_hint GRPC_SHADOW_SSL_use_psk_identity_hint -#define SSL_version GRPC_SHADOW_SSL_version -#define SSL_want GRPC_SHADOW_SSL_want -#define SSL_write GRPC_SHADOW_SSL_write -#define SSLeay GRPC_SHADOW_SSLeay -#define SSLeay_version GRPC_SHADOW_SSLeay_version -#define SSLv23_client_method GRPC_SHADOW_SSLv23_client_method -#define SSLv23_method GRPC_SHADOW_SSLv23_method -#define SSLv23_server_method GRPC_SHADOW_SSLv23_server_method -#define SXNETID_free GRPC_SHADOW_SXNETID_free -#define SXNETID_it GRPC_SHADOW_SXNETID_it -#define SXNETID_new GRPC_SHADOW_SXNETID_new -#define SXNET_add_id_INTEGER GRPC_SHADOW_SXNET_add_id_INTEGER -#define SXNET_add_id_asc GRPC_SHADOW_SXNET_add_id_asc -#define SXNET_add_id_ulong GRPC_SHADOW_SXNET_add_id_ulong -#define SXNET_free GRPC_SHADOW_SXNET_free -#define SXNET_get_id_INTEGER GRPC_SHADOW_SXNET_get_id_INTEGER -#define SXNET_get_id_asc GRPC_SHADOW_SXNET_get_id_asc -#define SXNET_get_id_ulong GRPC_SHADOW_SXNET_get_id_ulong -#define SXNET_it GRPC_SHADOW_SXNET_it -#define SXNET_new GRPC_SHADOW_SXNET_new -#define TLS_client_method GRPC_SHADOW_TLS_client_method -#define TLS_method GRPC_SHADOW_TLS_method -#define TLS_server_method GRPC_SHADOW_TLS_server_method -#define TLS_with_buffers_method GRPC_SHADOW_TLS_with_buffers_method -#define TLSv1_1_client_method GRPC_SHADOW_TLSv1_1_client_method -#define TLSv1_1_method GRPC_SHADOW_TLSv1_1_method -#define TLSv1_1_server_method GRPC_SHADOW_TLSv1_1_server_method -#define TLSv1_2_client_method GRPC_SHADOW_TLSv1_2_client_method -#define TLSv1_2_method GRPC_SHADOW_TLSv1_2_method -#define TLSv1_2_server_method GRPC_SHADOW_TLSv1_2_server_method -#define TLSv1_client_method GRPC_SHADOW_TLSv1_client_method -#define TLSv1_method GRPC_SHADOW_TLSv1_method -#define TLSv1_server_method GRPC_SHADOW_TLSv1_server_method -#define USERNOTICE_free GRPC_SHADOW_USERNOTICE_free -#define USERNOTICE_it GRPC_SHADOW_USERNOTICE_it -#define USERNOTICE_new GRPC_SHADOW_USERNOTICE_new -#define UTF8_getc GRPC_SHADOW_UTF8_getc -#define UTF8_putc GRPC_SHADOW_UTF8_putc -#define X25519 GRPC_SHADOW_X25519 -#define X25519_keypair GRPC_SHADOW_X25519_keypair -#define X25519_public_from_private GRPC_SHADOW_X25519_public_from_private -#define X509V3_EXT_CRL_add_nconf GRPC_SHADOW_X509V3_EXT_CRL_add_nconf -#define X509V3_EXT_REQ_add_nconf GRPC_SHADOW_X509V3_EXT_REQ_add_nconf -#define X509V3_EXT_add GRPC_SHADOW_X509V3_EXT_add -#define X509V3_EXT_add_alias GRPC_SHADOW_X509V3_EXT_add_alias -#define X509V3_EXT_add_list GRPC_SHADOW_X509V3_EXT_add_list -#define X509V3_EXT_add_nconf GRPC_SHADOW_X509V3_EXT_add_nconf -#define X509V3_EXT_add_nconf_sk GRPC_SHADOW_X509V3_EXT_add_nconf_sk -#define X509V3_EXT_cleanup GRPC_SHADOW_X509V3_EXT_cleanup -#define X509V3_EXT_d2i GRPC_SHADOW_X509V3_EXT_d2i -#define X509V3_EXT_free GRPC_SHADOW_X509V3_EXT_free -#define X509V3_EXT_get GRPC_SHADOW_X509V3_EXT_get -#define X509V3_EXT_get_nid GRPC_SHADOW_X509V3_EXT_get_nid -#define X509V3_EXT_i2d GRPC_SHADOW_X509V3_EXT_i2d -#define X509V3_EXT_nconf GRPC_SHADOW_X509V3_EXT_nconf -#define X509V3_EXT_nconf_nid GRPC_SHADOW_X509V3_EXT_nconf_nid -#define X509V3_EXT_print GRPC_SHADOW_X509V3_EXT_print -#define X509V3_EXT_print_fp GRPC_SHADOW_X509V3_EXT_print_fp -#define X509V3_EXT_val_prn GRPC_SHADOW_X509V3_EXT_val_prn -#define X509V3_NAME_from_section GRPC_SHADOW_X509V3_NAME_from_section -#define X509V3_add1_i2d GRPC_SHADOW_X509V3_add1_i2d -#define X509V3_add_standard_extensions GRPC_SHADOW_X509V3_add_standard_extensions -#define X509V3_add_value GRPC_SHADOW_X509V3_add_value -#define X509V3_add_value_bool GRPC_SHADOW_X509V3_add_value_bool -#define X509V3_add_value_bool_nf GRPC_SHADOW_X509V3_add_value_bool_nf -#define X509V3_add_value_int GRPC_SHADOW_X509V3_add_value_int -#define X509V3_add_value_uchar GRPC_SHADOW_X509V3_add_value_uchar -#define X509V3_conf_free GRPC_SHADOW_X509V3_conf_free -#define X509V3_extensions_print GRPC_SHADOW_X509V3_extensions_print -#define X509V3_get_d2i GRPC_SHADOW_X509V3_get_d2i -#define X509V3_get_section GRPC_SHADOW_X509V3_get_section -#define X509V3_get_string GRPC_SHADOW_X509V3_get_string -#define X509V3_get_value_bool GRPC_SHADOW_X509V3_get_value_bool -#define X509V3_get_value_int GRPC_SHADOW_X509V3_get_value_int -#define X509V3_parse_list GRPC_SHADOW_X509V3_parse_list -#define X509V3_section_free GRPC_SHADOW_X509V3_section_free -#define X509V3_set_ctx GRPC_SHADOW_X509V3_set_ctx -#define X509V3_set_nconf GRPC_SHADOW_X509V3_set_nconf -#define X509V3_string_free GRPC_SHADOW_X509V3_string_free -#define X509_ALGORS_it GRPC_SHADOW_X509_ALGORS_it -#define X509_ALGOR_cmp GRPC_SHADOW_X509_ALGOR_cmp -#define X509_ALGOR_dup GRPC_SHADOW_X509_ALGOR_dup -#define X509_ALGOR_free GRPC_SHADOW_X509_ALGOR_free -#define X509_ALGOR_get0 GRPC_SHADOW_X509_ALGOR_get0 -#define X509_ALGOR_it GRPC_SHADOW_X509_ALGOR_it -#define X509_ALGOR_new GRPC_SHADOW_X509_ALGOR_new -#define X509_ALGOR_set0 GRPC_SHADOW_X509_ALGOR_set0 -#define X509_ALGOR_set_md GRPC_SHADOW_X509_ALGOR_set_md -#define X509_ATTRIBUTE_SET_it GRPC_SHADOW_X509_ATTRIBUTE_SET_it -#define X509_ATTRIBUTE_count GRPC_SHADOW_X509_ATTRIBUTE_count -#define X509_ATTRIBUTE_create GRPC_SHADOW_X509_ATTRIBUTE_create -#define X509_ATTRIBUTE_create_by_NID GRPC_SHADOW_X509_ATTRIBUTE_create_by_NID -#define X509_ATTRIBUTE_create_by_OBJ GRPC_SHADOW_X509_ATTRIBUTE_create_by_OBJ -#define X509_ATTRIBUTE_create_by_txt GRPC_SHADOW_X509_ATTRIBUTE_create_by_txt -#define X509_ATTRIBUTE_dup GRPC_SHADOW_X509_ATTRIBUTE_dup -#define X509_ATTRIBUTE_free GRPC_SHADOW_X509_ATTRIBUTE_free -#define X509_ATTRIBUTE_get0_data GRPC_SHADOW_X509_ATTRIBUTE_get0_data -#define X509_ATTRIBUTE_get0_object GRPC_SHADOW_X509_ATTRIBUTE_get0_object -#define X509_ATTRIBUTE_get0_type GRPC_SHADOW_X509_ATTRIBUTE_get0_type -#define X509_ATTRIBUTE_it GRPC_SHADOW_X509_ATTRIBUTE_it -#define X509_ATTRIBUTE_new GRPC_SHADOW_X509_ATTRIBUTE_new -#define X509_ATTRIBUTE_set1_data GRPC_SHADOW_X509_ATTRIBUTE_set1_data -#define X509_ATTRIBUTE_set1_object GRPC_SHADOW_X509_ATTRIBUTE_set1_object -#define X509_CERT_AUX_free GRPC_SHADOW_X509_CERT_AUX_free -#define X509_CERT_AUX_it GRPC_SHADOW_X509_CERT_AUX_it -#define X509_CERT_AUX_new GRPC_SHADOW_X509_CERT_AUX_new -#define X509_CERT_AUX_print GRPC_SHADOW_X509_CERT_AUX_print -#define X509_CINF_free GRPC_SHADOW_X509_CINF_free -#define X509_CINF_it GRPC_SHADOW_X509_CINF_it -#define X509_CINF_new GRPC_SHADOW_X509_CINF_new -#define X509_CRL_INFO_free GRPC_SHADOW_X509_CRL_INFO_free -#define X509_CRL_INFO_it GRPC_SHADOW_X509_CRL_INFO_it -#define X509_CRL_INFO_new GRPC_SHADOW_X509_CRL_INFO_new -#define X509_CRL_METHOD_free GRPC_SHADOW_X509_CRL_METHOD_free -#define X509_CRL_METHOD_new GRPC_SHADOW_X509_CRL_METHOD_new -#define X509_CRL_add0_revoked GRPC_SHADOW_X509_CRL_add0_revoked -#define X509_CRL_add1_ext_i2d GRPC_SHADOW_X509_CRL_add1_ext_i2d -#define X509_CRL_add_ext GRPC_SHADOW_X509_CRL_add_ext -#define X509_CRL_check_suiteb GRPC_SHADOW_X509_CRL_check_suiteb -#define X509_CRL_cmp GRPC_SHADOW_X509_CRL_cmp -#define X509_CRL_delete_ext GRPC_SHADOW_X509_CRL_delete_ext -#define X509_CRL_diff GRPC_SHADOW_X509_CRL_diff -#define X509_CRL_digest GRPC_SHADOW_X509_CRL_digest -#define X509_CRL_dup GRPC_SHADOW_X509_CRL_dup -#define X509_CRL_free GRPC_SHADOW_X509_CRL_free -#define X509_CRL_get0_by_cert GRPC_SHADOW_X509_CRL_get0_by_cert -#define X509_CRL_get0_by_serial GRPC_SHADOW_X509_CRL_get0_by_serial -#define X509_CRL_get0_lastUpdate GRPC_SHADOW_X509_CRL_get0_lastUpdate -#define X509_CRL_get0_nextUpdate GRPC_SHADOW_X509_CRL_get0_nextUpdate -#define X509_CRL_get0_signature GRPC_SHADOW_X509_CRL_get0_signature -#define X509_CRL_get_ext GRPC_SHADOW_X509_CRL_get_ext -#define X509_CRL_get_ext_by_NID GRPC_SHADOW_X509_CRL_get_ext_by_NID -#define X509_CRL_get_ext_by_OBJ GRPC_SHADOW_X509_CRL_get_ext_by_OBJ -#define X509_CRL_get_ext_by_critical GRPC_SHADOW_X509_CRL_get_ext_by_critical -#define X509_CRL_get_ext_count GRPC_SHADOW_X509_CRL_get_ext_count -#define X509_CRL_get_ext_d2i GRPC_SHADOW_X509_CRL_get_ext_d2i -#define X509_CRL_get_meth_data GRPC_SHADOW_X509_CRL_get_meth_data -#define X509_CRL_get_signature_nid GRPC_SHADOW_X509_CRL_get_signature_nid -#define X509_CRL_it GRPC_SHADOW_X509_CRL_it -#define X509_CRL_match GRPC_SHADOW_X509_CRL_match -#define X509_CRL_new GRPC_SHADOW_X509_CRL_new -#define X509_CRL_print GRPC_SHADOW_X509_CRL_print -#define X509_CRL_print_fp GRPC_SHADOW_X509_CRL_print_fp -#define X509_CRL_set_default_method GRPC_SHADOW_X509_CRL_set_default_method -#define X509_CRL_set_issuer_name GRPC_SHADOW_X509_CRL_set_issuer_name -#define X509_CRL_set_lastUpdate GRPC_SHADOW_X509_CRL_set_lastUpdate -#define X509_CRL_set_meth_data GRPC_SHADOW_X509_CRL_set_meth_data -#define X509_CRL_set_nextUpdate GRPC_SHADOW_X509_CRL_set_nextUpdate -#define X509_CRL_set_version GRPC_SHADOW_X509_CRL_set_version -#define X509_CRL_sign GRPC_SHADOW_X509_CRL_sign -#define X509_CRL_sign_ctx GRPC_SHADOW_X509_CRL_sign_ctx -#define X509_CRL_sort GRPC_SHADOW_X509_CRL_sort -#define X509_CRL_up_ref GRPC_SHADOW_X509_CRL_up_ref -#define X509_CRL_verify GRPC_SHADOW_X509_CRL_verify -#define X509_EXTENSIONS_it GRPC_SHADOW_X509_EXTENSIONS_it -#define X509_EXTENSION_create_by_NID GRPC_SHADOW_X509_EXTENSION_create_by_NID -#define X509_EXTENSION_create_by_OBJ GRPC_SHADOW_X509_EXTENSION_create_by_OBJ -#define X509_EXTENSION_dup GRPC_SHADOW_X509_EXTENSION_dup -#define X509_EXTENSION_free GRPC_SHADOW_X509_EXTENSION_free -#define X509_EXTENSION_get_critical GRPC_SHADOW_X509_EXTENSION_get_critical -#define X509_EXTENSION_get_data GRPC_SHADOW_X509_EXTENSION_get_data -#define X509_EXTENSION_get_object GRPC_SHADOW_X509_EXTENSION_get_object -#define X509_EXTENSION_it GRPC_SHADOW_X509_EXTENSION_it -#define X509_EXTENSION_new GRPC_SHADOW_X509_EXTENSION_new -#define X509_EXTENSION_set_critical GRPC_SHADOW_X509_EXTENSION_set_critical -#define X509_EXTENSION_set_data GRPC_SHADOW_X509_EXTENSION_set_data -#define X509_EXTENSION_set_object GRPC_SHADOW_X509_EXTENSION_set_object -#define X509_INFO_free GRPC_SHADOW_X509_INFO_free -#define X509_INFO_new GRPC_SHADOW_X509_INFO_new -#define X509_LOOKUP_by_alias GRPC_SHADOW_X509_LOOKUP_by_alias -#define X509_LOOKUP_by_fingerprint GRPC_SHADOW_X509_LOOKUP_by_fingerprint -#define X509_LOOKUP_by_issuer_serial GRPC_SHADOW_X509_LOOKUP_by_issuer_serial -#define X509_LOOKUP_by_subject GRPC_SHADOW_X509_LOOKUP_by_subject -#define X509_LOOKUP_ctrl GRPC_SHADOW_X509_LOOKUP_ctrl -#define X509_LOOKUP_file GRPC_SHADOW_X509_LOOKUP_file -#define X509_LOOKUP_free GRPC_SHADOW_X509_LOOKUP_free -#define X509_LOOKUP_hash_dir GRPC_SHADOW_X509_LOOKUP_hash_dir -#define X509_LOOKUP_init GRPC_SHADOW_X509_LOOKUP_init -#define X509_LOOKUP_new GRPC_SHADOW_X509_LOOKUP_new -#define X509_LOOKUP_shutdown GRPC_SHADOW_X509_LOOKUP_shutdown -#define X509_NAME_ENTRIES_it GRPC_SHADOW_X509_NAME_ENTRIES_it -#define X509_NAME_ENTRY_create_by_NID GRPC_SHADOW_X509_NAME_ENTRY_create_by_NID -#define X509_NAME_ENTRY_create_by_OBJ GRPC_SHADOW_X509_NAME_ENTRY_create_by_OBJ -#define X509_NAME_ENTRY_create_by_txt GRPC_SHADOW_X509_NAME_ENTRY_create_by_txt -#define X509_NAME_ENTRY_dup GRPC_SHADOW_X509_NAME_ENTRY_dup -#define X509_NAME_ENTRY_free GRPC_SHADOW_X509_NAME_ENTRY_free -#define X509_NAME_ENTRY_get_data GRPC_SHADOW_X509_NAME_ENTRY_get_data -#define X509_NAME_ENTRY_get_object GRPC_SHADOW_X509_NAME_ENTRY_get_object -#define X509_NAME_ENTRY_it GRPC_SHADOW_X509_NAME_ENTRY_it -#define X509_NAME_ENTRY_new GRPC_SHADOW_X509_NAME_ENTRY_new -#define X509_NAME_ENTRY_set GRPC_SHADOW_X509_NAME_ENTRY_set -#define X509_NAME_ENTRY_set_data GRPC_SHADOW_X509_NAME_ENTRY_set_data -#define X509_NAME_ENTRY_set_object GRPC_SHADOW_X509_NAME_ENTRY_set_object -#define X509_NAME_INTERNAL_it GRPC_SHADOW_X509_NAME_INTERNAL_it -#define X509_NAME_add_entry GRPC_SHADOW_X509_NAME_add_entry -#define X509_NAME_add_entry_by_NID GRPC_SHADOW_X509_NAME_add_entry_by_NID -#define X509_NAME_add_entry_by_OBJ GRPC_SHADOW_X509_NAME_add_entry_by_OBJ -#define X509_NAME_add_entry_by_txt GRPC_SHADOW_X509_NAME_add_entry_by_txt -#define X509_NAME_cmp GRPC_SHADOW_X509_NAME_cmp -#define X509_NAME_delete_entry GRPC_SHADOW_X509_NAME_delete_entry -#define X509_NAME_digest GRPC_SHADOW_X509_NAME_digest -#define X509_NAME_dup GRPC_SHADOW_X509_NAME_dup -#define X509_NAME_entry_count GRPC_SHADOW_X509_NAME_entry_count -#define X509_NAME_free GRPC_SHADOW_X509_NAME_free -#define X509_NAME_get0_der GRPC_SHADOW_X509_NAME_get0_der -#define X509_NAME_get_entry GRPC_SHADOW_X509_NAME_get_entry -#define X509_NAME_get_index_by_NID GRPC_SHADOW_X509_NAME_get_index_by_NID -#define X509_NAME_get_index_by_OBJ GRPC_SHADOW_X509_NAME_get_index_by_OBJ -#define X509_NAME_get_text_by_NID GRPC_SHADOW_X509_NAME_get_text_by_NID -#define X509_NAME_get_text_by_OBJ GRPC_SHADOW_X509_NAME_get_text_by_OBJ -#define X509_NAME_hash GRPC_SHADOW_X509_NAME_hash -#define X509_NAME_hash_old GRPC_SHADOW_X509_NAME_hash_old -#define X509_NAME_it GRPC_SHADOW_X509_NAME_it -#define X509_NAME_new GRPC_SHADOW_X509_NAME_new -#define X509_NAME_oneline GRPC_SHADOW_X509_NAME_oneline -#define X509_NAME_print GRPC_SHADOW_X509_NAME_print -#define X509_NAME_print_ex GRPC_SHADOW_X509_NAME_print_ex -#define X509_NAME_print_ex_fp GRPC_SHADOW_X509_NAME_print_ex_fp -#define X509_NAME_set GRPC_SHADOW_X509_NAME_set -#define X509_OBJECT_free_contents GRPC_SHADOW_X509_OBJECT_free_contents -#define X509_OBJECT_get0_X509 GRPC_SHADOW_X509_OBJECT_get0_X509 -#define X509_OBJECT_get_type GRPC_SHADOW_X509_OBJECT_get_type -#define X509_OBJECT_idx_by_subject GRPC_SHADOW_X509_OBJECT_idx_by_subject -#define X509_OBJECT_retrieve_by_subject GRPC_SHADOW_X509_OBJECT_retrieve_by_subject -#define X509_OBJECT_retrieve_match GRPC_SHADOW_X509_OBJECT_retrieve_match -#define X509_OBJECT_up_ref_count GRPC_SHADOW_X509_OBJECT_up_ref_count -#define X509_PKEY_free GRPC_SHADOW_X509_PKEY_free -#define X509_PKEY_new GRPC_SHADOW_X509_PKEY_new -#define X509_POLICY_NODE_print GRPC_SHADOW_X509_POLICY_NODE_print -#define X509_PUBKEY_free GRPC_SHADOW_X509_PUBKEY_free -#define X509_PUBKEY_get GRPC_SHADOW_X509_PUBKEY_get -#define X509_PUBKEY_get0_param GRPC_SHADOW_X509_PUBKEY_get0_param -#define X509_PUBKEY_it GRPC_SHADOW_X509_PUBKEY_it -#define X509_PUBKEY_new GRPC_SHADOW_X509_PUBKEY_new -#define X509_PUBKEY_set GRPC_SHADOW_X509_PUBKEY_set -#define X509_PUBKEY_set0_param GRPC_SHADOW_X509_PUBKEY_set0_param -#define X509_PURPOSE_add GRPC_SHADOW_X509_PURPOSE_add -#define X509_PURPOSE_cleanup GRPC_SHADOW_X509_PURPOSE_cleanup -#define X509_PURPOSE_get0 GRPC_SHADOW_X509_PURPOSE_get0 -#define X509_PURPOSE_get0_name GRPC_SHADOW_X509_PURPOSE_get0_name -#define X509_PURPOSE_get0_sname GRPC_SHADOW_X509_PURPOSE_get0_sname -#define X509_PURPOSE_get_by_id GRPC_SHADOW_X509_PURPOSE_get_by_id -#define X509_PURPOSE_get_by_sname GRPC_SHADOW_X509_PURPOSE_get_by_sname -#define X509_PURPOSE_get_count GRPC_SHADOW_X509_PURPOSE_get_count -#define X509_PURPOSE_get_id GRPC_SHADOW_X509_PURPOSE_get_id -#define X509_PURPOSE_get_trust GRPC_SHADOW_X509_PURPOSE_get_trust -#define X509_PURPOSE_set GRPC_SHADOW_X509_PURPOSE_set -#define X509_REQ_INFO_free GRPC_SHADOW_X509_REQ_INFO_free -#define X509_REQ_INFO_it GRPC_SHADOW_X509_REQ_INFO_it -#define X509_REQ_INFO_new GRPC_SHADOW_X509_REQ_INFO_new -#define X509_REQ_add1_attr GRPC_SHADOW_X509_REQ_add1_attr -#define X509_REQ_add1_attr_by_NID GRPC_SHADOW_X509_REQ_add1_attr_by_NID -#define X509_REQ_add1_attr_by_OBJ GRPC_SHADOW_X509_REQ_add1_attr_by_OBJ -#define X509_REQ_add1_attr_by_txt GRPC_SHADOW_X509_REQ_add1_attr_by_txt -#define X509_REQ_add_extensions GRPC_SHADOW_X509_REQ_add_extensions -#define X509_REQ_add_extensions_nid GRPC_SHADOW_X509_REQ_add_extensions_nid -#define X509_REQ_check_private_key GRPC_SHADOW_X509_REQ_check_private_key -#define X509_REQ_delete_attr GRPC_SHADOW_X509_REQ_delete_attr -#define X509_REQ_digest GRPC_SHADOW_X509_REQ_digest -#define X509_REQ_dup GRPC_SHADOW_X509_REQ_dup -#define X509_REQ_extension_nid GRPC_SHADOW_X509_REQ_extension_nid -#define X509_REQ_free GRPC_SHADOW_X509_REQ_free -#define X509_REQ_get0_signature GRPC_SHADOW_X509_REQ_get0_signature -#define X509_REQ_get1_email GRPC_SHADOW_X509_REQ_get1_email -#define X509_REQ_get_attr GRPC_SHADOW_X509_REQ_get_attr -#define X509_REQ_get_attr_by_NID GRPC_SHADOW_X509_REQ_get_attr_by_NID -#define X509_REQ_get_attr_by_OBJ GRPC_SHADOW_X509_REQ_get_attr_by_OBJ -#define X509_REQ_get_attr_count GRPC_SHADOW_X509_REQ_get_attr_count -#define X509_REQ_get_extension_nids GRPC_SHADOW_X509_REQ_get_extension_nids -#define X509_REQ_get_extensions GRPC_SHADOW_X509_REQ_get_extensions -#define X509_REQ_get_pubkey GRPC_SHADOW_X509_REQ_get_pubkey -#define X509_REQ_get_signature_nid GRPC_SHADOW_X509_REQ_get_signature_nid -#define X509_REQ_it GRPC_SHADOW_X509_REQ_it -#define X509_REQ_new GRPC_SHADOW_X509_REQ_new -#define X509_REQ_print GRPC_SHADOW_X509_REQ_print -#define X509_REQ_print_ex GRPC_SHADOW_X509_REQ_print_ex -#define X509_REQ_print_fp GRPC_SHADOW_X509_REQ_print_fp -#define X509_REQ_set_extension_nids GRPC_SHADOW_X509_REQ_set_extension_nids -#define X509_REQ_set_pubkey GRPC_SHADOW_X509_REQ_set_pubkey -#define X509_REQ_set_subject_name GRPC_SHADOW_X509_REQ_set_subject_name -#define X509_REQ_set_version GRPC_SHADOW_X509_REQ_set_version -#define X509_REQ_sign GRPC_SHADOW_X509_REQ_sign -#define X509_REQ_sign_ctx GRPC_SHADOW_X509_REQ_sign_ctx -#define X509_REQ_to_X509 GRPC_SHADOW_X509_REQ_to_X509 -#define X509_REQ_verify GRPC_SHADOW_X509_REQ_verify -#define X509_REVOKED_add1_ext_i2d GRPC_SHADOW_X509_REVOKED_add1_ext_i2d -#define X509_REVOKED_add_ext GRPC_SHADOW_X509_REVOKED_add_ext -#define X509_REVOKED_delete_ext GRPC_SHADOW_X509_REVOKED_delete_ext -#define X509_REVOKED_dup GRPC_SHADOW_X509_REVOKED_dup -#define X509_REVOKED_free GRPC_SHADOW_X509_REVOKED_free -#define X509_REVOKED_get0_revocationDate GRPC_SHADOW_X509_REVOKED_get0_revocationDate -#define X509_REVOKED_get0_serialNumber GRPC_SHADOW_X509_REVOKED_get0_serialNumber -#define X509_REVOKED_get_ext GRPC_SHADOW_X509_REVOKED_get_ext -#define X509_REVOKED_get_ext_by_NID GRPC_SHADOW_X509_REVOKED_get_ext_by_NID -#define X509_REVOKED_get_ext_by_OBJ GRPC_SHADOW_X509_REVOKED_get_ext_by_OBJ -#define X509_REVOKED_get_ext_by_critical GRPC_SHADOW_X509_REVOKED_get_ext_by_critical -#define X509_REVOKED_get_ext_count GRPC_SHADOW_X509_REVOKED_get_ext_count -#define X509_REVOKED_get_ext_d2i GRPC_SHADOW_X509_REVOKED_get_ext_d2i -#define X509_REVOKED_it GRPC_SHADOW_X509_REVOKED_it -#define X509_REVOKED_new GRPC_SHADOW_X509_REVOKED_new -#define X509_REVOKED_set_revocationDate GRPC_SHADOW_X509_REVOKED_set_revocationDate -#define X509_REVOKED_set_serialNumber GRPC_SHADOW_X509_REVOKED_set_serialNumber -#define X509_SIG_free GRPC_SHADOW_X509_SIG_free -#define X509_SIG_it GRPC_SHADOW_X509_SIG_it -#define X509_SIG_new GRPC_SHADOW_X509_SIG_new -#define X509_STORE_CTX_cleanup GRPC_SHADOW_X509_STORE_CTX_cleanup -#define X509_STORE_CTX_free GRPC_SHADOW_X509_STORE_CTX_free -#define X509_STORE_CTX_get0_cert GRPC_SHADOW_X509_STORE_CTX_get0_cert -#define X509_STORE_CTX_get0_current_crl GRPC_SHADOW_X509_STORE_CTX_get0_current_crl -#define X509_STORE_CTX_get0_current_issuer GRPC_SHADOW_X509_STORE_CTX_get0_current_issuer -#define X509_STORE_CTX_get0_param GRPC_SHADOW_X509_STORE_CTX_get0_param -#define X509_STORE_CTX_get0_parent_ctx GRPC_SHADOW_X509_STORE_CTX_get0_parent_ctx -#define X509_STORE_CTX_get0_policy_tree GRPC_SHADOW_X509_STORE_CTX_get0_policy_tree -#define X509_STORE_CTX_get0_store GRPC_SHADOW_X509_STORE_CTX_get0_store -#define X509_STORE_CTX_get0_untrusted GRPC_SHADOW_X509_STORE_CTX_get0_untrusted -#define X509_STORE_CTX_get1_chain GRPC_SHADOW_X509_STORE_CTX_get1_chain -#define X509_STORE_CTX_get1_issuer GRPC_SHADOW_X509_STORE_CTX_get1_issuer -#define X509_STORE_CTX_get_chain GRPC_SHADOW_X509_STORE_CTX_get_chain -#define X509_STORE_CTX_get_current_cert GRPC_SHADOW_X509_STORE_CTX_get_current_cert -#define X509_STORE_CTX_get_error GRPC_SHADOW_X509_STORE_CTX_get_error -#define X509_STORE_CTX_get_error_depth GRPC_SHADOW_X509_STORE_CTX_get_error_depth -#define X509_STORE_CTX_get_ex_data GRPC_SHADOW_X509_STORE_CTX_get_ex_data -#define X509_STORE_CTX_get_ex_new_index GRPC_SHADOW_X509_STORE_CTX_get_ex_new_index -#define X509_STORE_CTX_get_explicit_policy GRPC_SHADOW_X509_STORE_CTX_get_explicit_policy -#define X509_STORE_CTX_init GRPC_SHADOW_X509_STORE_CTX_init -#define X509_STORE_CTX_new GRPC_SHADOW_X509_STORE_CTX_new -#define X509_STORE_CTX_purpose_inherit GRPC_SHADOW_X509_STORE_CTX_purpose_inherit -#define X509_STORE_CTX_set0_crls GRPC_SHADOW_X509_STORE_CTX_set0_crls -#define X509_STORE_CTX_set0_param GRPC_SHADOW_X509_STORE_CTX_set0_param -#define X509_STORE_CTX_set_cert GRPC_SHADOW_X509_STORE_CTX_set_cert -#define X509_STORE_CTX_set_chain GRPC_SHADOW_X509_STORE_CTX_set_chain -#define X509_STORE_CTX_set_default GRPC_SHADOW_X509_STORE_CTX_set_default -#define X509_STORE_CTX_set_depth GRPC_SHADOW_X509_STORE_CTX_set_depth -#define X509_STORE_CTX_set_error GRPC_SHADOW_X509_STORE_CTX_set_error -#define X509_STORE_CTX_set_ex_data GRPC_SHADOW_X509_STORE_CTX_set_ex_data -#define X509_STORE_CTX_set_flags GRPC_SHADOW_X509_STORE_CTX_set_flags -#define X509_STORE_CTX_set_purpose GRPC_SHADOW_X509_STORE_CTX_set_purpose -#define X509_STORE_CTX_set_time GRPC_SHADOW_X509_STORE_CTX_set_time -#define X509_STORE_CTX_set_trust GRPC_SHADOW_X509_STORE_CTX_set_trust -#define X509_STORE_CTX_set_verify_cb GRPC_SHADOW_X509_STORE_CTX_set_verify_cb -#define X509_STORE_CTX_trusted_stack GRPC_SHADOW_X509_STORE_CTX_trusted_stack -#define X509_STORE_CTX_zero GRPC_SHADOW_X509_STORE_CTX_zero -#define X509_STORE_add_cert GRPC_SHADOW_X509_STORE_add_cert -#define X509_STORE_add_crl GRPC_SHADOW_X509_STORE_add_crl -#define X509_STORE_add_lookup GRPC_SHADOW_X509_STORE_add_lookup -#define X509_STORE_free GRPC_SHADOW_X509_STORE_free -#define X509_STORE_get0_objects GRPC_SHADOW_X509_STORE_get0_objects -#define X509_STORE_get0_param GRPC_SHADOW_X509_STORE_get0_param -#define X509_STORE_get1_certs GRPC_SHADOW_X509_STORE_get1_certs -#define X509_STORE_get1_crls GRPC_SHADOW_X509_STORE_get1_crls -#define X509_STORE_get_by_subject GRPC_SHADOW_X509_STORE_get_by_subject -#define X509_STORE_get_cert_crl GRPC_SHADOW_X509_STORE_get_cert_crl -#define X509_STORE_get_check_crl GRPC_SHADOW_X509_STORE_get_check_crl -#define X509_STORE_get_check_issued GRPC_SHADOW_X509_STORE_get_check_issued -#define X509_STORE_get_check_revocation GRPC_SHADOW_X509_STORE_get_check_revocation -#define X509_STORE_get_cleanup GRPC_SHADOW_X509_STORE_get_cleanup -#define X509_STORE_get_get_crl GRPC_SHADOW_X509_STORE_get_get_crl -#define X509_STORE_get_get_issuer GRPC_SHADOW_X509_STORE_get_get_issuer -#define X509_STORE_get_lookup_certs GRPC_SHADOW_X509_STORE_get_lookup_certs -#define X509_STORE_get_lookup_crls GRPC_SHADOW_X509_STORE_get_lookup_crls -#define X509_STORE_get_verify GRPC_SHADOW_X509_STORE_get_verify -#define X509_STORE_get_verify_cb GRPC_SHADOW_X509_STORE_get_verify_cb -#define X509_STORE_load_locations GRPC_SHADOW_X509_STORE_load_locations -#define X509_STORE_new GRPC_SHADOW_X509_STORE_new -#define X509_STORE_set0_additional_untrusted GRPC_SHADOW_X509_STORE_set0_additional_untrusted -#define X509_STORE_set1_param GRPC_SHADOW_X509_STORE_set1_param -#define X509_STORE_set_cert_crl GRPC_SHADOW_X509_STORE_set_cert_crl -#define X509_STORE_set_check_crl GRPC_SHADOW_X509_STORE_set_check_crl -#define X509_STORE_set_check_issued GRPC_SHADOW_X509_STORE_set_check_issued -#define X509_STORE_set_check_revocation GRPC_SHADOW_X509_STORE_set_check_revocation -#define X509_STORE_set_cleanup GRPC_SHADOW_X509_STORE_set_cleanup -#define X509_STORE_set_default_paths GRPC_SHADOW_X509_STORE_set_default_paths -#define X509_STORE_set_depth GRPC_SHADOW_X509_STORE_set_depth -#define X509_STORE_set_flags GRPC_SHADOW_X509_STORE_set_flags -#define X509_STORE_set_get_crl GRPC_SHADOW_X509_STORE_set_get_crl -#define X509_STORE_set_get_issuer GRPC_SHADOW_X509_STORE_set_get_issuer -#define X509_STORE_set_lookup_certs GRPC_SHADOW_X509_STORE_set_lookup_certs -#define X509_STORE_set_lookup_crls GRPC_SHADOW_X509_STORE_set_lookup_crls -#define X509_STORE_set_purpose GRPC_SHADOW_X509_STORE_set_purpose -#define X509_STORE_set_trust GRPC_SHADOW_X509_STORE_set_trust -#define X509_STORE_set_verify GRPC_SHADOW_X509_STORE_set_verify -#define X509_STORE_set_verify_cb GRPC_SHADOW_X509_STORE_set_verify_cb -#define X509_STORE_up_ref GRPC_SHADOW_X509_STORE_up_ref -#define X509_TRUST_add GRPC_SHADOW_X509_TRUST_add -#define X509_TRUST_cleanup GRPC_SHADOW_X509_TRUST_cleanup -#define X509_TRUST_get0 GRPC_SHADOW_X509_TRUST_get0 -#define X509_TRUST_get0_name GRPC_SHADOW_X509_TRUST_get0_name -#define X509_TRUST_get_by_id GRPC_SHADOW_X509_TRUST_get_by_id -#define X509_TRUST_get_count GRPC_SHADOW_X509_TRUST_get_count -#define X509_TRUST_get_flags GRPC_SHADOW_X509_TRUST_get_flags -#define X509_TRUST_get_trust GRPC_SHADOW_X509_TRUST_get_trust -#define X509_TRUST_set GRPC_SHADOW_X509_TRUST_set -#define X509_TRUST_set_default GRPC_SHADOW_X509_TRUST_set_default -#define X509_VAL_free GRPC_SHADOW_X509_VAL_free -#define X509_VAL_it GRPC_SHADOW_X509_VAL_it -#define X509_VAL_new GRPC_SHADOW_X509_VAL_new -#define X509_VERIFY_PARAM_add0_policy GRPC_SHADOW_X509_VERIFY_PARAM_add0_policy -#define X509_VERIFY_PARAM_add0_table GRPC_SHADOW_X509_VERIFY_PARAM_add0_table -#define X509_VERIFY_PARAM_add1_host GRPC_SHADOW_X509_VERIFY_PARAM_add1_host -#define X509_VERIFY_PARAM_clear_flags GRPC_SHADOW_X509_VERIFY_PARAM_clear_flags -#define X509_VERIFY_PARAM_free GRPC_SHADOW_X509_VERIFY_PARAM_free -#define X509_VERIFY_PARAM_get0 GRPC_SHADOW_X509_VERIFY_PARAM_get0 -#define X509_VERIFY_PARAM_get0_name GRPC_SHADOW_X509_VERIFY_PARAM_get0_name -#define X509_VERIFY_PARAM_get0_peername GRPC_SHADOW_X509_VERIFY_PARAM_get0_peername -#define X509_VERIFY_PARAM_get_count GRPC_SHADOW_X509_VERIFY_PARAM_get_count -#define X509_VERIFY_PARAM_get_depth GRPC_SHADOW_X509_VERIFY_PARAM_get_depth -#define X509_VERIFY_PARAM_get_flags GRPC_SHADOW_X509_VERIFY_PARAM_get_flags -#define X509_VERIFY_PARAM_inherit GRPC_SHADOW_X509_VERIFY_PARAM_inherit -#define X509_VERIFY_PARAM_lookup GRPC_SHADOW_X509_VERIFY_PARAM_lookup -#define X509_VERIFY_PARAM_new GRPC_SHADOW_X509_VERIFY_PARAM_new -#define X509_VERIFY_PARAM_set1 GRPC_SHADOW_X509_VERIFY_PARAM_set1 -#define X509_VERIFY_PARAM_set1_email GRPC_SHADOW_X509_VERIFY_PARAM_set1_email -#define X509_VERIFY_PARAM_set1_host GRPC_SHADOW_X509_VERIFY_PARAM_set1_host -#define X509_VERIFY_PARAM_set1_ip GRPC_SHADOW_X509_VERIFY_PARAM_set1_ip -#define X509_VERIFY_PARAM_set1_ip_asc GRPC_SHADOW_X509_VERIFY_PARAM_set1_ip_asc -#define X509_VERIFY_PARAM_set1_name GRPC_SHADOW_X509_VERIFY_PARAM_set1_name -#define X509_VERIFY_PARAM_set1_policies GRPC_SHADOW_X509_VERIFY_PARAM_set1_policies -#define X509_VERIFY_PARAM_set_depth GRPC_SHADOW_X509_VERIFY_PARAM_set_depth -#define X509_VERIFY_PARAM_set_flags GRPC_SHADOW_X509_VERIFY_PARAM_set_flags -#define X509_VERIFY_PARAM_set_hostflags GRPC_SHADOW_X509_VERIFY_PARAM_set_hostflags -#define X509_VERIFY_PARAM_set_purpose GRPC_SHADOW_X509_VERIFY_PARAM_set_purpose -#define X509_VERIFY_PARAM_set_time GRPC_SHADOW_X509_VERIFY_PARAM_set_time -#define X509_VERIFY_PARAM_set_trust GRPC_SHADOW_X509_VERIFY_PARAM_set_trust -#define X509_VERIFY_PARAM_table_cleanup GRPC_SHADOW_X509_VERIFY_PARAM_table_cleanup -#define X509_add1_ext_i2d GRPC_SHADOW_X509_add1_ext_i2d -#define X509_add1_reject_object GRPC_SHADOW_X509_add1_reject_object -#define X509_add1_trust_object GRPC_SHADOW_X509_add1_trust_object -#define X509_add_ext GRPC_SHADOW_X509_add_ext -#define X509_alias_get0 GRPC_SHADOW_X509_alias_get0 -#define X509_alias_set1 GRPC_SHADOW_X509_alias_set1 -#define X509_chain_check_suiteb GRPC_SHADOW_X509_chain_check_suiteb -#define X509_chain_up_ref GRPC_SHADOW_X509_chain_up_ref -#define X509_check_akid GRPC_SHADOW_X509_check_akid -#define X509_check_ca GRPC_SHADOW_X509_check_ca -#define X509_check_email GRPC_SHADOW_X509_check_email -#define X509_check_host GRPC_SHADOW_X509_check_host -#define X509_check_ip GRPC_SHADOW_X509_check_ip -#define X509_check_ip_asc GRPC_SHADOW_X509_check_ip_asc -#define X509_check_issued GRPC_SHADOW_X509_check_issued -#define X509_check_private_key GRPC_SHADOW_X509_check_private_key -#define X509_check_purpose GRPC_SHADOW_X509_check_purpose -#define X509_check_trust GRPC_SHADOW_X509_check_trust -#define X509_cmp GRPC_SHADOW_X509_cmp -#define X509_cmp_current_time GRPC_SHADOW_X509_cmp_current_time -#define X509_cmp_time GRPC_SHADOW_X509_cmp_time -#define X509_delete_ext GRPC_SHADOW_X509_delete_ext -#define X509_digest GRPC_SHADOW_X509_digest -#define X509_dup GRPC_SHADOW_X509_dup -#define X509_email_free GRPC_SHADOW_X509_email_free -#define X509_find_by_issuer_and_serial GRPC_SHADOW_X509_find_by_issuer_and_serial -#define X509_find_by_subject GRPC_SHADOW_X509_find_by_subject -#define X509_free GRPC_SHADOW_X509_free -#define X509_get0_extensions GRPC_SHADOW_X509_get0_extensions -#define X509_get0_notAfter GRPC_SHADOW_X509_get0_notAfter -#define X509_get0_notBefore GRPC_SHADOW_X509_get0_notBefore -#define X509_get0_pubkey_bitstr GRPC_SHADOW_X509_get0_pubkey_bitstr -#define X509_get0_signature GRPC_SHADOW_X509_get0_signature -#define X509_get0_tbs_sigalg GRPC_SHADOW_X509_get0_tbs_sigalg -#define X509_get1_email GRPC_SHADOW_X509_get1_email -#define X509_get1_ocsp GRPC_SHADOW_X509_get1_ocsp -#define X509_get_default_cert_area GRPC_SHADOW_X509_get_default_cert_area -#define X509_get_default_cert_dir GRPC_SHADOW_X509_get_default_cert_dir -#define X509_get_default_cert_dir_env GRPC_SHADOW_X509_get_default_cert_dir_env -#define X509_get_default_cert_file GRPC_SHADOW_X509_get_default_cert_file -#define X509_get_default_cert_file_env GRPC_SHADOW_X509_get_default_cert_file_env -#define X509_get_default_private_dir GRPC_SHADOW_X509_get_default_private_dir -#define X509_get_ex_data GRPC_SHADOW_X509_get_ex_data -#define X509_get_ex_new_index GRPC_SHADOW_X509_get_ex_new_index -#define X509_get_ext GRPC_SHADOW_X509_get_ext -#define X509_get_ext_by_NID GRPC_SHADOW_X509_get_ext_by_NID -#define X509_get_ext_by_OBJ GRPC_SHADOW_X509_get_ext_by_OBJ -#define X509_get_ext_by_critical GRPC_SHADOW_X509_get_ext_by_critical -#define X509_get_ext_count GRPC_SHADOW_X509_get_ext_count -#define X509_get_ext_d2i GRPC_SHADOW_X509_get_ext_d2i -#define X509_get_extended_key_usage GRPC_SHADOW_X509_get_extended_key_usage -#define X509_get_extension_flags GRPC_SHADOW_X509_get_extension_flags -#define X509_get_issuer_name GRPC_SHADOW_X509_get_issuer_name -#define X509_get_key_usage GRPC_SHADOW_X509_get_key_usage -#define X509_get_pubkey GRPC_SHADOW_X509_get_pubkey -#define X509_get_serialNumber GRPC_SHADOW_X509_get_serialNumber -#define X509_get_signature_nid GRPC_SHADOW_X509_get_signature_nid -#define X509_get_subject_name GRPC_SHADOW_X509_get_subject_name -#define X509_gmtime_adj GRPC_SHADOW_X509_gmtime_adj -#define X509_issuer_and_serial_cmp GRPC_SHADOW_X509_issuer_and_serial_cmp -#define X509_issuer_and_serial_hash GRPC_SHADOW_X509_issuer_and_serial_hash -#define X509_issuer_name_cmp GRPC_SHADOW_X509_issuer_name_cmp -#define X509_issuer_name_hash GRPC_SHADOW_X509_issuer_name_hash -#define X509_issuer_name_hash_old GRPC_SHADOW_X509_issuer_name_hash_old -#define X509_it GRPC_SHADOW_X509_it -#define X509_keyid_get0 GRPC_SHADOW_X509_keyid_get0 -#define X509_keyid_set1 GRPC_SHADOW_X509_keyid_set1 -#define X509_load_cert_crl_file GRPC_SHADOW_X509_load_cert_crl_file -#define X509_load_cert_file GRPC_SHADOW_X509_load_cert_file -#define X509_load_crl_file GRPC_SHADOW_X509_load_crl_file -#define X509_new GRPC_SHADOW_X509_new -#define X509_ocspid_print GRPC_SHADOW_X509_ocspid_print -#define X509_parse_from_buffer GRPC_SHADOW_X509_parse_from_buffer -#define X509_policy_check GRPC_SHADOW_X509_policy_check -#define X509_policy_level_get0_node GRPC_SHADOW_X509_policy_level_get0_node -#define X509_policy_level_node_count GRPC_SHADOW_X509_policy_level_node_count -#define X509_policy_node_get0_parent GRPC_SHADOW_X509_policy_node_get0_parent -#define X509_policy_node_get0_policy GRPC_SHADOW_X509_policy_node_get0_policy -#define X509_policy_node_get0_qualifiers GRPC_SHADOW_X509_policy_node_get0_qualifiers -#define X509_policy_tree_free GRPC_SHADOW_X509_policy_tree_free -#define X509_policy_tree_get0_level GRPC_SHADOW_X509_policy_tree_get0_level -#define X509_policy_tree_get0_policies GRPC_SHADOW_X509_policy_tree_get0_policies -#define X509_policy_tree_get0_user_policies GRPC_SHADOW_X509_policy_tree_get0_user_policies -#define X509_policy_tree_level_count GRPC_SHADOW_X509_policy_tree_level_count -#define X509_print GRPC_SHADOW_X509_print -#define X509_print_ex GRPC_SHADOW_X509_print_ex -#define X509_print_ex_fp GRPC_SHADOW_X509_print_ex_fp -#define X509_print_fp GRPC_SHADOW_X509_print_fp -#define X509_pubkey_digest GRPC_SHADOW_X509_pubkey_digest -#define X509_reject_clear GRPC_SHADOW_X509_reject_clear -#define X509_set_ex_data GRPC_SHADOW_X509_set_ex_data -#define X509_set_issuer_name GRPC_SHADOW_X509_set_issuer_name -#define X509_set_notAfter GRPC_SHADOW_X509_set_notAfter -#define X509_set_notBefore GRPC_SHADOW_X509_set_notBefore -#define X509_set_pubkey GRPC_SHADOW_X509_set_pubkey -#define X509_set_serialNumber GRPC_SHADOW_X509_set_serialNumber -#define X509_set_subject_name GRPC_SHADOW_X509_set_subject_name -#define X509_set_version GRPC_SHADOW_X509_set_version -#define X509_sign GRPC_SHADOW_X509_sign -#define X509_sign_ctx GRPC_SHADOW_X509_sign_ctx -#define X509_signature_dump GRPC_SHADOW_X509_signature_dump -#define X509_signature_print GRPC_SHADOW_X509_signature_print -#define X509_subject_name_cmp GRPC_SHADOW_X509_subject_name_cmp -#define X509_subject_name_hash GRPC_SHADOW_X509_subject_name_hash -#define X509_subject_name_hash_old GRPC_SHADOW_X509_subject_name_hash_old -#define X509_supported_extension GRPC_SHADOW_X509_supported_extension -#define X509_time_adj GRPC_SHADOW_X509_time_adj -#define X509_time_adj_ex GRPC_SHADOW_X509_time_adj_ex -#define X509_to_X509_REQ GRPC_SHADOW_X509_to_X509_REQ -#define X509_trust_clear GRPC_SHADOW_X509_trust_clear -#define X509_up_ref GRPC_SHADOW_X509_up_ref -#define X509_verify GRPC_SHADOW_X509_verify -#define X509_verify_cert GRPC_SHADOW_X509_verify_cert -#define X509_verify_cert_error_string GRPC_SHADOW_X509_verify_cert_error_string -#define X509at_add1_attr GRPC_SHADOW_X509at_add1_attr -#define X509at_add1_attr_by_NID GRPC_SHADOW_X509at_add1_attr_by_NID -#define X509at_add1_attr_by_OBJ GRPC_SHADOW_X509at_add1_attr_by_OBJ -#define X509at_add1_attr_by_txt GRPC_SHADOW_X509at_add1_attr_by_txt -#define X509at_delete_attr GRPC_SHADOW_X509at_delete_attr -#define X509at_get0_data_by_OBJ GRPC_SHADOW_X509at_get0_data_by_OBJ -#define X509at_get_attr GRPC_SHADOW_X509at_get_attr -#define X509at_get_attr_by_NID GRPC_SHADOW_X509at_get_attr_by_NID -#define X509at_get_attr_by_OBJ GRPC_SHADOW_X509at_get_attr_by_OBJ -#define X509at_get_attr_count GRPC_SHADOW_X509at_get_attr_count -#define X509v3_add_ext GRPC_SHADOW_X509v3_add_ext -#define X509v3_delete_ext GRPC_SHADOW_X509v3_delete_ext -#define X509v3_get_ext GRPC_SHADOW_X509v3_get_ext -#define X509v3_get_ext_by_NID GRPC_SHADOW_X509v3_get_ext_by_NID -#define X509v3_get_ext_by_OBJ GRPC_SHADOW_X509v3_get_ext_by_OBJ -#define X509v3_get_ext_by_critical GRPC_SHADOW_X509v3_get_ext_by_critical -#define X509v3_get_ext_count GRPC_SHADOW_X509v3_get_ext_count -#define a2i_GENERAL_NAME GRPC_SHADOW_a2i_GENERAL_NAME -#define a2i_IPADDRESS GRPC_SHADOW_a2i_IPADDRESS -#define a2i_IPADDRESS_NC GRPC_SHADOW_a2i_IPADDRESS_NC -#define a2i_ipadd GRPC_SHADOW_a2i_ipadd -#define abi_test_bad_unwind_temporary GRPC_SHADOW_abi_test_bad_unwind_temporary -#define abi_test_bad_unwind_wrong_register GRPC_SHADOW_abi_test_bad_unwind_wrong_register -#define abi_test_clobber_r10 GRPC_SHADOW_abi_test_clobber_r10 -#define abi_test_clobber_r11 GRPC_SHADOW_abi_test_clobber_r11 -#define abi_test_clobber_r12 GRPC_SHADOW_abi_test_clobber_r12 -#define abi_test_clobber_r13 GRPC_SHADOW_abi_test_clobber_r13 -#define abi_test_clobber_r14 GRPC_SHADOW_abi_test_clobber_r14 -#define abi_test_clobber_r15 GRPC_SHADOW_abi_test_clobber_r15 -#define abi_test_clobber_r8 GRPC_SHADOW_abi_test_clobber_r8 -#define abi_test_clobber_r9 GRPC_SHADOW_abi_test_clobber_r9 -#define abi_test_clobber_rax GRPC_SHADOW_abi_test_clobber_rax -#define abi_test_clobber_rbp GRPC_SHADOW_abi_test_clobber_rbp -#define abi_test_clobber_rbx GRPC_SHADOW_abi_test_clobber_rbx -#define abi_test_clobber_rcx GRPC_SHADOW_abi_test_clobber_rcx -#define abi_test_clobber_rdi GRPC_SHADOW_abi_test_clobber_rdi -#define abi_test_clobber_rdx GRPC_SHADOW_abi_test_clobber_rdx -#define abi_test_clobber_rsi GRPC_SHADOW_abi_test_clobber_rsi -#define abi_test_clobber_xmm0 GRPC_SHADOW_abi_test_clobber_xmm0 -#define abi_test_clobber_xmm1 GRPC_SHADOW_abi_test_clobber_xmm1 -#define abi_test_clobber_xmm10 GRPC_SHADOW_abi_test_clobber_xmm10 -#define abi_test_clobber_xmm11 GRPC_SHADOW_abi_test_clobber_xmm11 -#define abi_test_clobber_xmm12 GRPC_SHADOW_abi_test_clobber_xmm12 -#define abi_test_clobber_xmm13 GRPC_SHADOW_abi_test_clobber_xmm13 -#define abi_test_clobber_xmm14 GRPC_SHADOW_abi_test_clobber_xmm14 -#define abi_test_clobber_xmm15 GRPC_SHADOW_abi_test_clobber_xmm15 -#define abi_test_clobber_xmm2 GRPC_SHADOW_abi_test_clobber_xmm2 -#define abi_test_clobber_xmm3 GRPC_SHADOW_abi_test_clobber_xmm3 -#define abi_test_clobber_xmm4 GRPC_SHADOW_abi_test_clobber_xmm4 -#define abi_test_clobber_xmm5 GRPC_SHADOW_abi_test_clobber_xmm5 -#define abi_test_clobber_xmm6 GRPC_SHADOW_abi_test_clobber_xmm6 -#define abi_test_clobber_xmm7 GRPC_SHADOW_abi_test_clobber_xmm7 -#define abi_test_clobber_xmm8 GRPC_SHADOW_abi_test_clobber_xmm8 -#define abi_test_clobber_xmm9 GRPC_SHADOW_abi_test_clobber_xmm9 -#define abi_test_get_and_clear_direction_flag GRPC_SHADOW_abi_test_get_and_clear_direction_flag -#define abi_test_set_direction_flag GRPC_SHADOW_abi_test_set_direction_flag -#define abi_test_trampoline GRPC_SHADOW_abi_test_trampoline -#define abi_test_unwind_return GRPC_SHADOW_abi_test_unwind_return -#define abi_test_unwind_start GRPC_SHADOW_abi_test_unwind_start -#define abi_test_unwind_stop GRPC_SHADOW_abi_test_unwind_stop -#define aes128gcmsiv_aes_ks GRPC_SHADOW_aes128gcmsiv_aes_ks -#define aes128gcmsiv_aes_ks_enc_x1 GRPC_SHADOW_aes128gcmsiv_aes_ks_enc_x1 -#define aes128gcmsiv_dec GRPC_SHADOW_aes128gcmsiv_dec -#define aes128gcmsiv_ecb_enc_block GRPC_SHADOW_aes128gcmsiv_ecb_enc_block -#define aes128gcmsiv_enc_msg_x4 GRPC_SHADOW_aes128gcmsiv_enc_msg_x4 -#define aes128gcmsiv_enc_msg_x8 GRPC_SHADOW_aes128gcmsiv_enc_msg_x8 -#define aes128gcmsiv_kdf GRPC_SHADOW_aes128gcmsiv_kdf -#define aes256gcmsiv_aes_ks GRPC_SHADOW_aes256gcmsiv_aes_ks -#define aes256gcmsiv_aes_ks_enc_x1 GRPC_SHADOW_aes256gcmsiv_aes_ks_enc_x1 -#define aes256gcmsiv_dec GRPC_SHADOW_aes256gcmsiv_dec -#define aes256gcmsiv_ecb_enc_block GRPC_SHADOW_aes256gcmsiv_ecb_enc_block -#define aes256gcmsiv_enc_msg_x4 GRPC_SHADOW_aes256gcmsiv_enc_msg_x4 -#define aes256gcmsiv_enc_msg_x8 GRPC_SHADOW_aes256gcmsiv_enc_msg_x8 -#define aes256gcmsiv_kdf GRPC_SHADOW_aes256gcmsiv_kdf -#define aes_ctr_set_key GRPC_SHADOW_aes_ctr_set_key -#define aes_hw_cbc_encrypt GRPC_SHADOW_aes_hw_cbc_encrypt -#define aes_hw_ctr32_encrypt_blocks GRPC_SHADOW_aes_hw_ctr32_encrypt_blocks -#define aes_hw_decrypt GRPC_SHADOW_aes_hw_decrypt -#define aes_hw_ecb_encrypt GRPC_SHADOW_aes_hw_ecb_encrypt -#define aes_hw_encrypt GRPC_SHADOW_aes_hw_encrypt -#define aes_hw_set_decrypt_key GRPC_SHADOW_aes_hw_set_decrypt_key -#define aes_hw_set_encrypt_key GRPC_SHADOW_aes_hw_set_encrypt_key -#define aes_nohw_cbc_encrypt GRPC_SHADOW_aes_nohw_cbc_encrypt -#define aes_nohw_decrypt GRPC_SHADOW_aes_nohw_decrypt -#define aes_nohw_encrypt GRPC_SHADOW_aes_nohw_encrypt -#define aes_nohw_set_decrypt_key GRPC_SHADOW_aes_nohw_set_decrypt_key -#define aes_nohw_set_encrypt_key GRPC_SHADOW_aes_nohw_set_encrypt_key -#define aesgcmsiv_htable6_init GRPC_SHADOW_aesgcmsiv_htable6_init -#define aesgcmsiv_htable_init GRPC_SHADOW_aesgcmsiv_htable_init -#define aesgcmsiv_htable_polyval GRPC_SHADOW_aesgcmsiv_htable_polyval -#define aesgcmsiv_polyval_horner GRPC_SHADOW_aesgcmsiv_polyval_horner -#define aesni_gcm_decrypt GRPC_SHADOW_aesni_gcm_decrypt -#define aesni_gcm_encrypt GRPC_SHADOW_aesni_gcm_encrypt -#define asn1_do_adb GRPC_SHADOW_asn1_do_adb -#define asn1_enc_free GRPC_SHADOW_asn1_enc_free -#define asn1_enc_init GRPC_SHADOW_asn1_enc_init -#define asn1_enc_restore GRPC_SHADOW_asn1_enc_restore -#define asn1_enc_save GRPC_SHADOW_asn1_enc_save -#define asn1_ex_c2i GRPC_SHADOW_asn1_ex_c2i -#define asn1_ex_i2c GRPC_SHADOW_asn1_ex_i2c -#define asn1_generalizedtime_to_tm GRPC_SHADOW_asn1_generalizedtime_to_tm -#define asn1_get_choice_selector GRPC_SHADOW_asn1_get_choice_selector -#define asn1_get_field_ptr GRPC_SHADOW_asn1_get_field_ptr -#define asn1_item_combine_free GRPC_SHADOW_asn1_item_combine_free -#define asn1_refcount_dec_and_test_zero GRPC_SHADOW_asn1_refcount_dec_and_test_zero -#define asn1_refcount_set_one GRPC_SHADOW_asn1_refcount_set_one -#define asn1_set_choice_selector GRPC_SHADOW_asn1_set_choice_selector -#define asn1_utctime_to_tm GRPC_SHADOW_asn1_utctime_to_tm -#define beeu_mod_inverse_vartime GRPC_SHADOW_beeu_mod_inverse_vartime -#define bio_clear_socket_error GRPC_SHADOW_bio_clear_socket_error -#define bio_fd_should_retry GRPC_SHADOW_bio_fd_should_retry -#define bio_ip_and_port_to_socket_and_addr GRPC_SHADOW_bio_ip_and_port_to_socket_and_addr -#define bio_sock_error GRPC_SHADOW_bio_sock_error -#define bio_socket_nbio GRPC_SHADOW_bio_socket_nbio -#define bn_abs_sub_consttime GRPC_SHADOW_bn_abs_sub_consttime -#define bn_add_words GRPC_SHADOW_bn_add_words -#define bn_copy_words GRPC_SHADOW_bn_copy_words -#define bn_div_consttime GRPC_SHADOW_bn_div_consttime -#define bn_expand GRPC_SHADOW_bn_expand -#define bn_fits_in_words GRPC_SHADOW_bn_fits_in_words -#define bn_from_montgomery GRPC_SHADOW_bn_from_montgomery -#define bn_from_montgomery_small GRPC_SHADOW_bn_from_montgomery_small -#define bn_gather5 GRPC_SHADOW_bn_gather5 -#define bn_in_range_words GRPC_SHADOW_bn_in_range_words -#define bn_is_bit_set_words GRPC_SHADOW_bn_is_bit_set_words -#define bn_is_relatively_prime GRPC_SHADOW_bn_is_relatively_prime -#define bn_jacobi GRPC_SHADOW_bn_jacobi -#define bn_lcm_consttime GRPC_SHADOW_bn_lcm_consttime -#define bn_less_than_montgomery_R GRPC_SHADOW_bn_less_than_montgomery_R -#define bn_less_than_words GRPC_SHADOW_bn_less_than_words -#define bn_miller_rabin_init GRPC_SHADOW_bn_miller_rabin_init -#define bn_miller_rabin_iteration GRPC_SHADOW_bn_miller_rabin_iteration -#define bn_minimal_width GRPC_SHADOW_bn_minimal_width -#define bn_mod_add_consttime GRPC_SHADOW_bn_mod_add_consttime -#define bn_mod_add_words GRPC_SHADOW_bn_mod_add_words -#define bn_mod_exp_base_2_consttime GRPC_SHADOW_bn_mod_exp_base_2_consttime -#define bn_mod_exp_mont_small GRPC_SHADOW_bn_mod_exp_mont_small -#define bn_mod_inverse_consttime GRPC_SHADOW_bn_mod_inverse_consttime -#define bn_mod_inverse_prime GRPC_SHADOW_bn_mod_inverse_prime -#define bn_mod_inverse_prime_mont_small GRPC_SHADOW_bn_mod_inverse_prime_mont_small -#define bn_mod_inverse_secret_prime GRPC_SHADOW_bn_mod_inverse_secret_prime -#define bn_mod_lshift1_consttime GRPC_SHADOW_bn_mod_lshift1_consttime -#define bn_mod_lshift_consttime GRPC_SHADOW_bn_mod_lshift_consttime -#define bn_mod_mul_montgomery_small GRPC_SHADOW_bn_mod_mul_montgomery_small -#define bn_mod_sub_consttime GRPC_SHADOW_bn_mod_sub_consttime -#define bn_mod_sub_words GRPC_SHADOW_bn_mod_sub_words -#define bn_mod_u16_consttime GRPC_SHADOW_bn_mod_u16_consttime -#define bn_mont_n0 GRPC_SHADOW_bn_mont_n0 -#define bn_mul_add_words GRPC_SHADOW_bn_mul_add_words -#define bn_mul_comba4 GRPC_SHADOW_bn_mul_comba4 -#define bn_mul_comba8 GRPC_SHADOW_bn_mul_comba8 -#define bn_mul_consttime GRPC_SHADOW_bn_mul_consttime -#define bn_mul_mont GRPC_SHADOW_bn_mul_mont -#define bn_mul_mont_gather5 GRPC_SHADOW_bn_mul_mont_gather5 -#define bn_mul_small GRPC_SHADOW_bn_mul_small -#define bn_mul_words GRPC_SHADOW_bn_mul_words -#define bn_odd_number_is_obviously_composite GRPC_SHADOW_bn_odd_number_is_obviously_composite -#define bn_one_to_montgomery GRPC_SHADOW_bn_one_to_montgomery -#define bn_power5 GRPC_SHADOW_bn_power5 -#define bn_rand_range_words GRPC_SHADOW_bn_rand_range_words -#define bn_rand_secret_range GRPC_SHADOW_bn_rand_secret_range -#define bn_reduce_once GRPC_SHADOW_bn_reduce_once -#define bn_reduce_once_in_place GRPC_SHADOW_bn_reduce_once_in_place -#define bn_resize_words GRPC_SHADOW_bn_resize_words -#define bn_rshift1_words GRPC_SHADOW_bn_rshift1_words -#define bn_rshift_secret_shift GRPC_SHADOW_bn_rshift_secret_shift -#define bn_rshift_words GRPC_SHADOW_bn_rshift_words -#define bn_scatter5 GRPC_SHADOW_bn_scatter5 -#define bn_select_words GRPC_SHADOW_bn_select_words -#define bn_set_minimal_width GRPC_SHADOW_bn_set_minimal_width -#define bn_set_words GRPC_SHADOW_bn_set_words -#define bn_sqr8x_internal GRPC_SHADOW_bn_sqr8x_internal -#define bn_sqr_comba4 GRPC_SHADOW_bn_sqr_comba4 -#define bn_sqr_comba8 GRPC_SHADOW_bn_sqr_comba8 -#define bn_sqr_consttime GRPC_SHADOW_bn_sqr_consttime -#define bn_sqr_small GRPC_SHADOW_bn_sqr_small -#define bn_sqr_words GRPC_SHADOW_bn_sqr_words -#define bn_sqrx8x_internal GRPC_SHADOW_bn_sqrx8x_internal -#define bn_sub_words GRPC_SHADOW_bn_sub_words -#define bn_to_montgomery_small GRPC_SHADOW_bn_to_montgomery_small -#define bn_uadd_consttime GRPC_SHADOW_bn_uadd_consttime -#define bn_usub_consttime GRPC_SHADOW_bn_usub_consttime -#define bn_wexpand GRPC_SHADOW_bn_wexpand -#define boringssl_fips_self_test GRPC_SHADOW_boringssl_fips_self_test -#define c2i_ASN1_BIT_STRING GRPC_SHADOW_c2i_ASN1_BIT_STRING -#define c2i_ASN1_INTEGER GRPC_SHADOW_c2i_ASN1_INTEGER -#define c2i_ASN1_OBJECT GRPC_SHADOW_c2i_ASN1_OBJECT -#define cbb_add_latin1 GRPC_SHADOW_cbb_add_latin1 -#define cbb_add_ucs2_be GRPC_SHADOW_cbb_add_ucs2_be -#define cbb_add_utf32_be GRPC_SHADOW_cbb_add_utf32_be -#define cbb_add_utf8 GRPC_SHADOW_cbb_add_utf8 -#define cbb_get_utf8_len GRPC_SHADOW_cbb_get_utf8_len -#define cbs_get_latin1 GRPC_SHADOW_cbs_get_latin1 -#define cbs_get_ucs2_be GRPC_SHADOW_cbs_get_ucs2_be -#define cbs_get_utf32_be GRPC_SHADOW_cbs_get_utf32_be -#define cbs_get_utf8 GRPC_SHADOW_cbs_get_utf8 -#define chacha20_poly1305_open GRPC_SHADOW_chacha20_poly1305_open -#define chacha20_poly1305_seal GRPC_SHADOW_chacha20_poly1305_seal -#define crypto_gcm_clmul_enabled GRPC_SHADOW_crypto_gcm_clmul_enabled -#define d2i_ACCESS_DESCRIPTION GRPC_SHADOW_d2i_ACCESS_DESCRIPTION -#define d2i_ASN1_BIT_STRING GRPC_SHADOW_d2i_ASN1_BIT_STRING -#define d2i_ASN1_BMPSTRING GRPC_SHADOW_d2i_ASN1_BMPSTRING -#define d2i_ASN1_BOOLEAN GRPC_SHADOW_d2i_ASN1_BOOLEAN -#define d2i_ASN1_ENUMERATED GRPC_SHADOW_d2i_ASN1_ENUMERATED -#define d2i_ASN1_GENERALIZEDTIME GRPC_SHADOW_d2i_ASN1_GENERALIZEDTIME -#define d2i_ASN1_GENERALSTRING GRPC_SHADOW_d2i_ASN1_GENERALSTRING -#define d2i_ASN1_IA5STRING GRPC_SHADOW_d2i_ASN1_IA5STRING -#define d2i_ASN1_INTEGER GRPC_SHADOW_d2i_ASN1_INTEGER -#define d2i_ASN1_NULL GRPC_SHADOW_d2i_ASN1_NULL -#define d2i_ASN1_OBJECT GRPC_SHADOW_d2i_ASN1_OBJECT -#define d2i_ASN1_OCTET_STRING GRPC_SHADOW_d2i_ASN1_OCTET_STRING -#define d2i_ASN1_PRINTABLE GRPC_SHADOW_d2i_ASN1_PRINTABLE -#define d2i_ASN1_PRINTABLESTRING GRPC_SHADOW_d2i_ASN1_PRINTABLESTRING -#define d2i_ASN1_SEQUENCE_ANY GRPC_SHADOW_d2i_ASN1_SEQUENCE_ANY -#define d2i_ASN1_SET_ANY GRPC_SHADOW_d2i_ASN1_SET_ANY -#define d2i_ASN1_T61STRING GRPC_SHADOW_d2i_ASN1_T61STRING -#define d2i_ASN1_TIME GRPC_SHADOW_d2i_ASN1_TIME -#define d2i_ASN1_TYPE GRPC_SHADOW_d2i_ASN1_TYPE -#define d2i_ASN1_UNIVERSALSTRING GRPC_SHADOW_d2i_ASN1_UNIVERSALSTRING -#define d2i_ASN1_UTCTIME GRPC_SHADOW_d2i_ASN1_UTCTIME -#define d2i_ASN1_UTF8STRING GRPC_SHADOW_d2i_ASN1_UTF8STRING -#define d2i_ASN1_VISIBLESTRING GRPC_SHADOW_d2i_ASN1_VISIBLESTRING -#define d2i_AUTHORITY_INFO_ACCESS GRPC_SHADOW_d2i_AUTHORITY_INFO_ACCESS -#define d2i_AUTHORITY_KEYID GRPC_SHADOW_d2i_AUTHORITY_KEYID -#define d2i_AutoPrivateKey GRPC_SHADOW_d2i_AutoPrivateKey -#define d2i_BASIC_CONSTRAINTS GRPC_SHADOW_d2i_BASIC_CONSTRAINTS -#define d2i_CERTIFICATEPOLICIES GRPC_SHADOW_d2i_CERTIFICATEPOLICIES -#define d2i_CRL_DIST_POINTS GRPC_SHADOW_d2i_CRL_DIST_POINTS -#define d2i_DHparams GRPC_SHADOW_d2i_DHparams -#define d2i_DHparams_bio GRPC_SHADOW_d2i_DHparams_bio -#define d2i_DIRECTORYSTRING GRPC_SHADOW_d2i_DIRECTORYSTRING -#define d2i_DISPLAYTEXT GRPC_SHADOW_d2i_DISPLAYTEXT -#define d2i_DIST_POINT GRPC_SHADOW_d2i_DIST_POINT -#define d2i_DIST_POINT_NAME GRPC_SHADOW_d2i_DIST_POINT_NAME -#define d2i_DSAPrivateKey GRPC_SHADOW_d2i_DSAPrivateKey -#define d2i_DSAPrivateKey_bio GRPC_SHADOW_d2i_DSAPrivateKey_bio -#define d2i_DSAPrivateKey_fp GRPC_SHADOW_d2i_DSAPrivateKey_fp -#define d2i_DSAPublicKey GRPC_SHADOW_d2i_DSAPublicKey -#define d2i_DSA_PUBKEY GRPC_SHADOW_d2i_DSA_PUBKEY -#define d2i_DSA_PUBKEY_bio GRPC_SHADOW_d2i_DSA_PUBKEY_bio -#define d2i_DSA_PUBKEY_fp GRPC_SHADOW_d2i_DSA_PUBKEY_fp -#define d2i_DSA_SIG GRPC_SHADOW_d2i_DSA_SIG -#define d2i_DSAparams GRPC_SHADOW_d2i_DSAparams -#define d2i_ECDSA_SIG GRPC_SHADOW_d2i_ECDSA_SIG -#define d2i_ECParameters GRPC_SHADOW_d2i_ECParameters -#define d2i_ECPrivateKey GRPC_SHADOW_d2i_ECPrivateKey -#define d2i_ECPrivateKey_bio GRPC_SHADOW_d2i_ECPrivateKey_bio -#define d2i_ECPrivateKey_fp GRPC_SHADOW_d2i_ECPrivateKey_fp -#define d2i_EC_PUBKEY GRPC_SHADOW_d2i_EC_PUBKEY -#define d2i_EC_PUBKEY_bio GRPC_SHADOW_d2i_EC_PUBKEY_bio -#define d2i_EC_PUBKEY_fp GRPC_SHADOW_d2i_EC_PUBKEY_fp -#define d2i_EDIPARTYNAME GRPC_SHADOW_d2i_EDIPARTYNAME -#define d2i_EXTENDED_KEY_USAGE GRPC_SHADOW_d2i_EXTENDED_KEY_USAGE -#define d2i_GENERAL_NAME GRPC_SHADOW_d2i_GENERAL_NAME -#define d2i_GENERAL_NAMES GRPC_SHADOW_d2i_GENERAL_NAMES -#define d2i_ISSUING_DIST_POINT GRPC_SHADOW_d2i_ISSUING_DIST_POINT -#define d2i_NETSCAPE_SPKAC GRPC_SHADOW_d2i_NETSCAPE_SPKAC -#define d2i_NETSCAPE_SPKI GRPC_SHADOW_d2i_NETSCAPE_SPKI -#define d2i_NOTICEREF GRPC_SHADOW_d2i_NOTICEREF -#define d2i_OTHERNAME GRPC_SHADOW_d2i_OTHERNAME -#define d2i_PKCS12 GRPC_SHADOW_d2i_PKCS12 -#define d2i_PKCS12_bio GRPC_SHADOW_d2i_PKCS12_bio -#define d2i_PKCS12_fp GRPC_SHADOW_d2i_PKCS12_fp -#define d2i_PKCS7 GRPC_SHADOW_d2i_PKCS7 -#define d2i_PKCS7_bio GRPC_SHADOW_d2i_PKCS7_bio -#define d2i_PKCS8PrivateKey_bio GRPC_SHADOW_d2i_PKCS8PrivateKey_bio -#define d2i_PKCS8PrivateKey_fp GRPC_SHADOW_d2i_PKCS8PrivateKey_fp -#define d2i_PKCS8_PRIV_KEY_INFO GRPC_SHADOW_d2i_PKCS8_PRIV_KEY_INFO -#define d2i_PKCS8_PRIV_KEY_INFO_bio GRPC_SHADOW_d2i_PKCS8_PRIV_KEY_INFO_bio -#define d2i_PKCS8_PRIV_KEY_INFO_fp GRPC_SHADOW_d2i_PKCS8_PRIV_KEY_INFO_fp -#define d2i_PKCS8_bio GRPC_SHADOW_d2i_PKCS8_bio -#define d2i_PKCS8_fp GRPC_SHADOW_d2i_PKCS8_fp -#define d2i_PKEY_USAGE_PERIOD GRPC_SHADOW_d2i_PKEY_USAGE_PERIOD -#define d2i_POLICYINFO GRPC_SHADOW_d2i_POLICYINFO -#define d2i_POLICYQUALINFO GRPC_SHADOW_d2i_POLICYQUALINFO -#define d2i_PROXY_CERT_INFO_EXTENSION GRPC_SHADOW_d2i_PROXY_CERT_INFO_EXTENSION -#define d2i_PROXY_POLICY GRPC_SHADOW_d2i_PROXY_POLICY -#define d2i_PUBKEY GRPC_SHADOW_d2i_PUBKEY -#define d2i_PUBKEY_bio GRPC_SHADOW_d2i_PUBKEY_bio -#define d2i_PUBKEY_fp GRPC_SHADOW_d2i_PUBKEY_fp -#define d2i_PrivateKey GRPC_SHADOW_d2i_PrivateKey -#define d2i_PrivateKey_bio GRPC_SHADOW_d2i_PrivateKey_bio -#define d2i_PrivateKey_fp GRPC_SHADOW_d2i_PrivateKey_fp -#define d2i_PublicKey GRPC_SHADOW_d2i_PublicKey -#define d2i_RSAPrivateKey GRPC_SHADOW_d2i_RSAPrivateKey -#define d2i_RSAPrivateKey_bio GRPC_SHADOW_d2i_RSAPrivateKey_bio -#define d2i_RSAPrivateKey_fp GRPC_SHADOW_d2i_RSAPrivateKey_fp -#define d2i_RSAPublicKey GRPC_SHADOW_d2i_RSAPublicKey -#define d2i_RSAPublicKey_bio GRPC_SHADOW_d2i_RSAPublicKey_bio -#define d2i_RSAPublicKey_fp GRPC_SHADOW_d2i_RSAPublicKey_fp -#define d2i_RSA_PSS_PARAMS GRPC_SHADOW_d2i_RSA_PSS_PARAMS -#define d2i_RSA_PUBKEY GRPC_SHADOW_d2i_RSA_PUBKEY -#define d2i_RSA_PUBKEY_bio GRPC_SHADOW_d2i_RSA_PUBKEY_bio -#define d2i_RSA_PUBKEY_fp GRPC_SHADOW_d2i_RSA_PUBKEY_fp -#define d2i_SSL_SESSION GRPC_SHADOW_d2i_SSL_SESSION -#define d2i_SSL_SESSION_bio GRPC_SHADOW_d2i_SSL_SESSION_bio -#define d2i_SXNET GRPC_SHADOW_d2i_SXNET -#define d2i_SXNETID GRPC_SHADOW_d2i_SXNETID -#define d2i_USERNOTICE GRPC_SHADOW_d2i_USERNOTICE -#define d2i_X509 GRPC_SHADOW_d2i_X509 -#define d2i_X509_ALGOR GRPC_SHADOW_d2i_X509_ALGOR -#define d2i_X509_ALGORS GRPC_SHADOW_d2i_X509_ALGORS -#define d2i_X509_ATTRIBUTE GRPC_SHADOW_d2i_X509_ATTRIBUTE -#define d2i_X509_AUX GRPC_SHADOW_d2i_X509_AUX -#define d2i_X509_CERT_AUX GRPC_SHADOW_d2i_X509_CERT_AUX -#define d2i_X509_CINF GRPC_SHADOW_d2i_X509_CINF -#define d2i_X509_CRL GRPC_SHADOW_d2i_X509_CRL -#define d2i_X509_CRL_INFO GRPC_SHADOW_d2i_X509_CRL_INFO -#define d2i_X509_CRL_bio GRPC_SHADOW_d2i_X509_CRL_bio -#define d2i_X509_CRL_fp GRPC_SHADOW_d2i_X509_CRL_fp -#define d2i_X509_EXTENSION GRPC_SHADOW_d2i_X509_EXTENSION -#define d2i_X509_EXTENSIONS GRPC_SHADOW_d2i_X509_EXTENSIONS -#define d2i_X509_NAME GRPC_SHADOW_d2i_X509_NAME -#define d2i_X509_NAME_ENTRY GRPC_SHADOW_d2i_X509_NAME_ENTRY -#define d2i_X509_PUBKEY GRPC_SHADOW_d2i_X509_PUBKEY -#define d2i_X509_REQ GRPC_SHADOW_d2i_X509_REQ -#define d2i_X509_REQ_INFO GRPC_SHADOW_d2i_X509_REQ_INFO -#define d2i_X509_REQ_bio GRPC_SHADOW_d2i_X509_REQ_bio -#define d2i_X509_REQ_fp GRPC_SHADOW_d2i_X509_REQ_fp -#define d2i_X509_REVOKED GRPC_SHADOW_d2i_X509_REVOKED -#define d2i_X509_SIG GRPC_SHADOW_d2i_X509_SIG -#define d2i_X509_VAL GRPC_SHADOW_d2i_X509_VAL -#define d2i_X509_bio GRPC_SHADOW_d2i_X509_bio -#define d2i_X509_fp GRPC_SHADOW_d2i_X509_fp -#define dsa_asn1_meth GRPC_SHADOW_dsa_asn1_meth -#define ec_GFp_mont_add GRPC_SHADOW_ec_GFp_mont_add -#define ec_GFp_mont_bignum_to_felem GRPC_SHADOW_ec_GFp_mont_bignum_to_felem -#define ec_GFp_mont_dbl GRPC_SHADOW_ec_GFp_mont_dbl -#define ec_GFp_mont_felem_mul GRPC_SHADOW_ec_GFp_mont_felem_mul -#define ec_GFp_mont_felem_sqr GRPC_SHADOW_ec_GFp_mont_felem_sqr -#define ec_GFp_mont_felem_to_bignum GRPC_SHADOW_ec_GFp_mont_felem_to_bignum -#define ec_GFp_mont_group_finish GRPC_SHADOW_ec_GFp_mont_group_finish -#define ec_GFp_mont_group_init GRPC_SHADOW_ec_GFp_mont_group_init -#define ec_GFp_mont_group_set_curve GRPC_SHADOW_ec_GFp_mont_group_set_curve -#define ec_GFp_mont_mul GRPC_SHADOW_ec_GFp_mont_mul -#define ec_GFp_mont_mul_base GRPC_SHADOW_ec_GFp_mont_mul_base -#define ec_GFp_mont_mul_public GRPC_SHADOW_ec_GFp_mont_mul_public -#define ec_GFp_nistp_recode_scalar_bits GRPC_SHADOW_ec_GFp_nistp_recode_scalar_bits -#define ec_GFp_simple_cmp GRPC_SHADOW_ec_GFp_simple_cmp -#define ec_GFp_simple_cmp_x_coordinate GRPC_SHADOW_ec_GFp_simple_cmp_x_coordinate -#define ec_GFp_simple_group_finish GRPC_SHADOW_ec_GFp_simple_group_finish -#define ec_GFp_simple_group_get_curve GRPC_SHADOW_ec_GFp_simple_group_get_curve -#define ec_GFp_simple_group_init GRPC_SHADOW_ec_GFp_simple_group_init -#define ec_GFp_simple_group_set_curve GRPC_SHADOW_ec_GFp_simple_group_set_curve -#define ec_GFp_simple_invert GRPC_SHADOW_ec_GFp_simple_invert -#define ec_GFp_simple_is_at_infinity GRPC_SHADOW_ec_GFp_simple_is_at_infinity -#define ec_GFp_simple_is_on_curve GRPC_SHADOW_ec_GFp_simple_is_on_curve -#define ec_GFp_simple_mont_inv_mod_ord_vartime GRPC_SHADOW_ec_GFp_simple_mont_inv_mod_ord_vartime -#define ec_GFp_simple_point_copy GRPC_SHADOW_ec_GFp_simple_point_copy -#define ec_GFp_simple_point_init GRPC_SHADOW_ec_GFp_simple_point_init -#define ec_GFp_simple_point_set_affine_coordinates GRPC_SHADOW_ec_GFp_simple_point_set_affine_coordinates -#define ec_GFp_simple_point_set_to_infinity GRPC_SHADOW_ec_GFp_simple_point_set_to_infinity -#define ec_asn1_meth GRPC_SHADOW_ec_asn1_meth -#define ec_bignum_to_felem GRPC_SHADOW_ec_bignum_to_felem -#define ec_bignum_to_scalar GRPC_SHADOW_ec_bignum_to_scalar -#define ec_cmp_x_coordinate GRPC_SHADOW_ec_cmp_x_coordinate -#define ec_compute_wNAF GRPC_SHADOW_ec_compute_wNAF -#define ec_felem_add GRPC_SHADOW_ec_felem_add -#define ec_felem_equal GRPC_SHADOW_ec_felem_equal -#define ec_felem_neg GRPC_SHADOW_ec_felem_neg -#define ec_felem_non_zero_mask GRPC_SHADOW_ec_felem_non_zero_mask -#define ec_felem_select GRPC_SHADOW_ec_felem_select -#define ec_felem_sub GRPC_SHADOW_ec_felem_sub -#define ec_felem_to_bignum GRPC_SHADOW_ec_felem_to_bignum -#define ec_get_x_coordinate_as_scalar GRPC_SHADOW_ec_get_x_coordinate_as_scalar -#define ec_group_new GRPC_SHADOW_ec_group_new -#define ec_pkey_meth GRPC_SHADOW_ec_pkey_meth -#define ec_point_get_affine_coordinate_bytes GRPC_SHADOW_ec_point_get_affine_coordinate_bytes -#define ec_point_mul_scalar GRPC_SHADOW_ec_point_mul_scalar -#define ec_point_mul_scalar_base GRPC_SHADOW_ec_point_mul_scalar_base -#define ec_point_mul_scalar_public GRPC_SHADOW_ec_point_mul_scalar_public -#define ec_random_nonzero_scalar GRPC_SHADOW_ec_random_nonzero_scalar -#define ec_scalar_add GRPC_SHADOW_ec_scalar_add -#define ec_scalar_equal_vartime GRPC_SHADOW_ec_scalar_equal_vartime -#define ec_scalar_from_montgomery GRPC_SHADOW_ec_scalar_from_montgomery -#define ec_scalar_inv_montgomery GRPC_SHADOW_ec_scalar_inv_montgomery -#define ec_scalar_inv_montgomery_vartime GRPC_SHADOW_ec_scalar_inv_montgomery_vartime -#define ec_scalar_is_zero GRPC_SHADOW_ec_scalar_is_zero -#define ec_scalar_mul_montgomery GRPC_SHADOW_ec_scalar_mul_montgomery -#define ec_scalar_to_montgomery GRPC_SHADOW_ec_scalar_to_montgomery -#define ec_simple_scalar_inv_montgomery GRPC_SHADOW_ec_simple_scalar_inv_montgomery -#define ecp_nistz256_avx2_select_w7 GRPC_SHADOW_ecp_nistz256_avx2_select_w7 -#define ecp_nistz256_mul_mont GRPC_SHADOW_ecp_nistz256_mul_mont -#define ecp_nistz256_neg GRPC_SHADOW_ecp_nistz256_neg -#define ecp_nistz256_ord_mul_mont GRPC_SHADOW_ecp_nistz256_ord_mul_mont -#define ecp_nistz256_ord_sqr_mont GRPC_SHADOW_ecp_nistz256_ord_sqr_mont -#define ecp_nistz256_point_add GRPC_SHADOW_ecp_nistz256_point_add -#define ecp_nistz256_point_add_affine GRPC_SHADOW_ecp_nistz256_point_add_affine -#define ecp_nistz256_point_double GRPC_SHADOW_ecp_nistz256_point_double -#define ecp_nistz256_select_w5 GRPC_SHADOW_ecp_nistz256_select_w5 -#define ecp_nistz256_select_w7 GRPC_SHADOW_ecp_nistz256_select_w7 -#define ecp_nistz256_sqr_mont GRPC_SHADOW_ecp_nistz256_sqr_mont -#define ed25519_asn1_meth GRPC_SHADOW_ed25519_asn1_meth -#define ed25519_pkey_meth GRPC_SHADOW_ed25519_pkey_meth -#define gcm_ghash_4bit GRPC_SHADOW_gcm_ghash_4bit -#define gcm_ghash_avx GRPC_SHADOW_gcm_ghash_avx -#define gcm_ghash_clmul GRPC_SHADOW_gcm_ghash_clmul -#define gcm_ghash_ssse3 GRPC_SHADOW_gcm_ghash_ssse3 -#define gcm_gmult_4bit GRPC_SHADOW_gcm_gmult_4bit -#define gcm_gmult_avx GRPC_SHADOW_gcm_gmult_avx -#define gcm_gmult_clmul GRPC_SHADOW_gcm_gmult_clmul -#define gcm_gmult_ssse3 GRPC_SHADOW_gcm_gmult_ssse3 -#define gcm_init_4bit GRPC_SHADOW_gcm_init_4bit -#define gcm_init_avx GRPC_SHADOW_gcm_init_avx -#define gcm_init_clmul GRPC_SHADOW_gcm_init_clmul -#define gcm_init_ssse3 GRPC_SHADOW_gcm_init_ssse3 -#define i2a_ACCESS_DESCRIPTION GRPC_SHADOW_i2a_ACCESS_DESCRIPTION -#define i2a_ASN1_ENUMERATED GRPC_SHADOW_i2a_ASN1_ENUMERATED -#define i2a_ASN1_INTEGER GRPC_SHADOW_i2a_ASN1_INTEGER -#define i2a_ASN1_OBJECT GRPC_SHADOW_i2a_ASN1_OBJECT -#define i2a_ASN1_STRING GRPC_SHADOW_i2a_ASN1_STRING -#define i2c_ASN1_BIT_STRING GRPC_SHADOW_i2c_ASN1_BIT_STRING -#define i2c_ASN1_INTEGER GRPC_SHADOW_i2c_ASN1_INTEGER -#define i2d_ACCESS_DESCRIPTION GRPC_SHADOW_i2d_ACCESS_DESCRIPTION -#define i2d_ASN1_BIT_STRING GRPC_SHADOW_i2d_ASN1_BIT_STRING -#define i2d_ASN1_BMPSTRING GRPC_SHADOW_i2d_ASN1_BMPSTRING -#define i2d_ASN1_BOOLEAN GRPC_SHADOW_i2d_ASN1_BOOLEAN -#define i2d_ASN1_ENUMERATED GRPC_SHADOW_i2d_ASN1_ENUMERATED -#define i2d_ASN1_GENERALIZEDTIME GRPC_SHADOW_i2d_ASN1_GENERALIZEDTIME -#define i2d_ASN1_GENERALSTRING GRPC_SHADOW_i2d_ASN1_GENERALSTRING -#define i2d_ASN1_IA5STRING GRPC_SHADOW_i2d_ASN1_IA5STRING -#define i2d_ASN1_INTEGER GRPC_SHADOW_i2d_ASN1_INTEGER -#define i2d_ASN1_NULL GRPC_SHADOW_i2d_ASN1_NULL -#define i2d_ASN1_OBJECT GRPC_SHADOW_i2d_ASN1_OBJECT -#define i2d_ASN1_OCTET_STRING GRPC_SHADOW_i2d_ASN1_OCTET_STRING -#define i2d_ASN1_PRINTABLE GRPC_SHADOW_i2d_ASN1_PRINTABLE -#define i2d_ASN1_PRINTABLESTRING GRPC_SHADOW_i2d_ASN1_PRINTABLESTRING -#define i2d_ASN1_SEQUENCE_ANY GRPC_SHADOW_i2d_ASN1_SEQUENCE_ANY -#define i2d_ASN1_SET_ANY GRPC_SHADOW_i2d_ASN1_SET_ANY -#define i2d_ASN1_T61STRING GRPC_SHADOW_i2d_ASN1_T61STRING -#define i2d_ASN1_TIME GRPC_SHADOW_i2d_ASN1_TIME -#define i2d_ASN1_TYPE GRPC_SHADOW_i2d_ASN1_TYPE -#define i2d_ASN1_UNIVERSALSTRING GRPC_SHADOW_i2d_ASN1_UNIVERSALSTRING -#define i2d_ASN1_UTCTIME GRPC_SHADOW_i2d_ASN1_UTCTIME -#define i2d_ASN1_UTF8STRING GRPC_SHADOW_i2d_ASN1_UTF8STRING -#define i2d_ASN1_VISIBLESTRING GRPC_SHADOW_i2d_ASN1_VISIBLESTRING -#define i2d_AUTHORITY_INFO_ACCESS GRPC_SHADOW_i2d_AUTHORITY_INFO_ACCESS -#define i2d_AUTHORITY_KEYID GRPC_SHADOW_i2d_AUTHORITY_KEYID -#define i2d_BASIC_CONSTRAINTS GRPC_SHADOW_i2d_BASIC_CONSTRAINTS -#define i2d_CERTIFICATEPOLICIES GRPC_SHADOW_i2d_CERTIFICATEPOLICIES -#define i2d_CRL_DIST_POINTS GRPC_SHADOW_i2d_CRL_DIST_POINTS -#define i2d_DHparams GRPC_SHADOW_i2d_DHparams -#define i2d_DHparams_bio GRPC_SHADOW_i2d_DHparams_bio -#define i2d_DIRECTORYSTRING GRPC_SHADOW_i2d_DIRECTORYSTRING -#define i2d_DISPLAYTEXT GRPC_SHADOW_i2d_DISPLAYTEXT -#define i2d_DIST_POINT GRPC_SHADOW_i2d_DIST_POINT -#define i2d_DIST_POINT_NAME GRPC_SHADOW_i2d_DIST_POINT_NAME -#define i2d_DSAPrivateKey GRPC_SHADOW_i2d_DSAPrivateKey -#define i2d_DSAPrivateKey_bio GRPC_SHADOW_i2d_DSAPrivateKey_bio -#define i2d_DSAPrivateKey_fp GRPC_SHADOW_i2d_DSAPrivateKey_fp -#define i2d_DSAPublicKey GRPC_SHADOW_i2d_DSAPublicKey -#define i2d_DSA_PUBKEY GRPC_SHADOW_i2d_DSA_PUBKEY -#define i2d_DSA_PUBKEY_bio GRPC_SHADOW_i2d_DSA_PUBKEY_bio -#define i2d_DSA_PUBKEY_fp GRPC_SHADOW_i2d_DSA_PUBKEY_fp -#define i2d_DSA_SIG GRPC_SHADOW_i2d_DSA_SIG -#define i2d_DSAparams GRPC_SHADOW_i2d_DSAparams -#define i2d_ECDSA_SIG GRPC_SHADOW_i2d_ECDSA_SIG -#define i2d_ECParameters GRPC_SHADOW_i2d_ECParameters -#define i2d_ECPrivateKey GRPC_SHADOW_i2d_ECPrivateKey -#define i2d_ECPrivateKey_bio GRPC_SHADOW_i2d_ECPrivateKey_bio -#define i2d_ECPrivateKey_fp GRPC_SHADOW_i2d_ECPrivateKey_fp -#define i2d_EC_PUBKEY GRPC_SHADOW_i2d_EC_PUBKEY -#define i2d_EC_PUBKEY_bio GRPC_SHADOW_i2d_EC_PUBKEY_bio -#define i2d_EC_PUBKEY_fp GRPC_SHADOW_i2d_EC_PUBKEY_fp -#define i2d_EDIPARTYNAME GRPC_SHADOW_i2d_EDIPARTYNAME -#define i2d_EXTENDED_KEY_USAGE GRPC_SHADOW_i2d_EXTENDED_KEY_USAGE -#define i2d_GENERAL_NAME GRPC_SHADOW_i2d_GENERAL_NAME -#define i2d_GENERAL_NAMES GRPC_SHADOW_i2d_GENERAL_NAMES -#define i2d_ISSUING_DIST_POINT GRPC_SHADOW_i2d_ISSUING_DIST_POINT -#define i2d_NETSCAPE_SPKAC GRPC_SHADOW_i2d_NETSCAPE_SPKAC -#define i2d_NETSCAPE_SPKI GRPC_SHADOW_i2d_NETSCAPE_SPKI -#define i2d_NOTICEREF GRPC_SHADOW_i2d_NOTICEREF -#define i2d_OTHERNAME GRPC_SHADOW_i2d_OTHERNAME -#define i2d_PKCS12 GRPC_SHADOW_i2d_PKCS12 -#define i2d_PKCS12_bio GRPC_SHADOW_i2d_PKCS12_bio -#define i2d_PKCS12_fp GRPC_SHADOW_i2d_PKCS12_fp -#define i2d_PKCS7 GRPC_SHADOW_i2d_PKCS7 -#define i2d_PKCS7_bio GRPC_SHADOW_i2d_PKCS7_bio -#define i2d_PKCS8PrivateKeyInfo_bio GRPC_SHADOW_i2d_PKCS8PrivateKeyInfo_bio -#define i2d_PKCS8PrivateKeyInfo_fp GRPC_SHADOW_i2d_PKCS8PrivateKeyInfo_fp -#define i2d_PKCS8PrivateKey_bio GRPC_SHADOW_i2d_PKCS8PrivateKey_bio -#define i2d_PKCS8PrivateKey_fp GRPC_SHADOW_i2d_PKCS8PrivateKey_fp -#define i2d_PKCS8PrivateKey_nid_bio GRPC_SHADOW_i2d_PKCS8PrivateKey_nid_bio -#define i2d_PKCS8PrivateKey_nid_fp GRPC_SHADOW_i2d_PKCS8PrivateKey_nid_fp -#define i2d_PKCS8_PRIV_KEY_INFO GRPC_SHADOW_i2d_PKCS8_PRIV_KEY_INFO -#define i2d_PKCS8_PRIV_KEY_INFO_bio GRPC_SHADOW_i2d_PKCS8_PRIV_KEY_INFO_bio -#define i2d_PKCS8_PRIV_KEY_INFO_fp GRPC_SHADOW_i2d_PKCS8_PRIV_KEY_INFO_fp -#define i2d_PKCS8_bio GRPC_SHADOW_i2d_PKCS8_bio -#define i2d_PKCS8_fp GRPC_SHADOW_i2d_PKCS8_fp -#define i2d_PKEY_USAGE_PERIOD GRPC_SHADOW_i2d_PKEY_USAGE_PERIOD -#define i2d_POLICYINFO GRPC_SHADOW_i2d_POLICYINFO -#define i2d_POLICYQUALINFO GRPC_SHADOW_i2d_POLICYQUALINFO -#define i2d_PROXY_CERT_INFO_EXTENSION GRPC_SHADOW_i2d_PROXY_CERT_INFO_EXTENSION -#define i2d_PROXY_POLICY GRPC_SHADOW_i2d_PROXY_POLICY -#define i2d_PUBKEY GRPC_SHADOW_i2d_PUBKEY -#define i2d_PUBKEY_bio GRPC_SHADOW_i2d_PUBKEY_bio -#define i2d_PUBKEY_fp GRPC_SHADOW_i2d_PUBKEY_fp -#define i2d_PrivateKey GRPC_SHADOW_i2d_PrivateKey -#define i2d_PrivateKey_bio GRPC_SHADOW_i2d_PrivateKey_bio -#define i2d_PrivateKey_fp GRPC_SHADOW_i2d_PrivateKey_fp -#define i2d_PublicKey GRPC_SHADOW_i2d_PublicKey -#define i2d_RSAPrivateKey GRPC_SHADOW_i2d_RSAPrivateKey -#define i2d_RSAPrivateKey_bio GRPC_SHADOW_i2d_RSAPrivateKey_bio -#define i2d_RSAPrivateKey_fp GRPC_SHADOW_i2d_RSAPrivateKey_fp -#define i2d_RSAPublicKey GRPC_SHADOW_i2d_RSAPublicKey -#define i2d_RSAPublicKey_bio GRPC_SHADOW_i2d_RSAPublicKey_bio -#define i2d_RSAPublicKey_fp GRPC_SHADOW_i2d_RSAPublicKey_fp -#define i2d_RSA_PSS_PARAMS GRPC_SHADOW_i2d_RSA_PSS_PARAMS -#define i2d_RSA_PUBKEY GRPC_SHADOW_i2d_RSA_PUBKEY -#define i2d_RSA_PUBKEY_bio GRPC_SHADOW_i2d_RSA_PUBKEY_bio -#define i2d_RSA_PUBKEY_fp GRPC_SHADOW_i2d_RSA_PUBKEY_fp -#define i2d_SSL_SESSION GRPC_SHADOW_i2d_SSL_SESSION -#define i2d_SSL_SESSION_bio GRPC_SHADOW_i2d_SSL_SESSION_bio -#define i2d_SXNET GRPC_SHADOW_i2d_SXNET -#define i2d_SXNETID GRPC_SHADOW_i2d_SXNETID -#define i2d_USERNOTICE GRPC_SHADOW_i2d_USERNOTICE -#define i2d_X509 GRPC_SHADOW_i2d_X509 -#define i2d_X509_ALGOR GRPC_SHADOW_i2d_X509_ALGOR -#define i2d_X509_ALGORS GRPC_SHADOW_i2d_X509_ALGORS -#define i2d_X509_ATTRIBUTE GRPC_SHADOW_i2d_X509_ATTRIBUTE -#define i2d_X509_AUX GRPC_SHADOW_i2d_X509_AUX -#define i2d_X509_CERT_AUX GRPC_SHADOW_i2d_X509_CERT_AUX -#define i2d_X509_CINF GRPC_SHADOW_i2d_X509_CINF -#define i2d_X509_CRL GRPC_SHADOW_i2d_X509_CRL -#define i2d_X509_CRL_INFO GRPC_SHADOW_i2d_X509_CRL_INFO -#define i2d_X509_CRL_bio GRPC_SHADOW_i2d_X509_CRL_bio -#define i2d_X509_CRL_fp GRPC_SHADOW_i2d_X509_CRL_fp -#define i2d_X509_EXTENSION GRPC_SHADOW_i2d_X509_EXTENSION -#define i2d_X509_EXTENSIONS GRPC_SHADOW_i2d_X509_EXTENSIONS -#define i2d_X509_NAME GRPC_SHADOW_i2d_X509_NAME -#define i2d_X509_NAME_ENTRY GRPC_SHADOW_i2d_X509_NAME_ENTRY -#define i2d_X509_PUBKEY GRPC_SHADOW_i2d_X509_PUBKEY -#define i2d_X509_REQ GRPC_SHADOW_i2d_X509_REQ -#define i2d_X509_REQ_INFO GRPC_SHADOW_i2d_X509_REQ_INFO -#define i2d_X509_REQ_bio GRPC_SHADOW_i2d_X509_REQ_bio -#define i2d_X509_REQ_fp GRPC_SHADOW_i2d_X509_REQ_fp -#define i2d_X509_REVOKED GRPC_SHADOW_i2d_X509_REVOKED -#define i2d_X509_SIG GRPC_SHADOW_i2d_X509_SIG -#define i2d_X509_VAL GRPC_SHADOW_i2d_X509_VAL -#define i2d_X509_bio GRPC_SHADOW_i2d_X509_bio -#define i2d_X509_fp GRPC_SHADOW_i2d_X509_fp -#define i2d_re_X509_CRL_tbs GRPC_SHADOW_i2d_re_X509_CRL_tbs -#define i2d_re_X509_REQ_tbs GRPC_SHADOW_i2d_re_X509_REQ_tbs -#define i2d_re_X509_tbs GRPC_SHADOW_i2d_re_X509_tbs -#define i2o_ECPublicKey GRPC_SHADOW_i2o_ECPublicKey -#define i2s_ASN1_ENUMERATED GRPC_SHADOW_i2s_ASN1_ENUMERATED -#define i2s_ASN1_ENUMERATED_TABLE GRPC_SHADOW_i2s_ASN1_ENUMERATED_TABLE -#define i2s_ASN1_INTEGER GRPC_SHADOW_i2s_ASN1_INTEGER -#define i2s_ASN1_OCTET_STRING GRPC_SHADOW_i2s_ASN1_OCTET_STRING -#define i2t_ASN1_OBJECT GRPC_SHADOW_i2t_ASN1_OBJECT -#define i2v_ASN1_BIT_STRING GRPC_SHADOW_i2v_ASN1_BIT_STRING -#define i2v_GENERAL_NAME GRPC_SHADOW_i2v_GENERAL_NAME -#define i2v_GENERAL_NAMES GRPC_SHADOW_i2v_GENERAL_NAMES -#define kBoringSSLRSASqrtTwo GRPC_SHADOW_kBoringSSLRSASqrtTwo -#define kBoringSSLRSASqrtTwoLen GRPC_SHADOW_kBoringSSLRSASqrtTwoLen -#define kOpenSSLReasonStringData GRPC_SHADOW_kOpenSSLReasonStringData -#define kOpenSSLReasonValues GRPC_SHADOW_kOpenSSLReasonValues -#define kOpenSSLReasonValuesLen GRPC_SHADOW_kOpenSSLReasonValuesLen -#define level_add_node GRPC_SHADOW_level_add_node -#define level_find_node GRPC_SHADOW_level_find_node -#define lh_delete GRPC_SHADOW_lh_delete -#define lh_doall_arg GRPC_SHADOW_lh_doall_arg -#define lh_free GRPC_SHADOW_lh_free -#define lh_insert GRPC_SHADOW_lh_insert -#define lh_new GRPC_SHADOW_lh_new -#define lh_num_items GRPC_SHADOW_lh_num_items -#define lh_retrieve GRPC_SHADOW_lh_retrieve -#define lh_retrieve_key GRPC_SHADOW_lh_retrieve_key -#define lh_strhash GRPC_SHADOW_lh_strhash -#define md4_block_data_order GRPC_SHADOW_md4_block_data_order -#define md5_block_asm_data_order GRPC_SHADOW_md5_block_asm_data_order -#define o2i_ECPublicKey GRPC_SHADOW_o2i_ECPublicKey -#define pkcs12_iterations_acceptable GRPC_SHADOW_pkcs12_iterations_acceptable -#define pkcs12_key_gen GRPC_SHADOW_pkcs12_key_gen -#define pkcs12_pbe_encrypt_init GRPC_SHADOW_pkcs12_pbe_encrypt_init -#define pkcs7_bundle GRPC_SHADOW_pkcs7_bundle -#define pkcs7_parse_header GRPC_SHADOW_pkcs7_parse_header -#define pkcs8_pbe_decrypt GRPC_SHADOW_pkcs8_pbe_decrypt -#define policy_cache_find_data GRPC_SHADOW_policy_cache_find_data -#define policy_cache_free GRPC_SHADOW_policy_cache_free -#define policy_cache_set GRPC_SHADOW_policy_cache_set -#define policy_cache_set_mapping GRPC_SHADOW_policy_cache_set_mapping -#define policy_data_free GRPC_SHADOW_policy_data_free -#define policy_data_new GRPC_SHADOW_policy_data_new -#define policy_node_cmp_new GRPC_SHADOW_policy_node_cmp_new -#define policy_node_free GRPC_SHADOW_policy_node_free -#define policy_node_match GRPC_SHADOW_policy_node_match -#define rand_fork_unsafe_buffering_enabled GRPC_SHADOW_rand_fork_unsafe_buffering_enabled -#define rsa_asn1_meth GRPC_SHADOW_rsa_asn1_meth -#define rsa_default_decrypt GRPC_SHADOW_rsa_default_decrypt -#define rsa_default_private_transform GRPC_SHADOW_rsa_default_private_transform -#define rsa_default_sign_raw GRPC_SHADOW_rsa_default_sign_raw -#define rsa_default_size GRPC_SHADOW_rsa_default_size -#define rsa_pkey_meth GRPC_SHADOW_rsa_pkey_meth -#define rsaz_1024_gather5_avx2 GRPC_SHADOW_rsaz_1024_gather5_avx2 -#define rsaz_1024_mul_avx2 GRPC_SHADOW_rsaz_1024_mul_avx2 -#define rsaz_1024_norm2red_avx2 GRPC_SHADOW_rsaz_1024_norm2red_avx2 -#define rsaz_1024_red2norm_avx2 GRPC_SHADOW_rsaz_1024_red2norm_avx2 -#define rsaz_1024_scatter5_avx2 GRPC_SHADOW_rsaz_1024_scatter5_avx2 -#define rsaz_1024_sqr_avx2 GRPC_SHADOW_rsaz_1024_sqr_avx2 -#define s2i_ASN1_INTEGER GRPC_SHADOW_s2i_ASN1_INTEGER -#define s2i_ASN1_OCTET_STRING GRPC_SHADOW_s2i_ASN1_OCTET_STRING -#define sdallocx GRPC_SHADOW_sdallocx -#define sha1_block_data_order GRPC_SHADOW_sha1_block_data_order -#define sha256_block_data_order GRPC_SHADOW_sha256_block_data_order -#define sha512_block_data_order GRPC_SHADOW_sha512_block_data_order -#define sk_CRYPTO_BUFFER_call_copy_func GRPC_SHADOW_sk_CRYPTO_BUFFER_call_copy_func -#define sk_CRYPTO_BUFFER_call_copy_func GRPC_SHADOW_sk_CRYPTO_BUFFER_call_copy_func -#define sk_CRYPTO_BUFFER_call_free_func GRPC_SHADOW_sk_CRYPTO_BUFFER_call_free_func -#define sk_CRYPTO_BUFFER_call_free_func GRPC_SHADOW_sk_CRYPTO_BUFFER_call_free_func -#define sk_CRYPTO_BUFFER_deep_copy GRPC_SHADOW_sk_CRYPTO_BUFFER_deep_copy -#define sk_CRYPTO_BUFFER_deep_copy GRPC_SHADOW_sk_CRYPTO_BUFFER_deep_copy -#define sk_CRYPTO_BUFFER_new_null GRPC_SHADOW_sk_CRYPTO_BUFFER_new_null -#define sk_CRYPTO_BUFFER_new_null GRPC_SHADOW_sk_CRYPTO_BUFFER_new_null -#define sk_CRYPTO_BUFFER_new_null GRPC_SHADOW_sk_CRYPTO_BUFFER_new_null -#define sk_CRYPTO_BUFFER_new_null GRPC_SHADOW_sk_CRYPTO_BUFFER_new_null -#define sk_CRYPTO_BUFFER_new_null GRPC_SHADOW_sk_CRYPTO_BUFFER_new_null -#define sk_CRYPTO_BUFFER_new_null GRPC_SHADOW_sk_CRYPTO_BUFFER_new_null -#define sk_CRYPTO_BUFFER_num GRPC_SHADOW_sk_CRYPTO_BUFFER_num -#define sk_CRYPTO_BUFFER_num GRPC_SHADOW_sk_CRYPTO_BUFFER_num -#define sk_CRYPTO_BUFFER_num GRPC_SHADOW_sk_CRYPTO_BUFFER_num -#define sk_CRYPTO_BUFFER_num GRPC_SHADOW_sk_CRYPTO_BUFFER_num -#define sk_CRYPTO_BUFFER_num GRPC_SHADOW_sk_CRYPTO_BUFFER_num -#define sk_CRYPTO_BUFFER_num GRPC_SHADOW_sk_CRYPTO_BUFFER_num -#define sk_CRYPTO_BUFFER_num GRPC_SHADOW_sk_CRYPTO_BUFFER_num -#define sk_CRYPTO_BUFFER_num GRPC_SHADOW_sk_CRYPTO_BUFFER_num -#define sk_CRYPTO_BUFFER_num GRPC_SHADOW_sk_CRYPTO_BUFFER_num -#define sk_CRYPTO_BUFFER_push GRPC_SHADOW_sk_CRYPTO_BUFFER_push -#define sk_CRYPTO_BUFFER_set GRPC_SHADOW_sk_CRYPTO_BUFFER_set -#define sk_CRYPTO_BUFFER_value GRPC_SHADOW_sk_CRYPTO_BUFFER_value -#define sk_CRYPTO_BUFFER_value GRPC_SHADOW_sk_CRYPTO_BUFFER_value -#define sk_CRYPTO_BUFFER_value GRPC_SHADOW_sk_CRYPTO_BUFFER_value -#define sk_CRYPTO_BUFFER_value GRPC_SHADOW_sk_CRYPTO_BUFFER_value -#define sk_CRYPTO_BUFFER_value GRPC_SHADOW_sk_CRYPTO_BUFFER_value -#define sk_CRYPTO_BUFFER_value GRPC_SHADOW_sk_CRYPTO_BUFFER_value -#define sk_CRYPTO_BUFFER_value GRPC_SHADOW_sk_CRYPTO_BUFFER_value -#define sk_SRTP_PROTECTION_PROFILE_new_null GRPC_SHADOW_sk_SRTP_PROTECTION_PROFILE_new_null -#define sk_SRTP_PROTECTION_PROFILE_num GRPC_SHADOW_sk_SRTP_PROTECTION_PROFILE_num -#define sk_SRTP_PROTECTION_PROFILE_push GRPC_SHADOW_sk_SRTP_PROTECTION_PROFILE_push -#define sk_SSL_CIPHER_call_cmp_func GRPC_SHADOW_sk_SSL_CIPHER_call_cmp_func -#define sk_SSL_CIPHER_call_cmp_func GRPC_SHADOW_sk_SSL_CIPHER_call_cmp_func -#define sk_SSL_CIPHER_call_cmp_func GRPC_SHADOW_sk_SSL_CIPHER_call_cmp_func -#define sk_SSL_CIPHER_call_cmp_func GRPC_SHADOW_sk_SSL_CIPHER_call_cmp_func -#define sk_SSL_CIPHER_delete GRPC_SHADOW_sk_SSL_CIPHER_delete -#define sk_SSL_CIPHER_dup GRPC_SHADOW_sk_SSL_CIPHER_dup -#define sk_SSL_CIPHER_find GRPC_SHADOW_sk_SSL_CIPHER_find -#define sk_SSL_CIPHER_find GRPC_SHADOW_sk_SSL_CIPHER_find -#define sk_SSL_CIPHER_find GRPC_SHADOW_sk_SSL_CIPHER_find -#define sk_SSL_CIPHER_find GRPC_SHADOW_sk_SSL_CIPHER_find -#define sk_SSL_CIPHER_new_null GRPC_SHADOW_sk_SSL_CIPHER_new_null -#define sk_SSL_CIPHER_new_null GRPC_SHADOW_sk_SSL_CIPHER_new_null -#define sk_SSL_CIPHER_new_null GRPC_SHADOW_sk_SSL_CIPHER_new_null -#define sk_SSL_CIPHER_num GRPC_SHADOW_sk_SSL_CIPHER_num -#define sk_SSL_CIPHER_num GRPC_SHADOW_sk_SSL_CIPHER_num -#define sk_SSL_CIPHER_num GRPC_SHADOW_sk_SSL_CIPHER_num -#define sk_SSL_CIPHER_num GRPC_SHADOW_sk_SSL_CIPHER_num -#define sk_SSL_CIPHER_push GRPC_SHADOW_sk_SSL_CIPHER_push -#define sk_SSL_CIPHER_push GRPC_SHADOW_sk_SSL_CIPHER_push -#define sk_SSL_CIPHER_push GRPC_SHADOW_sk_SSL_CIPHER_push -#define sk_SSL_CIPHER_value GRPC_SHADOW_sk_SSL_CIPHER_value -#define sk_SSL_CIPHER_value GRPC_SHADOW_sk_SSL_CIPHER_value -#define sk_X509_NAME_call_cmp_func GRPC_SHADOW_sk_X509_NAME_call_cmp_func -#define sk_X509_NAME_call_copy_func GRPC_SHADOW_sk_X509_NAME_call_copy_func -#define sk_X509_NAME_call_free_func GRPC_SHADOW_sk_X509_NAME_call_free_func -#define sk_X509_NAME_call_free_func GRPC_SHADOW_sk_X509_NAME_call_free_func -#define sk_X509_NAME_deep_copy GRPC_SHADOW_sk_X509_NAME_deep_copy -#define sk_X509_NAME_find GRPC_SHADOW_sk_X509_NAME_find -#define sk_X509_NAME_free GRPC_SHADOW_sk_X509_NAME_free -#define sk_X509_NAME_new GRPC_SHADOW_sk_X509_NAME_new -#define sk_X509_NAME_new_null GRPC_SHADOW_sk_X509_NAME_new_null -#define sk_X509_NAME_new_null GRPC_SHADOW_sk_X509_NAME_new_null -#define sk_X509_NAME_pop_free GRPC_SHADOW_sk_X509_NAME_pop_free -#define sk_X509_NAME_pop_free GRPC_SHADOW_sk_X509_NAME_pop_free -#define sk_X509_NAME_push GRPC_SHADOW_sk_X509_NAME_push -#define sk_X509_NAME_set_cmp_func GRPC_SHADOW_sk_X509_NAME_set_cmp_func -#define sk_X509_NAME_sort GRPC_SHADOW_sk_X509_NAME_sort -#define sk_X509_call_free_func GRPC_SHADOW_sk_X509_call_free_func -#define sk_X509_new_null GRPC_SHADOW_sk_X509_new_null -#define sk_X509_num GRPC_SHADOW_sk_X509_num -#define sk_X509_pop_free GRPC_SHADOW_sk_X509_pop_free -#define sk_X509_shift GRPC_SHADOW_sk_X509_shift -#define sk_X509_value GRPC_SHADOW_sk_X509_value -#define sk_deep_copy GRPC_SHADOW_sk_deep_copy -#define sk_delete GRPC_SHADOW_sk_delete -#define sk_delete_ptr GRPC_SHADOW_sk_delete_ptr -#define sk_dup GRPC_SHADOW_sk_dup -#define sk_find GRPC_SHADOW_sk_find -#define sk_free GRPC_SHADOW_sk_free -#define sk_insert GRPC_SHADOW_sk_insert -#define sk_is_sorted GRPC_SHADOW_sk_is_sorted -#define sk_new GRPC_SHADOW_sk_new -#define sk_new_null GRPC_SHADOW_sk_new_null -#define sk_num GRPC_SHADOW_sk_num -#define sk_pop GRPC_SHADOW_sk_pop -#define sk_pop_free GRPC_SHADOW_sk_pop_free -#define sk_pop_free_ex GRPC_SHADOW_sk_pop_free_ex -#define sk_push GRPC_SHADOW_sk_push -#define sk_set GRPC_SHADOW_sk_set -#define sk_set_cmp_func GRPC_SHADOW_sk_set_cmp_func -#define sk_shift GRPC_SHADOW_sk_shift -#define sk_sort GRPC_SHADOW_sk_sort -#define sk_value GRPC_SHADOW_sk_value -#define sk_zero GRPC_SHADOW_sk_zero -#define tree_find_sk GRPC_SHADOW_tree_find_sk -#define v2i_ASN1_BIT_STRING GRPC_SHADOW_v2i_ASN1_BIT_STRING -#define v2i_GENERAL_NAME GRPC_SHADOW_v2i_GENERAL_NAME -#define v2i_GENERAL_NAMES GRPC_SHADOW_v2i_GENERAL_NAMES -#define v2i_GENERAL_NAME_ex GRPC_SHADOW_v2i_GENERAL_NAME_ex -#define v3_akey_id GRPC_SHADOW_v3_akey_id -#define v3_alt GRPC_SHADOW_v3_alt -#define v3_bcons GRPC_SHADOW_v3_bcons -#define v3_cpols GRPC_SHADOW_v3_cpols -#define v3_crl_invdate GRPC_SHADOW_v3_crl_invdate -#define v3_crl_num GRPC_SHADOW_v3_crl_num -#define v3_crl_reason GRPC_SHADOW_v3_crl_reason -#define v3_crld GRPC_SHADOW_v3_crld -#define v3_delta_crl GRPC_SHADOW_v3_delta_crl -#define v3_ext_ku GRPC_SHADOW_v3_ext_ku -#define v3_freshest_crl GRPC_SHADOW_v3_freshest_crl -#define v3_idp GRPC_SHADOW_v3_idp -#define v3_info GRPC_SHADOW_v3_info -#define v3_inhibit_anyp GRPC_SHADOW_v3_inhibit_anyp -#define v3_key_usage GRPC_SHADOW_v3_key_usage -#define v3_name_constraints GRPC_SHADOW_v3_name_constraints -#define v3_ns_ia5_list GRPC_SHADOW_v3_ns_ia5_list -#define v3_nscert GRPC_SHADOW_v3_nscert -#define v3_ocsp_accresp GRPC_SHADOW_v3_ocsp_accresp -#define v3_ocsp_nocheck GRPC_SHADOW_v3_ocsp_nocheck -#define v3_pci GRPC_SHADOW_v3_pci -#define v3_pkey_usage_period GRPC_SHADOW_v3_pkey_usage_period -#define v3_policy_constraints GRPC_SHADOW_v3_policy_constraints -#define v3_policy_mappings GRPC_SHADOW_v3_policy_mappings -#define v3_sinfo GRPC_SHADOW_v3_sinfo -#define v3_skey_id GRPC_SHADOW_v3_skey_id -#define v3_sxnet GRPC_SHADOW_v3_sxnet -#define vpaes_cbc_encrypt GRPC_SHADOW_vpaes_cbc_encrypt -#define vpaes_ctr32_encrypt_blocks GRPC_SHADOW_vpaes_ctr32_encrypt_blocks -#define vpaes_decrypt GRPC_SHADOW_vpaes_decrypt -#define vpaes_encrypt GRPC_SHADOW_vpaes_encrypt -#define vpaes_set_decrypt_key GRPC_SHADOW_vpaes_set_decrypt_key -#define vpaes_set_encrypt_key GRPC_SHADOW_vpaes_set_encrypt_key -#define x25519_asn1_meth GRPC_SHADOW_x25519_asn1_meth -#define x25519_ge_add GRPC_SHADOW_x25519_ge_add -#define x25519_ge_frombytes_vartime GRPC_SHADOW_x25519_ge_frombytes_vartime -#define x25519_ge_p1p1_to_p2 GRPC_SHADOW_x25519_ge_p1p1_to_p2 -#define x25519_ge_p1p1_to_p3 GRPC_SHADOW_x25519_ge_p1p1_to_p3 -#define x25519_ge_p3_to_cached GRPC_SHADOW_x25519_ge_p3_to_cached -#define x25519_ge_scalarmult GRPC_SHADOW_x25519_ge_scalarmult -#define x25519_ge_scalarmult_base GRPC_SHADOW_x25519_ge_scalarmult_base -#define x25519_ge_scalarmult_small_precomp GRPC_SHADOW_x25519_ge_scalarmult_small_precomp -#define x25519_ge_sub GRPC_SHADOW_x25519_ge_sub -#define x25519_ge_tobytes GRPC_SHADOW_x25519_ge_tobytes -#define x25519_pkey_meth GRPC_SHADOW_x25519_pkey_meth -#define x25519_sc_reduce GRPC_SHADOW_x25519_sc_reduce -#define x509_digest_sign_algorithm GRPC_SHADOW_x509_digest_sign_algorithm -#define x509_digest_verify_init GRPC_SHADOW_x509_digest_verify_init -#define x509_print_rsa_pss_params GRPC_SHADOW_x509_print_rsa_pss_params -#define x509_rsa_ctx_to_pss GRPC_SHADOW_x509_rsa_ctx_to_pss -#define x509_rsa_pss_to_ctx GRPC_SHADOW_x509_rsa_pss_to_ctx -#define x509v3_bytes_to_hex GRPC_SHADOW_x509v3_bytes_to_hex -#define x509v3_hex_to_bytes GRPC_SHADOW_x509v3_hex_to_bytes -#define x509v3_looks_like_dns_name GRPC_SHADOW_x509v3_looks_like_dns_name -#define x509v3_name_cmp GRPC_SHADOW_x509v3_name_cmp - -#endif /* GRPC_SHADOW_BORINGSSL_SYMBOLS */ - -#endif /* GRPC_CORE_TSI_GRPC_SHADOW_BORINGSSL_H */ diff --git a/src/core/tsi/ssl/session_cache/ssl_session.h b/src/core/tsi/ssl/session_cache/ssl_session.h index e8107dfa39e..108c0cd1338 100644 --- a/src/core/tsi/ssl/session_cache/ssl_session.h +++ b/src/core/tsi/ssl/session_cache/ssl_session.h @@ -21,8 +21,6 @@ #include -#include "src/core/tsi/grpc_shadow_boringssl.h" - #include extern "C" { diff --git a/src/core/tsi/ssl/session_cache/ssl_session_cache.h b/src/core/tsi/ssl/session_cache/ssl_session_cache.h index 2eadab25edd..5d91af7b18d 100644 --- a/src/core/tsi/ssl/session_cache/ssl_session_cache.h +++ b/src/core/tsi/ssl/session_cache/ssl_session_cache.h @@ -21,8 +21,6 @@ #include -#include "src/core/tsi/grpc_shadow_boringssl.h" - #include #include diff --git a/src/core/tsi/ssl_transport_security.cc b/src/core/tsi/ssl_transport_security.cc index 8b6d9f39dd4..d45ac06839c 100644 --- a/src/core/tsi/ssl_transport_security.cc +++ b/src/core/tsi/ssl_transport_security.cc @@ -18,8 +18,6 @@ #include -#include "src/core/tsi/grpc_shadow_boringssl.h" - #include "src/core/tsi/ssl_transport_security.h" #include diff --git a/src/core/tsi/ssl_types.h b/src/core/tsi/ssl_types.h index 0ce5e2ee6f3..b15d02be390 100644 --- a/src/core/tsi/ssl_types.h +++ b/src/core/tsi/ssl_types.h @@ -29,8 +29,6 @@ #include -#include "src/core/tsi/grpc_shadow_boringssl.h" - #include #ifdef OPENSSL_IS_BORINGSSL diff --git a/src/objective-c/grpc_shadow_boringssl_symbol_list b/src/objective-c/grpc_shadow_boringssl_symbol_list deleted file mode 100644 index 5669acc9ed7..00000000000 --- a/src/objective-c/grpc_shadow_boringssl_symbol_list +++ /dev/null @@ -1,3265 +0,0 @@ -# Automatically generated by tools/distrib/generate_grpc_shadow_boringssl_symbol_list.sh -7f02881e96e51f1873afcf384d02f782b48967ca -ACCESS_DESCRIPTION_free -ACCESS_DESCRIPTION_it -ACCESS_DESCRIPTION_new -AES_CMAC -AES_cbc_encrypt -AES_cfb128_encrypt -AES_ctr128_encrypt -AES_decrypt -AES_ecb_encrypt -AES_encrypt -AES_ofb128_encrypt -AES_set_decrypt_key -AES_set_encrypt_key -AES_unwrap_key -AES_unwrap_key_padded -AES_wrap_key -AES_wrap_key_padded -ASN1_ANY_it -ASN1_BIT_STRING_check -ASN1_BIT_STRING_free -ASN1_BIT_STRING_get_bit -ASN1_BIT_STRING_it -ASN1_BIT_STRING_new -ASN1_BIT_STRING_set -ASN1_BIT_STRING_set_bit -ASN1_BMPSTRING_free -ASN1_BMPSTRING_it -ASN1_BMPSTRING_new -ASN1_BOOLEAN_it -ASN1_ENUMERATED_free -ASN1_ENUMERATED_get -ASN1_ENUMERATED_it -ASN1_ENUMERATED_new -ASN1_ENUMERATED_set -ASN1_ENUMERATED_to_BN -ASN1_FBOOLEAN_it -ASN1_GENERALIZEDTIME_adj -ASN1_GENERALIZEDTIME_check -ASN1_GENERALIZEDTIME_free -ASN1_GENERALIZEDTIME_it -ASN1_GENERALIZEDTIME_new -ASN1_GENERALIZEDTIME_print -ASN1_GENERALIZEDTIME_set -ASN1_GENERALIZEDTIME_set_string -ASN1_GENERALSTRING_free -ASN1_GENERALSTRING_it -ASN1_GENERALSTRING_new -ASN1_IA5STRING_free -ASN1_IA5STRING_it -ASN1_IA5STRING_new -ASN1_INTEGER_cmp -ASN1_INTEGER_dup -ASN1_INTEGER_free -ASN1_INTEGER_get -ASN1_INTEGER_it -ASN1_INTEGER_new -ASN1_INTEGER_set -ASN1_INTEGER_set_uint64 -ASN1_INTEGER_to_BN -ASN1_NULL_free -ASN1_NULL_it -ASN1_NULL_new -ASN1_OBJECT_create -ASN1_OBJECT_free -ASN1_OBJECT_it -ASN1_OBJECT_new -ASN1_OCTET_STRING_NDEF_it -ASN1_OCTET_STRING_cmp -ASN1_OCTET_STRING_dup -ASN1_OCTET_STRING_free -ASN1_OCTET_STRING_it -ASN1_OCTET_STRING_new -ASN1_OCTET_STRING_set -ASN1_PRINTABLESTRING_free -ASN1_PRINTABLESTRING_it -ASN1_PRINTABLESTRING_new -ASN1_PRINTABLE_free -ASN1_PRINTABLE_it -ASN1_PRINTABLE_new -ASN1_PRINTABLE_type -ASN1_SEQUENCE_ANY_it -ASN1_SEQUENCE_it -ASN1_SET_ANY_it -ASN1_STRING_TABLE_add -ASN1_STRING_TABLE_cleanup -ASN1_STRING_TABLE_get -ASN1_STRING_cmp -ASN1_STRING_copy -ASN1_STRING_data -ASN1_STRING_dup -ASN1_STRING_free -ASN1_STRING_get0_data -ASN1_STRING_get_default_mask -ASN1_STRING_length -ASN1_STRING_length_set -ASN1_STRING_new -ASN1_STRING_print -ASN1_STRING_print_ex -ASN1_STRING_print_ex_fp -ASN1_STRING_set -ASN1_STRING_set0 -ASN1_STRING_set_by_NID -ASN1_STRING_set_default_mask -ASN1_STRING_set_default_mask_asc -ASN1_STRING_to_UTF8 -ASN1_STRING_type -ASN1_STRING_type_new -ASN1_T61STRING_free -ASN1_T61STRING_it -ASN1_T61STRING_new -ASN1_TBOOLEAN_it -ASN1_TIME_adj -ASN1_TIME_check -ASN1_TIME_diff -ASN1_TIME_free -ASN1_TIME_it -ASN1_TIME_new -ASN1_TIME_print -ASN1_TIME_set -ASN1_TIME_set_string -ASN1_TIME_to_generalizedtime -ASN1_TYPE_cmp -ASN1_TYPE_free -ASN1_TYPE_get -ASN1_TYPE_new -ASN1_TYPE_set -ASN1_TYPE_set1 -ASN1_UNIVERSALSTRING_free -ASN1_UNIVERSALSTRING_it -ASN1_UNIVERSALSTRING_new -ASN1_UTCTIME_adj -ASN1_UTCTIME_check -ASN1_UTCTIME_cmp_time_t -ASN1_UTCTIME_free -ASN1_UTCTIME_it -ASN1_UTCTIME_new -ASN1_UTCTIME_print -ASN1_UTCTIME_set -ASN1_UTCTIME_set_string -ASN1_UTF8STRING_free -ASN1_UTF8STRING_it -ASN1_UTF8STRING_new -ASN1_VISIBLESTRING_free -ASN1_VISIBLESTRING_it -ASN1_VISIBLESTRING_new -ASN1_digest -ASN1_generate_nconf -ASN1_generate_v3 -ASN1_get_object -ASN1_item_d2i -ASN1_item_d2i_bio -ASN1_item_d2i_fp -ASN1_item_digest -ASN1_item_dup -ASN1_item_ex_d2i -ASN1_item_ex_free -ASN1_item_ex_i2d -ASN1_item_ex_new -ASN1_item_free -ASN1_item_i2d -ASN1_item_i2d_bio -ASN1_item_i2d_fp -ASN1_item_ndef_i2d -ASN1_item_new -ASN1_item_pack -ASN1_item_sign -ASN1_item_sign_ctx -ASN1_item_unpack -ASN1_item_verify -ASN1_mbstring_copy -ASN1_mbstring_ncopy -ASN1_object_size -ASN1_primitive_free -ASN1_primitive_new -ASN1_put_eoc -ASN1_put_object -ASN1_tag2bit -ASN1_tag2str -ASN1_template_free -ASN1_template_new -AUTHORITY_INFO_ACCESS_free -AUTHORITY_INFO_ACCESS_it -AUTHORITY_INFO_ACCESS_new -AUTHORITY_KEYID_free -AUTHORITY_KEYID_it -AUTHORITY_KEYID_new -BASIC_CONSTRAINTS_free -BASIC_CONSTRAINTS_it -BASIC_CONSTRAINTS_new -BIO_append_filename -BIO_callback_ctrl -BIO_clear_flags -BIO_clear_retry_flags -BIO_copy_next_retry -BIO_ctrl -BIO_ctrl_get_read_request -BIO_ctrl_get_write_guarantee -BIO_ctrl_pending -BIO_do_connect -BIO_eof -BIO_f_ssl -BIO_find_type -BIO_flush -BIO_free -BIO_free_all -BIO_get_data -BIO_get_fd -BIO_get_fp -BIO_get_init -BIO_get_mem_data -BIO_get_mem_ptr -BIO_get_new_index -BIO_get_retry_flags -BIO_get_retry_reason -BIO_get_shutdown -BIO_gets -BIO_hexdump -BIO_indent -BIO_int_ctrl -BIO_mem_contents -BIO_meth_free -BIO_meth_new -BIO_meth_set_create -BIO_meth_set_ctrl -BIO_meth_set_destroy -BIO_meth_set_gets -BIO_meth_set_puts -BIO_meth_set_read -BIO_meth_set_write -BIO_method_type -BIO_new -BIO_new_bio_pair -BIO_new_connect -BIO_new_fd -BIO_new_file -BIO_new_fp -BIO_new_mem_buf -BIO_new_socket -BIO_next -BIO_number_read -BIO_number_written -BIO_pending -BIO_pop -BIO_printf -BIO_ptr_ctrl -BIO_push -BIO_puts -BIO_read -BIO_read_asn1 -BIO_read_filename -BIO_reset -BIO_rw_filename -BIO_s_connect -BIO_s_fd -BIO_s_file -BIO_s_mem -BIO_s_socket -BIO_set_close -BIO_set_conn_hostname -BIO_set_conn_int_port -BIO_set_conn_port -BIO_set_data -BIO_set_fd -BIO_set_flags -BIO_set_fp -BIO_set_init -BIO_set_mem_buf -BIO_set_mem_eof_return -BIO_set_nbio -BIO_set_retry_read -BIO_set_retry_special -BIO_set_retry_write -BIO_set_shutdown -BIO_set_ssl -BIO_set_write_buffer_size -BIO_should_io_special -BIO_should_read -BIO_should_retry -BIO_should_write -BIO_shutdown_wr -BIO_snprintf -BIO_test_flags -BIO_up_ref -BIO_vfree -BIO_vsnprintf -BIO_wpending -BIO_write -BIO_write_all -BIO_write_filename -BN_BLINDING_convert -BN_BLINDING_free -BN_BLINDING_invert -BN_BLINDING_new -BN_CTX_end -BN_CTX_free -BN_CTX_get -BN_CTX_new -BN_CTX_start -BN_GENCB_call -BN_GENCB_set -BN_MONT_CTX_copy -BN_MONT_CTX_free -BN_MONT_CTX_new -BN_MONT_CTX_new_consttime -BN_MONT_CTX_new_for_modulus -BN_MONT_CTX_set -BN_MONT_CTX_set_locked -BN_abs_is_word -BN_add -BN_add_word -BN_asc2bn -BN_bin2bn -BN_bn2bin -BN_bn2bin_padded -BN_bn2binpad -BN_bn2cbb_padded -BN_bn2dec -BN_bn2hex -BN_bn2le_padded -BN_bn2mpi -BN_clear -BN_clear_bit -BN_clear_free -BN_cmp -BN_cmp_word -BN_copy -BN_count_low_zero_bits -BN_dec2bn -BN_div -BN_div_word -BN_dup -BN_enhanced_miller_rabin_primality_test -BN_equal_consttime -BN_exp -BN_free -BN_from_montgomery -BN_gcd -BN_generate_prime_ex -BN_get_rfc3526_prime_1536 -BN_get_u64 -BN_get_word -BN_hex2bn -BN_init -BN_is_bit_set -BN_is_negative -BN_is_odd -BN_is_one -BN_is_pow2 -BN_is_prime_ex -BN_is_prime_fasttest_ex -BN_is_word -BN_is_zero -BN_le2bn -BN_lshift -BN_lshift1 -BN_marshal_asn1 -BN_mask_bits -BN_mod_add -BN_mod_add_quick -BN_mod_exp -BN_mod_exp2_mont -BN_mod_exp_mont -BN_mod_exp_mont_consttime -BN_mod_exp_mont_word -BN_mod_inverse -BN_mod_inverse_blinded -BN_mod_inverse_odd -BN_mod_lshift -BN_mod_lshift1 -BN_mod_lshift1_quick -BN_mod_lshift_quick -BN_mod_mul -BN_mod_mul_montgomery -BN_mod_pow2 -BN_mod_sqr -BN_mod_sqrt -BN_mod_sub -BN_mod_sub_quick -BN_mod_word -BN_mpi2bn -BN_mul -BN_mul_word -BN_new -BN_nnmod -BN_nnmod_pow2 -BN_num_bits -BN_num_bits_word -BN_num_bytes -BN_one -BN_parse_asn1_unsigned -BN_primality_test -BN_print -BN_print_fp -BN_pseudo_rand -BN_pseudo_rand_range -BN_rand -BN_rand_range -BN_rand_range_ex -BN_rshift -BN_rshift1 -BN_set_bit -BN_set_negative -BN_set_u64 -BN_set_word -BN_sqr -BN_sqrt -BN_sub -BN_sub_word -BN_to_ASN1_ENUMERATED -BN_to_ASN1_INTEGER -BN_to_montgomery -BN_uadd -BN_ucmp -BN_usub -BN_value_one -BN_zero -BORINGSSL_function_hit -BORINGSSL_self_test -BUF_MEM_append -BUF_MEM_free -BUF_MEM_grow -BUF_MEM_grow_clean -BUF_MEM_new -BUF_MEM_reserve -BUF_memdup -BUF_strdup -BUF_strlcat -BUF_strlcpy -BUF_strndup -BUF_strnlen -CBB_add_asn1 -CBB_add_asn1_bool -CBB_add_asn1_octet_string -CBB_add_asn1_oid_from_text -CBB_add_asn1_uint64 -CBB_add_bytes -CBB_add_space -CBB_add_u16 -CBB_add_u16_length_prefixed -CBB_add_u24 -CBB_add_u24_length_prefixed -CBB_add_u32 -CBB_add_u64 -CBB_add_u8 -CBB_add_u8_length_prefixed -CBB_cleanup -CBB_data -CBB_did_write -CBB_discard_child -CBB_finish -CBB_finish_i2d -CBB_flush -CBB_flush_asn1_set_of -CBB_init -CBB_init_fixed -CBB_len -CBB_reserve -CBB_zero -CBS_asn1_ber_to_der -CBS_asn1_bitstring_has_bit -CBS_asn1_oid_to_text -CBS_contains_zero_byte -CBS_copy_bytes -CBS_data -CBS_get_any_asn1 -CBS_get_any_asn1_element -CBS_get_any_ber_asn1_element -CBS_get_asn1 -CBS_get_asn1_bool -CBS_get_asn1_element -CBS_get_asn1_implicit_string -CBS_get_asn1_uint64 -CBS_get_bytes -CBS_get_last_u8 -CBS_get_optional_asn1 -CBS_get_optional_asn1_bool -CBS_get_optional_asn1_octet_string -CBS_get_optional_asn1_uint64 -CBS_get_u16 -CBS_get_u16_length_prefixed -CBS_get_u24 -CBS_get_u24_length_prefixed -CBS_get_u32 -CBS_get_u64 -CBS_get_u8 -CBS_get_u8_length_prefixed -CBS_init -CBS_is_valid_asn1_bitstring -CBS_len -CBS_mem_equal -CBS_peek_asn1_tag -CBS_skip -CBS_stow -CBS_strdup -CERTIFICATEPOLICIES_free -CERTIFICATEPOLICIES_it -CERTIFICATEPOLICIES_new -CMAC_CTX_copy -CMAC_CTX_free -CMAC_CTX_new -CMAC_Final -CMAC_Init -CMAC_Reset -CMAC_Update -CONF_VALUE_new -CONF_modules_free -CONF_modules_load_file -CONF_parse_list -CRL_DIST_POINTS_free -CRL_DIST_POINTS_it -CRL_DIST_POINTS_new -CRYPTO_BUFFER_POOL_free -CRYPTO_BUFFER_POOL_new -CRYPTO_BUFFER_alloc -CRYPTO_BUFFER_data -CRYPTO_BUFFER_free -CRYPTO_BUFFER_init_CBS -CRYPTO_BUFFER_len -CRYPTO_BUFFER_new -CRYPTO_BUFFER_new_from_CBS -CRYPTO_BUFFER_up_ref -CRYPTO_MUTEX_cleanup -CRYPTO_MUTEX_init -CRYPTO_MUTEX_lock_read -CRYPTO_MUTEX_lock_write -CRYPTO_MUTEX_unlock_read -CRYPTO_MUTEX_unlock_write -CRYPTO_POLYVAL_finish -CRYPTO_POLYVAL_init -CRYPTO_POLYVAL_update_blocks -CRYPTO_STATIC_MUTEX_lock_read -CRYPTO_STATIC_MUTEX_lock_write -CRYPTO_STATIC_MUTEX_unlock_read -CRYPTO_STATIC_MUTEX_unlock_write -CRYPTO_THREADID_current -CRYPTO_THREADID_set_callback -CRYPTO_THREADID_set_numeric -CRYPTO_THREADID_set_pointer -CRYPTO_cbc128_decrypt -CRYPTO_cbc128_encrypt -CRYPTO_cfb128_1_encrypt -CRYPTO_cfb128_8_encrypt -CRYPTO_cfb128_encrypt -CRYPTO_chacha_20 -CRYPTO_cleanup_all_ex_data -CRYPTO_ctr128_encrypt -CRYPTO_ctr128_encrypt_ctr32 -CRYPTO_free_ex_data -CRYPTO_gcm128_aad -CRYPTO_gcm128_decrypt -CRYPTO_gcm128_decrypt_ctr32 -CRYPTO_gcm128_encrypt -CRYPTO_gcm128_encrypt_ctr32 -CRYPTO_gcm128_finish -CRYPTO_gcm128_init_key -CRYPTO_gcm128_setiv -CRYPTO_gcm128_tag -CRYPTO_get_dynlock_create_callback -CRYPTO_get_dynlock_destroy_callback -CRYPTO_get_dynlock_lock_callback -CRYPTO_get_ex_data -CRYPTO_get_ex_new_index -CRYPTO_get_lock_name -CRYPTO_get_locking_callback -CRYPTO_get_thread_local -CRYPTO_ghash_init -CRYPTO_has_asm -CRYPTO_hchacha20 -CRYPTO_is_confidential_build -CRYPTO_library_init -CRYPTO_malloc_init -CRYPTO_memcmp -CRYPTO_new_ex_data -CRYPTO_num_locks -CRYPTO_ofb128_encrypt -CRYPTO_once -CRYPTO_poly1305_finish -CRYPTO_poly1305_init -CRYPTO_poly1305_update -CRYPTO_rdrand -CRYPTO_rdrand_multiple8_buf -CRYPTO_refcount_dec_and_test_zero -CRYPTO_refcount_inc -CRYPTO_set_add_lock_callback -CRYPTO_set_dynlock_create_callback -CRYPTO_set_dynlock_destroy_callback -CRYPTO_set_dynlock_lock_callback -CRYPTO_set_ex_data -CRYPTO_set_id_callback -CRYPTO_set_locking_callback -CRYPTO_set_thread_local -CRYPTO_sysrand -CRYPTO_tls1_prf -CTR_DRBG_clear -CTR_DRBG_generate -CTR_DRBG_init -CTR_DRBG_reseed -ChaCha20_ctr32 -DES_decrypt3 -DES_ecb3_encrypt -DES_ecb_encrypt -DES_ede2_cbc_encrypt -DES_ede3_cbc_encrypt -DES_encrypt3 -DES_ncbc_encrypt -DES_set_key -DES_set_key_unchecked -DES_set_odd_parity -DH_check -DH_check_pub_key -DH_compute_key -DH_free -DH_generate_key -DH_generate_parameters_ex -DH_get0_key -DH_get0_pqg -DH_get_ex_data -DH_get_ex_new_index -DH_marshal_parameters -DH_new -DH_num_bits -DH_parse_parameters -DH_set0_key -DH_set0_pqg -DH_set_ex_data -DH_size -DH_up_ref -DHparams_dup -DIRECTORYSTRING_free -DIRECTORYSTRING_it -DIRECTORYSTRING_new -DISPLAYTEXT_free -DISPLAYTEXT_it -DISPLAYTEXT_new -DIST_POINT_NAME_free -DIST_POINT_NAME_it -DIST_POINT_NAME_new -DIST_POINT_free -DIST_POINT_it -DIST_POINT_new -DIST_POINT_set_dpname -DSA_SIG_free -DSA_SIG_marshal -DSA_SIG_new -DSA_SIG_parse -DSA_check_signature -DSA_do_check_signature -DSA_do_sign -DSA_do_verify -DSA_dup_DH -DSA_free -DSA_generate_key -DSA_generate_parameters_ex -DSA_get0_key -DSA_get0_pqg -DSA_get_ex_data -DSA_get_ex_new_index -DSA_marshal_parameters -DSA_marshal_private_key -DSA_marshal_public_key -DSA_new -DSA_parse_parameters -DSA_parse_private_key -DSA_parse_public_key -DSA_set0_key -DSA_set0_pqg -DSA_set_ex_data -DSA_sign -DSA_size -DSA_up_ref -DSA_verify -DSAparams_dup -DTLS_client_method -DTLS_method -DTLS_server_method -DTLS_with_buffers_method -DTLSv1_2_client_method -DTLSv1_2_method -DTLSv1_2_server_method -DTLSv1_client_method -DTLSv1_get_timeout -DTLSv1_handle_timeout -DTLSv1_method -DTLSv1_server_method -DTLSv1_set_initial_timeout_duration -ECDH_compute_key -ECDH_compute_key_fips -ECDSA_SIG_free -ECDSA_SIG_from_bytes -ECDSA_SIG_get0 -ECDSA_SIG_marshal -ECDSA_SIG_max_len -ECDSA_SIG_new -ECDSA_SIG_parse -ECDSA_SIG_set0 -ECDSA_SIG_to_bytes -ECDSA_do_sign -ECDSA_do_verify -ECDSA_sign -ECDSA_size -ECDSA_verify -EC_GFp_mont_method -EC_GFp_nistp224_method -EC_GFp_nistp256_method -EC_GFp_nistz256_method -EC_GROUP_cmp -EC_GROUP_dup -EC_GROUP_free -EC_GROUP_get0_generator -EC_GROUP_get0_order -EC_GROUP_get_cofactor -EC_GROUP_get_curve_GFp -EC_GROUP_get_curve_name -EC_GROUP_get_degree -EC_GROUP_get_order -EC_GROUP_method_of -EC_GROUP_new_by_curve_name -EC_GROUP_new_curve_GFp -EC_GROUP_order_bits -EC_GROUP_set_asn1_flag -EC_GROUP_set_generator -EC_GROUP_set_point_conversion_form -EC_KEY_check_fips -EC_KEY_check_key -EC_KEY_derive_from_secret -EC_KEY_dup -EC_KEY_free -EC_KEY_generate_key -EC_KEY_generate_key_fips -EC_KEY_get0_group -EC_KEY_get0_private_key -EC_KEY_get0_public_key -EC_KEY_get_conv_form -EC_KEY_get_enc_flags -EC_KEY_get_ex_data -EC_KEY_get_ex_new_index -EC_KEY_is_opaque -EC_KEY_key2buf -EC_KEY_marshal_curve_name -EC_KEY_marshal_private_key -EC_KEY_new -EC_KEY_new_by_curve_name -EC_KEY_new_method -EC_KEY_parse_curve_name -EC_KEY_parse_parameters -EC_KEY_parse_private_key -EC_KEY_set_asn1_flag -EC_KEY_set_conv_form -EC_KEY_set_enc_flags -EC_KEY_set_ex_data -EC_KEY_set_group -EC_KEY_set_private_key -EC_KEY_set_public_key -EC_KEY_set_public_key_affine_coordinates -EC_KEY_up_ref -EC_METHOD_get_field_type -EC_POINT_add -EC_POINT_clear_free -EC_POINT_cmp -EC_POINT_copy -EC_POINT_dbl -EC_POINT_dup -EC_POINT_free -EC_POINT_get_affine_coordinates_GFp -EC_POINT_invert -EC_POINT_is_at_infinity -EC_POINT_is_on_curve -EC_POINT_mul -EC_POINT_new -EC_POINT_oct2point -EC_POINT_point2cbb -EC_POINT_point2oct -EC_POINT_set_affine_coordinates_GFp -EC_POINT_set_compressed_coordinates_GFp -EC_POINT_set_to_infinity -EC_curve_nid2nist -EC_curve_nist2nid -EC_get_builtin_curves -ED25519_keypair -ED25519_keypair_from_seed -ED25519_sign -ED25519_verify -EDIPARTYNAME_free -EDIPARTYNAME_it -EDIPARTYNAME_new -ENGINE_free -ENGINE_get_ECDSA_method -ENGINE_get_RSA_method -ENGINE_load_builtin_engines -ENGINE_new -ENGINE_register_all_complete -ENGINE_set_ECDSA_method -ENGINE_set_RSA_method -ERR_SAVE_STATE_free -ERR_add_error_data -ERR_add_error_dataf -ERR_clear_error -ERR_clear_system_error -ERR_error_string -ERR_error_string_n -ERR_free_strings -ERR_func_error_string -ERR_get_error -ERR_get_error_line -ERR_get_error_line_data -ERR_get_next_error_library -ERR_lib_error_string -ERR_load_BIO_strings -ERR_load_ERR_strings -ERR_load_RAND_strings -ERR_load_SSL_strings -ERR_load_crypto_strings -ERR_peek_error -ERR_peek_error_line -ERR_peek_error_line_data -ERR_peek_last_error -ERR_peek_last_error_line -ERR_peek_last_error_line_data -ERR_pop_to_mark -ERR_print_errors -ERR_print_errors_cb -ERR_print_errors_fp -ERR_put_error -ERR_reason_error_string -ERR_remove_state -ERR_remove_thread_state -ERR_restore_state -ERR_save_state -ERR_set_mark -EVP_AEAD_CTX_aead -EVP_AEAD_CTX_cleanup -EVP_AEAD_CTX_free -EVP_AEAD_CTX_get_iv -EVP_AEAD_CTX_init -EVP_AEAD_CTX_init_with_direction -EVP_AEAD_CTX_new -EVP_AEAD_CTX_open -EVP_AEAD_CTX_open_gather -EVP_AEAD_CTX_seal -EVP_AEAD_CTX_seal_scatter -EVP_AEAD_CTX_tag_len -EVP_AEAD_CTX_zero -EVP_AEAD_key_length -EVP_AEAD_max_overhead -EVP_AEAD_max_tag_len -EVP_AEAD_nonce_length -EVP_BytesToKey -EVP_CIPHER_CTX_block_size -EVP_CIPHER_CTX_cipher -EVP_CIPHER_CTX_cleanup -EVP_CIPHER_CTX_copy -EVP_CIPHER_CTX_ctrl -EVP_CIPHER_CTX_encrypting -EVP_CIPHER_CTX_flags -EVP_CIPHER_CTX_free -EVP_CIPHER_CTX_get_app_data -EVP_CIPHER_CTX_init -EVP_CIPHER_CTX_iv_length -EVP_CIPHER_CTX_key_length -EVP_CIPHER_CTX_mode -EVP_CIPHER_CTX_new -EVP_CIPHER_CTX_nid -EVP_CIPHER_CTX_reset -EVP_CIPHER_CTX_set_app_data -EVP_CIPHER_CTX_set_flags -EVP_CIPHER_CTX_set_key_length -EVP_CIPHER_CTX_set_padding -EVP_CIPHER_block_size -EVP_CIPHER_flags -EVP_CIPHER_iv_length -EVP_CIPHER_key_length -EVP_CIPHER_mode -EVP_CIPHER_nid -EVP_Cipher -EVP_CipherFinal_ex -EVP_CipherInit -EVP_CipherInit_ex -EVP_CipherUpdate -EVP_DecodeBase64 -EVP_DecodeBlock -EVP_DecodeFinal -EVP_DecodeInit -EVP_DecodeUpdate -EVP_DecodedLength -EVP_DecryptFinal_ex -EVP_DecryptInit -EVP_DecryptInit_ex -EVP_DecryptUpdate -EVP_Digest -EVP_DigestFinal -EVP_DigestFinalXOF -EVP_DigestFinal_ex -EVP_DigestInit -EVP_DigestInit_ex -EVP_DigestSign -EVP_DigestSignFinal -EVP_DigestSignInit -EVP_DigestSignUpdate -EVP_DigestUpdate -EVP_DigestVerify -EVP_DigestVerifyFinal -EVP_DigestVerifyInit -EVP_DigestVerifyUpdate -EVP_EncodeBlock -EVP_EncodeFinal -EVP_EncodeInit -EVP_EncodeUpdate -EVP_EncodedLength -EVP_EncryptFinal_ex -EVP_EncryptInit -EVP_EncryptInit_ex -EVP_EncryptUpdate -EVP_MD_CTX_block_size -EVP_MD_CTX_cleanup -EVP_MD_CTX_copy -EVP_MD_CTX_copy_ex -EVP_MD_CTX_create -EVP_MD_CTX_destroy -EVP_MD_CTX_free -EVP_MD_CTX_init -EVP_MD_CTX_md -EVP_MD_CTX_new -EVP_MD_CTX_reset -EVP_MD_CTX_size -EVP_MD_CTX_type -EVP_MD_block_size -EVP_MD_flags -EVP_MD_meth_get_flags -EVP_MD_size -EVP_MD_type -EVP_PBE_scrypt -EVP_PKCS82PKEY -EVP_PKEY2PKCS8 -EVP_PKEY_CTX_ctrl -EVP_PKEY_CTX_dup -EVP_PKEY_CTX_free -EVP_PKEY_CTX_get0_pkey -EVP_PKEY_CTX_get0_rsa_oaep_label -EVP_PKEY_CTX_get_rsa_mgf1_md -EVP_PKEY_CTX_get_rsa_oaep_md -EVP_PKEY_CTX_get_rsa_padding -EVP_PKEY_CTX_get_rsa_pss_saltlen -EVP_PKEY_CTX_get_signature_md -EVP_PKEY_CTX_new -EVP_PKEY_CTX_new_id -EVP_PKEY_CTX_set0_rsa_oaep_label -EVP_PKEY_CTX_set_ec_param_enc -EVP_PKEY_CTX_set_ec_paramgen_curve_nid -EVP_PKEY_CTX_set_rsa_keygen_bits -EVP_PKEY_CTX_set_rsa_keygen_pubexp -EVP_PKEY_CTX_set_rsa_mgf1_md -EVP_PKEY_CTX_set_rsa_oaep_md -EVP_PKEY_CTX_set_rsa_padding -EVP_PKEY_CTX_set_rsa_pss_saltlen -EVP_PKEY_CTX_set_signature_md -EVP_PKEY_assign -EVP_PKEY_assign_DSA -EVP_PKEY_assign_EC_KEY -EVP_PKEY_assign_RSA -EVP_PKEY_base_id -EVP_PKEY_bits -EVP_PKEY_cmp -EVP_PKEY_cmp_parameters -EVP_PKEY_copy_parameters -EVP_PKEY_decrypt -EVP_PKEY_decrypt_init -EVP_PKEY_derive -EVP_PKEY_derive_init -EVP_PKEY_derive_set_peer -EVP_PKEY_encrypt -EVP_PKEY_encrypt_init -EVP_PKEY_free -EVP_PKEY_get0_DH -EVP_PKEY_get0_DSA -EVP_PKEY_get0_EC_KEY -EVP_PKEY_get0_RSA -EVP_PKEY_get1_DH -EVP_PKEY_get1_DSA -EVP_PKEY_get1_EC_KEY -EVP_PKEY_get1_RSA -EVP_PKEY_get1_tls_encodedpoint -EVP_PKEY_get_raw_private_key -EVP_PKEY_get_raw_public_key -EVP_PKEY_id -EVP_PKEY_is_opaque -EVP_PKEY_keygen -EVP_PKEY_keygen_init -EVP_PKEY_missing_parameters -EVP_PKEY_new -EVP_PKEY_new_raw_private_key -EVP_PKEY_new_raw_public_key -EVP_PKEY_paramgen -EVP_PKEY_paramgen_init -EVP_PKEY_print_params -EVP_PKEY_print_private -EVP_PKEY_print_public -EVP_PKEY_set1_DSA -EVP_PKEY_set1_EC_KEY -EVP_PKEY_set1_RSA -EVP_PKEY_set1_tls_encodedpoint -EVP_PKEY_set_type -EVP_PKEY_sign -EVP_PKEY_sign_init -EVP_PKEY_size -EVP_PKEY_type -EVP_PKEY_up_ref -EVP_PKEY_verify -EVP_PKEY_verify_init -EVP_PKEY_verify_recover -EVP_PKEY_verify_recover_init -EVP_SignFinal -EVP_SignInit -EVP_SignInit_ex -EVP_SignUpdate -EVP_VerifyFinal -EVP_VerifyInit -EVP_VerifyInit_ex -EVP_VerifyUpdate -EVP_add_cipher_alias -EVP_add_digest -EVP_aead_aes_128_cbc_sha1_tls -EVP_aead_aes_128_cbc_sha1_tls_implicit_iv -EVP_aead_aes_128_cbc_sha256_tls -EVP_aead_aes_128_ccm_bluetooth -EVP_aead_aes_128_ccm_bluetooth_8 -EVP_aead_aes_128_ctr_hmac_sha256 -EVP_aead_aes_128_gcm -EVP_aead_aes_128_gcm_siv -EVP_aead_aes_128_gcm_tls12 -EVP_aead_aes_128_gcm_tls13 -EVP_aead_aes_192_gcm -EVP_aead_aes_256_cbc_sha1_tls -EVP_aead_aes_256_cbc_sha1_tls_implicit_iv -EVP_aead_aes_256_cbc_sha256_tls -EVP_aead_aes_256_cbc_sha384_tls -EVP_aead_aes_256_ctr_hmac_sha256 -EVP_aead_aes_256_gcm -EVP_aead_aes_256_gcm_siv -EVP_aead_aes_256_gcm_tls12 -EVP_aead_aes_256_gcm_tls13 -EVP_aead_chacha20_poly1305 -EVP_aead_des_ede3_cbc_sha1_tls -EVP_aead_des_ede3_cbc_sha1_tls_implicit_iv -EVP_aead_null_sha1_tls -EVP_aead_xchacha20_poly1305 -EVP_aes_128_cbc -EVP_aes_128_ctr -EVP_aes_128_ecb -EVP_aes_128_gcm -EVP_aes_128_ofb -EVP_aes_192_cbc -EVP_aes_192_ctr -EVP_aes_192_ecb -EVP_aes_192_gcm -EVP_aes_192_ofb -EVP_aes_256_cbc -EVP_aes_256_ctr -EVP_aes_256_ecb -EVP_aes_256_gcm -EVP_aes_256_ofb -EVP_cleanup -EVP_des_cbc -EVP_des_ecb -EVP_des_ede -EVP_des_ede3 -EVP_des_ede3_cbc -EVP_des_ede3_ecb -EVP_des_ede_cbc -EVP_enc_null -EVP_get_cipherbyname -EVP_get_cipherbynid -EVP_get_digestbyname -EVP_get_digestbynid -EVP_get_digestbyobj -EVP_has_aes_hardware -EVP_marshal_digest_algorithm -EVP_marshal_private_key -EVP_marshal_public_key -EVP_md4 -EVP_md5 -EVP_md5_sha1 -EVP_parse_digest_algorithm -EVP_parse_private_key -EVP_parse_public_key -EVP_rc2_40_cbc -EVP_rc2_cbc -EVP_rc4 -EVP_sha1 -EVP_sha224 -EVP_sha256 -EVP_sha384 -EVP_sha512 -EVP_tls_cbc_copy_mac -EVP_tls_cbc_digest_record -EVP_tls_cbc_record_digest_supported -EVP_tls_cbc_remove_padding -EXTENDED_KEY_USAGE_free -EXTENDED_KEY_USAGE_it -EXTENDED_KEY_USAGE_new -FIPS_mode -FIPS_mode_set -GENERAL_NAMES_free -GENERAL_NAMES_it -GENERAL_NAMES_new -GENERAL_NAME_cmp -GENERAL_NAME_dup -GENERAL_NAME_free -GENERAL_NAME_get0_otherName -GENERAL_NAME_get0_value -GENERAL_NAME_it -GENERAL_NAME_new -GENERAL_NAME_print -GENERAL_NAME_set0_othername -GENERAL_NAME_set0_value -GENERAL_SUBTREE_free -GENERAL_SUBTREE_it -GENERAL_SUBTREE_new -HKDF -HKDF_expand -HKDF_extract -HMAC -HMAC_CTX_cleanup -HMAC_CTX_copy -HMAC_CTX_copy_ex -HMAC_CTX_free -HMAC_CTX_init -HMAC_CTX_new -HMAC_CTX_reset -HMAC_Final -HMAC_Init -HMAC_Init_ex -HMAC_Update -HMAC_size -HRSS_decap -HRSS_encap -HRSS_generate_key -HRSS_marshal_public_key -HRSS_parse_public_key -HRSS_poly2_rotr_consttime -HRSS_poly3_invert -HRSS_poly3_mul -ISSUING_DIST_POINT_free -ISSUING_DIST_POINT_it -ISSUING_DIST_POINT_new -MD4 -MD4_Final -MD4_Init -MD4_Transform -MD4_Update -MD5 -MD5_Final -MD5_Init -MD5_Transform -MD5_Update -METHOD_ref -METHOD_unref -NAME_CONSTRAINTS_check -NAME_CONSTRAINTS_free -NAME_CONSTRAINTS_it -NAME_CONSTRAINTS_new -NCONF_free -NCONF_get_section -NCONF_get_string -NCONF_load -NCONF_load_bio -NCONF_new -NETSCAPE_SPKAC_free -NETSCAPE_SPKAC_it -NETSCAPE_SPKAC_new -NETSCAPE_SPKI_b64_decode -NETSCAPE_SPKI_b64_encode -NETSCAPE_SPKI_free -NETSCAPE_SPKI_get_pubkey -NETSCAPE_SPKI_it -NETSCAPE_SPKI_new -NETSCAPE_SPKI_set_pubkey -NETSCAPE_SPKI_sign -NETSCAPE_SPKI_verify -NOTICEREF_free -NOTICEREF_it -NOTICEREF_new -OBJ_cbs2nid -OBJ_cleanup -OBJ_cmp -OBJ_create -OBJ_dup -OBJ_find_sigid_algs -OBJ_find_sigid_by_algs -OBJ_get0_data -OBJ_length -OBJ_ln2nid -OBJ_nid2cbb -OBJ_nid2ln -OBJ_nid2obj -OBJ_nid2sn -OBJ_obj2nid -OBJ_obj2txt -OBJ_sn2nid -OBJ_txt2nid -OBJ_txt2obj -OPENSSL_add_all_algorithms_conf -OPENSSL_built_in_curves -OPENSSL_cleanse -OPENSSL_cleanup -OPENSSL_clear_free -OPENSSL_config -OPENSSL_cpuid_setup -OPENSSL_free -OPENSSL_gmtime -OPENSSL_gmtime_adj -OPENSSL_gmtime_diff -OPENSSL_hash32 -OPENSSL_ia32cap_P -OPENSSL_init_crypto -OPENSSL_init_ssl -OPENSSL_load_builtin_modules -OPENSSL_malloc -OPENSSL_malloc_init -OPENSSL_no_config -OPENSSL_realloc -OPENSSL_strcasecmp -OPENSSL_strdup -OPENSSL_strncasecmp -OPENSSL_strnlen -OPENSSL_tolower -OTHERNAME_cmp -OTHERNAME_free -OTHERNAME_it -OTHERNAME_new -OpenSSL_add_all_algorithms -OpenSSL_add_all_ciphers -OpenSSL_add_all_digests -OpenSSL_version -OpenSSL_version_num -PEM_ASN1_read -PEM_ASN1_read_bio -PEM_ASN1_write -PEM_ASN1_write_bio -PEM_X509_INFO_read -PEM_X509_INFO_read_bio -PEM_X509_INFO_write_bio -PEM_bytes_read_bio -PEM_def_callback -PEM_dek_info -PEM_do_header -PEM_get_EVP_CIPHER_INFO -PEM_proc_type -PEM_read -PEM_read_DHparams -PEM_read_DSAPrivateKey -PEM_read_DSA_PUBKEY -PEM_read_DSAparams -PEM_read_ECPrivateKey -PEM_read_EC_PUBKEY -PEM_read_PKCS7 -PEM_read_PKCS8 -PEM_read_PKCS8_PRIV_KEY_INFO -PEM_read_PUBKEY -PEM_read_PrivateKey -PEM_read_RSAPrivateKey -PEM_read_RSAPublicKey -PEM_read_RSA_PUBKEY -PEM_read_SSL_SESSION -PEM_read_X509 -PEM_read_X509_AUX -PEM_read_X509_CRL -PEM_read_X509_REQ -PEM_read_bio -PEM_read_bio_DHparams -PEM_read_bio_DSAPrivateKey -PEM_read_bio_DSA_PUBKEY -PEM_read_bio_DSAparams -PEM_read_bio_ECPrivateKey -PEM_read_bio_EC_PUBKEY -PEM_read_bio_PKCS7 -PEM_read_bio_PKCS8 -PEM_read_bio_PKCS8_PRIV_KEY_INFO -PEM_read_bio_PUBKEY -PEM_read_bio_PrivateKey -PEM_read_bio_RSAPrivateKey -PEM_read_bio_RSAPublicKey -PEM_read_bio_RSA_PUBKEY -PEM_read_bio_SSL_SESSION -PEM_read_bio_X509 -PEM_read_bio_X509_AUX -PEM_read_bio_X509_CRL -PEM_read_bio_X509_REQ -PEM_write -PEM_write_DHparams -PEM_write_DSAPrivateKey -PEM_write_DSA_PUBKEY -PEM_write_DSAparams -PEM_write_ECPrivateKey -PEM_write_EC_PUBKEY -PEM_write_PKCS7 -PEM_write_PKCS8 -PEM_write_PKCS8PrivateKey -PEM_write_PKCS8PrivateKey_nid -PEM_write_PKCS8_PRIV_KEY_INFO -PEM_write_PUBKEY -PEM_write_PrivateKey -PEM_write_RSAPrivateKey -PEM_write_RSAPublicKey -PEM_write_RSA_PUBKEY -PEM_write_SSL_SESSION -PEM_write_X509 -PEM_write_X509_AUX -PEM_write_X509_CRL -PEM_write_X509_REQ -PEM_write_X509_REQ_NEW -PEM_write_bio -PEM_write_bio_DHparams -PEM_write_bio_DSAPrivateKey -PEM_write_bio_DSA_PUBKEY -PEM_write_bio_DSAparams -PEM_write_bio_ECPrivateKey -PEM_write_bio_EC_PUBKEY -PEM_write_bio_PKCS7 -PEM_write_bio_PKCS8 -PEM_write_bio_PKCS8PrivateKey -PEM_write_bio_PKCS8PrivateKey_nid -PEM_write_bio_PKCS8_PRIV_KEY_INFO -PEM_write_bio_PUBKEY -PEM_write_bio_PrivateKey -PEM_write_bio_RSAPrivateKey -PEM_write_bio_RSAPublicKey -PEM_write_bio_RSA_PUBKEY -PEM_write_bio_SSL_SESSION -PEM_write_bio_X509 -PEM_write_bio_X509_AUX -PEM_write_bio_X509_CRL -PEM_write_bio_X509_REQ -PEM_write_bio_X509_REQ_NEW -PKCS12_PBE_add -PKCS12_create -PKCS12_free -PKCS12_get_key_and_certs -PKCS12_parse -PKCS12_verify_mac -PKCS5_PBKDF2_HMAC -PKCS5_PBKDF2_HMAC_SHA1 -PKCS5_pbe2_decrypt_init -PKCS5_pbe2_encrypt_init -PKCS7_bundle_CRLs -PKCS7_bundle_certificates -PKCS7_free -PKCS7_get_CRLs -PKCS7_get_PEM_CRLs -PKCS7_get_PEM_certificates -PKCS7_get_certificates -PKCS7_get_raw_certificates -PKCS7_sign -PKCS7_type_is_data -PKCS7_type_is_digest -PKCS7_type_is_encrypted -PKCS7_type_is_enveloped -PKCS7_type_is_signed -PKCS7_type_is_signedAndEnveloped -PKCS8_PRIV_KEY_INFO_free -PKCS8_PRIV_KEY_INFO_it -PKCS8_PRIV_KEY_INFO_new -PKCS8_decrypt -PKCS8_encrypt -PKCS8_marshal_encrypted_private_key -PKCS8_parse_encrypted_private_key -PKCS8_pkey_get0 -PKCS8_pkey_set0 -PKEY_USAGE_PERIOD_free -PKEY_USAGE_PERIOD_it -PKEY_USAGE_PERIOD_new -POLICYINFO_free -POLICYINFO_it -POLICYINFO_new -POLICYQUALINFO_free -POLICYQUALINFO_it -POLICYQUALINFO_new -POLICY_CONSTRAINTS_free -POLICY_CONSTRAINTS_it -POLICY_CONSTRAINTS_new -POLICY_MAPPINGS_it -POLICY_MAPPING_free -POLICY_MAPPING_it -POLICY_MAPPING_new -PROXY_CERT_INFO_EXTENSION_free -PROXY_CERT_INFO_EXTENSION_it -PROXY_CERT_INFO_EXTENSION_new -PROXY_POLICY_free -PROXY_POLICY_it -PROXY_POLICY_new -RAND_SSLeay -RAND_add -RAND_bytes -RAND_bytes_with_additional_data -RAND_cleanup -RAND_egd -RAND_enable_fork_unsafe_buffering -RAND_file_name -RAND_get_rand_method -RAND_load_file -RAND_poll -RAND_pseudo_bytes -RAND_seed -RAND_set_rand_method -RAND_set_urandom_fd -RAND_status -RC4 -RC4_set_key -RSAPrivateKey_dup -RSAPublicKey_dup -RSAZ_1024_mod_exp_avx2 -RSA_PSS_PARAMS_free -RSA_PSS_PARAMS_it -RSA_PSS_PARAMS_new -RSA_add_pkcs1_prefix -RSA_bits -RSA_blinding_on -RSA_check_fips -RSA_check_key -RSA_decrypt -RSA_default_method -RSA_encrypt -RSA_flags -RSA_free -RSA_generate_key_ex -RSA_generate_key_fips -RSA_get0_crt_params -RSA_get0_factors -RSA_get0_key -RSA_get_ex_data -RSA_get_ex_new_index -RSA_is_opaque -RSA_marshal_private_key -RSA_marshal_public_key -RSA_new -RSA_new_method -RSA_padding_add_PKCS1_OAEP_mgf1 -RSA_padding_add_PKCS1_PSS_mgf1 -RSA_padding_add_PKCS1_type_1 -RSA_padding_add_PKCS1_type_2 -RSA_padding_add_none -RSA_padding_check_PKCS1_OAEP_mgf1 -RSA_padding_check_PKCS1_type_1 -RSA_padding_check_PKCS1_type_2 -RSA_parse_private_key -RSA_parse_public_key -RSA_print -RSA_private_decrypt -RSA_private_encrypt -RSA_private_key_from_bytes -RSA_private_key_to_bytes -RSA_private_transform -RSA_public_decrypt -RSA_public_encrypt -RSA_public_key_from_bytes -RSA_public_key_to_bytes -RSA_set0_crt_params -RSA_set0_factors -RSA_set0_key -RSA_set_ex_data -RSA_sign -RSA_sign_pss_mgf1 -RSA_sign_raw -RSA_size -RSA_up_ref -RSA_verify -RSA_verify_PKCS1_PSS_mgf1 -RSA_verify_pss_mgf1 -RSA_verify_raw -SHA1 -SHA1_Final -SHA1_Init -SHA1_Transform -SHA1_Update -SHA224 -SHA224_Final -SHA224_Init -SHA224_Update -SHA256 -SHA256_Final -SHA256_Init -SHA256_Transform -SHA256_TransformBlocks -SHA256_Update -SHA384 -SHA384_Final -SHA384_Init -SHA384_Update -SHA512 -SHA512_Final -SHA512_Init -SHA512_Transform -SHA512_Update -SIPHASH_24 -SPAKE2_CTX_free -SPAKE2_CTX_new -SPAKE2_generate_msg -SPAKE2_process_msg -SSL_CIPHER_description -SSL_CIPHER_get_auth_nid -SSL_CIPHER_get_bits -SSL_CIPHER_get_cipher_nid -SSL_CIPHER_get_digest_nid -SSL_CIPHER_get_id -SSL_CIPHER_get_kx_name -SSL_CIPHER_get_kx_nid -SSL_CIPHER_get_max_version -SSL_CIPHER_get_min_version -SSL_CIPHER_get_name -SSL_CIPHER_get_prf_nid -SSL_CIPHER_get_rfc_name -SSL_CIPHER_get_value -SSL_CIPHER_get_version -SSL_CIPHER_is_aead -SSL_CIPHER_is_block_cipher -SSL_CIPHER_standard_name -SSL_COMP_add_compression_method -SSL_COMP_free_compression_methods -SSL_COMP_get0_name -SSL_COMP_get_compression_methods -SSL_COMP_get_id -SSL_COMP_get_name -SSL_CTX_add0_chain_cert -SSL_CTX_add1_chain_cert -SSL_CTX_add_cert_compression_alg -SSL_CTX_add_client_CA -SSL_CTX_add_extra_chain_cert -SSL_CTX_add_session -SSL_CTX_check_private_key -SSL_CTX_cipher_in_group -SSL_CTX_clear_chain_certs -SSL_CTX_clear_extra_chain_certs -SSL_CTX_clear_mode -SSL_CTX_clear_options -SSL_CTX_enable_ocsp_stapling -SSL_CTX_enable_pq_experiment_signal -SSL_CTX_enable_signed_cert_timestamps -SSL_CTX_enable_tls_channel_id -SSL_CTX_flush_sessions -SSL_CTX_free -SSL_CTX_get0_certificate -SSL_CTX_get0_chain_certs -SSL_CTX_get0_param -SSL_CTX_get0_privatekey -SSL_CTX_get_cert_store -SSL_CTX_get_channel_id_cb -SSL_CTX_get_ciphers -SSL_CTX_get_client_CA_list -SSL_CTX_get_default_passwd_cb -SSL_CTX_get_default_passwd_cb_userdata -SSL_CTX_get_ex_data -SSL_CTX_get_ex_new_index -SSL_CTX_get_extra_chain_certs -SSL_CTX_get_info_callback -SSL_CTX_get_keylog_callback -SSL_CTX_get_max_cert_list -SSL_CTX_get_max_proto_version -SSL_CTX_get_min_proto_version -SSL_CTX_get_mode -SSL_CTX_get_options -SSL_CTX_get_quiet_shutdown -SSL_CTX_get_read_ahead -SSL_CTX_get_session_cache_mode -SSL_CTX_get_timeout -SSL_CTX_get_tlsext_ticket_keys -SSL_CTX_get_verify_callback -SSL_CTX_get_verify_depth -SSL_CTX_get_verify_mode -SSL_CTX_load_verify_locations -SSL_CTX_need_tmp_RSA -SSL_CTX_new -SSL_CTX_remove_session -SSL_CTX_sess_accept -SSL_CTX_sess_accept_good -SSL_CTX_sess_accept_renegotiate -SSL_CTX_sess_cache_full -SSL_CTX_sess_cb_hits -SSL_CTX_sess_connect -SSL_CTX_sess_connect_good -SSL_CTX_sess_connect_renegotiate -SSL_CTX_sess_get_cache_size -SSL_CTX_sess_get_get_cb -SSL_CTX_sess_get_new_cb -SSL_CTX_sess_get_remove_cb -SSL_CTX_sess_hits -SSL_CTX_sess_misses -SSL_CTX_sess_number -SSL_CTX_sess_set_cache_size -SSL_CTX_sess_set_get_cb -SSL_CTX_sess_set_new_cb -SSL_CTX_sess_set_remove_cb -SSL_CTX_sess_timeouts -SSL_CTX_set0_buffer_pool -SSL_CTX_set0_chain -SSL_CTX_set0_client_CAs -SSL_CTX_set0_verify_cert_store -SSL_CTX_set1_chain -SSL_CTX_set1_curves -SSL_CTX_set1_curves_list -SSL_CTX_set1_param -SSL_CTX_set1_sigalgs -SSL_CTX_set1_sigalgs_list -SSL_CTX_set1_tls_channel_id -SSL_CTX_set1_verify_cert_store -SSL_CTX_set_allow_unknown_alpn_protos -SSL_CTX_set_alpn_protos -SSL_CTX_set_alpn_select_cb -SSL_CTX_set_cert_cb -SSL_CTX_set_cert_store -SSL_CTX_set_cert_verify_callback -SSL_CTX_set_chain_and_key -SSL_CTX_set_channel_id_cb -SSL_CTX_set_cipher_list -SSL_CTX_set_client_CA_list -SSL_CTX_set_client_cert_cb -SSL_CTX_set_current_time_cb -SSL_CTX_set_custom_verify -SSL_CTX_set_default_passwd_cb -SSL_CTX_set_default_passwd_cb_userdata -SSL_CTX_set_default_verify_paths -SSL_CTX_set_dos_protection_cb -SSL_CTX_set_early_data_enabled -SSL_CTX_set_ed25519_enabled -SSL_CTX_set_ex_data -SSL_CTX_set_false_start_allowed_without_alpn -SSL_CTX_set_grease_enabled -SSL_CTX_set_ignore_tls13_downgrade -SSL_CTX_set_info_callback -SSL_CTX_set_keylog_callback -SSL_CTX_set_max_cert_list -SSL_CTX_set_max_proto_version -SSL_CTX_set_max_send_fragment -SSL_CTX_set_min_proto_version -SSL_CTX_set_mode -SSL_CTX_set_msg_callback -SSL_CTX_set_msg_callback_arg -SSL_CTX_set_next_proto_select_cb -SSL_CTX_set_next_protos_advertised_cb -SSL_CTX_set_ocsp_response -SSL_CTX_set_options -SSL_CTX_set_private_key_method -SSL_CTX_set_psk_client_callback -SSL_CTX_set_psk_server_callback -SSL_CTX_set_purpose -SSL_CTX_set_quic_method -SSL_CTX_set_quiet_shutdown -SSL_CTX_set_read_ahead -SSL_CTX_set_retain_only_sha256_of_client_certs -SSL_CTX_set_reverify_on_resume -SSL_CTX_set_rsa_pss_rsae_certs_enabled -SSL_CTX_set_select_certificate_cb -SSL_CTX_set_session_cache_mode -SSL_CTX_set_session_id_context -SSL_CTX_set_session_psk_dhe_timeout -SSL_CTX_set_signed_cert_timestamp_list -SSL_CTX_set_signing_algorithm_prefs -SSL_CTX_set_srtp_profiles -SSL_CTX_set_strict_cipher_list -SSL_CTX_set_ticket_aead_method -SSL_CTX_set_timeout -SSL_CTX_set_tls_channel_id_enabled -SSL_CTX_set_tlsext_servername_arg -SSL_CTX_set_tlsext_servername_callback -SSL_CTX_set_tlsext_status_arg -SSL_CTX_set_tlsext_status_cb -SSL_CTX_set_tlsext_ticket_key_cb -SSL_CTX_set_tlsext_ticket_keys -SSL_CTX_set_tlsext_use_srtp -SSL_CTX_set_tmp_dh -SSL_CTX_set_tmp_dh_callback -SSL_CTX_set_tmp_ecdh -SSL_CTX_set_tmp_rsa -SSL_CTX_set_tmp_rsa_callback -SSL_CTX_set_trust -SSL_CTX_set_verify -SSL_CTX_set_verify_algorithm_prefs -SSL_CTX_set_verify_depth -SSL_CTX_up_ref -SSL_CTX_use_PrivateKey -SSL_CTX_use_PrivateKey_ASN1 -SSL_CTX_use_PrivateKey_file -SSL_CTX_use_RSAPrivateKey -SSL_CTX_use_RSAPrivateKey_ASN1 -SSL_CTX_use_RSAPrivateKey_file -SSL_CTX_use_certificate -SSL_CTX_use_certificate_ASN1 -SSL_CTX_use_certificate_chain_file -SSL_CTX_use_certificate_file -SSL_CTX_use_psk_identity_hint -SSL_SESSION_early_data_capable -SSL_SESSION_free -SSL_SESSION_from_bytes -SSL_SESSION_get0_cipher -SSL_SESSION_get0_id_context -SSL_SESSION_get0_ocsp_response -SSL_SESSION_get0_peer -SSL_SESSION_get0_peer_certificates -SSL_SESSION_get0_peer_sha256 -SSL_SESSION_get0_signed_cert_timestamp_list -SSL_SESSION_get0_ticket -SSL_SESSION_get_ex_data -SSL_SESSION_get_ex_new_index -SSL_SESSION_get_id -SSL_SESSION_get_master_key -SSL_SESSION_get_protocol_version -SSL_SESSION_get_ticket_lifetime_hint -SSL_SESSION_get_time -SSL_SESSION_get_timeout -SSL_SESSION_get_version -SSL_SESSION_has_peer_sha256 -SSL_SESSION_has_ticket -SSL_SESSION_is_resumable -SSL_SESSION_new -SSL_SESSION_set1_id -SSL_SESSION_set1_id_context -SSL_SESSION_set_ex_data -SSL_SESSION_set_protocol_version -SSL_SESSION_set_ticket -SSL_SESSION_set_time -SSL_SESSION_set_timeout -SSL_SESSION_should_be_single_use -SSL_SESSION_to_bytes -SSL_SESSION_to_bytes_for_ticket -SSL_SESSION_up_ref -SSL_accept -SSL_add0_chain_cert -SSL_add1_chain_cert -SSL_add_client_CA -SSL_add_file_cert_subjects_to_stack -SSL_alert_desc_string -SSL_alert_desc_string_long -SSL_alert_from_verify_result -SSL_alert_type_string -SSL_alert_type_string_long -SSL_cache_hit -SSL_certs_clear -SSL_check_private_key -SSL_clear -SSL_clear_chain_certs -SSL_clear_mode -SSL_clear_options -SSL_connect -SSL_cutthrough_complete -SSL_delegated_credential_used -SSL_do_handshake -SSL_dup_CA_list -SSL_early_callback_ctx_extension_get -SSL_early_data_accepted -SSL_enable_ocsp_stapling -SSL_enable_signed_cert_timestamps -SSL_enable_tls_channel_id -SSL_error_description -SSL_export_keying_material -SSL_free -SSL_generate_key_block -SSL_get0_alpn_selected -SSL_get0_certificate_types -SSL_get0_chain_certs -SSL_get0_next_proto_negotiated -SSL_get0_ocsp_response -SSL_get0_param -SSL_get0_peer_certificates -SSL_get0_peer_verify_algorithms -SSL_get0_server_requested_CAs -SSL_get0_session_id_context -SSL_get0_signed_cert_timestamp_list -SSL_get1_session -SSL_get_SSL_CTX -SSL_get_certificate -SSL_get_cipher_by_value -SSL_get_cipher_list -SSL_get_ciphers -SSL_get_client_CA_list -SSL_get_client_random -SSL_get_current_cipher -SSL_get_current_compression -SSL_get_current_expansion -SSL_get_curve_id -SSL_get_curve_name -SSL_get_default_timeout -SSL_get_early_data_reason -SSL_get_error -SSL_get_ex_data -SSL_get_ex_data_X509_STORE_CTX_idx -SSL_get_ex_new_index -SSL_get_extms_support -SSL_get_fd -SSL_get_finished -SSL_get_info_callback -SSL_get_ivs -SSL_get_key_block_len -SSL_get_max_cert_list -SSL_get_max_proto_version -SSL_get_min_proto_version -SSL_get_mode -SSL_get_negotiated_token_binding_param -SSL_get_options -SSL_get_peer_cert_chain -SSL_get_peer_certificate -SSL_get_peer_finished -SSL_get_peer_full_cert_chain -SSL_get_peer_quic_transport_params -SSL_get_peer_signature_algorithm -SSL_get_pending_cipher -SSL_get_privatekey -SSL_get_psk_identity -SSL_get_psk_identity_hint -SSL_get_quiet_shutdown -SSL_get_rbio -SSL_get_read_ahead -SSL_get_read_sequence -SSL_get_rfd -SSL_get_secure_renegotiation_support -SSL_get_selected_srtp_profile -SSL_get_server_random -SSL_get_server_tmp_key -SSL_get_servername -SSL_get_servername_type -SSL_get_session -SSL_get_shared_ciphers -SSL_get_shutdown -SSL_get_signature_algorithm_digest -SSL_get_signature_algorithm_key_type -SSL_get_signature_algorithm_name -SSL_get_srtp_profiles -SSL_get_ticket_age_skew -SSL_get_tls_channel_id -SSL_get_tls_unique -SSL_get_tlsext_status_ocsp_resp -SSL_get_tlsext_status_type -SSL_get_verify_callback -SSL_get_verify_depth -SSL_get_verify_mode -SSL_get_verify_result -SSL_get_version -SSL_get_wbio -SSL_get_wfd -SSL_get_write_sequence -SSL_in_early_data -SSL_in_false_start -SSL_in_init -SSL_is_dtls -SSL_is_init_finished -SSL_is_server -SSL_is_signature_algorithm_rsa_pss -SSL_is_tls13_downgrade -SSL_is_token_binding_negotiated -SSL_key_update -SSL_library_init -SSL_load_client_CA_file -SSL_load_error_strings -SSL_magic_pending_session_ptr -SSL_max_seal_overhead -SSL_need_tmp_RSA -SSL_new -SSL_num_renegotiations -SSL_peek -SSL_pending -SSL_pq_experiment_signal_seen -SSL_process_quic_post_handshake -SSL_provide_quic_data -SSL_quic_max_handshake_flight_len -SSL_quic_read_level -SSL_quic_write_level -SSL_read -SSL_renegotiate -SSL_renegotiate_pending -SSL_reset_early_data_reject -SSL_select_next_proto -SSL_send_fatal_alert -SSL_session_reused -SSL_set0_chain -SSL_set0_client_CAs -SSL_set0_rbio -SSL_set0_verify_cert_store -SSL_set0_wbio -SSL_set1_chain -SSL_set1_curves -SSL_set1_curves_list -SSL_set1_delegated_credential -SSL_set1_param -SSL_set1_sigalgs -SSL_set1_sigalgs_list -SSL_set1_tls_channel_id -SSL_set1_verify_cert_store -SSL_set_SSL_CTX -SSL_set_accept_state -SSL_set_alpn_protos -SSL_set_bio -SSL_set_cert_cb -SSL_set_chain_and_key -SSL_set_cipher_list -SSL_set_client_CA_list -SSL_set_connect_state -SSL_set_custom_verify -SSL_set_early_data_enabled -SSL_set_enforce_rsa_key_usage -SSL_set_ex_data -SSL_set_fd -SSL_set_ignore_tls13_downgrade -SSL_set_info_callback -SSL_set_jdk11_workaround -SSL_set_max_cert_list -SSL_set_max_proto_version -SSL_set_max_send_fragment -SSL_set_min_proto_version -SSL_set_mode -SSL_set_msg_callback -SSL_set_msg_callback_arg -SSL_set_mtu -SSL_set_ocsp_response -SSL_set_options -SSL_set_private_key_method -SSL_set_psk_client_callback -SSL_set_psk_server_callback -SSL_set_purpose -SSL_set_quic_method -SSL_set_quic_transport_params -SSL_set_quiet_shutdown -SSL_set_read_ahead -SSL_set_renegotiate_mode -SSL_set_retain_only_sha256_of_client_certs -SSL_set_rfd -SSL_set_session -SSL_set_session_id_context -SSL_set_shed_handshake_config -SSL_set_shutdown -SSL_set_signed_cert_timestamp_list -SSL_set_signing_algorithm_prefs -SSL_set_srtp_profiles -SSL_set_state -SSL_set_strict_cipher_list -SSL_set_tls_channel_id_enabled -SSL_set_tlsext_host_name -SSL_set_tlsext_status_ocsp_resp -SSL_set_tlsext_status_type -SSL_set_tlsext_use_srtp -SSL_set_tmp_dh -SSL_set_tmp_dh_callback -SSL_set_tmp_ecdh -SSL_set_tmp_rsa -SSL_set_tmp_rsa_callback -SSL_set_token_binding_params -SSL_set_trust -SSL_set_verify -SSL_set_verify_depth -SSL_set_verify_result -SSL_set_wfd -SSL_shutdown -SSL_state -SSL_state_string -SSL_state_string_long -SSL_total_renegotiations -SSL_use_PrivateKey -SSL_use_PrivateKey_ASN1 -SSL_use_PrivateKey_file -SSL_use_RSAPrivateKey -SSL_use_RSAPrivateKey_ASN1 -SSL_use_RSAPrivateKey_file -SSL_use_certificate -SSL_use_certificate_ASN1 -SSL_use_certificate_file -SSL_use_psk_identity_hint -SSL_version -SSL_want -SSL_write -SSLeay -SSLeay_version -SSLv23_client_method -SSLv23_method -SSLv23_server_method -SXNETID_free -SXNETID_it -SXNETID_new -SXNET_add_id_INTEGER -SXNET_add_id_asc -SXNET_add_id_ulong -SXNET_free -SXNET_get_id_INTEGER -SXNET_get_id_asc -SXNET_get_id_ulong -SXNET_it -SXNET_new -TLS_client_method -TLS_method -TLS_server_method -TLS_with_buffers_method -TLSv1_1_client_method -TLSv1_1_method -TLSv1_1_server_method -TLSv1_2_client_method -TLSv1_2_method -TLSv1_2_server_method -TLSv1_client_method -TLSv1_method -TLSv1_server_method -USERNOTICE_free -USERNOTICE_it -USERNOTICE_new -UTF8_getc -UTF8_putc -X25519 -X25519_keypair -X25519_public_from_private -X509V3_EXT_CRL_add_nconf -X509V3_EXT_REQ_add_nconf -X509V3_EXT_add -X509V3_EXT_add_alias -X509V3_EXT_add_list -X509V3_EXT_add_nconf -X509V3_EXT_add_nconf_sk -X509V3_EXT_cleanup -X509V3_EXT_d2i -X509V3_EXT_free -X509V3_EXT_get -X509V3_EXT_get_nid -X509V3_EXT_i2d -X509V3_EXT_nconf -X509V3_EXT_nconf_nid -X509V3_EXT_print -X509V3_EXT_print_fp -X509V3_EXT_val_prn -X509V3_NAME_from_section -X509V3_add1_i2d -X509V3_add_standard_extensions -X509V3_add_value -X509V3_add_value_bool -X509V3_add_value_bool_nf -X509V3_add_value_int -X509V3_add_value_uchar -X509V3_conf_free -X509V3_extensions_print -X509V3_get_d2i -X509V3_get_section -X509V3_get_string -X509V3_get_value_bool -X509V3_get_value_int -X509V3_parse_list -X509V3_section_free -X509V3_set_ctx -X509V3_set_nconf -X509V3_string_free -X509_ALGORS_it -X509_ALGOR_cmp -X509_ALGOR_dup -X509_ALGOR_free -X509_ALGOR_get0 -X509_ALGOR_it -X509_ALGOR_new -X509_ALGOR_set0 -X509_ALGOR_set_md -X509_ATTRIBUTE_SET_it -X509_ATTRIBUTE_count -X509_ATTRIBUTE_create -X509_ATTRIBUTE_create_by_NID -X509_ATTRIBUTE_create_by_OBJ -X509_ATTRIBUTE_create_by_txt -X509_ATTRIBUTE_dup -X509_ATTRIBUTE_free -X509_ATTRIBUTE_get0_data -X509_ATTRIBUTE_get0_object -X509_ATTRIBUTE_get0_type -X509_ATTRIBUTE_it -X509_ATTRIBUTE_new -X509_ATTRIBUTE_set1_data -X509_ATTRIBUTE_set1_object -X509_CERT_AUX_free -X509_CERT_AUX_it -X509_CERT_AUX_new -X509_CERT_AUX_print -X509_CINF_free -X509_CINF_it -X509_CINF_new -X509_CRL_INFO_free -X509_CRL_INFO_it -X509_CRL_INFO_new -X509_CRL_METHOD_free -X509_CRL_METHOD_new -X509_CRL_add0_revoked -X509_CRL_add1_ext_i2d -X509_CRL_add_ext -X509_CRL_check_suiteb -X509_CRL_cmp -X509_CRL_delete_ext -X509_CRL_diff -X509_CRL_digest -X509_CRL_dup -X509_CRL_free -X509_CRL_get0_by_cert -X509_CRL_get0_by_serial -X509_CRL_get0_lastUpdate -X509_CRL_get0_nextUpdate -X509_CRL_get0_signature -X509_CRL_get_ext -X509_CRL_get_ext_by_NID -X509_CRL_get_ext_by_OBJ -X509_CRL_get_ext_by_critical -X509_CRL_get_ext_count -X509_CRL_get_ext_d2i -X509_CRL_get_meth_data -X509_CRL_get_signature_nid -X509_CRL_it -X509_CRL_match -X509_CRL_new -X509_CRL_print -X509_CRL_print_fp -X509_CRL_set_default_method -X509_CRL_set_issuer_name -X509_CRL_set_lastUpdate -X509_CRL_set_meth_data -X509_CRL_set_nextUpdate -X509_CRL_set_version -X509_CRL_sign -X509_CRL_sign_ctx -X509_CRL_sort -X509_CRL_up_ref -X509_CRL_verify -X509_EXTENSIONS_it -X509_EXTENSION_create_by_NID -X509_EXTENSION_create_by_OBJ -X509_EXTENSION_dup -X509_EXTENSION_free -X509_EXTENSION_get_critical -X509_EXTENSION_get_data -X509_EXTENSION_get_object -X509_EXTENSION_it -X509_EXTENSION_new -X509_EXTENSION_set_critical -X509_EXTENSION_set_data -X509_EXTENSION_set_object -X509_INFO_free -X509_INFO_new -X509_LOOKUP_by_alias -X509_LOOKUP_by_fingerprint -X509_LOOKUP_by_issuer_serial -X509_LOOKUP_by_subject -X509_LOOKUP_ctrl -X509_LOOKUP_file -X509_LOOKUP_free -X509_LOOKUP_hash_dir -X509_LOOKUP_init -X509_LOOKUP_new -X509_LOOKUP_shutdown -X509_NAME_ENTRIES_it -X509_NAME_ENTRY_create_by_NID -X509_NAME_ENTRY_create_by_OBJ -X509_NAME_ENTRY_create_by_txt -X509_NAME_ENTRY_dup -X509_NAME_ENTRY_free -X509_NAME_ENTRY_get_data -X509_NAME_ENTRY_get_object -X509_NAME_ENTRY_it -X509_NAME_ENTRY_new -X509_NAME_ENTRY_set -X509_NAME_ENTRY_set_data -X509_NAME_ENTRY_set_object -X509_NAME_INTERNAL_it -X509_NAME_add_entry -X509_NAME_add_entry_by_NID -X509_NAME_add_entry_by_OBJ -X509_NAME_add_entry_by_txt -X509_NAME_cmp -X509_NAME_delete_entry -X509_NAME_digest -X509_NAME_dup -X509_NAME_entry_count -X509_NAME_free -X509_NAME_get0_der -X509_NAME_get_entry -X509_NAME_get_index_by_NID -X509_NAME_get_index_by_OBJ -X509_NAME_get_text_by_NID -X509_NAME_get_text_by_OBJ -X509_NAME_hash -X509_NAME_hash_old -X509_NAME_it -X509_NAME_new -X509_NAME_oneline -X509_NAME_print -X509_NAME_print_ex -X509_NAME_print_ex_fp -X509_NAME_set -X509_OBJECT_free_contents -X509_OBJECT_get0_X509 -X509_OBJECT_get_type -X509_OBJECT_idx_by_subject -X509_OBJECT_retrieve_by_subject -X509_OBJECT_retrieve_match -X509_OBJECT_up_ref_count -X509_PKEY_free -X509_PKEY_new -X509_POLICY_NODE_print -X509_PUBKEY_free -X509_PUBKEY_get -X509_PUBKEY_get0_param -X509_PUBKEY_it -X509_PUBKEY_new -X509_PUBKEY_set -X509_PUBKEY_set0_param -X509_PURPOSE_add -X509_PURPOSE_cleanup -X509_PURPOSE_get0 -X509_PURPOSE_get0_name -X509_PURPOSE_get0_sname -X509_PURPOSE_get_by_id -X509_PURPOSE_get_by_sname -X509_PURPOSE_get_count -X509_PURPOSE_get_id -X509_PURPOSE_get_trust -X509_PURPOSE_set -X509_REQ_INFO_free -X509_REQ_INFO_it -X509_REQ_INFO_new -X509_REQ_add1_attr -X509_REQ_add1_attr_by_NID -X509_REQ_add1_attr_by_OBJ -X509_REQ_add1_attr_by_txt -X509_REQ_add_extensions -X509_REQ_add_extensions_nid -X509_REQ_check_private_key -X509_REQ_delete_attr -X509_REQ_digest -X509_REQ_dup -X509_REQ_extension_nid -X509_REQ_free -X509_REQ_get0_signature -X509_REQ_get1_email -X509_REQ_get_attr -X509_REQ_get_attr_by_NID -X509_REQ_get_attr_by_OBJ -X509_REQ_get_attr_count -X509_REQ_get_extension_nids -X509_REQ_get_extensions -X509_REQ_get_pubkey -X509_REQ_get_signature_nid -X509_REQ_it -X509_REQ_new -X509_REQ_print -X509_REQ_print_ex -X509_REQ_print_fp -X509_REQ_set_extension_nids -X509_REQ_set_pubkey -X509_REQ_set_subject_name -X509_REQ_set_version -X509_REQ_sign -X509_REQ_sign_ctx -X509_REQ_to_X509 -X509_REQ_verify -X509_REVOKED_add1_ext_i2d -X509_REVOKED_add_ext -X509_REVOKED_delete_ext -X509_REVOKED_dup -X509_REVOKED_free -X509_REVOKED_get0_revocationDate -X509_REVOKED_get0_serialNumber -X509_REVOKED_get_ext -X509_REVOKED_get_ext_by_NID -X509_REVOKED_get_ext_by_OBJ -X509_REVOKED_get_ext_by_critical -X509_REVOKED_get_ext_count -X509_REVOKED_get_ext_d2i -X509_REVOKED_it -X509_REVOKED_new -X509_REVOKED_set_revocationDate -X509_REVOKED_set_serialNumber -X509_SIG_free -X509_SIG_it -X509_SIG_new -X509_STORE_CTX_cleanup -X509_STORE_CTX_free -X509_STORE_CTX_get0_cert -X509_STORE_CTX_get0_current_crl -X509_STORE_CTX_get0_current_issuer -X509_STORE_CTX_get0_param -X509_STORE_CTX_get0_parent_ctx -X509_STORE_CTX_get0_policy_tree -X509_STORE_CTX_get0_store -X509_STORE_CTX_get0_untrusted -X509_STORE_CTX_get1_chain -X509_STORE_CTX_get1_issuer -X509_STORE_CTX_get_chain -X509_STORE_CTX_get_current_cert -X509_STORE_CTX_get_error -X509_STORE_CTX_get_error_depth -X509_STORE_CTX_get_ex_data -X509_STORE_CTX_get_ex_new_index -X509_STORE_CTX_get_explicit_policy -X509_STORE_CTX_init -X509_STORE_CTX_new -X509_STORE_CTX_purpose_inherit -X509_STORE_CTX_set0_crls -X509_STORE_CTX_set0_param -X509_STORE_CTX_set_cert -X509_STORE_CTX_set_chain -X509_STORE_CTX_set_default -X509_STORE_CTX_set_depth -X509_STORE_CTX_set_error -X509_STORE_CTX_set_ex_data -X509_STORE_CTX_set_flags -X509_STORE_CTX_set_purpose -X509_STORE_CTX_set_time -X509_STORE_CTX_set_trust -X509_STORE_CTX_set_verify_cb -X509_STORE_CTX_trusted_stack -X509_STORE_CTX_zero -X509_STORE_add_cert -X509_STORE_add_crl -X509_STORE_add_lookup -X509_STORE_free -X509_STORE_get0_objects -X509_STORE_get0_param -X509_STORE_get1_certs -X509_STORE_get1_crls -X509_STORE_get_by_subject -X509_STORE_get_cert_crl -X509_STORE_get_check_crl -X509_STORE_get_check_issued -X509_STORE_get_check_revocation -X509_STORE_get_cleanup -X509_STORE_get_get_crl -X509_STORE_get_get_issuer -X509_STORE_get_lookup_certs -X509_STORE_get_lookup_crls -X509_STORE_get_verify -X509_STORE_get_verify_cb -X509_STORE_load_locations -X509_STORE_new -X509_STORE_set0_additional_untrusted -X509_STORE_set1_param -X509_STORE_set_cert_crl -X509_STORE_set_check_crl -X509_STORE_set_check_issued -X509_STORE_set_check_revocation -X509_STORE_set_cleanup -X509_STORE_set_default_paths -X509_STORE_set_depth -X509_STORE_set_flags -X509_STORE_set_get_crl -X509_STORE_set_get_issuer -X509_STORE_set_lookup_certs -X509_STORE_set_lookup_crls -X509_STORE_set_purpose -X509_STORE_set_trust -X509_STORE_set_verify -X509_STORE_set_verify_cb -X509_STORE_up_ref -X509_TRUST_add -X509_TRUST_cleanup -X509_TRUST_get0 -X509_TRUST_get0_name -X509_TRUST_get_by_id -X509_TRUST_get_count -X509_TRUST_get_flags -X509_TRUST_get_trust -X509_TRUST_set -X509_TRUST_set_default -X509_VAL_free -X509_VAL_it -X509_VAL_new -X509_VERIFY_PARAM_add0_policy -X509_VERIFY_PARAM_add0_table -X509_VERIFY_PARAM_add1_host -X509_VERIFY_PARAM_clear_flags -X509_VERIFY_PARAM_free -X509_VERIFY_PARAM_get0 -X509_VERIFY_PARAM_get0_name -X509_VERIFY_PARAM_get0_peername -X509_VERIFY_PARAM_get_count -X509_VERIFY_PARAM_get_depth -X509_VERIFY_PARAM_get_flags -X509_VERIFY_PARAM_inherit -X509_VERIFY_PARAM_lookup -X509_VERIFY_PARAM_new -X509_VERIFY_PARAM_set1 -X509_VERIFY_PARAM_set1_email -X509_VERIFY_PARAM_set1_host -X509_VERIFY_PARAM_set1_ip -X509_VERIFY_PARAM_set1_ip_asc -X509_VERIFY_PARAM_set1_name -X509_VERIFY_PARAM_set1_policies -X509_VERIFY_PARAM_set_depth -X509_VERIFY_PARAM_set_flags -X509_VERIFY_PARAM_set_hostflags -X509_VERIFY_PARAM_set_purpose -X509_VERIFY_PARAM_set_time -X509_VERIFY_PARAM_set_trust -X509_VERIFY_PARAM_table_cleanup -X509_add1_ext_i2d -X509_add1_reject_object -X509_add1_trust_object -X509_add_ext -X509_alias_get0 -X509_alias_set1 -X509_chain_check_suiteb -X509_chain_up_ref -X509_check_akid -X509_check_ca -X509_check_email -X509_check_host -X509_check_ip -X509_check_ip_asc -X509_check_issued -X509_check_private_key -X509_check_purpose -X509_check_trust -X509_cmp -X509_cmp_current_time -X509_cmp_time -X509_delete_ext -X509_digest -X509_dup -X509_email_free -X509_find_by_issuer_and_serial -X509_find_by_subject -X509_free -X509_get0_extensions -X509_get0_notAfter -X509_get0_notBefore -X509_get0_pubkey_bitstr -X509_get0_signature -X509_get0_tbs_sigalg -X509_get1_email -X509_get1_ocsp -X509_get_default_cert_area -X509_get_default_cert_dir -X509_get_default_cert_dir_env -X509_get_default_cert_file -X509_get_default_cert_file_env -X509_get_default_private_dir -X509_get_ex_data -X509_get_ex_new_index -X509_get_ext -X509_get_ext_by_NID -X509_get_ext_by_OBJ -X509_get_ext_by_critical -X509_get_ext_count -X509_get_ext_d2i -X509_get_extended_key_usage -X509_get_extension_flags -X509_get_issuer_name -X509_get_key_usage -X509_get_pubkey -X509_get_serialNumber -X509_get_signature_nid -X509_get_subject_name -X509_gmtime_adj -X509_issuer_and_serial_cmp -X509_issuer_and_serial_hash -X509_issuer_name_cmp -X509_issuer_name_hash -X509_issuer_name_hash_old -X509_it -X509_keyid_get0 -X509_keyid_set1 -X509_load_cert_crl_file -X509_load_cert_file -X509_load_crl_file -X509_new -X509_ocspid_print -X509_parse_from_buffer -X509_policy_check -X509_policy_level_get0_node -X509_policy_level_node_count -X509_policy_node_get0_parent -X509_policy_node_get0_policy -X509_policy_node_get0_qualifiers -X509_policy_tree_free -X509_policy_tree_get0_level -X509_policy_tree_get0_policies -X509_policy_tree_get0_user_policies -X509_policy_tree_level_count -X509_print -X509_print_ex -X509_print_ex_fp -X509_print_fp -X509_pubkey_digest -X509_reject_clear -X509_set_ex_data -X509_set_issuer_name -X509_set_notAfter -X509_set_notBefore -X509_set_pubkey -X509_set_serialNumber -X509_set_subject_name -X509_set_version -X509_sign -X509_sign_ctx -X509_signature_dump -X509_signature_print -X509_subject_name_cmp -X509_subject_name_hash -X509_subject_name_hash_old -X509_supported_extension -X509_time_adj -X509_time_adj_ex -X509_to_X509_REQ -X509_trust_clear -X509_up_ref -X509_verify -X509_verify_cert -X509_verify_cert_error_string -X509at_add1_attr -X509at_add1_attr_by_NID -X509at_add1_attr_by_OBJ -X509at_add1_attr_by_txt -X509at_delete_attr -X509at_get0_data_by_OBJ -X509at_get_attr -X509at_get_attr_by_NID -X509at_get_attr_by_OBJ -X509at_get_attr_count -X509v3_add_ext -X509v3_delete_ext -X509v3_get_ext -X509v3_get_ext_by_NID -X509v3_get_ext_by_OBJ -X509v3_get_ext_by_critical -X509v3_get_ext_count -a2i_GENERAL_NAME -a2i_IPADDRESS -a2i_IPADDRESS_NC -a2i_ipadd -abi_test_bad_unwind_temporary -abi_test_bad_unwind_wrong_register -abi_test_clobber_r10 -abi_test_clobber_r11 -abi_test_clobber_r12 -abi_test_clobber_r13 -abi_test_clobber_r14 -abi_test_clobber_r15 -abi_test_clobber_r8 -abi_test_clobber_r9 -abi_test_clobber_rax -abi_test_clobber_rbp -abi_test_clobber_rbx -abi_test_clobber_rcx -abi_test_clobber_rdi -abi_test_clobber_rdx -abi_test_clobber_rsi -abi_test_clobber_xmm0 -abi_test_clobber_xmm1 -abi_test_clobber_xmm10 -abi_test_clobber_xmm11 -abi_test_clobber_xmm12 -abi_test_clobber_xmm13 -abi_test_clobber_xmm14 -abi_test_clobber_xmm15 -abi_test_clobber_xmm2 -abi_test_clobber_xmm3 -abi_test_clobber_xmm4 -abi_test_clobber_xmm5 -abi_test_clobber_xmm6 -abi_test_clobber_xmm7 -abi_test_clobber_xmm8 -abi_test_clobber_xmm9 -abi_test_get_and_clear_direction_flag -abi_test_set_direction_flag -abi_test_trampoline -abi_test_unwind_return -abi_test_unwind_start -abi_test_unwind_stop -aes128gcmsiv_aes_ks -aes128gcmsiv_aes_ks_enc_x1 -aes128gcmsiv_dec -aes128gcmsiv_ecb_enc_block -aes128gcmsiv_enc_msg_x4 -aes128gcmsiv_enc_msg_x8 -aes128gcmsiv_kdf -aes256gcmsiv_aes_ks -aes256gcmsiv_aes_ks_enc_x1 -aes256gcmsiv_dec -aes256gcmsiv_ecb_enc_block -aes256gcmsiv_enc_msg_x4 -aes256gcmsiv_enc_msg_x8 -aes256gcmsiv_kdf -aes_ctr_set_key -aes_hw_cbc_encrypt -aes_hw_ctr32_encrypt_blocks -aes_hw_decrypt -aes_hw_ecb_encrypt -aes_hw_encrypt -aes_hw_set_decrypt_key -aes_hw_set_encrypt_key -aes_nohw_cbc_encrypt -aes_nohw_decrypt -aes_nohw_encrypt -aes_nohw_set_decrypt_key -aes_nohw_set_encrypt_key -aesgcmsiv_htable6_init -aesgcmsiv_htable_init -aesgcmsiv_htable_polyval -aesgcmsiv_polyval_horner -aesni_gcm_decrypt -aesni_gcm_encrypt -asn1_do_adb -asn1_enc_free -asn1_enc_init -asn1_enc_restore -asn1_enc_save -asn1_ex_c2i -asn1_ex_i2c -asn1_generalizedtime_to_tm -asn1_get_choice_selector -asn1_get_field_ptr -asn1_item_combine_free -asn1_refcount_dec_and_test_zero -asn1_refcount_set_one -asn1_set_choice_selector -asn1_utctime_to_tm -beeu_mod_inverse_vartime -bio_clear_socket_error -bio_fd_should_retry -bio_ip_and_port_to_socket_and_addr -bio_sock_error -bio_socket_nbio -bn_abs_sub_consttime -bn_add_words -bn_copy_words -bn_div_consttime -bn_expand -bn_fits_in_words -bn_from_montgomery -bn_from_montgomery_small -bn_gather5 -bn_in_range_words -bn_is_bit_set_words -bn_is_relatively_prime -bn_jacobi -bn_lcm_consttime -bn_less_than_montgomery_R -bn_less_than_words -bn_miller_rabin_init -bn_miller_rabin_iteration -bn_minimal_width -bn_mod_add_consttime -bn_mod_add_words -bn_mod_exp_base_2_consttime -bn_mod_exp_mont_small -bn_mod_inverse_consttime -bn_mod_inverse_prime -bn_mod_inverse_prime_mont_small -bn_mod_inverse_secret_prime -bn_mod_lshift1_consttime -bn_mod_lshift_consttime -bn_mod_mul_montgomery_small -bn_mod_sub_consttime -bn_mod_sub_words -bn_mod_u16_consttime -bn_mont_n0 -bn_mul_add_words -bn_mul_comba4 -bn_mul_comba8 -bn_mul_consttime -bn_mul_mont -bn_mul_mont_gather5 -bn_mul_small -bn_mul_words -bn_odd_number_is_obviously_composite -bn_one_to_montgomery -bn_power5 -bn_rand_range_words -bn_rand_secret_range -bn_reduce_once -bn_reduce_once_in_place -bn_resize_words -bn_rshift1_words -bn_rshift_secret_shift -bn_rshift_words -bn_scatter5 -bn_select_words -bn_set_minimal_width -bn_set_words -bn_sqr8x_internal -bn_sqr_comba4 -bn_sqr_comba8 -bn_sqr_consttime -bn_sqr_small -bn_sqr_words -bn_sqrx8x_internal -bn_sub_words -bn_to_montgomery_small -bn_uadd_consttime -bn_usub_consttime -bn_wexpand -boringssl_fips_self_test -c2i_ASN1_BIT_STRING -c2i_ASN1_INTEGER -c2i_ASN1_OBJECT -cbb_add_latin1 -cbb_add_ucs2_be -cbb_add_utf32_be -cbb_add_utf8 -cbb_get_utf8_len -cbs_get_latin1 -cbs_get_ucs2_be -cbs_get_utf32_be -cbs_get_utf8 -chacha20_poly1305_open -chacha20_poly1305_seal -crypto_gcm_clmul_enabled -d2i_ACCESS_DESCRIPTION -d2i_ASN1_BIT_STRING -d2i_ASN1_BMPSTRING -d2i_ASN1_BOOLEAN -d2i_ASN1_ENUMERATED -d2i_ASN1_GENERALIZEDTIME -d2i_ASN1_GENERALSTRING -d2i_ASN1_IA5STRING -d2i_ASN1_INTEGER -d2i_ASN1_NULL -d2i_ASN1_OBJECT -d2i_ASN1_OCTET_STRING -d2i_ASN1_PRINTABLE -d2i_ASN1_PRINTABLESTRING -d2i_ASN1_SEQUENCE_ANY -d2i_ASN1_SET_ANY -d2i_ASN1_T61STRING -d2i_ASN1_TIME -d2i_ASN1_TYPE -d2i_ASN1_UNIVERSALSTRING -d2i_ASN1_UTCTIME -d2i_ASN1_UTF8STRING -d2i_ASN1_VISIBLESTRING -d2i_AUTHORITY_INFO_ACCESS -d2i_AUTHORITY_KEYID -d2i_AutoPrivateKey -d2i_BASIC_CONSTRAINTS -d2i_CERTIFICATEPOLICIES -d2i_CRL_DIST_POINTS -d2i_DHparams -d2i_DHparams_bio -d2i_DIRECTORYSTRING -d2i_DISPLAYTEXT -d2i_DIST_POINT -d2i_DIST_POINT_NAME -d2i_DSAPrivateKey -d2i_DSAPrivateKey_bio -d2i_DSAPrivateKey_fp -d2i_DSAPublicKey -d2i_DSA_PUBKEY -d2i_DSA_PUBKEY_bio -d2i_DSA_PUBKEY_fp -d2i_DSA_SIG -d2i_DSAparams -d2i_ECDSA_SIG -d2i_ECParameters -d2i_ECPrivateKey -d2i_ECPrivateKey_bio -d2i_ECPrivateKey_fp -d2i_EC_PUBKEY -d2i_EC_PUBKEY_bio -d2i_EC_PUBKEY_fp -d2i_EDIPARTYNAME -d2i_EXTENDED_KEY_USAGE -d2i_GENERAL_NAME -d2i_GENERAL_NAMES -d2i_ISSUING_DIST_POINT -d2i_NETSCAPE_SPKAC -d2i_NETSCAPE_SPKI -d2i_NOTICEREF -d2i_OTHERNAME -d2i_PKCS12 -d2i_PKCS12_bio -d2i_PKCS12_fp -d2i_PKCS7 -d2i_PKCS7_bio -d2i_PKCS8PrivateKey_bio -d2i_PKCS8PrivateKey_fp -d2i_PKCS8_PRIV_KEY_INFO -d2i_PKCS8_PRIV_KEY_INFO_bio -d2i_PKCS8_PRIV_KEY_INFO_fp -d2i_PKCS8_bio -d2i_PKCS8_fp -d2i_PKEY_USAGE_PERIOD -d2i_POLICYINFO -d2i_POLICYQUALINFO -d2i_PROXY_CERT_INFO_EXTENSION -d2i_PROXY_POLICY -d2i_PUBKEY -d2i_PUBKEY_bio -d2i_PUBKEY_fp -d2i_PrivateKey -d2i_PrivateKey_bio -d2i_PrivateKey_fp -d2i_PublicKey -d2i_RSAPrivateKey -d2i_RSAPrivateKey_bio -d2i_RSAPrivateKey_fp -d2i_RSAPublicKey -d2i_RSAPublicKey_bio -d2i_RSAPublicKey_fp -d2i_RSA_PSS_PARAMS -d2i_RSA_PUBKEY -d2i_RSA_PUBKEY_bio -d2i_RSA_PUBKEY_fp -d2i_SSL_SESSION -d2i_SSL_SESSION_bio -d2i_SXNET -d2i_SXNETID -d2i_USERNOTICE -d2i_X509 -d2i_X509_ALGOR -d2i_X509_ALGORS -d2i_X509_ATTRIBUTE -d2i_X509_AUX -d2i_X509_CERT_AUX -d2i_X509_CINF -d2i_X509_CRL -d2i_X509_CRL_INFO -d2i_X509_CRL_bio -d2i_X509_CRL_fp -d2i_X509_EXTENSION -d2i_X509_EXTENSIONS -d2i_X509_NAME -d2i_X509_NAME_ENTRY -d2i_X509_PUBKEY -d2i_X509_REQ -d2i_X509_REQ_INFO -d2i_X509_REQ_bio -d2i_X509_REQ_fp -d2i_X509_REVOKED -d2i_X509_SIG -d2i_X509_VAL -d2i_X509_bio -d2i_X509_fp -dsa_asn1_meth -ec_GFp_mont_add -ec_GFp_mont_bignum_to_felem -ec_GFp_mont_dbl -ec_GFp_mont_felem_mul -ec_GFp_mont_felem_sqr -ec_GFp_mont_felem_to_bignum -ec_GFp_mont_group_finish -ec_GFp_mont_group_init -ec_GFp_mont_group_set_curve -ec_GFp_mont_mul -ec_GFp_mont_mul_base -ec_GFp_mont_mul_public -ec_GFp_nistp_recode_scalar_bits -ec_GFp_simple_cmp -ec_GFp_simple_cmp_x_coordinate -ec_GFp_simple_group_finish -ec_GFp_simple_group_get_curve -ec_GFp_simple_group_init -ec_GFp_simple_group_set_curve -ec_GFp_simple_invert -ec_GFp_simple_is_at_infinity -ec_GFp_simple_is_on_curve -ec_GFp_simple_mont_inv_mod_ord_vartime -ec_GFp_simple_point_copy -ec_GFp_simple_point_init -ec_GFp_simple_point_set_affine_coordinates -ec_GFp_simple_point_set_to_infinity -ec_asn1_meth -ec_bignum_to_felem -ec_bignum_to_scalar -ec_cmp_x_coordinate -ec_compute_wNAF -ec_felem_add -ec_felem_equal -ec_felem_neg -ec_felem_non_zero_mask -ec_felem_select -ec_felem_sub -ec_felem_to_bignum -ec_get_x_coordinate_as_scalar -ec_group_new -ec_pkey_meth -ec_point_get_affine_coordinate_bytes -ec_point_mul_scalar -ec_point_mul_scalar_base -ec_point_mul_scalar_public -ec_random_nonzero_scalar -ec_scalar_add -ec_scalar_equal_vartime -ec_scalar_from_montgomery -ec_scalar_inv_montgomery -ec_scalar_inv_montgomery_vartime -ec_scalar_is_zero -ec_scalar_mul_montgomery -ec_scalar_to_montgomery -ec_simple_scalar_inv_montgomery -ecp_nistz256_avx2_select_w7 -ecp_nistz256_mul_mont -ecp_nistz256_neg -ecp_nistz256_ord_mul_mont -ecp_nistz256_ord_sqr_mont -ecp_nistz256_point_add -ecp_nistz256_point_add_affine -ecp_nistz256_point_double -ecp_nistz256_select_w5 -ecp_nistz256_select_w7 -ecp_nistz256_sqr_mont -ed25519_asn1_meth -ed25519_pkey_meth -gcm_ghash_4bit -gcm_ghash_avx -gcm_ghash_clmul -gcm_ghash_ssse3 -gcm_gmult_4bit -gcm_gmult_avx -gcm_gmult_clmul -gcm_gmult_ssse3 -gcm_init_4bit -gcm_init_avx -gcm_init_clmul -gcm_init_ssse3 -i2a_ACCESS_DESCRIPTION -i2a_ASN1_ENUMERATED -i2a_ASN1_INTEGER -i2a_ASN1_OBJECT -i2a_ASN1_STRING -i2c_ASN1_BIT_STRING -i2c_ASN1_INTEGER -i2d_ACCESS_DESCRIPTION -i2d_ASN1_BIT_STRING -i2d_ASN1_BMPSTRING -i2d_ASN1_BOOLEAN -i2d_ASN1_ENUMERATED -i2d_ASN1_GENERALIZEDTIME -i2d_ASN1_GENERALSTRING -i2d_ASN1_IA5STRING -i2d_ASN1_INTEGER -i2d_ASN1_NULL -i2d_ASN1_OBJECT -i2d_ASN1_OCTET_STRING -i2d_ASN1_PRINTABLE -i2d_ASN1_PRINTABLESTRING -i2d_ASN1_SEQUENCE_ANY -i2d_ASN1_SET_ANY -i2d_ASN1_T61STRING -i2d_ASN1_TIME -i2d_ASN1_TYPE -i2d_ASN1_UNIVERSALSTRING -i2d_ASN1_UTCTIME -i2d_ASN1_UTF8STRING -i2d_ASN1_VISIBLESTRING -i2d_AUTHORITY_INFO_ACCESS -i2d_AUTHORITY_KEYID -i2d_BASIC_CONSTRAINTS -i2d_CERTIFICATEPOLICIES -i2d_CRL_DIST_POINTS -i2d_DHparams -i2d_DHparams_bio -i2d_DIRECTORYSTRING -i2d_DISPLAYTEXT -i2d_DIST_POINT -i2d_DIST_POINT_NAME -i2d_DSAPrivateKey -i2d_DSAPrivateKey_bio -i2d_DSAPrivateKey_fp -i2d_DSAPublicKey -i2d_DSA_PUBKEY -i2d_DSA_PUBKEY_bio -i2d_DSA_PUBKEY_fp -i2d_DSA_SIG -i2d_DSAparams -i2d_ECDSA_SIG -i2d_ECParameters -i2d_ECPrivateKey -i2d_ECPrivateKey_bio -i2d_ECPrivateKey_fp -i2d_EC_PUBKEY -i2d_EC_PUBKEY_bio -i2d_EC_PUBKEY_fp -i2d_EDIPARTYNAME -i2d_EXTENDED_KEY_USAGE -i2d_GENERAL_NAME -i2d_GENERAL_NAMES -i2d_ISSUING_DIST_POINT -i2d_NETSCAPE_SPKAC -i2d_NETSCAPE_SPKI -i2d_NOTICEREF -i2d_OTHERNAME -i2d_PKCS12 -i2d_PKCS12_bio -i2d_PKCS12_fp -i2d_PKCS7 -i2d_PKCS7_bio -i2d_PKCS8PrivateKeyInfo_bio -i2d_PKCS8PrivateKeyInfo_fp -i2d_PKCS8PrivateKey_bio -i2d_PKCS8PrivateKey_fp -i2d_PKCS8PrivateKey_nid_bio -i2d_PKCS8PrivateKey_nid_fp -i2d_PKCS8_PRIV_KEY_INFO -i2d_PKCS8_PRIV_KEY_INFO_bio -i2d_PKCS8_PRIV_KEY_INFO_fp -i2d_PKCS8_bio -i2d_PKCS8_fp -i2d_PKEY_USAGE_PERIOD -i2d_POLICYINFO -i2d_POLICYQUALINFO -i2d_PROXY_CERT_INFO_EXTENSION -i2d_PROXY_POLICY -i2d_PUBKEY -i2d_PUBKEY_bio -i2d_PUBKEY_fp -i2d_PrivateKey -i2d_PrivateKey_bio -i2d_PrivateKey_fp -i2d_PublicKey -i2d_RSAPrivateKey -i2d_RSAPrivateKey_bio -i2d_RSAPrivateKey_fp -i2d_RSAPublicKey -i2d_RSAPublicKey_bio -i2d_RSAPublicKey_fp -i2d_RSA_PSS_PARAMS -i2d_RSA_PUBKEY -i2d_RSA_PUBKEY_bio -i2d_RSA_PUBKEY_fp -i2d_SSL_SESSION -i2d_SSL_SESSION_bio -i2d_SXNET -i2d_SXNETID -i2d_USERNOTICE -i2d_X509 -i2d_X509_ALGOR -i2d_X509_ALGORS -i2d_X509_ATTRIBUTE -i2d_X509_AUX -i2d_X509_CERT_AUX -i2d_X509_CINF -i2d_X509_CRL -i2d_X509_CRL_INFO -i2d_X509_CRL_bio -i2d_X509_CRL_fp -i2d_X509_EXTENSION -i2d_X509_EXTENSIONS -i2d_X509_NAME -i2d_X509_NAME_ENTRY -i2d_X509_PUBKEY -i2d_X509_REQ -i2d_X509_REQ_INFO -i2d_X509_REQ_bio -i2d_X509_REQ_fp -i2d_X509_REVOKED -i2d_X509_SIG -i2d_X509_VAL -i2d_X509_bio -i2d_X509_fp -i2d_re_X509_CRL_tbs -i2d_re_X509_REQ_tbs -i2d_re_X509_tbs -i2o_ECPublicKey -i2s_ASN1_ENUMERATED -i2s_ASN1_ENUMERATED_TABLE -i2s_ASN1_INTEGER -i2s_ASN1_OCTET_STRING -i2t_ASN1_OBJECT -i2v_ASN1_BIT_STRING -i2v_GENERAL_NAME -i2v_GENERAL_NAMES -kBoringSSLRSASqrtTwo -kBoringSSLRSASqrtTwoLen -kOpenSSLReasonStringData -kOpenSSLReasonValues -kOpenSSLReasonValuesLen -level_add_node -level_find_node -lh_delete -lh_doall_arg -lh_free -lh_insert -lh_new -lh_num_items -lh_retrieve -lh_retrieve_key -lh_strhash -md4_block_data_order -md5_block_asm_data_order -o2i_ECPublicKey -pkcs12_iterations_acceptable -pkcs12_key_gen -pkcs12_pbe_encrypt_init -pkcs7_bundle -pkcs7_parse_header -pkcs8_pbe_decrypt -policy_cache_find_data -policy_cache_free -policy_cache_set -policy_cache_set_mapping -policy_data_free -policy_data_new -policy_node_cmp_new -policy_node_free -policy_node_match -rand_fork_unsafe_buffering_enabled -rsa_asn1_meth -rsa_default_decrypt -rsa_default_private_transform -rsa_default_sign_raw -rsa_default_size -rsa_pkey_meth -rsaz_1024_gather5_avx2 -rsaz_1024_mul_avx2 -rsaz_1024_norm2red_avx2 -rsaz_1024_red2norm_avx2 -rsaz_1024_scatter5_avx2 -rsaz_1024_sqr_avx2 -s2i_ASN1_INTEGER -s2i_ASN1_OCTET_STRING -sdallocx -sha1_block_data_order -sha256_block_data_order -sha512_block_data_order -sk_CRYPTO_BUFFER_call_copy_func -sk_CRYPTO_BUFFER_call_copy_func -sk_CRYPTO_BUFFER_call_free_func -sk_CRYPTO_BUFFER_call_free_func -sk_CRYPTO_BUFFER_deep_copy -sk_CRYPTO_BUFFER_deep_copy -sk_CRYPTO_BUFFER_new_null -sk_CRYPTO_BUFFER_new_null -sk_CRYPTO_BUFFER_new_null -sk_CRYPTO_BUFFER_new_null -sk_CRYPTO_BUFFER_new_null -sk_CRYPTO_BUFFER_new_null -sk_CRYPTO_BUFFER_num -sk_CRYPTO_BUFFER_num -sk_CRYPTO_BUFFER_num -sk_CRYPTO_BUFFER_num -sk_CRYPTO_BUFFER_num -sk_CRYPTO_BUFFER_num -sk_CRYPTO_BUFFER_num -sk_CRYPTO_BUFFER_num -sk_CRYPTO_BUFFER_num -sk_CRYPTO_BUFFER_push -sk_CRYPTO_BUFFER_set -sk_CRYPTO_BUFFER_value -sk_CRYPTO_BUFFER_value -sk_CRYPTO_BUFFER_value -sk_CRYPTO_BUFFER_value -sk_CRYPTO_BUFFER_value -sk_CRYPTO_BUFFER_value -sk_CRYPTO_BUFFER_value -sk_SRTP_PROTECTION_PROFILE_new_null -sk_SRTP_PROTECTION_PROFILE_num -sk_SRTP_PROTECTION_PROFILE_push -sk_SSL_CIPHER_call_cmp_func -sk_SSL_CIPHER_call_cmp_func -sk_SSL_CIPHER_call_cmp_func -sk_SSL_CIPHER_call_cmp_func -sk_SSL_CIPHER_delete -sk_SSL_CIPHER_dup -sk_SSL_CIPHER_find -sk_SSL_CIPHER_find -sk_SSL_CIPHER_find -sk_SSL_CIPHER_find -sk_SSL_CIPHER_new_null -sk_SSL_CIPHER_new_null -sk_SSL_CIPHER_new_null -sk_SSL_CIPHER_num -sk_SSL_CIPHER_num -sk_SSL_CIPHER_num -sk_SSL_CIPHER_num -sk_SSL_CIPHER_push -sk_SSL_CIPHER_push -sk_SSL_CIPHER_push -sk_SSL_CIPHER_value -sk_SSL_CIPHER_value -sk_X509_NAME_call_cmp_func -sk_X509_NAME_call_copy_func -sk_X509_NAME_call_free_func -sk_X509_NAME_call_free_func -sk_X509_NAME_deep_copy -sk_X509_NAME_find -sk_X509_NAME_free -sk_X509_NAME_new -sk_X509_NAME_new_null -sk_X509_NAME_new_null -sk_X509_NAME_pop_free -sk_X509_NAME_pop_free -sk_X509_NAME_push -sk_X509_NAME_set_cmp_func -sk_X509_NAME_sort -sk_X509_call_free_func -sk_X509_new_null -sk_X509_num -sk_X509_pop_free -sk_X509_shift -sk_X509_value -sk_deep_copy -sk_delete -sk_delete_ptr -sk_dup -sk_find -sk_free -sk_insert -sk_is_sorted -sk_new -sk_new_null -sk_num -sk_pop -sk_pop_free -sk_pop_free_ex -sk_push -sk_set -sk_set_cmp_func -sk_shift -sk_sort -sk_value -sk_zero -tree_find_sk -v2i_ASN1_BIT_STRING -v2i_GENERAL_NAME -v2i_GENERAL_NAMES -v2i_GENERAL_NAME_ex -v3_akey_id -v3_alt -v3_bcons -v3_cpols -v3_crl_invdate -v3_crl_num -v3_crl_reason -v3_crld -v3_delta_crl -v3_ext_ku -v3_freshest_crl -v3_idp -v3_info -v3_inhibit_anyp -v3_key_usage -v3_name_constraints -v3_ns_ia5_list -v3_nscert -v3_ocsp_accresp -v3_ocsp_nocheck -v3_pci -v3_pkey_usage_period -v3_policy_constraints -v3_policy_mappings -v3_sinfo -v3_skey_id -v3_sxnet -vpaes_cbc_encrypt -vpaes_ctr32_encrypt_blocks -vpaes_decrypt -vpaes_encrypt -vpaes_set_decrypt_key -vpaes_set_encrypt_key -x25519_asn1_meth -x25519_ge_add -x25519_ge_frombytes_vartime -x25519_ge_p1p1_to_p2 -x25519_ge_p1p1_to_p3 -x25519_ge_p3_to_cached -x25519_ge_scalarmult -x25519_ge_scalarmult_base -x25519_ge_scalarmult_small_precomp -x25519_ge_sub -x25519_ge_tobytes -x25519_pkey_meth -x25519_sc_reduce -x509_digest_sign_algorithm -x509_digest_verify_init -x509_print_rsa_pss_params -x509_rsa_ctx_to_pss -x509_rsa_pss_to_ctx -x509v3_bytes_to_hex -x509v3_hex_to_bytes -x509v3_looks_like_dns_name -x509v3_name_cmp diff --git a/templates/src/core/tsi/grpc_shadow_boringssl.h.template b/templates/src/core/tsi/grpc_shadow_boringssl.h.template deleted file mode 100644 index 0b5e6128810..00000000000 --- a/templates/src/core/tsi/grpc_shadow_boringssl.h.template +++ /dev/null @@ -1,40 +0,0 @@ -%YAML 1.2 ---- | - <%! - def expand_symbol_list(symbol_list): - return '\n'.join('#define %s GRPC_SHADOW_%s' % (symbol, symbol) for symbol in symbol_list) - %> - /* - * - * Copyright 2018 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - - // This file is autogenerated from a template file. Please make - // modifications to - // `templates/src/objective-c/tsi/grpc_shadow_boringssl.h.template` - // instead. This file can be regenerated from the template by running - // `tools/buildgen/generate_projects.sh`. - - #ifndef GRPC_CORE_TSI_GRPC_SHADOW_BORINGSSL_H - #define GRPC_CORE_TSI_GRPC_SHADOW_BORINGSSL_H - - #ifdef GRPC_SHADOW_BORINGSSL_SYMBOLS - - ${expand_symbol_list(settings.grpc_shadow_boringssl_symbols)} - - #endif /* GRPC_SHADOW_BORINGSSL_SYMBOLS */ - - #endif /* GRPC_CORE_TSI_GRPC_SHADOW_BORINGSSL_H */ diff --git a/templates/src/objective-c/BoringSSL-GRPC.podspec.template-e b/templates/src/objective-c/BoringSSL-GRPC.podspec.template-e new file mode 100644 index 00000000000..94c07657d4d --- /dev/null +++ b/templates/src/objective-c/BoringSSL-GRPC.podspec.template-e @@ -0,0 +1,249 @@ +%YAML 1.2 +--- | + <%! + def expand_symbol_list(symbol_list): + return ',\n '.join("'#define %s GRPC_SHADOW_%s'" % (symbol, symbol) for symbol in symbol_list) + import subprocess + boringssl_commit = subprocess.check_output(['git', 'rev-parse', 'HEAD'], cwd='third_party/boringssl').decode().strip() + %> + + # This file has been automatically generated from a template file. + # Please make modifications to + # `templates/src/objective-c/BoringSSL-GRPC.podspec.template` instead. This + # file can be regenerated from the template by running + # `tools/buildgen/generate_projects.sh`. Because of some limitations of this + # template, you might actually need to run the same script twice in a row. + # (see err_data.c section) + + # BoringSSL CocoaPods podspec + + # Copyright 2015, Google Inc. + # All rights reserved. + # + # Redistribution and use in source and binary forms, with or without + # modification, are permitted provided that the following conditions are + # met: + # + # * Redistributions of source code must retain the above copyright + # notice, this list of conditions and the following disclaimer. + # * Redistributions in binary form must reproduce the above + # copyright notice, this list of conditions and the following disclaimer + # in the documentation and/or other materials provided with the + # distribution. + # * Neither the name of Google Inc. nor the names of its + # contributors may be used to endorse or promote products derived from + # this software without specific prior written permission. + # + # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + Pod::Spec.new do |s| + s.name = 'BoringSSL-GRPC' + version = '0.0.5' + s.version = version + s.summary = 'BoringSSL is a fork of OpenSSL that is designed to meet Google\'s needs.' + # Adapted from the homepage: + s.description = <<-DESC + BoringSSL is a fork of OpenSSL that is designed to meet Google's needs. + + Although BoringSSL is an open source project, it is not intended for general use, as OpenSSL is. + We don't recommend that third parties depend upon it. Doing so is likely to be frustrating + because there are no guarantees of API stability. Only the latest version of this pod is + supported, and every new version is a new major version. + + We update Google libraries and programs that use BoringSSL as needed when deciding to make API + changes. This allows us to mostly avoid compromises in the name of compatibility. It works for + us, but it may not work for you. + + As a Cocoapods pod, it has the advantage over OpenSSL's pods that the library doesn't need to + be precompiled. This eliminates the 10 - 20 minutes of wait the first time a user does "pod + install", lets it be used as a dynamic framework (pending solution of Cocoapods' issue #4605), + and works with bitcode automatically. It's also thought to be smaller than OpenSSL (which takes + 1MB - 2MB per ARM architecture), but we don't have specific numbers yet. + + BoringSSL arose because Google used OpenSSL for many years in various ways and, over time, built + up a large number of patches that were maintained while tracking upstream OpenSSL. As Google's + product portfolio became more complex, more copies of OpenSSL sprung up and the effort involved + in maintaining all these patches in multiple places was growing steadily. + + Currently BoringSSL is the SSL library in Chrome/Chromium, Android (but it's not part of the + NDK) and a number of other apps/programs. + DESC + s.homepage = 'https://github.com/google/boringssl' + s.license = { :type => 'Mixed', :file => 'LICENSE' } + # "The name and email addresses of the library maintainers, not the Podspec maintainer." + s.authors = 'Adam Langley', 'David Benjamin', 'Matt Braithwaite' + + s.source = { + :git => 'https://github.com/google/boringssl.git', + :commit => "${boringssl_commit}", + } + + s.ios.deployment_target = '7.0' + s.osx.deployment_target = '10.7' + s.tvos.deployment_target = '10.0' + s.watchos.deployment_target = '4.0' + + name = 'openssl_grpc' + + # When creating a dynamic framework, name it openssl.framework instead of BoringSSL.framework. + # This lets users write their includes like `#include ` as opposed to `#include + # `. + s.module_name = name + + # When creating a dynamic framework, copy the headers under `include/openssl/` into the root of + # the `Headers/` directory of the framework (i.e., not under `Headers/include/openssl`). + # + # TODO(jcanizales): Debug why this doesn't work on macOS. + s.header_mappings_dir = 'include/openssl' + + # The above has an undesired effect when creating a static library: It forces users to write + # includes like `#include `. `s.header_dir` adds a path prefix to that, and + # because Cocoapods lets omit the pod name when including headers of static libraries, the + # following lets users write `#include `. + s.header_dir = name + + # The module map and umbrella header created automatically by Cocoapods don't work for C libraries + # like this one. The following file, and a correct umbrella header, are created on the fly by the + # `prepare_command` of this pod. + s.module_map = 'include/openssl/BoringSSL.modulemap' + + # We don't need to inhibit all warnings; only -Wno-shorten-64-to-32. But Cocoapods' linter doesn't + # want that for some reason. + s.compiler_flags = '-DOPENSSL_NO_ASM', '-GCC_WARN_INHIBIT_ALL_WARNINGS', '-w' + s.requires_arc = false + + # Like many other C libraries, BoringSSL has its public headers under `include//` and its + # sources and private headers in other directories outside `include/`. Cocoapods' linter doesn't + # allow any header to be listed outside the `header_mappings_dir` (even though doing so works in + # practice). Because we need our `header_mappings_dir` to be `include/openssl/` for the reason + # mentioned above, we work around the linter limitation by dividing the pod into two subspecs, one + # for public headers and the other for implementation. Each gets its own `header_mappings_dir`, + # making the linter happy. + s.subspec 'Interface' do |ss| + ss.header_mappings_dir = 'include/openssl' + ss.source_files = 'include/openssl/*.h' + end + s.subspec 'Implementation' do |ss| + ss.header_mappings_dir = '.' + ss.source_files = 'ssl/*.{h,c,cc}', + 'ssl/**/*.{h,c,cc}', + 'crypto/*.{h,c,cc}', + 'crypto/**/*.{h,c,cc}', + # We have to include fiat because spake25519 depends on it + 'third_party/fiat/*.{h,c,cc}', + # Include the err_data.c generated in prepare_command below + 'err_data.c' + + ss.private_header_files = 'ssl/*.h', + 'ssl/**/*.h', + 'crypto/*.h', + 'crypto/**/*.h', + 'third_party/fiat/*.h' + # bcm.c includes other source files, creating duplicated symbols. Since it is not used, we + # explicitly exclude it from the pod. + # TODO (mxyan): Work with BoringSSL team to remove this hack. + ss.exclude_files = 'crypto/fipsmodule/bcm.c', + '**/*_test.*', + '**/test_*.*', + '**/test/*.*' + + ss.dependency "#{s.name}/Interface", version + end + + s.prepare_command = <<-END_OF_COMMAND + # Add a module map and an umbrella header + cat > include/openssl/umbrella.h < include/openssl/BoringSSL.modulemap < err_data.c < 0 and s[0] != '#'] - # Remove the commit number - del symbols[0] - - settings = dictionary['settings'] - settings['grpc_shadow_boringssl_symbols'] = symbols From 3d9d825b3bc82ea503c8533324a4e4713702eba1 Mon Sep 17 00:00:00 2001 From: Muxi Yan Date: Wed, 13 Nov 2019 15:18:44 -0800 Subject: [PATCH 013/758] Rewrite the sanity check script --- .../distrib/check_boringssl_prefix_symbol.sh | 29 +++++++++++++++++ .../check_shadow_boringssl_symbol_list.sh | 32 ------------------- tools/run_tests/sanity/sanity_tests.yaml | 2 +- 3 files changed, 30 insertions(+), 33 deletions(-) create mode 100755 tools/distrib/check_boringssl_prefix_symbol.sh delete mode 100755 tools/distrib/check_shadow_boringssl_symbol_list.sh diff --git a/tools/distrib/check_boringssl_prefix_symbol.sh b/tools/distrib/check_boringssl_prefix_symbol.sh new file mode 100755 index 00000000000..f101bf902cf --- /dev/null +++ b/tools/distrib/check_boringssl_prefix_symbol.sh @@ -0,0 +1,29 @@ +#!/bin/bash +# Copyright 2018 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +# Check if the current BoringSSL version's corresponding prefix header is uploaded to GCS. +set -e + +cd "$(dirname $0)" +cd ../../third_party/boringssl + +BORINGSSL_COMMIT=$(git rev-parse HEAD) + +curl -f -L https://storage.googleapis.com/grpc_boringssl_prefix_headers/boringssl_prefix_symbols-$BORINGSSL_COMMIT.h > /dev/null + +[ $? == 0 ] || { echo "Cannot find prefix header of current BoringSSL commit ($BORINGSSL_COMMIT) on GCS." ; echo "Generate with tools/distrib/upgrade_boringssl_objc.sh" ; exit 1 ; } + +exit 0 diff --git a/tools/distrib/check_shadow_boringssl_symbol_list.sh b/tools/distrib/check_shadow_boringssl_symbol_list.sh deleted file mode 100755 index 67aceacd218..00000000000 --- a/tools/distrib/check_shadow_boringssl_symbol_list.sh +++ /dev/null @@ -1,32 +0,0 @@ -#!/bin/bash -# Copyright 2018 gRPC authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -# Check if the commit version of BoringSSL podspec, BoringSSL submodule, and -# the shadowed symbol list are all based on the same BoringSSL commit. -set -e - -cd $(dirname $0) - -boringssl_podspec_original="../../src/objective-c/BoringSSL-GRPC.podspec" -symbol_list="../../src/objective-c/grpc_shadow_boringssl_symbol_list" - -# Check BoringSSL version matches -ver1=$(git submodule |grep "boringssl " | awk '{print $1}' | head -n 1) -ver2=$(cat $boringssl_podspec_original | grep ':commit =>' | sed -E 's/.*"(.*)".*/\1/g') -ver3=$(cat $symbol_list | sed -n '2 p') -[ $ver1 == $ver2 ] && [ $ver1 == $ver3 ] || { echo "BoringSSL submodule (third_party/boringssl), BoringSSL podspec (src/objective-c/BoringSSL.podspec), and BoringSSL symbol list (src/objective-c/grpc_shadow_boringssl_symbol_list) commit do not match." ; echo "BoringSSL submodule: $ver1" ; echo "BoringSSL podspec: $ver2" ; echo "BoringSSL symbol list: $ver3" ; exit 1 ; } - -exit 0 diff --git a/tools/run_tests/sanity/sanity_tests.yaml b/tools/run_tests/sanity/sanity_tests.yaml index a994aae1330..50ab2207d67 100644 --- a/tools/run_tests/sanity/sanity_tests.yaml +++ b/tools/run_tests/sanity/sanity_tests.yaml @@ -26,4 +26,4 @@ - script: tools/distrib/yapf_code.sh cpu_cost: 1000 - script: tools/distrib/check_protobuf_pod_version.sh -- script: tools/distrib/check_shadow_boringssl_symbol_list.sh +- script: tools/distrib/check_boringssl_prefix_symbol.sh From ac92253fe8b9c3683867b6962302bb894a2e06f6 Mon Sep 17 00:00:00 2001 From: Muxi Yan Date: Wed, 13 Nov 2019 15:21:27 -0800 Subject: [PATCH 014/758] Bump up BoringSSL version number --- gRPC-Core.podspec | 2 +- src/objective-c/BoringSSL-GRPC.podspec | 2 +- templates/gRPC-Core.podspec.template | 2 +- templates/src/objective-c/BoringSSL-GRPC.podspec.template | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec index 56424513c2b..f09fc1240f0 100644 --- a/gRPC-Core.podspec +++ b/gRPC-Core.podspec @@ -185,7 +185,7 @@ Pod::Spec.new do |s| ss.header_mappings_dir = '.' ss.libraries = 'z' ss.dependency "#{s.name}/Interface", version - ss.dependency 'BoringSSL-GRPC', '0.0.5' + ss.dependency 'BoringSSL-GRPC', '0.0.6' ss.compiler_flags = '-DBORINGSSL_PREFIX=GRPC' ss.source_files = 'src/core/ext/filters/census/grpc_context.cc', diff --git a/src/objective-c/BoringSSL-GRPC.podspec b/src/objective-c/BoringSSL-GRPC.podspec index e476c2836dc..2bee72c52a8 100644 --- a/src/objective-c/BoringSSL-GRPC.podspec +++ b/src/objective-c/BoringSSL-GRPC.podspec @@ -41,7 +41,7 @@ Pod::Spec.new do |s| s.name = 'BoringSSL-GRPC' - version = '0.0.5' + version = '0.0.6' s.version = version s.summary = 'BoringSSL is a fork of OpenSSL that is designed to meet Google\'s needs.' # Adapted from the homepage: diff --git a/templates/gRPC-Core.podspec.template b/templates/gRPC-Core.podspec.template index bad6e190c36..c8f38bceec6 100644 --- a/templates/gRPC-Core.podspec.template +++ b/templates/gRPC-Core.podspec.template @@ -174,7 +174,7 @@ ss.header_mappings_dir = '.' ss.libraries = 'z' ss.dependency "#{s.name}/Interface", version - ss.dependency 'BoringSSL-GRPC', '0.0.5' + ss.dependency 'BoringSSL-GRPC', '0.0.6' ss.compiler_flags = '-DBORINGSSL_PREFIX=GRPC' ss.source_files = ${ruby_multiline_list(grpc_private_files(libs), 22)} diff --git a/templates/src/objective-c/BoringSSL-GRPC.podspec.template b/templates/src/objective-c/BoringSSL-GRPC.podspec.template index 39b52eed146..f680c8af153 100644 --- a/templates/src/objective-c/BoringSSL-GRPC.podspec.template +++ b/templates/src/objective-c/BoringSSL-GRPC.podspec.template @@ -46,7 +46,7 @@ Pod::Spec.new do |s| s.name = 'BoringSSL-GRPC' - version = '0.0.5' + version = '0.0.6' s.version = version s.summary = 'BoringSSL is a fork of OpenSSL that is designed to meet Google\'s needs.' # Adapted from the homepage: From 4ba1864cd9d4592f597830e5e779263ff4864e9e Mon Sep 17 00:00:00 2001 From: Muxi Yan Date: Fri, 15 Nov 2019 08:55:36 -0800 Subject: [PATCH 015/758] Use gRPC repo to store boringssl prefix headers --- .gitignore | 1 - ...7f02881e96e51f1873afcf384d02f782b48967ca.h | 3243 +++++++++++++++++ .../BoringSSL-GRPC.podspec.template | 4 +- ...erate_grpc_shadow_boringssl_symbol_list.sh | 41 - tools/distrib/upgrade_boringssl_objc.sh | 17 +- 5 files changed, 3252 insertions(+), 54 deletions(-) create mode 100644 src/objective-c/boringssl_prefix_headers/boringssl_prefix_symbols-7f02881e96e51f1873afcf384d02f782b48967ca.h delete mode 100644 tools/distrib/generate_grpc_shadow_boringssl_symbol_list.sh diff --git a/.gitignore b/.gitignore index ace0e038a8f..47b2a77fc97 100644 --- a/.gitignore +++ b/.gitignore @@ -95,7 +95,6 @@ DerivedData *.pbobjc.* *.pbrpc.* src/objective-c/**/Build -boringssl_prefix_header_out # Cocoapods artifacts Pods/ diff --git a/src/objective-c/boringssl_prefix_headers/boringssl_prefix_symbols-7f02881e96e51f1873afcf384d02f782b48967ca.h b/src/objective-c/boringssl_prefix_headers/boringssl_prefix_symbols-7f02881e96e51f1873afcf384d02f782b48967ca.h new file mode 100644 index 00000000000..173b2d432f8 --- /dev/null +++ b/src/objective-c/boringssl_prefix_headers/boringssl_prefix_symbols-7f02881e96e51f1873afcf384d02f782b48967ca.h @@ -0,0 +1,3243 @@ +// Copyright (c) 2018, Google Inc. +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION +// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +// BORINGSSL_ADD_PREFIX pastes two identifiers into one. It performs one +// iteration of macro expansion on its arguments before pasting. +#define BORINGSSL_ADD_PREFIX(a, b) BORINGSSL_ADD_PREFIX_INNER(a, b) +#define BORINGSSL_ADD_PREFIX_INNER(a, b) a ## _ ## b + +#define BIO_f_ssl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_f_ssl) +#define BIO_set_ssl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_ssl) +#define DTLS_client_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DTLS_client_method) +#define DTLS_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DTLS_method) +#define DTLS_server_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DTLS_server_method) +#define DTLS_with_buffers_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DTLS_with_buffers_method) +#define DTLSv1_2_client_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DTLSv1_2_client_method) +#define DTLSv1_2_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DTLSv1_2_method) +#define DTLSv1_2_server_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DTLSv1_2_server_method) +#define DTLSv1_client_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DTLSv1_client_method) +#define DTLSv1_get_timeout BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DTLSv1_get_timeout) +#define DTLSv1_handle_timeout BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DTLSv1_handle_timeout) +#define DTLSv1_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DTLSv1_method) +#define DTLSv1_server_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DTLSv1_server_method) +#define DTLSv1_set_initial_timeout_duration BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DTLSv1_set_initial_timeout_duration) +#define ERR_load_SSL_strings BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_load_SSL_strings) +#define OPENSSL_init_ssl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_init_ssl) +#define PEM_read_SSL_SESSION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_SSL_SESSION) +#define PEM_read_bio_SSL_SESSION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_SSL_SESSION) +#define PEM_write_SSL_SESSION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_SSL_SESSION) +#define PEM_write_bio_SSL_SESSION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_SSL_SESSION) +#define SSL_CIPHER_description BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_description) +#define SSL_CIPHER_get_auth_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_get_auth_nid) +#define SSL_CIPHER_get_bits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_get_bits) +#define SSL_CIPHER_get_cipher_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_get_cipher_nid) +#define SSL_CIPHER_get_digest_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_get_digest_nid) +#define SSL_CIPHER_get_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_get_id) +#define SSL_CIPHER_get_kx_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_get_kx_name) +#define SSL_CIPHER_get_kx_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_get_kx_nid) +#define SSL_CIPHER_get_max_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_get_max_version) +#define SSL_CIPHER_get_min_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_get_min_version) +#define SSL_CIPHER_get_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_get_name) +#define SSL_CIPHER_get_prf_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_get_prf_nid) +#define SSL_CIPHER_get_rfc_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_get_rfc_name) +#define SSL_CIPHER_get_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_get_value) +#define SSL_CIPHER_get_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_get_version) +#define SSL_CIPHER_is_aead BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_is_aead) +#define SSL_CIPHER_is_block_cipher BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_is_block_cipher) +#define SSL_CIPHER_standard_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_standard_name) +#define SSL_COMP_add_compression_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_COMP_add_compression_method) +#define SSL_COMP_free_compression_methods BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_COMP_free_compression_methods) +#define SSL_COMP_get0_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_COMP_get0_name) +#define SSL_COMP_get_compression_methods BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_COMP_get_compression_methods) +#define SSL_COMP_get_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_COMP_get_id) +#define SSL_COMP_get_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_COMP_get_name) +#define SSL_CTX_add0_chain_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_add0_chain_cert) +#define SSL_CTX_add1_chain_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_add1_chain_cert) +#define SSL_CTX_add_cert_compression_alg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_add_cert_compression_alg) +#define SSL_CTX_add_client_CA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_add_client_CA) +#define SSL_CTX_add_extra_chain_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_add_extra_chain_cert) +#define SSL_CTX_add_session BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_add_session) +#define SSL_CTX_check_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_check_private_key) +#define SSL_CTX_cipher_in_group BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_cipher_in_group) +#define SSL_CTX_clear_chain_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_clear_chain_certs) +#define SSL_CTX_clear_extra_chain_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_clear_extra_chain_certs) +#define SSL_CTX_clear_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_clear_mode) +#define SSL_CTX_clear_options BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_clear_options) +#define SSL_CTX_enable_ocsp_stapling BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_enable_ocsp_stapling) +#define SSL_CTX_enable_pq_experiment_signal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_enable_pq_experiment_signal) +#define SSL_CTX_enable_signed_cert_timestamps BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_enable_signed_cert_timestamps) +#define SSL_CTX_enable_tls_channel_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_enable_tls_channel_id) +#define SSL_CTX_flush_sessions BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_flush_sessions) +#define SSL_CTX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_free) +#define SSL_CTX_get0_certificate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get0_certificate) +#define SSL_CTX_get0_chain_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get0_chain_certs) +#define SSL_CTX_get0_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get0_param) +#define SSL_CTX_get0_privatekey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get0_privatekey) +#define SSL_CTX_get_cert_store BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_cert_store) +#define SSL_CTX_get_channel_id_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_channel_id_cb) +#define SSL_CTX_get_ciphers BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_ciphers) +#define SSL_CTX_get_client_CA_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_client_CA_list) +#define SSL_CTX_get_default_passwd_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_default_passwd_cb) +#define SSL_CTX_get_default_passwd_cb_userdata BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_default_passwd_cb_userdata) +#define SSL_CTX_get_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_ex_data) +#define SSL_CTX_get_ex_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_ex_new_index) +#define SSL_CTX_get_extra_chain_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_extra_chain_certs) +#define SSL_CTX_get_info_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_info_callback) +#define SSL_CTX_get_keylog_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_keylog_callback) +#define SSL_CTX_get_max_cert_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_max_cert_list) +#define SSL_CTX_get_max_proto_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_max_proto_version) +#define SSL_CTX_get_min_proto_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_min_proto_version) +#define SSL_CTX_get_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_mode) +#define SSL_CTX_get_options BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_options) +#define SSL_CTX_get_quiet_shutdown BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_quiet_shutdown) +#define SSL_CTX_get_read_ahead BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_read_ahead) +#define SSL_CTX_get_session_cache_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_session_cache_mode) +#define SSL_CTX_get_timeout BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_timeout) +#define SSL_CTX_get_tlsext_ticket_keys BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_tlsext_ticket_keys) +#define SSL_CTX_get_verify_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_verify_callback) +#define SSL_CTX_get_verify_depth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_verify_depth) +#define SSL_CTX_get_verify_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_verify_mode) +#define SSL_CTX_load_verify_locations BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_load_verify_locations) +#define SSL_CTX_need_tmp_RSA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_need_tmp_RSA) +#define SSL_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_new) +#define SSL_CTX_remove_session BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_remove_session) +#define SSL_CTX_sess_accept BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_accept) +#define SSL_CTX_sess_accept_good BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_accept_good) +#define SSL_CTX_sess_accept_renegotiate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_accept_renegotiate) +#define SSL_CTX_sess_cache_full BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_cache_full) +#define SSL_CTX_sess_cb_hits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_cb_hits) +#define SSL_CTX_sess_connect BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_connect) +#define SSL_CTX_sess_connect_good BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_connect_good) +#define SSL_CTX_sess_connect_renegotiate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_connect_renegotiate) +#define SSL_CTX_sess_get_cache_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_get_cache_size) +#define SSL_CTX_sess_get_get_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_get_get_cb) +#define SSL_CTX_sess_get_new_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_get_new_cb) +#define SSL_CTX_sess_get_remove_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_get_remove_cb) +#define SSL_CTX_sess_hits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_hits) +#define SSL_CTX_sess_misses BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_misses) +#define SSL_CTX_sess_number BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_number) +#define SSL_CTX_sess_set_cache_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_set_cache_size) +#define SSL_CTX_sess_set_get_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_set_get_cb) +#define SSL_CTX_sess_set_new_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_set_new_cb) +#define SSL_CTX_sess_set_remove_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_set_remove_cb) +#define SSL_CTX_sess_timeouts BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_timeouts) +#define SSL_CTX_set0_buffer_pool BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set0_buffer_pool) +#define SSL_CTX_set0_chain BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set0_chain) +#define SSL_CTX_set0_client_CAs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set0_client_CAs) +#define SSL_CTX_set0_verify_cert_store BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set0_verify_cert_store) +#define SSL_CTX_set1_chain BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set1_chain) +#define SSL_CTX_set1_curves BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set1_curves) +#define SSL_CTX_set1_curves_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set1_curves_list) +#define SSL_CTX_set1_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set1_param) +#define SSL_CTX_set1_sigalgs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set1_sigalgs) +#define SSL_CTX_set1_sigalgs_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set1_sigalgs_list) +#define SSL_CTX_set1_tls_channel_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set1_tls_channel_id) +#define SSL_CTX_set1_verify_cert_store BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set1_verify_cert_store) +#define SSL_CTX_set_allow_unknown_alpn_protos BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_allow_unknown_alpn_protos) +#define SSL_CTX_set_alpn_protos BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_alpn_protos) +#define SSL_CTX_set_alpn_select_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_alpn_select_cb) +#define SSL_CTX_set_cert_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_cert_cb) +#define SSL_CTX_set_cert_store BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_cert_store) +#define SSL_CTX_set_cert_verify_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_cert_verify_callback) +#define SSL_CTX_set_chain_and_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_chain_and_key) +#define SSL_CTX_set_channel_id_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_channel_id_cb) +#define SSL_CTX_set_cipher_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_cipher_list) +#define SSL_CTX_set_client_CA_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_client_CA_list) +#define SSL_CTX_set_client_cert_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_client_cert_cb) +#define SSL_CTX_set_current_time_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_current_time_cb) +#define SSL_CTX_set_custom_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_custom_verify) +#define SSL_CTX_set_default_passwd_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_default_passwd_cb) +#define SSL_CTX_set_default_passwd_cb_userdata BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_default_passwd_cb_userdata) +#define SSL_CTX_set_default_verify_paths BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_default_verify_paths) +#define SSL_CTX_set_dos_protection_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_dos_protection_cb) +#define SSL_CTX_set_early_data_enabled BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_early_data_enabled) +#define SSL_CTX_set_ed25519_enabled BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_ed25519_enabled) +#define SSL_CTX_set_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_ex_data) +#define SSL_CTX_set_false_start_allowed_without_alpn BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_false_start_allowed_without_alpn) +#define SSL_CTX_set_grease_enabled BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_grease_enabled) +#define SSL_CTX_set_ignore_tls13_downgrade BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_ignore_tls13_downgrade) +#define SSL_CTX_set_info_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_info_callback) +#define SSL_CTX_set_keylog_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_keylog_callback) +#define SSL_CTX_set_max_cert_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_max_cert_list) +#define SSL_CTX_set_max_proto_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_max_proto_version) +#define SSL_CTX_set_max_send_fragment BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_max_send_fragment) +#define SSL_CTX_set_min_proto_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_min_proto_version) +#define SSL_CTX_set_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_mode) +#define SSL_CTX_set_msg_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_msg_callback) +#define SSL_CTX_set_msg_callback_arg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_msg_callback_arg) +#define SSL_CTX_set_next_proto_select_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_next_proto_select_cb) +#define SSL_CTX_set_next_protos_advertised_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_next_protos_advertised_cb) +#define SSL_CTX_set_ocsp_response BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_ocsp_response) +#define SSL_CTX_set_options BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_options) +#define SSL_CTX_set_private_key_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_private_key_method) +#define SSL_CTX_set_psk_client_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_psk_client_callback) +#define SSL_CTX_set_psk_server_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_psk_server_callback) +#define SSL_CTX_set_purpose BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_purpose) +#define SSL_CTX_set_quic_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_quic_method) +#define SSL_CTX_set_quiet_shutdown BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_quiet_shutdown) +#define SSL_CTX_set_read_ahead BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_read_ahead) +#define SSL_CTX_set_retain_only_sha256_of_client_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_retain_only_sha256_of_client_certs) +#define SSL_CTX_set_reverify_on_resume BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_reverify_on_resume) +#define SSL_CTX_set_rsa_pss_rsae_certs_enabled BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_rsa_pss_rsae_certs_enabled) +#define SSL_CTX_set_select_certificate_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_select_certificate_cb) +#define SSL_CTX_set_session_cache_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_session_cache_mode) +#define SSL_CTX_set_session_id_context BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_session_id_context) +#define SSL_CTX_set_session_psk_dhe_timeout BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_session_psk_dhe_timeout) +#define SSL_CTX_set_signed_cert_timestamp_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_signed_cert_timestamp_list) +#define SSL_CTX_set_signing_algorithm_prefs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_signing_algorithm_prefs) +#define SSL_CTX_set_srtp_profiles BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_srtp_profiles) +#define SSL_CTX_set_strict_cipher_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_strict_cipher_list) +#define SSL_CTX_set_ticket_aead_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_ticket_aead_method) +#define SSL_CTX_set_timeout BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_timeout) +#define SSL_CTX_set_tls_channel_id_enabled BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_tls_channel_id_enabled) +#define SSL_CTX_set_tlsext_servername_arg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_tlsext_servername_arg) +#define SSL_CTX_set_tlsext_servername_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_tlsext_servername_callback) +#define SSL_CTX_set_tlsext_status_arg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_tlsext_status_arg) +#define SSL_CTX_set_tlsext_status_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_tlsext_status_cb) +#define SSL_CTX_set_tlsext_ticket_key_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_tlsext_ticket_key_cb) +#define SSL_CTX_set_tlsext_ticket_keys BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_tlsext_ticket_keys) +#define SSL_CTX_set_tlsext_use_srtp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_tlsext_use_srtp) +#define SSL_CTX_set_tmp_dh BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_tmp_dh) +#define SSL_CTX_set_tmp_dh_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_tmp_dh_callback) +#define SSL_CTX_set_tmp_ecdh BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_tmp_ecdh) +#define SSL_CTX_set_tmp_rsa BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_tmp_rsa) +#define SSL_CTX_set_tmp_rsa_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_tmp_rsa_callback) +#define SSL_CTX_set_trust BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_trust) +#define SSL_CTX_set_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_verify) +#define SSL_CTX_set_verify_algorithm_prefs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_verify_algorithm_prefs) +#define SSL_CTX_set_verify_depth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_verify_depth) +#define SSL_CTX_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_up_ref) +#define SSL_CTX_use_PrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_use_PrivateKey) +#define SSL_CTX_use_PrivateKey_ASN1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_use_PrivateKey_ASN1) +#define SSL_CTX_use_PrivateKey_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_use_PrivateKey_file) +#define SSL_CTX_use_RSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_use_RSAPrivateKey) +#define SSL_CTX_use_RSAPrivateKey_ASN1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_use_RSAPrivateKey_ASN1) +#define SSL_CTX_use_RSAPrivateKey_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_use_RSAPrivateKey_file) +#define SSL_CTX_use_certificate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_use_certificate) +#define SSL_CTX_use_certificate_ASN1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_use_certificate_ASN1) +#define SSL_CTX_use_certificate_chain_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_use_certificate_chain_file) +#define SSL_CTX_use_certificate_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_use_certificate_file) +#define SSL_CTX_use_psk_identity_hint BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_use_psk_identity_hint) +#define SSL_SESSION_early_data_capable BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_early_data_capable) +#define SSL_SESSION_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_free) +#define SSL_SESSION_from_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_from_bytes) +#define SSL_SESSION_get0_cipher BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get0_cipher) +#define SSL_SESSION_get0_id_context BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get0_id_context) +#define SSL_SESSION_get0_ocsp_response BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get0_ocsp_response) +#define SSL_SESSION_get0_peer BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get0_peer) +#define SSL_SESSION_get0_peer_certificates BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get0_peer_certificates) +#define SSL_SESSION_get0_peer_sha256 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get0_peer_sha256) +#define SSL_SESSION_get0_signed_cert_timestamp_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get0_signed_cert_timestamp_list) +#define SSL_SESSION_get0_ticket BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get0_ticket) +#define SSL_SESSION_get_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get_ex_data) +#define SSL_SESSION_get_ex_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get_ex_new_index) +#define SSL_SESSION_get_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get_id) +#define SSL_SESSION_get_master_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get_master_key) +#define SSL_SESSION_get_protocol_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get_protocol_version) +#define SSL_SESSION_get_ticket_lifetime_hint BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get_ticket_lifetime_hint) +#define SSL_SESSION_get_time BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get_time) +#define SSL_SESSION_get_timeout BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get_timeout) +#define SSL_SESSION_get_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get_version) +#define SSL_SESSION_has_peer_sha256 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_has_peer_sha256) +#define SSL_SESSION_has_ticket BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_has_ticket) +#define SSL_SESSION_is_resumable BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_is_resumable) +#define SSL_SESSION_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_new) +#define SSL_SESSION_set1_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_set1_id) +#define SSL_SESSION_set1_id_context BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_set1_id_context) +#define SSL_SESSION_set_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_set_ex_data) +#define SSL_SESSION_set_protocol_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_set_protocol_version) +#define SSL_SESSION_set_ticket BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_set_ticket) +#define SSL_SESSION_set_time BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_set_time) +#define SSL_SESSION_set_timeout BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_set_timeout) +#define SSL_SESSION_should_be_single_use BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_should_be_single_use) +#define SSL_SESSION_to_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_to_bytes) +#define SSL_SESSION_to_bytes_for_ticket BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_to_bytes_for_ticket) +#define SSL_SESSION_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_up_ref) +#define SSL_accept BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_accept) +#define SSL_add0_chain_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_add0_chain_cert) +#define SSL_add1_chain_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_add1_chain_cert) +#define SSL_add_client_CA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_add_client_CA) +#define SSL_add_file_cert_subjects_to_stack BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_add_file_cert_subjects_to_stack) +#define SSL_alert_desc_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_alert_desc_string) +#define SSL_alert_desc_string_long BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_alert_desc_string_long) +#define SSL_alert_from_verify_result BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_alert_from_verify_result) +#define SSL_alert_type_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_alert_type_string) +#define SSL_alert_type_string_long BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_alert_type_string_long) +#define SSL_cache_hit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_cache_hit) +#define SSL_certs_clear BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_certs_clear) +#define SSL_check_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_check_private_key) +#define SSL_clear BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_clear) +#define SSL_clear_chain_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_clear_chain_certs) +#define SSL_clear_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_clear_mode) +#define SSL_clear_options BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_clear_options) +#define SSL_connect BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_connect) +#define SSL_cutthrough_complete BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_cutthrough_complete) +#define SSL_delegated_credential_used BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_delegated_credential_used) +#define SSL_do_handshake BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_do_handshake) +#define SSL_dup_CA_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_dup_CA_list) +#define SSL_early_callback_ctx_extension_get BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_early_callback_ctx_extension_get) +#define SSL_early_data_accepted BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_early_data_accepted) +#define SSL_enable_ocsp_stapling BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_enable_ocsp_stapling) +#define SSL_enable_signed_cert_timestamps BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_enable_signed_cert_timestamps) +#define SSL_enable_tls_channel_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_enable_tls_channel_id) +#define SSL_error_description BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_error_description) +#define SSL_export_keying_material BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_export_keying_material) +#define SSL_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_free) +#define SSL_generate_key_block BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_generate_key_block) +#define SSL_get0_alpn_selected BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get0_alpn_selected) +#define SSL_get0_certificate_types BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get0_certificate_types) +#define SSL_get0_chain_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get0_chain_certs) +#define SSL_get0_next_proto_negotiated BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get0_next_proto_negotiated) +#define SSL_get0_ocsp_response BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get0_ocsp_response) +#define SSL_get0_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get0_param) +#define SSL_get0_peer_certificates BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get0_peer_certificates) +#define SSL_get0_peer_verify_algorithms BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get0_peer_verify_algorithms) +#define SSL_get0_server_requested_CAs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get0_server_requested_CAs) +#define SSL_get0_session_id_context BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get0_session_id_context) +#define SSL_get0_signed_cert_timestamp_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get0_signed_cert_timestamp_list) +#define SSL_get1_session BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get1_session) +#define SSL_get_SSL_CTX BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_SSL_CTX) +#define SSL_get_certificate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_certificate) +#define SSL_get_cipher_by_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_cipher_by_value) +#define SSL_get_cipher_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_cipher_list) +#define SSL_get_ciphers BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_ciphers) +#define SSL_get_client_CA_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_client_CA_list) +#define SSL_get_client_random BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_client_random) +#define SSL_get_current_cipher BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_current_cipher) +#define SSL_get_current_compression BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_current_compression) +#define SSL_get_current_expansion BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_current_expansion) +#define SSL_get_curve_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_curve_id) +#define SSL_get_curve_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_curve_name) +#define SSL_get_default_timeout BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_default_timeout) +#define SSL_get_early_data_reason BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_early_data_reason) +#define SSL_get_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_error) +#define SSL_get_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_ex_data) +#define SSL_get_ex_data_X509_STORE_CTX_idx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_ex_data_X509_STORE_CTX_idx) +#define SSL_get_ex_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_ex_new_index) +#define SSL_get_extms_support BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_extms_support) +#define SSL_get_fd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_fd) +#define SSL_get_finished BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_finished) +#define SSL_get_info_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_info_callback) +#define SSL_get_ivs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_ivs) +#define SSL_get_key_block_len BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_key_block_len) +#define SSL_get_max_cert_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_max_cert_list) +#define SSL_get_max_proto_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_max_proto_version) +#define SSL_get_min_proto_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_min_proto_version) +#define SSL_get_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_mode) +#define SSL_get_negotiated_token_binding_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_negotiated_token_binding_param) +#define SSL_get_options BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_options) +#define SSL_get_peer_cert_chain BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_peer_cert_chain) +#define SSL_get_peer_certificate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_peer_certificate) +#define SSL_get_peer_finished BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_peer_finished) +#define SSL_get_peer_full_cert_chain BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_peer_full_cert_chain) +#define SSL_get_peer_quic_transport_params BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_peer_quic_transport_params) +#define SSL_get_peer_signature_algorithm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_peer_signature_algorithm) +#define SSL_get_pending_cipher BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_pending_cipher) +#define SSL_get_privatekey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_privatekey) +#define SSL_get_psk_identity BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_psk_identity) +#define SSL_get_psk_identity_hint BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_psk_identity_hint) +#define SSL_get_quiet_shutdown BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_quiet_shutdown) +#define SSL_get_rbio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_rbio) +#define SSL_get_read_ahead BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_read_ahead) +#define SSL_get_read_sequence BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_read_sequence) +#define SSL_get_rfd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_rfd) +#define SSL_get_secure_renegotiation_support BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_secure_renegotiation_support) +#define SSL_get_selected_srtp_profile BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_selected_srtp_profile) +#define SSL_get_server_random BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_server_random) +#define SSL_get_server_tmp_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_server_tmp_key) +#define SSL_get_servername BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_servername) +#define SSL_get_servername_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_servername_type) +#define SSL_get_session BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_session) +#define SSL_get_shared_ciphers BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_shared_ciphers) +#define SSL_get_shutdown BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_shutdown) +#define SSL_get_signature_algorithm_digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_signature_algorithm_digest) +#define SSL_get_signature_algorithm_key_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_signature_algorithm_key_type) +#define SSL_get_signature_algorithm_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_signature_algorithm_name) +#define SSL_get_srtp_profiles BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_srtp_profiles) +#define SSL_get_ticket_age_skew BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_ticket_age_skew) +#define SSL_get_tls_channel_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_tls_channel_id) +#define SSL_get_tls_unique BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_tls_unique) +#define SSL_get_tlsext_status_ocsp_resp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_tlsext_status_ocsp_resp) +#define SSL_get_tlsext_status_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_tlsext_status_type) +#define SSL_get_verify_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_verify_callback) +#define SSL_get_verify_depth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_verify_depth) +#define SSL_get_verify_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_verify_mode) +#define SSL_get_verify_result BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_verify_result) +#define SSL_get_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_version) +#define SSL_get_wbio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_wbio) +#define SSL_get_wfd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_wfd) +#define SSL_get_write_sequence BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_write_sequence) +#define SSL_in_early_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_in_early_data) +#define SSL_in_false_start BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_in_false_start) +#define SSL_in_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_in_init) +#define SSL_is_dtls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_is_dtls) +#define SSL_is_init_finished BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_is_init_finished) +#define SSL_is_server BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_is_server) +#define SSL_is_signature_algorithm_rsa_pss BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_is_signature_algorithm_rsa_pss) +#define SSL_is_tls13_downgrade BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_is_tls13_downgrade) +#define SSL_is_token_binding_negotiated BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_is_token_binding_negotiated) +#define SSL_key_update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_key_update) +#define SSL_library_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_library_init) +#define SSL_load_client_CA_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_load_client_CA_file) +#define SSL_load_error_strings BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_load_error_strings) +#define SSL_magic_pending_session_ptr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_magic_pending_session_ptr) +#define SSL_max_seal_overhead BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_max_seal_overhead) +#define SSL_need_tmp_RSA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_need_tmp_RSA) +#define SSL_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_new) +#define SSL_num_renegotiations BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_num_renegotiations) +#define SSL_peek BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_peek) +#define SSL_pending BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_pending) +#define SSL_pq_experiment_signal_seen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_pq_experiment_signal_seen) +#define SSL_process_quic_post_handshake BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_process_quic_post_handshake) +#define SSL_provide_quic_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_provide_quic_data) +#define SSL_quic_max_handshake_flight_len BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_quic_max_handshake_flight_len) +#define SSL_quic_read_level BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_quic_read_level) +#define SSL_quic_write_level BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_quic_write_level) +#define SSL_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_read) +#define SSL_renegotiate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_renegotiate) +#define SSL_renegotiate_pending BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_renegotiate_pending) +#define SSL_reset_early_data_reject BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_reset_early_data_reject) +#define SSL_select_next_proto BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_select_next_proto) +#define SSL_send_fatal_alert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_send_fatal_alert) +#define SSL_session_reused BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_session_reused) +#define SSL_set0_chain BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set0_chain) +#define SSL_set0_client_CAs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set0_client_CAs) +#define SSL_set0_rbio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set0_rbio) +#define SSL_set0_verify_cert_store BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set0_verify_cert_store) +#define SSL_set0_wbio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set0_wbio) +#define SSL_set1_chain BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set1_chain) +#define SSL_set1_curves BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set1_curves) +#define SSL_set1_curves_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set1_curves_list) +#define SSL_set1_delegated_credential BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set1_delegated_credential) +#define SSL_set1_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set1_param) +#define SSL_set1_sigalgs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set1_sigalgs) +#define SSL_set1_sigalgs_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set1_sigalgs_list) +#define SSL_set1_tls_channel_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set1_tls_channel_id) +#define SSL_set1_verify_cert_store BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set1_verify_cert_store) +#define SSL_set_SSL_CTX BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_SSL_CTX) +#define SSL_set_accept_state BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_accept_state) +#define SSL_set_alpn_protos BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_alpn_protos) +#define SSL_set_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_bio) +#define SSL_set_cert_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_cert_cb) +#define SSL_set_chain_and_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_chain_and_key) +#define SSL_set_cipher_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_cipher_list) +#define SSL_set_client_CA_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_client_CA_list) +#define SSL_set_connect_state BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_connect_state) +#define SSL_set_custom_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_custom_verify) +#define SSL_set_early_data_enabled BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_early_data_enabled) +#define SSL_set_enforce_rsa_key_usage BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_enforce_rsa_key_usage) +#define SSL_set_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_ex_data) +#define SSL_set_fd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_fd) +#define SSL_set_ignore_tls13_downgrade BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_ignore_tls13_downgrade) +#define SSL_set_info_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_info_callback) +#define SSL_set_jdk11_workaround BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_jdk11_workaround) +#define SSL_set_max_cert_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_max_cert_list) +#define SSL_set_max_proto_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_max_proto_version) +#define SSL_set_max_send_fragment BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_max_send_fragment) +#define SSL_set_min_proto_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_min_proto_version) +#define SSL_set_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_mode) +#define SSL_set_msg_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_msg_callback) +#define SSL_set_msg_callback_arg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_msg_callback_arg) +#define SSL_set_mtu BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_mtu) +#define SSL_set_ocsp_response BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_ocsp_response) +#define SSL_set_options BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_options) +#define SSL_set_private_key_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_private_key_method) +#define SSL_set_psk_client_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_psk_client_callback) +#define SSL_set_psk_server_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_psk_server_callback) +#define SSL_set_purpose BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_purpose) +#define SSL_set_quic_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_quic_method) +#define SSL_set_quic_transport_params BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_quic_transport_params) +#define SSL_set_quiet_shutdown BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_quiet_shutdown) +#define SSL_set_read_ahead BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_read_ahead) +#define SSL_set_renegotiate_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_renegotiate_mode) +#define SSL_set_retain_only_sha256_of_client_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_retain_only_sha256_of_client_certs) +#define SSL_set_rfd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_rfd) +#define SSL_set_session BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_session) +#define SSL_set_session_id_context BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_session_id_context) +#define SSL_set_shed_handshake_config BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_shed_handshake_config) +#define SSL_set_shutdown BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_shutdown) +#define SSL_set_signed_cert_timestamp_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_signed_cert_timestamp_list) +#define SSL_set_signing_algorithm_prefs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_signing_algorithm_prefs) +#define SSL_set_srtp_profiles BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_srtp_profiles) +#define SSL_set_state BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_state) +#define SSL_set_strict_cipher_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_strict_cipher_list) +#define SSL_set_tls_channel_id_enabled BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_tls_channel_id_enabled) +#define SSL_set_tlsext_host_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_tlsext_host_name) +#define SSL_set_tlsext_status_ocsp_resp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_tlsext_status_ocsp_resp) +#define SSL_set_tlsext_status_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_tlsext_status_type) +#define SSL_set_tlsext_use_srtp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_tlsext_use_srtp) +#define SSL_set_tmp_dh BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_tmp_dh) +#define SSL_set_tmp_dh_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_tmp_dh_callback) +#define SSL_set_tmp_ecdh BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_tmp_ecdh) +#define SSL_set_tmp_rsa BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_tmp_rsa) +#define SSL_set_tmp_rsa_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_tmp_rsa_callback) +#define SSL_set_token_binding_params BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_token_binding_params) +#define SSL_set_trust BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_trust) +#define SSL_set_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_verify) +#define SSL_set_verify_depth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_verify_depth) +#define SSL_set_verify_result BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_verify_result) +#define SSL_set_wfd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_wfd) +#define SSL_shutdown BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_shutdown) +#define SSL_state BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_state) +#define SSL_state_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_state_string) +#define SSL_state_string_long BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_state_string_long) +#define SSL_total_renegotiations BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_total_renegotiations) +#define SSL_use_PrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_use_PrivateKey) +#define SSL_use_PrivateKey_ASN1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_use_PrivateKey_ASN1) +#define SSL_use_PrivateKey_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_use_PrivateKey_file) +#define SSL_use_RSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_use_RSAPrivateKey) +#define SSL_use_RSAPrivateKey_ASN1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_use_RSAPrivateKey_ASN1) +#define SSL_use_RSAPrivateKey_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_use_RSAPrivateKey_file) +#define SSL_use_certificate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_use_certificate) +#define SSL_use_certificate_ASN1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_use_certificate_ASN1) +#define SSL_use_certificate_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_use_certificate_file) +#define SSL_use_psk_identity_hint BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_use_psk_identity_hint) +#define SSL_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_version) +#define SSL_want BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_want) +#define SSL_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_write) +#define SSLv23_client_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSLv23_client_method) +#define SSLv23_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSLv23_method) +#define SSLv23_server_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSLv23_server_method) +#define TLS_client_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TLS_client_method) +#define TLS_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TLS_method) +#define TLS_server_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TLS_server_method) +#define TLS_with_buffers_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TLS_with_buffers_method) +#define TLSv1_1_client_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TLSv1_1_client_method) +#define TLSv1_1_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TLSv1_1_method) +#define TLSv1_1_server_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TLSv1_1_server_method) +#define TLSv1_2_client_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TLSv1_2_client_method) +#define TLSv1_2_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TLSv1_2_method) +#define TLSv1_2_server_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TLSv1_2_server_method) +#define TLSv1_client_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TLSv1_client_method) +#define TLSv1_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TLSv1_method) +#define TLSv1_server_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TLSv1_server_method) +#define d2i_SSL_SESSION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_SSL_SESSION) +#define d2i_SSL_SESSION_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_SSL_SESSION_bio) +#define i2d_SSL_SESSION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_SSL_SESSION) +#define i2d_SSL_SESSION_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_SSL_SESSION_bio) +#define sk_CRYPTO_BUFFER_call_copy_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_CRYPTO_BUFFER_call_copy_func) +#define sk_CRYPTO_BUFFER_call_free_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_CRYPTO_BUFFER_call_free_func) +#define sk_CRYPTO_BUFFER_deep_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_CRYPTO_BUFFER_deep_copy) +#define sk_CRYPTO_BUFFER_new_null BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_CRYPTO_BUFFER_new_null) +#define sk_CRYPTO_BUFFER_num BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_CRYPTO_BUFFER_num) +#define sk_CRYPTO_BUFFER_push BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_CRYPTO_BUFFER_push) +#define sk_CRYPTO_BUFFER_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_CRYPTO_BUFFER_set) +#define sk_CRYPTO_BUFFER_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_CRYPTO_BUFFER_value) +#define sk_SRTP_PROTECTION_PROFILE_new_null BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_SRTP_PROTECTION_PROFILE_new_null) +#define sk_SRTP_PROTECTION_PROFILE_num BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_SRTP_PROTECTION_PROFILE_num) +#define sk_SRTP_PROTECTION_PROFILE_push BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_SRTP_PROTECTION_PROFILE_push) +#define sk_SSL_CIPHER_call_cmp_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_SSL_CIPHER_call_cmp_func) +#define sk_SSL_CIPHER_delete BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_SSL_CIPHER_delete) +#define sk_SSL_CIPHER_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_SSL_CIPHER_dup) +#define sk_SSL_CIPHER_find BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_SSL_CIPHER_find) +#define sk_SSL_CIPHER_new_null BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_SSL_CIPHER_new_null) +#define sk_SSL_CIPHER_num BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_SSL_CIPHER_num) +#define sk_SSL_CIPHER_push BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_SSL_CIPHER_push) +#define sk_SSL_CIPHER_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_SSL_CIPHER_value) +#define sk_X509_NAME_call_cmp_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_NAME_call_cmp_func) +#define sk_X509_NAME_call_copy_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_NAME_call_copy_func) +#define sk_X509_NAME_call_free_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_NAME_call_free_func) +#define sk_X509_NAME_deep_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_NAME_deep_copy) +#define sk_X509_NAME_find BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_NAME_find) +#define sk_X509_NAME_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_NAME_free) +#define sk_X509_NAME_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_NAME_new) +#define sk_X509_NAME_new_null BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_NAME_new_null) +#define sk_X509_NAME_pop_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_NAME_pop_free) +#define sk_X509_NAME_push BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_NAME_push) +#define sk_X509_NAME_set_cmp_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_NAME_set_cmp_func) +#define sk_X509_NAME_sort BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_NAME_sort) +#define sk_X509_call_free_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_call_free_func) +#define sk_X509_new_null BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_new_null) +#define sk_X509_num BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_num) +#define sk_X509_pop_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_pop_free) +#define sk_X509_shift BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_shift) +#define sk_X509_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_value) +#define ACCESS_DESCRIPTION_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ACCESS_DESCRIPTION_free) +#define ACCESS_DESCRIPTION_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ACCESS_DESCRIPTION_it) +#define ACCESS_DESCRIPTION_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ACCESS_DESCRIPTION_new) +#define AES_CMAC BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AES_CMAC) +#define AES_cbc_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AES_cbc_encrypt) +#define AES_cfb128_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AES_cfb128_encrypt) +#define AES_ctr128_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AES_ctr128_encrypt) +#define AES_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AES_decrypt) +#define AES_ecb_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AES_ecb_encrypt) +#define AES_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AES_encrypt) +#define AES_ofb128_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AES_ofb128_encrypt) +#define AES_set_decrypt_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AES_set_decrypt_key) +#define AES_set_encrypt_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AES_set_encrypt_key) +#define AES_unwrap_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AES_unwrap_key) +#define AES_unwrap_key_padded BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AES_unwrap_key_padded) +#define AES_wrap_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AES_wrap_key) +#define AES_wrap_key_padded BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AES_wrap_key_padded) +#define ASN1_ANY_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_ANY_it) +#define ASN1_BIT_STRING_check BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_BIT_STRING_check) +#define ASN1_BIT_STRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_BIT_STRING_free) +#define ASN1_BIT_STRING_get_bit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_BIT_STRING_get_bit) +#define ASN1_BIT_STRING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_BIT_STRING_it) +#define ASN1_BIT_STRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_BIT_STRING_new) +#define ASN1_BIT_STRING_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_BIT_STRING_set) +#define ASN1_BIT_STRING_set_bit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_BIT_STRING_set_bit) +#define ASN1_BMPSTRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_BMPSTRING_free) +#define ASN1_BMPSTRING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_BMPSTRING_it) +#define ASN1_BMPSTRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_BMPSTRING_new) +#define ASN1_BOOLEAN_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_BOOLEAN_it) +#define ASN1_ENUMERATED_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_ENUMERATED_free) +#define ASN1_ENUMERATED_get BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_ENUMERATED_get) +#define ASN1_ENUMERATED_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_ENUMERATED_it) +#define ASN1_ENUMERATED_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_ENUMERATED_new) +#define ASN1_ENUMERATED_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_ENUMERATED_set) +#define ASN1_ENUMERATED_to_BN BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_ENUMERATED_to_BN) +#define ASN1_FBOOLEAN_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_FBOOLEAN_it) +#define ASN1_GENERALIZEDTIME_adj BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_GENERALIZEDTIME_adj) +#define ASN1_GENERALIZEDTIME_check BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_GENERALIZEDTIME_check) +#define ASN1_GENERALIZEDTIME_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_GENERALIZEDTIME_free) +#define ASN1_GENERALIZEDTIME_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_GENERALIZEDTIME_it) +#define ASN1_GENERALIZEDTIME_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_GENERALIZEDTIME_new) +#define ASN1_GENERALIZEDTIME_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_GENERALIZEDTIME_print) +#define ASN1_GENERALIZEDTIME_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_GENERALIZEDTIME_set) +#define ASN1_GENERALIZEDTIME_set_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_GENERALIZEDTIME_set_string) +#define ASN1_GENERALSTRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_GENERALSTRING_free) +#define ASN1_GENERALSTRING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_GENERALSTRING_it) +#define ASN1_GENERALSTRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_GENERALSTRING_new) +#define ASN1_IA5STRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_IA5STRING_free) +#define ASN1_IA5STRING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_IA5STRING_it) +#define ASN1_IA5STRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_IA5STRING_new) +#define ASN1_INTEGER_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_INTEGER_cmp) +#define ASN1_INTEGER_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_INTEGER_dup) +#define ASN1_INTEGER_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_INTEGER_free) +#define ASN1_INTEGER_get BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_INTEGER_get) +#define ASN1_INTEGER_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_INTEGER_it) +#define ASN1_INTEGER_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_INTEGER_new) +#define ASN1_INTEGER_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_INTEGER_set) +#define ASN1_INTEGER_set_uint64 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_INTEGER_set_uint64) +#define ASN1_INTEGER_to_BN BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_INTEGER_to_BN) +#define ASN1_NULL_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_NULL_free) +#define ASN1_NULL_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_NULL_it) +#define ASN1_NULL_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_NULL_new) +#define ASN1_OBJECT_create BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_OBJECT_create) +#define ASN1_OBJECT_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_OBJECT_free) +#define ASN1_OBJECT_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_OBJECT_it) +#define ASN1_OBJECT_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_OBJECT_new) +#define ASN1_OCTET_STRING_NDEF_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_OCTET_STRING_NDEF_it) +#define ASN1_OCTET_STRING_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_OCTET_STRING_cmp) +#define ASN1_OCTET_STRING_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_OCTET_STRING_dup) +#define ASN1_OCTET_STRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_OCTET_STRING_free) +#define ASN1_OCTET_STRING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_OCTET_STRING_it) +#define ASN1_OCTET_STRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_OCTET_STRING_new) +#define ASN1_OCTET_STRING_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_OCTET_STRING_set) +#define ASN1_PRINTABLESTRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_PRINTABLESTRING_free) +#define ASN1_PRINTABLESTRING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_PRINTABLESTRING_it) +#define ASN1_PRINTABLESTRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_PRINTABLESTRING_new) +#define ASN1_PRINTABLE_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_PRINTABLE_free) +#define ASN1_PRINTABLE_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_PRINTABLE_it) +#define ASN1_PRINTABLE_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_PRINTABLE_new) +#define ASN1_PRINTABLE_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_PRINTABLE_type) +#define ASN1_SEQUENCE_ANY_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_SEQUENCE_ANY_it) +#define ASN1_SEQUENCE_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_SEQUENCE_it) +#define ASN1_SET_ANY_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_SET_ANY_it) +#define ASN1_STRING_TABLE_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_TABLE_add) +#define ASN1_STRING_TABLE_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_TABLE_cleanup) +#define ASN1_STRING_TABLE_get BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_TABLE_get) +#define ASN1_STRING_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_cmp) +#define ASN1_STRING_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_copy) +#define ASN1_STRING_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_data) +#define ASN1_STRING_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_dup) +#define ASN1_STRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_free) +#define ASN1_STRING_get0_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_get0_data) +#define ASN1_STRING_get_default_mask BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_get_default_mask) +#define ASN1_STRING_length BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_length) +#define ASN1_STRING_length_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_length_set) +#define ASN1_STRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_new) +#define ASN1_STRING_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_print) +#define ASN1_STRING_print_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_print_ex) +#define ASN1_STRING_print_ex_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_print_ex_fp) +#define ASN1_STRING_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_set) +#define ASN1_STRING_set0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_set0) +#define ASN1_STRING_set_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_set_by_NID) +#define ASN1_STRING_set_default_mask BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_set_default_mask) +#define ASN1_STRING_set_default_mask_asc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_set_default_mask_asc) +#define ASN1_STRING_to_UTF8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_to_UTF8) +#define ASN1_STRING_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_type) +#define ASN1_STRING_type_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_type_new) +#define ASN1_T61STRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_T61STRING_free) +#define ASN1_T61STRING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_T61STRING_it) +#define ASN1_T61STRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_T61STRING_new) +#define ASN1_TBOOLEAN_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TBOOLEAN_it) +#define ASN1_TIME_adj BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TIME_adj) +#define ASN1_TIME_check BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TIME_check) +#define ASN1_TIME_diff BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TIME_diff) +#define ASN1_TIME_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TIME_free) +#define ASN1_TIME_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TIME_it) +#define ASN1_TIME_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TIME_new) +#define ASN1_TIME_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TIME_print) +#define ASN1_TIME_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TIME_set) +#define ASN1_TIME_set_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TIME_set_string) +#define ASN1_TIME_to_generalizedtime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TIME_to_generalizedtime) +#define ASN1_TYPE_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TYPE_cmp) +#define ASN1_TYPE_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TYPE_free) +#define ASN1_TYPE_get BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TYPE_get) +#define ASN1_TYPE_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TYPE_new) +#define ASN1_TYPE_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TYPE_set) +#define ASN1_TYPE_set1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TYPE_set1) +#define ASN1_UNIVERSALSTRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_UNIVERSALSTRING_free) +#define ASN1_UNIVERSALSTRING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_UNIVERSALSTRING_it) +#define ASN1_UNIVERSALSTRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_UNIVERSALSTRING_new) +#define ASN1_UTCTIME_adj BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_UTCTIME_adj) +#define ASN1_UTCTIME_check BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_UTCTIME_check) +#define ASN1_UTCTIME_cmp_time_t BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_UTCTIME_cmp_time_t) +#define ASN1_UTCTIME_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_UTCTIME_free) +#define ASN1_UTCTIME_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_UTCTIME_it) +#define ASN1_UTCTIME_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_UTCTIME_new) +#define ASN1_UTCTIME_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_UTCTIME_print) +#define ASN1_UTCTIME_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_UTCTIME_set) +#define ASN1_UTCTIME_set_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_UTCTIME_set_string) +#define ASN1_UTF8STRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_UTF8STRING_free) +#define ASN1_UTF8STRING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_UTF8STRING_it) +#define ASN1_UTF8STRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_UTF8STRING_new) +#define ASN1_VISIBLESTRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_VISIBLESTRING_free) +#define ASN1_VISIBLESTRING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_VISIBLESTRING_it) +#define ASN1_VISIBLESTRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_VISIBLESTRING_new) +#define ASN1_digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_digest) +#define ASN1_generate_nconf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_generate_nconf) +#define ASN1_generate_v3 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_generate_v3) +#define ASN1_get_object BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_get_object) +#define ASN1_item_d2i BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_d2i) +#define ASN1_item_d2i_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_d2i_bio) +#define ASN1_item_d2i_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_d2i_fp) +#define ASN1_item_digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_digest) +#define ASN1_item_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_dup) +#define ASN1_item_ex_d2i BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_ex_d2i) +#define ASN1_item_ex_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_ex_free) +#define ASN1_item_ex_i2d BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_ex_i2d) +#define ASN1_item_ex_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_ex_new) +#define ASN1_item_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_free) +#define ASN1_item_i2d BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_i2d) +#define ASN1_item_i2d_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_i2d_bio) +#define ASN1_item_i2d_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_i2d_fp) +#define ASN1_item_ndef_i2d BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_ndef_i2d) +#define ASN1_item_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_new) +#define ASN1_item_pack BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_pack) +#define ASN1_item_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_sign) +#define ASN1_item_sign_ctx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_sign_ctx) +#define ASN1_item_unpack BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_unpack) +#define ASN1_item_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_verify) +#define ASN1_mbstring_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_mbstring_copy) +#define ASN1_mbstring_ncopy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_mbstring_ncopy) +#define ASN1_object_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_object_size) +#define ASN1_primitive_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_primitive_free) +#define ASN1_primitive_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_primitive_new) +#define ASN1_put_eoc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_put_eoc) +#define ASN1_put_object BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_put_object) +#define ASN1_tag2bit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_tag2bit) +#define ASN1_tag2str BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_tag2str) +#define ASN1_template_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_template_free) +#define ASN1_template_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_template_new) +#define AUTHORITY_INFO_ACCESS_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AUTHORITY_INFO_ACCESS_free) +#define AUTHORITY_INFO_ACCESS_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AUTHORITY_INFO_ACCESS_it) +#define AUTHORITY_INFO_ACCESS_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AUTHORITY_INFO_ACCESS_new) +#define AUTHORITY_KEYID_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AUTHORITY_KEYID_free) +#define AUTHORITY_KEYID_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AUTHORITY_KEYID_it) +#define AUTHORITY_KEYID_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AUTHORITY_KEYID_new) +#define BASIC_CONSTRAINTS_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BASIC_CONSTRAINTS_free) +#define BASIC_CONSTRAINTS_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BASIC_CONSTRAINTS_it) +#define BASIC_CONSTRAINTS_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BASIC_CONSTRAINTS_new) +#define BIO_append_filename BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_append_filename) +#define BIO_callback_ctrl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_callback_ctrl) +#define BIO_clear_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_clear_flags) +#define BIO_clear_retry_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_clear_retry_flags) +#define BIO_copy_next_retry BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_copy_next_retry) +#define BIO_ctrl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_ctrl) +#define BIO_ctrl_get_read_request BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_ctrl_get_read_request) +#define BIO_ctrl_get_write_guarantee BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_ctrl_get_write_guarantee) +#define BIO_ctrl_pending BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_ctrl_pending) +#define BIO_do_connect BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_do_connect) +#define BIO_eof BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_eof) +#define BIO_find_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_find_type) +#define BIO_flush BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_flush) +#define BIO_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_free) +#define BIO_free_all BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_free_all) +#define BIO_get_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_get_data) +#define BIO_get_fd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_get_fd) +#define BIO_get_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_get_fp) +#define BIO_get_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_get_init) +#define BIO_get_mem_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_get_mem_data) +#define BIO_get_mem_ptr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_get_mem_ptr) +#define BIO_get_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_get_new_index) +#define BIO_get_retry_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_get_retry_flags) +#define BIO_get_retry_reason BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_get_retry_reason) +#define BIO_get_shutdown BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_get_shutdown) +#define BIO_gets BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_gets) +#define BIO_hexdump BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_hexdump) +#define BIO_indent BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_indent) +#define BIO_int_ctrl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_int_ctrl) +#define BIO_mem_contents BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_mem_contents) +#define BIO_meth_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_meth_free) +#define BIO_meth_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_meth_new) +#define BIO_meth_set_create BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_meth_set_create) +#define BIO_meth_set_ctrl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_meth_set_ctrl) +#define BIO_meth_set_destroy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_meth_set_destroy) +#define BIO_meth_set_gets BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_meth_set_gets) +#define BIO_meth_set_puts BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_meth_set_puts) +#define BIO_meth_set_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_meth_set_read) +#define BIO_meth_set_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_meth_set_write) +#define BIO_method_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_method_type) +#define BIO_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_new) +#define BIO_new_bio_pair BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_new_bio_pair) +#define BIO_new_connect BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_new_connect) +#define BIO_new_fd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_new_fd) +#define BIO_new_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_new_file) +#define BIO_new_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_new_fp) +#define BIO_new_mem_buf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_new_mem_buf) +#define BIO_new_socket BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_new_socket) +#define BIO_next BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_next) +#define BIO_number_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_number_read) +#define BIO_number_written BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_number_written) +#define BIO_pending BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_pending) +#define BIO_pop BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_pop) +#define BIO_printf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_printf) +#define BIO_ptr_ctrl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_ptr_ctrl) +#define BIO_push BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_push) +#define BIO_puts BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_puts) +#define BIO_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_read) +#define BIO_read_asn1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_read_asn1) +#define BIO_read_filename BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_read_filename) +#define BIO_reset BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_reset) +#define BIO_rw_filename BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_rw_filename) +#define BIO_s_connect BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_s_connect) +#define BIO_s_fd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_s_fd) +#define BIO_s_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_s_file) +#define BIO_s_mem BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_s_mem) +#define BIO_s_socket BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_s_socket) +#define BIO_set_close BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_close) +#define BIO_set_conn_hostname BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_conn_hostname) +#define BIO_set_conn_int_port BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_conn_int_port) +#define BIO_set_conn_port BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_conn_port) +#define BIO_set_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_data) +#define BIO_set_fd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_fd) +#define BIO_set_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_flags) +#define BIO_set_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_fp) +#define BIO_set_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_init) +#define BIO_set_mem_buf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_mem_buf) +#define BIO_set_mem_eof_return BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_mem_eof_return) +#define BIO_set_nbio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_nbio) +#define BIO_set_retry_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_retry_read) +#define BIO_set_retry_special BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_retry_special) +#define BIO_set_retry_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_retry_write) +#define BIO_set_shutdown BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_shutdown) +#define BIO_set_write_buffer_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_write_buffer_size) +#define BIO_should_io_special BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_should_io_special) +#define BIO_should_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_should_read) +#define BIO_should_retry BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_should_retry) +#define BIO_should_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_should_write) +#define BIO_shutdown_wr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_shutdown_wr) +#define BIO_snprintf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_snprintf) +#define BIO_test_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_test_flags) +#define BIO_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_up_ref) +#define BIO_vfree BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_vfree) +#define BIO_vsnprintf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_vsnprintf) +#define BIO_wpending BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_wpending) +#define BIO_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_write) +#define BIO_write_all BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_write_all) +#define BIO_write_filename BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_write_filename) +#define BN_BLINDING_convert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_BLINDING_convert) +#define BN_BLINDING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_BLINDING_free) +#define BN_BLINDING_invert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_BLINDING_invert) +#define BN_BLINDING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_BLINDING_new) +#define BN_CTX_end BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_CTX_end) +#define BN_CTX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_CTX_free) +#define BN_CTX_get BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_CTX_get) +#define BN_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_CTX_new) +#define BN_CTX_start BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_CTX_start) +#define BN_GENCB_call BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_GENCB_call) +#define BN_GENCB_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_GENCB_set) +#define BN_MONT_CTX_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_MONT_CTX_copy) +#define BN_MONT_CTX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_MONT_CTX_free) +#define BN_MONT_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_MONT_CTX_new) +#define BN_MONT_CTX_new_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_MONT_CTX_new_consttime) +#define BN_MONT_CTX_new_for_modulus BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_MONT_CTX_new_for_modulus) +#define BN_MONT_CTX_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_MONT_CTX_set) +#define BN_MONT_CTX_set_locked BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_MONT_CTX_set_locked) +#define BN_abs_is_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_abs_is_word) +#define BN_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_add) +#define BN_add_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_add_word) +#define BN_asc2bn BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_asc2bn) +#define BN_bin2bn BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_bin2bn) +#define BN_bn2bin BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_bn2bin) +#define BN_bn2bin_padded BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_bn2bin_padded) +#define BN_bn2binpad BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_bn2binpad) +#define BN_bn2cbb_padded BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_bn2cbb_padded) +#define BN_bn2dec BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_bn2dec) +#define BN_bn2hex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_bn2hex) +#define BN_bn2le_padded BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_bn2le_padded) +#define BN_bn2mpi BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_bn2mpi) +#define BN_clear BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_clear) +#define BN_clear_bit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_clear_bit) +#define BN_clear_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_clear_free) +#define BN_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_cmp) +#define BN_cmp_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_cmp_word) +#define BN_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_copy) +#define BN_count_low_zero_bits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_count_low_zero_bits) +#define BN_dec2bn BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_dec2bn) +#define BN_div BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_div) +#define BN_div_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_div_word) +#define BN_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_dup) +#define BN_enhanced_miller_rabin_primality_test BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_enhanced_miller_rabin_primality_test) +#define BN_equal_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_equal_consttime) +#define BN_exp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_exp) +#define BN_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_free) +#define BN_from_montgomery BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_from_montgomery) +#define BN_gcd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_gcd) +#define BN_generate_prime_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_generate_prime_ex) +#define BN_get_rfc3526_prime_1536 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_get_rfc3526_prime_1536) +#define BN_get_u64 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_get_u64) +#define BN_get_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_get_word) +#define BN_hex2bn BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_hex2bn) +#define BN_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_init) +#define BN_is_bit_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_is_bit_set) +#define BN_is_negative BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_is_negative) +#define BN_is_odd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_is_odd) +#define BN_is_one BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_is_one) +#define BN_is_pow2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_is_pow2) +#define BN_is_prime_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_is_prime_ex) +#define BN_is_prime_fasttest_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_is_prime_fasttest_ex) +#define BN_is_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_is_word) +#define BN_is_zero BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_is_zero) +#define BN_le2bn BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_le2bn) +#define BN_lshift BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_lshift) +#define BN_lshift1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_lshift1) +#define BN_marshal_asn1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_marshal_asn1) +#define BN_mask_bits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mask_bits) +#define BN_mod_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_add) +#define BN_mod_add_quick BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_add_quick) +#define BN_mod_exp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_exp) +#define BN_mod_exp2_mont BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_exp2_mont) +#define BN_mod_exp_mont BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_exp_mont) +#define BN_mod_exp_mont_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_exp_mont_consttime) +#define BN_mod_exp_mont_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_exp_mont_word) +#define BN_mod_inverse BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_inverse) +#define BN_mod_inverse_blinded BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_inverse_blinded) +#define BN_mod_inverse_odd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_inverse_odd) +#define BN_mod_lshift BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_lshift) +#define BN_mod_lshift1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_lshift1) +#define BN_mod_lshift1_quick BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_lshift1_quick) +#define BN_mod_lshift_quick BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_lshift_quick) +#define BN_mod_mul BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_mul) +#define BN_mod_mul_montgomery BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_mul_montgomery) +#define BN_mod_pow2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_pow2) +#define BN_mod_sqr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_sqr) +#define BN_mod_sqrt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_sqrt) +#define BN_mod_sub BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_sub) +#define BN_mod_sub_quick BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_sub_quick) +#define BN_mod_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_word) +#define BN_mpi2bn BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mpi2bn) +#define BN_mul BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mul) +#define BN_mul_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mul_word) +#define BN_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_new) +#define BN_nnmod BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_nnmod) +#define BN_nnmod_pow2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_nnmod_pow2) +#define BN_num_bits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_num_bits) +#define BN_num_bits_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_num_bits_word) +#define BN_num_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_num_bytes) +#define BN_one BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_one) +#define BN_parse_asn1_unsigned BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_parse_asn1_unsigned) +#define BN_primality_test BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_primality_test) +#define BN_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_print) +#define BN_print_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_print_fp) +#define BN_pseudo_rand BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_pseudo_rand) +#define BN_pseudo_rand_range BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_pseudo_rand_range) +#define BN_rand BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_rand) +#define BN_rand_range BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_rand_range) +#define BN_rand_range_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_rand_range_ex) +#define BN_rshift BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_rshift) +#define BN_rshift1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_rshift1) +#define BN_set_bit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_set_bit) +#define BN_set_negative BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_set_negative) +#define BN_set_u64 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_set_u64) +#define BN_set_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_set_word) +#define BN_sqr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_sqr) +#define BN_sqrt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_sqrt) +#define BN_sub BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_sub) +#define BN_sub_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_sub_word) +#define BN_to_ASN1_ENUMERATED BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_to_ASN1_ENUMERATED) +#define BN_to_ASN1_INTEGER BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_to_ASN1_INTEGER) +#define BN_to_montgomery BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_to_montgomery) +#define BN_uadd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_uadd) +#define BN_ucmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_ucmp) +#define BN_usub BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_usub) +#define BN_value_one BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_value_one) +#define BN_zero BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_zero) +#define BORINGSSL_function_hit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BORINGSSL_function_hit) +#define BORINGSSL_self_test BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BORINGSSL_self_test) +#define BUF_MEM_append BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BUF_MEM_append) +#define BUF_MEM_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BUF_MEM_free) +#define BUF_MEM_grow BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BUF_MEM_grow) +#define BUF_MEM_grow_clean BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BUF_MEM_grow_clean) +#define BUF_MEM_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BUF_MEM_new) +#define BUF_MEM_reserve BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BUF_MEM_reserve) +#define BUF_memdup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BUF_memdup) +#define BUF_strdup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BUF_strdup) +#define BUF_strlcat BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BUF_strlcat) +#define BUF_strlcpy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BUF_strlcpy) +#define BUF_strndup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BUF_strndup) +#define BUF_strnlen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BUF_strnlen) +#define CBB_add_asn1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_asn1) +#define CBB_add_asn1_bool BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_asn1_bool) +#define CBB_add_asn1_octet_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_asn1_octet_string) +#define CBB_add_asn1_oid_from_text BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_asn1_oid_from_text) +#define CBB_add_asn1_uint64 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_asn1_uint64) +#define CBB_add_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_bytes) +#define CBB_add_space BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_space) +#define CBB_add_u16 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_u16) +#define CBB_add_u16_length_prefixed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_u16_length_prefixed) +#define CBB_add_u24 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_u24) +#define CBB_add_u24_length_prefixed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_u24_length_prefixed) +#define CBB_add_u32 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_u32) +#define CBB_add_u64 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_u64) +#define CBB_add_u8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_u8) +#define CBB_add_u8_length_prefixed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_u8_length_prefixed) +#define CBB_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_cleanup) +#define CBB_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_data) +#define CBB_did_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_did_write) +#define CBB_discard_child BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_discard_child) +#define CBB_finish BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_finish) +#define CBB_finish_i2d BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_finish_i2d) +#define CBB_flush BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_flush) +#define CBB_flush_asn1_set_of BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_flush_asn1_set_of) +#define CBB_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_init) +#define CBB_init_fixed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_init_fixed) +#define CBB_len BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_len) +#define CBB_reserve BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_reserve) +#define CBB_zero BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_zero) +#define CBS_asn1_ber_to_der BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_asn1_ber_to_der) +#define CBS_asn1_bitstring_has_bit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_asn1_bitstring_has_bit) +#define CBS_asn1_oid_to_text BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_asn1_oid_to_text) +#define CBS_contains_zero_byte BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_contains_zero_byte) +#define CBS_copy_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_copy_bytes) +#define CBS_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_data) +#define CBS_get_any_asn1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_any_asn1) +#define CBS_get_any_asn1_element BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_any_asn1_element) +#define CBS_get_any_ber_asn1_element BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_any_ber_asn1_element) +#define CBS_get_asn1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_asn1) +#define CBS_get_asn1_bool BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_asn1_bool) +#define CBS_get_asn1_element BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_asn1_element) +#define CBS_get_asn1_implicit_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_asn1_implicit_string) +#define CBS_get_asn1_uint64 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_asn1_uint64) +#define CBS_get_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_bytes) +#define CBS_get_last_u8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_last_u8) +#define CBS_get_optional_asn1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_optional_asn1) +#define CBS_get_optional_asn1_bool BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_optional_asn1_bool) +#define CBS_get_optional_asn1_octet_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_optional_asn1_octet_string) +#define CBS_get_optional_asn1_uint64 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_optional_asn1_uint64) +#define CBS_get_u16 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_u16) +#define CBS_get_u16_length_prefixed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_u16_length_prefixed) +#define CBS_get_u24 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_u24) +#define CBS_get_u24_length_prefixed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_u24_length_prefixed) +#define CBS_get_u32 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_u32) +#define CBS_get_u64 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_u64) +#define CBS_get_u8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_u8) +#define CBS_get_u8_length_prefixed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_u8_length_prefixed) +#define CBS_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_init) +#define CBS_is_valid_asn1_bitstring BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_is_valid_asn1_bitstring) +#define CBS_len BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_len) +#define CBS_mem_equal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_mem_equal) +#define CBS_peek_asn1_tag BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_peek_asn1_tag) +#define CBS_skip BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_skip) +#define CBS_stow BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_stow) +#define CBS_strdup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_strdup) +#define CERTIFICATEPOLICIES_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CERTIFICATEPOLICIES_free) +#define CERTIFICATEPOLICIES_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CERTIFICATEPOLICIES_it) +#define CERTIFICATEPOLICIES_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CERTIFICATEPOLICIES_new) +#define CMAC_CTX_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CMAC_CTX_copy) +#define CMAC_CTX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CMAC_CTX_free) +#define CMAC_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CMAC_CTX_new) +#define CMAC_Final BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CMAC_Final) +#define CMAC_Init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CMAC_Init) +#define CMAC_Reset BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CMAC_Reset) +#define CMAC_Update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CMAC_Update) +#define CONF_VALUE_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CONF_VALUE_new) +#define CONF_modules_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CONF_modules_free) +#define CONF_modules_load_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CONF_modules_load_file) +#define CONF_parse_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CONF_parse_list) +#define CRL_DIST_POINTS_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRL_DIST_POINTS_free) +#define CRL_DIST_POINTS_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRL_DIST_POINTS_it) +#define CRL_DIST_POINTS_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRL_DIST_POINTS_new) +#define CRYPTO_BUFFER_POOL_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_BUFFER_POOL_free) +#define CRYPTO_BUFFER_POOL_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_BUFFER_POOL_new) +#define CRYPTO_BUFFER_alloc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_BUFFER_alloc) +#define CRYPTO_BUFFER_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_BUFFER_data) +#define CRYPTO_BUFFER_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_BUFFER_free) +#define CRYPTO_BUFFER_init_CBS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_BUFFER_init_CBS) +#define CRYPTO_BUFFER_len BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_BUFFER_len) +#define CRYPTO_BUFFER_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_BUFFER_new) +#define CRYPTO_BUFFER_new_from_CBS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_BUFFER_new_from_CBS) +#define CRYPTO_BUFFER_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_BUFFER_up_ref) +#define CRYPTO_MUTEX_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_MUTEX_cleanup) +#define CRYPTO_MUTEX_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_MUTEX_init) +#define CRYPTO_MUTEX_lock_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_MUTEX_lock_read) +#define CRYPTO_MUTEX_lock_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_MUTEX_lock_write) +#define CRYPTO_MUTEX_unlock_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_MUTEX_unlock_read) +#define CRYPTO_MUTEX_unlock_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_MUTEX_unlock_write) +#define CRYPTO_POLYVAL_finish BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_POLYVAL_finish) +#define CRYPTO_POLYVAL_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_POLYVAL_init) +#define CRYPTO_POLYVAL_update_blocks BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_POLYVAL_update_blocks) +#define CRYPTO_STATIC_MUTEX_lock_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_STATIC_MUTEX_lock_read) +#define CRYPTO_STATIC_MUTEX_lock_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_STATIC_MUTEX_lock_write) +#define CRYPTO_STATIC_MUTEX_unlock_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_STATIC_MUTEX_unlock_read) +#define CRYPTO_STATIC_MUTEX_unlock_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_STATIC_MUTEX_unlock_write) +#define CRYPTO_THREADID_current BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_THREADID_current) +#define CRYPTO_THREADID_set_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_THREADID_set_callback) +#define CRYPTO_THREADID_set_numeric BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_THREADID_set_numeric) +#define CRYPTO_THREADID_set_pointer BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_THREADID_set_pointer) +#define CRYPTO_cbc128_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_cbc128_decrypt) +#define CRYPTO_cbc128_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_cbc128_encrypt) +#define CRYPTO_cfb128_1_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_cfb128_1_encrypt) +#define CRYPTO_cfb128_8_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_cfb128_8_encrypt) +#define CRYPTO_cfb128_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_cfb128_encrypt) +#define CRYPTO_chacha_20 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_chacha_20) +#define CRYPTO_cleanup_all_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_cleanup_all_ex_data) +#define CRYPTO_ctr128_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_ctr128_encrypt) +#define CRYPTO_ctr128_encrypt_ctr32 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_ctr128_encrypt_ctr32) +#define CRYPTO_free_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_free_ex_data) +#define CRYPTO_gcm128_aad BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_gcm128_aad) +#define CRYPTO_gcm128_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_gcm128_decrypt) +#define CRYPTO_gcm128_decrypt_ctr32 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_gcm128_decrypt_ctr32) +#define CRYPTO_gcm128_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_gcm128_encrypt) +#define CRYPTO_gcm128_encrypt_ctr32 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_gcm128_encrypt_ctr32) +#define CRYPTO_gcm128_finish BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_gcm128_finish) +#define CRYPTO_gcm128_init_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_gcm128_init_key) +#define CRYPTO_gcm128_setiv BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_gcm128_setiv) +#define CRYPTO_gcm128_tag BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_gcm128_tag) +#define CRYPTO_get_dynlock_create_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_get_dynlock_create_callback) +#define CRYPTO_get_dynlock_destroy_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_get_dynlock_destroy_callback) +#define CRYPTO_get_dynlock_lock_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_get_dynlock_lock_callback) +#define CRYPTO_get_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_get_ex_data) +#define CRYPTO_get_ex_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_get_ex_new_index) +#define CRYPTO_get_lock_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_get_lock_name) +#define CRYPTO_get_locking_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_get_locking_callback) +#define CRYPTO_get_thread_local BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_get_thread_local) +#define CRYPTO_ghash_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_ghash_init) +#define CRYPTO_has_asm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_has_asm) +#define CRYPTO_hchacha20 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_hchacha20) +#define CRYPTO_is_confidential_build BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_is_confidential_build) +#define CRYPTO_library_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_library_init) +#define CRYPTO_malloc_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_malloc_init) +#define CRYPTO_memcmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_memcmp) +#define CRYPTO_new_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_new_ex_data) +#define CRYPTO_num_locks BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_num_locks) +#define CRYPTO_ofb128_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_ofb128_encrypt) +#define CRYPTO_once BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_once) +#define CRYPTO_poly1305_finish BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_poly1305_finish) +#define CRYPTO_poly1305_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_poly1305_init) +#define CRYPTO_poly1305_update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_poly1305_update) +#define CRYPTO_rdrand BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_rdrand) +#define CRYPTO_rdrand_multiple8_buf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_rdrand_multiple8_buf) +#define CRYPTO_refcount_dec_and_test_zero BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_refcount_dec_and_test_zero) +#define CRYPTO_refcount_inc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_refcount_inc) +#define CRYPTO_set_add_lock_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_set_add_lock_callback) +#define CRYPTO_set_dynlock_create_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_set_dynlock_create_callback) +#define CRYPTO_set_dynlock_destroy_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_set_dynlock_destroy_callback) +#define CRYPTO_set_dynlock_lock_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_set_dynlock_lock_callback) +#define CRYPTO_set_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_set_ex_data) +#define CRYPTO_set_id_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_set_id_callback) +#define CRYPTO_set_locking_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_set_locking_callback) +#define CRYPTO_set_thread_local BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_set_thread_local) +#define CRYPTO_sysrand BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_sysrand) +#define CRYPTO_tls1_prf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_tls1_prf) +#define CTR_DRBG_clear BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CTR_DRBG_clear) +#define CTR_DRBG_generate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CTR_DRBG_generate) +#define CTR_DRBG_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CTR_DRBG_init) +#define CTR_DRBG_reseed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CTR_DRBG_reseed) +#define ChaCha20_ctr32 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ChaCha20_ctr32) +#define DES_decrypt3 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DES_decrypt3) +#define DES_ecb3_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DES_ecb3_encrypt) +#define DES_ecb_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DES_ecb_encrypt) +#define DES_ede2_cbc_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DES_ede2_cbc_encrypt) +#define DES_ede3_cbc_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DES_ede3_cbc_encrypt) +#define DES_encrypt3 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DES_encrypt3) +#define DES_ncbc_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DES_ncbc_encrypt) +#define DES_set_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DES_set_key) +#define DES_set_key_unchecked BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DES_set_key_unchecked) +#define DES_set_odd_parity BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DES_set_odd_parity) +#define DH_check BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_check) +#define DH_check_pub_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_check_pub_key) +#define DH_compute_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_compute_key) +#define DH_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_free) +#define DH_generate_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_generate_key) +#define DH_generate_parameters_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_generate_parameters_ex) +#define DH_get0_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_get0_key) +#define DH_get0_pqg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_get0_pqg) +#define DH_get_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_get_ex_data) +#define DH_get_ex_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_get_ex_new_index) +#define DH_marshal_parameters BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_marshal_parameters) +#define DH_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_new) +#define DH_num_bits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_num_bits) +#define DH_parse_parameters BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_parse_parameters) +#define DH_set0_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_set0_key) +#define DH_set0_pqg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_set0_pqg) +#define DH_set_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_set_ex_data) +#define DH_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_size) +#define DH_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_up_ref) +#define DHparams_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DHparams_dup) +#define DIRECTORYSTRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DIRECTORYSTRING_free) +#define DIRECTORYSTRING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DIRECTORYSTRING_it) +#define DIRECTORYSTRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DIRECTORYSTRING_new) +#define DISPLAYTEXT_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DISPLAYTEXT_free) +#define DISPLAYTEXT_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DISPLAYTEXT_it) +#define DISPLAYTEXT_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DISPLAYTEXT_new) +#define DIST_POINT_NAME_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DIST_POINT_NAME_free) +#define DIST_POINT_NAME_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DIST_POINT_NAME_it) +#define DIST_POINT_NAME_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DIST_POINT_NAME_new) +#define DIST_POINT_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DIST_POINT_free) +#define DIST_POINT_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DIST_POINT_it) +#define DIST_POINT_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DIST_POINT_new) +#define DIST_POINT_set_dpname BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DIST_POINT_set_dpname) +#define DSA_SIG_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_SIG_free) +#define DSA_SIG_marshal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_SIG_marshal) +#define DSA_SIG_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_SIG_new) +#define DSA_SIG_parse BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_SIG_parse) +#define DSA_check_signature BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_check_signature) +#define DSA_do_check_signature BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_do_check_signature) +#define DSA_do_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_do_sign) +#define DSA_do_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_do_verify) +#define DSA_dup_DH BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_dup_DH) +#define DSA_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_free) +#define DSA_generate_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_generate_key) +#define DSA_generate_parameters_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_generate_parameters_ex) +#define DSA_get0_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_get0_key) +#define DSA_get0_pqg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_get0_pqg) +#define DSA_get_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_get_ex_data) +#define DSA_get_ex_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_get_ex_new_index) +#define DSA_marshal_parameters BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_marshal_parameters) +#define DSA_marshal_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_marshal_private_key) +#define DSA_marshal_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_marshal_public_key) +#define DSA_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_new) +#define DSA_parse_parameters BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_parse_parameters) +#define DSA_parse_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_parse_private_key) +#define DSA_parse_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_parse_public_key) +#define DSA_set0_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_set0_key) +#define DSA_set0_pqg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_set0_pqg) +#define DSA_set_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_set_ex_data) +#define DSA_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_sign) +#define DSA_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_size) +#define DSA_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_up_ref) +#define DSA_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_verify) +#define DSAparams_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSAparams_dup) +#define ECDH_compute_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDH_compute_key) +#define ECDH_compute_key_fips BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDH_compute_key_fips) +#define ECDSA_SIG_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDSA_SIG_free) +#define ECDSA_SIG_from_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDSA_SIG_from_bytes) +#define ECDSA_SIG_get0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDSA_SIG_get0) +#define ECDSA_SIG_marshal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDSA_SIG_marshal) +#define ECDSA_SIG_max_len BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDSA_SIG_max_len) +#define ECDSA_SIG_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDSA_SIG_new) +#define ECDSA_SIG_parse BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDSA_SIG_parse) +#define ECDSA_SIG_set0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDSA_SIG_set0) +#define ECDSA_SIG_to_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDSA_SIG_to_bytes) +#define ECDSA_do_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDSA_do_sign) +#define ECDSA_do_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDSA_do_verify) +#define ECDSA_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDSA_sign) +#define ECDSA_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDSA_size) +#define ECDSA_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDSA_verify) +#define EC_GFp_mont_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GFp_mont_method) +#define EC_GFp_nistp224_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GFp_nistp224_method) +#define EC_GFp_nistp256_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GFp_nistp256_method) +#define EC_GFp_nistz256_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GFp_nistz256_method) +#define EC_GROUP_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_cmp) +#define EC_GROUP_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_dup) +#define EC_GROUP_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_free) +#define EC_GROUP_get0_generator BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_get0_generator) +#define EC_GROUP_get0_order BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_get0_order) +#define EC_GROUP_get_cofactor BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_get_cofactor) +#define EC_GROUP_get_curve_GFp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_get_curve_GFp) +#define EC_GROUP_get_curve_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_get_curve_name) +#define EC_GROUP_get_degree BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_get_degree) +#define EC_GROUP_get_order BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_get_order) +#define EC_GROUP_method_of BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_method_of) +#define EC_GROUP_new_by_curve_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_new_by_curve_name) +#define EC_GROUP_new_curve_GFp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_new_curve_GFp) +#define EC_GROUP_order_bits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_order_bits) +#define EC_GROUP_set_asn1_flag BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_set_asn1_flag) +#define EC_GROUP_set_generator BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_set_generator) +#define EC_GROUP_set_point_conversion_form BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_set_point_conversion_form) +#define EC_KEY_check_fips BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_check_fips) +#define EC_KEY_check_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_check_key) +#define EC_KEY_derive_from_secret BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_derive_from_secret) +#define EC_KEY_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_dup) +#define EC_KEY_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_free) +#define EC_KEY_generate_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_generate_key) +#define EC_KEY_generate_key_fips BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_generate_key_fips) +#define EC_KEY_get0_group BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_get0_group) +#define EC_KEY_get0_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_get0_private_key) +#define EC_KEY_get0_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_get0_public_key) +#define EC_KEY_get_conv_form BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_get_conv_form) +#define EC_KEY_get_enc_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_get_enc_flags) +#define EC_KEY_get_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_get_ex_data) +#define EC_KEY_get_ex_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_get_ex_new_index) +#define EC_KEY_is_opaque BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_is_opaque) +#define EC_KEY_key2buf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_key2buf) +#define EC_KEY_marshal_curve_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_marshal_curve_name) +#define EC_KEY_marshal_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_marshal_private_key) +#define EC_KEY_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_new) +#define EC_KEY_new_by_curve_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_new_by_curve_name) +#define EC_KEY_new_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_new_method) +#define EC_KEY_parse_curve_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_parse_curve_name) +#define EC_KEY_parse_parameters BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_parse_parameters) +#define EC_KEY_parse_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_parse_private_key) +#define EC_KEY_set_asn1_flag BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_set_asn1_flag) +#define EC_KEY_set_conv_form BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_set_conv_form) +#define EC_KEY_set_enc_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_set_enc_flags) +#define EC_KEY_set_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_set_ex_data) +#define EC_KEY_set_group BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_set_group) +#define EC_KEY_set_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_set_private_key) +#define EC_KEY_set_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_set_public_key) +#define EC_KEY_set_public_key_affine_coordinates BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_set_public_key_affine_coordinates) +#define EC_KEY_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_up_ref) +#define EC_METHOD_get_field_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_METHOD_get_field_type) +#define EC_POINT_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_add) +#define EC_POINT_clear_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_clear_free) +#define EC_POINT_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_cmp) +#define EC_POINT_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_copy) +#define EC_POINT_dbl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_dbl) +#define EC_POINT_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_dup) +#define EC_POINT_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_free) +#define EC_POINT_get_affine_coordinates_GFp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_get_affine_coordinates_GFp) +#define EC_POINT_invert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_invert) +#define EC_POINT_is_at_infinity BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_is_at_infinity) +#define EC_POINT_is_on_curve BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_is_on_curve) +#define EC_POINT_mul BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_mul) +#define EC_POINT_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_new) +#define EC_POINT_oct2point BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_oct2point) +#define EC_POINT_point2cbb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_point2cbb) +#define EC_POINT_point2oct BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_point2oct) +#define EC_POINT_set_affine_coordinates_GFp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_set_affine_coordinates_GFp) +#define EC_POINT_set_compressed_coordinates_GFp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_set_compressed_coordinates_GFp) +#define EC_POINT_set_to_infinity BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_set_to_infinity) +#define EC_curve_nid2nist BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_curve_nid2nist) +#define EC_curve_nist2nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_curve_nist2nid) +#define EC_get_builtin_curves BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_get_builtin_curves) +#define ED25519_keypair BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ED25519_keypair) +#define ED25519_keypair_from_seed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ED25519_keypair_from_seed) +#define ED25519_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ED25519_sign) +#define ED25519_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ED25519_verify) +#define EDIPARTYNAME_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EDIPARTYNAME_free) +#define EDIPARTYNAME_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EDIPARTYNAME_it) +#define EDIPARTYNAME_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EDIPARTYNAME_new) +#define ENGINE_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ENGINE_free) +#define ENGINE_get_ECDSA_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ENGINE_get_ECDSA_method) +#define ENGINE_get_RSA_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ENGINE_get_RSA_method) +#define ENGINE_load_builtin_engines BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ENGINE_load_builtin_engines) +#define ENGINE_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ENGINE_new) +#define ENGINE_register_all_complete BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ENGINE_register_all_complete) +#define ENGINE_set_ECDSA_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ENGINE_set_ECDSA_method) +#define ENGINE_set_RSA_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ENGINE_set_RSA_method) +#define ERR_SAVE_STATE_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_SAVE_STATE_free) +#define ERR_add_error_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_add_error_data) +#define ERR_add_error_dataf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_add_error_dataf) +#define ERR_clear_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_clear_error) +#define ERR_clear_system_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_clear_system_error) +#define ERR_error_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_error_string) +#define ERR_error_string_n BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_error_string_n) +#define ERR_free_strings BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_free_strings) +#define ERR_func_error_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_func_error_string) +#define ERR_get_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_get_error) +#define ERR_get_error_line BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_get_error_line) +#define ERR_get_error_line_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_get_error_line_data) +#define ERR_get_next_error_library BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_get_next_error_library) +#define ERR_lib_error_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_lib_error_string) +#define ERR_load_BIO_strings BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_load_BIO_strings) +#define ERR_load_ERR_strings BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_load_ERR_strings) +#define ERR_load_RAND_strings BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_load_RAND_strings) +#define ERR_load_crypto_strings BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_load_crypto_strings) +#define ERR_peek_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_peek_error) +#define ERR_peek_error_line BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_peek_error_line) +#define ERR_peek_error_line_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_peek_error_line_data) +#define ERR_peek_last_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_peek_last_error) +#define ERR_peek_last_error_line BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_peek_last_error_line) +#define ERR_peek_last_error_line_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_peek_last_error_line_data) +#define ERR_pop_to_mark BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_pop_to_mark) +#define ERR_print_errors BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_print_errors) +#define ERR_print_errors_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_print_errors_cb) +#define ERR_print_errors_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_print_errors_fp) +#define ERR_put_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_put_error) +#define ERR_reason_error_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_reason_error_string) +#define ERR_remove_state BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_remove_state) +#define ERR_remove_thread_state BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_remove_thread_state) +#define ERR_restore_state BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_restore_state) +#define ERR_save_state BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_save_state) +#define ERR_set_mark BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_set_mark) +#define EVP_AEAD_CTX_aead BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_CTX_aead) +#define EVP_AEAD_CTX_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_CTX_cleanup) +#define EVP_AEAD_CTX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_CTX_free) +#define EVP_AEAD_CTX_get_iv BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_CTX_get_iv) +#define EVP_AEAD_CTX_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_CTX_init) +#define EVP_AEAD_CTX_init_with_direction BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_CTX_init_with_direction) +#define EVP_AEAD_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_CTX_new) +#define EVP_AEAD_CTX_open BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_CTX_open) +#define EVP_AEAD_CTX_open_gather BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_CTX_open_gather) +#define EVP_AEAD_CTX_seal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_CTX_seal) +#define EVP_AEAD_CTX_seal_scatter BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_CTX_seal_scatter) +#define EVP_AEAD_CTX_tag_len BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_CTX_tag_len) +#define EVP_AEAD_CTX_zero BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_CTX_zero) +#define EVP_AEAD_key_length BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_key_length) +#define EVP_AEAD_max_overhead BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_max_overhead) +#define EVP_AEAD_max_tag_len BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_max_tag_len) +#define EVP_AEAD_nonce_length BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_nonce_length) +#define EVP_BytesToKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_BytesToKey) +#define EVP_CIPHER_CTX_block_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_block_size) +#define EVP_CIPHER_CTX_cipher BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_cipher) +#define EVP_CIPHER_CTX_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_cleanup) +#define EVP_CIPHER_CTX_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_copy) +#define EVP_CIPHER_CTX_ctrl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_ctrl) +#define EVP_CIPHER_CTX_encrypting BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_encrypting) +#define EVP_CIPHER_CTX_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_flags) +#define EVP_CIPHER_CTX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_free) +#define EVP_CIPHER_CTX_get_app_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_get_app_data) +#define EVP_CIPHER_CTX_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_init) +#define EVP_CIPHER_CTX_iv_length BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_iv_length) +#define EVP_CIPHER_CTX_key_length BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_key_length) +#define EVP_CIPHER_CTX_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_mode) +#define EVP_CIPHER_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_new) +#define EVP_CIPHER_CTX_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_nid) +#define EVP_CIPHER_CTX_reset BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_reset) +#define EVP_CIPHER_CTX_set_app_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_set_app_data) +#define EVP_CIPHER_CTX_set_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_set_flags) +#define EVP_CIPHER_CTX_set_key_length BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_set_key_length) +#define EVP_CIPHER_CTX_set_padding BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_set_padding) +#define EVP_CIPHER_block_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_block_size) +#define EVP_CIPHER_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_flags) +#define EVP_CIPHER_iv_length BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_iv_length) +#define EVP_CIPHER_key_length BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_key_length) +#define EVP_CIPHER_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_mode) +#define EVP_CIPHER_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_nid) +#define EVP_Cipher BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_Cipher) +#define EVP_CipherFinal_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CipherFinal_ex) +#define EVP_CipherInit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CipherInit) +#define EVP_CipherInit_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CipherInit_ex) +#define EVP_CipherUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CipherUpdate) +#define EVP_DecodeBase64 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DecodeBase64) +#define EVP_DecodeBlock BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DecodeBlock) +#define EVP_DecodeFinal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DecodeFinal) +#define EVP_DecodeInit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DecodeInit) +#define EVP_DecodeUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DecodeUpdate) +#define EVP_DecodedLength BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DecodedLength) +#define EVP_DecryptFinal_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DecryptFinal_ex) +#define EVP_DecryptInit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DecryptInit) +#define EVP_DecryptInit_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DecryptInit_ex) +#define EVP_DecryptUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DecryptUpdate) +#define EVP_Digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_Digest) +#define EVP_DigestFinal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DigestFinal) +#define EVP_DigestFinalXOF BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DigestFinalXOF) +#define EVP_DigestFinal_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DigestFinal_ex) +#define EVP_DigestInit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DigestInit) +#define EVP_DigestInit_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DigestInit_ex) +#define EVP_DigestSign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DigestSign) +#define EVP_DigestSignFinal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DigestSignFinal) +#define EVP_DigestSignInit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DigestSignInit) +#define EVP_DigestSignUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DigestSignUpdate) +#define EVP_DigestUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DigestUpdate) +#define EVP_DigestVerify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DigestVerify) +#define EVP_DigestVerifyFinal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DigestVerifyFinal) +#define EVP_DigestVerifyInit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DigestVerifyInit) +#define EVP_DigestVerifyUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DigestVerifyUpdate) +#define EVP_EncodeBlock BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_EncodeBlock) +#define EVP_EncodeFinal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_EncodeFinal) +#define EVP_EncodeInit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_EncodeInit) +#define EVP_EncodeUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_EncodeUpdate) +#define EVP_EncodedLength BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_EncodedLength) +#define EVP_EncryptFinal_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_EncryptFinal_ex) +#define EVP_EncryptInit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_EncryptInit) +#define EVP_EncryptInit_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_EncryptInit_ex) +#define EVP_EncryptUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_EncryptUpdate) +#define EVP_MD_CTX_block_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_CTX_block_size) +#define EVP_MD_CTX_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_CTX_cleanup) +#define EVP_MD_CTX_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_CTX_copy) +#define EVP_MD_CTX_copy_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_CTX_copy_ex) +#define EVP_MD_CTX_create BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_CTX_create) +#define EVP_MD_CTX_destroy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_CTX_destroy) +#define EVP_MD_CTX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_CTX_free) +#define EVP_MD_CTX_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_CTX_init) +#define EVP_MD_CTX_md BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_CTX_md) +#define EVP_MD_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_CTX_new) +#define EVP_MD_CTX_reset BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_CTX_reset) +#define EVP_MD_CTX_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_CTX_size) +#define EVP_MD_CTX_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_CTX_type) +#define EVP_MD_block_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_block_size) +#define EVP_MD_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_flags) +#define EVP_MD_meth_get_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_meth_get_flags) +#define EVP_MD_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_size) +#define EVP_MD_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_type) +#define EVP_PBE_scrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PBE_scrypt) +#define EVP_PKCS82PKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKCS82PKEY) +#define EVP_PKEY2PKCS8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY2PKCS8) +#define EVP_PKEY_CTX_ctrl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_ctrl) +#define EVP_PKEY_CTX_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_dup) +#define EVP_PKEY_CTX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_free) +#define EVP_PKEY_CTX_get0_pkey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_get0_pkey) +#define EVP_PKEY_CTX_get0_rsa_oaep_label BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_get0_rsa_oaep_label) +#define EVP_PKEY_CTX_get_rsa_mgf1_md BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_get_rsa_mgf1_md) +#define EVP_PKEY_CTX_get_rsa_oaep_md BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_get_rsa_oaep_md) +#define EVP_PKEY_CTX_get_rsa_padding BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_get_rsa_padding) +#define EVP_PKEY_CTX_get_rsa_pss_saltlen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_get_rsa_pss_saltlen) +#define EVP_PKEY_CTX_get_signature_md BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_get_signature_md) +#define EVP_PKEY_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_new) +#define EVP_PKEY_CTX_new_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_new_id) +#define EVP_PKEY_CTX_set0_rsa_oaep_label BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_set0_rsa_oaep_label) +#define EVP_PKEY_CTX_set_ec_param_enc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_set_ec_param_enc) +#define EVP_PKEY_CTX_set_ec_paramgen_curve_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_set_ec_paramgen_curve_nid) +#define EVP_PKEY_CTX_set_rsa_keygen_bits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_set_rsa_keygen_bits) +#define EVP_PKEY_CTX_set_rsa_keygen_pubexp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_set_rsa_keygen_pubexp) +#define EVP_PKEY_CTX_set_rsa_mgf1_md BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_set_rsa_mgf1_md) +#define EVP_PKEY_CTX_set_rsa_oaep_md BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_set_rsa_oaep_md) +#define EVP_PKEY_CTX_set_rsa_padding BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_set_rsa_padding) +#define EVP_PKEY_CTX_set_rsa_pss_saltlen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_set_rsa_pss_saltlen) +#define EVP_PKEY_CTX_set_signature_md BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_set_signature_md) +#define EVP_PKEY_assign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_assign) +#define EVP_PKEY_assign_DSA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_assign_DSA) +#define EVP_PKEY_assign_EC_KEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_assign_EC_KEY) +#define EVP_PKEY_assign_RSA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_assign_RSA) +#define EVP_PKEY_base_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_base_id) +#define EVP_PKEY_bits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_bits) +#define EVP_PKEY_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_cmp) +#define EVP_PKEY_cmp_parameters BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_cmp_parameters) +#define EVP_PKEY_copy_parameters BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_copy_parameters) +#define EVP_PKEY_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_decrypt) +#define EVP_PKEY_decrypt_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_decrypt_init) +#define EVP_PKEY_derive BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_derive) +#define EVP_PKEY_derive_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_derive_init) +#define EVP_PKEY_derive_set_peer BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_derive_set_peer) +#define EVP_PKEY_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_encrypt) +#define EVP_PKEY_encrypt_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_encrypt_init) +#define EVP_PKEY_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_free) +#define EVP_PKEY_get0_DH BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_get0_DH) +#define EVP_PKEY_get0_DSA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_get0_DSA) +#define EVP_PKEY_get0_EC_KEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_get0_EC_KEY) +#define EVP_PKEY_get0_RSA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_get0_RSA) +#define EVP_PKEY_get1_DH BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_get1_DH) +#define EVP_PKEY_get1_DSA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_get1_DSA) +#define EVP_PKEY_get1_EC_KEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_get1_EC_KEY) +#define EVP_PKEY_get1_RSA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_get1_RSA) +#define EVP_PKEY_get1_tls_encodedpoint BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_get1_tls_encodedpoint) +#define EVP_PKEY_get_raw_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_get_raw_private_key) +#define EVP_PKEY_get_raw_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_get_raw_public_key) +#define EVP_PKEY_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_id) +#define EVP_PKEY_is_opaque BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_is_opaque) +#define EVP_PKEY_keygen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_keygen) +#define EVP_PKEY_keygen_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_keygen_init) +#define EVP_PKEY_missing_parameters BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_missing_parameters) +#define EVP_PKEY_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_new) +#define EVP_PKEY_new_raw_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_new_raw_private_key) +#define EVP_PKEY_new_raw_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_new_raw_public_key) +#define EVP_PKEY_paramgen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_paramgen) +#define EVP_PKEY_paramgen_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_paramgen_init) +#define EVP_PKEY_print_params BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_print_params) +#define EVP_PKEY_print_private BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_print_private) +#define EVP_PKEY_print_public BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_print_public) +#define EVP_PKEY_set1_DSA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_set1_DSA) +#define EVP_PKEY_set1_EC_KEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_set1_EC_KEY) +#define EVP_PKEY_set1_RSA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_set1_RSA) +#define EVP_PKEY_set1_tls_encodedpoint BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_set1_tls_encodedpoint) +#define EVP_PKEY_set_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_set_type) +#define EVP_PKEY_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_sign) +#define EVP_PKEY_sign_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_sign_init) +#define EVP_PKEY_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_size) +#define EVP_PKEY_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_type) +#define EVP_PKEY_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_up_ref) +#define EVP_PKEY_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_verify) +#define EVP_PKEY_verify_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_verify_init) +#define EVP_PKEY_verify_recover BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_verify_recover) +#define EVP_PKEY_verify_recover_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_verify_recover_init) +#define EVP_SignFinal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_SignFinal) +#define EVP_SignInit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_SignInit) +#define EVP_SignInit_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_SignInit_ex) +#define EVP_SignUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_SignUpdate) +#define EVP_VerifyFinal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_VerifyFinal) +#define EVP_VerifyInit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_VerifyInit) +#define EVP_VerifyInit_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_VerifyInit_ex) +#define EVP_VerifyUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_VerifyUpdate) +#define EVP_add_cipher_alias BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_add_cipher_alias) +#define EVP_add_digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_add_digest) +#define EVP_aead_aes_128_cbc_sha1_tls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_128_cbc_sha1_tls) +#define EVP_aead_aes_128_cbc_sha1_tls_implicit_iv BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_128_cbc_sha1_tls_implicit_iv) +#define EVP_aead_aes_128_cbc_sha256_tls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_128_cbc_sha256_tls) +#define EVP_aead_aes_128_ccm_bluetooth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_128_ccm_bluetooth) +#define EVP_aead_aes_128_ccm_bluetooth_8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_128_ccm_bluetooth_8) +#define EVP_aead_aes_128_ctr_hmac_sha256 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_128_ctr_hmac_sha256) +#define EVP_aead_aes_128_gcm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_128_gcm) +#define EVP_aead_aes_128_gcm_siv BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_128_gcm_siv) +#define EVP_aead_aes_128_gcm_tls12 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_128_gcm_tls12) +#define EVP_aead_aes_128_gcm_tls13 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_128_gcm_tls13) +#define EVP_aead_aes_192_gcm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_192_gcm) +#define EVP_aead_aes_256_cbc_sha1_tls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_256_cbc_sha1_tls) +#define EVP_aead_aes_256_cbc_sha1_tls_implicit_iv BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_256_cbc_sha1_tls_implicit_iv) +#define EVP_aead_aes_256_cbc_sha256_tls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_256_cbc_sha256_tls) +#define EVP_aead_aes_256_cbc_sha384_tls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_256_cbc_sha384_tls) +#define EVP_aead_aes_256_ctr_hmac_sha256 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_256_ctr_hmac_sha256) +#define EVP_aead_aes_256_gcm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_256_gcm) +#define EVP_aead_aes_256_gcm_siv BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_256_gcm_siv) +#define EVP_aead_aes_256_gcm_tls12 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_256_gcm_tls12) +#define EVP_aead_aes_256_gcm_tls13 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_256_gcm_tls13) +#define EVP_aead_chacha20_poly1305 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_chacha20_poly1305) +#define EVP_aead_des_ede3_cbc_sha1_tls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_des_ede3_cbc_sha1_tls) +#define EVP_aead_des_ede3_cbc_sha1_tls_implicit_iv BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_des_ede3_cbc_sha1_tls_implicit_iv) +#define EVP_aead_null_sha1_tls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_null_sha1_tls) +#define EVP_aead_xchacha20_poly1305 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_xchacha20_poly1305) +#define EVP_aes_128_cbc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_128_cbc) +#define EVP_aes_128_ctr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_128_ctr) +#define EVP_aes_128_ecb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_128_ecb) +#define EVP_aes_128_gcm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_128_gcm) +#define EVP_aes_128_ofb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_128_ofb) +#define EVP_aes_192_cbc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_192_cbc) +#define EVP_aes_192_ctr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_192_ctr) +#define EVP_aes_192_ecb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_192_ecb) +#define EVP_aes_192_gcm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_192_gcm) +#define EVP_aes_192_ofb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_192_ofb) +#define EVP_aes_256_cbc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_256_cbc) +#define EVP_aes_256_ctr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_256_ctr) +#define EVP_aes_256_ecb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_256_ecb) +#define EVP_aes_256_gcm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_256_gcm) +#define EVP_aes_256_ofb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_256_ofb) +#define EVP_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_cleanup) +#define EVP_des_cbc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_des_cbc) +#define EVP_des_ecb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_des_ecb) +#define EVP_des_ede BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_des_ede) +#define EVP_des_ede3 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_des_ede3) +#define EVP_des_ede3_cbc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_des_ede3_cbc) +#define EVP_des_ede3_ecb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_des_ede3_ecb) +#define EVP_des_ede_cbc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_des_ede_cbc) +#define EVP_enc_null BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_enc_null) +#define EVP_get_cipherbyname BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_get_cipherbyname) +#define EVP_get_cipherbynid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_get_cipherbynid) +#define EVP_get_digestbyname BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_get_digestbyname) +#define EVP_get_digestbynid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_get_digestbynid) +#define EVP_get_digestbyobj BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_get_digestbyobj) +#define EVP_has_aes_hardware BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_has_aes_hardware) +#define EVP_marshal_digest_algorithm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_marshal_digest_algorithm) +#define EVP_marshal_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_marshal_private_key) +#define EVP_marshal_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_marshal_public_key) +#define EVP_md4 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_md4) +#define EVP_md5 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_md5) +#define EVP_md5_sha1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_md5_sha1) +#define EVP_parse_digest_algorithm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_parse_digest_algorithm) +#define EVP_parse_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_parse_private_key) +#define EVP_parse_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_parse_public_key) +#define EVP_rc2_40_cbc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_rc2_40_cbc) +#define EVP_rc2_cbc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_rc2_cbc) +#define EVP_rc4 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_rc4) +#define EVP_sha1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_sha1) +#define EVP_sha224 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_sha224) +#define EVP_sha256 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_sha256) +#define EVP_sha384 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_sha384) +#define EVP_sha512 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_sha512) +#define EVP_tls_cbc_copy_mac BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_tls_cbc_copy_mac) +#define EVP_tls_cbc_digest_record BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_tls_cbc_digest_record) +#define EVP_tls_cbc_record_digest_supported BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_tls_cbc_record_digest_supported) +#define EVP_tls_cbc_remove_padding BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_tls_cbc_remove_padding) +#define EXTENDED_KEY_USAGE_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EXTENDED_KEY_USAGE_free) +#define EXTENDED_KEY_USAGE_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EXTENDED_KEY_USAGE_it) +#define EXTENDED_KEY_USAGE_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EXTENDED_KEY_USAGE_new) +#define FIPS_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, FIPS_mode) +#define FIPS_mode_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, FIPS_mode_set) +#define GENERAL_NAMES_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_NAMES_free) +#define GENERAL_NAMES_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_NAMES_it) +#define GENERAL_NAMES_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_NAMES_new) +#define GENERAL_NAME_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_NAME_cmp) +#define GENERAL_NAME_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_NAME_dup) +#define GENERAL_NAME_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_NAME_free) +#define GENERAL_NAME_get0_otherName BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_NAME_get0_otherName) +#define GENERAL_NAME_get0_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_NAME_get0_value) +#define GENERAL_NAME_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_NAME_it) +#define GENERAL_NAME_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_NAME_new) +#define GENERAL_NAME_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_NAME_print) +#define GENERAL_NAME_set0_othername BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_NAME_set0_othername) +#define GENERAL_NAME_set0_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_NAME_set0_value) +#define GENERAL_SUBTREE_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_SUBTREE_free) +#define GENERAL_SUBTREE_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_SUBTREE_it) +#define GENERAL_SUBTREE_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_SUBTREE_new) +#define HKDF BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HKDF) +#define HKDF_expand BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HKDF_expand) +#define HKDF_extract BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HKDF_extract) +#define HMAC BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HMAC) +#define HMAC_CTX_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HMAC_CTX_cleanup) +#define HMAC_CTX_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HMAC_CTX_copy) +#define HMAC_CTX_copy_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HMAC_CTX_copy_ex) +#define HMAC_CTX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HMAC_CTX_free) +#define HMAC_CTX_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HMAC_CTX_init) +#define HMAC_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HMAC_CTX_new) +#define HMAC_CTX_reset BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HMAC_CTX_reset) +#define HMAC_Final BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HMAC_Final) +#define HMAC_Init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HMAC_Init) +#define HMAC_Init_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HMAC_Init_ex) +#define HMAC_Update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HMAC_Update) +#define HMAC_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HMAC_size) +#define HRSS_decap BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HRSS_decap) +#define HRSS_encap BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HRSS_encap) +#define HRSS_generate_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HRSS_generate_key) +#define HRSS_marshal_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HRSS_marshal_public_key) +#define HRSS_parse_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HRSS_parse_public_key) +#define HRSS_poly2_rotr_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HRSS_poly2_rotr_consttime) +#define HRSS_poly3_invert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HRSS_poly3_invert) +#define HRSS_poly3_mul BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HRSS_poly3_mul) +#define ISSUING_DIST_POINT_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ISSUING_DIST_POINT_free) +#define ISSUING_DIST_POINT_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ISSUING_DIST_POINT_it) +#define ISSUING_DIST_POINT_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ISSUING_DIST_POINT_new) +#define MD4 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, MD4) +#define MD4_Final BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, MD4_Final) +#define MD4_Init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, MD4_Init) +#define MD4_Transform BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, MD4_Transform) +#define MD4_Update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, MD4_Update) +#define MD5 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, MD5) +#define MD5_Final BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, MD5_Final) +#define MD5_Init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, MD5_Init) +#define MD5_Transform BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, MD5_Transform) +#define MD5_Update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, MD5_Update) +#define METHOD_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, METHOD_ref) +#define METHOD_unref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, METHOD_unref) +#define NAME_CONSTRAINTS_check BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NAME_CONSTRAINTS_check) +#define NAME_CONSTRAINTS_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NAME_CONSTRAINTS_free) +#define NAME_CONSTRAINTS_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NAME_CONSTRAINTS_it) +#define NAME_CONSTRAINTS_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NAME_CONSTRAINTS_new) +#define NCONF_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NCONF_free) +#define NCONF_get_section BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NCONF_get_section) +#define NCONF_get_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NCONF_get_string) +#define NCONF_load BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NCONF_load) +#define NCONF_load_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NCONF_load_bio) +#define NCONF_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NCONF_new) +#define NETSCAPE_SPKAC_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NETSCAPE_SPKAC_free) +#define NETSCAPE_SPKAC_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NETSCAPE_SPKAC_it) +#define NETSCAPE_SPKAC_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NETSCAPE_SPKAC_new) +#define NETSCAPE_SPKI_b64_decode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NETSCAPE_SPKI_b64_decode) +#define NETSCAPE_SPKI_b64_encode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NETSCAPE_SPKI_b64_encode) +#define NETSCAPE_SPKI_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NETSCAPE_SPKI_free) +#define NETSCAPE_SPKI_get_pubkey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NETSCAPE_SPKI_get_pubkey) +#define NETSCAPE_SPKI_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NETSCAPE_SPKI_it) +#define NETSCAPE_SPKI_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NETSCAPE_SPKI_new) +#define NETSCAPE_SPKI_set_pubkey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NETSCAPE_SPKI_set_pubkey) +#define NETSCAPE_SPKI_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NETSCAPE_SPKI_sign) +#define NETSCAPE_SPKI_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NETSCAPE_SPKI_verify) +#define NOTICEREF_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NOTICEREF_free) +#define NOTICEREF_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NOTICEREF_it) +#define NOTICEREF_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NOTICEREF_new) +#define OBJ_cbs2nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_cbs2nid) +#define OBJ_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_cleanup) +#define OBJ_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_cmp) +#define OBJ_create BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_create) +#define OBJ_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_dup) +#define OBJ_find_sigid_algs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_find_sigid_algs) +#define OBJ_find_sigid_by_algs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_find_sigid_by_algs) +#define OBJ_get0_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_get0_data) +#define OBJ_length BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_length) +#define OBJ_ln2nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_ln2nid) +#define OBJ_nid2cbb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_nid2cbb) +#define OBJ_nid2ln BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_nid2ln) +#define OBJ_nid2obj BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_nid2obj) +#define OBJ_nid2sn BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_nid2sn) +#define OBJ_obj2nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_obj2nid) +#define OBJ_obj2txt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_obj2txt) +#define OBJ_sn2nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_sn2nid) +#define OBJ_txt2nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_txt2nid) +#define OBJ_txt2obj BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_txt2obj) +#define OPENSSL_add_all_algorithms_conf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_add_all_algorithms_conf) +#define OPENSSL_built_in_curves BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_built_in_curves) +#define OPENSSL_cleanse BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_cleanse) +#define OPENSSL_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_cleanup) +#define OPENSSL_clear_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_clear_free) +#define OPENSSL_config BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_config) +#define OPENSSL_cpuid_setup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_cpuid_setup) +#define OPENSSL_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_free) +#define OPENSSL_gmtime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_gmtime) +#define OPENSSL_gmtime_adj BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_gmtime_adj) +#define OPENSSL_gmtime_diff BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_gmtime_diff) +#define OPENSSL_hash32 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_hash32) +#define OPENSSL_ia32cap_P BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_ia32cap_P) +#define OPENSSL_init_crypto BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_init_crypto) +#define OPENSSL_load_builtin_modules BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_load_builtin_modules) +#define OPENSSL_malloc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_malloc) +#define OPENSSL_malloc_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_malloc_init) +#define OPENSSL_no_config BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_no_config) +#define OPENSSL_realloc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_realloc) +#define OPENSSL_strcasecmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_strcasecmp) +#define OPENSSL_strdup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_strdup) +#define OPENSSL_strncasecmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_strncasecmp) +#define OPENSSL_strnlen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_strnlen) +#define OPENSSL_tolower BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_tolower) +#define OTHERNAME_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OTHERNAME_cmp) +#define OTHERNAME_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OTHERNAME_free) +#define OTHERNAME_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OTHERNAME_it) +#define OTHERNAME_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OTHERNAME_new) +#define OpenSSL_add_all_algorithms BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OpenSSL_add_all_algorithms) +#define OpenSSL_add_all_ciphers BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OpenSSL_add_all_ciphers) +#define OpenSSL_add_all_digests BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OpenSSL_add_all_digests) +#define OpenSSL_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OpenSSL_version) +#define OpenSSL_version_num BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OpenSSL_version_num) +#define PEM_ASN1_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_ASN1_read) +#define PEM_ASN1_read_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_ASN1_read_bio) +#define PEM_ASN1_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_ASN1_write) +#define PEM_ASN1_write_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_ASN1_write_bio) +#define PEM_X509_INFO_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_X509_INFO_read) +#define PEM_X509_INFO_read_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_X509_INFO_read_bio) +#define PEM_X509_INFO_write_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_X509_INFO_write_bio) +#define PEM_bytes_read_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_bytes_read_bio) +#define PEM_def_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_def_callback) +#define PEM_dek_info BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_dek_info) +#define PEM_do_header BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_do_header) +#define PEM_get_EVP_CIPHER_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_get_EVP_CIPHER_INFO) +#define PEM_proc_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_proc_type) +#define PEM_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read) +#define PEM_read_DHparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_DHparams) +#define PEM_read_DSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_DSAPrivateKey) +#define PEM_read_DSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_DSA_PUBKEY) +#define PEM_read_DSAparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_DSAparams) +#define PEM_read_ECPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_ECPrivateKey) +#define PEM_read_EC_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_EC_PUBKEY) +#define PEM_read_PKCS7 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_PKCS7) +#define PEM_read_PKCS8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_PKCS8) +#define PEM_read_PKCS8_PRIV_KEY_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_PKCS8_PRIV_KEY_INFO) +#define PEM_read_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_PUBKEY) +#define PEM_read_PrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_PrivateKey) +#define PEM_read_RSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_RSAPrivateKey) +#define PEM_read_RSAPublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_RSAPublicKey) +#define PEM_read_RSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_RSA_PUBKEY) +#define PEM_read_X509 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_X509) +#define PEM_read_X509_AUX BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_X509_AUX) +#define PEM_read_X509_CRL BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_X509_CRL) +#define PEM_read_X509_REQ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_X509_REQ) +#define PEM_read_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio) +#define PEM_read_bio_DHparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_DHparams) +#define PEM_read_bio_DSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_DSAPrivateKey) +#define PEM_read_bio_DSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_DSA_PUBKEY) +#define PEM_read_bio_DSAparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_DSAparams) +#define PEM_read_bio_ECPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_ECPrivateKey) +#define PEM_read_bio_EC_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_EC_PUBKEY) +#define PEM_read_bio_PKCS7 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_PKCS7) +#define PEM_read_bio_PKCS8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_PKCS8) +#define PEM_read_bio_PKCS8_PRIV_KEY_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_PKCS8_PRIV_KEY_INFO) +#define PEM_read_bio_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_PUBKEY) +#define PEM_read_bio_PrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_PrivateKey) +#define PEM_read_bio_RSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_RSAPrivateKey) +#define PEM_read_bio_RSAPublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_RSAPublicKey) +#define PEM_read_bio_RSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_RSA_PUBKEY) +#define PEM_read_bio_X509 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_X509) +#define PEM_read_bio_X509_AUX BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_X509_AUX) +#define PEM_read_bio_X509_CRL BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_X509_CRL) +#define PEM_read_bio_X509_REQ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_X509_REQ) +#define PEM_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write) +#define PEM_write_DHparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_DHparams) +#define PEM_write_DSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_DSAPrivateKey) +#define PEM_write_DSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_DSA_PUBKEY) +#define PEM_write_DSAparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_DSAparams) +#define PEM_write_ECPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_ECPrivateKey) +#define PEM_write_EC_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_EC_PUBKEY) +#define PEM_write_PKCS7 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_PKCS7) +#define PEM_write_PKCS8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_PKCS8) +#define PEM_write_PKCS8PrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_PKCS8PrivateKey) +#define PEM_write_PKCS8PrivateKey_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_PKCS8PrivateKey_nid) +#define PEM_write_PKCS8_PRIV_KEY_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_PKCS8_PRIV_KEY_INFO) +#define PEM_write_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_PUBKEY) +#define PEM_write_PrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_PrivateKey) +#define PEM_write_RSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_RSAPrivateKey) +#define PEM_write_RSAPublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_RSAPublicKey) +#define PEM_write_RSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_RSA_PUBKEY) +#define PEM_write_X509 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_X509) +#define PEM_write_X509_AUX BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_X509_AUX) +#define PEM_write_X509_CRL BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_X509_CRL) +#define PEM_write_X509_REQ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_X509_REQ) +#define PEM_write_X509_REQ_NEW BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_X509_REQ_NEW) +#define PEM_write_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio) +#define PEM_write_bio_DHparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_DHparams) +#define PEM_write_bio_DSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_DSAPrivateKey) +#define PEM_write_bio_DSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_DSA_PUBKEY) +#define PEM_write_bio_DSAparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_DSAparams) +#define PEM_write_bio_ECPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_ECPrivateKey) +#define PEM_write_bio_EC_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_EC_PUBKEY) +#define PEM_write_bio_PKCS7 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_PKCS7) +#define PEM_write_bio_PKCS8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_PKCS8) +#define PEM_write_bio_PKCS8PrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_PKCS8PrivateKey) +#define PEM_write_bio_PKCS8PrivateKey_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_PKCS8PrivateKey_nid) +#define PEM_write_bio_PKCS8_PRIV_KEY_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_PKCS8_PRIV_KEY_INFO) +#define PEM_write_bio_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_PUBKEY) +#define PEM_write_bio_PrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_PrivateKey) +#define PEM_write_bio_RSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_RSAPrivateKey) +#define PEM_write_bio_RSAPublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_RSAPublicKey) +#define PEM_write_bio_RSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_RSA_PUBKEY) +#define PEM_write_bio_X509 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_X509) +#define PEM_write_bio_X509_AUX BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_X509_AUX) +#define PEM_write_bio_X509_CRL BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_X509_CRL) +#define PEM_write_bio_X509_REQ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_X509_REQ) +#define PEM_write_bio_X509_REQ_NEW BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_X509_REQ_NEW) +#define PKCS12_PBE_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS12_PBE_add) +#define PKCS12_create BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS12_create) +#define PKCS12_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS12_free) +#define PKCS12_get_key_and_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS12_get_key_and_certs) +#define PKCS12_parse BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS12_parse) +#define PKCS12_verify_mac BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS12_verify_mac) +#define PKCS5_PBKDF2_HMAC BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS5_PBKDF2_HMAC) +#define PKCS5_PBKDF2_HMAC_SHA1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS5_PBKDF2_HMAC_SHA1) +#define PKCS5_pbe2_decrypt_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS5_pbe2_decrypt_init) +#define PKCS5_pbe2_encrypt_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS5_pbe2_encrypt_init) +#define PKCS7_bundle_CRLs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS7_bundle_CRLs) +#define PKCS7_bundle_certificates BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS7_bundle_certificates) +#define PKCS7_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS7_free) +#define PKCS7_get_CRLs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS7_get_CRLs) +#define PKCS7_get_PEM_CRLs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS7_get_PEM_CRLs) +#define PKCS7_get_PEM_certificates BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS7_get_PEM_certificates) +#define PKCS7_get_certificates BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS7_get_certificates) +#define PKCS7_get_raw_certificates BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS7_get_raw_certificates) +#define PKCS7_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS7_sign) +#define PKCS7_type_is_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS7_type_is_data) +#define PKCS7_type_is_digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS7_type_is_digest) +#define PKCS7_type_is_encrypted BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS7_type_is_encrypted) +#define PKCS7_type_is_enveloped BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS7_type_is_enveloped) +#define PKCS7_type_is_signed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS7_type_is_signed) +#define PKCS7_type_is_signedAndEnveloped BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS7_type_is_signedAndEnveloped) +#define PKCS8_PRIV_KEY_INFO_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS8_PRIV_KEY_INFO_free) +#define PKCS8_PRIV_KEY_INFO_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS8_PRIV_KEY_INFO_it) +#define PKCS8_PRIV_KEY_INFO_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS8_PRIV_KEY_INFO_new) +#define PKCS8_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS8_decrypt) +#define PKCS8_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS8_encrypt) +#define PKCS8_marshal_encrypted_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS8_marshal_encrypted_private_key) +#define PKCS8_parse_encrypted_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS8_parse_encrypted_private_key) +#define PKCS8_pkey_get0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS8_pkey_get0) +#define PKCS8_pkey_set0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS8_pkey_set0) +#define PKEY_USAGE_PERIOD_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKEY_USAGE_PERIOD_free) +#define PKEY_USAGE_PERIOD_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKEY_USAGE_PERIOD_it) +#define PKEY_USAGE_PERIOD_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKEY_USAGE_PERIOD_new) +#define POLICYINFO_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, POLICYINFO_free) +#define POLICYINFO_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, POLICYINFO_it) +#define POLICYINFO_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, POLICYINFO_new) +#define POLICYQUALINFO_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, POLICYQUALINFO_free) +#define POLICYQUALINFO_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, POLICYQUALINFO_it) +#define POLICYQUALINFO_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, POLICYQUALINFO_new) +#define POLICY_CONSTRAINTS_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, POLICY_CONSTRAINTS_free) +#define POLICY_CONSTRAINTS_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, POLICY_CONSTRAINTS_it) +#define POLICY_CONSTRAINTS_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, POLICY_CONSTRAINTS_new) +#define POLICY_MAPPINGS_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, POLICY_MAPPINGS_it) +#define POLICY_MAPPING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, POLICY_MAPPING_free) +#define POLICY_MAPPING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, POLICY_MAPPING_it) +#define POLICY_MAPPING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, POLICY_MAPPING_new) +#define PROXY_CERT_INFO_EXTENSION_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PROXY_CERT_INFO_EXTENSION_free) +#define PROXY_CERT_INFO_EXTENSION_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PROXY_CERT_INFO_EXTENSION_it) +#define PROXY_CERT_INFO_EXTENSION_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PROXY_CERT_INFO_EXTENSION_new) +#define PROXY_POLICY_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PROXY_POLICY_free) +#define PROXY_POLICY_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PROXY_POLICY_it) +#define PROXY_POLICY_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PROXY_POLICY_new) +#define RAND_SSLeay BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_SSLeay) +#define RAND_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_add) +#define RAND_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_bytes) +#define RAND_bytes_with_additional_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_bytes_with_additional_data) +#define RAND_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_cleanup) +#define RAND_egd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_egd) +#define RAND_enable_fork_unsafe_buffering BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_enable_fork_unsafe_buffering) +#define RAND_file_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_file_name) +#define RAND_get_rand_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_get_rand_method) +#define RAND_load_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_load_file) +#define RAND_poll BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_poll) +#define RAND_pseudo_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_pseudo_bytes) +#define RAND_seed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_seed) +#define RAND_set_rand_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_set_rand_method) +#define RAND_set_urandom_fd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_set_urandom_fd) +#define RAND_status BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_status) +#define RC4 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RC4) +#define RC4_set_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RC4_set_key) +#define RSAPrivateKey_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSAPrivateKey_dup) +#define RSAPublicKey_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSAPublicKey_dup) +#define RSAZ_1024_mod_exp_avx2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSAZ_1024_mod_exp_avx2) +#define RSA_PSS_PARAMS_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_PSS_PARAMS_free) +#define RSA_PSS_PARAMS_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_PSS_PARAMS_it) +#define RSA_PSS_PARAMS_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_PSS_PARAMS_new) +#define RSA_add_pkcs1_prefix BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_add_pkcs1_prefix) +#define RSA_bits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_bits) +#define RSA_blinding_on BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_blinding_on) +#define RSA_check_fips BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_check_fips) +#define RSA_check_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_check_key) +#define RSA_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_decrypt) +#define RSA_default_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_default_method) +#define RSA_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_encrypt) +#define RSA_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_flags) +#define RSA_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_free) +#define RSA_generate_key_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_generate_key_ex) +#define RSA_generate_key_fips BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_generate_key_fips) +#define RSA_get0_crt_params BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_get0_crt_params) +#define RSA_get0_factors BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_get0_factors) +#define RSA_get0_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_get0_key) +#define RSA_get_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_get_ex_data) +#define RSA_get_ex_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_get_ex_new_index) +#define RSA_is_opaque BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_is_opaque) +#define RSA_marshal_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_marshal_private_key) +#define RSA_marshal_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_marshal_public_key) +#define RSA_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_new) +#define RSA_new_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_new_method) +#define RSA_padding_add_PKCS1_OAEP_mgf1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_padding_add_PKCS1_OAEP_mgf1) +#define RSA_padding_add_PKCS1_PSS_mgf1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_padding_add_PKCS1_PSS_mgf1) +#define RSA_padding_add_PKCS1_type_1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_padding_add_PKCS1_type_1) +#define RSA_padding_add_PKCS1_type_2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_padding_add_PKCS1_type_2) +#define RSA_padding_add_none BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_padding_add_none) +#define RSA_padding_check_PKCS1_OAEP_mgf1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_padding_check_PKCS1_OAEP_mgf1) +#define RSA_padding_check_PKCS1_type_1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_padding_check_PKCS1_type_1) +#define RSA_padding_check_PKCS1_type_2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_padding_check_PKCS1_type_2) +#define RSA_parse_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_parse_private_key) +#define RSA_parse_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_parse_public_key) +#define RSA_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_print) +#define RSA_private_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_private_decrypt) +#define RSA_private_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_private_encrypt) +#define RSA_private_key_from_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_private_key_from_bytes) +#define RSA_private_key_to_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_private_key_to_bytes) +#define RSA_private_transform BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_private_transform) +#define RSA_public_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_public_decrypt) +#define RSA_public_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_public_encrypt) +#define RSA_public_key_from_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_public_key_from_bytes) +#define RSA_public_key_to_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_public_key_to_bytes) +#define RSA_set0_crt_params BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_set0_crt_params) +#define RSA_set0_factors BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_set0_factors) +#define RSA_set0_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_set0_key) +#define RSA_set_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_set_ex_data) +#define RSA_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_sign) +#define RSA_sign_pss_mgf1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_sign_pss_mgf1) +#define RSA_sign_raw BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_sign_raw) +#define RSA_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_size) +#define RSA_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_up_ref) +#define RSA_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_verify) +#define RSA_verify_PKCS1_PSS_mgf1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_verify_PKCS1_PSS_mgf1) +#define RSA_verify_pss_mgf1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_verify_pss_mgf1) +#define RSA_verify_raw BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_verify_raw) +#define SHA1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA1) +#define SHA1_Final BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA1_Final) +#define SHA1_Init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA1_Init) +#define SHA1_Transform BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA1_Transform) +#define SHA1_Update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA1_Update) +#define SHA224 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA224) +#define SHA224_Final BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA224_Final) +#define SHA224_Init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA224_Init) +#define SHA224_Update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA224_Update) +#define SHA256 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA256) +#define SHA256_Final BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA256_Final) +#define SHA256_Init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA256_Init) +#define SHA256_Transform BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA256_Transform) +#define SHA256_TransformBlocks BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA256_TransformBlocks) +#define SHA256_Update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA256_Update) +#define SHA384 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA384) +#define SHA384_Final BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA384_Final) +#define SHA384_Init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA384_Init) +#define SHA384_Update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA384_Update) +#define SHA512 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA512) +#define SHA512_Final BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA512_Final) +#define SHA512_Init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA512_Init) +#define SHA512_Transform BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA512_Transform) +#define SHA512_Update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA512_Update) +#define SIPHASH_24 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SIPHASH_24) +#define SPAKE2_CTX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SPAKE2_CTX_free) +#define SPAKE2_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SPAKE2_CTX_new) +#define SPAKE2_generate_msg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SPAKE2_generate_msg) +#define SPAKE2_process_msg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SPAKE2_process_msg) +#define SSLeay BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSLeay) +#define SSLeay_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSLeay_version) +#define SXNETID_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SXNETID_free) +#define SXNETID_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SXNETID_it) +#define SXNETID_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SXNETID_new) +#define SXNET_add_id_INTEGER BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SXNET_add_id_INTEGER) +#define SXNET_add_id_asc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SXNET_add_id_asc) +#define SXNET_add_id_ulong BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SXNET_add_id_ulong) +#define SXNET_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SXNET_free) +#define SXNET_get_id_INTEGER BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SXNET_get_id_INTEGER) +#define SXNET_get_id_asc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SXNET_get_id_asc) +#define SXNET_get_id_ulong BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SXNET_get_id_ulong) +#define SXNET_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SXNET_it) +#define SXNET_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SXNET_new) +#define USERNOTICE_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, USERNOTICE_free) +#define USERNOTICE_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, USERNOTICE_it) +#define USERNOTICE_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, USERNOTICE_new) +#define UTF8_getc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, UTF8_getc) +#define UTF8_putc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, UTF8_putc) +#define X25519 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X25519) +#define X25519_keypair BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X25519_keypair) +#define X25519_public_from_private BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X25519_public_from_private) +#define X509V3_EXT_CRL_add_nconf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_CRL_add_nconf) +#define X509V3_EXT_REQ_add_nconf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_REQ_add_nconf) +#define X509V3_EXT_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_add) +#define X509V3_EXT_add_alias BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_add_alias) +#define X509V3_EXT_add_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_add_list) +#define X509V3_EXT_add_nconf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_add_nconf) +#define X509V3_EXT_add_nconf_sk BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_add_nconf_sk) +#define X509V3_EXT_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_cleanup) +#define X509V3_EXT_d2i BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_d2i) +#define X509V3_EXT_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_free) +#define X509V3_EXT_get BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_get) +#define X509V3_EXT_get_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_get_nid) +#define X509V3_EXT_i2d BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_i2d) +#define X509V3_EXT_nconf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_nconf) +#define X509V3_EXT_nconf_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_nconf_nid) +#define X509V3_EXT_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_print) +#define X509V3_EXT_print_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_print_fp) +#define X509V3_EXT_val_prn BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_val_prn) +#define X509V3_NAME_from_section BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_NAME_from_section) +#define X509V3_add1_i2d BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_add1_i2d) +#define X509V3_add_standard_extensions BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_add_standard_extensions) +#define X509V3_add_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_add_value) +#define X509V3_add_value_bool BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_add_value_bool) +#define X509V3_add_value_bool_nf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_add_value_bool_nf) +#define X509V3_add_value_int BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_add_value_int) +#define X509V3_add_value_uchar BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_add_value_uchar) +#define X509V3_conf_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_conf_free) +#define X509V3_extensions_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_extensions_print) +#define X509V3_get_d2i BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_get_d2i) +#define X509V3_get_section BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_get_section) +#define X509V3_get_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_get_string) +#define X509V3_get_value_bool BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_get_value_bool) +#define X509V3_get_value_int BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_get_value_int) +#define X509V3_parse_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_parse_list) +#define X509V3_section_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_section_free) +#define X509V3_set_ctx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_set_ctx) +#define X509V3_set_nconf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_set_nconf) +#define X509V3_string_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_string_free) +#define X509_ALGORS_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ALGORS_it) +#define X509_ALGOR_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ALGOR_cmp) +#define X509_ALGOR_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ALGOR_dup) +#define X509_ALGOR_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ALGOR_free) +#define X509_ALGOR_get0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ALGOR_get0) +#define X509_ALGOR_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ALGOR_it) +#define X509_ALGOR_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ALGOR_new) +#define X509_ALGOR_set0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ALGOR_set0) +#define X509_ALGOR_set_md BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ALGOR_set_md) +#define X509_ATTRIBUTE_SET_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ATTRIBUTE_SET_it) +#define X509_ATTRIBUTE_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ATTRIBUTE_count) +#define X509_ATTRIBUTE_create BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ATTRIBUTE_create) +#define X509_ATTRIBUTE_create_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ATTRIBUTE_create_by_NID) +#define X509_ATTRIBUTE_create_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ATTRIBUTE_create_by_OBJ) +#define X509_ATTRIBUTE_create_by_txt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ATTRIBUTE_create_by_txt) +#define X509_ATTRIBUTE_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ATTRIBUTE_dup) +#define X509_ATTRIBUTE_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ATTRIBUTE_free) +#define X509_ATTRIBUTE_get0_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ATTRIBUTE_get0_data) +#define X509_ATTRIBUTE_get0_object BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ATTRIBUTE_get0_object) +#define X509_ATTRIBUTE_get0_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ATTRIBUTE_get0_type) +#define X509_ATTRIBUTE_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ATTRIBUTE_it) +#define X509_ATTRIBUTE_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ATTRIBUTE_new) +#define X509_ATTRIBUTE_set1_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ATTRIBUTE_set1_data) +#define X509_ATTRIBUTE_set1_object BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ATTRIBUTE_set1_object) +#define X509_CERT_AUX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CERT_AUX_free) +#define X509_CERT_AUX_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CERT_AUX_it) +#define X509_CERT_AUX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CERT_AUX_new) +#define X509_CERT_AUX_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CERT_AUX_print) +#define X509_CINF_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CINF_free) +#define X509_CINF_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CINF_it) +#define X509_CINF_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CINF_new) +#define X509_CRL_INFO_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_INFO_free) +#define X509_CRL_INFO_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_INFO_it) +#define X509_CRL_INFO_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_INFO_new) +#define X509_CRL_METHOD_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_METHOD_free) +#define X509_CRL_METHOD_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_METHOD_new) +#define X509_CRL_add0_revoked BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_add0_revoked) +#define X509_CRL_add1_ext_i2d BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_add1_ext_i2d) +#define X509_CRL_add_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_add_ext) +#define X509_CRL_check_suiteb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_check_suiteb) +#define X509_CRL_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_cmp) +#define X509_CRL_delete_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_delete_ext) +#define X509_CRL_diff BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_diff) +#define X509_CRL_digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_digest) +#define X509_CRL_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_dup) +#define X509_CRL_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_free) +#define X509_CRL_get0_by_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_get0_by_cert) +#define X509_CRL_get0_by_serial BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_get0_by_serial) +#define X509_CRL_get0_lastUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_get0_lastUpdate) +#define X509_CRL_get0_nextUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_get0_nextUpdate) +#define X509_CRL_get0_signature BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_get0_signature) +#define X509_CRL_get_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_get_ext) +#define X509_CRL_get_ext_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_get_ext_by_NID) +#define X509_CRL_get_ext_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_get_ext_by_OBJ) +#define X509_CRL_get_ext_by_critical BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_get_ext_by_critical) +#define X509_CRL_get_ext_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_get_ext_count) +#define X509_CRL_get_ext_d2i BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_get_ext_d2i) +#define X509_CRL_get_meth_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_get_meth_data) +#define X509_CRL_get_signature_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_get_signature_nid) +#define X509_CRL_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_it) +#define X509_CRL_match BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_match) +#define X509_CRL_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_new) +#define X509_CRL_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_print) +#define X509_CRL_print_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_print_fp) +#define X509_CRL_set_default_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_set_default_method) +#define X509_CRL_set_issuer_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_set_issuer_name) +#define X509_CRL_set_lastUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_set_lastUpdate) +#define X509_CRL_set_meth_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_set_meth_data) +#define X509_CRL_set_nextUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_set_nextUpdate) +#define X509_CRL_set_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_set_version) +#define X509_CRL_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_sign) +#define X509_CRL_sign_ctx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_sign_ctx) +#define X509_CRL_sort BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_sort) +#define X509_CRL_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_up_ref) +#define X509_CRL_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_verify) +#define X509_EXTENSIONS_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_EXTENSIONS_it) +#define X509_EXTENSION_create_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_EXTENSION_create_by_NID) +#define X509_EXTENSION_create_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_EXTENSION_create_by_OBJ) +#define X509_EXTENSION_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_EXTENSION_dup) +#define X509_EXTENSION_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_EXTENSION_free) +#define X509_EXTENSION_get_critical BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_EXTENSION_get_critical) +#define X509_EXTENSION_get_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_EXTENSION_get_data) +#define X509_EXTENSION_get_object BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_EXTENSION_get_object) +#define X509_EXTENSION_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_EXTENSION_it) +#define X509_EXTENSION_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_EXTENSION_new) +#define X509_EXTENSION_set_critical BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_EXTENSION_set_critical) +#define X509_EXTENSION_set_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_EXTENSION_set_data) +#define X509_EXTENSION_set_object BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_EXTENSION_set_object) +#define X509_INFO_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_INFO_free) +#define X509_INFO_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_INFO_new) +#define X509_LOOKUP_by_alias BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_LOOKUP_by_alias) +#define X509_LOOKUP_by_fingerprint BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_LOOKUP_by_fingerprint) +#define X509_LOOKUP_by_issuer_serial BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_LOOKUP_by_issuer_serial) +#define X509_LOOKUP_by_subject BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_LOOKUP_by_subject) +#define X509_LOOKUP_ctrl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_LOOKUP_ctrl) +#define X509_LOOKUP_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_LOOKUP_file) +#define X509_LOOKUP_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_LOOKUP_free) +#define X509_LOOKUP_hash_dir BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_LOOKUP_hash_dir) +#define X509_LOOKUP_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_LOOKUP_init) +#define X509_LOOKUP_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_LOOKUP_new) +#define X509_LOOKUP_shutdown BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_LOOKUP_shutdown) +#define X509_NAME_ENTRIES_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_ENTRIES_it) +#define X509_NAME_ENTRY_create_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_ENTRY_create_by_NID) +#define X509_NAME_ENTRY_create_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_ENTRY_create_by_OBJ) +#define X509_NAME_ENTRY_create_by_txt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_ENTRY_create_by_txt) +#define X509_NAME_ENTRY_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_ENTRY_dup) +#define X509_NAME_ENTRY_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_ENTRY_free) +#define X509_NAME_ENTRY_get_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_ENTRY_get_data) +#define X509_NAME_ENTRY_get_object BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_ENTRY_get_object) +#define X509_NAME_ENTRY_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_ENTRY_it) +#define X509_NAME_ENTRY_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_ENTRY_new) +#define X509_NAME_ENTRY_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_ENTRY_set) +#define X509_NAME_ENTRY_set_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_ENTRY_set_data) +#define X509_NAME_ENTRY_set_object BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_ENTRY_set_object) +#define X509_NAME_INTERNAL_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_INTERNAL_it) +#define X509_NAME_add_entry BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_add_entry) +#define X509_NAME_add_entry_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_add_entry_by_NID) +#define X509_NAME_add_entry_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_add_entry_by_OBJ) +#define X509_NAME_add_entry_by_txt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_add_entry_by_txt) +#define X509_NAME_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_cmp) +#define X509_NAME_delete_entry BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_delete_entry) +#define X509_NAME_digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_digest) +#define X509_NAME_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_dup) +#define X509_NAME_entry_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_entry_count) +#define X509_NAME_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_free) +#define X509_NAME_get0_der BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_get0_der) +#define X509_NAME_get_entry BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_get_entry) +#define X509_NAME_get_index_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_get_index_by_NID) +#define X509_NAME_get_index_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_get_index_by_OBJ) +#define X509_NAME_get_text_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_get_text_by_NID) +#define X509_NAME_get_text_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_get_text_by_OBJ) +#define X509_NAME_hash BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_hash) +#define X509_NAME_hash_old BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_hash_old) +#define X509_NAME_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_it) +#define X509_NAME_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_new) +#define X509_NAME_oneline BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_oneline) +#define X509_NAME_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_print) +#define X509_NAME_print_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_print_ex) +#define X509_NAME_print_ex_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_print_ex_fp) +#define X509_NAME_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_set) +#define X509_OBJECT_free_contents BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_OBJECT_free_contents) +#define X509_OBJECT_get0_X509 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_OBJECT_get0_X509) +#define X509_OBJECT_get_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_OBJECT_get_type) +#define X509_OBJECT_idx_by_subject BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_OBJECT_idx_by_subject) +#define X509_OBJECT_retrieve_by_subject BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_OBJECT_retrieve_by_subject) +#define X509_OBJECT_retrieve_match BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_OBJECT_retrieve_match) +#define X509_OBJECT_up_ref_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_OBJECT_up_ref_count) +#define X509_PKEY_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PKEY_free) +#define X509_PKEY_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PKEY_new) +#define X509_POLICY_NODE_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_POLICY_NODE_print) +#define X509_PUBKEY_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PUBKEY_free) +#define X509_PUBKEY_get BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PUBKEY_get) +#define X509_PUBKEY_get0_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PUBKEY_get0_param) +#define X509_PUBKEY_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PUBKEY_it) +#define X509_PUBKEY_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PUBKEY_new) +#define X509_PUBKEY_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PUBKEY_set) +#define X509_PUBKEY_set0_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PUBKEY_set0_param) +#define X509_PURPOSE_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PURPOSE_add) +#define X509_PURPOSE_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PURPOSE_cleanup) +#define X509_PURPOSE_get0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PURPOSE_get0) +#define X509_PURPOSE_get0_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PURPOSE_get0_name) +#define X509_PURPOSE_get0_sname BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PURPOSE_get0_sname) +#define X509_PURPOSE_get_by_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PURPOSE_get_by_id) +#define X509_PURPOSE_get_by_sname BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PURPOSE_get_by_sname) +#define X509_PURPOSE_get_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PURPOSE_get_count) +#define X509_PURPOSE_get_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PURPOSE_get_id) +#define X509_PURPOSE_get_trust BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PURPOSE_get_trust) +#define X509_PURPOSE_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PURPOSE_set) +#define X509_REQ_INFO_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_INFO_free) +#define X509_REQ_INFO_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_INFO_it) +#define X509_REQ_INFO_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_INFO_new) +#define X509_REQ_add1_attr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_add1_attr) +#define X509_REQ_add1_attr_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_add1_attr_by_NID) +#define X509_REQ_add1_attr_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_add1_attr_by_OBJ) +#define X509_REQ_add1_attr_by_txt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_add1_attr_by_txt) +#define X509_REQ_add_extensions BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_add_extensions) +#define X509_REQ_add_extensions_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_add_extensions_nid) +#define X509_REQ_check_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_check_private_key) +#define X509_REQ_delete_attr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_delete_attr) +#define X509_REQ_digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_digest) +#define X509_REQ_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_dup) +#define X509_REQ_extension_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_extension_nid) +#define X509_REQ_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_free) +#define X509_REQ_get0_signature BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_get0_signature) +#define X509_REQ_get1_email BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_get1_email) +#define X509_REQ_get_attr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_get_attr) +#define X509_REQ_get_attr_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_get_attr_by_NID) +#define X509_REQ_get_attr_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_get_attr_by_OBJ) +#define X509_REQ_get_attr_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_get_attr_count) +#define X509_REQ_get_extension_nids BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_get_extension_nids) +#define X509_REQ_get_extensions BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_get_extensions) +#define X509_REQ_get_pubkey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_get_pubkey) +#define X509_REQ_get_signature_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_get_signature_nid) +#define X509_REQ_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_it) +#define X509_REQ_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_new) +#define X509_REQ_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_print) +#define X509_REQ_print_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_print_ex) +#define X509_REQ_print_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_print_fp) +#define X509_REQ_set_extension_nids BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_set_extension_nids) +#define X509_REQ_set_pubkey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_set_pubkey) +#define X509_REQ_set_subject_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_set_subject_name) +#define X509_REQ_set_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_set_version) +#define X509_REQ_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_sign) +#define X509_REQ_sign_ctx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_sign_ctx) +#define X509_REQ_to_X509 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_to_X509) +#define X509_REQ_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_verify) +#define X509_REVOKED_add1_ext_i2d BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_add1_ext_i2d) +#define X509_REVOKED_add_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_add_ext) +#define X509_REVOKED_delete_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_delete_ext) +#define X509_REVOKED_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_dup) +#define X509_REVOKED_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_free) +#define X509_REVOKED_get0_revocationDate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_get0_revocationDate) +#define X509_REVOKED_get0_serialNumber BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_get0_serialNumber) +#define X509_REVOKED_get_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_get_ext) +#define X509_REVOKED_get_ext_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_get_ext_by_NID) +#define X509_REVOKED_get_ext_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_get_ext_by_OBJ) +#define X509_REVOKED_get_ext_by_critical BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_get_ext_by_critical) +#define X509_REVOKED_get_ext_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_get_ext_count) +#define X509_REVOKED_get_ext_d2i BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_get_ext_d2i) +#define X509_REVOKED_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_it) +#define X509_REVOKED_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_new) +#define X509_REVOKED_set_revocationDate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_set_revocationDate) +#define X509_REVOKED_set_serialNumber BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_set_serialNumber) +#define X509_SIG_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_SIG_free) +#define X509_SIG_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_SIG_it) +#define X509_SIG_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_SIG_new) +#define X509_STORE_CTX_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_cleanup) +#define X509_STORE_CTX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_free) +#define X509_STORE_CTX_get0_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get0_cert) +#define X509_STORE_CTX_get0_current_crl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get0_current_crl) +#define X509_STORE_CTX_get0_current_issuer BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get0_current_issuer) +#define X509_STORE_CTX_get0_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get0_param) +#define X509_STORE_CTX_get0_parent_ctx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get0_parent_ctx) +#define X509_STORE_CTX_get0_policy_tree BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get0_policy_tree) +#define X509_STORE_CTX_get0_store BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get0_store) +#define X509_STORE_CTX_get0_untrusted BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get0_untrusted) +#define X509_STORE_CTX_get1_chain BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get1_chain) +#define X509_STORE_CTX_get1_issuer BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get1_issuer) +#define X509_STORE_CTX_get_chain BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get_chain) +#define X509_STORE_CTX_get_current_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get_current_cert) +#define X509_STORE_CTX_get_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get_error) +#define X509_STORE_CTX_get_error_depth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get_error_depth) +#define X509_STORE_CTX_get_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get_ex_data) +#define X509_STORE_CTX_get_ex_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get_ex_new_index) +#define X509_STORE_CTX_get_explicit_policy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get_explicit_policy) +#define X509_STORE_CTX_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_init) +#define X509_STORE_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_new) +#define X509_STORE_CTX_purpose_inherit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_purpose_inherit) +#define X509_STORE_CTX_set0_crls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_set0_crls) +#define X509_STORE_CTX_set0_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_set0_param) +#define X509_STORE_CTX_set_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_set_cert) +#define X509_STORE_CTX_set_chain BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_set_chain) +#define X509_STORE_CTX_set_default BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_set_default) +#define X509_STORE_CTX_set_depth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_set_depth) +#define X509_STORE_CTX_set_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_set_error) +#define X509_STORE_CTX_set_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_set_ex_data) +#define X509_STORE_CTX_set_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_set_flags) +#define X509_STORE_CTX_set_purpose BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_set_purpose) +#define X509_STORE_CTX_set_time BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_set_time) +#define X509_STORE_CTX_set_trust BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_set_trust) +#define X509_STORE_CTX_set_verify_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_set_verify_cb) +#define X509_STORE_CTX_trusted_stack BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_trusted_stack) +#define X509_STORE_CTX_zero BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_zero) +#define X509_STORE_add_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_add_cert) +#define X509_STORE_add_crl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_add_crl) +#define X509_STORE_add_lookup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_add_lookup) +#define X509_STORE_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_free) +#define X509_STORE_get0_objects BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get0_objects) +#define X509_STORE_get0_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get0_param) +#define X509_STORE_get1_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get1_certs) +#define X509_STORE_get1_crls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get1_crls) +#define X509_STORE_get_by_subject BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get_by_subject) +#define X509_STORE_get_cert_crl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get_cert_crl) +#define X509_STORE_get_check_crl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get_check_crl) +#define X509_STORE_get_check_issued BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get_check_issued) +#define X509_STORE_get_check_revocation BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get_check_revocation) +#define X509_STORE_get_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get_cleanup) +#define X509_STORE_get_get_crl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get_get_crl) +#define X509_STORE_get_get_issuer BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get_get_issuer) +#define X509_STORE_get_lookup_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get_lookup_certs) +#define X509_STORE_get_lookup_crls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get_lookup_crls) +#define X509_STORE_get_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get_verify) +#define X509_STORE_get_verify_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get_verify_cb) +#define X509_STORE_load_locations BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_load_locations) +#define X509_STORE_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_new) +#define X509_STORE_set0_additional_untrusted BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set0_additional_untrusted) +#define X509_STORE_set1_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set1_param) +#define X509_STORE_set_cert_crl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_cert_crl) +#define X509_STORE_set_check_crl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_check_crl) +#define X509_STORE_set_check_issued BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_check_issued) +#define X509_STORE_set_check_revocation BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_check_revocation) +#define X509_STORE_set_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_cleanup) +#define X509_STORE_set_default_paths BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_default_paths) +#define X509_STORE_set_depth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_depth) +#define X509_STORE_set_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_flags) +#define X509_STORE_set_get_crl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_get_crl) +#define X509_STORE_set_get_issuer BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_get_issuer) +#define X509_STORE_set_lookup_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_lookup_certs) +#define X509_STORE_set_lookup_crls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_lookup_crls) +#define X509_STORE_set_purpose BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_purpose) +#define X509_STORE_set_trust BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_trust) +#define X509_STORE_set_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_verify) +#define X509_STORE_set_verify_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_verify_cb) +#define X509_STORE_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_up_ref) +#define X509_TRUST_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_TRUST_add) +#define X509_TRUST_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_TRUST_cleanup) +#define X509_TRUST_get0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_TRUST_get0) +#define X509_TRUST_get0_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_TRUST_get0_name) +#define X509_TRUST_get_by_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_TRUST_get_by_id) +#define X509_TRUST_get_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_TRUST_get_count) +#define X509_TRUST_get_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_TRUST_get_flags) +#define X509_TRUST_get_trust BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_TRUST_get_trust) +#define X509_TRUST_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_TRUST_set) +#define X509_TRUST_set_default BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_TRUST_set_default) +#define X509_VAL_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VAL_free) +#define X509_VAL_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VAL_it) +#define X509_VAL_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VAL_new) +#define X509_VERIFY_PARAM_add0_policy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_add0_policy) +#define X509_VERIFY_PARAM_add0_table BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_add0_table) +#define X509_VERIFY_PARAM_add1_host BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_add1_host) +#define X509_VERIFY_PARAM_clear_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_clear_flags) +#define X509_VERIFY_PARAM_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_free) +#define X509_VERIFY_PARAM_get0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_get0) +#define X509_VERIFY_PARAM_get0_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_get0_name) +#define X509_VERIFY_PARAM_get0_peername BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_get0_peername) +#define X509_VERIFY_PARAM_get_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_get_count) +#define X509_VERIFY_PARAM_get_depth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_get_depth) +#define X509_VERIFY_PARAM_get_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_get_flags) +#define X509_VERIFY_PARAM_inherit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_inherit) +#define X509_VERIFY_PARAM_lookup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_lookup) +#define X509_VERIFY_PARAM_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_new) +#define X509_VERIFY_PARAM_set1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_set1) +#define X509_VERIFY_PARAM_set1_email BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_set1_email) +#define X509_VERIFY_PARAM_set1_host BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_set1_host) +#define X509_VERIFY_PARAM_set1_ip BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_set1_ip) +#define X509_VERIFY_PARAM_set1_ip_asc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_set1_ip_asc) +#define X509_VERIFY_PARAM_set1_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_set1_name) +#define X509_VERIFY_PARAM_set1_policies BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_set1_policies) +#define X509_VERIFY_PARAM_set_depth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_set_depth) +#define X509_VERIFY_PARAM_set_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_set_flags) +#define X509_VERIFY_PARAM_set_hostflags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_set_hostflags) +#define X509_VERIFY_PARAM_set_purpose BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_set_purpose) +#define X509_VERIFY_PARAM_set_time BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_set_time) +#define X509_VERIFY_PARAM_set_trust BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_set_trust) +#define X509_VERIFY_PARAM_table_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_table_cleanup) +#define X509_add1_ext_i2d BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_add1_ext_i2d) +#define X509_add1_reject_object BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_add1_reject_object) +#define X509_add1_trust_object BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_add1_trust_object) +#define X509_add_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_add_ext) +#define X509_alias_get0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_alias_get0) +#define X509_alias_set1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_alias_set1) +#define X509_chain_check_suiteb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_chain_check_suiteb) +#define X509_chain_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_chain_up_ref) +#define X509_check_akid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_check_akid) +#define X509_check_ca BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_check_ca) +#define X509_check_email BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_check_email) +#define X509_check_host BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_check_host) +#define X509_check_ip BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_check_ip) +#define X509_check_ip_asc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_check_ip_asc) +#define X509_check_issued BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_check_issued) +#define X509_check_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_check_private_key) +#define X509_check_purpose BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_check_purpose) +#define X509_check_trust BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_check_trust) +#define X509_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_cmp) +#define X509_cmp_current_time BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_cmp_current_time) +#define X509_cmp_time BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_cmp_time) +#define X509_delete_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_delete_ext) +#define X509_digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_digest) +#define X509_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_dup) +#define X509_email_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_email_free) +#define X509_find_by_issuer_and_serial BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_find_by_issuer_and_serial) +#define X509_find_by_subject BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_find_by_subject) +#define X509_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_free) +#define X509_get0_extensions BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get0_extensions) +#define X509_get0_notAfter BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get0_notAfter) +#define X509_get0_notBefore BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get0_notBefore) +#define X509_get0_pubkey_bitstr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get0_pubkey_bitstr) +#define X509_get0_signature BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get0_signature) +#define X509_get0_tbs_sigalg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get0_tbs_sigalg) +#define X509_get1_email BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get1_email) +#define X509_get1_ocsp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get1_ocsp) +#define X509_get_default_cert_area BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_default_cert_area) +#define X509_get_default_cert_dir BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_default_cert_dir) +#define X509_get_default_cert_dir_env BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_default_cert_dir_env) +#define X509_get_default_cert_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_default_cert_file) +#define X509_get_default_cert_file_env BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_default_cert_file_env) +#define X509_get_default_private_dir BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_default_private_dir) +#define X509_get_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_ex_data) +#define X509_get_ex_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_ex_new_index) +#define X509_get_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_ext) +#define X509_get_ext_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_ext_by_NID) +#define X509_get_ext_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_ext_by_OBJ) +#define X509_get_ext_by_critical BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_ext_by_critical) +#define X509_get_ext_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_ext_count) +#define X509_get_ext_d2i BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_ext_d2i) +#define X509_get_extended_key_usage BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_extended_key_usage) +#define X509_get_extension_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_extension_flags) +#define X509_get_issuer_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_issuer_name) +#define X509_get_key_usage BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_key_usage) +#define X509_get_pubkey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_pubkey) +#define X509_get_serialNumber BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_serialNumber) +#define X509_get_signature_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_signature_nid) +#define X509_get_subject_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_subject_name) +#define X509_gmtime_adj BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_gmtime_adj) +#define X509_issuer_and_serial_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_issuer_and_serial_cmp) +#define X509_issuer_and_serial_hash BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_issuer_and_serial_hash) +#define X509_issuer_name_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_issuer_name_cmp) +#define X509_issuer_name_hash BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_issuer_name_hash) +#define X509_issuer_name_hash_old BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_issuer_name_hash_old) +#define X509_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_it) +#define X509_keyid_get0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_keyid_get0) +#define X509_keyid_set1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_keyid_set1) +#define X509_load_cert_crl_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_load_cert_crl_file) +#define X509_load_cert_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_load_cert_file) +#define X509_load_crl_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_load_crl_file) +#define X509_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_new) +#define X509_ocspid_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ocspid_print) +#define X509_parse_from_buffer BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_parse_from_buffer) +#define X509_policy_check BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_policy_check) +#define X509_policy_level_get0_node BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_policy_level_get0_node) +#define X509_policy_level_node_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_policy_level_node_count) +#define X509_policy_node_get0_parent BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_policy_node_get0_parent) +#define X509_policy_node_get0_policy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_policy_node_get0_policy) +#define X509_policy_node_get0_qualifiers BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_policy_node_get0_qualifiers) +#define X509_policy_tree_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_policy_tree_free) +#define X509_policy_tree_get0_level BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_policy_tree_get0_level) +#define X509_policy_tree_get0_policies BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_policy_tree_get0_policies) +#define X509_policy_tree_get0_user_policies BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_policy_tree_get0_user_policies) +#define X509_policy_tree_level_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_policy_tree_level_count) +#define X509_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_print) +#define X509_print_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_print_ex) +#define X509_print_ex_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_print_ex_fp) +#define X509_print_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_print_fp) +#define X509_pubkey_digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_pubkey_digest) +#define X509_reject_clear BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_reject_clear) +#define X509_set_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_set_ex_data) +#define X509_set_issuer_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_set_issuer_name) +#define X509_set_notAfter BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_set_notAfter) +#define X509_set_notBefore BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_set_notBefore) +#define X509_set_pubkey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_set_pubkey) +#define X509_set_serialNumber BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_set_serialNumber) +#define X509_set_subject_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_set_subject_name) +#define X509_set_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_set_version) +#define X509_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_sign) +#define X509_sign_ctx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_sign_ctx) +#define X509_signature_dump BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_signature_dump) +#define X509_signature_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_signature_print) +#define X509_subject_name_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_subject_name_cmp) +#define X509_subject_name_hash BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_subject_name_hash) +#define X509_subject_name_hash_old BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_subject_name_hash_old) +#define X509_supported_extension BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_supported_extension) +#define X509_time_adj BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_time_adj) +#define X509_time_adj_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_time_adj_ex) +#define X509_to_X509_REQ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_to_X509_REQ) +#define X509_trust_clear BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_trust_clear) +#define X509_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_up_ref) +#define X509_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_verify) +#define X509_verify_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_verify_cert) +#define X509_verify_cert_error_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_verify_cert_error_string) +#define X509at_add1_attr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509at_add1_attr) +#define X509at_add1_attr_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509at_add1_attr_by_NID) +#define X509at_add1_attr_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509at_add1_attr_by_OBJ) +#define X509at_add1_attr_by_txt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509at_add1_attr_by_txt) +#define X509at_delete_attr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509at_delete_attr) +#define X509at_get0_data_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509at_get0_data_by_OBJ) +#define X509at_get_attr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509at_get_attr) +#define X509at_get_attr_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509at_get_attr_by_NID) +#define X509at_get_attr_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509at_get_attr_by_OBJ) +#define X509at_get_attr_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509at_get_attr_count) +#define X509v3_add_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509v3_add_ext) +#define X509v3_delete_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509v3_delete_ext) +#define X509v3_get_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509v3_get_ext) +#define X509v3_get_ext_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509v3_get_ext_by_NID) +#define X509v3_get_ext_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509v3_get_ext_by_OBJ) +#define X509v3_get_ext_by_critical BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509v3_get_ext_by_critical) +#define X509v3_get_ext_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509v3_get_ext_count) +#define a2i_GENERAL_NAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, a2i_GENERAL_NAME) +#define a2i_IPADDRESS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, a2i_IPADDRESS) +#define a2i_IPADDRESS_NC BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, a2i_IPADDRESS_NC) +#define a2i_ipadd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, a2i_ipadd) +#define abi_test_bad_unwind_temporary BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_bad_unwind_temporary) +#define abi_test_bad_unwind_wrong_register BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_bad_unwind_wrong_register) +#define abi_test_clobber_r10 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_r10) +#define abi_test_clobber_r11 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_r11) +#define abi_test_clobber_r12 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_r12) +#define abi_test_clobber_r13 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_r13) +#define abi_test_clobber_r14 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_r14) +#define abi_test_clobber_r15 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_r15) +#define abi_test_clobber_r8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_r8) +#define abi_test_clobber_r9 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_r9) +#define abi_test_clobber_rax BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_rax) +#define abi_test_clobber_rbp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_rbp) +#define abi_test_clobber_rbx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_rbx) +#define abi_test_clobber_rcx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_rcx) +#define abi_test_clobber_rdi BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_rdi) +#define abi_test_clobber_rdx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_rdx) +#define abi_test_clobber_rsi BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_rsi) +#define abi_test_clobber_xmm0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm0) +#define abi_test_clobber_xmm1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm1) +#define abi_test_clobber_xmm10 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm10) +#define abi_test_clobber_xmm11 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm11) +#define abi_test_clobber_xmm12 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm12) +#define abi_test_clobber_xmm13 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm13) +#define abi_test_clobber_xmm14 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm14) +#define abi_test_clobber_xmm15 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm15) +#define abi_test_clobber_xmm2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm2) +#define abi_test_clobber_xmm3 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm3) +#define abi_test_clobber_xmm4 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm4) +#define abi_test_clobber_xmm5 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm5) +#define abi_test_clobber_xmm6 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm6) +#define abi_test_clobber_xmm7 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm7) +#define abi_test_clobber_xmm8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm8) +#define abi_test_clobber_xmm9 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm9) +#define abi_test_get_and_clear_direction_flag BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_get_and_clear_direction_flag) +#define abi_test_set_direction_flag BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_set_direction_flag) +#define abi_test_trampoline BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_trampoline) +#define abi_test_unwind_return BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_unwind_return) +#define abi_test_unwind_start BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_unwind_start) +#define abi_test_unwind_stop BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_unwind_stop) +#define aes128gcmsiv_aes_ks BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes128gcmsiv_aes_ks) +#define aes128gcmsiv_aes_ks_enc_x1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes128gcmsiv_aes_ks_enc_x1) +#define aes128gcmsiv_dec BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes128gcmsiv_dec) +#define aes128gcmsiv_ecb_enc_block BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes128gcmsiv_ecb_enc_block) +#define aes128gcmsiv_enc_msg_x4 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes128gcmsiv_enc_msg_x4) +#define aes128gcmsiv_enc_msg_x8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes128gcmsiv_enc_msg_x8) +#define aes128gcmsiv_kdf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes128gcmsiv_kdf) +#define aes256gcmsiv_aes_ks BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes256gcmsiv_aes_ks) +#define aes256gcmsiv_aes_ks_enc_x1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes256gcmsiv_aes_ks_enc_x1) +#define aes256gcmsiv_dec BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes256gcmsiv_dec) +#define aes256gcmsiv_ecb_enc_block BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes256gcmsiv_ecb_enc_block) +#define aes256gcmsiv_enc_msg_x4 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes256gcmsiv_enc_msg_x4) +#define aes256gcmsiv_enc_msg_x8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes256gcmsiv_enc_msg_x8) +#define aes256gcmsiv_kdf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes256gcmsiv_kdf) +#define aes_ctr_set_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_ctr_set_key) +#define aes_hw_cbc_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_hw_cbc_encrypt) +#define aes_hw_ctr32_encrypt_blocks BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_hw_ctr32_encrypt_blocks) +#define aes_hw_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_hw_decrypt) +#define aes_hw_ecb_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_hw_ecb_encrypt) +#define aes_hw_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_hw_encrypt) +#define aes_hw_set_decrypt_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_hw_set_decrypt_key) +#define aes_hw_set_encrypt_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_hw_set_encrypt_key) +#define aes_nohw_cbc_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_nohw_cbc_encrypt) +#define aes_nohw_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_nohw_decrypt) +#define aes_nohw_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_nohw_encrypt) +#define aes_nohw_set_decrypt_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_nohw_set_decrypt_key) +#define aes_nohw_set_encrypt_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_nohw_set_encrypt_key) +#define aesgcmsiv_htable6_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aesgcmsiv_htable6_init) +#define aesgcmsiv_htable_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aesgcmsiv_htable_init) +#define aesgcmsiv_htable_polyval BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aesgcmsiv_htable_polyval) +#define aesgcmsiv_polyval_horner BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aesgcmsiv_polyval_horner) +#define aesni_gcm_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aesni_gcm_decrypt) +#define aesni_gcm_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aesni_gcm_encrypt) +#define asn1_do_adb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_do_adb) +#define asn1_enc_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_enc_free) +#define asn1_enc_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_enc_init) +#define asn1_enc_restore BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_enc_restore) +#define asn1_enc_save BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_enc_save) +#define asn1_ex_c2i BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_ex_c2i) +#define asn1_ex_i2c BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_ex_i2c) +#define asn1_generalizedtime_to_tm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_generalizedtime_to_tm) +#define asn1_get_choice_selector BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_get_choice_selector) +#define asn1_get_field_ptr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_get_field_ptr) +#define asn1_item_combine_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_item_combine_free) +#define asn1_refcount_dec_and_test_zero BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_refcount_dec_and_test_zero) +#define asn1_refcount_set_one BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_refcount_set_one) +#define asn1_set_choice_selector BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_set_choice_selector) +#define asn1_utctime_to_tm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_utctime_to_tm) +#define beeu_mod_inverse_vartime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, beeu_mod_inverse_vartime) +#define bio_clear_socket_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bio_clear_socket_error) +#define bio_fd_should_retry BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bio_fd_should_retry) +#define bio_ip_and_port_to_socket_and_addr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bio_ip_and_port_to_socket_and_addr) +#define bio_sock_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bio_sock_error) +#define bio_socket_nbio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bio_socket_nbio) +#define bn_abs_sub_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_abs_sub_consttime) +#define bn_add_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_add_words) +#define bn_copy_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_copy_words) +#define bn_div_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_div_consttime) +#define bn_expand BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_expand) +#define bn_fits_in_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_fits_in_words) +#define bn_from_montgomery BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_from_montgomery) +#define bn_from_montgomery_small BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_from_montgomery_small) +#define bn_gather5 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_gather5) +#define bn_in_range_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_in_range_words) +#define bn_is_bit_set_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_is_bit_set_words) +#define bn_is_relatively_prime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_is_relatively_prime) +#define bn_jacobi BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_jacobi) +#define bn_lcm_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_lcm_consttime) +#define bn_less_than_montgomery_R BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_less_than_montgomery_R) +#define bn_less_than_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_less_than_words) +#define bn_miller_rabin_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_miller_rabin_init) +#define bn_miller_rabin_iteration BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_miller_rabin_iteration) +#define bn_minimal_width BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_minimal_width) +#define bn_mod_add_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mod_add_consttime) +#define bn_mod_add_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mod_add_words) +#define bn_mod_exp_base_2_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mod_exp_base_2_consttime) +#define bn_mod_exp_mont_small BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mod_exp_mont_small) +#define bn_mod_inverse_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mod_inverse_consttime) +#define bn_mod_inverse_prime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mod_inverse_prime) +#define bn_mod_inverse_prime_mont_small BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mod_inverse_prime_mont_small) +#define bn_mod_inverse_secret_prime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mod_inverse_secret_prime) +#define bn_mod_lshift1_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mod_lshift1_consttime) +#define bn_mod_lshift_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mod_lshift_consttime) +#define bn_mod_mul_montgomery_small BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mod_mul_montgomery_small) +#define bn_mod_sub_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mod_sub_consttime) +#define bn_mod_sub_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mod_sub_words) +#define bn_mod_u16_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mod_u16_consttime) +#define bn_mont_n0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mont_n0) +#define bn_mul_add_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mul_add_words) +#define bn_mul_comba4 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mul_comba4) +#define bn_mul_comba8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mul_comba8) +#define bn_mul_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mul_consttime) +#define bn_mul_mont BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mul_mont) +#define bn_mul_mont_gather5 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mul_mont_gather5) +#define bn_mul_small BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mul_small) +#define bn_mul_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mul_words) +#define bn_odd_number_is_obviously_composite BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_odd_number_is_obviously_composite) +#define bn_one_to_montgomery BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_one_to_montgomery) +#define bn_power5 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_power5) +#define bn_rand_range_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_rand_range_words) +#define bn_rand_secret_range BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_rand_secret_range) +#define bn_reduce_once BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_reduce_once) +#define bn_reduce_once_in_place BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_reduce_once_in_place) +#define bn_resize_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_resize_words) +#define bn_rshift1_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_rshift1_words) +#define bn_rshift_secret_shift BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_rshift_secret_shift) +#define bn_rshift_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_rshift_words) +#define bn_scatter5 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_scatter5) +#define bn_select_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_select_words) +#define bn_set_minimal_width BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_set_minimal_width) +#define bn_set_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_set_words) +#define bn_sqr8x_internal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_sqr8x_internal) +#define bn_sqr_comba4 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_sqr_comba4) +#define bn_sqr_comba8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_sqr_comba8) +#define bn_sqr_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_sqr_consttime) +#define bn_sqr_small BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_sqr_small) +#define bn_sqr_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_sqr_words) +#define bn_sqrx8x_internal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_sqrx8x_internal) +#define bn_sub_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_sub_words) +#define bn_to_montgomery_small BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_to_montgomery_small) +#define bn_uadd_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_uadd_consttime) +#define bn_usub_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_usub_consttime) +#define bn_wexpand BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_wexpand) +#define boringssl_fips_self_test BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, boringssl_fips_self_test) +#define c2i_ASN1_BIT_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, c2i_ASN1_BIT_STRING) +#define c2i_ASN1_INTEGER BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, c2i_ASN1_INTEGER) +#define c2i_ASN1_OBJECT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, c2i_ASN1_OBJECT) +#define cbb_add_latin1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, cbb_add_latin1) +#define cbb_add_ucs2_be BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, cbb_add_ucs2_be) +#define cbb_add_utf32_be BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, cbb_add_utf32_be) +#define cbb_add_utf8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, cbb_add_utf8) +#define cbb_get_utf8_len BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, cbb_get_utf8_len) +#define cbs_get_latin1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, cbs_get_latin1) +#define cbs_get_ucs2_be BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, cbs_get_ucs2_be) +#define cbs_get_utf32_be BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, cbs_get_utf32_be) +#define cbs_get_utf8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, cbs_get_utf8) +#define chacha20_poly1305_open BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, chacha20_poly1305_open) +#define chacha20_poly1305_seal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, chacha20_poly1305_seal) +#define crypto_gcm_clmul_enabled BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, crypto_gcm_clmul_enabled) +#define d2i_ACCESS_DESCRIPTION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ACCESS_DESCRIPTION) +#define d2i_ASN1_BIT_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_BIT_STRING) +#define d2i_ASN1_BMPSTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_BMPSTRING) +#define d2i_ASN1_BOOLEAN BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_BOOLEAN) +#define d2i_ASN1_ENUMERATED BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_ENUMERATED) +#define d2i_ASN1_GENERALIZEDTIME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_GENERALIZEDTIME) +#define d2i_ASN1_GENERALSTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_GENERALSTRING) +#define d2i_ASN1_IA5STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_IA5STRING) +#define d2i_ASN1_INTEGER BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_INTEGER) +#define d2i_ASN1_NULL BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_NULL) +#define d2i_ASN1_OBJECT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_OBJECT) +#define d2i_ASN1_OCTET_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_OCTET_STRING) +#define d2i_ASN1_PRINTABLE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_PRINTABLE) +#define d2i_ASN1_PRINTABLESTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_PRINTABLESTRING) +#define d2i_ASN1_SEQUENCE_ANY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_SEQUENCE_ANY) +#define d2i_ASN1_SET_ANY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_SET_ANY) +#define d2i_ASN1_T61STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_T61STRING) +#define d2i_ASN1_TIME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_TIME) +#define d2i_ASN1_TYPE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_TYPE) +#define d2i_ASN1_UNIVERSALSTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_UNIVERSALSTRING) +#define d2i_ASN1_UTCTIME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_UTCTIME) +#define d2i_ASN1_UTF8STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_UTF8STRING) +#define d2i_ASN1_VISIBLESTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_VISIBLESTRING) +#define d2i_AUTHORITY_INFO_ACCESS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_AUTHORITY_INFO_ACCESS) +#define d2i_AUTHORITY_KEYID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_AUTHORITY_KEYID) +#define d2i_AutoPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_AutoPrivateKey) +#define d2i_BASIC_CONSTRAINTS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_BASIC_CONSTRAINTS) +#define d2i_CERTIFICATEPOLICIES BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_CERTIFICATEPOLICIES) +#define d2i_CRL_DIST_POINTS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_CRL_DIST_POINTS) +#define d2i_DHparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DHparams) +#define d2i_DHparams_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DHparams_bio) +#define d2i_DIRECTORYSTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DIRECTORYSTRING) +#define d2i_DISPLAYTEXT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DISPLAYTEXT) +#define d2i_DIST_POINT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DIST_POINT) +#define d2i_DIST_POINT_NAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DIST_POINT_NAME) +#define d2i_DSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DSAPrivateKey) +#define d2i_DSAPrivateKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DSAPrivateKey_bio) +#define d2i_DSAPrivateKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DSAPrivateKey_fp) +#define d2i_DSAPublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DSAPublicKey) +#define d2i_DSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DSA_PUBKEY) +#define d2i_DSA_PUBKEY_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DSA_PUBKEY_bio) +#define d2i_DSA_PUBKEY_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DSA_PUBKEY_fp) +#define d2i_DSA_SIG BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DSA_SIG) +#define d2i_DSAparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DSAparams) +#define d2i_ECDSA_SIG BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ECDSA_SIG) +#define d2i_ECParameters BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ECParameters) +#define d2i_ECPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ECPrivateKey) +#define d2i_ECPrivateKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ECPrivateKey_bio) +#define d2i_ECPrivateKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ECPrivateKey_fp) +#define d2i_EC_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_EC_PUBKEY) +#define d2i_EC_PUBKEY_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_EC_PUBKEY_bio) +#define d2i_EC_PUBKEY_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_EC_PUBKEY_fp) +#define d2i_EDIPARTYNAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_EDIPARTYNAME) +#define d2i_EXTENDED_KEY_USAGE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_EXTENDED_KEY_USAGE) +#define d2i_GENERAL_NAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_GENERAL_NAME) +#define d2i_GENERAL_NAMES BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_GENERAL_NAMES) +#define d2i_ISSUING_DIST_POINT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ISSUING_DIST_POINT) +#define d2i_NETSCAPE_SPKAC BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_NETSCAPE_SPKAC) +#define d2i_NETSCAPE_SPKI BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_NETSCAPE_SPKI) +#define d2i_NOTICEREF BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_NOTICEREF) +#define d2i_OTHERNAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_OTHERNAME) +#define d2i_PKCS12 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PKCS12) +#define d2i_PKCS12_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PKCS12_bio) +#define d2i_PKCS12_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PKCS12_fp) +#define d2i_PKCS7 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PKCS7) +#define d2i_PKCS7_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PKCS7_bio) +#define d2i_PKCS8PrivateKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PKCS8PrivateKey_bio) +#define d2i_PKCS8PrivateKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PKCS8PrivateKey_fp) +#define d2i_PKCS8_PRIV_KEY_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PKCS8_PRIV_KEY_INFO) +#define d2i_PKCS8_PRIV_KEY_INFO_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PKCS8_PRIV_KEY_INFO_bio) +#define d2i_PKCS8_PRIV_KEY_INFO_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PKCS8_PRIV_KEY_INFO_fp) +#define d2i_PKCS8_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PKCS8_bio) +#define d2i_PKCS8_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PKCS8_fp) +#define d2i_PKEY_USAGE_PERIOD BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PKEY_USAGE_PERIOD) +#define d2i_POLICYINFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_POLICYINFO) +#define d2i_POLICYQUALINFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_POLICYQUALINFO) +#define d2i_PROXY_CERT_INFO_EXTENSION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PROXY_CERT_INFO_EXTENSION) +#define d2i_PROXY_POLICY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PROXY_POLICY) +#define d2i_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PUBKEY) +#define d2i_PUBKEY_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PUBKEY_bio) +#define d2i_PUBKEY_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PUBKEY_fp) +#define d2i_PrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PrivateKey) +#define d2i_PrivateKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PrivateKey_bio) +#define d2i_PrivateKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PrivateKey_fp) +#define d2i_PublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PublicKey) +#define d2i_RSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_RSAPrivateKey) +#define d2i_RSAPrivateKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_RSAPrivateKey_bio) +#define d2i_RSAPrivateKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_RSAPrivateKey_fp) +#define d2i_RSAPublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_RSAPublicKey) +#define d2i_RSAPublicKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_RSAPublicKey_bio) +#define d2i_RSAPublicKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_RSAPublicKey_fp) +#define d2i_RSA_PSS_PARAMS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_RSA_PSS_PARAMS) +#define d2i_RSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_RSA_PUBKEY) +#define d2i_RSA_PUBKEY_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_RSA_PUBKEY_bio) +#define d2i_RSA_PUBKEY_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_RSA_PUBKEY_fp) +#define d2i_SXNET BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_SXNET) +#define d2i_SXNETID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_SXNETID) +#define d2i_USERNOTICE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_USERNOTICE) +#define d2i_X509 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509) +#define d2i_X509_ALGOR BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_ALGOR) +#define d2i_X509_ALGORS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_ALGORS) +#define d2i_X509_ATTRIBUTE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_ATTRIBUTE) +#define d2i_X509_AUX BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_AUX) +#define d2i_X509_CERT_AUX BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_CERT_AUX) +#define d2i_X509_CINF BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_CINF) +#define d2i_X509_CRL BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_CRL) +#define d2i_X509_CRL_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_CRL_INFO) +#define d2i_X509_CRL_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_CRL_bio) +#define d2i_X509_CRL_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_CRL_fp) +#define d2i_X509_EXTENSION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_EXTENSION) +#define d2i_X509_EXTENSIONS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_EXTENSIONS) +#define d2i_X509_NAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_NAME) +#define d2i_X509_NAME_ENTRY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_NAME_ENTRY) +#define d2i_X509_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_PUBKEY) +#define d2i_X509_REQ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_REQ) +#define d2i_X509_REQ_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_REQ_INFO) +#define d2i_X509_REQ_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_REQ_bio) +#define d2i_X509_REQ_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_REQ_fp) +#define d2i_X509_REVOKED BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_REVOKED) +#define d2i_X509_SIG BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_SIG) +#define d2i_X509_VAL BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_VAL) +#define d2i_X509_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_bio) +#define d2i_X509_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_fp) +#define dsa_asn1_meth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, dsa_asn1_meth) +#define ec_GFp_mont_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_mont_add) +#define ec_GFp_mont_bignum_to_felem BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_mont_bignum_to_felem) +#define ec_GFp_mont_dbl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_mont_dbl) +#define ec_GFp_mont_felem_mul BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_mont_felem_mul) +#define ec_GFp_mont_felem_sqr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_mont_felem_sqr) +#define ec_GFp_mont_felem_to_bignum BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_mont_felem_to_bignum) +#define ec_GFp_mont_group_finish BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_mont_group_finish) +#define ec_GFp_mont_group_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_mont_group_init) +#define ec_GFp_mont_group_set_curve BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_mont_group_set_curve) +#define ec_GFp_mont_mul BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_mont_mul) +#define ec_GFp_mont_mul_base BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_mont_mul_base) +#define ec_GFp_mont_mul_public BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_mont_mul_public) +#define ec_GFp_nistp_recode_scalar_bits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_nistp_recode_scalar_bits) +#define ec_GFp_simple_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_simple_cmp) +#define ec_GFp_simple_cmp_x_coordinate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_simple_cmp_x_coordinate) +#define ec_GFp_simple_group_finish BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_simple_group_finish) +#define ec_GFp_simple_group_get_curve BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_simple_group_get_curve) +#define ec_GFp_simple_group_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_simple_group_init) +#define ec_GFp_simple_group_set_curve BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_simple_group_set_curve) +#define ec_GFp_simple_invert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_simple_invert) +#define ec_GFp_simple_is_at_infinity BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_simple_is_at_infinity) +#define ec_GFp_simple_is_on_curve BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_simple_is_on_curve) +#define ec_GFp_simple_mont_inv_mod_ord_vartime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_simple_mont_inv_mod_ord_vartime) +#define ec_GFp_simple_point_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_simple_point_copy) +#define ec_GFp_simple_point_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_simple_point_init) +#define ec_GFp_simple_point_set_affine_coordinates BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_simple_point_set_affine_coordinates) +#define ec_GFp_simple_point_set_to_infinity BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_simple_point_set_to_infinity) +#define ec_asn1_meth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_asn1_meth) +#define ec_bignum_to_felem BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_bignum_to_felem) +#define ec_bignum_to_scalar BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_bignum_to_scalar) +#define ec_cmp_x_coordinate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_cmp_x_coordinate) +#define ec_compute_wNAF BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_compute_wNAF) +#define ec_felem_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_felem_add) +#define ec_felem_equal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_felem_equal) +#define ec_felem_neg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_felem_neg) +#define ec_felem_non_zero_mask BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_felem_non_zero_mask) +#define ec_felem_select BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_felem_select) +#define ec_felem_sub BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_felem_sub) +#define ec_felem_to_bignum BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_felem_to_bignum) +#define ec_get_x_coordinate_as_scalar BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_get_x_coordinate_as_scalar) +#define ec_group_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_group_new) +#define ec_pkey_meth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_pkey_meth) +#define ec_point_get_affine_coordinate_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_point_get_affine_coordinate_bytes) +#define ec_point_mul_scalar BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_point_mul_scalar) +#define ec_point_mul_scalar_base BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_point_mul_scalar_base) +#define ec_point_mul_scalar_public BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_point_mul_scalar_public) +#define ec_random_nonzero_scalar BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_random_nonzero_scalar) +#define ec_scalar_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_scalar_add) +#define ec_scalar_equal_vartime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_scalar_equal_vartime) +#define ec_scalar_from_montgomery BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_scalar_from_montgomery) +#define ec_scalar_inv_montgomery BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_scalar_inv_montgomery) +#define ec_scalar_inv_montgomery_vartime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_scalar_inv_montgomery_vartime) +#define ec_scalar_is_zero BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_scalar_is_zero) +#define ec_scalar_mul_montgomery BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_scalar_mul_montgomery) +#define ec_scalar_to_montgomery BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_scalar_to_montgomery) +#define ec_simple_scalar_inv_montgomery BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_simple_scalar_inv_montgomery) +#define ecp_nistz256_avx2_select_w7 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ecp_nistz256_avx2_select_w7) +#define ecp_nistz256_mul_mont BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ecp_nistz256_mul_mont) +#define ecp_nistz256_neg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ecp_nistz256_neg) +#define ecp_nistz256_ord_mul_mont BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ecp_nistz256_ord_mul_mont) +#define ecp_nistz256_ord_sqr_mont BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ecp_nistz256_ord_sqr_mont) +#define ecp_nistz256_point_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ecp_nistz256_point_add) +#define ecp_nistz256_point_add_affine BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ecp_nistz256_point_add_affine) +#define ecp_nistz256_point_double BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ecp_nistz256_point_double) +#define ecp_nistz256_select_w5 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ecp_nistz256_select_w5) +#define ecp_nistz256_select_w7 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ecp_nistz256_select_w7) +#define ecp_nistz256_sqr_mont BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ecp_nistz256_sqr_mont) +#define ed25519_asn1_meth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ed25519_asn1_meth) +#define ed25519_pkey_meth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ed25519_pkey_meth) +#define gcm_ghash_4bit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, gcm_ghash_4bit) +#define gcm_ghash_avx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, gcm_ghash_avx) +#define gcm_ghash_clmul BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, gcm_ghash_clmul) +#define gcm_ghash_ssse3 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, gcm_ghash_ssse3) +#define gcm_gmult_4bit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, gcm_gmult_4bit) +#define gcm_gmult_avx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, gcm_gmult_avx) +#define gcm_gmult_clmul BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, gcm_gmult_clmul) +#define gcm_gmult_ssse3 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, gcm_gmult_ssse3) +#define gcm_init_4bit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, gcm_init_4bit) +#define gcm_init_avx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, gcm_init_avx) +#define gcm_init_clmul BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, gcm_init_clmul) +#define gcm_init_ssse3 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, gcm_init_ssse3) +#define i2a_ACCESS_DESCRIPTION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2a_ACCESS_DESCRIPTION) +#define i2a_ASN1_ENUMERATED BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2a_ASN1_ENUMERATED) +#define i2a_ASN1_INTEGER BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2a_ASN1_INTEGER) +#define i2a_ASN1_OBJECT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2a_ASN1_OBJECT) +#define i2a_ASN1_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2a_ASN1_STRING) +#define i2c_ASN1_BIT_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2c_ASN1_BIT_STRING) +#define i2c_ASN1_INTEGER BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2c_ASN1_INTEGER) +#define i2d_ACCESS_DESCRIPTION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ACCESS_DESCRIPTION) +#define i2d_ASN1_BIT_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_BIT_STRING) +#define i2d_ASN1_BMPSTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_BMPSTRING) +#define i2d_ASN1_BOOLEAN BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_BOOLEAN) +#define i2d_ASN1_ENUMERATED BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_ENUMERATED) +#define i2d_ASN1_GENERALIZEDTIME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_GENERALIZEDTIME) +#define i2d_ASN1_GENERALSTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_GENERALSTRING) +#define i2d_ASN1_IA5STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_IA5STRING) +#define i2d_ASN1_INTEGER BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_INTEGER) +#define i2d_ASN1_NULL BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_NULL) +#define i2d_ASN1_OBJECT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_OBJECT) +#define i2d_ASN1_OCTET_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_OCTET_STRING) +#define i2d_ASN1_PRINTABLE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_PRINTABLE) +#define i2d_ASN1_PRINTABLESTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_PRINTABLESTRING) +#define i2d_ASN1_SEQUENCE_ANY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_SEQUENCE_ANY) +#define i2d_ASN1_SET_ANY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_SET_ANY) +#define i2d_ASN1_T61STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_T61STRING) +#define i2d_ASN1_TIME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_TIME) +#define i2d_ASN1_TYPE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_TYPE) +#define i2d_ASN1_UNIVERSALSTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_UNIVERSALSTRING) +#define i2d_ASN1_UTCTIME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_UTCTIME) +#define i2d_ASN1_UTF8STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_UTF8STRING) +#define i2d_ASN1_VISIBLESTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_VISIBLESTRING) +#define i2d_AUTHORITY_INFO_ACCESS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_AUTHORITY_INFO_ACCESS) +#define i2d_AUTHORITY_KEYID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_AUTHORITY_KEYID) +#define i2d_BASIC_CONSTRAINTS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_BASIC_CONSTRAINTS) +#define i2d_CERTIFICATEPOLICIES BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_CERTIFICATEPOLICIES) +#define i2d_CRL_DIST_POINTS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_CRL_DIST_POINTS) +#define i2d_DHparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DHparams) +#define i2d_DHparams_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DHparams_bio) +#define i2d_DIRECTORYSTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DIRECTORYSTRING) +#define i2d_DISPLAYTEXT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DISPLAYTEXT) +#define i2d_DIST_POINT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DIST_POINT) +#define i2d_DIST_POINT_NAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DIST_POINT_NAME) +#define i2d_DSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DSAPrivateKey) +#define i2d_DSAPrivateKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DSAPrivateKey_bio) +#define i2d_DSAPrivateKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DSAPrivateKey_fp) +#define i2d_DSAPublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DSAPublicKey) +#define i2d_DSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DSA_PUBKEY) +#define i2d_DSA_PUBKEY_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DSA_PUBKEY_bio) +#define i2d_DSA_PUBKEY_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DSA_PUBKEY_fp) +#define i2d_DSA_SIG BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DSA_SIG) +#define i2d_DSAparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DSAparams) +#define i2d_ECDSA_SIG BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ECDSA_SIG) +#define i2d_ECParameters BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ECParameters) +#define i2d_ECPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ECPrivateKey) +#define i2d_ECPrivateKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ECPrivateKey_bio) +#define i2d_ECPrivateKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ECPrivateKey_fp) +#define i2d_EC_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_EC_PUBKEY) +#define i2d_EC_PUBKEY_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_EC_PUBKEY_bio) +#define i2d_EC_PUBKEY_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_EC_PUBKEY_fp) +#define i2d_EDIPARTYNAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_EDIPARTYNAME) +#define i2d_EXTENDED_KEY_USAGE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_EXTENDED_KEY_USAGE) +#define i2d_GENERAL_NAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_GENERAL_NAME) +#define i2d_GENERAL_NAMES BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_GENERAL_NAMES) +#define i2d_ISSUING_DIST_POINT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ISSUING_DIST_POINT) +#define i2d_NETSCAPE_SPKAC BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_NETSCAPE_SPKAC) +#define i2d_NETSCAPE_SPKI BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_NETSCAPE_SPKI) +#define i2d_NOTICEREF BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_NOTICEREF) +#define i2d_OTHERNAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_OTHERNAME) +#define i2d_PKCS12 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS12) +#define i2d_PKCS12_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS12_bio) +#define i2d_PKCS12_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS12_fp) +#define i2d_PKCS7 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS7) +#define i2d_PKCS7_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS7_bio) +#define i2d_PKCS8PrivateKeyInfo_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS8PrivateKeyInfo_bio) +#define i2d_PKCS8PrivateKeyInfo_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS8PrivateKeyInfo_fp) +#define i2d_PKCS8PrivateKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS8PrivateKey_bio) +#define i2d_PKCS8PrivateKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS8PrivateKey_fp) +#define i2d_PKCS8PrivateKey_nid_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS8PrivateKey_nid_bio) +#define i2d_PKCS8PrivateKey_nid_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS8PrivateKey_nid_fp) +#define i2d_PKCS8_PRIV_KEY_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS8_PRIV_KEY_INFO) +#define i2d_PKCS8_PRIV_KEY_INFO_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS8_PRIV_KEY_INFO_bio) +#define i2d_PKCS8_PRIV_KEY_INFO_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS8_PRIV_KEY_INFO_fp) +#define i2d_PKCS8_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS8_bio) +#define i2d_PKCS8_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS8_fp) +#define i2d_PKEY_USAGE_PERIOD BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKEY_USAGE_PERIOD) +#define i2d_POLICYINFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_POLICYINFO) +#define i2d_POLICYQUALINFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_POLICYQUALINFO) +#define i2d_PROXY_CERT_INFO_EXTENSION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PROXY_CERT_INFO_EXTENSION) +#define i2d_PROXY_POLICY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PROXY_POLICY) +#define i2d_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PUBKEY) +#define i2d_PUBKEY_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PUBKEY_bio) +#define i2d_PUBKEY_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PUBKEY_fp) +#define i2d_PrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PrivateKey) +#define i2d_PrivateKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PrivateKey_bio) +#define i2d_PrivateKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PrivateKey_fp) +#define i2d_PublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PublicKey) +#define i2d_RSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_RSAPrivateKey) +#define i2d_RSAPrivateKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_RSAPrivateKey_bio) +#define i2d_RSAPrivateKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_RSAPrivateKey_fp) +#define i2d_RSAPublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_RSAPublicKey) +#define i2d_RSAPublicKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_RSAPublicKey_bio) +#define i2d_RSAPublicKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_RSAPublicKey_fp) +#define i2d_RSA_PSS_PARAMS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_RSA_PSS_PARAMS) +#define i2d_RSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_RSA_PUBKEY) +#define i2d_RSA_PUBKEY_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_RSA_PUBKEY_bio) +#define i2d_RSA_PUBKEY_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_RSA_PUBKEY_fp) +#define i2d_SXNET BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_SXNET) +#define i2d_SXNETID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_SXNETID) +#define i2d_USERNOTICE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_USERNOTICE) +#define i2d_X509 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509) +#define i2d_X509_ALGOR BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_ALGOR) +#define i2d_X509_ALGORS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_ALGORS) +#define i2d_X509_ATTRIBUTE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_ATTRIBUTE) +#define i2d_X509_AUX BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_AUX) +#define i2d_X509_CERT_AUX BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_CERT_AUX) +#define i2d_X509_CINF BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_CINF) +#define i2d_X509_CRL BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_CRL) +#define i2d_X509_CRL_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_CRL_INFO) +#define i2d_X509_CRL_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_CRL_bio) +#define i2d_X509_CRL_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_CRL_fp) +#define i2d_X509_EXTENSION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_EXTENSION) +#define i2d_X509_EXTENSIONS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_EXTENSIONS) +#define i2d_X509_NAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_NAME) +#define i2d_X509_NAME_ENTRY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_NAME_ENTRY) +#define i2d_X509_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_PUBKEY) +#define i2d_X509_REQ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_REQ) +#define i2d_X509_REQ_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_REQ_INFO) +#define i2d_X509_REQ_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_REQ_bio) +#define i2d_X509_REQ_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_REQ_fp) +#define i2d_X509_REVOKED BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_REVOKED) +#define i2d_X509_SIG BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_SIG) +#define i2d_X509_VAL BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_VAL) +#define i2d_X509_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_bio) +#define i2d_X509_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_fp) +#define i2d_re_X509_CRL_tbs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_re_X509_CRL_tbs) +#define i2d_re_X509_REQ_tbs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_re_X509_REQ_tbs) +#define i2d_re_X509_tbs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_re_X509_tbs) +#define i2o_ECPublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2o_ECPublicKey) +#define i2s_ASN1_ENUMERATED BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2s_ASN1_ENUMERATED) +#define i2s_ASN1_ENUMERATED_TABLE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2s_ASN1_ENUMERATED_TABLE) +#define i2s_ASN1_INTEGER BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2s_ASN1_INTEGER) +#define i2s_ASN1_OCTET_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2s_ASN1_OCTET_STRING) +#define i2t_ASN1_OBJECT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2t_ASN1_OBJECT) +#define i2v_ASN1_BIT_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2v_ASN1_BIT_STRING) +#define i2v_GENERAL_NAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2v_GENERAL_NAME) +#define i2v_GENERAL_NAMES BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2v_GENERAL_NAMES) +#define kBoringSSLRSASqrtTwo BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, kBoringSSLRSASqrtTwo) +#define kBoringSSLRSASqrtTwoLen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, kBoringSSLRSASqrtTwoLen) +#define kOpenSSLReasonStringData BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, kOpenSSLReasonStringData) +#define kOpenSSLReasonValues BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, kOpenSSLReasonValues) +#define kOpenSSLReasonValuesLen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, kOpenSSLReasonValuesLen) +#define level_add_node BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, level_add_node) +#define level_find_node BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, level_find_node) +#define lh_delete BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, lh_delete) +#define lh_doall_arg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, lh_doall_arg) +#define lh_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, lh_free) +#define lh_insert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, lh_insert) +#define lh_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, lh_new) +#define lh_num_items BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, lh_num_items) +#define lh_retrieve BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, lh_retrieve) +#define lh_retrieve_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, lh_retrieve_key) +#define lh_strhash BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, lh_strhash) +#define md4_block_data_order BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, md4_block_data_order) +#define md5_block_asm_data_order BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, md5_block_asm_data_order) +#define o2i_ECPublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, o2i_ECPublicKey) +#define pkcs12_iterations_acceptable BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, pkcs12_iterations_acceptable) +#define pkcs12_key_gen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, pkcs12_key_gen) +#define pkcs12_pbe_encrypt_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, pkcs12_pbe_encrypt_init) +#define pkcs7_bundle BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, pkcs7_bundle) +#define pkcs7_parse_header BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, pkcs7_parse_header) +#define pkcs8_pbe_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, pkcs8_pbe_decrypt) +#define policy_cache_find_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, policy_cache_find_data) +#define policy_cache_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, policy_cache_free) +#define policy_cache_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, policy_cache_set) +#define policy_cache_set_mapping BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, policy_cache_set_mapping) +#define policy_data_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, policy_data_free) +#define policy_data_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, policy_data_new) +#define policy_node_cmp_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, policy_node_cmp_new) +#define policy_node_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, policy_node_free) +#define policy_node_match BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, policy_node_match) +#define poly_Rq_mul BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, poly_Rq_mul) +#define rand_fork_unsafe_buffering_enabled BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, rand_fork_unsafe_buffering_enabled) +#define rsa_asn1_meth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, rsa_asn1_meth) +#define rsa_default_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, rsa_default_decrypt) +#define rsa_default_private_transform BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, rsa_default_private_transform) +#define rsa_default_sign_raw BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, rsa_default_sign_raw) +#define rsa_default_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, rsa_default_size) +#define rsa_pkey_meth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, rsa_pkey_meth) +#define rsaz_1024_gather5_avx2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, rsaz_1024_gather5_avx2) +#define rsaz_1024_mul_avx2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, rsaz_1024_mul_avx2) +#define rsaz_1024_norm2red_avx2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, rsaz_1024_norm2red_avx2) +#define rsaz_1024_red2norm_avx2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, rsaz_1024_red2norm_avx2) +#define rsaz_1024_scatter5_avx2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, rsaz_1024_scatter5_avx2) +#define rsaz_1024_sqr_avx2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, rsaz_1024_sqr_avx2) +#define s2i_ASN1_INTEGER BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, s2i_ASN1_INTEGER) +#define s2i_ASN1_OCTET_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, s2i_ASN1_OCTET_STRING) +#define sha1_block_data_order BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sha1_block_data_order) +#define sha256_block_data_order BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sha256_block_data_order) +#define sha512_block_data_order BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sha512_block_data_order) +#define sk_deep_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_deep_copy) +#define sk_delete BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_delete) +#define sk_delete_ptr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_delete_ptr) +#define sk_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_dup) +#define sk_find BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_find) +#define sk_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_free) +#define sk_insert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_insert) +#define sk_is_sorted BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_is_sorted) +#define sk_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_new) +#define sk_new_null BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_new_null) +#define sk_num BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_num) +#define sk_pop BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_pop) +#define sk_pop_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_pop_free) +#define sk_pop_free_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_pop_free_ex) +#define sk_push BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_push) +#define sk_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_set) +#define sk_set_cmp_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_set_cmp_func) +#define sk_shift BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_shift) +#define sk_sort BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_sort) +#define sk_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_value) +#define sk_zero BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_zero) +#define tree_find_sk BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, tree_find_sk) +#define v2i_ASN1_BIT_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v2i_ASN1_BIT_STRING) +#define v2i_GENERAL_NAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v2i_GENERAL_NAME) +#define v2i_GENERAL_NAMES BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v2i_GENERAL_NAMES) +#define v2i_GENERAL_NAME_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v2i_GENERAL_NAME_ex) +#define v3_akey_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_akey_id) +#define v3_alt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_alt) +#define v3_bcons BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_bcons) +#define v3_cpols BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_cpols) +#define v3_crl_invdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_crl_invdate) +#define v3_crl_num BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_crl_num) +#define v3_crl_reason BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_crl_reason) +#define v3_crld BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_crld) +#define v3_delta_crl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_delta_crl) +#define v3_ext_ku BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_ext_ku) +#define v3_freshest_crl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_freshest_crl) +#define v3_idp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_idp) +#define v3_info BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_info) +#define v3_inhibit_anyp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_inhibit_anyp) +#define v3_key_usage BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_key_usage) +#define v3_name_constraints BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_name_constraints) +#define v3_ns_ia5_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_ns_ia5_list) +#define v3_nscert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_nscert) +#define v3_ocsp_accresp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_ocsp_accresp) +#define v3_ocsp_nocheck BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_ocsp_nocheck) +#define v3_pci BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_pci) +#define v3_pkey_usage_period BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_pkey_usage_period) +#define v3_policy_constraints BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_policy_constraints) +#define v3_policy_mappings BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_policy_mappings) +#define v3_sinfo BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_sinfo) +#define v3_skey_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_skey_id) +#define v3_sxnet BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_sxnet) +#define vpaes_cbc_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, vpaes_cbc_encrypt) +#define vpaes_ctr32_encrypt_blocks BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, vpaes_ctr32_encrypt_blocks) +#define vpaes_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, vpaes_decrypt) +#define vpaes_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, vpaes_encrypt) +#define vpaes_set_decrypt_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, vpaes_set_decrypt_key) +#define vpaes_set_encrypt_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, vpaes_set_encrypt_key) +#define x25519_asn1_meth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x25519_asn1_meth) +#define x25519_ge_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x25519_ge_add) +#define x25519_ge_frombytes_vartime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x25519_ge_frombytes_vartime) +#define x25519_ge_p1p1_to_p2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x25519_ge_p1p1_to_p2) +#define x25519_ge_p1p1_to_p3 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x25519_ge_p1p1_to_p3) +#define x25519_ge_p3_to_cached BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x25519_ge_p3_to_cached) +#define x25519_ge_scalarmult BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x25519_ge_scalarmult) +#define x25519_ge_scalarmult_base BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x25519_ge_scalarmult_base) +#define x25519_ge_scalarmult_small_precomp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x25519_ge_scalarmult_small_precomp) +#define x25519_ge_sub BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x25519_ge_sub) +#define x25519_ge_tobytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x25519_ge_tobytes) +#define x25519_pkey_meth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x25519_pkey_meth) +#define x25519_sc_reduce BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x25519_sc_reduce) +#define x509_digest_sign_algorithm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x509_digest_sign_algorithm) +#define x509_digest_verify_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x509_digest_verify_init) +#define x509_print_rsa_pss_params BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x509_print_rsa_pss_params) +#define x509_rsa_ctx_to_pss BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x509_rsa_ctx_to_pss) +#define x509_rsa_pss_to_ctx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x509_rsa_pss_to_ctx) +#define x509v3_bytes_to_hex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x509v3_bytes_to_hex) +#define x509v3_hex_to_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x509v3_hex_to_bytes) +#define x509v3_looks_like_dns_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x509v3_looks_like_dns_name) +#define x509v3_name_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x509v3_name_cmp) diff --git a/templates/src/objective-c/BoringSSL-GRPC.podspec.template b/templates/src/objective-c/BoringSSL-GRPC.podspec.template index f680c8af153..a9ef8a4e3ca 100644 --- a/templates/src/objective-c/BoringSSL-GRPC.podspec.template +++ b/templates/src/objective-c/BoringSSL-GRPC.podspec.template @@ -223,8 +223,8 @@ % endfor EOF - # Grab prefix header from GCS - curl -o include/openssl/boringssl_prefix_symbols.h https://storage.googleapis.com/grpc_boringssl_prefix_headers/boringssl_prefix_symbols-${boringssl_commit}.h + # Grab prefix header from Github repo + curl -o include/openssl/boringssl_prefix_symbols.h -L https://raw.githubusercontent.com/grpc/grpc/master/src/objective-c/boringssl_prefix_headers/boringssl_prefix_symbols-${boringssl_commit}.h # We are renaming openssl to openssl_grpc so that there is no conflict with openssl if it exists find . -type f \\( -path '*.h' -or -path '*.cc' -or -path '*.c' \\) -print0 | xargs -0 -L1 sed -E -i'.grpc_back' 's;#include Date: Fri, 15 Nov 2019 10:46:12 -0800 Subject: [PATCH 016/758] generate project --- src/objective-c/BoringSSL-GRPC.podspec | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/objective-c/BoringSSL-GRPC.podspec b/src/objective-c/BoringSSL-GRPC.podspec index 2bee72c52a8..8d2d07d01d5 100644 --- a/src/objective-c/BoringSSL-GRPC.podspec +++ b/src/objective-c/BoringSSL-GRPC.podspec @@ -1622,8 +1622,8 @@ Pod::Spec.new do |s| EOF - # Grab prefix header from GCS - curl -o include/openssl/boringssl_prefix_symbols.h https://storage.googleapis.com/grpc_boringssl_prefix_headers/boringssl_prefix_symbols-7f02881e96e51f1873afcf384d02f782b48967ca.h + # Grab prefix header from Github repo + curl -o include/openssl/boringssl_prefix_symbols.h -L https://raw.githubusercontent.com/grpc/grpc/master/src/objective-c/boringssl_prefix_headers/boringssl_prefix_symbols-7f02881e96e51f1873afcf384d02f782b48967ca.h # We are renaming openssl to openssl_grpc so that there is no conflict with openssl if it exists find . -type f \\( -path '*.h' -or -path '*.cc' -or -path '*.c' \\) -print0 | xargs -0 -L1 sed -E -i'.grpc_back' 's;#include Date: Thu, 21 Nov 2019 16:09:06 -0800 Subject: [PATCH 017/758] Use compressed header file --- .gitignore | 1 + .../BoringSSL-GRPC.podspec.template | 6 +- .../BoringSSL-GRPC.podspec.template-e | 249 ------------------ tools/distrib/upgrade_boringssl_objc.sh | 1 - .../generate_boringssl_prefix_header.sh | 2 +- 5 files changed, 7 insertions(+), 252 deletions(-) delete mode 100644 templates/src/objective-c/BoringSSL-GRPC.podspec.template-e diff --git a/.gitignore b/.gitignore index 47b2a77fc97..ce66117d008 100644 --- a/.gitignore +++ b/.gitignore @@ -95,6 +95,7 @@ DerivedData *.pbobjc.* *.pbrpc.* src/objective-c/**/Build +src/objective-c/boringssl_prefix_headers # Cocoapods artifacts Pods/ diff --git a/templates/src/objective-c/BoringSSL-GRPC.podspec.template b/templates/src/objective-c/BoringSSL-GRPC.podspec.template index a9ef8a4e3ca..487ba5a9cdc 100644 --- a/templates/src/objective-c/BoringSSL-GRPC.podspec.template +++ b/templates/src/objective-c/BoringSSL-GRPC.podspec.template @@ -224,7 +224,11 @@ EOF # Grab prefix header from Github repo - curl -o include/openssl/boringssl_prefix_symbols.h -L https://raw.githubusercontent.com/grpc/grpc/master/src/objective-c/boringssl_prefix_headers/boringssl_prefix_symbols-${boringssl_commit}.h + base64 -D | gunzip > include/openssl/boringssl_prefix_symbols.h < - - # This file has been automatically generated from a template file. - # Please make modifications to - # `templates/src/objective-c/BoringSSL-GRPC.podspec.template` instead. This - # file can be regenerated from the template by running - # `tools/buildgen/generate_projects.sh`. Because of some limitations of this - # template, you might actually need to run the same script twice in a row. - # (see err_data.c section) - - # BoringSSL CocoaPods podspec - - # Copyright 2015, Google Inc. - # All rights reserved. - # - # Redistribution and use in source and binary forms, with or without - # modification, are permitted provided that the following conditions are - # met: - # - # * Redistributions of source code must retain the above copyright - # notice, this list of conditions and the following disclaimer. - # * Redistributions in binary form must reproduce the above - # copyright notice, this list of conditions and the following disclaimer - # in the documentation and/or other materials provided with the - # distribution. - # * Neither the name of Google Inc. nor the names of its - # contributors may be used to endorse or promote products derived from - # this software without specific prior written permission. - # - # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - Pod::Spec.new do |s| - s.name = 'BoringSSL-GRPC' - version = '0.0.5' - s.version = version - s.summary = 'BoringSSL is a fork of OpenSSL that is designed to meet Google\'s needs.' - # Adapted from the homepage: - s.description = <<-DESC - BoringSSL is a fork of OpenSSL that is designed to meet Google's needs. - - Although BoringSSL is an open source project, it is not intended for general use, as OpenSSL is. - We don't recommend that third parties depend upon it. Doing so is likely to be frustrating - because there are no guarantees of API stability. Only the latest version of this pod is - supported, and every new version is a new major version. - - We update Google libraries and programs that use BoringSSL as needed when deciding to make API - changes. This allows us to mostly avoid compromises in the name of compatibility. It works for - us, but it may not work for you. - - As a Cocoapods pod, it has the advantage over OpenSSL's pods that the library doesn't need to - be precompiled. This eliminates the 10 - 20 minutes of wait the first time a user does "pod - install", lets it be used as a dynamic framework (pending solution of Cocoapods' issue #4605), - and works with bitcode automatically. It's also thought to be smaller than OpenSSL (which takes - 1MB - 2MB per ARM architecture), but we don't have specific numbers yet. - - BoringSSL arose because Google used OpenSSL for many years in various ways and, over time, built - up a large number of patches that were maintained while tracking upstream OpenSSL. As Google's - product portfolio became more complex, more copies of OpenSSL sprung up and the effort involved - in maintaining all these patches in multiple places was growing steadily. - - Currently BoringSSL is the SSL library in Chrome/Chromium, Android (but it's not part of the - NDK) and a number of other apps/programs. - DESC - s.homepage = 'https://github.com/google/boringssl' - s.license = { :type => 'Mixed', :file => 'LICENSE' } - # "The name and email addresses of the library maintainers, not the Podspec maintainer." - s.authors = 'Adam Langley', 'David Benjamin', 'Matt Braithwaite' - - s.source = { - :git => 'https://github.com/google/boringssl.git', - :commit => "${boringssl_commit}", - } - - s.ios.deployment_target = '7.0' - s.osx.deployment_target = '10.7' - s.tvos.deployment_target = '10.0' - s.watchos.deployment_target = '4.0' - - name = 'openssl_grpc' - - # When creating a dynamic framework, name it openssl.framework instead of BoringSSL.framework. - # This lets users write their includes like `#include ` as opposed to `#include - # `. - s.module_name = name - - # When creating a dynamic framework, copy the headers under `include/openssl/` into the root of - # the `Headers/` directory of the framework (i.e., not under `Headers/include/openssl`). - # - # TODO(jcanizales): Debug why this doesn't work on macOS. - s.header_mappings_dir = 'include/openssl' - - # The above has an undesired effect when creating a static library: It forces users to write - # includes like `#include `. `s.header_dir` adds a path prefix to that, and - # because Cocoapods lets omit the pod name when including headers of static libraries, the - # following lets users write `#include `. - s.header_dir = name - - # The module map and umbrella header created automatically by Cocoapods don't work for C libraries - # like this one. The following file, and a correct umbrella header, are created on the fly by the - # `prepare_command` of this pod. - s.module_map = 'include/openssl/BoringSSL.modulemap' - - # We don't need to inhibit all warnings; only -Wno-shorten-64-to-32. But Cocoapods' linter doesn't - # want that for some reason. - s.compiler_flags = '-DOPENSSL_NO_ASM', '-GCC_WARN_INHIBIT_ALL_WARNINGS', '-w' - s.requires_arc = false - - # Like many other C libraries, BoringSSL has its public headers under `include//` and its - # sources and private headers in other directories outside `include/`. Cocoapods' linter doesn't - # allow any header to be listed outside the `header_mappings_dir` (even though doing so works in - # practice). Because we need our `header_mappings_dir` to be `include/openssl/` for the reason - # mentioned above, we work around the linter limitation by dividing the pod into two subspecs, one - # for public headers and the other for implementation. Each gets its own `header_mappings_dir`, - # making the linter happy. - s.subspec 'Interface' do |ss| - ss.header_mappings_dir = 'include/openssl' - ss.source_files = 'include/openssl/*.h' - end - s.subspec 'Implementation' do |ss| - ss.header_mappings_dir = '.' - ss.source_files = 'ssl/*.{h,c,cc}', - 'ssl/**/*.{h,c,cc}', - 'crypto/*.{h,c,cc}', - 'crypto/**/*.{h,c,cc}', - # We have to include fiat because spake25519 depends on it - 'third_party/fiat/*.{h,c,cc}', - # Include the err_data.c generated in prepare_command below - 'err_data.c' - - ss.private_header_files = 'ssl/*.h', - 'ssl/**/*.h', - 'crypto/*.h', - 'crypto/**/*.h', - 'third_party/fiat/*.h' - # bcm.c includes other source files, creating duplicated symbols. Since it is not used, we - # explicitly exclude it from the pod. - # TODO (mxyan): Work with BoringSSL team to remove this hack. - ss.exclude_files = 'crypto/fipsmodule/bcm.c', - '**/*_test.*', - '**/test_*.*', - '**/test/*.*' - - ss.dependency "#{s.name}/Interface", version - end - - s.prepare_command = <<-END_OF_COMMAND - # Add a module map and an umbrella header - cat > include/openssl/umbrella.h < include/openssl/BoringSSL.modulemap < err_data.c < /output/boringssl_prefix_symbols.h.gz.base64 exit 0 From 761a2f4e0ffaf7250b754899e585cce61e61dd3e Mon Sep 17 00:00:00 2001 From: Muxi Yan Date: Thu, 21 Nov 2019 16:21:34 -0800 Subject: [PATCH 018/758] Updated BoringSSL-GRPC.podspec --- src/objective-c/BoringSSL-GRPC.podspec | 487 ++++++++++++++++++++++++- 1 file changed, 486 insertions(+), 1 deletion(-) diff --git a/src/objective-c/BoringSSL-GRPC.podspec b/src/objective-c/BoringSSL-GRPC.podspec index 8d2d07d01d5..fd48b112cb7 100644 --- a/src/objective-c/BoringSSL-GRPC.podspec +++ b/src/objective-c/BoringSSL-GRPC.podspec @@ -1623,7 +1623,492 @@ Pod::Spec.new do |s| EOF # Grab prefix header from Github repo - curl -o include/openssl/boringssl_prefix_symbols.h -L https://raw.githubusercontent.com/grpc/grpc/master/src/objective-c/boringssl_prefix_headers/boringssl_prefix_symbols-7f02881e96e51f1873afcf384d02f782b48967ca.h + base64 -D | gunzip > include/openssl/boringssl_prefix_symbols.h < Date: Fri, 22 Nov 2019 08:18:11 -0800 Subject: [PATCH 019/758] Fix prefix header prepare command --- src/objective-c/BoringSSL-GRPC.podspec | 2 +- templates/src/objective-c/BoringSSL-GRPC.podspec.template | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/objective-c/BoringSSL-GRPC.podspec b/src/objective-c/BoringSSL-GRPC.podspec index fd48b112cb7..c1cc5d3e110 100644 --- a/src/objective-c/BoringSSL-GRPC.podspec +++ b/src/objective-c/BoringSSL-GRPC.podspec @@ -1623,7 +1623,7 @@ Pod::Spec.new do |s| EOF # Grab prefix header from Github repo - base64 -D | gunzip > include/openssl/boringssl_prefix_symbols.h < include/openssl/boringssl_prefix_symbols.h H4sICIwn110AA2JvcmluZ3NzbF9wcmVmaXhfc3ltYm9scy5oAK2dXXPbRpa/7/dTqP57s1s1tWvJ cSZzSUt0zI0taUg6G+8NCiRBCWOSYABQtvPp/9147ZdzGvgduCo1kwh4ngM2Gv2GRvd///fVbXb+ nqdPz+XVf2z/8+rm1fUvf7v6NcueDsnV4rT9r3/77/9W/1w9JvkxLYo0O12V2dWlSP52tVXg366O diff --git a/templates/src/objective-c/BoringSSL-GRPC.podspec.template b/templates/src/objective-c/BoringSSL-GRPC.podspec.template index 487ba5a9cdc..2024689d6c1 100644 --- a/templates/src/objective-c/BoringSSL-GRPC.podspec.template +++ b/templates/src/objective-c/BoringSSL-GRPC.podspec.template @@ -224,7 +224,7 @@ EOF # Grab prefix header from Github repo - base64 -D | gunzip > include/openssl/boringssl_prefix_symbols.h < include/openssl/boringssl_prefix_symbols.h % for line in open("src/objective-c/boringssl_prefix_headers/boringssl_prefix_symbols.h.gz.base64", "r").readlines(): ${line}\ % endfor From b7a467d463a7dd7cf54982f215388b5cf4fad3ac Mon Sep 17 00:00:00 2001 From: Muxi Yan Date: Fri, 22 Nov 2019 10:46:00 -0800 Subject: [PATCH 020/758] Remove build references to grpc_shadow_boringssl.h --- BUILD | 10 ---------- BUILD.gn | 1 - build.yaml | 6 ------ gRPC-C++.podspec | 2 -- gRPC-Core.podspec | 2 -- grpc.gemspec | 1 - package.xml | 1 - tools/doxygen/Doxyfile.core.internal | 1 - 8 files changed, 24 deletions(-) diff --git a/BUILD b/BUILD index 7cc070e4ba0..d65a16cdc71 100644 --- a/BUILD +++ b/BUILD @@ -1713,7 +1713,6 @@ grpc_cc_library( deps = [ "alts_util", "grpc_base", - "grpc_shadow_boringssl", "grpc_transport_chttp2_alpn", "tsi", ], @@ -1954,7 +1953,6 @@ grpc_cc_library( deps = [ "gpr", "grpc_base", - "grpc_shadow_boringssl", "tsi_interface", ], ) @@ -2023,7 +2021,6 @@ grpc_cc_library( "alts_util", "gpr", "grpc_base", - "grpc_shadow_boringssl", "grpc_transport_chttp2_client_insecure", "tsi_interface", ], @@ -2309,13 +2306,6 @@ grpc_cc_library( ], ) -grpc_cc_library( - name = "grpc_shadow_boringssl", - hdrs = [ - "src/core/tsi/grpc_shadow_boringssl.h", - ], -) - # Once upb code-gen issue is resolved, use the targets commented below to replace the ones using # upb-generated files. diff --git a/BUILD.gn b/BUILD.gn index a69a8e0940a..50efcd393e2 100644 --- a/BUILD.gn +++ b/BUILD.gn @@ -887,7 +887,6 @@ config("grpc_config") { "src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.h", "src/core/tsi/fake_transport_security.cc", "src/core/tsi/fake_transport_security.h", - "src/core/tsi/grpc_shadow_boringssl.h", "src/core/tsi/local_transport_security.cc", "src/core/tsi/local_transport_security.h", "src/core/tsi/ssl/session_cache/ssl_session.h", diff --git a/build.yaml b/build.yaml index 364f3bfcb50..16e30871791 100644 --- a/build.yaml +++ b/build.yaml @@ -59,7 +59,6 @@ filegroups: - grpc_transport_chttp2_client_insecure - tsi_interface - tsi - - grpc_shadow_boringssl - name: alts_upb headers: - src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h @@ -1343,7 +1342,6 @@ filegroups: - grpc_base - grpc_transport_chttp2_alpn - tsi - - grpc_shadow_boringssl - name: grpc_server_backward_compatibility headers: - src/core/ext/filters/workarounds/workaround_utils.h @@ -1351,9 +1349,6 @@ filegroups: - src/core/ext/filters/workarounds/workaround_utils.cc uses: - grpc_base -- name: grpc_shadow_boringssl - headers: - - src/core/tsi/grpc_shadow_boringssl.h - name: grpc_test_util_base headers: - src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h @@ -1646,7 +1641,6 @@ filegroups: - tsi_interface - grpc_base - grpc_trace - - grpc_shadow_boringssl - name: tsi_interface headers: - src/core/tsi/transport_security.h diff --git a/gRPC-C++.podspec b/gRPC-C++.podspec index 26340b79601..86456e70612 100644 --- a/gRPC-C++.podspec +++ b/gRPC-C++.podspec @@ -616,7 +616,6 @@ Pod::Spec.new do |s| 'src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.h', 'src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.h', 'src/core/tsi/fake_transport_security.h', - 'src/core/tsi/grpc_shadow_boringssl.h', 'src/core/tsi/local_transport_security.h', 'src/core/tsi/ssl/session_cache/ssl_session.h', 'src/core/tsi/ssl/session_cache/ssl_session_cache.h', @@ -1208,7 +1207,6 @@ Pod::Spec.new do |s| 'src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.h', 'src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.h', 'src/core/tsi/fake_transport_security.h', - 'src/core/tsi/grpc_shadow_boringssl.h', 'src/core/tsi/local_transport_security.h', 'src/core/tsi/ssl/session_cache/ssl_session.h', 'src/core/tsi/ssl/session_cache/ssl_session_cache.h', diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec index f09fc1240f0..334750f3412 100644 --- a/gRPC-Core.podspec +++ b/gRPC-Core.podspec @@ -939,7 +939,6 @@ Pod::Spec.new do |s| 'src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.h', 'src/core/tsi/fake_transport_security.cc', 'src/core/tsi/fake_transport_security.h', - 'src/core/tsi/grpc_shadow_boringssl.h', 'src/core/tsi/local_transport_security.cc', 'src/core/tsi/local_transport_security.h', 'src/core/tsi/ssl/session_cache/ssl_session.h', @@ -1315,7 +1314,6 @@ Pod::Spec.new do |s| 'src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.h', 'src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.h', 'src/core/tsi/fake_transport_security.h', - 'src/core/tsi/grpc_shadow_boringssl.h', 'src/core/tsi/local_transport_security.h', 'src/core/tsi/ssl/session_cache/ssl_session.h', 'src/core/tsi/ssl/session_cache/ssl_session_cache.h', diff --git a/grpc.gemspec b/grpc.gemspec index d3354b1de7e..61d66ce19ec 100644 --- a/grpc.gemspec +++ b/grpc.gemspec @@ -851,7 +851,6 @@ Gem::Specification.new do |s| s.files += %w( src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.h ) s.files += %w( src/core/tsi/fake_transport_security.cc ) s.files += %w( src/core/tsi/fake_transport_security.h ) - s.files += %w( src/core/tsi/grpc_shadow_boringssl.h ) s.files += %w( src/core/tsi/local_transport_security.cc ) s.files += %w( src/core/tsi/local_transport_security.h ) s.files += %w( src/core/tsi/ssl/session_cache/ssl_session.h ) diff --git a/package.xml b/package.xml index fc63e5772b2..2531be6a414 100644 --- a/package.xml +++ b/package.xml @@ -834,7 +834,6 @@ - diff --git a/tools/doxygen/Doxyfile.core.internal b/tools/doxygen/Doxyfile.core.internal index 1b0ff5c5698..95b5f45ae55 100644 --- a/tools/doxygen/Doxyfile.core.internal +++ b/tools/doxygen/Doxyfile.core.internal @@ -1644,7 +1644,6 @@ src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc \ src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.h \ src/core/tsi/fake_transport_security.cc \ src/core/tsi/fake_transport_security.h \ -src/core/tsi/grpc_shadow_boringssl.h \ src/core/tsi/local_transport_security.cc \ src/core/tsi/local_transport_security.h \ src/core/tsi/ssl/session_cache/ssl_session.h \ From ad13cca7754bac19df7ab12020dc271987e469e7 Mon Sep 17 00:00:00 2001 From: Muxi Yan Date: Fri, 22 Nov 2019 11:01:10 -0800 Subject: [PATCH 021/758] remove temporary files --- ...7f02881e96e51f1873afcf384d02f782b48967ca.h | 3243 ----------------- ...7f02881e96e51f1873afcf384d02f782b48967ca.h | 3243 ----------------- 2 files changed, 6486 deletions(-) delete mode 100644 src/objective-c/boringssl_prefix_headers/boringssl_prefix_symbols-7f02881e96e51f1873afcf384d02f782b48967ca.h delete mode 100644 tools/dockerfile/grpc_objc/generate_boringssl_prefix_header/output/boringssl_prefix_symbols-7f02881e96e51f1873afcf384d02f782b48967ca.h diff --git a/src/objective-c/boringssl_prefix_headers/boringssl_prefix_symbols-7f02881e96e51f1873afcf384d02f782b48967ca.h b/src/objective-c/boringssl_prefix_headers/boringssl_prefix_symbols-7f02881e96e51f1873afcf384d02f782b48967ca.h deleted file mode 100644 index 173b2d432f8..00000000000 --- a/src/objective-c/boringssl_prefix_headers/boringssl_prefix_symbols-7f02881e96e51f1873afcf384d02f782b48967ca.h +++ /dev/null @@ -1,3243 +0,0 @@ -// Copyright (c) 2018, Google Inc. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -// BORINGSSL_ADD_PREFIX pastes two identifiers into one. It performs one -// iteration of macro expansion on its arguments before pasting. -#define BORINGSSL_ADD_PREFIX(a, b) BORINGSSL_ADD_PREFIX_INNER(a, b) -#define BORINGSSL_ADD_PREFIX_INNER(a, b) a ## _ ## b - -#define BIO_f_ssl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_f_ssl) -#define BIO_set_ssl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_ssl) -#define DTLS_client_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DTLS_client_method) -#define DTLS_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DTLS_method) -#define DTLS_server_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DTLS_server_method) -#define DTLS_with_buffers_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DTLS_with_buffers_method) -#define DTLSv1_2_client_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DTLSv1_2_client_method) -#define DTLSv1_2_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DTLSv1_2_method) -#define DTLSv1_2_server_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DTLSv1_2_server_method) -#define DTLSv1_client_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DTLSv1_client_method) -#define DTLSv1_get_timeout BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DTLSv1_get_timeout) -#define DTLSv1_handle_timeout BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DTLSv1_handle_timeout) -#define DTLSv1_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DTLSv1_method) -#define DTLSv1_server_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DTLSv1_server_method) -#define DTLSv1_set_initial_timeout_duration BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DTLSv1_set_initial_timeout_duration) -#define ERR_load_SSL_strings BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_load_SSL_strings) -#define OPENSSL_init_ssl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_init_ssl) -#define PEM_read_SSL_SESSION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_SSL_SESSION) -#define PEM_read_bio_SSL_SESSION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_SSL_SESSION) -#define PEM_write_SSL_SESSION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_SSL_SESSION) -#define PEM_write_bio_SSL_SESSION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_SSL_SESSION) -#define SSL_CIPHER_description BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_description) -#define SSL_CIPHER_get_auth_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_get_auth_nid) -#define SSL_CIPHER_get_bits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_get_bits) -#define SSL_CIPHER_get_cipher_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_get_cipher_nid) -#define SSL_CIPHER_get_digest_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_get_digest_nid) -#define SSL_CIPHER_get_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_get_id) -#define SSL_CIPHER_get_kx_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_get_kx_name) -#define SSL_CIPHER_get_kx_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_get_kx_nid) -#define SSL_CIPHER_get_max_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_get_max_version) -#define SSL_CIPHER_get_min_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_get_min_version) -#define SSL_CIPHER_get_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_get_name) -#define SSL_CIPHER_get_prf_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_get_prf_nid) -#define SSL_CIPHER_get_rfc_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_get_rfc_name) -#define SSL_CIPHER_get_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_get_value) -#define SSL_CIPHER_get_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_get_version) -#define SSL_CIPHER_is_aead BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_is_aead) -#define SSL_CIPHER_is_block_cipher BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_is_block_cipher) -#define SSL_CIPHER_standard_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_standard_name) -#define SSL_COMP_add_compression_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_COMP_add_compression_method) -#define SSL_COMP_free_compression_methods BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_COMP_free_compression_methods) -#define SSL_COMP_get0_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_COMP_get0_name) -#define SSL_COMP_get_compression_methods BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_COMP_get_compression_methods) -#define SSL_COMP_get_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_COMP_get_id) -#define SSL_COMP_get_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_COMP_get_name) -#define SSL_CTX_add0_chain_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_add0_chain_cert) -#define SSL_CTX_add1_chain_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_add1_chain_cert) -#define SSL_CTX_add_cert_compression_alg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_add_cert_compression_alg) -#define SSL_CTX_add_client_CA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_add_client_CA) -#define SSL_CTX_add_extra_chain_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_add_extra_chain_cert) -#define SSL_CTX_add_session BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_add_session) -#define SSL_CTX_check_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_check_private_key) -#define SSL_CTX_cipher_in_group BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_cipher_in_group) -#define SSL_CTX_clear_chain_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_clear_chain_certs) -#define SSL_CTX_clear_extra_chain_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_clear_extra_chain_certs) -#define SSL_CTX_clear_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_clear_mode) -#define SSL_CTX_clear_options BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_clear_options) -#define SSL_CTX_enable_ocsp_stapling BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_enable_ocsp_stapling) -#define SSL_CTX_enable_pq_experiment_signal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_enable_pq_experiment_signal) -#define SSL_CTX_enable_signed_cert_timestamps BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_enable_signed_cert_timestamps) -#define SSL_CTX_enable_tls_channel_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_enable_tls_channel_id) -#define SSL_CTX_flush_sessions BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_flush_sessions) -#define SSL_CTX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_free) -#define SSL_CTX_get0_certificate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get0_certificate) -#define SSL_CTX_get0_chain_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get0_chain_certs) -#define SSL_CTX_get0_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get0_param) -#define SSL_CTX_get0_privatekey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get0_privatekey) -#define SSL_CTX_get_cert_store BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_cert_store) -#define SSL_CTX_get_channel_id_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_channel_id_cb) -#define SSL_CTX_get_ciphers BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_ciphers) -#define SSL_CTX_get_client_CA_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_client_CA_list) -#define SSL_CTX_get_default_passwd_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_default_passwd_cb) -#define SSL_CTX_get_default_passwd_cb_userdata BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_default_passwd_cb_userdata) -#define SSL_CTX_get_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_ex_data) -#define SSL_CTX_get_ex_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_ex_new_index) -#define SSL_CTX_get_extra_chain_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_extra_chain_certs) -#define SSL_CTX_get_info_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_info_callback) -#define SSL_CTX_get_keylog_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_keylog_callback) -#define SSL_CTX_get_max_cert_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_max_cert_list) -#define SSL_CTX_get_max_proto_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_max_proto_version) -#define SSL_CTX_get_min_proto_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_min_proto_version) -#define SSL_CTX_get_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_mode) -#define SSL_CTX_get_options BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_options) -#define SSL_CTX_get_quiet_shutdown BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_quiet_shutdown) -#define SSL_CTX_get_read_ahead BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_read_ahead) -#define SSL_CTX_get_session_cache_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_session_cache_mode) -#define SSL_CTX_get_timeout BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_timeout) -#define SSL_CTX_get_tlsext_ticket_keys BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_tlsext_ticket_keys) -#define SSL_CTX_get_verify_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_verify_callback) -#define SSL_CTX_get_verify_depth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_verify_depth) -#define SSL_CTX_get_verify_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_verify_mode) -#define SSL_CTX_load_verify_locations BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_load_verify_locations) -#define SSL_CTX_need_tmp_RSA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_need_tmp_RSA) -#define SSL_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_new) -#define SSL_CTX_remove_session BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_remove_session) -#define SSL_CTX_sess_accept BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_accept) -#define SSL_CTX_sess_accept_good BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_accept_good) -#define SSL_CTX_sess_accept_renegotiate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_accept_renegotiate) -#define SSL_CTX_sess_cache_full BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_cache_full) -#define SSL_CTX_sess_cb_hits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_cb_hits) -#define SSL_CTX_sess_connect BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_connect) -#define SSL_CTX_sess_connect_good BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_connect_good) -#define SSL_CTX_sess_connect_renegotiate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_connect_renegotiate) -#define SSL_CTX_sess_get_cache_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_get_cache_size) -#define SSL_CTX_sess_get_get_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_get_get_cb) -#define SSL_CTX_sess_get_new_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_get_new_cb) -#define SSL_CTX_sess_get_remove_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_get_remove_cb) -#define SSL_CTX_sess_hits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_hits) -#define SSL_CTX_sess_misses BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_misses) -#define SSL_CTX_sess_number BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_number) -#define SSL_CTX_sess_set_cache_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_set_cache_size) -#define SSL_CTX_sess_set_get_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_set_get_cb) -#define SSL_CTX_sess_set_new_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_set_new_cb) -#define SSL_CTX_sess_set_remove_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_set_remove_cb) -#define SSL_CTX_sess_timeouts BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_timeouts) -#define SSL_CTX_set0_buffer_pool BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set0_buffer_pool) -#define SSL_CTX_set0_chain BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set0_chain) -#define SSL_CTX_set0_client_CAs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set0_client_CAs) -#define SSL_CTX_set0_verify_cert_store BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set0_verify_cert_store) -#define SSL_CTX_set1_chain BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set1_chain) -#define SSL_CTX_set1_curves BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set1_curves) -#define SSL_CTX_set1_curves_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set1_curves_list) -#define SSL_CTX_set1_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set1_param) -#define SSL_CTX_set1_sigalgs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set1_sigalgs) -#define SSL_CTX_set1_sigalgs_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set1_sigalgs_list) -#define SSL_CTX_set1_tls_channel_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set1_tls_channel_id) -#define SSL_CTX_set1_verify_cert_store BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set1_verify_cert_store) -#define SSL_CTX_set_allow_unknown_alpn_protos BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_allow_unknown_alpn_protos) -#define SSL_CTX_set_alpn_protos BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_alpn_protos) -#define SSL_CTX_set_alpn_select_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_alpn_select_cb) -#define SSL_CTX_set_cert_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_cert_cb) -#define SSL_CTX_set_cert_store BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_cert_store) -#define SSL_CTX_set_cert_verify_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_cert_verify_callback) -#define SSL_CTX_set_chain_and_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_chain_and_key) -#define SSL_CTX_set_channel_id_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_channel_id_cb) -#define SSL_CTX_set_cipher_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_cipher_list) -#define SSL_CTX_set_client_CA_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_client_CA_list) -#define SSL_CTX_set_client_cert_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_client_cert_cb) -#define SSL_CTX_set_current_time_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_current_time_cb) -#define SSL_CTX_set_custom_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_custom_verify) -#define SSL_CTX_set_default_passwd_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_default_passwd_cb) -#define SSL_CTX_set_default_passwd_cb_userdata BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_default_passwd_cb_userdata) -#define SSL_CTX_set_default_verify_paths BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_default_verify_paths) -#define SSL_CTX_set_dos_protection_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_dos_protection_cb) -#define SSL_CTX_set_early_data_enabled BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_early_data_enabled) -#define SSL_CTX_set_ed25519_enabled BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_ed25519_enabled) -#define SSL_CTX_set_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_ex_data) -#define SSL_CTX_set_false_start_allowed_without_alpn BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_false_start_allowed_without_alpn) -#define SSL_CTX_set_grease_enabled BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_grease_enabled) -#define SSL_CTX_set_ignore_tls13_downgrade BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_ignore_tls13_downgrade) -#define SSL_CTX_set_info_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_info_callback) -#define SSL_CTX_set_keylog_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_keylog_callback) -#define SSL_CTX_set_max_cert_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_max_cert_list) -#define SSL_CTX_set_max_proto_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_max_proto_version) -#define SSL_CTX_set_max_send_fragment BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_max_send_fragment) -#define SSL_CTX_set_min_proto_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_min_proto_version) -#define SSL_CTX_set_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_mode) -#define SSL_CTX_set_msg_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_msg_callback) -#define SSL_CTX_set_msg_callback_arg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_msg_callback_arg) -#define SSL_CTX_set_next_proto_select_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_next_proto_select_cb) -#define SSL_CTX_set_next_protos_advertised_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_next_protos_advertised_cb) -#define SSL_CTX_set_ocsp_response BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_ocsp_response) -#define SSL_CTX_set_options BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_options) -#define SSL_CTX_set_private_key_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_private_key_method) -#define SSL_CTX_set_psk_client_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_psk_client_callback) -#define SSL_CTX_set_psk_server_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_psk_server_callback) -#define SSL_CTX_set_purpose BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_purpose) -#define SSL_CTX_set_quic_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_quic_method) -#define SSL_CTX_set_quiet_shutdown BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_quiet_shutdown) -#define SSL_CTX_set_read_ahead BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_read_ahead) -#define SSL_CTX_set_retain_only_sha256_of_client_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_retain_only_sha256_of_client_certs) -#define SSL_CTX_set_reverify_on_resume BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_reverify_on_resume) -#define SSL_CTX_set_rsa_pss_rsae_certs_enabled BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_rsa_pss_rsae_certs_enabled) -#define SSL_CTX_set_select_certificate_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_select_certificate_cb) -#define SSL_CTX_set_session_cache_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_session_cache_mode) -#define SSL_CTX_set_session_id_context BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_session_id_context) -#define SSL_CTX_set_session_psk_dhe_timeout BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_session_psk_dhe_timeout) -#define SSL_CTX_set_signed_cert_timestamp_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_signed_cert_timestamp_list) -#define SSL_CTX_set_signing_algorithm_prefs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_signing_algorithm_prefs) -#define SSL_CTX_set_srtp_profiles BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_srtp_profiles) -#define SSL_CTX_set_strict_cipher_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_strict_cipher_list) -#define SSL_CTX_set_ticket_aead_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_ticket_aead_method) -#define SSL_CTX_set_timeout BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_timeout) -#define SSL_CTX_set_tls_channel_id_enabled BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_tls_channel_id_enabled) -#define SSL_CTX_set_tlsext_servername_arg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_tlsext_servername_arg) -#define SSL_CTX_set_tlsext_servername_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_tlsext_servername_callback) -#define SSL_CTX_set_tlsext_status_arg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_tlsext_status_arg) -#define SSL_CTX_set_tlsext_status_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_tlsext_status_cb) -#define SSL_CTX_set_tlsext_ticket_key_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_tlsext_ticket_key_cb) -#define SSL_CTX_set_tlsext_ticket_keys BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_tlsext_ticket_keys) -#define SSL_CTX_set_tlsext_use_srtp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_tlsext_use_srtp) -#define SSL_CTX_set_tmp_dh BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_tmp_dh) -#define SSL_CTX_set_tmp_dh_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_tmp_dh_callback) -#define SSL_CTX_set_tmp_ecdh BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_tmp_ecdh) -#define SSL_CTX_set_tmp_rsa BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_tmp_rsa) -#define SSL_CTX_set_tmp_rsa_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_tmp_rsa_callback) -#define SSL_CTX_set_trust BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_trust) -#define SSL_CTX_set_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_verify) -#define SSL_CTX_set_verify_algorithm_prefs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_verify_algorithm_prefs) -#define SSL_CTX_set_verify_depth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_verify_depth) -#define SSL_CTX_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_up_ref) -#define SSL_CTX_use_PrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_use_PrivateKey) -#define SSL_CTX_use_PrivateKey_ASN1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_use_PrivateKey_ASN1) -#define SSL_CTX_use_PrivateKey_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_use_PrivateKey_file) -#define SSL_CTX_use_RSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_use_RSAPrivateKey) -#define SSL_CTX_use_RSAPrivateKey_ASN1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_use_RSAPrivateKey_ASN1) -#define SSL_CTX_use_RSAPrivateKey_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_use_RSAPrivateKey_file) -#define SSL_CTX_use_certificate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_use_certificate) -#define SSL_CTX_use_certificate_ASN1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_use_certificate_ASN1) -#define SSL_CTX_use_certificate_chain_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_use_certificate_chain_file) -#define SSL_CTX_use_certificate_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_use_certificate_file) -#define SSL_CTX_use_psk_identity_hint BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_use_psk_identity_hint) -#define SSL_SESSION_early_data_capable BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_early_data_capable) -#define SSL_SESSION_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_free) -#define SSL_SESSION_from_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_from_bytes) -#define SSL_SESSION_get0_cipher BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get0_cipher) -#define SSL_SESSION_get0_id_context BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get0_id_context) -#define SSL_SESSION_get0_ocsp_response BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get0_ocsp_response) -#define SSL_SESSION_get0_peer BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get0_peer) -#define SSL_SESSION_get0_peer_certificates BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get0_peer_certificates) -#define SSL_SESSION_get0_peer_sha256 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get0_peer_sha256) -#define SSL_SESSION_get0_signed_cert_timestamp_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get0_signed_cert_timestamp_list) -#define SSL_SESSION_get0_ticket BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get0_ticket) -#define SSL_SESSION_get_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get_ex_data) -#define SSL_SESSION_get_ex_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get_ex_new_index) -#define SSL_SESSION_get_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get_id) -#define SSL_SESSION_get_master_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get_master_key) -#define SSL_SESSION_get_protocol_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get_protocol_version) -#define SSL_SESSION_get_ticket_lifetime_hint BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get_ticket_lifetime_hint) -#define SSL_SESSION_get_time BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get_time) -#define SSL_SESSION_get_timeout BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get_timeout) -#define SSL_SESSION_get_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get_version) -#define SSL_SESSION_has_peer_sha256 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_has_peer_sha256) -#define SSL_SESSION_has_ticket BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_has_ticket) -#define SSL_SESSION_is_resumable BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_is_resumable) -#define SSL_SESSION_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_new) -#define SSL_SESSION_set1_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_set1_id) -#define SSL_SESSION_set1_id_context BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_set1_id_context) -#define SSL_SESSION_set_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_set_ex_data) -#define SSL_SESSION_set_protocol_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_set_protocol_version) -#define SSL_SESSION_set_ticket BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_set_ticket) -#define SSL_SESSION_set_time BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_set_time) -#define SSL_SESSION_set_timeout BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_set_timeout) -#define SSL_SESSION_should_be_single_use BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_should_be_single_use) -#define SSL_SESSION_to_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_to_bytes) -#define SSL_SESSION_to_bytes_for_ticket BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_to_bytes_for_ticket) -#define SSL_SESSION_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_up_ref) -#define SSL_accept BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_accept) -#define SSL_add0_chain_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_add0_chain_cert) -#define SSL_add1_chain_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_add1_chain_cert) -#define SSL_add_client_CA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_add_client_CA) -#define SSL_add_file_cert_subjects_to_stack BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_add_file_cert_subjects_to_stack) -#define SSL_alert_desc_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_alert_desc_string) -#define SSL_alert_desc_string_long BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_alert_desc_string_long) -#define SSL_alert_from_verify_result BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_alert_from_verify_result) -#define SSL_alert_type_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_alert_type_string) -#define SSL_alert_type_string_long BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_alert_type_string_long) -#define SSL_cache_hit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_cache_hit) -#define SSL_certs_clear BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_certs_clear) -#define SSL_check_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_check_private_key) -#define SSL_clear BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_clear) -#define SSL_clear_chain_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_clear_chain_certs) -#define SSL_clear_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_clear_mode) -#define SSL_clear_options BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_clear_options) -#define SSL_connect BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_connect) -#define SSL_cutthrough_complete BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_cutthrough_complete) -#define SSL_delegated_credential_used BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_delegated_credential_used) -#define SSL_do_handshake BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_do_handshake) -#define SSL_dup_CA_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_dup_CA_list) -#define SSL_early_callback_ctx_extension_get BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_early_callback_ctx_extension_get) -#define SSL_early_data_accepted BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_early_data_accepted) -#define SSL_enable_ocsp_stapling BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_enable_ocsp_stapling) -#define SSL_enable_signed_cert_timestamps BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_enable_signed_cert_timestamps) -#define SSL_enable_tls_channel_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_enable_tls_channel_id) -#define SSL_error_description BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_error_description) -#define SSL_export_keying_material BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_export_keying_material) -#define SSL_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_free) -#define SSL_generate_key_block BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_generate_key_block) -#define SSL_get0_alpn_selected BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get0_alpn_selected) -#define SSL_get0_certificate_types BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get0_certificate_types) -#define SSL_get0_chain_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get0_chain_certs) -#define SSL_get0_next_proto_negotiated BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get0_next_proto_negotiated) -#define SSL_get0_ocsp_response BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get0_ocsp_response) -#define SSL_get0_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get0_param) -#define SSL_get0_peer_certificates BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get0_peer_certificates) -#define SSL_get0_peer_verify_algorithms BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get0_peer_verify_algorithms) -#define SSL_get0_server_requested_CAs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get0_server_requested_CAs) -#define SSL_get0_session_id_context BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get0_session_id_context) -#define SSL_get0_signed_cert_timestamp_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get0_signed_cert_timestamp_list) -#define SSL_get1_session BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get1_session) -#define SSL_get_SSL_CTX BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_SSL_CTX) -#define SSL_get_certificate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_certificate) -#define SSL_get_cipher_by_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_cipher_by_value) -#define SSL_get_cipher_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_cipher_list) -#define SSL_get_ciphers BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_ciphers) -#define SSL_get_client_CA_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_client_CA_list) -#define SSL_get_client_random BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_client_random) -#define SSL_get_current_cipher BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_current_cipher) -#define SSL_get_current_compression BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_current_compression) -#define SSL_get_current_expansion BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_current_expansion) -#define SSL_get_curve_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_curve_id) -#define SSL_get_curve_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_curve_name) -#define SSL_get_default_timeout BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_default_timeout) -#define SSL_get_early_data_reason BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_early_data_reason) -#define SSL_get_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_error) -#define SSL_get_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_ex_data) -#define SSL_get_ex_data_X509_STORE_CTX_idx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_ex_data_X509_STORE_CTX_idx) -#define SSL_get_ex_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_ex_new_index) -#define SSL_get_extms_support BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_extms_support) -#define SSL_get_fd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_fd) -#define SSL_get_finished BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_finished) -#define SSL_get_info_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_info_callback) -#define SSL_get_ivs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_ivs) -#define SSL_get_key_block_len BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_key_block_len) -#define SSL_get_max_cert_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_max_cert_list) -#define SSL_get_max_proto_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_max_proto_version) -#define SSL_get_min_proto_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_min_proto_version) -#define SSL_get_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_mode) -#define SSL_get_negotiated_token_binding_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_negotiated_token_binding_param) -#define SSL_get_options BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_options) -#define SSL_get_peer_cert_chain BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_peer_cert_chain) -#define SSL_get_peer_certificate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_peer_certificate) -#define SSL_get_peer_finished BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_peer_finished) -#define SSL_get_peer_full_cert_chain BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_peer_full_cert_chain) -#define SSL_get_peer_quic_transport_params BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_peer_quic_transport_params) -#define SSL_get_peer_signature_algorithm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_peer_signature_algorithm) -#define SSL_get_pending_cipher BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_pending_cipher) -#define SSL_get_privatekey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_privatekey) -#define SSL_get_psk_identity BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_psk_identity) -#define SSL_get_psk_identity_hint BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_psk_identity_hint) -#define SSL_get_quiet_shutdown BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_quiet_shutdown) -#define SSL_get_rbio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_rbio) -#define SSL_get_read_ahead BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_read_ahead) -#define SSL_get_read_sequence BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_read_sequence) -#define SSL_get_rfd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_rfd) -#define SSL_get_secure_renegotiation_support BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_secure_renegotiation_support) -#define SSL_get_selected_srtp_profile BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_selected_srtp_profile) -#define SSL_get_server_random BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_server_random) -#define SSL_get_server_tmp_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_server_tmp_key) -#define SSL_get_servername BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_servername) -#define SSL_get_servername_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_servername_type) -#define SSL_get_session BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_session) -#define SSL_get_shared_ciphers BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_shared_ciphers) -#define SSL_get_shutdown BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_shutdown) -#define SSL_get_signature_algorithm_digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_signature_algorithm_digest) -#define SSL_get_signature_algorithm_key_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_signature_algorithm_key_type) -#define SSL_get_signature_algorithm_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_signature_algorithm_name) -#define SSL_get_srtp_profiles BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_srtp_profiles) -#define SSL_get_ticket_age_skew BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_ticket_age_skew) -#define SSL_get_tls_channel_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_tls_channel_id) -#define SSL_get_tls_unique BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_tls_unique) -#define SSL_get_tlsext_status_ocsp_resp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_tlsext_status_ocsp_resp) -#define SSL_get_tlsext_status_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_tlsext_status_type) -#define SSL_get_verify_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_verify_callback) -#define SSL_get_verify_depth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_verify_depth) -#define SSL_get_verify_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_verify_mode) -#define SSL_get_verify_result BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_verify_result) -#define SSL_get_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_version) -#define SSL_get_wbio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_wbio) -#define SSL_get_wfd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_wfd) -#define SSL_get_write_sequence BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_write_sequence) -#define SSL_in_early_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_in_early_data) -#define SSL_in_false_start BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_in_false_start) -#define SSL_in_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_in_init) -#define SSL_is_dtls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_is_dtls) -#define SSL_is_init_finished BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_is_init_finished) -#define SSL_is_server BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_is_server) -#define SSL_is_signature_algorithm_rsa_pss BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_is_signature_algorithm_rsa_pss) -#define SSL_is_tls13_downgrade BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_is_tls13_downgrade) -#define SSL_is_token_binding_negotiated BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_is_token_binding_negotiated) -#define SSL_key_update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_key_update) -#define SSL_library_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_library_init) -#define SSL_load_client_CA_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_load_client_CA_file) -#define SSL_load_error_strings BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_load_error_strings) -#define SSL_magic_pending_session_ptr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_magic_pending_session_ptr) -#define SSL_max_seal_overhead BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_max_seal_overhead) -#define SSL_need_tmp_RSA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_need_tmp_RSA) -#define SSL_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_new) -#define SSL_num_renegotiations BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_num_renegotiations) -#define SSL_peek BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_peek) -#define SSL_pending BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_pending) -#define SSL_pq_experiment_signal_seen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_pq_experiment_signal_seen) -#define SSL_process_quic_post_handshake BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_process_quic_post_handshake) -#define SSL_provide_quic_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_provide_quic_data) -#define SSL_quic_max_handshake_flight_len BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_quic_max_handshake_flight_len) -#define SSL_quic_read_level BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_quic_read_level) -#define SSL_quic_write_level BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_quic_write_level) -#define SSL_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_read) -#define SSL_renegotiate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_renegotiate) -#define SSL_renegotiate_pending BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_renegotiate_pending) -#define SSL_reset_early_data_reject BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_reset_early_data_reject) -#define SSL_select_next_proto BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_select_next_proto) -#define SSL_send_fatal_alert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_send_fatal_alert) -#define SSL_session_reused BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_session_reused) -#define SSL_set0_chain BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set0_chain) -#define SSL_set0_client_CAs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set0_client_CAs) -#define SSL_set0_rbio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set0_rbio) -#define SSL_set0_verify_cert_store BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set0_verify_cert_store) -#define SSL_set0_wbio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set0_wbio) -#define SSL_set1_chain BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set1_chain) -#define SSL_set1_curves BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set1_curves) -#define SSL_set1_curves_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set1_curves_list) -#define SSL_set1_delegated_credential BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set1_delegated_credential) -#define SSL_set1_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set1_param) -#define SSL_set1_sigalgs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set1_sigalgs) -#define SSL_set1_sigalgs_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set1_sigalgs_list) -#define SSL_set1_tls_channel_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set1_tls_channel_id) -#define SSL_set1_verify_cert_store BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set1_verify_cert_store) -#define SSL_set_SSL_CTX BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_SSL_CTX) -#define SSL_set_accept_state BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_accept_state) -#define SSL_set_alpn_protos BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_alpn_protos) -#define SSL_set_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_bio) -#define SSL_set_cert_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_cert_cb) -#define SSL_set_chain_and_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_chain_and_key) -#define SSL_set_cipher_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_cipher_list) -#define SSL_set_client_CA_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_client_CA_list) -#define SSL_set_connect_state BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_connect_state) -#define SSL_set_custom_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_custom_verify) -#define SSL_set_early_data_enabled BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_early_data_enabled) -#define SSL_set_enforce_rsa_key_usage BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_enforce_rsa_key_usage) -#define SSL_set_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_ex_data) -#define SSL_set_fd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_fd) -#define SSL_set_ignore_tls13_downgrade BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_ignore_tls13_downgrade) -#define SSL_set_info_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_info_callback) -#define SSL_set_jdk11_workaround BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_jdk11_workaround) -#define SSL_set_max_cert_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_max_cert_list) -#define SSL_set_max_proto_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_max_proto_version) -#define SSL_set_max_send_fragment BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_max_send_fragment) -#define SSL_set_min_proto_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_min_proto_version) -#define SSL_set_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_mode) -#define SSL_set_msg_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_msg_callback) -#define SSL_set_msg_callback_arg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_msg_callback_arg) -#define SSL_set_mtu BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_mtu) -#define SSL_set_ocsp_response BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_ocsp_response) -#define SSL_set_options BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_options) -#define SSL_set_private_key_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_private_key_method) -#define SSL_set_psk_client_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_psk_client_callback) -#define SSL_set_psk_server_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_psk_server_callback) -#define SSL_set_purpose BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_purpose) -#define SSL_set_quic_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_quic_method) -#define SSL_set_quic_transport_params BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_quic_transport_params) -#define SSL_set_quiet_shutdown BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_quiet_shutdown) -#define SSL_set_read_ahead BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_read_ahead) -#define SSL_set_renegotiate_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_renegotiate_mode) -#define SSL_set_retain_only_sha256_of_client_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_retain_only_sha256_of_client_certs) -#define SSL_set_rfd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_rfd) -#define SSL_set_session BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_session) -#define SSL_set_session_id_context BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_session_id_context) -#define SSL_set_shed_handshake_config BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_shed_handshake_config) -#define SSL_set_shutdown BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_shutdown) -#define SSL_set_signed_cert_timestamp_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_signed_cert_timestamp_list) -#define SSL_set_signing_algorithm_prefs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_signing_algorithm_prefs) -#define SSL_set_srtp_profiles BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_srtp_profiles) -#define SSL_set_state BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_state) -#define SSL_set_strict_cipher_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_strict_cipher_list) -#define SSL_set_tls_channel_id_enabled BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_tls_channel_id_enabled) -#define SSL_set_tlsext_host_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_tlsext_host_name) -#define SSL_set_tlsext_status_ocsp_resp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_tlsext_status_ocsp_resp) -#define SSL_set_tlsext_status_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_tlsext_status_type) -#define SSL_set_tlsext_use_srtp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_tlsext_use_srtp) -#define SSL_set_tmp_dh BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_tmp_dh) -#define SSL_set_tmp_dh_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_tmp_dh_callback) -#define SSL_set_tmp_ecdh BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_tmp_ecdh) -#define SSL_set_tmp_rsa BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_tmp_rsa) -#define SSL_set_tmp_rsa_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_tmp_rsa_callback) -#define SSL_set_token_binding_params BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_token_binding_params) -#define SSL_set_trust BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_trust) -#define SSL_set_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_verify) -#define SSL_set_verify_depth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_verify_depth) -#define SSL_set_verify_result BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_verify_result) -#define SSL_set_wfd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_wfd) -#define SSL_shutdown BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_shutdown) -#define SSL_state BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_state) -#define SSL_state_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_state_string) -#define SSL_state_string_long BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_state_string_long) -#define SSL_total_renegotiations BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_total_renegotiations) -#define SSL_use_PrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_use_PrivateKey) -#define SSL_use_PrivateKey_ASN1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_use_PrivateKey_ASN1) -#define SSL_use_PrivateKey_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_use_PrivateKey_file) -#define SSL_use_RSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_use_RSAPrivateKey) -#define SSL_use_RSAPrivateKey_ASN1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_use_RSAPrivateKey_ASN1) -#define SSL_use_RSAPrivateKey_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_use_RSAPrivateKey_file) -#define SSL_use_certificate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_use_certificate) -#define SSL_use_certificate_ASN1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_use_certificate_ASN1) -#define SSL_use_certificate_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_use_certificate_file) -#define SSL_use_psk_identity_hint BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_use_psk_identity_hint) -#define SSL_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_version) -#define SSL_want BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_want) -#define SSL_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_write) -#define SSLv23_client_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSLv23_client_method) -#define SSLv23_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSLv23_method) -#define SSLv23_server_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSLv23_server_method) -#define TLS_client_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TLS_client_method) -#define TLS_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TLS_method) -#define TLS_server_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TLS_server_method) -#define TLS_with_buffers_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TLS_with_buffers_method) -#define TLSv1_1_client_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TLSv1_1_client_method) -#define TLSv1_1_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TLSv1_1_method) -#define TLSv1_1_server_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TLSv1_1_server_method) -#define TLSv1_2_client_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TLSv1_2_client_method) -#define TLSv1_2_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TLSv1_2_method) -#define TLSv1_2_server_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TLSv1_2_server_method) -#define TLSv1_client_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TLSv1_client_method) -#define TLSv1_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TLSv1_method) -#define TLSv1_server_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TLSv1_server_method) -#define d2i_SSL_SESSION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_SSL_SESSION) -#define d2i_SSL_SESSION_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_SSL_SESSION_bio) -#define i2d_SSL_SESSION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_SSL_SESSION) -#define i2d_SSL_SESSION_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_SSL_SESSION_bio) -#define sk_CRYPTO_BUFFER_call_copy_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_CRYPTO_BUFFER_call_copy_func) -#define sk_CRYPTO_BUFFER_call_free_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_CRYPTO_BUFFER_call_free_func) -#define sk_CRYPTO_BUFFER_deep_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_CRYPTO_BUFFER_deep_copy) -#define sk_CRYPTO_BUFFER_new_null BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_CRYPTO_BUFFER_new_null) -#define sk_CRYPTO_BUFFER_num BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_CRYPTO_BUFFER_num) -#define sk_CRYPTO_BUFFER_push BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_CRYPTO_BUFFER_push) -#define sk_CRYPTO_BUFFER_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_CRYPTO_BUFFER_set) -#define sk_CRYPTO_BUFFER_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_CRYPTO_BUFFER_value) -#define sk_SRTP_PROTECTION_PROFILE_new_null BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_SRTP_PROTECTION_PROFILE_new_null) -#define sk_SRTP_PROTECTION_PROFILE_num BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_SRTP_PROTECTION_PROFILE_num) -#define sk_SRTP_PROTECTION_PROFILE_push BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_SRTP_PROTECTION_PROFILE_push) -#define sk_SSL_CIPHER_call_cmp_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_SSL_CIPHER_call_cmp_func) -#define sk_SSL_CIPHER_delete BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_SSL_CIPHER_delete) -#define sk_SSL_CIPHER_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_SSL_CIPHER_dup) -#define sk_SSL_CIPHER_find BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_SSL_CIPHER_find) -#define sk_SSL_CIPHER_new_null BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_SSL_CIPHER_new_null) -#define sk_SSL_CIPHER_num BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_SSL_CIPHER_num) -#define sk_SSL_CIPHER_push BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_SSL_CIPHER_push) -#define sk_SSL_CIPHER_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_SSL_CIPHER_value) -#define sk_X509_NAME_call_cmp_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_NAME_call_cmp_func) -#define sk_X509_NAME_call_copy_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_NAME_call_copy_func) -#define sk_X509_NAME_call_free_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_NAME_call_free_func) -#define sk_X509_NAME_deep_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_NAME_deep_copy) -#define sk_X509_NAME_find BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_NAME_find) -#define sk_X509_NAME_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_NAME_free) -#define sk_X509_NAME_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_NAME_new) -#define sk_X509_NAME_new_null BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_NAME_new_null) -#define sk_X509_NAME_pop_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_NAME_pop_free) -#define sk_X509_NAME_push BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_NAME_push) -#define sk_X509_NAME_set_cmp_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_NAME_set_cmp_func) -#define sk_X509_NAME_sort BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_NAME_sort) -#define sk_X509_call_free_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_call_free_func) -#define sk_X509_new_null BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_new_null) -#define sk_X509_num BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_num) -#define sk_X509_pop_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_pop_free) -#define sk_X509_shift BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_shift) -#define sk_X509_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_value) -#define ACCESS_DESCRIPTION_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ACCESS_DESCRIPTION_free) -#define ACCESS_DESCRIPTION_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ACCESS_DESCRIPTION_it) -#define ACCESS_DESCRIPTION_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ACCESS_DESCRIPTION_new) -#define AES_CMAC BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AES_CMAC) -#define AES_cbc_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AES_cbc_encrypt) -#define AES_cfb128_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AES_cfb128_encrypt) -#define AES_ctr128_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AES_ctr128_encrypt) -#define AES_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AES_decrypt) -#define AES_ecb_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AES_ecb_encrypt) -#define AES_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AES_encrypt) -#define AES_ofb128_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AES_ofb128_encrypt) -#define AES_set_decrypt_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AES_set_decrypt_key) -#define AES_set_encrypt_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AES_set_encrypt_key) -#define AES_unwrap_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AES_unwrap_key) -#define AES_unwrap_key_padded BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AES_unwrap_key_padded) -#define AES_wrap_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AES_wrap_key) -#define AES_wrap_key_padded BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AES_wrap_key_padded) -#define ASN1_ANY_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_ANY_it) -#define ASN1_BIT_STRING_check BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_BIT_STRING_check) -#define ASN1_BIT_STRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_BIT_STRING_free) -#define ASN1_BIT_STRING_get_bit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_BIT_STRING_get_bit) -#define ASN1_BIT_STRING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_BIT_STRING_it) -#define ASN1_BIT_STRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_BIT_STRING_new) -#define ASN1_BIT_STRING_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_BIT_STRING_set) -#define ASN1_BIT_STRING_set_bit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_BIT_STRING_set_bit) -#define ASN1_BMPSTRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_BMPSTRING_free) -#define ASN1_BMPSTRING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_BMPSTRING_it) -#define ASN1_BMPSTRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_BMPSTRING_new) -#define ASN1_BOOLEAN_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_BOOLEAN_it) -#define ASN1_ENUMERATED_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_ENUMERATED_free) -#define ASN1_ENUMERATED_get BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_ENUMERATED_get) -#define ASN1_ENUMERATED_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_ENUMERATED_it) -#define ASN1_ENUMERATED_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_ENUMERATED_new) -#define ASN1_ENUMERATED_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_ENUMERATED_set) -#define ASN1_ENUMERATED_to_BN BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_ENUMERATED_to_BN) -#define ASN1_FBOOLEAN_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_FBOOLEAN_it) -#define ASN1_GENERALIZEDTIME_adj BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_GENERALIZEDTIME_adj) -#define ASN1_GENERALIZEDTIME_check BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_GENERALIZEDTIME_check) -#define ASN1_GENERALIZEDTIME_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_GENERALIZEDTIME_free) -#define ASN1_GENERALIZEDTIME_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_GENERALIZEDTIME_it) -#define ASN1_GENERALIZEDTIME_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_GENERALIZEDTIME_new) -#define ASN1_GENERALIZEDTIME_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_GENERALIZEDTIME_print) -#define ASN1_GENERALIZEDTIME_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_GENERALIZEDTIME_set) -#define ASN1_GENERALIZEDTIME_set_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_GENERALIZEDTIME_set_string) -#define ASN1_GENERALSTRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_GENERALSTRING_free) -#define ASN1_GENERALSTRING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_GENERALSTRING_it) -#define ASN1_GENERALSTRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_GENERALSTRING_new) -#define ASN1_IA5STRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_IA5STRING_free) -#define ASN1_IA5STRING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_IA5STRING_it) -#define ASN1_IA5STRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_IA5STRING_new) -#define ASN1_INTEGER_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_INTEGER_cmp) -#define ASN1_INTEGER_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_INTEGER_dup) -#define ASN1_INTEGER_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_INTEGER_free) -#define ASN1_INTEGER_get BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_INTEGER_get) -#define ASN1_INTEGER_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_INTEGER_it) -#define ASN1_INTEGER_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_INTEGER_new) -#define ASN1_INTEGER_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_INTEGER_set) -#define ASN1_INTEGER_set_uint64 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_INTEGER_set_uint64) -#define ASN1_INTEGER_to_BN BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_INTEGER_to_BN) -#define ASN1_NULL_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_NULL_free) -#define ASN1_NULL_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_NULL_it) -#define ASN1_NULL_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_NULL_new) -#define ASN1_OBJECT_create BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_OBJECT_create) -#define ASN1_OBJECT_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_OBJECT_free) -#define ASN1_OBJECT_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_OBJECT_it) -#define ASN1_OBJECT_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_OBJECT_new) -#define ASN1_OCTET_STRING_NDEF_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_OCTET_STRING_NDEF_it) -#define ASN1_OCTET_STRING_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_OCTET_STRING_cmp) -#define ASN1_OCTET_STRING_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_OCTET_STRING_dup) -#define ASN1_OCTET_STRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_OCTET_STRING_free) -#define ASN1_OCTET_STRING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_OCTET_STRING_it) -#define ASN1_OCTET_STRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_OCTET_STRING_new) -#define ASN1_OCTET_STRING_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_OCTET_STRING_set) -#define ASN1_PRINTABLESTRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_PRINTABLESTRING_free) -#define ASN1_PRINTABLESTRING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_PRINTABLESTRING_it) -#define ASN1_PRINTABLESTRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_PRINTABLESTRING_new) -#define ASN1_PRINTABLE_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_PRINTABLE_free) -#define ASN1_PRINTABLE_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_PRINTABLE_it) -#define ASN1_PRINTABLE_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_PRINTABLE_new) -#define ASN1_PRINTABLE_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_PRINTABLE_type) -#define ASN1_SEQUENCE_ANY_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_SEQUENCE_ANY_it) -#define ASN1_SEQUENCE_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_SEQUENCE_it) -#define ASN1_SET_ANY_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_SET_ANY_it) -#define ASN1_STRING_TABLE_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_TABLE_add) -#define ASN1_STRING_TABLE_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_TABLE_cleanup) -#define ASN1_STRING_TABLE_get BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_TABLE_get) -#define ASN1_STRING_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_cmp) -#define ASN1_STRING_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_copy) -#define ASN1_STRING_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_data) -#define ASN1_STRING_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_dup) -#define ASN1_STRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_free) -#define ASN1_STRING_get0_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_get0_data) -#define ASN1_STRING_get_default_mask BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_get_default_mask) -#define ASN1_STRING_length BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_length) -#define ASN1_STRING_length_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_length_set) -#define ASN1_STRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_new) -#define ASN1_STRING_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_print) -#define ASN1_STRING_print_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_print_ex) -#define ASN1_STRING_print_ex_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_print_ex_fp) -#define ASN1_STRING_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_set) -#define ASN1_STRING_set0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_set0) -#define ASN1_STRING_set_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_set_by_NID) -#define ASN1_STRING_set_default_mask BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_set_default_mask) -#define ASN1_STRING_set_default_mask_asc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_set_default_mask_asc) -#define ASN1_STRING_to_UTF8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_to_UTF8) -#define ASN1_STRING_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_type) -#define ASN1_STRING_type_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_type_new) -#define ASN1_T61STRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_T61STRING_free) -#define ASN1_T61STRING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_T61STRING_it) -#define ASN1_T61STRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_T61STRING_new) -#define ASN1_TBOOLEAN_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TBOOLEAN_it) -#define ASN1_TIME_adj BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TIME_adj) -#define ASN1_TIME_check BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TIME_check) -#define ASN1_TIME_diff BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TIME_diff) -#define ASN1_TIME_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TIME_free) -#define ASN1_TIME_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TIME_it) -#define ASN1_TIME_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TIME_new) -#define ASN1_TIME_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TIME_print) -#define ASN1_TIME_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TIME_set) -#define ASN1_TIME_set_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TIME_set_string) -#define ASN1_TIME_to_generalizedtime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TIME_to_generalizedtime) -#define ASN1_TYPE_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TYPE_cmp) -#define ASN1_TYPE_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TYPE_free) -#define ASN1_TYPE_get BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TYPE_get) -#define ASN1_TYPE_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TYPE_new) -#define ASN1_TYPE_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TYPE_set) -#define ASN1_TYPE_set1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TYPE_set1) -#define ASN1_UNIVERSALSTRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_UNIVERSALSTRING_free) -#define ASN1_UNIVERSALSTRING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_UNIVERSALSTRING_it) -#define ASN1_UNIVERSALSTRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_UNIVERSALSTRING_new) -#define ASN1_UTCTIME_adj BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_UTCTIME_adj) -#define ASN1_UTCTIME_check BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_UTCTIME_check) -#define ASN1_UTCTIME_cmp_time_t BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_UTCTIME_cmp_time_t) -#define ASN1_UTCTIME_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_UTCTIME_free) -#define ASN1_UTCTIME_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_UTCTIME_it) -#define ASN1_UTCTIME_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_UTCTIME_new) -#define ASN1_UTCTIME_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_UTCTIME_print) -#define ASN1_UTCTIME_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_UTCTIME_set) -#define ASN1_UTCTIME_set_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_UTCTIME_set_string) -#define ASN1_UTF8STRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_UTF8STRING_free) -#define ASN1_UTF8STRING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_UTF8STRING_it) -#define ASN1_UTF8STRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_UTF8STRING_new) -#define ASN1_VISIBLESTRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_VISIBLESTRING_free) -#define ASN1_VISIBLESTRING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_VISIBLESTRING_it) -#define ASN1_VISIBLESTRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_VISIBLESTRING_new) -#define ASN1_digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_digest) -#define ASN1_generate_nconf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_generate_nconf) -#define ASN1_generate_v3 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_generate_v3) -#define ASN1_get_object BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_get_object) -#define ASN1_item_d2i BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_d2i) -#define ASN1_item_d2i_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_d2i_bio) -#define ASN1_item_d2i_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_d2i_fp) -#define ASN1_item_digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_digest) -#define ASN1_item_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_dup) -#define ASN1_item_ex_d2i BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_ex_d2i) -#define ASN1_item_ex_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_ex_free) -#define ASN1_item_ex_i2d BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_ex_i2d) -#define ASN1_item_ex_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_ex_new) -#define ASN1_item_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_free) -#define ASN1_item_i2d BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_i2d) -#define ASN1_item_i2d_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_i2d_bio) -#define ASN1_item_i2d_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_i2d_fp) -#define ASN1_item_ndef_i2d BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_ndef_i2d) -#define ASN1_item_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_new) -#define ASN1_item_pack BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_pack) -#define ASN1_item_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_sign) -#define ASN1_item_sign_ctx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_sign_ctx) -#define ASN1_item_unpack BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_unpack) -#define ASN1_item_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_verify) -#define ASN1_mbstring_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_mbstring_copy) -#define ASN1_mbstring_ncopy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_mbstring_ncopy) -#define ASN1_object_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_object_size) -#define ASN1_primitive_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_primitive_free) -#define ASN1_primitive_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_primitive_new) -#define ASN1_put_eoc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_put_eoc) -#define ASN1_put_object BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_put_object) -#define ASN1_tag2bit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_tag2bit) -#define ASN1_tag2str BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_tag2str) -#define ASN1_template_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_template_free) -#define ASN1_template_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_template_new) -#define AUTHORITY_INFO_ACCESS_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AUTHORITY_INFO_ACCESS_free) -#define AUTHORITY_INFO_ACCESS_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AUTHORITY_INFO_ACCESS_it) -#define AUTHORITY_INFO_ACCESS_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AUTHORITY_INFO_ACCESS_new) -#define AUTHORITY_KEYID_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AUTHORITY_KEYID_free) -#define AUTHORITY_KEYID_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AUTHORITY_KEYID_it) -#define AUTHORITY_KEYID_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AUTHORITY_KEYID_new) -#define BASIC_CONSTRAINTS_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BASIC_CONSTRAINTS_free) -#define BASIC_CONSTRAINTS_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BASIC_CONSTRAINTS_it) -#define BASIC_CONSTRAINTS_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BASIC_CONSTRAINTS_new) -#define BIO_append_filename BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_append_filename) -#define BIO_callback_ctrl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_callback_ctrl) -#define BIO_clear_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_clear_flags) -#define BIO_clear_retry_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_clear_retry_flags) -#define BIO_copy_next_retry BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_copy_next_retry) -#define BIO_ctrl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_ctrl) -#define BIO_ctrl_get_read_request BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_ctrl_get_read_request) -#define BIO_ctrl_get_write_guarantee BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_ctrl_get_write_guarantee) -#define BIO_ctrl_pending BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_ctrl_pending) -#define BIO_do_connect BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_do_connect) -#define BIO_eof BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_eof) -#define BIO_find_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_find_type) -#define BIO_flush BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_flush) -#define BIO_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_free) -#define BIO_free_all BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_free_all) -#define BIO_get_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_get_data) -#define BIO_get_fd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_get_fd) -#define BIO_get_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_get_fp) -#define BIO_get_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_get_init) -#define BIO_get_mem_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_get_mem_data) -#define BIO_get_mem_ptr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_get_mem_ptr) -#define BIO_get_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_get_new_index) -#define BIO_get_retry_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_get_retry_flags) -#define BIO_get_retry_reason BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_get_retry_reason) -#define BIO_get_shutdown BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_get_shutdown) -#define BIO_gets BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_gets) -#define BIO_hexdump BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_hexdump) -#define BIO_indent BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_indent) -#define BIO_int_ctrl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_int_ctrl) -#define BIO_mem_contents BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_mem_contents) -#define BIO_meth_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_meth_free) -#define BIO_meth_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_meth_new) -#define BIO_meth_set_create BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_meth_set_create) -#define BIO_meth_set_ctrl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_meth_set_ctrl) -#define BIO_meth_set_destroy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_meth_set_destroy) -#define BIO_meth_set_gets BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_meth_set_gets) -#define BIO_meth_set_puts BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_meth_set_puts) -#define BIO_meth_set_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_meth_set_read) -#define BIO_meth_set_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_meth_set_write) -#define BIO_method_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_method_type) -#define BIO_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_new) -#define BIO_new_bio_pair BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_new_bio_pair) -#define BIO_new_connect BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_new_connect) -#define BIO_new_fd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_new_fd) -#define BIO_new_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_new_file) -#define BIO_new_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_new_fp) -#define BIO_new_mem_buf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_new_mem_buf) -#define BIO_new_socket BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_new_socket) -#define BIO_next BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_next) -#define BIO_number_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_number_read) -#define BIO_number_written BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_number_written) -#define BIO_pending BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_pending) -#define BIO_pop BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_pop) -#define BIO_printf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_printf) -#define BIO_ptr_ctrl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_ptr_ctrl) -#define BIO_push BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_push) -#define BIO_puts BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_puts) -#define BIO_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_read) -#define BIO_read_asn1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_read_asn1) -#define BIO_read_filename BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_read_filename) -#define BIO_reset BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_reset) -#define BIO_rw_filename BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_rw_filename) -#define BIO_s_connect BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_s_connect) -#define BIO_s_fd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_s_fd) -#define BIO_s_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_s_file) -#define BIO_s_mem BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_s_mem) -#define BIO_s_socket BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_s_socket) -#define BIO_set_close BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_close) -#define BIO_set_conn_hostname BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_conn_hostname) -#define BIO_set_conn_int_port BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_conn_int_port) -#define BIO_set_conn_port BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_conn_port) -#define BIO_set_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_data) -#define BIO_set_fd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_fd) -#define BIO_set_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_flags) -#define BIO_set_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_fp) -#define BIO_set_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_init) -#define BIO_set_mem_buf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_mem_buf) -#define BIO_set_mem_eof_return BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_mem_eof_return) -#define BIO_set_nbio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_nbio) -#define BIO_set_retry_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_retry_read) -#define BIO_set_retry_special BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_retry_special) -#define BIO_set_retry_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_retry_write) -#define BIO_set_shutdown BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_shutdown) -#define BIO_set_write_buffer_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_write_buffer_size) -#define BIO_should_io_special BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_should_io_special) -#define BIO_should_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_should_read) -#define BIO_should_retry BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_should_retry) -#define BIO_should_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_should_write) -#define BIO_shutdown_wr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_shutdown_wr) -#define BIO_snprintf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_snprintf) -#define BIO_test_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_test_flags) -#define BIO_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_up_ref) -#define BIO_vfree BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_vfree) -#define BIO_vsnprintf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_vsnprintf) -#define BIO_wpending BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_wpending) -#define BIO_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_write) -#define BIO_write_all BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_write_all) -#define BIO_write_filename BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_write_filename) -#define BN_BLINDING_convert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_BLINDING_convert) -#define BN_BLINDING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_BLINDING_free) -#define BN_BLINDING_invert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_BLINDING_invert) -#define BN_BLINDING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_BLINDING_new) -#define BN_CTX_end BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_CTX_end) -#define BN_CTX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_CTX_free) -#define BN_CTX_get BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_CTX_get) -#define BN_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_CTX_new) -#define BN_CTX_start BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_CTX_start) -#define BN_GENCB_call BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_GENCB_call) -#define BN_GENCB_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_GENCB_set) -#define BN_MONT_CTX_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_MONT_CTX_copy) -#define BN_MONT_CTX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_MONT_CTX_free) -#define BN_MONT_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_MONT_CTX_new) -#define BN_MONT_CTX_new_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_MONT_CTX_new_consttime) -#define BN_MONT_CTX_new_for_modulus BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_MONT_CTX_new_for_modulus) -#define BN_MONT_CTX_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_MONT_CTX_set) -#define BN_MONT_CTX_set_locked BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_MONT_CTX_set_locked) -#define BN_abs_is_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_abs_is_word) -#define BN_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_add) -#define BN_add_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_add_word) -#define BN_asc2bn BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_asc2bn) -#define BN_bin2bn BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_bin2bn) -#define BN_bn2bin BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_bn2bin) -#define BN_bn2bin_padded BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_bn2bin_padded) -#define BN_bn2binpad BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_bn2binpad) -#define BN_bn2cbb_padded BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_bn2cbb_padded) -#define BN_bn2dec BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_bn2dec) -#define BN_bn2hex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_bn2hex) -#define BN_bn2le_padded BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_bn2le_padded) -#define BN_bn2mpi BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_bn2mpi) -#define BN_clear BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_clear) -#define BN_clear_bit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_clear_bit) -#define BN_clear_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_clear_free) -#define BN_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_cmp) -#define BN_cmp_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_cmp_word) -#define BN_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_copy) -#define BN_count_low_zero_bits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_count_low_zero_bits) -#define BN_dec2bn BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_dec2bn) -#define BN_div BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_div) -#define BN_div_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_div_word) -#define BN_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_dup) -#define BN_enhanced_miller_rabin_primality_test BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_enhanced_miller_rabin_primality_test) -#define BN_equal_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_equal_consttime) -#define BN_exp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_exp) -#define BN_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_free) -#define BN_from_montgomery BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_from_montgomery) -#define BN_gcd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_gcd) -#define BN_generate_prime_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_generate_prime_ex) -#define BN_get_rfc3526_prime_1536 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_get_rfc3526_prime_1536) -#define BN_get_u64 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_get_u64) -#define BN_get_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_get_word) -#define BN_hex2bn BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_hex2bn) -#define BN_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_init) -#define BN_is_bit_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_is_bit_set) -#define BN_is_negative BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_is_negative) -#define BN_is_odd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_is_odd) -#define BN_is_one BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_is_one) -#define BN_is_pow2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_is_pow2) -#define BN_is_prime_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_is_prime_ex) -#define BN_is_prime_fasttest_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_is_prime_fasttest_ex) -#define BN_is_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_is_word) -#define BN_is_zero BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_is_zero) -#define BN_le2bn BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_le2bn) -#define BN_lshift BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_lshift) -#define BN_lshift1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_lshift1) -#define BN_marshal_asn1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_marshal_asn1) -#define BN_mask_bits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mask_bits) -#define BN_mod_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_add) -#define BN_mod_add_quick BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_add_quick) -#define BN_mod_exp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_exp) -#define BN_mod_exp2_mont BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_exp2_mont) -#define BN_mod_exp_mont BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_exp_mont) -#define BN_mod_exp_mont_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_exp_mont_consttime) -#define BN_mod_exp_mont_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_exp_mont_word) -#define BN_mod_inverse BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_inverse) -#define BN_mod_inverse_blinded BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_inverse_blinded) -#define BN_mod_inverse_odd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_inverse_odd) -#define BN_mod_lshift BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_lshift) -#define BN_mod_lshift1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_lshift1) -#define BN_mod_lshift1_quick BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_lshift1_quick) -#define BN_mod_lshift_quick BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_lshift_quick) -#define BN_mod_mul BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_mul) -#define BN_mod_mul_montgomery BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_mul_montgomery) -#define BN_mod_pow2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_pow2) -#define BN_mod_sqr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_sqr) -#define BN_mod_sqrt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_sqrt) -#define BN_mod_sub BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_sub) -#define BN_mod_sub_quick BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_sub_quick) -#define BN_mod_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_word) -#define BN_mpi2bn BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mpi2bn) -#define BN_mul BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mul) -#define BN_mul_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mul_word) -#define BN_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_new) -#define BN_nnmod BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_nnmod) -#define BN_nnmod_pow2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_nnmod_pow2) -#define BN_num_bits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_num_bits) -#define BN_num_bits_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_num_bits_word) -#define BN_num_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_num_bytes) -#define BN_one BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_one) -#define BN_parse_asn1_unsigned BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_parse_asn1_unsigned) -#define BN_primality_test BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_primality_test) -#define BN_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_print) -#define BN_print_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_print_fp) -#define BN_pseudo_rand BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_pseudo_rand) -#define BN_pseudo_rand_range BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_pseudo_rand_range) -#define BN_rand BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_rand) -#define BN_rand_range BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_rand_range) -#define BN_rand_range_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_rand_range_ex) -#define BN_rshift BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_rshift) -#define BN_rshift1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_rshift1) -#define BN_set_bit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_set_bit) -#define BN_set_negative BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_set_negative) -#define BN_set_u64 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_set_u64) -#define BN_set_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_set_word) -#define BN_sqr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_sqr) -#define BN_sqrt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_sqrt) -#define BN_sub BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_sub) -#define BN_sub_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_sub_word) -#define BN_to_ASN1_ENUMERATED BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_to_ASN1_ENUMERATED) -#define BN_to_ASN1_INTEGER BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_to_ASN1_INTEGER) -#define BN_to_montgomery BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_to_montgomery) -#define BN_uadd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_uadd) -#define BN_ucmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_ucmp) -#define BN_usub BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_usub) -#define BN_value_one BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_value_one) -#define BN_zero BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_zero) -#define BORINGSSL_function_hit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BORINGSSL_function_hit) -#define BORINGSSL_self_test BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BORINGSSL_self_test) -#define BUF_MEM_append BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BUF_MEM_append) -#define BUF_MEM_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BUF_MEM_free) -#define BUF_MEM_grow BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BUF_MEM_grow) -#define BUF_MEM_grow_clean BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BUF_MEM_grow_clean) -#define BUF_MEM_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BUF_MEM_new) -#define BUF_MEM_reserve BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BUF_MEM_reserve) -#define BUF_memdup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BUF_memdup) -#define BUF_strdup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BUF_strdup) -#define BUF_strlcat BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BUF_strlcat) -#define BUF_strlcpy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BUF_strlcpy) -#define BUF_strndup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BUF_strndup) -#define BUF_strnlen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BUF_strnlen) -#define CBB_add_asn1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_asn1) -#define CBB_add_asn1_bool BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_asn1_bool) -#define CBB_add_asn1_octet_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_asn1_octet_string) -#define CBB_add_asn1_oid_from_text BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_asn1_oid_from_text) -#define CBB_add_asn1_uint64 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_asn1_uint64) -#define CBB_add_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_bytes) -#define CBB_add_space BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_space) -#define CBB_add_u16 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_u16) -#define CBB_add_u16_length_prefixed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_u16_length_prefixed) -#define CBB_add_u24 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_u24) -#define CBB_add_u24_length_prefixed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_u24_length_prefixed) -#define CBB_add_u32 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_u32) -#define CBB_add_u64 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_u64) -#define CBB_add_u8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_u8) -#define CBB_add_u8_length_prefixed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_u8_length_prefixed) -#define CBB_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_cleanup) -#define CBB_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_data) -#define CBB_did_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_did_write) -#define CBB_discard_child BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_discard_child) -#define CBB_finish BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_finish) -#define CBB_finish_i2d BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_finish_i2d) -#define CBB_flush BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_flush) -#define CBB_flush_asn1_set_of BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_flush_asn1_set_of) -#define CBB_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_init) -#define CBB_init_fixed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_init_fixed) -#define CBB_len BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_len) -#define CBB_reserve BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_reserve) -#define CBB_zero BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_zero) -#define CBS_asn1_ber_to_der BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_asn1_ber_to_der) -#define CBS_asn1_bitstring_has_bit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_asn1_bitstring_has_bit) -#define CBS_asn1_oid_to_text BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_asn1_oid_to_text) -#define CBS_contains_zero_byte BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_contains_zero_byte) -#define CBS_copy_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_copy_bytes) -#define CBS_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_data) -#define CBS_get_any_asn1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_any_asn1) -#define CBS_get_any_asn1_element BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_any_asn1_element) -#define CBS_get_any_ber_asn1_element BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_any_ber_asn1_element) -#define CBS_get_asn1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_asn1) -#define CBS_get_asn1_bool BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_asn1_bool) -#define CBS_get_asn1_element BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_asn1_element) -#define CBS_get_asn1_implicit_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_asn1_implicit_string) -#define CBS_get_asn1_uint64 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_asn1_uint64) -#define CBS_get_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_bytes) -#define CBS_get_last_u8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_last_u8) -#define CBS_get_optional_asn1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_optional_asn1) -#define CBS_get_optional_asn1_bool BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_optional_asn1_bool) -#define CBS_get_optional_asn1_octet_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_optional_asn1_octet_string) -#define CBS_get_optional_asn1_uint64 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_optional_asn1_uint64) -#define CBS_get_u16 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_u16) -#define CBS_get_u16_length_prefixed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_u16_length_prefixed) -#define CBS_get_u24 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_u24) -#define CBS_get_u24_length_prefixed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_u24_length_prefixed) -#define CBS_get_u32 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_u32) -#define CBS_get_u64 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_u64) -#define CBS_get_u8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_u8) -#define CBS_get_u8_length_prefixed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_u8_length_prefixed) -#define CBS_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_init) -#define CBS_is_valid_asn1_bitstring BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_is_valid_asn1_bitstring) -#define CBS_len BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_len) -#define CBS_mem_equal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_mem_equal) -#define CBS_peek_asn1_tag BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_peek_asn1_tag) -#define CBS_skip BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_skip) -#define CBS_stow BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_stow) -#define CBS_strdup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_strdup) -#define CERTIFICATEPOLICIES_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CERTIFICATEPOLICIES_free) -#define CERTIFICATEPOLICIES_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CERTIFICATEPOLICIES_it) -#define CERTIFICATEPOLICIES_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CERTIFICATEPOLICIES_new) -#define CMAC_CTX_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CMAC_CTX_copy) -#define CMAC_CTX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CMAC_CTX_free) -#define CMAC_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CMAC_CTX_new) -#define CMAC_Final BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CMAC_Final) -#define CMAC_Init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CMAC_Init) -#define CMAC_Reset BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CMAC_Reset) -#define CMAC_Update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CMAC_Update) -#define CONF_VALUE_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CONF_VALUE_new) -#define CONF_modules_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CONF_modules_free) -#define CONF_modules_load_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CONF_modules_load_file) -#define CONF_parse_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CONF_parse_list) -#define CRL_DIST_POINTS_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRL_DIST_POINTS_free) -#define CRL_DIST_POINTS_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRL_DIST_POINTS_it) -#define CRL_DIST_POINTS_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRL_DIST_POINTS_new) -#define CRYPTO_BUFFER_POOL_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_BUFFER_POOL_free) -#define CRYPTO_BUFFER_POOL_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_BUFFER_POOL_new) -#define CRYPTO_BUFFER_alloc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_BUFFER_alloc) -#define CRYPTO_BUFFER_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_BUFFER_data) -#define CRYPTO_BUFFER_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_BUFFER_free) -#define CRYPTO_BUFFER_init_CBS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_BUFFER_init_CBS) -#define CRYPTO_BUFFER_len BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_BUFFER_len) -#define CRYPTO_BUFFER_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_BUFFER_new) -#define CRYPTO_BUFFER_new_from_CBS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_BUFFER_new_from_CBS) -#define CRYPTO_BUFFER_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_BUFFER_up_ref) -#define CRYPTO_MUTEX_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_MUTEX_cleanup) -#define CRYPTO_MUTEX_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_MUTEX_init) -#define CRYPTO_MUTEX_lock_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_MUTEX_lock_read) -#define CRYPTO_MUTEX_lock_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_MUTEX_lock_write) -#define CRYPTO_MUTEX_unlock_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_MUTEX_unlock_read) -#define CRYPTO_MUTEX_unlock_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_MUTEX_unlock_write) -#define CRYPTO_POLYVAL_finish BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_POLYVAL_finish) -#define CRYPTO_POLYVAL_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_POLYVAL_init) -#define CRYPTO_POLYVAL_update_blocks BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_POLYVAL_update_blocks) -#define CRYPTO_STATIC_MUTEX_lock_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_STATIC_MUTEX_lock_read) -#define CRYPTO_STATIC_MUTEX_lock_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_STATIC_MUTEX_lock_write) -#define CRYPTO_STATIC_MUTEX_unlock_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_STATIC_MUTEX_unlock_read) -#define CRYPTO_STATIC_MUTEX_unlock_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_STATIC_MUTEX_unlock_write) -#define CRYPTO_THREADID_current BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_THREADID_current) -#define CRYPTO_THREADID_set_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_THREADID_set_callback) -#define CRYPTO_THREADID_set_numeric BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_THREADID_set_numeric) -#define CRYPTO_THREADID_set_pointer BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_THREADID_set_pointer) -#define CRYPTO_cbc128_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_cbc128_decrypt) -#define CRYPTO_cbc128_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_cbc128_encrypt) -#define CRYPTO_cfb128_1_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_cfb128_1_encrypt) -#define CRYPTO_cfb128_8_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_cfb128_8_encrypt) -#define CRYPTO_cfb128_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_cfb128_encrypt) -#define CRYPTO_chacha_20 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_chacha_20) -#define CRYPTO_cleanup_all_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_cleanup_all_ex_data) -#define CRYPTO_ctr128_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_ctr128_encrypt) -#define CRYPTO_ctr128_encrypt_ctr32 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_ctr128_encrypt_ctr32) -#define CRYPTO_free_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_free_ex_data) -#define CRYPTO_gcm128_aad BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_gcm128_aad) -#define CRYPTO_gcm128_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_gcm128_decrypt) -#define CRYPTO_gcm128_decrypt_ctr32 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_gcm128_decrypt_ctr32) -#define CRYPTO_gcm128_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_gcm128_encrypt) -#define CRYPTO_gcm128_encrypt_ctr32 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_gcm128_encrypt_ctr32) -#define CRYPTO_gcm128_finish BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_gcm128_finish) -#define CRYPTO_gcm128_init_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_gcm128_init_key) -#define CRYPTO_gcm128_setiv BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_gcm128_setiv) -#define CRYPTO_gcm128_tag BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_gcm128_tag) -#define CRYPTO_get_dynlock_create_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_get_dynlock_create_callback) -#define CRYPTO_get_dynlock_destroy_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_get_dynlock_destroy_callback) -#define CRYPTO_get_dynlock_lock_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_get_dynlock_lock_callback) -#define CRYPTO_get_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_get_ex_data) -#define CRYPTO_get_ex_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_get_ex_new_index) -#define CRYPTO_get_lock_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_get_lock_name) -#define CRYPTO_get_locking_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_get_locking_callback) -#define CRYPTO_get_thread_local BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_get_thread_local) -#define CRYPTO_ghash_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_ghash_init) -#define CRYPTO_has_asm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_has_asm) -#define CRYPTO_hchacha20 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_hchacha20) -#define CRYPTO_is_confidential_build BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_is_confidential_build) -#define CRYPTO_library_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_library_init) -#define CRYPTO_malloc_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_malloc_init) -#define CRYPTO_memcmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_memcmp) -#define CRYPTO_new_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_new_ex_data) -#define CRYPTO_num_locks BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_num_locks) -#define CRYPTO_ofb128_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_ofb128_encrypt) -#define CRYPTO_once BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_once) -#define CRYPTO_poly1305_finish BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_poly1305_finish) -#define CRYPTO_poly1305_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_poly1305_init) -#define CRYPTO_poly1305_update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_poly1305_update) -#define CRYPTO_rdrand BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_rdrand) -#define CRYPTO_rdrand_multiple8_buf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_rdrand_multiple8_buf) -#define CRYPTO_refcount_dec_and_test_zero BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_refcount_dec_and_test_zero) -#define CRYPTO_refcount_inc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_refcount_inc) -#define CRYPTO_set_add_lock_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_set_add_lock_callback) -#define CRYPTO_set_dynlock_create_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_set_dynlock_create_callback) -#define CRYPTO_set_dynlock_destroy_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_set_dynlock_destroy_callback) -#define CRYPTO_set_dynlock_lock_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_set_dynlock_lock_callback) -#define CRYPTO_set_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_set_ex_data) -#define CRYPTO_set_id_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_set_id_callback) -#define CRYPTO_set_locking_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_set_locking_callback) -#define CRYPTO_set_thread_local BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_set_thread_local) -#define CRYPTO_sysrand BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_sysrand) -#define CRYPTO_tls1_prf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_tls1_prf) -#define CTR_DRBG_clear BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CTR_DRBG_clear) -#define CTR_DRBG_generate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CTR_DRBG_generate) -#define CTR_DRBG_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CTR_DRBG_init) -#define CTR_DRBG_reseed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CTR_DRBG_reseed) -#define ChaCha20_ctr32 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ChaCha20_ctr32) -#define DES_decrypt3 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DES_decrypt3) -#define DES_ecb3_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DES_ecb3_encrypt) -#define DES_ecb_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DES_ecb_encrypt) -#define DES_ede2_cbc_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DES_ede2_cbc_encrypt) -#define DES_ede3_cbc_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DES_ede3_cbc_encrypt) -#define DES_encrypt3 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DES_encrypt3) -#define DES_ncbc_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DES_ncbc_encrypt) -#define DES_set_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DES_set_key) -#define DES_set_key_unchecked BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DES_set_key_unchecked) -#define DES_set_odd_parity BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DES_set_odd_parity) -#define DH_check BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_check) -#define DH_check_pub_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_check_pub_key) -#define DH_compute_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_compute_key) -#define DH_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_free) -#define DH_generate_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_generate_key) -#define DH_generate_parameters_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_generate_parameters_ex) -#define DH_get0_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_get0_key) -#define DH_get0_pqg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_get0_pqg) -#define DH_get_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_get_ex_data) -#define DH_get_ex_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_get_ex_new_index) -#define DH_marshal_parameters BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_marshal_parameters) -#define DH_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_new) -#define DH_num_bits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_num_bits) -#define DH_parse_parameters BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_parse_parameters) -#define DH_set0_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_set0_key) -#define DH_set0_pqg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_set0_pqg) -#define DH_set_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_set_ex_data) -#define DH_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_size) -#define DH_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_up_ref) -#define DHparams_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DHparams_dup) -#define DIRECTORYSTRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DIRECTORYSTRING_free) -#define DIRECTORYSTRING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DIRECTORYSTRING_it) -#define DIRECTORYSTRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DIRECTORYSTRING_new) -#define DISPLAYTEXT_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DISPLAYTEXT_free) -#define DISPLAYTEXT_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DISPLAYTEXT_it) -#define DISPLAYTEXT_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DISPLAYTEXT_new) -#define DIST_POINT_NAME_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DIST_POINT_NAME_free) -#define DIST_POINT_NAME_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DIST_POINT_NAME_it) -#define DIST_POINT_NAME_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DIST_POINT_NAME_new) -#define DIST_POINT_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DIST_POINT_free) -#define DIST_POINT_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DIST_POINT_it) -#define DIST_POINT_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DIST_POINT_new) -#define DIST_POINT_set_dpname BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DIST_POINT_set_dpname) -#define DSA_SIG_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_SIG_free) -#define DSA_SIG_marshal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_SIG_marshal) -#define DSA_SIG_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_SIG_new) -#define DSA_SIG_parse BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_SIG_parse) -#define DSA_check_signature BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_check_signature) -#define DSA_do_check_signature BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_do_check_signature) -#define DSA_do_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_do_sign) -#define DSA_do_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_do_verify) -#define DSA_dup_DH BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_dup_DH) -#define DSA_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_free) -#define DSA_generate_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_generate_key) -#define DSA_generate_parameters_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_generate_parameters_ex) -#define DSA_get0_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_get0_key) -#define DSA_get0_pqg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_get0_pqg) -#define DSA_get_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_get_ex_data) -#define DSA_get_ex_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_get_ex_new_index) -#define DSA_marshal_parameters BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_marshal_parameters) -#define DSA_marshal_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_marshal_private_key) -#define DSA_marshal_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_marshal_public_key) -#define DSA_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_new) -#define DSA_parse_parameters BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_parse_parameters) -#define DSA_parse_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_parse_private_key) -#define DSA_parse_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_parse_public_key) -#define DSA_set0_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_set0_key) -#define DSA_set0_pqg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_set0_pqg) -#define DSA_set_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_set_ex_data) -#define DSA_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_sign) -#define DSA_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_size) -#define DSA_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_up_ref) -#define DSA_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_verify) -#define DSAparams_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSAparams_dup) -#define ECDH_compute_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDH_compute_key) -#define ECDH_compute_key_fips BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDH_compute_key_fips) -#define ECDSA_SIG_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDSA_SIG_free) -#define ECDSA_SIG_from_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDSA_SIG_from_bytes) -#define ECDSA_SIG_get0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDSA_SIG_get0) -#define ECDSA_SIG_marshal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDSA_SIG_marshal) -#define ECDSA_SIG_max_len BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDSA_SIG_max_len) -#define ECDSA_SIG_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDSA_SIG_new) -#define ECDSA_SIG_parse BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDSA_SIG_parse) -#define ECDSA_SIG_set0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDSA_SIG_set0) -#define ECDSA_SIG_to_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDSA_SIG_to_bytes) -#define ECDSA_do_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDSA_do_sign) -#define ECDSA_do_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDSA_do_verify) -#define ECDSA_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDSA_sign) -#define ECDSA_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDSA_size) -#define ECDSA_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDSA_verify) -#define EC_GFp_mont_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GFp_mont_method) -#define EC_GFp_nistp224_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GFp_nistp224_method) -#define EC_GFp_nistp256_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GFp_nistp256_method) -#define EC_GFp_nistz256_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GFp_nistz256_method) -#define EC_GROUP_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_cmp) -#define EC_GROUP_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_dup) -#define EC_GROUP_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_free) -#define EC_GROUP_get0_generator BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_get0_generator) -#define EC_GROUP_get0_order BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_get0_order) -#define EC_GROUP_get_cofactor BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_get_cofactor) -#define EC_GROUP_get_curve_GFp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_get_curve_GFp) -#define EC_GROUP_get_curve_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_get_curve_name) -#define EC_GROUP_get_degree BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_get_degree) -#define EC_GROUP_get_order BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_get_order) -#define EC_GROUP_method_of BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_method_of) -#define EC_GROUP_new_by_curve_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_new_by_curve_name) -#define EC_GROUP_new_curve_GFp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_new_curve_GFp) -#define EC_GROUP_order_bits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_order_bits) -#define EC_GROUP_set_asn1_flag BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_set_asn1_flag) -#define EC_GROUP_set_generator BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_set_generator) -#define EC_GROUP_set_point_conversion_form BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_set_point_conversion_form) -#define EC_KEY_check_fips BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_check_fips) -#define EC_KEY_check_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_check_key) -#define EC_KEY_derive_from_secret BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_derive_from_secret) -#define EC_KEY_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_dup) -#define EC_KEY_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_free) -#define EC_KEY_generate_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_generate_key) -#define EC_KEY_generate_key_fips BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_generate_key_fips) -#define EC_KEY_get0_group BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_get0_group) -#define EC_KEY_get0_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_get0_private_key) -#define EC_KEY_get0_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_get0_public_key) -#define EC_KEY_get_conv_form BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_get_conv_form) -#define EC_KEY_get_enc_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_get_enc_flags) -#define EC_KEY_get_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_get_ex_data) -#define EC_KEY_get_ex_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_get_ex_new_index) -#define EC_KEY_is_opaque BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_is_opaque) -#define EC_KEY_key2buf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_key2buf) -#define EC_KEY_marshal_curve_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_marshal_curve_name) -#define EC_KEY_marshal_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_marshal_private_key) -#define EC_KEY_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_new) -#define EC_KEY_new_by_curve_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_new_by_curve_name) -#define EC_KEY_new_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_new_method) -#define EC_KEY_parse_curve_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_parse_curve_name) -#define EC_KEY_parse_parameters BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_parse_parameters) -#define EC_KEY_parse_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_parse_private_key) -#define EC_KEY_set_asn1_flag BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_set_asn1_flag) -#define EC_KEY_set_conv_form BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_set_conv_form) -#define EC_KEY_set_enc_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_set_enc_flags) -#define EC_KEY_set_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_set_ex_data) -#define EC_KEY_set_group BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_set_group) -#define EC_KEY_set_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_set_private_key) -#define EC_KEY_set_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_set_public_key) -#define EC_KEY_set_public_key_affine_coordinates BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_set_public_key_affine_coordinates) -#define EC_KEY_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_up_ref) -#define EC_METHOD_get_field_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_METHOD_get_field_type) -#define EC_POINT_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_add) -#define EC_POINT_clear_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_clear_free) -#define EC_POINT_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_cmp) -#define EC_POINT_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_copy) -#define EC_POINT_dbl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_dbl) -#define EC_POINT_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_dup) -#define EC_POINT_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_free) -#define EC_POINT_get_affine_coordinates_GFp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_get_affine_coordinates_GFp) -#define EC_POINT_invert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_invert) -#define EC_POINT_is_at_infinity BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_is_at_infinity) -#define EC_POINT_is_on_curve BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_is_on_curve) -#define EC_POINT_mul BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_mul) -#define EC_POINT_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_new) -#define EC_POINT_oct2point BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_oct2point) -#define EC_POINT_point2cbb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_point2cbb) -#define EC_POINT_point2oct BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_point2oct) -#define EC_POINT_set_affine_coordinates_GFp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_set_affine_coordinates_GFp) -#define EC_POINT_set_compressed_coordinates_GFp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_set_compressed_coordinates_GFp) -#define EC_POINT_set_to_infinity BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_set_to_infinity) -#define EC_curve_nid2nist BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_curve_nid2nist) -#define EC_curve_nist2nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_curve_nist2nid) -#define EC_get_builtin_curves BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_get_builtin_curves) -#define ED25519_keypair BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ED25519_keypair) -#define ED25519_keypair_from_seed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ED25519_keypair_from_seed) -#define ED25519_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ED25519_sign) -#define ED25519_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ED25519_verify) -#define EDIPARTYNAME_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EDIPARTYNAME_free) -#define EDIPARTYNAME_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EDIPARTYNAME_it) -#define EDIPARTYNAME_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EDIPARTYNAME_new) -#define ENGINE_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ENGINE_free) -#define ENGINE_get_ECDSA_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ENGINE_get_ECDSA_method) -#define ENGINE_get_RSA_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ENGINE_get_RSA_method) -#define ENGINE_load_builtin_engines BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ENGINE_load_builtin_engines) -#define ENGINE_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ENGINE_new) -#define ENGINE_register_all_complete BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ENGINE_register_all_complete) -#define ENGINE_set_ECDSA_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ENGINE_set_ECDSA_method) -#define ENGINE_set_RSA_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ENGINE_set_RSA_method) -#define ERR_SAVE_STATE_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_SAVE_STATE_free) -#define ERR_add_error_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_add_error_data) -#define ERR_add_error_dataf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_add_error_dataf) -#define ERR_clear_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_clear_error) -#define ERR_clear_system_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_clear_system_error) -#define ERR_error_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_error_string) -#define ERR_error_string_n BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_error_string_n) -#define ERR_free_strings BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_free_strings) -#define ERR_func_error_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_func_error_string) -#define ERR_get_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_get_error) -#define ERR_get_error_line BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_get_error_line) -#define ERR_get_error_line_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_get_error_line_data) -#define ERR_get_next_error_library BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_get_next_error_library) -#define ERR_lib_error_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_lib_error_string) -#define ERR_load_BIO_strings BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_load_BIO_strings) -#define ERR_load_ERR_strings BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_load_ERR_strings) -#define ERR_load_RAND_strings BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_load_RAND_strings) -#define ERR_load_crypto_strings BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_load_crypto_strings) -#define ERR_peek_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_peek_error) -#define ERR_peek_error_line BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_peek_error_line) -#define ERR_peek_error_line_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_peek_error_line_data) -#define ERR_peek_last_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_peek_last_error) -#define ERR_peek_last_error_line BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_peek_last_error_line) -#define ERR_peek_last_error_line_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_peek_last_error_line_data) -#define ERR_pop_to_mark BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_pop_to_mark) -#define ERR_print_errors BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_print_errors) -#define ERR_print_errors_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_print_errors_cb) -#define ERR_print_errors_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_print_errors_fp) -#define ERR_put_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_put_error) -#define ERR_reason_error_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_reason_error_string) -#define ERR_remove_state BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_remove_state) -#define ERR_remove_thread_state BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_remove_thread_state) -#define ERR_restore_state BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_restore_state) -#define ERR_save_state BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_save_state) -#define ERR_set_mark BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_set_mark) -#define EVP_AEAD_CTX_aead BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_CTX_aead) -#define EVP_AEAD_CTX_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_CTX_cleanup) -#define EVP_AEAD_CTX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_CTX_free) -#define EVP_AEAD_CTX_get_iv BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_CTX_get_iv) -#define EVP_AEAD_CTX_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_CTX_init) -#define EVP_AEAD_CTX_init_with_direction BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_CTX_init_with_direction) -#define EVP_AEAD_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_CTX_new) -#define EVP_AEAD_CTX_open BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_CTX_open) -#define EVP_AEAD_CTX_open_gather BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_CTX_open_gather) -#define EVP_AEAD_CTX_seal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_CTX_seal) -#define EVP_AEAD_CTX_seal_scatter BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_CTX_seal_scatter) -#define EVP_AEAD_CTX_tag_len BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_CTX_tag_len) -#define EVP_AEAD_CTX_zero BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_CTX_zero) -#define EVP_AEAD_key_length BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_key_length) -#define EVP_AEAD_max_overhead BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_max_overhead) -#define EVP_AEAD_max_tag_len BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_max_tag_len) -#define EVP_AEAD_nonce_length BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_nonce_length) -#define EVP_BytesToKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_BytesToKey) -#define EVP_CIPHER_CTX_block_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_block_size) -#define EVP_CIPHER_CTX_cipher BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_cipher) -#define EVP_CIPHER_CTX_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_cleanup) -#define EVP_CIPHER_CTX_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_copy) -#define EVP_CIPHER_CTX_ctrl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_ctrl) -#define EVP_CIPHER_CTX_encrypting BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_encrypting) -#define EVP_CIPHER_CTX_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_flags) -#define EVP_CIPHER_CTX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_free) -#define EVP_CIPHER_CTX_get_app_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_get_app_data) -#define EVP_CIPHER_CTX_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_init) -#define EVP_CIPHER_CTX_iv_length BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_iv_length) -#define EVP_CIPHER_CTX_key_length BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_key_length) -#define EVP_CIPHER_CTX_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_mode) -#define EVP_CIPHER_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_new) -#define EVP_CIPHER_CTX_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_nid) -#define EVP_CIPHER_CTX_reset BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_reset) -#define EVP_CIPHER_CTX_set_app_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_set_app_data) -#define EVP_CIPHER_CTX_set_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_set_flags) -#define EVP_CIPHER_CTX_set_key_length BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_set_key_length) -#define EVP_CIPHER_CTX_set_padding BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_set_padding) -#define EVP_CIPHER_block_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_block_size) -#define EVP_CIPHER_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_flags) -#define EVP_CIPHER_iv_length BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_iv_length) -#define EVP_CIPHER_key_length BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_key_length) -#define EVP_CIPHER_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_mode) -#define EVP_CIPHER_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_nid) -#define EVP_Cipher BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_Cipher) -#define EVP_CipherFinal_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CipherFinal_ex) -#define EVP_CipherInit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CipherInit) -#define EVP_CipherInit_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CipherInit_ex) -#define EVP_CipherUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CipherUpdate) -#define EVP_DecodeBase64 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DecodeBase64) -#define EVP_DecodeBlock BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DecodeBlock) -#define EVP_DecodeFinal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DecodeFinal) -#define EVP_DecodeInit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DecodeInit) -#define EVP_DecodeUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DecodeUpdate) -#define EVP_DecodedLength BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DecodedLength) -#define EVP_DecryptFinal_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DecryptFinal_ex) -#define EVP_DecryptInit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DecryptInit) -#define EVP_DecryptInit_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DecryptInit_ex) -#define EVP_DecryptUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DecryptUpdate) -#define EVP_Digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_Digest) -#define EVP_DigestFinal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DigestFinal) -#define EVP_DigestFinalXOF BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DigestFinalXOF) -#define EVP_DigestFinal_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DigestFinal_ex) -#define EVP_DigestInit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DigestInit) -#define EVP_DigestInit_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DigestInit_ex) -#define EVP_DigestSign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DigestSign) -#define EVP_DigestSignFinal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DigestSignFinal) -#define EVP_DigestSignInit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DigestSignInit) -#define EVP_DigestSignUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DigestSignUpdate) -#define EVP_DigestUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DigestUpdate) -#define EVP_DigestVerify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DigestVerify) -#define EVP_DigestVerifyFinal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DigestVerifyFinal) -#define EVP_DigestVerifyInit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DigestVerifyInit) -#define EVP_DigestVerifyUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DigestVerifyUpdate) -#define EVP_EncodeBlock BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_EncodeBlock) -#define EVP_EncodeFinal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_EncodeFinal) -#define EVP_EncodeInit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_EncodeInit) -#define EVP_EncodeUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_EncodeUpdate) -#define EVP_EncodedLength BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_EncodedLength) -#define EVP_EncryptFinal_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_EncryptFinal_ex) -#define EVP_EncryptInit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_EncryptInit) -#define EVP_EncryptInit_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_EncryptInit_ex) -#define EVP_EncryptUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_EncryptUpdate) -#define EVP_MD_CTX_block_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_CTX_block_size) -#define EVP_MD_CTX_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_CTX_cleanup) -#define EVP_MD_CTX_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_CTX_copy) -#define EVP_MD_CTX_copy_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_CTX_copy_ex) -#define EVP_MD_CTX_create BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_CTX_create) -#define EVP_MD_CTX_destroy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_CTX_destroy) -#define EVP_MD_CTX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_CTX_free) -#define EVP_MD_CTX_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_CTX_init) -#define EVP_MD_CTX_md BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_CTX_md) -#define EVP_MD_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_CTX_new) -#define EVP_MD_CTX_reset BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_CTX_reset) -#define EVP_MD_CTX_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_CTX_size) -#define EVP_MD_CTX_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_CTX_type) -#define EVP_MD_block_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_block_size) -#define EVP_MD_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_flags) -#define EVP_MD_meth_get_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_meth_get_flags) -#define EVP_MD_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_size) -#define EVP_MD_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_type) -#define EVP_PBE_scrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PBE_scrypt) -#define EVP_PKCS82PKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKCS82PKEY) -#define EVP_PKEY2PKCS8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY2PKCS8) -#define EVP_PKEY_CTX_ctrl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_ctrl) -#define EVP_PKEY_CTX_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_dup) -#define EVP_PKEY_CTX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_free) -#define EVP_PKEY_CTX_get0_pkey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_get0_pkey) -#define EVP_PKEY_CTX_get0_rsa_oaep_label BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_get0_rsa_oaep_label) -#define EVP_PKEY_CTX_get_rsa_mgf1_md BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_get_rsa_mgf1_md) -#define EVP_PKEY_CTX_get_rsa_oaep_md BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_get_rsa_oaep_md) -#define EVP_PKEY_CTX_get_rsa_padding BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_get_rsa_padding) -#define EVP_PKEY_CTX_get_rsa_pss_saltlen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_get_rsa_pss_saltlen) -#define EVP_PKEY_CTX_get_signature_md BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_get_signature_md) -#define EVP_PKEY_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_new) -#define EVP_PKEY_CTX_new_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_new_id) -#define EVP_PKEY_CTX_set0_rsa_oaep_label BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_set0_rsa_oaep_label) -#define EVP_PKEY_CTX_set_ec_param_enc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_set_ec_param_enc) -#define EVP_PKEY_CTX_set_ec_paramgen_curve_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_set_ec_paramgen_curve_nid) -#define EVP_PKEY_CTX_set_rsa_keygen_bits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_set_rsa_keygen_bits) -#define EVP_PKEY_CTX_set_rsa_keygen_pubexp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_set_rsa_keygen_pubexp) -#define EVP_PKEY_CTX_set_rsa_mgf1_md BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_set_rsa_mgf1_md) -#define EVP_PKEY_CTX_set_rsa_oaep_md BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_set_rsa_oaep_md) -#define EVP_PKEY_CTX_set_rsa_padding BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_set_rsa_padding) -#define EVP_PKEY_CTX_set_rsa_pss_saltlen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_set_rsa_pss_saltlen) -#define EVP_PKEY_CTX_set_signature_md BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_set_signature_md) -#define EVP_PKEY_assign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_assign) -#define EVP_PKEY_assign_DSA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_assign_DSA) -#define EVP_PKEY_assign_EC_KEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_assign_EC_KEY) -#define EVP_PKEY_assign_RSA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_assign_RSA) -#define EVP_PKEY_base_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_base_id) -#define EVP_PKEY_bits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_bits) -#define EVP_PKEY_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_cmp) -#define EVP_PKEY_cmp_parameters BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_cmp_parameters) -#define EVP_PKEY_copy_parameters BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_copy_parameters) -#define EVP_PKEY_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_decrypt) -#define EVP_PKEY_decrypt_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_decrypt_init) -#define EVP_PKEY_derive BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_derive) -#define EVP_PKEY_derive_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_derive_init) -#define EVP_PKEY_derive_set_peer BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_derive_set_peer) -#define EVP_PKEY_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_encrypt) -#define EVP_PKEY_encrypt_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_encrypt_init) -#define EVP_PKEY_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_free) -#define EVP_PKEY_get0_DH BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_get0_DH) -#define EVP_PKEY_get0_DSA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_get0_DSA) -#define EVP_PKEY_get0_EC_KEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_get0_EC_KEY) -#define EVP_PKEY_get0_RSA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_get0_RSA) -#define EVP_PKEY_get1_DH BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_get1_DH) -#define EVP_PKEY_get1_DSA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_get1_DSA) -#define EVP_PKEY_get1_EC_KEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_get1_EC_KEY) -#define EVP_PKEY_get1_RSA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_get1_RSA) -#define EVP_PKEY_get1_tls_encodedpoint BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_get1_tls_encodedpoint) -#define EVP_PKEY_get_raw_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_get_raw_private_key) -#define EVP_PKEY_get_raw_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_get_raw_public_key) -#define EVP_PKEY_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_id) -#define EVP_PKEY_is_opaque BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_is_opaque) -#define EVP_PKEY_keygen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_keygen) -#define EVP_PKEY_keygen_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_keygen_init) -#define EVP_PKEY_missing_parameters BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_missing_parameters) -#define EVP_PKEY_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_new) -#define EVP_PKEY_new_raw_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_new_raw_private_key) -#define EVP_PKEY_new_raw_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_new_raw_public_key) -#define EVP_PKEY_paramgen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_paramgen) -#define EVP_PKEY_paramgen_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_paramgen_init) -#define EVP_PKEY_print_params BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_print_params) -#define EVP_PKEY_print_private BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_print_private) -#define EVP_PKEY_print_public BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_print_public) -#define EVP_PKEY_set1_DSA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_set1_DSA) -#define EVP_PKEY_set1_EC_KEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_set1_EC_KEY) -#define EVP_PKEY_set1_RSA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_set1_RSA) -#define EVP_PKEY_set1_tls_encodedpoint BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_set1_tls_encodedpoint) -#define EVP_PKEY_set_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_set_type) -#define EVP_PKEY_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_sign) -#define EVP_PKEY_sign_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_sign_init) -#define EVP_PKEY_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_size) -#define EVP_PKEY_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_type) -#define EVP_PKEY_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_up_ref) -#define EVP_PKEY_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_verify) -#define EVP_PKEY_verify_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_verify_init) -#define EVP_PKEY_verify_recover BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_verify_recover) -#define EVP_PKEY_verify_recover_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_verify_recover_init) -#define EVP_SignFinal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_SignFinal) -#define EVP_SignInit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_SignInit) -#define EVP_SignInit_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_SignInit_ex) -#define EVP_SignUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_SignUpdate) -#define EVP_VerifyFinal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_VerifyFinal) -#define EVP_VerifyInit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_VerifyInit) -#define EVP_VerifyInit_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_VerifyInit_ex) -#define EVP_VerifyUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_VerifyUpdate) -#define EVP_add_cipher_alias BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_add_cipher_alias) -#define EVP_add_digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_add_digest) -#define EVP_aead_aes_128_cbc_sha1_tls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_128_cbc_sha1_tls) -#define EVP_aead_aes_128_cbc_sha1_tls_implicit_iv BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_128_cbc_sha1_tls_implicit_iv) -#define EVP_aead_aes_128_cbc_sha256_tls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_128_cbc_sha256_tls) -#define EVP_aead_aes_128_ccm_bluetooth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_128_ccm_bluetooth) -#define EVP_aead_aes_128_ccm_bluetooth_8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_128_ccm_bluetooth_8) -#define EVP_aead_aes_128_ctr_hmac_sha256 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_128_ctr_hmac_sha256) -#define EVP_aead_aes_128_gcm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_128_gcm) -#define EVP_aead_aes_128_gcm_siv BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_128_gcm_siv) -#define EVP_aead_aes_128_gcm_tls12 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_128_gcm_tls12) -#define EVP_aead_aes_128_gcm_tls13 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_128_gcm_tls13) -#define EVP_aead_aes_192_gcm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_192_gcm) -#define EVP_aead_aes_256_cbc_sha1_tls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_256_cbc_sha1_tls) -#define EVP_aead_aes_256_cbc_sha1_tls_implicit_iv BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_256_cbc_sha1_tls_implicit_iv) -#define EVP_aead_aes_256_cbc_sha256_tls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_256_cbc_sha256_tls) -#define EVP_aead_aes_256_cbc_sha384_tls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_256_cbc_sha384_tls) -#define EVP_aead_aes_256_ctr_hmac_sha256 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_256_ctr_hmac_sha256) -#define EVP_aead_aes_256_gcm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_256_gcm) -#define EVP_aead_aes_256_gcm_siv BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_256_gcm_siv) -#define EVP_aead_aes_256_gcm_tls12 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_256_gcm_tls12) -#define EVP_aead_aes_256_gcm_tls13 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_256_gcm_tls13) -#define EVP_aead_chacha20_poly1305 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_chacha20_poly1305) -#define EVP_aead_des_ede3_cbc_sha1_tls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_des_ede3_cbc_sha1_tls) -#define EVP_aead_des_ede3_cbc_sha1_tls_implicit_iv BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_des_ede3_cbc_sha1_tls_implicit_iv) -#define EVP_aead_null_sha1_tls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_null_sha1_tls) -#define EVP_aead_xchacha20_poly1305 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_xchacha20_poly1305) -#define EVP_aes_128_cbc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_128_cbc) -#define EVP_aes_128_ctr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_128_ctr) -#define EVP_aes_128_ecb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_128_ecb) -#define EVP_aes_128_gcm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_128_gcm) -#define EVP_aes_128_ofb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_128_ofb) -#define EVP_aes_192_cbc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_192_cbc) -#define EVP_aes_192_ctr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_192_ctr) -#define EVP_aes_192_ecb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_192_ecb) -#define EVP_aes_192_gcm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_192_gcm) -#define EVP_aes_192_ofb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_192_ofb) -#define EVP_aes_256_cbc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_256_cbc) -#define EVP_aes_256_ctr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_256_ctr) -#define EVP_aes_256_ecb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_256_ecb) -#define EVP_aes_256_gcm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_256_gcm) -#define EVP_aes_256_ofb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_256_ofb) -#define EVP_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_cleanup) -#define EVP_des_cbc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_des_cbc) -#define EVP_des_ecb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_des_ecb) -#define EVP_des_ede BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_des_ede) -#define EVP_des_ede3 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_des_ede3) -#define EVP_des_ede3_cbc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_des_ede3_cbc) -#define EVP_des_ede3_ecb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_des_ede3_ecb) -#define EVP_des_ede_cbc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_des_ede_cbc) -#define EVP_enc_null BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_enc_null) -#define EVP_get_cipherbyname BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_get_cipherbyname) -#define EVP_get_cipherbynid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_get_cipherbynid) -#define EVP_get_digestbyname BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_get_digestbyname) -#define EVP_get_digestbynid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_get_digestbynid) -#define EVP_get_digestbyobj BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_get_digestbyobj) -#define EVP_has_aes_hardware BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_has_aes_hardware) -#define EVP_marshal_digest_algorithm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_marshal_digest_algorithm) -#define EVP_marshal_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_marshal_private_key) -#define EVP_marshal_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_marshal_public_key) -#define EVP_md4 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_md4) -#define EVP_md5 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_md5) -#define EVP_md5_sha1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_md5_sha1) -#define EVP_parse_digest_algorithm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_parse_digest_algorithm) -#define EVP_parse_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_parse_private_key) -#define EVP_parse_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_parse_public_key) -#define EVP_rc2_40_cbc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_rc2_40_cbc) -#define EVP_rc2_cbc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_rc2_cbc) -#define EVP_rc4 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_rc4) -#define EVP_sha1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_sha1) -#define EVP_sha224 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_sha224) -#define EVP_sha256 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_sha256) -#define EVP_sha384 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_sha384) -#define EVP_sha512 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_sha512) -#define EVP_tls_cbc_copy_mac BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_tls_cbc_copy_mac) -#define EVP_tls_cbc_digest_record BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_tls_cbc_digest_record) -#define EVP_tls_cbc_record_digest_supported BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_tls_cbc_record_digest_supported) -#define EVP_tls_cbc_remove_padding BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_tls_cbc_remove_padding) -#define EXTENDED_KEY_USAGE_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EXTENDED_KEY_USAGE_free) -#define EXTENDED_KEY_USAGE_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EXTENDED_KEY_USAGE_it) -#define EXTENDED_KEY_USAGE_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EXTENDED_KEY_USAGE_new) -#define FIPS_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, FIPS_mode) -#define FIPS_mode_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, FIPS_mode_set) -#define GENERAL_NAMES_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_NAMES_free) -#define GENERAL_NAMES_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_NAMES_it) -#define GENERAL_NAMES_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_NAMES_new) -#define GENERAL_NAME_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_NAME_cmp) -#define GENERAL_NAME_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_NAME_dup) -#define GENERAL_NAME_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_NAME_free) -#define GENERAL_NAME_get0_otherName BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_NAME_get0_otherName) -#define GENERAL_NAME_get0_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_NAME_get0_value) -#define GENERAL_NAME_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_NAME_it) -#define GENERAL_NAME_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_NAME_new) -#define GENERAL_NAME_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_NAME_print) -#define GENERAL_NAME_set0_othername BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_NAME_set0_othername) -#define GENERAL_NAME_set0_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_NAME_set0_value) -#define GENERAL_SUBTREE_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_SUBTREE_free) -#define GENERAL_SUBTREE_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_SUBTREE_it) -#define GENERAL_SUBTREE_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_SUBTREE_new) -#define HKDF BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HKDF) -#define HKDF_expand BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HKDF_expand) -#define HKDF_extract BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HKDF_extract) -#define HMAC BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HMAC) -#define HMAC_CTX_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HMAC_CTX_cleanup) -#define HMAC_CTX_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HMAC_CTX_copy) -#define HMAC_CTX_copy_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HMAC_CTX_copy_ex) -#define HMAC_CTX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HMAC_CTX_free) -#define HMAC_CTX_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HMAC_CTX_init) -#define HMAC_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HMAC_CTX_new) -#define HMAC_CTX_reset BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HMAC_CTX_reset) -#define HMAC_Final BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HMAC_Final) -#define HMAC_Init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HMAC_Init) -#define HMAC_Init_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HMAC_Init_ex) -#define HMAC_Update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HMAC_Update) -#define HMAC_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HMAC_size) -#define HRSS_decap BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HRSS_decap) -#define HRSS_encap BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HRSS_encap) -#define HRSS_generate_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HRSS_generate_key) -#define HRSS_marshal_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HRSS_marshal_public_key) -#define HRSS_parse_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HRSS_parse_public_key) -#define HRSS_poly2_rotr_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HRSS_poly2_rotr_consttime) -#define HRSS_poly3_invert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HRSS_poly3_invert) -#define HRSS_poly3_mul BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HRSS_poly3_mul) -#define ISSUING_DIST_POINT_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ISSUING_DIST_POINT_free) -#define ISSUING_DIST_POINT_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ISSUING_DIST_POINT_it) -#define ISSUING_DIST_POINT_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ISSUING_DIST_POINT_new) -#define MD4 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, MD4) -#define MD4_Final BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, MD4_Final) -#define MD4_Init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, MD4_Init) -#define MD4_Transform BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, MD4_Transform) -#define MD4_Update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, MD4_Update) -#define MD5 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, MD5) -#define MD5_Final BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, MD5_Final) -#define MD5_Init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, MD5_Init) -#define MD5_Transform BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, MD5_Transform) -#define MD5_Update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, MD5_Update) -#define METHOD_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, METHOD_ref) -#define METHOD_unref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, METHOD_unref) -#define NAME_CONSTRAINTS_check BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NAME_CONSTRAINTS_check) -#define NAME_CONSTRAINTS_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NAME_CONSTRAINTS_free) -#define NAME_CONSTRAINTS_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NAME_CONSTRAINTS_it) -#define NAME_CONSTRAINTS_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NAME_CONSTRAINTS_new) -#define NCONF_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NCONF_free) -#define NCONF_get_section BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NCONF_get_section) -#define NCONF_get_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NCONF_get_string) -#define NCONF_load BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NCONF_load) -#define NCONF_load_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NCONF_load_bio) -#define NCONF_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NCONF_new) -#define NETSCAPE_SPKAC_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NETSCAPE_SPKAC_free) -#define NETSCAPE_SPKAC_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NETSCAPE_SPKAC_it) -#define NETSCAPE_SPKAC_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NETSCAPE_SPKAC_new) -#define NETSCAPE_SPKI_b64_decode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NETSCAPE_SPKI_b64_decode) -#define NETSCAPE_SPKI_b64_encode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NETSCAPE_SPKI_b64_encode) -#define NETSCAPE_SPKI_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NETSCAPE_SPKI_free) -#define NETSCAPE_SPKI_get_pubkey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NETSCAPE_SPKI_get_pubkey) -#define NETSCAPE_SPKI_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NETSCAPE_SPKI_it) -#define NETSCAPE_SPKI_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NETSCAPE_SPKI_new) -#define NETSCAPE_SPKI_set_pubkey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NETSCAPE_SPKI_set_pubkey) -#define NETSCAPE_SPKI_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NETSCAPE_SPKI_sign) -#define NETSCAPE_SPKI_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NETSCAPE_SPKI_verify) -#define NOTICEREF_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NOTICEREF_free) -#define NOTICEREF_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NOTICEREF_it) -#define NOTICEREF_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NOTICEREF_new) -#define OBJ_cbs2nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_cbs2nid) -#define OBJ_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_cleanup) -#define OBJ_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_cmp) -#define OBJ_create BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_create) -#define OBJ_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_dup) -#define OBJ_find_sigid_algs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_find_sigid_algs) -#define OBJ_find_sigid_by_algs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_find_sigid_by_algs) -#define OBJ_get0_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_get0_data) -#define OBJ_length BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_length) -#define OBJ_ln2nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_ln2nid) -#define OBJ_nid2cbb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_nid2cbb) -#define OBJ_nid2ln BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_nid2ln) -#define OBJ_nid2obj BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_nid2obj) -#define OBJ_nid2sn BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_nid2sn) -#define OBJ_obj2nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_obj2nid) -#define OBJ_obj2txt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_obj2txt) -#define OBJ_sn2nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_sn2nid) -#define OBJ_txt2nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_txt2nid) -#define OBJ_txt2obj BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_txt2obj) -#define OPENSSL_add_all_algorithms_conf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_add_all_algorithms_conf) -#define OPENSSL_built_in_curves BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_built_in_curves) -#define OPENSSL_cleanse BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_cleanse) -#define OPENSSL_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_cleanup) -#define OPENSSL_clear_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_clear_free) -#define OPENSSL_config BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_config) -#define OPENSSL_cpuid_setup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_cpuid_setup) -#define OPENSSL_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_free) -#define OPENSSL_gmtime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_gmtime) -#define OPENSSL_gmtime_adj BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_gmtime_adj) -#define OPENSSL_gmtime_diff BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_gmtime_diff) -#define OPENSSL_hash32 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_hash32) -#define OPENSSL_ia32cap_P BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_ia32cap_P) -#define OPENSSL_init_crypto BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_init_crypto) -#define OPENSSL_load_builtin_modules BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_load_builtin_modules) -#define OPENSSL_malloc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_malloc) -#define OPENSSL_malloc_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_malloc_init) -#define OPENSSL_no_config BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_no_config) -#define OPENSSL_realloc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_realloc) -#define OPENSSL_strcasecmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_strcasecmp) -#define OPENSSL_strdup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_strdup) -#define OPENSSL_strncasecmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_strncasecmp) -#define OPENSSL_strnlen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_strnlen) -#define OPENSSL_tolower BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_tolower) -#define OTHERNAME_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OTHERNAME_cmp) -#define OTHERNAME_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OTHERNAME_free) -#define OTHERNAME_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OTHERNAME_it) -#define OTHERNAME_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OTHERNAME_new) -#define OpenSSL_add_all_algorithms BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OpenSSL_add_all_algorithms) -#define OpenSSL_add_all_ciphers BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OpenSSL_add_all_ciphers) -#define OpenSSL_add_all_digests BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OpenSSL_add_all_digests) -#define OpenSSL_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OpenSSL_version) -#define OpenSSL_version_num BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OpenSSL_version_num) -#define PEM_ASN1_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_ASN1_read) -#define PEM_ASN1_read_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_ASN1_read_bio) -#define PEM_ASN1_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_ASN1_write) -#define PEM_ASN1_write_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_ASN1_write_bio) -#define PEM_X509_INFO_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_X509_INFO_read) -#define PEM_X509_INFO_read_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_X509_INFO_read_bio) -#define PEM_X509_INFO_write_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_X509_INFO_write_bio) -#define PEM_bytes_read_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_bytes_read_bio) -#define PEM_def_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_def_callback) -#define PEM_dek_info BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_dek_info) -#define PEM_do_header BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_do_header) -#define PEM_get_EVP_CIPHER_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_get_EVP_CIPHER_INFO) -#define PEM_proc_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_proc_type) -#define PEM_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read) -#define PEM_read_DHparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_DHparams) -#define PEM_read_DSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_DSAPrivateKey) -#define PEM_read_DSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_DSA_PUBKEY) -#define PEM_read_DSAparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_DSAparams) -#define PEM_read_ECPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_ECPrivateKey) -#define PEM_read_EC_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_EC_PUBKEY) -#define PEM_read_PKCS7 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_PKCS7) -#define PEM_read_PKCS8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_PKCS8) -#define PEM_read_PKCS8_PRIV_KEY_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_PKCS8_PRIV_KEY_INFO) -#define PEM_read_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_PUBKEY) -#define PEM_read_PrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_PrivateKey) -#define PEM_read_RSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_RSAPrivateKey) -#define PEM_read_RSAPublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_RSAPublicKey) -#define PEM_read_RSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_RSA_PUBKEY) -#define PEM_read_X509 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_X509) -#define PEM_read_X509_AUX BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_X509_AUX) -#define PEM_read_X509_CRL BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_X509_CRL) -#define PEM_read_X509_REQ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_X509_REQ) -#define PEM_read_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio) -#define PEM_read_bio_DHparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_DHparams) -#define PEM_read_bio_DSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_DSAPrivateKey) -#define PEM_read_bio_DSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_DSA_PUBKEY) -#define PEM_read_bio_DSAparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_DSAparams) -#define PEM_read_bio_ECPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_ECPrivateKey) -#define PEM_read_bio_EC_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_EC_PUBKEY) -#define PEM_read_bio_PKCS7 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_PKCS7) -#define PEM_read_bio_PKCS8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_PKCS8) -#define PEM_read_bio_PKCS8_PRIV_KEY_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_PKCS8_PRIV_KEY_INFO) -#define PEM_read_bio_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_PUBKEY) -#define PEM_read_bio_PrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_PrivateKey) -#define PEM_read_bio_RSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_RSAPrivateKey) -#define PEM_read_bio_RSAPublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_RSAPublicKey) -#define PEM_read_bio_RSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_RSA_PUBKEY) -#define PEM_read_bio_X509 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_X509) -#define PEM_read_bio_X509_AUX BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_X509_AUX) -#define PEM_read_bio_X509_CRL BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_X509_CRL) -#define PEM_read_bio_X509_REQ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_X509_REQ) -#define PEM_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write) -#define PEM_write_DHparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_DHparams) -#define PEM_write_DSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_DSAPrivateKey) -#define PEM_write_DSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_DSA_PUBKEY) -#define PEM_write_DSAparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_DSAparams) -#define PEM_write_ECPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_ECPrivateKey) -#define PEM_write_EC_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_EC_PUBKEY) -#define PEM_write_PKCS7 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_PKCS7) -#define PEM_write_PKCS8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_PKCS8) -#define PEM_write_PKCS8PrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_PKCS8PrivateKey) -#define PEM_write_PKCS8PrivateKey_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_PKCS8PrivateKey_nid) -#define PEM_write_PKCS8_PRIV_KEY_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_PKCS8_PRIV_KEY_INFO) -#define PEM_write_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_PUBKEY) -#define PEM_write_PrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_PrivateKey) -#define PEM_write_RSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_RSAPrivateKey) -#define PEM_write_RSAPublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_RSAPublicKey) -#define PEM_write_RSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_RSA_PUBKEY) -#define PEM_write_X509 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_X509) -#define PEM_write_X509_AUX BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_X509_AUX) -#define PEM_write_X509_CRL BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_X509_CRL) -#define PEM_write_X509_REQ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_X509_REQ) -#define PEM_write_X509_REQ_NEW BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_X509_REQ_NEW) -#define PEM_write_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio) -#define PEM_write_bio_DHparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_DHparams) -#define PEM_write_bio_DSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_DSAPrivateKey) -#define PEM_write_bio_DSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_DSA_PUBKEY) -#define PEM_write_bio_DSAparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_DSAparams) -#define PEM_write_bio_ECPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_ECPrivateKey) -#define PEM_write_bio_EC_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_EC_PUBKEY) -#define PEM_write_bio_PKCS7 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_PKCS7) -#define PEM_write_bio_PKCS8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_PKCS8) -#define PEM_write_bio_PKCS8PrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_PKCS8PrivateKey) -#define PEM_write_bio_PKCS8PrivateKey_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_PKCS8PrivateKey_nid) -#define PEM_write_bio_PKCS8_PRIV_KEY_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_PKCS8_PRIV_KEY_INFO) -#define PEM_write_bio_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_PUBKEY) -#define PEM_write_bio_PrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_PrivateKey) -#define PEM_write_bio_RSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_RSAPrivateKey) -#define PEM_write_bio_RSAPublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_RSAPublicKey) -#define PEM_write_bio_RSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_RSA_PUBKEY) -#define PEM_write_bio_X509 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_X509) -#define PEM_write_bio_X509_AUX BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_X509_AUX) -#define PEM_write_bio_X509_CRL BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_X509_CRL) -#define PEM_write_bio_X509_REQ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_X509_REQ) -#define PEM_write_bio_X509_REQ_NEW BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_X509_REQ_NEW) -#define PKCS12_PBE_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS12_PBE_add) -#define PKCS12_create BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS12_create) -#define PKCS12_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS12_free) -#define PKCS12_get_key_and_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS12_get_key_and_certs) -#define PKCS12_parse BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS12_parse) -#define PKCS12_verify_mac BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS12_verify_mac) -#define PKCS5_PBKDF2_HMAC BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS5_PBKDF2_HMAC) -#define PKCS5_PBKDF2_HMAC_SHA1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS5_PBKDF2_HMAC_SHA1) -#define PKCS5_pbe2_decrypt_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS5_pbe2_decrypt_init) -#define PKCS5_pbe2_encrypt_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS5_pbe2_encrypt_init) -#define PKCS7_bundle_CRLs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS7_bundle_CRLs) -#define PKCS7_bundle_certificates BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS7_bundle_certificates) -#define PKCS7_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS7_free) -#define PKCS7_get_CRLs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS7_get_CRLs) -#define PKCS7_get_PEM_CRLs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS7_get_PEM_CRLs) -#define PKCS7_get_PEM_certificates BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS7_get_PEM_certificates) -#define PKCS7_get_certificates BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS7_get_certificates) -#define PKCS7_get_raw_certificates BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS7_get_raw_certificates) -#define PKCS7_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS7_sign) -#define PKCS7_type_is_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS7_type_is_data) -#define PKCS7_type_is_digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS7_type_is_digest) -#define PKCS7_type_is_encrypted BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS7_type_is_encrypted) -#define PKCS7_type_is_enveloped BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS7_type_is_enveloped) -#define PKCS7_type_is_signed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS7_type_is_signed) -#define PKCS7_type_is_signedAndEnveloped BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS7_type_is_signedAndEnveloped) -#define PKCS8_PRIV_KEY_INFO_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS8_PRIV_KEY_INFO_free) -#define PKCS8_PRIV_KEY_INFO_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS8_PRIV_KEY_INFO_it) -#define PKCS8_PRIV_KEY_INFO_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS8_PRIV_KEY_INFO_new) -#define PKCS8_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS8_decrypt) -#define PKCS8_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS8_encrypt) -#define PKCS8_marshal_encrypted_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS8_marshal_encrypted_private_key) -#define PKCS8_parse_encrypted_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS8_parse_encrypted_private_key) -#define PKCS8_pkey_get0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS8_pkey_get0) -#define PKCS8_pkey_set0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS8_pkey_set0) -#define PKEY_USAGE_PERIOD_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKEY_USAGE_PERIOD_free) -#define PKEY_USAGE_PERIOD_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKEY_USAGE_PERIOD_it) -#define PKEY_USAGE_PERIOD_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKEY_USAGE_PERIOD_new) -#define POLICYINFO_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, POLICYINFO_free) -#define POLICYINFO_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, POLICYINFO_it) -#define POLICYINFO_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, POLICYINFO_new) -#define POLICYQUALINFO_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, POLICYQUALINFO_free) -#define POLICYQUALINFO_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, POLICYQUALINFO_it) -#define POLICYQUALINFO_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, POLICYQUALINFO_new) -#define POLICY_CONSTRAINTS_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, POLICY_CONSTRAINTS_free) -#define POLICY_CONSTRAINTS_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, POLICY_CONSTRAINTS_it) -#define POLICY_CONSTRAINTS_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, POLICY_CONSTRAINTS_new) -#define POLICY_MAPPINGS_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, POLICY_MAPPINGS_it) -#define POLICY_MAPPING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, POLICY_MAPPING_free) -#define POLICY_MAPPING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, POLICY_MAPPING_it) -#define POLICY_MAPPING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, POLICY_MAPPING_new) -#define PROXY_CERT_INFO_EXTENSION_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PROXY_CERT_INFO_EXTENSION_free) -#define PROXY_CERT_INFO_EXTENSION_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PROXY_CERT_INFO_EXTENSION_it) -#define PROXY_CERT_INFO_EXTENSION_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PROXY_CERT_INFO_EXTENSION_new) -#define PROXY_POLICY_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PROXY_POLICY_free) -#define PROXY_POLICY_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PROXY_POLICY_it) -#define PROXY_POLICY_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PROXY_POLICY_new) -#define RAND_SSLeay BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_SSLeay) -#define RAND_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_add) -#define RAND_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_bytes) -#define RAND_bytes_with_additional_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_bytes_with_additional_data) -#define RAND_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_cleanup) -#define RAND_egd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_egd) -#define RAND_enable_fork_unsafe_buffering BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_enable_fork_unsafe_buffering) -#define RAND_file_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_file_name) -#define RAND_get_rand_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_get_rand_method) -#define RAND_load_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_load_file) -#define RAND_poll BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_poll) -#define RAND_pseudo_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_pseudo_bytes) -#define RAND_seed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_seed) -#define RAND_set_rand_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_set_rand_method) -#define RAND_set_urandom_fd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_set_urandom_fd) -#define RAND_status BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_status) -#define RC4 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RC4) -#define RC4_set_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RC4_set_key) -#define RSAPrivateKey_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSAPrivateKey_dup) -#define RSAPublicKey_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSAPublicKey_dup) -#define RSAZ_1024_mod_exp_avx2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSAZ_1024_mod_exp_avx2) -#define RSA_PSS_PARAMS_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_PSS_PARAMS_free) -#define RSA_PSS_PARAMS_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_PSS_PARAMS_it) -#define RSA_PSS_PARAMS_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_PSS_PARAMS_new) -#define RSA_add_pkcs1_prefix BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_add_pkcs1_prefix) -#define RSA_bits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_bits) -#define RSA_blinding_on BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_blinding_on) -#define RSA_check_fips BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_check_fips) -#define RSA_check_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_check_key) -#define RSA_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_decrypt) -#define RSA_default_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_default_method) -#define RSA_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_encrypt) -#define RSA_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_flags) -#define RSA_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_free) -#define RSA_generate_key_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_generate_key_ex) -#define RSA_generate_key_fips BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_generate_key_fips) -#define RSA_get0_crt_params BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_get0_crt_params) -#define RSA_get0_factors BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_get0_factors) -#define RSA_get0_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_get0_key) -#define RSA_get_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_get_ex_data) -#define RSA_get_ex_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_get_ex_new_index) -#define RSA_is_opaque BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_is_opaque) -#define RSA_marshal_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_marshal_private_key) -#define RSA_marshal_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_marshal_public_key) -#define RSA_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_new) -#define RSA_new_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_new_method) -#define RSA_padding_add_PKCS1_OAEP_mgf1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_padding_add_PKCS1_OAEP_mgf1) -#define RSA_padding_add_PKCS1_PSS_mgf1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_padding_add_PKCS1_PSS_mgf1) -#define RSA_padding_add_PKCS1_type_1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_padding_add_PKCS1_type_1) -#define RSA_padding_add_PKCS1_type_2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_padding_add_PKCS1_type_2) -#define RSA_padding_add_none BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_padding_add_none) -#define RSA_padding_check_PKCS1_OAEP_mgf1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_padding_check_PKCS1_OAEP_mgf1) -#define RSA_padding_check_PKCS1_type_1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_padding_check_PKCS1_type_1) -#define RSA_padding_check_PKCS1_type_2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_padding_check_PKCS1_type_2) -#define RSA_parse_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_parse_private_key) -#define RSA_parse_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_parse_public_key) -#define RSA_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_print) -#define RSA_private_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_private_decrypt) -#define RSA_private_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_private_encrypt) -#define RSA_private_key_from_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_private_key_from_bytes) -#define RSA_private_key_to_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_private_key_to_bytes) -#define RSA_private_transform BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_private_transform) -#define RSA_public_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_public_decrypt) -#define RSA_public_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_public_encrypt) -#define RSA_public_key_from_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_public_key_from_bytes) -#define RSA_public_key_to_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_public_key_to_bytes) -#define RSA_set0_crt_params BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_set0_crt_params) -#define RSA_set0_factors BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_set0_factors) -#define RSA_set0_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_set0_key) -#define RSA_set_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_set_ex_data) -#define RSA_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_sign) -#define RSA_sign_pss_mgf1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_sign_pss_mgf1) -#define RSA_sign_raw BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_sign_raw) -#define RSA_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_size) -#define RSA_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_up_ref) -#define RSA_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_verify) -#define RSA_verify_PKCS1_PSS_mgf1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_verify_PKCS1_PSS_mgf1) -#define RSA_verify_pss_mgf1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_verify_pss_mgf1) -#define RSA_verify_raw BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_verify_raw) -#define SHA1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA1) -#define SHA1_Final BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA1_Final) -#define SHA1_Init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA1_Init) -#define SHA1_Transform BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA1_Transform) -#define SHA1_Update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA1_Update) -#define SHA224 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA224) -#define SHA224_Final BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA224_Final) -#define SHA224_Init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA224_Init) -#define SHA224_Update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA224_Update) -#define SHA256 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA256) -#define SHA256_Final BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA256_Final) -#define SHA256_Init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA256_Init) -#define SHA256_Transform BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA256_Transform) -#define SHA256_TransformBlocks BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA256_TransformBlocks) -#define SHA256_Update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA256_Update) -#define SHA384 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA384) -#define SHA384_Final BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA384_Final) -#define SHA384_Init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA384_Init) -#define SHA384_Update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA384_Update) -#define SHA512 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA512) -#define SHA512_Final BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA512_Final) -#define SHA512_Init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA512_Init) -#define SHA512_Transform BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA512_Transform) -#define SHA512_Update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA512_Update) -#define SIPHASH_24 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SIPHASH_24) -#define SPAKE2_CTX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SPAKE2_CTX_free) -#define SPAKE2_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SPAKE2_CTX_new) -#define SPAKE2_generate_msg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SPAKE2_generate_msg) -#define SPAKE2_process_msg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SPAKE2_process_msg) -#define SSLeay BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSLeay) -#define SSLeay_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSLeay_version) -#define SXNETID_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SXNETID_free) -#define SXNETID_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SXNETID_it) -#define SXNETID_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SXNETID_new) -#define SXNET_add_id_INTEGER BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SXNET_add_id_INTEGER) -#define SXNET_add_id_asc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SXNET_add_id_asc) -#define SXNET_add_id_ulong BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SXNET_add_id_ulong) -#define SXNET_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SXNET_free) -#define SXNET_get_id_INTEGER BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SXNET_get_id_INTEGER) -#define SXNET_get_id_asc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SXNET_get_id_asc) -#define SXNET_get_id_ulong BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SXNET_get_id_ulong) -#define SXNET_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SXNET_it) -#define SXNET_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SXNET_new) -#define USERNOTICE_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, USERNOTICE_free) -#define USERNOTICE_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, USERNOTICE_it) -#define USERNOTICE_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, USERNOTICE_new) -#define UTF8_getc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, UTF8_getc) -#define UTF8_putc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, UTF8_putc) -#define X25519 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X25519) -#define X25519_keypair BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X25519_keypair) -#define X25519_public_from_private BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X25519_public_from_private) -#define X509V3_EXT_CRL_add_nconf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_CRL_add_nconf) -#define X509V3_EXT_REQ_add_nconf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_REQ_add_nconf) -#define X509V3_EXT_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_add) -#define X509V3_EXT_add_alias BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_add_alias) -#define X509V3_EXT_add_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_add_list) -#define X509V3_EXT_add_nconf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_add_nconf) -#define X509V3_EXT_add_nconf_sk BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_add_nconf_sk) -#define X509V3_EXT_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_cleanup) -#define X509V3_EXT_d2i BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_d2i) -#define X509V3_EXT_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_free) -#define X509V3_EXT_get BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_get) -#define X509V3_EXT_get_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_get_nid) -#define X509V3_EXT_i2d BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_i2d) -#define X509V3_EXT_nconf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_nconf) -#define X509V3_EXT_nconf_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_nconf_nid) -#define X509V3_EXT_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_print) -#define X509V3_EXT_print_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_print_fp) -#define X509V3_EXT_val_prn BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_val_prn) -#define X509V3_NAME_from_section BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_NAME_from_section) -#define X509V3_add1_i2d BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_add1_i2d) -#define X509V3_add_standard_extensions BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_add_standard_extensions) -#define X509V3_add_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_add_value) -#define X509V3_add_value_bool BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_add_value_bool) -#define X509V3_add_value_bool_nf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_add_value_bool_nf) -#define X509V3_add_value_int BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_add_value_int) -#define X509V3_add_value_uchar BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_add_value_uchar) -#define X509V3_conf_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_conf_free) -#define X509V3_extensions_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_extensions_print) -#define X509V3_get_d2i BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_get_d2i) -#define X509V3_get_section BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_get_section) -#define X509V3_get_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_get_string) -#define X509V3_get_value_bool BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_get_value_bool) -#define X509V3_get_value_int BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_get_value_int) -#define X509V3_parse_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_parse_list) -#define X509V3_section_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_section_free) -#define X509V3_set_ctx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_set_ctx) -#define X509V3_set_nconf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_set_nconf) -#define X509V3_string_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_string_free) -#define X509_ALGORS_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ALGORS_it) -#define X509_ALGOR_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ALGOR_cmp) -#define X509_ALGOR_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ALGOR_dup) -#define X509_ALGOR_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ALGOR_free) -#define X509_ALGOR_get0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ALGOR_get0) -#define X509_ALGOR_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ALGOR_it) -#define X509_ALGOR_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ALGOR_new) -#define X509_ALGOR_set0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ALGOR_set0) -#define X509_ALGOR_set_md BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ALGOR_set_md) -#define X509_ATTRIBUTE_SET_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ATTRIBUTE_SET_it) -#define X509_ATTRIBUTE_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ATTRIBUTE_count) -#define X509_ATTRIBUTE_create BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ATTRIBUTE_create) -#define X509_ATTRIBUTE_create_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ATTRIBUTE_create_by_NID) -#define X509_ATTRIBUTE_create_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ATTRIBUTE_create_by_OBJ) -#define X509_ATTRIBUTE_create_by_txt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ATTRIBUTE_create_by_txt) -#define X509_ATTRIBUTE_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ATTRIBUTE_dup) -#define X509_ATTRIBUTE_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ATTRIBUTE_free) -#define X509_ATTRIBUTE_get0_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ATTRIBUTE_get0_data) -#define X509_ATTRIBUTE_get0_object BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ATTRIBUTE_get0_object) -#define X509_ATTRIBUTE_get0_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ATTRIBUTE_get0_type) -#define X509_ATTRIBUTE_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ATTRIBUTE_it) -#define X509_ATTRIBUTE_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ATTRIBUTE_new) -#define X509_ATTRIBUTE_set1_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ATTRIBUTE_set1_data) -#define X509_ATTRIBUTE_set1_object BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ATTRIBUTE_set1_object) -#define X509_CERT_AUX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CERT_AUX_free) -#define X509_CERT_AUX_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CERT_AUX_it) -#define X509_CERT_AUX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CERT_AUX_new) -#define X509_CERT_AUX_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CERT_AUX_print) -#define X509_CINF_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CINF_free) -#define X509_CINF_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CINF_it) -#define X509_CINF_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CINF_new) -#define X509_CRL_INFO_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_INFO_free) -#define X509_CRL_INFO_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_INFO_it) -#define X509_CRL_INFO_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_INFO_new) -#define X509_CRL_METHOD_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_METHOD_free) -#define X509_CRL_METHOD_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_METHOD_new) -#define X509_CRL_add0_revoked BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_add0_revoked) -#define X509_CRL_add1_ext_i2d BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_add1_ext_i2d) -#define X509_CRL_add_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_add_ext) -#define X509_CRL_check_suiteb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_check_suiteb) -#define X509_CRL_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_cmp) -#define X509_CRL_delete_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_delete_ext) -#define X509_CRL_diff BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_diff) -#define X509_CRL_digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_digest) -#define X509_CRL_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_dup) -#define X509_CRL_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_free) -#define X509_CRL_get0_by_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_get0_by_cert) -#define X509_CRL_get0_by_serial BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_get0_by_serial) -#define X509_CRL_get0_lastUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_get0_lastUpdate) -#define X509_CRL_get0_nextUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_get0_nextUpdate) -#define X509_CRL_get0_signature BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_get0_signature) -#define X509_CRL_get_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_get_ext) -#define X509_CRL_get_ext_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_get_ext_by_NID) -#define X509_CRL_get_ext_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_get_ext_by_OBJ) -#define X509_CRL_get_ext_by_critical BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_get_ext_by_critical) -#define X509_CRL_get_ext_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_get_ext_count) -#define X509_CRL_get_ext_d2i BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_get_ext_d2i) -#define X509_CRL_get_meth_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_get_meth_data) -#define X509_CRL_get_signature_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_get_signature_nid) -#define X509_CRL_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_it) -#define X509_CRL_match BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_match) -#define X509_CRL_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_new) -#define X509_CRL_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_print) -#define X509_CRL_print_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_print_fp) -#define X509_CRL_set_default_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_set_default_method) -#define X509_CRL_set_issuer_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_set_issuer_name) -#define X509_CRL_set_lastUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_set_lastUpdate) -#define X509_CRL_set_meth_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_set_meth_data) -#define X509_CRL_set_nextUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_set_nextUpdate) -#define X509_CRL_set_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_set_version) -#define X509_CRL_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_sign) -#define X509_CRL_sign_ctx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_sign_ctx) -#define X509_CRL_sort BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_sort) -#define X509_CRL_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_up_ref) -#define X509_CRL_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_verify) -#define X509_EXTENSIONS_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_EXTENSIONS_it) -#define X509_EXTENSION_create_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_EXTENSION_create_by_NID) -#define X509_EXTENSION_create_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_EXTENSION_create_by_OBJ) -#define X509_EXTENSION_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_EXTENSION_dup) -#define X509_EXTENSION_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_EXTENSION_free) -#define X509_EXTENSION_get_critical BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_EXTENSION_get_critical) -#define X509_EXTENSION_get_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_EXTENSION_get_data) -#define X509_EXTENSION_get_object BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_EXTENSION_get_object) -#define X509_EXTENSION_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_EXTENSION_it) -#define X509_EXTENSION_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_EXTENSION_new) -#define X509_EXTENSION_set_critical BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_EXTENSION_set_critical) -#define X509_EXTENSION_set_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_EXTENSION_set_data) -#define X509_EXTENSION_set_object BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_EXTENSION_set_object) -#define X509_INFO_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_INFO_free) -#define X509_INFO_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_INFO_new) -#define X509_LOOKUP_by_alias BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_LOOKUP_by_alias) -#define X509_LOOKUP_by_fingerprint BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_LOOKUP_by_fingerprint) -#define X509_LOOKUP_by_issuer_serial BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_LOOKUP_by_issuer_serial) -#define X509_LOOKUP_by_subject BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_LOOKUP_by_subject) -#define X509_LOOKUP_ctrl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_LOOKUP_ctrl) -#define X509_LOOKUP_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_LOOKUP_file) -#define X509_LOOKUP_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_LOOKUP_free) -#define X509_LOOKUP_hash_dir BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_LOOKUP_hash_dir) -#define X509_LOOKUP_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_LOOKUP_init) -#define X509_LOOKUP_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_LOOKUP_new) -#define X509_LOOKUP_shutdown BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_LOOKUP_shutdown) -#define X509_NAME_ENTRIES_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_ENTRIES_it) -#define X509_NAME_ENTRY_create_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_ENTRY_create_by_NID) -#define X509_NAME_ENTRY_create_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_ENTRY_create_by_OBJ) -#define X509_NAME_ENTRY_create_by_txt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_ENTRY_create_by_txt) -#define X509_NAME_ENTRY_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_ENTRY_dup) -#define X509_NAME_ENTRY_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_ENTRY_free) -#define X509_NAME_ENTRY_get_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_ENTRY_get_data) -#define X509_NAME_ENTRY_get_object BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_ENTRY_get_object) -#define X509_NAME_ENTRY_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_ENTRY_it) -#define X509_NAME_ENTRY_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_ENTRY_new) -#define X509_NAME_ENTRY_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_ENTRY_set) -#define X509_NAME_ENTRY_set_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_ENTRY_set_data) -#define X509_NAME_ENTRY_set_object BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_ENTRY_set_object) -#define X509_NAME_INTERNAL_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_INTERNAL_it) -#define X509_NAME_add_entry BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_add_entry) -#define X509_NAME_add_entry_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_add_entry_by_NID) -#define X509_NAME_add_entry_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_add_entry_by_OBJ) -#define X509_NAME_add_entry_by_txt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_add_entry_by_txt) -#define X509_NAME_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_cmp) -#define X509_NAME_delete_entry BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_delete_entry) -#define X509_NAME_digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_digest) -#define X509_NAME_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_dup) -#define X509_NAME_entry_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_entry_count) -#define X509_NAME_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_free) -#define X509_NAME_get0_der BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_get0_der) -#define X509_NAME_get_entry BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_get_entry) -#define X509_NAME_get_index_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_get_index_by_NID) -#define X509_NAME_get_index_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_get_index_by_OBJ) -#define X509_NAME_get_text_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_get_text_by_NID) -#define X509_NAME_get_text_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_get_text_by_OBJ) -#define X509_NAME_hash BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_hash) -#define X509_NAME_hash_old BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_hash_old) -#define X509_NAME_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_it) -#define X509_NAME_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_new) -#define X509_NAME_oneline BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_oneline) -#define X509_NAME_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_print) -#define X509_NAME_print_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_print_ex) -#define X509_NAME_print_ex_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_print_ex_fp) -#define X509_NAME_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_set) -#define X509_OBJECT_free_contents BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_OBJECT_free_contents) -#define X509_OBJECT_get0_X509 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_OBJECT_get0_X509) -#define X509_OBJECT_get_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_OBJECT_get_type) -#define X509_OBJECT_idx_by_subject BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_OBJECT_idx_by_subject) -#define X509_OBJECT_retrieve_by_subject BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_OBJECT_retrieve_by_subject) -#define X509_OBJECT_retrieve_match BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_OBJECT_retrieve_match) -#define X509_OBJECT_up_ref_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_OBJECT_up_ref_count) -#define X509_PKEY_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PKEY_free) -#define X509_PKEY_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PKEY_new) -#define X509_POLICY_NODE_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_POLICY_NODE_print) -#define X509_PUBKEY_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PUBKEY_free) -#define X509_PUBKEY_get BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PUBKEY_get) -#define X509_PUBKEY_get0_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PUBKEY_get0_param) -#define X509_PUBKEY_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PUBKEY_it) -#define X509_PUBKEY_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PUBKEY_new) -#define X509_PUBKEY_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PUBKEY_set) -#define X509_PUBKEY_set0_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PUBKEY_set0_param) -#define X509_PURPOSE_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PURPOSE_add) -#define X509_PURPOSE_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PURPOSE_cleanup) -#define X509_PURPOSE_get0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PURPOSE_get0) -#define X509_PURPOSE_get0_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PURPOSE_get0_name) -#define X509_PURPOSE_get0_sname BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PURPOSE_get0_sname) -#define X509_PURPOSE_get_by_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PURPOSE_get_by_id) -#define X509_PURPOSE_get_by_sname BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PURPOSE_get_by_sname) -#define X509_PURPOSE_get_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PURPOSE_get_count) -#define X509_PURPOSE_get_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PURPOSE_get_id) -#define X509_PURPOSE_get_trust BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PURPOSE_get_trust) -#define X509_PURPOSE_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PURPOSE_set) -#define X509_REQ_INFO_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_INFO_free) -#define X509_REQ_INFO_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_INFO_it) -#define X509_REQ_INFO_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_INFO_new) -#define X509_REQ_add1_attr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_add1_attr) -#define X509_REQ_add1_attr_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_add1_attr_by_NID) -#define X509_REQ_add1_attr_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_add1_attr_by_OBJ) -#define X509_REQ_add1_attr_by_txt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_add1_attr_by_txt) -#define X509_REQ_add_extensions BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_add_extensions) -#define X509_REQ_add_extensions_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_add_extensions_nid) -#define X509_REQ_check_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_check_private_key) -#define X509_REQ_delete_attr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_delete_attr) -#define X509_REQ_digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_digest) -#define X509_REQ_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_dup) -#define X509_REQ_extension_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_extension_nid) -#define X509_REQ_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_free) -#define X509_REQ_get0_signature BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_get0_signature) -#define X509_REQ_get1_email BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_get1_email) -#define X509_REQ_get_attr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_get_attr) -#define X509_REQ_get_attr_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_get_attr_by_NID) -#define X509_REQ_get_attr_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_get_attr_by_OBJ) -#define X509_REQ_get_attr_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_get_attr_count) -#define X509_REQ_get_extension_nids BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_get_extension_nids) -#define X509_REQ_get_extensions BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_get_extensions) -#define X509_REQ_get_pubkey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_get_pubkey) -#define X509_REQ_get_signature_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_get_signature_nid) -#define X509_REQ_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_it) -#define X509_REQ_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_new) -#define X509_REQ_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_print) -#define X509_REQ_print_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_print_ex) -#define X509_REQ_print_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_print_fp) -#define X509_REQ_set_extension_nids BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_set_extension_nids) -#define X509_REQ_set_pubkey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_set_pubkey) -#define X509_REQ_set_subject_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_set_subject_name) -#define X509_REQ_set_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_set_version) -#define X509_REQ_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_sign) -#define X509_REQ_sign_ctx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_sign_ctx) -#define X509_REQ_to_X509 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_to_X509) -#define X509_REQ_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_verify) -#define X509_REVOKED_add1_ext_i2d BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_add1_ext_i2d) -#define X509_REVOKED_add_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_add_ext) -#define X509_REVOKED_delete_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_delete_ext) -#define X509_REVOKED_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_dup) -#define X509_REVOKED_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_free) -#define X509_REVOKED_get0_revocationDate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_get0_revocationDate) -#define X509_REVOKED_get0_serialNumber BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_get0_serialNumber) -#define X509_REVOKED_get_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_get_ext) -#define X509_REVOKED_get_ext_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_get_ext_by_NID) -#define X509_REVOKED_get_ext_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_get_ext_by_OBJ) -#define X509_REVOKED_get_ext_by_critical BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_get_ext_by_critical) -#define X509_REVOKED_get_ext_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_get_ext_count) -#define X509_REVOKED_get_ext_d2i BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_get_ext_d2i) -#define X509_REVOKED_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_it) -#define X509_REVOKED_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_new) -#define X509_REVOKED_set_revocationDate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_set_revocationDate) -#define X509_REVOKED_set_serialNumber BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_set_serialNumber) -#define X509_SIG_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_SIG_free) -#define X509_SIG_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_SIG_it) -#define X509_SIG_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_SIG_new) -#define X509_STORE_CTX_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_cleanup) -#define X509_STORE_CTX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_free) -#define X509_STORE_CTX_get0_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get0_cert) -#define X509_STORE_CTX_get0_current_crl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get0_current_crl) -#define X509_STORE_CTX_get0_current_issuer BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get0_current_issuer) -#define X509_STORE_CTX_get0_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get0_param) -#define X509_STORE_CTX_get0_parent_ctx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get0_parent_ctx) -#define X509_STORE_CTX_get0_policy_tree BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get0_policy_tree) -#define X509_STORE_CTX_get0_store BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get0_store) -#define X509_STORE_CTX_get0_untrusted BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get0_untrusted) -#define X509_STORE_CTX_get1_chain BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get1_chain) -#define X509_STORE_CTX_get1_issuer BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get1_issuer) -#define X509_STORE_CTX_get_chain BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get_chain) -#define X509_STORE_CTX_get_current_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get_current_cert) -#define X509_STORE_CTX_get_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get_error) -#define X509_STORE_CTX_get_error_depth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get_error_depth) -#define X509_STORE_CTX_get_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get_ex_data) -#define X509_STORE_CTX_get_ex_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get_ex_new_index) -#define X509_STORE_CTX_get_explicit_policy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get_explicit_policy) -#define X509_STORE_CTX_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_init) -#define X509_STORE_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_new) -#define X509_STORE_CTX_purpose_inherit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_purpose_inherit) -#define X509_STORE_CTX_set0_crls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_set0_crls) -#define X509_STORE_CTX_set0_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_set0_param) -#define X509_STORE_CTX_set_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_set_cert) -#define X509_STORE_CTX_set_chain BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_set_chain) -#define X509_STORE_CTX_set_default BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_set_default) -#define X509_STORE_CTX_set_depth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_set_depth) -#define X509_STORE_CTX_set_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_set_error) -#define X509_STORE_CTX_set_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_set_ex_data) -#define X509_STORE_CTX_set_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_set_flags) -#define X509_STORE_CTX_set_purpose BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_set_purpose) -#define X509_STORE_CTX_set_time BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_set_time) -#define X509_STORE_CTX_set_trust BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_set_trust) -#define X509_STORE_CTX_set_verify_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_set_verify_cb) -#define X509_STORE_CTX_trusted_stack BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_trusted_stack) -#define X509_STORE_CTX_zero BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_zero) -#define X509_STORE_add_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_add_cert) -#define X509_STORE_add_crl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_add_crl) -#define X509_STORE_add_lookup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_add_lookup) -#define X509_STORE_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_free) -#define X509_STORE_get0_objects BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get0_objects) -#define X509_STORE_get0_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get0_param) -#define X509_STORE_get1_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get1_certs) -#define X509_STORE_get1_crls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get1_crls) -#define X509_STORE_get_by_subject BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get_by_subject) -#define X509_STORE_get_cert_crl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get_cert_crl) -#define X509_STORE_get_check_crl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get_check_crl) -#define X509_STORE_get_check_issued BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get_check_issued) -#define X509_STORE_get_check_revocation BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get_check_revocation) -#define X509_STORE_get_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get_cleanup) -#define X509_STORE_get_get_crl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get_get_crl) -#define X509_STORE_get_get_issuer BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get_get_issuer) -#define X509_STORE_get_lookup_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get_lookup_certs) -#define X509_STORE_get_lookup_crls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get_lookup_crls) -#define X509_STORE_get_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get_verify) -#define X509_STORE_get_verify_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get_verify_cb) -#define X509_STORE_load_locations BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_load_locations) -#define X509_STORE_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_new) -#define X509_STORE_set0_additional_untrusted BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set0_additional_untrusted) -#define X509_STORE_set1_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set1_param) -#define X509_STORE_set_cert_crl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_cert_crl) -#define X509_STORE_set_check_crl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_check_crl) -#define X509_STORE_set_check_issued BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_check_issued) -#define X509_STORE_set_check_revocation BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_check_revocation) -#define X509_STORE_set_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_cleanup) -#define X509_STORE_set_default_paths BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_default_paths) -#define X509_STORE_set_depth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_depth) -#define X509_STORE_set_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_flags) -#define X509_STORE_set_get_crl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_get_crl) -#define X509_STORE_set_get_issuer BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_get_issuer) -#define X509_STORE_set_lookup_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_lookup_certs) -#define X509_STORE_set_lookup_crls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_lookup_crls) -#define X509_STORE_set_purpose BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_purpose) -#define X509_STORE_set_trust BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_trust) -#define X509_STORE_set_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_verify) -#define X509_STORE_set_verify_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_verify_cb) -#define X509_STORE_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_up_ref) -#define X509_TRUST_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_TRUST_add) -#define X509_TRUST_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_TRUST_cleanup) -#define X509_TRUST_get0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_TRUST_get0) -#define X509_TRUST_get0_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_TRUST_get0_name) -#define X509_TRUST_get_by_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_TRUST_get_by_id) -#define X509_TRUST_get_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_TRUST_get_count) -#define X509_TRUST_get_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_TRUST_get_flags) -#define X509_TRUST_get_trust BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_TRUST_get_trust) -#define X509_TRUST_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_TRUST_set) -#define X509_TRUST_set_default BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_TRUST_set_default) -#define X509_VAL_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VAL_free) -#define X509_VAL_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VAL_it) -#define X509_VAL_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VAL_new) -#define X509_VERIFY_PARAM_add0_policy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_add0_policy) -#define X509_VERIFY_PARAM_add0_table BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_add0_table) -#define X509_VERIFY_PARAM_add1_host BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_add1_host) -#define X509_VERIFY_PARAM_clear_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_clear_flags) -#define X509_VERIFY_PARAM_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_free) -#define X509_VERIFY_PARAM_get0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_get0) -#define X509_VERIFY_PARAM_get0_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_get0_name) -#define X509_VERIFY_PARAM_get0_peername BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_get0_peername) -#define X509_VERIFY_PARAM_get_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_get_count) -#define X509_VERIFY_PARAM_get_depth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_get_depth) -#define X509_VERIFY_PARAM_get_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_get_flags) -#define X509_VERIFY_PARAM_inherit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_inherit) -#define X509_VERIFY_PARAM_lookup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_lookup) -#define X509_VERIFY_PARAM_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_new) -#define X509_VERIFY_PARAM_set1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_set1) -#define X509_VERIFY_PARAM_set1_email BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_set1_email) -#define X509_VERIFY_PARAM_set1_host BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_set1_host) -#define X509_VERIFY_PARAM_set1_ip BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_set1_ip) -#define X509_VERIFY_PARAM_set1_ip_asc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_set1_ip_asc) -#define X509_VERIFY_PARAM_set1_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_set1_name) -#define X509_VERIFY_PARAM_set1_policies BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_set1_policies) -#define X509_VERIFY_PARAM_set_depth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_set_depth) -#define X509_VERIFY_PARAM_set_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_set_flags) -#define X509_VERIFY_PARAM_set_hostflags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_set_hostflags) -#define X509_VERIFY_PARAM_set_purpose BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_set_purpose) -#define X509_VERIFY_PARAM_set_time BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_set_time) -#define X509_VERIFY_PARAM_set_trust BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_set_trust) -#define X509_VERIFY_PARAM_table_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_table_cleanup) -#define X509_add1_ext_i2d BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_add1_ext_i2d) -#define X509_add1_reject_object BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_add1_reject_object) -#define X509_add1_trust_object BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_add1_trust_object) -#define X509_add_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_add_ext) -#define X509_alias_get0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_alias_get0) -#define X509_alias_set1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_alias_set1) -#define X509_chain_check_suiteb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_chain_check_suiteb) -#define X509_chain_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_chain_up_ref) -#define X509_check_akid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_check_akid) -#define X509_check_ca BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_check_ca) -#define X509_check_email BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_check_email) -#define X509_check_host BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_check_host) -#define X509_check_ip BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_check_ip) -#define X509_check_ip_asc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_check_ip_asc) -#define X509_check_issued BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_check_issued) -#define X509_check_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_check_private_key) -#define X509_check_purpose BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_check_purpose) -#define X509_check_trust BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_check_trust) -#define X509_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_cmp) -#define X509_cmp_current_time BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_cmp_current_time) -#define X509_cmp_time BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_cmp_time) -#define X509_delete_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_delete_ext) -#define X509_digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_digest) -#define X509_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_dup) -#define X509_email_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_email_free) -#define X509_find_by_issuer_and_serial BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_find_by_issuer_and_serial) -#define X509_find_by_subject BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_find_by_subject) -#define X509_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_free) -#define X509_get0_extensions BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get0_extensions) -#define X509_get0_notAfter BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get0_notAfter) -#define X509_get0_notBefore BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get0_notBefore) -#define X509_get0_pubkey_bitstr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get0_pubkey_bitstr) -#define X509_get0_signature BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get0_signature) -#define X509_get0_tbs_sigalg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get0_tbs_sigalg) -#define X509_get1_email BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get1_email) -#define X509_get1_ocsp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get1_ocsp) -#define X509_get_default_cert_area BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_default_cert_area) -#define X509_get_default_cert_dir BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_default_cert_dir) -#define X509_get_default_cert_dir_env BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_default_cert_dir_env) -#define X509_get_default_cert_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_default_cert_file) -#define X509_get_default_cert_file_env BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_default_cert_file_env) -#define X509_get_default_private_dir BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_default_private_dir) -#define X509_get_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_ex_data) -#define X509_get_ex_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_ex_new_index) -#define X509_get_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_ext) -#define X509_get_ext_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_ext_by_NID) -#define X509_get_ext_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_ext_by_OBJ) -#define X509_get_ext_by_critical BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_ext_by_critical) -#define X509_get_ext_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_ext_count) -#define X509_get_ext_d2i BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_ext_d2i) -#define X509_get_extended_key_usage BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_extended_key_usage) -#define X509_get_extension_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_extension_flags) -#define X509_get_issuer_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_issuer_name) -#define X509_get_key_usage BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_key_usage) -#define X509_get_pubkey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_pubkey) -#define X509_get_serialNumber BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_serialNumber) -#define X509_get_signature_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_signature_nid) -#define X509_get_subject_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_subject_name) -#define X509_gmtime_adj BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_gmtime_adj) -#define X509_issuer_and_serial_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_issuer_and_serial_cmp) -#define X509_issuer_and_serial_hash BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_issuer_and_serial_hash) -#define X509_issuer_name_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_issuer_name_cmp) -#define X509_issuer_name_hash BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_issuer_name_hash) -#define X509_issuer_name_hash_old BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_issuer_name_hash_old) -#define X509_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_it) -#define X509_keyid_get0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_keyid_get0) -#define X509_keyid_set1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_keyid_set1) -#define X509_load_cert_crl_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_load_cert_crl_file) -#define X509_load_cert_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_load_cert_file) -#define X509_load_crl_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_load_crl_file) -#define X509_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_new) -#define X509_ocspid_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ocspid_print) -#define X509_parse_from_buffer BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_parse_from_buffer) -#define X509_policy_check BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_policy_check) -#define X509_policy_level_get0_node BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_policy_level_get0_node) -#define X509_policy_level_node_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_policy_level_node_count) -#define X509_policy_node_get0_parent BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_policy_node_get0_parent) -#define X509_policy_node_get0_policy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_policy_node_get0_policy) -#define X509_policy_node_get0_qualifiers BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_policy_node_get0_qualifiers) -#define X509_policy_tree_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_policy_tree_free) -#define X509_policy_tree_get0_level BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_policy_tree_get0_level) -#define X509_policy_tree_get0_policies BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_policy_tree_get0_policies) -#define X509_policy_tree_get0_user_policies BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_policy_tree_get0_user_policies) -#define X509_policy_tree_level_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_policy_tree_level_count) -#define X509_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_print) -#define X509_print_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_print_ex) -#define X509_print_ex_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_print_ex_fp) -#define X509_print_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_print_fp) -#define X509_pubkey_digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_pubkey_digest) -#define X509_reject_clear BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_reject_clear) -#define X509_set_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_set_ex_data) -#define X509_set_issuer_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_set_issuer_name) -#define X509_set_notAfter BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_set_notAfter) -#define X509_set_notBefore BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_set_notBefore) -#define X509_set_pubkey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_set_pubkey) -#define X509_set_serialNumber BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_set_serialNumber) -#define X509_set_subject_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_set_subject_name) -#define X509_set_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_set_version) -#define X509_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_sign) -#define X509_sign_ctx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_sign_ctx) -#define X509_signature_dump BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_signature_dump) -#define X509_signature_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_signature_print) -#define X509_subject_name_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_subject_name_cmp) -#define X509_subject_name_hash BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_subject_name_hash) -#define X509_subject_name_hash_old BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_subject_name_hash_old) -#define X509_supported_extension BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_supported_extension) -#define X509_time_adj BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_time_adj) -#define X509_time_adj_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_time_adj_ex) -#define X509_to_X509_REQ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_to_X509_REQ) -#define X509_trust_clear BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_trust_clear) -#define X509_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_up_ref) -#define X509_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_verify) -#define X509_verify_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_verify_cert) -#define X509_verify_cert_error_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_verify_cert_error_string) -#define X509at_add1_attr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509at_add1_attr) -#define X509at_add1_attr_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509at_add1_attr_by_NID) -#define X509at_add1_attr_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509at_add1_attr_by_OBJ) -#define X509at_add1_attr_by_txt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509at_add1_attr_by_txt) -#define X509at_delete_attr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509at_delete_attr) -#define X509at_get0_data_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509at_get0_data_by_OBJ) -#define X509at_get_attr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509at_get_attr) -#define X509at_get_attr_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509at_get_attr_by_NID) -#define X509at_get_attr_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509at_get_attr_by_OBJ) -#define X509at_get_attr_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509at_get_attr_count) -#define X509v3_add_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509v3_add_ext) -#define X509v3_delete_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509v3_delete_ext) -#define X509v3_get_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509v3_get_ext) -#define X509v3_get_ext_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509v3_get_ext_by_NID) -#define X509v3_get_ext_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509v3_get_ext_by_OBJ) -#define X509v3_get_ext_by_critical BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509v3_get_ext_by_critical) -#define X509v3_get_ext_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509v3_get_ext_count) -#define a2i_GENERAL_NAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, a2i_GENERAL_NAME) -#define a2i_IPADDRESS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, a2i_IPADDRESS) -#define a2i_IPADDRESS_NC BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, a2i_IPADDRESS_NC) -#define a2i_ipadd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, a2i_ipadd) -#define abi_test_bad_unwind_temporary BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_bad_unwind_temporary) -#define abi_test_bad_unwind_wrong_register BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_bad_unwind_wrong_register) -#define abi_test_clobber_r10 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_r10) -#define abi_test_clobber_r11 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_r11) -#define abi_test_clobber_r12 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_r12) -#define abi_test_clobber_r13 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_r13) -#define abi_test_clobber_r14 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_r14) -#define abi_test_clobber_r15 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_r15) -#define abi_test_clobber_r8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_r8) -#define abi_test_clobber_r9 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_r9) -#define abi_test_clobber_rax BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_rax) -#define abi_test_clobber_rbp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_rbp) -#define abi_test_clobber_rbx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_rbx) -#define abi_test_clobber_rcx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_rcx) -#define abi_test_clobber_rdi BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_rdi) -#define abi_test_clobber_rdx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_rdx) -#define abi_test_clobber_rsi BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_rsi) -#define abi_test_clobber_xmm0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm0) -#define abi_test_clobber_xmm1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm1) -#define abi_test_clobber_xmm10 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm10) -#define abi_test_clobber_xmm11 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm11) -#define abi_test_clobber_xmm12 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm12) -#define abi_test_clobber_xmm13 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm13) -#define abi_test_clobber_xmm14 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm14) -#define abi_test_clobber_xmm15 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm15) -#define abi_test_clobber_xmm2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm2) -#define abi_test_clobber_xmm3 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm3) -#define abi_test_clobber_xmm4 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm4) -#define abi_test_clobber_xmm5 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm5) -#define abi_test_clobber_xmm6 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm6) -#define abi_test_clobber_xmm7 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm7) -#define abi_test_clobber_xmm8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm8) -#define abi_test_clobber_xmm9 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm9) -#define abi_test_get_and_clear_direction_flag BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_get_and_clear_direction_flag) -#define abi_test_set_direction_flag BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_set_direction_flag) -#define abi_test_trampoline BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_trampoline) -#define abi_test_unwind_return BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_unwind_return) -#define abi_test_unwind_start BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_unwind_start) -#define abi_test_unwind_stop BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_unwind_stop) -#define aes128gcmsiv_aes_ks BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes128gcmsiv_aes_ks) -#define aes128gcmsiv_aes_ks_enc_x1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes128gcmsiv_aes_ks_enc_x1) -#define aes128gcmsiv_dec BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes128gcmsiv_dec) -#define aes128gcmsiv_ecb_enc_block BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes128gcmsiv_ecb_enc_block) -#define aes128gcmsiv_enc_msg_x4 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes128gcmsiv_enc_msg_x4) -#define aes128gcmsiv_enc_msg_x8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes128gcmsiv_enc_msg_x8) -#define aes128gcmsiv_kdf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes128gcmsiv_kdf) -#define aes256gcmsiv_aes_ks BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes256gcmsiv_aes_ks) -#define aes256gcmsiv_aes_ks_enc_x1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes256gcmsiv_aes_ks_enc_x1) -#define aes256gcmsiv_dec BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes256gcmsiv_dec) -#define aes256gcmsiv_ecb_enc_block BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes256gcmsiv_ecb_enc_block) -#define aes256gcmsiv_enc_msg_x4 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes256gcmsiv_enc_msg_x4) -#define aes256gcmsiv_enc_msg_x8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes256gcmsiv_enc_msg_x8) -#define aes256gcmsiv_kdf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes256gcmsiv_kdf) -#define aes_ctr_set_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_ctr_set_key) -#define aes_hw_cbc_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_hw_cbc_encrypt) -#define aes_hw_ctr32_encrypt_blocks BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_hw_ctr32_encrypt_blocks) -#define aes_hw_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_hw_decrypt) -#define aes_hw_ecb_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_hw_ecb_encrypt) -#define aes_hw_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_hw_encrypt) -#define aes_hw_set_decrypt_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_hw_set_decrypt_key) -#define aes_hw_set_encrypt_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_hw_set_encrypt_key) -#define aes_nohw_cbc_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_nohw_cbc_encrypt) -#define aes_nohw_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_nohw_decrypt) -#define aes_nohw_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_nohw_encrypt) -#define aes_nohw_set_decrypt_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_nohw_set_decrypt_key) -#define aes_nohw_set_encrypt_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_nohw_set_encrypt_key) -#define aesgcmsiv_htable6_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aesgcmsiv_htable6_init) -#define aesgcmsiv_htable_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aesgcmsiv_htable_init) -#define aesgcmsiv_htable_polyval BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aesgcmsiv_htable_polyval) -#define aesgcmsiv_polyval_horner BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aesgcmsiv_polyval_horner) -#define aesni_gcm_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aesni_gcm_decrypt) -#define aesni_gcm_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aesni_gcm_encrypt) -#define asn1_do_adb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_do_adb) -#define asn1_enc_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_enc_free) -#define asn1_enc_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_enc_init) -#define asn1_enc_restore BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_enc_restore) -#define asn1_enc_save BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_enc_save) -#define asn1_ex_c2i BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_ex_c2i) -#define asn1_ex_i2c BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_ex_i2c) -#define asn1_generalizedtime_to_tm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_generalizedtime_to_tm) -#define asn1_get_choice_selector BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_get_choice_selector) -#define asn1_get_field_ptr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_get_field_ptr) -#define asn1_item_combine_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_item_combine_free) -#define asn1_refcount_dec_and_test_zero BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_refcount_dec_and_test_zero) -#define asn1_refcount_set_one BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_refcount_set_one) -#define asn1_set_choice_selector BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_set_choice_selector) -#define asn1_utctime_to_tm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_utctime_to_tm) -#define beeu_mod_inverse_vartime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, beeu_mod_inverse_vartime) -#define bio_clear_socket_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bio_clear_socket_error) -#define bio_fd_should_retry BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bio_fd_should_retry) -#define bio_ip_and_port_to_socket_and_addr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bio_ip_and_port_to_socket_and_addr) -#define bio_sock_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bio_sock_error) -#define bio_socket_nbio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bio_socket_nbio) -#define bn_abs_sub_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_abs_sub_consttime) -#define bn_add_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_add_words) -#define bn_copy_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_copy_words) -#define bn_div_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_div_consttime) -#define bn_expand BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_expand) -#define bn_fits_in_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_fits_in_words) -#define bn_from_montgomery BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_from_montgomery) -#define bn_from_montgomery_small BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_from_montgomery_small) -#define bn_gather5 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_gather5) -#define bn_in_range_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_in_range_words) -#define bn_is_bit_set_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_is_bit_set_words) -#define bn_is_relatively_prime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_is_relatively_prime) -#define bn_jacobi BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_jacobi) -#define bn_lcm_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_lcm_consttime) -#define bn_less_than_montgomery_R BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_less_than_montgomery_R) -#define bn_less_than_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_less_than_words) -#define bn_miller_rabin_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_miller_rabin_init) -#define bn_miller_rabin_iteration BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_miller_rabin_iteration) -#define bn_minimal_width BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_minimal_width) -#define bn_mod_add_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mod_add_consttime) -#define bn_mod_add_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mod_add_words) -#define bn_mod_exp_base_2_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mod_exp_base_2_consttime) -#define bn_mod_exp_mont_small BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mod_exp_mont_small) -#define bn_mod_inverse_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mod_inverse_consttime) -#define bn_mod_inverse_prime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mod_inverse_prime) -#define bn_mod_inverse_prime_mont_small BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mod_inverse_prime_mont_small) -#define bn_mod_inverse_secret_prime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mod_inverse_secret_prime) -#define bn_mod_lshift1_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mod_lshift1_consttime) -#define bn_mod_lshift_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mod_lshift_consttime) -#define bn_mod_mul_montgomery_small BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mod_mul_montgomery_small) -#define bn_mod_sub_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mod_sub_consttime) -#define bn_mod_sub_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mod_sub_words) -#define bn_mod_u16_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mod_u16_consttime) -#define bn_mont_n0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mont_n0) -#define bn_mul_add_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mul_add_words) -#define bn_mul_comba4 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mul_comba4) -#define bn_mul_comba8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mul_comba8) -#define bn_mul_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mul_consttime) -#define bn_mul_mont BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mul_mont) -#define bn_mul_mont_gather5 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mul_mont_gather5) -#define bn_mul_small BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mul_small) -#define bn_mul_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mul_words) -#define bn_odd_number_is_obviously_composite BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_odd_number_is_obviously_composite) -#define bn_one_to_montgomery BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_one_to_montgomery) -#define bn_power5 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_power5) -#define bn_rand_range_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_rand_range_words) -#define bn_rand_secret_range BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_rand_secret_range) -#define bn_reduce_once BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_reduce_once) -#define bn_reduce_once_in_place BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_reduce_once_in_place) -#define bn_resize_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_resize_words) -#define bn_rshift1_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_rshift1_words) -#define bn_rshift_secret_shift BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_rshift_secret_shift) -#define bn_rshift_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_rshift_words) -#define bn_scatter5 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_scatter5) -#define bn_select_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_select_words) -#define bn_set_minimal_width BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_set_minimal_width) -#define bn_set_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_set_words) -#define bn_sqr8x_internal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_sqr8x_internal) -#define bn_sqr_comba4 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_sqr_comba4) -#define bn_sqr_comba8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_sqr_comba8) -#define bn_sqr_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_sqr_consttime) -#define bn_sqr_small BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_sqr_small) -#define bn_sqr_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_sqr_words) -#define bn_sqrx8x_internal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_sqrx8x_internal) -#define bn_sub_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_sub_words) -#define bn_to_montgomery_small BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_to_montgomery_small) -#define bn_uadd_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_uadd_consttime) -#define bn_usub_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_usub_consttime) -#define bn_wexpand BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_wexpand) -#define boringssl_fips_self_test BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, boringssl_fips_self_test) -#define c2i_ASN1_BIT_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, c2i_ASN1_BIT_STRING) -#define c2i_ASN1_INTEGER BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, c2i_ASN1_INTEGER) -#define c2i_ASN1_OBJECT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, c2i_ASN1_OBJECT) -#define cbb_add_latin1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, cbb_add_latin1) -#define cbb_add_ucs2_be BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, cbb_add_ucs2_be) -#define cbb_add_utf32_be BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, cbb_add_utf32_be) -#define cbb_add_utf8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, cbb_add_utf8) -#define cbb_get_utf8_len BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, cbb_get_utf8_len) -#define cbs_get_latin1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, cbs_get_latin1) -#define cbs_get_ucs2_be BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, cbs_get_ucs2_be) -#define cbs_get_utf32_be BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, cbs_get_utf32_be) -#define cbs_get_utf8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, cbs_get_utf8) -#define chacha20_poly1305_open BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, chacha20_poly1305_open) -#define chacha20_poly1305_seal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, chacha20_poly1305_seal) -#define crypto_gcm_clmul_enabled BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, crypto_gcm_clmul_enabled) -#define d2i_ACCESS_DESCRIPTION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ACCESS_DESCRIPTION) -#define d2i_ASN1_BIT_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_BIT_STRING) -#define d2i_ASN1_BMPSTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_BMPSTRING) -#define d2i_ASN1_BOOLEAN BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_BOOLEAN) -#define d2i_ASN1_ENUMERATED BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_ENUMERATED) -#define d2i_ASN1_GENERALIZEDTIME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_GENERALIZEDTIME) -#define d2i_ASN1_GENERALSTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_GENERALSTRING) -#define d2i_ASN1_IA5STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_IA5STRING) -#define d2i_ASN1_INTEGER BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_INTEGER) -#define d2i_ASN1_NULL BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_NULL) -#define d2i_ASN1_OBJECT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_OBJECT) -#define d2i_ASN1_OCTET_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_OCTET_STRING) -#define d2i_ASN1_PRINTABLE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_PRINTABLE) -#define d2i_ASN1_PRINTABLESTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_PRINTABLESTRING) -#define d2i_ASN1_SEQUENCE_ANY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_SEQUENCE_ANY) -#define d2i_ASN1_SET_ANY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_SET_ANY) -#define d2i_ASN1_T61STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_T61STRING) -#define d2i_ASN1_TIME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_TIME) -#define d2i_ASN1_TYPE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_TYPE) -#define d2i_ASN1_UNIVERSALSTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_UNIVERSALSTRING) -#define d2i_ASN1_UTCTIME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_UTCTIME) -#define d2i_ASN1_UTF8STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_UTF8STRING) -#define d2i_ASN1_VISIBLESTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_VISIBLESTRING) -#define d2i_AUTHORITY_INFO_ACCESS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_AUTHORITY_INFO_ACCESS) -#define d2i_AUTHORITY_KEYID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_AUTHORITY_KEYID) -#define d2i_AutoPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_AutoPrivateKey) -#define d2i_BASIC_CONSTRAINTS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_BASIC_CONSTRAINTS) -#define d2i_CERTIFICATEPOLICIES BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_CERTIFICATEPOLICIES) -#define d2i_CRL_DIST_POINTS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_CRL_DIST_POINTS) -#define d2i_DHparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DHparams) -#define d2i_DHparams_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DHparams_bio) -#define d2i_DIRECTORYSTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DIRECTORYSTRING) -#define d2i_DISPLAYTEXT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DISPLAYTEXT) -#define d2i_DIST_POINT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DIST_POINT) -#define d2i_DIST_POINT_NAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DIST_POINT_NAME) -#define d2i_DSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DSAPrivateKey) -#define d2i_DSAPrivateKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DSAPrivateKey_bio) -#define d2i_DSAPrivateKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DSAPrivateKey_fp) -#define d2i_DSAPublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DSAPublicKey) -#define d2i_DSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DSA_PUBKEY) -#define d2i_DSA_PUBKEY_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DSA_PUBKEY_bio) -#define d2i_DSA_PUBKEY_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DSA_PUBKEY_fp) -#define d2i_DSA_SIG BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DSA_SIG) -#define d2i_DSAparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DSAparams) -#define d2i_ECDSA_SIG BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ECDSA_SIG) -#define d2i_ECParameters BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ECParameters) -#define d2i_ECPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ECPrivateKey) -#define d2i_ECPrivateKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ECPrivateKey_bio) -#define d2i_ECPrivateKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ECPrivateKey_fp) -#define d2i_EC_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_EC_PUBKEY) -#define d2i_EC_PUBKEY_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_EC_PUBKEY_bio) -#define d2i_EC_PUBKEY_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_EC_PUBKEY_fp) -#define d2i_EDIPARTYNAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_EDIPARTYNAME) -#define d2i_EXTENDED_KEY_USAGE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_EXTENDED_KEY_USAGE) -#define d2i_GENERAL_NAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_GENERAL_NAME) -#define d2i_GENERAL_NAMES BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_GENERAL_NAMES) -#define d2i_ISSUING_DIST_POINT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ISSUING_DIST_POINT) -#define d2i_NETSCAPE_SPKAC BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_NETSCAPE_SPKAC) -#define d2i_NETSCAPE_SPKI BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_NETSCAPE_SPKI) -#define d2i_NOTICEREF BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_NOTICEREF) -#define d2i_OTHERNAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_OTHERNAME) -#define d2i_PKCS12 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PKCS12) -#define d2i_PKCS12_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PKCS12_bio) -#define d2i_PKCS12_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PKCS12_fp) -#define d2i_PKCS7 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PKCS7) -#define d2i_PKCS7_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PKCS7_bio) -#define d2i_PKCS8PrivateKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PKCS8PrivateKey_bio) -#define d2i_PKCS8PrivateKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PKCS8PrivateKey_fp) -#define d2i_PKCS8_PRIV_KEY_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PKCS8_PRIV_KEY_INFO) -#define d2i_PKCS8_PRIV_KEY_INFO_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PKCS8_PRIV_KEY_INFO_bio) -#define d2i_PKCS8_PRIV_KEY_INFO_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PKCS8_PRIV_KEY_INFO_fp) -#define d2i_PKCS8_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PKCS8_bio) -#define d2i_PKCS8_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PKCS8_fp) -#define d2i_PKEY_USAGE_PERIOD BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PKEY_USAGE_PERIOD) -#define d2i_POLICYINFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_POLICYINFO) -#define d2i_POLICYQUALINFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_POLICYQUALINFO) -#define d2i_PROXY_CERT_INFO_EXTENSION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PROXY_CERT_INFO_EXTENSION) -#define d2i_PROXY_POLICY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PROXY_POLICY) -#define d2i_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PUBKEY) -#define d2i_PUBKEY_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PUBKEY_bio) -#define d2i_PUBKEY_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PUBKEY_fp) -#define d2i_PrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PrivateKey) -#define d2i_PrivateKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PrivateKey_bio) -#define d2i_PrivateKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PrivateKey_fp) -#define d2i_PublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PublicKey) -#define d2i_RSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_RSAPrivateKey) -#define d2i_RSAPrivateKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_RSAPrivateKey_bio) -#define d2i_RSAPrivateKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_RSAPrivateKey_fp) -#define d2i_RSAPublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_RSAPublicKey) -#define d2i_RSAPublicKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_RSAPublicKey_bio) -#define d2i_RSAPublicKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_RSAPublicKey_fp) -#define d2i_RSA_PSS_PARAMS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_RSA_PSS_PARAMS) -#define d2i_RSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_RSA_PUBKEY) -#define d2i_RSA_PUBKEY_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_RSA_PUBKEY_bio) -#define d2i_RSA_PUBKEY_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_RSA_PUBKEY_fp) -#define d2i_SXNET BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_SXNET) -#define d2i_SXNETID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_SXNETID) -#define d2i_USERNOTICE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_USERNOTICE) -#define d2i_X509 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509) -#define d2i_X509_ALGOR BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_ALGOR) -#define d2i_X509_ALGORS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_ALGORS) -#define d2i_X509_ATTRIBUTE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_ATTRIBUTE) -#define d2i_X509_AUX BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_AUX) -#define d2i_X509_CERT_AUX BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_CERT_AUX) -#define d2i_X509_CINF BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_CINF) -#define d2i_X509_CRL BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_CRL) -#define d2i_X509_CRL_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_CRL_INFO) -#define d2i_X509_CRL_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_CRL_bio) -#define d2i_X509_CRL_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_CRL_fp) -#define d2i_X509_EXTENSION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_EXTENSION) -#define d2i_X509_EXTENSIONS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_EXTENSIONS) -#define d2i_X509_NAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_NAME) -#define d2i_X509_NAME_ENTRY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_NAME_ENTRY) -#define d2i_X509_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_PUBKEY) -#define d2i_X509_REQ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_REQ) -#define d2i_X509_REQ_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_REQ_INFO) -#define d2i_X509_REQ_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_REQ_bio) -#define d2i_X509_REQ_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_REQ_fp) -#define d2i_X509_REVOKED BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_REVOKED) -#define d2i_X509_SIG BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_SIG) -#define d2i_X509_VAL BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_VAL) -#define d2i_X509_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_bio) -#define d2i_X509_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_fp) -#define dsa_asn1_meth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, dsa_asn1_meth) -#define ec_GFp_mont_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_mont_add) -#define ec_GFp_mont_bignum_to_felem BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_mont_bignum_to_felem) -#define ec_GFp_mont_dbl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_mont_dbl) -#define ec_GFp_mont_felem_mul BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_mont_felem_mul) -#define ec_GFp_mont_felem_sqr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_mont_felem_sqr) -#define ec_GFp_mont_felem_to_bignum BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_mont_felem_to_bignum) -#define ec_GFp_mont_group_finish BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_mont_group_finish) -#define ec_GFp_mont_group_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_mont_group_init) -#define ec_GFp_mont_group_set_curve BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_mont_group_set_curve) -#define ec_GFp_mont_mul BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_mont_mul) -#define ec_GFp_mont_mul_base BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_mont_mul_base) -#define ec_GFp_mont_mul_public BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_mont_mul_public) -#define ec_GFp_nistp_recode_scalar_bits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_nistp_recode_scalar_bits) -#define ec_GFp_simple_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_simple_cmp) -#define ec_GFp_simple_cmp_x_coordinate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_simple_cmp_x_coordinate) -#define ec_GFp_simple_group_finish BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_simple_group_finish) -#define ec_GFp_simple_group_get_curve BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_simple_group_get_curve) -#define ec_GFp_simple_group_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_simple_group_init) -#define ec_GFp_simple_group_set_curve BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_simple_group_set_curve) -#define ec_GFp_simple_invert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_simple_invert) -#define ec_GFp_simple_is_at_infinity BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_simple_is_at_infinity) -#define ec_GFp_simple_is_on_curve BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_simple_is_on_curve) -#define ec_GFp_simple_mont_inv_mod_ord_vartime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_simple_mont_inv_mod_ord_vartime) -#define ec_GFp_simple_point_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_simple_point_copy) -#define ec_GFp_simple_point_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_simple_point_init) -#define ec_GFp_simple_point_set_affine_coordinates BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_simple_point_set_affine_coordinates) -#define ec_GFp_simple_point_set_to_infinity BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_simple_point_set_to_infinity) -#define ec_asn1_meth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_asn1_meth) -#define ec_bignum_to_felem BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_bignum_to_felem) -#define ec_bignum_to_scalar BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_bignum_to_scalar) -#define ec_cmp_x_coordinate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_cmp_x_coordinate) -#define ec_compute_wNAF BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_compute_wNAF) -#define ec_felem_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_felem_add) -#define ec_felem_equal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_felem_equal) -#define ec_felem_neg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_felem_neg) -#define ec_felem_non_zero_mask BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_felem_non_zero_mask) -#define ec_felem_select BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_felem_select) -#define ec_felem_sub BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_felem_sub) -#define ec_felem_to_bignum BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_felem_to_bignum) -#define ec_get_x_coordinate_as_scalar BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_get_x_coordinate_as_scalar) -#define ec_group_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_group_new) -#define ec_pkey_meth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_pkey_meth) -#define ec_point_get_affine_coordinate_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_point_get_affine_coordinate_bytes) -#define ec_point_mul_scalar BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_point_mul_scalar) -#define ec_point_mul_scalar_base BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_point_mul_scalar_base) -#define ec_point_mul_scalar_public BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_point_mul_scalar_public) -#define ec_random_nonzero_scalar BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_random_nonzero_scalar) -#define ec_scalar_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_scalar_add) -#define ec_scalar_equal_vartime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_scalar_equal_vartime) -#define ec_scalar_from_montgomery BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_scalar_from_montgomery) -#define ec_scalar_inv_montgomery BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_scalar_inv_montgomery) -#define ec_scalar_inv_montgomery_vartime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_scalar_inv_montgomery_vartime) -#define ec_scalar_is_zero BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_scalar_is_zero) -#define ec_scalar_mul_montgomery BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_scalar_mul_montgomery) -#define ec_scalar_to_montgomery BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_scalar_to_montgomery) -#define ec_simple_scalar_inv_montgomery BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_simple_scalar_inv_montgomery) -#define ecp_nistz256_avx2_select_w7 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ecp_nistz256_avx2_select_w7) -#define ecp_nistz256_mul_mont BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ecp_nistz256_mul_mont) -#define ecp_nistz256_neg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ecp_nistz256_neg) -#define ecp_nistz256_ord_mul_mont BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ecp_nistz256_ord_mul_mont) -#define ecp_nistz256_ord_sqr_mont BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ecp_nistz256_ord_sqr_mont) -#define ecp_nistz256_point_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ecp_nistz256_point_add) -#define ecp_nistz256_point_add_affine BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ecp_nistz256_point_add_affine) -#define ecp_nistz256_point_double BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ecp_nistz256_point_double) -#define ecp_nistz256_select_w5 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ecp_nistz256_select_w5) -#define ecp_nistz256_select_w7 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ecp_nistz256_select_w7) -#define ecp_nistz256_sqr_mont BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ecp_nistz256_sqr_mont) -#define ed25519_asn1_meth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ed25519_asn1_meth) -#define ed25519_pkey_meth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ed25519_pkey_meth) -#define gcm_ghash_4bit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, gcm_ghash_4bit) -#define gcm_ghash_avx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, gcm_ghash_avx) -#define gcm_ghash_clmul BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, gcm_ghash_clmul) -#define gcm_ghash_ssse3 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, gcm_ghash_ssse3) -#define gcm_gmult_4bit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, gcm_gmult_4bit) -#define gcm_gmult_avx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, gcm_gmult_avx) -#define gcm_gmult_clmul BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, gcm_gmult_clmul) -#define gcm_gmult_ssse3 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, gcm_gmult_ssse3) -#define gcm_init_4bit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, gcm_init_4bit) -#define gcm_init_avx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, gcm_init_avx) -#define gcm_init_clmul BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, gcm_init_clmul) -#define gcm_init_ssse3 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, gcm_init_ssse3) -#define i2a_ACCESS_DESCRIPTION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2a_ACCESS_DESCRIPTION) -#define i2a_ASN1_ENUMERATED BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2a_ASN1_ENUMERATED) -#define i2a_ASN1_INTEGER BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2a_ASN1_INTEGER) -#define i2a_ASN1_OBJECT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2a_ASN1_OBJECT) -#define i2a_ASN1_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2a_ASN1_STRING) -#define i2c_ASN1_BIT_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2c_ASN1_BIT_STRING) -#define i2c_ASN1_INTEGER BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2c_ASN1_INTEGER) -#define i2d_ACCESS_DESCRIPTION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ACCESS_DESCRIPTION) -#define i2d_ASN1_BIT_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_BIT_STRING) -#define i2d_ASN1_BMPSTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_BMPSTRING) -#define i2d_ASN1_BOOLEAN BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_BOOLEAN) -#define i2d_ASN1_ENUMERATED BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_ENUMERATED) -#define i2d_ASN1_GENERALIZEDTIME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_GENERALIZEDTIME) -#define i2d_ASN1_GENERALSTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_GENERALSTRING) -#define i2d_ASN1_IA5STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_IA5STRING) -#define i2d_ASN1_INTEGER BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_INTEGER) -#define i2d_ASN1_NULL BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_NULL) -#define i2d_ASN1_OBJECT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_OBJECT) -#define i2d_ASN1_OCTET_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_OCTET_STRING) -#define i2d_ASN1_PRINTABLE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_PRINTABLE) -#define i2d_ASN1_PRINTABLESTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_PRINTABLESTRING) -#define i2d_ASN1_SEQUENCE_ANY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_SEQUENCE_ANY) -#define i2d_ASN1_SET_ANY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_SET_ANY) -#define i2d_ASN1_T61STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_T61STRING) -#define i2d_ASN1_TIME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_TIME) -#define i2d_ASN1_TYPE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_TYPE) -#define i2d_ASN1_UNIVERSALSTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_UNIVERSALSTRING) -#define i2d_ASN1_UTCTIME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_UTCTIME) -#define i2d_ASN1_UTF8STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_UTF8STRING) -#define i2d_ASN1_VISIBLESTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_VISIBLESTRING) -#define i2d_AUTHORITY_INFO_ACCESS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_AUTHORITY_INFO_ACCESS) -#define i2d_AUTHORITY_KEYID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_AUTHORITY_KEYID) -#define i2d_BASIC_CONSTRAINTS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_BASIC_CONSTRAINTS) -#define i2d_CERTIFICATEPOLICIES BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_CERTIFICATEPOLICIES) -#define i2d_CRL_DIST_POINTS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_CRL_DIST_POINTS) -#define i2d_DHparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DHparams) -#define i2d_DHparams_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DHparams_bio) -#define i2d_DIRECTORYSTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DIRECTORYSTRING) -#define i2d_DISPLAYTEXT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DISPLAYTEXT) -#define i2d_DIST_POINT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DIST_POINT) -#define i2d_DIST_POINT_NAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DIST_POINT_NAME) -#define i2d_DSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DSAPrivateKey) -#define i2d_DSAPrivateKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DSAPrivateKey_bio) -#define i2d_DSAPrivateKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DSAPrivateKey_fp) -#define i2d_DSAPublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DSAPublicKey) -#define i2d_DSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DSA_PUBKEY) -#define i2d_DSA_PUBKEY_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DSA_PUBKEY_bio) -#define i2d_DSA_PUBKEY_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DSA_PUBKEY_fp) -#define i2d_DSA_SIG BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DSA_SIG) -#define i2d_DSAparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DSAparams) -#define i2d_ECDSA_SIG BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ECDSA_SIG) -#define i2d_ECParameters BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ECParameters) -#define i2d_ECPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ECPrivateKey) -#define i2d_ECPrivateKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ECPrivateKey_bio) -#define i2d_ECPrivateKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ECPrivateKey_fp) -#define i2d_EC_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_EC_PUBKEY) -#define i2d_EC_PUBKEY_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_EC_PUBKEY_bio) -#define i2d_EC_PUBKEY_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_EC_PUBKEY_fp) -#define i2d_EDIPARTYNAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_EDIPARTYNAME) -#define i2d_EXTENDED_KEY_USAGE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_EXTENDED_KEY_USAGE) -#define i2d_GENERAL_NAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_GENERAL_NAME) -#define i2d_GENERAL_NAMES BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_GENERAL_NAMES) -#define i2d_ISSUING_DIST_POINT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ISSUING_DIST_POINT) -#define i2d_NETSCAPE_SPKAC BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_NETSCAPE_SPKAC) -#define i2d_NETSCAPE_SPKI BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_NETSCAPE_SPKI) -#define i2d_NOTICEREF BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_NOTICEREF) -#define i2d_OTHERNAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_OTHERNAME) -#define i2d_PKCS12 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS12) -#define i2d_PKCS12_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS12_bio) -#define i2d_PKCS12_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS12_fp) -#define i2d_PKCS7 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS7) -#define i2d_PKCS7_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS7_bio) -#define i2d_PKCS8PrivateKeyInfo_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS8PrivateKeyInfo_bio) -#define i2d_PKCS8PrivateKeyInfo_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS8PrivateKeyInfo_fp) -#define i2d_PKCS8PrivateKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS8PrivateKey_bio) -#define i2d_PKCS8PrivateKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS8PrivateKey_fp) -#define i2d_PKCS8PrivateKey_nid_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS8PrivateKey_nid_bio) -#define i2d_PKCS8PrivateKey_nid_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS8PrivateKey_nid_fp) -#define i2d_PKCS8_PRIV_KEY_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS8_PRIV_KEY_INFO) -#define i2d_PKCS8_PRIV_KEY_INFO_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS8_PRIV_KEY_INFO_bio) -#define i2d_PKCS8_PRIV_KEY_INFO_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS8_PRIV_KEY_INFO_fp) -#define i2d_PKCS8_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS8_bio) -#define i2d_PKCS8_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS8_fp) -#define i2d_PKEY_USAGE_PERIOD BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKEY_USAGE_PERIOD) -#define i2d_POLICYINFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_POLICYINFO) -#define i2d_POLICYQUALINFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_POLICYQUALINFO) -#define i2d_PROXY_CERT_INFO_EXTENSION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PROXY_CERT_INFO_EXTENSION) -#define i2d_PROXY_POLICY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PROXY_POLICY) -#define i2d_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PUBKEY) -#define i2d_PUBKEY_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PUBKEY_bio) -#define i2d_PUBKEY_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PUBKEY_fp) -#define i2d_PrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PrivateKey) -#define i2d_PrivateKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PrivateKey_bio) -#define i2d_PrivateKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PrivateKey_fp) -#define i2d_PublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PublicKey) -#define i2d_RSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_RSAPrivateKey) -#define i2d_RSAPrivateKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_RSAPrivateKey_bio) -#define i2d_RSAPrivateKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_RSAPrivateKey_fp) -#define i2d_RSAPublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_RSAPublicKey) -#define i2d_RSAPublicKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_RSAPublicKey_bio) -#define i2d_RSAPublicKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_RSAPublicKey_fp) -#define i2d_RSA_PSS_PARAMS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_RSA_PSS_PARAMS) -#define i2d_RSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_RSA_PUBKEY) -#define i2d_RSA_PUBKEY_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_RSA_PUBKEY_bio) -#define i2d_RSA_PUBKEY_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_RSA_PUBKEY_fp) -#define i2d_SXNET BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_SXNET) -#define i2d_SXNETID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_SXNETID) -#define i2d_USERNOTICE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_USERNOTICE) -#define i2d_X509 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509) -#define i2d_X509_ALGOR BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_ALGOR) -#define i2d_X509_ALGORS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_ALGORS) -#define i2d_X509_ATTRIBUTE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_ATTRIBUTE) -#define i2d_X509_AUX BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_AUX) -#define i2d_X509_CERT_AUX BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_CERT_AUX) -#define i2d_X509_CINF BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_CINF) -#define i2d_X509_CRL BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_CRL) -#define i2d_X509_CRL_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_CRL_INFO) -#define i2d_X509_CRL_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_CRL_bio) -#define i2d_X509_CRL_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_CRL_fp) -#define i2d_X509_EXTENSION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_EXTENSION) -#define i2d_X509_EXTENSIONS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_EXTENSIONS) -#define i2d_X509_NAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_NAME) -#define i2d_X509_NAME_ENTRY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_NAME_ENTRY) -#define i2d_X509_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_PUBKEY) -#define i2d_X509_REQ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_REQ) -#define i2d_X509_REQ_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_REQ_INFO) -#define i2d_X509_REQ_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_REQ_bio) -#define i2d_X509_REQ_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_REQ_fp) -#define i2d_X509_REVOKED BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_REVOKED) -#define i2d_X509_SIG BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_SIG) -#define i2d_X509_VAL BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_VAL) -#define i2d_X509_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_bio) -#define i2d_X509_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_fp) -#define i2d_re_X509_CRL_tbs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_re_X509_CRL_tbs) -#define i2d_re_X509_REQ_tbs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_re_X509_REQ_tbs) -#define i2d_re_X509_tbs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_re_X509_tbs) -#define i2o_ECPublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2o_ECPublicKey) -#define i2s_ASN1_ENUMERATED BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2s_ASN1_ENUMERATED) -#define i2s_ASN1_ENUMERATED_TABLE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2s_ASN1_ENUMERATED_TABLE) -#define i2s_ASN1_INTEGER BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2s_ASN1_INTEGER) -#define i2s_ASN1_OCTET_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2s_ASN1_OCTET_STRING) -#define i2t_ASN1_OBJECT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2t_ASN1_OBJECT) -#define i2v_ASN1_BIT_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2v_ASN1_BIT_STRING) -#define i2v_GENERAL_NAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2v_GENERAL_NAME) -#define i2v_GENERAL_NAMES BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2v_GENERAL_NAMES) -#define kBoringSSLRSASqrtTwo BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, kBoringSSLRSASqrtTwo) -#define kBoringSSLRSASqrtTwoLen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, kBoringSSLRSASqrtTwoLen) -#define kOpenSSLReasonStringData BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, kOpenSSLReasonStringData) -#define kOpenSSLReasonValues BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, kOpenSSLReasonValues) -#define kOpenSSLReasonValuesLen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, kOpenSSLReasonValuesLen) -#define level_add_node BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, level_add_node) -#define level_find_node BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, level_find_node) -#define lh_delete BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, lh_delete) -#define lh_doall_arg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, lh_doall_arg) -#define lh_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, lh_free) -#define lh_insert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, lh_insert) -#define lh_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, lh_new) -#define lh_num_items BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, lh_num_items) -#define lh_retrieve BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, lh_retrieve) -#define lh_retrieve_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, lh_retrieve_key) -#define lh_strhash BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, lh_strhash) -#define md4_block_data_order BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, md4_block_data_order) -#define md5_block_asm_data_order BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, md5_block_asm_data_order) -#define o2i_ECPublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, o2i_ECPublicKey) -#define pkcs12_iterations_acceptable BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, pkcs12_iterations_acceptable) -#define pkcs12_key_gen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, pkcs12_key_gen) -#define pkcs12_pbe_encrypt_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, pkcs12_pbe_encrypt_init) -#define pkcs7_bundle BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, pkcs7_bundle) -#define pkcs7_parse_header BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, pkcs7_parse_header) -#define pkcs8_pbe_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, pkcs8_pbe_decrypt) -#define policy_cache_find_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, policy_cache_find_data) -#define policy_cache_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, policy_cache_free) -#define policy_cache_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, policy_cache_set) -#define policy_cache_set_mapping BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, policy_cache_set_mapping) -#define policy_data_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, policy_data_free) -#define policy_data_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, policy_data_new) -#define policy_node_cmp_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, policy_node_cmp_new) -#define policy_node_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, policy_node_free) -#define policy_node_match BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, policy_node_match) -#define poly_Rq_mul BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, poly_Rq_mul) -#define rand_fork_unsafe_buffering_enabled BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, rand_fork_unsafe_buffering_enabled) -#define rsa_asn1_meth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, rsa_asn1_meth) -#define rsa_default_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, rsa_default_decrypt) -#define rsa_default_private_transform BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, rsa_default_private_transform) -#define rsa_default_sign_raw BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, rsa_default_sign_raw) -#define rsa_default_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, rsa_default_size) -#define rsa_pkey_meth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, rsa_pkey_meth) -#define rsaz_1024_gather5_avx2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, rsaz_1024_gather5_avx2) -#define rsaz_1024_mul_avx2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, rsaz_1024_mul_avx2) -#define rsaz_1024_norm2red_avx2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, rsaz_1024_norm2red_avx2) -#define rsaz_1024_red2norm_avx2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, rsaz_1024_red2norm_avx2) -#define rsaz_1024_scatter5_avx2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, rsaz_1024_scatter5_avx2) -#define rsaz_1024_sqr_avx2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, rsaz_1024_sqr_avx2) -#define s2i_ASN1_INTEGER BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, s2i_ASN1_INTEGER) -#define s2i_ASN1_OCTET_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, s2i_ASN1_OCTET_STRING) -#define sha1_block_data_order BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sha1_block_data_order) -#define sha256_block_data_order BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sha256_block_data_order) -#define sha512_block_data_order BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sha512_block_data_order) -#define sk_deep_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_deep_copy) -#define sk_delete BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_delete) -#define sk_delete_ptr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_delete_ptr) -#define sk_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_dup) -#define sk_find BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_find) -#define sk_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_free) -#define sk_insert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_insert) -#define sk_is_sorted BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_is_sorted) -#define sk_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_new) -#define sk_new_null BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_new_null) -#define sk_num BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_num) -#define sk_pop BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_pop) -#define sk_pop_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_pop_free) -#define sk_pop_free_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_pop_free_ex) -#define sk_push BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_push) -#define sk_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_set) -#define sk_set_cmp_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_set_cmp_func) -#define sk_shift BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_shift) -#define sk_sort BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_sort) -#define sk_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_value) -#define sk_zero BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_zero) -#define tree_find_sk BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, tree_find_sk) -#define v2i_ASN1_BIT_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v2i_ASN1_BIT_STRING) -#define v2i_GENERAL_NAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v2i_GENERAL_NAME) -#define v2i_GENERAL_NAMES BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v2i_GENERAL_NAMES) -#define v2i_GENERAL_NAME_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v2i_GENERAL_NAME_ex) -#define v3_akey_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_akey_id) -#define v3_alt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_alt) -#define v3_bcons BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_bcons) -#define v3_cpols BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_cpols) -#define v3_crl_invdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_crl_invdate) -#define v3_crl_num BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_crl_num) -#define v3_crl_reason BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_crl_reason) -#define v3_crld BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_crld) -#define v3_delta_crl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_delta_crl) -#define v3_ext_ku BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_ext_ku) -#define v3_freshest_crl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_freshest_crl) -#define v3_idp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_idp) -#define v3_info BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_info) -#define v3_inhibit_anyp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_inhibit_anyp) -#define v3_key_usage BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_key_usage) -#define v3_name_constraints BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_name_constraints) -#define v3_ns_ia5_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_ns_ia5_list) -#define v3_nscert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_nscert) -#define v3_ocsp_accresp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_ocsp_accresp) -#define v3_ocsp_nocheck BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_ocsp_nocheck) -#define v3_pci BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_pci) -#define v3_pkey_usage_period BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_pkey_usage_period) -#define v3_policy_constraints BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_policy_constraints) -#define v3_policy_mappings BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_policy_mappings) -#define v3_sinfo BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_sinfo) -#define v3_skey_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_skey_id) -#define v3_sxnet BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_sxnet) -#define vpaes_cbc_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, vpaes_cbc_encrypt) -#define vpaes_ctr32_encrypt_blocks BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, vpaes_ctr32_encrypt_blocks) -#define vpaes_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, vpaes_decrypt) -#define vpaes_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, vpaes_encrypt) -#define vpaes_set_decrypt_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, vpaes_set_decrypt_key) -#define vpaes_set_encrypt_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, vpaes_set_encrypt_key) -#define x25519_asn1_meth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x25519_asn1_meth) -#define x25519_ge_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x25519_ge_add) -#define x25519_ge_frombytes_vartime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x25519_ge_frombytes_vartime) -#define x25519_ge_p1p1_to_p2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x25519_ge_p1p1_to_p2) -#define x25519_ge_p1p1_to_p3 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x25519_ge_p1p1_to_p3) -#define x25519_ge_p3_to_cached BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x25519_ge_p3_to_cached) -#define x25519_ge_scalarmult BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x25519_ge_scalarmult) -#define x25519_ge_scalarmult_base BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x25519_ge_scalarmult_base) -#define x25519_ge_scalarmult_small_precomp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x25519_ge_scalarmult_small_precomp) -#define x25519_ge_sub BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x25519_ge_sub) -#define x25519_ge_tobytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x25519_ge_tobytes) -#define x25519_pkey_meth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x25519_pkey_meth) -#define x25519_sc_reduce BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x25519_sc_reduce) -#define x509_digest_sign_algorithm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x509_digest_sign_algorithm) -#define x509_digest_verify_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x509_digest_verify_init) -#define x509_print_rsa_pss_params BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x509_print_rsa_pss_params) -#define x509_rsa_ctx_to_pss BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x509_rsa_ctx_to_pss) -#define x509_rsa_pss_to_ctx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x509_rsa_pss_to_ctx) -#define x509v3_bytes_to_hex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x509v3_bytes_to_hex) -#define x509v3_hex_to_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x509v3_hex_to_bytes) -#define x509v3_looks_like_dns_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x509v3_looks_like_dns_name) -#define x509v3_name_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x509v3_name_cmp) diff --git a/tools/dockerfile/grpc_objc/generate_boringssl_prefix_header/output/boringssl_prefix_symbols-7f02881e96e51f1873afcf384d02f782b48967ca.h b/tools/dockerfile/grpc_objc/generate_boringssl_prefix_header/output/boringssl_prefix_symbols-7f02881e96e51f1873afcf384d02f782b48967ca.h deleted file mode 100644 index 173b2d432f8..00000000000 --- a/tools/dockerfile/grpc_objc/generate_boringssl_prefix_header/output/boringssl_prefix_symbols-7f02881e96e51f1873afcf384d02f782b48967ca.h +++ /dev/null @@ -1,3243 +0,0 @@ -// Copyright (c) 2018, Google Inc. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -// BORINGSSL_ADD_PREFIX pastes two identifiers into one. It performs one -// iteration of macro expansion on its arguments before pasting. -#define BORINGSSL_ADD_PREFIX(a, b) BORINGSSL_ADD_PREFIX_INNER(a, b) -#define BORINGSSL_ADD_PREFIX_INNER(a, b) a ## _ ## b - -#define BIO_f_ssl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_f_ssl) -#define BIO_set_ssl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_ssl) -#define DTLS_client_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DTLS_client_method) -#define DTLS_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DTLS_method) -#define DTLS_server_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DTLS_server_method) -#define DTLS_with_buffers_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DTLS_with_buffers_method) -#define DTLSv1_2_client_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DTLSv1_2_client_method) -#define DTLSv1_2_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DTLSv1_2_method) -#define DTLSv1_2_server_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DTLSv1_2_server_method) -#define DTLSv1_client_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DTLSv1_client_method) -#define DTLSv1_get_timeout BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DTLSv1_get_timeout) -#define DTLSv1_handle_timeout BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DTLSv1_handle_timeout) -#define DTLSv1_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DTLSv1_method) -#define DTLSv1_server_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DTLSv1_server_method) -#define DTLSv1_set_initial_timeout_duration BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DTLSv1_set_initial_timeout_duration) -#define ERR_load_SSL_strings BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_load_SSL_strings) -#define OPENSSL_init_ssl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_init_ssl) -#define PEM_read_SSL_SESSION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_SSL_SESSION) -#define PEM_read_bio_SSL_SESSION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_SSL_SESSION) -#define PEM_write_SSL_SESSION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_SSL_SESSION) -#define PEM_write_bio_SSL_SESSION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_SSL_SESSION) -#define SSL_CIPHER_description BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_description) -#define SSL_CIPHER_get_auth_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_get_auth_nid) -#define SSL_CIPHER_get_bits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_get_bits) -#define SSL_CIPHER_get_cipher_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_get_cipher_nid) -#define SSL_CIPHER_get_digest_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_get_digest_nid) -#define SSL_CIPHER_get_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_get_id) -#define SSL_CIPHER_get_kx_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_get_kx_name) -#define SSL_CIPHER_get_kx_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_get_kx_nid) -#define SSL_CIPHER_get_max_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_get_max_version) -#define SSL_CIPHER_get_min_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_get_min_version) -#define SSL_CIPHER_get_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_get_name) -#define SSL_CIPHER_get_prf_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_get_prf_nid) -#define SSL_CIPHER_get_rfc_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_get_rfc_name) -#define SSL_CIPHER_get_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_get_value) -#define SSL_CIPHER_get_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_get_version) -#define SSL_CIPHER_is_aead BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_is_aead) -#define SSL_CIPHER_is_block_cipher BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_is_block_cipher) -#define SSL_CIPHER_standard_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_standard_name) -#define SSL_COMP_add_compression_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_COMP_add_compression_method) -#define SSL_COMP_free_compression_methods BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_COMP_free_compression_methods) -#define SSL_COMP_get0_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_COMP_get0_name) -#define SSL_COMP_get_compression_methods BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_COMP_get_compression_methods) -#define SSL_COMP_get_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_COMP_get_id) -#define SSL_COMP_get_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_COMP_get_name) -#define SSL_CTX_add0_chain_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_add0_chain_cert) -#define SSL_CTX_add1_chain_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_add1_chain_cert) -#define SSL_CTX_add_cert_compression_alg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_add_cert_compression_alg) -#define SSL_CTX_add_client_CA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_add_client_CA) -#define SSL_CTX_add_extra_chain_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_add_extra_chain_cert) -#define SSL_CTX_add_session BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_add_session) -#define SSL_CTX_check_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_check_private_key) -#define SSL_CTX_cipher_in_group BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_cipher_in_group) -#define SSL_CTX_clear_chain_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_clear_chain_certs) -#define SSL_CTX_clear_extra_chain_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_clear_extra_chain_certs) -#define SSL_CTX_clear_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_clear_mode) -#define SSL_CTX_clear_options BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_clear_options) -#define SSL_CTX_enable_ocsp_stapling BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_enable_ocsp_stapling) -#define SSL_CTX_enable_pq_experiment_signal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_enable_pq_experiment_signal) -#define SSL_CTX_enable_signed_cert_timestamps BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_enable_signed_cert_timestamps) -#define SSL_CTX_enable_tls_channel_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_enable_tls_channel_id) -#define SSL_CTX_flush_sessions BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_flush_sessions) -#define SSL_CTX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_free) -#define SSL_CTX_get0_certificate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get0_certificate) -#define SSL_CTX_get0_chain_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get0_chain_certs) -#define SSL_CTX_get0_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get0_param) -#define SSL_CTX_get0_privatekey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get0_privatekey) -#define SSL_CTX_get_cert_store BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_cert_store) -#define SSL_CTX_get_channel_id_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_channel_id_cb) -#define SSL_CTX_get_ciphers BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_ciphers) -#define SSL_CTX_get_client_CA_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_client_CA_list) -#define SSL_CTX_get_default_passwd_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_default_passwd_cb) -#define SSL_CTX_get_default_passwd_cb_userdata BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_default_passwd_cb_userdata) -#define SSL_CTX_get_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_ex_data) -#define SSL_CTX_get_ex_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_ex_new_index) -#define SSL_CTX_get_extra_chain_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_extra_chain_certs) -#define SSL_CTX_get_info_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_info_callback) -#define SSL_CTX_get_keylog_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_keylog_callback) -#define SSL_CTX_get_max_cert_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_max_cert_list) -#define SSL_CTX_get_max_proto_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_max_proto_version) -#define SSL_CTX_get_min_proto_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_min_proto_version) -#define SSL_CTX_get_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_mode) -#define SSL_CTX_get_options BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_options) -#define SSL_CTX_get_quiet_shutdown BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_quiet_shutdown) -#define SSL_CTX_get_read_ahead BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_read_ahead) -#define SSL_CTX_get_session_cache_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_session_cache_mode) -#define SSL_CTX_get_timeout BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_timeout) -#define SSL_CTX_get_tlsext_ticket_keys BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_tlsext_ticket_keys) -#define SSL_CTX_get_verify_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_verify_callback) -#define SSL_CTX_get_verify_depth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_verify_depth) -#define SSL_CTX_get_verify_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_verify_mode) -#define SSL_CTX_load_verify_locations BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_load_verify_locations) -#define SSL_CTX_need_tmp_RSA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_need_tmp_RSA) -#define SSL_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_new) -#define SSL_CTX_remove_session BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_remove_session) -#define SSL_CTX_sess_accept BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_accept) -#define SSL_CTX_sess_accept_good BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_accept_good) -#define SSL_CTX_sess_accept_renegotiate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_accept_renegotiate) -#define SSL_CTX_sess_cache_full BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_cache_full) -#define SSL_CTX_sess_cb_hits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_cb_hits) -#define SSL_CTX_sess_connect BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_connect) -#define SSL_CTX_sess_connect_good BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_connect_good) -#define SSL_CTX_sess_connect_renegotiate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_connect_renegotiate) -#define SSL_CTX_sess_get_cache_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_get_cache_size) -#define SSL_CTX_sess_get_get_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_get_get_cb) -#define SSL_CTX_sess_get_new_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_get_new_cb) -#define SSL_CTX_sess_get_remove_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_get_remove_cb) -#define SSL_CTX_sess_hits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_hits) -#define SSL_CTX_sess_misses BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_misses) -#define SSL_CTX_sess_number BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_number) -#define SSL_CTX_sess_set_cache_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_set_cache_size) -#define SSL_CTX_sess_set_get_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_set_get_cb) -#define SSL_CTX_sess_set_new_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_set_new_cb) -#define SSL_CTX_sess_set_remove_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_set_remove_cb) -#define SSL_CTX_sess_timeouts BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_timeouts) -#define SSL_CTX_set0_buffer_pool BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set0_buffer_pool) -#define SSL_CTX_set0_chain BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set0_chain) -#define SSL_CTX_set0_client_CAs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set0_client_CAs) -#define SSL_CTX_set0_verify_cert_store BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set0_verify_cert_store) -#define SSL_CTX_set1_chain BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set1_chain) -#define SSL_CTX_set1_curves BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set1_curves) -#define SSL_CTX_set1_curves_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set1_curves_list) -#define SSL_CTX_set1_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set1_param) -#define SSL_CTX_set1_sigalgs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set1_sigalgs) -#define SSL_CTX_set1_sigalgs_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set1_sigalgs_list) -#define SSL_CTX_set1_tls_channel_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set1_tls_channel_id) -#define SSL_CTX_set1_verify_cert_store BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set1_verify_cert_store) -#define SSL_CTX_set_allow_unknown_alpn_protos BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_allow_unknown_alpn_protos) -#define SSL_CTX_set_alpn_protos BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_alpn_protos) -#define SSL_CTX_set_alpn_select_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_alpn_select_cb) -#define SSL_CTX_set_cert_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_cert_cb) -#define SSL_CTX_set_cert_store BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_cert_store) -#define SSL_CTX_set_cert_verify_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_cert_verify_callback) -#define SSL_CTX_set_chain_and_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_chain_and_key) -#define SSL_CTX_set_channel_id_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_channel_id_cb) -#define SSL_CTX_set_cipher_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_cipher_list) -#define SSL_CTX_set_client_CA_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_client_CA_list) -#define SSL_CTX_set_client_cert_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_client_cert_cb) -#define SSL_CTX_set_current_time_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_current_time_cb) -#define SSL_CTX_set_custom_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_custom_verify) -#define SSL_CTX_set_default_passwd_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_default_passwd_cb) -#define SSL_CTX_set_default_passwd_cb_userdata BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_default_passwd_cb_userdata) -#define SSL_CTX_set_default_verify_paths BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_default_verify_paths) -#define SSL_CTX_set_dos_protection_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_dos_protection_cb) -#define SSL_CTX_set_early_data_enabled BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_early_data_enabled) -#define SSL_CTX_set_ed25519_enabled BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_ed25519_enabled) -#define SSL_CTX_set_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_ex_data) -#define SSL_CTX_set_false_start_allowed_without_alpn BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_false_start_allowed_without_alpn) -#define SSL_CTX_set_grease_enabled BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_grease_enabled) -#define SSL_CTX_set_ignore_tls13_downgrade BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_ignore_tls13_downgrade) -#define SSL_CTX_set_info_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_info_callback) -#define SSL_CTX_set_keylog_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_keylog_callback) -#define SSL_CTX_set_max_cert_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_max_cert_list) -#define SSL_CTX_set_max_proto_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_max_proto_version) -#define SSL_CTX_set_max_send_fragment BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_max_send_fragment) -#define SSL_CTX_set_min_proto_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_min_proto_version) -#define SSL_CTX_set_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_mode) -#define SSL_CTX_set_msg_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_msg_callback) -#define SSL_CTX_set_msg_callback_arg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_msg_callback_arg) -#define SSL_CTX_set_next_proto_select_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_next_proto_select_cb) -#define SSL_CTX_set_next_protos_advertised_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_next_protos_advertised_cb) -#define SSL_CTX_set_ocsp_response BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_ocsp_response) -#define SSL_CTX_set_options BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_options) -#define SSL_CTX_set_private_key_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_private_key_method) -#define SSL_CTX_set_psk_client_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_psk_client_callback) -#define SSL_CTX_set_psk_server_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_psk_server_callback) -#define SSL_CTX_set_purpose BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_purpose) -#define SSL_CTX_set_quic_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_quic_method) -#define SSL_CTX_set_quiet_shutdown BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_quiet_shutdown) -#define SSL_CTX_set_read_ahead BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_read_ahead) -#define SSL_CTX_set_retain_only_sha256_of_client_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_retain_only_sha256_of_client_certs) -#define SSL_CTX_set_reverify_on_resume BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_reverify_on_resume) -#define SSL_CTX_set_rsa_pss_rsae_certs_enabled BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_rsa_pss_rsae_certs_enabled) -#define SSL_CTX_set_select_certificate_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_select_certificate_cb) -#define SSL_CTX_set_session_cache_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_session_cache_mode) -#define SSL_CTX_set_session_id_context BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_session_id_context) -#define SSL_CTX_set_session_psk_dhe_timeout BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_session_psk_dhe_timeout) -#define SSL_CTX_set_signed_cert_timestamp_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_signed_cert_timestamp_list) -#define SSL_CTX_set_signing_algorithm_prefs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_signing_algorithm_prefs) -#define SSL_CTX_set_srtp_profiles BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_srtp_profiles) -#define SSL_CTX_set_strict_cipher_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_strict_cipher_list) -#define SSL_CTX_set_ticket_aead_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_ticket_aead_method) -#define SSL_CTX_set_timeout BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_timeout) -#define SSL_CTX_set_tls_channel_id_enabled BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_tls_channel_id_enabled) -#define SSL_CTX_set_tlsext_servername_arg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_tlsext_servername_arg) -#define SSL_CTX_set_tlsext_servername_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_tlsext_servername_callback) -#define SSL_CTX_set_tlsext_status_arg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_tlsext_status_arg) -#define SSL_CTX_set_tlsext_status_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_tlsext_status_cb) -#define SSL_CTX_set_tlsext_ticket_key_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_tlsext_ticket_key_cb) -#define SSL_CTX_set_tlsext_ticket_keys BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_tlsext_ticket_keys) -#define SSL_CTX_set_tlsext_use_srtp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_tlsext_use_srtp) -#define SSL_CTX_set_tmp_dh BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_tmp_dh) -#define SSL_CTX_set_tmp_dh_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_tmp_dh_callback) -#define SSL_CTX_set_tmp_ecdh BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_tmp_ecdh) -#define SSL_CTX_set_tmp_rsa BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_tmp_rsa) -#define SSL_CTX_set_tmp_rsa_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_tmp_rsa_callback) -#define SSL_CTX_set_trust BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_trust) -#define SSL_CTX_set_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_verify) -#define SSL_CTX_set_verify_algorithm_prefs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_verify_algorithm_prefs) -#define SSL_CTX_set_verify_depth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_verify_depth) -#define SSL_CTX_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_up_ref) -#define SSL_CTX_use_PrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_use_PrivateKey) -#define SSL_CTX_use_PrivateKey_ASN1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_use_PrivateKey_ASN1) -#define SSL_CTX_use_PrivateKey_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_use_PrivateKey_file) -#define SSL_CTX_use_RSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_use_RSAPrivateKey) -#define SSL_CTX_use_RSAPrivateKey_ASN1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_use_RSAPrivateKey_ASN1) -#define SSL_CTX_use_RSAPrivateKey_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_use_RSAPrivateKey_file) -#define SSL_CTX_use_certificate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_use_certificate) -#define SSL_CTX_use_certificate_ASN1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_use_certificate_ASN1) -#define SSL_CTX_use_certificate_chain_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_use_certificate_chain_file) -#define SSL_CTX_use_certificate_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_use_certificate_file) -#define SSL_CTX_use_psk_identity_hint BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_use_psk_identity_hint) -#define SSL_SESSION_early_data_capable BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_early_data_capable) -#define SSL_SESSION_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_free) -#define SSL_SESSION_from_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_from_bytes) -#define SSL_SESSION_get0_cipher BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get0_cipher) -#define SSL_SESSION_get0_id_context BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get0_id_context) -#define SSL_SESSION_get0_ocsp_response BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get0_ocsp_response) -#define SSL_SESSION_get0_peer BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get0_peer) -#define SSL_SESSION_get0_peer_certificates BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get0_peer_certificates) -#define SSL_SESSION_get0_peer_sha256 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get0_peer_sha256) -#define SSL_SESSION_get0_signed_cert_timestamp_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get0_signed_cert_timestamp_list) -#define SSL_SESSION_get0_ticket BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get0_ticket) -#define SSL_SESSION_get_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get_ex_data) -#define SSL_SESSION_get_ex_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get_ex_new_index) -#define SSL_SESSION_get_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get_id) -#define SSL_SESSION_get_master_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get_master_key) -#define SSL_SESSION_get_protocol_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get_protocol_version) -#define SSL_SESSION_get_ticket_lifetime_hint BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get_ticket_lifetime_hint) -#define SSL_SESSION_get_time BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get_time) -#define SSL_SESSION_get_timeout BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get_timeout) -#define SSL_SESSION_get_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get_version) -#define SSL_SESSION_has_peer_sha256 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_has_peer_sha256) -#define SSL_SESSION_has_ticket BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_has_ticket) -#define SSL_SESSION_is_resumable BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_is_resumable) -#define SSL_SESSION_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_new) -#define SSL_SESSION_set1_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_set1_id) -#define SSL_SESSION_set1_id_context BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_set1_id_context) -#define SSL_SESSION_set_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_set_ex_data) -#define SSL_SESSION_set_protocol_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_set_protocol_version) -#define SSL_SESSION_set_ticket BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_set_ticket) -#define SSL_SESSION_set_time BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_set_time) -#define SSL_SESSION_set_timeout BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_set_timeout) -#define SSL_SESSION_should_be_single_use BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_should_be_single_use) -#define SSL_SESSION_to_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_to_bytes) -#define SSL_SESSION_to_bytes_for_ticket BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_to_bytes_for_ticket) -#define SSL_SESSION_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_up_ref) -#define SSL_accept BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_accept) -#define SSL_add0_chain_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_add0_chain_cert) -#define SSL_add1_chain_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_add1_chain_cert) -#define SSL_add_client_CA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_add_client_CA) -#define SSL_add_file_cert_subjects_to_stack BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_add_file_cert_subjects_to_stack) -#define SSL_alert_desc_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_alert_desc_string) -#define SSL_alert_desc_string_long BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_alert_desc_string_long) -#define SSL_alert_from_verify_result BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_alert_from_verify_result) -#define SSL_alert_type_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_alert_type_string) -#define SSL_alert_type_string_long BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_alert_type_string_long) -#define SSL_cache_hit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_cache_hit) -#define SSL_certs_clear BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_certs_clear) -#define SSL_check_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_check_private_key) -#define SSL_clear BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_clear) -#define SSL_clear_chain_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_clear_chain_certs) -#define SSL_clear_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_clear_mode) -#define SSL_clear_options BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_clear_options) -#define SSL_connect BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_connect) -#define SSL_cutthrough_complete BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_cutthrough_complete) -#define SSL_delegated_credential_used BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_delegated_credential_used) -#define SSL_do_handshake BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_do_handshake) -#define SSL_dup_CA_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_dup_CA_list) -#define SSL_early_callback_ctx_extension_get BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_early_callback_ctx_extension_get) -#define SSL_early_data_accepted BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_early_data_accepted) -#define SSL_enable_ocsp_stapling BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_enable_ocsp_stapling) -#define SSL_enable_signed_cert_timestamps BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_enable_signed_cert_timestamps) -#define SSL_enable_tls_channel_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_enable_tls_channel_id) -#define SSL_error_description BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_error_description) -#define SSL_export_keying_material BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_export_keying_material) -#define SSL_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_free) -#define SSL_generate_key_block BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_generate_key_block) -#define SSL_get0_alpn_selected BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get0_alpn_selected) -#define SSL_get0_certificate_types BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get0_certificate_types) -#define SSL_get0_chain_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get0_chain_certs) -#define SSL_get0_next_proto_negotiated BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get0_next_proto_negotiated) -#define SSL_get0_ocsp_response BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get0_ocsp_response) -#define SSL_get0_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get0_param) -#define SSL_get0_peer_certificates BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get0_peer_certificates) -#define SSL_get0_peer_verify_algorithms BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get0_peer_verify_algorithms) -#define SSL_get0_server_requested_CAs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get0_server_requested_CAs) -#define SSL_get0_session_id_context BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get0_session_id_context) -#define SSL_get0_signed_cert_timestamp_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get0_signed_cert_timestamp_list) -#define SSL_get1_session BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get1_session) -#define SSL_get_SSL_CTX BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_SSL_CTX) -#define SSL_get_certificate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_certificate) -#define SSL_get_cipher_by_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_cipher_by_value) -#define SSL_get_cipher_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_cipher_list) -#define SSL_get_ciphers BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_ciphers) -#define SSL_get_client_CA_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_client_CA_list) -#define SSL_get_client_random BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_client_random) -#define SSL_get_current_cipher BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_current_cipher) -#define SSL_get_current_compression BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_current_compression) -#define SSL_get_current_expansion BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_current_expansion) -#define SSL_get_curve_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_curve_id) -#define SSL_get_curve_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_curve_name) -#define SSL_get_default_timeout BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_default_timeout) -#define SSL_get_early_data_reason BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_early_data_reason) -#define SSL_get_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_error) -#define SSL_get_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_ex_data) -#define SSL_get_ex_data_X509_STORE_CTX_idx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_ex_data_X509_STORE_CTX_idx) -#define SSL_get_ex_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_ex_new_index) -#define SSL_get_extms_support BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_extms_support) -#define SSL_get_fd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_fd) -#define SSL_get_finished BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_finished) -#define SSL_get_info_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_info_callback) -#define SSL_get_ivs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_ivs) -#define SSL_get_key_block_len BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_key_block_len) -#define SSL_get_max_cert_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_max_cert_list) -#define SSL_get_max_proto_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_max_proto_version) -#define SSL_get_min_proto_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_min_proto_version) -#define SSL_get_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_mode) -#define SSL_get_negotiated_token_binding_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_negotiated_token_binding_param) -#define SSL_get_options BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_options) -#define SSL_get_peer_cert_chain BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_peer_cert_chain) -#define SSL_get_peer_certificate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_peer_certificate) -#define SSL_get_peer_finished BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_peer_finished) -#define SSL_get_peer_full_cert_chain BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_peer_full_cert_chain) -#define SSL_get_peer_quic_transport_params BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_peer_quic_transport_params) -#define SSL_get_peer_signature_algorithm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_peer_signature_algorithm) -#define SSL_get_pending_cipher BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_pending_cipher) -#define SSL_get_privatekey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_privatekey) -#define SSL_get_psk_identity BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_psk_identity) -#define SSL_get_psk_identity_hint BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_psk_identity_hint) -#define SSL_get_quiet_shutdown BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_quiet_shutdown) -#define SSL_get_rbio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_rbio) -#define SSL_get_read_ahead BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_read_ahead) -#define SSL_get_read_sequence BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_read_sequence) -#define SSL_get_rfd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_rfd) -#define SSL_get_secure_renegotiation_support BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_secure_renegotiation_support) -#define SSL_get_selected_srtp_profile BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_selected_srtp_profile) -#define SSL_get_server_random BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_server_random) -#define SSL_get_server_tmp_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_server_tmp_key) -#define SSL_get_servername BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_servername) -#define SSL_get_servername_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_servername_type) -#define SSL_get_session BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_session) -#define SSL_get_shared_ciphers BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_shared_ciphers) -#define SSL_get_shutdown BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_shutdown) -#define SSL_get_signature_algorithm_digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_signature_algorithm_digest) -#define SSL_get_signature_algorithm_key_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_signature_algorithm_key_type) -#define SSL_get_signature_algorithm_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_signature_algorithm_name) -#define SSL_get_srtp_profiles BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_srtp_profiles) -#define SSL_get_ticket_age_skew BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_ticket_age_skew) -#define SSL_get_tls_channel_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_tls_channel_id) -#define SSL_get_tls_unique BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_tls_unique) -#define SSL_get_tlsext_status_ocsp_resp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_tlsext_status_ocsp_resp) -#define SSL_get_tlsext_status_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_tlsext_status_type) -#define SSL_get_verify_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_verify_callback) -#define SSL_get_verify_depth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_verify_depth) -#define SSL_get_verify_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_verify_mode) -#define SSL_get_verify_result BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_verify_result) -#define SSL_get_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_version) -#define SSL_get_wbio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_wbio) -#define SSL_get_wfd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_wfd) -#define SSL_get_write_sequence BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_write_sequence) -#define SSL_in_early_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_in_early_data) -#define SSL_in_false_start BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_in_false_start) -#define SSL_in_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_in_init) -#define SSL_is_dtls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_is_dtls) -#define SSL_is_init_finished BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_is_init_finished) -#define SSL_is_server BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_is_server) -#define SSL_is_signature_algorithm_rsa_pss BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_is_signature_algorithm_rsa_pss) -#define SSL_is_tls13_downgrade BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_is_tls13_downgrade) -#define SSL_is_token_binding_negotiated BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_is_token_binding_negotiated) -#define SSL_key_update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_key_update) -#define SSL_library_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_library_init) -#define SSL_load_client_CA_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_load_client_CA_file) -#define SSL_load_error_strings BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_load_error_strings) -#define SSL_magic_pending_session_ptr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_magic_pending_session_ptr) -#define SSL_max_seal_overhead BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_max_seal_overhead) -#define SSL_need_tmp_RSA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_need_tmp_RSA) -#define SSL_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_new) -#define SSL_num_renegotiations BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_num_renegotiations) -#define SSL_peek BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_peek) -#define SSL_pending BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_pending) -#define SSL_pq_experiment_signal_seen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_pq_experiment_signal_seen) -#define SSL_process_quic_post_handshake BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_process_quic_post_handshake) -#define SSL_provide_quic_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_provide_quic_data) -#define SSL_quic_max_handshake_flight_len BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_quic_max_handshake_flight_len) -#define SSL_quic_read_level BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_quic_read_level) -#define SSL_quic_write_level BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_quic_write_level) -#define SSL_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_read) -#define SSL_renegotiate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_renegotiate) -#define SSL_renegotiate_pending BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_renegotiate_pending) -#define SSL_reset_early_data_reject BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_reset_early_data_reject) -#define SSL_select_next_proto BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_select_next_proto) -#define SSL_send_fatal_alert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_send_fatal_alert) -#define SSL_session_reused BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_session_reused) -#define SSL_set0_chain BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set0_chain) -#define SSL_set0_client_CAs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set0_client_CAs) -#define SSL_set0_rbio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set0_rbio) -#define SSL_set0_verify_cert_store BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set0_verify_cert_store) -#define SSL_set0_wbio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set0_wbio) -#define SSL_set1_chain BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set1_chain) -#define SSL_set1_curves BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set1_curves) -#define SSL_set1_curves_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set1_curves_list) -#define SSL_set1_delegated_credential BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set1_delegated_credential) -#define SSL_set1_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set1_param) -#define SSL_set1_sigalgs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set1_sigalgs) -#define SSL_set1_sigalgs_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set1_sigalgs_list) -#define SSL_set1_tls_channel_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set1_tls_channel_id) -#define SSL_set1_verify_cert_store BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set1_verify_cert_store) -#define SSL_set_SSL_CTX BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_SSL_CTX) -#define SSL_set_accept_state BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_accept_state) -#define SSL_set_alpn_protos BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_alpn_protos) -#define SSL_set_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_bio) -#define SSL_set_cert_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_cert_cb) -#define SSL_set_chain_and_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_chain_and_key) -#define SSL_set_cipher_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_cipher_list) -#define SSL_set_client_CA_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_client_CA_list) -#define SSL_set_connect_state BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_connect_state) -#define SSL_set_custom_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_custom_verify) -#define SSL_set_early_data_enabled BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_early_data_enabled) -#define SSL_set_enforce_rsa_key_usage BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_enforce_rsa_key_usage) -#define SSL_set_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_ex_data) -#define SSL_set_fd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_fd) -#define SSL_set_ignore_tls13_downgrade BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_ignore_tls13_downgrade) -#define SSL_set_info_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_info_callback) -#define SSL_set_jdk11_workaround BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_jdk11_workaround) -#define SSL_set_max_cert_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_max_cert_list) -#define SSL_set_max_proto_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_max_proto_version) -#define SSL_set_max_send_fragment BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_max_send_fragment) -#define SSL_set_min_proto_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_min_proto_version) -#define SSL_set_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_mode) -#define SSL_set_msg_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_msg_callback) -#define SSL_set_msg_callback_arg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_msg_callback_arg) -#define SSL_set_mtu BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_mtu) -#define SSL_set_ocsp_response BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_ocsp_response) -#define SSL_set_options BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_options) -#define SSL_set_private_key_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_private_key_method) -#define SSL_set_psk_client_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_psk_client_callback) -#define SSL_set_psk_server_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_psk_server_callback) -#define SSL_set_purpose BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_purpose) -#define SSL_set_quic_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_quic_method) -#define SSL_set_quic_transport_params BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_quic_transport_params) -#define SSL_set_quiet_shutdown BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_quiet_shutdown) -#define SSL_set_read_ahead BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_read_ahead) -#define SSL_set_renegotiate_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_renegotiate_mode) -#define SSL_set_retain_only_sha256_of_client_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_retain_only_sha256_of_client_certs) -#define SSL_set_rfd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_rfd) -#define SSL_set_session BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_session) -#define SSL_set_session_id_context BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_session_id_context) -#define SSL_set_shed_handshake_config BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_shed_handshake_config) -#define SSL_set_shutdown BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_shutdown) -#define SSL_set_signed_cert_timestamp_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_signed_cert_timestamp_list) -#define SSL_set_signing_algorithm_prefs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_signing_algorithm_prefs) -#define SSL_set_srtp_profiles BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_srtp_profiles) -#define SSL_set_state BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_state) -#define SSL_set_strict_cipher_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_strict_cipher_list) -#define SSL_set_tls_channel_id_enabled BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_tls_channel_id_enabled) -#define SSL_set_tlsext_host_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_tlsext_host_name) -#define SSL_set_tlsext_status_ocsp_resp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_tlsext_status_ocsp_resp) -#define SSL_set_tlsext_status_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_tlsext_status_type) -#define SSL_set_tlsext_use_srtp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_tlsext_use_srtp) -#define SSL_set_tmp_dh BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_tmp_dh) -#define SSL_set_tmp_dh_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_tmp_dh_callback) -#define SSL_set_tmp_ecdh BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_tmp_ecdh) -#define SSL_set_tmp_rsa BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_tmp_rsa) -#define SSL_set_tmp_rsa_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_tmp_rsa_callback) -#define SSL_set_token_binding_params BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_token_binding_params) -#define SSL_set_trust BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_trust) -#define SSL_set_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_verify) -#define SSL_set_verify_depth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_verify_depth) -#define SSL_set_verify_result BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_verify_result) -#define SSL_set_wfd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_wfd) -#define SSL_shutdown BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_shutdown) -#define SSL_state BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_state) -#define SSL_state_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_state_string) -#define SSL_state_string_long BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_state_string_long) -#define SSL_total_renegotiations BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_total_renegotiations) -#define SSL_use_PrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_use_PrivateKey) -#define SSL_use_PrivateKey_ASN1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_use_PrivateKey_ASN1) -#define SSL_use_PrivateKey_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_use_PrivateKey_file) -#define SSL_use_RSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_use_RSAPrivateKey) -#define SSL_use_RSAPrivateKey_ASN1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_use_RSAPrivateKey_ASN1) -#define SSL_use_RSAPrivateKey_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_use_RSAPrivateKey_file) -#define SSL_use_certificate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_use_certificate) -#define SSL_use_certificate_ASN1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_use_certificate_ASN1) -#define SSL_use_certificate_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_use_certificate_file) -#define SSL_use_psk_identity_hint BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_use_psk_identity_hint) -#define SSL_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_version) -#define SSL_want BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_want) -#define SSL_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_write) -#define SSLv23_client_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSLv23_client_method) -#define SSLv23_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSLv23_method) -#define SSLv23_server_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSLv23_server_method) -#define TLS_client_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TLS_client_method) -#define TLS_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TLS_method) -#define TLS_server_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TLS_server_method) -#define TLS_with_buffers_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TLS_with_buffers_method) -#define TLSv1_1_client_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TLSv1_1_client_method) -#define TLSv1_1_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TLSv1_1_method) -#define TLSv1_1_server_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TLSv1_1_server_method) -#define TLSv1_2_client_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TLSv1_2_client_method) -#define TLSv1_2_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TLSv1_2_method) -#define TLSv1_2_server_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TLSv1_2_server_method) -#define TLSv1_client_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TLSv1_client_method) -#define TLSv1_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TLSv1_method) -#define TLSv1_server_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TLSv1_server_method) -#define d2i_SSL_SESSION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_SSL_SESSION) -#define d2i_SSL_SESSION_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_SSL_SESSION_bio) -#define i2d_SSL_SESSION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_SSL_SESSION) -#define i2d_SSL_SESSION_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_SSL_SESSION_bio) -#define sk_CRYPTO_BUFFER_call_copy_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_CRYPTO_BUFFER_call_copy_func) -#define sk_CRYPTO_BUFFER_call_free_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_CRYPTO_BUFFER_call_free_func) -#define sk_CRYPTO_BUFFER_deep_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_CRYPTO_BUFFER_deep_copy) -#define sk_CRYPTO_BUFFER_new_null BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_CRYPTO_BUFFER_new_null) -#define sk_CRYPTO_BUFFER_num BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_CRYPTO_BUFFER_num) -#define sk_CRYPTO_BUFFER_push BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_CRYPTO_BUFFER_push) -#define sk_CRYPTO_BUFFER_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_CRYPTO_BUFFER_set) -#define sk_CRYPTO_BUFFER_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_CRYPTO_BUFFER_value) -#define sk_SRTP_PROTECTION_PROFILE_new_null BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_SRTP_PROTECTION_PROFILE_new_null) -#define sk_SRTP_PROTECTION_PROFILE_num BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_SRTP_PROTECTION_PROFILE_num) -#define sk_SRTP_PROTECTION_PROFILE_push BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_SRTP_PROTECTION_PROFILE_push) -#define sk_SSL_CIPHER_call_cmp_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_SSL_CIPHER_call_cmp_func) -#define sk_SSL_CIPHER_delete BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_SSL_CIPHER_delete) -#define sk_SSL_CIPHER_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_SSL_CIPHER_dup) -#define sk_SSL_CIPHER_find BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_SSL_CIPHER_find) -#define sk_SSL_CIPHER_new_null BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_SSL_CIPHER_new_null) -#define sk_SSL_CIPHER_num BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_SSL_CIPHER_num) -#define sk_SSL_CIPHER_push BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_SSL_CIPHER_push) -#define sk_SSL_CIPHER_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_SSL_CIPHER_value) -#define sk_X509_NAME_call_cmp_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_NAME_call_cmp_func) -#define sk_X509_NAME_call_copy_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_NAME_call_copy_func) -#define sk_X509_NAME_call_free_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_NAME_call_free_func) -#define sk_X509_NAME_deep_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_NAME_deep_copy) -#define sk_X509_NAME_find BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_NAME_find) -#define sk_X509_NAME_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_NAME_free) -#define sk_X509_NAME_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_NAME_new) -#define sk_X509_NAME_new_null BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_NAME_new_null) -#define sk_X509_NAME_pop_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_NAME_pop_free) -#define sk_X509_NAME_push BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_NAME_push) -#define sk_X509_NAME_set_cmp_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_NAME_set_cmp_func) -#define sk_X509_NAME_sort BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_NAME_sort) -#define sk_X509_call_free_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_call_free_func) -#define sk_X509_new_null BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_new_null) -#define sk_X509_num BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_num) -#define sk_X509_pop_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_pop_free) -#define sk_X509_shift BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_shift) -#define sk_X509_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_value) -#define ACCESS_DESCRIPTION_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ACCESS_DESCRIPTION_free) -#define ACCESS_DESCRIPTION_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ACCESS_DESCRIPTION_it) -#define ACCESS_DESCRIPTION_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ACCESS_DESCRIPTION_new) -#define AES_CMAC BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AES_CMAC) -#define AES_cbc_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AES_cbc_encrypt) -#define AES_cfb128_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AES_cfb128_encrypt) -#define AES_ctr128_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AES_ctr128_encrypt) -#define AES_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AES_decrypt) -#define AES_ecb_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AES_ecb_encrypt) -#define AES_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AES_encrypt) -#define AES_ofb128_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AES_ofb128_encrypt) -#define AES_set_decrypt_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AES_set_decrypt_key) -#define AES_set_encrypt_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AES_set_encrypt_key) -#define AES_unwrap_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AES_unwrap_key) -#define AES_unwrap_key_padded BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AES_unwrap_key_padded) -#define AES_wrap_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AES_wrap_key) -#define AES_wrap_key_padded BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AES_wrap_key_padded) -#define ASN1_ANY_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_ANY_it) -#define ASN1_BIT_STRING_check BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_BIT_STRING_check) -#define ASN1_BIT_STRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_BIT_STRING_free) -#define ASN1_BIT_STRING_get_bit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_BIT_STRING_get_bit) -#define ASN1_BIT_STRING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_BIT_STRING_it) -#define ASN1_BIT_STRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_BIT_STRING_new) -#define ASN1_BIT_STRING_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_BIT_STRING_set) -#define ASN1_BIT_STRING_set_bit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_BIT_STRING_set_bit) -#define ASN1_BMPSTRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_BMPSTRING_free) -#define ASN1_BMPSTRING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_BMPSTRING_it) -#define ASN1_BMPSTRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_BMPSTRING_new) -#define ASN1_BOOLEAN_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_BOOLEAN_it) -#define ASN1_ENUMERATED_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_ENUMERATED_free) -#define ASN1_ENUMERATED_get BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_ENUMERATED_get) -#define ASN1_ENUMERATED_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_ENUMERATED_it) -#define ASN1_ENUMERATED_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_ENUMERATED_new) -#define ASN1_ENUMERATED_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_ENUMERATED_set) -#define ASN1_ENUMERATED_to_BN BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_ENUMERATED_to_BN) -#define ASN1_FBOOLEAN_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_FBOOLEAN_it) -#define ASN1_GENERALIZEDTIME_adj BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_GENERALIZEDTIME_adj) -#define ASN1_GENERALIZEDTIME_check BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_GENERALIZEDTIME_check) -#define ASN1_GENERALIZEDTIME_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_GENERALIZEDTIME_free) -#define ASN1_GENERALIZEDTIME_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_GENERALIZEDTIME_it) -#define ASN1_GENERALIZEDTIME_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_GENERALIZEDTIME_new) -#define ASN1_GENERALIZEDTIME_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_GENERALIZEDTIME_print) -#define ASN1_GENERALIZEDTIME_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_GENERALIZEDTIME_set) -#define ASN1_GENERALIZEDTIME_set_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_GENERALIZEDTIME_set_string) -#define ASN1_GENERALSTRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_GENERALSTRING_free) -#define ASN1_GENERALSTRING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_GENERALSTRING_it) -#define ASN1_GENERALSTRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_GENERALSTRING_new) -#define ASN1_IA5STRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_IA5STRING_free) -#define ASN1_IA5STRING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_IA5STRING_it) -#define ASN1_IA5STRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_IA5STRING_new) -#define ASN1_INTEGER_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_INTEGER_cmp) -#define ASN1_INTEGER_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_INTEGER_dup) -#define ASN1_INTEGER_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_INTEGER_free) -#define ASN1_INTEGER_get BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_INTEGER_get) -#define ASN1_INTEGER_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_INTEGER_it) -#define ASN1_INTEGER_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_INTEGER_new) -#define ASN1_INTEGER_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_INTEGER_set) -#define ASN1_INTEGER_set_uint64 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_INTEGER_set_uint64) -#define ASN1_INTEGER_to_BN BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_INTEGER_to_BN) -#define ASN1_NULL_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_NULL_free) -#define ASN1_NULL_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_NULL_it) -#define ASN1_NULL_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_NULL_new) -#define ASN1_OBJECT_create BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_OBJECT_create) -#define ASN1_OBJECT_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_OBJECT_free) -#define ASN1_OBJECT_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_OBJECT_it) -#define ASN1_OBJECT_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_OBJECT_new) -#define ASN1_OCTET_STRING_NDEF_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_OCTET_STRING_NDEF_it) -#define ASN1_OCTET_STRING_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_OCTET_STRING_cmp) -#define ASN1_OCTET_STRING_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_OCTET_STRING_dup) -#define ASN1_OCTET_STRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_OCTET_STRING_free) -#define ASN1_OCTET_STRING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_OCTET_STRING_it) -#define ASN1_OCTET_STRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_OCTET_STRING_new) -#define ASN1_OCTET_STRING_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_OCTET_STRING_set) -#define ASN1_PRINTABLESTRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_PRINTABLESTRING_free) -#define ASN1_PRINTABLESTRING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_PRINTABLESTRING_it) -#define ASN1_PRINTABLESTRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_PRINTABLESTRING_new) -#define ASN1_PRINTABLE_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_PRINTABLE_free) -#define ASN1_PRINTABLE_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_PRINTABLE_it) -#define ASN1_PRINTABLE_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_PRINTABLE_new) -#define ASN1_PRINTABLE_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_PRINTABLE_type) -#define ASN1_SEQUENCE_ANY_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_SEQUENCE_ANY_it) -#define ASN1_SEQUENCE_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_SEQUENCE_it) -#define ASN1_SET_ANY_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_SET_ANY_it) -#define ASN1_STRING_TABLE_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_TABLE_add) -#define ASN1_STRING_TABLE_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_TABLE_cleanup) -#define ASN1_STRING_TABLE_get BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_TABLE_get) -#define ASN1_STRING_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_cmp) -#define ASN1_STRING_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_copy) -#define ASN1_STRING_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_data) -#define ASN1_STRING_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_dup) -#define ASN1_STRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_free) -#define ASN1_STRING_get0_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_get0_data) -#define ASN1_STRING_get_default_mask BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_get_default_mask) -#define ASN1_STRING_length BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_length) -#define ASN1_STRING_length_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_length_set) -#define ASN1_STRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_new) -#define ASN1_STRING_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_print) -#define ASN1_STRING_print_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_print_ex) -#define ASN1_STRING_print_ex_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_print_ex_fp) -#define ASN1_STRING_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_set) -#define ASN1_STRING_set0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_set0) -#define ASN1_STRING_set_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_set_by_NID) -#define ASN1_STRING_set_default_mask BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_set_default_mask) -#define ASN1_STRING_set_default_mask_asc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_set_default_mask_asc) -#define ASN1_STRING_to_UTF8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_to_UTF8) -#define ASN1_STRING_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_type) -#define ASN1_STRING_type_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_type_new) -#define ASN1_T61STRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_T61STRING_free) -#define ASN1_T61STRING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_T61STRING_it) -#define ASN1_T61STRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_T61STRING_new) -#define ASN1_TBOOLEAN_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TBOOLEAN_it) -#define ASN1_TIME_adj BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TIME_adj) -#define ASN1_TIME_check BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TIME_check) -#define ASN1_TIME_diff BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TIME_diff) -#define ASN1_TIME_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TIME_free) -#define ASN1_TIME_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TIME_it) -#define ASN1_TIME_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TIME_new) -#define ASN1_TIME_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TIME_print) -#define ASN1_TIME_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TIME_set) -#define ASN1_TIME_set_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TIME_set_string) -#define ASN1_TIME_to_generalizedtime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TIME_to_generalizedtime) -#define ASN1_TYPE_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TYPE_cmp) -#define ASN1_TYPE_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TYPE_free) -#define ASN1_TYPE_get BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TYPE_get) -#define ASN1_TYPE_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TYPE_new) -#define ASN1_TYPE_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TYPE_set) -#define ASN1_TYPE_set1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TYPE_set1) -#define ASN1_UNIVERSALSTRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_UNIVERSALSTRING_free) -#define ASN1_UNIVERSALSTRING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_UNIVERSALSTRING_it) -#define ASN1_UNIVERSALSTRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_UNIVERSALSTRING_new) -#define ASN1_UTCTIME_adj BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_UTCTIME_adj) -#define ASN1_UTCTIME_check BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_UTCTIME_check) -#define ASN1_UTCTIME_cmp_time_t BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_UTCTIME_cmp_time_t) -#define ASN1_UTCTIME_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_UTCTIME_free) -#define ASN1_UTCTIME_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_UTCTIME_it) -#define ASN1_UTCTIME_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_UTCTIME_new) -#define ASN1_UTCTIME_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_UTCTIME_print) -#define ASN1_UTCTIME_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_UTCTIME_set) -#define ASN1_UTCTIME_set_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_UTCTIME_set_string) -#define ASN1_UTF8STRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_UTF8STRING_free) -#define ASN1_UTF8STRING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_UTF8STRING_it) -#define ASN1_UTF8STRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_UTF8STRING_new) -#define ASN1_VISIBLESTRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_VISIBLESTRING_free) -#define ASN1_VISIBLESTRING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_VISIBLESTRING_it) -#define ASN1_VISIBLESTRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_VISIBLESTRING_new) -#define ASN1_digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_digest) -#define ASN1_generate_nconf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_generate_nconf) -#define ASN1_generate_v3 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_generate_v3) -#define ASN1_get_object BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_get_object) -#define ASN1_item_d2i BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_d2i) -#define ASN1_item_d2i_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_d2i_bio) -#define ASN1_item_d2i_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_d2i_fp) -#define ASN1_item_digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_digest) -#define ASN1_item_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_dup) -#define ASN1_item_ex_d2i BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_ex_d2i) -#define ASN1_item_ex_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_ex_free) -#define ASN1_item_ex_i2d BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_ex_i2d) -#define ASN1_item_ex_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_ex_new) -#define ASN1_item_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_free) -#define ASN1_item_i2d BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_i2d) -#define ASN1_item_i2d_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_i2d_bio) -#define ASN1_item_i2d_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_i2d_fp) -#define ASN1_item_ndef_i2d BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_ndef_i2d) -#define ASN1_item_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_new) -#define ASN1_item_pack BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_pack) -#define ASN1_item_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_sign) -#define ASN1_item_sign_ctx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_sign_ctx) -#define ASN1_item_unpack BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_unpack) -#define ASN1_item_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_verify) -#define ASN1_mbstring_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_mbstring_copy) -#define ASN1_mbstring_ncopy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_mbstring_ncopy) -#define ASN1_object_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_object_size) -#define ASN1_primitive_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_primitive_free) -#define ASN1_primitive_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_primitive_new) -#define ASN1_put_eoc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_put_eoc) -#define ASN1_put_object BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_put_object) -#define ASN1_tag2bit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_tag2bit) -#define ASN1_tag2str BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_tag2str) -#define ASN1_template_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_template_free) -#define ASN1_template_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_template_new) -#define AUTHORITY_INFO_ACCESS_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AUTHORITY_INFO_ACCESS_free) -#define AUTHORITY_INFO_ACCESS_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AUTHORITY_INFO_ACCESS_it) -#define AUTHORITY_INFO_ACCESS_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AUTHORITY_INFO_ACCESS_new) -#define AUTHORITY_KEYID_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AUTHORITY_KEYID_free) -#define AUTHORITY_KEYID_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AUTHORITY_KEYID_it) -#define AUTHORITY_KEYID_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AUTHORITY_KEYID_new) -#define BASIC_CONSTRAINTS_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BASIC_CONSTRAINTS_free) -#define BASIC_CONSTRAINTS_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BASIC_CONSTRAINTS_it) -#define BASIC_CONSTRAINTS_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BASIC_CONSTRAINTS_new) -#define BIO_append_filename BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_append_filename) -#define BIO_callback_ctrl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_callback_ctrl) -#define BIO_clear_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_clear_flags) -#define BIO_clear_retry_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_clear_retry_flags) -#define BIO_copy_next_retry BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_copy_next_retry) -#define BIO_ctrl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_ctrl) -#define BIO_ctrl_get_read_request BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_ctrl_get_read_request) -#define BIO_ctrl_get_write_guarantee BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_ctrl_get_write_guarantee) -#define BIO_ctrl_pending BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_ctrl_pending) -#define BIO_do_connect BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_do_connect) -#define BIO_eof BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_eof) -#define BIO_find_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_find_type) -#define BIO_flush BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_flush) -#define BIO_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_free) -#define BIO_free_all BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_free_all) -#define BIO_get_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_get_data) -#define BIO_get_fd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_get_fd) -#define BIO_get_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_get_fp) -#define BIO_get_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_get_init) -#define BIO_get_mem_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_get_mem_data) -#define BIO_get_mem_ptr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_get_mem_ptr) -#define BIO_get_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_get_new_index) -#define BIO_get_retry_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_get_retry_flags) -#define BIO_get_retry_reason BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_get_retry_reason) -#define BIO_get_shutdown BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_get_shutdown) -#define BIO_gets BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_gets) -#define BIO_hexdump BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_hexdump) -#define BIO_indent BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_indent) -#define BIO_int_ctrl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_int_ctrl) -#define BIO_mem_contents BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_mem_contents) -#define BIO_meth_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_meth_free) -#define BIO_meth_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_meth_new) -#define BIO_meth_set_create BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_meth_set_create) -#define BIO_meth_set_ctrl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_meth_set_ctrl) -#define BIO_meth_set_destroy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_meth_set_destroy) -#define BIO_meth_set_gets BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_meth_set_gets) -#define BIO_meth_set_puts BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_meth_set_puts) -#define BIO_meth_set_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_meth_set_read) -#define BIO_meth_set_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_meth_set_write) -#define BIO_method_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_method_type) -#define BIO_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_new) -#define BIO_new_bio_pair BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_new_bio_pair) -#define BIO_new_connect BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_new_connect) -#define BIO_new_fd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_new_fd) -#define BIO_new_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_new_file) -#define BIO_new_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_new_fp) -#define BIO_new_mem_buf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_new_mem_buf) -#define BIO_new_socket BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_new_socket) -#define BIO_next BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_next) -#define BIO_number_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_number_read) -#define BIO_number_written BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_number_written) -#define BIO_pending BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_pending) -#define BIO_pop BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_pop) -#define BIO_printf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_printf) -#define BIO_ptr_ctrl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_ptr_ctrl) -#define BIO_push BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_push) -#define BIO_puts BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_puts) -#define BIO_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_read) -#define BIO_read_asn1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_read_asn1) -#define BIO_read_filename BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_read_filename) -#define BIO_reset BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_reset) -#define BIO_rw_filename BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_rw_filename) -#define BIO_s_connect BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_s_connect) -#define BIO_s_fd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_s_fd) -#define BIO_s_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_s_file) -#define BIO_s_mem BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_s_mem) -#define BIO_s_socket BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_s_socket) -#define BIO_set_close BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_close) -#define BIO_set_conn_hostname BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_conn_hostname) -#define BIO_set_conn_int_port BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_conn_int_port) -#define BIO_set_conn_port BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_conn_port) -#define BIO_set_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_data) -#define BIO_set_fd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_fd) -#define BIO_set_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_flags) -#define BIO_set_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_fp) -#define BIO_set_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_init) -#define BIO_set_mem_buf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_mem_buf) -#define BIO_set_mem_eof_return BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_mem_eof_return) -#define BIO_set_nbio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_nbio) -#define BIO_set_retry_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_retry_read) -#define BIO_set_retry_special BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_retry_special) -#define BIO_set_retry_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_retry_write) -#define BIO_set_shutdown BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_shutdown) -#define BIO_set_write_buffer_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_write_buffer_size) -#define BIO_should_io_special BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_should_io_special) -#define BIO_should_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_should_read) -#define BIO_should_retry BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_should_retry) -#define BIO_should_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_should_write) -#define BIO_shutdown_wr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_shutdown_wr) -#define BIO_snprintf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_snprintf) -#define BIO_test_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_test_flags) -#define BIO_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_up_ref) -#define BIO_vfree BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_vfree) -#define BIO_vsnprintf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_vsnprintf) -#define BIO_wpending BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_wpending) -#define BIO_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_write) -#define BIO_write_all BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_write_all) -#define BIO_write_filename BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_write_filename) -#define BN_BLINDING_convert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_BLINDING_convert) -#define BN_BLINDING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_BLINDING_free) -#define BN_BLINDING_invert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_BLINDING_invert) -#define BN_BLINDING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_BLINDING_new) -#define BN_CTX_end BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_CTX_end) -#define BN_CTX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_CTX_free) -#define BN_CTX_get BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_CTX_get) -#define BN_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_CTX_new) -#define BN_CTX_start BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_CTX_start) -#define BN_GENCB_call BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_GENCB_call) -#define BN_GENCB_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_GENCB_set) -#define BN_MONT_CTX_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_MONT_CTX_copy) -#define BN_MONT_CTX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_MONT_CTX_free) -#define BN_MONT_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_MONT_CTX_new) -#define BN_MONT_CTX_new_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_MONT_CTX_new_consttime) -#define BN_MONT_CTX_new_for_modulus BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_MONT_CTX_new_for_modulus) -#define BN_MONT_CTX_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_MONT_CTX_set) -#define BN_MONT_CTX_set_locked BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_MONT_CTX_set_locked) -#define BN_abs_is_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_abs_is_word) -#define BN_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_add) -#define BN_add_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_add_word) -#define BN_asc2bn BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_asc2bn) -#define BN_bin2bn BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_bin2bn) -#define BN_bn2bin BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_bn2bin) -#define BN_bn2bin_padded BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_bn2bin_padded) -#define BN_bn2binpad BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_bn2binpad) -#define BN_bn2cbb_padded BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_bn2cbb_padded) -#define BN_bn2dec BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_bn2dec) -#define BN_bn2hex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_bn2hex) -#define BN_bn2le_padded BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_bn2le_padded) -#define BN_bn2mpi BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_bn2mpi) -#define BN_clear BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_clear) -#define BN_clear_bit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_clear_bit) -#define BN_clear_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_clear_free) -#define BN_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_cmp) -#define BN_cmp_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_cmp_word) -#define BN_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_copy) -#define BN_count_low_zero_bits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_count_low_zero_bits) -#define BN_dec2bn BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_dec2bn) -#define BN_div BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_div) -#define BN_div_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_div_word) -#define BN_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_dup) -#define BN_enhanced_miller_rabin_primality_test BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_enhanced_miller_rabin_primality_test) -#define BN_equal_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_equal_consttime) -#define BN_exp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_exp) -#define BN_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_free) -#define BN_from_montgomery BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_from_montgomery) -#define BN_gcd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_gcd) -#define BN_generate_prime_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_generate_prime_ex) -#define BN_get_rfc3526_prime_1536 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_get_rfc3526_prime_1536) -#define BN_get_u64 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_get_u64) -#define BN_get_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_get_word) -#define BN_hex2bn BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_hex2bn) -#define BN_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_init) -#define BN_is_bit_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_is_bit_set) -#define BN_is_negative BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_is_negative) -#define BN_is_odd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_is_odd) -#define BN_is_one BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_is_one) -#define BN_is_pow2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_is_pow2) -#define BN_is_prime_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_is_prime_ex) -#define BN_is_prime_fasttest_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_is_prime_fasttest_ex) -#define BN_is_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_is_word) -#define BN_is_zero BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_is_zero) -#define BN_le2bn BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_le2bn) -#define BN_lshift BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_lshift) -#define BN_lshift1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_lshift1) -#define BN_marshal_asn1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_marshal_asn1) -#define BN_mask_bits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mask_bits) -#define BN_mod_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_add) -#define BN_mod_add_quick BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_add_quick) -#define BN_mod_exp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_exp) -#define BN_mod_exp2_mont BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_exp2_mont) -#define BN_mod_exp_mont BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_exp_mont) -#define BN_mod_exp_mont_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_exp_mont_consttime) -#define BN_mod_exp_mont_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_exp_mont_word) -#define BN_mod_inverse BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_inverse) -#define BN_mod_inverse_blinded BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_inverse_blinded) -#define BN_mod_inverse_odd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_inverse_odd) -#define BN_mod_lshift BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_lshift) -#define BN_mod_lshift1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_lshift1) -#define BN_mod_lshift1_quick BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_lshift1_quick) -#define BN_mod_lshift_quick BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_lshift_quick) -#define BN_mod_mul BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_mul) -#define BN_mod_mul_montgomery BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_mul_montgomery) -#define BN_mod_pow2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_pow2) -#define BN_mod_sqr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_sqr) -#define BN_mod_sqrt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_sqrt) -#define BN_mod_sub BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_sub) -#define BN_mod_sub_quick BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_sub_quick) -#define BN_mod_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_word) -#define BN_mpi2bn BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mpi2bn) -#define BN_mul BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mul) -#define BN_mul_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mul_word) -#define BN_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_new) -#define BN_nnmod BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_nnmod) -#define BN_nnmod_pow2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_nnmod_pow2) -#define BN_num_bits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_num_bits) -#define BN_num_bits_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_num_bits_word) -#define BN_num_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_num_bytes) -#define BN_one BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_one) -#define BN_parse_asn1_unsigned BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_parse_asn1_unsigned) -#define BN_primality_test BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_primality_test) -#define BN_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_print) -#define BN_print_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_print_fp) -#define BN_pseudo_rand BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_pseudo_rand) -#define BN_pseudo_rand_range BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_pseudo_rand_range) -#define BN_rand BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_rand) -#define BN_rand_range BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_rand_range) -#define BN_rand_range_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_rand_range_ex) -#define BN_rshift BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_rshift) -#define BN_rshift1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_rshift1) -#define BN_set_bit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_set_bit) -#define BN_set_negative BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_set_negative) -#define BN_set_u64 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_set_u64) -#define BN_set_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_set_word) -#define BN_sqr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_sqr) -#define BN_sqrt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_sqrt) -#define BN_sub BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_sub) -#define BN_sub_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_sub_word) -#define BN_to_ASN1_ENUMERATED BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_to_ASN1_ENUMERATED) -#define BN_to_ASN1_INTEGER BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_to_ASN1_INTEGER) -#define BN_to_montgomery BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_to_montgomery) -#define BN_uadd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_uadd) -#define BN_ucmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_ucmp) -#define BN_usub BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_usub) -#define BN_value_one BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_value_one) -#define BN_zero BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_zero) -#define BORINGSSL_function_hit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BORINGSSL_function_hit) -#define BORINGSSL_self_test BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BORINGSSL_self_test) -#define BUF_MEM_append BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BUF_MEM_append) -#define BUF_MEM_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BUF_MEM_free) -#define BUF_MEM_grow BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BUF_MEM_grow) -#define BUF_MEM_grow_clean BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BUF_MEM_grow_clean) -#define BUF_MEM_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BUF_MEM_new) -#define BUF_MEM_reserve BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BUF_MEM_reserve) -#define BUF_memdup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BUF_memdup) -#define BUF_strdup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BUF_strdup) -#define BUF_strlcat BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BUF_strlcat) -#define BUF_strlcpy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BUF_strlcpy) -#define BUF_strndup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BUF_strndup) -#define BUF_strnlen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BUF_strnlen) -#define CBB_add_asn1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_asn1) -#define CBB_add_asn1_bool BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_asn1_bool) -#define CBB_add_asn1_octet_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_asn1_octet_string) -#define CBB_add_asn1_oid_from_text BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_asn1_oid_from_text) -#define CBB_add_asn1_uint64 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_asn1_uint64) -#define CBB_add_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_bytes) -#define CBB_add_space BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_space) -#define CBB_add_u16 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_u16) -#define CBB_add_u16_length_prefixed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_u16_length_prefixed) -#define CBB_add_u24 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_u24) -#define CBB_add_u24_length_prefixed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_u24_length_prefixed) -#define CBB_add_u32 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_u32) -#define CBB_add_u64 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_u64) -#define CBB_add_u8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_u8) -#define CBB_add_u8_length_prefixed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_u8_length_prefixed) -#define CBB_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_cleanup) -#define CBB_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_data) -#define CBB_did_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_did_write) -#define CBB_discard_child BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_discard_child) -#define CBB_finish BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_finish) -#define CBB_finish_i2d BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_finish_i2d) -#define CBB_flush BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_flush) -#define CBB_flush_asn1_set_of BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_flush_asn1_set_of) -#define CBB_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_init) -#define CBB_init_fixed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_init_fixed) -#define CBB_len BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_len) -#define CBB_reserve BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_reserve) -#define CBB_zero BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_zero) -#define CBS_asn1_ber_to_der BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_asn1_ber_to_der) -#define CBS_asn1_bitstring_has_bit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_asn1_bitstring_has_bit) -#define CBS_asn1_oid_to_text BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_asn1_oid_to_text) -#define CBS_contains_zero_byte BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_contains_zero_byte) -#define CBS_copy_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_copy_bytes) -#define CBS_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_data) -#define CBS_get_any_asn1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_any_asn1) -#define CBS_get_any_asn1_element BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_any_asn1_element) -#define CBS_get_any_ber_asn1_element BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_any_ber_asn1_element) -#define CBS_get_asn1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_asn1) -#define CBS_get_asn1_bool BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_asn1_bool) -#define CBS_get_asn1_element BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_asn1_element) -#define CBS_get_asn1_implicit_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_asn1_implicit_string) -#define CBS_get_asn1_uint64 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_asn1_uint64) -#define CBS_get_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_bytes) -#define CBS_get_last_u8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_last_u8) -#define CBS_get_optional_asn1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_optional_asn1) -#define CBS_get_optional_asn1_bool BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_optional_asn1_bool) -#define CBS_get_optional_asn1_octet_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_optional_asn1_octet_string) -#define CBS_get_optional_asn1_uint64 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_optional_asn1_uint64) -#define CBS_get_u16 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_u16) -#define CBS_get_u16_length_prefixed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_u16_length_prefixed) -#define CBS_get_u24 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_u24) -#define CBS_get_u24_length_prefixed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_u24_length_prefixed) -#define CBS_get_u32 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_u32) -#define CBS_get_u64 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_u64) -#define CBS_get_u8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_u8) -#define CBS_get_u8_length_prefixed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_u8_length_prefixed) -#define CBS_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_init) -#define CBS_is_valid_asn1_bitstring BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_is_valid_asn1_bitstring) -#define CBS_len BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_len) -#define CBS_mem_equal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_mem_equal) -#define CBS_peek_asn1_tag BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_peek_asn1_tag) -#define CBS_skip BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_skip) -#define CBS_stow BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_stow) -#define CBS_strdup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_strdup) -#define CERTIFICATEPOLICIES_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CERTIFICATEPOLICIES_free) -#define CERTIFICATEPOLICIES_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CERTIFICATEPOLICIES_it) -#define CERTIFICATEPOLICIES_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CERTIFICATEPOLICIES_new) -#define CMAC_CTX_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CMAC_CTX_copy) -#define CMAC_CTX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CMAC_CTX_free) -#define CMAC_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CMAC_CTX_new) -#define CMAC_Final BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CMAC_Final) -#define CMAC_Init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CMAC_Init) -#define CMAC_Reset BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CMAC_Reset) -#define CMAC_Update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CMAC_Update) -#define CONF_VALUE_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CONF_VALUE_new) -#define CONF_modules_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CONF_modules_free) -#define CONF_modules_load_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CONF_modules_load_file) -#define CONF_parse_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CONF_parse_list) -#define CRL_DIST_POINTS_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRL_DIST_POINTS_free) -#define CRL_DIST_POINTS_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRL_DIST_POINTS_it) -#define CRL_DIST_POINTS_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRL_DIST_POINTS_new) -#define CRYPTO_BUFFER_POOL_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_BUFFER_POOL_free) -#define CRYPTO_BUFFER_POOL_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_BUFFER_POOL_new) -#define CRYPTO_BUFFER_alloc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_BUFFER_alloc) -#define CRYPTO_BUFFER_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_BUFFER_data) -#define CRYPTO_BUFFER_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_BUFFER_free) -#define CRYPTO_BUFFER_init_CBS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_BUFFER_init_CBS) -#define CRYPTO_BUFFER_len BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_BUFFER_len) -#define CRYPTO_BUFFER_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_BUFFER_new) -#define CRYPTO_BUFFER_new_from_CBS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_BUFFER_new_from_CBS) -#define CRYPTO_BUFFER_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_BUFFER_up_ref) -#define CRYPTO_MUTEX_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_MUTEX_cleanup) -#define CRYPTO_MUTEX_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_MUTEX_init) -#define CRYPTO_MUTEX_lock_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_MUTEX_lock_read) -#define CRYPTO_MUTEX_lock_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_MUTEX_lock_write) -#define CRYPTO_MUTEX_unlock_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_MUTEX_unlock_read) -#define CRYPTO_MUTEX_unlock_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_MUTEX_unlock_write) -#define CRYPTO_POLYVAL_finish BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_POLYVAL_finish) -#define CRYPTO_POLYVAL_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_POLYVAL_init) -#define CRYPTO_POLYVAL_update_blocks BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_POLYVAL_update_blocks) -#define CRYPTO_STATIC_MUTEX_lock_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_STATIC_MUTEX_lock_read) -#define CRYPTO_STATIC_MUTEX_lock_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_STATIC_MUTEX_lock_write) -#define CRYPTO_STATIC_MUTEX_unlock_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_STATIC_MUTEX_unlock_read) -#define CRYPTO_STATIC_MUTEX_unlock_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_STATIC_MUTEX_unlock_write) -#define CRYPTO_THREADID_current BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_THREADID_current) -#define CRYPTO_THREADID_set_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_THREADID_set_callback) -#define CRYPTO_THREADID_set_numeric BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_THREADID_set_numeric) -#define CRYPTO_THREADID_set_pointer BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_THREADID_set_pointer) -#define CRYPTO_cbc128_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_cbc128_decrypt) -#define CRYPTO_cbc128_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_cbc128_encrypt) -#define CRYPTO_cfb128_1_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_cfb128_1_encrypt) -#define CRYPTO_cfb128_8_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_cfb128_8_encrypt) -#define CRYPTO_cfb128_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_cfb128_encrypt) -#define CRYPTO_chacha_20 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_chacha_20) -#define CRYPTO_cleanup_all_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_cleanup_all_ex_data) -#define CRYPTO_ctr128_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_ctr128_encrypt) -#define CRYPTO_ctr128_encrypt_ctr32 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_ctr128_encrypt_ctr32) -#define CRYPTO_free_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_free_ex_data) -#define CRYPTO_gcm128_aad BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_gcm128_aad) -#define CRYPTO_gcm128_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_gcm128_decrypt) -#define CRYPTO_gcm128_decrypt_ctr32 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_gcm128_decrypt_ctr32) -#define CRYPTO_gcm128_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_gcm128_encrypt) -#define CRYPTO_gcm128_encrypt_ctr32 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_gcm128_encrypt_ctr32) -#define CRYPTO_gcm128_finish BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_gcm128_finish) -#define CRYPTO_gcm128_init_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_gcm128_init_key) -#define CRYPTO_gcm128_setiv BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_gcm128_setiv) -#define CRYPTO_gcm128_tag BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_gcm128_tag) -#define CRYPTO_get_dynlock_create_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_get_dynlock_create_callback) -#define CRYPTO_get_dynlock_destroy_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_get_dynlock_destroy_callback) -#define CRYPTO_get_dynlock_lock_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_get_dynlock_lock_callback) -#define CRYPTO_get_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_get_ex_data) -#define CRYPTO_get_ex_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_get_ex_new_index) -#define CRYPTO_get_lock_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_get_lock_name) -#define CRYPTO_get_locking_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_get_locking_callback) -#define CRYPTO_get_thread_local BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_get_thread_local) -#define CRYPTO_ghash_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_ghash_init) -#define CRYPTO_has_asm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_has_asm) -#define CRYPTO_hchacha20 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_hchacha20) -#define CRYPTO_is_confidential_build BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_is_confidential_build) -#define CRYPTO_library_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_library_init) -#define CRYPTO_malloc_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_malloc_init) -#define CRYPTO_memcmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_memcmp) -#define CRYPTO_new_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_new_ex_data) -#define CRYPTO_num_locks BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_num_locks) -#define CRYPTO_ofb128_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_ofb128_encrypt) -#define CRYPTO_once BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_once) -#define CRYPTO_poly1305_finish BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_poly1305_finish) -#define CRYPTO_poly1305_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_poly1305_init) -#define CRYPTO_poly1305_update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_poly1305_update) -#define CRYPTO_rdrand BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_rdrand) -#define CRYPTO_rdrand_multiple8_buf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_rdrand_multiple8_buf) -#define CRYPTO_refcount_dec_and_test_zero BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_refcount_dec_and_test_zero) -#define CRYPTO_refcount_inc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_refcount_inc) -#define CRYPTO_set_add_lock_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_set_add_lock_callback) -#define CRYPTO_set_dynlock_create_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_set_dynlock_create_callback) -#define CRYPTO_set_dynlock_destroy_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_set_dynlock_destroy_callback) -#define CRYPTO_set_dynlock_lock_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_set_dynlock_lock_callback) -#define CRYPTO_set_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_set_ex_data) -#define CRYPTO_set_id_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_set_id_callback) -#define CRYPTO_set_locking_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_set_locking_callback) -#define CRYPTO_set_thread_local BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_set_thread_local) -#define CRYPTO_sysrand BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_sysrand) -#define CRYPTO_tls1_prf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_tls1_prf) -#define CTR_DRBG_clear BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CTR_DRBG_clear) -#define CTR_DRBG_generate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CTR_DRBG_generate) -#define CTR_DRBG_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CTR_DRBG_init) -#define CTR_DRBG_reseed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CTR_DRBG_reseed) -#define ChaCha20_ctr32 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ChaCha20_ctr32) -#define DES_decrypt3 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DES_decrypt3) -#define DES_ecb3_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DES_ecb3_encrypt) -#define DES_ecb_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DES_ecb_encrypt) -#define DES_ede2_cbc_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DES_ede2_cbc_encrypt) -#define DES_ede3_cbc_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DES_ede3_cbc_encrypt) -#define DES_encrypt3 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DES_encrypt3) -#define DES_ncbc_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DES_ncbc_encrypt) -#define DES_set_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DES_set_key) -#define DES_set_key_unchecked BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DES_set_key_unchecked) -#define DES_set_odd_parity BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DES_set_odd_parity) -#define DH_check BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_check) -#define DH_check_pub_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_check_pub_key) -#define DH_compute_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_compute_key) -#define DH_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_free) -#define DH_generate_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_generate_key) -#define DH_generate_parameters_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_generate_parameters_ex) -#define DH_get0_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_get0_key) -#define DH_get0_pqg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_get0_pqg) -#define DH_get_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_get_ex_data) -#define DH_get_ex_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_get_ex_new_index) -#define DH_marshal_parameters BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_marshal_parameters) -#define DH_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_new) -#define DH_num_bits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_num_bits) -#define DH_parse_parameters BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_parse_parameters) -#define DH_set0_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_set0_key) -#define DH_set0_pqg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_set0_pqg) -#define DH_set_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_set_ex_data) -#define DH_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_size) -#define DH_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_up_ref) -#define DHparams_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DHparams_dup) -#define DIRECTORYSTRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DIRECTORYSTRING_free) -#define DIRECTORYSTRING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DIRECTORYSTRING_it) -#define DIRECTORYSTRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DIRECTORYSTRING_new) -#define DISPLAYTEXT_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DISPLAYTEXT_free) -#define DISPLAYTEXT_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DISPLAYTEXT_it) -#define DISPLAYTEXT_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DISPLAYTEXT_new) -#define DIST_POINT_NAME_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DIST_POINT_NAME_free) -#define DIST_POINT_NAME_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DIST_POINT_NAME_it) -#define DIST_POINT_NAME_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DIST_POINT_NAME_new) -#define DIST_POINT_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DIST_POINT_free) -#define DIST_POINT_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DIST_POINT_it) -#define DIST_POINT_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DIST_POINT_new) -#define DIST_POINT_set_dpname BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DIST_POINT_set_dpname) -#define DSA_SIG_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_SIG_free) -#define DSA_SIG_marshal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_SIG_marshal) -#define DSA_SIG_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_SIG_new) -#define DSA_SIG_parse BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_SIG_parse) -#define DSA_check_signature BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_check_signature) -#define DSA_do_check_signature BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_do_check_signature) -#define DSA_do_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_do_sign) -#define DSA_do_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_do_verify) -#define DSA_dup_DH BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_dup_DH) -#define DSA_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_free) -#define DSA_generate_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_generate_key) -#define DSA_generate_parameters_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_generate_parameters_ex) -#define DSA_get0_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_get0_key) -#define DSA_get0_pqg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_get0_pqg) -#define DSA_get_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_get_ex_data) -#define DSA_get_ex_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_get_ex_new_index) -#define DSA_marshal_parameters BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_marshal_parameters) -#define DSA_marshal_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_marshal_private_key) -#define DSA_marshal_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_marshal_public_key) -#define DSA_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_new) -#define DSA_parse_parameters BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_parse_parameters) -#define DSA_parse_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_parse_private_key) -#define DSA_parse_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_parse_public_key) -#define DSA_set0_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_set0_key) -#define DSA_set0_pqg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_set0_pqg) -#define DSA_set_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_set_ex_data) -#define DSA_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_sign) -#define DSA_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_size) -#define DSA_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_up_ref) -#define DSA_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_verify) -#define DSAparams_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSAparams_dup) -#define ECDH_compute_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDH_compute_key) -#define ECDH_compute_key_fips BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDH_compute_key_fips) -#define ECDSA_SIG_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDSA_SIG_free) -#define ECDSA_SIG_from_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDSA_SIG_from_bytes) -#define ECDSA_SIG_get0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDSA_SIG_get0) -#define ECDSA_SIG_marshal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDSA_SIG_marshal) -#define ECDSA_SIG_max_len BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDSA_SIG_max_len) -#define ECDSA_SIG_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDSA_SIG_new) -#define ECDSA_SIG_parse BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDSA_SIG_parse) -#define ECDSA_SIG_set0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDSA_SIG_set0) -#define ECDSA_SIG_to_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDSA_SIG_to_bytes) -#define ECDSA_do_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDSA_do_sign) -#define ECDSA_do_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDSA_do_verify) -#define ECDSA_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDSA_sign) -#define ECDSA_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDSA_size) -#define ECDSA_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDSA_verify) -#define EC_GFp_mont_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GFp_mont_method) -#define EC_GFp_nistp224_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GFp_nistp224_method) -#define EC_GFp_nistp256_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GFp_nistp256_method) -#define EC_GFp_nistz256_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GFp_nistz256_method) -#define EC_GROUP_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_cmp) -#define EC_GROUP_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_dup) -#define EC_GROUP_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_free) -#define EC_GROUP_get0_generator BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_get0_generator) -#define EC_GROUP_get0_order BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_get0_order) -#define EC_GROUP_get_cofactor BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_get_cofactor) -#define EC_GROUP_get_curve_GFp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_get_curve_GFp) -#define EC_GROUP_get_curve_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_get_curve_name) -#define EC_GROUP_get_degree BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_get_degree) -#define EC_GROUP_get_order BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_get_order) -#define EC_GROUP_method_of BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_method_of) -#define EC_GROUP_new_by_curve_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_new_by_curve_name) -#define EC_GROUP_new_curve_GFp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_new_curve_GFp) -#define EC_GROUP_order_bits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_order_bits) -#define EC_GROUP_set_asn1_flag BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_set_asn1_flag) -#define EC_GROUP_set_generator BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_set_generator) -#define EC_GROUP_set_point_conversion_form BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_set_point_conversion_form) -#define EC_KEY_check_fips BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_check_fips) -#define EC_KEY_check_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_check_key) -#define EC_KEY_derive_from_secret BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_derive_from_secret) -#define EC_KEY_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_dup) -#define EC_KEY_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_free) -#define EC_KEY_generate_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_generate_key) -#define EC_KEY_generate_key_fips BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_generate_key_fips) -#define EC_KEY_get0_group BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_get0_group) -#define EC_KEY_get0_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_get0_private_key) -#define EC_KEY_get0_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_get0_public_key) -#define EC_KEY_get_conv_form BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_get_conv_form) -#define EC_KEY_get_enc_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_get_enc_flags) -#define EC_KEY_get_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_get_ex_data) -#define EC_KEY_get_ex_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_get_ex_new_index) -#define EC_KEY_is_opaque BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_is_opaque) -#define EC_KEY_key2buf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_key2buf) -#define EC_KEY_marshal_curve_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_marshal_curve_name) -#define EC_KEY_marshal_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_marshal_private_key) -#define EC_KEY_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_new) -#define EC_KEY_new_by_curve_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_new_by_curve_name) -#define EC_KEY_new_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_new_method) -#define EC_KEY_parse_curve_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_parse_curve_name) -#define EC_KEY_parse_parameters BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_parse_parameters) -#define EC_KEY_parse_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_parse_private_key) -#define EC_KEY_set_asn1_flag BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_set_asn1_flag) -#define EC_KEY_set_conv_form BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_set_conv_form) -#define EC_KEY_set_enc_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_set_enc_flags) -#define EC_KEY_set_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_set_ex_data) -#define EC_KEY_set_group BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_set_group) -#define EC_KEY_set_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_set_private_key) -#define EC_KEY_set_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_set_public_key) -#define EC_KEY_set_public_key_affine_coordinates BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_set_public_key_affine_coordinates) -#define EC_KEY_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_up_ref) -#define EC_METHOD_get_field_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_METHOD_get_field_type) -#define EC_POINT_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_add) -#define EC_POINT_clear_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_clear_free) -#define EC_POINT_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_cmp) -#define EC_POINT_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_copy) -#define EC_POINT_dbl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_dbl) -#define EC_POINT_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_dup) -#define EC_POINT_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_free) -#define EC_POINT_get_affine_coordinates_GFp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_get_affine_coordinates_GFp) -#define EC_POINT_invert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_invert) -#define EC_POINT_is_at_infinity BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_is_at_infinity) -#define EC_POINT_is_on_curve BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_is_on_curve) -#define EC_POINT_mul BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_mul) -#define EC_POINT_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_new) -#define EC_POINT_oct2point BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_oct2point) -#define EC_POINT_point2cbb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_point2cbb) -#define EC_POINT_point2oct BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_point2oct) -#define EC_POINT_set_affine_coordinates_GFp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_set_affine_coordinates_GFp) -#define EC_POINT_set_compressed_coordinates_GFp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_set_compressed_coordinates_GFp) -#define EC_POINT_set_to_infinity BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_set_to_infinity) -#define EC_curve_nid2nist BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_curve_nid2nist) -#define EC_curve_nist2nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_curve_nist2nid) -#define EC_get_builtin_curves BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_get_builtin_curves) -#define ED25519_keypair BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ED25519_keypair) -#define ED25519_keypair_from_seed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ED25519_keypair_from_seed) -#define ED25519_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ED25519_sign) -#define ED25519_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ED25519_verify) -#define EDIPARTYNAME_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EDIPARTYNAME_free) -#define EDIPARTYNAME_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EDIPARTYNAME_it) -#define EDIPARTYNAME_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EDIPARTYNAME_new) -#define ENGINE_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ENGINE_free) -#define ENGINE_get_ECDSA_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ENGINE_get_ECDSA_method) -#define ENGINE_get_RSA_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ENGINE_get_RSA_method) -#define ENGINE_load_builtin_engines BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ENGINE_load_builtin_engines) -#define ENGINE_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ENGINE_new) -#define ENGINE_register_all_complete BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ENGINE_register_all_complete) -#define ENGINE_set_ECDSA_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ENGINE_set_ECDSA_method) -#define ENGINE_set_RSA_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ENGINE_set_RSA_method) -#define ERR_SAVE_STATE_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_SAVE_STATE_free) -#define ERR_add_error_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_add_error_data) -#define ERR_add_error_dataf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_add_error_dataf) -#define ERR_clear_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_clear_error) -#define ERR_clear_system_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_clear_system_error) -#define ERR_error_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_error_string) -#define ERR_error_string_n BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_error_string_n) -#define ERR_free_strings BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_free_strings) -#define ERR_func_error_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_func_error_string) -#define ERR_get_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_get_error) -#define ERR_get_error_line BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_get_error_line) -#define ERR_get_error_line_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_get_error_line_data) -#define ERR_get_next_error_library BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_get_next_error_library) -#define ERR_lib_error_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_lib_error_string) -#define ERR_load_BIO_strings BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_load_BIO_strings) -#define ERR_load_ERR_strings BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_load_ERR_strings) -#define ERR_load_RAND_strings BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_load_RAND_strings) -#define ERR_load_crypto_strings BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_load_crypto_strings) -#define ERR_peek_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_peek_error) -#define ERR_peek_error_line BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_peek_error_line) -#define ERR_peek_error_line_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_peek_error_line_data) -#define ERR_peek_last_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_peek_last_error) -#define ERR_peek_last_error_line BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_peek_last_error_line) -#define ERR_peek_last_error_line_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_peek_last_error_line_data) -#define ERR_pop_to_mark BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_pop_to_mark) -#define ERR_print_errors BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_print_errors) -#define ERR_print_errors_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_print_errors_cb) -#define ERR_print_errors_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_print_errors_fp) -#define ERR_put_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_put_error) -#define ERR_reason_error_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_reason_error_string) -#define ERR_remove_state BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_remove_state) -#define ERR_remove_thread_state BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_remove_thread_state) -#define ERR_restore_state BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_restore_state) -#define ERR_save_state BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_save_state) -#define ERR_set_mark BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_set_mark) -#define EVP_AEAD_CTX_aead BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_CTX_aead) -#define EVP_AEAD_CTX_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_CTX_cleanup) -#define EVP_AEAD_CTX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_CTX_free) -#define EVP_AEAD_CTX_get_iv BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_CTX_get_iv) -#define EVP_AEAD_CTX_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_CTX_init) -#define EVP_AEAD_CTX_init_with_direction BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_CTX_init_with_direction) -#define EVP_AEAD_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_CTX_new) -#define EVP_AEAD_CTX_open BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_CTX_open) -#define EVP_AEAD_CTX_open_gather BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_CTX_open_gather) -#define EVP_AEAD_CTX_seal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_CTX_seal) -#define EVP_AEAD_CTX_seal_scatter BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_CTX_seal_scatter) -#define EVP_AEAD_CTX_tag_len BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_CTX_tag_len) -#define EVP_AEAD_CTX_zero BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_CTX_zero) -#define EVP_AEAD_key_length BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_key_length) -#define EVP_AEAD_max_overhead BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_max_overhead) -#define EVP_AEAD_max_tag_len BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_max_tag_len) -#define EVP_AEAD_nonce_length BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_nonce_length) -#define EVP_BytesToKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_BytesToKey) -#define EVP_CIPHER_CTX_block_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_block_size) -#define EVP_CIPHER_CTX_cipher BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_cipher) -#define EVP_CIPHER_CTX_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_cleanup) -#define EVP_CIPHER_CTX_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_copy) -#define EVP_CIPHER_CTX_ctrl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_ctrl) -#define EVP_CIPHER_CTX_encrypting BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_encrypting) -#define EVP_CIPHER_CTX_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_flags) -#define EVP_CIPHER_CTX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_free) -#define EVP_CIPHER_CTX_get_app_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_get_app_data) -#define EVP_CIPHER_CTX_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_init) -#define EVP_CIPHER_CTX_iv_length BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_iv_length) -#define EVP_CIPHER_CTX_key_length BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_key_length) -#define EVP_CIPHER_CTX_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_mode) -#define EVP_CIPHER_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_new) -#define EVP_CIPHER_CTX_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_nid) -#define EVP_CIPHER_CTX_reset BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_reset) -#define EVP_CIPHER_CTX_set_app_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_set_app_data) -#define EVP_CIPHER_CTX_set_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_set_flags) -#define EVP_CIPHER_CTX_set_key_length BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_set_key_length) -#define EVP_CIPHER_CTX_set_padding BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_set_padding) -#define EVP_CIPHER_block_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_block_size) -#define EVP_CIPHER_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_flags) -#define EVP_CIPHER_iv_length BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_iv_length) -#define EVP_CIPHER_key_length BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_key_length) -#define EVP_CIPHER_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_mode) -#define EVP_CIPHER_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_nid) -#define EVP_Cipher BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_Cipher) -#define EVP_CipherFinal_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CipherFinal_ex) -#define EVP_CipherInit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CipherInit) -#define EVP_CipherInit_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CipherInit_ex) -#define EVP_CipherUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CipherUpdate) -#define EVP_DecodeBase64 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DecodeBase64) -#define EVP_DecodeBlock BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DecodeBlock) -#define EVP_DecodeFinal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DecodeFinal) -#define EVP_DecodeInit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DecodeInit) -#define EVP_DecodeUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DecodeUpdate) -#define EVP_DecodedLength BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DecodedLength) -#define EVP_DecryptFinal_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DecryptFinal_ex) -#define EVP_DecryptInit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DecryptInit) -#define EVP_DecryptInit_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DecryptInit_ex) -#define EVP_DecryptUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DecryptUpdate) -#define EVP_Digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_Digest) -#define EVP_DigestFinal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DigestFinal) -#define EVP_DigestFinalXOF BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DigestFinalXOF) -#define EVP_DigestFinal_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DigestFinal_ex) -#define EVP_DigestInit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DigestInit) -#define EVP_DigestInit_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DigestInit_ex) -#define EVP_DigestSign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DigestSign) -#define EVP_DigestSignFinal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DigestSignFinal) -#define EVP_DigestSignInit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DigestSignInit) -#define EVP_DigestSignUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DigestSignUpdate) -#define EVP_DigestUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DigestUpdate) -#define EVP_DigestVerify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DigestVerify) -#define EVP_DigestVerifyFinal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DigestVerifyFinal) -#define EVP_DigestVerifyInit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DigestVerifyInit) -#define EVP_DigestVerifyUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DigestVerifyUpdate) -#define EVP_EncodeBlock BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_EncodeBlock) -#define EVP_EncodeFinal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_EncodeFinal) -#define EVP_EncodeInit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_EncodeInit) -#define EVP_EncodeUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_EncodeUpdate) -#define EVP_EncodedLength BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_EncodedLength) -#define EVP_EncryptFinal_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_EncryptFinal_ex) -#define EVP_EncryptInit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_EncryptInit) -#define EVP_EncryptInit_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_EncryptInit_ex) -#define EVP_EncryptUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_EncryptUpdate) -#define EVP_MD_CTX_block_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_CTX_block_size) -#define EVP_MD_CTX_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_CTX_cleanup) -#define EVP_MD_CTX_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_CTX_copy) -#define EVP_MD_CTX_copy_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_CTX_copy_ex) -#define EVP_MD_CTX_create BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_CTX_create) -#define EVP_MD_CTX_destroy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_CTX_destroy) -#define EVP_MD_CTX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_CTX_free) -#define EVP_MD_CTX_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_CTX_init) -#define EVP_MD_CTX_md BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_CTX_md) -#define EVP_MD_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_CTX_new) -#define EVP_MD_CTX_reset BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_CTX_reset) -#define EVP_MD_CTX_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_CTX_size) -#define EVP_MD_CTX_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_CTX_type) -#define EVP_MD_block_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_block_size) -#define EVP_MD_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_flags) -#define EVP_MD_meth_get_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_meth_get_flags) -#define EVP_MD_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_size) -#define EVP_MD_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_type) -#define EVP_PBE_scrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PBE_scrypt) -#define EVP_PKCS82PKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKCS82PKEY) -#define EVP_PKEY2PKCS8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY2PKCS8) -#define EVP_PKEY_CTX_ctrl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_ctrl) -#define EVP_PKEY_CTX_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_dup) -#define EVP_PKEY_CTX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_free) -#define EVP_PKEY_CTX_get0_pkey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_get0_pkey) -#define EVP_PKEY_CTX_get0_rsa_oaep_label BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_get0_rsa_oaep_label) -#define EVP_PKEY_CTX_get_rsa_mgf1_md BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_get_rsa_mgf1_md) -#define EVP_PKEY_CTX_get_rsa_oaep_md BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_get_rsa_oaep_md) -#define EVP_PKEY_CTX_get_rsa_padding BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_get_rsa_padding) -#define EVP_PKEY_CTX_get_rsa_pss_saltlen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_get_rsa_pss_saltlen) -#define EVP_PKEY_CTX_get_signature_md BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_get_signature_md) -#define EVP_PKEY_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_new) -#define EVP_PKEY_CTX_new_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_new_id) -#define EVP_PKEY_CTX_set0_rsa_oaep_label BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_set0_rsa_oaep_label) -#define EVP_PKEY_CTX_set_ec_param_enc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_set_ec_param_enc) -#define EVP_PKEY_CTX_set_ec_paramgen_curve_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_set_ec_paramgen_curve_nid) -#define EVP_PKEY_CTX_set_rsa_keygen_bits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_set_rsa_keygen_bits) -#define EVP_PKEY_CTX_set_rsa_keygen_pubexp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_set_rsa_keygen_pubexp) -#define EVP_PKEY_CTX_set_rsa_mgf1_md BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_set_rsa_mgf1_md) -#define EVP_PKEY_CTX_set_rsa_oaep_md BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_set_rsa_oaep_md) -#define EVP_PKEY_CTX_set_rsa_padding BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_set_rsa_padding) -#define EVP_PKEY_CTX_set_rsa_pss_saltlen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_set_rsa_pss_saltlen) -#define EVP_PKEY_CTX_set_signature_md BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_set_signature_md) -#define EVP_PKEY_assign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_assign) -#define EVP_PKEY_assign_DSA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_assign_DSA) -#define EVP_PKEY_assign_EC_KEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_assign_EC_KEY) -#define EVP_PKEY_assign_RSA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_assign_RSA) -#define EVP_PKEY_base_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_base_id) -#define EVP_PKEY_bits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_bits) -#define EVP_PKEY_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_cmp) -#define EVP_PKEY_cmp_parameters BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_cmp_parameters) -#define EVP_PKEY_copy_parameters BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_copy_parameters) -#define EVP_PKEY_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_decrypt) -#define EVP_PKEY_decrypt_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_decrypt_init) -#define EVP_PKEY_derive BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_derive) -#define EVP_PKEY_derive_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_derive_init) -#define EVP_PKEY_derive_set_peer BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_derive_set_peer) -#define EVP_PKEY_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_encrypt) -#define EVP_PKEY_encrypt_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_encrypt_init) -#define EVP_PKEY_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_free) -#define EVP_PKEY_get0_DH BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_get0_DH) -#define EVP_PKEY_get0_DSA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_get0_DSA) -#define EVP_PKEY_get0_EC_KEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_get0_EC_KEY) -#define EVP_PKEY_get0_RSA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_get0_RSA) -#define EVP_PKEY_get1_DH BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_get1_DH) -#define EVP_PKEY_get1_DSA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_get1_DSA) -#define EVP_PKEY_get1_EC_KEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_get1_EC_KEY) -#define EVP_PKEY_get1_RSA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_get1_RSA) -#define EVP_PKEY_get1_tls_encodedpoint BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_get1_tls_encodedpoint) -#define EVP_PKEY_get_raw_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_get_raw_private_key) -#define EVP_PKEY_get_raw_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_get_raw_public_key) -#define EVP_PKEY_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_id) -#define EVP_PKEY_is_opaque BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_is_opaque) -#define EVP_PKEY_keygen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_keygen) -#define EVP_PKEY_keygen_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_keygen_init) -#define EVP_PKEY_missing_parameters BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_missing_parameters) -#define EVP_PKEY_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_new) -#define EVP_PKEY_new_raw_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_new_raw_private_key) -#define EVP_PKEY_new_raw_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_new_raw_public_key) -#define EVP_PKEY_paramgen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_paramgen) -#define EVP_PKEY_paramgen_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_paramgen_init) -#define EVP_PKEY_print_params BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_print_params) -#define EVP_PKEY_print_private BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_print_private) -#define EVP_PKEY_print_public BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_print_public) -#define EVP_PKEY_set1_DSA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_set1_DSA) -#define EVP_PKEY_set1_EC_KEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_set1_EC_KEY) -#define EVP_PKEY_set1_RSA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_set1_RSA) -#define EVP_PKEY_set1_tls_encodedpoint BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_set1_tls_encodedpoint) -#define EVP_PKEY_set_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_set_type) -#define EVP_PKEY_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_sign) -#define EVP_PKEY_sign_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_sign_init) -#define EVP_PKEY_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_size) -#define EVP_PKEY_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_type) -#define EVP_PKEY_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_up_ref) -#define EVP_PKEY_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_verify) -#define EVP_PKEY_verify_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_verify_init) -#define EVP_PKEY_verify_recover BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_verify_recover) -#define EVP_PKEY_verify_recover_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_verify_recover_init) -#define EVP_SignFinal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_SignFinal) -#define EVP_SignInit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_SignInit) -#define EVP_SignInit_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_SignInit_ex) -#define EVP_SignUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_SignUpdate) -#define EVP_VerifyFinal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_VerifyFinal) -#define EVP_VerifyInit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_VerifyInit) -#define EVP_VerifyInit_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_VerifyInit_ex) -#define EVP_VerifyUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_VerifyUpdate) -#define EVP_add_cipher_alias BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_add_cipher_alias) -#define EVP_add_digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_add_digest) -#define EVP_aead_aes_128_cbc_sha1_tls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_128_cbc_sha1_tls) -#define EVP_aead_aes_128_cbc_sha1_tls_implicit_iv BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_128_cbc_sha1_tls_implicit_iv) -#define EVP_aead_aes_128_cbc_sha256_tls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_128_cbc_sha256_tls) -#define EVP_aead_aes_128_ccm_bluetooth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_128_ccm_bluetooth) -#define EVP_aead_aes_128_ccm_bluetooth_8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_128_ccm_bluetooth_8) -#define EVP_aead_aes_128_ctr_hmac_sha256 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_128_ctr_hmac_sha256) -#define EVP_aead_aes_128_gcm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_128_gcm) -#define EVP_aead_aes_128_gcm_siv BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_128_gcm_siv) -#define EVP_aead_aes_128_gcm_tls12 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_128_gcm_tls12) -#define EVP_aead_aes_128_gcm_tls13 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_128_gcm_tls13) -#define EVP_aead_aes_192_gcm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_192_gcm) -#define EVP_aead_aes_256_cbc_sha1_tls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_256_cbc_sha1_tls) -#define EVP_aead_aes_256_cbc_sha1_tls_implicit_iv BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_256_cbc_sha1_tls_implicit_iv) -#define EVP_aead_aes_256_cbc_sha256_tls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_256_cbc_sha256_tls) -#define EVP_aead_aes_256_cbc_sha384_tls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_256_cbc_sha384_tls) -#define EVP_aead_aes_256_ctr_hmac_sha256 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_256_ctr_hmac_sha256) -#define EVP_aead_aes_256_gcm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_256_gcm) -#define EVP_aead_aes_256_gcm_siv BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_256_gcm_siv) -#define EVP_aead_aes_256_gcm_tls12 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_256_gcm_tls12) -#define EVP_aead_aes_256_gcm_tls13 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_256_gcm_tls13) -#define EVP_aead_chacha20_poly1305 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_chacha20_poly1305) -#define EVP_aead_des_ede3_cbc_sha1_tls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_des_ede3_cbc_sha1_tls) -#define EVP_aead_des_ede3_cbc_sha1_tls_implicit_iv BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_des_ede3_cbc_sha1_tls_implicit_iv) -#define EVP_aead_null_sha1_tls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_null_sha1_tls) -#define EVP_aead_xchacha20_poly1305 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_xchacha20_poly1305) -#define EVP_aes_128_cbc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_128_cbc) -#define EVP_aes_128_ctr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_128_ctr) -#define EVP_aes_128_ecb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_128_ecb) -#define EVP_aes_128_gcm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_128_gcm) -#define EVP_aes_128_ofb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_128_ofb) -#define EVP_aes_192_cbc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_192_cbc) -#define EVP_aes_192_ctr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_192_ctr) -#define EVP_aes_192_ecb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_192_ecb) -#define EVP_aes_192_gcm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_192_gcm) -#define EVP_aes_192_ofb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_192_ofb) -#define EVP_aes_256_cbc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_256_cbc) -#define EVP_aes_256_ctr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_256_ctr) -#define EVP_aes_256_ecb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_256_ecb) -#define EVP_aes_256_gcm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_256_gcm) -#define EVP_aes_256_ofb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_256_ofb) -#define EVP_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_cleanup) -#define EVP_des_cbc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_des_cbc) -#define EVP_des_ecb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_des_ecb) -#define EVP_des_ede BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_des_ede) -#define EVP_des_ede3 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_des_ede3) -#define EVP_des_ede3_cbc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_des_ede3_cbc) -#define EVP_des_ede3_ecb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_des_ede3_ecb) -#define EVP_des_ede_cbc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_des_ede_cbc) -#define EVP_enc_null BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_enc_null) -#define EVP_get_cipherbyname BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_get_cipherbyname) -#define EVP_get_cipherbynid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_get_cipherbynid) -#define EVP_get_digestbyname BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_get_digestbyname) -#define EVP_get_digestbynid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_get_digestbynid) -#define EVP_get_digestbyobj BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_get_digestbyobj) -#define EVP_has_aes_hardware BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_has_aes_hardware) -#define EVP_marshal_digest_algorithm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_marshal_digest_algorithm) -#define EVP_marshal_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_marshal_private_key) -#define EVP_marshal_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_marshal_public_key) -#define EVP_md4 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_md4) -#define EVP_md5 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_md5) -#define EVP_md5_sha1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_md5_sha1) -#define EVP_parse_digest_algorithm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_parse_digest_algorithm) -#define EVP_parse_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_parse_private_key) -#define EVP_parse_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_parse_public_key) -#define EVP_rc2_40_cbc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_rc2_40_cbc) -#define EVP_rc2_cbc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_rc2_cbc) -#define EVP_rc4 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_rc4) -#define EVP_sha1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_sha1) -#define EVP_sha224 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_sha224) -#define EVP_sha256 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_sha256) -#define EVP_sha384 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_sha384) -#define EVP_sha512 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_sha512) -#define EVP_tls_cbc_copy_mac BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_tls_cbc_copy_mac) -#define EVP_tls_cbc_digest_record BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_tls_cbc_digest_record) -#define EVP_tls_cbc_record_digest_supported BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_tls_cbc_record_digest_supported) -#define EVP_tls_cbc_remove_padding BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_tls_cbc_remove_padding) -#define EXTENDED_KEY_USAGE_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EXTENDED_KEY_USAGE_free) -#define EXTENDED_KEY_USAGE_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EXTENDED_KEY_USAGE_it) -#define EXTENDED_KEY_USAGE_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EXTENDED_KEY_USAGE_new) -#define FIPS_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, FIPS_mode) -#define FIPS_mode_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, FIPS_mode_set) -#define GENERAL_NAMES_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_NAMES_free) -#define GENERAL_NAMES_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_NAMES_it) -#define GENERAL_NAMES_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_NAMES_new) -#define GENERAL_NAME_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_NAME_cmp) -#define GENERAL_NAME_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_NAME_dup) -#define GENERAL_NAME_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_NAME_free) -#define GENERAL_NAME_get0_otherName BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_NAME_get0_otherName) -#define GENERAL_NAME_get0_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_NAME_get0_value) -#define GENERAL_NAME_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_NAME_it) -#define GENERAL_NAME_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_NAME_new) -#define GENERAL_NAME_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_NAME_print) -#define GENERAL_NAME_set0_othername BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_NAME_set0_othername) -#define GENERAL_NAME_set0_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_NAME_set0_value) -#define GENERAL_SUBTREE_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_SUBTREE_free) -#define GENERAL_SUBTREE_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_SUBTREE_it) -#define GENERAL_SUBTREE_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_SUBTREE_new) -#define HKDF BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HKDF) -#define HKDF_expand BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HKDF_expand) -#define HKDF_extract BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HKDF_extract) -#define HMAC BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HMAC) -#define HMAC_CTX_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HMAC_CTX_cleanup) -#define HMAC_CTX_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HMAC_CTX_copy) -#define HMAC_CTX_copy_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HMAC_CTX_copy_ex) -#define HMAC_CTX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HMAC_CTX_free) -#define HMAC_CTX_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HMAC_CTX_init) -#define HMAC_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HMAC_CTX_new) -#define HMAC_CTX_reset BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HMAC_CTX_reset) -#define HMAC_Final BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HMAC_Final) -#define HMAC_Init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HMAC_Init) -#define HMAC_Init_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HMAC_Init_ex) -#define HMAC_Update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HMAC_Update) -#define HMAC_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HMAC_size) -#define HRSS_decap BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HRSS_decap) -#define HRSS_encap BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HRSS_encap) -#define HRSS_generate_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HRSS_generate_key) -#define HRSS_marshal_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HRSS_marshal_public_key) -#define HRSS_parse_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HRSS_parse_public_key) -#define HRSS_poly2_rotr_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HRSS_poly2_rotr_consttime) -#define HRSS_poly3_invert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HRSS_poly3_invert) -#define HRSS_poly3_mul BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HRSS_poly3_mul) -#define ISSUING_DIST_POINT_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ISSUING_DIST_POINT_free) -#define ISSUING_DIST_POINT_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ISSUING_DIST_POINT_it) -#define ISSUING_DIST_POINT_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ISSUING_DIST_POINT_new) -#define MD4 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, MD4) -#define MD4_Final BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, MD4_Final) -#define MD4_Init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, MD4_Init) -#define MD4_Transform BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, MD4_Transform) -#define MD4_Update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, MD4_Update) -#define MD5 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, MD5) -#define MD5_Final BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, MD5_Final) -#define MD5_Init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, MD5_Init) -#define MD5_Transform BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, MD5_Transform) -#define MD5_Update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, MD5_Update) -#define METHOD_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, METHOD_ref) -#define METHOD_unref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, METHOD_unref) -#define NAME_CONSTRAINTS_check BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NAME_CONSTRAINTS_check) -#define NAME_CONSTRAINTS_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NAME_CONSTRAINTS_free) -#define NAME_CONSTRAINTS_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NAME_CONSTRAINTS_it) -#define NAME_CONSTRAINTS_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NAME_CONSTRAINTS_new) -#define NCONF_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NCONF_free) -#define NCONF_get_section BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NCONF_get_section) -#define NCONF_get_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NCONF_get_string) -#define NCONF_load BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NCONF_load) -#define NCONF_load_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NCONF_load_bio) -#define NCONF_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NCONF_new) -#define NETSCAPE_SPKAC_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NETSCAPE_SPKAC_free) -#define NETSCAPE_SPKAC_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NETSCAPE_SPKAC_it) -#define NETSCAPE_SPKAC_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NETSCAPE_SPKAC_new) -#define NETSCAPE_SPKI_b64_decode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NETSCAPE_SPKI_b64_decode) -#define NETSCAPE_SPKI_b64_encode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NETSCAPE_SPKI_b64_encode) -#define NETSCAPE_SPKI_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NETSCAPE_SPKI_free) -#define NETSCAPE_SPKI_get_pubkey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NETSCAPE_SPKI_get_pubkey) -#define NETSCAPE_SPKI_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NETSCAPE_SPKI_it) -#define NETSCAPE_SPKI_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NETSCAPE_SPKI_new) -#define NETSCAPE_SPKI_set_pubkey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NETSCAPE_SPKI_set_pubkey) -#define NETSCAPE_SPKI_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NETSCAPE_SPKI_sign) -#define NETSCAPE_SPKI_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NETSCAPE_SPKI_verify) -#define NOTICEREF_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NOTICEREF_free) -#define NOTICEREF_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NOTICEREF_it) -#define NOTICEREF_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NOTICEREF_new) -#define OBJ_cbs2nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_cbs2nid) -#define OBJ_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_cleanup) -#define OBJ_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_cmp) -#define OBJ_create BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_create) -#define OBJ_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_dup) -#define OBJ_find_sigid_algs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_find_sigid_algs) -#define OBJ_find_sigid_by_algs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_find_sigid_by_algs) -#define OBJ_get0_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_get0_data) -#define OBJ_length BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_length) -#define OBJ_ln2nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_ln2nid) -#define OBJ_nid2cbb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_nid2cbb) -#define OBJ_nid2ln BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_nid2ln) -#define OBJ_nid2obj BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_nid2obj) -#define OBJ_nid2sn BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_nid2sn) -#define OBJ_obj2nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_obj2nid) -#define OBJ_obj2txt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_obj2txt) -#define OBJ_sn2nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_sn2nid) -#define OBJ_txt2nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_txt2nid) -#define OBJ_txt2obj BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_txt2obj) -#define OPENSSL_add_all_algorithms_conf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_add_all_algorithms_conf) -#define OPENSSL_built_in_curves BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_built_in_curves) -#define OPENSSL_cleanse BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_cleanse) -#define OPENSSL_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_cleanup) -#define OPENSSL_clear_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_clear_free) -#define OPENSSL_config BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_config) -#define OPENSSL_cpuid_setup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_cpuid_setup) -#define OPENSSL_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_free) -#define OPENSSL_gmtime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_gmtime) -#define OPENSSL_gmtime_adj BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_gmtime_adj) -#define OPENSSL_gmtime_diff BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_gmtime_diff) -#define OPENSSL_hash32 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_hash32) -#define OPENSSL_ia32cap_P BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_ia32cap_P) -#define OPENSSL_init_crypto BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_init_crypto) -#define OPENSSL_load_builtin_modules BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_load_builtin_modules) -#define OPENSSL_malloc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_malloc) -#define OPENSSL_malloc_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_malloc_init) -#define OPENSSL_no_config BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_no_config) -#define OPENSSL_realloc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_realloc) -#define OPENSSL_strcasecmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_strcasecmp) -#define OPENSSL_strdup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_strdup) -#define OPENSSL_strncasecmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_strncasecmp) -#define OPENSSL_strnlen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_strnlen) -#define OPENSSL_tolower BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_tolower) -#define OTHERNAME_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OTHERNAME_cmp) -#define OTHERNAME_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OTHERNAME_free) -#define OTHERNAME_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OTHERNAME_it) -#define OTHERNAME_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OTHERNAME_new) -#define OpenSSL_add_all_algorithms BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OpenSSL_add_all_algorithms) -#define OpenSSL_add_all_ciphers BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OpenSSL_add_all_ciphers) -#define OpenSSL_add_all_digests BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OpenSSL_add_all_digests) -#define OpenSSL_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OpenSSL_version) -#define OpenSSL_version_num BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OpenSSL_version_num) -#define PEM_ASN1_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_ASN1_read) -#define PEM_ASN1_read_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_ASN1_read_bio) -#define PEM_ASN1_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_ASN1_write) -#define PEM_ASN1_write_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_ASN1_write_bio) -#define PEM_X509_INFO_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_X509_INFO_read) -#define PEM_X509_INFO_read_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_X509_INFO_read_bio) -#define PEM_X509_INFO_write_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_X509_INFO_write_bio) -#define PEM_bytes_read_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_bytes_read_bio) -#define PEM_def_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_def_callback) -#define PEM_dek_info BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_dek_info) -#define PEM_do_header BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_do_header) -#define PEM_get_EVP_CIPHER_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_get_EVP_CIPHER_INFO) -#define PEM_proc_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_proc_type) -#define PEM_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read) -#define PEM_read_DHparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_DHparams) -#define PEM_read_DSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_DSAPrivateKey) -#define PEM_read_DSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_DSA_PUBKEY) -#define PEM_read_DSAparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_DSAparams) -#define PEM_read_ECPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_ECPrivateKey) -#define PEM_read_EC_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_EC_PUBKEY) -#define PEM_read_PKCS7 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_PKCS7) -#define PEM_read_PKCS8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_PKCS8) -#define PEM_read_PKCS8_PRIV_KEY_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_PKCS8_PRIV_KEY_INFO) -#define PEM_read_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_PUBKEY) -#define PEM_read_PrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_PrivateKey) -#define PEM_read_RSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_RSAPrivateKey) -#define PEM_read_RSAPublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_RSAPublicKey) -#define PEM_read_RSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_RSA_PUBKEY) -#define PEM_read_X509 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_X509) -#define PEM_read_X509_AUX BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_X509_AUX) -#define PEM_read_X509_CRL BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_X509_CRL) -#define PEM_read_X509_REQ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_X509_REQ) -#define PEM_read_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio) -#define PEM_read_bio_DHparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_DHparams) -#define PEM_read_bio_DSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_DSAPrivateKey) -#define PEM_read_bio_DSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_DSA_PUBKEY) -#define PEM_read_bio_DSAparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_DSAparams) -#define PEM_read_bio_ECPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_ECPrivateKey) -#define PEM_read_bio_EC_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_EC_PUBKEY) -#define PEM_read_bio_PKCS7 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_PKCS7) -#define PEM_read_bio_PKCS8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_PKCS8) -#define PEM_read_bio_PKCS8_PRIV_KEY_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_PKCS8_PRIV_KEY_INFO) -#define PEM_read_bio_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_PUBKEY) -#define PEM_read_bio_PrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_PrivateKey) -#define PEM_read_bio_RSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_RSAPrivateKey) -#define PEM_read_bio_RSAPublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_RSAPublicKey) -#define PEM_read_bio_RSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_RSA_PUBKEY) -#define PEM_read_bio_X509 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_X509) -#define PEM_read_bio_X509_AUX BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_X509_AUX) -#define PEM_read_bio_X509_CRL BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_X509_CRL) -#define PEM_read_bio_X509_REQ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_X509_REQ) -#define PEM_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write) -#define PEM_write_DHparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_DHparams) -#define PEM_write_DSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_DSAPrivateKey) -#define PEM_write_DSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_DSA_PUBKEY) -#define PEM_write_DSAparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_DSAparams) -#define PEM_write_ECPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_ECPrivateKey) -#define PEM_write_EC_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_EC_PUBKEY) -#define PEM_write_PKCS7 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_PKCS7) -#define PEM_write_PKCS8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_PKCS8) -#define PEM_write_PKCS8PrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_PKCS8PrivateKey) -#define PEM_write_PKCS8PrivateKey_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_PKCS8PrivateKey_nid) -#define PEM_write_PKCS8_PRIV_KEY_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_PKCS8_PRIV_KEY_INFO) -#define PEM_write_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_PUBKEY) -#define PEM_write_PrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_PrivateKey) -#define PEM_write_RSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_RSAPrivateKey) -#define PEM_write_RSAPublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_RSAPublicKey) -#define PEM_write_RSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_RSA_PUBKEY) -#define PEM_write_X509 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_X509) -#define PEM_write_X509_AUX BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_X509_AUX) -#define PEM_write_X509_CRL BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_X509_CRL) -#define PEM_write_X509_REQ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_X509_REQ) -#define PEM_write_X509_REQ_NEW BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_X509_REQ_NEW) -#define PEM_write_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio) -#define PEM_write_bio_DHparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_DHparams) -#define PEM_write_bio_DSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_DSAPrivateKey) -#define PEM_write_bio_DSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_DSA_PUBKEY) -#define PEM_write_bio_DSAparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_DSAparams) -#define PEM_write_bio_ECPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_ECPrivateKey) -#define PEM_write_bio_EC_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_EC_PUBKEY) -#define PEM_write_bio_PKCS7 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_PKCS7) -#define PEM_write_bio_PKCS8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_PKCS8) -#define PEM_write_bio_PKCS8PrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_PKCS8PrivateKey) -#define PEM_write_bio_PKCS8PrivateKey_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_PKCS8PrivateKey_nid) -#define PEM_write_bio_PKCS8_PRIV_KEY_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_PKCS8_PRIV_KEY_INFO) -#define PEM_write_bio_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_PUBKEY) -#define PEM_write_bio_PrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_PrivateKey) -#define PEM_write_bio_RSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_RSAPrivateKey) -#define PEM_write_bio_RSAPublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_RSAPublicKey) -#define PEM_write_bio_RSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_RSA_PUBKEY) -#define PEM_write_bio_X509 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_X509) -#define PEM_write_bio_X509_AUX BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_X509_AUX) -#define PEM_write_bio_X509_CRL BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_X509_CRL) -#define PEM_write_bio_X509_REQ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_X509_REQ) -#define PEM_write_bio_X509_REQ_NEW BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_X509_REQ_NEW) -#define PKCS12_PBE_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS12_PBE_add) -#define PKCS12_create BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS12_create) -#define PKCS12_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS12_free) -#define PKCS12_get_key_and_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS12_get_key_and_certs) -#define PKCS12_parse BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS12_parse) -#define PKCS12_verify_mac BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS12_verify_mac) -#define PKCS5_PBKDF2_HMAC BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS5_PBKDF2_HMAC) -#define PKCS5_PBKDF2_HMAC_SHA1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS5_PBKDF2_HMAC_SHA1) -#define PKCS5_pbe2_decrypt_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS5_pbe2_decrypt_init) -#define PKCS5_pbe2_encrypt_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS5_pbe2_encrypt_init) -#define PKCS7_bundle_CRLs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS7_bundle_CRLs) -#define PKCS7_bundle_certificates BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS7_bundle_certificates) -#define PKCS7_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS7_free) -#define PKCS7_get_CRLs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS7_get_CRLs) -#define PKCS7_get_PEM_CRLs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS7_get_PEM_CRLs) -#define PKCS7_get_PEM_certificates BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS7_get_PEM_certificates) -#define PKCS7_get_certificates BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS7_get_certificates) -#define PKCS7_get_raw_certificates BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS7_get_raw_certificates) -#define PKCS7_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS7_sign) -#define PKCS7_type_is_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS7_type_is_data) -#define PKCS7_type_is_digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS7_type_is_digest) -#define PKCS7_type_is_encrypted BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS7_type_is_encrypted) -#define PKCS7_type_is_enveloped BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS7_type_is_enveloped) -#define PKCS7_type_is_signed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS7_type_is_signed) -#define PKCS7_type_is_signedAndEnveloped BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS7_type_is_signedAndEnveloped) -#define PKCS8_PRIV_KEY_INFO_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS8_PRIV_KEY_INFO_free) -#define PKCS8_PRIV_KEY_INFO_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS8_PRIV_KEY_INFO_it) -#define PKCS8_PRIV_KEY_INFO_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS8_PRIV_KEY_INFO_new) -#define PKCS8_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS8_decrypt) -#define PKCS8_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS8_encrypt) -#define PKCS8_marshal_encrypted_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS8_marshal_encrypted_private_key) -#define PKCS8_parse_encrypted_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS8_parse_encrypted_private_key) -#define PKCS8_pkey_get0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS8_pkey_get0) -#define PKCS8_pkey_set0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS8_pkey_set0) -#define PKEY_USAGE_PERIOD_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKEY_USAGE_PERIOD_free) -#define PKEY_USAGE_PERIOD_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKEY_USAGE_PERIOD_it) -#define PKEY_USAGE_PERIOD_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKEY_USAGE_PERIOD_new) -#define POLICYINFO_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, POLICYINFO_free) -#define POLICYINFO_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, POLICYINFO_it) -#define POLICYINFO_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, POLICYINFO_new) -#define POLICYQUALINFO_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, POLICYQUALINFO_free) -#define POLICYQUALINFO_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, POLICYQUALINFO_it) -#define POLICYQUALINFO_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, POLICYQUALINFO_new) -#define POLICY_CONSTRAINTS_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, POLICY_CONSTRAINTS_free) -#define POLICY_CONSTRAINTS_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, POLICY_CONSTRAINTS_it) -#define POLICY_CONSTRAINTS_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, POLICY_CONSTRAINTS_new) -#define POLICY_MAPPINGS_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, POLICY_MAPPINGS_it) -#define POLICY_MAPPING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, POLICY_MAPPING_free) -#define POLICY_MAPPING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, POLICY_MAPPING_it) -#define POLICY_MAPPING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, POLICY_MAPPING_new) -#define PROXY_CERT_INFO_EXTENSION_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PROXY_CERT_INFO_EXTENSION_free) -#define PROXY_CERT_INFO_EXTENSION_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PROXY_CERT_INFO_EXTENSION_it) -#define PROXY_CERT_INFO_EXTENSION_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PROXY_CERT_INFO_EXTENSION_new) -#define PROXY_POLICY_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PROXY_POLICY_free) -#define PROXY_POLICY_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PROXY_POLICY_it) -#define PROXY_POLICY_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PROXY_POLICY_new) -#define RAND_SSLeay BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_SSLeay) -#define RAND_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_add) -#define RAND_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_bytes) -#define RAND_bytes_with_additional_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_bytes_with_additional_data) -#define RAND_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_cleanup) -#define RAND_egd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_egd) -#define RAND_enable_fork_unsafe_buffering BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_enable_fork_unsafe_buffering) -#define RAND_file_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_file_name) -#define RAND_get_rand_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_get_rand_method) -#define RAND_load_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_load_file) -#define RAND_poll BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_poll) -#define RAND_pseudo_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_pseudo_bytes) -#define RAND_seed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_seed) -#define RAND_set_rand_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_set_rand_method) -#define RAND_set_urandom_fd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_set_urandom_fd) -#define RAND_status BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_status) -#define RC4 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RC4) -#define RC4_set_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RC4_set_key) -#define RSAPrivateKey_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSAPrivateKey_dup) -#define RSAPublicKey_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSAPublicKey_dup) -#define RSAZ_1024_mod_exp_avx2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSAZ_1024_mod_exp_avx2) -#define RSA_PSS_PARAMS_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_PSS_PARAMS_free) -#define RSA_PSS_PARAMS_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_PSS_PARAMS_it) -#define RSA_PSS_PARAMS_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_PSS_PARAMS_new) -#define RSA_add_pkcs1_prefix BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_add_pkcs1_prefix) -#define RSA_bits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_bits) -#define RSA_blinding_on BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_blinding_on) -#define RSA_check_fips BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_check_fips) -#define RSA_check_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_check_key) -#define RSA_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_decrypt) -#define RSA_default_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_default_method) -#define RSA_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_encrypt) -#define RSA_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_flags) -#define RSA_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_free) -#define RSA_generate_key_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_generate_key_ex) -#define RSA_generate_key_fips BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_generate_key_fips) -#define RSA_get0_crt_params BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_get0_crt_params) -#define RSA_get0_factors BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_get0_factors) -#define RSA_get0_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_get0_key) -#define RSA_get_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_get_ex_data) -#define RSA_get_ex_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_get_ex_new_index) -#define RSA_is_opaque BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_is_opaque) -#define RSA_marshal_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_marshal_private_key) -#define RSA_marshal_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_marshal_public_key) -#define RSA_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_new) -#define RSA_new_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_new_method) -#define RSA_padding_add_PKCS1_OAEP_mgf1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_padding_add_PKCS1_OAEP_mgf1) -#define RSA_padding_add_PKCS1_PSS_mgf1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_padding_add_PKCS1_PSS_mgf1) -#define RSA_padding_add_PKCS1_type_1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_padding_add_PKCS1_type_1) -#define RSA_padding_add_PKCS1_type_2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_padding_add_PKCS1_type_2) -#define RSA_padding_add_none BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_padding_add_none) -#define RSA_padding_check_PKCS1_OAEP_mgf1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_padding_check_PKCS1_OAEP_mgf1) -#define RSA_padding_check_PKCS1_type_1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_padding_check_PKCS1_type_1) -#define RSA_padding_check_PKCS1_type_2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_padding_check_PKCS1_type_2) -#define RSA_parse_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_parse_private_key) -#define RSA_parse_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_parse_public_key) -#define RSA_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_print) -#define RSA_private_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_private_decrypt) -#define RSA_private_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_private_encrypt) -#define RSA_private_key_from_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_private_key_from_bytes) -#define RSA_private_key_to_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_private_key_to_bytes) -#define RSA_private_transform BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_private_transform) -#define RSA_public_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_public_decrypt) -#define RSA_public_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_public_encrypt) -#define RSA_public_key_from_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_public_key_from_bytes) -#define RSA_public_key_to_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_public_key_to_bytes) -#define RSA_set0_crt_params BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_set0_crt_params) -#define RSA_set0_factors BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_set0_factors) -#define RSA_set0_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_set0_key) -#define RSA_set_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_set_ex_data) -#define RSA_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_sign) -#define RSA_sign_pss_mgf1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_sign_pss_mgf1) -#define RSA_sign_raw BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_sign_raw) -#define RSA_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_size) -#define RSA_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_up_ref) -#define RSA_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_verify) -#define RSA_verify_PKCS1_PSS_mgf1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_verify_PKCS1_PSS_mgf1) -#define RSA_verify_pss_mgf1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_verify_pss_mgf1) -#define RSA_verify_raw BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_verify_raw) -#define SHA1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA1) -#define SHA1_Final BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA1_Final) -#define SHA1_Init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA1_Init) -#define SHA1_Transform BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA1_Transform) -#define SHA1_Update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA1_Update) -#define SHA224 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA224) -#define SHA224_Final BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA224_Final) -#define SHA224_Init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA224_Init) -#define SHA224_Update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA224_Update) -#define SHA256 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA256) -#define SHA256_Final BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA256_Final) -#define SHA256_Init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA256_Init) -#define SHA256_Transform BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA256_Transform) -#define SHA256_TransformBlocks BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA256_TransformBlocks) -#define SHA256_Update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA256_Update) -#define SHA384 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA384) -#define SHA384_Final BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA384_Final) -#define SHA384_Init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA384_Init) -#define SHA384_Update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA384_Update) -#define SHA512 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA512) -#define SHA512_Final BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA512_Final) -#define SHA512_Init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA512_Init) -#define SHA512_Transform BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA512_Transform) -#define SHA512_Update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA512_Update) -#define SIPHASH_24 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SIPHASH_24) -#define SPAKE2_CTX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SPAKE2_CTX_free) -#define SPAKE2_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SPAKE2_CTX_new) -#define SPAKE2_generate_msg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SPAKE2_generate_msg) -#define SPAKE2_process_msg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SPAKE2_process_msg) -#define SSLeay BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSLeay) -#define SSLeay_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSLeay_version) -#define SXNETID_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SXNETID_free) -#define SXNETID_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SXNETID_it) -#define SXNETID_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SXNETID_new) -#define SXNET_add_id_INTEGER BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SXNET_add_id_INTEGER) -#define SXNET_add_id_asc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SXNET_add_id_asc) -#define SXNET_add_id_ulong BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SXNET_add_id_ulong) -#define SXNET_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SXNET_free) -#define SXNET_get_id_INTEGER BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SXNET_get_id_INTEGER) -#define SXNET_get_id_asc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SXNET_get_id_asc) -#define SXNET_get_id_ulong BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SXNET_get_id_ulong) -#define SXNET_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SXNET_it) -#define SXNET_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SXNET_new) -#define USERNOTICE_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, USERNOTICE_free) -#define USERNOTICE_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, USERNOTICE_it) -#define USERNOTICE_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, USERNOTICE_new) -#define UTF8_getc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, UTF8_getc) -#define UTF8_putc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, UTF8_putc) -#define X25519 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X25519) -#define X25519_keypair BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X25519_keypair) -#define X25519_public_from_private BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X25519_public_from_private) -#define X509V3_EXT_CRL_add_nconf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_CRL_add_nconf) -#define X509V3_EXT_REQ_add_nconf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_REQ_add_nconf) -#define X509V3_EXT_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_add) -#define X509V3_EXT_add_alias BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_add_alias) -#define X509V3_EXT_add_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_add_list) -#define X509V3_EXT_add_nconf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_add_nconf) -#define X509V3_EXT_add_nconf_sk BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_add_nconf_sk) -#define X509V3_EXT_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_cleanup) -#define X509V3_EXT_d2i BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_d2i) -#define X509V3_EXT_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_free) -#define X509V3_EXT_get BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_get) -#define X509V3_EXT_get_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_get_nid) -#define X509V3_EXT_i2d BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_i2d) -#define X509V3_EXT_nconf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_nconf) -#define X509V3_EXT_nconf_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_nconf_nid) -#define X509V3_EXT_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_print) -#define X509V3_EXT_print_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_print_fp) -#define X509V3_EXT_val_prn BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_val_prn) -#define X509V3_NAME_from_section BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_NAME_from_section) -#define X509V3_add1_i2d BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_add1_i2d) -#define X509V3_add_standard_extensions BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_add_standard_extensions) -#define X509V3_add_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_add_value) -#define X509V3_add_value_bool BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_add_value_bool) -#define X509V3_add_value_bool_nf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_add_value_bool_nf) -#define X509V3_add_value_int BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_add_value_int) -#define X509V3_add_value_uchar BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_add_value_uchar) -#define X509V3_conf_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_conf_free) -#define X509V3_extensions_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_extensions_print) -#define X509V3_get_d2i BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_get_d2i) -#define X509V3_get_section BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_get_section) -#define X509V3_get_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_get_string) -#define X509V3_get_value_bool BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_get_value_bool) -#define X509V3_get_value_int BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_get_value_int) -#define X509V3_parse_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_parse_list) -#define X509V3_section_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_section_free) -#define X509V3_set_ctx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_set_ctx) -#define X509V3_set_nconf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_set_nconf) -#define X509V3_string_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_string_free) -#define X509_ALGORS_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ALGORS_it) -#define X509_ALGOR_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ALGOR_cmp) -#define X509_ALGOR_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ALGOR_dup) -#define X509_ALGOR_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ALGOR_free) -#define X509_ALGOR_get0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ALGOR_get0) -#define X509_ALGOR_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ALGOR_it) -#define X509_ALGOR_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ALGOR_new) -#define X509_ALGOR_set0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ALGOR_set0) -#define X509_ALGOR_set_md BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ALGOR_set_md) -#define X509_ATTRIBUTE_SET_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ATTRIBUTE_SET_it) -#define X509_ATTRIBUTE_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ATTRIBUTE_count) -#define X509_ATTRIBUTE_create BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ATTRIBUTE_create) -#define X509_ATTRIBUTE_create_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ATTRIBUTE_create_by_NID) -#define X509_ATTRIBUTE_create_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ATTRIBUTE_create_by_OBJ) -#define X509_ATTRIBUTE_create_by_txt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ATTRIBUTE_create_by_txt) -#define X509_ATTRIBUTE_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ATTRIBUTE_dup) -#define X509_ATTRIBUTE_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ATTRIBUTE_free) -#define X509_ATTRIBUTE_get0_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ATTRIBUTE_get0_data) -#define X509_ATTRIBUTE_get0_object BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ATTRIBUTE_get0_object) -#define X509_ATTRIBUTE_get0_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ATTRIBUTE_get0_type) -#define X509_ATTRIBUTE_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ATTRIBUTE_it) -#define X509_ATTRIBUTE_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ATTRIBUTE_new) -#define X509_ATTRIBUTE_set1_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ATTRIBUTE_set1_data) -#define X509_ATTRIBUTE_set1_object BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ATTRIBUTE_set1_object) -#define X509_CERT_AUX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CERT_AUX_free) -#define X509_CERT_AUX_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CERT_AUX_it) -#define X509_CERT_AUX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CERT_AUX_new) -#define X509_CERT_AUX_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CERT_AUX_print) -#define X509_CINF_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CINF_free) -#define X509_CINF_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CINF_it) -#define X509_CINF_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CINF_new) -#define X509_CRL_INFO_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_INFO_free) -#define X509_CRL_INFO_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_INFO_it) -#define X509_CRL_INFO_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_INFO_new) -#define X509_CRL_METHOD_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_METHOD_free) -#define X509_CRL_METHOD_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_METHOD_new) -#define X509_CRL_add0_revoked BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_add0_revoked) -#define X509_CRL_add1_ext_i2d BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_add1_ext_i2d) -#define X509_CRL_add_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_add_ext) -#define X509_CRL_check_suiteb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_check_suiteb) -#define X509_CRL_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_cmp) -#define X509_CRL_delete_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_delete_ext) -#define X509_CRL_diff BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_diff) -#define X509_CRL_digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_digest) -#define X509_CRL_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_dup) -#define X509_CRL_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_free) -#define X509_CRL_get0_by_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_get0_by_cert) -#define X509_CRL_get0_by_serial BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_get0_by_serial) -#define X509_CRL_get0_lastUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_get0_lastUpdate) -#define X509_CRL_get0_nextUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_get0_nextUpdate) -#define X509_CRL_get0_signature BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_get0_signature) -#define X509_CRL_get_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_get_ext) -#define X509_CRL_get_ext_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_get_ext_by_NID) -#define X509_CRL_get_ext_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_get_ext_by_OBJ) -#define X509_CRL_get_ext_by_critical BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_get_ext_by_critical) -#define X509_CRL_get_ext_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_get_ext_count) -#define X509_CRL_get_ext_d2i BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_get_ext_d2i) -#define X509_CRL_get_meth_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_get_meth_data) -#define X509_CRL_get_signature_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_get_signature_nid) -#define X509_CRL_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_it) -#define X509_CRL_match BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_match) -#define X509_CRL_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_new) -#define X509_CRL_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_print) -#define X509_CRL_print_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_print_fp) -#define X509_CRL_set_default_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_set_default_method) -#define X509_CRL_set_issuer_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_set_issuer_name) -#define X509_CRL_set_lastUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_set_lastUpdate) -#define X509_CRL_set_meth_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_set_meth_data) -#define X509_CRL_set_nextUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_set_nextUpdate) -#define X509_CRL_set_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_set_version) -#define X509_CRL_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_sign) -#define X509_CRL_sign_ctx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_sign_ctx) -#define X509_CRL_sort BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_sort) -#define X509_CRL_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_up_ref) -#define X509_CRL_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_verify) -#define X509_EXTENSIONS_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_EXTENSIONS_it) -#define X509_EXTENSION_create_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_EXTENSION_create_by_NID) -#define X509_EXTENSION_create_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_EXTENSION_create_by_OBJ) -#define X509_EXTENSION_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_EXTENSION_dup) -#define X509_EXTENSION_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_EXTENSION_free) -#define X509_EXTENSION_get_critical BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_EXTENSION_get_critical) -#define X509_EXTENSION_get_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_EXTENSION_get_data) -#define X509_EXTENSION_get_object BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_EXTENSION_get_object) -#define X509_EXTENSION_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_EXTENSION_it) -#define X509_EXTENSION_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_EXTENSION_new) -#define X509_EXTENSION_set_critical BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_EXTENSION_set_critical) -#define X509_EXTENSION_set_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_EXTENSION_set_data) -#define X509_EXTENSION_set_object BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_EXTENSION_set_object) -#define X509_INFO_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_INFO_free) -#define X509_INFO_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_INFO_new) -#define X509_LOOKUP_by_alias BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_LOOKUP_by_alias) -#define X509_LOOKUP_by_fingerprint BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_LOOKUP_by_fingerprint) -#define X509_LOOKUP_by_issuer_serial BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_LOOKUP_by_issuer_serial) -#define X509_LOOKUP_by_subject BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_LOOKUP_by_subject) -#define X509_LOOKUP_ctrl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_LOOKUP_ctrl) -#define X509_LOOKUP_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_LOOKUP_file) -#define X509_LOOKUP_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_LOOKUP_free) -#define X509_LOOKUP_hash_dir BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_LOOKUP_hash_dir) -#define X509_LOOKUP_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_LOOKUP_init) -#define X509_LOOKUP_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_LOOKUP_new) -#define X509_LOOKUP_shutdown BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_LOOKUP_shutdown) -#define X509_NAME_ENTRIES_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_ENTRIES_it) -#define X509_NAME_ENTRY_create_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_ENTRY_create_by_NID) -#define X509_NAME_ENTRY_create_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_ENTRY_create_by_OBJ) -#define X509_NAME_ENTRY_create_by_txt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_ENTRY_create_by_txt) -#define X509_NAME_ENTRY_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_ENTRY_dup) -#define X509_NAME_ENTRY_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_ENTRY_free) -#define X509_NAME_ENTRY_get_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_ENTRY_get_data) -#define X509_NAME_ENTRY_get_object BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_ENTRY_get_object) -#define X509_NAME_ENTRY_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_ENTRY_it) -#define X509_NAME_ENTRY_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_ENTRY_new) -#define X509_NAME_ENTRY_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_ENTRY_set) -#define X509_NAME_ENTRY_set_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_ENTRY_set_data) -#define X509_NAME_ENTRY_set_object BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_ENTRY_set_object) -#define X509_NAME_INTERNAL_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_INTERNAL_it) -#define X509_NAME_add_entry BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_add_entry) -#define X509_NAME_add_entry_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_add_entry_by_NID) -#define X509_NAME_add_entry_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_add_entry_by_OBJ) -#define X509_NAME_add_entry_by_txt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_add_entry_by_txt) -#define X509_NAME_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_cmp) -#define X509_NAME_delete_entry BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_delete_entry) -#define X509_NAME_digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_digest) -#define X509_NAME_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_dup) -#define X509_NAME_entry_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_entry_count) -#define X509_NAME_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_free) -#define X509_NAME_get0_der BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_get0_der) -#define X509_NAME_get_entry BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_get_entry) -#define X509_NAME_get_index_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_get_index_by_NID) -#define X509_NAME_get_index_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_get_index_by_OBJ) -#define X509_NAME_get_text_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_get_text_by_NID) -#define X509_NAME_get_text_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_get_text_by_OBJ) -#define X509_NAME_hash BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_hash) -#define X509_NAME_hash_old BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_hash_old) -#define X509_NAME_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_it) -#define X509_NAME_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_new) -#define X509_NAME_oneline BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_oneline) -#define X509_NAME_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_print) -#define X509_NAME_print_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_print_ex) -#define X509_NAME_print_ex_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_print_ex_fp) -#define X509_NAME_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_set) -#define X509_OBJECT_free_contents BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_OBJECT_free_contents) -#define X509_OBJECT_get0_X509 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_OBJECT_get0_X509) -#define X509_OBJECT_get_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_OBJECT_get_type) -#define X509_OBJECT_idx_by_subject BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_OBJECT_idx_by_subject) -#define X509_OBJECT_retrieve_by_subject BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_OBJECT_retrieve_by_subject) -#define X509_OBJECT_retrieve_match BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_OBJECT_retrieve_match) -#define X509_OBJECT_up_ref_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_OBJECT_up_ref_count) -#define X509_PKEY_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PKEY_free) -#define X509_PKEY_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PKEY_new) -#define X509_POLICY_NODE_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_POLICY_NODE_print) -#define X509_PUBKEY_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PUBKEY_free) -#define X509_PUBKEY_get BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PUBKEY_get) -#define X509_PUBKEY_get0_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PUBKEY_get0_param) -#define X509_PUBKEY_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PUBKEY_it) -#define X509_PUBKEY_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PUBKEY_new) -#define X509_PUBKEY_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PUBKEY_set) -#define X509_PUBKEY_set0_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PUBKEY_set0_param) -#define X509_PURPOSE_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PURPOSE_add) -#define X509_PURPOSE_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PURPOSE_cleanup) -#define X509_PURPOSE_get0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PURPOSE_get0) -#define X509_PURPOSE_get0_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PURPOSE_get0_name) -#define X509_PURPOSE_get0_sname BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PURPOSE_get0_sname) -#define X509_PURPOSE_get_by_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PURPOSE_get_by_id) -#define X509_PURPOSE_get_by_sname BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PURPOSE_get_by_sname) -#define X509_PURPOSE_get_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PURPOSE_get_count) -#define X509_PURPOSE_get_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PURPOSE_get_id) -#define X509_PURPOSE_get_trust BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PURPOSE_get_trust) -#define X509_PURPOSE_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PURPOSE_set) -#define X509_REQ_INFO_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_INFO_free) -#define X509_REQ_INFO_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_INFO_it) -#define X509_REQ_INFO_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_INFO_new) -#define X509_REQ_add1_attr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_add1_attr) -#define X509_REQ_add1_attr_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_add1_attr_by_NID) -#define X509_REQ_add1_attr_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_add1_attr_by_OBJ) -#define X509_REQ_add1_attr_by_txt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_add1_attr_by_txt) -#define X509_REQ_add_extensions BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_add_extensions) -#define X509_REQ_add_extensions_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_add_extensions_nid) -#define X509_REQ_check_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_check_private_key) -#define X509_REQ_delete_attr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_delete_attr) -#define X509_REQ_digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_digest) -#define X509_REQ_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_dup) -#define X509_REQ_extension_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_extension_nid) -#define X509_REQ_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_free) -#define X509_REQ_get0_signature BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_get0_signature) -#define X509_REQ_get1_email BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_get1_email) -#define X509_REQ_get_attr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_get_attr) -#define X509_REQ_get_attr_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_get_attr_by_NID) -#define X509_REQ_get_attr_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_get_attr_by_OBJ) -#define X509_REQ_get_attr_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_get_attr_count) -#define X509_REQ_get_extension_nids BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_get_extension_nids) -#define X509_REQ_get_extensions BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_get_extensions) -#define X509_REQ_get_pubkey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_get_pubkey) -#define X509_REQ_get_signature_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_get_signature_nid) -#define X509_REQ_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_it) -#define X509_REQ_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_new) -#define X509_REQ_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_print) -#define X509_REQ_print_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_print_ex) -#define X509_REQ_print_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_print_fp) -#define X509_REQ_set_extension_nids BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_set_extension_nids) -#define X509_REQ_set_pubkey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_set_pubkey) -#define X509_REQ_set_subject_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_set_subject_name) -#define X509_REQ_set_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_set_version) -#define X509_REQ_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_sign) -#define X509_REQ_sign_ctx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_sign_ctx) -#define X509_REQ_to_X509 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_to_X509) -#define X509_REQ_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_verify) -#define X509_REVOKED_add1_ext_i2d BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_add1_ext_i2d) -#define X509_REVOKED_add_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_add_ext) -#define X509_REVOKED_delete_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_delete_ext) -#define X509_REVOKED_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_dup) -#define X509_REVOKED_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_free) -#define X509_REVOKED_get0_revocationDate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_get0_revocationDate) -#define X509_REVOKED_get0_serialNumber BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_get0_serialNumber) -#define X509_REVOKED_get_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_get_ext) -#define X509_REVOKED_get_ext_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_get_ext_by_NID) -#define X509_REVOKED_get_ext_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_get_ext_by_OBJ) -#define X509_REVOKED_get_ext_by_critical BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_get_ext_by_critical) -#define X509_REVOKED_get_ext_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_get_ext_count) -#define X509_REVOKED_get_ext_d2i BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_get_ext_d2i) -#define X509_REVOKED_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_it) -#define X509_REVOKED_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_new) -#define X509_REVOKED_set_revocationDate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_set_revocationDate) -#define X509_REVOKED_set_serialNumber BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_set_serialNumber) -#define X509_SIG_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_SIG_free) -#define X509_SIG_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_SIG_it) -#define X509_SIG_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_SIG_new) -#define X509_STORE_CTX_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_cleanup) -#define X509_STORE_CTX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_free) -#define X509_STORE_CTX_get0_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get0_cert) -#define X509_STORE_CTX_get0_current_crl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get0_current_crl) -#define X509_STORE_CTX_get0_current_issuer BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get0_current_issuer) -#define X509_STORE_CTX_get0_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get0_param) -#define X509_STORE_CTX_get0_parent_ctx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get0_parent_ctx) -#define X509_STORE_CTX_get0_policy_tree BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get0_policy_tree) -#define X509_STORE_CTX_get0_store BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get0_store) -#define X509_STORE_CTX_get0_untrusted BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get0_untrusted) -#define X509_STORE_CTX_get1_chain BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get1_chain) -#define X509_STORE_CTX_get1_issuer BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get1_issuer) -#define X509_STORE_CTX_get_chain BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get_chain) -#define X509_STORE_CTX_get_current_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get_current_cert) -#define X509_STORE_CTX_get_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get_error) -#define X509_STORE_CTX_get_error_depth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get_error_depth) -#define X509_STORE_CTX_get_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get_ex_data) -#define X509_STORE_CTX_get_ex_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get_ex_new_index) -#define X509_STORE_CTX_get_explicit_policy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get_explicit_policy) -#define X509_STORE_CTX_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_init) -#define X509_STORE_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_new) -#define X509_STORE_CTX_purpose_inherit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_purpose_inherit) -#define X509_STORE_CTX_set0_crls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_set0_crls) -#define X509_STORE_CTX_set0_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_set0_param) -#define X509_STORE_CTX_set_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_set_cert) -#define X509_STORE_CTX_set_chain BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_set_chain) -#define X509_STORE_CTX_set_default BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_set_default) -#define X509_STORE_CTX_set_depth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_set_depth) -#define X509_STORE_CTX_set_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_set_error) -#define X509_STORE_CTX_set_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_set_ex_data) -#define X509_STORE_CTX_set_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_set_flags) -#define X509_STORE_CTX_set_purpose BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_set_purpose) -#define X509_STORE_CTX_set_time BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_set_time) -#define X509_STORE_CTX_set_trust BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_set_trust) -#define X509_STORE_CTX_set_verify_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_set_verify_cb) -#define X509_STORE_CTX_trusted_stack BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_trusted_stack) -#define X509_STORE_CTX_zero BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_zero) -#define X509_STORE_add_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_add_cert) -#define X509_STORE_add_crl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_add_crl) -#define X509_STORE_add_lookup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_add_lookup) -#define X509_STORE_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_free) -#define X509_STORE_get0_objects BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get0_objects) -#define X509_STORE_get0_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get0_param) -#define X509_STORE_get1_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get1_certs) -#define X509_STORE_get1_crls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get1_crls) -#define X509_STORE_get_by_subject BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get_by_subject) -#define X509_STORE_get_cert_crl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get_cert_crl) -#define X509_STORE_get_check_crl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get_check_crl) -#define X509_STORE_get_check_issued BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get_check_issued) -#define X509_STORE_get_check_revocation BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get_check_revocation) -#define X509_STORE_get_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get_cleanup) -#define X509_STORE_get_get_crl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get_get_crl) -#define X509_STORE_get_get_issuer BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get_get_issuer) -#define X509_STORE_get_lookup_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get_lookup_certs) -#define X509_STORE_get_lookup_crls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get_lookup_crls) -#define X509_STORE_get_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get_verify) -#define X509_STORE_get_verify_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get_verify_cb) -#define X509_STORE_load_locations BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_load_locations) -#define X509_STORE_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_new) -#define X509_STORE_set0_additional_untrusted BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set0_additional_untrusted) -#define X509_STORE_set1_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set1_param) -#define X509_STORE_set_cert_crl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_cert_crl) -#define X509_STORE_set_check_crl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_check_crl) -#define X509_STORE_set_check_issued BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_check_issued) -#define X509_STORE_set_check_revocation BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_check_revocation) -#define X509_STORE_set_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_cleanup) -#define X509_STORE_set_default_paths BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_default_paths) -#define X509_STORE_set_depth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_depth) -#define X509_STORE_set_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_flags) -#define X509_STORE_set_get_crl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_get_crl) -#define X509_STORE_set_get_issuer BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_get_issuer) -#define X509_STORE_set_lookup_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_lookup_certs) -#define X509_STORE_set_lookup_crls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_lookup_crls) -#define X509_STORE_set_purpose BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_purpose) -#define X509_STORE_set_trust BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_trust) -#define X509_STORE_set_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_verify) -#define X509_STORE_set_verify_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_verify_cb) -#define X509_STORE_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_up_ref) -#define X509_TRUST_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_TRUST_add) -#define X509_TRUST_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_TRUST_cleanup) -#define X509_TRUST_get0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_TRUST_get0) -#define X509_TRUST_get0_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_TRUST_get0_name) -#define X509_TRUST_get_by_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_TRUST_get_by_id) -#define X509_TRUST_get_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_TRUST_get_count) -#define X509_TRUST_get_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_TRUST_get_flags) -#define X509_TRUST_get_trust BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_TRUST_get_trust) -#define X509_TRUST_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_TRUST_set) -#define X509_TRUST_set_default BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_TRUST_set_default) -#define X509_VAL_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VAL_free) -#define X509_VAL_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VAL_it) -#define X509_VAL_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VAL_new) -#define X509_VERIFY_PARAM_add0_policy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_add0_policy) -#define X509_VERIFY_PARAM_add0_table BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_add0_table) -#define X509_VERIFY_PARAM_add1_host BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_add1_host) -#define X509_VERIFY_PARAM_clear_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_clear_flags) -#define X509_VERIFY_PARAM_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_free) -#define X509_VERIFY_PARAM_get0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_get0) -#define X509_VERIFY_PARAM_get0_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_get0_name) -#define X509_VERIFY_PARAM_get0_peername BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_get0_peername) -#define X509_VERIFY_PARAM_get_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_get_count) -#define X509_VERIFY_PARAM_get_depth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_get_depth) -#define X509_VERIFY_PARAM_get_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_get_flags) -#define X509_VERIFY_PARAM_inherit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_inherit) -#define X509_VERIFY_PARAM_lookup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_lookup) -#define X509_VERIFY_PARAM_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_new) -#define X509_VERIFY_PARAM_set1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_set1) -#define X509_VERIFY_PARAM_set1_email BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_set1_email) -#define X509_VERIFY_PARAM_set1_host BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_set1_host) -#define X509_VERIFY_PARAM_set1_ip BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_set1_ip) -#define X509_VERIFY_PARAM_set1_ip_asc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_set1_ip_asc) -#define X509_VERIFY_PARAM_set1_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_set1_name) -#define X509_VERIFY_PARAM_set1_policies BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_set1_policies) -#define X509_VERIFY_PARAM_set_depth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_set_depth) -#define X509_VERIFY_PARAM_set_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_set_flags) -#define X509_VERIFY_PARAM_set_hostflags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_set_hostflags) -#define X509_VERIFY_PARAM_set_purpose BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_set_purpose) -#define X509_VERIFY_PARAM_set_time BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_set_time) -#define X509_VERIFY_PARAM_set_trust BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_set_trust) -#define X509_VERIFY_PARAM_table_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_table_cleanup) -#define X509_add1_ext_i2d BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_add1_ext_i2d) -#define X509_add1_reject_object BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_add1_reject_object) -#define X509_add1_trust_object BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_add1_trust_object) -#define X509_add_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_add_ext) -#define X509_alias_get0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_alias_get0) -#define X509_alias_set1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_alias_set1) -#define X509_chain_check_suiteb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_chain_check_suiteb) -#define X509_chain_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_chain_up_ref) -#define X509_check_akid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_check_akid) -#define X509_check_ca BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_check_ca) -#define X509_check_email BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_check_email) -#define X509_check_host BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_check_host) -#define X509_check_ip BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_check_ip) -#define X509_check_ip_asc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_check_ip_asc) -#define X509_check_issued BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_check_issued) -#define X509_check_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_check_private_key) -#define X509_check_purpose BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_check_purpose) -#define X509_check_trust BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_check_trust) -#define X509_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_cmp) -#define X509_cmp_current_time BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_cmp_current_time) -#define X509_cmp_time BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_cmp_time) -#define X509_delete_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_delete_ext) -#define X509_digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_digest) -#define X509_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_dup) -#define X509_email_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_email_free) -#define X509_find_by_issuer_and_serial BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_find_by_issuer_and_serial) -#define X509_find_by_subject BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_find_by_subject) -#define X509_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_free) -#define X509_get0_extensions BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get0_extensions) -#define X509_get0_notAfter BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get0_notAfter) -#define X509_get0_notBefore BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get0_notBefore) -#define X509_get0_pubkey_bitstr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get0_pubkey_bitstr) -#define X509_get0_signature BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get0_signature) -#define X509_get0_tbs_sigalg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get0_tbs_sigalg) -#define X509_get1_email BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get1_email) -#define X509_get1_ocsp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get1_ocsp) -#define X509_get_default_cert_area BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_default_cert_area) -#define X509_get_default_cert_dir BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_default_cert_dir) -#define X509_get_default_cert_dir_env BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_default_cert_dir_env) -#define X509_get_default_cert_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_default_cert_file) -#define X509_get_default_cert_file_env BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_default_cert_file_env) -#define X509_get_default_private_dir BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_default_private_dir) -#define X509_get_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_ex_data) -#define X509_get_ex_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_ex_new_index) -#define X509_get_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_ext) -#define X509_get_ext_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_ext_by_NID) -#define X509_get_ext_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_ext_by_OBJ) -#define X509_get_ext_by_critical BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_ext_by_critical) -#define X509_get_ext_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_ext_count) -#define X509_get_ext_d2i BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_ext_d2i) -#define X509_get_extended_key_usage BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_extended_key_usage) -#define X509_get_extension_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_extension_flags) -#define X509_get_issuer_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_issuer_name) -#define X509_get_key_usage BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_key_usage) -#define X509_get_pubkey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_pubkey) -#define X509_get_serialNumber BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_serialNumber) -#define X509_get_signature_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_signature_nid) -#define X509_get_subject_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_subject_name) -#define X509_gmtime_adj BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_gmtime_adj) -#define X509_issuer_and_serial_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_issuer_and_serial_cmp) -#define X509_issuer_and_serial_hash BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_issuer_and_serial_hash) -#define X509_issuer_name_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_issuer_name_cmp) -#define X509_issuer_name_hash BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_issuer_name_hash) -#define X509_issuer_name_hash_old BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_issuer_name_hash_old) -#define X509_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_it) -#define X509_keyid_get0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_keyid_get0) -#define X509_keyid_set1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_keyid_set1) -#define X509_load_cert_crl_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_load_cert_crl_file) -#define X509_load_cert_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_load_cert_file) -#define X509_load_crl_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_load_crl_file) -#define X509_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_new) -#define X509_ocspid_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ocspid_print) -#define X509_parse_from_buffer BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_parse_from_buffer) -#define X509_policy_check BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_policy_check) -#define X509_policy_level_get0_node BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_policy_level_get0_node) -#define X509_policy_level_node_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_policy_level_node_count) -#define X509_policy_node_get0_parent BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_policy_node_get0_parent) -#define X509_policy_node_get0_policy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_policy_node_get0_policy) -#define X509_policy_node_get0_qualifiers BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_policy_node_get0_qualifiers) -#define X509_policy_tree_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_policy_tree_free) -#define X509_policy_tree_get0_level BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_policy_tree_get0_level) -#define X509_policy_tree_get0_policies BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_policy_tree_get0_policies) -#define X509_policy_tree_get0_user_policies BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_policy_tree_get0_user_policies) -#define X509_policy_tree_level_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_policy_tree_level_count) -#define X509_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_print) -#define X509_print_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_print_ex) -#define X509_print_ex_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_print_ex_fp) -#define X509_print_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_print_fp) -#define X509_pubkey_digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_pubkey_digest) -#define X509_reject_clear BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_reject_clear) -#define X509_set_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_set_ex_data) -#define X509_set_issuer_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_set_issuer_name) -#define X509_set_notAfter BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_set_notAfter) -#define X509_set_notBefore BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_set_notBefore) -#define X509_set_pubkey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_set_pubkey) -#define X509_set_serialNumber BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_set_serialNumber) -#define X509_set_subject_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_set_subject_name) -#define X509_set_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_set_version) -#define X509_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_sign) -#define X509_sign_ctx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_sign_ctx) -#define X509_signature_dump BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_signature_dump) -#define X509_signature_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_signature_print) -#define X509_subject_name_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_subject_name_cmp) -#define X509_subject_name_hash BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_subject_name_hash) -#define X509_subject_name_hash_old BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_subject_name_hash_old) -#define X509_supported_extension BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_supported_extension) -#define X509_time_adj BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_time_adj) -#define X509_time_adj_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_time_adj_ex) -#define X509_to_X509_REQ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_to_X509_REQ) -#define X509_trust_clear BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_trust_clear) -#define X509_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_up_ref) -#define X509_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_verify) -#define X509_verify_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_verify_cert) -#define X509_verify_cert_error_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_verify_cert_error_string) -#define X509at_add1_attr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509at_add1_attr) -#define X509at_add1_attr_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509at_add1_attr_by_NID) -#define X509at_add1_attr_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509at_add1_attr_by_OBJ) -#define X509at_add1_attr_by_txt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509at_add1_attr_by_txt) -#define X509at_delete_attr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509at_delete_attr) -#define X509at_get0_data_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509at_get0_data_by_OBJ) -#define X509at_get_attr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509at_get_attr) -#define X509at_get_attr_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509at_get_attr_by_NID) -#define X509at_get_attr_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509at_get_attr_by_OBJ) -#define X509at_get_attr_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509at_get_attr_count) -#define X509v3_add_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509v3_add_ext) -#define X509v3_delete_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509v3_delete_ext) -#define X509v3_get_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509v3_get_ext) -#define X509v3_get_ext_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509v3_get_ext_by_NID) -#define X509v3_get_ext_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509v3_get_ext_by_OBJ) -#define X509v3_get_ext_by_critical BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509v3_get_ext_by_critical) -#define X509v3_get_ext_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509v3_get_ext_count) -#define a2i_GENERAL_NAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, a2i_GENERAL_NAME) -#define a2i_IPADDRESS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, a2i_IPADDRESS) -#define a2i_IPADDRESS_NC BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, a2i_IPADDRESS_NC) -#define a2i_ipadd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, a2i_ipadd) -#define abi_test_bad_unwind_temporary BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_bad_unwind_temporary) -#define abi_test_bad_unwind_wrong_register BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_bad_unwind_wrong_register) -#define abi_test_clobber_r10 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_r10) -#define abi_test_clobber_r11 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_r11) -#define abi_test_clobber_r12 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_r12) -#define abi_test_clobber_r13 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_r13) -#define abi_test_clobber_r14 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_r14) -#define abi_test_clobber_r15 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_r15) -#define abi_test_clobber_r8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_r8) -#define abi_test_clobber_r9 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_r9) -#define abi_test_clobber_rax BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_rax) -#define abi_test_clobber_rbp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_rbp) -#define abi_test_clobber_rbx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_rbx) -#define abi_test_clobber_rcx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_rcx) -#define abi_test_clobber_rdi BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_rdi) -#define abi_test_clobber_rdx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_rdx) -#define abi_test_clobber_rsi BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_rsi) -#define abi_test_clobber_xmm0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm0) -#define abi_test_clobber_xmm1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm1) -#define abi_test_clobber_xmm10 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm10) -#define abi_test_clobber_xmm11 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm11) -#define abi_test_clobber_xmm12 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm12) -#define abi_test_clobber_xmm13 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm13) -#define abi_test_clobber_xmm14 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm14) -#define abi_test_clobber_xmm15 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm15) -#define abi_test_clobber_xmm2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm2) -#define abi_test_clobber_xmm3 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm3) -#define abi_test_clobber_xmm4 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm4) -#define abi_test_clobber_xmm5 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm5) -#define abi_test_clobber_xmm6 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm6) -#define abi_test_clobber_xmm7 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm7) -#define abi_test_clobber_xmm8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm8) -#define abi_test_clobber_xmm9 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm9) -#define abi_test_get_and_clear_direction_flag BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_get_and_clear_direction_flag) -#define abi_test_set_direction_flag BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_set_direction_flag) -#define abi_test_trampoline BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_trampoline) -#define abi_test_unwind_return BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_unwind_return) -#define abi_test_unwind_start BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_unwind_start) -#define abi_test_unwind_stop BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_unwind_stop) -#define aes128gcmsiv_aes_ks BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes128gcmsiv_aes_ks) -#define aes128gcmsiv_aes_ks_enc_x1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes128gcmsiv_aes_ks_enc_x1) -#define aes128gcmsiv_dec BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes128gcmsiv_dec) -#define aes128gcmsiv_ecb_enc_block BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes128gcmsiv_ecb_enc_block) -#define aes128gcmsiv_enc_msg_x4 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes128gcmsiv_enc_msg_x4) -#define aes128gcmsiv_enc_msg_x8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes128gcmsiv_enc_msg_x8) -#define aes128gcmsiv_kdf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes128gcmsiv_kdf) -#define aes256gcmsiv_aes_ks BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes256gcmsiv_aes_ks) -#define aes256gcmsiv_aes_ks_enc_x1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes256gcmsiv_aes_ks_enc_x1) -#define aes256gcmsiv_dec BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes256gcmsiv_dec) -#define aes256gcmsiv_ecb_enc_block BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes256gcmsiv_ecb_enc_block) -#define aes256gcmsiv_enc_msg_x4 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes256gcmsiv_enc_msg_x4) -#define aes256gcmsiv_enc_msg_x8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes256gcmsiv_enc_msg_x8) -#define aes256gcmsiv_kdf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes256gcmsiv_kdf) -#define aes_ctr_set_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_ctr_set_key) -#define aes_hw_cbc_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_hw_cbc_encrypt) -#define aes_hw_ctr32_encrypt_blocks BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_hw_ctr32_encrypt_blocks) -#define aes_hw_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_hw_decrypt) -#define aes_hw_ecb_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_hw_ecb_encrypt) -#define aes_hw_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_hw_encrypt) -#define aes_hw_set_decrypt_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_hw_set_decrypt_key) -#define aes_hw_set_encrypt_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_hw_set_encrypt_key) -#define aes_nohw_cbc_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_nohw_cbc_encrypt) -#define aes_nohw_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_nohw_decrypt) -#define aes_nohw_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_nohw_encrypt) -#define aes_nohw_set_decrypt_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_nohw_set_decrypt_key) -#define aes_nohw_set_encrypt_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_nohw_set_encrypt_key) -#define aesgcmsiv_htable6_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aesgcmsiv_htable6_init) -#define aesgcmsiv_htable_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aesgcmsiv_htable_init) -#define aesgcmsiv_htable_polyval BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aesgcmsiv_htable_polyval) -#define aesgcmsiv_polyval_horner BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aesgcmsiv_polyval_horner) -#define aesni_gcm_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aesni_gcm_decrypt) -#define aesni_gcm_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aesni_gcm_encrypt) -#define asn1_do_adb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_do_adb) -#define asn1_enc_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_enc_free) -#define asn1_enc_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_enc_init) -#define asn1_enc_restore BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_enc_restore) -#define asn1_enc_save BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_enc_save) -#define asn1_ex_c2i BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_ex_c2i) -#define asn1_ex_i2c BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_ex_i2c) -#define asn1_generalizedtime_to_tm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_generalizedtime_to_tm) -#define asn1_get_choice_selector BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_get_choice_selector) -#define asn1_get_field_ptr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_get_field_ptr) -#define asn1_item_combine_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_item_combine_free) -#define asn1_refcount_dec_and_test_zero BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_refcount_dec_and_test_zero) -#define asn1_refcount_set_one BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_refcount_set_one) -#define asn1_set_choice_selector BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_set_choice_selector) -#define asn1_utctime_to_tm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_utctime_to_tm) -#define beeu_mod_inverse_vartime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, beeu_mod_inverse_vartime) -#define bio_clear_socket_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bio_clear_socket_error) -#define bio_fd_should_retry BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bio_fd_should_retry) -#define bio_ip_and_port_to_socket_and_addr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bio_ip_and_port_to_socket_and_addr) -#define bio_sock_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bio_sock_error) -#define bio_socket_nbio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bio_socket_nbio) -#define bn_abs_sub_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_abs_sub_consttime) -#define bn_add_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_add_words) -#define bn_copy_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_copy_words) -#define bn_div_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_div_consttime) -#define bn_expand BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_expand) -#define bn_fits_in_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_fits_in_words) -#define bn_from_montgomery BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_from_montgomery) -#define bn_from_montgomery_small BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_from_montgomery_small) -#define bn_gather5 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_gather5) -#define bn_in_range_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_in_range_words) -#define bn_is_bit_set_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_is_bit_set_words) -#define bn_is_relatively_prime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_is_relatively_prime) -#define bn_jacobi BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_jacobi) -#define bn_lcm_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_lcm_consttime) -#define bn_less_than_montgomery_R BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_less_than_montgomery_R) -#define bn_less_than_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_less_than_words) -#define bn_miller_rabin_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_miller_rabin_init) -#define bn_miller_rabin_iteration BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_miller_rabin_iteration) -#define bn_minimal_width BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_minimal_width) -#define bn_mod_add_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mod_add_consttime) -#define bn_mod_add_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mod_add_words) -#define bn_mod_exp_base_2_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mod_exp_base_2_consttime) -#define bn_mod_exp_mont_small BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mod_exp_mont_small) -#define bn_mod_inverse_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mod_inverse_consttime) -#define bn_mod_inverse_prime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mod_inverse_prime) -#define bn_mod_inverse_prime_mont_small BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mod_inverse_prime_mont_small) -#define bn_mod_inverse_secret_prime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mod_inverse_secret_prime) -#define bn_mod_lshift1_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mod_lshift1_consttime) -#define bn_mod_lshift_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mod_lshift_consttime) -#define bn_mod_mul_montgomery_small BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mod_mul_montgomery_small) -#define bn_mod_sub_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mod_sub_consttime) -#define bn_mod_sub_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mod_sub_words) -#define bn_mod_u16_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mod_u16_consttime) -#define bn_mont_n0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mont_n0) -#define bn_mul_add_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mul_add_words) -#define bn_mul_comba4 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mul_comba4) -#define bn_mul_comba8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mul_comba8) -#define bn_mul_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mul_consttime) -#define bn_mul_mont BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mul_mont) -#define bn_mul_mont_gather5 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mul_mont_gather5) -#define bn_mul_small BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mul_small) -#define bn_mul_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mul_words) -#define bn_odd_number_is_obviously_composite BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_odd_number_is_obviously_composite) -#define bn_one_to_montgomery BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_one_to_montgomery) -#define bn_power5 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_power5) -#define bn_rand_range_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_rand_range_words) -#define bn_rand_secret_range BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_rand_secret_range) -#define bn_reduce_once BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_reduce_once) -#define bn_reduce_once_in_place BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_reduce_once_in_place) -#define bn_resize_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_resize_words) -#define bn_rshift1_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_rshift1_words) -#define bn_rshift_secret_shift BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_rshift_secret_shift) -#define bn_rshift_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_rshift_words) -#define bn_scatter5 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_scatter5) -#define bn_select_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_select_words) -#define bn_set_minimal_width BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_set_minimal_width) -#define bn_set_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_set_words) -#define bn_sqr8x_internal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_sqr8x_internal) -#define bn_sqr_comba4 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_sqr_comba4) -#define bn_sqr_comba8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_sqr_comba8) -#define bn_sqr_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_sqr_consttime) -#define bn_sqr_small BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_sqr_small) -#define bn_sqr_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_sqr_words) -#define bn_sqrx8x_internal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_sqrx8x_internal) -#define bn_sub_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_sub_words) -#define bn_to_montgomery_small BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_to_montgomery_small) -#define bn_uadd_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_uadd_consttime) -#define bn_usub_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_usub_consttime) -#define bn_wexpand BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_wexpand) -#define boringssl_fips_self_test BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, boringssl_fips_self_test) -#define c2i_ASN1_BIT_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, c2i_ASN1_BIT_STRING) -#define c2i_ASN1_INTEGER BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, c2i_ASN1_INTEGER) -#define c2i_ASN1_OBJECT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, c2i_ASN1_OBJECT) -#define cbb_add_latin1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, cbb_add_latin1) -#define cbb_add_ucs2_be BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, cbb_add_ucs2_be) -#define cbb_add_utf32_be BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, cbb_add_utf32_be) -#define cbb_add_utf8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, cbb_add_utf8) -#define cbb_get_utf8_len BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, cbb_get_utf8_len) -#define cbs_get_latin1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, cbs_get_latin1) -#define cbs_get_ucs2_be BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, cbs_get_ucs2_be) -#define cbs_get_utf32_be BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, cbs_get_utf32_be) -#define cbs_get_utf8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, cbs_get_utf8) -#define chacha20_poly1305_open BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, chacha20_poly1305_open) -#define chacha20_poly1305_seal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, chacha20_poly1305_seal) -#define crypto_gcm_clmul_enabled BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, crypto_gcm_clmul_enabled) -#define d2i_ACCESS_DESCRIPTION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ACCESS_DESCRIPTION) -#define d2i_ASN1_BIT_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_BIT_STRING) -#define d2i_ASN1_BMPSTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_BMPSTRING) -#define d2i_ASN1_BOOLEAN BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_BOOLEAN) -#define d2i_ASN1_ENUMERATED BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_ENUMERATED) -#define d2i_ASN1_GENERALIZEDTIME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_GENERALIZEDTIME) -#define d2i_ASN1_GENERALSTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_GENERALSTRING) -#define d2i_ASN1_IA5STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_IA5STRING) -#define d2i_ASN1_INTEGER BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_INTEGER) -#define d2i_ASN1_NULL BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_NULL) -#define d2i_ASN1_OBJECT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_OBJECT) -#define d2i_ASN1_OCTET_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_OCTET_STRING) -#define d2i_ASN1_PRINTABLE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_PRINTABLE) -#define d2i_ASN1_PRINTABLESTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_PRINTABLESTRING) -#define d2i_ASN1_SEQUENCE_ANY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_SEQUENCE_ANY) -#define d2i_ASN1_SET_ANY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_SET_ANY) -#define d2i_ASN1_T61STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_T61STRING) -#define d2i_ASN1_TIME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_TIME) -#define d2i_ASN1_TYPE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_TYPE) -#define d2i_ASN1_UNIVERSALSTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_UNIVERSALSTRING) -#define d2i_ASN1_UTCTIME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_UTCTIME) -#define d2i_ASN1_UTF8STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_UTF8STRING) -#define d2i_ASN1_VISIBLESTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_VISIBLESTRING) -#define d2i_AUTHORITY_INFO_ACCESS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_AUTHORITY_INFO_ACCESS) -#define d2i_AUTHORITY_KEYID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_AUTHORITY_KEYID) -#define d2i_AutoPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_AutoPrivateKey) -#define d2i_BASIC_CONSTRAINTS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_BASIC_CONSTRAINTS) -#define d2i_CERTIFICATEPOLICIES BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_CERTIFICATEPOLICIES) -#define d2i_CRL_DIST_POINTS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_CRL_DIST_POINTS) -#define d2i_DHparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DHparams) -#define d2i_DHparams_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DHparams_bio) -#define d2i_DIRECTORYSTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DIRECTORYSTRING) -#define d2i_DISPLAYTEXT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DISPLAYTEXT) -#define d2i_DIST_POINT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DIST_POINT) -#define d2i_DIST_POINT_NAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DIST_POINT_NAME) -#define d2i_DSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DSAPrivateKey) -#define d2i_DSAPrivateKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DSAPrivateKey_bio) -#define d2i_DSAPrivateKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DSAPrivateKey_fp) -#define d2i_DSAPublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DSAPublicKey) -#define d2i_DSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DSA_PUBKEY) -#define d2i_DSA_PUBKEY_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DSA_PUBKEY_bio) -#define d2i_DSA_PUBKEY_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DSA_PUBKEY_fp) -#define d2i_DSA_SIG BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DSA_SIG) -#define d2i_DSAparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DSAparams) -#define d2i_ECDSA_SIG BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ECDSA_SIG) -#define d2i_ECParameters BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ECParameters) -#define d2i_ECPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ECPrivateKey) -#define d2i_ECPrivateKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ECPrivateKey_bio) -#define d2i_ECPrivateKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ECPrivateKey_fp) -#define d2i_EC_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_EC_PUBKEY) -#define d2i_EC_PUBKEY_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_EC_PUBKEY_bio) -#define d2i_EC_PUBKEY_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_EC_PUBKEY_fp) -#define d2i_EDIPARTYNAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_EDIPARTYNAME) -#define d2i_EXTENDED_KEY_USAGE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_EXTENDED_KEY_USAGE) -#define d2i_GENERAL_NAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_GENERAL_NAME) -#define d2i_GENERAL_NAMES BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_GENERAL_NAMES) -#define d2i_ISSUING_DIST_POINT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ISSUING_DIST_POINT) -#define d2i_NETSCAPE_SPKAC BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_NETSCAPE_SPKAC) -#define d2i_NETSCAPE_SPKI BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_NETSCAPE_SPKI) -#define d2i_NOTICEREF BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_NOTICEREF) -#define d2i_OTHERNAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_OTHERNAME) -#define d2i_PKCS12 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PKCS12) -#define d2i_PKCS12_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PKCS12_bio) -#define d2i_PKCS12_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PKCS12_fp) -#define d2i_PKCS7 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PKCS7) -#define d2i_PKCS7_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PKCS7_bio) -#define d2i_PKCS8PrivateKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PKCS8PrivateKey_bio) -#define d2i_PKCS8PrivateKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PKCS8PrivateKey_fp) -#define d2i_PKCS8_PRIV_KEY_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PKCS8_PRIV_KEY_INFO) -#define d2i_PKCS8_PRIV_KEY_INFO_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PKCS8_PRIV_KEY_INFO_bio) -#define d2i_PKCS8_PRIV_KEY_INFO_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PKCS8_PRIV_KEY_INFO_fp) -#define d2i_PKCS8_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PKCS8_bio) -#define d2i_PKCS8_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PKCS8_fp) -#define d2i_PKEY_USAGE_PERIOD BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PKEY_USAGE_PERIOD) -#define d2i_POLICYINFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_POLICYINFO) -#define d2i_POLICYQUALINFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_POLICYQUALINFO) -#define d2i_PROXY_CERT_INFO_EXTENSION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PROXY_CERT_INFO_EXTENSION) -#define d2i_PROXY_POLICY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PROXY_POLICY) -#define d2i_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PUBKEY) -#define d2i_PUBKEY_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PUBKEY_bio) -#define d2i_PUBKEY_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PUBKEY_fp) -#define d2i_PrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PrivateKey) -#define d2i_PrivateKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PrivateKey_bio) -#define d2i_PrivateKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PrivateKey_fp) -#define d2i_PublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PublicKey) -#define d2i_RSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_RSAPrivateKey) -#define d2i_RSAPrivateKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_RSAPrivateKey_bio) -#define d2i_RSAPrivateKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_RSAPrivateKey_fp) -#define d2i_RSAPublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_RSAPublicKey) -#define d2i_RSAPublicKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_RSAPublicKey_bio) -#define d2i_RSAPublicKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_RSAPublicKey_fp) -#define d2i_RSA_PSS_PARAMS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_RSA_PSS_PARAMS) -#define d2i_RSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_RSA_PUBKEY) -#define d2i_RSA_PUBKEY_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_RSA_PUBKEY_bio) -#define d2i_RSA_PUBKEY_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_RSA_PUBKEY_fp) -#define d2i_SXNET BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_SXNET) -#define d2i_SXNETID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_SXNETID) -#define d2i_USERNOTICE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_USERNOTICE) -#define d2i_X509 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509) -#define d2i_X509_ALGOR BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_ALGOR) -#define d2i_X509_ALGORS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_ALGORS) -#define d2i_X509_ATTRIBUTE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_ATTRIBUTE) -#define d2i_X509_AUX BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_AUX) -#define d2i_X509_CERT_AUX BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_CERT_AUX) -#define d2i_X509_CINF BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_CINF) -#define d2i_X509_CRL BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_CRL) -#define d2i_X509_CRL_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_CRL_INFO) -#define d2i_X509_CRL_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_CRL_bio) -#define d2i_X509_CRL_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_CRL_fp) -#define d2i_X509_EXTENSION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_EXTENSION) -#define d2i_X509_EXTENSIONS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_EXTENSIONS) -#define d2i_X509_NAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_NAME) -#define d2i_X509_NAME_ENTRY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_NAME_ENTRY) -#define d2i_X509_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_PUBKEY) -#define d2i_X509_REQ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_REQ) -#define d2i_X509_REQ_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_REQ_INFO) -#define d2i_X509_REQ_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_REQ_bio) -#define d2i_X509_REQ_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_REQ_fp) -#define d2i_X509_REVOKED BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_REVOKED) -#define d2i_X509_SIG BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_SIG) -#define d2i_X509_VAL BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_VAL) -#define d2i_X509_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_bio) -#define d2i_X509_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_fp) -#define dsa_asn1_meth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, dsa_asn1_meth) -#define ec_GFp_mont_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_mont_add) -#define ec_GFp_mont_bignum_to_felem BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_mont_bignum_to_felem) -#define ec_GFp_mont_dbl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_mont_dbl) -#define ec_GFp_mont_felem_mul BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_mont_felem_mul) -#define ec_GFp_mont_felem_sqr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_mont_felem_sqr) -#define ec_GFp_mont_felem_to_bignum BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_mont_felem_to_bignum) -#define ec_GFp_mont_group_finish BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_mont_group_finish) -#define ec_GFp_mont_group_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_mont_group_init) -#define ec_GFp_mont_group_set_curve BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_mont_group_set_curve) -#define ec_GFp_mont_mul BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_mont_mul) -#define ec_GFp_mont_mul_base BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_mont_mul_base) -#define ec_GFp_mont_mul_public BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_mont_mul_public) -#define ec_GFp_nistp_recode_scalar_bits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_nistp_recode_scalar_bits) -#define ec_GFp_simple_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_simple_cmp) -#define ec_GFp_simple_cmp_x_coordinate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_simple_cmp_x_coordinate) -#define ec_GFp_simple_group_finish BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_simple_group_finish) -#define ec_GFp_simple_group_get_curve BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_simple_group_get_curve) -#define ec_GFp_simple_group_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_simple_group_init) -#define ec_GFp_simple_group_set_curve BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_simple_group_set_curve) -#define ec_GFp_simple_invert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_simple_invert) -#define ec_GFp_simple_is_at_infinity BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_simple_is_at_infinity) -#define ec_GFp_simple_is_on_curve BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_simple_is_on_curve) -#define ec_GFp_simple_mont_inv_mod_ord_vartime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_simple_mont_inv_mod_ord_vartime) -#define ec_GFp_simple_point_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_simple_point_copy) -#define ec_GFp_simple_point_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_simple_point_init) -#define ec_GFp_simple_point_set_affine_coordinates BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_simple_point_set_affine_coordinates) -#define ec_GFp_simple_point_set_to_infinity BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_simple_point_set_to_infinity) -#define ec_asn1_meth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_asn1_meth) -#define ec_bignum_to_felem BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_bignum_to_felem) -#define ec_bignum_to_scalar BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_bignum_to_scalar) -#define ec_cmp_x_coordinate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_cmp_x_coordinate) -#define ec_compute_wNAF BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_compute_wNAF) -#define ec_felem_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_felem_add) -#define ec_felem_equal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_felem_equal) -#define ec_felem_neg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_felem_neg) -#define ec_felem_non_zero_mask BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_felem_non_zero_mask) -#define ec_felem_select BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_felem_select) -#define ec_felem_sub BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_felem_sub) -#define ec_felem_to_bignum BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_felem_to_bignum) -#define ec_get_x_coordinate_as_scalar BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_get_x_coordinate_as_scalar) -#define ec_group_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_group_new) -#define ec_pkey_meth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_pkey_meth) -#define ec_point_get_affine_coordinate_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_point_get_affine_coordinate_bytes) -#define ec_point_mul_scalar BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_point_mul_scalar) -#define ec_point_mul_scalar_base BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_point_mul_scalar_base) -#define ec_point_mul_scalar_public BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_point_mul_scalar_public) -#define ec_random_nonzero_scalar BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_random_nonzero_scalar) -#define ec_scalar_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_scalar_add) -#define ec_scalar_equal_vartime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_scalar_equal_vartime) -#define ec_scalar_from_montgomery BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_scalar_from_montgomery) -#define ec_scalar_inv_montgomery BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_scalar_inv_montgomery) -#define ec_scalar_inv_montgomery_vartime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_scalar_inv_montgomery_vartime) -#define ec_scalar_is_zero BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_scalar_is_zero) -#define ec_scalar_mul_montgomery BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_scalar_mul_montgomery) -#define ec_scalar_to_montgomery BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_scalar_to_montgomery) -#define ec_simple_scalar_inv_montgomery BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_simple_scalar_inv_montgomery) -#define ecp_nistz256_avx2_select_w7 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ecp_nistz256_avx2_select_w7) -#define ecp_nistz256_mul_mont BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ecp_nistz256_mul_mont) -#define ecp_nistz256_neg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ecp_nistz256_neg) -#define ecp_nistz256_ord_mul_mont BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ecp_nistz256_ord_mul_mont) -#define ecp_nistz256_ord_sqr_mont BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ecp_nistz256_ord_sqr_mont) -#define ecp_nistz256_point_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ecp_nistz256_point_add) -#define ecp_nistz256_point_add_affine BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ecp_nistz256_point_add_affine) -#define ecp_nistz256_point_double BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ecp_nistz256_point_double) -#define ecp_nistz256_select_w5 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ecp_nistz256_select_w5) -#define ecp_nistz256_select_w7 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ecp_nistz256_select_w7) -#define ecp_nistz256_sqr_mont BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ecp_nistz256_sqr_mont) -#define ed25519_asn1_meth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ed25519_asn1_meth) -#define ed25519_pkey_meth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ed25519_pkey_meth) -#define gcm_ghash_4bit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, gcm_ghash_4bit) -#define gcm_ghash_avx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, gcm_ghash_avx) -#define gcm_ghash_clmul BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, gcm_ghash_clmul) -#define gcm_ghash_ssse3 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, gcm_ghash_ssse3) -#define gcm_gmult_4bit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, gcm_gmult_4bit) -#define gcm_gmult_avx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, gcm_gmult_avx) -#define gcm_gmult_clmul BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, gcm_gmult_clmul) -#define gcm_gmult_ssse3 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, gcm_gmult_ssse3) -#define gcm_init_4bit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, gcm_init_4bit) -#define gcm_init_avx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, gcm_init_avx) -#define gcm_init_clmul BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, gcm_init_clmul) -#define gcm_init_ssse3 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, gcm_init_ssse3) -#define i2a_ACCESS_DESCRIPTION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2a_ACCESS_DESCRIPTION) -#define i2a_ASN1_ENUMERATED BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2a_ASN1_ENUMERATED) -#define i2a_ASN1_INTEGER BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2a_ASN1_INTEGER) -#define i2a_ASN1_OBJECT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2a_ASN1_OBJECT) -#define i2a_ASN1_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2a_ASN1_STRING) -#define i2c_ASN1_BIT_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2c_ASN1_BIT_STRING) -#define i2c_ASN1_INTEGER BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2c_ASN1_INTEGER) -#define i2d_ACCESS_DESCRIPTION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ACCESS_DESCRIPTION) -#define i2d_ASN1_BIT_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_BIT_STRING) -#define i2d_ASN1_BMPSTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_BMPSTRING) -#define i2d_ASN1_BOOLEAN BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_BOOLEAN) -#define i2d_ASN1_ENUMERATED BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_ENUMERATED) -#define i2d_ASN1_GENERALIZEDTIME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_GENERALIZEDTIME) -#define i2d_ASN1_GENERALSTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_GENERALSTRING) -#define i2d_ASN1_IA5STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_IA5STRING) -#define i2d_ASN1_INTEGER BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_INTEGER) -#define i2d_ASN1_NULL BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_NULL) -#define i2d_ASN1_OBJECT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_OBJECT) -#define i2d_ASN1_OCTET_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_OCTET_STRING) -#define i2d_ASN1_PRINTABLE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_PRINTABLE) -#define i2d_ASN1_PRINTABLESTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_PRINTABLESTRING) -#define i2d_ASN1_SEQUENCE_ANY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_SEQUENCE_ANY) -#define i2d_ASN1_SET_ANY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_SET_ANY) -#define i2d_ASN1_T61STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_T61STRING) -#define i2d_ASN1_TIME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_TIME) -#define i2d_ASN1_TYPE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_TYPE) -#define i2d_ASN1_UNIVERSALSTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_UNIVERSALSTRING) -#define i2d_ASN1_UTCTIME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_UTCTIME) -#define i2d_ASN1_UTF8STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_UTF8STRING) -#define i2d_ASN1_VISIBLESTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_VISIBLESTRING) -#define i2d_AUTHORITY_INFO_ACCESS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_AUTHORITY_INFO_ACCESS) -#define i2d_AUTHORITY_KEYID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_AUTHORITY_KEYID) -#define i2d_BASIC_CONSTRAINTS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_BASIC_CONSTRAINTS) -#define i2d_CERTIFICATEPOLICIES BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_CERTIFICATEPOLICIES) -#define i2d_CRL_DIST_POINTS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_CRL_DIST_POINTS) -#define i2d_DHparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DHparams) -#define i2d_DHparams_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DHparams_bio) -#define i2d_DIRECTORYSTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DIRECTORYSTRING) -#define i2d_DISPLAYTEXT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DISPLAYTEXT) -#define i2d_DIST_POINT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DIST_POINT) -#define i2d_DIST_POINT_NAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DIST_POINT_NAME) -#define i2d_DSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DSAPrivateKey) -#define i2d_DSAPrivateKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DSAPrivateKey_bio) -#define i2d_DSAPrivateKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DSAPrivateKey_fp) -#define i2d_DSAPublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DSAPublicKey) -#define i2d_DSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DSA_PUBKEY) -#define i2d_DSA_PUBKEY_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DSA_PUBKEY_bio) -#define i2d_DSA_PUBKEY_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DSA_PUBKEY_fp) -#define i2d_DSA_SIG BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DSA_SIG) -#define i2d_DSAparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DSAparams) -#define i2d_ECDSA_SIG BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ECDSA_SIG) -#define i2d_ECParameters BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ECParameters) -#define i2d_ECPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ECPrivateKey) -#define i2d_ECPrivateKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ECPrivateKey_bio) -#define i2d_ECPrivateKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ECPrivateKey_fp) -#define i2d_EC_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_EC_PUBKEY) -#define i2d_EC_PUBKEY_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_EC_PUBKEY_bio) -#define i2d_EC_PUBKEY_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_EC_PUBKEY_fp) -#define i2d_EDIPARTYNAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_EDIPARTYNAME) -#define i2d_EXTENDED_KEY_USAGE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_EXTENDED_KEY_USAGE) -#define i2d_GENERAL_NAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_GENERAL_NAME) -#define i2d_GENERAL_NAMES BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_GENERAL_NAMES) -#define i2d_ISSUING_DIST_POINT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ISSUING_DIST_POINT) -#define i2d_NETSCAPE_SPKAC BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_NETSCAPE_SPKAC) -#define i2d_NETSCAPE_SPKI BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_NETSCAPE_SPKI) -#define i2d_NOTICEREF BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_NOTICEREF) -#define i2d_OTHERNAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_OTHERNAME) -#define i2d_PKCS12 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS12) -#define i2d_PKCS12_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS12_bio) -#define i2d_PKCS12_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS12_fp) -#define i2d_PKCS7 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS7) -#define i2d_PKCS7_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS7_bio) -#define i2d_PKCS8PrivateKeyInfo_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS8PrivateKeyInfo_bio) -#define i2d_PKCS8PrivateKeyInfo_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS8PrivateKeyInfo_fp) -#define i2d_PKCS8PrivateKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS8PrivateKey_bio) -#define i2d_PKCS8PrivateKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS8PrivateKey_fp) -#define i2d_PKCS8PrivateKey_nid_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS8PrivateKey_nid_bio) -#define i2d_PKCS8PrivateKey_nid_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS8PrivateKey_nid_fp) -#define i2d_PKCS8_PRIV_KEY_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS8_PRIV_KEY_INFO) -#define i2d_PKCS8_PRIV_KEY_INFO_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS8_PRIV_KEY_INFO_bio) -#define i2d_PKCS8_PRIV_KEY_INFO_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS8_PRIV_KEY_INFO_fp) -#define i2d_PKCS8_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS8_bio) -#define i2d_PKCS8_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS8_fp) -#define i2d_PKEY_USAGE_PERIOD BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKEY_USAGE_PERIOD) -#define i2d_POLICYINFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_POLICYINFO) -#define i2d_POLICYQUALINFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_POLICYQUALINFO) -#define i2d_PROXY_CERT_INFO_EXTENSION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PROXY_CERT_INFO_EXTENSION) -#define i2d_PROXY_POLICY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PROXY_POLICY) -#define i2d_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PUBKEY) -#define i2d_PUBKEY_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PUBKEY_bio) -#define i2d_PUBKEY_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PUBKEY_fp) -#define i2d_PrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PrivateKey) -#define i2d_PrivateKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PrivateKey_bio) -#define i2d_PrivateKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PrivateKey_fp) -#define i2d_PublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PublicKey) -#define i2d_RSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_RSAPrivateKey) -#define i2d_RSAPrivateKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_RSAPrivateKey_bio) -#define i2d_RSAPrivateKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_RSAPrivateKey_fp) -#define i2d_RSAPublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_RSAPublicKey) -#define i2d_RSAPublicKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_RSAPublicKey_bio) -#define i2d_RSAPublicKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_RSAPublicKey_fp) -#define i2d_RSA_PSS_PARAMS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_RSA_PSS_PARAMS) -#define i2d_RSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_RSA_PUBKEY) -#define i2d_RSA_PUBKEY_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_RSA_PUBKEY_bio) -#define i2d_RSA_PUBKEY_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_RSA_PUBKEY_fp) -#define i2d_SXNET BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_SXNET) -#define i2d_SXNETID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_SXNETID) -#define i2d_USERNOTICE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_USERNOTICE) -#define i2d_X509 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509) -#define i2d_X509_ALGOR BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_ALGOR) -#define i2d_X509_ALGORS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_ALGORS) -#define i2d_X509_ATTRIBUTE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_ATTRIBUTE) -#define i2d_X509_AUX BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_AUX) -#define i2d_X509_CERT_AUX BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_CERT_AUX) -#define i2d_X509_CINF BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_CINF) -#define i2d_X509_CRL BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_CRL) -#define i2d_X509_CRL_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_CRL_INFO) -#define i2d_X509_CRL_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_CRL_bio) -#define i2d_X509_CRL_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_CRL_fp) -#define i2d_X509_EXTENSION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_EXTENSION) -#define i2d_X509_EXTENSIONS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_EXTENSIONS) -#define i2d_X509_NAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_NAME) -#define i2d_X509_NAME_ENTRY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_NAME_ENTRY) -#define i2d_X509_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_PUBKEY) -#define i2d_X509_REQ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_REQ) -#define i2d_X509_REQ_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_REQ_INFO) -#define i2d_X509_REQ_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_REQ_bio) -#define i2d_X509_REQ_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_REQ_fp) -#define i2d_X509_REVOKED BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_REVOKED) -#define i2d_X509_SIG BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_SIG) -#define i2d_X509_VAL BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_VAL) -#define i2d_X509_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_bio) -#define i2d_X509_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_fp) -#define i2d_re_X509_CRL_tbs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_re_X509_CRL_tbs) -#define i2d_re_X509_REQ_tbs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_re_X509_REQ_tbs) -#define i2d_re_X509_tbs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_re_X509_tbs) -#define i2o_ECPublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2o_ECPublicKey) -#define i2s_ASN1_ENUMERATED BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2s_ASN1_ENUMERATED) -#define i2s_ASN1_ENUMERATED_TABLE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2s_ASN1_ENUMERATED_TABLE) -#define i2s_ASN1_INTEGER BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2s_ASN1_INTEGER) -#define i2s_ASN1_OCTET_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2s_ASN1_OCTET_STRING) -#define i2t_ASN1_OBJECT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2t_ASN1_OBJECT) -#define i2v_ASN1_BIT_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2v_ASN1_BIT_STRING) -#define i2v_GENERAL_NAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2v_GENERAL_NAME) -#define i2v_GENERAL_NAMES BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2v_GENERAL_NAMES) -#define kBoringSSLRSASqrtTwo BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, kBoringSSLRSASqrtTwo) -#define kBoringSSLRSASqrtTwoLen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, kBoringSSLRSASqrtTwoLen) -#define kOpenSSLReasonStringData BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, kOpenSSLReasonStringData) -#define kOpenSSLReasonValues BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, kOpenSSLReasonValues) -#define kOpenSSLReasonValuesLen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, kOpenSSLReasonValuesLen) -#define level_add_node BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, level_add_node) -#define level_find_node BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, level_find_node) -#define lh_delete BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, lh_delete) -#define lh_doall_arg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, lh_doall_arg) -#define lh_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, lh_free) -#define lh_insert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, lh_insert) -#define lh_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, lh_new) -#define lh_num_items BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, lh_num_items) -#define lh_retrieve BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, lh_retrieve) -#define lh_retrieve_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, lh_retrieve_key) -#define lh_strhash BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, lh_strhash) -#define md4_block_data_order BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, md4_block_data_order) -#define md5_block_asm_data_order BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, md5_block_asm_data_order) -#define o2i_ECPublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, o2i_ECPublicKey) -#define pkcs12_iterations_acceptable BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, pkcs12_iterations_acceptable) -#define pkcs12_key_gen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, pkcs12_key_gen) -#define pkcs12_pbe_encrypt_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, pkcs12_pbe_encrypt_init) -#define pkcs7_bundle BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, pkcs7_bundle) -#define pkcs7_parse_header BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, pkcs7_parse_header) -#define pkcs8_pbe_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, pkcs8_pbe_decrypt) -#define policy_cache_find_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, policy_cache_find_data) -#define policy_cache_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, policy_cache_free) -#define policy_cache_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, policy_cache_set) -#define policy_cache_set_mapping BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, policy_cache_set_mapping) -#define policy_data_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, policy_data_free) -#define policy_data_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, policy_data_new) -#define policy_node_cmp_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, policy_node_cmp_new) -#define policy_node_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, policy_node_free) -#define policy_node_match BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, policy_node_match) -#define poly_Rq_mul BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, poly_Rq_mul) -#define rand_fork_unsafe_buffering_enabled BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, rand_fork_unsafe_buffering_enabled) -#define rsa_asn1_meth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, rsa_asn1_meth) -#define rsa_default_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, rsa_default_decrypt) -#define rsa_default_private_transform BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, rsa_default_private_transform) -#define rsa_default_sign_raw BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, rsa_default_sign_raw) -#define rsa_default_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, rsa_default_size) -#define rsa_pkey_meth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, rsa_pkey_meth) -#define rsaz_1024_gather5_avx2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, rsaz_1024_gather5_avx2) -#define rsaz_1024_mul_avx2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, rsaz_1024_mul_avx2) -#define rsaz_1024_norm2red_avx2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, rsaz_1024_norm2red_avx2) -#define rsaz_1024_red2norm_avx2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, rsaz_1024_red2norm_avx2) -#define rsaz_1024_scatter5_avx2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, rsaz_1024_scatter5_avx2) -#define rsaz_1024_sqr_avx2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, rsaz_1024_sqr_avx2) -#define s2i_ASN1_INTEGER BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, s2i_ASN1_INTEGER) -#define s2i_ASN1_OCTET_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, s2i_ASN1_OCTET_STRING) -#define sha1_block_data_order BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sha1_block_data_order) -#define sha256_block_data_order BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sha256_block_data_order) -#define sha512_block_data_order BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sha512_block_data_order) -#define sk_deep_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_deep_copy) -#define sk_delete BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_delete) -#define sk_delete_ptr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_delete_ptr) -#define sk_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_dup) -#define sk_find BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_find) -#define sk_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_free) -#define sk_insert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_insert) -#define sk_is_sorted BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_is_sorted) -#define sk_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_new) -#define sk_new_null BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_new_null) -#define sk_num BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_num) -#define sk_pop BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_pop) -#define sk_pop_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_pop_free) -#define sk_pop_free_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_pop_free_ex) -#define sk_push BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_push) -#define sk_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_set) -#define sk_set_cmp_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_set_cmp_func) -#define sk_shift BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_shift) -#define sk_sort BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_sort) -#define sk_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_value) -#define sk_zero BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_zero) -#define tree_find_sk BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, tree_find_sk) -#define v2i_ASN1_BIT_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v2i_ASN1_BIT_STRING) -#define v2i_GENERAL_NAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v2i_GENERAL_NAME) -#define v2i_GENERAL_NAMES BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v2i_GENERAL_NAMES) -#define v2i_GENERAL_NAME_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v2i_GENERAL_NAME_ex) -#define v3_akey_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_akey_id) -#define v3_alt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_alt) -#define v3_bcons BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_bcons) -#define v3_cpols BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_cpols) -#define v3_crl_invdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_crl_invdate) -#define v3_crl_num BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_crl_num) -#define v3_crl_reason BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_crl_reason) -#define v3_crld BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_crld) -#define v3_delta_crl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_delta_crl) -#define v3_ext_ku BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_ext_ku) -#define v3_freshest_crl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_freshest_crl) -#define v3_idp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_idp) -#define v3_info BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_info) -#define v3_inhibit_anyp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_inhibit_anyp) -#define v3_key_usage BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_key_usage) -#define v3_name_constraints BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_name_constraints) -#define v3_ns_ia5_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_ns_ia5_list) -#define v3_nscert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_nscert) -#define v3_ocsp_accresp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_ocsp_accresp) -#define v3_ocsp_nocheck BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_ocsp_nocheck) -#define v3_pci BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_pci) -#define v3_pkey_usage_period BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_pkey_usage_period) -#define v3_policy_constraints BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_policy_constraints) -#define v3_policy_mappings BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_policy_mappings) -#define v3_sinfo BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_sinfo) -#define v3_skey_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_skey_id) -#define v3_sxnet BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_sxnet) -#define vpaes_cbc_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, vpaes_cbc_encrypt) -#define vpaes_ctr32_encrypt_blocks BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, vpaes_ctr32_encrypt_blocks) -#define vpaes_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, vpaes_decrypt) -#define vpaes_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, vpaes_encrypt) -#define vpaes_set_decrypt_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, vpaes_set_decrypt_key) -#define vpaes_set_encrypt_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, vpaes_set_encrypt_key) -#define x25519_asn1_meth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x25519_asn1_meth) -#define x25519_ge_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x25519_ge_add) -#define x25519_ge_frombytes_vartime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x25519_ge_frombytes_vartime) -#define x25519_ge_p1p1_to_p2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x25519_ge_p1p1_to_p2) -#define x25519_ge_p1p1_to_p3 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x25519_ge_p1p1_to_p3) -#define x25519_ge_p3_to_cached BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x25519_ge_p3_to_cached) -#define x25519_ge_scalarmult BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x25519_ge_scalarmult) -#define x25519_ge_scalarmult_base BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x25519_ge_scalarmult_base) -#define x25519_ge_scalarmult_small_precomp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x25519_ge_scalarmult_small_precomp) -#define x25519_ge_sub BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x25519_ge_sub) -#define x25519_ge_tobytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x25519_ge_tobytes) -#define x25519_pkey_meth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x25519_pkey_meth) -#define x25519_sc_reduce BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x25519_sc_reduce) -#define x509_digest_sign_algorithm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x509_digest_sign_algorithm) -#define x509_digest_verify_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x509_digest_verify_init) -#define x509_print_rsa_pss_params BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x509_print_rsa_pss_params) -#define x509_rsa_ctx_to_pss BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x509_rsa_ctx_to_pss) -#define x509_rsa_pss_to_ctx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x509_rsa_pss_to_ctx) -#define x509v3_bytes_to_hex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x509v3_bytes_to_hex) -#define x509v3_hex_to_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x509v3_hex_to_bytes) -#define x509v3_looks_like_dns_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x509v3_looks_like_dns_name) -#define x509v3_name_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x509v3_name_cmp) From 29e6ea0ddd3bfe97d7d7c27b7d0454cf5f09dce8 Mon Sep 17 00:00:00 2001 From: Muxi Yan Date: Fri, 22 Nov 2019 11:03:55 -0800 Subject: [PATCH 022/758] add copyright --- .../generate_boringssl_prefix_header/Dockerfile | 14 ++++++++++++++ .../generate_boringssl_prefix_header.sh | 13 +++++++++++++ 2 files changed, 27 insertions(+) diff --git a/tools/dockerfile/grpc_objc/generate_boringssl_prefix_header/Dockerfile b/tools/dockerfile/grpc_objc/generate_boringssl_prefix_header/Dockerfile index b56cf9a6e1a..dc5d0c98360 100644 --- a/tools/dockerfile/grpc_objc/generate_boringssl_prefix_header/Dockerfile +++ b/tools/dockerfile/grpc_objc/generate_boringssl_prefix_header/Dockerfile @@ -1,3 +1,17 @@ +# Copyright 2019 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + FROM debian:buster ENV BORINGSSL_COMMIT=master diff --git a/tools/dockerfile/grpc_objc/generate_boringssl_prefix_header/generate_boringssl_prefix_header.sh b/tools/dockerfile/grpc_objc/generate_boringssl_prefix_header/generate_boringssl_prefix_header.sh index 79b641171ea..5eb8c597a92 100755 --- a/tools/dockerfile/grpc_objc/generate_boringssl_prefix_header/generate_boringssl_prefix_header.sh +++ b/tools/dockerfile/grpc_objc/generate_boringssl_prefix_header/generate_boringssl_prefix_header.sh @@ -1,4 +1,17 @@ #!/bin/bash +# Copyright 2019 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. [ $# == 1 ] || { echo "Usage: generate_boringssl_prefix_header.sh " ; exit 1 ; } From 342228bd3b32b871332efa8307f0381541024d92 Mon Sep 17 00:00:00 2001 From: Muxi Yan Date: Fri, 22 Nov 2019 12:08:44 -0800 Subject: [PATCH 023/758] Remove grpc_shadow_boringssl.h from tests --- src/objective-c/tests/CronetTests/CronetUnitTests.mm | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/objective-c/tests/CronetTests/CronetUnitTests.mm b/src/objective-c/tests/CronetTests/CronetUnitTests.mm index b5562654b0b..82c995279ec 100644 --- a/src/objective-c/tests/CronetTests/CronetUnitTests.mm +++ b/src/objective-c/tests/CronetTests/CronetUnitTests.mm @@ -39,9 +39,6 @@ #import "test/core/end2end/data/ssl_test_data.h" #import "test/core/util/test_config.h" -#define GRPC_SHADOW_BORINGSSL_SYMBOLS -#import "src/core/tsi/grpc_shadow_boringssl.h" - #import static void drain_cq(grpc_completion_queue *cq) { From 2999d041eb44d37bb7b9498ff19222f8677d095a Mon Sep 17 00:00:00 2001 From: Muxi Yan Date: Fri, 22 Nov 2019 13:33:10 -0800 Subject: [PATCH 024/758] Fix sanity check issue --- .gitignore | 1 - .../objective-c/BoringSSL-GRPC.podspec.template | 16 +++++++++++++--- tools/distrib/upgrade_boringssl_objc.sh | 2 +- .../generate_boringssl_prefix_header.sh | 2 +- 4 files changed, 15 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index ce66117d008..47b2a77fc97 100644 --- a/.gitignore +++ b/.gitignore @@ -95,7 +95,6 @@ DerivedData *.pbobjc.* *.pbrpc.* src/objective-c/**/Build -src/objective-c/boringssl_prefix_headers # Cocoapods artifacts Pods/ diff --git a/templates/src/objective-c/BoringSSL-GRPC.podspec.template b/templates/src/objective-c/BoringSSL-GRPC.podspec.template index 2024689d6c1..22bdb6f8869 100644 --- a/templates/src/objective-c/BoringSSL-GRPC.podspec.template +++ b/templates/src/objective-c/BoringSSL-GRPC.podspec.template @@ -223,9 +223,18 @@ % endfor EOF - # Grab prefix header from Github repo + # To avoid symbol conflict with OpenSSL, gRPC needs to rename all the BoringSSL symbols with a + # prefix. This is done with BoringSSL's BORINGSSL_PREFIX mechanism + # (https://github.com/google/boringssl/blob/75148d7abf12bdd1797fec3c5da9a21963703516/BUILDING.md#building-with-prefixed-symbols). + # The required prefix header file boringssl_prefix_symbols.h is not part of BoringSSL repo at + # this moment. It has to be generated by BoringSSL's users and be injected to BoringSSL build. + # gRPC generates this file in script /tools/distrib/upgrade_boringssl_objc.sh. This script + # outputs a gzip+base64 encoded version of boringssl_prefix_symbols.h because of Cocoapods' + # limit on the 'prepare_command' field length. The encoded header is put at + # /src/boringssl/boringssl_prefix_symbols.h.gz.b64. Here we decode the content and inject + # the header to correcty location in BoringSSL. base64 -D < include/openssl/boringssl_prefix_symbols.h - % for line in open("src/objective-c/boringssl_prefix_headers/boringssl_prefix_symbols.h.gz.base64", "r").readlines(): + % for line in open("src/boringssl/boringssl_prefix_symbols.h.gz.b64", "r").readlines(): ${line}\ % endfor EOF @@ -234,7 +243,8 @@ find . -type f \\( -path '*.h' -or -path '*.cc' -or -path '*.c' \\) -print0 | xargs -0 -L1 sed -E -i'.grpc_back' 's;#include ;#include ;g' END_OF_COMMAND end diff --git a/tools/distrib/upgrade_boringssl_objc.sh b/tools/distrib/upgrade_boringssl_objc.sh index 96b5933b842..c31a2f302d7 100755 --- a/tools/distrib/upgrade_boringssl_objc.sh +++ b/tools/distrib/upgrade_boringssl_objc.sh @@ -22,7 +22,7 @@ cd "$(dirname $0)" cd ../../third_party/boringssl BORINGSSL_COMMIT=$(git rev-parse HEAD) -BORINGSSL_PREFIX_HEADERS_DIR=src/objective-c/boringssl_prefix_headers +BORINGSSL_PREFIX_HEADERS_DIR=src/boringssl # Do the following in grpc root directory cd ../.. diff --git a/tools/dockerfile/grpc_objc/generate_boringssl_prefix_header/generate_boringssl_prefix_header.sh b/tools/dockerfile/grpc_objc/generate_boringssl_prefix_header/generate_boringssl_prefix_header.sh index 5eb8c597a92..8f10f1a8005 100755 --- a/tools/dockerfile/grpc_objc/generate_boringssl_prefix_header/generate_boringssl_prefix_header.sh +++ b/tools/dockerfile/grpc_objc/generate_boringssl_prefix_header/generate_boringssl_prefix_header.sh @@ -36,6 +36,6 @@ make boringssl_prefix_symbols [ -f symbol_prefix_include/boringssl_prefix_symbols.h ] || { echo "Failed to build boringssl_prefix_symbols.sh" ; exit 1 ; } -gzip -c symbol_prefix_include/boringssl_prefix_symbols.h | base64 > /output/boringssl_prefix_symbols.h.gz.base64 +gzip -c symbol_prefix_include/boringssl_prefix_symbols.h | base64 > /output/boringssl_prefix_symbols.h.gz.b64 exit 0 From 03d25d1b02c6038a574a0a83b2e79c6ba23b984f Mon Sep 17 00:00:00 2001 From: Muxi Yan Date: Fri, 22 Nov 2019 13:37:39 -0800 Subject: [PATCH 025/758] Generate new prefix symbols and podspec --- .../boringssl_prefix_symbols.h.gz.b64 | 484 ++++++++++++++++++ src/objective-c/BoringSSL-GRPC.podspec | 18 +- 2 files changed, 498 insertions(+), 4 deletions(-) create mode 100644 src/boringssl/boringssl_prefix_symbols.h.gz.b64 diff --git a/src/boringssl/boringssl_prefix_symbols.h.gz.b64 b/src/boringssl/boringssl_prefix_symbols.h.gz.b64 new file mode 100644 index 00000000000..0928b58a7ec --- /dev/null +++ b/src/boringssl/boringssl_prefix_symbols.h.gz.b64 @@ -0,0 +1,484 @@ +H4sICHlU2F0AA2JvcmluZ3NzbF9wcmVmaXhfc3ltYm9scy5oAK2dXXPbRpa/7/dTqP57s1s1tWvJ +cSZzSUt0zI0taUg6G+8NCiRBCWOSYABQtvPp/9147ZdzGvgduCo1kwh4ngM2Gv2GRvd///fVbXb+ +nqdPz+XVf2z/8+rm1fUvf7v6NcueDsnV4rT9r3/77/9W/1w9JvkxLYo0O12V2dWlSP52tVXg366O +2S7dq/+PT7v/zvKrXVqUebq5lMlV+ZwWV0W2L7/GeXK1Vwfj03ftOl/yc1YkV1/T8vlK/Vn/f3Yp +r/ZJcqWQ5yRPNt+vnvL4VCa7v12d8+wl3SU7JYxL9T/JVbzJXhJt2nbXfsrKdJvoq6jjnvvrbQ+d +z0mcX6Wnq/hw0GSaFO2vW7+fX60e3q3/d7acXy1WV4/Lh98Xd/O7q/83W6n//n9Xs/u76qTZp/X7 +h+XV3WJ1+2G2+Li6mn34cKWo5ex+vZivtOt/F+v3V8v5r7OlQh4UpXy9+/72w6e7xf2vFbj4+Phh +oaL0gquHd9rxcb68fa/+Mnu7+LBYf67Cv1us7+er1X8px9X9w9X89/n9+mr1XnuMK3s7v/qwmL39 +ML96p/5rdv9Z61aP89vF7MPf1HUv57frvylF+2/qpNuH+9X8n5+UTp1zdTf7OPtVX0hFt/9Z/bD3 +s/XqQcVdqp+3+vRhrX/Gu+XDx6sPDyt95VefVnMVY7aeaVqlobrk1d8UN1cXuNTXPVP/3K4XD/fa +pwAVer2c6eu4n//6YfHr/P52rtmHClg/LNW5n1YN87er2XKx0kEfPq01/aCd2qQ09/PqnDr1dXqo +a6muYr5UCfFxVonf2Xfjv/5Nw28flsq5Wn2IZnd30eNy/m7xx9U5LsqkuCq/Zlcq653KdJ8meaEy +j8r82SlRN6HUWUxl6mOh/6BFaZnkcalzXLa/OsbbPLtKvp3jU5UJ1T9pWVzF+dPlqHzF1SZRcFIF +Sk9P//Vv/75L9ukpIS/nP+K/XW3+kzwULdRPX9YnBB3miVfx1b//+1Wk/2fzbz21eIj2UVEc6Gvo +/1j/4W898J+Wo0hK1NIgvedu/WEVbQ+pSqromKjiYTdW55OOVaAjPUWSvyS5RGeRjlWXhdHmst+r +7CZxE7wd4eU6upGnrE8TdqGW9YlT2qc9+5SUCKfDk8rTZXpMdM2GeQ3Ssz6rGu6QCMU27LlFicD8 ++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 diff --git a/src/objective-c/BoringSSL-GRPC.podspec b/src/objective-c/BoringSSL-GRPC.podspec index c1cc5d3e110..881eb470d67 100644 --- a/src/objective-c/BoringSSL-GRPC.podspec +++ b/src/objective-c/BoringSSL-GRPC.podspec @@ -41,7 +41,7 @@ Pod::Spec.new do |s| s.name = 'BoringSSL-GRPC' - version = '0.0.6' + version = '0.0.7' s.version = version s.summary = 'BoringSSL is a fork of OpenSSL that is designed to meet Google\'s needs.' # Adapted from the homepage: @@ -1622,9 +1622,18 @@ Pod::Spec.new do |s| EOF - # Grab prefix header from Github repo + # To avoid symbol conflict with OpenSSL, gRPC needs to rename all the BoringSSL symbols with a + # prefix. This is done with BoringSSL's BORINGSSL_PREFIX mechanism + # (https://github.com/google/boringssl/blob/75148d7abf12bdd1797fec3c5da9a21963703516/BUILDING.md#building-with-prefixed-symbols). + # The required prefix header file boringssl_prefix_symbols.h is not part of BoringSSL repo at + # this moment. It has to be generated by BoringSSL's users and be injected to BoringSSL build. + # gRPC generates this file in script /tools/distrib/upgrade_boringssl_objc.sh. This script + # outputs a gzip+base64 encoded version of boringssl_prefix_symbols.h because of Cocoapods' + # limit on the 'prepare_command' field length. The encoded header is put at + # /src/boringssl/boringssl_prefix_symbols.h.gz.b64. Here we decode the content and inject + # the header to correcty location in BoringSSL. base64 -D < include/openssl/boringssl_prefix_symbols.h - H4sICIwn110AA2JvcmluZ3NzbF9wcmVmaXhfc3ltYm9scy5oAK2dXXPbRpa/7/dTqP57s1s1tWvJ + H4sICHlU2F0AA2JvcmluZ3NzbF9wcmVmaXhfc3ltYm9scy5oAK2dXXPbRpa/7/dTqP57s1s1tWvJ cSZzSUt0zI0taUg6G+8NCiRBCWOSYABQtvPp/9147ZdzGvgduCo1kwh4ngM2Gv2GRvd///fVbXb+ nqdPz+XVf2z/8+rm1fUvf7v6NcueDsnV4rT9r3/77/9W/1w9JvkxLYo0O12V2dWlSP52tVXg366O 2S7dq/+PT7v/zvKrXVqUebq5lMlV+ZwWV0W2L7/GeXK1Vwfj03ftOl/yc1YkV1/T8vlK/Vn/f3Yp @@ -2114,7 +2123,8 @@ Pod::Spec.new do |s| find . -type f \\( -path '*.h' -or -path '*.cc' -or -path '*.c' \\) -print0 | xargs -0 -L1 sed -E -i'.grpc_back' 's;#include ;#include ;g' END_OF_COMMAND end From 7b9fafe691d6050eba437480454f85ea1acd4871 Mon Sep 17 00:00:00 2001 From: Muxi Yan Date: Fri, 22 Nov 2019 14:07:41 -0800 Subject: [PATCH 026/758] Update the sanity checker --- .../distrib/check_boringssl_prefix_symbol.sh | 19 ++++++++++++------- .../generate_boringssl_prefix_header.sh | 4 ++-- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/tools/distrib/check_boringssl_prefix_symbol.sh b/tools/distrib/check_boringssl_prefix_symbol.sh index f101bf902cf..11e55e06109 100755 --- a/tools/distrib/check_boringssl_prefix_symbol.sh +++ b/tools/distrib/check_boringssl_prefix_symbol.sh @@ -13,17 +13,22 @@ # See the License for the specific language governing permissions and # limitations under the License. - -# Check if the current BoringSSL version's corresponding prefix header is uploaded to GCS. +# Check if the current BoringSSL prefix symbols is up to date set -e cd "$(dirname $0)" -cd ../../third_party/boringssl -BORINGSSL_COMMIT=$(git rev-parse HEAD) +BORINGSSL_COMMIT=$(cd ../../third_party/boringssl ; git rev-parse HEAD) + +mkdir -p ./output + +docker build ../dockerfile/grpc_objc/generate_boringssl_prefix_header -t grpc/boringssl_prefix_header +docker run -it --rm -v $(pwd)/output:/output grpc/boringssl_prefix_header $BORINGSSL_COMMIT + +diff ../../src/boringssl/boringssl_prefix_symbols.h.gz.b64 output/boringssl_prefix_symbols.h.gz.b64 -curl -f -L https://storage.googleapis.com/grpc_boringssl_prefix_headers/boringssl_prefix_symbols-$BORINGSSL_COMMIT.h > /dev/null +result=$? -[ $? == 0 ] || { echo "Cannot find prefix header of current BoringSSL commit ($BORINGSSL_COMMIT) on GCS." ; echo "Generate with tools/distrib/upgrade_boringssl_objc.sh" ; exit 1 ; } +rm -rf ./output -exit 0 +exit $result diff --git a/tools/dockerfile/grpc_objc/generate_boringssl_prefix_header/generate_boringssl_prefix_header.sh b/tools/dockerfile/grpc_objc/generate_boringssl_prefix_header/generate_boringssl_prefix_header.sh index 8f10f1a8005..4f1a573bbec 100755 --- a/tools/dockerfile/grpc_objc/generate_boringssl_prefix_header/generate_boringssl_prefix_header.sh +++ b/tools/dockerfile/grpc_objc/generate_boringssl_prefix_header/generate_boringssl_prefix_header.sh @@ -22,8 +22,8 @@ mkdir build cd build cmake .. -# gcc crashes on docker when using -j with too many cores. Limiting to 2 seems to be fine. -make -j2 +# gcc crashes on docker when using -j with too many cores. Limiting to 4 seems to be fine. +make -j4 [ -f ssl/libssl.a ] || { echo "Failed to build libssl.a" ; exit 1 ; } [ -f crypto/libcrypto.a ] || { echo "Failed to build libcrypto.a" ; exit 1 ; } From ed01a6b36cb1cba2827a8d7dec32b27310e93ee9 Mon Sep 17 00:00:00 2001 From: Muxi Yan Date: Fri, 22 Nov 2019 14:18:58 -0800 Subject: [PATCH 027/758] Regenerate --- src/boringssl/boringssl_prefix_symbols.h.gz.b64 | 2 +- src/objective-c/BoringSSL-GRPC.podspec | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/boringssl/boringssl_prefix_symbols.h.gz.b64 b/src/boringssl/boringssl_prefix_symbols.h.gz.b64 index 0928b58a7ec..3118c524da5 100644 --- a/src/boringssl/boringssl_prefix_symbols.h.gz.b64 +++ b/src/boringssl/boringssl_prefix_symbols.h.gz.b64 @@ -1,4 +1,4 @@ -H4sICHlU2F0AA2JvcmluZ3NzbF9wcmVmaXhfc3ltYm9scy5oAK2dXXPbRpa/7/dTqP57s1s1tWvJ +H4sICH9e2F0AA2JvcmluZ3NzbF9wcmVmaXhfc3ltYm9scy5oAK2dXXPbRpa/7/dTqP57s1s1tWvJ cSZzSUt0zI0taUg6G+8NCiRBCWOSYABQtvPp/9147ZdzGvgduCo1kwh4ngM2Gv2GRvd///fVbXb+ nqdPz+XVf2z/8+rm1fUvf7v6NcueDsnV4rT9r3/77/9W/1w9JvkxLYo0O12V2dWlSP52tVXg366O 2S7dq/+PT7v/zvKrXVqUebq5lMlV+ZwWV0W2L7/GeXK1Vwfj03ftOl/yc1YkV1/T8vlK/Vn/f3Yp diff --git a/src/objective-c/BoringSSL-GRPC.podspec b/src/objective-c/BoringSSL-GRPC.podspec index 881eb470d67..88af6e5903a 100644 --- a/src/objective-c/BoringSSL-GRPC.podspec +++ b/src/objective-c/BoringSSL-GRPC.podspec @@ -1633,7 +1633,7 @@ Pod::Spec.new do |s| # /src/boringssl/boringssl_prefix_symbols.h.gz.b64. Here we decode the content and inject # the header to correcty location in BoringSSL. base64 -D < include/openssl/boringssl_prefix_symbols.h - H4sICHlU2F0AA2JvcmluZ3NzbF9wcmVmaXhfc3ltYm9scy5oAK2dXXPbRpa/7/dTqP57s1s1tWvJ + H4sICH9e2F0AA2JvcmluZ3NzbF9wcmVmaXhfc3ltYm9scy5oAK2dXXPbRpa/7/dTqP57s1s1tWvJ cSZzSUt0zI0taUg6G+8NCiRBCWOSYABQtvPp/9147ZdzGvgduCo1kwh4ngM2Gv2GRvd///fVbXb+ nqdPz+XVf2z/8+rm1fUvf7v6NcueDsnV4rT9r3/77/9W/1w9JvkxLYo0O12V2dWlSP52tVXg366O 2S7dq/+PT7v/zvKrXVqUebq5lMlV+ZwWV0W2L7/GeXK1Vwfj03ftOl/yc1YkV1/T8vlK/Vn/f3Yp From 7e34c67596129b5687ee7de791a560e66bf263f8 Mon Sep 17 00:00:00 2001 From: Muxi Yan Date: Mon, 25 Nov 2019 13:31:19 -0800 Subject: [PATCH 028/758] generate_projects --- src/objective-c/BoringSSL-GRPC.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/objective-c/BoringSSL-GRPC.podspec b/src/objective-c/BoringSSL-GRPC.podspec index 88af6e5903a..c1257f47237 100644 --- a/src/objective-c/BoringSSL-GRPC.podspec +++ b/src/objective-c/BoringSSL-GRPC.podspec @@ -41,7 +41,7 @@ Pod::Spec.new do |s| s.name = 'BoringSSL-GRPC' - version = '0.0.7' + version = '0.0.6' s.version = version s.summary = 'BoringSSL is a fork of OpenSSL that is designed to meet Google\'s needs.' # Adapted from the homepage: From 24c40afc6b27bf543d8871d33122be4e7c791c55 Mon Sep 17 00:00:00 2001 From: Muxi Yan Date: Tue, 26 Nov 2019 15:40:24 -0800 Subject: [PATCH 029/758] Add BORINGSSL_PREFIX to CronetTests --- src/objective-c/tests/Tests.xcodeproj/project.pbxproj | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/objective-c/tests/Tests.xcodeproj/project.pbxproj b/src/objective-c/tests/Tests.xcodeproj/project.pbxproj index 84dde6ffff7..0279bde55a6 100644 --- a/src/objective-c/tests/Tests.xcodeproj/project.pbxproj +++ b/src/objective-c/tests/Tests.xcodeproj/project.pbxproj @@ -1326,6 +1326,13 @@ "$(PROJECT_DIR)/Pods/CronetFramework", ); GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_PREPROCESSOR_DEFINITIONS = ( + "$(inherited)", + "COCOAPODS=1", + "$(inherited)", + "GPB_USE_PROTOBUF_FRAMEWORK_IMPORTS=1", + "BORINGSSL_PREFIX=GRPC", + ); GCC_WARN_INHIBIT_ALL_WARNINGS = YES; INFOPLIST_FILE = Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; From 95db2916622b5a28ecead86b56aae90cda09a522 Mon Sep 17 00:00:00 2001 From: Muxi Yan Date: Tue, 26 Nov 2019 15:50:35 -0800 Subject: [PATCH 030/758] Fix sanity checker --- .../distrib/check_boringssl_prefix_symbol.sh | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/tools/distrib/check_boringssl_prefix_symbol.sh b/tools/distrib/check_boringssl_prefix_symbol.sh index 11e55e06109..d0912d89b61 100755 --- a/tools/distrib/check_boringssl_prefix_symbol.sh +++ b/tools/distrib/check_boringssl_prefix_symbol.sh @@ -17,18 +17,23 @@ set -e cd "$(dirname $0)" +cd ../../third_party/boringssl -BORINGSSL_COMMIT=$(cd ../../third_party/boringssl ; git rev-parse HEAD) +BORINGSSL_COMMIT=$(git rev-parse HEAD) -mkdir -p ./output +mkdir -p ./build +cd build +cmake .. +make -j4 +go run ../util/read_symbols.go ssl/libssl.a > ./symbols.txt +go run ../util/read_symbols.go crypto/libcrypto.a >> ./symbols.txt -docker build ../dockerfile/grpc_objc/generate_boringssl_prefix_header -t grpc/boringssl_prefix_header -docker run -it --rm -v $(pwd)/output:/output grpc/boringssl_prefix_header $BORINGSSL_COMMIT +cmake .. -DBORINGSSL_PREFIX=GRPC -DBORINGSSL_PREFIX_SYMBOLS=symbols.txt +make boringssl_prefix_symbols +gzip -c symbol_prefix_include/boringssl_prefix_symbols.h | base64 > boringssl_prefix_symbols.h.gz.b64 -diff ../../src/boringssl/boringssl_prefix_symbols.h.gz.b64 output/boringssl_prefix_symbols.h.gz.b64 +diff ../../../src/boringssl/boringssl_prefix_symbols.h.gz.b64 boringssl_prefix_symbols.h.gz.b64 result=$? -rm -rf ./output - exit $result From fc4a7802077c71e9b190012c89a28917fca4f12c Mon Sep 17 00:00:00 2001 From: Muxi Yan Date: Tue, 26 Nov 2019 16:14:21 -0800 Subject: [PATCH 031/758] Add cmake to Dockerfile --- tools/dockerfile/test/sanity/Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/dockerfile/test/sanity/Dockerfile b/tools/dockerfile/test/sanity/Dockerfile index aa03520f8a4..e51412fc785 100644 --- a/tools/dockerfile/test/sanity/Dockerfile +++ b/tools/dockerfile/test/sanity/Dockerfile @@ -21,6 +21,7 @@ RUN apt-get update && apt-get install -y \ build-essential \ bzip2 \ ccache \ + cmake \ curl \ dnsutils \ gcc \ From e05417db32266a18c8c611054a8c452c96eca49d Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Tue, 3 Dec 2019 17:14:57 -0800 Subject: [PATCH 032/758] Use LogicalThread in client channel code --- .../filters/client_channel/client_channel.cc | 109 ++++++++-------- .../ext/filters/client_channel/lb_policy.cc | 9 +- .../ext/filters/client_channel/lb_policy.h | 11 +- .../client_channel/lb_policy/grpclb/grpclb.cc | 68 ++++++---- .../client_channel/lb_policy/xds/xds.cc | 32 +++-- .../ext/filters/client_channel/resolver.cc | 6 +- .../ext/filters/client_channel/resolver.h | 10 +- .../resolver/dns/c_ares/dns_resolver_ares.cc | 16 ++- .../dns/c_ares/grpc_ares_ev_driver.cc | 47 ++++--- .../resolver/dns/c_ares/grpc_ares_ev_driver.h | 15 ++- .../dns/c_ares/grpc_ares_ev_driver_libuv.cc | 35 +++-- .../dns/c_ares/grpc_ares_ev_driver_posix.cc | 8 +- .../dns/c_ares/grpc_ares_ev_driver_windows.cc | 122 ++++++++---------- .../resolver/dns/c_ares/grpc_ares_wrapper.cc | 30 ++--- .../resolver/dns/c_ares/grpc_ares_wrapper.h | 3 +- .../dns/c_ares/grpc_ares_wrapper_fallback.cc | 5 +- .../resolver/dns/native/dns_resolver.cc | 17 ++- .../resolver/fake/fake_resolver.cc | 46 +++---- .../resolver/fake/fake_resolver.h | 6 +- .../filters/client_channel/resolver_factory.h | 2 +- .../client_channel/resolver_registry.cc | 4 +- .../client_channel/resolver_registry.h | 2 +- .../filters/client_channel/xds/xds_client.cc | 75 ++++++----- .../filters/client_channel/xds/xds_client.h | 11 +- src/core/lib/iomgr/closure.h | 6 + src/core/lib/iomgr/logical_thread.cc | 18 ++- src/core/lib/iomgr/logical_thread.h | 28 +++- src/core/lib/transport/connectivity_state.cc | 9 +- src/core/lib/transport/connectivity_state.h | 8 +- .../dns_resolver_connectivity_test.cc | 21 ++- .../resolvers/dns_resolver_cooldown_test.cc | 40 +++--- .../resolvers/dns_resolver_test.cc | 43 +++--- .../resolvers/fake_resolver_test.cc | 10 +- .../resolvers/sockaddr_resolver_test.cc | 53 ++++---- test/core/end2end/fuzzers/api_fuzzer.cc | 3 +- test/core/end2end/goaway_server_test.cc | 11 +- test/core/iomgr/logical_thread_test.cc | 29 +++-- test/cpp/naming/cancel_ares_query_test.cc | 7 +- test/cpp/naming/resolver_component_test.cc | 18 +-- 39 files changed, 529 insertions(+), 464 deletions(-) diff --git a/src/core/ext/filters/client_channel/client_channel.cc b/src/core/ext/filters/client_channel/client_channel.cc index 7e3fe1b3be9..c0255a9230c 100644 --- a/src/core/ext/filters/client_channel/client_channel.cc +++ b/src/core/ext/filters/client_channel/client_channel.cc @@ -56,8 +56,8 @@ #include "src/core/lib/gprpp/manual_constructor.h" #include "src/core/lib/gprpp/map.h" #include "src/core/lib/gprpp/sync.h" -#include "src/core/lib/iomgr/combiner.h" #include "src/core/lib/iomgr/iomgr.h" +#include "src/core/lib/iomgr/logical_thread.h" #include "src/core/lib/iomgr/polling_entity.h" #include "src/core/lib/profiling/timers.h" #include "src/core/lib/slice/slice_internal.h" @@ -209,8 +209,8 @@ class ChannelData { void Cancel(); private: - static void AddWatcherLocked(void* arg, grpc_error* ignored); - static void RemoveWatcherLocked(void* arg, grpc_error* ignored); + static void AddWatcherLocked(ExternalConnectivityWatcher* arg); + static void RemoveWatcherLocked(ExternalConnectivityWatcher* arg); ChannelData* chand_; grpc_polling_entity pollent_; @@ -218,8 +218,6 @@ class ChannelData { grpc_connectivity_state* state_; grpc_closure* on_complete_; grpc_closure* watcher_timer_init_; - grpc_closure add_closure_; - grpc_closure remove_closure_; Atomic done_{false}; }; @@ -247,7 +245,7 @@ class ChannelData { static void StartTransportOpLocked(void* arg, grpc_error* ignored); - static void TryToConnectLocked(void* arg, grpc_error* error_ignored); + static void TryToConnectLocked(ChannelData* arg); void ProcessLbPolicy( const Resolver::Result& resolver_result, @@ -283,7 +281,7 @@ class ChannelData { // // Fields used in the control plane. Guarded by combiner. // - Combiner* combiner_; + RefCountedPtr combiner_; grpc_pollset_set* interested_parties_; RefCountedPtr subchannel_pool_; OrphanablePtr resolving_lb_policy_; @@ -1049,15 +1047,21 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface { : parent_(std::move(parent)), state_(new_state), connected_subchannel_(std::move(connected_subchannel)) { - parent_->parent_->chand_->combiner_->Run( - GRPC_CLOSURE_INIT(&closure_, ApplyUpdateInControlPlaneCombiner, - this, nullptr), + ExecCtx::Run( + DEBUG_LOCATION, + GRPC_CLOSURE_CREATE( + [](void* arg, grpc_error* /*error*/) { + Updater* self = static_cast(arg); + self->parent_->parent_->chand_->combiner_->Run( + [self]() { ApplyUpdateInControlPlaneCombiner(self); }, + DEBUG_LOCATION); + }, + this, nullptr), GRPC_ERROR_NONE); } private: - static void ApplyUpdateInControlPlaneCombiner(void* arg, - grpc_error* /*error*/) { + static void ApplyUpdateInControlPlaneCombiner(void* arg) { Updater* self = static_cast(arg); if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) { gpr_log(GPR_INFO, @@ -1083,7 +1087,6 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface { RefCountedPtr parent_; grpc_connectivity_state state_; RefCountedPtr connected_subchannel_; - grpc_closure closure_; }; std::unique_ptr @@ -1146,9 +1149,16 @@ ChannelData::ExternalConnectivityWatcher::ExternalConnectivityWatcher( grpc_polling_entity_add_to_pollset_set(&pollent_, chand_->interested_parties_); GRPC_CHANNEL_STACK_REF(chand_->owning_stack_, "ExternalConnectivityWatcher"); - chand_->combiner_->Run( - GRPC_CLOSURE_INIT(&add_closure_, AddWatcherLocked, this, nullptr), - GRPC_ERROR_NONE); + ExecCtx::Run(DEBUG_LOCATION, + GRPC_CLOSURE_CREATE( + [](void* arg, grpc_error* /*error*/) { + auto* self = + static_cast(arg); + self->chand_->combiner_->Run( + [self]() { AddWatcherLocked(self); }, DEBUG_LOCATION); + }, + this, nullptr), + GRPC_ERROR_NONE); } ChannelData::ExternalConnectivityWatcher::~ExternalConnectivityWatcher() { @@ -1174,9 +1184,8 @@ void ChannelData::ExternalConnectivityWatcher::Notify( // Not needed in state SHUTDOWN, because the tracker will // automatically remove all watchers in that case. if (state != GRPC_CHANNEL_SHUTDOWN) { - chand_->combiner_->Run( - GRPC_CLOSURE_INIT(&remove_closure_, RemoveWatcherLocked, this, nullptr), - GRPC_ERROR_NONE); + chand_->combiner_->Run([this]() { RemoveWatcherLocked(this); }, + DEBUG_LOCATION); } } @@ -1188,15 +1197,12 @@ void ChannelData::ExternalConnectivityWatcher::Cancel() { } ExecCtx::Run(DEBUG_LOCATION, on_complete_, GRPC_ERROR_CANCELLED); // Hop back into the combiner to clean up. - chand_->combiner_->Run( - GRPC_CLOSURE_INIT(&remove_closure_, RemoveWatcherLocked, this, nullptr), - GRPC_ERROR_NONE); + chand_->combiner_->Run([this]() { RemoveWatcherLocked(this); }, + DEBUG_LOCATION); } void ChannelData::ExternalConnectivityWatcher::AddWatcherLocked( - void* arg, grpc_error* /*ignored*/) { - ExternalConnectivityWatcher* self = - static_cast(arg); + ExternalConnectivityWatcher* self) { Closure::Run(DEBUG_LOCATION, self->watcher_timer_init_, GRPC_ERROR_NONE); // Add new watcher. self->chand_->state_tracker_.AddWatcher( @@ -1205,9 +1211,7 @@ void ChannelData::ExternalConnectivityWatcher::AddWatcherLocked( } void ChannelData::ExternalConnectivityWatcher::RemoveWatcherLocked( - void* arg, grpc_error* /*ignored*/) { - ExternalConnectivityWatcher* self = - static_cast(arg); + ExternalConnectivityWatcher* self) { self->chand_->state_tracker_.RemoveWatcher(self); } @@ -1224,17 +1228,12 @@ class ChannelData::ConnectivityWatcherAdder { initial_state_(initial_state), watcher_(std::move(watcher)) { GRPC_CHANNEL_STACK_REF(chand_->owning_stack_, "ConnectivityWatcherAdder"); - chand_->combiner_->Run( - GRPC_CLOSURE_INIT(&closure_, - &ConnectivityWatcherAdder::AddWatcherLocked, this, - nullptr), - GRPC_ERROR_NONE); + chand_->combiner_->Run([this]() { AddWatcherLocked(this); }, + DEBUG_LOCATION); } private: - static void AddWatcherLocked(void* arg, grpc_error* /*error*/) { - ConnectivityWatcherAdder* self = - static_cast(arg); + static void AddWatcherLocked(ConnectivityWatcherAdder* self) { self->chand_->state_tracker_.AddWatcher(self->initial_state_, std::move(self->watcher_)); GRPC_CHANNEL_STACK_UNREF(self->chand_->owning_stack_, @@ -1245,7 +1244,6 @@ class ChannelData::ConnectivityWatcherAdder { ChannelData* chand_; grpc_connectivity_state initial_state_; OrphanablePtr watcher_; - grpc_closure closure_; }; // @@ -1258,17 +1256,12 @@ class ChannelData::ConnectivityWatcherRemover { AsyncConnectivityStateWatcherInterface* watcher) : chand_(chand), watcher_(watcher) { GRPC_CHANNEL_STACK_REF(chand_->owning_stack_, "ConnectivityWatcherRemover"); - chand_->combiner_->Run( - GRPC_CLOSURE_INIT(&closure_, - &ConnectivityWatcherRemover::RemoveWatcherLocked, - this, nullptr), - GRPC_ERROR_NONE); + chand_->combiner_->Run([this]() { RemoveWatcherLocked(this); }, + DEBUG_LOCATION); } private: - static void RemoveWatcherLocked(void* arg, grpc_error* /*error*/) { - ConnectivityWatcherRemover* self = - static_cast(arg); + static void RemoveWatcherLocked(ConnectivityWatcherRemover* self) { self->chand_->state_tracker_.RemoveWatcher(self->watcher_); GRPC_CHANNEL_STACK_UNREF(self->chand_->owning_stack_, "ConnectivityWatcherRemover"); @@ -1277,7 +1270,6 @@ class ChannelData::ConnectivityWatcherRemover { ChannelData* chand_; AsyncConnectivityStateWatcherInterface* watcher_; - grpc_closure closure_; }; // @@ -1418,7 +1410,7 @@ ChannelData::ChannelData(grpc_channel_element_args* args, grpc_error** error) client_channel_factory_( ClientChannelFactory::GetFromChannelArgs(args->channel_args)), channelz_node_(GetChannelzNode(args->channel_args)), - combiner_(grpc_combiner_create()), + combiner_(MakeRefCounted()), interested_parties_(grpc_pollset_set_create()), subchannel_pool_(GetSubchannelPool(args->channel_args)), state_tracker_("client_channel", GRPC_CHANNEL_IDLE), @@ -1489,7 +1481,6 @@ ChannelData::~ChannelData() { // Stop backup polling. grpc_client_channel_stop_backup_polling(interested_parties_); grpc_pollset_set_destroy(interested_parties_); - GRPC_COMBINER_UNREF(combiner_, "client_channel"); GRPC_ERROR_UNREF(disconnect_error_.Load(MemoryOrder::RELAXED)); gpr_mu_destroy(&info_mu_); } @@ -1890,9 +1881,11 @@ void ChannelData::StartTransportOp(grpc_channel_element* elem, op->handler_private.extra_arg = elem; GRPC_CHANNEL_STACK_REF(chand->owning_stack_, "start_transport_op"); chand->combiner_->Run( - GRPC_CLOSURE_INIT(&op->handler_private.closure, - ChannelData::StartTransportOpLocked, op, nullptr), - GRPC_ERROR_NONE); + Closure::ToFunction( + GRPC_CLOSURE_INIT(&op->handler_private.closure, + ChannelData::StartTransportOpLocked, op, nullptr), + GRPC_ERROR_NONE), + DEBUG_LOCATION); } void ChannelData::GetChannelInfo(grpc_channel_element* elem, @@ -1943,7 +1936,7 @@ ChannelData::GetConnectedSubchannelInDataPlane( return connected_subchannel->Ref(); } -void ChannelData::TryToConnectLocked(void* arg, grpc_error* /*error_ignored*/) { +void ChannelData::TryToConnectLocked(ChannelData* arg) { auto* chand = static_cast(arg); if (chand->resolving_lb_policy_ != nullptr) { chand->resolving_lb_policy_->ExitIdleLocked(); @@ -1958,8 +1951,16 @@ grpc_connectivity_state ChannelData::CheckConnectivityState( grpc_connectivity_state out = state_tracker_.state(); if (out == GRPC_CHANNEL_IDLE && try_to_connect) { GRPC_CHANNEL_STACK_REF(owning_stack_, "TryToConnect"); - combiner_->Run(GRPC_CLOSURE_CREATE(TryToConnectLocked, this, nullptr), - GRPC_ERROR_NONE); + ExecCtx::Run(DEBUG_LOCATION, + GRPC_CLOSURE_CREATE( + [](void* arg, grpc_error* /*error*/) { + auto* chand = static_cast(arg); + chand->combiner_->Run( + [chand]() { TryToConnectLocked(chand); }, + DEBUG_LOCATION); + }, + this, nullptr), + GRPC_ERROR_NONE); } return out; } diff --git a/src/core/ext/filters/client_channel/lb_policy.cc b/src/core/ext/filters/client_channel/lb_policy.cc index c7d756c9ace..d4e36c45a1f 100644 --- a/src/core/ext/filters/client_channel/lb_policy.cc +++ b/src/core/ext/filters/client_channel/lb_policy.cc @@ -33,13 +33,12 @@ DebugOnlyTraceFlag grpc_trace_lb_policy_refcount(false, "lb_policy_refcount"); LoadBalancingPolicy::LoadBalancingPolicy(Args args, intptr_t initial_refcount) : InternallyRefCounted(&grpc_trace_lb_policy_refcount, initial_refcount), - combiner_(GRPC_COMBINER_REF(args.combiner, "lb_policy")), + combiner_(std::move(args.combiner)), interested_parties_(grpc_pollset_set_create()), channel_control_helper_(std::move(args.channel_control_helper)) {} LoadBalancingPolicy::~LoadBalancingPolicy() { grpc_pollset_set_destroy(interested_parties_); - GRPC_COMBINER_UNREF(combiner_, "lb_policy"); } void LoadBalancingPolicy::Orphan() { @@ -106,8 +105,10 @@ LoadBalancingPolicy::PickResult LoadBalancingPolicy::QueuePicker::Pick( exit_idle_called_ = true; parent_->Ref().release(); // ref held by closure. parent_->combiner()->Run( - GRPC_CLOSURE_CREATE(&CallExitIdle, parent_.get(), nullptr), - GRPC_ERROR_NONE); + Closure::ToFunction( + GRPC_CLOSURE_CREATE(&CallExitIdle, parent_.get(), nullptr), + GRPC_ERROR_NONE), + DEBUG_LOCATION); } PickResult result; result.type = PickResult::PICK_QUEUE; diff --git a/src/core/ext/filters/client_channel/lb_policy.h b/src/core/ext/filters/client_channel/lb_policy.h index 7e9c206265b..c0d375a4351 100644 --- a/src/core/ext/filters/client_channel/lb_policy.h +++ b/src/core/ext/filters/client_channel/lb_policy.h @@ -31,7 +31,7 @@ #include "src/core/lib/gprpp/orphanable.h" #include "src/core/lib/gprpp/ref_counted_ptr.h" #include "src/core/lib/gprpp/string_view.h" -#include "src/core/lib/iomgr/combiner.h" +#include "src/core/lib/iomgr/logical_thread.h" #include "src/core/lib/iomgr/polling_entity.h" #include "src/core/lib/transport/connectivity_state.h" @@ -311,10 +311,7 @@ class LoadBalancingPolicy : public InternallyRefCounted { struct Args { /// The combiner under which all LB policy calls will be run. /// Policy does NOT take ownership of the reference to the combiner. - // TODO(roth): Once we have a C++-like interface for combiners, this - // API should change to take a smart pointer that does pass ownership - // of a reference. - Combiner* combiner = nullptr; + RefCountedPtr combiner; /// Channel control helper. /// Note: LB policies MUST NOT call any method on the helper from /// their constructor. @@ -387,7 +384,7 @@ class LoadBalancingPolicy : public InternallyRefCounted { }; protected: - Combiner* combiner() const { return combiner_; } + RefCountedPtr combiner() const { return combiner_; } // Note: LB policies MUST NOT call any method on the helper from their // constructor. @@ -400,7 +397,7 @@ class LoadBalancingPolicy : public InternallyRefCounted { private: /// Combiner under which LB policy actions take place. - Combiner* combiner_; + RefCountedPtr combiner_; /// Owned pointer to interested parties in load balancing decisions. grpc_pollset_set* interested_parties_; /// Channel control helper. diff --git a/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc b/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc index ed01b9cd8ae..e985e495403 100644 --- a/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +++ b/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc @@ -912,9 +912,11 @@ void GrpcLb::BalancerCallState::MaybeSendClientLoadReport(void* arg, grpc_error* error) { BalancerCallState* lb_calld = static_cast(arg); lb_calld->grpclb_policy()->combiner()->Run( - GRPC_CLOSURE_INIT(&lb_calld->client_load_report_closure_, - MaybeSendClientLoadReportLocked, lb_calld, nullptr), - GRPC_ERROR_REF(error)); + Closure::ToFunction( + GRPC_CLOSURE_INIT(&lb_calld->client_load_report_closure_, + MaybeSendClientLoadReportLocked, lb_calld, nullptr), + GRPC_ERROR_REF(error)), + DEBUG_LOCATION); } void GrpcLb::BalancerCallState::MaybeSendClientLoadReportLocked( @@ -997,9 +999,11 @@ void GrpcLb::BalancerCallState::ClientLoadReportDone(void* arg, grpc_error* error) { BalancerCallState* lb_calld = static_cast(arg); lb_calld->grpclb_policy()->combiner()->Run( - GRPC_CLOSURE_INIT(&lb_calld->client_load_report_closure_, - ClientLoadReportDoneLocked, lb_calld, nullptr), - GRPC_ERROR_REF(error)); + Closure::ToFunction( + GRPC_CLOSURE_INIT(&lb_calld->client_load_report_closure_, + ClientLoadReportDoneLocked, lb_calld, nullptr), + GRPC_ERROR_REF(error)), + DEBUG_LOCATION); } void GrpcLb::BalancerCallState::ClientLoadReportDoneLocked(void* arg, @@ -1019,9 +1023,11 @@ void GrpcLb::BalancerCallState::OnInitialRequestSent(void* arg, grpc_error* error) { BalancerCallState* lb_calld = static_cast(arg); lb_calld->grpclb_policy()->combiner()->Run( - GRPC_CLOSURE_INIT(&lb_calld->lb_on_initial_request_sent_, - OnInitialRequestSentLocked, lb_calld, nullptr), - GRPC_ERROR_REF(error)); + Closure::ToFunction( + GRPC_CLOSURE_INIT(&lb_calld->lb_on_initial_request_sent_, + OnInitialRequestSentLocked, lb_calld, nullptr), + GRPC_ERROR_REF(error)), + DEBUG_LOCATION); } void GrpcLb::BalancerCallState::OnInitialRequestSentLocked( @@ -1043,9 +1049,11 @@ void GrpcLb::BalancerCallState::OnBalancerMessageReceived(void* arg, grpc_error* error) { BalancerCallState* lb_calld = static_cast(arg); lb_calld->grpclb_policy()->combiner()->Run( - GRPC_CLOSURE_INIT(&lb_calld->lb_on_balancer_message_received_, - OnBalancerMessageReceivedLocked, lb_calld, nullptr), - GRPC_ERROR_REF(error)); + Closure::ToFunction( + GRPC_CLOSURE_INIT(&lb_calld->lb_on_balancer_message_received_, + OnBalancerMessageReceivedLocked, lb_calld, nullptr), + GRPC_ERROR_REF(error)), + DEBUG_LOCATION); } void GrpcLb::BalancerCallState::OnBalancerMessageReceivedLocked( @@ -1199,9 +1207,11 @@ void GrpcLb::BalancerCallState::OnBalancerStatusReceived(void* arg, grpc_error* error) { BalancerCallState* lb_calld = static_cast(arg); lb_calld->grpclb_policy()->combiner()->Run( - GRPC_CLOSURE_INIT(&lb_calld->lb_on_balancer_status_received_, - OnBalancerStatusReceivedLocked, lb_calld, nullptr), - GRPC_ERROR_REF(error)); + Closure::ToFunction( + GRPC_CLOSURE_INIT(&lb_calld->lb_on_balancer_status_received_, + OnBalancerStatusReceivedLocked, lb_calld, nullptr), + GRPC_ERROR_REF(error)), + DEBUG_LOCATION); } void GrpcLb::BalancerCallState::OnBalancerStatusReceivedLocked( @@ -1539,10 +1549,12 @@ void GrpcLb::OnBalancerChannelConnectivityChanged(void* arg, grpc_error* error) { GrpcLb* self = static_cast(arg); self->combiner()->Run( - GRPC_CLOSURE_INIT(&self->lb_channel_on_connectivity_changed_, - &GrpcLb::OnBalancerChannelConnectivityChangedLocked, - self, nullptr), - GRPC_ERROR_REF(error)); + Closure::ToFunction( + GRPC_CLOSURE_INIT(&self->lb_channel_on_connectivity_changed_, + &GrpcLb::OnBalancerChannelConnectivityChangedLocked, + self, nullptr), + GRPC_ERROR_REF(error)), + DEBUG_LOCATION); } void GrpcLb::OnBalancerChannelConnectivityChangedLocked(void* arg, @@ -1636,10 +1648,12 @@ void GrpcLb::StartBalancerCallRetryTimerLocked() { void GrpcLb::OnBalancerCallRetryTimer(void* arg, grpc_error* error) { GrpcLb* grpclb_policy = static_cast(arg); grpclb_policy->combiner()->Run( - GRPC_CLOSURE_INIT(&grpclb_policy->lb_on_call_retry_, - &GrpcLb::OnBalancerCallRetryTimerLocked, grpclb_policy, - nullptr), - GRPC_ERROR_REF(error)); + Closure::ToFunction( + GRPC_CLOSURE_INIT(&grpclb_policy->lb_on_call_retry_, + &GrpcLb::OnBalancerCallRetryTimerLocked, + grpclb_policy, nullptr), + GRPC_ERROR_REF(error)), + DEBUG_LOCATION); } void GrpcLb::OnBalancerCallRetryTimerLocked(void* arg, grpc_error* error) { @@ -1681,9 +1695,11 @@ void GrpcLb::MaybeEnterFallbackModeAfterStartup() { void GrpcLb::OnFallbackTimer(void* arg, grpc_error* error) { GrpcLb* grpclb_policy = static_cast(arg); grpclb_policy->combiner()->Run( - GRPC_CLOSURE_INIT(&grpclb_policy->lb_on_fallback_, - &GrpcLb::OnFallbackTimerLocked, grpclb_policy, nullptr), - GRPC_ERROR_REF(error)); + Closure::ToFunction(GRPC_CLOSURE_INIT(&grpclb_policy->lb_on_fallback_, + &GrpcLb::OnFallbackTimerLocked, + grpclb_policy, nullptr), + GRPC_ERROR_REF(error)), + DEBUG_LOCATION); } void GrpcLb::OnFallbackTimerLocked(void* arg, grpc_error* error) { diff --git a/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc b/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc index d3ca8db862c..cb0cfcd6d66 100644 --- a/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc +++ b/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc @@ -867,9 +867,11 @@ void XdsLb::MaybeCancelFallbackAtStartupChecks() { void XdsLb::OnFallbackTimer(void* arg, grpc_error* error) { XdsLb* xdslb_policy = static_cast(arg); xdslb_policy->combiner()->Run( - GRPC_CLOSURE_INIT(&xdslb_policy->lb_on_fallback_, - &XdsLb::OnFallbackTimerLocked, xdslb_policy, nullptr), - GRPC_ERROR_REF(error)); + Closure::ToFunction(GRPC_CLOSURE_INIT(&xdslb_policy->lb_on_fallback_, + &XdsLb::OnFallbackTimerLocked, + xdslb_policy, nullptr), + GRPC_ERROR_REF(error)), + DEBUG_LOCATION); } void XdsLb::OnFallbackTimerLocked(void* arg, grpc_error* error) { @@ -1404,9 +1406,11 @@ void XdsLb::PriorityList::LocalityMap::OnDelayedRemovalTimer( void* arg, grpc_error* error) { LocalityMap* self = static_cast(arg); self->xds_policy_->combiner()->Run( - GRPC_CLOSURE_INIT(&self->on_delayed_removal_timer_, - OnDelayedRemovalTimerLocked, self, nullptr), - GRPC_ERROR_REF(error)); + Closure::ToFunction( + GRPC_CLOSURE_INIT(&self->on_delayed_removal_timer_, + OnDelayedRemovalTimerLocked, self, nullptr), + GRPC_ERROR_REF(error)), + DEBUG_LOCATION); } void XdsLb::PriorityList::LocalityMap::OnDelayedRemovalTimerLocked( @@ -1443,9 +1447,11 @@ void XdsLb::PriorityList::LocalityMap::OnFailoverTimer(void* arg, grpc_error* error) { LocalityMap* self = static_cast(arg); self->xds_policy_->combiner()->Run( - GRPC_CLOSURE_INIT(&self->on_failover_timer_, OnFailoverTimerLocked, self, - nullptr), - GRPC_ERROR_REF(error)); + Closure::ToFunction( + GRPC_CLOSURE_INIT(&self->on_failover_timer_, OnFailoverTimerLocked, + self, nullptr), + GRPC_ERROR_REF(error)), + DEBUG_LOCATION); } void XdsLb::PriorityList::LocalityMap::OnFailoverTimerLocked( @@ -1699,9 +1705,11 @@ void XdsLb::PriorityList::LocalityMap::Locality::OnDelayedRemovalTimer( void* arg, grpc_error* error) { Locality* self = static_cast(arg); self->xds_policy()->combiner()->Run( - GRPC_CLOSURE_INIT(&self->on_delayed_removal_timer_, - OnDelayedRemovalTimerLocked, self, nullptr), - GRPC_ERROR_REF(error)); + Closure::ToFunction( + GRPC_CLOSURE_INIT(&self->on_delayed_removal_timer_, + OnDelayedRemovalTimerLocked, self, nullptr), + GRPC_ERROR_REF(error)), + DEBUG_LOCATION); } void XdsLb::PriorityList::LocalityMap::Locality::OnDelayedRemovalTimerLocked( diff --git a/src/core/ext/filters/client_channel/resolver.cc b/src/core/ext/filters/client_channel/resolver.cc index ff3e47f701b..fe23ca75699 100644 --- a/src/core/ext/filters/client_channel/resolver.cc +++ b/src/core/ext/filters/client_channel/resolver.cc @@ -30,13 +30,11 @@ namespace grpc_core { // Resolver // -Resolver::Resolver(Combiner* combiner, +Resolver::Resolver(RefCountedPtr combiner, std::unique_ptr result_handler) : InternallyRefCounted(&grpc_trace_resolver_refcount), result_handler_(std::move(result_handler)), - combiner_(GRPC_COMBINER_REF(combiner, "resolver")) {} - -Resolver::~Resolver() { GRPC_COMBINER_UNREF(combiner_, "resolver"); } + combiner_(std::move(combiner)) {} // // Resolver::Result diff --git a/src/core/ext/filters/client_channel/resolver.h b/src/core/ext/filters/client_channel/resolver.h index 56bf273fa12..fca67c82775 100644 --- a/src/core/ext/filters/client_channel/resolver.h +++ b/src/core/ext/filters/client_channel/resolver.h @@ -27,8 +27,8 @@ #include "src/core/ext/filters/client_channel/service_config.h" #include "src/core/lib/gprpp/orphanable.h" #include "src/core/lib/gprpp/ref_counted_ptr.h" -#include "src/core/lib/iomgr/combiner.h" #include "src/core/lib/iomgr/iomgr.h" +#include "src/core/lib/iomgr/logical_thread.h" extern grpc_core::DebugOnlyTraceFlag grpc_trace_resolver_refcount; @@ -87,7 +87,7 @@ class Resolver : public InternallyRefCounted { // Not copyable nor movable. Resolver(const Resolver&) = delete; Resolver& operator=(const Resolver&) = delete; - virtual ~Resolver(); + virtual ~Resolver() {} /// Starts resolving. virtual void StartLocked() = 0; @@ -126,19 +126,19 @@ class Resolver : public InternallyRefCounted { // TODO(roth): Once we have a C++-like interface for combiners, this // API should change to take a RefCountedPtr<>, so that we always take // ownership of a new ref. - explicit Resolver(Combiner* combiner, + explicit Resolver(RefCountedPtr combiner, std::unique_ptr result_handler); /// Shuts down the resolver. virtual void ShutdownLocked() = 0; - Combiner* combiner() const { return combiner_; } + RefCountedPtr combiner() const { return combiner_; } ResultHandler* result_handler() const { return result_handler_.get(); } private: std::unique_ptr result_handler_; - Combiner* combiner_; + RefCountedPtr combiner_; }; } // namespace grpc_core diff --git a/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc b/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc index 3f281537e2d..93a990630e8 100644 --- a/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +++ b/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc @@ -40,9 +40,9 @@ #include "src/core/lib/channel/channel_args.h" #include "src/core/lib/gpr/string.h" #include "src/core/lib/gprpp/manual_constructor.h" -#include "src/core/lib/iomgr/combiner.h" #include "src/core/lib/iomgr/gethostname.h" #include "src/core/lib/iomgr/iomgr_custom.h" +#include "src/core/lib/iomgr/logical_thread.h" #include "src/core/lib/iomgr/resolve_address.h" #include "src/core/lib/iomgr/timer.h" #include "src/core/lib/json/json.h" @@ -201,9 +201,11 @@ void AresDnsResolver::ShutdownLocked() { void AresDnsResolver::OnNextResolution(void* arg, grpc_error* error) { AresDnsResolver* r = static_cast(arg); - r->combiner()->Run(GRPC_CLOSURE_INIT(&r->on_next_resolution_, - OnNextResolutionLocked, r, nullptr), - GRPC_ERROR_REF(error)); + r->combiner()->Run( + Closure::ToFunction(GRPC_CLOSURE_INIT(&r->on_next_resolution_, + OnNextResolutionLocked, r, nullptr), + GRPC_ERROR_REF(error)), + DEBUG_LOCATION); } void AresDnsResolver::OnNextResolutionLocked(void* arg, grpc_error* error) { @@ -326,8 +328,10 @@ char* ChooseServiceConfig(char* service_config_choice_json, void AresDnsResolver::OnResolved(void* arg, grpc_error* error) { AresDnsResolver* r = static_cast(arg); r->combiner()->Run( - GRPC_CLOSURE_INIT(&r->on_resolved_, OnResolvedLocked, r, nullptr), - GRPC_ERROR_REF(error)); + Closure::ToFunction( + GRPC_CLOSURE_INIT(&r->on_resolved_, OnResolvedLocked, r, nullptr), + GRPC_ERROR_REF(error)), + DEBUG_LOCATION); } void AresDnsResolver::OnResolvedLocked(void* arg, grpc_error* error) { diff --git a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc index 626b725ef4f..00e93d038c1 100644 --- a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc +++ b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc @@ -31,7 +31,6 @@ #include #include "src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h" #include "src/core/lib/gpr/string.h" -#include "src/core/lib/iomgr/combiner.h" #include "src/core/lib/iomgr/iomgr_internal.h" #include "src/core/lib/iomgr/sockaddr_utils.h" #include "src/core/lib/iomgr/timer.h" @@ -67,7 +66,7 @@ struct grpc_ares_ev_driver { gpr_refcount refs; /** combiner to synchronize c-ares and I/O callbacks on */ - grpc_core::Combiner* combiner; + grpc_core::RefCountedPtr combiner; /** a list of grpc_fd that this event driver is currently using. */ fd_node* fds; /** is this event driver currently working? */ @@ -107,7 +106,6 @@ static void grpc_ares_ev_driver_unref(grpc_ares_ev_driver* ev_driver) { GRPC_CARES_TRACE_LOG("request:%p destroy ev_driver %p", ev_driver->request, ev_driver); GPR_ASSERT(ev_driver->fds == nullptr); - GRPC_COMBINER_UNREF(ev_driver->combiner, "free ares event driver"); ares_destroy(ev_driver->channel); grpc_ares_complete_request_locked(ev_driver->request); delete ev_driver; @@ -143,11 +141,11 @@ static void noop_inject_channel_config(ares_channel /*channel*/) {} void (*grpc_ares_test_only_inject_config)(ares_channel channel) = noop_inject_channel_config; -grpc_error* grpc_ares_ev_driver_create_locked(grpc_ares_ev_driver** ev_driver, - grpc_pollset_set* pollset_set, - int query_timeout_ms, - grpc_core::Combiner* combiner, - grpc_ares_request* request) { +grpc_error* grpc_ares_ev_driver_create_locked( + grpc_ares_ev_driver** ev_driver, grpc_pollset_set* pollset_set, + int query_timeout_ms, + grpc_core::RefCountedPtr combiner, + grpc_ares_request* request) { *ev_driver = new grpc_ares_ev_driver(); ares_options opts; memset(&opts, 0, sizeof(opts)); @@ -164,7 +162,7 @@ grpc_error* grpc_ares_ev_driver_create_locked(grpc_ares_ev_driver** ev_driver, gpr_free(*ev_driver); return err; } - (*ev_driver)->combiner = GRPC_COMBINER_REF(combiner, "ares event driver"); + (*ev_driver)->combiner = std::move(combiner); gpr_ref_init(&(*ev_driver)->refs, 1); (*ev_driver)->pollset_set = pollset_set; (*ev_driver)->fds = nullptr; @@ -234,9 +232,12 @@ static grpc_millis calculate_next_ares_backup_poll_alarm_ms( static void on_timeout(void* arg, grpc_error* error) { grpc_ares_ev_driver* driver = static_cast(arg); - driver->combiner->Run(GRPC_CLOSURE_INIT(&driver->on_timeout_locked, - on_timeout_locked, driver, nullptr), - GRPC_ERROR_REF(error)); + driver->combiner->Run( + grpc_core::Closure::ToFunction( + GRPC_CLOSURE_INIT(&driver->on_timeout_locked, on_timeout_locked, + driver, nullptr), + GRPC_ERROR_REF(error)), + DEBUG_LOCATION); } static void on_timeout_locked(void* arg, grpc_error* error) { @@ -254,9 +255,11 @@ static void on_timeout_locked(void* arg, grpc_error* error) { static void on_ares_backup_poll_alarm(void* arg, grpc_error* error) { grpc_ares_ev_driver* driver = static_cast(arg); driver->combiner->Run( - GRPC_CLOSURE_INIT(&driver->on_ares_backup_poll_alarm_locked, - on_ares_backup_poll_alarm_locked, driver, nullptr), - GRPC_ERROR_REF(error)); + grpc_core::Closure::ToFunction( + GRPC_CLOSURE_INIT(&driver->on_ares_backup_poll_alarm_locked, + on_ares_backup_poll_alarm_locked, driver, nullptr), + GRPC_ERROR_REF(error)), + DEBUG_LOCATION); } /* In case of non-responsive DNS servers, dropped packets, etc., c-ares has @@ -331,8 +334,11 @@ static void on_readable_locked(void* arg, grpc_error* error) { static void on_readable(void* arg, grpc_error* error) { fd_node* fdn = static_cast(arg); fdn->ev_driver->combiner->Run( - GRPC_CLOSURE_INIT(&fdn->read_closure, on_readable_locked, fdn, nullptr), - GRPC_ERROR_REF(error)); + grpc_core::Closure::ToFunction( + GRPC_CLOSURE_INIT(&fdn->read_closure, on_readable_locked, fdn, + nullptr), + GRPC_ERROR_REF(error)), + DEBUG_LOCATION); } static void on_writable_locked(void* arg, grpc_error* error) { @@ -361,8 +367,11 @@ static void on_writable_locked(void* arg, grpc_error* error) { static void on_writable(void* arg, grpc_error* error) { fd_node* fdn = static_cast(arg); fdn->ev_driver->combiner->Run( - GRPC_CLOSURE_INIT(&fdn->write_closure, on_writable_locked, fdn, nullptr), - GRPC_ERROR_REF(error)); + grpc_core::Closure::ToFunction( + GRPC_CLOSURE_INIT(&fdn->write_closure, on_writable_locked, fdn, + nullptr), + GRPC_ERROR_REF(error)), + DEBUG_LOCATION); } ares_channel* grpc_ares_ev_driver_get_channel_locked( diff --git a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h index 1a5a3f6e171..816e7319bb7 100644 --- a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +++ b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h @@ -40,11 +40,11 @@ ares_channel* grpc_ares_ev_driver_get_channel_locked( /* Creates a new grpc_ares_ev_driver. Returns GRPC_ERROR_NONE if \a ev_driver is created successfully. */ -grpc_error* grpc_ares_ev_driver_create_locked(grpc_ares_ev_driver** ev_driver, - grpc_pollset_set* pollset_set, - int query_timeout_ms, - grpc_core::Combiner* combiner, - grpc_ares_request* request); +grpc_error* grpc_ares_ev_driver_create_locked( + grpc_ares_ev_driver** ev_driver, grpc_pollset_set* pollset_set, + int query_timeout_ms, + grpc_core::RefCountedPtr combiner, + grpc_ares_request* request); /* Called back when all DNS lookups have completed. */ void grpc_ares_ev_driver_on_queries_complete_locked( @@ -90,12 +90,13 @@ class GrpcPolledFdFactory { /* Creates a new wrapped fd for the current platform */ virtual GrpcPolledFd* NewGrpcPolledFdLocked( ares_socket_t as, grpc_pollset_set* driver_pollset_set, - Combiner* combiner) = 0; + RefCountedPtr combiner) = 0; /* Optionally configures the ares channel after creation */ virtual void ConfigureAresChannelLocked(ares_channel channel) = 0; }; -std::unique_ptr NewGrpcPolledFdFactory(Combiner* combiner); +std::unique_ptr NewGrpcPolledFdFactory( + RefCountedPtr combiner); } // namespace grpc_core diff --git a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc index 5d26f5bb88c..66e27e641b9 100644 --- a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc +++ b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc @@ -31,7 +31,7 @@ #include #include "src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h" #include "src/core/lib/gpr/string.h" -#include "src/core/lib/iomgr/combiner.h" +#include "src/core/lib/iomgr/logical_thread.h" namespace grpc_core { @@ -41,19 +41,15 @@ void ares_uv_poll_close_cb(uv_handle_t* handle) { delete handle; } class GrpcPolledFdLibuv : public GrpcPolledFd { public: - GrpcPolledFdLibuv(ares_socket_t as, Combiner* combiner) - : as_(as), combiner_(combiner) { + GrpcPolledFdLibuv(ares_socket_t as, RefCountedPtr combiner) + : as_(as), combiner_(std::move(combiner)) { gpr_asprintf(&name_, "c-ares socket: %" PRIdPTR, (intptr_t)as); handle_ = new uv_poll_t(); uv_poll_init_socket(uv_default_loop(), handle_, as); handle_->data = this; - GRPC_COMBINER_REF(combiner_, "libuv ares event driver"); } - ~GrpcPolledFdLibuv() { - gpr_free(name_); - GRPC_COMBINER_UNREF(combiner_, "libuv ares event driver"); - } + ~GrpcPolledFdLibuv() { gpr_free(name_); } void RegisterForOnReadableLocked(grpc_closure* read_closure) override { GPR_ASSERT(read_closure_ == nullptr); @@ -77,7 +73,7 @@ class GrpcPolledFdLibuv : public GrpcPolledFd { return false; } - void ShutdownInternalLocked(grpc_error* error) { + void ShutdownInternalLocked(grpc_error* /*error*/) { uv_poll_stop(handle_); uv_close(reinterpret_cast(handle_), ares_uv_poll_close_cb); if (read_closure_ != nullptr) { @@ -109,7 +105,7 @@ class GrpcPolledFdLibuv : public GrpcPolledFd { grpc_closure* read_closure_ = nullptr; grpc_closure* write_closure_ = nullptr; int poll_events_ = 0; - Combiner* combiner_; + RefCountedPtr combiner_; }; struct AresUvPollCbArg { @@ -121,14 +117,14 @@ struct AresUvPollCbArg { int events; }; -static void ares_uv_poll_cb_locked(void* arg, grpc_error* error) { - std::unique_ptr arg_struct( - reinterpret_cast(arg)); +static void ares_uv_poll_cb_locked(AresUvPollCbArg* arg) { + std::unique_ptr arg_struct(arg); uv_poll_t* handle = arg_struct->handle; int status = arg_struct->status; int events = arg_struct->events; GrpcPolledFdLibuv* polled_fd = reinterpret_cast(handle->data); + grpc_error* error = GRPC_ERROR_NONE; if (status < 0) { error = GRPC_ERROR_CREATE_FROM_STATIC_STRING("cares polling error"); error = @@ -155,16 +151,15 @@ void ares_uv_poll_cb(uv_poll_t* handle, int status, int events) { GrpcPolledFdLibuv* polled_fd = reinterpret_cast(handle->data); AresUvPollCbArg* arg = new AresUvPollCbArg(handle, status, events); - polled_fd->combiner_->Run( - GRPC_CLOSURE_CREATE(ares_uv_poll_cb_locked, arg, nullptr), - GRPC_ERROR_NONE); + polled_fd->combiner_->Run([arg]() { ares_uv_poll_cb_locked(arg); }, + DEBUG_LOCATION); } class GrpcPolledFdFactoryLibuv : public GrpcPolledFdFactory { public: - GrpcPolledFd* NewGrpcPolledFdLocked(ares_socket_t as, - grpc_pollset_set* driver_pollset_set, - Combiner* combiner) override { + GrpcPolledFd* NewGrpcPolledFdLocked( + ares_socket_t as, grpc_pollset_set* driver_pollset_set, + RefCountedPtr combiner) override { return new GrpcPolledFdLibuv(as, combiner); } @@ -172,7 +167,7 @@ class GrpcPolledFdFactoryLibuv : public GrpcPolledFdFactory { }; std::unique_ptr NewGrpcPolledFdFactory( - Combiner* combiner) { + RefCountedPtr /*combiner*/) { return MakeUnique(); } diff --git a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc index 5ae7d3c1adb..d5d761991af 100644 --- a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +++ b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc @@ -88,9 +88,9 @@ class GrpcPolledFdPosix : public GrpcPolledFd { class GrpcPolledFdFactoryPosix : public GrpcPolledFdFactory { public: - GrpcPolledFd* NewGrpcPolledFdLocked(ares_socket_t as, - grpc_pollset_set* driver_pollset_set, - Combiner* /*combiner*/) override { + GrpcPolledFd* NewGrpcPolledFdLocked( + ares_socket_t as, grpc_pollset_set* driver_pollset_set, + RefCountedPtr /*combiner*/) override { return new GrpcPolledFdPosix(as, driver_pollset_set); } @@ -98,7 +98,7 @@ class GrpcPolledFdFactoryPosix : public GrpcPolledFdFactory { }; std::unique_ptr NewGrpcPolledFdFactory( - Combiner* /*combiner*/) { + RefCountedPtr /*combiner*/) { return MakeUnique(); } diff --git a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc index 0b8d767630d..cd1a1eaeac9 100644 --- a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +++ b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc @@ -97,8 +97,8 @@ class GrpcPolledFdWindows { WRITE_WAITING_FOR_VERIFICATION_UPON_RETRY, }; - GrpcPolledFdWindows(ares_socket_t as, Combiner* combiner, int address_family, - int socket_type) + GrpcPolledFdWindows(ares_socket_t as, RefCountedPtr combiner, + int address_family, int socket_type) : read_buf_(grpc_empty_slice()), write_buf_(grpc_empty_slice()), tcp_write_state_(WRITE_IDLE), @@ -107,18 +107,10 @@ class GrpcPolledFdWindows { socket_type_(socket_type) { gpr_asprintf(&name_, "c-ares socket: %" PRIdPTR, as); winsocket_ = grpc_winsocket_create(as, name_); - combiner_ = GRPC_COMBINER_REF(combiner, name_); - GRPC_CLOSURE_INIT(&continue_register_for_on_readable_locked_, - &GrpcPolledFdWindows::ContinueRegisterForOnReadableLocked, - this, nullptr); - GRPC_CLOSURE_INIT( - &continue_register_for_on_writeable_locked_, - &GrpcPolledFdWindows::ContinueRegisterForOnWriteableLocked, this, - nullptr); + combiner_ = std::move(combiner); } ~GrpcPolledFdWindows() { - GRPC_COMBINER_UNREF(combiner_, name_); grpc_slice_unref_internal(read_buf_); grpc_slice_unref_internal(write_buf_); GPR_ASSERT(read_closure_ == nullptr); @@ -145,19 +137,16 @@ class GrpcPolledFdWindows { GPR_ASSERT(!read_buf_has_data_); read_buf_ = GRPC_SLICE_MALLOC(4192); if (connect_done_) { - combiner_->Run(&continue_register_for_on_readable_locked_, - GRPC_ERROR_NONE); + combiner_->Run([this]() { ContinueRegisterForOnReadableLocked(this); }, + DEBUG_LOCATION); } else { - GPR_ASSERT(pending_continue_register_for_on_readable_locked_ == nullptr); - pending_continue_register_for_on_readable_locked_ = - &continue_register_for_on_readable_locked_; + GPR_ASSERT(pending_continue_register_for_on_readable_locked_ == false); + pending_continue_register_for_on_readable_locked_ = true; } } - static void ContinueRegisterForOnReadableLocked(void* arg, - grpc_error* unused_error) { - GrpcPolledFdWindows* grpc_polled_fd = - static_cast(arg); + static void ContinueRegisterForOnReadableLocked( + GrpcPolledFdWindows* grpc_polled_fd) { grpc_polled_fd->InnerContinueRegisterForOnReadableLocked(GRPC_ERROR_NONE); } @@ -213,19 +202,16 @@ class GrpcPolledFdWindows { GPR_ASSERT(write_closure_ == nullptr); write_closure_ = write_closure; if (connect_done_) { - combiner_->Run(&continue_register_for_on_writeable_locked_, - GRPC_ERROR_NONE); + combiner_->Run([this]() { ContinueRegisterForOnWriteableLocked(this); }, + DEBUG_LOCATION); } else { - GPR_ASSERT(pending_continue_register_for_on_writeable_locked_ == nullptr); - pending_continue_register_for_on_writeable_locked_ = - &continue_register_for_on_writeable_locked_; + GPR_ASSERT(pending_continue_register_for_on_writeable_locked_ == false); + pending_continue_register_for_on_writeable_locked_ = true; } } - static void ContinueRegisterForOnWriteableLocked(void* arg, - grpc_error* unused_error) { - GrpcPolledFdWindows* grpc_polled_fd = - static_cast(arg); + static void ContinueRegisterForOnWriteableLocked( + GrpcPolledFdWindows* grpc_polled_fd) { grpc_polled_fd->InnerContinueRegisterForOnWriteableLocked(GRPC_ERROR_NONE); } @@ -441,10 +427,12 @@ class GrpcPolledFdWindows { GrpcPolledFdWindows* grpc_polled_fd = static_cast(arg); grpc_polled_fd->combiner_->Run( - GRPC_CLOSURE_INIT(&grpc_polled_fd->on_tcp_connect_locked_, - &GrpcPolledFdWindows::OnTcpConnectLocked, - grpc_polled_fd, nullptr), - GRPC_ERROR_REF(error)); + Closure::ToFunction( + GRPC_CLOSURE_INIT(&grpc_polled_fd->on_tcp_connect_locked_, + &GrpcPolledFdWindows::OnTcpConnectLocked, + grpc_polled_fd, nullptr), + GRPC_ERROR_REF(error)), + DEBUG_LOCATION); } static void OnTcpConnectLocked(void* arg, grpc_error* error) { @@ -456,8 +444,8 @@ class GrpcPolledFdWindows { void InnerOnTcpConnectLocked(grpc_error* error) { GRPC_CARES_TRACE_LOG( "fd:%s InnerOnTcpConnectLocked error:|%s| " - "pending_register_for_readable:%" PRIdPTR - " pending_register_for_writeable:%" PRIdPTR, + "pending_register_for_readable:%d" + " pending_register_for_writeable:%d", GetName(), grpc_error_string(error), pending_continue_register_for_on_readable_locked_, pending_continue_register_for_on_writeable_locked_); @@ -486,13 +474,13 @@ class GrpcPolledFdWindows { // this fd to abort. wsa_connect_error_ = WSA_OPERATION_ABORTED; } - if (pending_continue_register_for_on_readable_locked_ != nullptr) { - combiner_->Run(pending_continue_register_for_on_readable_locked_, - GRPC_ERROR_NONE); + if (pending_continue_register_for_on_readable_locked_) { + combiner_->Run([this]() { ContinueRegisterForOnReadableLocked(this); }, + DEBUG_LOCATION); } - if (pending_continue_register_for_on_writeable_locked_ != nullptr) { - combiner_->Run(pending_continue_register_for_on_writeable_locked_, - GRPC_ERROR_NONE); + if (pending_continue_register_for_on_writeable_locked_) { + combiner_->Run([this]() { ContinueRegisterForOnWriteableLocked(this); }, + DEBUG_LOCATION); } } @@ -603,10 +591,12 @@ class GrpcPolledFdWindows { static void OnIocpReadable(void* arg, grpc_error* error) { GrpcPolledFdWindows* polled_fd = static_cast(arg); polled_fd->combiner_->Run( - GRPC_CLOSURE_INIT(&polled_fd->outer_read_closure_, - &GrpcPolledFdWindows::OnIocpReadableLocked, polled_fd, - nullptr), - GRPC_ERROR_REF(error)); + Closure::ToFunction( + GRPC_CLOSURE_INIT(&polled_fd->outer_read_closure_, + &GrpcPolledFdWindows::OnIocpReadableLocked, + polled_fd, nullptr), + GRPC_ERROR_REF(error)), + DEBUG_LOCATION); } static void OnIocpReadableLocked(void* arg, grpc_error* error) { @@ -655,10 +645,12 @@ class GrpcPolledFdWindows { static void OnIocpWriteable(void* arg, grpc_error* error) { GrpcPolledFdWindows* polled_fd = static_cast(arg); polled_fd->combiner_->Run( - GRPC_CLOSURE_INIT(&polled_fd->outer_write_closure_, - &GrpcPolledFdWindows::OnIocpWriteableLocked, - polled_fd, nullptr), - GRPC_ERROR_REF(error)); + Closure::ToFunction( + GRPC_CLOSURE_INIT(&polled_fd->outer_write_closure_, + &GrpcPolledFdWindows::OnIocpWriteableLocked, + polled_fd, nullptr), + GRPC_ERROR_REF(error)), + DEBUG_LOCATION); } static void OnIocpWriteableLocked(void* arg, grpc_error* error) { @@ -698,7 +690,7 @@ class GrpcPolledFdWindows { bool gotten_into_driver_list() const { return gotten_into_driver_list_; } void set_gotten_into_driver_list() { gotten_into_driver_list_ = true; } - Combiner* combiner_; + RefCountedPtr combiner_; char recv_from_source_addr_[200]; ares_socklen_t recv_from_source_addr_len_; grpc_slice read_buf_; @@ -721,10 +713,8 @@ class GrpcPolledFdWindows { // We don't run register_for_{readable,writeable} logic until // a socket is connected. In the interim, we queue readable/writeable // registrations with the following state. - grpc_closure continue_register_for_on_readable_locked_; - grpc_closure continue_register_for_on_writeable_locked_; - grpc_closure* pending_continue_register_for_on_readable_locked_ = nullptr; - grpc_closure* pending_continue_register_for_on_writeable_locked_ = nullptr; + bool pending_continue_register_for_on_readable_locked_ = false; + bool pending_continue_register_for_on_writeable_locked_ = false; }; struct SockToPolledFdEntry { @@ -742,14 +732,10 @@ struct SockToPolledFdEntry { * with a GrpcPolledFdWindows factory and event driver */ class SockToPolledFdMap { public: - SockToPolledFdMap(Combiner* combiner) { - combiner_ = GRPC_COMBINER_REF(combiner, "sock to polled fd map"); - } + SockToPolledFdMap(RefCountedPtr combiner) + : combiner_(std::move(combiner)) {} - ~SockToPolledFdMap() { - GPR_ASSERT(head_ == nullptr); - GRPC_COMBINER_UNREF(combiner_, "sock to polled fd map"); - } + ~SockToPolledFdMap() { GPR_ASSERT(head_ == nullptr); } void AddNewSocket(SOCKET s, GrpcPolledFdWindows* polled_fd) { SockToPolledFdEntry* new_node = new SockToPolledFdEntry(s, polled_fd); @@ -861,7 +847,7 @@ class SockToPolledFdMap { private: SockToPolledFdEntry* head_ = nullptr; - Combiner* combiner_; + RefCountedPtr combiner_; }; const struct ares_socket_functions custom_ares_sock_funcs = { @@ -910,12 +896,12 @@ class GrpcPolledFdWindowsWrapper : public GrpcPolledFd { class GrpcPolledFdFactoryWindows : public GrpcPolledFdFactory { public: - GrpcPolledFdFactoryWindows(Combiner* combiner) + GrpcPolledFdFactoryWindows(RefCountedPtr combiner) : sock_to_polled_fd_map_(combiner) {} - GrpcPolledFd* NewGrpcPolledFdLocked(ares_socket_t as, - grpc_pollset_set* driver_pollset_set, - Combiner* combiner) override { + GrpcPolledFd* NewGrpcPolledFdLocked( + ares_socket_t as, grpc_pollset_set* driver_pollset_set, + RefCountedPtr combiner) override { GrpcPolledFdWindows* polled_fd = sock_to_polled_fd_map_.LookupPolledFd(as); // Set a flag so that the virtual socket "close" method knows it // doesn't need to call ShutdownLocked, since now the driver will. @@ -933,8 +919,8 @@ class GrpcPolledFdFactoryWindows : public GrpcPolledFdFactory { }; std::unique_ptr NewGrpcPolledFdFactory( - Combiner* combiner) { - return MakeUnique(combiner); + RefCountedPtr combiner) { + return MakeUnique(std::move(combiner)); } } // namespace grpc_core diff --git a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc index d2c00000fdc..8dc56a4010e 100644 --- a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +++ b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc @@ -37,7 +37,6 @@ #include "src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h" #include "src/core/lib/gpr/string.h" #include "src/core/lib/gprpp/host_port.h" -#include "src/core/lib/iomgr/combiner.h" #include "src/core/lib/iomgr/error.h" #include "src/core/lib/iomgr/executor.h" #include "src/core/lib/iomgr/iomgr_internal.h" @@ -350,7 +349,8 @@ done: void grpc_dns_lookup_ares_continue_after_check_localhost_and_ip_literals_locked( grpc_ares_request* r, const char* dns_server, const char* name, const char* default_port, grpc_pollset_set* interested_parties, - bool check_grpclb, int query_timeout_ms, grpc_core::Combiner* combiner) { + bool check_grpclb, int query_timeout_ms, + grpc_core::RefCountedPtr combiner) { grpc_error* error = GRPC_ERROR_NONE; grpc_ares_hostbyname_request* hr = nullptr; ares_channel* channel = nullptr; @@ -590,7 +590,7 @@ static grpc_ares_request* grpc_dns_lookup_ares_locked_impl( grpc_pollset_set* interested_parties, grpc_closure* on_done, std::unique_ptr* addrs, bool check_grpclb, char** service_config_json, int query_timeout_ms, - grpc_core::Combiner* combiner) { + grpc_core::RefCountedPtr combiner) { grpc_ares_request* r = static_cast(gpr_zalloc(sizeof(grpc_ares_request))); r->ev_driver = nullptr; @@ -633,7 +633,8 @@ grpc_ares_request* (*grpc_dns_lookup_ares_locked)( grpc_pollset_set* interested_parties, grpc_closure* on_done, std::unique_ptr* addrs, bool check_grpclb, char** service_config_json, int query_timeout_ms, - grpc_core::Combiner* combiner) = grpc_dns_lookup_ares_locked_impl; + grpc_core::RefCountedPtr combiner) = + grpc_dns_lookup_ares_locked_impl; static void grpc_cancel_ares_request_locked_impl(grpc_ares_request* r) { GPR_ASSERT(r != nullptr); @@ -674,7 +675,7 @@ void grpc_ares_cleanup(void) {} typedef struct grpc_resolve_address_ares_request { /* combiner that queries and related callbacks run under */ - grpc_core::Combiner* combiner; + grpc_core::RefCountedPtr combiner; /** the pointer to receive the resolved addresses */ grpc_resolved_addresses** addrs_out; /** currently resolving addresses */ @@ -716,20 +717,20 @@ static void on_dns_lookup_done_locked(void* arg, grpc_error* error) { } grpc_core::ExecCtx::Run(DEBUG_LOCATION, r->on_resolve_address_done, GRPC_ERROR_REF(error)); - GRPC_COMBINER_UNREF(r->combiner, "on_dns_lookup_done_cb"); delete r; } static void on_dns_lookup_done(void* arg, grpc_error* error) { grpc_resolve_address_ares_request* r = static_cast(arg); - r->combiner->Run(GRPC_CLOSURE_INIT(&r->on_dns_lookup_done_locked, - on_dns_lookup_done_locked, r, nullptr), - GRPC_ERROR_REF(error)); + r->combiner->Run(grpc_core::Closure::ToFunction( + GRPC_CLOSURE_INIT(&r->on_dns_lookup_done_locked, + on_dns_lookup_done_locked, r, nullptr), + GRPC_ERROR_REF(error)), + DEBUG_LOCATION); } -static void grpc_resolve_address_invoke_dns_lookup_ares_locked( - void* arg, grpc_error* /*unused_error*/) { +static void grpc_resolve_address_invoke_dns_lookup_ares_locked(void* arg) { grpc_resolve_address_ares_request* r = static_cast(arg); GRPC_CLOSURE_INIT(&r->on_dns_lookup_done_locked, on_dns_lookup_done, r, @@ -748,16 +749,15 @@ static void grpc_resolve_address_ares_impl(const char* name, grpc_resolved_addresses** addrs) { grpc_resolve_address_ares_request* r = new grpc_resolve_address_ares_request(); - r->combiner = grpc_combiner_create(); + r->combiner = grpc_core::MakeRefCounted(); r->addrs_out = addrs; r->on_resolve_address_done = on_done; r->name = name; r->default_port = default_port; r->interested_parties = interested_parties; r->combiner->Run( - GRPC_CLOSURE_CREATE(grpc_resolve_address_invoke_dns_lookup_ares_locked, r, - nullptr), - GRPC_ERROR_NONE); + [r]() { grpc_resolve_address_invoke_dns_lookup_ares_locked(r); }, + DEBUG_LOCATION); } void (*grpc_resolve_address_ares)( diff --git a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h index 115018155b3..df2ae43dffe 100644 --- a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +++ b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h @@ -23,6 +23,7 @@ #include "src/core/ext/filters/client_channel/server_address.h" #include "src/core/lib/iomgr/iomgr.h" +#include "src/core/lib/iomgr/logical_thread.h" #include "src/core/lib/iomgr/polling_entity.h" #include "src/core/lib/iomgr/resolve_address.h" @@ -65,7 +66,7 @@ extern grpc_ares_request* (*grpc_dns_lookup_ares_locked)( grpc_pollset_set* interested_parties, grpc_closure* on_done, std::unique_ptr* addresses, bool check_grpclb, char** service_config_json, int query_timeout_ms, - grpc_core::Combiner* combiner); + grpc_core::RefCountedPtr combiner); /* Cancel the pending grpc_ares_request \a request */ extern void (*grpc_cancel_ares_request_locked)(grpc_ares_request* request); diff --git a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc index fe631f873e9..9df9bb6b50c 100644 --- a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc +++ b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc @@ -31,7 +31,7 @@ static grpc_ares_request* grpc_dns_lookup_ares_locked_impl( grpc_pollset_set* interested_parties, grpc_closure* on_done, std::unique_ptr* addrs, bool check_grpclb, char** service_config_json, int query_timeout_ms, - grpc_core::Combiner* combiner) { + grpc_core::RefCountedPtr combiner) { return NULL; } @@ -40,7 +40,8 @@ grpc_ares_request* (*grpc_dns_lookup_ares_locked)( grpc_pollset_set* interested_parties, grpc_closure* on_done, std::unique_ptr* addrs, bool check_grpclb, char** service_config_json, int query_timeout_ms, - grpc_core::Combiner* combiner) = grpc_dns_lookup_ares_locked_impl; + grpc_core::RefCountedPtr combiner) = + grpc_dns_lookup_ares_locked_impl; static void grpc_cancel_ares_request_locked_impl(grpc_ares_request* r) {} diff --git a/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc b/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc index d7028a5eaa3..4fc76ce4deb 100644 --- a/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +++ b/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc @@ -150,9 +150,12 @@ void NativeDnsResolver::ShutdownLocked() { void NativeDnsResolver::OnNextResolution(void* arg, grpc_error* error) { NativeDnsResolver* r = static_cast(arg); r->combiner()->Run( - GRPC_CLOSURE_INIT(&r->on_next_resolution_, - NativeDnsResolver::OnNextResolutionLocked, r, nullptr), - GRPC_ERROR_REF(error)); + Closure::ToFunction( + GRPC_CLOSURE_INIT(&r->on_next_resolution_, + NativeDnsResolver::OnNextResolutionLocked, r, + nullptr), + GRPC_ERROR_REF(error)), + DEBUG_LOCATION); } void NativeDnsResolver::OnNextResolutionLocked(void* arg, grpc_error* error) { @@ -167,9 +170,11 @@ void NativeDnsResolver::OnNextResolutionLocked(void* arg, grpc_error* error) { void NativeDnsResolver::OnResolved(void* arg, grpc_error* error) { NativeDnsResolver* r = static_cast(arg); r->combiner()->Run( - GRPC_CLOSURE_INIT(&r->on_resolved_, NativeDnsResolver::OnResolvedLocked, - r, nullptr), - GRPC_ERROR_REF(error)); + Closure::ToFunction( + GRPC_CLOSURE_INIT(&r->on_resolved_, + NativeDnsResolver::OnResolvedLocked, r, nullptr), + GRPC_ERROR_REF(error)), + DEBUG_LOCATION); } void NativeDnsResolver::OnResolvedLocked(void* arg, grpc_error* error) { diff --git a/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc b/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc index 906dad2b6aa..d956d40cfd9 100644 --- a/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +++ b/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc @@ -70,7 +70,7 @@ class FakeResolver : public Resolver { void MaybeSendResultLocked(); - static void ReturnReresolutionResult(void* arg, grpc_error* error); + static void ReturnReresolutionResult(void* arg); // passed-in parameters grpc_channel_args* channel_args_ = nullptr; @@ -90,7 +90,6 @@ class FakeResolver : public Resolver { // if true, return failure bool return_failure_ = false; // pending re-resolution - grpc_closure reresolution_closure_; bool reresolution_closure_pending_ = false; }; @@ -127,9 +126,8 @@ void FakeResolver::RequestReresolutionLocked() { if (!reresolution_closure_pending_) { reresolution_closure_pending_ = true; Ref().release(); // ref held by closure - GRPC_CLOSURE_INIT(&reresolution_closure_, ReturnReresolutionResult, this, - nullptr); - combiner()->Run(&reresolution_closure_, GRPC_ERROR_NONE); + combiner()->Run([this]() { ReturnReresolutionResult(this); }, + DEBUG_LOCATION); } } } @@ -159,7 +157,7 @@ void FakeResolver::MaybeSendResultLocked() { } } -void FakeResolver::ReturnReresolutionResult(void* arg, grpc_error* /*error*/) { +void FakeResolver::ReturnReresolutionResult(void* arg) { FakeResolver* self = static_cast(arg); self->reresolution_closure_pending_ = false; self->MaybeSendResultLocked(); @@ -175,15 +173,13 @@ FakeResolverResponseGenerator::FakeResolverResponseGenerator() {} FakeResolverResponseGenerator::~FakeResolverResponseGenerator() {} struct SetResponseClosureArg { - grpc_closure set_response_closure; RefCountedPtr resolver; Resolver::Result result; bool has_result = false; bool immediate = true; }; -void FakeResolverResponseGenerator::SetResponseLocked(void* arg, - grpc_error* /*error*/) { +void FakeResolverResponseGenerator::SetResponseLocked(void* arg) { SetResponseClosureArg* closure_arg = static_cast(arg); auto& resolver = closure_arg->resolver; if (!resolver->shutdown_) { @@ -209,13 +205,10 @@ void FakeResolverResponseGenerator::SetResponse(Resolver::Result result) { closure_arg->resolver = std::move(resolver); closure_arg->result = std::move(result); closure_arg->resolver->combiner()->Run( - GRPC_CLOSURE_INIT(&closure_arg->set_response_closure, SetResponseLocked, - closure_arg, nullptr), - GRPC_ERROR_NONE); + [closure_arg]() { SetResponseLocked(closure_arg); }, DEBUG_LOCATION); } -void FakeResolverResponseGenerator::SetReresolutionResponseLocked( - void* arg, grpc_error* /*error*/) { +void FakeResolverResponseGenerator::SetReresolutionResponseLocked(void* arg) { SetResponseClosureArg* closure_arg = static_cast(arg); auto& resolver = closure_arg->resolver; if (!resolver->shutdown_) { @@ -238,9 +231,8 @@ void FakeResolverResponseGenerator::SetReresolutionResponse( closure_arg->result = std::move(result); closure_arg->has_result = true; closure_arg->resolver->combiner()->Run( - GRPC_CLOSURE_INIT(&closure_arg->set_response_closure, - SetReresolutionResponseLocked, closure_arg, nullptr), - GRPC_ERROR_NONE); + [closure_arg]() { SetReresolutionResponseLocked(closure_arg); }, + DEBUG_LOCATION); } void FakeResolverResponseGenerator::UnsetReresolutionResponse() { @@ -253,13 +245,11 @@ void FakeResolverResponseGenerator::UnsetReresolutionResponse() { SetResponseClosureArg* closure_arg = new SetResponseClosureArg(); closure_arg->resolver = std::move(resolver); closure_arg->resolver->combiner()->Run( - GRPC_CLOSURE_INIT(&closure_arg->set_response_closure, - SetReresolutionResponseLocked, closure_arg, nullptr), - GRPC_ERROR_NONE); + [closure_arg]() { SetReresolutionResponseLocked(closure_arg); }, + DEBUG_LOCATION); } -void FakeResolverResponseGenerator::SetFailureLocked(void* arg, - grpc_error* /*error*/) { +void FakeResolverResponseGenerator::SetFailureLocked(void* arg) { SetResponseClosureArg* closure_arg = static_cast(arg); auto& resolver = closure_arg->resolver; if (!resolver->shutdown_) { @@ -279,9 +269,7 @@ void FakeResolverResponseGenerator::SetFailure() { SetResponseClosureArg* closure_arg = new SetResponseClosureArg(); closure_arg->resolver = std::move(resolver); closure_arg->resolver->combiner()->Run( - GRPC_CLOSURE_INIT(&closure_arg->set_response_closure, SetFailureLocked, - closure_arg, nullptr), - GRPC_ERROR_NONE); + [closure_arg]() { SetFailureLocked(closure_arg); }, DEBUG_LOCATION); } void FakeResolverResponseGenerator::SetFailureOnReresolution() { @@ -295,9 +283,7 @@ void FakeResolverResponseGenerator::SetFailureOnReresolution() { closure_arg->resolver = std::move(resolver); closure_arg->immediate = false; closure_arg->resolver->combiner()->Run( - GRPC_CLOSURE_INIT(&closure_arg->set_response_closure, SetFailureLocked, - closure_arg, nullptr), - GRPC_ERROR_NONE); + [closure_arg]() { SetFailureLocked(closure_arg); }, DEBUG_LOCATION); } void FakeResolverResponseGenerator::SetFakeResolver( @@ -310,9 +296,7 @@ void FakeResolverResponseGenerator::SetFakeResolver( closure_arg->resolver = resolver_->Ref(); closure_arg->result = std::move(result_); resolver_->combiner()->Run( - GRPC_CLOSURE_INIT(&closure_arg->set_response_closure, SetResponseLocked, - closure_arg, nullptr), - GRPC_ERROR_NONE); + [closure_arg]() { SetResponseLocked(closure_arg); }, DEBUG_LOCATION); has_result_ = false; } } diff --git a/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h b/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h index c04c7c38e17..fb107e73215 100644 --- a/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +++ b/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h @@ -80,9 +80,9 @@ class FakeResolverResponseGenerator // Set the corresponding FakeResolver to this generator. void SetFakeResolver(RefCountedPtr resolver); - static void SetResponseLocked(void* arg, grpc_error* error); - static void SetReresolutionResponseLocked(void* arg, grpc_error* error); - static void SetFailureLocked(void* arg, grpc_error* error); + static void SetResponseLocked(void* arg); + static void SetReresolutionResponseLocked(void* arg); + static void SetFailureLocked(void* arg); // Mutex protecting the members below. Mutex mu_; diff --git a/src/core/ext/filters/client_channel/resolver_factory.h b/src/core/ext/filters/client_channel/resolver_factory.h index b6a1e30d24c..e638adb6a5f 100644 --- a/src/core/ext/filters/client_channel/resolver_factory.h +++ b/src/core/ext/filters/client_channel/resolver_factory.h @@ -39,7 +39,7 @@ struct ResolverArgs { /// Used to drive I/O in the name resolution process. grpc_pollset_set* pollset_set = nullptr; /// The combiner under which all resolver calls will be run. - Combiner* combiner = nullptr; + RefCountedPtr combiner = nullptr; /// The result handler to be used by the resolver. std::unique_ptr result_handler; }; diff --git a/src/core/ext/filters/client_channel/resolver_registry.cc b/src/core/ext/filters/client_channel/resolver_registry.cc index 4e5bc597e56..7f688d602aa 100644 --- a/src/core/ext/filters/client_channel/resolver_registry.cc +++ b/src/core/ext/filters/client_channel/resolver_registry.cc @@ -145,7 +145,7 @@ bool ResolverRegistry::IsValidTarget(const char* target) { OrphanablePtr ResolverRegistry::CreateResolver( const char* target, const grpc_channel_args* args, - grpc_pollset_set* pollset_set, Combiner* combiner, + grpc_pollset_set* pollset_set, RefCountedPtr combiner, std::unique_ptr result_handler) { GPR_ASSERT(g_state != nullptr); grpc_uri* uri = nullptr; @@ -156,7 +156,7 @@ OrphanablePtr ResolverRegistry::CreateResolver( resolver_args.uri = uri; resolver_args.args = args; resolver_args.pollset_set = pollset_set; - resolver_args.combiner = combiner; + resolver_args.combiner = std::move(combiner); resolver_args.result_handler = std::move(result_handler); OrphanablePtr resolver = factory == nullptr ? nullptr diff --git a/src/core/ext/filters/client_channel/resolver_registry.h b/src/core/ext/filters/client_channel/resolver_registry.h index 718750ae21b..b89effe1609 100644 --- a/src/core/ext/filters/client_channel/resolver_registry.h +++ b/src/core/ext/filters/client_channel/resolver_registry.h @@ -69,7 +69,7 @@ class ResolverRegistry { /// \a result_handler is used to return results from the resolver. static OrphanablePtr CreateResolver( const char* target, const grpc_channel_args* args, - grpc_pollset_set* pollset_set, Combiner* combiner, + grpc_pollset_set* pollset_set, RefCountedPtr combiner, std::unique_ptr result_handler); /// Returns the default authority to pass from a client for \a target. diff --git a/src/core/ext/filters/client_channel/xds/xds_client.cc b/src/core/ext/filters/client_channel/xds/xds_client.cc index c977844854a..11496e3997f 100644 --- a/src/core/ext/filters/client_channel/xds/xds_client.cc +++ b/src/core/ext/filters/client_channel/xds/xds_client.cc @@ -488,9 +488,10 @@ void XdsClient::ChannelState::RetryableCall::OnRetryTimer( void* arg, grpc_error* error) { RetryableCall* calld = static_cast(arg); calld->chand_->xds_client()->combiner_->Run( - GRPC_CLOSURE_INIT(&calld->on_retry_timer_, OnRetryTimerLocked, calld, - nullptr), - GRPC_ERROR_REF(error)); + Closure::ToFunction(GRPC_CLOSURE_INIT(&calld->on_retry_timer_, + OnRetryTimerLocked, calld, nullptr), + GRPC_ERROR_REF(error)), + DEBUG_LOCATION); } template @@ -633,9 +634,11 @@ void XdsClient::ChannelState::AdsCallState::OnResponseReceived( void* arg, grpc_error* error) { AdsCallState* ads_calld = static_cast(arg); ads_calld->xds_client()->combiner_->Run( - GRPC_CLOSURE_INIT(&ads_calld->on_response_received_, - OnResponseReceivedLocked, ads_calld, nullptr), - GRPC_ERROR_REF(error)); + Closure::ToFunction( + GRPC_CLOSURE_INIT(&ads_calld->on_response_received_, + OnResponseReceivedLocked, ads_calld, nullptr), + GRPC_ERROR_REF(error)), + DEBUG_LOCATION); } void XdsClient::ChannelState::AdsCallState::OnResponseReceivedLocked( @@ -790,9 +793,11 @@ void XdsClient::ChannelState::AdsCallState::OnStatusReceived( void* arg, grpc_error* error) { AdsCallState* ads_calld = static_cast(arg); ads_calld->xds_client()->combiner_->Run( - GRPC_CLOSURE_INIT(&ads_calld->on_status_received_, OnStatusReceivedLocked, - ads_calld, nullptr), - GRPC_ERROR_REF(error)); + Closure::ToFunction( + GRPC_CLOSURE_INIT(&ads_calld->on_status_received_, + OnStatusReceivedLocked, ads_calld, nullptr), + GRPC_ERROR_REF(error)), + DEBUG_LOCATION); } void XdsClient::ChannelState::AdsCallState::OnStatusReceivedLocked( @@ -851,9 +856,11 @@ void XdsClient::ChannelState::LrsCallState::Reporter::OnNextReportTimer( void* arg, grpc_error* error) { Reporter* self = static_cast(arg); self->xds_client()->combiner_->Run( - GRPC_CLOSURE_INIT(&self->on_next_report_timer_, OnNextReportTimerLocked, - self, nullptr), - GRPC_ERROR_REF(error)); + Closure::ToFunction( + GRPC_CLOSURE_INIT(&self->on_next_report_timer_, + OnNextReportTimerLocked, self, nullptr), + GRPC_ERROR_REF(error)), + DEBUG_LOCATION); } void XdsClient::ChannelState::LrsCallState::Reporter::OnNextReportTimerLocked( @@ -911,9 +918,10 @@ void XdsClient::ChannelState::LrsCallState::Reporter::OnReportDone( void* arg, grpc_error* error) { Reporter* self = static_cast(arg); self->xds_client()->combiner_->Run( - GRPC_CLOSURE_INIT(&self->on_report_done_, OnReportDoneLocked, self, - nullptr), - GRPC_ERROR_REF(error)); + Closure::ToFunction(GRPC_CLOSURE_INIT(&self->on_report_done_, + OnReportDoneLocked, self, nullptr), + GRPC_ERROR_REF(error)), + DEBUG_LOCATION); } void XdsClient::ChannelState::LrsCallState::Reporter::OnReportDoneLocked( @@ -1080,9 +1088,11 @@ void XdsClient::ChannelState::LrsCallState::OnInitialRequestSent( void* arg, grpc_error* error) { LrsCallState* lrs_calld = static_cast(arg); lrs_calld->xds_client()->combiner_->Run( - GRPC_CLOSURE_INIT(&lrs_calld->on_initial_request_sent_, - OnInitialRequestSentLocked, lrs_calld, nullptr), - GRPC_ERROR_REF(error)); + Closure::ToFunction( + GRPC_CLOSURE_INIT(&lrs_calld->on_initial_request_sent_, + OnInitialRequestSentLocked, lrs_calld, nullptr), + GRPC_ERROR_REF(error)), + DEBUG_LOCATION); } void XdsClient::ChannelState::LrsCallState::OnInitialRequestSentLocked( @@ -1099,9 +1109,11 @@ void XdsClient::ChannelState::LrsCallState::OnResponseReceived( void* arg, grpc_error* error) { LrsCallState* lrs_calld = static_cast(arg); lrs_calld->xds_client()->combiner_->Run( - GRPC_CLOSURE_INIT(&lrs_calld->on_response_received_, - OnResponseReceivedLocked, lrs_calld, nullptr), - GRPC_ERROR_REF(error)); + Closure::ToFunction( + GRPC_CLOSURE_INIT(&lrs_calld->on_response_received_, + OnResponseReceivedLocked, lrs_calld, nullptr), + GRPC_ERROR_REF(error)), + DEBUG_LOCATION); } void XdsClient::ChannelState::LrsCallState::OnResponseReceivedLocked( @@ -1198,9 +1210,11 @@ void XdsClient::ChannelState::LrsCallState::OnStatusReceived( void* arg, grpc_error* error) { LrsCallState* lrs_calld = static_cast(arg); lrs_calld->xds_client()->combiner_->Run( - GRPC_CLOSURE_INIT(&lrs_calld->on_status_received_, OnStatusReceivedLocked, - lrs_calld, nullptr), - GRPC_ERROR_REF(error)); + Closure::ToFunction( + GRPC_CLOSURE_INIT(&lrs_calld->on_status_received_, + OnStatusReceivedLocked, lrs_calld, nullptr), + GRPC_ERROR_REF(error)), + DEBUG_LOCATION); } void XdsClient::ChannelState::LrsCallState::OnStatusReceivedLocked( @@ -1249,12 +1263,13 @@ grpc_core::UniquePtr GenerateBuildVersionString() { } // namespace -XdsClient::XdsClient(Combiner* combiner, grpc_pollset_set* interested_parties, +XdsClient::XdsClient(RefCountedPtr combiner, + grpc_pollset_set* interested_parties, StringView server_name, std::unique_ptr watcher, const grpc_channel_args& channel_args, grpc_error** error) : build_version_(GenerateBuildVersionString()), - combiner_(GRPC_COMBINER_REF(combiner, "xds_client")), + combiner_(std::move(combiner)), interested_parties_(interested_parties), bootstrap_(XdsBootstrap::ReadFromFile(error)), server_name_(StringViewToCString(server_name)), @@ -1275,14 +1290,12 @@ XdsClient::XdsClient(Combiner* combiner, grpc_pollset_set* interested_parties, if (service_config_watcher_ != nullptr) { // TODO(juanlishen): Start LDS call and do not return service config // until we get the first LDS response. - GRPC_CLOSURE_INIT(&service_config_notify_, NotifyOnServiceConfig, - Ref().release(), nullptr); - combiner_->Run(&service_config_notify_, GRPC_ERROR_NONE); + XdsClient* self = Ref().release(); + combiner_->Run([self]() { NotifyOnServiceConfig(self, GRPC_ERROR_NONE); }, + DEBUG_LOCATION); } } -XdsClient::~XdsClient() { GRPC_COMBINER_UNREF(combiner_, "xds_client"); } - void XdsClient::Orphan() { shutting_down_ = true; chand_.reset(); diff --git a/src/core/ext/filters/client_channel/xds/xds_client.h b/src/core/ext/filters/client_channel/xds/xds_client.h index 8bb0dc443c1..2d3090488a3 100644 --- a/src/core/ext/filters/client_channel/xds/xds_client.h +++ b/src/core/ext/filters/client_channel/xds/xds_client.h @@ -72,11 +72,10 @@ class XdsClient : public InternallyRefCounted { // If *error is not GRPC_ERROR_NONE after construction, then there was // an error initializing the client. - XdsClient(Combiner* combiner, grpc_pollset_set* interested_parties, - StringView server_name, + XdsClient(RefCountedPtr combiner, + grpc_pollset_set* interested_parties, StringView server_name, std::unique_ptr watcher, const grpc_channel_args& channel_args, grpc_error** error); - ~XdsClient(); void Orphan() override; @@ -196,14 +195,14 @@ class XdsClient : public InternallyRefCounted { static const grpc_arg_pointer_vtable kXdsClientVtable; - grpc_core::UniquePtr build_version_; + UniquePtr build_version_; - Combiner* combiner_; + RefCountedPtr combiner_; grpc_pollset_set* interested_parties_; std::unique_ptr bootstrap_; - grpc_core::UniquePtr server_name_; + UniquePtr server_name_; std::unique_ptr service_config_watcher_; // TODO(juanlishen): Once we implement LDS support, this will no // longer be needed. diff --git a/src/core/lib/iomgr/closure.h b/src/core/lib/iomgr/closure.h index aae932e305c..6234f65c685 100644 --- a/src/core/lib/iomgr/closure.h +++ b/src/core/lib/iomgr/closure.h @@ -23,6 +23,7 @@ #include #include +#include #include #include @@ -250,6 +251,11 @@ class Closure { #endif GRPC_ERROR_UNREF(error); } + + static std::function ToFunction(grpc_closure* closure, + grpc_error* error) { + return [closure, error] { Run(DEBUG_LOCATION, closure, error); }; + } }; } // namespace grpc_core diff --git a/src/core/lib/iomgr/logical_thread.cc b/src/core/lib/iomgr/logical_thread.cc index e0e59340998..5eb7b58923b 100644 --- a/src/core/lib/iomgr/logical_thread.cc +++ b/src/core/lib/iomgr/logical_thread.cc @@ -33,8 +33,8 @@ struct CallbackWrapper { const DebugLocation location; }; -void LogicalThread::Run(std::function callback, - const grpc_core::DebugLocation& location) { +void LogicalThreadImpl::Run(std::function callback, + const grpc_core::DebugLocation& location) { if (GRPC_TRACE_FLAG_ENABLED(grpc_logical_thread_trace)) { gpr_log(GPR_INFO, "LogicalThread::Run() %p Scheduling callback [%s:%d]", this, location.file(), location.line()); @@ -61,11 +61,23 @@ void LogicalThread::Run(std::function callback, } } +void LogicalThreadImpl::Orphan() { + ExecCtx::Run(DEBUG_LOCATION, + GRPC_CLOSURE_CREATE( + [](void* arg, grpc_error* /*error*/) { + LogicalThreadImpl* self = + static_cast(arg); + delete self; + }, + this, nullptr), + GRPC_ERROR_NONE); +} + // The thread that calls this loans itself to the logical thread so as to // execute all the scheduled callback. This is called from within // LogicalThread::Run() after executing a callback immediately, and hence size_ // is atleast 1. -void LogicalThread::DrainQueue() { +void LogicalThreadImpl::DrainQueue() { while (true) { if (GRPC_TRACE_FLAG_ENABLED(grpc_logical_thread_trace)) { gpr_log(GPR_INFO, "LogicalThread::DrainQueue() %p", this); diff --git a/src/core/lib/iomgr/logical_thread.h b/src/core/lib/iomgr/logical_thread.h index f01f4936890..7935679edf3 100644 --- a/src/core/lib/iomgr/logical_thread.h +++ b/src/core/lib/iomgr/logical_thread.h @@ -24,7 +24,9 @@ #include "src/core/lib/gprpp/atomic.h" #include "src/core/lib/gprpp/debug_location.h" #include "src/core/lib/gprpp/mpscq.h" +#include "src/core/lib/gprpp/orphanable.h" #include "src/core/lib/gprpp/ref_counted.h" +#include "src/core/lib/iomgr/exec_ctx.h" #ifndef GRPC_CORE_LIB_IOMGR_LOGICAL_THREAD_H #define GRPC_CORE_LIB_IOMGR_LOGICAL_THREAD_H @@ -32,21 +34,37 @@ namespace grpc_core { extern DebugOnlyTraceFlag grpc_logical_thread_trace; -// LogicalThread is a mechanism to schedule callbacks in a synchronized manner. -// All callbacks scheduled on a LogicalThread instance will be executed serially -// in a borrowed thread. The API provides a FIFO guarantee to the execution of -// callbacks scheduled on the thread. -class LogicalThread : public RefCounted { +class LogicalThreadImpl : public Orphanable { public: void Run(std::function callback, const grpc_core::DebugLocation& location); + void Orphan() override; + private: void DrainQueue(); Atomic size_{0}; MultiProducerSingleConsumerQueue queue_; }; + +// LogicalThread is a mechanism to schedule callbacks in a synchronized manner. +// All callbacks scheduled on a LogicalThread instance will be executed serially +// in a borrowed thread. The API provides a FIFO guarantee to the execution of +// callbacks scheduled on the thread. +class LogicalThread : public RefCounted { + public: + LogicalThread() { impl_ = MakeOrphanable(); } + + void Run(std::function callback, + const grpc_core::DebugLocation& location) { + impl_->Run(callback, location); + } + + private: + OrphanablePtr impl_; +}; + } /* namespace grpc_core */ #endif /* GRPC_CORE_LIB_IOMGR_LOGICAL_THREAD_H */ diff --git a/src/core/lib/transport/connectivity_state.cc b/src/core/lib/transport/connectivity_state.cc index 16da01d041c..7b10faa8d63 100644 --- a/src/core/lib/transport/connectivity_state.cc +++ b/src/core/lib/transport/connectivity_state.cc @@ -58,12 +58,15 @@ const char* ConnectivityStateName(grpc_connectivity_state state) { class AsyncConnectivityStateWatcherInterface::Notifier { public: Notifier(RefCountedPtr watcher, - grpc_connectivity_state state, Combiner* combiner) + grpc_connectivity_state state, + const RefCountedPtr& combiner) : watcher_(std::move(watcher)), state_(state) { if (combiner != nullptr) { combiner->Run( - GRPC_CLOSURE_INIT(&closure_, SendNotification, this, nullptr), - GRPC_ERROR_NONE); + Closure::ToFunction( + GRPC_CLOSURE_INIT(&closure_, SendNotification, this, nullptr), + GRPC_ERROR_NONE), + DEBUG_LOCATION); } else { GRPC_CLOSURE_INIT(&closure_, SendNotification, this, grpc_schedule_on_exec_ctx); diff --git a/src/core/lib/transport/connectivity_state.h b/src/core/lib/transport/connectivity_state.h index b2add5d7df5..c4220b5bd55 100644 --- a/src/core/lib/transport/connectivity_state.h +++ b/src/core/lib/transport/connectivity_state.h @@ -29,6 +29,7 @@ #include "src/core/lib/gprpp/orphanable.h" #include "src/core/lib/iomgr/closure.h" #include "src/core/lib/iomgr/exec_ctx.h" +#include "src/core/lib/iomgr/logical_thread.h" namespace grpc_core { @@ -70,14 +71,15 @@ class AsyncConnectivityStateWatcherInterface // If \a combiner is nullptr, then the notification will be scheduled on the // ExecCtx. - explicit AsyncConnectivityStateWatcherInterface(Combiner* combiner = nullptr) - : combiner_(combiner) {} + explicit AsyncConnectivityStateWatcherInterface( + RefCountedPtr combiner = nullptr) + : combiner_(std::move(combiner)) {} // Invoked asynchronously when Notify() is called. virtual void OnConnectivityStateChange(grpc_connectivity_state new_state) = 0; private: - Combiner* combiner_; + RefCountedPtr combiner_; }; // Tracks connectivity state. Maintains a list of watchers that are diff --git a/test/core/client_channel/resolvers/dns_resolver_connectivity_test.cc b/test/core/client_channel/resolvers/dns_resolver_connectivity_test.cc index 95eafeff54f..88802e993c8 100644 --- a/test/core/client_channel/resolvers/dns_resolver_connectivity_test.cc +++ b/test/core/client_channel/resolvers/dns_resolver_connectivity_test.cc @@ -26,14 +26,14 @@ #include "src/core/ext/filters/client_channel/resolver_registry.h" #include "src/core/ext/filters/client_channel/server_address.h" #include "src/core/lib/channel/channel_args.h" -#include "src/core/lib/iomgr/combiner.h" +#include "src/core/lib/iomgr/logical_thread.h" #include "src/core/lib/iomgr/resolve_address.h" #include "src/core/lib/iomgr/timer.h" #include "test/core/util/test_config.h" static gpr_mu g_mu; static bool g_fail_resolution = true; -static grpc_core::Combiner* g_combiner; +static grpc_core::RefCountedPtr* g_combiner; static void my_resolve_address(const char* addr, const char* /*default_port*/, grpc_pollset_set* /*interested_parties*/, @@ -65,7 +65,8 @@ static grpc_ares_request* my_dns_lookup_ares_locked( grpc_pollset_set* /*interested_parties*/, grpc_closure* on_done, std::unique_ptr* addresses, bool /*check_grpclb*/, char** /*service_config_json*/, - int /*query_timeout_ms*/, grpc_core::Combiner* /*combiner*/) { + int /*query_timeout_ms*/, + grpc_core::RefCountedPtr /*combiner*/) { gpr_mu_lock(&g_mu); GPR_ASSERT(0 == strcmp("test", addr)); grpc_error* error = GRPC_ERROR_NONE; @@ -98,7 +99,7 @@ static grpc_core::OrphanablePtr create_resolver( GPR_ASSERT(uri); grpc_core::ResolverArgs args; args.uri = uri; - args.combiner = g_combiner; + args.combiner = *g_combiner; args.result_handler = std::move(result_handler); grpc_core::OrphanablePtr resolver = factory->CreateResolver(std::move(args)); @@ -160,13 +161,13 @@ int main(int argc, char** argv) { grpc_init(); gpr_mu_init(&g_mu); - g_combiner = grpc_combiner_create(); - grpc_set_resolver_impl(&test_resolver); - grpc_dns_lookup_ares_locked = my_dns_lookup_ares_locked; - grpc_cancel_ares_request_locked = my_cancel_ares_request_locked; - { grpc_core::ExecCtx exec_ctx; + auto combiner = grpc_core::MakeRefCounted(); + g_combiner = &combiner; + grpc_set_resolver_impl(&test_resolver); + grpc_dns_lookup_ares_locked = my_dns_lookup_ares_locked; + grpc_cancel_ares_request_locked = my_cancel_ares_request_locked; ResultHandler* result_handler = new ResultHandler(); grpc_core::OrphanablePtr resolver = create_resolver( "dns:test", @@ -185,8 +186,6 @@ int main(int argc, char** argv) { GPR_ASSERT(wait_loop(30, &output2.ev)); GPR_ASSERT(!output2.result.addresses.empty()); GPR_ASSERT(output2.error == GRPC_ERROR_NONE); - - GRPC_COMBINER_UNREF(g_combiner, "test"); } grpc_shutdown(); diff --git a/test/core/client_channel/resolvers/dns_resolver_cooldown_test.cc b/test/core/client_channel/resolvers/dns_resolver_cooldown_test.cc index 94699bd3b31..c42ff843e6b 100644 --- a/test/core/client_channel/resolvers/dns_resolver_cooldown_test.cc +++ b/test/core/client_channel/resolvers/dns_resolver_cooldown_test.cc @@ -26,7 +26,7 @@ #include "src/core/ext/filters/client_channel/server_address.h" #include "src/core/lib/channel/channel_args.h" #include "src/core/lib/gprpp/memory.h" -#include "src/core/lib/iomgr/combiner.h" +#include "src/core/lib/iomgr/logical_thread.h" #include "src/core/lib/iomgr/sockaddr_utils.h" #include "test/core/util/test_config.h" @@ -37,14 +37,14 @@ constexpr int kMinResolutionPeriodForCheckMs = 900; extern grpc_address_resolver_vtable* grpc_resolve_address_impl; static grpc_address_resolver_vtable* default_resolve_address; -static grpc_core::Combiner* g_combiner; +static grpc_core::RefCountedPtr* g_combiner; static grpc_ares_request* (*g_default_dns_lookup_ares_locked)( const char* dns_server, const char* name, const char* default_port, grpc_pollset_set* interested_parties, grpc_closure* on_done, std::unique_ptr* addresses, bool check_grpclb, char** service_config_json, int query_timeout_ms, - grpc_core::Combiner* combiner); + grpc_core::RefCountedPtr combiner); // Counter incremented by test_resolve_address_impl indicating the number of // times a system-level resolution has happened. @@ -95,10 +95,11 @@ static grpc_ares_request* test_dns_lookup_ares_locked( grpc_pollset_set* /*interested_parties*/, grpc_closure* on_done, std::unique_ptr* addresses, bool check_grpclb, char** service_config_json, int query_timeout_ms, - grpc_core::Combiner* combiner) { + grpc_core::RefCountedPtr combiner) { grpc_ares_request* result = g_default_dns_lookup_ares_locked( dns_server, name, default_port, g_iomgr_args.pollset_set, on_done, - addresses, check_grpclb, service_config_json, query_timeout_ms, combiner); + addresses, check_grpclb, service_config_json, query_timeout_ms, + std::move(combiner)); ++g_resolution_count; static grpc_millis last_resolution_time = 0; grpc_millis now = @@ -271,7 +272,7 @@ static void on_first_resolution(OnResolutionCallbackArg* cb_arg) { gpr_mu_unlock(g_iomgr_args.mu); } -static void start_test_under_combiner(void* arg, grpc_error* /*error*/) { +static void start_test_under_combiner(void* arg) { OnResolutionCallbackArg* res_cb_arg = static_cast(arg); res_cb_arg->result_handler = new ResultHandler(); @@ -283,7 +284,7 @@ static void start_test_under_combiner(void* arg, grpc_error* /*error*/) { GPR_ASSERT(uri != nullptr); grpc_core::ResolverArgs args; args.uri = uri; - args.combiner = g_combiner; + args.combiner = *g_combiner; args.result_handler = std::unique_ptr( res_cb_arg->result_handler); g_resolution_count = 0; @@ -307,9 +308,9 @@ static void test_cooldown() { OnResolutionCallbackArg* res_cb_arg = new OnResolutionCallbackArg(); res_cb_arg->uri_str = "dns:127.0.0.1"; - g_combiner->Run( - GRPC_CLOSURE_CREATE(start_test_under_combiner, res_cb_arg, nullptr), - GRPC_ERROR_NONE); + (*g_combiner) + ->Run([res_cb_arg]() { start_test_under_combiner(res_cb_arg); }, + DEBUG_LOCATION); grpc_core::ExecCtx::Get()->Flush(); poll_pollset_until_request_done(&g_iomgr_args); iomgr_args_finish(&g_iomgr_args); @@ -319,17 +320,18 @@ int main(int argc, char** argv) { grpc::testing::TestEnvironment env(argc, argv); grpc_init(); - g_combiner = grpc_combiner_create(); - - g_default_dns_lookup_ares_locked = grpc_dns_lookup_ares_locked; - grpc_dns_lookup_ares_locked = test_dns_lookup_ares_locked; - default_resolve_address = grpc_resolve_address_impl; - grpc_set_resolver_impl(&test_resolver); - - test_cooldown(); { grpc_core::ExecCtx exec_ctx; - GRPC_COMBINER_UNREF(g_combiner, "test"); + auto combiner = grpc_core::MakeRefCounted(); + g_combiner = &combiner; + + g_default_dns_lookup_ares_locked = grpc_dns_lookup_ares_locked; + grpc_dns_lookup_ares_locked = test_dns_lookup_ares_locked; + default_resolve_address = grpc_resolve_address_impl; + grpc_set_resolver_impl(&test_resolver); + + test_cooldown(); + grpc_core::ExecCtx::Get()->Flush(); } grpc_shutdown_blocking(); GPR_ASSERT(g_all_callbacks_invoked); diff --git a/test/core/client_channel/resolvers/dns_resolver_test.cc b/test/core/client_channel/resolvers/dns_resolver_test.cc index f86f52b4e92..db103398a38 100644 --- a/test/core/client_channel/resolvers/dns_resolver_test.cc +++ b/test/core/client_channel/resolvers/dns_resolver_test.cc @@ -28,7 +28,7 @@ #include "src/core/lib/iomgr/combiner.h" #include "test/core/util/test_config.h" -static grpc_core::Combiner* g_combiner; +static grpc_core::RefCountedPtr* g_combiner; class TestResultHandler : public grpc_core::Resolver::ResultHandler { void ReturnResult(grpc_core::Resolver::Result /*result*/) override {} @@ -44,7 +44,7 @@ static void test_succeeds(grpc_core::ResolverFactory* factory, GPR_ASSERT(uri); grpc_core::ResolverArgs args; args.uri = uri; - args.combiner = g_combiner; + args.combiner = *g_combiner; args.result_handler = grpc_core::MakeUnique(); grpc_core::OrphanablePtr resolver = factory->CreateResolver(std::move(args)); @@ -61,7 +61,7 @@ static void test_fails(grpc_core::ResolverFactory* factory, GPR_ASSERT(uri); grpc_core::ResolverArgs args; args.uri = uri; - args.combiner = g_combiner; + args.combiner = *g_combiner; args.result_handler = grpc_core::MakeUnique(); grpc_core::OrphanablePtr resolver = factory->CreateResolver(std::move(args)); @@ -72,26 +72,27 @@ static void test_fails(grpc_core::ResolverFactory* factory, int main(int argc, char** argv) { grpc::testing::TestEnvironment env(argc, argv); grpc_init(); - - g_combiner = grpc_combiner_create(); - - grpc_core::ResolverFactory* dns = - grpc_core::ResolverRegistry::LookupResolverFactory("dns"); - - test_succeeds(dns, "dns:10.2.1.1"); - test_succeeds(dns, "dns:10.2.1.1:1234"); - test_succeeds(dns, "dns:www.google.com"); - test_succeeds(dns, "dns:///www.google.com"); - grpc_core::UniquePtr resolver = - GPR_GLOBAL_CONFIG_GET(grpc_dns_resolver); - if (gpr_stricmp(resolver.get(), "native") == 0) { - test_fails(dns, "dns://8.8.8.8/8.8.8.8:8888"); - } else { - test_succeeds(dns, "dns://8.8.8.8/8.8.8.8:8888"); - } { grpc_core::ExecCtx exec_ctx; - GRPC_COMBINER_UNREF(g_combiner, "test"); + { + auto combiner = grpc_core::MakeRefCounted(); + g_combiner = &combiner; + + grpc_core::ResolverFactory* dns = + grpc_core::ResolverRegistry::LookupResolverFactory("dns"); + + test_succeeds(dns, "dns:10.2.1.1"); + test_succeeds(dns, "dns:10.2.1.1:1234"); + test_succeeds(dns, "dns:www.google.com"); + test_succeeds(dns, "dns:///www.google.com"); + grpc_core::UniquePtr resolver = + GPR_GLOBAL_CONFIG_GET(grpc_dns_resolver); + if (gpr_stricmp(resolver.get(), "native") == 0) { + test_fails(dns, "dns://8.8.8.8/8.8.8.8:8888"); + } else { + test_succeeds(dns, "dns://8.8.8.8/8.8.8.8:8888"); + } + } } grpc_shutdown(); diff --git a/test/core/client_channel/resolvers/fake_resolver_test.cc b/test/core/client_channel/resolvers/fake_resolver_test.cc index 01d82cbdd05..22786b62883 100644 --- a/test/core/client_channel/resolvers/fake_resolver_test.cc +++ b/test/core/client_channel/resolvers/fake_resolver_test.cc @@ -28,7 +28,7 @@ #include "src/core/ext/filters/client_channel/server_address.h" #include "src/core/lib/channel/channel_args.h" #include "src/core/lib/gprpp/ref_counted_ptr.h" -#include "src/core/lib/iomgr/combiner.h" +#include "src/core/lib/iomgr/logical_thread.h" #include "src/core/lib/security/credentials/fake/fake_credentials.h" #include "test/core/util/test_config.h" @@ -63,7 +63,7 @@ class ResultHandler : public grpc_core::Resolver::ResultHandler { }; static grpc_core::OrphanablePtr build_fake_resolver( - grpc_core::Combiner* combiner, + grpc_core::RefCountedPtr combiner, grpc_core::FakeResolverResponseGenerator* response_generator, std::unique_ptr result_handler) { grpc_core::ResolverFactory* factory = @@ -74,7 +74,7 @@ static grpc_core::OrphanablePtr build_fake_resolver( grpc_channel_args channel_args = {1, &generator_arg}; grpc_core::ResolverArgs args; args.args = &channel_args; - args.combiner = combiner; + args.combiner = std::move(combiner); args.result_handler = std::move(result_handler); grpc_core::OrphanablePtr resolver = factory->CreateResolver(std::move(args)); @@ -118,7 +118,8 @@ static grpc_core::Resolver::Result create_new_resolver_result() { static void test_fake_resolver() { grpc_core::ExecCtx exec_ctx; - grpc_core::Combiner* combiner = grpc_combiner_create(); + grpc_core::RefCountedPtr combiner = + grpc_core::MakeRefCounted(); // Create resolver. ResultHandler* result_handler = new ResultHandler(); grpc_core::RefCountedPtr @@ -206,7 +207,6 @@ static void test_fake_resolver() { nullptr); // Clean up. resolver.reset(); - GRPC_COMBINER_UNREF(combiner, "test_fake_resolver"); } int main(int argc, char** argv) { diff --git a/test/core/client_channel/resolvers/sockaddr_resolver_test.cc b/test/core/client_channel/resolvers/sockaddr_resolver_test.cc index 9b1d6779e8e..7984f8e572a 100644 --- a/test/core/client_channel/resolvers/sockaddr_resolver_test.cc +++ b/test/core/client_channel/resolvers/sockaddr_resolver_test.cc @@ -24,11 +24,11 @@ #include "src/core/ext/filters/client_channel/resolver_registry.h" #include "src/core/lib/channel/channel_args.h" -#include "src/core/lib/iomgr/combiner.h" +#include "src/core/lib/iomgr/logical_thread.h" #include "test/core/util/test_config.h" -static grpc_core::Combiner* g_combiner; +static grpc_core::RefCountedPtr* g_combiner; class ResultHandler : public grpc_core::Resolver::ResultHandler { public: @@ -46,7 +46,7 @@ static void test_succeeds(grpc_core::ResolverFactory* factory, GPR_ASSERT(uri); grpc_core::ResolverArgs args; args.uri = uri; - args.combiner = g_combiner; + args.combiner = *g_combiner; args.result_handler = grpc_core::MakeUnique(); grpc_core::OrphanablePtr resolver = factory->CreateResolver(std::move(args)); @@ -67,7 +67,7 @@ static void test_fails(grpc_core::ResolverFactory* factory, GPR_ASSERT(uri); grpc_core::ResolverArgs args; args.uri = uri; - args.combiner = g_combiner; + args.combiner = *g_combiner; args.result_handler = grpc_core::MakeUnique(); grpc_core::OrphanablePtr resolver = factory->CreateResolver(std::move(args)); @@ -78,31 +78,30 @@ static void test_fails(grpc_core::ResolverFactory* factory, int main(int argc, char** argv) { grpc::testing::TestEnvironment env(argc, argv); grpc_init(); - - g_combiner = grpc_combiner_create(); - - grpc_core::ResolverFactory* ipv4 = - grpc_core::ResolverRegistry::LookupResolverFactory("ipv4"); - grpc_core::ResolverFactory* ipv6 = - grpc_core::ResolverRegistry::LookupResolverFactory("ipv6"); - - test_fails(ipv4, "ipv4:10.2.1.1"); - test_succeeds(ipv4, "ipv4:10.2.1.1:1234"); - test_succeeds(ipv4, "ipv4:10.2.1.1:1234,127.0.0.1:4321"); - test_fails(ipv4, "ipv4:10.2.1.1:123456"); - test_fails(ipv4, "ipv4:www.google.com"); - test_fails(ipv4, "ipv4:["); - test_fails(ipv4, "ipv4://8.8.8.8/8.8.8.8:8888"); - - test_fails(ipv6, "ipv6:["); - test_fails(ipv6, "ipv6:[::]"); - test_succeeds(ipv6, "ipv6:[::]:1234"); - test_fails(ipv6, "ipv6:[::]:123456"); - test_fails(ipv6, "ipv6:www.google.com"); - { grpc_core::ExecCtx exec_ctx; - GRPC_COMBINER_UNREF(g_combiner, "test"); + auto combiner = grpc_core::MakeRefCounted(); + g_combiner = &combiner; + + grpc_core::ResolverFactory* ipv4 = + grpc_core::ResolverRegistry::LookupResolverFactory("ipv4"); + grpc_core::ResolverFactory* ipv6 = + grpc_core::ResolverRegistry::LookupResolverFactory("ipv6"); + + test_fails(ipv4, "ipv4:10.2.1.1"); + test_succeeds(ipv4, "ipv4:10.2.1.1:1234"); + test_succeeds(ipv4, "ipv4:10.2.1.1:1234,127.0.0.1:4321"); + test_fails(ipv4, "ipv4:10.2.1.1:123456"); + test_fails(ipv4, "ipv4:www.google.com"); + test_fails(ipv4, "ipv4:["); + test_fails(ipv4, "ipv4://8.8.8.8/8.8.8.8:8888"); + + test_fails(ipv6, "ipv6:["); + test_fails(ipv6, "ipv6:[::]"); + test_succeeds(ipv6, "ipv6:[::]:1234"); + test_fails(ipv6, "ipv6:[::]:123456"); + test_fails(ipv6, "ipv6:www.google.com"); + grpc_core::ExecCtx::Get()->Flush(); } grpc_shutdown(); diff --git a/test/core/end2end/fuzzers/api_fuzzer.cc b/test/core/end2end/fuzzers/api_fuzzer.cc index eecf9363bfb..e29401dbf5a 100644 --- a/test/core/end2end/fuzzers/api_fuzzer.cc +++ b/test/core/end2end/fuzzers/api_fuzzer.cc @@ -379,7 +379,8 @@ grpc_ares_request* my_dns_lookup_ares_locked( grpc_pollset_set* /*interested_parties*/, grpc_closure* on_done, std::unique_ptr* addresses, bool /*check_grpclb*/, char** /*service_config_json*/, - int /*query_timeout*/, grpc_core::Combiner* /*combiner*/) { + int /*query_timeout*/, + grpc_core::RefCountedPtr /*combiner*/) { addr_req* r = static_cast(gpr_malloc(sizeof(*r))); r->addr = gpr_strdup(addr); r->on_done = on_done; diff --git a/test/core/end2end/goaway_server_test.cc b/test/core/end2end/goaway_server_test.cc index 86f27295a5f..3ebbbbdbbfd 100644 --- a/test/core/end2end/goaway_server_test.cc +++ b/test/core/end2end/goaway_server_test.cc @@ -49,7 +49,7 @@ static grpc_ares_request* (*iomgr_dns_lookup_ares_locked)( grpc_pollset_set* interested_parties, grpc_closure* on_done, std::unique_ptr* addresses, bool check_grpclb, char** service_config_json, int query_timeout_ms, - grpc_core::Combiner* combiner); + grpc_core::RefCountedPtr combiner); static void (*iomgr_cancel_ares_request_locked)(grpc_ares_request* request); @@ -106,11 +106,12 @@ static grpc_ares_request* my_dns_lookup_ares_locked( grpc_pollset_set* interested_parties, grpc_closure* on_done, std::unique_ptr* addresses, bool check_grpclb, char** service_config_json, int query_timeout_ms, - grpc_core::Combiner* combiner) { + grpc_core::RefCountedPtr combiner) { if (0 != strcmp(addr, "test")) { - return iomgr_dns_lookup_ares_locked( - dns_server, addr, default_port, interested_parties, on_done, addresses, - check_grpclb, service_config_json, query_timeout_ms, combiner); + return iomgr_dns_lookup_ares_locked(dns_server, addr, default_port, + interested_parties, on_done, addresses, + check_grpclb, service_config_json, + query_timeout_ms, std::move(combiner)); } grpc_error* error = GRPC_ERROR_NONE; diff --git a/test/core/iomgr/logical_thread_test.cc b/test/core/iomgr/logical_thread_test.cc index 0d449e171ae..88dde0b5df4 100644 --- a/test/core/iomgr/logical_thread_test.cc +++ b/test/core/iomgr/logical_thread_test.cc @@ -31,16 +31,20 @@ namespace { TEST(LogicalThreadTest, NoOp) { - auto lock = grpc_core::MakeRefCounted(); + grpc_core::ExecCtx exec_ctx; + { auto lock = grpc_core::MakeRefCounted(); } } TEST(LogicalThreadTest, ExecuteOne) { - auto lock = grpc_core::MakeRefCounted(); - gpr_event done; - gpr_event_init(&done); - lock->Run([&done]() { gpr_event_set(&done, (void*)1); }, DEBUG_LOCATION); - EXPECT_TRUE(gpr_event_wait(&done, grpc_timeout_seconds_to_deadline(5)) != - nullptr); + grpc_core::ExecCtx exec_ctx; + { + auto lock = grpc_core::MakeRefCounted(); + gpr_event done; + gpr_event_init(&done); + lock->Run([&done]() { gpr_event_set(&done, (void*)1); }, DEBUG_LOCATION); + EXPECT_TRUE(gpr_event_wait(&done, grpc_timeout_seconds_to_deadline(5)) != + nullptr); + } } class TestThread { @@ -93,11 +97,14 @@ class TestThread { }; TEST(LogicalThreadTest, ExecuteMany) { - auto lock = grpc_core::MakeRefCounted(); + grpc_core::ExecCtx exec_ctx; { - std::vector> threads; - for (size_t i = 0; i < 100; ++i) { - threads.push_back(std::unique_ptr(new TestThread(lock))); + auto lock = grpc_core::MakeRefCounted(); + { + std::vector> threads; + for (size_t i = 0; i < 100; ++i) { + threads.push_back(std::unique_ptr(new TestThread(lock))); + } } } } diff --git a/test/cpp/naming/cancel_ares_query_test.cc b/test/cpp/naming/cancel_ares_query_test.cc index b7b4ebd1ea5..726f7eff765 100644 --- a/test/cpp/naming/cancel_ares_query_test.cc +++ b/test/cpp/naming/cancel_ares_query_test.cc @@ -36,7 +36,7 @@ #include "src/core/lib/gpr/string.h" #include "src/core/lib/gprpp/orphanable.h" #include "src/core/lib/gprpp/thd.h" -#include "src/core/lib/iomgr/combiner.h" +#include "src/core/lib/iomgr/logical_thread.h" #include "src/core/lib/iomgr/pollset.h" #include "src/core/lib/iomgr/pollset_set.h" #include "test/core/end2end/cq_verifier.h" @@ -81,7 +81,7 @@ struct ArgsStruct { gpr_mu* mu; grpc_pollset* pollset; grpc_pollset_set* pollset_set; - grpc_core::Combiner* lock; + grpc_core::RefCountedPtr lock; grpc_channel_args* channel_args; }; @@ -90,7 +90,7 @@ void ArgsInit(ArgsStruct* args) { grpc_pollset_init(args->pollset, &args->mu); args->pollset_set = grpc_pollset_set_create(); grpc_pollset_set_add_pollset(args->pollset_set, args->pollset); - args->lock = grpc_combiner_create(); + args->lock = grpc_core::MakeRefCounted(); gpr_atm_rel_store(&args->done_atm, 0); args->channel_args = nullptr; } @@ -109,7 +109,6 @@ void ArgsFinish(ArgsStruct* args) { grpc_core::ExecCtx::Get()->Flush(); grpc_pollset_destroy(args->pollset); gpr_free(args->pollset); - GRPC_COMBINER_UNREF(args->lock, nullptr); } void PollPollsetUntilRequestDone(ArgsStruct* args) { diff --git a/test/cpp/naming/resolver_component_test.cc b/test/cpp/naming/resolver_component_test.cc index e74f5666b81..354c7a9478f 100644 --- a/test/cpp/naming/resolver_component_test.cc +++ b/test/cpp/naming/resolver_component_test.cc @@ -49,9 +49,9 @@ #include "src/core/lib/gpr/string.h" #include "src/core/lib/gprpp/host_port.h" #include "src/core/lib/gprpp/orphanable.h" -#include "src/core/lib/iomgr/combiner.h" #include "src/core/lib/iomgr/executor.h" #include "src/core/lib/iomgr/iomgr.h" +#include "src/core/lib/iomgr/logical_thread.h" #include "src/core/lib/iomgr/resolve_address.h" #include "src/core/lib/iomgr/sockaddr_utils.h" #include "src/core/lib/iomgr/socket_utils.h" @@ -192,7 +192,7 @@ struct ArgsStruct { gpr_mu* mu; grpc_pollset* pollset; grpc_pollset_set* pollset_set; - grpc_core::Combiner* lock; + grpc_core::RefCountedPtr lock; grpc_channel_args* channel_args; vector expected_addrs; std::string expected_service_config_string; @@ -206,7 +206,7 @@ void ArgsInit(ArgsStruct* args) { grpc_pollset_init(args->pollset, &args->mu); args->pollset_set = grpc_pollset_set_create(); grpc_pollset_set_add_pollset(args->pollset_set, args->pollset); - args->lock = grpc_combiner_create(); + args->lock = grpc_core::MakeRefCounted(); gpr_atm_rel_store(&args->done_atm, 0); args->channel_args = nullptr; } @@ -226,7 +226,6 @@ void ArgsFinish(ArgsStruct* args) { grpc_core::ExecCtx::Get()->Flush(); grpc_pollset_destroy(args->pollset); gpr_free(args->pollset); - GRPC_COMBINER_UNREF(args->lock, nullptr); } gpr_timespec NSecondDeadline(int seconds) { @@ -534,10 +533,7 @@ void InjectBrokenNameServerList(ares_channel channel) { GPR_ASSERT(ares_set_servers_ports(channel, dns_server_addrs) == ARES_SUCCESS); } -void StartResolvingLocked(void* arg, grpc_error* /*unused*/) { - grpc_core::Resolver* r = static_cast(arg); - r->StartLocked(); -} +void StartResolvingLocked(grpc_core::Resolver* r) { r->StartLocked(); } void RunResolvesRelevantRecordsTest( std::unique_ptr (*CreateResultHandler)( @@ -616,9 +612,9 @@ void RunResolvesRelevantRecordsTest( CreateResultHandler(&args)); grpc_channel_args_destroy(resolver_args); gpr_free(whole_uri); - args.lock->Run( - GRPC_CLOSURE_CREATE(StartResolvingLocked, resolver.get(), nullptr), - GRPC_ERROR_NONE); + auto* resolver_ptr = resolver.get(); + args.lock->Run([resolver_ptr]() { StartResolvingLocked(resolver_ptr); }, + DEBUG_LOCATION); grpc_core::ExecCtx::Get()->Flush(); PollPollsetUntilRequestDone(&args); ArgsFinish(&args); From 2575e8a24e62625c963e7f02c874ffa040a2f347 Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Thu, 12 Dec 2019 12:45:11 -0800 Subject: [PATCH 033/758] Cancel the endpoint watch only when using XdsResolver --- .../ext/filters/client_channel/lb_policy/xds/xds.cc | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc b/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc index cb0cfcd6d66..bfe3a3c63c6 100644 --- a/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc +++ b/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc @@ -739,10 +739,14 @@ void XdsLb::ShutdownLocked() { } fallback_policy_.reset(); pending_fallback_policy_.reset(); - // Cancel the endpoint watch here instead of in our dtor, because the - // watcher holds a ref to us. - xds_client()->CancelEndpointDataWatch(StringView(eds_service_name()), - endpoint_watcher_); + // Cancel the endpoint watch here instead of in our dtor if we are using the + // XdsResolver, because the watcher holds a ref to us and we might not be + // destroying the Xds client leading to a situation where the Xds lb policy is + // never destroyed. + if (xds_client_from_channel_ != nullptr) { + xds_client()->CancelEndpointDataWatch(StringView(eds_service_name()), + endpoint_watcher_); + } if (config_->lrs_load_reporting_server_name() != nullptr) { xds_client()->RemoveClientStats( StringView(config_->lrs_load_reporting_server_name()), From 324379813301c741edd81d3136878ddbb4cc0b03 Mon Sep 17 00:00:00 2001 From: Kevin Freeman Date: Thu, 19 Dec 2019 19:15:04 -0800 Subject: [PATCH 034/758] Fix formatting errors --- src/core/ext/filters/client_channel/http_proxy.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/core/ext/filters/client_channel/http_proxy.cc b/src/core/ext/filters/client_channel/http_proxy.cc index cbe92ece388..3eb8661fd65 100644 --- a/src/core/ext/filters/client_channel/http_proxy.cc +++ b/src/core/ext/filters/client_channel/http_proxy.cc @@ -58,7 +58,8 @@ char* GetHttpProxyServer(const grpc_channel_args* args, char** user_cred) { * 4. http_proxy environment variable * If none of the above are set, then no HTTP proxy will be used. */ - char* uri_str = gpr_strdup(grpc_channel_args_find_string(args, GRPC_ARG_HTTP_PROXY)); + char* uri_str = + gpr_strdup(grpc_channel_args_find_string(args, GRPC_ARG_HTTP_PROXY)); if (uri_str == nullptr) uri_str = gpr_getenv("grpc_proxy"); if (uri_str == nullptr) uri_str = gpr_getenv("https_proxy"); if (uri_str == nullptr) uri_str = gpr_getenv("http_proxy"); From efee7d467769fbcd86e3e7c319cd062308c9dd76 Mon Sep 17 00:00:00 2001 From: Tariq Ramlall Date: Fri, 20 Dec 2019 18:15:36 -0500 Subject: [PATCH 035/758] [Docs] Updated link to CPP example on grpc.io website. --- examples/cpp/route_guide/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/cpp/route_guide/README.md b/examples/cpp/route_guide/README.md index 1cb5a409f87..1d1956d275d 100644 --- a/examples/cpp/route_guide/README.md +++ b/examples/cpp/route_guide/README.md @@ -3,4 +3,4 @@ The files in this folder are the samples used in [gRPC Basics: C++][], a detailed tutorial for using gRPC in C++. -[gRPC Basics: C++]:https://grpc.io/docs/tutorials/basic/c.html +[gRPC Basics: C++]:https://grpc.io/docs/tutorials/basic/cpp From 2f00d2b7caecd5c4a1e00f965384ed54f0574abe Mon Sep 17 00:00:00 2001 From: Tariq Ramlall Date: Fri, 20 Dec 2019 18:32:08 -0500 Subject: [PATCH 036/758] [Docs] Changed variable names to be more accurate in README for cpp helloworld example. --- examples/cpp/helloworld/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/cpp/helloworld/README.md b/examples/cpp/helloworld/README.md index 813a80f288f..9ebe71033ba 100644 --- a/examples/cpp/helloworld/README.md +++ b/examples/cpp/helloworld/README.md @@ -34,8 +34,8 @@ types as protocol buffer message types. Both the client and the server use interface code generated from the service definition. Here's our example service definition, defined using protocol buffers IDL in -[helloworld.proto](../../protos/helloworld.proto). The `Greeting` -service has one method, `hello`, that lets the server receive a single +[helloworld.proto](../../protos/helloworld.proto). The `Greeter` +service has one method, `SayHello`, that lets the server receive a single `HelloRequest` message from the remote client containing the user's name, then send back a greeting in a single `HelloReply`. This is the simplest type of RPC you From b80b9c756deafa344fd625134eb31ed13ea3849a Mon Sep 17 00:00:00 2001 From: Tariq Ramlall Date: Fri, 20 Dec 2019 18:43:52 -0500 Subject: [PATCH 037/758] [Docs] Updated README with a correct C++ link. --- src/cpp/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cpp/README.md b/src/cpp/README.md index 071f06c1495..e589f612ddf 100755 --- a/src/cpp/README.md +++ b/src/cpp/README.md @@ -88,7 +88,7 @@ documentation site at [grpc.io](https://grpc.io), specifically: * [Overview](https://grpc.io/docs/): An introduction to gRPC with a simple Hello World example in all our supported languages, including C++. -* [gRPC Basics - C++](https://grpc.io/docs/tutorials/basic/c.html): +* [gRPC Basics - C++](https://grpc.io/docs/tutorials/basic/cpp): A tutorial that steps you through creating a simple gRPC C++ example application. * [Asynchronous Basics - C++](https://grpc.io/docs/tutorials/async/helloasync-cpp.html): From 73b144d4dfca5826c88d85f01522ba456e86c29b Mon Sep 17 00:00:00 2001 From: Zack Galbreath Date: Fri, 20 Dec 2019 15:35:02 -0500 Subject: [PATCH 038/758] Fix typo in recent BUILDING.md update It's an older version of CMake that will prevent you from installing module-provided dependencies. Also explicitly point that out that "install from module" will only work starting with gRPC 1.27 and newer. --- BUILDING.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/BUILDING.md b/BUILDING.md index 30e6dcd1ddd..ede304f4fab 100644 --- a/BUILDING.md +++ b/BUILDING.md @@ -185,8 +185,8 @@ If you are running CMake v3.13 or newer you can build gRPC's dependencies in "module" mode and install them alongside gRPC in a single step. [Example](test/distrib/cpp/run_distrib_test_cmake_module_install.sh) -If you are using an older version of gRPC, you will need to select "package" -mode (rather than "module" mode) for the dependencies. +If you are building gRPC < 1.27 or if you are using CMake < 3.13 you will need +to select "package" mode (rather than "module" mode) for the dependencies. This means you will need to have external copies of these libraries available on your system. ``` From 3e7f680742d9341f650f132fd5653cb5c70e74e4 Mon Sep 17 00:00:00 2001 From: simo9000 Date: Sat, 4 Jan 2020 19:33:29 -0800 Subject: [PATCH 039/758] Changes all occurences of %(RelativePath) to %(RelativeDir) in src/csharp/BUILD-INTEGRATION.md --- src/csharp/BUILD-INTEGRATION.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/csharp/BUILD-INTEGRATION.md b/src/csharp/BUILD-INTEGRATION.md index 400365ab24a..b115999dc22 100644 --- a/src/csharp/BUILD-INTEGRATION.md +++ b/src/csharp/BUILD-INTEGRATION.md @@ -135,7 +135,7 @@ following stanza under the `` xml node: ```xml - + ``` @@ -144,7 +144,7 @@ and its subdirectories (`**`) include all files matching the wildcard `*.proto`. You can instead selectively include your files or selectively exclude files from the glob pattern; [MSBuild documentation explains that](https://docs.microsoft.com/visualstudio/msbuild/msbuild-items). The -`OutputDir="%(RelativePath)"` orders the output directory for each .cs file be +`OutputDir="%(RelativeDir)"` orders the output directory for each .cs file be same as the corresponding .proto directory. Finally, `CompileOutputs="false"` prevents compiling the generated files into an assembly. @@ -188,7 +188,7 @@ directories according to their service use, for example: ```xml - From e36ede8c67e4816e2b657211509ad41c3288c033 Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Wed, 8 Jan 2020 19:48:47 -0800 Subject: [PATCH 040/758] Remove exec_ctx dependency from logical thread --- .../filters/client_channel/client_channel.cc | 184 ++++++++---------- .../ext/filters/client_channel/lb_policy.cc | 24 +-- .../ext/filters/client_channel/lb_policy.h | 22 +-- .../client_channel/lb_policy/grpclb/grpclb.cc | 26 +-- .../client_channel/lb_policy/xds/cds.cc | 2 +- .../client_channel/lb_policy/xds/xds.cc | 27 +-- .../ext/filters/client_channel/resolver.h | 2 +- .../dns/c_ares/grpc_ares_ev_driver_windows.cc | 26 +-- .../resolver/fake/fake_resolver.cc | 97 ++++----- .../resolver/fake/fake_resolver.h | 12 +- .../filters/client_channel/resolver_factory.h | 2 +- .../client_channel/resolving_lb_policy.cc | 4 +- src/core/lib/iomgr/logical_thread.cc | 20 +- src/core/lib/iomgr/logical_thread.h | 1 + test/core/util/test_lb_policies.cc | 2 +- 15 files changed, 210 insertions(+), 241 deletions(-) diff --git a/src/core/ext/filters/client_channel/client_channel.cc b/src/core/ext/filters/client_channel/client_channel.cc index c0255a9230c..988761a1dc5 100644 --- a/src/core/ext/filters/client_channel/client_channel.cc +++ b/src/core/ext/filters/client_channel/client_channel.cc @@ -209,8 +209,8 @@ class ChannelData { void Cancel(); private: - static void AddWatcherLocked(ExternalConnectivityWatcher* arg); - static void RemoveWatcherLocked(ExternalConnectivityWatcher* arg); + void AddWatcherLocked(); + void RemoveWatcherLocked(); ChannelData* chand_; grpc_polling_entity pollent_; @@ -243,9 +243,9 @@ class ChannelData { grpc_error* DoPingLocked(grpc_transport_op* op); - static void StartTransportOpLocked(void* arg, grpc_error* ignored); + static void StartTransportOpLocked(grpc_transport_op* op); - static void TryToConnectLocked(ChannelData* arg); + void TryToConnectLocked(); void ProcessLbPolicy( const Resolver::Result& resolver_result, @@ -279,9 +279,9 @@ class ChannelData { RefCountedPtr service_config_; // - // Fields used in the control plane. Guarded by combiner. + // Fields used in the control plane. Guarded by logical_thread. // - RefCountedPtr combiner_; + RefCountedPtr logical_thread_; grpc_pollset_set* interested_parties_; RefCountedPtr subchannel_pool_; OrphanablePtr resolving_lb_policy_; @@ -293,17 +293,18 @@ class ChannelData { std::map subchannel_refcount_map_; // The set of SubchannelWrappers that currently exist. // No need to hold a ref, since the map is updated in the control-plane - // combiner when the SubchannelWrappers are created and destroyed. + // logical_thread when the SubchannelWrappers are created and destroyed. std::set subchannel_wrappers_; // Pending ConnectedSubchannel updates for each SubchannelWrapper. - // Updates are queued here in the control plane combiner and then applied - // in the data plane mutex when the picker is updated. + // Updates are queued here in the control plane logical_thread and then + // applied in the data plane mutex when the picker is updated. std::map, RefCountedPtr, RefCountedPtrLess> pending_subchannel_updates_; // - // Fields accessed from both data plane mutex and control plane combiner. + // Fields accessed from both data plane mutex and control plane + // logical_thread. // Atomic disconnect_error_; @@ -837,7 +838,7 @@ class CallData { // Note that no synchronization is needed here, because even if the // underlying subchannel is shared between channels, this wrapper will only // be used within one channel, so it will always be synchronized by the -// control plane combiner. +// control plane logical_thread. class ChannelData::SubchannelWrapper : public SubchannelInterface { public: SubchannelWrapper(ChannelData* chand, Subchannel* subchannel, @@ -963,7 +964,7 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface { health_check_service_name_ = std::move(health_check_service_name); } - // Caller must be holding the control-plane combiner. + // Caller must be holding the control-plane logical_thread. ConnectedSubchannel* connected_subchannel() const { return connected_subchannel_.get(); } @@ -1014,7 +1015,7 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface { gpr_log(GPR_INFO, "chand=%p: connectivity change for subchannel wrapper %p " "subchannel %p (connected_subchannel=%p state=%s); " - "hopping into combiner", + "hopping into logical_thread", parent_->chand_, parent_.get(), parent_->subchannel_, connected_subchannel.get(), ConnectivityStateName(new_state)); } @@ -1047,41 +1048,39 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface { : parent_(std::move(parent)), state_(new_state), connected_subchannel_(std::move(connected_subchannel)) { - ExecCtx::Run( - DEBUG_LOCATION, - GRPC_CLOSURE_CREATE( - [](void* arg, grpc_error* /*error*/) { - Updater* self = static_cast(arg); - self->parent_->parent_->chand_->combiner_->Run( - [self]() { ApplyUpdateInControlPlaneCombiner(self); }, - DEBUG_LOCATION); - }, - this, nullptr), - GRPC_ERROR_NONE); + ExecCtx::Run(DEBUG_LOCATION, + GRPC_CLOSURE_CREATE( + [](void* arg, grpc_error* /*error*/) { + Updater* self = static_cast(arg); + self->parent_->parent_->chand_->logical_thread_->Run( + [self]() { + self->ApplyUpdateInControlPlaneLogicalThread(); + }, + DEBUG_LOCATION); + }, + this, nullptr), + GRPC_ERROR_NONE); } private: - static void ApplyUpdateInControlPlaneCombiner(void* arg) { - Updater* self = static_cast(arg); + void ApplyUpdateInControlPlaneLogicalThread() { if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) { gpr_log(GPR_INFO, - "chand=%p: processing connectivity change in combiner " + "chand=%p: processing connectivity change in logical thread " "for subchannel wrapper %p subchannel %p " "(connected_subchannel=%p state=%s): watcher=%p", - self->parent_->parent_->chand_, self->parent_->parent_.get(), - self->parent_->parent_->subchannel_, - self->connected_subchannel_.get(), - ConnectivityStateName(self->state_), - self->parent_->watcher_.get()); + parent_->parent_->chand_, parent_->parent_.get(), + parent_->parent_->subchannel_, connected_subchannel_.get(), + ConnectivityStateName(state_), parent_->watcher_.get()); } // Ignore update if the parent WatcherWrapper has been replaced // since this callback was scheduled. - if (self->parent_->watcher_ == nullptr) return; - self->parent_->last_seen_state_ = self->state_; - self->parent_->parent_->MaybeUpdateConnectedSubchannel( - std::move(self->connected_subchannel_)); - self->parent_->watcher_->OnConnectivityStateChange(self->state_); - delete self; + if (parent_->watcher_ == nullptr) return; + parent_->last_seen_state_ = state_; + parent_->parent_->MaybeUpdateConnectedSubchannel( + std::move(connected_subchannel_)); + parent_->watcher_->OnConnectivityStateChange(state_); + delete this; } RefCountedPtr parent_; @@ -1126,7 +1125,7 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface { // CancelConnectivityStateWatch() with its watcher, we know the // corresponding WrapperWatcher to cancel on the underlying subchannel. std::map watcher_map_; - // To be accessed only in the control plane combiner. + // To be accessed only in the control plane logical_thread. RefCountedPtr connected_subchannel_; // To be accessed only in the data plane mutex. RefCountedPtr connected_subchannel_in_data_plane_; @@ -1149,16 +1148,16 @@ ChannelData::ExternalConnectivityWatcher::ExternalConnectivityWatcher( grpc_polling_entity_add_to_pollset_set(&pollent_, chand_->interested_parties_); GRPC_CHANNEL_STACK_REF(chand_->owning_stack_, "ExternalConnectivityWatcher"); - ExecCtx::Run(DEBUG_LOCATION, - GRPC_CLOSURE_CREATE( - [](void* arg, grpc_error* /*error*/) { - auto* self = - static_cast(arg); - self->chand_->combiner_->Run( - [self]() { AddWatcherLocked(self); }, DEBUG_LOCATION); - }, - this, nullptr), - GRPC_ERROR_NONE); + ExecCtx::Run( + DEBUG_LOCATION, + GRPC_CLOSURE_CREATE( + [](void* arg, grpc_error* /*error*/) { + auto* self = static_cast(arg); + self->chand_->logical_thread_->Run( + [self]() { self->AddWatcherLocked(); }, DEBUG_LOCATION); + }, + this, nullptr), + GRPC_ERROR_NONE); } ChannelData::ExternalConnectivityWatcher::~ExternalConnectivityWatcher() { @@ -1180,12 +1179,12 @@ void ChannelData::ExternalConnectivityWatcher::Notify( // Report new state to the user. *state_ = state; ExecCtx::Run(DEBUG_LOCATION, on_complete_, GRPC_ERROR_NONE); - // Hop back into the combiner to clean up. + // Hop back into the logical_thread to clean up. // Not needed in state SHUTDOWN, because the tracker will // automatically remove all watchers in that case. if (state != GRPC_CHANNEL_SHUTDOWN) { - chand_->combiner_->Run([this]() { RemoveWatcherLocked(this); }, - DEBUG_LOCATION); + chand_->logical_thread_->Run([this]() { RemoveWatcherLocked(); }, + DEBUG_LOCATION); } } @@ -1196,23 +1195,20 @@ void ChannelData::ExternalConnectivityWatcher::Cancel() { return; // Already done. } ExecCtx::Run(DEBUG_LOCATION, on_complete_, GRPC_ERROR_CANCELLED); - // Hop back into the combiner to clean up. - chand_->combiner_->Run([this]() { RemoveWatcherLocked(this); }, - DEBUG_LOCATION); + // Hop back into the logical_thread to clean up. + chand_->logical_thread_->Run([this]() { RemoveWatcherLocked(); }, + DEBUG_LOCATION); } -void ChannelData::ExternalConnectivityWatcher::AddWatcherLocked( - ExternalConnectivityWatcher* self) { - Closure::Run(DEBUG_LOCATION, self->watcher_timer_init_, GRPC_ERROR_NONE); +void ChannelData::ExternalConnectivityWatcher::AddWatcherLocked() { + Closure::Run(DEBUG_LOCATION, watcher_timer_init_, GRPC_ERROR_NONE); // Add new watcher. - self->chand_->state_tracker_.AddWatcher( - self->initial_state_, - OrphanablePtr(self)); + chand_->state_tracker_.AddWatcher( + initial_state_, OrphanablePtr(this)); } -void ChannelData::ExternalConnectivityWatcher::RemoveWatcherLocked( - ExternalConnectivityWatcher* self) { - self->chand_->state_tracker_.RemoveWatcher(self); +void ChannelData::ExternalConnectivityWatcher::RemoveWatcherLocked() { + chand_->state_tracker_.RemoveWatcher(this); } // @@ -1228,17 +1224,15 @@ class ChannelData::ConnectivityWatcherAdder { initial_state_(initial_state), watcher_(std::move(watcher)) { GRPC_CHANNEL_STACK_REF(chand_->owning_stack_, "ConnectivityWatcherAdder"); - chand_->combiner_->Run([this]() { AddWatcherLocked(this); }, - DEBUG_LOCATION); + chand_->logical_thread_->Run([this]() { AddWatcherLocked(); }, + DEBUG_LOCATION); } private: - static void AddWatcherLocked(ConnectivityWatcherAdder* self) { - self->chand_->state_tracker_.AddWatcher(self->initial_state_, - std::move(self->watcher_)); - GRPC_CHANNEL_STACK_UNREF(self->chand_->owning_stack_, - "ConnectivityWatcherAdder"); - delete self; + void AddWatcherLocked() { + chand_->state_tracker_.AddWatcher(initial_state_, std::move(watcher_)); + GRPC_CHANNEL_STACK_UNREF(chand_->owning_stack_, "ConnectivityWatcherAdder"); + delete this; } ChannelData* chand_; @@ -1256,16 +1250,16 @@ class ChannelData::ConnectivityWatcherRemover { AsyncConnectivityStateWatcherInterface* watcher) : chand_(chand), watcher_(watcher) { GRPC_CHANNEL_STACK_REF(chand_->owning_stack_, "ConnectivityWatcherRemover"); - chand_->combiner_->Run([this]() { RemoveWatcherLocked(this); }, - DEBUG_LOCATION); + chand_->logical_thread_->Run([this]() { RemoveWatcherLocked(); }, + DEBUG_LOCATION); } private: - static void RemoveWatcherLocked(ConnectivityWatcherRemover* self) { - self->chand_->state_tracker_.RemoveWatcher(self->watcher_); - GRPC_CHANNEL_STACK_UNREF(self->chand_->owning_stack_, + void RemoveWatcherLocked() { + chand_->state_tracker_.RemoveWatcher(watcher_); + GRPC_CHANNEL_STACK_UNREF(chand_->owning_stack_, "ConnectivityWatcherRemover"); - delete self; + delete this; } ChannelData* chand_; @@ -1410,7 +1404,7 @@ ChannelData::ChannelData(grpc_channel_element_args* args, grpc_error** error) client_channel_factory_( ClientChannelFactory::GetFromChannelArgs(args->channel_args)), channelz_node_(GetChannelzNode(args->channel_args)), - combiner_(MakeRefCounted()), + logical_thread_(MakeRefCounted()), interested_parties_(grpc_pollset_set_create()), subchannel_pool_(GetSubchannelPool(args->channel_args)), state_tracker_("client_channel", GRPC_CHANNEL_IDLE), @@ -1584,7 +1578,7 @@ void ChannelData::UpdateServiceConfigLocked( void ChannelData::CreateResolvingLoadBalancingPolicyLocked() { // Instantiate resolving LB policy. LoadBalancingPolicy::Args lb_args; - lb_args.combiner = combiner_; + lb_args.logical_thread = logical_thread_; lb_args.channel_control_helper = MakeUnique(this); lb_args.args = channel_args_; grpc_core::UniquePtr target_uri(gpr_strdup(target_uri_.get())); @@ -1805,8 +1799,7 @@ grpc_error* ChannelData::DoPingLocked(grpc_transport_op* op) { return result.error; } -void ChannelData::StartTransportOpLocked(void* arg, grpc_error* /*ignored*/) { - grpc_transport_op* op = static_cast(arg); +void ChannelData::StartTransportOpLocked(grpc_transport_op* op) { grpc_channel_element* elem = static_cast(op->handler_private.extra_arg); ChannelData* chand = static_cast(elem->channel_data); @@ -1877,15 +1870,11 @@ void ChannelData::StartTransportOp(grpc_channel_element* elem, if (op->bind_pollset != nullptr) { grpc_pollset_set_add_pollset(chand->interested_parties_, op->bind_pollset); } - // Pop into control plane combiner for remaining ops. + // Pop into control plane logical_thread for remaining ops. op->handler_private.extra_arg = elem; GRPC_CHANNEL_STACK_REF(chand->owning_stack_, "start_transport_op"); - chand->combiner_->Run( - Closure::ToFunction( - GRPC_CLOSURE_INIT(&op->handler_private.closure, - ChannelData::StartTransportOpLocked, op, nullptr), - GRPC_ERROR_NONE), - DEBUG_LOCATION); + chand->logical_thread_->Run( + [op]() { ChannelData::StartTransportOpLocked(op); }, DEBUG_LOCATION); } void ChannelData::GetChannelInfo(grpc_channel_element* elem, @@ -1936,14 +1925,13 @@ ChannelData::GetConnectedSubchannelInDataPlane( return connected_subchannel->Ref(); } -void ChannelData::TryToConnectLocked(ChannelData* arg) { - auto* chand = static_cast(arg); - if (chand->resolving_lb_policy_ != nullptr) { - chand->resolving_lb_policy_->ExitIdleLocked(); +void ChannelData::TryToConnectLocked() { + if (resolving_lb_policy_ != nullptr) { + resolving_lb_policy_->ExitIdleLocked(); } else { - chand->CreateResolvingLoadBalancingPolicyLocked(); + CreateResolvingLoadBalancingPolicyLocked(); } - GRPC_CHANNEL_STACK_UNREF(chand->owning_stack_, "TryToConnect"); + GRPC_CHANNEL_STACK_UNREF(owning_stack_, "TryToConnect"); } grpc_connectivity_state ChannelData::CheckConnectivityState( @@ -1955,8 +1943,8 @@ grpc_connectivity_state ChannelData::CheckConnectivityState( GRPC_CLOSURE_CREATE( [](void* arg, grpc_error* /*error*/) { auto* chand = static_cast(arg); - chand->combiner_->Run( - [chand]() { TryToConnectLocked(chand); }, + chand->logical_thread_->Run( + [chand]() { chand->TryToConnectLocked(); }, DEBUG_LOCATION); }, this, nullptr), @@ -3872,7 +3860,7 @@ bool CallData::PickSubchannelLocked(grpc_call_element* elem, // The picker being null means that the channel is currently in IDLE state. // The incoming call will make the channel exit IDLE. if (chand->picker() == nullptr) { - // Bounce into the control plane combiner to exit IDLE. + // Bounce into the control plane logical thread to exit IDLE. chand->CheckConnectivityState(/*try_to_connect=*/true); // Queue the pick, so that it will be attempted once the channel // becomes connected. diff --git a/src/core/ext/filters/client_channel/lb_policy.cc b/src/core/ext/filters/client_channel/lb_policy.cc index d4e36c45a1f..5c6bc386618 100644 --- a/src/core/ext/filters/client_channel/lb_policy.cc +++ b/src/core/ext/filters/client_channel/lb_policy.cc @@ -33,7 +33,7 @@ DebugOnlyTraceFlag grpc_trace_lb_policy_refcount(false, "lb_policy_refcount"); LoadBalancingPolicy::LoadBalancingPolicy(Args args, intptr_t initial_refcount) : InternallyRefCounted(&grpc_trace_lb_policy_refcount, initial_refcount), - combiner_(std::move(args.combiner)), + logical_thread_(std::move(args.logical_thread)), interested_parties_(grpc_pollset_set_create()), channel_control_helper_(std::move(args.channel_control_helper)) {} @@ -98,16 +98,17 @@ LoadBalancingPolicy::PickResult LoadBalancingPolicy::QueuePicker::Pick( // the time this function returns, the pick will already have // been processed, and we'll be trying to re-process the same // pick again, leading to a crash. - // 2. We are currently running in the data plane combiner, but we - // need to bounce into the control plane combiner to call + // 2. We are currently running in the data plane logical_thread, but we + // need to bounce into the control plane logical_thread to call // ExitIdleLocked(). if (!exit_idle_called_) { exit_idle_called_ = true; - parent_->Ref().release(); // ref held by closure. - parent_->combiner()->Run( - Closure::ToFunction( - GRPC_CLOSURE_CREATE(&CallExitIdle, parent_.get(), nullptr), - GRPC_ERROR_NONE), + auto* parent = parent_->Ref().release(); // ref held by lambda. + parent_->logical_thread()->Run( + [parent]() { + parent->ExitIdleLocked(); + parent->Unref(); + }, DEBUG_LOCATION); } PickResult result; @@ -115,13 +116,6 @@ LoadBalancingPolicy::PickResult LoadBalancingPolicy::QueuePicker::Pick( return result; } -void LoadBalancingPolicy::QueuePicker::CallExitIdle(void* arg, - grpc_error* /*error*/) { - LoadBalancingPolicy* parent = static_cast(arg); - parent->ExitIdleLocked(); - parent->Unref(); -} - // // LoadBalancingPolicy::TransientFailurePicker // diff --git a/src/core/ext/filters/client_channel/lb_policy.h b/src/core/ext/filters/client_channel/lb_policy.h index c0d375a4351..fa6dcb7ffee 100644 --- a/src/core/ext/filters/client_channel/lb_policy.h +++ b/src/core/ext/filters/client_channel/lb_policy.h @@ -72,7 +72,7 @@ extern DebugOnlyTraceFlag grpc_trace_lb_policy_refcount; /// LoadBalacingPolicy API. /// /// Note: All methods with a "Locked" suffix must be called from the -/// combiner passed to the constructor. +/// logical_thread passed to the constructor. /// /// Any I/O done by the LB policy should be done under the pollset_set /// returned by \a interested_parties(). @@ -242,7 +242,7 @@ class LoadBalancingPolicy : public InternallyRefCounted { /// live in the LB policy object itself. /// /// Currently, pickers are always accessed from within the - /// client_channel data plane combiner, so they do not have to be + /// client_channel data plane logical_thread, so they do not have to be /// thread-safe. class SubchannelPicker { public: @@ -309,9 +309,9 @@ class LoadBalancingPolicy : public InternallyRefCounted { /// Args used to instantiate an LB policy. struct Args { - /// The combiner under which all LB policy calls will be run. - /// Policy does NOT take ownership of the reference to the combiner. - RefCountedPtr combiner; + /// The logical_thread under which all LB policy calls will be run. + /// Policy does NOT take ownership of the reference to the logical_thread. + RefCountedPtr logical_thread; /// Channel control helper. /// Note: LB policies MUST NOT call any method on the helper from /// their constructor. @@ -349,7 +349,7 @@ class LoadBalancingPolicy : public InternallyRefCounted { grpc_pollset_set* interested_parties() const { return interested_parties_; } - // Note: This must be invoked while holding the combiner. + // Note: This must be invoked while holding the logical_thread. void Orphan() override; // A picker that returns PICK_QUEUE for all picks. @@ -365,8 +365,6 @@ class LoadBalancingPolicy : public InternallyRefCounted { PickResult Pick(PickArgs args) override; private: - static void CallExitIdle(void* arg, grpc_error* error); - RefCountedPtr parent_; bool exit_idle_called_ = false; }; @@ -384,7 +382,9 @@ class LoadBalancingPolicy : public InternallyRefCounted { }; protected: - RefCountedPtr combiner() const { return combiner_; } + RefCountedPtr logical_thread() const { + return logical_thread_; + } // Note: LB policies MUST NOT call any method on the helper from their // constructor. @@ -396,8 +396,8 @@ class LoadBalancingPolicy : public InternallyRefCounted { virtual void ShutdownLocked() = 0; private: - /// Combiner under which LB policy actions take place. - RefCountedPtr combiner_; + /// Logical Thread under which LB policy actions take place. + RefCountedPtr logical_thread_; /// Owned pointer to interested parties in load balancing decisions. grpc_pollset_set* interested_parties_; /// Channel control helper. diff --git a/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc b/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc index e985e495403..c1059d6e574 100644 --- a/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +++ b/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc @@ -251,16 +251,16 @@ class GrpcLb : public LoadBalancingPolicy { // should not be dropped. // // Note: This is called from the picker, so it will be invoked in - // the channel's data plane combiner, NOT the control plane - // combiner. It should not be accessed by any other part of the LB + // the channel's data plane logical_thread, NOT the control plane + // logical_thread. It should not be accessed by any other part of the LB // policy. const char* ShouldDrop(); private: grpc_grpclb_serverlist* serverlist_; - // Guarded by the channel's data plane combiner, NOT the control - // plane combiner. It should not be accessed by anything but the + // Guarded by the channel's data plane logical_thread, NOT the control + // plane logical_thread. It should not be accessed by anything but the // picker via the ShouldDrop() method. size_t drop_index_ = 0; }; @@ -911,7 +911,7 @@ void GrpcLb::BalancerCallState::ScheduleNextClientLoadReportLocked() { void GrpcLb::BalancerCallState::MaybeSendClientLoadReport(void* arg, grpc_error* error) { BalancerCallState* lb_calld = static_cast(arg); - lb_calld->grpclb_policy()->combiner()->Run( + lb_calld->grpclb_policy()->logical_thread()->Run( Closure::ToFunction( GRPC_CLOSURE_INIT(&lb_calld->client_load_report_closure_, MaybeSendClientLoadReportLocked, lb_calld, nullptr), @@ -998,7 +998,7 @@ void GrpcLb::BalancerCallState::SendClientLoadReportLocked() { void GrpcLb::BalancerCallState::ClientLoadReportDone(void* arg, grpc_error* error) { BalancerCallState* lb_calld = static_cast(arg); - lb_calld->grpclb_policy()->combiner()->Run( + lb_calld->grpclb_policy()->logical_thread()->Run( Closure::ToFunction( GRPC_CLOSURE_INIT(&lb_calld->client_load_report_closure_, ClientLoadReportDoneLocked, lb_calld, nullptr), @@ -1022,7 +1022,7 @@ void GrpcLb::BalancerCallState::ClientLoadReportDoneLocked(void* arg, void GrpcLb::BalancerCallState::OnInitialRequestSent(void* arg, grpc_error* error) { BalancerCallState* lb_calld = static_cast(arg); - lb_calld->grpclb_policy()->combiner()->Run( + lb_calld->grpclb_policy()->logical_thread()->Run( Closure::ToFunction( GRPC_CLOSURE_INIT(&lb_calld->lb_on_initial_request_sent_, OnInitialRequestSentLocked, lb_calld, nullptr), @@ -1048,7 +1048,7 @@ void GrpcLb::BalancerCallState::OnInitialRequestSentLocked( void GrpcLb::BalancerCallState::OnBalancerMessageReceived(void* arg, grpc_error* error) { BalancerCallState* lb_calld = static_cast(arg); - lb_calld->grpclb_policy()->combiner()->Run( + lb_calld->grpclb_policy()->logical_thread()->Run( Closure::ToFunction( GRPC_CLOSURE_INIT(&lb_calld->lb_on_balancer_message_received_, OnBalancerMessageReceivedLocked, lb_calld, nullptr), @@ -1206,7 +1206,7 @@ void GrpcLb::BalancerCallState::OnBalancerMessageReceivedLocked( void GrpcLb::BalancerCallState::OnBalancerStatusReceived(void* arg, grpc_error* error) { BalancerCallState* lb_calld = static_cast(arg); - lb_calld->grpclb_policy()->combiner()->Run( + lb_calld->grpclb_policy()->logical_thread()->Run( Closure::ToFunction( GRPC_CLOSURE_INIT(&lb_calld->lb_on_balancer_status_received_, OnBalancerStatusReceivedLocked, lb_calld, nullptr), @@ -1548,7 +1548,7 @@ void GrpcLb::ProcessAddressesAndChannelArgsLocked( void GrpcLb::OnBalancerChannelConnectivityChanged(void* arg, grpc_error* error) { GrpcLb* self = static_cast(arg); - self->combiner()->Run( + self->logical_thread()->Run( Closure::ToFunction( GRPC_CLOSURE_INIT(&self->lb_channel_on_connectivity_changed_, &GrpcLb::OnBalancerChannelConnectivityChangedLocked, @@ -1647,7 +1647,7 @@ void GrpcLb::StartBalancerCallRetryTimerLocked() { void GrpcLb::OnBalancerCallRetryTimer(void* arg, grpc_error* error) { GrpcLb* grpclb_policy = static_cast(arg); - grpclb_policy->combiner()->Run( + grpclb_policy->logical_thread()->Run( Closure::ToFunction( GRPC_CLOSURE_INIT(&grpclb_policy->lb_on_call_retry_, &GrpcLb::OnBalancerCallRetryTimerLocked, @@ -1694,7 +1694,7 @@ void GrpcLb::MaybeEnterFallbackModeAfterStartup() { void GrpcLb::OnFallbackTimer(void* arg, grpc_error* error) { GrpcLb* grpclb_policy = static_cast(arg); - grpclb_policy->combiner()->Run( + grpclb_policy->logical_thread()->Run( Closure::ToFunction(GRPC_CLOSURE_INIT(&grpclb_policy->lb_on_fallback_, &GrpcLb::OnFallbackTimerLocked, grpclb_policy, nullptr), @@ -1742,7 +1742,7 @@ OrphanablePtr GrpcLb::CreateChildPolicyLocked( const char* name, const grpc_channel_args* args) { Helper* helper = new Helper(Ref()); LoadBalancingPolicy::Args lb_policy_args; - lb_policy_args.combiner = combiner(); + lb_policy_args.logical_thread = logical_thread(); lb_policy_args.args = args; lb_policy_args.channel_control_helper = std::unique_ptr(helper); diff --git a/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc b/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc index ae8c5f05571..c7b97fdaf18 100644 --- a/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +++ b/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc @@ -160,7 +160,7 @@ void CdsLb::ClusterWatcher::OnClusterChanged(CdsUpdate cluster_data) { // Create child policy if not already present. if (parent_->child_policy_ == nullptr) { LoadBalancingPolicy::Args args; - args.combiner = parent_->combiner(); + args.logical_thread = parent_->logical_thread(); args.args = parent_->args_; args.channel_control_helper = MakeUnique(parent_->Ref()); parent_->child_policy_ = diff --git a/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc b/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc index bfe3a3c63c6..35912521591 100644 --- a/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc +++ b/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc @@ -746,11 +746,11 @@ void XdsLb::ShutdownLocked() { if (xds_client_from_channel_ != nullptr) { xds_client()->CancelEndpointDataWatch(StringView(eds_service_name()), endpoint_watcher_); - } - if (config_->lrs_load_reporting_server_name() != nullptr) { - xds_client()->RemoveClientStats( - StringView(config_->lrs_load_reporting_server_name()), - StringView(eds_service_name()), &client_stats_); + if (config_->lrs_load_reporting_server_name() != nullptr) { + xds_client()->RemoveClientStats( + StringView(config_->lrs_load_reporting_server_name()), + StringView(eds_service_name()), &client_stats_); + } } xds_client_from_channel_.reset(); xds_client_.reset(); @@ -799,8 +799,9 @@ void XdsLb::UpdateLocked(UpdateArgs args) { if (xds_client_from_channel_ == nullptr) { grpc_error* error = GRPC_ERROR_NONE; xds_client_ = MakeOrphanable( - combiner(), interested_parties(), StringView(eds_service_name()), - nullptr /* service config watcher */, *args_, &error); + logical_thread(), interested_parties(), + StringView(eds_service_name()), nullptr /* service config watcher */, + *args_, &error); // TODO(roth): If we decide that we care about fallback mode, add // proper error handling here. GPR_ASSERT(error == GRPC_ERROR_NONE); @@ -870,7 +871,7 @@ void XdsLb::MaybeCancelFallbackAtStartupChecks() { void XdsLb::OnFallbackTimer(void* arg, grpc_error* error) { XdsLb* xdslb_policy = static_cast(arg); - xdslb_policy->combiner()->Run( + xdslb_policy->logical_thread()->Run( Closure::ToFunction(GRPC_CLOSURE_INIT(&xdslb_policy->lb_on_fallback_, &XdsLb::OnFallbackTimerLocked, xdslb_policy, nullptr), @@ -1001,7 +1002,7 @@ OrphanablePtr XdsLb::CreateFallbackPolicyLocked( FallbackHelper* helper = new FallbackHelper(Ref(DEBUG_LOCATION, "FallbackHelper")); LoadBalancingPolicy::Args lb_policy_args; - lb_policy_args.combiner = combiner(); + lb_policy_args.logical_thread = logical_thread(); lb_policy_args.args = args; lb_policy_args.channel_control_helper = std::unique_ptr(helper); @@ -1409,7 +1410,7 @@ void XdsLb::PriorityList::LocalityMap::UpdateConnectivityStateLocked() { void XdsLb::PriorityList::LocalityMap::OnDelayedRemovalTimer( void* arg, grpc_error* error) { LocalityMap* self = static_cast(arg); - self->xds_policy_->combiner()->Run( + self->xds_policy_->logical_thread()->Run( Closure::ToFunction( GRPC_CLOSURE_INIT(&self->on_delayed_removal_timer_, OnDelayedRemovalTimerLocked, self, nullptr), @@ -1450,7 +1451,7 @@ void XdsLb::PriorityList::LocalityMap::OnDelayedRemovalTimerLocked( void XdsLb::PriorityList::LocalityMap::OnFailoverTimer(void* arg, grpc_error* error) { LocalityMap* self = static_cast(arg); - self->xds_policy_->combiner()->Run( + self->xds_policy_->logical_thread()->Run( Closure::ToFunction( GRPC_CLOSURE_INIT(&self->on_failover_timer_, OnFailoverTimerLocked, self, nullptr), @@ -1513,7 +1514,7 @@ XdsLb::PriorityList::LocalityMap::Locality::CreateChildPolicyLocked( const char* name, const grpc_channel_args* args) { Helper* helper = new Helper(this->Ref(DEBUG_LOCATION, "Helper")); LoadBalancingPolicy::Args lb_policy_args; - lb_policy_args.combiner = xds_policy()->combiner(); + lb_policy_args.logical_thread = xds_policy()->logical_thread(); lb_policy_args.args = args; lb_policy_args.channel_control_helper = std::unique_ptr(helper); @@ -1708,7 +1709,7 @@ void XdsLb::PriorityList::LocalityMap::Locality::DeactivateLocked() { void XdsLb::PriorityList::LocalityMap::Locality::OnDelayedRemovalTimer( void* arg, grpc_error* error) { Locality* self = static_cast(arg); - self->xds_policy()->combiner()->Run( + self->xds_policy()->logical_thread()->Run( Closure::ToFunction( GRPC_CLOSURE_INIT(&self->on_delayed_removal_timer_, OnDelayedRemovalTimerLocked, self, nullptr), diff --git a/src/core/ext/filters/client_channel/resolver.h b/src/core/ext/filters/client_channel/resolver.h index fca67c82775..2842f24142a 100644 --- a/src/core/ext/filters/client_channel/resolver.h +++ b/src/core/ext/filters/client_channel/resolver.h @@ -87,7 +87,7 @@ class Resolver : public InternallyRefCounted { // Not copyable nor movable. Resolver(const Resolver&) = delete; Resolver& operator=(const Resolver&) = delete; - virtual ~Resolver() {} + virtual ~Resolver() = default; /// Starts resolving. virtual void StartLocked() = 0; diff --git a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc index cd1a1eaeac9..3f8f34df056 100644 --- a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +++ b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc @@ -104,10 +104,10 @@ class GrpcPolledFdWindows { tcp_write_state_(WRITE_IDLE), gotten_into_driver_list_(false), address_family_(address_family), - socket_type_(socket_type) { + socket_type_(socket_type), + combiner_(std::move(combiner)) { gpr_asprintf(&name_, "c-ares socket: %" PRIdPTR, as); winsocket_ = grpc_winsocket_create(as, name_); - combiner_ = std::move(combiner); } ~GrpcPolledFdWindows() { @@ -137,7 +137,7 @@ class GrpcPolledFdWindows { GPR_ASSERT(!read_buf_has_data_); read_buf_ = GRPC_SLICE_MALLOC(4192); if (connect_done_) { - combiner_->Run([this]() { ContinueRegisterForOnReadableLocked(this); }, + combiner_->Run([this]() { ContinueRegisterForOnReadableLocked(); }, DEBUG_LOCATION); } else { GPR_ASSERT(pending_continue_register_for_on_readable_locked_ == false); @@ -145,12 +145,7 @@ class GrpcPolledFdWindows { } } - static void ContinueRegisterForOnReadableLocked( - GrpcPolledFdWindows* grpc_polled_fd) { - grpc_polled_fd->InnerContinueRegisterForOnReadableLocked(GRPC_ERROR_NONE); - } - - void InnerContinueRegisterForOnReadableLocked(grpc_error* unused_error) { + void ContinueRegisterForOnReadableLocked() { GRPC_CARES_TRACE_LOG( "fd:|%s| InnerContinueRegisterForOnReadableLocked " "wsa_connect_error_:%d", @@ -202,7 +197,7 @@ class GrpcPolledFdWindows { GPR_ASSERT(write_closure_ == nullptr); write_closure_ = write_closure; if (connect_done_) { - combiner_->Run([this]() { ContinueRegisterForOnWriteableLocked(this); }, + combiner_->Run([this]() { ContinueRegisterForOnWriteableLocked(); }, DEBUG_LOCATION); } else { GPR_ASSERT(pending_continue_register_for_on_writeable_locked_ == false); @@ -210,12 +205,7 @@ class GrpcPolledFdWindows { } } - static void ContinueRegisterForOnWriteableLocked( - GrpcPolledFdWindows* grpc_polled_fd) { - grpc_polled_fd->InnerContinueRegisterForOnWriteableLocked(GRPC_ERROR_NONE); - } - - void InnerContinueRegisterForOnWriteableLocked(grpc_error* unused_error) { + void ContinueRegisterForOnWriteableLocked() { GRPC_CARES_TRACE_LOG( "fd:|%s| InnerContinueRegisterForOnWriteableLocked " "wsa_connect_error_:%d", @@ -475,11 +465,11 @@ class GrpcPolledFdWindows { wsa_connect_error_ = WSA_OPERATION_ABORTED; } if (pending_continue_register_for_on_readable_locked_) { - combiner_->Run([this]() { ContinueRegisterForOnReadableLocked(this); }, + combiner_->Run([this]() { ContinueRegisterForOnReadableLocked(); }, DEBUG_LOCATION); } if (pending_continue_register_for_on_writeable_locked_) { - combiner_->Run([this]() { ContinueRegisterForOnWriteableLocked(this); }, + combiner_->Run([this]() { ContinueRegisterForOnWriteableLocked(); }, DEBUG_LOCATION); } } diff --git a/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc b/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc index d956d40cfd9..b75af860420 100644 --- a/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +++ b/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc @@ -172,22 +172,14 @@ FakeResolverResponseGenerator::FakeResolverResponseGenerator() {} FakeResolverResponseGenerator::~FakeResolverResponseGenerator() {} -struct SetResponseClosureArg { - RefCountedPtr resolver; - Resolver::Result result; - bool has_result = false; - bool immediate = true; -}; - -void FakeResolverResponseGenerator::SetResponseLocked(void* arg) { - SetResponseClosureArg* closure_arg = static_cast(arg); - auto& resolver = closure_arg->resolver; +void FakeResolverResponseGenerator::SetResponseLocked(SetResponseArg* arg) { + auto& resolver = arg->resolver; if (!resolver->shutdown_) { - resolver->next_result_ = std::move(closure_arg->result); + resolver->next_result_ = std::move(arg->result); resolver->has_next_result_ = true; resolver->MaybeSendResultLocked(); } - delete closure_arg; + delete arg; } void FakeResolverResponseGenerator::SetResponse(Resolver::Result result) { @@ -201,21 +193,21 @@ void FakeResolverResponseGenerator::SetResponse(Resolver::Result result) { } resolver = resolver_->Ref(); } - SetResponseClosureArg* closure_arg = new SetResponseClosureArg(); - closure_arg->resolver = std::move(resolver); - closure_arg->result = std::move(result); - closure_arg->resolver->combiner()->Run( - [closure_arg]() { SetResponseLocked(closure_arg); }, DEBUG_LOCATION); + SetResponseArg* arg = new SetResponseArg(); + arg->resolver = std::move(resolver); + arg->result = std::move(result); + arg->resolver->combiner()->Run([arg]() { SetResponseLocked(arg); }, + DEBUG_LOCATION); } -void FakeResolverResponseGenerator::SetReresolutionResponseLocked(void* arg) { - SetResponseClosureArg* closure_arg = static_cast(arg); - auto& resolver = closure_arg->resolver; +void FakeResolverResponseGenerator::SetReresolutionResponseLocked( + SetResponseArg* arg) { + auto& resolver = arg->resolver; if (!resolver->shutdown_) { - resolver->reresolution_result_ = std::move(closure_arg->result); - resolver->has_reresolution_result_ = closure_arg->has_result; + resolver->reresolution_result_ = std::move(arg->result); + resolver->has_reresolution_result_ = arg->has_result; } - delete closure_arg; + delete arg; } void FakeResolverResponseGenerator::SetReresolutionResponse( @@ -226,13 +218,12 @@ void FakeResolverResponseGenerator::SetReresolutionResponse( GPR_ASSERT(resolver_ != nullptr); resolver = resolver_->Ref(); } - SetResponseClosureArg* closure_arg = new SetResponseClosureArg(); - closure_arg->resolver = std::move(resolver); - closure_arg->result = std::move(result); - closure_arg->has_result = true; - closure_arg->resolver->combiner()->Run( - [closure_arg]() { SetReresolutionResponseLocked(closure_arg); }, - DEBUG_LOCATION); + SetResponseArg* arg = new SetResponseArg(); + arg->resolver = std::move(resolver); + arg->result = std::move(result); + arg->has_result = true; + arg->resolver->combiner()->Run( + [arg]() { SetReresolutionResponseLocked(arg); }, DEBUG_LOCATION); } void FakeResolverResponseGenerator::UnsetReresolutionResponse() { @@ -242,21 +233,19 @@ void FakeResolverResponseGenerator::UnsetReresolutionResponse() { GPR_ASSERT(resolver_ != nullptr); resolver = resolver_->Ref(); } - SetResponseClosureArg* closure_arg = new SetResponseClosureArg(); - closure_arg->resolver = std::move(resolver); - closure_arg->resolver->combiner()->Run( - [closure_arg]() { SetReresolutionResponseLocked(closure_arg); }, - DEBUG_LOCATION); + SetResponseArg* arg = new SetResponseArg(); + arg->resolver = std::move(resolver); + arg->resolver->combiner()->Run( + [arg]() { SetReresolutionResponseLocked(arg); }, DEBUG_LOCATION); } -void FakeResolverResponseGenerator::SetFailureLocked(void* arg) { - SetResponseClosureArg* closure_arg = static_cast(arg); - auto& resolver = closure_arg->resolver; +void FakeResolverResponseGenerator::SetFailureLocked(SetResponseArg* arg) { + auto& resolver = arg->resolver; if (!resolver->shutdown_) { resolver->return_failure_ = true; - if (closure_arg->immediate) resolver->MaybeSendResultLocked(); + if (arg->immediate) resolver->MaybeSendResultLocked(); } - delete closure_arg; + delete arg; } void FakeResolverResponseGenerator::SetFailure() { @@ -266,10 +255,10 @@ void FakeResolverResponseGenerator::SetFailure() { GPR_ASSERT(resolver_ != nullptr); resolver = resolver_->Ref(); } - SetResponseClosureArg* closure_arg = new SetResponseClosureArg(); - closure_arg->resolver = std::move(resolver); - closure_arg->resolver->combiner()->Run( - [closure_arg]() { SetFailureLocked(closure_arg); }, DEBUG_LOCATION); + SetResponseArg* arg = new SetResponseArg(); + arg->resolver = std::move(resolver); + arg->resolver->combiner()->Run([arg]() { SetFailureLocked(arg); }, + DEBUG_LOCATION); } void FakeResolverResponseGenerator::SetFailureOnReresolution() { @@ -279,11 +268,11 @@ void FakeResolverResponseGenerator::SetFailureOnReresolution() { GPR_ASSERT(resolver_ != nullptr); resolver = resolver_->Ref(); } - SetResponseClosureArg* closure_arg = new SetResponseClosureArg(); - closure_arg->resolver = std::move(resolver); - closure_arg->immediate = false; - closure_arg->resolver->combiner()->Run( - [closure_arg]() { SetFailureLocked(closure_arg); }, DEBUG_LOCATION); + SetResponseArg* arg = new SetResponseArg(); + arg->resolver = std::move(resolver); + arg->immediate = false; + arg->resolver->combiner()->Run([arg]() { SetFailureLocked(arg); }, + DEBUG_LOCATION); } void FakeResolverResponseGenerator::SetFakeResolver( @@ -292,11 +281,11 @@ void FakeResolverResponseGenerator::SetFakeResolver( resolver_ = std::move(resolver); if (resolver_ == nullptr) return; if (has_result_) { - SetResponseClosureArg* closure_arg = new SetResponseClosureArg(); - closure_arg->resolver = resolver_->Ref(); - closure_arg->result = std::move(result_); - resolver_->combiner()->Run( - [closure_arg]() { SetResponseLocked(closure_arg); }, DEBUG_LOCATION); + SetResponseArg* arg = new SetResponseArg(); + arg->resolver = resolver_->Ref(); + arg->result = std::move(result_); + resolver_->combiner()->Run([arg]() { SetResponseLocked(arg); }, + DEBUG_LOCATION); has_result_ = false; } } diff --git a/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h b/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h index fb107e73215..730cda822e5 100644 --- a/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +++ b/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h @@ -80,9 +80,15 @@ class FakeResolverResponseGenerator // Set the corresponding FakeResolver to this generator. void SetFakeResolver(RefCountedPtr resolver); - static void SetResponseLocked(void* arg); - static void SetReresolutionResponseLocked(void* arg); - static void SetFailureLocked(void* arg); + struct SetResponseArg { + RefCountedPtr resolver; + Resolver::Result result; + bool has_result = false; + bool immediate = true; + }; + static void SetResponseLocked(SetResponseArg* arg); + static void SetReresolutionResponseLocked(SetResponseArg* arg); + static void SetFailureLocked(SetResponseArg* arg); // Mutex protecting the members below. Mutex mu_; diff --git a/src/core/ext/filters/client_channel/resolver_factory.h b/src/core/ext/filters/client_channel/resolver_factory.h index e638adb6a5f..4e17d37d944 100644 --- a/src/core/ext/filters/client_channel/resolver_factory.h +++ b/src/core/ext/filters/client_channel/resolver_factory.h @@ -39,7 +39,7 @@ struct ResolverArgs { /// Used to drive I/O in the name resolution process. grpc_pollset_set* pollset_set = nullptr; /// The combiner under which all resolver calls will be run. - RefCountedPtr combiner = nullptr; + RefCountedPtr combiner; /// The result handler to be used by the resolver. std::unique_ptr result_handler; }; diff --git a/src/core/ext/filters/client_channel/resolving_lb_policy.cc b/src/core/ext/filters/client_channel/resolving_lb_policy.cc index fc5a398da84..bba8dd14c7d 100644 --- a/src/core/ext/filters/client_channel/resolving_lb_policy.cc +++ b/src/core/ext/filters/client_channel/resolving_lb_policy.cc @@ -187,7 +187,7 @@ ResolvingLoadBalancingPolicy::ResolvingLoadBalancingPolicy( process_resolver_result_user_data_(process_resolver_result_user_data) { GPR_ASSERT(process_resolver_result != nullptr); resolver_ = ResolverRegistry::CreateResolver( - target_uri_.get(), args.args, interested_parties(), combiner(), + target_uri_.get(), args.args, interested_parties(), logical_thread(), MakeUnique(Ref())); // Since the validity of args has been checked when create the channel, // CreateResolver() must return a non-null result. @@ -373,7 +373,7 @@ ResolvingLoadBalancingPolicy::CreateLbPolicyLocked( TraceStringVector* trace_strings) { ResolvingControlHelper* helper = new ResolvingControlHelper(Ref()); LoadBalancingPolicy::Args lb_policy_args; - lb_policy_args.combiner = combiner(); + lb_policy_args.logical_thread = logical_thread(); lb_policy_args.channel_control_helper = std::unique_ptr(helper); lb_policy_args.args = &args; diff --git a/src/core/lib/iomgr/logical_thread.cc b/src/core/lib/iomgr/logical_thread.cc index 5eb7b58923b..aa608cf8891 100644 --- a/src/core/lib/iomgr/logical_thread.cc +++ b/src/core/lib/iomgr/logical_thread.cc @@ -49,6 +49,11 @@ void LogicalThreadImpl::Run(std::function callback, callback(); // Loan this thread to the logical thread and drain the queue. DrainQueue(); + // It is possible that while draining the queue, one of the callbacks ended + // up orphaning the logical thread. In that case, delete the object. + if (orphaned_.Load(MemoryOrder::ACQUIRE)) { + delete this; + } } else { CallbackWrapper* cb_wrapper = new CallbackWrapper(std::move(callback), location); @@ -62,15 +67,11 @@ void LogicalThreadImpl::Run(std::function callback, } void LogicalThreadImpl::Orphan() { - ExecCtx::Run(DEBUG_LOCATION, - GRPC_CLOSURE_CREATE( - [](void* arg, grpc_error* /*error*/) { - LogicalThreadImpl* self = - static_cast(arg); - delete self; - }, - this, nullptr), - GRPC_ERROR_NONE); + if (size_.Load(MemoryOrder::ACQUIRE) == 0) { + delete this; + } else { + orphaned_.Store(true, MemoryOrder::RELEASE); + } } // The thread that calls this loans itself to the logical thread so as to @@ -83,7 +84,6 @@ void LogicalThreadImpl::DrainQueue() { gpr_log(GPR_INFO, "LogicalThread::DrainQueue() %p", this); } size_t prev_size = size_.FetchSub(1); - // prev_size should be atleast 1 since GPR_DEBUG_ASSERT(prev_size >= 1); if (prev_size == 1) { if (GRPC_TRACE_FLAG_ENABLED(grpc_logical_thread_trace)) { diff --git a/src/core/lib/iomgr/logical_thread.h b/src/core/lib/iomgr/logical_thread.h index 7935679edf3..b3294a6a527 100644 --- a/src/core/lib/iomgr/logical_thread.h +++ b/src/core/lib/iomgr/logical_thread.h @@ -45,6 +45,7 @@ class LogicalThreadImpl : public Orphanable { void DrainQueue(); Atomic size_{0}; + Atomic orphaned_{false}; MultiProducerSingleConsumerQueue queue_; }; diff --git a/test/core/util/test_lb_policies.cc b/test/core/util/test_lb_policies.cc index 150a196ae45..d2d7718d2bb 100644 --- a/test/core/util/test_lb_policies.cc +++ b/test/core/util/test_lb_policies.cc @@ -55,7 +55,7 @@ class ForwardingLoadBalancingPolicy : public LoadBalancingPolicy { const std::string& delegate_policy_name, intptr_t initial_refcount = 1) : LoadBalancingPolicy(std::move(args), initial_refcount) { Args delegate_args; - delegate_args.combiner = combiner(); + delegate_args.logical_thread = logical_thread(); delegate_args.channel_control_helper = std::move(delegating_helper); delegate_args.args = args.args; delegate_ = LoadBalancingPolicyRegistry::CreateLoadBalancingPolicy( From 0ae85fe7584db4a7af6c283a519f9c6ad1bd52e5 Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Thu, 9 Jan 2020 12:34:55 -0800 Subject: [PATCH 041/758] Fix logical thread orphaning --- src/core/lib/iomgr/logical_thread.cc | 31 +++++++++++++++++--------- src/core/lib/iomgr/logical_thread.h | 5 +++-- test/core/iomgr/logical_thread_test.cc | 29 +++++++++--------------- 3 files changed, 35 insertions(+), 30 deletions(-) diff --git a/src/core/lib/iomgr/logical_thread.cc b/src/core/lib/iomgr/logical_thread.cc index aa608cf8891..de1ab580cd5 100644 --- a/src/core/lib/iomgr/logical_thread.cc +++ b/src/core/lib/iomgr/logical_thread.cc @@ -40,7 +40,9 @@ void LogicalThreadImpl::Run(std::function callback, this, location.file(), location.line()); } const size_t prev_size = size_.FetchAdd(1); - if (prev_size == 0) { + // The logical thread should not have been orphaned. + GPR_DEBUG_ASSERT(prev_size > 0); + if (prev_size == 1) { // There is no other closure executing right now on this logical thread. // Execute this closure immediately. if (GRPC_TRACE_FLAG_ENABLED(grpc_logical_thread_trace)) { @@ -49,11 +51,6 @@ void LogicalThreadImpl::Run(std::function callback, callback(); // Loan this thread to the logical thread and drain the queue. DrainQueue(); - // It is possible that while draining the queue, one of the callbacks ended - // up orphaning the logical thread. In that case, delete the object. - if (orphaned_.Load(MemoryOrder::ACQUIRE)) { - delete this; - } } else { CallbackWrapper* cb_wrapper = new CallbackWrapper(std::move(callback), location); @@ -67,10 +64,15 @@ void LogicalThreadImpl::Run(std::function callback, } void LogicalThreadImpl::Orphan() { - if (size_.Load(MemoryOrder::ACQUIRE) == 0) { + if (GRPC_TRACE_FLAG_ENABLED(grpc_logical_thread_trace)) { + gpr_log(GPR_INFO, "LogicalThread::Orphan() %p", this); + } + size_t prev_size = size_.FetchSub(1); + if (prev_size == 0) { + if (GRPC_TRACE_FLAG_ENABLED(grpc_logical_thread_trace)) { + gpr_log(GPR_INFO, " Destroying"); + } delete this; - } else { - orphaned_.Store(true, MemoryOrder::RELEASE); } } @@ -85,11 +87,20 @@ void LogicalThreadImpl::DrainQueue() { } size_t prev_size = size_.FetchSub(1); GPR_DEBUG_ASSERT(prev_size >= 1); + // It is possible that while draining the queue, one of the callbacks ended + // up orphaning the logical thread. In that case, delete the object. if (prev_size == 1) { + if (GRPC_TRACE_FLAG_ENABLED(grpc_logical_thread_trace)) { + gpr_log(GPR_INFO, " Queue Drained. Destroying"); + } + delete this; + return; + } + if (prev_size == 2) { if (GRPC_TRACE_FLAG_ENABLED(grpc_logical_thread_trace)) { gpr_log(GPR_INFO, " Queue Drained"); } - break; + return; } // There is atleast one callback on the queue. Pop the callback from the // queue and execute it. diff --git a/src/core/lib/iomgr/logical_thread.h b/src/core/lib/iomgr/logical_thread.h index b3294a6a527..9184d2ce106 100644 --- a/src/core/lib/iomgr/logical_thread.h +++ b/src/core/lib/iomgr/logical_thread.h @@ -44,8 +44,9 @@ class LogicalThreadImpl : public Orphanable { private: void DrainQueue(); - Atomic size_{0}; - Atomic orphaned_{false}; + // An initial size of 1 keeps track of whether the logical thread has been + // orphaned. + Atomic size_{1}; MultiProducerSingleConsumerQueue queue_; }; diff --git a/test/core/iomgr/logical_thread_test.cc b/test/core/iomgr/logical_thread_test.cc index 88dde0b5df4..0d449e171ae 100644 --- a/test/core/iomgr/logical_thread_test.cc +++ b/test/core/iomgr/logical_thread_test.cc @@ -31,20 +31,16 @@ namespace { TEST(LogicalThreadTest, NoOp) { - grpc_core::ExecCtx exec_ctx; - { auto lock = grpc_core::MakeRefCounted(); } + auto lock = grpc_core::MakeRefCounted(); } TEST(LogicalThreadTest, ExecuteOne) { - grpc_core::ExecCtx exec_ctx; - { - auto lock = grpc_core::MakeRefCounted(); - gpr_event done; - gpr_event_init(&done); - lock->Run([&done]() { gpr_event_set(&done, (void*)1); }, DEBUG_LOCATION); - EXPECT_TRUE(gpr_event_wait(&done, grpc_timeout_seconds_to_deadline(5)) != - nullptr); - } + auto lock = grpc_core::MakeRefCounted(); + gpr_event done; + gpr_event_init(&done); + lock->Run([&done]() { gpr_event_set(&done, (void*)1); }, DEBUG_LOCATION); + EXPECT_TRUE(gpr_event_wait(&done, grpc_timeout_seconds_to_deadline(5)) != + nullptr); } class TestThread { @@ -97,14 +93,11 @@ class TestThread { }; TEST(LogicalThreadTest, ExecuteMany) { - grpc_core::ExecCtx exec_ctx; + auto lock = grpc_core::MakeRefCounted(); { - auto lock = grpc_core::MakeRefCounted(); - { - std::vector> threads; - for (size_t i = 0; i < 100; ++i) { - threads.push_back(std::unique_ptr(new TestThread(lock))); - } + std::vector> threads; + for (size_t i = 0; i < 100; ++i) { + threads.push_back(std::unique_ptr(new TestThread(lock))); } } } From 895bd10859cf53c7c139fcb82696ed3c3215f327 Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Thu, 9 Jan 2020 12:46:30 -0800 Subject: [PATCH 042/758] s/combiner/logical_thread --- .../ext/filters/client_channel/resolver.cc | 5 +- .../ext/filters/client_channel/resolver.h | 16 +++--- .../resolver/dns/c_ares/dns_resolver_ares.cc | 10 ++-- .../dns/c_ares/grpc_ares_ev_driver.cc | 20 ++++---- .../resolver/dns/c_ares/grpc_ares_ev_driver.h | 6 +-- .../dns/c_ares/grpc_ares_ev_driver_libuv.cc | 17 ++++--- .../dns/c_ares/grpc_ares_ev_driver_posix.cc | 4 +- .../dns/c_ares/grpc_ares_ev_driver_windows.cc | 49 ++++++++++--------- .../resolver/dns/c_ares/grpc_ares_wrapper.cc | 33 +++++++------ .../resolver/dns/c_ares/grpc_ares_wrapper.h | 2 +- .../dns/c_ares/grpc_ares_wrapper_fallback.cc | 4 +- .../resolver/dns/native/dns_resolver.cc | 8 +-- .../resolver/fake/fake_resolver.cc | 28 +++++------ .../resolver/sockaddr/sockaddr_resolver.cc | 4 +- .../resolver/xds/xds_resolver.cc | 4 +- .../filters/client_channel/resolver_factory.h | 4 +- .../client_channel/resolver_registry.cc | 4 +- .../ext/filters/client_channel/xds/xds_api.h | 6 +-- .../filters/client_channel/xds/xds_client.cc | 30 ++++++------ .../filters/client_channel/xds/xds_client.h | 6 +-- .../client_channel/xds/xds_client_stats.h | 32 ++++++------ 21 files changed, 150 insertions(+), 142 deletions(-) diff --git a/src/core/ext/filters/client_channel/resolver.cc b/src/core/ext/filters/client_channel/resolver.cc index fe23ca75699..fd7d6322ec2 100644 --- a/src/core/ext/filters/client_channel/resolver.cc +++ b/src/core/ext/filters/client_channel/resolver.cc @@ -19,7 +19,6 @@ #include #include "src/core/ext/filters/client_channel/resolver.h" -#include "src/core/lib/iomgr/combiner.h" grpc_core::DebugOnlyTraceFlag grpc_trace_resolver_refcount(false, "resolver_refcount"); @@ -30,11 +29,11 @@ namespace grpc_core { // Resolver // -Resolver::Resolver(RefCountedPtr combiner, +Resolver::Resolver(RefCountedPtr logical_thread, std::unique_ptr result_handler) : InternallyRefCounted(&grpc_trace_resolver_refcount), result_handler_(std::move(result_handler)), - combiner_(std::move(combiner)) {} + logical_thread_(std::move(logical_thread)) {} // // Resolver::Result diff --git a/src/core/ext/filters/client_channel/resolver.h b/src/core/ext/filters/client_channel/resolver.h index 2842f24142a..8a830074489 100644 --- a/src/core/ext/filters/client_channel/resolver.h +++ b/src/core/ext/filters/client_channel/resolver.h @@ -45,7 +45,7 @@ namespace grpc_core { /// DNS). /// /// Note: All methods with a "Locked" suffix must be called from the -/// combiner passed to the constructor. +/// logical_thread passed to the constructor. class Resolver : public InternallyRefCounted { public: /// Results returned by the resolver. @@ -115,30 +115,32 @@ class Resolver : public InternallyRefCounted { /// implementations. At that point, this method can go away. virtual void ResetBackoffLocked() {} - // Note: This must be invoked while holding the combiner. + // Note: This must be invoked while holding the logical_thread. void Orphan() override { ShutdownLocked(); Unref(); } protected: - /// Does NOT take ownership of the reference to \a combiner. - // TODO(roth): Once we have a C++-like interface for combiners, this + /// Does NOT take ownership of the reference to \a logical_thread. + // TODO(roth): Once we have a C++-like interface for logical threads, this // API should change to take a RefCountedPtr<>, so that we always take // ownership of a new ref. - explicit Resolver(RefCountedPtr combiner, + explicit Resolver(RefCountedPtr logical_thread, std::unique_ptr result_handler); /// Shuts down the resolver. virtual void ShutdownLocked() = 0; - RefCountedPtr combiner() const { return combiner_; } + RefCountedPtr logical_thread() const { + return logical_thread_; + } ResultHandler* result_handler() const { return result_handler_.get(); } private: std::unique_ptr result_handler_; - RefCountedPtr combiner_; + RefCountedPtr logical_thread_; }; } // namespace grpc_core diff --git a/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc b/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc index 93a990630e8..b0a3e948420 100644 --- a/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +++ b/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc @@ -91,7 +91,7 @@ class AresDnsResolver : public Resolver { bool request_service_config_; /// pollset_set to drive the name resolution process grpc_pollset_set* interested_parties_; - /// closures used by the combiner + /// closures used by the logical_thread grpc_closure on_next_resolution_; grpc_closure on_resolved_; /// are we currently resolving? @@ -120,7 +120,7 @@ class AresDnsResolver : public Resolver { }; AresDnsResolver::AresDnsResolver(ResolverArgs args) - : Resolver(args.combiner, std::move(args.result_handler)), + : Resolver(args.logical_thread, std::move(args.result_handler)), backoff_( BackOff::Options() .set_initial_backoff(GRPC_DNS_INITIAL_CONNECT_BACKOFF_SECONDS * @@ -201,7 +201,7 @@ void AresDnsResolver::ShutdownLocked() { void AresDnsResolver::OnNextResolution(void* arg, grpc_error* error) { AresDnsResolver* r = static_cast(arg); - r->combiner()->Run( + r->logical_thread()->Run( Closure::ToFunction(GRPC_CLOSURE_INIT(&r->on_next_resolution_, OnNextResolutionLocked, r, nullptr), GRPC_ERROR_REF(error)), @@ -327,7 +327,7 @@ char* ChooseServiceConfig(char* service_config_choice_json, void AresDnsResolver::OnResolved(void* arg, grpc_error* error) { AresDnsResolver* r = static_cast(arg); - r->combiner()->Run( + r->logical_thread()->Run( Closure::ToFunction( GRPC_CLOSURE_INIT(&r->on_resolved_, OnResolvedLocked, r, nullptr), GRPC_ERROR_REF(error)), @@ -443,7 +443,7 @@ void AresDnsResolver::StartResolvingLocked() { dns_server_, name_to_resolve_, kDefaultPort, interested_parties_, &on_resolved_, &addresses_, enable_srv_queries_ /* check_grpclb */, request_service_config_ ? &service_config_json_ : nullptr, - query_timeout_ms_, combiner()); + query_timeout_ms_, logical_thread()); last_resolution_timestamp_ = grpc_core::ExecCtx::Get()->Now(); GRPC_CARES_TRACE_LOG("resolver:%p Started resolving. pending_request_:%p", this, pending_request_); diff --git a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc index 00e93d038c1..aa9ab36644a 100644 --- a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc +++ b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc @@ -65,8 +65,8 @@ struct grpc_ares_ev_driver { /** refcount of the event driver */ gpr_refcount refs; - /** combiner to synchronize c-ares and I/O callbacks on */ - grpc_core::RefCountedPtr combiner; + /** logical_thread to synchronize c-ares and I/O callbacks on */ + grpc_core::RefCountedPtr logical_thread; /** a list of grpc_fd that this event driver is currently using. */ fd_node* fds; /** is this event driver currently working? */ @@ -144,7 +144,7 @@ void (*grpc_ares_test_only_inject_config)(ares_channel channel) = grpc_error* grpc_ares_ev_driver_create_locked( grpc_ares_ev_driver** ev_driver, grpc_pollset_set* pollset_set, int query_timeout_ms, - grpc_core::RefCountedPtr combiner, + grpc_core::RefCountedPtr logical_thread, grpc_ares_request* request) { *ev_driver = new grpc_ares_ev_driver(); ares_options opts; @@ -162,7 +162,7 @@ grpc_error* grpc_ares_ev_driver_create_locked( gpr_free(*ev_driver); return err; } - (*ev_driver)->combiner = std::move(combiner); + (*ev_driver)->logical_thread = std::move(logical_thread); gpr_ref_init(&(*ev_driver)->refs, 1); (*ev_driver)->pollset_set = pollset_set; (*ev_driver)->fds = nullptr; @@ -170,7 +170,7 @@ grpc_error* grpc_ares_ev_driver_create_locked( (*ev_driver)->shutting_down = false; (*ev_driver)->request = request; (*ev_driver)->polled_fd_factory = - grpc_core::NewGrpcPolledFdFactory((*ev_driver)->combiner); + grpc_core::NewGrpcPolledFdFactory((*ev_driver)->logical_thread); (*ev_driver) ->polled_fd_factory->ConfigureAresChannelLocked((*ev_driver)->channel); (*ev_driver)->query_timeout_ms = query_timeout_ms; @@ -232,7 +232,7 @@ static grpc_millis calculate_next_ares_backup_poll_alarm_ms( static void on_timeout(void* arg, grpc_error* error) { grpc_ares_ev_driver* driver = static_cast(arg); - driver->combiner->Run( + driver->logical_thread->Run( grpc_core::Closure::ToFunction( GRPC_CLOSURE_INIT(&driver->on_timeout_locked, on_timeout_locked, driver, nullptr), @@ -254,7 +254,7 @@ static void on_timeout_locked(void* arg, grpc_error* error) { static void on_ares_backup_poll_alarm(void* arg, grpc_error* error) { grpc_ares_ev_driver* driver = static_cast(arg); - driver->combiner->Run( + driver->logical_thread->Run( grpc_core::Closure::ToFunction( GRPC_CLOSURE_INIT(&driver->on_ares_backup_poll_alarm_locked, on_ares_backup_poll_alarm_locked, driver, nullptr), @@ -333,7 +333,7 @@ static void on_readable_locked(void* arg, grpc_error* error) { static void on_readable(void* arg, grpc_error* error) { fd_node* fdn = static_cast(arg); - fdn->ev_driver->combiner->Run( + fdn->ev_driver->logical_thread->Run( grpc_core::Closure::ToFunction( GRPC_CLOSURE_INIT(&fdn->read_closure, on_readable_locked, fdn, nullptr), @@ -366,7 +366,7 @@ static void on_writable_locked(void* arg, grpc_error* error) { static void on_writable(void* arg, grpc_error* error) { fd_node* fdn = static_cast(arg); - fdn->ev_driver->combiner->Run( + fdn->ev_driver->logical_thread->Run( grpc_core::Closure::ToFunction( GRPC_CLOSURE_INIT(&fdn->write_closure, on_writable_locked, fdn, nullptr), @@ -396,7 +396,7 @@ static void grpc_ares_notify_on_event_locked(grpc_ares_ev_driver* ev_driver) { fdn = static_cast(gpr_malloc(sizeof(fd_node))); fdn->grpc_polled_fd = ev_driver->polled_fd_factory->NewGrpcPolledFdLocked( - socks[i], ev_driver->pollset_set, ev_driver->combiner); + socks[i], ev_driver->pollset_set, ev_driver->logical_thread); GRPC_CARES_TRACE_LOG("request:%p new fd: %s", ev_driver->request, fdn->grpc_polled_fd->GetName()); fdn->ev_driver = ev_driver; diff --git a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h index 816e7319bb7..93aba9bb9b1 100644 --- a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +++ b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h @@ -43,7 +43,7 @@ ares_channel* grpc_ares_ev_driver_get_channel_locked( grpc_error* grpc_ares_ev_driver_create_locked( grpc_ares_ev_driver** ev_driver, grpc_pollset_set* pollset_set, int query_timeout_ms, - grpc_core::RefCountedPtr combiner, + grpc_core::RefCountedPtr logical_thread, grpc_ares_request* request); /* Called back when all DNS lookups have completed. */ @@ -90,13 +90,13 @@ class GrpcPolledFdFactory { /* Creates a new wrapped fd for the current platform */ virtual GrpcPolledFd* NewGrpcPolledFdLocked( ares_socket_t as, grpc_pollset_set* driver_pollset_set, - RefCountedPtr combiner) = 0; + RefCountedPtr logical_thread) = 0; /* Optionally configures the ares channel after creation */ virtual void ConfigureAresChannelLocked(ares_channel channel) = 0; }; std::unique_ptr NewGrpcPolledFdFactory( - RefCountedPtr combiner); + RefCountedPtr logical_thread); } // namespace grpc_core diff --git a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc index 66e27e641b9..7aa28801943 100644 --- a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc +++ b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc @@ -41,8 +41,9 @@ void ares_uv_poll_close_cb(uv_handle_t* handle) { delete handle; } class GrpcPolledFdLibuv : public GrpcPolledFd { public: - GrpcPolledFdLibuv(ares_socket_t as, RefCountedPtr combiner) - : as_(as), combiner_(std::move(combiner)) { + GrpcPolledFdLibuv(ares_socket_t as, + RefCountedPtr logical_thread) + : as_(as), logical_thread_(std::move(logical_thread)) { gpr_asprintf(&name_, "c-ares socket: %" PRIdPTR, (intptr_t)as); handle_ = new uv_poll_t(); uv_poll_init_socket(uv_default_loop(), handle_, as); @@ -105,7 +106,7 @@ class GrpcPolledFdLibuv : public GrpcPolledFd { grpc_closure* read_closure_ = nullptr; grpc_closure* write_closure_ = nullptr; int poll_events_ = 0; - RefCountedPtr combiner_; + RefCountedPtr logical_thread_; }; struct AresUvPollCbArg { @@ -151,23 +152,23 @@ void ares_uv_poll_cb(uv_poll_t* handle, int status, int events) { GrpcPolledFdLibuv* polled_fd = reinterpret_cast(handle->data); AresUvPollCbArg* arg = new AresUvPollCbArg(handle, status, events); - polled_fd->combiner_->Run([arg]() { ares_uv_poll_cb_locked(arg); }, - DEBUG_LOCATION); + polled_fd->logical_thread_->Run([arg]() { ares_uv_poll_cb_locked(arg); }, + DEBUG_LOCATION); } class GrpcPolledFdFactoryLibuv : public GrpcPolledFdFactory { public: GrpcPolledFd* NewGrpcPolledFdLocked( ares_socket_t as, grpc_pollset_set* driver_pollset_set, - RefCountedPtr combiner) override { - return new GrpcPolledFdLibuv(as, combiner); + RefCountedPtr logical_thread) override { + return new GrpcPolledFdLibuv(as, logical_thread); } void ConfigureAresChannelLocked(ares_channel channel) override {} }; std::unique_ptr NewGrpcPolledFdFactory( - RefCountedPtr /*combiner*/) { + RefCountedPtr /*logical_thread*/) { return MakeUnique(); } diff --git a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc index d5d761991af..ebe17fd46d9 100644 --- a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +++ b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc @@ -90,7 +90,7 @@ class GrpcPolledFdFactoryPosix : public GrpcPolledFdFactory { public: GrpcPolledFd* NewGrpcPolledFdLocked( ares_socket_t as, grpc_pollset_set* driver_pollset_set, - RefCountedPtr /*combiner*/) override { + RefCountedPtr /*logical_thread*/) override { return new GrpcPolledFdPosix(as, driver_pollset_set); } @@ -98,7 +98,7 @@ class GrpcPolledFdFactoryPosix : public GrpcPolledFdFactory { }; std::unique_ptr NewGrpcPolledFdFactory( - RefCountedPtr /*combiner*/) { + RefCountedPtr /*logical_thread*/) { return MakeUnique(); } diff --git a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc index 3f8f34df056..eef2e47ce4e 100644 --- a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +++ b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc @@ -30,8 +30,8 @@ #include #include "src/core/lib/gpr/string.h" #include "src/core/lib/gprpp/memory.h" -#include "src/core/lib/iomgr/combiner.h" #include "src/core/lib/iomgr/iocp_windows.h" +#include "src/core/lib/iomgr/logical_thread.h" #include "src/core/lib/iomgr/sockaddr_utils.h" #include "src/core/lib/iomgr/sockaddr_windows.h" #include "src/core/lib/iomgr/socket_windows.h" @@ -97,7 +97,8 @@ class GrpcPolledFdWindows { WRITE_WAITING_FOR_VERIFICATION_UPON_RETRY, }; - GrpcPolledFdWindows(ares_socket_t as, RefCountedPtr combiner, + GrpcPolledFdWindows(ares_socket_t as, + RefCountedPtr logical_thread, int address_family, int socket_type) : read_buf_(grpc_empty_slice()), write_buf_(grpc_empty_slice()), @@ -105,7 +106,7 @@ class GrpcPolledFdWindows { gotten_into_driver_list_(false), address_family_(address_family), socket_type_(socket_type), - combiner_(std::move(combiner)) { + logical_thread_(std::move(logical_thread)) { gpr_asprintf(&name_, "c-ares socket: %" PRIdPTR, as); winsocket_ = grpc_winsocket_create(as, name_); } @@ -137,8 +138,8 @@ class GrpcPolledFdWindows { GPR_ASSERT(!read_buf_has_data_); read_buf_ = GRPC_SLICE_MALLOC(4192); if (connect_done_) { - combiner_->Run([this]() { ContinueRegisterForOnReadableLocked(); }, - DEBUG_LOCATION); + logical_thread_->Run([this]() { ContinueRegisterForOnReadableLocked(); }, + DEBUG_LOCATION); } else { GPR_ASSERT(pending_continue_register_for_on_readable_locked_ == false); pending_continue_register_for_on_readable_locked_ = true; @@ -197,8 +198,8 @@ class GrpcPolledFdWindows { GPR_ASSERT(write_closure_ == nullptr); write_closure_ = write_closure; if (connect_done_) { - combiner_->Run([this]() { ContinueRegisterForOnWriteableLocked(); }, - DEBUG_LOCATION); + logical_thread_->Run([this]() { ContinueRegisterForOnWriteableLocked(); }, + DEBUG_LOCATION); } else { GPR_ASSERT(pending_continue_register_for_on_writeable_locked_ == false); pending_continue_register_for_on_writeable_locked_ = true; @@ -416,7 +417,7 @@ class GrpcPolledFdWindows { static void OnTcpConnect(void* arg, grpc_error* error) { GrpcPolledFdWindows* grpc_polled_fd = static_cast(arg); - grpc_polled_fd->combiner_->Run( + grpc_polled_fd->logical_thread_->Run( Closure::ToFunction( GRPC_CLOSURE_INIT(&grpc_polled_fd->on_tcp_connect_locked_, &GrpcPolledFdWindows::OnTcpConnectLocked, @@ -465,12 +466,12 @@ class GrpcPolledFdWindows { wsa_connect_error_ = WSA_OPERATION_ABORTED; } if (pending_continue_register_for_on_readable_locked_) { - combiner_->Run([this]() { ContinueRegisterForOnReadableLocked(); }, - DEBUG_LOCATION); + logical_thread_->Run([this]() { ContinueRegisterForOnReadableLocked(); }, + DEBUG_LOCATION); } if (pending_continue_register_for_on_writeable_locked_) { - combiner_->Run([this]() { ContinueRegisterForOnWriteableLocked(); }, - DEBUG_LOCATION); + logical_thread_->Run([this]() { ContinueRegisterForOnWriteableLocked(); }, + DEBUG_LOCATION); } } @@ -580,7 +581,7 @@ class GrpcPolledFdWindows { static void OnIocpReadable(void* arg, grpc_error* error) { GrpcPolledFdWindows* polled_fd = static_cast(arg); - polled_fd->combiner_->Run( + polled_fd->logical_thread_->Run( Closure::ToFunction( GRPC_CLOSURE_INIT(&polled_fd->outer_read_closure_, &GrpcPolledFdWindows::OnIocpReadableLocked, @@ -634,7 +635,7 @@ class GrpcPolledFdWindows { static void OnIocpWriteable(void* arg, grpc_error* error) { GrpcPolledFdWindows* polled_fd = static_cast(arg); - polled_fd->combiner_->Run( + polled_fd->logical_thread_->Run( Closure::ToFunction( GRPC_CLOSURE_INIT(&polled_fd->outer_write_closure_, &GrpcPolledFdWindows::OnIocpWriteableLocked, @@ -680,7 +681,7 @@ class GrpcPolledFdWindows { bool gotten_into_driver_list() const { return gotten_into_driver_list_; } void set_gotten_into_driver_list() { gotten_into_driver_list_ = true; } - RefCountedPtr combiner_; + RefCountedPtr logical_thread_; char recv_from_source_addr_[200]; ares_socklen_t recv_from_source_addr_len_; grpc_slice read_buf_; @@ -722,8 +723,8 @@ struct SockToPolledFdEntry { * with a GrpcPolledFdWindows factory and event driver */ class SockToPolledFdMap { public: - SockToPolledFdMap(RefCountedPtr combiner) - : combiner_(std::move(combiner)) {} + SockToPolledFdMap(RefCountedPtr logical_thread) + : logical_thread_(std::move(logical_thread)) {} ~SockToPolledFdMap() { GPR_ASSERT(head_ == nullptr); } @@ -781,7 +782,7 @@ class SockToPolledFdMap { } grpc_tcp_set_non_block(s); GrpcPolledFdWindows* polled_fd = - new GrpcPolledFdWindows(s, map->combiner_, af, type); + new GrpcPolledFdWindows(s, map->logical_thread_, af, type); GRPC_CARES_TRACE_LOG( "fd:|%s| created with params af:%d type:%d protocol:%d", polled_fd->GetName(), af, type, protocol); @@ -837,7 +838,7 @@ class SockToPolledFdMap { private: SockToPolledFdEntry* head_ = nullptr; - RefCountedPtr combiner_; + RefCountedPtr logical_thread_; }; const struct ares_socket_functions custom_ares_sock_funcs = { @@ -886,12 +887,12 @@ class GrpcPolledFdWindowsWrapper : public GrpcPolledFd { class GrpcPolledFdFactoryWindows : public GrpcPolledFdFactory { public: - GrpcPolledFdFactoryWindows(RefCountedPtr combiner) - : sock_to_polled_fd_map_(combiner) {} + GrpcPolledFdFactoryWindows(RefCountedPtr logical_thread) + : sock_to_polled_fd_map_(logical_thread) {} GrpcPolledFd* NewGrpcPolledFdLocked( ares_socket_t as, grpc_pollset_set* driver_pollset_set, - RefCountedPtr combiner) override { + RefCountedPtr logical_thread) override { GrpcPolledFdWindows* polled_fd = sock_to_polled_fd_map_.LookupPolledFd(as); // Set a flag so that the virtual socket "close" method knows it // doesn't need to call ShutdownLocked, since now the driver will. @@ -909,8 +910,8 @@ class GrpcPolledFdFactoryWindows : public GrpcPolledFdFactory { }; std::unique_ptr NewGrpcPolledFdFactory( - RefCountedPtr combiner) { - return MakeUnique(std::move(combiner)); + RefCountedPtr logical_thread) { + return MakeUnique(std::move(logical_thread)); } } // namespace grpc_core diff --git a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc index 8dc56a4010e..36f63ba7537 100644 --- a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +++ b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc @@ -350,7 +350,7 @@ void grpc_dns_lookup_ares_continue_after_check_localhost_and_ip_literals_locked( grpc_ares_request* r, const char* dns_server, const char* name, const char* default_port, grpc_pollset_set* interested_parties, bool check_grpclb, int query_timeout_ms, - grpc_core::RefCountedPtr combiner) { + grpc_core::RefCountedPtr logical_thread) { grpc_error* error = GRPC_ERROR_NONE; grpc_ares_hostbyname_request* hr = nullptr; ares_channel* channel = nullptr; @@ -372,8 +372,8 @@ void grpc_dns_lookup_ares_continue_after_check_localhost_and_ip_literals_locked( } port.reset(gpr_strdup(default_port)); } - error = grpc_ares_ev_driver_create_locked(&r->ev_driver, interested_parties, - query_timeout_ms, combiner, r); + error = grpc_ares_ev_driver_create_locked( + &r->ev_driver, interested_parties, query_timeout_ms, logical_thread, r); if (error != GRPC_ERROR_NONE) goto error_cleanup; channel = grpc_ares_ev_driver_get_channel_locked(r->ev_driver); // If dns_server is specified, use it. @@ -590,7 +590,7 @@ static grpc_ares_request* grpc_dns_lookup_ares_locked_impl( grpc_pollset_set* interested_parties, grpc_closure* on_done, std::unique_ptr* addrs, bool check_grpclb, char** service_config_json, int query_timeout_ms, - grpc_core::RefCountedPtr combiner) { + grpc_core::RefCountedPtr logical_thread) { grpc_ares_request* r = static_cast(gpr_zalloc(sizeof(grpc_ares_request))); r->ev_driver = nullptr; @@ -624,7 +624,7 @@ static grpc_ares_request* grpc_dns_lookup_ares_locked_impl( // Look up name using c-ares lib. grpc_dns_lookup_ares_continue_after_check_localhost_and_ip_literals_locked( r, dns_server, name, default_port, interested_parties, check_grpclb, - query_timeout_ms, combiner); + query_timeout_ms, logical_thread); return r; } @@ -633,7 +633,7 @@ grpc_ares_request* (*grpc_dns_lookup_ares_locked)( grpc_pollset_set* interested_parties, grpc_closure* on_done, std::unique_ptr* addrs, bool check_grpclb, char** service_config_json, int query_timeout_ms, - grpc_core::RefCountedPtr combiner) = + grpc_core::RefCountedPtr logical_thread) = grpc_dns_lookup_ares_locked_impl; static void grpc_cancel_ares_request_locked_impl(grpc_ares_request* r) { @@ -674,8 +674,8 @@ void grpc_ares_cleanup(void) {} */ typedef struct grpc_resolve_address_ares_request { - /* combiner that queries and related callbacks run under */ - grpc_core::RefCountedPtr combiner; + /* logical_thread that queries and related callbacks run under */ + grpc_core::RefCountedPtr logical_thread; /** the pointer to receive the resolved addresses */ grpc_resolved_addresses** addrs_out; /** currently resolving addresses */ @@ -723,11 +723,12 @@ static void on_dns_lookup_done_locked(void* arg, grpc_error* error) { static void on_dns_lookup_done(void* arg, grpc_error* error) { grpc_resolve_address_ares_request* r = static_cast(arg); - r->combiner->Run(grpc_core::Closure::ToFunction( - GRPC_CLOSURE_INIT(&r->on_dns_lookup_done_locked, - on_dns_lookup_done_locked, r, nullptr), - GRPC_ERROR_REF(error)), - DEBUG_LOCATION); + r->logical_thread->Run( + grpc_core::Closure::ToFunction( + GRPC_CLOSURE_INIT(&r->on_dns_lookup_done_locked, + on_dns_lookup_done_locked, r, nullptr), + GRPC_ERROR_REF(error)), + DEBUG_LOCATION); } static void grpc_resolve_address_invoke_dns_lookup_ares_locked(void* arg) { @@ -739,7 +740,7 @@ static void grpc_resolve_address_invoke_dns_lookup_ares_locked(void* arg) { nullptr /* dns_server */, r->name, r->default_port, r->interested_parties, &r->on_dns_lookup_done_locked, &r->addresses, false /* check_grpclb */, nullptr /* service_config_json */, GRPC_DNS_ARES_DEFAULT_QUERY_TIMEOUT_MS, - r->combiner); + r->logical_thread); } static void grpc_resolve_address_ares_impl(const char* name, @@ -749,13 +750,13 @@ static void grpc_resolve_address_ares_impl(const char* name, grpc_resolved_addresses** addrs) { grpc_resolve_address_ares_request* r = new grpc_resolve_address_ares_request(); - r->combiner = grpc_core::MakeRefCounted(); + r->logical_thread = grpc_core::MakeRefCounted(); r->addrs_out = addrs; r->on_resolve_address_done = on_done; r->name = name; r->default_port = default_port; r->interested_parties = interested_parties; - r->combiner->Run( + r->logical_thread->Run( [r]() { grpc_resolve_address_invoke_dns_lookup_ares_locked(r); }, DEBUG_LOCATION); } diff --git a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h index df2ae43dffe..8c63590c993 100644 --- a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +++ b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h @@ -66,7 +66,7 @@ extern grpc_ares_request* (*grpc_dns_lookup_ares_locked)( grpc_pollset_set* interested_parties, grpc_closure* on_done, std::unique_ptr* addresses, bool check_grpclb, char** service_config_json, int query_timeout_ms, - grpc_core::RefCountedPtr combiner); + grpc_core::RefCountedPtr logical_thread); /* Cancel the pending grpc_ares_request \a request */ extern void (*grpc_cancel_ares_request_locked)(grpc_ares_request* request); diff --git a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc index 9df9bb6b50c..6e76a408bdb 100644 --- a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc +++ b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc @@ -31,7 +31,7 @@ static grpc_ares_request* grpc_dns_lookup_ares_locked_impl( grpc_pollset_set* interested_parties, grpc_closure* on_done, std::unique_ptr* addrs, bool check_grpclb, char** service_config_json, int query_timeout_ms, - grpc_core::RefCountedPtr combiner) { + grpc_core::RefCountedPtr logical_thread) { return NULL; } @@ -40,7 +40,7 @@ grpc_ares_request* (*grpc_dns_lookup_ares_locked)( grpc_pollset_set* interested_parties, grpc_closure* on_done, std::unique_ptr* addrs, bool check_grpclb, char** service_config_json, int query_timeout_ms, - grpc_core::RefCountedPtr combiner) = + grpc_core::RefCountedPtr logical_thread) = grpc_dns_lookup_ares_locked_impl; static void grpc_cancel_ares_request_locked_impl(grpc_ares_request* r) {} diff --git a/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc b/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc index 4fc76ce4deb..c8fa897fc8e 100644 --- a/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +++ b/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc @@ -33,7 +33,7 @@ #include "src/core/lib/channel/channel_args.h" #include "src/core/lib/gpr/string.h" #include "src/core/lib/gprpp/manual_constructor.h" -#include "src/core/lib/iomgr/combiner.h" +#include "src/core/lib/iomgr/logical_thread.h" #include "src/core/lib/iomgr/resolve_address.h" #include "src/core/lib/iomgr/timer.h" @@ -97,7 +97,7 @@ class NativeDnsResolver : public Resolver { }; NativeDnsResolver::NativeDnsResolver(ResolverArgs args) - : Resolver(args.combiner, std::move(args.result_handler)), + : Resolver(args.logical_thread, std::move(args.result_handler)), backoff_( BackOff::Options() .set_initial_backoff(GRPC_DNS_INITIAL_CONNECT_BACKOFF_SECONDS * @@ -149,7 +149,7 @@ void NativeDnsResolver::ShutdownLocked() { void NativeDnsResolver::OnNextResolution(void* arg, grpc_error* error) { NativeDnsResolver* r = static_cast(arg); - r->combiner()->Run( + r->logical_thread()->Run( Closure::ToFunction( GRPC_CLOSURE_INIT(&r->on_next_resolution_, NativeDnsResolver::OnNextResolutionLocked, r, @@ -169,7 +169,7 @@ void NativeDnsResolver::OnNextResolutionLocked(void* arg, grpc_error* error) { void NativeDnsResolver::OnResolved(void* arg, grpc_error* error) { NativeDnsResolver* r = static_cast(arg); - r->combiner()->Run( + r->logical_thread()->Run( Closure::ToFunction( GRPC_CLOSURE_INIT(&r->on_resolved_, NativeDnsResolver::OnResolvedLocked, r, nullptr), diff --git a/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc b/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc index b75af860420..6f479706af7 100644 --- a/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +++ b/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc @@ -35,7 +35,7 @@ #include "src/core/lib/gpr/string.h" #include "src/core/lib/gpr/useful.h" #include "src/core/lib/iomgr/closure.h" -#include "src/core/lib/iomgr/combiner.h" +#include "src/core/lib/iomgr/logical_thread.h" #include "src/core/lib/iomgr/resolve_address.h" #include "src/core/lib/iomgr/unix_sockets_posix.h" #include "src/core/lib/slice/slice_internal.h" @@ -94,7 +94,7 @@ class FakeResolver : public Resolver { }; FakeResolver::FakeResolver(ResolverArgs args) - : Resolver(args.combiner, std::move(args.result_handler)), + : Resolver(args.logical_thread, std::move(args.result_handler)), response_generator_( FakeResolverResponseGenerator::GetFromArgs(args.args)) { // Channels sharing the same subchannels may have different resolver response @@ -126,8 +126,8 @@ void FakeResolver::RequestReresolutionLocked() { if (!reresolution_closure_pending_) { reresolution_closure_pending_ = true; Ref().release(); // ref held by closure - combiner()->Run([this]() { ReturnReresolutionResult(this); }, - DEBUG_LOCATION); + logical_thread()->Run([this]() { ReturnReresolutionResult(this); }, + DEBUG_LOCATION); } } } @@ -196,8 +196,8 @@ void FakeResolverResponseGenerator::SetResponse(Resolver::Result result) { SetResponseArg* arg = new SetResponseArg(); arg->resolver = std::move(resolver); arg->result = std::move(result); - arg->resolver->combiner()->Run([arg]() { SetResponseLocked(arg); }, - DEBUG_LOCATION); + arg->resolver->logical_thread()->Run([arg]() { SetResponseLocked(arg); }, + DEBUG_LOCATION); } void FakeResolverResponseGenerator::SetReresolutionResponseLocked( @@ -222,7 +222,7 @@ void FakeResolverResponseGenerator::SetReresolutionResponse( arg->resolver = std::move(resolver); arg->result = std::move(result); arg->has_result = true; - arg->resolver->combiner()->Run( + arg->resolver->logical_thread()->Run( [arg]() { SetReresolutionResponseLocked(arg); }, DEBUG_LOCATION); } @@ -235,7 +235,7 @@ void FakeResolverResponseGenerator::UnsetReresolutionResponse() { } SetResponseArg* arg = new SetResponseArg(); arg->resolver = std::move(resolver); - arg->resolver->combiner()->Run( + arg->resolver->logical_thread()->Run( [arg]() { SetReresolutionResponseLocked(arg); }, DEBUG_LOCATION); } @@ -257,8 +257,8 @@ void FakeResolverResponseGenerator::SetFailure() { } SetResponseArg* arg = new SetResponseArg(); arg->resolver = std::move(resolver); - arg->resolver->combiner()->Run([arg]() { SetFailureLocked(arg); }, - DEBUG_LOCATION); + arg->resolver->logical_thread()->Run([arg]() { SetFailureLocked(arg); }, + DEBUG_LOCATION); } void FakeResolverResponseGenerator::SetFailureOnReresolution() { @@ -271,8 +271,8 @@ void FakeResolverResponseGenerator::SetFailureOnReresolution() { SetResponseArg* arg = new SetResponseArg(); arg->resolver = std::move(resolver); arg->immediate = false; - arg->resolver->combiner()->Run([arg]() { SetFailureLocked(arg); }, - DEBUG_LOCATION); + arg->resolver->logical_thread()->Run([arg]() { SetFailureLocked(arg); }, + DEBUG_LOCATION); } void FakeResolverResponseGenerator::SetFakeResolver( @@ -284,8 +284,8 @@ void FakeResolverResponseGenerator::SetFakeResolver( SetResponseArg* arg = new SetResponseArg(); arg->resolver = resolver_->Ref(); arg->result = std::move(result_); - resolver_->combiner()->Run([arg]() { SetResponseLocked(arg); }, - DEBUG_LOCATION); + resolver_->logical_thread()->Run([arg]() { SetResponseLocked(arg); }, + DEBUG_LOCATION); has_result_ = false; } } diff --git a/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc b/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc index e946a911e6a..671b72deb8b 100644 --- a/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +++ b/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc @@ -31,7 +31,7 @@ #include "src/core/ext/filters/client_channel/server_address.h" #include "src/core/lib/channel/channel_args.h" #include "src/core/lib/gpr/string.h" -#include "src/core/lib/iomgr/combiner.h" +#include "src/core/lib/iomgr/logical_thread.h" #include "src/core/lib/iomgr/resolve_address.h" #include "src/core/lib/iomgr/unix_sockets_posix.h" #include "src/core/lib/slice/slice_internal.h" @@ -57,7 +57,7 @@ class SockaddrResolver : public Resolver { SockaddrResolver::SockaddrResolver(ServerAddressList addresses, ResolverArgs args) - : Resolver(args.combiner, std::move(args.result_handler)), + : Resolver(args.logical_thread, std::move(args.result_handler)), addresses_(std::move(addresses)), channel_args_(grpc_channel_args_copy(args.args)) {} diff --git a/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc b/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc index e3ef191016b..f4717d55e98 100644 --- a/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +++ b/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc @@ -33,7 +33,7 @@ namespace { class XdsResolver : public Resolver { public: explicit XdsResolver(ResolverArgs args) - : Resolver(args.combiner, std::move(args.result_handler)), + : Resolver(args.logical_thread, std::move(args.result_handler)), args_(grpc_channel_args_copy(args.args)), interested_parties_(args.pollset_set) { char* path = args.uri->path; @@ -88,7 +88,7 @@ void XdsResolver::ServiceConfigWatcher::OnError(grpc_error* error) { void XdsResolver::StartLocked() { grpc_error* error = GRPC_ERROR_NONE; xds_client_ = MakeOrphanable( - combiner(), interested_parties_, StringView(server_name_.get()), + logical_thread(), interested_parties_, StringView(server_name_.get()), MakeUnique(Ref()), *args_, &error); if (error != GRPC_ERROR_NONE) { gpr_log(GPR_ERROR, diff --git a/src/core/ext/filters/client_channel/resolver_factory.h b/src/core/ext/filters/client_channel/resolver_factory.h index 4e17d37d944..0852640c8a0 100644 --- a/src/core/ext/filters/client_channel/resolver_factory.h +++ b/src/core/ext/filters/client_channel/resolver_factory.h @@ -38,8 +38,8 @@ struct ResolverArgs { const grpc_channel_args* args = nullptr; /// Used to drive I/O in the name resolution process. grpc_pollset_set* pollset_set = nullptr; - /// The combiner under which all resolver calls will be run. - RefCountedPtr combiner; + /// The logical_thread under which all resolver calls will be run. + RefCountedPtr logical_thread; /// The result handler to be used by the resolver. std::unique_ptr result_handler; }; diff --git a/src/core/ext/filters/client_channel/resolver_registry.cc b/src/core/ext/filters/client_channel/resolver_registry.cc index 7f688d602aa..5d2393f7801 100644 --- a/src/core/ext/filters/client_channel/resolver_registry.cc +++ b/src/core/ext/filters/client_channel/resolver_registry.cc @@ -145,7 +145,7 @@ bool ResolverRegistry::IsValidTarget(const char* target) { OrphanablePtr ResolverRegistry::CreateResolver( const char* target, const grpc_channel_args* args, - grpc_pollset_set* pollset_set, RefCountedPtr combiner, + grpc_pollset_set* pollset_set, RefCountedPtr logical_thread, std::unique_ptr result_handler) { GPR_ASSERT(g_state != nullptr); grpc_uri* uri = nullptr; @@ -156,7 +156,7 @@ OrphanablePtr ResolverRegistry::CreateResolver( resolver_args.uri = uri; resolver_args.args = args; resolver_args.pollset_set = pollset_set; - resolver_args.combiner = std::move(combiner); + resolver_args.logical_thread = std::move(logical_thread); resolver_args.result_handler = std::move(result_handler); OrphanablePtr resolver = factory == nullptr ? nullptr diff --git a/src/core/ext/filters/client_channel/xds/xds_api.h b/src/core/ext/filters/client_channel/xds/xds_api.h index 51693cd6e4c..516cf9e1a29 100644 --- a/src/core/ext/filters/client_channel/xds/xds_api.h +++ b/src/core/ext/filters/client_channel/xds/xds_api.h @@ -90,8 +90,8 @@ class XdsPriorityListUpdate { }; // There are two phases of accessing this class's content: -// 1. to initialize in the control plane combiner; -// 2. to use in the data plane combiner. +// 1. to initialize in the control plane logical_thread; +// 2. to use in the data plane logical_thread. // So no additional synchronization is needed. class XdsDropConfig : public RefCounted { public: @@ -113,7 +113,7 @@ class XdsDropConfig : public RefCounted { DropCategory{std::move(name), parts_per_million}); } - // The only method invoked from the data plane combiner. + // The only method invoked from the data plane logical_thread. bool ShouldDrop(const grpc_core::UniquePtr** category_name) const; const DropCategoryList& drop_category_list() const { diff --git a/src/core/ext/filters/client_channel/xds/xds_client.cc b/src/core/ext/filters/client_channel/xds/xds_client.cc index 11496e3997f..15008a873e2 100644 --- a/src/core/ext/filters/client_channel/xds/xds_client.cc +++ b/src/core/ext/filters/client_channel/xds/xds_client.cc @@ -46,7 +46,7 @@ #include "src/core/lib/gprpp/orphanable.h" #include "src/core/lib/gprpp/ref_counted_ptr.h" #include "src/core/lib/gprpp/sync.h" -#include "src/core/lib/iomgr/combiner.h" +#include "src/core/lib/iomgr/logical_thread.h" #include "src/core/lib/iomgr/sockaddr.h" #include "src/core/lib/iomgr/sockaddr_utils.h" #include "src/core/lib/iomgr/timer.h" @@ -257,7 +257,8 @@ class XdsClient::ChannelState::StateWatcher : public AsyncConnectivityStateWatcherInterface { public: explicit StateWatcher(RefCountedPtr parent) - : AsyncConnectivityStateWatcherInterface(parent->xds_client()->combiner_), + : AsyncConnectivityStateWatcherInterface( + parent->xds_client()->logical_thread_), parent_(std::move(parent)) {} private: @@ -487,7 +488,7 @@ template void XdsClient::ChannelState::RetryableCall::OnRetryTimer( void* arg, grpc_error* error) { RetryableCall* calld = static_cast(arg); - calld->chand_->xds_client()->combiner_->Run( + calld->chand_->xds_client()->logical_thread_->Run( Closure::ToFunction(GRPC_CLOSURE_INIT(&calld->on_retry_timer_, OnRetryTimerLocked, calld, nullptr), GRPC_ERROR_REF(error)), @@ -633,7 +634,7 @@ void XdsClient::ChannelState::AdsCallState::Orphan() { void XdsClient::ChannelState::AdsCallState::OnResponseReceived( void* arg, grpc_error* error) { AdsCallState* ads_calld = static_cast(arg); - ads_calld->xds_client()->combiner_->Run( + ads_calld->xds_client()->logical_thread_->Run( Closure::ToFunction( GRPC_CLOSURE_INIT(&ads_calld->on_response_received_, OnResponseReceivedLocked, ads_calld, nullptr), @@ -792,7 +793,7 @@ void XdsClient::ChannelState::AdsCallState::OnResponseReceivedLocked( void XdsClient::ChannelState::AdsCallState::OnStatusReceived( void* arg, grpc_error* error) { AdsCallState* ads_calld = static_cast(arg); - ads_calld->xds_client()->combiner_->Run( + ads_calld->xds_client()->logical_thread_->Run( Closure::ToFunction( GRPC_CLOSURE_INIT(&ads_calld->on_status_received_, OnStatusReceivedLocked, ads_calld, nullptr), @@ -855,7 +856,7 @@ void XdsClient::ChannelState::LrsCallState::Reporter:: void XdsClient::ChannelState::LrsCallState::Reporter::OnNextReportTimer( void* arg, grpc_error* error) { Reporter* self = static_cast(arg); - self->xds_client()->combiner_->Run( + self->xds_client()->logical_thread_->Run( Closure::ToFunction( GRPC_CLOSURE_INIT(&self->on_next_report_timer_, OnNextReportTimerLocked, self, nullptr), @@ -917,7 +918,7 @@ void XdsClient::ChannelState::LrsCallState::Reporter::SendReportLocked() { void XdsClient::ChannelState::LrsCallState::Reporter::OnReportDone( void* arg, grpc_error* error) { Reporter* self = static_cast(arg); - self->xds_client()->combiner_->Run( + self->xds_client()->logical_thread_->Run( Closure::ToFunction(GRPC_CLOSURE_INIT(&self->on_report_done_, OnReportDoneLocked, self, nullptr), GRPC_ERROR_REF(error)), @@ -1087,7 +1088,7 @@ void XdsClient::ChannelState::LrsCallState::MaybeStartReportingLocked() { void XdsClient::ChannelState::LrsCallState::OnInitialRequestSent( void* arg, grpc_error* error) { LrsCallState* lrs_calld = static_cast(arg); - lrs_calld->xds_client()->combiner_->Run( + lrs_calld->xds_client()->logical_thread_->Run( Closure::ToFunction( GRPC_CLOSURE_INIT(&lrs_calld->on_initial_request_sent_, OnInitialRequestSentLocked, lrs_calld, nullptr), @@ -1108,7 +1109,7 @@ void XdsClient::ChannelState::LrsCallState::OnInitialRequestSentLocked( void XdsClient::ChannelState::LrsCallState::OnResponseReceived( void* arg, grpc_error* error) { LrsCallState* lrs_calld = static_cast(arg); - lrs_calld->xds_client()->combiner_->Run( + lrs_calld->xds_client()->logical_thread_->Run( Closure::ToFunction( GRPC_CLOSURE_INIT(&lrs_calld->on_response_received_, OnResponseReceivedLocked, lrs_calld, nullptr), @@ -1209,7 +1210,7 @@ void XdsClient::ChannelState::LrsCallState::OnResponseReceivedLocked( void XdsClient::ChannelState::LrsCallState::OnStatusReceived( void* arg, grpc_error* error) { LrsCallState* lrs_calld = static_cast(arg); - lrs_calld->xds_client()->combiner_->Run( + lrs_calld->xds_client()->logical_thread_->Run( Closure::ToFunction( GRPC_CLOSURE_INIT(&lrs_calld->on_status_received_, OnStatusReceivedLocked, lrs_calld, nullptr), @@ -1263,13 +1264,13 @@ grpc_core::UniquePtr GenerateBuildVersionString() { } // namespace -XdsClient::XdsClient(RefCountedPtr combiner, +XdsClient::XdsClient(RefCountedPtr logical_thread, grpc_pollset_set* interested_parties, StringView server_name, std::unique_ptr watcher, const grpc_channel_args& channel_args, grpc_error** error) : build_version_(GenerateBuildVersionString()), - combiner_(std::move(combiner)), + logical_thread_(std::move(logical_thread)), interested_parties_(interested_parties), bootstrap_(XdsBootstrap::ReadFromFile(error)), server_name_(StringViewToCString(server_name)), @@ -1291,8 +1292,9 @@ XdsClient::XdsClient(RefCountedPtr combiner, // TODO(juanlishen): Start LDS call and do not return service config // until we get the first LDS response. XdsClient* self = Ref().release(); - combiner_->Run([self]() { NotifyOnServiceConfig(self, GRPC_ERROR_NONE); }, - DEBUG_LOCATION); + logical_thread_->Run( + [self]() { NotifyOnServiceConfig(self, GRPC_ERROR_NONE); }, + DEBUG_LOCATION); } } diff --git a/src/core/ext/filters/client_channel/xds/xds_client.h b/src/core/ext/filters/client_channel/xds/xds_client.h index 2d3090488a3..d1c0396a8c8 100644 --- a/src/core/ext/filters/client_channel/xds/xds_client.h +++ b/src/core/ext/filters/client_channel/xds/xds_client.h @@ -31,7 +31,7 @@ #include "src/core/lib/gprpp/ref_counted.h" #include "src/core/lib/gprpp/ref_counted_ptr.h" #include "src/core/lib/gprpp/string_view.h" -#include "src/core/lib/iomgr/combiner.h" +#include "src/core/lib/iomgr/logical_thread.h" namespace grpc_core { @@ -72,7 +72,7 @@ class XdsClient : public InternallyRefCounted { // If *error is not GRPC_ERROR_NONE after construction, then there was // an error initializing the client. - XdsClient(RefCountedPtr combiner, + XdsClient(RefCountedPtr logical_thread, grpc_pollset_set* interested_parties, StringView server_name, std::unique_ptr watcher, const grpc_channel_args& channel_args, grpc_error** error); @@ -197,7 +197,7 @@ class XdsClient : public InternallyRefCounted { UniquePtr build_version_; - RefCountedPtr combiner_; + RefCountedPtr logical_thread_; grpc_pollset_set* interested_parties_; std::unique_ptr bootstrap_; diff --git a/src/core/ext/filters/client_channel/xds/xds_client_stats.h b/src/core/ext/filters/client_channel/xds/xds_client_stats.h index 15b246bd3e0..e492a296b21 100644 --- a/src/core/ext/filters/client_channel/xds/xds_client_stats.h +++ b/src/core/ext/filters/client_channel/xds/xds_client_stats.h @@ -137,21 +137,22 @@ class XdsClientStats { // If the refcount is 0, there won't be new calls recorded to the // LocalityStats, so the LocalityStats can be safely deleted when all the // in-progress calls have finished. - // Only be called from the control plane combiner. + // Only be called from the control plane logical_thread. void RefByPicker() { picker_refcount_.FetchAdd(1, MemoryOrder::ACQ_REL); } - // Might be called from the control plane combiner or the data plane - // combiner. + // Might be called from the control plane logical_thread or the data plane + // logical_thread. // TODO(juanlishen): Once https://github.com/grpc/grpc/pull/19390 is merged, - // this method will also only be invoked in the control plane combiner. - // We may then be able to simplify the LocalityStats' lifetime by making it - // RefCounted<> and populating the protobuf in its dtor. + // this method will also only be invoked in the control plane + // logical_thread. We may then be able to simplify the LocalityStats' + // lifetime by making it RefCounted<> and populating the protobuf in its + // dtor. void UnrefByPicker() { picker_refcount_.FetchSub(1, MemoryOrder::ACQ_REL); } - // Only be called from the control plane combiner. + // Only be called from the control plane logical_thread. // The only place where the picker_refcount_ can be increased is // RefByPicker(), which also can only be called from the control plane - // combiner. Also, if the picker_refcount_ is 0, total_requests_in_progress_ - // can't be increased from 0. So it's safe to delete the LocalityStats right - // after this method returns true. + // logical_thread. Also, if the picker_refcount_ is 0, + // total_requests_in_progress_ can't be increased from 0. So it's safe to + // delete the LocalityStats right after this method returns true. bool IsSafeToDelete() { return picker_refcount_.FetchAdd(0, MemoryOrder::ACQ_REL) == 0 && total_requests_in_progress_.FetchAdd(0, MemoryOrder::ACQ_REL) == 0; @@ -168,12 +169,12 @@ class XdsClientStats { Atomic total_issued_requests_{0}; // Protects load_metric_stats_. A mutex is necessary because the length of // load_metric_stats_ can be accessed by both the callback intercepting the - // call's recv_trailing_metadata (not from any combiner) and the load - // reporting thread (from the control plane combiner). + // call's recv_trailing_metadata (not from any logical_thread) and the load + // reporting thread (from the control plane logical_thread). Mutex load_metric_stats_mu_; LoadMetricMap load_metric_stats_; - // Can be accessed from either the control plane combiner or the data plane - // combiner. + // Can be accessed from either the control plane logical_thread or the data + // plane logical_thread. Atomic picker_refcount_{0}; }; @@ -219,7 +220,8 @@ class XdsClientStats { Atomic total_dropped_requests_{0}; // Protects dropped_requests_. A mutex is necessary because the length of // dropped_requests_ can be accessed by both the picker (from data plane - // combiner) and the load reporting thread (from the control plane combiner). + // logical_thread) and the load reporting thread (from the control plane + // logical_thread). Mutex dropped_requests_mu_; DroppedRequestsMap dropped_requests_; // The timestamp of last reporting. For the LB-policy-wide first report, the From 4ffec8c53e2e92d5e135c925175f493590a0282b Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Thu, 9 Jan 2020 13:05:58 -0800 Subject: [PATCH 043/758] s/combiner/logical_thread --- .../dns_resolver_connectivity_test.cc | 10 +++++----- .../resolvers/dns_resolver_cooldown_test.cc | 20 +++++++++---------- .../resolvers/dns_resolver_test.cc | 13 ++++++------ .../resolvers/fake_resolver_test.cc | 8 ++++---- .../resolvers/sockaddr_resolver_test.cc | 10 +++++----- 5 files changed, 31 insertions(+), 30 deletions(-) diff --git a/test/core/client_channel/resolvers/dns_resolver_connectivity_test.cc b/test/core/client_channel/resolvers/dns_resolver_connectivity_test.cc index 88802e993c8..1064653c1d0 100644 --- a/test/core/client_channel/resolvers/dns_resolver_connectivity_test.cc +++ b/test/core/client_channel/resolvers/dns_resolver_connectivity_test.cc @@ -33,7 +33,7 @@ static gpr_mu g_mu; static bool g_fail_resolution = true; -static grpc_core::RefCountedPtr* g_combiner; +static grpc_core::RefCountedPtr* g_logical_thread; static void my_resolve_address(const char* addr, const char* /*default_port*/, grpc_pollset_set* /*interested_parties*/, @@ -66,7 +66,7 @@ static grpc_ares_request* my_dns_lookup_ares_locked( std::unique_ptr* addresses, bool /*check_grpclb*/, char** /*service_config_json*/, int /*query_timeout_ms*/, - grpc_core::RefCountedPtr /*combiner*/) { + grpc_core::RefCountedPtr /*logical_thread*/) { gpr_mu_lock(&g_mu); GPR_ASSERT(0 == strcmp("test", addr)); grpc_error* error = GRPC_ERROR_NONE; @@ -99,7 +99,7 @@ static grpc_core::OrphanablePtr create_resolver( GPR_ASSERT(uri); grpc_core::ResolverArgs args; args.uri = uri; - args.combiner = *g_combiner; + args.logical_thread = *g_logical_thread; args.result_handler = std::move(result_handler); grpc_core::OrphanablePtr resolver = factory->CreateResolver(std::move(args)); @@ -163,8 +163,8 @@ int main(int argc, char** argv) { gpr_mu_init(&g_mu); { grpc_core::ExecCtx exec_ctx; - auto combiner = grpc_core::MakeRefCounted(); - g_combiner = &combiner; + auto logical_thread = grpc_core::MakeRefCounted(); + g_logical_thread = &logical_thread; grpc_set_resolver_impl(&test_resolver); grpc_dns_lookup_ares_locked = my_dns_lookup_ares_locked; grpc_cancel_ares_request_locked = my_cancel_ares_request_locked; diff --git a/test/core/client_channel/resolvers/dns_resolver_cooldown_test.cc b/test/core/client_channel/resolvers/dns_resolver_cooldown_test.cc index c42ff843e6b..cac30472760 100644 --- a/test/core/client_channel/resolvers/dns_resolver_cooldown_test.cc +++ b/test/core/client_channel/resolvers/dns_resolver_cooldown_test.cc @@ -37,14 +37,14 @@ constexpr int kMinResolutionPeriodForCheckMs = 900; extern grpc_address_resolver_vtable* grpc_resolve_address_impl; static grpc_address_resolver_vtable* default_resolve_address; -static grpc_core::RefCountedPtr* g_combiner; +static grpc_core::RefCountedPtr* g_logical_thread; static grpc_ares_request* (*g_default_dns_lookup_ares_locked)( const char* dns_server, const char* name, const char* default_port, grpc_pollset_set* interested_parties, grpc_closure* on_done, std::unique_ptr* addresses, bool check_grpclb, char** service_config_json, int query_timeout_ms, - grpc_core::RefCountedPtr combiner); + grpc_core::RefCountedPtr logical_thread); // Counter incremented by test_resolve_address_impl indicating the number of // times a system-level resolution has happened. @@ -95,11 +95,11 @@ static grpc_ares_request* test_dns_lookup_ares_locked( grpc_pollset_set* /*interested_parties*/, grpc_closure* on_done, std::unique_ptr* addresses, bool check_grpclb, char** service_config_json, int query_timeout_ms, - grpc_core::RefCountedPtr combiner) { + grpc_core::RefCountedPtr logical_thread) { grpc_ares_request* result = g_default_dns_lookup_ares_locked( dns_server, name, default_port, g_iomgr_args.pollset_set, on_done, addresses, check_grpclb, service_config_json, query_timeout_ms, - std::move(combiner)); + std::move(logical_thread)); ++g_resolution_count; static grpc_millis last_resolution_time = 0; grpc_millis now = @@ -272,7 +272,7 @@ static void on_first_resolution(OnResolutionCallbackArg* cb_arg) { gpr_mu_unlock(g_iomgr_args.mu); } -static void start_test_under_combiner(void* arg) { +static void start_test_under_logical_thread(void* arg) { OnResolutionCallbackArg* res_cb_arg = static_cast(arg); res_cb_arg->result_handler = new ResultHandler(); @@ -284,7 +284,7 @@ static void start_test_under_combiner(void* arg) { GPR_ASSERT(uri != nullptr); grpc_core::ResolverArgs args; args.uri = uri; - args.combiner = *g_combiner; + args.logical_thread = *g_logical_thread; args.result_handler = std::unique_ptr( res_cb_arg->result_handler); g_resolution_count = 0; @@ -308,8 +308,8 @@ static void test_cooldown() { OnResolutionCallbackArg* res_cb_arg = new OnResolutionCallbackArg(); res_cb_arg->uri_str = "dns:127.0.0.1"; - (*g_combiner) - ->Run([res_cb_arg]() { start_test_under_combiner(res_cb_arg); }, + (*g_logical_thread) + ->Run([res_cb_arg]() { start_test_under_logical_thread(res_cb_arg); }, DEBUG_LOCATION); grpc_core::ExecCtx::Get()->Flush(); poll_pollset_until_request_done(&g_iomgr_args); @@ -322,8 +322,8 @@ int main(int argc, char** argv) { { grpc_core::ExecCtx exec_ctx; - auto combiner = grpc_core::MakeRefCounted(); - g_combiner = &combiner; + auto logical_thread = grpc_core::MakeRefCounted(); + g_logical_thread = &logical_thread; g_default_dns_lookup_ares_locked = grpc_dns_lookup_ares_locked; grpc_dns_lookup_ares_locked = test_dns_lookup_ares_locked; diff --git a/test/core/client_channel/resolvers/dns_resolver_test.cc b/test/core/client_channel/resolvers/dns_resolver_test.cc index db103398a38..8ee63f303dc 100644 --- a/test/core/client_channel/resolvers/dns_resolver_test.cc +++ b/test/core/client_channel/resolvers/dns_resolver_test.cc @@ -25,10 +25,10 @@ #include "src/core/ext/filters/client_channel/resolver_registry.h" #include "src/core/lib/gpr/string.h" #include "src/core/lib/gprpp/memory.h" -#include "src/core/lib/iomgr/combiner.h" +#include "src/core/lib/iomgr/logical_thread.h" #include "test/core/util/test_config.h" -static grpc_core::RefCountedPtr* g_combiner; +static grpc_core::RefCountedPtr* g_logical_thread; class TestResultHandler : public grpc_core::Resolver::ResultHandler { void ReturnResult(grpc_core::Resolver::Result /*result*/) override {} @@ -44,7 +44,7 @@ static void test_succeeds(grpc_core::ResolverFactory* factory, GPR_ASSERT(uri); grpc_core::ResolverArgs args; args.uri = uri; - args.combiner = *g_combiner; + args.logical_thread = *g_logical_thread; args.result_handler = grpc_core::MakeUnique(); grpc_core::OrphanablePtr resolver = factory->CreateResolver(std::move(args)); @@ -61,7 +61,7 @@ static void test_fails(grpc_core::ResolverFactory* factory, GPR_ASSERT(uri); grpc_core::ResolverArgs args; args.uri = uri; - args.combiner = *g_combiner; + args.logical_thread = *g_logical_thread; args.result_handler = grpc_core::MakeUnique(); grpc_core::OrphanablePtr resolver = factory->CreateResolver(std::move(args)); @@ -75,8 +75,9 @@ int main(int argc, char** argv) { { grpc_core::ExecCtx exec_ctx; { - auto combiner = grpc_core::MakeRefCounted(); - g_combiner = &combiner; + auto logical_thread = + grpc_core::MakeRefCounted(); + g_logical_thread = &logical_thread; grpc_core::ResolverFactory* dns = grpc_core::ResolverRegistry::LookupResolverFactory("dns"); diff --git a/test/core/client_channel/resolvers/fake_resolver_test.cc b/test/core/client_channel/resolvers/fake_resolver_test.cc index 22786b62883..cbd746c8f6b 100644 --- a/test/core/client_channel/resolvers/fake_resolver_test.cc +++ b/test/core/client_channel/resolvers/fake_resolver_test.cc @@ -63,7 +63,7 @@ class ResultHandler : public grpc_core::Resolver::ResultHandler { }; static grpc_core::OrphanablePtr build_fake_resolver( - grpc_core::RefCountedPtr combiner, + grpc_core::RefCountedPtr logical_thread, grpc_core::FakeResolverResponseGenerator* response_generator, std::unique_ptr result_handler) { grpc_core::ResolverFactory* factory = @@ -74,7 +74,7 @@ static grpc_core::OrphanablePtr build_fake_resolver( grpc_channel_args channel_args = {1, &generator_arg}; grpc_core::ResolverArgs args; args.args = &channel_args; - args.combiner = std::move(combiner); + args.logical_thread = std::move(logical_thread); args.result_handler = std::move(result_handler); grpc_core::OrphanablePtr resolver = factory->CreateResolver(std::move(args)); @@ -118,7 +118,7 @@ static grpc_core::Resolver::Result create_new_resolver_result() { static void test_fake_resolver() { grpc_core::ExecCtx exec_ctx; - grpc_core::RefCountedPtr combiner = + grpc_core::RefCountedPtr logical_thread = grpc_core::MakeRefCounted(); // Create resolver. ResultHandler* result_handler = new ResultHandler(); @@ -126,7 +126,7 @@ static void test_fake_resolver() { response_generator = grpc_core::MakeRefCounted(); grpc_core::OrphanablePtr resolver = build_fake_resolver( - combiner, response_generator.get(), + logical_thread, response_generator.get(), std::unique_ptr(result_handler)); GPR_ASSERT(resolver.get() != nullptr); resolver->StartLocked(); diff --git a/test/core/client_channel/resolvers/sockaddr_resolver_test.cc b/test/core/client_channel/resolvers/sockaddr_resolver_test.cc index 7984f8e572a..be17de306b9 100644 --- a/test/core/client_channel/resolvers/sockaddr_resolver_test.cc +++ b/test/core/client_channel/resolvers/sockaddr_resolver_test.cc @@ -28,7 +28,7 @@ #include "test/core/util/test_config.h" -static grpc_core::RefCountedPtr* g_combiner; +static grpc_core::RefCountedPtr* g_logical_thread; class ResultHandler : public grpc_core::Resolver::ResultHandler { public: @@ -46,7 +46,7 @@ static void test_succeeds(grpc_core::ResolverFactory* factory, GPR_ASSERT(uri); grpc_core::ResolverArgs args; args.uri = uri; - args.combiner = *g_combiner; + args.logical_thread = *g_logical_thread; args.result_handler = grpc_core::MakeUnique(); grpc_core::OrphanablePtr resolver = factory->CreateResolver(std::move(args)); @@ -67,7 +67,7 @@ static void test_fails(grpc_core::ResolverFactory* factory, GPR_ASSERT(uri); grpc_core::ResolverArgs args; args.uri = uri; - args.combiner = *g_combiner; + args.logical_thread = *g_logical_thread; args.result_handler = grpc_core::MakeUnique(); grpc_core::OrphanablePtr resolver = factory->CreateResolver(std::move(args)); @@ -80,8 +80,8 @@ int main(int argc, char** argv) { grpc_init(); { grpc_core::ExecCtx exec_ctx; - auto combiner = grpc_core::MakeRefCounted(); - g_combiner = &combiner; + auto logical_thread = grpc_core::MakeRefCounted(); + g_logical_thread = &logical_thread; grpc_core::ResolverFactory* ipv4 = grpc_core::ResolverRegistry::LookupResolverFactory("ipv4"); From c5416fcdb355289eafa66516332d4a9f61c9d37d Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Fri, 10 Jan 2020 20:19:52 -0800 Subject: [PATCH 044/758] Reviewer comments and a minor bug --- .../filters/client_channel/client_channel.cc | 21 +---- .../client_channel/lb_policy/grpclb/grpclb.cc | 1 - .../lb_policy/subchannel_list.h | 2 +- .../client_channel/lb_policy/xds/xds.cc | 1 - .../client_channel/local_subchannel_pool.h | 3 +- .../client_channel/resolver_registry.h | 10 +- .../client_channel/resolving_lb_policy.cc | 1 - .../ext/filters/client_channel/subchannel.cc | 93 +++++++++++++++---- .../ext/filters/client_channel/subchannel.h | 10 +- src/core/lib/iomgr/logical_thread.cc | 2 +- 10 files changed, 94 insertions(+), 50 deletions(-) diff --git a/src/core/ext/filters/client_channel/client_channel.cc b/src/core/ext/filters/client_channel/client_channel.cc index 988761a1dc5..99f5fd722eb 100644 --- a/src/core/ext/filters/client_channel/client_channel.cc +++ b/src/core/ext/filters/client_channel/client_channel.cc @@ -907,7 +907,7 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface { initial_state, grpc_core::UniquePtr( gpr_strdup(health_check_service_name_.get())), - OrphanablePtr( + RefCountedPtr( watcher_wrapper)); } @@ -957,7 +957,7 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface { replacement->last_seen_state(), grpc_core::UniquePtr( gpr_strdup(health_check_service_name.get())), - OrphanablePtr( + RefCountedPtr( replacement)); } // Save the new health check service name. @@ -1006,8 +1006,6 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface { ~WatcherWrapper() { parent_.reset(DEBUG_LOCATION, "WatcherWrapper"); } - void Orphan() override { Unref(); } - void OnConnectivityStateChange( grpc_connectivity_state new_state, RefCountedPtr connected_subchannel) override { @@ -1048,18 +1046,9 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface { : parent_(std::move(parent)), state_(new_state), connected_subchannel_(std::move(connected_subchannel)) { - ExecCtx::Run(DEBUG_LOCATION, - GRPC_CLOSURE_CREATE( - [](void* arg, grpc_error* /*error*/) { - Updater* self = static_cast(arg); - self->parent_->parent_->chand_->logical_thread_->Run( - [self]() { - self->ApplyUpdateInControlPlaneLogicalThread(); - }, - DEBUG_LOCATION); - }, - this, nullptr), - GRPC_ERROR_NONE); + parent_->parent_->chand_->logical_thread_->Run( + [this]() { ApplyUpdateInControlPlaneLogicalThread(); }, + DEBUG_LOCATION); } private: diff --git a/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc b/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc index 2152d21d8d3..a76ca57cdb5 100644 --- a/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +++ b/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc @@ -89,7 +89,6 @@ #include "src/core/lib/gprpp/memory.h" #include "src/core/lib/gprpp/orphanable.h" #include "src/core/lib/gprpp/ref_counted_ptr.h" -#include "src/core/lib/iomgr/combiner.h" #include "src/core/lib/iomgr/sockaddr.h" #include "src/core/lib/iomgr/sockaddr_utils.h" #include "src/core/lib/iomgr/timer.h" diff --git a/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h b/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h index 4932a6869f1..9f85dd0b2a2 100644 --- a/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +++ b/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h @@ -62,7 +62,7 @@ class MySubchannelList }; */ -// All methods will be called from within the client_channel combiner. +// All methods will be called from within the client_channel logical thread. namespace grpc_core { diff --git a/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc b/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc index 80532bc8e77..94c2d93cff6 100644 --- a/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc +++ b/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc @@ -50,7 +50,6 @@ #include "src/core/lib/gprpp/orphanable.h" #include "src/core/lib/gprpp/ref_counted_ptr.h" #include "src/core/lib/gprpp/sync.h" -#include "src/core/lib/iomgr/combiner.h" #include "src/core/lib/iomgr/sockaddr.h" #include "src/core/lib/iomgr/sockaddr_utils.h" #include "src/core/lib/iomgr/timer.h" diff --git a/src/core/ext/filters/client_channel/local_subchannel_pool.h b/src/core/ext/filters/client_channel/local_subchannel_pool.h index a6b7e259fbb..d26d5c16a7e 100644 --- a/src/core/ext/filters/client_channel/local_subchannel_pool.h +++ b/src/core/ext/filters/client_channel/local_subchannel_pool.h @@ -38,7 +38,8 @@ class LocalSubchannelPool final : public SubchannelPoolInterface { ~LocalSubchannelPool() override; // Implements interface methods. - // Thread-unsafe. Intended to be invoked within the client_channel combiner. + // Thread-unsafe. Intended to be invoked within the client_channel logical + // thread. Subchannel* RegisterSubchannel(SubchannelKey* key, Subchannel* constructed) override; void UnregisterSubchannel(SubchannelKey* key) override; diff --git a/src/core/ext/filters/client_channel/resolver_registry.h b/src/core/ext/filters/client_channel/resolver_registry.h index b89effe1609..a0844036229 100644 --- a/src/core/ext/filters/client_channel/resolver_registry.h +++ b/src/core/ext/filters/client_channel/resolver_registry.h @@ -61,15 +61,17 @@ class ResolverRegistry { /// prepends default_prefix to target and tries again. /// If a resolver factory is found, uses it to instantiate a resolver and /// returns it; otherwise, returns nullptr. - /// \a args, \a pollset_set, and \a combiner are passed to the factory's + /// \a args, \a pollset_set, and \a logical_thread are passed to the factory's /// \a CreateResolver() method. /// \a args are the channel args to be included in resolver results. /// \a pollset_set is used to drive I/O in the name resolution process. - /// \a combiner is the combiner under which all resolver calls will be run. - /// \a result_handler is used to return results from the resolver. + /// \a logical_thread is the logical_thread under which all resolver calls + /// will be run. \a result_handler is used to return results from the + /// resolver. static OrphanablePtr CreateResolver( const char* target, const grpc_channel_args* args, - grpc_pollset_set* pollset_set, RefCountedPtr combiner, + grpc_pollset_set* pollset_set, + RefCountedPtr logical_thread, std::unique_ptr result_handler); /// Returns the default authority to pass from a client for \a target. diff --git a/src/core/ext/filters/client_channel/resolving_lb_policy.cc b/src/core/ext/filters/client_channel/resolving_lb_policy.cc index bba8dd14c7d..27e7c5f2fd9 100644 --- a/src/core/ext/filters/client_channel/resolving_lb_policy.cc +++ b/src/core/ext/filters/client_channel/resolving_lb_policy.cc @@ -49,7 +49,6 @@ #include "src/core/lib/gprpp/inlined_vector.h" #include "src/core/lib/gprpp/manual_constructor.h" #include "src/core/lib/gprpp/sync.h" -#include "src/core/lib/iomgr/combiner.h" #include "src/core/lib/iomgr/iomgr.h" #include "src/core/lib/iomgr/polling_entity.h" #include "src/core/lib/profiling/timers.h" diff --git a/src/core/ext/filters/client_channel/subchannel.cc b/src/core/ext/filters/client_channel/subchannel.cc index 8ef241b25e5..cd0f0a9164a 100644 --- a/src/core/ext/filters/client_channel/subchannel.cc +++ b/src/core/ext/filters/client_channel/subchannel.cc @@ -362,12 +362,20 @@ class Subchannel::ConnectedSubchannelStateWatcher Subchannel* subchannel_; }; +namespace { +struct OnConnectivityStateChangeClosureArg { + Subchannel::ConnectivityStateWatcherInterface* watcher = nullptr; + ConnectedSubchannel* subchannel = nullptr; + grpc_connectivity_state state; +}; +}; // namespace + // // Subchannel::ConnectivityStateWatcherList // void Subchannel::ConnectivityStateWatcherList::AddWatcherLocked( - OrphanablePtr watcher) { + RefCountedPtr watcher) { watchers_.insert(std::make_pair(watcher.get(), std::move(watcher))); } @@ -379,19 +387,28 @@ void Subchannel::ConnectivityStateWatcherList::RemoveWatcherLocked( void Subchannel::ConnectivityStateWatcherList::NotifyLocked( Subchannel* subchannel, grpc_connectivity_state state) { for (const auto& p : watchers_) { - RefCountedPtr connected_subchannel; + auto* closure_arg = new OnConnectivityStateChangeClosureArg; if (state == GRPC_CHANNEL_READY) { - connected_subchannel = subchannel->connected_subchannel_; + closure_arg->subchannel = subchannel->connected_subchannel_->Ref() + .release(); // Ref owned by closure } - // TODO(roth): In principle, it seems wrong to send this notification - // to the watcher while holding the subchannel's mutex, since it could - // lead to a deadlock if the watcher calls back into the subchannel - // before returning back to us. In practice, this doesn't happen, - // because the LB policy code that watches subchannels always bounces - // the notification into the client_channel control-plane combiner - // before processing it. But if we ever have any other callers here, - // we will probably need to change this. - p.second->OnConnectivityStateChange(state, std::move(connected_subchannel)); + closure_arg->watcher = p.second->Ref().release(); // Ref owned by closure. + closure_arg->state = state; + ExecCtx::Run( + DEBUG_LOCATION, + GRPC_CLOSURE_CREATE( + [](void* arg, grpc_error* /*error*/) { + auto* closure_arg = + static_cast(arg); + closure_arg->watcher->OnConnectivityStateChange( + closure_arg->state, + std::move(RefCountedPtr( + closure_arg->subchannel)) /* ref passed */); + closure_arg->watcher->Unref(); + delete closure_arg; + }, + closure_arg, nullptr), + GRPC_ERROR_NONE); } } @@ -428,14 +445,30 @@ class Subchannel::HealthWatcherMap::HealthWatcher void AddWatcherLocked( grpc_connectivity_state initial_state, - OrphanablePtr watcher) { + RefCountedPtr watcher) { if (state_ != initial_state) { - RefCountedPtr connected_subchannel; + auto* closure_arg = new OnConnectivityStateChangeClosureArg; if (state_ == GRPC_CHANNEL_READY) { - connected_subchannel = subchannel_->connected_subchannel_; + closure_arg->subchannel = subchannel_->connected_subchannel_->Ref() + .release(); // Ref owned by closure } - watcher->OnConnectivityStateChange(state_, - std::move(connected_subchannel)); + closure_arg->watcher = watcher->Ref().release(); // Ref owned by closure. + closure_arg->state = state_; + ExecCtx::Run( + DEBUG_LOCATION, + GRPC_CLOSURE_CREATE( + [](void* arg, grpc_error* /*error*/) { + auto* closure_arg = + static_cast(arg); + closure_arg->watcher->OnConnectivityStateChange( + closure_arg->state, + std::move(RefCountedPtr( + closure_arg->subchannel)) /* ref passed */); + closure_arg->watcher->Unref(); + delete closure_arg; + }, + closure_arg, nullptr), + GRPC_ERROR_NONE); } watcher_list_.AddWatcherLocked(std::move(watcher)); } @@ -503,7 +536,7 @@ class Subchannel::HealthWatcherMap::HealthWatcher void Subchannel::HealthWatcherMap::AddWatcherLocked( Subchannel* subchannel, grpc_connectivity_state initial_state, grpc_core::UniquePtr health_check_service_name, - OrphanablePtr watcher) { + RefCountedPtr watcher) { // If the health check service name is not already present in the map, // add it. auto it = map_.find(health_check_service_name.get()); @@ -788,7 +821,7 @@ grpc_connectivity_state Subchannel::CheckConnectivityState( void Subchannel::WatchConnectivityState( grpc_connectivity_state initial_state, grpc_core::UniquePtr health_check_service_name, - OrphanablePtr watcher) { + RefCountedPtr watcher) { MutexLock lock(&mu_); grpc_pollset_set* interested_parties = watcher->interested_parties(); if (interested_parties != nullptr) { @@ -796,6 +829,28 @@ void Subchannel::WatchConnectivityState( } if (health_check_service_name == nullptr) { if (state_ != initial_state) { + auto* closure_arg = new OnConnectivityStateChangeClosureArg; + closure_arg->watcher = watcher->Ref().release(); // Ref owned by closure. + if (connected_subchannel_ != nullptr) { + closure_arg->subchannel = + connected_subchannel_->Ref().release(); // Ref owned by closure + } + closure_arg->state = state_; + ExecCtx::Run( + DEBUG_LOCATION, + GRPC_CLOSURE_CREATE( + [](void* arg, grpc_error* /*error*/) { + auto* closure_arg = + static_cast(arg); + closure_arg->watcher->OnConnectivityStateChange( + closure_arg->state, + std::move(RefCountedPtr( + closure_arg->subchannel)) /* ref passed */); + closure_arg->watcher->Unref(); + delete closure_arg; + }, + closure_arg, nullptr), + GRPC_ERROR_NONE); watcher->OnConnectivityStateChange(state_, connected_subchannel_); } watcher_list_.AddWatcherLocked(std::move(watcher)); diff --git a/src/core/ext/filters/client_channel/subchannel.h b/src/core/ext/filters/client_channel/subchannel.h index cf4ddafb45e..dcdce9b6795 100644 --- a/src/core/ext/filters/client_channel/subchannel.h +++ b/src/core/ext/filters/client_channel/subchannel.h @@ -176,7 +176,7 @@ class SubchannelCall { class Subchannel { public: class ConnectivityStateWatcherInterface - : public InternallyRefCounted { + : public RefCounted { public: virtual ~ConnectivityStateWatcherInterface() = default; @@ -243,7 +243,7 @@ class Subchannel { void WatchConnectivityState( grpc_connectivity_state initial_state, grpc_core::UniquePtr health_check_service_name, - OrphanablePtr watcher); + RefCountedPtr watcher); // Cancels a connectivity state watch. // If the watcher has already been destroyed, this is a no-op. @@ -280,7 +280,7 @@ class Subchannel { ~ConnectivityStateWatcherList() { Clear(); } void AddWatcherLocked( - OrphanablePtr watcher); + RefCountedPtr watcher); void RemoveWatcherLocked(ConnectivityStateWatcherInterface* watcher); // Notifies all watchers in the list about a change to state. @@ -294,7 +294,7 @@ class Subchannel { // TODO(roth): Once we can use C++-14 heterogeneous lookups, this can // be a set instead of a map. std::map> + RefCountedPtr> watchers_; }; @@ -312,7 +312,7 @@ class Subchannel { void AddWatcherLocked( Subchannel* subchannel, grpc_connectivity_state initial_state, grpc_core::UniquePtr health_check_service_name, - OrphanablePtr watcher); + RefCountedPtr watcher); void RemoveWatcherLocked(const char* health_check_service_name, ConnectivityStateWatcherInterface* watcher); diff --git a/src/core/lib/iomgr/logical_thread.cc b/src/core/lib/iomgr/logical_thread.cc index de1ab580cd5..a2269dba26d 100644 --- a/src/core/lib/iomgr/logical_thread.cc +++ b/src/core/lib/iomgr/logical_thread.cc @@ -68,7 +68,7 @@ void LogicalThreadImpl::Orphan() { gpr_log(GPR_INFO, "LogicalThread::Orphan() %p", this); } size_t prev_size = size_.FetchSub(1); - if (prev_size == 0) { + if (prev_size == 1) { if (GRPC_TRACE_FLAG_ENABLED(grpc_logical_thread_trace)) { gpr_log(GPR_INFO, " Destroying"); } From 0cba88bc5ac3f556aae40ac884cd40b261204c1c Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Fri, 10 Jan 2020 21:46:16 -0800 Subject: [PATCH 045/758] FakeResolver changes --- .../ext/filters/client_channel/lb_policy.cc | 19 +- .../resolver/fake/fake_resolver.cc | 186 ++++++++---------- .../resolver/fake/fake_resolver.h | 67 ++++++- 3 files changed, 154 insertions(+), 118 deletions(-) diff --git a/src/core/ext/filters/client_channel/lb_policy.cc b/src/core/ext/filters/client_channel/lb_policy.cc index 5c6bc386618..748dc1e80af 100644 --- a/src/core/ext/filters/client_channel/lb_policy.cc +++ b/src/core/ext/filters/client_channel/lb_policy.cc @@ -104,12 +104,19 @@ LoadBalancingPolicy::PickResult LoadBalancingPolicy::QueuePicker::Pick( if (!exit_idle_called_) { exit_idle_called_ = true; auto* parent = parent_->Ref().release(); // ref held by lambda. - parent_->logical_thread()->Run( - [parent]() { - parent->ExitIdleLocked(); - parent->Unref(); - }, - DEBUG_LOCATION); + ExecCtx::Run(DEBUG_LOCATION, + GRPC_CLOSURE_CREATE( + [](void* arg, grpc_error* /*error*/) { + auto* parent = static_cast(arg); + parent->logical_thread()->Run( + [parent]() { + parent->ExitIdleLocked(); + parent->Unref(); + }, + DEBUG_LOCATION); + }, + parent, nullptr), + GRPC_ERROR_NONE); } PickResult result; result.type = PickResult::PICK_QUEUE; diff --git a/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc b/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc index 6f479706af7..db6593b179b 100644 --- a/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +++ b/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc @@ -45,54 +45,6 @@ namespace grpc_core { -// This cannot be in an anonymous namespace, because it is a friend of -// FakeResolverResponseGenerator. -class FakeResolver : public Resolver { - public: - explicit FakeResolver(ResolverArgs args); - - void StartLocked() override; - - void RequestReresolutionLocked() override; - - private: - friend class FakeResolverResponseGenerator; - - virtual ~FakeResolver(); - - void ShutdownLocked() override { - shutdown_ = true; - if (response_generator_ != nullptr) { - response_generator_->SetFakeResolver(nullptr); - response_generator_.reset(); - } - } - - void MaybeSendResultLocked(); - - static void ReturnReresolutionResult(void* arg); - - // passed-in parameters - grpc_channel_args* channel_args_ = nullptr; - RefCountedPtr response_generator_; - // If has_next_result_ is true, next_result_ is the next resolution result - // to be returned. - bool has_next_result_ = false; - Result next_result_; - // Result to use for the pretended re-resolution in - // RequestReresolutionLocked(). - bool has_reresolution_result_ = false; - Result reresolution_result_; - // True after the call to StartLocked(). - bool started_ = false; - // True after the call to ShutdownLocked(). - bool shutdown_ = false; - // if true, return failure - bool return_failure_ = false; - // pending re-resolution - bool reresolution_closure_pending_ = false; -}; - FakeResolver::FakeResolver(ResolverArgs args) : Resolver(args.logical_thread, std::move(args.result_handler)), response_generator_( @@ -126,12 +78,20 @@ void FakeResolver::RequestReresolutionLocked() { if (!reresolution_closure_pending_) { reresolution_closure_pending_ = true; Ref().release(); // ref held by closure - logical_thread()->Run([this]() { ReturnReresolutionResult(this); }, + logical_thread()->Run([this]() { ReturnReresolutionResult(); }, DEBUG_LOCATION); } } } +void FakeResolver::ShutdownLocked() { + shutdown_ = true; + if (response_generator_ != nullptr) { + response_generator_->SetFakeResolver(nullptr); + response_generator_.reset(); + } +} + void FakeResolver::MaybeSendResultLocked() { if (!started_ || shutdown_) return; if (return_failure_) { @@ -157,11 +117,10 @@ void FakeResolver::MaybeSendResultLocked() { } } -void FakeResolver::ReturnReresolutionResult(void* arg) { - FakeResolver* self = static_cast(arg); - self->reresolution_closure_pending_ = false; - self->MaybeSendResultLocked(); - self->Unref(); +void FakeResolver::ReturnReresolutionResult() { + reresolution_closure_pending_ = false; + MaybeSendResultLocked(); + Unref(); } // @@ -172,14 +131,12 @@ FakeResolverResponseGenerator::FakeResolverResponseGenerator() {} FakeResolverResponseGenerator::~FakeResolverResponseGenerator() {} -void FakeResolverResponseGenerator::SetResponseLocked(SetResponseArg* arg) { - auto& resolver = arg->resolver; - if (!resolver->shutdown_) { - resolver->next_result_ = std::move(arg->result); - resolver->has_next_result_ = true; - resolver->MaybeSendResultLocked(); +void FakeResolverResponseGenerator::ResponseSetter::SetResponseLocked() { + if (!resolver_->shutdown_) { + resolver_->next_result_ = std::move(result_); + resolver_->has_next_result_ = true; + resolver_->MaybeSendResultLocked(); } - delete arg; } void FakeResolverResponseGenerator::SetResponse(Resolver::Result result) { @@ -193,21 +150,23 @@ void FakeResolverResponseGenerator::SetResponse(Resolver::Result result) { } resolver = resolver_->Ref(); } - SetResponseArg* arg = new SetResponseArg(); - arg->resolver = std::move(resolver); - arg->result = std::move(result); - arg->resolver->logical_thread()->Run([arg]() { SetResponseLocked(arg); }, - DEBUG_LOCATION); + FakeResolverResponseGenerator::ResponseSetter* arg = + new FakeResolverResponseGenerator::ResponseSetter(resolver, + std::move(result)); + resolver->logical_thread()->Run( + [arg]() { + arg->SetResponseLocked(); + delete arg; + }, + DEBUG_LOCATION); } -void FakeResolverResponseGenerator::SetReresolutionResponseLocked( - SetResponseArg* arg) { - auto& resolver = arg->resolver; - if (!resolver->shutdown_) { - resolver->reresolution_result_ = std::move(arg->result); - resolver->has_reresolution_result_ = arg->has_result; +void FakeResolverResponseGenerator::ResponseSetter:: + SetReresolutionResponseLocked() { + if (!resolver_->shutdown_) { + resolver_->reresolution_result_ = std::move(result_); + resolver_->has_reresolution_result_ = has_result_; } - delete arg; } void FakeResolverResponseGenerator::SetReresolutionResponse( @@ -218,12 +177,16 @@ void FakeResolverResponseGenerator::SetReresolutionResponse( GPR_ASSERT(resolver_ != nullptr); resolver = resolver_->Ref(); } - SetResponseArg* arg = new SetResponseArg(); - arg->resolver = std::move(resolver); - arg->result = std::move(result); - arg->has_result = true; - arg->resolver->logical_thread()->Run( - [arg]() { SetReresolutionResponseLocked(arg); }, DEBUG_LOCATION); + FakeResolverResponseGenerator::ResponseSetter* arg = + new FakeResolverResponseGenerator::ResponseSetter(resolver, + std::move(result)); + arg->set_has_result(); + resolver->logical_thread()->Run( + [arg]() { + arg->SetReresolutionResponseLocked(); + delete arg; + }, + DEBUG_LOCATION); } void FakeResolverResponseGenerator::UnsetReresolutionResponse() { @@ -233,19 +196,22 @@ void FakeResolverResponseGenerator::UnsetReresolutionResponse() { GPR_ASSERT(resolver_ != nullptr); resolver = resolver_->Ref(); } - SetResponseArg* arg = new SetResponseArg(); - arg->resolver = std::move(resolver); - arg->resolver->logical_thread()->Run( - [arg]() { SetReresolutionResponseLocked(arg); }, DEBUG_LOCATION); + FakeResolverResponseGenerator::ResponseSetter* arg = + new FakeResolverResponseGenerator::ResponseSetter(resolver, + Resolver::Result()); + resolver->logical_thread()->Run( + [arg]() { + arg->SetReresolutionResponseLocked(); + delete arg; + }, + DEBUG_LOCATION); } -void FakeResolverResponseGenerator::SetFailureLocked(SetResponseArg* arg) { - auto& resolver = arg->resolver; - if (!resolver->shutdown_) { - resolver->return_failure_ = true; - if (arg->immediate) resolver->MaybeSendResultLocked(); +void FakeResolverResponseGenerator::ResponseSetter::SetFailureLocked() { + if (!resolver_->shutdown_) { + resolver_->return_failure_ = true; + if (immediate_) resolver_->MaybeSendResultLocked(); } - delete arg; } void FakeResolverResponseGenerator::SetFailure() { @@ -255,10 +221,15 @@ void FakeResolverResponseGenerator::SetFailure() { GPR_ASSERT(resolver_ != nullptr); resolver = resolver_->Ref(); } - SetResponseArg* arg = new SetResponseArg(); - arg->resolver = std::move(resolver); - arg->resolver->logical_thread()->Run([arg]() { SetFailureLocked(arg); }, - DEBUG_LOCATION); + FakeResolverResponseGenerator::ResponseSetter* arg = + new FakeResolverResponseGenerator::ResponseSetter(resolver, + Resolver::Result()); + resolver->logical_thread()->Run( + [arg]() { + arg->SetFailureLocked(); + delete arg; + }, + DEBUG_LOCATION); } void FakeResolverResponseGenerator::SetFailureOnReresolution() { @@ -268,11 +239,16 @@ void FakeResolverResponseGenerator::SetFailureOnReresolution() { GPR_ASSERT(resolver_ != nullptr); resolver = resolver_->Ref(); } - SetResponseArg* arg = new SetResponseArg(); - arg->resolver = std::move(resolver); - arg->immediate = false; - arg->resolver->logical_thread()->Run([arg]() { SetFailureLocked(arg); }, - DEBUG_LOCATION); + FakeResolverResponseGenerator::ResponseSetter* arg = + new FakeResolverResponseGenerator::ResponseSetter(resolver, + Resolver::Result()); + arg->reset_immediate(); + resolver->logical_thread()->Run( + [arg]() { + arg->SetFailureLocked(); + delete arg; + }, + DEBUG_LOCATION); } void FakeResolverResponseGenerator::SetFakeResolver( @@ -281,11 +257,15 @@ void FakeResolverResponseGenerator::SetFakeResolver( resolver_ = std::move(resolver); if (resolver_ == nullptr) return; if (has_result_) { - SetResponseArg* arg = new SetResponseArg(); - arg->resolver = resolver_->Ref(); - arg->result = std::move(result_); - resolver_->logical_thread()->Run([arg]() { SetResponseLocked(arg); }, - DEBUG_LOCATION); + FakeResolverResponseGenerator::ResponseSetter* arg = + new FakeResolverResponseGenerator::ResponseSetter(resolver_, + std::move(result_)); + resolver_->logical_thread()->Run( + [arg]() { + arg->SetResponseLocked(); + delete arg; + }, + DEBUG_LOCATION); has_result_ = false; } } diff --git a/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h b/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h index 730cda822e5..dbfafe86c40 100644 --- a/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +++ b/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h @@ -20,6 +20,7 @@ #include #include "src/core/ext/filters/client_channel/resolver.h" +#include "src/core/ext/filters/client_channel/resolver_factory.h" #include "src/core/lib/channel/channel_args.h" #include "src/core/lib/gprpp/ref_counted.h" #include "src/core/lib/iomgr/error.h" @@ -29,7 +30,47 @@ namespace grpc_core { -class FakeResolver; +class FakeResolverResponseGenerator; + +class FakeResolver : public Resolver { + public: + explicit FakeResolver(ResolverArgs args); + + void StartLocked() override; + + void RequestReresolutionLocked() override; + + private: + friend class FakeResolverResponseGenerator; + + virtual ~FakeResolver(); + + void ShutdownLocked() override; + + void MaybeSendResultLocked(); + + void ReturnReresolutionResult(); + + // passed-in parameters + grpc_channel_args* channel_args_ = nullptr; + RefCountedPtr response_generator_; + // If has_next_result_ is true, next_result_ is the next resolution result + // to be returned. + bool has_next_result_ = false; + Result next_result_; + // Result to use for the pretended re-resolution in + // RequestReresolutionLocked(). + bool has_reresolution_result_ = false; + Result reresolution_result_; + // True after the call to StartLocked(). + bool started_ = false; + // True after the call to ShutdownLocked(). + bool shutdown_ = false; + // if true, return failure + bool return_failure_ = false; + // pending re-resolution + bool reresolution_closure_pending_ = false; +}; /// A mechanism for generating responses for the fake resolver. /// An instance of this class is passed to the fake resolver via a channel @@ -80,15 +121,23 @@ class FakeResolverResponseGenerator // Set the corresponding FakeResolver to this generator. void SetFakeResolver(RefCountedPtr resolver); - struct SetResponseArg { - RefCountedPtr resolver; - Resolver::Result result; - bool has_result = false; - bool immediate = true; + class ResponseSetter { + public: + explicit ResponseSetter(RefCountedPtr resolver, + Resolver::Result result) + : resolver_(std::move(resolver)), result_(result) {} + void set_has_result() { has_result_ = true; } + void reset_immediate() { immediate_ = false; } + void SetResponseLocked(); + void SetReresolutionResponseLocked(); + void SetFailureLocked(); + + private: + RefCountedPtr resolver_; + Resolver::Result result_; + bool has_result_ = false; + bool immediate_ = true; }; - static void SetResponseLocked(SetResponseArg* arg); - static void SetReresolutionResponseLocked(SetResponseArg* arg); - static void SetFailureLocked(SetResponseArg* arg); // Mutex protecting the members below. Mutex mu_; From 022d5b205fda8f99f7adccea838142abe9a7da32 Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Tue, 14 Jan 2020 20:44:33 +1300 Subject: [PATCH 046/758] Update IAsyncStreamWriter.cs --- src/csharp/Grpc.Core.Api/IAsyncStreamWriter.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/csharp/Grpc.Core.Api/IAsyncStreamWriter.cs b/src/csharp/Grpc.Core.Api/IAsyncStreamWriter.cs index 823ca9afc48..ccf046851a0 100644 --- a/src/csharp/Grpc.Core.Api/IAsyncStreamWriter.cs +++ b/src/csharp/Grpc.Core.Api/IAsyncStreamWriter.cs @@ -31,9 +31,9 @@ namespace Grpc.Core public interface IAsyncStreamWriter { /// - /// Writes a single asynchronously. Only one write can be pending at a time. + /// Writes a message asynchronously. Only one write can be pending at a time. /// - /// the message to be written. Cannot be null. + /// The message to be written. Cannot be null. Task WriteAsync(T message); /// From ff7364ef37d53eb80074625453a77d04a15b4f93 Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Tue, 14 Jan 2020 15:10:23 -0800 Subject: [PATCH 047/758] Reviewer comments --- .../filters/client_channel/client_channel.cc | 45 ++-- .../client_channel/lb_policy/grpclb/grpclb.cc | 245 ++++++++---------- .../ext/filters/client_channel/resolver.h | 3 - .../ext/filters/client_channel/subchannel.cc | 103 +++----- 4 files changed, 166 insertions(+), 230 deletions(-) diff --git a/src/core/ext/filters/client_channel/client_channel.cc b/src/core/ext/filters/client_channel/client_channel.cc index 99f5fd722eb..fade01fc118 100644 --- a/src/core/ext/filters/client_channel/client_channel.cc +++ b/src/core/ext/filters/client_channel/client_channel.cc @@ -149,6 +149,9 @@ class ChannelData { RefCountedPtr service_config() const { return service_config_; } + RefCountedPtr logical_thread() const { + return logical_thread_; + } RefCountedPtr GetConnectedSubchannelInDataPlane( SubchannelInterface* subchannel) const; @@ -159,11 +162,12 @@ class ChannelData { grpc_connectivity_state* state, grpc_closure* on_complete, grpc_closure* watcher_timer_init) { + auto* watcher = new ExternalConnectivityWatcher( + this, pollent, state, on_complete, watcher_timer_init); MutexLock lock(&external_watchers_mu_); // Will be deleted when the watch is complete. GPR_ASSERT(external_watchers_[on_complete] == nullptr); - external_watchers_[on_complete] = new ExternalConnectivityWatcher( - this, pollent, state, on_complete, watcher_timer_init); + external_watchers_[on_complete] = watcher; } void RemoveExternalConnectivityWatcher(grpc_closure* on_complete, @@ -1137,16 +1141,8 @@ ChannelData::ExternalConnectivityWatcher::ExternalConnectivityWatcher( grpc_polling_entity_add_to_pollset_set(&pollent_, chand_->interested_parties_); GRPC_CHANNEL_STACK_REF(chand_->owning_stack_, "ExternalConnectivityWatcher"); - ExecCtx::Run( - DEBUG_LOCATION, - GRPC_CLOSURE_CREATE( - [](void* arg, grpc_error* /*error*/) { - auto* self = static_cast(arg); - self->chand_->logical_thread_->Run( - [self]() { self->AddWatcherLocked(); }, DEBUG_LOCATION); - }, - this, nullptr), - GRPC_ERROR_NONE); + chand_->logical_thread_->Run([this]() { AddWatcherLocked(); }, + DEBUG_LOCATION); } ChannelData::ExternalConnectivityWatcher::~ExternalConnectivityWatcher() { @@ -1928,16 +1924,7 @@ grpc_connectivity_state ChannelData::CheckConnectivityState( grpc_connectivity_state out = state_tracker_.state(); if (out == GRPC_CHANNEL_IDLE && try_to_connect) { GRPC_CHANNEL_STACK_REF(owning_stack_, "TryToConnect"); - ExecCtx::Run(DEBUG_LOCATION, - GRPC_CLOSURE_CREATE( - [](void* arg, grpc_error* /*error*/) { - auto* chand = static_cast(arg); - chand->logical_thread_->Run( - [chand]() { chand->TryToConnectLocked(); }, - DEBUG_LOCATION); - }, - this, nullptr), - GRPC_ERROR_NONE); + logical_thread_->Run([this]() { TryToConnectLocked(); }, DEBUG_LOCATION); } return out; } @@ -3850,7 +3837,19 @@ bool CallData::PickSubchannelLocked(grpc_call_element* elem, // The incoming call will make the channel exit IDLE. if (chand->picker() == nullptr) { // Bounce into the control plane logical thread to exit IDLE. - chand->CheckConnectivityState(/*try_to_connect=*/true); + ExecCtx::Run( + DEBUG_LOCATION, + GRPC_CLOSURE_CREATE( + [](void* arg, grpc_error* /*error*/) { + auto* chand = static_cast(arg); + chand->logical_thread()->Run( + [chand]() { + chand->CheckConnectivityState(/*try_to_connect=*/true); + }, + DEBUG_LOCATION); + }, + chand, nullptr), + GRPC_ERROR_NONE); // Queue the pick, so that it will be attempted once the channel // becomes connected. AddCallToQueuedPicksLocked(elem); diff --git a/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc b/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc index a76ca57cdb5..05673b2e7a9 100644 --- a/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +++ b/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc @@ -177,11 +177,11 @@ class GrpcLb : public LoadBalancingPolicy { static void OnBalancerMessageReceived(void* arg, grpc_error* error); static void OnBalancerStatusReceived(void* arg, grpc_error* error); - static void MaybeSendClientLoadReportLocked(void* arg, grpc_error* error); - static void ClientLoadReportDoneLocked(void* arg, grpc_error* error); - static void OnInitialRequestSentLocked(void* arg, grpc_error* error); - static void OnBalancerMessageReceivedLocked(void* arg, grpc_error* error); - static void OnBalancerStatusReceivedLocked(void* arg, grpc_error* error); + void MaybeSendClientLoadReportLocked(grpc_error* error); + void ClientLoadReportDoneLocked(grpc_error* error); + void OnInitialRequestSentLocked(); + void OnBalancerMessageReceivedLocked(); + void OnBalancerStatusReceivedLocked(grpc_error* error); // The owning LB policy. RefCountedPtr grpclb_policy_; @@ -901,30 +901,27 @@ void GrpcLb::BalancerCallState::ScheduleNextClientLoadReportLocked() { void GrpcLb::BalancerCallState::MaybeSendClientLoadReport(void* arg, grpc_error* error) { BalancerCallState* lb_calld = static_cast(arg); + GRPC_ERROR_REF(error); // ref owned by lambda lb_calld->grpclb_policy()->logical_thread()->Run( - Closure::ToFunction( - GRPC_CLOSURE_INIT(&lb_calld->client_load_report_closure_, - MaybeSendClientLoadReportLocked, lb_calld, nullptr), - GRPC_ERROR_REF(error)), + [lb_calld, error]() { lb_calld->MaybeSendClientLoadReportLocked(error); }, DEBUG_LOCATION); } void GrpcLb::BalancerCallState::MaybeSendClientLoadReportLocked( - void* arg, grpc_error* error) { - BalancerCallState* lb_calld = static_cast(arg); - GrpcLb* grpclb_policy = lb_calld->grpclb_policy(); - lb_calld->client_load_report_timer_callback_pending_ = false; - if (error != GRPC_ERROR_NONE || lb_calld != grpclb_policy->lb_calld_.get()) { - lb_calld->Unref(DEBUG_LOCATION, "client_load_report"); + grpc_error* error) { + client_load_report_timer_callback_pending_ = false; + if (error != GRPC_ERROR_NONE || this != grpclb_policy()->lb_calld_.get()) { + Unref(DEBUG_LOCATION, "client_load_report"); + GRPC_ERROR_UNREF(error); return; } // If we've already sent the initial request, then we can go ahead and send // the load report. Otherwise, we need to wait until the initial request has // been sent to send this (see OnInitialRequestSentLocked()). - if (lb_calld->send_message_payload_ == nullptr) { - lb_calld->SendClientLoadReportLocked(); + if (send_message_payload_ == nullptr) { + SendClientLoadReportLocked(); } else { - lb_calld->client_load_report_is_due_ = true; + client_load_report_is_due_ = true; } } @@ -983,116 +980,98 @@ void GrpcLb::BalancerCallState::SendClientLoadReportLocked() { void GrpcLb::BalancerCallState::ClientLoadReportDone(void* arg, grpc_error* error) { BalancerCallState* lb_calld = static_cast(arg); + GRPC_ERROR_REF(error); // ref owned by lambda lb_calld->grpclb_policy()->logical_thread()->Run( - Closure::ToFunction( - GRPC_CLOSURE_INIT(&lb_calld->client_load_report_closure_, - ClientLoadReportDoneLocked, lb_calld, nullptr), - GRPC_ERROR_REF(error)), + [lb_calld, error]() { lb_calld->ClientLoadReportDoneLocked(error); }, DEBUG_LOCATION); } -void GrpcLb::BalancerCallState::ClientLoadReportDoneLocked(void* arg, - grpc_error* error) { - BalancerCallState* lb_calld = static_cast(arg); - GrpcLb* grpclb_policy = lb_calld->grpclb_policy(); - grpc_byte_buffer_destroy(lb_calld->send_message_payload_); - lb_calld->send_message_payload_ = nullptr; - if (error != GRPC_ERROR_NONE || lb_calld != grpclb_policy->lb_calld_.get()) { - lb_calld->Unref(DEBUG_LOCATION, "client_load_report"); +void GrpcLb::BalancerCallState::ClientLoadReportDoneLocked(grpc_error* error) { + grpc_byte_buffer_destroy(send_message_payload_); + send_message_payload_ = nullptr; + if (error != GRPC_ERROR_NONE || this != grpclb_policy()->lb_calld_.get()) { + Unref(DEBUG_LOCATION, "client_load_report"); + GRPC_ERROR_UNREF(error); return; } - lb_calld->ScheduleNextClientLoadReportLocked(); + ScheduleNextClientLoadReportLocked(); } void GrpcLb::BalancerCallState::OnInitialRequestSent(void* arg, - grpc_error* error) { + grpc_error* /*error*/) { BalancerCallState* lb_calld = static_cast(arg); lb_calld->grpclb_policy()->logical_thread()->Run( - Closure::ToFunction( - GRPC_CLOSURE_INIT(&lb_calld->lb_on_initial_request_sent_, - OnInitialRequestSentLocked, lb_calld, nullptr), - GRPC_ERROR_REF(error)), - DEBUG_LOCATION); + [lb_calld]() { lb_calld->OnInitialRequestSentLocked(); }, DEBUG_LOCATION); } -void GrpcLb::BalancerCallState::OnInitialRequestSentLocked( - void* arg, grpc_error* /*error*/) { - BalancerCallState* lb_calld = static_cast(arg); - grpc_byte_buffer_destroy(lb_calld->send_message_payload_); - lb_calld->send_message_payload_ = nullptr; +void GrpcLb::BalancerCallState::OnInitialRequestSentLocked() { + grpc_byte_buffer_destroy(send_message_payload_); + send_message_payload_ = nullptr; // If we attempted to send a client load report before the initial request was // sent (and this lb_calld is still in use), send the load report now. - if (lb_calld->client_load_report_is_due_ && - lb_calld == lb_calld->grpclb_policy()->lb_calld_.get()) { - lb_calld->SendClientLoadReportLocked(); - lb_calld->client_load_report_is_due_ = false; + if (client_load_report_is_due_ && this == grpclb_policy()->lb_calld_.get()) { + SendClientLoadReportLocked(); + client_load_report_is_due_ = false; } - lb_calld->Unref(DEBUG_LOCATION, "on_initial_request_sent"); + Unref(DEBUG_LOCATION, "on_initial_request_sent"); } -void GrpcLb::BalancerCallState::OnBalancerMessageReceived(void* arg, - grpc_error* error) { +void GrpcLb::BalancerCallState::OnBalancerMessageReceived( + void* arg, grpc_error* /*error*/) { BalancerCallState* lb_calld = static_cast(arg); lb_calld->grpclb_policy()->logical_thread()->Run( - Closure::ToFunction( - GRPC_CLOSURE_INIT(&lb_calld->lb_on_balancer_message_received_, - OnBalancerMessageReceivedLocked, lb_calld, nullptr), - GRPC_ERROR_REF(error)), + [lb_calld]() { lb_calld->OnBalancerMessageReceivedLocked(); }, DEBUG_LOCATION); } -void GrpcLb::BalancerCallState::OnBalancerMessageReceivedLocked( - void* arg, grpc_error* /*error*/) { - BalancerCallState* lb_calld = static_cast(arg); - GrpcLb* grpclb_policy = lb_calld->grpclb_policy(); +void GrpcLb::BalancerCallState::OnBalancerMessageReceivedLocked() { // Null payload means the LB call was cancelled. - if (lb_calld != grpclb_policy->lb_calld_.get() || - lb_calld->recv_message_payload_ == nullptr) { - lb_calld->Unref(DEBUG_LOCATION, "on_message_received"); + if (this != grpclb_policy()->lb_calld_.get() || + recv_message_payload_ == nullptr) { + Unref(DEBUG_LOCATION, "on_message_received"); return; } grpc_byte_buffer_reader bbr; - grpc_byte_buffer_reader_init(&bbr, lb_calld->recv_message_payload_); + grpc_byte_buffer_reader_init(&bbr, recv_message_payload_); grpc_slice response_slice = grpc_byte_buffer_reader_readall(&bbr); grpc_byte_buffer_reader_destroy(&bbr); - grpc_byte_buffer_destroy(lb_calld->recv_message_payload_); - lb_calld->recv_message_payload_ = nullptr; + grpc_byte_buffer_destroy(recv_message_payload_); + recv_message_payload_ = nullptr; GrpcLbResponse response; upb::Arena arena; if (!GrpcLbResponseParse(response_slice, arena.ptr(), &response) || - (response.type == response.INITIAL && lb_calld->seen_initial_response_)) { + (response.type == response.INITIAL && seen_initial_response_)) { char* response_slice_str = grpc_dump_slice(response_slice, GPR_DUMP_ASCII | GPR_DUMP_HEX); gpr_log(GPR_ERROR, "[grpclb %p] lb_calld=%p: Invalid LB response received: '%s'. " "Ignoring.", - grpclb_policy, lb_calld, response_slice_str); + grpclb_policy(), this, response_slice_str); gpr_free(response_slice_str); } else { switch (response.type) { case response.INITIAL: { if (response.client_stats_report_interval != 0) { - lb_calld->client_stats_report_interval_ = + client_stats_report_interval_ = GPR_MAX(GPR_MS_PER_SEC, response.client_stats_report_interval); if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_glb_trace)) { gpr_log(GPR_INFO, "[grpclb %p] lb_calld=%p: Received initial LB response " "message; client load reporting interval = %" PRId64 " milliseconds", - grpclb_policy, lb_calld, - lb_calld->client_stats_report_interval_); + grpclb_policy(), this, client_stats_report_interval_); } } else if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_glb_trace)) { gpr_log(GPR_INFO, "[grpclb %p] lb_calld=%p: Received initial LB response " "message; client load reporting NOT enabled", - grpclb_policy, lb_calld); + grpclb_policy(), this); } - lb_calld->seen_initial_response_ = true; + seen_initial_response_ = true; break; } case response.SERVERLIST: { - GPR_ASSERT(lb_calld->lb_call_ != nullptr); + GPR_ASSERT(lb_call_ != nullptr); auto serverlist_wrapper = MakeRefCounted(std::move(response.serverlist)); if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_glb_trace)) { @@ -1101,28 +1080,27 @@ void GrpcLb::BalancerCallState::OnBalancerMessageReceivedLocked( gpr_log(GPR_INFO, "[grpclb %p] lb_calld=%p: Serverlist with %" PRIuPTR " servers received:\n%s", - grpclb_policy, lb_calld, + grpclb_policy(), this, serverlist_wrapper->serverlist().size(), serverlist_text.get()); } - lb_calld->seen_serverlist_ = true; + seen_serverlist_ = true; // Start sending client load report only after we start using the // serverlist returned from the current LB call. - if (lb_calld->client_stats_report_interval_ > 0 && - lb_calld->client_stats_ == nullptr) { - lb_calld->client_stats_ = MakeRefCounted(); + if (client_stats_report_interval_ > 0 && client_stats_ == nullptr) { + client_stats_ = MakeRefCounted(); // Ref held by callback. - lb_calld->Ref(DEBUG_LOCATION, "client_load_report").release(); - lb_calld->ScheduleNextClientLoadReportLocked(); + Ref(DEBUG_LOCATION, "client_load_report").release(); + ScheduleNextClientLoadReportLocked(); } // Check if the serverlist differs from the previous one. - if (grpclb_policy->serverlist_ != nullptr && - *grpclb_policy->serverlist_ == *serverlist_wrapper) { + if (grpclb_policy()->serverlist_ != nullptr && + *grpclb_policy()->serverlist_ == *serverlist_wrapper) { if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_glb_trace)) { gpr_log(GPR_INFO, "[grpclb %p] lb_calld=%p: Incoming server list identical " "to current, ignoring.", - grpclb_policy, lb_calld); + grpclb_policy(), this); } } else { // New serverlist. // Dispose of the fallback. @@ -1144,132 +1122,127 @@ void GrpcLb::BalancerCallState::OnBalancerMessageReceivedLocked( // the grpclb implementation at this point, since we're deprecating // it in favor of the xds policy. We will implement this the // right way in the xds policy instead. - if (grpclb_policy->fallback_mode_) { + if (grpclb_policy()->fallback_mode_) { gpr_log(GPR_INFO, "[grpclb %p] Received response from balancer; exiting " "fallback mode", - grpclb_policy); - grpclb_policy->fallback_mode_ = false; + grpclb_policy()); + grpclb_policy()->fallback_mode_ = false; } - if (grpclb_policy->fallback_at_startup_checks_pending_) { - grpclb_policy->fallback_at_startup_checks_pending_ = false; - grpc_timer_cancel(&grpclb_policy->lb_fallback_timer_); - grpclb_policy->CancelBalancerChannelConnectivityWatchLocked(); + if (grpclb_policy()->fallback_at_startup_checks_pending_) { + grpclb_policy()->fallback_at_startup_checks_pending_ = false; + grpc_timer_cancel(&grpclb_policy()->lb_fallback_timer_); + grpclb_policy()->CancelBalancerChannelConnectivityWatchLocked(); } // Update the serverlist in the GrpcLb instance. This serverlist // instance will be destroyed either upon the next update or when the // GrpcLb instance is destroyed. - grpclb_policy->serverlist_ = std::move(serverlist_wrapper); - grpclb_policy->CreateOrUpdateChildPolicyLocked(); + grpclb_policy()->serverlist_ = std::move(serverlist_wrapper); + grpclb_policy()->CreateOrUpdateChildPolicyLocked(); } break; } case response.FALLBACK: { - if (!grpclb_policy->fallback_mode_) { + if (!grpclb_policy()->fallback_mode_) { gpr_log(GPR_INFO, "[grpclb %p] Entering fallback mode as requested by balancer", - grpclb_policy); - if (grpclb_policy->fallback_at_startup_checks_pending_) { - grpclb_policy->fallback_at_startup_checks_pending_ = false; - grpc_timer_cancel(&grpclb_policy->lb_fallback_timer_); - grpclb_policy->CancelBalancerChannelConnectivityWatchLocked(); + grpclb_policy()); + if (grpclb_policy()->fallback_at_startup_checks_pending_) { + grpclb_policy()->fallback_at_startup_checks_pending_ = false; + grpc_timer_cancel(&grpclb_policy()->lb_fallback_timer_); + grpclb_policy()->CancelBalancerChannelConnectivityWatchLocked(); } - grpclb_policy->fallback_mode_ = true; - grpclb_policy->CreateOrUpdateChildPolicyLocked(); + grpclb_policy()->fallback_mode_ = true; + grpclb_policy()->CreateOrUpdateChildPolicyLocked(); // Reset serverlist, so that if the balancer exits fallback // mode by sending the same serverlist we were previously // using, we don't incorrectly ignore it as a duplicate. - grpclb_policy->serverlist_.reset(); + grpclb_policy()->serverlist_.reset(); } break; } } } grpc_slice_unref_internal(response_slice); - if (!grpclb_policy->shutting_down_) { + if (!grpclb_policy()->shutting_down_) { // Keep listening for serverlist updates. grpc_op op; memset(&op, 0, sizeof(op)); op.op = GRPC_OP_RECV_MESSAGE; - op.data.recv_message.recv_message = &lb_calld->recv_message_payload_; + op.data.recv_message.recv_message = &recv_message_payload_; op.flags = 0; op.reserved = nullptr; // Reuse the "OnBalancerMessageReceivedLocked" ref taken in StartQuery(). - GRPC_CLOSURE_INIT(&lb_calld->lb_on_balancer_message_received_, + GRPC_CLOSURE_INIT(&lb_on_balancer_message_received_, GrpcLb::BalancerCallState::OnBalancerMessageReceived, - lb_calld, grpc_schedule_on_exec_ctx); + this, grpc_schedule_on_exec_ctx); const grpc_call_error call_error = grpc_call_start_batch_and_execute( - lb_calld->lb_call_, &op, 1, - &lb_calld->lb_on_balancer_message_received_); + lb_call_, &op, 1, &lb_on_balancer_message_received_); GPR_ASSERT(GRPC_CALL_OK == call_error); } else { - lb_calld->Unref(DEBUG_LOCATION, "on_message_received+grpclb_shutdown"); + Unref(DEBUG_LOCATION, "on_message_received+grpclb_shutdown"); } } void GrpcLb::BalancerCallState::OnBalancerStatusReceived(void* arg, grpc_error* error) { BalancerCallState* lb_calld = static_cast(arg); + GRPC_ERROR_REF(error); // owned by lambda lb_calld->grpclb_policy()->logical_thread()->Run( - Closure::ToFunction( - GRPC_CLOSURE_INIT(&lb_calld->lb_on_balancer_status_received_, - OnBalancerStatusReceivedLocked, lb_calld, nullptr), - GRPC_ERROR_REF(error)), + [lb_calld, error]() { lb_calld->OnBalancerStatusReceivedLocked(error); }, DEBUG_LOCATION); } void GrpcLb::BalancerCallState::OnBalancerStatusReceivedLocked( - void* arg, grpc_error* error) { - BalancerCallState* lb_calld = static_cast(arg); - GrpcLb* grpclb_policy = lb_calld->grpclb_policy(); - GPR_ASSERT(lb_calld->lb_call_ != nullptr); + grpc_error* error) { + GPR_ASSERT(lb_call_ != nullptr); if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_glb_trace)) { - char* status_details = - grpc_slice_to_c_string(lb_calld->lb_call_status_details_); + char* status_details = grpc_slice_to_c_string(lb_call_status_details_); gpr_log(GPR_INFO, "[grpclb %p] lb_calld=%p: Status from LB server received. " "Status = %d, details = '%s', (lb_call: %p), error '%s'", - grpclb_policy, lb_calld, lb_calld->lb_call_status_, status_details, - lb_calld->lb_call_, grpc_error_string(error)); + grpclb_policy(), this, lb_call_status_, status_details, lb_call_, + grpc_error_string(error)); gpr_free(status_details); } + GRPC_ERROR_UNREF(error); // If this lb_calld is still in use, this call ended because of a failure so // we want to retry connecting. Otherwise, we have deliberately ended this // call and no further action is required. - if (lb_calld == grpclb_policy->lb_calld_.get()) { + if (this == grpclb_policy()->lb_calld_.get()) { // If the fallback-at-startup checks are pending, go into fallback mode // immediately. This short-circuits the timeout for the fallback-at-startup // case. - if (grpclb_policy->fallback_at_startup_checks_pending_) { - GPR_ASSERT(!lb_calld->seen_serverlist_); + if (grpclb_policy()->fallback_at_startup_checks_pending_) { + GPR_ASSERT(!seen_serverlist_); gpr_log(GPR_INFO, "[grpclb %p] Balancer call finished without receiving " "serverlist; entering fallback mode", - grpclb_policy); - grpclb_policy->fallback_at_startup_checks_pending_ = false; - grpc_timer_cancel(&grpclb_policy->lb_fallback_timer_); - grpclb_policy->CancelBalancerChannelConnectivityWatchLocked(); - grpclb_policy->fallback_mode_ = true; - grpclb_policy->CreateOrUpdateChildPolicyLocked(); + grpclb_policy()); + grpclb_policy()->fallback_at_startup_checks_pending_ = false; + grpc_timer_cancel(&grpclb_policy()->lb_fallback_timer_); + grpclb_policy()->CancelBalancerChannelConnectivityWatchLocked(); + grpclb_policy()->fallback_mode_ = true; + grpclb_policy()->CreateOrUpdateChildPolicyLocked(); } else { // This handles the fallback-after-startup case. - grpclb_policy->MaybeEnterFallbackModeAfterStartup(); + grpclb_policy()->MaybeEnterFallbackModeAfterStartup(); } - grpclb_policy->lb_calld_.reset(); - GPR_ASSERT(!grpclb_policy->shutting_down_); - grpclb_policy->channel_control_helper()->RequestReresolution(); - if (lb_calld->seen_initial_response_) { + grpclb_policy()->lb_calld_.reset(); + GPR_ASSERT(!grpclb_policy()->shutting_down_); + grpclb_policy()->channel_control_helper()->RequestReresolution(); + if (seen_initial_response_) { // If we lose connection to the LB server, reset the backoff and restart // the LB call immediately. - grpclb_policy->lb_call_backoff_.Reset(); - grpclb_policy->StartBalancerCallLocked(); + grpclb_policy()->lb_call_backoff_.Reset(); + grpclb_policy()->StartBalancerCallLocked(); } else { // If this LB call fails establishing any connection to the LB server, // retry later. - grpclb_policy->StartBalancerCallRetryTimerLocked(); + grpclb_policy()->StartBalancerCallRetryTimerLocked(); } } - lb_calld->Unref(DEBUG_LOCATION, "lb_call_ended"); + Unref(DEBUG_LOCATION, "lb_call_ended"); } // diff --git a/src/core/ext/filters/client_channel/resolver.h b/src/core/ext/filters/client_channel/resolver.h index 8a830074489..470901e4303 100644 --- a/src/core/ext/filters/client_channel/resolver.h +++ b/src/core/ext/filters/client_channel/resolver.h @@ -123,9 +123,6 @@ class Resolver : public InternallyRefCounted { protected: /// Does NOT take ownership of the reference to \a logical_thread. - // TODO(roth): Once we have a C++-like interface for logical threads, this - // API should change to take a RefCountedPtr<>, so that we always take - // ownership of a new ref. explicit Resolver(RefCountedPtr logical_thread, std::unique_ptr result_handler); diff --git a/src/core/ext/filters/client_channel/subchannel.cc b/src/core/ext/filters/client_channel/subchannel.cc index cd0f0a9164a..2fad1d37cd9 100644 --- a/src/core/ext/filters/client_channel/subchannel.cc +++ b/src/core/ext/filters/client_channel/subchannel.cc @@ -363,12 +363,35 @@ class Subchannel::ConnectedSubchannelStateWatcher }; namespace { -struct OnConnectivityStateChangeClosureArg { - Subchannel::ConnectivityStateWatcherInterface* watcher = nullptr; - ConnectedSubchannel* subchannel = nullptr; - grpc_connectivity_state state; +// Deletes itself when done +class AsyncWatcherNotifier { + public: + AsyncWatcherNotifier( + RefCountedPtr watcher, + RefCountedPtr connected_subchannel, + grpc_connectivity_state state) + : watcher_(std::move(watcher)), + connected_subchannel_(std::move(connected_subchannel)), + state_(state) { + ExecCtx::Run(DEBUG_LOCATION, + GRPC_CLOSURE_INIT( + &closure_, + [](void* arg, grpc_error* /*error*/) { + auto* self = static_cast(arg); + self->watcher_->OnConnectivityStateChange( + self->state_, + std::move(self->connected_subchannel_)); + delete self; + }, + this, nullptr), + GRPC_ERROR_NONE); + } + RefCountedPtr watcher_; + RefCountedPtr connected_subchannel_; + grpc_connectivity_state state_; + grpc_closure closure_; }; -}; // namespace +} // namespace // // Subchannel::ConnectivityStateWatcherList @@ -387,28 +410,11 @@ void Subchannel::ConnectivityStateWatcherList::RemoveWatcherLocked( void Subchannel::ConnectivityStateWatcherList::NotifyLocked( Subchannel* subchannel, grpc_connectivity_state state) { for (const auto& p : watchers_) { - auto* closure_arg = new OnConnectivityStateChangeClosureArg; + RefCountedPtr connected_subchannel; if (state == GRPC_CHANNEL_READY) { - closure_arg->subchannel = subchannel->connected_subchannel_->Ref() - .release(); // Ref owned by closure + connected_subchannel = subchannel->connected_subchannel_; } - closure_arg->watcher = p.second->Ref().release(); // Ref owned by closure. - closure_arg->state = state; - ExecCtx::Run( - DEBUG_LOCATION, - GRPC_CLOSURE_CREATE( - [](void* arg, grpc_error* /*error*/) { - auto* closure_arg = - static_cast(arg); - closure_arg->watcher->OnConnectivityStateChange( - closure_arg->state, - std::move(RefCountedPtr( - closure_arg->subchannel)) /* ref passed */); - closure_arg->watcher->Unref(); - delete closure_arg; - }, - closure_arg, nullptr), - GRPC_ERROR_NONE); + new AsyncWatcherNotifier(p.second, connected_subchannel, state); } } @@ -447,28 +453,11 @@ class Subchannel::HealthWatcherMap::HealthWatcher grpc_connectivity_state initial_state, RefCountedPtr watcher) { if (state_ != initial_state) { - auto* closure_arg = new OnConnectivityStateChangeClosureArg; + RefCountedPtr connected_subchannel; if (state_ == GRPC_CHANNEL_READY) { - closure_arg->subchannel = subchannel_->connected_subchannel_->Ref() - .release(); // Ref owned by closure + connected_subchannel = subchannel_->connected_subchannel_; } - closure_arg->watcher = watcher->Ref().release(); // Ref owned by closure. - closure_arg->state = state_; - ExecCtx::Run( - DEBUG_LOCATION, - GRPC_CLOSURE_CREATE( - [](void* arg, grpc_error* /*error*/) { - auto* closure_arg = - static_cast(arg); - closure_arg->watcher->OnConnectivityStateChange( - closure_arg->state, - std::move(RefCountedPtr( - closure_arg->subchannel)) /* ref passed */); - closure_arg->watcher->Unref(); - delete closure_arg; - }, - closure_arg, nullptr), - GRPC_ERROR_NONE); + new AsyncWatcherNotifier(watcher, connected_subchannel, state_); } watcher_list_.AddWatcherLocked(std::move(watcher)); } @@ -829,29 +818,7 @@ void Subchannel::WatchConnectivityState( } if (health_check_service_name == nullptr) { if (state_ != initial_state) { - auto* closure_arg = new OnConnectivityStateChangeClosureArg; - closure_arg->watcher = watcher->Ref().release(); // Ref owned by closure. - if (connected_subchannel_ != nullptr) { - closure_arg->subchannel = - connected_subchannel_->Ref().release(); // Ref owned by closure - } - closure_arg->state = state_; - ExecCtx::Run( - DEBUG_LOCATION, - GRPC_CLOSURE_CREATE( - [](void* arg, grpc_error* /*error*/) { - auto* closure_arg = - static_cast(arg); - closure_arg->watcher->OnConnectivityStateChange( - closure_arg->state, - std::move(RefCountedPtr( - closure_arg->subchannel)) /* ref passed */); - closure_arg->watcher->Unref(); - delete closure_arg; - }, - closure_arg, nullptr), - GRPC_ERROR_NONE); - watcher->OnConnectivityStateChange(state_, connected_subchannel_); + new AsyncWatcherNotifier(watcher, connected_subchannel_, state_); } watcher_list_.AddWatcherLocked(std::move(watcher)); } else { From ad3ca5b3909ad38f058298d6057f40a5a12da73a Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Tue, 14 Jan 2020 15:31:42 -0800 Subject: [PATCH 048/758] Replace Closure::ToFunction with lambda --- .../client_channel/lb_policy/grpclb/grpclb.cc | 99 ++++++++----------- 1 file changed, 43 insertions(+), 56 deletions(-) diff --git a/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc b/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc index 05673b2e7a9..bf2fdd914c9 100644 --- a/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +++ b/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc @@ -315,20 +315,19 @@ class GrpcLb : public LoadBalancingPolicy { const grpc_channel_args& args); static void OnBalancerChannelConnectivityChanged(void* arg, grpc_error* error); - static void OnBalancerChannelConnectivityChangedLocked(void* arg, - grpc_error* error); + void OnBalancerChannelConnectivityChangedLocked(); void CancelBalancerChannelConnectivityWatchLocked(); // Methods for dealing with fallback state. void MaybeEnterFallbackModeAfterStartup(); static void OnFallbackTimer(void* arg, grpc_error* error); - static void OnFallbackTimerLocked(void* arg, grpc_error* error); + void OnFallbackTimerLocked(grpc_error* error); // Methods for dealing with the balancer call. void StartBalancerCallLocked(); void StartBalancerCallRetryTimerLocked(); static void OnBalancerCallRetryTimer(void* arg, grpc_error* error); - static void OnBalancerCallRetryTimerLocked(void* arg, grpc_error* error); + void OnBalancerCallRetryTimerLocked(grpc_error* error); // Methods for dealing with the child policy. grpc_channel_args* CreateChildPolicyArgsLocked( @@ -1523,36 +1522,29 @@ void GrpcLb::ProcessAddressesAndChannelArgsLocked( } void GrpcLb::OnBalancerChannelConnectivityChanged(void* arg, - grpc_error* error) { + grpc_error* /*error*/) { GrpcLb* self = static_cast(arg); self->logical_thread()->Run( - Closure::ToFunction( - GRPC_CLOSURE_INIT(&self->lb_channel_on_connectivity_changed_, - &GrpcLb::OnBalancerChannelConnectivityChangedLocked, - self, nullptr), - GRPC_ERROR_REF(error)), + [self]() { self->OnBalancerChannelConnectivityChangedLocked(); }, DEBUG_LOCATION); } -void GrpcLb::OnBalancerChannelConnectivityChangedLocked(void* arg, - grpc_error* /*error*/) { - GrpcLb* self = static_cast(arg); - if (!self->shutting_down_ && self->fallback_at_startup_checks_pending_) { - if (self->lb_channel_connectivity_ != GRPC_CHANNEL_TRANSIENT_FAILURE) { +void GrpcLb::OnBalancerChannelConnectivityChangedLocked() { + if (!shutting_down_ && fallback_at_startup_checks_pending_) { + if (lb_channel_connectivity_ != GRPC_CHANNEL_TRANSIENT_FAILURE) { // Not in TRANSIENT_FAILURE. Renew connectivity watch. grpc_channel_element* client_channel_elem = grpc_channel_stack_last_element( - grpc_channel_get_channel_stack(self->lb_channel_)); + grpc_channel_get_channel_stack(lb_channel_)); GPR_ASSERT(client_channel_elem->filter == &grpc_client_channel_filter); - GRPC_CLOSURE_INIT(&self->lb_channel_on_connectivity_changed_, - &GrpcLb::OnBalancerChannelConnectivityChanged, self, + GRPC_CLOSURE_INIT(&lb_channel_on_connectivity_changed_, + &GrpcLb::OnBalancerChannelConnectivityChanged, this, grpc_schedule_on_exec_ctx); grpc_client_channel_watch_connectivity_state( client_channel_elem, - grpc_polling_entity_create_from_pollset_set( - self->interested_parties()), - &self->lb_channel_connectivity_, - &self->lb_channel_on_connectivity_changed_, nullptr); + grpc_polling_entity_create_from_pollset_set(interested_parties()), + &lb_channel_connectivity_, &lb_channel_on_connectivity_changed_, + nullptr); return; // Early out so we don't drop the ref below. } // In TRANSIENT_FAILURE. Cancel the fallback timer and go into @@ -1560,14 +1552,14 @@ void GrpcLb::OnBalancerChannelConnectivityChangedLocked(void* arg, gpr_log(GPR_INFO, "[grpclb %p] balancer channel in state TRANSIENT_FAILURE; " "entering fallback mode", - self); - self->fallback_at_startup_checks_pending_ = false; - grpc_timer_cancel(&self->lb_fallback_timer_); - self->fallback_mode_ = true; - self->CreateOrUpdateChildPolicyLocked(); + this); + fallback_at_startup_checks_pending_ = false; + grpc_timer_cancel(&lb_fallback_timer_); + fallback_mode_ = true; + CreateOrUpdateChildPolicyLocked(); } // Done watching connectivity state, so drop ref. - self->Unref(DEBUG_LOCATION, "watch_lb_channel_connectivity"); + Unref(DEBUG_LOCATION, "watch_lb_channel_connectivity"); } void GrpcLb::CancelBalancerChannelConnectivityWatchLocked() { @@ -1624,27 +1616,24 @@ void GrpcLb::StartBalancerCallRetryTimerLocked() { void GrpcLb::OnBalancerCallRetryTimer(void* arg, grpc_error* error) { GrpcLb* grpclb_policy = static_cast(arg); + GRPC_ERROR_REF(error); // ref owned by lambda grpclb_policy->logical_thread()->Run( - Closure::ToFunction( - GRPC_CLOSURE_INIT(&grpclb_policy->lb_on_call_retry_, - &GrpcLb::OnBalancerCallRetryTimerLocked, - grpclb_policy, nullptr), - GRPC_ERROR_REF(error)), + [grpclb_policy, error]() { + grpclb_policy->OnBalancerCallRetryTimerLocked(error); + }, DEBUG_LOCATION); } -void GrpcLb::OnBalancerCallRetryTimerLocked(void* arg, grpc_error* error) { - GrpcLb* grpclb_policy = static_cast(arg); - grpclb_policy->retry_timer_callback_pending_ = false; - if (!grpclb_policy->shutting_down_ && error == GRPC_ERROR_NONE && - grpclb_policy->lb_calld_ == nullptr) { +void GrpcLb::OnBalancerCallRetryTimerLocked(grpc_error* error) { + retry_timer_callback_pending_ = false; + if (!shutting_down_ && error == GRPC_ERROR_NONE && lb_calld_ == nullptr) { if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_glb_trace)) { - gpr_log(GPR_INFO, "[grpclb %p] Restarting call to LB server", - grpclb_policy); + gpr_log(GPR_INFO, "[grpclb %p] Restarting call to LB server", this); } - grpclb_policy->StartBalancerCallLocked(); + StartBalancerCallLocked(); } - grpclb_policy->Unref(DEBUG_LOCATION, "on_balancer_call_retry_timer"); + Unref(DEBUG_LOCATION, "on_balancer_call_retry_timer"); + GRPC_ERROR_UNREF(error); } // @@ -1671,30 +1660,28 @@ void GrpcLb::MaybeEnterFallbackModeAfterStartup() { void GrpcLb::OnFallbackTimer(void* arg, grpc_error* error) { GrpcLb* grpclb_policy = static_cast(arg); + GRPC_ERROR_REF(error); // ref owned by lambda grpclb_policy->logical_thread()->Run( - Closure::ToFunction(GRPC_CLOSURE_INIT(&grpclb_policy->lb_on_fallback_, - &GrpcLb::OnFallbackTimerLocked, - grpclb_policy, nullptr), - GRPC_ERROR_REF(error)), + [grpclb_policy, error]() { grpclb_policy->OnFallbackTimerLocked(error); }, DEBUG_LOCATION); } -void GrpcLb::OnFallbackTimerLocked(void* arg, grpc_error* error) { - GrpcLb* grpclb_policy = static_cast(arg); +void GrpcLb::OnFallbackTimerLocked(grpc_error* error) { // If we receive a serverlist after the timer fires but before this callback // actually runs, don't fall back. - if (grpclb_policy->fallback_at_startup_checks_pending_ && - !grpclb_policy->shutting_down_ && error == GRPC_ERROR_NONE) { + if (fallback_at_startup_checks_pending_ && !shutting_down_ && + error == GRPC_ERROR_NONE) { gpr_log(GPR_INFO, "[grpclb %p] No response from balancer after fallback timeout; " "entering fallback mode", - grpclb_policy); - grpclb_policy->fallback_at_startup_checks_pending_ = false; - grpclb_policy->CancelBalancerChannelConnectivityWatchLocked(); - grpclb_policy->fallback_mode_ = true; - grpclb_policy->CreateOrUpdateChildPolicyLocked(); + this); + fallback_at_startup_checks_pending_ = false; + CancelBalancerChannelConnectivityWatchLocked(); + fallback_mode_ = true; + CreateOrUpdateChildPolicyLocked(); } - grpclb_policy->Unref(DEBUG_LOCATION, "on_fallback_timer"); + Unref(DEBUG_LOCATION, "on_fallback_timer"); + GRPC_ERROR_UNREF(error); } // From b4353ba0830c8f4b4bd28ee50ae81f448542a12e Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Tue, 14 Jan 2020 15:52:10 -0800 Subject: [PATCH 049/758] Move closure initialization to constructors --- .../client_channel/lb_policy/grpclb/grpclb.cc | 36 +++++++++---------- 1 file changed, 17 insertions(+), 19 deletions(-) diff --git a/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc b/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc index bf2fdd914c9..06144d8cfd9 100644 --- a/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +++ b/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc @@ -762,6 +762,15 @@ GrpcLb::BalancerCallState::BalancerCallState( // the polling entities from client_channel. GPR_ASSERT(grpclb_policy()->server_name_ != nullptr); GPR_ASSERT(grpclb_policy()->server_name_[0] != '\0'); + // Closure Initialization + GRPC_CLOSURE_INIT(&lb_on_initial_request_sent_, OnInitialRequestSent, this, + grpc_schedule_on_exec_ctx); + GRPC_CLOSURE_INIT(&lb_on_balancer_message_received_, + OnBalancerMessageReceived, this, grpc_schedule_on_exec_ctx); + GRPC_CLOSURE_INIT(&lb_on_balancer_status_received_, OnBalancerStatusReceived, + this, grpc_schedule_on_exec_ctx); + GRPC_CLOSURE_INIT(&client_load_report_closure_, MaybeSendClientLoadReport, + this, grpc_schedule_on_exec_ctx); const grpc_millis deadline = grpclb_policy()->lb_call_timeout_ms_ == 0 ? GRPC_MILLIS_INF_FUTURE @@ -838,8 +847,6 @@ void GrpcLb::BalancerCallState::StartQuery() { // with the callback. auto self = Ref(DEBUG_LOCATION, "on_initial_request_sent"); self.release(); - GRPC_CLOSURE_INIT(&lb_on_initial_request_sent_, OnInitialRequestSent, this, - grpc_schedule_on_exec_ctx); call_error = grpc_call_start_batch_and_execute( lb_call_, ops, (size_t)(op - ops), &lb_on_initial_request_sent_); GPR_ASSERT(GRPC_CALL_OK == call_error); @@ -862,8 +869,6 @@ void GrpcLb::BalancerCallState::StartQuery() { // with the callback. self = Ref(DEBUG_LOCATION, "on_message_received"); self.release(); - GRPC_CLOSURE_INIT(&lb_on_balancer_message_received_, - OnBalancerMessageReceived, this, grpc_schedule_on_exec_ctx); call_error = grpc_call_start_batch_and_execute( lb_call_, ops, (size_t)(op - ops), &lb_on_balancer_message_received_); GPR_ASSERT(GRPC_CALL_OK == call_error); @@ -880,8 +885,6 @@ void GrpcLb::BalancerCallState::StartQuery() { // This callback signals the end of the LB call, so it relies on the initial // ref instead of a new ref. When it's invoked, it's the initial ref that is // unreffed. - GRPC_CLOSURE_INIT(&lb_on_balancer_status_received_, OnBalancerStatusReceived, - this, grpc_schedule_on_exec_ctx); call_error = grpc_call_start_batch_and_execute( lb_call_, ops, (size_t)(op - ops), &lb_on_balancer_status_received_); GPR_ASSERT(GRPC_CALL_OK == call_error); @@ -1172,9 +1175,6 @@ void GrpcLb::BalancerCallState::OnBalancerMessageReceivedLocked() { op.flags = 0; op.reserved = nullptr; // Reuse the "OnBalancerMessageReceivedLocked" ref taken in StartQuery(). - GRPC_CLOSURE_INIT(&lb_on_balancer_message_received_, - GrpcLb::BalancerCallState::OnBalancerMessageReceived, - this, grpc_schedule_on_exec_ctx); const grpc_call_error call_error = grpc_call_start_batch_and_execute( lb_call_, &op, 1, &lb_on_balancer_message_received_); GPR_ASSERT(GRPC_CALL_OK == call_error); @@ -1352,6 +1352,14 @@ GrpcLb::GrpcLb(Args args) .set_jitter(GRPC_GRPCLB_RECONNECT_JITTER) .set_max_backoff(GRPC_GRPCLB_RECONNECT_MAX_BACKOFF_SECONDS * 1000)) { + // Closure Initialization + GRPC_CLOSURE_INIT(&lb_on_fallback_, &GrpcLb::OnFallbackTimer, this, + grpc_schedule_on_exec_ctx); + GRPC_CLOSURE_INIT(&lb_channel_on_connectivity_changed_, + &GrpcLb::OnBalancerChannelConnectivityChanged, this, + grpc_schedule_on_exec_ctx); + GRPC_CLOSURE_INIT(&lb_on_call_retry_, &GrpcLb::OnBalancerCallRetryTimer, this, + grpc_schedule_on_exec_ctx); // Record server name. const grpc_arg* arg = grpc_channel_args_find(args.args, GRPC_ARG_SERVER_URI); const char* server_uri = grpc_channel_arg_get_string(arg); @@ -1444,8 +1452,6 @@ void GrpcLb::UpdateLocked(UpdateArgs args) { // Start timer. grpc_millis deadline = ExecCtx::Get()->Now() + fallback_at_startup_timeout_; Ref(DEBUG_LOCATION, "on_fallback_timer").release(); // Ref for callback - GRPC_CLOSURE_INIT(&lb_on_fallback_, &GrpcLb::OnFallbackTimer, this, - grpc_schedule_on_exec_ctx); grpc_timer_init(&lb_fallback_timer_, deadline, &lb_on_fallback_); // Start watching the channel's connectivity state. If the channel // goes into state TRANSIENT_FAILURE before the timer fires, we go into @@ -1455,9 +1461,6 @@ void GrpcLb::UpdateLocked(UpdateArgs args) { GPR_ASSERT(client_channel_elem->filter == &grpc_client_channel_filter); // Ref held by callback. Ref(DEBUG_LOCATION, "watch_lb_channel_connectivity").release(); - GRPC_CLOSURE_INIT(&lb_channel_on_connectivity_changed_, - &GrpcLb::OnBalancerChannelConnectivityChanged, this, - grpc_schedule_on_exec_ctx); grpc_client_channel_watch_connectivity_state( client_channel_elem, grpc_polling_entity_create_from_pollset_set(interested_parties()), @@ -1537,9 +1540,6 @@ void GrpcLb::OnBalancerChannelConnectivityChangedLocked() { grpc_channel_stack_last_element( grpc_channel_get_channel_stack(lb_channel_)); GPR_ASSERT(client_channel_elem->filter == &grpc_client_channel_filter); - GRPC_CLOSURE_INIT(&lb_channel_on_connectivity_changed_, - &GrpcLb::OnBalancerChannelConnectivityChanged, this, - grpc_schedule_on_exec_ctx); grpc_client_channel_watch_connectivity_state( client_channel_elem, grpc_polling_entity_create_from_pollset_set(interested_parties()), @@ -1608,8 +1608,6 @@ void GrpcLb::StartBalancerCallRetryTimerLocked() { // with the callback. auto self = Ref(DEBUG_LOCATION, "on_balancer_call_retry_timer"); self.release(); - GRPC_CLOSURE_INIT(&lb_on_call_retry_, &GrpcLb::OnBalancerCallRetryTimer, this, - grpc_schedule_on_exec_ctx); retry_timer_callback_pending_ = true; grpc_timer_init(&lb_call_retry_timer_, next_try, &lb_on_call_retry_); } From 4c47f6543c2fdcd7383c8b1d97e84614e575cb76 Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Tue, 14 Jan 2020 17:31:14 -0800 Subject: [PATCH 050/758] Xds Reviewer comments --- .../client_channel/lb_policy/xds/xds.cc | 110 ++++++++---------- 1 file changed, 51 insertions(+), 59 deletions(-) diff --git a/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc b/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc index 94c2d93cff6..b39ca325a0c 100644 --- a/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc +++ b/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc @@ -261,7 +261,7 @@ class XdsLb : public LoadBalancingPolicy { const grpc_channel_args* args); static void OnDelayedRemovalTimer(void* arg, grpc_error* error); - static void OnDelayedRemovalTimerLocked(void* arg, grpc_error* error); + void OnDelayedRemovalTimerLocked(grpc_error* error); XdsLb* xds_policy() const { return locality_map_->xds_policy(); } @@ -312,8 +312,8 @@ class XdsLb : public LoadBalancingPolicy { void UpdateConnectivityStateLocked(); static void OnDelayedRemovalTimer(void* arg, grpc_error* error); static void OnFailoverTimer(void* arg, grpc_error* error); - static void OnDelayedRemovalTimerLocked(void* arg, grpc_error* error); - static void OnFailoverTimerLocked(void* arg, grpc_error* error); + void OnDelayedRemovalTimerLocked(grpc_error* error); + void OnFailoverTimerLocked(grpc_error* error); PriorityList* priority_list() const { return &xds_policy_->priority_list_; @@ -386,7 +386,7 @@ class XdsLb : public LoadBalancingPolicy { // Methods for dealing with fallback state. void MaybeCancelFallbackAtStartupChecks(); static void OnFallbackTimer(void* arg, grpc_error* error); - static void OnFallbackTimerLocked(void* arg, grpc_error* error); + void OnFallbackTimerLocked(grpc_error* error); void UpdateFallbackPolicyLocked(); OrphanablePtr CreateFallbackPolicyLocked( const char* name, const grpc_channel_args* args); @@ -699,6 +699,9 @@ XdsLb::XdsLb(Args args) gpr_log(GPR_INFO, "[xdslb %p] Using xds client %p from channel", this, xds_client_from_channel_.get()); } + // Closure Initialization + GRPC_CLOSURE_INIT(&lb_on_fallback_, &XdsLb::OnFallbackTimer, this, + grpc_schedule_on_exec_ctx); // Record server name. const grpc_arg* arg = grpc_channel_args_find(args.args, GRPC_ARG_SERVER_URI); const char* server_uri = grpc_channel_arg_get_string(arg); @@ -812,8 +815,6 @@ void XdsLb::UpdateLocked(UpdateArgs args) { // Start fallback-at-startup checks. grpc_millis deadline = ExecCtx::Get()->Now() + lb_fallback_timeout_ms_; Ref(DEBUG_LOCATION, "on_fallback_timer").release(); // Held by closure - GRPC_CLOSURE_INIT(&lb_on_fallback_, &XdsLb::OnFallbackTimer, this, - grpc_schedule_on_exec_ctx); fallback_at_startup_checks_pending_ = true; grpc_timer_init(&lb_fallback_timer_, deadline, &lb_on_fallback_); } @@ -870,28 +871,26 @@ void XdsLb::MaybeCancelFallbackAtStartupChecks() { void XdsLb::OnFallbackTimer(void* arg, grpc_error* error) { XdsLb* xdslb_policy = static_cast(arg); + GRPC_ERROR_REF(error); // ref owned by lambda xdslb_policy->logical_thread()->Run( - Closure::ToFunction(GRPC_CLOSURE_INIT(&xdslb_policy->lb_on_fallback_, - &XdsLb::OnFallbackTimerLocked, - xdslb_policy, nullptr), - GRPC_ERROR_REF(error)), + [xdslb_policy, error]() { xdslb_policy->OnFallbackTimerLocked(error); }, DEBUG_LOCATION); } -void XdsLb::OnFallbackTimerLocked(void* arg, grpc_error* error) { - XdsLb* xdslb_policy = static_cast(arg); +void XdsLb::OnFallbackTimerLocked(grpc_error* error) { // If some fallback-at-startup check is done after the timer fires but before // this callback actually runs, don't fall back. - if (xdslb_policy->fallback_at_startup_checks_pending_ && - !xdslb_policy->shutting_down_ && error == GRPC_ERROR_NONE) { + if (fallback_at_startup_checks_pending_ && !shutting_down_ && + error == GRPC_ERROR_NONE) { gpr_log(GPR_INFO, "[xdslb %p] Child policy not ready after fallback timeout; " "entering fallback mode", - xdslb_policy); - xdslb_policy->fallback_at_startup_checks_pending_ = false; - xdslb_policy->UpdateFallbackPolicyLocked(); + this); + fallback_at_startup_checks_pending_ = false; + UpdateFallbackPolicyLocked(); } - xdslb_policy->Unref(DEBUG_LOCATION, "on_fallback_timer"); + Unref(DEBUG_LOCATION, "on_fallback_timer"); + GRPC_ERROR_UNREF(error); } void XdsLb::UpdateFallbackPolicyLocked() { @@ -1158,7 +1157,9 @@ XdsLb::PriorityList::LocalityMap::LocalityMap(RefCountedPtr xds_policy, gpr_log(GPR_INFO, "[xdslb %p] Creating priority %" PRIu32, xds_policy_.get(), priority_); } - + // Closure Initialization + GRPC_CLOSURE_INIT(&on_delayed_removal_timer_, OnDelayedRemovalTimer, this, + grpc_schedule_on_exec_ctx); GRPC_CLOSURE_INIT(&on_failover_timer_, OnFailoverTimer, this, grpc_schedule_on_exec_ctx); // Start the failover timer. @@ -1276,8 +1277,6 @@ void XdsLb::PriorityList::LocalityMap::DeactivateLocked() { xds_policy(), priority_, xds_policy()->locality_retention_interval_ms_); } - GRPC_CLOSURE_INIT(&on_delayed_removal_timer_, OnDelayedRemovalTimer, this, - grpc_schedule_on_exec_ctx); grpc_timer_init( &delayed_removal_timer_, ExecCtx::Get()->Now() + xds_policy()->locality_retention_interval_ms_, @@ -1409,22 +1408,18 @@ void XdsLb::PriorityList::LocalityMap::UpdateConnectivityStateLocked() { void XdsLb::PriorityList::LocalityMap::OnDelayedRemovalTimer( void* arg, grpc_error* error) { LocalityMap* self = static_cast(arg); + GRPC_ERROR_REF(error); // ref owned by lambda self->xds_policy_->logical_thread()->Run( - Closure::ToFunction( - GRPC_CLOSURE_INIT(&self->on_delayed_removal_timer_, - OnDelayedRemovalTimerLocked, self, nullptr), - GRPC_ERROR_REF(error)), + [self, error]() { self->OnDelayedRemovalTimerLocked(error); }, DEBUG_LOCATION); } void XdsLb::PriorityList::LocalityMap::OnDelayedRemovalTimerLocked( - void* arg, grpc_error* error) { - LocalityMap* self = static_cast(arg); - self->delayed_removal_timer_callback_pending_ = false; - if (error == GRPC_ERROR_NONE && !self->xds_policy_->shutting_down_) { - auto* priority_list = self->priority_list(); - const bool keep = self->priority_list_update().Contains(self->priority_) && - self->priority_ <= priority_list->current_priority(); + grpc_error* error) { + delayed_removal_timer_callback_pending_ = false; + if (error == GRPC_ERROR_NONE && !xds_policy_->shutting_down_) { + const bool keep = priority_list_update().Contains(priority_) && + priority_ <= priority_list()->current_priority(); if (!keep) { // This check is to make sure we always delete the locality maps from // the lowest priority even if the closures of the back-to-back timers @@ -1433,39 +1428,37 @@ void XdsLb::PriorityList::LocalityMap::OnDelayedRemovalTimerLocked( // deactivated locality maps when out-of-order closures are run. // TODO(juanlishen): Check the timer implementation to see if this // defense is necessary. - if (self->priority_ == priority_list->LowestPriority()) { - priority_list->priorities_.pop_back(); + if (priority_ == priority_list()->LowestPriority()) { + priority_list()->priorities_.pop_back(); } else { gpr_log(GPR_ERROR, "[xdslb %p] Priority %" PRIu32 " is not the lowest priority (highest numeric value) but is " "attempted to be deleted.", - self->xds_policy(), self->priority_); + xds_policy(), priority_); } } } - self->Unref(DEBUG_LOCATION, "LocalityMap+timer"); + Unref(DEBUG_LOCATION, "LocalityMap+timer"); + GRPC_ERROR_UNREF(error); } void XdsLb::PriorityList::LocalityMap::OnFailoverTimer(void* arg, grpc_error* error) { LocalityMap* self = static_cast(arg); + GRPC_ERROR_REF(error); // ref owned by lambda self->xds_policy_->logical_thread()->Run( - Closure::ToFunction( - GRPC_CLOSURE_INIT(&self->on_failover_timer_, OnFailoverTimerLocked, - self, nullptr), - GRPC_ERROR_REF(error)), - DEBUG_LOCATION); + [self, error]() { self->OnFailoverTimerLocked(error); }, DEBUG_LOCATION); } void XdsLb::PriorityList::LocalityMap::OnFailoverTimerLocked( - void* arg, grpc_error* error) { - LocalityMap* self = static_cast(arg); - self->failover_timer_callback_pending_ = false; - if (error == GRPC_ERROR_NONE && !self->xds_policy_->shutting_down_) { - self->priority_list()->FailoverOnConnectionFailureLocked(); + grpc_error* error) { + failover_timer_callback_pending_ = false; + if (error == GRPC_ERROR_NONE && !xds_policy_->shutting_down_) { + priority_list()->FailoverOnConnectionFailureLocked(); } - self->Unref(DEBUG_LOCATION, "LocalityMap+OnFailoverTimerLocked"); + Unref(DEBUG_LOCATION, "LocalityMap+OnFailoverTimerLocked"); + GRPC_ERROR_UNREF(error); } // @@ -1480,6 +1473,9 @@ XdsLb::PriorityList::LocalityMap::Locality::Locality( gpr_log(GPR_INFO, "[xdslb %p] created Locality %p for %s", xds_policy(), this, name_->AsHumanReadableString()); } + // Closure Initialization + GRPC_CLOSURE_INIT(&on_delayed_removal_timer_, OnDelayedRemovalTimer, this, + grpc_schedule_on_exec_ctx); } XdsLb::PriorityList::LocalityMap::Locality::~Locality() { @@ -1696,8 +1692,6 @@ void XdsLb::PriorityList::LocalityMap::Locality::DeactivateLocked() { weight_ = 0; // Start a timer to delete the locality. Ref(DEBUG_LOCATION, "Locality+timer").release(); - GRPC_CLOSURE_INIT(&on_delayed_removal_timer_, OnDelayedRemovalTimer, this, - grpc_schedule_on_exec_ctx); grpc_timer_init( &delayed_removal_timer_, ExecCtx::Get()->Now() + xds_policy()->locality_retention_interval_ms_, @@ -1708,22 +1702,20 @@ void XdsLb::PriorityList::LocalityMap::Locality::DeactivateLocked() { void XdsLb::PriorityList::LocalityMap::Locality::OnDelayedRemovalTimer( void* arg, grpc_error* error) { Locality* self = static_cast(arg); + GRPC_ERROR_REF(error); // ref owned by lambda self->xds_policy()->logical_thread()->Run( - Closure::ToFunction( - GRPC_CLOSURE_INIT(&self->on_delayed_removal_timer_, - OnDelayedRemovalTimerLocked, self, nullptr), - GRPC_ERROR_REF(error)), + [self, error]() { self->OnDelayedRemovalTimerLocked(error); }, DEBUG_LOCATION); } void XdsLb::PriorityList::LocalityMap::Locality::OnDelayedRemovalTimerLocked( - void* arg, grpc_error* error) { - Locality* self = static_cast(arg); - self->delayed_removal_timer_callback_pending_ = false; - if (error == GRPC_ERROR_NONE && !self->shutdown_ && self->weight_ == 0) { - self->locality_map_->localities_.erase(self->name_); + grpc_error* error) { + delayed_removal_timer_callback_pending_ = false; + if (error == GRPC_ERROR_NONE && !shutdown_ && weight_ == 0) { + locality_map_->localities_.erase(name_); } - self->Unref(DEBUG_LOCATION, "Locality+timer"); + Unref(DEBUG_LOCATION, "Locality+timer"); + GRPC_ERROR_UNREF(error); } // From b338d84aec0052f34ca1c95c500822f78301afa3 Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Tue, 14 Jan 2020 18:48:18 -0800 Subject: [PATCH 051/758] Reviewer comments --- .../ext/filters/client_channel/lb_policy.cc | 2 +- .../ext/filters/client_channel/lb_policy.h | 2 +- .../client_channel/lb_policy/grpclb/grpclb.cc | 4 +- .../resolver/dns/c_ares/dns_resolver_ares.cc | 107 +++++++------- .../dns/c_ares/grpc_ares_ev_driver.cc | 48 +++--- .../dns/c_ares/grpc_ares_ev_driver_windows.cc | 73 ++++------ .../resolver/dns/c_ares/grpc_ares_wrapper.cc | 15 +- .../resolver/dns/native/dns_resolver.cc | 84 +++++------ .../resolver/fake/fake_resolver.cc | 137 ++++++++++++------ .../resolver/fake/fake_resolver.h | 60 +------- .../ext/filters/client_channel/xds/xds_api.h | 4 +- .../client_channel/xds/xds_client_stats.h | 4 +- src/core/lib/transport/connectivity_state.cc | 8 +- src/core/lib/transport/connectivity_state.h | 6 +- 14 files changed, 251 insertions(+), 303 deletions(-) diff --git a/src/core/ext/filters/client_channel/lb_policy.cc b/src/core/ext/filters/client_channel/lb_policy.cc index 748dc1e80af..6c75842fa8b 100644 --- a/src/core/ext/filters/client_channel/lb_policy.cc +++ b/src/core/ext/filters/client_channel/lb_policy.cc @@ -98,7 +98,7 @@ LoadBalancingPolicy::PickResult LoadBalancingPolicy::QueuePicker::Pick( // the time this function returns, the pick will already have // been processed, and we'll be trying to re-process the same // pick again, leading to a crash. - // 2. We are currently running in the data plane logical_thread, but we + // 2. We are currently running in the data plane mutex, but we // need to bounce into the control plane logical_thread to call // ExitIdleLocked(). if (!exit_idle_called_) { diff --git a/src/core/ext/filters/client_channel/lb_policy.h b/src/core/ext/filters/client_channel/lb_policy.h index fa6dcb7ffee..3779a17c5d5 100644 --- a/src/core/ext/filters/client_channel/lb_policy.h +++ b/src/core/ext/filters/client_channel/lb_policy.h @@ -242,7 +242,7 @@ class LoadBalancingPolicy : public InternallyRefCounted { /// live in the LB policy object itself. /// /// Currently, pickers are always accessed from within the - /// client_channel data plane logical_thread, so they do not have to be + /// client_channel data plane mutex, so they do not have to be /// thread-safe. class SubchannelPicker { public: diff --git a/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc b/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc index 06144d8cfd9..9ceaaf66d47 100644 --- a/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +++ b/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc @@ -246,7 +246,7 @@ class GrpcLb : public LoadBalancingPolicy { // should not be dropped. // // Note: This is called from the picker, so it will be invoked in - // the channel's data plane logical_thread, NOT the control plane + // the channel's data plane mutex, NOT the control plane // logical_thread. It should not be accessed by any other part of the LB // policy. const char* ShouldDrop(); @@ -254,7 +254,7 @@ class GrpcLb : public LoadBalancingPolicy { private: std::vector serverlist_; - // Guarded by the channel's data plane logical_thread, NOT the control + // Guarded by the channel's data plane mutex, NOT the control // plane logical_thread. It should not be accessed by anything but the // picker via the ShouldDrop() method. size_t drop_index_ = 0; diff --git a/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc b/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc index b0a3e948420..f3ed367931b 100644 --- a/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +++ b/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc @@ -78,8 +78,8 @@ class AresDnsResolver : public Resolver { static void OnNextResolution(void* arg, grpc_error* error); static void OnResolved(void* arg, grpc_error* error); - static void OnNextResolutionLocked(void* arg, grpc_error* error); - static void OnResolvedLocked(void* arg, grpc_error* error); + void OnNextResolutionLocked(grpc_error* error); + void OnResolvedLocked(grpc_error* error); /// DNS server to use (if not system default) char* dns_server_; @@ -128,6 +128,10 @@ AresDnsResolver::AresDnsResolver(ResolverArgs args) .set_multiplier(GRPC_DNS_RECONNECT_BACKOFF_MULTIPLIER) .set_jitter(GRPC_DNS_RECONNECT_JITTER) .set_max_backoff(GRPC_DNS_RECONNECT_MAX_BACKOFF_SECONDS * 1000)) { + // Closure Initialization + GRPC_CLOSURE_INIT(&on_next_resolution_, OnNextResolution, this, + grpc_schedule_on_exec_ctx); + GRPC_CLOSURE_INIT(&on_resolved_, OnResolved, this, grpc_schedule_on_exec_ctx); // Get name to resolve from URI path. const char* path = args.uri->path; if (path[0] == '/') ++path; @@ -201,28 +205,26 @@ void AresDnsResolver::ShutdownLocked() { void AresDnsResolver::OnNextResolution(void* arg, grpc_error* error) { AresDnsResolver* r = static_cast(arg); - r->logical_thread()->Run( - Closure::ToFunction(GRPC_CLOSURE_INIT(&r->on_next_resolution_, - OnNextResolutionLocked, r, nullptr), - GRPC_ERROR_REF(error)), - DEBUG_LOCATION); + GRPC_ERROR_REF(error); // ref owned by lambda + r->logical_thread()->Run([r, error]() { r->OnNextResolutionLocked(error); }, + DEBUG_LOCATION); } -void AresDnsResolver::OnNextResolutionLocked(void* arg, grpc_error* error) { - AresDnsResolver* r = static_cast(arg); +void AresDnsResolver::OnNextResolutionLocked(grpc_error* error) { GRPC_CARES_TRACE_LOG( "resolver:%p re-resolution timer fired. error: %s. shutdown_initiated_: " "%d", - r, grpc_error_string(error), r->shutdown_initiated_); - r->have_next_resolution_timer_ = false; - if (error == GRPC_ERROR_NONE && !r->shutdown_initiated_) { - if (!r->resolving_) { + this, grpc_error_string(error), shutdown_initiated_); + have_next_resolution_timer_ = false; + if (error == GRPC_ERROR_NONE && !shutdown_initiated_) { + if (!resolving_) { GRPC_CARES_TRACE_LOG( - "resolver:%p start resolving due to re-resolution timer", r); - r->StartResolvingLocked(); + "resolver:%p start resolving due to re-resolution timer", this); + StartResolvingLocked(); } } - r->Unref(DEBUG_LOCATION, "next_resolution_timer"); + Unref(DEBUG_LOCATION, "next_resolution_timer"); + GRPC_ERROR_UNREF(error); } bool ValueInJsonArray(grpc_json* array, const char* value) { @@ -327,75 +329,71 @@ char* ChooseServiceConfig(char* service_config_choice_json, void AresDnsResolver::OnResolved(void* arg, grpc_error* error) { AresDnsResolver* r = static_cast(arg); - r->logical_thread()->Run( - Closure::ToFunction( - GRPC_CLOSURE_INIT(&r->on_resolved_, OnResolvedLocked, r, nullptr), - GRPC_ERROR_REF(error)), - DEBUG_LOCATION); + GRPC_ERROR_REF(error); // ref owned by lambda + r->logical_thread()->Run([r, error]() { r->OnResolvedLocked(error); }, + DEBUG_LOCATION); } -void AresDnsResolver::OnResolvedLocked(void* arg, grpc_error* error) { - AresDnsResolver* r = static_cast(arg); - GPR_ASSERT(r->resolving_); - r->resolving_ = false; - gpr_free(r->pending_request_); - r->pending_request_ = nullptr; - if (r->shutdown_initiated_) { - r->Unref(DEBUG_LOCATION, "OnResolvedLocked() shutdown"); +void AresDnsResolver::OnResolvedLocked(grpc_error* error) { + GPR_ASSERT(resolving_); + resolving_ = false; + gpr_free(pending_request_); + pending_request_ = nullptr; + if (shutdown_initiated_) { + Unref(DEBUG_LOCATION, "OnResolvedLocked() shutdown"); + GRPC_ERROR_UNREF(error); return; } - if (r->addresses_ != nullptr) { + if (addresses_ != nullptr) { Result result; - result.addresses = std::move(*r->addresses_); - if (r->service_config_json_ != nullptr) { + result.addresses = std::move(*addresses_); + if (service_config_json_ != nullptr) { char* service_config_string = ChooseServiceConfig( - r->service_config_json_, &result.service_config_error); - gpr_free(r->service_config_json_); + service_config_json_, &result.service_config_error); + gpr_free(service_config_json_); if (result.service_config_error == GRPC_ERROR_NONE && service_config_string != nullptr) { GRPC_CARES_TRACE_LOG("resolver:%p selected service config choice: %s", - r, service_config_string); + this, service_config_string); result.service_config = ServiceConfig::Create( service_config_string, &result.service_config_error); } gpr_free(service_config_string); } - result.args = grpc_channel_args_copy(r->channel_args_); - r->result_handler()->ReturnResult(std::move(result)); - r->addresses_.reset(); + result.args = grpc_channel_args_copy(channel_args_); + result_handler()->ReturnResult(std::move(result)); + addresses_.reset(); // Reset backoff state so that we start from the beginning when the // next request gets triggered. - r->backoff_.Reset(); + backoff_.Reset(); } else { - GRPC_CARES_TRACE_LOG("resolver:%p dns resolution failed: %s", r, + GRPC_CARES_TRACE_LOG("resolver:%p dns resolution failed: %s", this, grpc_error_string(error)); - r->result_handler()->ReturnError(grpc_error_set_int( + result_handler()->ReturnError(grpc_error_set_int( GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING( "DNS resolution failed", &error, 1), GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE)); // Set retry timer. - grpc_millis next_try = r->backoff_.NextAttemptTime(); + grpc_millis next_try = backoff_.NextAttemptTime(); grpc_millis timeout = next_try - ExecCtx::Get()->Now(); GRPC_CARES_TRACE_LOG("resolver:%p dns resolution failed (will retry): %s", - r, grpc_error_string(error)); - GPR_ASSERT(!r->have_next_resolution_timer_); - r->have_next_resolution_timer_ = true; + this, grpc_error_string(error)); + GPR_ASSERT(!have_next_resolution_timer_); + have_next_resolution_timer_ = true; // TODO(roth): We currently deal with this ref manually. Once the // new closure API is done, find a way to track this ref with the timer // callback as part of the type system. - r->Ref(DEBUG_LOCATION, "retry-timer").release(); + Ref(DEBUG_LOCATION, "retry-timer").release(); if (timeout > 0) { GRPC_CARES_TRACE_LOG("resolver:%p retrying in %" PRId64 " milliseconds", - r, timeout); + this, timeout); } else { - GRPC_CARES_TRACE_LOG("resolver:%p retrying immediately", r); + GRPC_CARES_TRACE_LOG("resolver:%p retrying immediately", this); } - GRPC_CLOSURE_INIT(&r->on_next_resolution_, OnNextResolution, r, - grpc_schedule_on_exec_ctx); - grpc_timer_init(&r->next_resolution_timer_, next_try, - &r->on_next_resolution_); + grpc_timer_init(&next_resolution_timer_, next_try, &on_next_resolution_); } - r->Unref(DEBUG_LOCATION, "dns-resolving"); + Unref(DEBUG_LOCATION, "dns-resolving"); + GRPC_ERROR_UNREF(error); } void AresDnsResolver::MaybeStartResolvingLocked() { @@ -419,8 +417,6 @@ void AresDnsResolver::MaybeStartResolvingLocked() { // new closure API is done, find a way to track this ref with the timer // callback as part of the type system. Ref(DEBUG_LOCATION, "next_resolution_timer_cooldown").release(); - GRPC_CLOSURE_INIT(&on_next_resolution_, OnNextResolution, this, - grpc_schedule_on_exec_ctx); grpc_timer_init(&next_resolution_timer_, ExecCtx::Get()->Now() + ms_until_next_resolution, &on_next_resolution_); @@ -438,7 +434,6 @@ void AresDnsResolver::StartResolvingLocked() { GPR_ASSERT(!resolving_); resolving_ = true; service_config_json_ = nullptr; - GRPC_CLOSURE_INIT(&on_resolved_, OnResolved, this, grpc_schedule_on_exec_ctx); pending_request_ = grpc_dns_lookup_ares_locked( dns_server_, name_to_resolve_, kDefaultPort, interested_parties_, &on_resolved_, &addresses_, enable_srv_queries_ /* check_grpclb */, diff --git a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc index aa9ab36644a..57d66934702 100644 --- a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc +++ b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc @@ -131,10 +131,11 @@ static void fd_node_shutdown_locked(fd_node* fdn, const char* reason) { } static void on_timeout(void* arg, grpc_error* error); -static void on_timeout_locked(void* arg, grpc_error* error); +static void on_timeout_locked(grpc_ares_ev_driver* arg, grpc_error* error); static void on_ares_backup_poll_alarm(void* arg, grpc_error* error); -static void on_ares_backup_poll_alarm_locked(void* arg, grpc_error* error); +static void on_ares_backup_poll_alarm_locked(grpc_ares_ev_driver* arg, + grpc_error* error); static void noop_inject_channel_config(ares_channel /*channel*/) {} @@ -232,16 +233,12 @@ static grpc_millis calculate_next_ares_backup_poll_alarm_ms( static void on_timeout(void* arg, grpc_error* error) { grpc_ares_ev_driver* driver = static_cast(arg); + GRPC_ERROR_REF(error); // ref owned by lambda driver->logical_thread->Run( - grpc_core::Closure::ToFunction( - GRPC_CLOSURE_INIT(&driver->on_timeout_locked, on_timeout_locked, - driver, nullptr), - GRPC_ERROR_REF(error)), - DEBUG_LOCATION); + [driver, error]() { on_timeout_locked(driver, error); }, DEBUG_LOCATION); } -static void on_timeout_locked(void* arg, grpc_error* error) { - grpc_ares_ev_driver* driver = static_cast(arg); +static void on_timeout_locked(grpc_ares_ev_driver* driver, grpc_error* error) { GRPC_CARES_TRACE_LOG( "request:%p ev_driver=%p on_timeout_locked. driver->shutting_down=%d. " "err=%s", @@ -250,15 +247,14 @@ static void on_timeout_locked(void* arg, grpc_error* error) { grpc_ares_ev_driver_shutdown_locked(driver); } grpc_ares_ev_driver_unref(driver); + GRPC_ERROR_UNREF(error); } static void on_ares_backup_poll_alarm(void* arg, grpc_error* error) { grpc_ares_ev_driver* driver = static_cast(arg); + GRPC_ERROR_REF(error); driver->logical_thread->Run( - grpc_core::Closure::ToFunction( - GRPC_CLOSURE_INIT(&driver->on_ares_backup_poll_alarm_locked, - on_ares_backup_poll_alarm_locked, driver, nullptr), - GRPC_ERROR_REF(error)), + [driver, error]() { on_ares_backup_poll_alarm_locked(driver, error); }, DEBUG_LOCATION); } @@ -270,8 +266,8 @@ static void on_ares_backup_poll_alarm(void* arg, grpc_error* error) { * b) when some time has passed without fd events having happened * For the latter, we use this backup poller. Also see * https://github.com/grpc/grpc/pull/17688 description for more details. */ -static void on_ares_backup_poll_alarm_locked(void* arg, grpc_error* error) { - grpc_ares_ev_driver* driver = static_cast(arg); +static void on_ares_backup_poll_alarm_locked(grpc_ares_ev_driver* driver, + grpc_error* error) { GRPC_CARES_TRACE_LOG( "request:%p ev_driver=%p on_ares_backup_poll_alarm_locked. " "driver->shutting_down=%d. " @@ -304,10 +300,10 @@ static void on_ares_backup_poll_alarm_locked(void* arg, grpc_error* error) { grpc_ares_notify_on_event_locked(driver); } grpc_ares_ev_driver_unref(driver); + GRPC_ERROR_UNREF(error); } -static void on_readable_locked(void* arg, grpc_error* error) { - fd_node* fdn = static_cast(arg); +static void on_readable_locked(fd_node* fdn, grpc_error* error) { GPR_ASSERT(fdn->readable_registered); grpc_ares_ev_driver* ev_driver = fdn->ev_driver; const ares_socket_t as = fdn->grpc_polled_fd->GetWrappedAresSocketLocked(); @@ -329,20 +325,16 @@ static void on_readable_locked(void* arg, grpc_error* error) { } grpc_ares_notify_on_event_locked(ev_driver); grpc_ares_ev_driver_unref(ev_driver); + GRPC_ERROR_UNREF(error); } static void on_readable(void* arg, grpc_error* error) { fd_node* fdn = static_cast(arg); fdn->ev_driver->logical_thread->Run( - grpc_core::Closure::ToFunction( - GRPC_CLOSURE_INIT(&fdn->read_closure, on_readable_locked, fdn, - nullptr), - GRPC_ERROR_REF(error)), - DEBUG_LOCATION); + [fdn, error]() { on_readable_locked(fdn, error); }, DEBUG_LOCATION); } -static void on_writable_locked(void* arg, grpc_error* error) { - fd_node* fdn = static_cast(arg); +static void on_writable_locked(fd_node* fdn, grpc_error* error) { GPR_ASSERT(fdn->writable_registered); grpc_ares_ev_driver* ev_driver = fdn->ev_driver; const ares_socket_t as = fdn->grpc_polled_fd->GetWrappedAresSocketLocked(); @@ -362,16 +354,14 @@ static void on_writable_locked(void* arg, grpc_error* error) { } grpc_ares_notify_on_event_locked(ev_driver); grpc_ares_ev_driver_unref(ev_driver); + GRPC_ERROR_UNREF(error); } static void on_writable(void* arg, grpc_error* error) { fd_node* fdn = static_cast(arg); + GRPC_ERROR_REF(error); fdn->ev_driver->logical_thread->Run( - grpc_core::Closure::ToFunction( - GRPC_CLOSURE_INIT(&fdn->write_closure, on_writable_locked, fdn, - nullptr), - GRPC_ERROR_REF(error)), - DEBUG_LOCATION); + [fdn, error]() { on_writable_locked(fdn, error); }, DEBUG_LOCATION); } ares_channel* grpc_ares_ev_driver_get_channel_locked( diff --git a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc index eef2e47ce4e..ae0d75b78fb 100644 --- a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +++ b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc @@ -108,6 +108,16 @@ class GrpcPolledFdWindows { socket_type_(socket_type), logical_thread_(std::move(logical_thread)) { gpr_asprintf(&name_, "c-ares socket: %" PRIdPTR, as); + // Closure Initialization + GRPC_CLOSURE_INIT(&outer_read_closure_, + &GrpcPolledFdWindows::OnIocpReadable, this, + grpc_schedule_on_exec_ctx); + GRPC_CLOSURE_INIT(&outer_write_closure_, + &GrpcPolledFdWindows::OnIocpWriteable, this, + grpc_schedule_on_exec_ctx); + GRPC_CLOSURE_INIT(&on_tcp_connect_locked_, + &GrpcPolledFdWindows::OnTcpConnect, this, + grpc_schedule_on_exec_ctx); winsocket_ = grpc_winsocket_create(as, name_); } @@ -179,10 +189,7 @@ class GrpcPolledFdWindows { return; } } - grpc_socket_notify_on_read( - winsocket_, GRPC_CLOSURE_INIT(&outer_read_closure_, - &GrpcPolledFdWindows::OnIocpReadable, - this, grpc_schedule_on_exec_ctx)); + grpc_socket_notify_on_read(winsocket_, &outer_read_closure_); } void RegisterForOnWriteableLocked(grpc_closure* write_closure) { @@ -233,11 +240,7 @@ class GrpcPolledFdWindows { ScheduleAndNullWriteClosure( GRPC_WSA_ERROR(wsa_error_code, "WSASend (overlapped)")); } else { - grpc_socket_notify_on_write( - winsocket_, - GRPC_CLOSURE_INIT(&outer_write_closure_, - &GrpcPolledFdWindows::OnIocpWriteable, this, - grpc_schedule_on_exec_ctx)); + grpc_socket_notify_on_write(winsocket_, &outer_write_closure_); } break; case WRITE_PENDING: @@ -417,22 +420,15 @@ class GrpcPolledFdWindows { static void OnTcpConnect(void* arg, grpc_error* error) { GrpcPolledFdWindows* grpc_polled_fd = static_cast(arg); + GRPC_ERROR_REF(error); // ref owned by lambda grpc_polled_fd->logical_thread_->Run( - Closure::ToFunction( - GRPC_CLOSURE_INIT(&grpc_polled_fd->on_tcp_connect_locked_, - &GrpcPolledFdWindows::OnTcpConnectLocked, - grpc_polled_fd, nullptr), - GRPC_ERROR_REF(error)), + [grpc_polled_fd, error]() { + grpc_polled_fd->OnTcpConnectLocked(error); + }, DEBUG_LOCATION); } - static void OnTcpConnectLocked(void* arg, grpc_error* error) { - GrpcPolledFdWindows* grpc_polled_fd = - static_cast(arg); - grpc_polled_fd->InnerOnTcpConnectLocked(error); - } - - void InnerOnTcpConnectLocked(grpc_error* error) { + void OnTcpConnectLocked(grpc_error* error) { GRPC_CARES_TRACE_LOG( "fd:%s InnerOnTcpConnectLocked error:|%s| " "pending_register_for_readable:%d" @@ -473,6 +469,7 @@ class GrpcPolledFdWindows { logical_thread_->Run([this]() { ContinueRegisterForOnWriteableLocked(); }, DEBUG_LOCATION); } + GRPC_ERROR_UNREF(error); } int Connect(WSAErrorContext* wsa_error_ctx, const struct sockaddr* target, @@ -572,27 +569,15 @@ class GrpcPolledFdWindows { return -1; } } - GRPC_CLOSURE_INIT(&on_tcp_connect_locked_, - &GrpcPolledFdWindows::OnTcpConnect, this, - grpc_schedule_on_exec_ctx); grpc_socket_notify_on_write(winsocket_, &on_tcp_connect_locked_); return out; } static void OnIocpReadable(void* arg, grpc_error* error) { GrpcPolledFdWindows* polled_fd = static_cast(arg); + GRPC_ERROR_REF(error); // ref owned by lambda polled_fd->logical_thread_->Run( - Closure::ToFunction( - GRPC_CLOSURE_INIT(&polled_fd->outer_read_closure_, - &GrpcPolledFdWindows::OnIocpReadableLocked, - polled_fd, nullptr), - GRPC_ERROR_REF(error)), - DEBUG_LOCATION); - } - - static void OnIocpReadableLocked(void* arg, grpc_error* error) { - GrpcPolledFdWindows* polled_fd = static_cast(arg); - polled_fd->OnIocpReadableInner(error); + [polled_fd, error]() { OnIocpReadableLocked(error); }, DEBUG_LOCATION); } // TODO(apolcyn): improve this error handling to be less conversative. @@ -600,7 +585,7 @@ class GrpcPolledFdWindows { // c-ares reads from this socket later, but it shouldn't necessarily cancel // the entire resolution attempt. Doing so will allow the "inject broken // nameserver list" test to pass on Windows. - void OnIocpReadableInner(grpc_error* error) { + void OnIocpReadableLocked(grpc_error* error) { if (error == GRPC_ERROR_NONE) { if (winsocket_->read_info.wsa_error != 0) { /* WSAEMSGSIZE would be due to receiving more data @@ -631,25 +616,18 @@ class GrpcPolledFdWindows { "fd:|%s| OnIocpReadable finishing. read buf length now:|%d|", GetName(), GRPC_SLICE_LENGTH(read_buf_)); ScheduleAndNullReadClosure(error); + GRPC_ERROR_UNREF(error); } static void OnIocpWriteable(void* arg, grpc_error* error) { GrpcPolledFdWindows* polled_fd = static_cast(arg); + GRPC_ERROR_REF(error); // error owned by lambda polled_fd->logical_thread_->Run( - Closure::ToFunction( - GRPC_CLOSURE_INIT(&polled_fd->outer_write_closure_, - &GrpcPolledFdWindows::OnIocpWriteableLocked, - polled_fd, nullptr), - GRPC_ERROR_REF(error)), + [polled_fd, error]() { polled_fd->OnIocpWriteableLocked(error); }, DEBUG_LOCATION); } - static void OnIocpWriteableLocked(void* arg, grpc_error* error) { - GrpcPolledFdWindows* polled_fd = static_cast(arg); - polled_fd->OnIocpWriteableInner(error); - } - - void OnIocpWriteableInner(grpc_error* error) { + void OnIocpWriteableLocked(grpc_error* error) { GRPC_CARES_TRACE_LOG("OnIocpWriteableInner. fd:|%s|", GetName()); GPR_ASSERT(socket_type_ == SOCK_STREAM); if (error == GRPC_ERROR_NONE) { @@ -676,6 +654,7 @@ class GrpcPolledFdWindows { write_buf_ = grpc_empty_slice(); } ScheduleAndNullWriteClosure(error); + GRPC_ERROR_UNREF(error); } bool gotten_into_driver_list() const { return gotten_into_driver_list_; } diff --git a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc index 36f63ba7537..a562e2a4d85 100644 --- a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +++ b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc @@ -695,9 +695,8 @@ typedef struct grpc_resolve_address_ares_request { grpc_ares_request* ares_request = nullptr; } grpc_resolve_address_ares_request; -static void on_dns_lookup_done_locked(void* arg, grpc_error* error) { - grpc_resolve_address_ares_request* r = - static_cast(arg); +static void on_dns_lookup_done_locked(grpc_resolve_address_ares_request* r, + grpc_error* error) { gpr_free(r->ares_request); grpc_resolved_addresses** resolved_addresses = r->addrs_out; if (r->addresses == nullptr || r->addresses->empty()) { @@ -718,17 +717,15 @@ static void on_dns_lookup_done_locked(void* arg, grpc_error* error) { grpc_core::ExecCtx::Run(DEBUG_LOCATION, r->on_resolve_address_done, GRPC_ERROR_REF(error)); delete r; + GRPC_ERROR_UNREF(error); } static void on_dns_lookup_done(void* arg, grpc_error* error) { grpc_resolve_address_ares_request* r = static_cast(arg); - r->logical_thread->Run( - grpc_core::Closure::ToFunction( - GRPC_CLOSURE_INIT(&r->on_dns_lookup_done_locked, - on_dns_lookup_done_locked, r, nullptr), - GRPC_ERROR_REF(error)), - DEBUG_LOCATION); + GRPC_ERROR_REF(error); // ref owned by lambda + r->logical_thread->Run([r, error]() { on_dns_lookup_done_locked(r, error); }, + DEBUG_LOCATION); } static void grpc_resolve_address_invoke_dns_lookup_ares_locked(void* arg) { diff --git a/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc b/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc index c8fa897fc8e..94e3ffa80cb 100644 --- a/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +++ b/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc @@ -67,9 +67,9 @@ class NativeDnsResolver : public Resolver { void StartResolvingLocked(); static void OnNextResolution(void* arg, grpc_error* error); - static void OnNextResolutionLocked(void* arg, grpc_error* error); + void OnNextResolutionLocked(grpc_error* error); static void OnResolved(void* arg, grpc_error* error); - static void OnResolvedLocked(void* arg, grpc_error* error); + void OnResolvedLocked(grpc_error* error); /// name to resolve char* name_to_resolve_ = nullptr; @@ -149,84 +149,76 @@ void NativeDnsResolver::ShutdownLocked() { void NativeDnsResolver::OnNextResolution(void* arg, grpc_error* error) { NativeDnsResolver* r = static_cast(arg); - r->logical_thread()->Run( - Closure::ToFunction( - GRPC_CLOSURE_INIT(&r->on_next_resolution_, - NativeDnsResolver::OnNextResolutionLocked, r, - nullptr), - GRPC_ERROR_REF(error)), - DEBUG_LOCATION); + GRPC_ERROR_REF(error); // ref owned by lambda + r->logical_thread()->Run([r, error]() { r->OnNextResolutionLocked(error); }, + DEBUG_LOCATION); } -void NativeDnsResolver::OnNextResolutionLocked(void* arg, grpc_error* error) { - NativeDnsResolver* r = static_cast(arg); - r->have_next_resolution_timer_ = false; - if (error == GRPC_ERROR_NONE && !r->resolving_) { - r->StartResolvingLocked(); +void NativeDnsResolver::OnNextResolutionLocked(grpc_error* error) { + have_next_resolution_timer_ = false; + if (error == GRPC_ERROR_NONE && !resolving_) { + StartResolvingLocked(); } - r->Unref(DEBUG_LOCATION, "retry-timer"); + Unref(DEBUG_LOCATION, "retry-timer"); + GRPC_ERROR_UNREF(error); } void NativeDnsResolver::OnResolved(void* arg, grpc_error* error) { NativeDnsResolver* r = static_cast(arg); - r->logical_thread()->Run( - Closure::ToFunction( - GRPC_CLOSURE_INIT(&r->on_resolved_, - NativeDnsResolver::OnResolvedLocked, r, nullptr), - GRPC_ERROR_REF(error)), - DEBUG_LOCATION); + GRPC_ERROR_REF(error); // owned by lambda + r->logical_thread()->Run([r, error]() { r->OnResolvedLocked(error); }, + DEBUG_LOCATION); } -void NativeDnsResolver::OnResolvedLocked(void* arg, grpc_error* error) { - NativeDnsResolver* r = static_cast(arg); - GPR_ASSERT(r->resolving_); - r->resolving_ = false; - if (r->shutdown_) { - r->Unref(DEBUG_LOCATION, "dns-resolving"); +void NativeDnsResolver::OnResolvedLocked(grpc_error* error) { + GPR_ASSERT(resolving_); + resolving_ = false; + if (shutdown_) { + Unref(DEBUG_LOCATION, "dns-resolving"); + GRPC_ERROR_UNREF(error); return; } - if (r->addresses_ != nullptr) { + if (addresses_ != nullptr) { Result result; - for (size_t i = 0; i < r->addresses_->naddrs; ++i) { - result.addresses.emplace_back(&r->addresses_->addrs[i].addr, - r->addresses_->addrs[i].len, + for (size_t i = 0; i < addresses_->naddrs; ++i) { + result.addresses.emplace_back(&addresses_->addrs[i].addr, + addresses_->addrs[i].len, nullptr /* args */); } - grpc_resolved_addresses_destroy(r->addresses_); - result.args = grpc_channel_args_copy(r->channel_args_); - r->result_handler()->ReturnResult(std::move(result)); + grpc_resolved_addresses_destroy(addresses_); + result.args = grpc_channel_args_copy(channel_args_); + result_handler()->ReturnResult(std::move(result)); // Reset backoff state so that we start from the beginning when the // next request gets triggered. - r->backoff_.Reset(); + backoff_.Reset(); } else { gpr_log(GPR_INFO, "dns resolution failed (will retry): %s", grpc_error_string(error)); // Return transient error. - r->result_handler()->ReturnError(grpc_error_set_int( + result_handler()->ReturnError(grpc_error_set_int( GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING( "DNS resolution failed", &error, 1), GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE)); // Set up for retry. - grpc_millis next_try = r->backoff_.NextAttemptTime(); + grpc_millis next_try = backoff_.NextAttemptTime(); grpc_millis timeout = next_try - ExecCtx::Get()->Now(); - GPR_ASSERT(!r->have_next_resolution_timer_); - r->have_next_resolution_timer_ = true; + GPR_ASSERT(!have_next_resolution_timer_); + have_next_resolution_timer_ = true; // TODO(roth): We currently deal with this ref manually. Once the // new closure API is done, find a way to track this ref with the timer // callback as part of the type system. - r->Ref(DEBUG_LOCATION, "next_resolution_timer").release(); + Ref(DEBUG_LOCATION, "next_resolution_timer").release(); if (timeout > 0) { gpr_log(GPR_DEBUG, "retrying in %" PRId64 " milliseconds", timeout); } else { gpr_log(GPR_DEBUG, "retrying immediately"); } - GRPC_CLOSURE_INIT(&r->on_next_resolution_, - NativeDnsResolver::OnNextResolution, r, - grpc_schedule_on_exec_ctx); - grpc_timer_init(&r->next_resolution_timer_, next_try, - &r->on_next_resolution_); + GRPC_CLOSURE_INIT(&on_next_resolution_, NativeDnsResolver::OnNextResolution, + this, grpc_schedule_on_exec_ctx); + grpc_timer_init(&next_resolution_timer_, next_try, &on_next_resolution_); } - r->Unref(DEBUG_LOCATION, "dns-resolving"); + Unref(DEBUG_LOCATION, "dns-resolving"); + GRPC_ERROR_UNREF(error); } void NativeDnsResolver::MaybeStartResolvingLocked() { diff --git a/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc b/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc index db6593b179b..14fc0304705 100644 --- a/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +++ b/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc @@ -45,6 +45,47 @@ namespace grpc_core { +class FakeResolver : public Resolver { + public: + explicit FakeResolver(ResolverArgs args); + + void StartLocked() override; + + void RequestReresolutionLocked() override; + + private: + friend class FakeResolverResponseGenerator; + friend class FakeResolverResponseSetter; + + virtual ~FakeResolver(); + + void ShutdownLocked() override; + + void MaybeSendResultLocked(); + + void ReturnReresolutionResult(); + + // passed-in parameters + grpc_channel_args* channel_args_ = nullptr; + RefCountedPtr response_generator_; + // If has_next_result_ is true, next_result_ is the next resolution result + // to be returned. + bool has_next_result_ = false; + Result next_result_; + // Result to use for the pretended re-resolution in + // RequestReresolutionLocked(). + bool has_reresolution_result_ = false; + Result reresolution_result_; + // True after the call to StartLocked(). + bool started_ = false; + // True after the call to ShutdownLocked(). + bool shutdown_ = false; + // if true, return failure + bool return_failure_ = false; + // pending re-resolution + bool reresolution_closure_pending_ = false; +}; + FakeResolver::FakeResolver(ResolverArgs args) : Resolver(args.logical_thread, std::move(args.result_handler)), response_generator_( @@ -123,15 +164,35 @@ void FakeResolver::ReturnReresolutionResult() { Unref(); } -// -// FakeResolverResponseGenerator -// - -FakeResolverResponseGenerator::FakeResolverResponseGenerator() {} +class FakeResolverResponseSetter { + public: + explicit FakeResolverResponseSetter(RefCountedPtr resolver, + Resolver::Result result, + bool has_result = false, + bool immediate = true) + : resolver_(std::move(resolver)), + result_(result), + has_result_(has_result), + immediate_(immediate) {} + void SetResponseLocked(); + void SetReresolutionResponseLocked(); + void SetFailureLocked(); + + private: + RefCountedPtr resolver_; + Resolver::Result result_; + bool has_result_; + bool immediate_; +}; -FakeResolverResponseGenerator::~FakeResolverResponseGenerator() {} +void FakeResolverResponseSetter::SetReresolutionResponseLocked() { + if (!resolver_->shutdown_) { + resolver_->reresolution_result_ = std::move(result_); + resolver_->has_reresolution_result_ = has_result_; + } +} -void FakeResolverResponseGenerator::ResponseSetter::SetResponseLocked() { +void FakeResolverResponseSetter::SetResponseLocked() { if (!resolver_->shutdown_) { resolver_->next_result_ = std::move(result_); resolver_->has_next_result_ = true; @@ -139,6 +200,21 @@ void FakeResolverResponseGenerator::ResponseSetter::SetResponseLocked() { } } +void FakeResolverResponseSetter::SetFailureLocked() { + if (!resolver_->shutdown_) { + resolver_->return_failure_ = true; + if (immediate_) resolver_->MaybeSendResultLocked(); + } +} + +// +// FakeResolverResponseGenerator +// + +FakeResolverResponseGenerator::FakeResolverResponseGenerator() {} + +FakeResolverResponseGenerator::~FakeResolverResponseGenerator() {} + void FakeResolverResponseGenerator::SetResponse(Resolver::Result result) { RefCountedPtr resolver; { @@ -150,9 +226,8 @@ void FakeResolverResponseGenerator::SetResponse(Resolver::Result result) { } resolver = resolver_->Ref(); } - FakeResolverResponseGenerator::ResponseSetter* arg = - new FakeResolverResponseGenerator::ResponseSetter(resolver, - std::move(result)); + FakeResolverResponseSetter* arg = + new FakeResolverResponseSetter(resolver, std::move(result)); resolver->logical_thread()->Run( [arg]() { arg->SetResponseLocked(); @@ -161,14 +236,6 @@ void FakeResolverResponseGenerator::SetResponse(Resolver::Result result) { DEBUG_LOCATION); } -void FakeResolverResponseGenerator::ResponseSetter:: - SetReresolutionResponseLocked() { - if (!resolver_->shutdown_) { - resolver_->reresolution_result_ = std::move(result_); - resolver_->has_reresolution_result_ = has_result_; - } -} - void FakeResolverResponseGenerator::SetReresolutionResponse( Resolver::Result result) { RefCountedPtr resolver; @@ -177,10 +244,8 @@ void FakeResolverResponseGenerator::SetReresolutionResponse( GPR_ASSERT(resolver_ != nullptr); resolver = resolver_->Ref(); } - FakeResolverResponseGenerator::ResponseSetter* arg = - new FakeResolverResponseGenerator::ResponseSetter(resolver, - std::move(result)); - arg->set_has_result(); + FakeResolverResponseSetter* arg = + new FakeResolverResponseSetter(resolver, std::move(result), true); resolver->logical_thread()->Run( [arg]() { arg->SetReresolutionResponseLocked(); @@ -196,9 +261,8 @@ void FakeResolverResponseGenerator::UnsetReresolutionResponse() { GPR_ASSERT(resolver_ != nullptr); resolver = resolver_->Ref(); } - FakeResolverResponseGenerator::ResponseSetter* arg = - new FakeResolverResponseGenerator::ResponseSetter(resolver, - Resolver::Result()); + FakeResolverResponseSetter* arg = + new FakeResolverResponseSetter(resolver, Resolver::Result()); resolver->logical_thread()->Run( [arg]() { arg->SetReresolutionResponseLocked(); @@ -207,13 +271,6 @@ void FakeResolverResponseGenerator::UnsetReresolutionResponse() { DEBUG_LOCATION); } -void FakeResolverResponseGenerator::ResponseSetter::SetFailureLocked() { - if (!resolver_->shutdown_) { - resolver_->return_failure_ = true; - if (immediate_) resolver_->MaybeSendResultLocked(); - } -} - void FakeResolverResponseGenerator::SetFailure() { RefCountedPtr resolver; { @@ -221,9 +278,8 @@ void FakeResolverResponseGenerator::SetFailure() { GPR_ASSERT(resolver_ != nullptr); resolver = resolver_->Ref(); } - FakeResolverResponseGenerator::ResponseSetter* arg = - new FakeResolverResponseGenerator::ResponseSetter(resolver, - Resolver::Result()); + FakeResolverResponseSetter* arg = + new FakeResolverResponseSetter(resolver, Resolver::Result()); resolver->logical_thread()->Run( [arg]() { arg->SetFailureLocked(); @@ -239,10 +295,8 @@ void FakeResolverResponseGenerator::SetFailureOnReresolution() { GPR_ASSERT(resolver_ != nullptr); resolver = resolver_->Ref(); } - FakeResolverResponseGenerator::ResponseSetter* arg = - new FakeResolverResponseGenerator::ResponseSetter(resolver, - Resolver::Result()); - arg->reset_immediate(); + FakeResolverResponseSetter* arg = new FakeResolverResponseSetter( + resolver, Resolver::Result(), false, false); resolver->logical_thread()->Run( [arg]() { arg->SetFailureLocked(); @@ -257,9 +311,8 @@ void FakeResolverResponseGenerator::SetFakeResolver( resolver_ = std::move(resolver); if (resolver_ == nullptr) return; if (has_result_) { - FakeResolverResponseGenerator::ResponseSetter* arg = - new FakeResolverResponseGenerator::ResponseSetter(resolver_, - std::move(result_)); + FakeResolverResponseSetter* arg = + new FakeResolverResponseSetter(resolver_, std::move(result_)); resolver_->logical_thread()->Run( [arg]() { arg->SetResponseLocked(); diff --git a/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h b/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h index dbfafe86c40..5e837a82fd4 100644 --- a/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +++ b/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h @@ -30,47 +30,7 @@ namespace grpc_core { -class FakeResolverResponseGenerator; - -class FakeResolver : public Resolver { - public: - explicit FakeResolver(ResolverArgs args); - - void StartLocked() override; - - void RequestReresolutionLocked() override; - - private: - friend class FakeResolverResponseGenerator; - - virtual ~FakeResolver(); - - void ShutdownLocked() override; - - void MaybeSendResultLocked(); - - void ReturnReresolutionResult(); - - // passed-in parameters - grpc_channel_args* channel_args_ = nullptr; - RefCountedPtr response_generator_; - // If has_next_result_ is true, next_result_ is the next resolution result - // to be returned. - bool has_next_result_ = false; - Result next_result_; - // Result to use for the pretended re-resolution in - // RequestReresolutionLocked(). - bool has_reresolution_result_ = false; - Result reresolution_result_; - // True after the call to StartLocked(). - bool started_ = false; - // True after the call to ShutdownLocked(). - bool shutdown_ = false; - // if true, return failure - bool return_failure_ = false; - // pending re-resolution - bool reresolution_closure_pending_ = false; -}; +class FakeResolver; /// A mechanism for generating responses for the fake resolver. /// An instance of this class is passed to the fake resolver via a channel @@ -121,24 +81,6 @@ class FakeResolverResponseGenerator // Set the corresponding FakeResolver to this generator. void SetFakeResolver(RefCountedPtr resolver); - class ResponseSetter { - public: - explicit ResponseSetter(RefCountedPtr resolver, - Resolver::Result result) - : resolver_(std::move(resolver)), result_(result) {} - void set_has_result() { has_result_ = true; } - void reset_immediate() { immediate_ = false; } - void SetResponseLocked(); - void SetReresolutionResponseLocked(); - void SetFailureLocked(); - - private: - RefCountedPtr resolver_; - Resolver::Result result_; - bool has_result_ = false; - bool immediate_ = true; - }; - // Mutex protecting the members below. Mutex mu_; RefCountedPtr resolver_; diff --git a/src/core/ext/filters/client_channel/xds/xds_api.h b/src/core/ext/filters/client_channel/xds/xds_api.h index 516cf9e1a29..fe685b40df3 100644 --- a/src/core/ext/filters/client_channel/xds/xds_api.h +++ b/src/core/ext/filters/client_channel/xds/xds_api.h @@ -91,7 +91,7 @@ class XdsPriorityListUpdate { // There are two phases of accessing this class's content: // 1. to initialize in the control plane logical_thread; -// 2. to use in the data plane logical_thread. +// 2. to use in the data plane mutex. // So no additional synchronization is needed. class XdsDropConfig : public RefCounted { public: @@ -113,7 +113,7 @@ class XdsDropConfig : public RefCounted { DropCategory{std::move(name), parts_per_million}); } - // The only method invoked from the data plane logical_thread. + // The only method invoked from the data plane mutex. bool ShouldDrop(const grpc_core::UniquePtr** category_name) const; const DropCategoryList& drop_category_list() const { diff --git a/src/core/ext/filters/client_channel/xds/xds_client_stats.h b/src/core/ext/filters/client_channel/xds/xds_client_stats.h index e492a296b21..a1d915e03a4 100644 --- a/src/core/ext/filters/client_channel/xds/xds_client_stats.h +++ b/src/core/ext/filters/client_channel/xds/xds_client_stats.h @@ -140,7 +140,7 @@ class XdsClientStats { // Only be called from the control plane logical_thread. void RefByPicker() { picker_refcount_.FetchAdd(1, MemoryOrder::ACQ_REL); } // Might be called from the control plane logical_thread or the data plane - // logical_thread. + // mutex. // TODO(juanlishen): Once https://github.com/grpc/grpc/pull/19390 is merged, // this method will also only be invoked in the control plane // logical_thread. We may then be able to simplify the LocalityStats' @@ -220,7 +220,7 @@ class XdsClientStats { Atomic total_dropped_requests_{0}; // Protects dropped_requests_. A mutex is necessary because the length of // dropped_requests_ can be accessed by both the picker (from data plane - // logical_thread) and the load reporting thread (from the control plane + // mutex) and the load reporting thread (from the control plane // logical_thread). Mutex dropped_requests_mu_; DroppedRequestsMap dropped_requests_; diff --git a/src/core/lib/transport/connectivity_state.cc b/src/core/lib/transport/connectivity_state.cc index 7b10faa8d63..a370a645a55 100644 --- a/src/core/lib/transport/connectivity_state.cc +++ b/src/core/lib/transport/connectivity_state.cc @@ -59,10 +59,10 @@ class AsyncConnectivityStateWatcherInterface::Notifier { public: Notifier(RefCountedPtr watcher, grpc_connectivity_state state, - const RefCountedPtr& combiner) + const RefCountedPtr& logical_thread) : watcher_(std::move(watcher)), state_(state) { - if (combiner != nullptr) { - combiner->Run( + if (logical_thread != nullptr) { + logical_thread->Run( Closure::ToFunction( GRPC_CLOSURE_INIT(&closure_, SendNotification, this, nullptr), GRPC_ERROR_NONE), @@ -92,7 +92,7 @@ class AsyncConnectivityStateWatcherInterface::Notifier { void AsyncConnectivityStateWatcherInterface::Notify( grpc_connectivity_state state) { - new Notifier(Ref(), state, combiner_); // Deletes itself when done. + new Notifier(Ref(), state, logical_thread_); // Deletes itself when done. } // diff --git a/src/core/lib/transport/connectivity_state.h b/src/core/lib/transport/connectivity_state.h index c4220b5bd55..4eb053eb27e 100644 --- a/src/core/lib/transport/connectivity_state.h +++ b/src/core/lib/transport/connectivity_state.h @@ -72,14 +72,14 @@ class AsyncConnectivityStateWatcherInterface // If \a combiner is nullptr, then the notification will be scheduled on the // ExecCtx. explicit AsyncConnectivityStateWatcherInterface( - RefCountedPtr combiner = nullptr) - : combiner_(std::move(combiner)) {} + RefCountedPtr logical_thread = nullptr) + : logical_thread_(std::move(logical_thread)) {} // Invoked asynchronously when Notify() is called. virtual void OnConnectivityStateChange(grpc_connectivity_state new_state) = 0; private: - RefCountedPtr combiner_; + RefCountedPtr logical_thread_; }; // Tracks connectivity state. Maintains a list of watchers that are From 36bd748faa979a2f03c463c097932af462fbc555 Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Tue, 14 Jan 2020 23:46:31 -0800 Subject: [PATCH 052/758] Reviewer comments --- .../filters/client_channel/xds/xds_client.cc | 291 ++++++++---------- src/core/lib/transport/connectivity_state.cc | 7 +- .../resolvers/dns_resolver_cooldown_test.cc | 19 +- .../resolvers/dns_resolver_test.cc | 32 +- .../resolvers/sockaddr_resolver_test.cc | 48 ++- 5 files changed, 174 insertions(+), 223 deletions(-) diff --git a/src/core/ext/filters/client_channel/xds/xds_client.cc b/src/core/ext/filters/client_channel/xds/xds_client.cc index 12f8f8605ff..65a3e2d6779 100644 --- a/src/core/ext/filters/client_channel/xds/xds_client.cc +++ b/src/core/ext/filters/client_channel/xds/xds_client.cc @@ -93,7 +93,7 @@ class XdsClient::ChannelState::RetryableCall void StartNewCallLocked(); void StartRetryTimerLocked(); static void OnRetryTimer(void* arg, grpc_error* error); - static void OnRetryTimerLocked(void* arg, grpc_error* error); + void OnRetryTimerLocked(grpc_error* error); // The wrapped xds call that talks to the xds server. It's instantiated // every time we start a new call. It's null during call retry backoff. @@ -128,8 +128,8 @@ class XdsClient::ChannelState::AdsCallState private: static void OnResponseReceived(void* arg, grpc_error* error); static void OnStatusReceived(void* arg, grpc_error* error); - static void OnResponseReceivedLocked(void* arg, grpc_error* error); - static void OnStatusReceivedLocked(void* arg, grpc_error* error); + void OnResponseReceivedLocked(); + void OnStatusReceivedLocked(grpc_error* error); bool IsCurrentCallOnChannel() const; @@ -180,6 +180,10 @@ class XdsClient::ChannelState::LrsCallState public: Reporter(RefCountedPtr parent, grpc_millis report_interval) : parent_(std::move(parent)), report_interval_(report_interval) { + GRPC_CLOSURE_INIT(&on_next_report_timer_, OnNextReportTimer, this, + grpc_schedule_on_exec_ctx); + GRPC_CLOSURE_INIT(&on_report_done_, OnReportDone, this, + grpc_schedule_on_exec_ctx); ScheduleNextReportLocked(); } @@ -188,10 +192,10 @@ class XdsClient::ChannelState::LrsCallState private: void ScheduleNextReportLocked(); static void OnNextReportTimer(void* arg, grpc_error* error); - static void OnNextReportTimerLocked(void* arg, grpc_error* error); + void OnNextReportTimerLocked(grpc_error* error); void SendReportLocked(); static void OnReportDone(void* arg, grpc_error* error); - static void OnReportDoneLocked(void* arg, grpc_error* error); + void OnReportDoneLocked(grpc_error* error); bool IsCurrentReporterOnCall() const { return this == parent_->reporter_.get(); @@ -213,9 +217,9 @@ class XdsClient::ChannelState::LrsCallState static void OnInitialRequestSent(void* arg, grpc_error* error); static void OnResponseReceived(void* arg, grpc_error* error); static void OnStatusReceived(void* arg, grpc_error* error); - static void OnInitialRequestSentLocked(void* arg, grpc_error* error); - static void OnResponseReceivedLocked(void* arg, grpc_error* error); - static void OnStatusReceivedLocked(void* arg, grpc_error* error); + void OnInitialRequestSentLocked(); + void OnResponseReceivedLocked(); + void OnStatusReceivedLocked(grpc_error* error); bool IsCurrentCallOnChannel() const; @@ -425,6 +429,9 @@ XdsClient::ChannelState::RetryableCall::RetryableCall( .set_multiplier(GRPC_XDS_RECONNECT_BACKOFF_MULTIPLIER) .set_jitter(GRPC_XDS_RECONNECT_JITTER) .set_max_backoff(GRPC_XDS_RECONNECT_MAX_BACKOFF_SECONDS * 1000)) { + // Closure Initialization + GRPC_CLOSURE_INIT(&on_retry_timer_, OnRetryTimer, this, + grpc_schedule_on_exec_ctx); StartNewCallLocked(); } @@ -478,8 +485,6 @@ void XdsClient::ChannelState::RetryableCall::StartRetryTimerLocked() { chand()->xds_client(), chand(), timeout); } this->Ref(DEBUG_LOCATION, "RetryableCall+retry_timer_start").release(); - GRPC_CLOSURE_INIT(&on_retry_timer_, OnRetryTimer, this, - grpc_schedule_on_exec_ctx); grpc_timer_init(&retry_timer_, next_attempt_time, &on_retry_timer_); retry_timer_callback_pending_ = true; } @@ -488,28 +493,26 @@ template void XdsClient::ChannelState::RetryableCall::OnRetryTimer( void* arg, grpc_error* error) { RetryableCall* calld = static_cast(arg); + GRPC_ERROR_REF(error); // ref owned by lambda calld->chand_->xds_client()->logical_thread_->Run( - Closure::ToFunction(GRPC_CLOSURE_INIT(&calld->on_retry_timer_, - OnRetryTimerLocked, calld, nullptr), - GRPC_ERROR_REF(error)), - DEBUG_LOCATION); + [calld, error]() { calld->OnRetryTimerLocked(error); }, DEBUG_LOCATION); } template void XdsClient::ChannelState::RetryableCall::OnRetryTimerLocked( - void* arg, grpc_error* error) { - RetryableCall* calld = static_cast(arg); - calld->retry_timer_callback_pending_ = false; - if (!calld->shutting_down_ && error == GRPC_ERROR_NONE) { + grpc_error* error) { + retry_timer_callback_pending_ = false; + if (!shutting_down_ && error == GRPC_ERROR_NONE) { if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) { gpr_log( GPR_INFO, "[xds_client %p] Retry timer fires (chand: %p, retryable call: %p)", - calld->chand()->xds_client(), calld->chand(), calld); + chand()->xds_client(), chand(), this); } - calld->StartNewCallLocked(); + StartNewCallLocked(); } - calld->Unref(DEBUG_LOCATION, "RetryableCall+retry_timer_done"); + this->Unref(DEBUG_LOCATION, "RetryableCall+retry_timer_done"); + GRPC_ERROR_UNREF(error); } // @@ -632,33 +635,25 @@ void XdsClient::ChannelState::AdsCallState::Orphan() { } void XdsClient::ChannelState::AdsCallState::OnResponseReceived( - void* arg, grpc_error* error) { + void* arg, grpc_error* /*error*/) { AdsCallState* ads_calld = static_cast(arg); ads_calld->xds_client()->logical_thread_->Run( - Closure::ToFunction( - GRPC_CLOSURE_INIT(&ads_calld->on_response_received_, - OnResponseReceivedLocked, ads_calld, nullptr), - GRPC_ERROR_REF(error)), - DEBUG_LOCATION); + [ads_calld]() { ads_calld->OnResponseReceivedLocked(); }, DEBUG_LOCATION); } -void XdsClient::ChannelState::AdsCallState::OnResponseReceivedLocked( - void* arg, grpc_error* /*error*/) { - AdsCallState* ads_calld = static_cast(arg); - XdsClient* xds_client = ads_calld->xds_client(); +void XdsClient::ChannelState::AdsCallState::OnResponseReceivedLocked() { // Empty payload means the call was cancelled. - if (!ads_calld->IsCurrentCallOnChannel() || - ads_calld->recv_message_payload_ == nullptr) { - ads_calld->Unref(DEBUG_LOCATION, "ADS+OnResponseReceivedLocked"); + if (!IsCurrentCallOnChannel() || recv_message_payload_ == nullptr) { + Unref(DEBUG_LOCATION, "ADS+OnResponseReceivedLocked"); return; } // Read the response. grpc_byte_buffer_reader bbr; - grpc_byte_buffer_reader_init(&bbr, ads_calld->recv_message_payload_); + grpc_byte_buffer_reader_init(&bbr, recv_message_payload_); grpc_slice response_slice = grpc_byte_buffer_reader_readall(&bbr); grpc_byte_buffer_reader_destroy(&bbr); - grpc_byte_buffer_destroy(ads_calld->recv_message_payload_); - ads_calld->recv_message_payload_ = nullptr; + grpc_byte_buffer_destroy(recv_message_payload_); + recv_message_payload_ = nullptr; // TODO(juanlishen): When we convert this to use the xds protocol, the // balancer will send us a fallback timeout such that we should go into // fallback mode if we have lost contact with the balancer after a certain @@ -676,7 +671,7 @@ void XdsClient::ChannelState::AdsCallState::OnResponseReceivedLocked( if (parse_error != GRPC_ERROR_NONE) { gpr_log(GPR_ERROR, "[xds_client %p] ADS response parsing failed. error=%s", - xds_client, grpc_error_string(parse_error)); + xds_client(), grpc_error_string(parse_error)); GRPC_ERROR_UNREF(parse_error); return; } @@ -686,17 +681,17 @@ void XdsClient::ChannelState::AdsCallState::OnResponseReceivedLocked( gpr_log(GPR_ERROR, "[xds_client %p] ADS response '%s' doesn't contain any valid " "locality but doesn't require to drop all calls. Ignoring.", - xds_client, response_slice_str); + xds_client(), response_slice_str); gpr_free(response_slice_str); return; } - ads_calld->seen_response_ = true; + seen_response_ = true; if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) { gpr_log(GPR_INFO, "[xds_client %p] ADS response with %" PRIuPTR " priorities and %" PRIuPTR " drop categories received (drop_all=%d)", - xds_client, update.priority_list_update.size(), + xds_client(), update.priority_list_update.size(), update.drop_config->drop_category_list().size(), update.drop_all); for (size_t priority = 0; priority < update.priority_list_update.size(); ++priority) { @@ -705,14 +700,14 @@ void XdsClient::ChannelState::AdsCallState::OnResponseReceivedLocked( gpr_log(GPR_INFO, "[xds_client %p] Priority %" PRIuPTR " contains %" PRIuPTR " localities", - xds_client, priority, locality_map_update->size()); + xds_client(), priority, locality_map_update->size()); size_t locality_count = 0; for (const auto& p : locality_map_update->localities) { const auto& locality = p.second; gpr_log(GPR_INFO, "[xds_client %p] Priority %" PRIuPTR ", locality %" PRIuPTR " %s contains %" PRIuPTR " server addresses", - xds_client, priority, locality_count, + xds_client(), priority, locality_count, locality.name->AsHumanReadableString(), locality.serverlist.size()); for (size_t i = 0; i < locality.serverlist.size(); ++i) { @@ -722,7 +717,7 @@ void XdsClient::ChannelState::AdsCallState::OnResponseReceivedLocked( gpr_log(GPR_INFO, "[xds_client %p] Priority %" PRIuPTR ", locality %" PRIuPTR " %s, server address %" PRIuPTR ": %s", - xds_client, priority, locality_count, + xds_client(), priority, locality_count, locality.name->AsHumanReadableString(), i, ipport); gpr_free(ipport); } @@ -735,18 +730,18 @@ void XdsClient::ChannelState::AdsCallState::OnResponseReceivedLocked( update.drop_config->drop_category_list()[i]; gpr_log(GPR_INFO, "[xds_client %p] Drop category %s has drop rate %d per million", - xds_client, drop_category.name.get(), + xds_client(), drop_category.name.get(), drop_category.parts_per_million); } } // Start load reporting if needed. - auto& lrs_call = ads_calld->chand()->lrs_calld_; + auto& lrs_call = chand()->lrs_calld_; if (lrs_call != nullptr) { LrsCallState* lrs_calld = lrs_call->calld(); if (lrs_calld != nullptr) lrs_calld->MaybeStartReportingLocked(); } // Ignore identical update. - const EdsUpdate& prev_update = xds_client->cluster_state_.eds_update; + const EdsUpdate& prev_update = xds_client()->cluster_state_.eds_update; const bool priority_list_changed = prev_update.priority_list_update != update.priority_list_update; const bool drop_config_changed = @@ -756,12 +751,12 @@ void XdsClient::ChannelState::AdsCallState::OnResponseReceivedLocked( if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) { gpr_log(GPR_INFO, "[xds_client %p] EDS update identical to current, ignoring.", - xds_client); + xds_client()); } return; } // Update the cluster state. - ClusterState& cluster_state = xds_client->cluster_state_; + ClusterState& cluster_state = xds_client()->cluster_state_; cluster_state.eds_update = std::move(update); // Notify all watchers. for (const auto& p : cluster_state.endpoint_watchers) { @@ -769,61 +764,54 @@ void XdsClient::ChannelState::AdsCallState::OnResponseReceivedLocked( } }(); grpc_slice_unref_internal(response_slice); - if (xds_client->shutting_down_) { - ads_calld->Unref(DEBUG_LOCATION, - "ADS+OnResponseReceivedLocked+xds_shutdown"); + if (xds_client()->shutting_down_) { + Unref(DEBUG_LOCATION, "ADS+OnResponseReceivedLocked+xds_shutdown"); return; } // Keep listening for serverlist updates. grpc_op op; memset(&op, 0, sizeof(op)); op.op = GRPC_OP_RECV_MESSAGE; - op.data.recv_message.recv_message = &ads_calld->recv_message_payload_; + op.data.recv_message.recv_message = &recv_message_payload_; op.flags = 0; op.reserved = nullptr; - GPR_ASSERT(ads_calld->call_ != nullptr); + GPR_ASSERT(call_ != nullptr); // Reuse the "ADS+OnResponseReceivedLocked" ref taken in ctor. - GRPC_CLOSURE_INIT(&ads_calld->on_response_received_, OnResponseReceived, - ads_calld, grpc_schedule_on_exec_ctx); - const grpc_call_error call_error = grpc_call_start_batch_and_execute( - ads_calld->call_, &op, 1, &ads_calld->on_response_received_); + const grpc_call_error call_error = + grpc_call_start_batch_and_execute(call_, &op, 1, &on_response_received_); GPR_ASSERT(GRPC_CALL_OK == call_error); } void XdsClient::ChannelState::AdsCallState::OnStatusReceived( void* arg, grpc_error* error) { AdsCallState* ads_calld = static_cast(arg); + GRPC_ERROR_REF(error); // ref owned by lambda ads_calld->xds_client()->logical_thread_->Run( - Closure::ToFunction( - GRPC_CLOSURE_INIT(&ads_calld->on_status_received_, - OnStatusReceivedLocked, ads_calld, nullptr), - GRPC_ERROR_REF(error)), + [ads_calld, error]() { ads_calld->OnStatusReceivedLocked(error); }, DEBUG_LOCATION); } void XdsClient::ChannelState::AdsCallState::OnStatusReceivedLocked( - void* arg, grpc_error* error) { - AdsCallState* ads_calld = static_cast(arg); - ChannelState* chand = ads_calld->chand(); - XdsClient* xds_client = ads_calld->xds_client(); + grpc_error* error) { if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) { - char* status_details = grpc_slice_to_c_string(ads_calld->status_details_); + char* status_details = grpc_slice_to_c_string(status_details_); gpr_log(GPR_INFO, "[xds_client %p] ADS call status received. Status = %d, details " "= '%s', (chand: %p, ads_calld: %p, call: %p), error '%s'", - xds_client, ads_calld->status_code_, status_details, chand, - ads_calld, ads_calld->call_, grpc_error_string(error)); + xds_client(), status_code_, status_details, chand(), this, call_, + grpc_error_string(error)); gpr_free(status_details); } // Ignore status from a stale call. - if (ads_calld->IsCurrentCallOnChannel()) { + if (IsCurrentCallOnChannel()) { // Try to restart the call. - ads_calld->parent_->OnCallFinishedLocked(); + parent_->OnCallFinishedLocked(); // Send error to all watchers. - xds_client->NotifyOnError( + xds_client()->NotifyOnError( GRPC_ERROR_CREATE_FROM_STATIC_STRING("xds call failed")); } - ads_calld->Unref(DEBUG_LOCATION, "ADS+OnStatusReceivedLocked"); + Unref(DEBUG_LOCATION, "ADS+OnStatusReceivedLocked"); + GRPC_ERROR_UNREF(error); } bool XdsClient::ChannelState::AdsCallState::IsCurrentCallOnChannel() const { @@ -846,8 +834,6 @@ void XdsClient::ChannelState::LrsCallState::Reporter::Orphan() { void XdsClient::ChannelState::LrsCallState::Reporter:: ScheduleNextReportLocked() { const grpc_millis next_report_time = ExecCtx::Get()->Now() + report_interval_; - GRPC_CLOSURE_INIT(&on_next_report_timer_, OnNextReportTimer, this, - grpc_schedule_on_exec_ctx); grpc_timer_init(&next_report_timer_, next_report_time, &on_next_report_timer_); next_report_timer_callback_pending_ = true; @@ -856,23 +842,22 @@ void XdsClient::ChannelState::LrsCallState::Reporter:: void XdsClient::ChannelState::LrsCallState::Reporter::OnNextReportTimer( void* arg, grpc_error* error) { Reporter* self = static_cast(arg); + GRPC_ERROR_REF(error); // ref owned by lambda self->xds_client()->logical_thread_->Run( - Closure::ToFunction( - GRPC_CLOSURE_INIT(&self->on_next_report_timer_, - OnNextReportTimerLocked, self, nullptr), - GRPC_ERROR_REF(error)), + [self, error]() { self->OnNextReportTimerLocked(error); }, DEBUG_LOCATION); } void XdsClient::ChannelState::LrsCallState::Reporter::OnNextReportTimerLocked( - void* arg, grpc_error* error) { - Reporter* self = static_cast(arg); - self->next_report_timer_callback_pending_ = false; - if (error != GRPC_ERROR_NONE || !self->IsCurrentReporterOnCall()) { - self->Unref(DEBUG_LOCATION, "Reporter+timer"); + grpc_error* error) { + next_report_timer_callback_pending_ = false; + if (error != GRPC_ERROR_NONE || !IsCurrentReporterOnCall()) { + Unref(DEBUG_LOCATION, "Reporter+timer"); + GRPC_ERROR_UNREF(error); return; } - self->SendReportLocked(); + SendReportLocked(); + GRPC_ERROR_UNREF(error); } void XdsClient::ChannelState::LrsCallState::Reporter::SendReportLocked() { @@ -903,8 +888,6 @@ void XdsClient::ChannelState::LrsCallState::Reporter::SendReportLocked() { memset(&op, 0, sizeof(op)); op.op = GRPC_OP_SEND_MESSAGE; op.data.send_message.send_message = parent_->send_message_payload_; - GRPC_CLOSURE_INIT(&on_report_done_, OnReportDone, this, - grpc_schedule_on_exec_ctx); grpc_call_error call_error = grpc_call_start_batch_and_execute( parent_->call_, &op, 1, &on_report_done_); if (GPR_UNLIKELY(call_error != GRPC_CALL_OK)) { @@ -918,28 +901,27 @@ void XdsClient::ChannelState::LrsCallState::Reporter::SendReportLocked() { void XdsClient::ChannelState::LrsCallState::Reporter::OnReportDone( void* arg, grpc_error* error) { Reporter* self = static_cast(arg); + GRPC_ERROR_REF(error); // ref owned by lambda self->xds_client()->logical_thread_->Run( - Closure::ToFunction(GRPC_CLOSURE_INIT(&self->on_report_done_, - OnReportDoneLocked, self, nullptr), - GRPC_ERROR_REF(error)), - DEBUG_LOCATION); + [self, error]() { self->OnReportDoneLocked(error); }, DEBUG_LOCATION); } void XdsClient::ChannelState::LrsCallState::Reporter::OnReportDoneLocked( - void* arg, grpc_error* error) { - Reporter* self = static_cast(arg); - grpc_byte_buffer_destroy(self->parent_->send_message_payload_); - self->parent_->send_message_payload_ = nullptr; - if (error != GRPC_ERROR_NONE || !self->IsCurrentReporterOnCall()) { + grpc_error* error) { + grpc_byte_buffer_destroy(parent_->send_message_payload_); + parent_->send_message_payload_ = nullptr; + if (error != GRPC_ERROR_NONE || !IsCurrentReporterOnCall()) { // If this reporter is no longer the current one on the call, the reason // might be that it was orphaned for a new one due to config update. - if (!self->IsCurrentReporterOnCall()) { - self->parent_->MaybeStartReportingLocked(); + if (!IsCurrentReporterOnCall()) { + parent_->MaybeStartReportingLocked(); } - self->Unref(DEBUG_LOCATION, "Reporter+report_done"); + Unref(DEBUG_LOCATION, "Reporter+report_done"); + GRPC_ERROR_UNREF(error); return; } - self->ScheduleNextReportLocked(); + ScheduleNextReportLocked(); + GRPC_ERROR_UNREF(error); } // @@ -1086,54 +1068,41 @@ void XdsClient::ChannelState::LrsCallState::MaybeStartReportingLocked() { } void XdsClient::ChannelState::LrsCallState::OnInitialRequestSent( - void* arg, grpc_error* error) { + void* arg, grpc_error* /*error*/) { LrsCallState* lrs_calld = static_cast(arg); lrs_calld->xds_client()->logical_thread_->Run( - Closure::ToFunction( - GRPC_CLOSURE_INIT(&lrs_calld->on_initial_request_sent_, - OnInitialRequestSentLocked, lrs_calld, nullptr), - GRPC_ERROR_REF(error)), + [lrs_calld]() { lrs_calld->OnInitialRequestSentLocked(); }, DEBUG_LOCATION); } -void XdsClient::ChannelState::LrsCallState::OnInitialRequestSentLocked( - void* arg, grpc_error* /*error*/) { - LrsCallState* lrs_calld = static_cast(arg); +void XdsClient::ChannelState::LrsCallState::OnInitialRequestSentLocked() { // Clear the send_message_payload_. - grpc_byte_buffer_destroy(lrs_calld->send_message_payload_); - lrs_calld->send_message_payload_ = nullptr; - lrs_calld->MaybeStartReportingLocked(); - lrs_calld->Unref(DEBUG_LOCATION, "LRS+OnInitialRequestSentLocked"); + grpc_byte_buffer_destroy(send_message_payload_); + send_message_payload_ = nullptr; + MaybeStartReportingLocked(); + Unref(DEBUG_LOCATION, "LRS+OnInitialRequestSentLocked"); } void XdsClient::ChannelState::LrsCallState::OnResponseReceived( - void* arg, grpc_error* error) { + void* arg, grpc_error* /*error*/) { LrsCallState* lrs_calld = static_cast(arg); lrs_calld->xds_client()->logical_thread_->Run( - Closure::ToFunction( - GRPC_CLOSURE_INIT(&lrs_calld->on_response_received_, - OnResponseReceivedLocked, lrs_calld, nullptr), - GRPC_ERROR_REF(error)), - DEBUG_LOCATION); + [lrs_calld]() { lrs_calld->OnResponseReceivedLocked(); }, DEBUG_LOCATION); } -void XdsClient::ChannelState::LrsCallState::OnResponseReceivedLocked( - void* arg, grpc_error* /*error*/) { - LrsCallState* lrs_calld = static_cast(arg); - XdsClient* xds_client = lrs_calld->xds_client(); +void XdsClient::ChannelState::LrsCallState::OnResponseReceivedLocked() { // Empty payload means the call was cancelled. - if (!lrs_calld->IsCurrentCallOnChannel() || - lrs_calld->recv_message_payload_ == nullptr) { - lrs_calld->Unref(DEBUG_LOCATION, "LRS+OnResponseReceivedLocked"); + if (!IsCurrentCallOnChannel() || recv_message_payload_ == nullptr) { + Unref(DEBUG_LOCATION, "LRS+OnResponseReceivedLocked"); return; } // Read the response. grpc_byte_buffer_reader bbr; - grpc_byte_buffer_reader_init(&bbr, lrs_calld->recv_message_payload_); + grpc_byte_buffer_reader_init(&bbr, recv_message_payload_); grpc_slice response_slice = grpc_byte_buffer_reader_readall(&bbr); grpc_byte_buffer_reader_destroy(&bbr); - grpc_byte_buffer_destroy(lrs_calld->recv_message_payload_); - lrs_calld->recv_message_payload_ = nullptr; + grpc_byte_buffer_destroy(recv_message_payload_); + recv_message_payload_ = nullptr; // This anonymous lambda is a hack to avoid the usage of goto. [&]() { // Parse the response. @@ -1144,16 +1113,17 @@ void XdsClient::ChannelState::LrsCallState::OnResponseReceivedLocked( if (parse_error != GRPC_ERROR_NONE) { gpr_log(GPR_ERROR, "[xds_client %p] LRS response parsing failed. error=%s", - xds_client, grpc_error_string(parse_error)); + xds_client(), grpc_error_string(parse_error)); GRPC_ERROR_UNREF(parse_error); return; } - lrs_calld->seen_response_ = true; + seen_response_ = true; if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) { gpr_log(GPR_INFO, "[xds_client %p] LRS response received, cluster_name=%s, " "load_report_interval=%" PRId64 "ms", - xds_client, new_cluster_name.get(), new_load_reporting_interval); + xds_client(), new_cluster_name.get(), + new_load_reporting_interval); } if (new_load_reporting_interval < GRPC_XDS_MIN_CLIENT_LOAD_REPORTING_INTERVAL_MS) { @@ -1163,83 +1133,76 @@ void XdsClient::ChannelState::LrsCallState::OnResponseReceivedLocked( gpr_log(GPR_INFO, "[xds_client %p] Increased load_report_interval to minimum " "value %dms", - xds_client, GRPC_XDS_MIN_CLIENT_LOAD_REPORTING_INTERVAL_MS); + xds_client(), GRPC_XDS_MIN_CLIENT_LOAD_REPORTING_INTERVAL_MS); } } // Ignore identical update. - if (lrs_calld->load_reporting_interval_ == new_load_reporting_interval && - strcmp(lrs_calld->cluster_name_.get(), new_cluster_name.get()) == 0) { + if (load_reporting_interval_ == new_load_reporting_interval && + strcmp(cluster_name_.get(), new_cluster_name.get()) == 0) { if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) { gpr_log(GPR_INFO, "[xds_client %p] Incoming LRS response identical to current, " "ignoring.", - xds_client); + xds_client()); } return; } // Stop current load reporting (if any) to adopt the new config. - lrs_calld->reporter_.reset(); + reporter_.reset(); // Record the new config. - lrs_calld->cluster_name_ = std::move(new_cluster_name); - lrs_calld->load_reporting_interval_ = new_load_reporting_interval; + cluster_name_ = std::move(new_cluster_name); + load_reporting_interval_ = new_load_reporting_interval; // Try starting sending load report. - lrs_calld->MaybeStartReportingLocked(); + MaybeStartReportingLocked(); }(); grpc_slice_unref_internal(response_slice); - if (xds_client->shutting_down_) { - lrs_calld->Unref(DEBUG_LOCATION, - "LRS+OnResponseReceivedLocked+xds_shutdown"); + if (xds_client()->shutting_down_) { + Unref(DEBUG_LOCATION, "LRS+OnResponseReceivedLocked+xds_shutdown"); return; } // Keep listening for LRS config updates. grpc_op op; memset(&op, 0, sizeof(op)); op.op = GRPC_OP_RECV_MESSAGE; - op.data.recv_message.recv_message = &lrs_calld->recv_message_payload_; + op.data.recv_message.recv_message = &recv_message_payload_; op.flags = 0; op.reserved = nullptr; - GPR_ASSERT(lrs_calld->call_ != nullptr); + GPR_ASSERT(call_ != nullptr); // Reuse the "OnResponseReceivedLocked" ref taken in ctor. - GRPC_CLOSURE_INIT(&lrs_calld->on_response_received_, OnResponseReceived, - lrs_calld, grpc_schedule_on_exec_ctx); - const grpc_call_error call_error = grpc_call_start_batch_and_execute( - lrs_calld->call_, &op, 1, &lrs_calld->on_response_received_); + const grpc_call_error call_error = + grpc_call_start_batch_and_execute(call_, &op, 1, &on_response_received_); GPR_ASSERT(GRPC_CALL_OK == call_error); } void XdsClient::ChannelState::LrsCallState::OnStatusReceived( void* arg, grpc_error* error) { LrsCallState* lrs_calld = static_cast(arg); + GRPC_ERROR_REF(error); // ref owned by lambda lrs_calld->xds_client()->logical_thread_->Run( - Closure::ToFunction( - GRPC_CLOSURE_INIT(&lrs_calld->on_status_received_, - OnStatusReceivedLocked, lrs_calld, nullptr), - GRPC_ERROR_REF(error)), + [lrs_calld, error]() { lrs_calld->OnStatusReceivedLocked(error); }, DEBUG_LOCATION); } void XdsClient::ChannelState::LrsCallState::OnStatusReceivedLocked( - void* arg, grpc_error* error) { - LrsCallState* lrs_calld = static_cast(arg); - XdsClient* xds_client = lrs_calld->xds_client(); - ChannelState* chand = lrs_calld->chand(); - GPR_ASSERT(lrs_calld->call_ != nullptr); + grpc_error* error) { + GPR_ASSERT(call_ != nullptr); if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) { - char* status_details = grpc_slice_to_c_string(lrs_calld->status_details_); + char* status_details = grpc_slice_to_c_string(status_details_); gpr_log(GPR_INFO, "[xds_client %p] LRS call status received. Status = %d, details " "= '%s', (chand: %p, calld: %p, call: %p), error '%s'", - xds_client, lrs_calld->status_code_, status_details, chand, - lrs_calld, lrs_calld->call_, grpc_error_string(error)); + xds_client(), status_code_, status_details, chand(), this, call_, + grpc_error_string(error)); gpr_free(status_details); } // Ignore status from a stale call. - if (lrs_calld->IsCurrentCallOnChannel()) { - GPR_ASSERT(!xds_client->shutting_down_); + if (IsCurrentCallOnChannel()) { + GPR_ASSERT(!xds_client()->shutting_down_); // Try to restart the call. - lrs_calld->parent_->OnCallFinishedLocked(); + parent_->OnCallFinishedLocked(); } - lrs_calld->Unref(DEBUG_LOCATION, "LRS+OnStatusReceivedLocked"); + Unref(DEBUG_LOCATION, "LRS+OnStatusReceivedLocked"); + GRPC_ERROR_UNREF(error); } bool XdsClient::ChannelState::LrsCallState::IsCurrentCallOnChannel() const { diff --git a/src/core/lib/transport/connectivity_state.cc b/src/core/lib/transport/connectivity_state.cc index a370a645a55..b1507391a06 100644 --- a/src/core/lib/transport/connectivity_state.cc +++ b/src/core/lib/transport/connectivity_state.cc @@ -62,11 +62,8 @@ class AsyncConnectivityStateWatcherInterface::Notifier { const RefCountedPtr& logical_thread) : watcher_(std::move(watcher)), state_(state) { if (logical_thread != nullptr) { - logical_thread->Run( - Closure::ToFunction( - GRPC_CLOSURE_INIT(&closure_, SendNotification, this, nullptr), - GRPC_ERROR_NONE), - DEBUG_LOCATION); + logical_thread->Run([this]() { SendNotification(this, GRPC_ERROR_NONE); }, + DEBUG_LOCATION); } else { GRPC_CLOSURE_INIT(&closure_, SendNotification, this, grpc_schedule_on_exec_ctx); diff --git a/test/core/client_channel/resolvers/dns_resolver_cooldown_test.cc b/test/core/client_channel/resolvers/dns_resolver_cooldown_test.cc index cac30472760..9bf218c8ad8 100644 --- a/test/core/client_channel/resolvers/dns_resolver_cooldown_test.cc +++ b/test/core/client_channel/resolvers/dns_resolver_cooldown_test.cc @@ -320,19 +320,16 @@ int main(int argc, char** argv) { grpc::testing::TestEnvironment env(argc, argv); grpc_init(); - { - grpc_core::ExecCtx exec_ctx; - auto logical_thread = grpc_core::MakeRefCounted(); - g_logical_thread = &logical_thread; + auto logical_thread = grpc_core::MakeRefCounted(); + g_logical_thread = &logical_thread; - g_default_dns_lookup_ares_locked = grpc_dns_lookup_ares_locked; - grpc_dns_lookup_ares_locked = test_dns_lookup_ares_locked; - default_resolve_address = grpc_resolve_address_impl; - grpc_set_resolver_impl(&test_resolver); + g_default_dns_lookup_ares_locked = grpc_dns_lookup_ares_locked; + grpc_dns_lookup_ares_locked = test_dns_lookup_ares_locked; + default_resolve_address = grpc_resolve_address_impl; + grpc_set_resolver_impl(&test_resolver); + + test_cooldown(); - test_cooldown(); - grpc_core::ExecCtx::Get()->Flush(); - } grpc_shutdown_blocking(); GPR_ASSERT(g_all_callbacks_invoked); return 0; diff --git a/test/core/client_channel/resolvers/dns_resolver_test.cc b/test/core/client_channel/resolvers/dns_resolver_test.cc index 8ee63f303dc..d2b01bf435e 100644 --- a/test/core/client_channel/resolvers/dns_resolver_test.cc +++ b/test/core/client_channel/resolvers/dns_resolver_test.cc @@ -73,26 +73,22 @@ int main(int argc, char** argv) { grpc::testing::TestEnvironment env(argc, argv); grpc_init(); { - grpc_core::ExecCtx exec_ctx; - { - auto logical_thread = - grpc_core::MakeRefCounted(); - g_logical_thread = &logical_thread; + auto logical_thread = grpc_core::MakeRefCounted(); + g_logical_thread = &logical_thread; - grpc_core::ResolverFactory* dns = - grpc_core::ResolverRegistry::LookupResolverFactory("dns"); + grpc_core::ResolverFactory* dns = + grpc_core::ResolverRegistry::LookupResolverFactory("dns"); - test_succeeds(dns, "dns:10.2.1.1"); - test_succeeds(dns, "dns:10.2.1.1:1234"); - test_succeeds(dns, "dns:www.google.com"); - test_succeeds(dns, "dns:///www.google.com"); - grpc_core::UniquePtr resolver = - GPR_GLOBAL_CONFIG_GET(grpc_dns_resolver); - if (gpr_stricmp(resolver.get(), "native") == 0) { - test_fails(dns, "dns://8.8.8.8/8.8.8.8:8888"); - } else { - test_succeeds(dns, "dns://8.8.8.8/8.8.8.8:8888"); - } + test_succeeds(dns, "dns:10.2.1.1"); + test_succeeds(dns, "dns:10.2.1.1:1234"); + test_succeeds(dns, "dns:www.google.com"); + test_succeeds(dns, "dns:///www.google.com"); + grpc_core::UniquePtr resolver = + GPR_GLOBAL_CONFIG_GET(grpc_dns_resolver); + if (gpr_stricmp(resolver.get(), "native") == 0) { + test_fails(dns, "dns://8.8.8.8/8.8.8.8:8888"); + } else { + test_succeeds(dns, "dns://8.8.8.8/8.8.8.8:8888"); } } grpc_shutdown(); diff --git a/test/core/client_channel/resolvers/sockaddr_resolver_test.cc b/test/core/client_channel/resolvers/sockaddr_resolver_test.cc index be17de306b9..7ce2ad9c247 100644 --- a/test/core/client_channel/resolvers/sockaddr_resolver_test.cc +++ b/test/core/client_channel/resolvers/sockaddr_resolver_test.cc @@ -78,31 +78,29 @@ static void test_fails(grpc_core::ResolverFactory* factory, int main(int argc, char** argv) { grpc::testing::TestEnvironment env(argc, argv); grpc_init(); - { - grpc_core::ExecCtx exec_ctx; - auto logical_thread = grpc_core::MakeRefCounted(); - g_logical_thread = &logical_thread; - - grpc_core::ResolverFactory* ipv4 = - grpc_core::ResolverRegistry::LookupResolverFactory("ipv4"); - grpc_core::ResolverFactory* ipv6 = - grpc_core::ResolverRegistry::LookupResolverFactory("ipv6"); - - test_fails(ipv4, "ipv4:10.2.1.1"); - test_succeeds(ipv4, "ipv4:10.2.1.1:1234"); - test_succeeds(ipv4, "ipv4:10.2.1.1:1234,127.0.0.1:4321"); - test_fails(ipv4, "ipv4:10.2.1.1:123456"); - test_fails(ipv4, "ipv4:www.google.com"); - test_fails(ipv4, "ipv4:["); - test_fails(ipv4, "ipv4://8.8.8.8/8.8.8.8:8888"); - - test_fails(ipv6, "ipv6:["); - test_fails(ipv6, "ipv6:[::]"); - test_succeeds(ipv6, "ipv6:[::]:1234"); - test_fails(ipv6, "ipv6:[::]:123456"); - test_fails(ipv6, "ipv6:www.google.com"); - grpc_core::ExecCtx::Get()->Flush(); - } + + auto logical_thread = grpc_core::MakeRefCounted(); + g_logical_thread = &logical_thread; + + grpc_core::ResolverFactory* ipv4 = + grpc_core::ResolverRegistry::LookupResolverFactory("ipv4"); + grpc_core::ResolverFactory* ipv6 = + grpc_core::ResolverRegistry::LookupResolverFactory("ipv6"); + + test_fails(ipv4, "ipv4:10.2.1.1"); + test_succeeds(ipv4, "ipv4:10.2.1.1:1234"); + test_succeeds(ipv4, "ipv4:10.2.1.1:1234,127.0.0.1:4321"); + test_fails(ipv4, "ipv4:10.2.1.1:123456"); + test_fails(ipv4, "ipv4:www.google.com"); + test_fails(ipv4, "ipv4:["); + test_fails(ipv4, "ipv4://8.8.8.8/8.8.8.8:8888"); + + test_fails(ipv6, "ipv6:["); + test_fails(ipv6, "ipv6:[::]"); + test_succeeds(ipv6, "ipv6:[::]:1234"); + test_fails(ipv6, "ipv6:[::]:123456"); + test_fails(ipv6, "ipv6:www.google.com"); + grpc_shutdown(); return 0; From 957f0390df654b5841f92a742ab4252bd47ad1d3 Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Thu, 6 Feb 2020 15:28:13 -0800 Subject: [PATCH 053/758] Reviewer comments --- .../filters/client_channel/client_channel.cc | 78 +++++---- .../ext/filters/client_channel/lb_policy.cc | 30 ++-- .../ext/filters/client_channel/lb_policy.h | 18 +- .../client_channel/lb_policy/grpclb/grpclb.cc | 22 +-- .../client_channel/lb_policy/xds/cds.cc | 2 +- .../client_channel/lb_policy/xds/xds.cc | 59 ++++--- .../ext/filters/client_channel/resolver.cc | 4 +- .../ext/filters/client_channel/resolver.h | 15 +- .../resolver/dns/c_ares/dns_resolver_ares.cc | 26 +-- .../dns/c_ares/grpc_ares_ev_driver.cc | 20 +-- .../resolver/dns/c_ares/grpc_ares_ev_driver.h | 6 +- .../dns/c_ares/grpc_ares_ev_driver_libuv.cc | 18 +- .../dns/c_ares/grpc_ares_ev_driver_posix.cc | 4 +- .../dns/c_ares/grpc_ares_ev_driver_windows.cc | 48 +++--- .../resolver/dns/c_ares/grpc_ares_wrapper.cc | 24 +-- .../resolver/dns/c_ares/grpc_ares_wrapper.h | 4 +- .../dns/c_ares/grpc_ares_wrapper_fallback.cc | 4 +- .../resolver/dns/native/dns_resolver.cc | 12 +- .../resolver/fake/fake_resolver.cc | 20 +-- .../resolver/sockaddr/sockaddr_resolver.cc | 4 +- .../resolver/xds/xds_resolver.cc | 4 +- .../filters/client_channel/resolver_factory.h | 4 +- .../client_channel/resolver_registry.cc | 5 +- .../client_channel/resolver_registry.h | 15 +- .../client_channel/resolving_lb_policy.cc | 4 +- .../ext/filters/client_channel/xds/xds_api.h | 2 +- .../filters/client_channel/xds/xds_client.cc | 162 ++++++++---------- .../filters/client_channel/xds/xds_client.h | 8 +- .../client_channel/xds/xds_client_stats.h | 20 +-- src/core/lib/iomgr/closure.h | 5 - src/core/lib/transport/connectivity_state.cc | 11 +- src/core/lib/transport/connectivity_state.h | 8 +- .../dns_resolver_connectivity_test.cc | 12 +- .../resolvers/dns_resolver_cooldown_test.cc | 22 +-- .../resolvers/dns_resolver_test.cc | 12 +- .../resolvers/fake_resolver_test.cc | 10 +- .../resolvers/sockaddr_resolver_test.cc | 12 +- test/core/end2end/fuzzers/api_fuzzer.cc | 2 +- test/core/end2end/goaway_server_test.cc | 4 +- test/core/util/test_lb_policies.cc | 2 +- test/cpp/naming/cancel_ares_query_test.cc | 4 +- test/cpp/naming/resolver_component_test.cc | 4 +- 42 files changed, 372 insertions(+), 378 deletions(-) diff --git a/src/core/ext/filters/client_channel/client_channel.cc b/src/core/ext/filters/client_channel/client_channel.cc index b11e9685297..e507aa0c2cb 100644 --- a/src/core/ext/filters/client_channel/client_channel.cc +++ b/src/core/ext/filters/client_channel/client_channel.cc @@ -57,8 +57,8 @@ #include "src/core/lib/gprpp/map.h" #include "src/core/lib/gprpp/sync.h" #include "src/core/lib/iomgr/iomgr.h" -#include "src/core/lib/iomgr/logical_thread.h" #include "src/core/lib/iomgr/polling_entity.h" +#include "src/core/lib/iomgr/work_serializer.h" #include "src/core/lib/profiling/timers.h" #include "src/core/lib/slice/slice_internal.h" #include "src/core/lib/slice/slice_string_helpers.h" @@ -149,8 +149,8 @@ class ChannelData { RefCountedPtr service_config() const { return service_config_; } - RefCountedPtr logical_thread() const { - return logical_thread_; + WorkSerializer* work_serializer() const { + return work_serializer_.get(); } RefCountedPtr GetConnectedSubchannelInDataPlane( @@ -164,10 +164,13 @@ class ChannelData { grpc_closure* watcher_timer_init) { auto* watcher = new ExternalConnectivityWatcher( this, pollent, state, on_complete, watcher_timer_init); - MutexLock lock(&external_watchers_mu_); - // Will be deleted when the watch is complete. - GPR_ASSERT(external_watchers_[on_complete] == nullptr); - external_watchers_[on_complete] = watcher; + { + MutexLock lock(&external_watchers_mu_); + // Will be deleted when the watch is complete. + GPR_ASSERT(external_watchers_[on_complete] == nullptr); + external_watchers_[on_complete] = watcher; + } + watcher->Start(); } void RemoveExternalConnectivityWatcher(grpc_closure* on_complete, @@ -208,6 +211,8 @@ class ChannelData { ~ExternalConnectivityWatcher(); + void Start(); + void Notify(grpc_connectivity_state state) override; void Cancel(); @@ -283,9 +288,9 @@ class ChannelData { RefCountedPtr service_config_; // - // Fields used in the control plane. Guarded by logical_thread. + // Fields used in the control plane. Guarded by work_serializer. // - RefCountedPtr logical_thread_; + std::shared_ptr work_serializer_; grpc_pollset_set* interested_parties_; RefCountedPtr subchannel_pool_; OrphanablePtr resolving_lb_policy_; @@ -297,10 +302,10 @@ class ChannelData { std::map subchannel_refcount_map_; // The set of SubchannelWrappers that currently exist. // No need to hold a ref, since the map is updated in the control-plane - // logical_thread when the SubchannelWrappers are created and destroyed. + // work_serializer when the SubchannelWrappers are created and destroyed. std::set subchannel_wrappers_; // Pending ConnectedSubchannel updates for each SubchannelWrapper. - // Updates are queued here in the control plane logical_thread and then + // Updates are queued here in the control plane work_serializer and then // applied in the data plane mutex when the picker is updated. std::map, RefCountedPtr, RefCountedPtrLess> @@ -308,7 +313,7 @@ class ChannelData { // // Fields accessed from both data plane mutex and control plane - // logical_thread. + // work_serializer. // Atomic disconnect_error_; @@ -842,7 +847,7 @@ class CallData { // Note that no synchronization is needed here, because even if the // underlying subchannel is shared between channels, this wrapper will only // be used within one channel, so it will always be synchronized by the -// control plane logical_thread. +// control plane work_serializer. class ChannelData::SubchannelWrapper : public SubchannelInterface { public: SubchannelWrapper(ChannelData* chand, Subchannel* subchannel, @@ -968,7 +973,7 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface { health_check_service_name_ = std::move(health_check_service_name); } - // Caller must be holding the control-plane logical_thread. + // Caller must be holding the control-plane work_serializer. ConnectedSubchannel* connected_subchannel() const { return connected_subchannel_.get(); } @@ -1017,7 +1022,7 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface { gpr_log(GPR_INFO, "chand=%p: connectivity change for subchannel wrapper %p " "subchannel %p (connected_subchannel=%p state=%s); " - "hopping into logical_thread", + "hopping into work_serializer", parent_->chand_, parent_.get(), parent_->subchannel_, connected_subchannel.get(), ConnectivityStateName(new_state)); } @@ -1050,7 +1055,7 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface { : parent_(std::move(parent)), state_(new_state), connected_subchannel_(std::move(connected_subchannel)) { - parent_->parent_->chand_->logical_thread_->Run( + parent_->parent_->chand_->work_serializer_->Run( [this]() { ApplyUpdateInControlPlaneLogicalThread(); }, DEBUG_LOCATION); } @@ -1118,7 +1123,7 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface { // CancelConnectivityStateWatch() with its watcher, we know the // corresponding WrapperWatcher to cancel on the underlying subchannel. std::map watcher_map_; - // To be accessed only in the control plane logical_thread. + // To be accessed only in the control plane work_serializer. RefCountedPtr connected_subchannel_; // To be accessed only in the data plane mutex. RefCountedPtr connected_subchannel_in_data_plane_; @@ -1141,8 +1146,6 @@ ChannelData::ExternalConnectivityWatcher::ExternalConnectivityWatcher( grpc_polling_entity_add_to_pollset_set(&pollent_, chand_->interested_parties_); GRPC_CHANNEL_STACK_REF(chand_->owning_stack_, "ExternalConnectivityWatcher"); - chand_->logical_thread_->Run([this]() { AddWatcherLocked(); }, - DEBUG_LOCATION); } ChannelData::ExternalConnectivityWatcher::~ExternalConnectivityWatcher() { @@ -1152,6 +1155,11 @@ ChannelData::ExternalConnectivityWatcher::~ExternalConnectivityWatcher() { "ExternalConnectivityWatcher"); } +void ChannelData::ExternalConnectivityWatcher::Start() { + chand_->work_serializer_->Run([this]() { AddWatcherLocked(); }, + DEBUG_LOCATION); +} + void ChannelData::ExternalConnectivityWatcher::Notify( grpc_connectivity_state state) { bool done = false; @@ -1164,12 +1172,12 @@ void ChannelData::ExternalConnectivityWatcher::Notify( // Report new state to the user. *state_ = state; ExecCtx::Run(DEBUG_LOCATION, on_complete_, GRPC_ERROR_NONE); - // Hop back into the logical_thread to clean up. + // Hop back into the work_serializer to clean up. // Not needed in state SHUTDOWN, because the tracker will // automatically remove all watchers in that case. if (state != GRPC_CHANNEL_SHUTDOWN) { - chand_->logical_thread_->Run([this]() { RemoveWatcherLocked(); }, - DEBUG_LOCATION); + chand_->work_serializer_->Run([this]() { RemoveWatcherLocked(); }, + DEBUG_LOCATION); } } @@ -1180,9 +1188,9 @@ void ChannelData::ExternalConnectivityWatcher::Cancel() { return; // Already done. } ExecCtx::Run(DEBUG_LOCATION, on_complete_, GRPC_ERROR_CANCELLED); - // Hop back into the logical_thread to clean up. - chand_->logical_thread_->Run([this]() { RemoveWatcherLocked(); }, - DEBUG_LOCATION); + // Hop back into the work_serializer to clean up. + chand_->work_serializer_->Run([this]() { RemoveWatcherLocked(); }, + DEBUG_LOCATION); } void ChannelData::ExternalConnectivityWatcher::AddWatcherLocked() { @@ -1209,8 +1217,8 @@ class ChannelData::ConnectivityWatcherAdder { initial_state_(initial_state), watcher_(std::move(watcher)) { GRPC_CHANNEL_STACK_REF(chand_->owning_stack_, "ConnectivityWatcherAdder"); - chand_->logical_thread_->Run([this]() { AddWatcherLocked(); }, - DEBUG_LOCATION); + chand_->work_serializer_->Run([this]() { AddWatcherLocked(); }, + DEBUG_LOCATION); } private: @@ -1235,8 +1243,8 @@ class ChannelData::ConnectivityWatcherRemover { AsyncConnectivityStateWatcherInterface* watcher) : chand_(chand), watcher_(watcher) { GRPC_CHANNEL_STACK_REF(chand_->owning_stack_, "ConnectivityWatcherRemover"); - chand_->logical_thread_->Run([this]() { RemoveWatcherLocked(); }, - DEBUG_LOCATION); + chand_->work_serializer_->Run([this]() { RemoveWatcherLocked(); }, + DEBUG_LOCATION); } private: @@ -1389,7 +1397,7 @@ ChannelData::ChannelData(grpc_channel_element_args* args, grpc_error** error) client_channel_factory_( ClientChannelFactory::GetFromChannelArgs(args->channel_args)), channelz_node_(GetChannelzNode(args->channel_args)), - logical_thread_(MakeRefCounted()), + work_serializer_(std::make_shared()), interested_parties_(grpc_pollset_set_create()), subchannel_pool_(GetSubchannelPool(args->channel_args)), state_tracker_("client_channel", GRPC_CHANNEL_IDLE), @@ -1563,7 +1571,7 @@ void ChannelData::UpdateServiceConfigLocked( void ChannelData::CreateResolvingLoadBalancingPolicyLocked() { // Instantiate resolving LB policy. LoadBalancingPolicy::Args lb_args; - lb_args.combiner = combiner_; + lb_args.work_serializer = work_serializer_; lb_args.channel_control_helper = grpc_core::MakeUnique(this); lb_args.args = channel_args_; @@ -1856,10 +1864,10 @@ void ChannelData::StartTransportOp(grpc_channel_element* elem, if (op->bind_pollset != nullptr) { grpc_pollset_set_add_pollset(chand->interested_parties_, op->bind_pollset); } - // Pop into control plane logical_thread for remaining ops. + // Pop into control plane work_serializer for remaining ops. op->handler_private.extra_arg = elem; GRPC_CHANNEL_STACK_REF(chand->owning_stack_, "start_transport_op"); - chand->logical_thread_->Run( + chand->work_serializer_->Run( [op]() { ChannelData::StartTransportOpLocked(op); }, DEBUG_LOCATION); } @@ -1925,7 +1933,7 @@ grpc_connectivity_state ChannelData::CheckConnectivityState( grpc_connectivity_state out = state_tracker_.state(); if (out == GRPC_CHANNEL_IDLE && try_to_connect) { GRPC_CHANNEL_STACK_REF(owning_stack_, "TryToConnect"); - logical_thread_->Run([this]() { TryToConnectLocked(); }, DEBUG_LOCATION); + work_serializer_->Run([this]() { TryToConnectLocked(); }, DEBUG_LOCATION); } return out; } @@ -3843,7 +3851,7 @@ bool CallData::PickSubchannelLocked(grpc_call_element* elem, GRPC_CLOSURE_CREATE( [](void* arg, grpc_error* /*error*/) { auto* chand = static_cast(arg); - chand->logical_thread()->Run( + chand->work_serializer()->Run( [chand]() { chand->CheckConnectivityState(/*try_to_connect=*/true); }, diff --git a/src/core/ext/filters/client_channel/lb_policy.cc b/src/core/ext/filters/client_channel/lb_policy.cc index 97827143f65..0ab171fa9aa 100644 --- a/src/core/ext/filters/client_channel/lb_policy.cc +++ b/src/core/ext/filters/client_channel/lb_policy.cc @@ -33,7 +33,7 @@ DebugOnlyTraceFlag grpc_trace_lb_policy_refcount(false, "lb_policy_refcount"); LoadBalancingPolicy::LoadBalancingPolicy(Args args, intptr_t initial_refcount) : InternallyRefCounted(&grpc_trace_lb_policy_refcount, initial_refcount), - logical_thread_(std::move(args.logical_thread)), + work_serializer_(std::move(args.work_serializer)), interested_parties_(grpc_pollset_set_create()), channel_control_helper_(std::move(args.channel_control_helper)) {} @@ -99,28 +99,30 @@ LoadBalancingPolicy::PickResult LoadBalancingPolicy::QueuePicker::Pick( // been processed, and we'll be trying to re-process the same // pick again, leading to a crash. // 2. We are currently running in the data plane mutex, but we - // need to bounce into the control plane logical_thread to call + // need to bounce into the control plane work_serializer to call // ExitIdleLocked(). if (!exit_idle_called_) { exit_idle_called_ = true; - // Ref held by closure. - parent_->Ref(DEBUG_LOCATION, "QueuePicker::CallExitIdle").release(); - parent_->combiner()->Run( - GRPC_CLOSURE_CREATE(&CallExitIdle, parent_.get(), nullptr), - GRPC_ERROR_NONE); + auto* parent = parent_->Ref().release(); // ref held by lambda. + ExecCtx::Run(DEBUG_LOCATION, + GRPC_CLOSURE_CREATE( + [](void* arg, grpc_error* /*error*/) { + auto* parent = static_cast(arg); + parent->work_serializer()->Run( + [parent]() { + parent->ExitIdleLocked(); + parent->Unref(); + }, + DEBUG_LOCATION); + }, + parent, nullptr), + GRPC_ERROR_NONE); } PickResult result; result.type = PickResult::PICK_QUEUE; return result; } -void LoadBalancingPolicy::QueuePicker::CallExitIdle(void* arg, - grpc_error* /*error*/) { - LoadBalancingPolicy* parent = static_cast(arg); - parent->ExitIdleLocked(); - parent->Unref(DEBUG_LOCATION, "QueuePicker::CallExitIdle"); -} - // // LoadBalancingPolicy::TransientFailurePicker // diff --git a/src/core/ext/filters/client_channel/lb_policy.h b/src/core/ext/filters/client_channel/lb_policy.h index 3779a17c5d5..da29efa80b6 100644 --- a/src/core/ext/filters/client_channel/lb_policy.h +++ b/src/core/ext/filters/client_channel/lb_policy.h @@ -31,8 +31,8 @@ #include "src/core/lib/gprpp/orphanable.h" #include "src/core/lib/gprpp/ref_counted_ptr.h" #include "src/core/lib/gprpp/string_view.h" -#include "src/core/lib/iomgr/logical_thread.h" #include "src/core/lib/iomgr/polling_entity.h" +#include "src/core/lib/iomgr/work_serializer.h" #include "src/core/lib/transport/connectivity_state.h" namespace grpc_core { @@ -72,7 +72,7 @@ extern DebugOnlyTraceFlag grpc_trace_lb_policy_refcount; /// LoadBalacingPolicy API. /// /// Note: All methods with a "Locked" suffix must be called from the -/// logical_thread passed to the constructor. +/// work_serializer passed to the constructor. /// /// Any I/O done by the LB policy should be done under the pollset_set /// returned by \a interested_parties(). @@ -309,9 +309,9 @@ class LoadBalancingPolicy : public InternallyRefCounted { /// Args used to instantiate an LB policy. struct Args { - /// The logical_thread under which all LB policy calls will be run. - /// Policy does NOT take ownership of the reference to the logical_thread. - RefCountedPtr logical_thread; + /// The work_serializer under which all LB policy calls will be run. + /// Policy does NOT take ownership of the reference to the work_serializer. + std::shared_ptr work_serializer; /// Channel control helper. /// Note: LB policies MUST NOT call any method on the helper from /// their constructor. @@ -349,7 +349,7 @@ class LoadBalancingPolicy : public InternallyRefCounted { grpc_pollset_set* interested_parties() const { return interested_parties_; } - // Note: This must be invoked while holding the logical_thread. + // Note: This must be invoked while holding the work_serializer. void Orphan() override; // A picker that returns PICK_QUEUE for all picks. @@ -382,8 +382,8 @@ class LoadBalancingPolicy : public InternallyRefCounted { }; protected: - RefCountedPtr logical_thread() const { - return logical_thread_; + std::shared_ptr work_serializer() const { + return work_serializer_; } // Note: LB policies MUST NOT call any method on the helper from their @@ -397,7 +397,7 @@ class LoadBalancingPolicy : public InternallyRefCounted { private: /// Logical Thread under which LB policy actions take place. - RefCountedPtr logical_thread_; + std::shared_ptr work_serializer_; /// Owned pointer to interested parties in load balancing decisions. grpc_pollset_set* interested_parties_; /// Channel control helper. diff --git a/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc b/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc index 5497b39a325..170039ba189 100644 --- a/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +++ b/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc @@ -246,7 +246,7 @@ class GrpcLb : public LoadBalancingPolicy { // // Note: This is called from the picker, so it will be invoked in // the channel's data plane mutex, NOT the control plane - // logical_thread. It should not be accessed by any other part of the LB + // work_serializer. It should not be accessed by any other part of the LB // policy. const char* ShouldDrop(); @@ -254,7 +254,7 @@ class GrpcLb : public LoadBalancingPolicy { std::vector serverlist_; // Guarded by the channel's data plane mutex, NOT the control - // plane logical_thread. It should not be accessed by anything but the + // plane work_serializer. It should not be accessed by anything but the // picker via the ShouldDrop() method. size_t drop_index_ = 0; }; @@ -904,7 +904,7 @@ void GrpcLb::BalancerCallState::MaybeSendClientLoadReport(void* arg, grpc_error* error) { BalancerCallState* lb_calld = static_cast(arg); GRPC_ERROR_REF(error); // ref owned by lambda - lb_calld->grpclb_policy()->logical_thread()->Run( + lb_calld->grpclb_policy()->work_serializer()->Run( [lb_calld, error]() { lb_calld->MaybeSendClientLoadReportLocked(error); }, DEBUG_LOCATION); } @@ -983,7 +983,7 @@ void GrpcLb::BalancerCallState::ClientLoadReportDone(void* arg, grpc_error* error) { BalancerCallState* lb_calld = static_cast(arg); GRPC_ERROR_REF(error); // ref owned by lambda - lb_calld->grpclb_policy()->logical_thread()->Run( + lb_calld->grpclb_policy()->work_serializer()->Run( [lb_calld, error]() { lb_calld->ClientLoadReportDoneLocked(error); }, DEBUG_LOCATION); } @@ -1002,7 +1002,7 @@ void GrpcLb::BalancerCallState::ClientLoadReportDoneLocked(grpc_error* error) { void GrpcLb::BalancerCallState::OnInitialRequestSent(void* arg, grpc_error* /*error*/) { BalancerCallState* lb_calld = static_cast(arg); - lb_calld->grpclb_policy()->logical_thread()->Run( + lb_calld->grpclb_policy()->work_serializer()->Run( [lb_calld]() { lb_calld->OnInitialRequestSentLocked(); }, DEBUG_LOCATION); } @@ -1021,7 +1021,7 @@ void GrpcLb::BalancerCallState::OnInitialRequestSentLocked() { void GrpcLb::BalancerCallState::OnBalancerMessageReceived( void* arg, grpc_error* /*error*/) { BalancerCallState* lb_calld = static_cast(arg); - lb_calld->grpclb_policy()->logical_thread()->Run( + lb_calld->grpclb_policy()->work_serializer()->Run( [lb_calld]() { lb_calld->OnBalancerMessageReceivedLocked(); }, DEBUG_LOCATION); } @@ -1187,7 +1187,7 @@ void GrpcLb::BalancerCallState::OnBalancerStatusReceived(void* arg, grpc_error* error) { BalancerCallState* lb_calld = static_cast(arg); GRPC_ERROR_REF(error); // owned by lambda - lb_calld->grpclb_policy()->logical_thread()->Run( + lb_calld->grpclb_policy()->work_serializer()->Run( [lb_calld, error]() { lb_calld->OnBalancerStatusReceivedLocked(error); }, DEBUG_LOCATION); } @@ -1526,7 +1526,7 @@ void GrpcLb::ProcessAddressesAndChannelArgsLocked( void GrpcLb::OnBalancerChannelConnectivityChanged(void* arg, grpc_error* /*error*/) { GrpcLb* self = static_cast(arg); - self->logical_thread()->Run( + self->work_serializer()->Run( [self]() { self->OnBalancerChannelConnectivityChangedLocked(); }, DEBUG_LOCATION); } @@ -1614,7 +1614,7 @@ void GrpcLb::StartBalancerCallRetryTimerLocked() { void GrpcLb::OnBalancerCallRetryTimer(void* arg, grpc_error* error) { GrpcLb* grpclb_policy = static_cast(arg); GRPC_ERROR_REF(error); // ref owned by lambda - grpclb_policy->logical_thread()->Run( + grpclb_policy->work_serializer()->Run( [grpclb_policy, error]() { grpclb_policy->OnBalancerCallRetryTimerLocked(error); }, @@ -1658,7 +1658,7 @@ void GrpcLb::MaybeEnterFallbackModeAfterStartup() { void GrpcLb::OnFallbackTimer(void* arg, grpc_error* error) { GrpcLb* grpclb_policy = static_cast(arg); GRPC_ERROR_REF(error); // ref owned by lambda - grpclb_policy->logical_thread()->Run( + grpclb_policy->work_serializer()->Run( [grpclb_policy, error]() { grpclb_policy->OnFallbackTimerLocked(error); }, DEBUG_LOCATION); } @@ -1703,7 +1703,7 @@ OrphanablePtr GrpcLb::CreateChildPolicyLocked( const char* name, const grpc_channel_args* args) { Helper* helper = new Helper(Ref()); LoadBalancingPolicy::Args lb_policy_args; - lb_policy_args.logical_thread = logical_thread(); + lb_policy_args.work_serializer = work_serializer(); lb_policy_args.args = args; lb_policy_args.channel_control_helper = std::unique_ptr(helper); diff --git a/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc b/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc index d657267ecef..834b3ee771d 100644 --- a/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +++ b/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc @@ -146,7 +146,7 @@ void CdsLb::ClusterWatcher::OnClusterChanged(CdsUpdate cluster_data) { // Create child policy if not already present. if (parent_->child_policy_ == nullptr) { LoadBalancingPolicy::Args args; - args.logical_thread = parent_->logical_thread(); + args.work_serializer = parent_->work_serializer(); args.args = parent_->args_; args.channel_control_helper = grpc_core::MakeUnique(parent_->Ref()); parent_->child_policy_ = diff --git a/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc b/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc index c87109428ea..9f6733f1564 100644 --- a/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc +++ b/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc @@ -259,7 +259,7 @@ class XdsLb : public LoadBalancingPolicy { const grpc_channel_args* args); static void OnDelayedRemovalTimer(void* arg, grpc_error* error); - static void OnDelayedRemovalTimerLocked(void* arg, grpc_error* error); + void OnDelayedRemovalTimerLocked(grpc_error* error); XdsLb* xds_policy() const { return locality_map_->xds_policy(); } @@ -312,8 +312,8 @@ class XdsLb : public LoadBalancingPolicy { void UpdateConnectivityStateLocked(); static void OnDelayedRemovalTimer(void* arg, grpc_error* error); static void OnFailoverTimer(void* arg, grpc_error* error); - static void OnDelayedRemovalTimerLocked(void* arg, grpc_error* error); - static void OnFailoverTimerLocked(void* arg, grpc_error* error); + void OnDelayedRemovalTimerLocked(grpc_error* error); + void OnFailoverTimerLocked(grpc_error* error); const XdsPriorityListUpdate& priority_list_update() const { return xds_policy_->priority_list_update_; @@ -375,7 +375,7 @@ class XdsLb : public LoadBalancingPolicy { // Methods for dealing with fallback state. void MaybeCancelFallbackAtStartupChecks(); static void OnFallbackTimer(void* arg, grpc_error* error); - static void OnFallbackTimerLocked(void* arg, grpc_error* error); + void OnFallbackTimerLocked(grpc_error* error); void UpdateFallbackPolicyLocked(); OrphanablePtr CreateFallbackPolicyLocked( const char* name, const grpc_channel_args* args); @@ -786,7 +786,7 @@ void XdsLb::UpdateLocked(UpdateArgs args) { if (xds_client_from_channel_ == nullptr) { grpc_error* error = GRPC_ERROR_NONE; xds_client_ = MakeOrphanable( - logical_thread(), interested_parties(), + work_serializer(), interested_parties(), StringView(eds_service_name()), nullptr /* service config watcher */, *args_, &error); // TODO(roth): If we decide that we care about fallback mode, add @@ -862,7 +862,7 @@ void XdsLb::MaybeCancelFallbackAtStartupChecks() { void XdsLb::OnFallbackTimer(void* arg, grpc_error* error) { XdsLb* xdslb_policy = static_cast(arg); GRPC_ERROR_REF(error); // ref owned by lambda - xdslb_policy->logical_thread()->Run( + xdslb_policy->work_serializer()->Run( [xdslb_policy, error]() { xdslb_policy->OnFallbackTimerLocked(error); }, DEBUG_LOCATION); } @@ -990,7 +990,7 @@ OrphanablePtr XdsLb::CreateFallbackPolicyLocked( FallbackHelper* helper = new FallbackHelper(Ref(DEBUG_LOCATION, "FallbackHelper")); LoadBalancingPolicy::Args lb_policy_args; - lb_policy_args.logical_thread = logical_thread(); + lb_policy_args.work_serializer = work_serializer(); lb_policy_args.args = args; lb_policy_args.channel_control_helper = std::unique_ptr(helper); @@ -1136,6 +1136,9 @@ XdsLb::LocalityMap::LocalityMap(RefCountedPtr xds_policy, gpr_log(GPR_INFO, "[xdslb %p] Creating priority %" PRIu32, xds_policy_.get(), priority_); } + // Closure Initialization + GRPC_CLOSURE_INIT(&on_delayed_removal_timer_, OnDelayedRemovalTimer, this, + grpc_schedule_on_exec_ctx); GRPC_CLOSURE_INIT(&on_failover_timer_, OnFailoverTimer, this, grpc_schedule_on_exec_ctx); // Start the failover timer. @@ -1386,18 +1389,16 @@ void XdsLb::LocalityMap::UpdateConnectivityStateLocked() { void XdsLb::LocalityMap::OnDelayedRemovalTimer(void* arg, grpc_error* error) { LocalityMap* self = static_cast(arg); GRPC_ERROR_REF(error); // ref owned by lambda - self->xds_policy_->logical_thread()->Run( + self->xds_policy_->work_serializer()->Run( [self, error]() { self->OnDelayedRemovalTimerLocked(error); }, DEBUG_LOCATION); } -void XdsLb::LocalityMap::OnDelayedRemovalTimerLocked(void* arg, - grpc_error* error) { - LocalityMap* self = static_cast(arg); - self->delayed_removal_timer_callback_pending_ = false; - if (error == GRPC_ERROR_NONE && !self->xds_policy_->shutting_down_) { - const bool keep = self->priority_list_update().Contains(self->priority_) && - self->priority_ <= self->xds_policy_->current_priority_; +void XdsLb::LocalityMap::OnDelayedRemovalTimerLocked(grpc_error* error) { + delayed_removal_timer_callback_pending_ = false; + if (error == GRPC_ERROR_NONE && !xds_policy_->shutting_down_) { + const bool keep = priority_list_update().Contains(priority_) && + priority_ <= xds_policy_->current_priority_; if (!keep) { // This check is to make sure we always delete the locality maps from // the lowest priority even if the closures of the back-to-back timers @@ -1406,8 +1407,8 @@ void XdsLb::LocalityMap::OnDelayedRemovalTimerLocked(void* arg, // deactivated locality maps when out-of-order closures are run. // TODO(juanlishen): Check the timer implementation to see if this // defense is necessary. - if (self->priority_ == self->xds_policy_->LowestPriority()) { - self->xds_policy_->priorities_.pop_back(); + if (priority_ == xds_policy_->LowestPriority()) { + xds_policy_->priorities_.pop_back(); } else { gpr_log(GPR_ERROR, "[xdslb %p] Priority %" PRIu32 @@ -1424,15 +1425,14 @@ void XdsLb::LocalityMap::OnDelayedRemovalTimerLocked(void* arg, void XdsLb::LocalityMap::OnFailoverTimer(void* arg, grpc_error* error) { LocalityMap* self = static_cast(arg); GRPC_ERROR_REF(error); // ref owned by lambda - self->xds_policy_->logical_thread()->Run( + self->xds_policy_->work_serializer()->Run( [self, error]() { self->OnFailoverTimerLocked(error); }, DEBUG_LOCATION); } -void XdsLb::LocalityMap::OnFailoverTimerLocked(void* arg, grpc_error* error) { - LocalityMap* self = static_cast(arg); - self->failover_timer_callback_pending_ = false; - if (error == GRPC_ERROR_NONE && !self->xds_policy_->shutting_down_) { - self->xds_policy_->FailoverOnConnectionFailureLocked(); +void XdsLb::LocalityMap::OnFailoverTimerLocked(grpc_error* error) { + failover_timer_callback_pending_ = false; + if (error == GRPC_ERROR_NONE && !xds_policy_->shutting_down_) { + xds_policy_->FailoverOnConnectionFailureLocked(); } Unref(DEBUG_LOCATION, "LocalityMap+OnFailoverTimerLocked"); GRPC_ERROR_UNREF(error); @@ -1484,7 +1484,7 @@ XdsLb::LocalityMap::Locality::CreateChildPolicyLocked( const char* name, const grpc_channel_args* args) { Helper* helper = new Helper(this->Ref(DEBUG_LOCATION, "Helper")); LoadBalancingPolicy::Args lb_policy_args; - lb_policy_args.logical_thread = xds_policy()->logical_thread(); + lb_policy_args.work_serializer = xds_policy()->work_serializer(); lb_policy_args.args = args; lb_policy_args.channel_control_helper = std::unique_ptr(helper); @@ -1678,17 +1678,16 @@ void XdsLb::LocalityMap::Locality::OnDelayedRemovalTimer(void* arg, grpc_error* error) { Locality* self = static_cast(arg); GRPC_ERROR_REF(error); // ref owned by lambda - self->xds_policy()->logical_thread()->Run( + self->xds_policy()->work_serializer()->Run( [self, error]() { self->OnDelayedRemovalTimerLocked(error); }, DEBUG_LOCATION); } void XdsLb::LocalityMap::Locality::OnDelayedRemovalTimerLocked( - void* arg, grpc_error* error) { - Locality* self = static_cast(arg); - self->delayed_removal_timer_callback_pending_ = false; - if (error == GRPC_ERROR_NONE && !self->shutdown_ && self->weight_ == 0) { - self->locality_map_->localities_.erase(self->name_); + grpc_error* error) { + delayed_removal_timer_callback_pending_ = false; + if (error == GRPC_ERROR_NONE && !shutdown_ && weight_ == 0) { + locality_map_->localities_.erase(name_); } Unref(DEBUG_LOCATION, "Locality+timer"); GRPC_ERROR_UNREF(error); diff --git a/src/core/ext/filters/client_channel/resolver.cc b/src/core/ext/filters/client_channel/resolver.cc index fd7d6322ec2..f56fd9bd6c6 100644 --- a/src/core/ext/filters/client_channel/resolver.cc +++ b/src/core/ext/filters/client_channel/resolver.cc @@ -29,11 +29,11 @@ namespace grpc_core { // Resolver // -Resolver::Resolver(RefCountedPtr logical_thread, +Resolver::Resolver(std::shared_ptr work_serializer, std::unique_ptr result_handler) : InternallyRefCounted(&grpc_trace_resolver_refcount), result_handler_(std::move(result_handler)), - logical_thread_(std::move(logical_thread)) {} + work_serializer_(std::move(work_serializer)) {} // // Resolver::Result diff --git a/src/core/ext/filters/client_channel/resolver.h b/src/core/ext/filters/client_channel/resolver.h index 470901e4303..6beef968efc 100644 --- a/src/core/ext/filters/client_channel/resolver.h +++ b/src/core/ext/filters/client_channel/resolver.h @@ -28,7 +28,7 @@ #include "src/core/lib/gprpp/orphanable.h" #include "src/core/lib/gprpp/ref_counted_ptr.h" #include "src/core/lib/iomgr/iomgr.h" -#include "src/core/lib/iomgr/logical_thread.h" +#include "src/core/lib/iomgr/work_serializer.h" extern grpc_core::DebugOnlyTraceFlag grpc_trace_resolver_refcount; @@ -45,7 +45,7 @@ namespace grpc_core { /// DNS). /// /// Note: All methods with a "Locked" suffix must be called from the -/// logical_thread passed to the constructor. +/// work_serializer passed to the constructor. class Resolver : public InternallyRefCounted { public: /// Results returned by the resolver. @@ -115,29 +115,28 @@ class Resolver : public InternallyRefCounted { /// implementations. At that point, this method can go away. virtual void ResetBackoffLocked() {} - // Note: This must be invoked while holding the logical_thread. + // Note: This must be invoked while holding the work_serializer. void Orphan() override { ShutdownLocked(); Unref(); } protected: - /// Does NOT take ownership of the reference to \a logical_thread. - explicit Resolver(RefCountedPtr logical_thread, + explicit Resolver(std::shared_ptr work_serializer, std::unique_ptr result_handler); /// Shuts down the resolver. virtual void ShutdownLocked() = 0; - RefCountedPtr logical_thread() const { - return logical_thread_; + std::shared_ptr work_serializer() const { + return work_serializer_; } ResultHandler* result_handler() const { return result_handler_.get(); } private: std::unique_ptr result_handler_; - RefCountedPtr logical_thread_; + std::shared_ptr work_serializer_; }; } // namespace grpc_core diff --git a/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc b/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc index b78bcbe0006..2d5ff217e6d 100644 --- a/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +++ b/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc @@ -42,9 +42,9 @@ #include "src/core/lib/gprpp/manual_constructor.h" #include "src/core/lib/iomgr/gethostname.h" #include "src/core/lib/iomgr/iomgr_custom.h" -#include "src/core/lib/iomgr/logical_thread.h" #include "src/core/lib/iomgr/resolve_address.h" #include "src/core/lib/iomgr/timer.h" +#include "src/core/lib/iomgr/work_serializer.h" #include "src/core/lib/json/json.h" #define GRPC_DNS_INITIAL_CONNECT_BACKOFF_SECONDS 1 @@ -91,7 +91,7 @@ class AresDnsResolver : public Resolver { bool request_service_config_; /// pollset_set to drive the name resolution process grpc_pollset_set* interested_parties_; - /// closures used by the logical_thread + /// closures used by the work_serializer grpc_closure on_next_resolution_; grpc_closure on_resolved_; /// are we currently resolving? @@ -120,7 +120,7 @@ class AresDnsResolver : public Resolver { }; AresDnsResolver::AresDnsResolver(ResolverArgs args) - : Resolver(args.logical_thread, std::move(args.result_handler)), + : Resolver(args.work_serializer, std::move(args.result_handler)), backoff_( BackOff::Options() .set_initial_backoff(GRPC_DNS_INITIAL_CONNECT_BACKOFF_SECONDS * @@ -206,8 +206,8 @@ void AresDnsResolver::ShutdownLocked() { void AresDnsResolver::OnNextResolution(void* arg, grpc_error* error) { AresDnsResolver* r = static_cast(arg); GRPC_ERROR_REF(error); // ref owned by lambda - r->logical_thread()->Run([r, error]() { r->OnNextResolutionLocked(error); }, - DEBUG_LOCATION); + r->work_serializer()->Run([r, error]() { r->OnNextResolutionLocked(error); }, + DEBUG_LOCATION); } void AresDnsResolver::OnNextResolutionLocked(grpc_error* error) { @@ -318,8 +318,8 @@ std::string ChooseServiceConfig(char* service_config_choice_json, void AresDnsResolver::OnResolved(void* arg, grpc_error* error) { AresDnsResolver* r = static_cast(arg); GRPC_ERROR_REF(error); // ref owned by lambda - r->logical_thread()->Run([r, error]() { r->OnResolvedLocked(error); }, - DEBUG_LOCATION); + r->work_serializer()->Run([r, error]() { r->OnResolvedLocked(error); }, + DEBUG_LOCATION); } void AresDnsResolver::OnResolvedLocked(grpc_error* error) { @@ -334,15 +334,15 @@ void AresDnsResolver::OnResolvedLocked(grpc_error* error) { } if (addresses_ != nullptr) { Result result; - result.addresses = std::move(*r->addresses_); - if (r->service_config_json_ != nullptr) { + result.addresses = std::move(*addresses_); + if (service_config_json_ != nullptr) { std::string service_config_string = ChooseServiceConfig( - r->service_config_json_, &result.service_config_error); - gpr_free(r->service_config_json_); + service_config_json_, &result.service_config_error); + gpr_free(service_config_json_); if (result.service_config_error == GRPC_ERROR_NONE && !service_config_string.empty()) { GRPC_CARES_TRACE_LOG("resolver:%p selected service config choice: %s", - r, service_config_string.c_str()); + this, service_config_string.c_str()); result.service_config = ServiceConfig::Create( service_config_string, &result.service_config_error); } @@ -425,7 +425,7 @@ void AresDnsResolver::StartResolvingLocked() { dns_server_, name_to_resolve_, kDefaultPort, interested_parties_, &on_resolved_, &addresses_, enable_srv_queries_ /* check_grpclb */, request_service_config_ ? &service_config_json_ : nullptr, - query_timeout_ms_, logical_thread()); + query_timeout_ms_, work_serializer()); last_resolution_timestamp_ = grpc_core::ExecCtx::Get()->Now(); GRPC_CARES_TRACE_LOG("resolver:%p Started resolving. pending_request_:%p", this, pending_request_); diff --git a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc index 57d66934702..780b3735da8 100644 --- a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc +++ b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc @@ -65,8 +65,8 @@ struct grpc_ares_ev_driver { /** refcount of the event driver */ gpr_refcount refs; - /** logical_thread to synchronize c-ares and I/O callbacks on */ - grpc_core::RefCountedPtr logical_thread; + /** work_serializer to synchronize c-ares and I/O callbacks on */ + std::shared_ptr work_serializer; /** a list of grpc_fd that this event driver is currently using. */ fd_node* fds; /** is this event driver currently working? */ @@ -145,7 +145,7 @@ void (*grpc_ares_test_only_inject_config)(ares_channel channel) = grpc_error* grpc_ares_ev_driver_create_locked( grpc_ares_ev_driver** ev_driver, grpc_pollset_set* pollset_set, int query_timeout_ms, - grpc_core::RefCountedPtr logical_thread, + std::shared_ptr work_serializer, grpc_ares_request* request) { *ev_driver = new grpc_ares_ev_driver(); ares_options opts; @@ -163,7 +163,7 @@ grpc_error* grpc_ares_ev_driver_create_locked( gpr_free(*ev_driver); return err; } - (*ev_driver)->logical_thread = std::move(logical_thread); + (*ev_driver)->work_serializer = std::move(work_serializer); gpr_ref_init(&(*ev_driver)->refs, 1); (*ev_driver)->pollset_set = pollset_set; (*ev_driver)->fds = nullptr; @@ -171,7 +171,7 @@ grpc_error* grpc_ares_ev_driver_create_locked( (*ev_driver)->shutting_down = false; (*ev_driver)->request = request; (*ev_driver)->polled_fd_factory = - grpc_core::NewGrpcPolledFdFactory((*ev_driver)->logical_thread); + grpc_core::NewGrpcPolledFdFactory((*ev_driver)->work_serializer); (*ev_driver) ->polled_fd_factory->ConfigureAresChannelLocked((*ev_driver)->channel); (*ev_driver)->query_timeout_ms = query_timeout_ms; @@ -234,7 +234,7 @@ static grpc_millis calculate_next_ares_backup_poll_alarm_ms( static void on_timeout(void* arg, grpc_error* error) { grpc_ares_ev_driver* driver = static_cast(arg); GRPC_ERROR_REF(error); // ref owned by lambda - driver->logical_thread->Run( + driver->work_serializer->Run( [driver, error]() { on_timeout_locked(driver, error); }, DEBUG_LOCATION); } @@ -253,7 +253,7 @@ static void on_timeout_locked(grpc_ares_ev_driver* driver, grpc_error* error) { static void on_ares_backup_poll_alarm(void* arg, grpc_error* error) { grpc_ares_ev_driver* driver = static_cast(arg); GRPC_ERROR_REF(error); - driver->logical_thread->Run( + driver->work_serializer->Run( [driver, error]() { on_ares_backup_poll_alarm_locked(driver, error); }, DEBUG_LOCATION); } @@ -330,7 +330,7 @@ static void on_readable_locked(fd_node* fdn, grpc_error* error) { static void on_readable(void* arg, grpc_error* error) { fd_node* fdn = static_cast(arg); - fdn->ev_driver->logical_thread->Run( + fdn->ev_driver->work_serializer->Run( [fdn, error]() { on_readable_locked(fdn, error); }, DEBUG_LOCATION); } @@ -360,7 +360,7 @@ static void on_writable_locked(fd_node* fdn, grpc_error* error) { static void on_writable(void* arg, grpc_error* error) { fd_node* fdn = static_cast(arg); GRPC_ERROR_REF(error); - fdn->ev_driver->logical_thread->Run( + fdn->ev_driver->work_serializer->Run( [fdn, error]() { on_writable_locked(fdn, error); }, DEBUG_LOCATION); } @@ -386,7 +386,7 @@ static void grpc_ares_notify_on_event_locked(grpc_ares_ev_driver* ev_driver) { fdn = static_cast(gpr_malloc(sizeof(fd_node))); fdn->grpc_polled_fd = ev_driver->polled_fd_factory->NewGrpcPolledFdLocked( - socks[i], ev_driver->pollset_set, ev_driver->logical_thread); + socks[i], ev_driver->pollset_set, ev_driver->work_serializer); GRPC_CARES_TRACE_LOG("request:%p new fd: %s", ev_driver->request, fdn->grpc_polled_fd->GetName()); fdn->ev_driver = ev_driver; diff --git a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h index 93aba9bb9b1..cedf0c39709 100644 --- a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +++ b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h @@ -43,7 +43,7 @@ ares_channel* grpc_ares_ev_driver_get_channel_locked( grpc_error* grpc_ares_ev_driver_create_locked( grpc_ares_ev_driver** ev_driver, grpc_pollset_set* pollset_set, int query_timeout_ms, - grpc_core::RefCountedPtr logical_thread, + std::shared_ptr work_serializer, grpc_ares_request* request); /* Called back when all DNS lookups have completed. */ @@ -90,13 +90,13 @@ class GrpcPolledFdFactory { /* Creates a new wrapped fd for the current platform */ virtual GrpcPolledFd* NewGrpcPolledFdLocked( ares_socket_t as, grpc_pollset_set* driver_pollset_set, - RefCountedPtr logical_thread) = 0; + std::shared_ptr work_serializer) = 0; /* Optionally configures the ares channel after creation */ virtual void ConfigureAresChannelLocked(ares_channel channel) = 0; }; std::unique_ptr NewGrpcPolledFdFactory( - RefCountedPtr logical_thread); + std::shared_ptr work_serializer); } // namespace grpc_core diff --git a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc index 7aa28801943..947c3657833 100644 --- a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc +++ b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc @@ -31,7 +31,7 @@ #include #include "src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h" #include "src/core/lib/gpr/string.h" -#include "src/core/lib/iomgr/logical_thread.h" +#include "src/core/lib/iomgr/work_serializer.h" namespace grpc_core { @@ -42,8 +42,8 @@ void ares_uv_poll_close_cb(uv_handle_t* handle) { delete handle; } class GrpcPolledFdLibuv : public GrpcPolledFd { public: GrpcPolledFdLibuv(ares_socket_t as, - RefCountedPtr logical_thread) - : as_(as), logical_thread_(std::move(logical_thread)) { + std::shared_ptr work_serializer) + : as_(as), work_serializer_(std::move(work_serializer)) { gpr_asprintf(&name_, "c-ares socket: %" PRIdPTR, (intptr_t)as); handle_ = new uv_poll_t(); uv_poll_init_socket(uv_default_loop(), handle_, as); @@ -106,7 +106,7 @@ class GrpcPolledFdLibuv : public GrpcPolledFd { grpc_closure* read_closure_ = nullptr; grpc_closure* write_closure_ = nullptr; int poll_events_ = 0; - RefCountedPtr logical_thread_; + std::shared_ptr work_serializer_; }; struct AresUvPollCbArg { @@ -152,23 +152,23 @@ void ares_uv_poll_cb(uv_poll_t* handle, int status, int events) { GrpcPolledFdLibuv* polled_fd = reinterpret_cast(handle->data); AresUvPollCbArg* arg = new AresUvPollCbArg(handle, status, events); - polled_fd->logical_thread_->Run([arg]() { ares_uv_poll_cb_locked(arg); }, - DEBUG_LOCATION); + polled_fd->work_serializer_->Run([arg]() { ares_uv_poll_cb_locked(arg); }, + DEBUG_LOCATION); } class GrpcPolledFdFactoryLibuv : public GrpcPolledFdFactory { public: GrpcPolledFd* NewGrpcPolledFdLocked( ares_socket_t as, grpc_pollset_set* driver_pollset_set, - RefCountedPtr logical_thread) override { - return new GrpcPolledFdLibuv(as, logical_thread); + std::shared_ptr work_serializer) override { + return new GrpcPolledFdLibuv(as, work_serializer); } void ConfigureAresChannelLocked(ares_channel channel) override {} }; std::unique_ptr NewGrpcPolledFdFactory( - RefCountedPtr /*logical_thread*/) { + std::shared_ptr /*work_serializer*/) { return MakeUnique(); } diff --git a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc index ebe17fd46d9..e1d3884677e 100644 --- a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +++ b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc @@ -90,7 +90,7 @@ class GrpcPolledFdFactoryPosix : public GrpcPolledFdFactory { public: GrpcPolledFd* NewGrpcPolledFdLocked( ares_socket_t as, grpc_pollset_set* driver_pollset_set, - RefCountedPtr /*logical_thread*/) override { + std::shared_ptr /*work_serializer*/) override { return new GrpcPolledFdPosix(as, driver_pollset_set); } @@ -98,7 +98,7 @@ class GrpcPolledFdFactoryPosix : public GrpcPolledFdFactory { }; std::unique_ptr NewGrpcPolledFdFactory( - RefCountedPtr /*logical_thread*/) { + std::shared_ptr /*work_serializer*/) { return MakeUnique(); } diff --git a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc index ae0d75b78fb..1be5906a7ba 100644 --- a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +++ b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc @@ -31,11 +31,11 @@ #include "src/core/lib/gpr/string.h" #include "src/core/lib/gprpp/memory.h" #include "src/core/lib/iomgr/iocp_windows.h" -#include "src/core/lib/iomgr/logical_thread.h" #include "src/core/lib/iomgr/sockaddr_utils.h" #include "src/core/lib/iomgr/sockaddr_windows.h" #include "src/core/lib/iomgr/socket_windows.h" #include "src/core/lib/iomgr/tcp_windows.h" +#include "src/core/lib/iomgr/work_serializer.h" #include "src/core/lib/slice/slice_internal.h" #include "src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h" @@ -98,7 +98,7 @@ class GrpcPolledFdWindows { }; GrpcPolledFdWindows(ares_socket_t as, - RefCountedPtr logical_thread, + std::shared_ptr work_serializer, int address_family, int socket_type) : read_buf_(grpc_empty_slice()), write_buf_(grpc_empty_slice()), @@ -106,7 +106,7 @@ class GrpcPolledFdWindows { gotten_into_driver_list_(false), address_family_(address_family), socket_type_(socket_type), - logical_thread_(std::move(logical_thread)) { + work_serializer_(std::move(work_serializer)) { gpr_asprintf(&name_, "c-ares socket: %" PRIdPTR, as); // Closure Initialization GRPC_CLOSURE_INIT(&outer_read_closure_, @@ -148,8 +148,8 @@ class GrpcPolledFdWindows { GPR_ASSERT(!read_buf_has_data_); read_buf_ = GRPC_SLICE_MALLOC(4192); if (connect_done_) { - logical_thread_->Run([this]() { ContinueRegisterForOnReadableLocked(); }, - DEBUG_LOCATION); + work_serializer_->Run([this]() { ContinueRegisterForOnReadableLocked(); }, + DEBUG_LOCATION); } else { GPR_ASSERT(pending_continue_register_for_on_readable_locked_ == false); pending_continue_register_for_on_readable_locked_ = true; @@ -205,8 +205,8 @@ class GrpcPolledFdWindows { GPR_ASSERT(write_closure_ == nullptr); write_closure_ = write_closure; if (connect_done_) { - logical_thread_->Run([this]() { ContinueRegisterForOnWriteableLocked(); }, - DEBUG_LOCATION); + work_serializer_->Run( + [this]() { ContinueRegisterForOnWriteableLocked(); }, DEBUG_LOCATION); } else { GPR_ASSERT(pending_continue_register_for_on_writeable_locked_ == false); pending_continue_register_for_on_writeable_locked_ = true; @@ -421,7 +421,7 @@ class GrpcPolledFdWindows { GrpcPolledFdWindows* grpc_polled_fd = static_cast(arg); GRPC_ERROR_REF(error); // ref owned by lambda - grpc_polled_fd->logical_thread_->Run( + grpc_polled_fd->work_serializer_->Run( [grpc_polled_fd, error]() { grpc_polled_fd->OnTcpConnectLocked(error); }, @@ -462,12 +462,12 @@ class GrpcPolledFdWindows { wsa_connect_error_ = WSA_OPERATION_ABORTED; } if (pending_continue_register_for_on_readable_locked_) { - logical_thread_->Run([this]() { ContinueRegisterForOnReadableLocked(); }, - DEBUG_LOCATION); + work_serializer_->Run([this]() { ContinueRegisterForOnReadableLocked(); }, + DEBUG_LOCATION); } if (pending_continue_register_for_on_writeable_locked_) { - logical_thread_->Run([this]() { ContinueRegisterForOnWriteableLocked(); }, - DEBUG_LOCATION); + work_serializer_->Run( + [this]() { ContinueRegisterForOnWriteableLocked(); }, DEBUG_LOCATION); } GRPC_ERROR_UNREF(error); } @@ -576,7 +576,7 @@ class GrpcPolledFdWindows { static void OnIocpReadable(void* arg, grpc_error* error) { GrpcPolledFdWindows* polled_fd = static_cast(arg); GRPC_ERROR_REF(error); // ref owned by lambda - polled_fd->logical_thread_->Run( + polled_fd->work_serializer_->Run( [polled_fd, error]() { OnIocpReadableLocked(error); }, DEBUG_LOCATION); } @@ -622,7 +622,7 @@ class GrpcPolledFdWindows { static void OnIocpWriteable(void* arg, grpc_error* error) { GrpcPolledFdWindows* polled_fd = static_cast(arg); GRPC_ERROR_REF(error); // error owned by lambda - polled_fd->logical_thread_->Run( + polled_fd->work_serializer_->Run( [polled_fd, error]() { polled_fd->OnIocpWriteableLocked(error); }, DEBUG_LOCATION); } @@ -660,7 +660,7 @@ class GrpcPolledFdWindows { bool gotten_into_driver_list() const { return gotten_into_driver_list_; } void set_gotten_into_driver_list() { gotten_into_driver_list_ = true; } - RefCountedPtr logical_thread_; + std::shared_ptr work_serializer_; char recv_from_source_addr_[200]; ares_socklen_t recv_from_source_addr_len_; grpc_slice read_buf_; @@ -702,8 +702,8 @@ struct SockToPolledFdEntry { * with a GrpcPolledFdWindows factory and event driver */ class SockToPolledFdMap { public: - SockToPolledFdMap(RefCountedPtr logical_thread) - : logical_thread_(std::move(logical_thread)) {} + SockToPolledFdMap(std::shared_ptr work_serializer) + : work_serializer_(std::move(work_serializer)) {} ~SockToPolledFdMap() { GPR_ASSERT(head_ == nullptr); } @@ -761,7 +761,7 @@ class SockToPolledFdMap { } grpc_tcp_set_non_block(s); GrpcPolledFdWindows* polled_fd = - new GrpcPolledFdWindows(s, map->logical_thread_, af, type); + new GrpcPolledFdWindows(s, map->work_serializer_, af, type); GRPC_CARES_TRACE_LOG( "fd:|%s| created with params af:%d type:%d protocol:%d", polled_fd->GetName(), af, type, protocol); @@ -817,7 +817,7 @@ class SockToPolledFdMap { private: SockToPolledFdEntry* head_ = nullptr; - RefCountedPtr logical_thread_; + std::shared_ptr work_serializer_; }; const struct ares_socket_functions custom_ares_sock_funcs = { @@ -866,12 +866,12 @@ class GrpcPolledFdWindowsWrapper : public GrpcPolledFd { class GrpcPolledFdFactoryWindows : public GrpcPolledFdFactory { public: - GrpcPolledFdFactoryWindows(RefCountedPtr logical_thread) - : sock_to_polled_fd_map_(logical_thread) {} + GrpcPolledFdFactoryWindows(std::shared_ptr work_serializer) + : sock_to_polled_fd_map_(work_serializer) {} GrpcPolledFd* NewGrpcPolledFdLocked( ares_socket_t as, grpc_pollset_set* driver_pollset_set, - RefCountedPtr logical_thread) override { + std::shared_ptr work_serializer) override { GrpcPolledFdWindows* polled_fd = sock_to_polled_fd_map_.LookupPolledFd(as); // Set a flag so that the virtual socket "close" method knows it // doesn't need to call ShutdownLocked, since now the driver will. @@ -889,8 +889,8 @@ class GrpcPolledFdFactoryWindows : public GrpcPolledFdFactory { }; std::unique_ptr NewGrpcPolledFdFactory( - RefCountedPtr logical_thread) { - return MakeUnique(std::move(logical_thread)); + std::shared_ptr work_serializer) { + return MakeUnique(std::move(work_serializer)); } } // namespace grpc_core diff --git a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc index a562e2a4d85..a74ea201094 100644 --- a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +++ b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc @@ -350,7 +350,7 @@ void grpc_dns_lookup_ares_continue_after_check_localhost_and_ip_literals_locked( grpc_ares_request* r, const char* dns_server, const char* name, const char* default_port, grpc_pollset_set* interested_parties, bool check_grpclb, int query_timeout_ms, - grpc_core::RefCountedPtr logical_thread) { + std::shared_ptr work_serializer) { grpc_error* error = GRPC_ERROR_NONE; grpc_ares_hostbyname_request* hr = nullptr; ares_channel* channel = nullptr; @@ -373,7 +373,7 @@ void grpc_dns_lookup_ares_continue_after_check_localhost_and_ip_literals_locked( port.reset(gpr_strdup(default_port)); } error = grpc_ares_ev_driver_create_locked( - &r->ev_driver, interested_parties, query_timeout_ms, logical_thread, r); + &r->ev_driver, interested_parties, query_timeout_ms, work_serializer, r); if (error != GRPC_ERROR_NONE) goto error_cleanup; channel = grpc_ares_ev_driver_get_channel_locked(r->ev_driver); // If dns_server is specified, use it. @@ -590,7 +590,7 @@ static grpc_ares_request* grpc_dns_lookup_ares_locked_impl( grpc_pollset_set* interested_parties, grpc_closure* on_done, std::unique_ptr* addrs, bool check_grpclb, char** service_config_json, int query_timeout_ms, - grpc_core::RefCountedPtr logical_thread) { + std::shared_ptr work_serializer) { grpc_ares_request* r = static_cast(gpr_zalloc(sizeof(grpc_ares_request))); r->ev_driver = nullptr; @@ -624,7 +624,7 @@ static grpc_ares_request* grpc_dns_lookup_ares_locked_impl( // Look up name using c-ares lib. grpc_dns_lookup_ares_continue_after_check_localhost_and_ip_literals_locked( r, dns_server, name, default_port, interested_parties, check_grpclb, - query_timeout_ms, logical_thread); + query_timeout_ms, work_serializer); return r; } @@ -633,7 +633,7 @@ grpc_ares_request* (*grpc_dns_lookup_ares_locked)( grpc_pollset_set* interested_parties, grpc_closure* on_done, std::unique_ptr* addrs, bool check_grpclb, char** service_config_json, int query_timeout_ms, - grpc_core::RefCountedPtr logical_thread) = + std::shared_ptr work_serializer) = grpc_dns_lookup_ares_locked_impl; static void grpc_cancel_ares_request_locked_impl(grpc_ares_request* r) { @@ -674,8 +674,8 @@ void grpc_ares_cleanup(void) {} */ typedef struct grpc_resolve_address_ares_request { - /* logical_thread that queries and related callbacks run under */ - grpc_core::RefCountedPtr logical_thread; + /* work_serializer that queries and related callbacks run under */ + std::shared_ptr work_serializer; /** the pointer to receive the resolved addresses */ grpc_resolved_addresses** addrs_out; /** currently resolving addresses */ @@ -724,8 +724,8 @@ static void on_dns_lookup_done(void* arg, grpc_error* error) { grpc_resolve_address_ares_request* r = static_cast(arg); GRPC_ERROR_REF(error); // ref owned by lambda - r->logical_thread->Run([r, error]() { on_dns_lookup_done_locked(r, error); }, - DEBUG_LOCATION); + r->work_serializer->Run([r, error]() { on_dns_lookup_done_locked(r, error); }, + DEBUG_LOCATION); } static void grpc_resolve_address_invoke_dns_lookup_ares_locked(void* arg) { @@ -737,7 +737,7 @@ static void grpc_resolve_address_invoke_dns_lookup_ares_locked(void* arg) { nullptr /* dns_server */, r->name, r->default_port, r->interested_parties, &r->on_dns_lookup_done_locked, &r->addresses, false /* check_grpclb */, nullptr /* service_config_json */, GRPC_DNS_ARES_DEFAULT_QUERY_TIMEOUT_MS, - r->logical_thread); + r->work_serializer); } static void grpc_resolve_address_ares_impl(const char* name, @@ -747,13 +747,13 @@ static void grpc_resolve_address_ares_impl(const char* name, grpc_resolved_addresses** addrs) { grpc_resolve_address_ares_request* r = new grpc_resolve_address_ares_request(); - r->logical_thread = grpc_core::MakeRefCounted(); + r->work_serializer = std::make_shared(); r->addrs_out = addrs; r->on_resolve_address_done = on_done; r->name = name; r->default_port = default_port; r->interested_parties = interested_parties; - r->logical_thread->Run( + r->work_serializer->Run( [r]() { grpc_resolve_address_invoke_dns_lookup_ares_locked(r); }, DEBUG_LOCATION); } diff --git a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h index 8c63590c993..07bd88fb413 100644 --- a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +++ b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h @@ -23,9 +23,9 @@ #include "src/core/ext/filters/client_channel/server_address.h" #include "src/core/lib/iomgr/iomgr.h" -#include "src/core/lib/iomgr/logical_thread.h" #include "src/core/lib/iomgr/polling_entity.h" #include "src/core/lib/iomgr/resolve_address.h" +#include "src/core/lib/iomgr/work_serializer.h" #define GRPC_DNS_ARES_DEFAULT_QUERY_TIMEOUT_MS 120000 @@ -66,7 +66,7 @@ extern grpc_ares_request* (*grpc_dns_lookup_ares_locked)( grpc_pollset_set* interested_parties, grpc_closure* on_done, std::unique_ptr* addresses, bool check_grpclb, char** service_config_json, int query_timeout_ms, - grpc_core::RefCountedPtr logical_thread); + std::shared_ptr work_serializer); /* Cancel the pending grpc_ares_request \a request */ extern void (*grpc_cancel_ares_request_locked)(grpc_ares_request* request); diff --git a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc index 6e76a408bdb..d464403bc43 100644 --- a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc +++ b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc @@ -31,7 +31,7 @@ static grpc_ares_request* grpc_dns_lookup_ares_locked_impl( grpc_pollset_set* interested_parties, grpc_closure* on_done, std::unique_ptr* addrs, bool check_grpclb, char** service_config_json, int query_timeout_ms, - grpc_core::RefCountedPtr logical_thread) { + std::shared_ptr work_serializer) { return NULL; } @@ -40,7 +40,7 @@ grpc_ares_request* (*grpc_dns_lookup_ares_locked)( grpc_pollset_set* interested_parties, grpc_closure* on_done, std::unique_ptr* addrs, bool check_grpclb, char** service_config_json, int query_timeout_ms, - grpc_core::RefCountedPtr logical_thread) = + std::shared_ptr work_serializer) = grpc_dns_lookup_ares_locked_impl; static void grpc_cancel_ares_request_locked_impl(grpc_ares_request* r) {} diff --git a/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc b/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc index 94e3ffa80cb..f838601ffd2 100644 --- a/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +++ b/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc @@ -33,9 +33,9 @@ #include "src/core/lib/channel/channel_args.h" #include "src/core/lib/gpr/string.h" #include "src/core/lib/gprpp/manual_constructor.h" -#include "src/core/lib/iomgr/logical_thread.h" #include "src/core/lib/iomgr/resolve_address.h" #include "src/core/lib/iomgr/timer.h" +#include "src/core/lib/iomgr/work_serializer.h" #define GRPC_DNS_INITIAL_CONNECT_BACKOFF_SECONDS 1 #define GRPC_DNS_RECONNECT_BACKOFF_MULTIPLIER 1.6 @@ -97,7 +97,7 @@ class NativeDnsResolver : public Resolver { }; NativeDnsResolver::NativeDnsResolver(ResolverArgs args) - : Resolver(args.logical_thread, std::move(args.result_handler)), + : Resolver(args.work_serializer, std::move(args.result_handler)), backoff_( BackOff::Options() .set_initial_backoff(GRPC_DNS_INITIAL_CONNECT_BACKOFF_SECONDS * @@ -150,8 +150,8 @@ void NativeDnsResolver::ShutdownLocked() { void NativeDnsResolver::OnNextResolution(void* arg, grpc_error* error) { NativeDnsResolver* r = static_cast(arg); GRPC_ERROR_REF(error); // ref owned by lambda - r->logical_thread()->Run([r, error]() { r->OnNextResolutionLocked(error); }, - DEBUG_LOCATION); + r->work_serializer()->Run([r, error]() { r->OnNextResolutionLocked(error); }, + DEBUG_LOCATION); } void NativeDnsResolver::OnNextResolutionLocked(grpc_error* error) { @@ -166,8 +166,8 @@ void NativeDnsResolver::OnNextResolutionLocked(grpc_error* error) { void NativeDnsResolver::OnResolved(void* arg, grpc_error* error) { NativeDnsResolver* r = static_cast(arg); GRPC_ERROR_REF(error); // owned by lambda - r->logical_thread()->Run([r, error]() { r->OnResolvedLocked(error); }, - DEBUG_LOCATION); + r->work_serializer()->Run([r, error]() { r->OnResolvedLocked(error); }, + DEBUG_LOCATION); } void NativeDnsResolver::OnResolvedLocked(grpc_error* error) { diff --git a/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc b/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc index 14fc0304705..252c8e9d126 100644 --- a/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +++ b/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc @@ -35,9 +35,9 @@ #include "src/core/lib/gpr/string.h" #include "src/core/lib/gpr/useful.h" #include "src/core/lib/iomgr/closure.h" -#include "src/core/lib/iomgr/logical_thread.h" #include "src/core/lib/iomgr/resolve_address.h" #include "src/core/lib/iomgr/unix_sockets_posix.h" +#include "src/core/lib/iomgr/work_serializer.h" #include "src/core/lib/slice/slice_internal.h" #include "src/core/lib/slice/slice_string_helpers.h" @@ -87,7 +87,7 @@ class FakeResolver : public Resolver { }; FakeResolver::FakeResolver(ResolverArgs args) - : Resolver(args.logical_thread, std::move(args.result_handler)), + : Resolver(args.work_serializer, std::move(args.result_handler)), response_generator_( FakeResolverResponseGenerator::GetFromArgs(args.args)) { // Channels sharing the same subchannels may have different resolver response @@ -119,8 +119,8 @@ void FakeResolver::RequestReresolutionLocked() { if (!reresolution_closure_pending_) { reresolution_closure_pending_ = true; Ref().release(); // ref held by closure - logical_thread()->Run([this]() { ReturnReresolutionResult(); }, - DEBUG_LOCATION); + work_serializer()->Run([this]() { ReturnReresolutionResult(); }, + DEBUG_LOCATION); } } } @@ -228,7 +228,7 @@ void FakeResolverResponseGenerator::SetResponse(Resolver::Result result) { } FakeResolverResponseSetter* arg = new FakeResolverResponseSetter(resolver, std::move(result)); - resolver->logical_thread()->Run( + resolver->work_serializer()->Run( [arg]() { arg->SetResponseLocked(); delete arg; @@ -246,7 +246,7 @@ void FakeResolverResponseGenerator::SetReresolutionResponse( } FakeResolverResponseSetter* arg = new FakeResolverResponseSetter(resolver, std::move(result), true); - resolver->logical_thread()->Run( + resolver->work_serializer()->Run( [arg]() { arg->SetReresolutionResponseLocked(); delete arg; @@ -263,7 +263,7 @@ void FakeResolverResponseGenerator::UnsetReresolutionResponse() { } FakeResolverResponseSetter* arg = new FakeResolverResponseSetter(resolver, Resolver::Result()); - resolver->logical_thread()->Run( + resolver->work_serializer()->Run( [arg]() { arg->SetReresolutionResponseLocked(); delete arg; @@ -280,7 +280,7 @@ void FakeResolverResponseGenerator::SetFailure() { } FakeResolverResponseSetter* arg = new FakeResolverResponseSetter(resolver, Resolver::Result()); - resolver->logical_thread()->Run( + resolver->work_serializer()->Run( [arg]() { arg->SetFailureLocked(); delete arg; @@ -297,7 +297,7 @@ void FakeResolverResponseGenerator::SetFailureOnReresolution() { } FakeResolverResponseSetter* arg = new FakeResolverResponseSetter( resolver, Resolver::Result(), false, false); - resolver->logical_thread()->Run( + resolver->work_serializer()->Run( [arg]() { arg->SetFailureLocked(); delete arg; @@ -313,7 +313,7 @@ void FakeResolverResponseGenerator::SetFakeResolver( if (has_result_) { FakeResolverResponseSetter* arg = new FakeResolverResponseSetter(resolver_, std::move(result_)); - resolver_->logical_thread()->Run( + resolver_->work_serializer()->Run( [arg]() { arg->SetResponseLocked(); delete arg; diff --git a/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc b/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc index 671b72deb8b..47aeac6ca64 100644 --- a/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +++ b/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc @@ -31,9 +31,9 @@ #include "src/core/ext/filters/client_channel/server_address.h" #include "src/core/lib/channel/channel_args.h" #include "src/core/lib/gpr/string.h" -#include "src/core/lib/iomgr/logical_thread.h" #include "src/core/lib/iomgr/resolve_address.h" #include "src/core/lib/iomgr/unix_sockets_posix.h" +#include "src/core/lib/iomgr/work_serializer.h" #include "src/core/lib/slice/slice_internal.h" #include "src/core/lib/slice/slice_string_helpers.h" @@ -57,7 +57,7 @@ class SockaddrResolver : public Resolver { SockaddrResolver::SockaddrResolver(ServerAddressList addresses, ResolverArgs args) - : Resolver(args.logical_thread, std::move(args.result_handler)), + : Resolver(args.work_serializer, std::move(args.result_handler)), addresses_(std::move(addresses)), channel_args_(grpc_channel_args_copy(args.args)) {} diff --git a/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc b/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc index 9767a875e3f..e9f1f4a33fd 100644 --- a/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +++ b/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc @@ -33,7 +33,7 @@ namespace { class XdsResolver : public Resolver { public: explicit XdsResolver(ResolverArgs args) - : Resolver(args.logical_thread, std::move(args.result_handler)), + : Resolver(args.work_serializer, std::move(args.result_handler)), args_(grpc_channel_args_copy(args.args)), interested_parties_(args.pollset_set) { char* path = args.uri->path; @@ -90,7 +90,7 @@ void XdsResolver::ServiceConfigWatcher::OnError(grpc_error* error) { void XdsResolver::StartLocked() { grpc_error* error = GRPC_ERROR_NONE; xds_client_ = MakeOrphanable( - combiner(), interested_parties_, StringView(server_name_.get()), + work_serializer(), interested_parties_, StringView(server_name_.get()), grpc_core::MakeUnique(Ref()), *args_, &error); if (error != GRPC_ERROR_NONE) { gpr_log(GPR_ERROR, diff --git a/src/core/ext/filters/client_channel/resolver_factory.h b/src/core/ext/filters/client_channel/resolver_factory.h index 0852640c8a0..d8dd801ae09 100644 --- a/src/core/ext/filters/client_channel/resolver_factory.h +++ b/src/core/ext/filters/client_channel/resolver_factory.h @@ -38,8 +38,8 @@ struct ResolverArgs { const grpc_channel_args* args = nullptr; /// Used to drive I/O in the name resolution process. grpc_pollset_set* pollset_set = nullptr; - /// The logical_thread under which all resolver calls will be run. - RefCountedPtr logical_thread; + /// The work_serializer under which all resolver calls will be run. + std::shared_ptr work_serializer; /// The result handler to be used by the resolver. std::unique_ptr result_handler; }; diff --git a/src/core/ext/filters/client_channel/resolver_registry.cc b/src/core/ext/filters/client_channel/resolver_registry.cc index 5d2393f7801..718556a4c2a 100644 --- a/src/core/ext/filters/client_channel/resolver_registry.cc +++ b/src/core/ext/filters/client_channel/resolver_registry.cc @@ -145,7 +145,8 @@ bool ResolverRegistry::IsValidTarget(const char* target) { OrphanablePtr ResolverRegistry::CreateResolver( const char* target, const grpc_channel_args* args, - grpc_pollset_set* pollset_set, RefCountedPtr logical_thread, + grpc_pollset_set* pollset_set, + std::shared_ptr work_serializer, std::unique_ptr result_handler) { GPR_ASSERT(g_state != nullptr); grpc_uri* uri = nullptr; @@ -156,7 +157,7 @@ OrphanablePtr ResolverRegistry::CreateResolver( resolver_args.uri = uri; resolver_args.args = args; resolver_args.pollset_set = pollset_set; - resolver_args.logical_thread = std::move(logical_thread); + resolver_args.work_serializer = std::move(work_serializer); resolver_args.result_handler = std::move(result_handler); OrphanablePtr resolver = factory == nullptr ? nullptr diff --git a/src/core/ext/filters/client_channel/resolver_registry.h b/src/core/ext/filters/client_channel/resolver_registry.h index a0844036229..82025065494 100644 --- a/src/core/ext/filters/client_channel/resolver_registry.h +++ b/src/core/ext/filters/client_channel/resolver_registry.h @@ -61,17 +61,16 @@ class ResolverRegistry { /// prepends default_prefix to target and tries again. /// If a resolver factory is found, uses it to instantiate a resolver and /// returns it; otherwise, returns nullptr. - /// \a args, \a pollset_set, and \a logical_thread are passed to the factory's - /// \a CreateResolver() method. - /// \a args are the channel args to be included in resolver results. - /// \a pollset_set is used to drive I/O in the name resolution process. - /// \a logical_thread is the logical_thread under which all resolver calls - /// will be run. \a result_handler is used to return results from the - /// resolver. + /// \a args, \a pollset_set, and \a work_serializer are passed to the + /// factory's \a CreateResolver() method. \a args are the channel args to be + /// included in resolver results. \a pollset_set is used to drive I/O in the + /// name resolution process. \a work_serializer is the work_serializer under + /// which all resolver calls will be run. \a result_handler is used to return + /// results from the resolver. static OrphanablePtr CreateResolver( const char* target, const grpc_channel_args* args, grpc_pollset_set* pollset_set, - RefCountedPtr logical_thread, + std::shared_ptr work_serializer, std::unique_ptr result_handler); /// Returns the default authority to pass from a client for \a target. diff --git a/src/core/ext/filters/client_channel/resolving_lb_policy.cc b/src/core/ext/filters/client_channel/resolving_lb_policy.cc index a5f1cbd34be..b6d6bfcfd54 100644 --- a/src/core/ext/filters/client_channel/resolving_lb_policy.cc +++ b/src/core/ext/filters/client_channel/resolving_lb_policy.cc @@ -186,7 +186,7 @@ ResolvingLoadBalancingPolicy::ResolvingLoadBalancingPolicy( process_resolver_result_user_data_(process_resolver_result_user_data) { GPR_ASSERT(process_resolver_result != nullptr); resolver_ = ResolverRegistry::CreateResolver( - target_uri_.get(), args.args, interested_parties(), combiner(), + target_uri_.get(), args.args, interested_parties(), work_serializer(), grpc_core::MakeUnique(Ref())); // Since the validity of args has been checked when create the channel, // CreateResolver() must return a non-null result. @@ -372,7 +372,7 @@ ResolvingLoadBalancingPolicy::CreateLbPolicyLocked( TraceStringVector* trace_strings) { ResolvingControlHelper* helper = new ResolvingControlHelper(Ref()); LoadBalancingPolicy::Args lb_policy_args; - lb_policy_args.logical_thread = logical_thread(); + lb_policy_args.work_serializer = work_serializer(); lb_policy_args.channel_control_helper = std::unique_ptr(helper); lb_policy_args.args = &args; diff --git a/src/core/ext/filters/client_channel/xds/xds_api.h b/src/core/ext/filters/client_channel/xds/xds_api.h index a961f91420f..6738052d53d 100644 --- a/src/core/ext/filters/client_channel/xds/xds_api.h +++ b/src/core/ext/filters/client_channel/xds/xds_api.h @@ -130,7 +130,7 @@ class XdsPriorityListUpdate { }; // There are two phases of accessing this class's content: -// 1. to initialize in the control plane logical_thread; +// 1. to initialize in the control plane work_serializer; // 2. to use in the data plane mutex. // So no additional synchronization is needed. class XdsDropConfig : public RefCounted { diff --git a/src/core/ext/filters/client_channel/xds/xds_client.cc b/src/core/ext/filters/client_channel/xds/xds_client.cc index e6d7e985f56..8c40b013e2f 100644 --- a/src/core/ext/filters/client_channel/xds/xds_client.cc +++ b/src/core/ext/filters/client_channel/xds/xds_client.cc @@ -46,10 +46,10 @@ #include "src/core/lib/gprpp/orphanable.h" #include "src/core/lib/gprpp/ref_counted_ptr.h" #include "src/core/lib/gprpp/sync.h" -#include "src/core/lib/iomgr/logical_thread.h" #include "src/core/lib/iomgr/sockaddr.h" #include "src/core/lib/iomgr/sockaddr_utils.h" #include "src/core/lib/iomgr/timer.h" +#include "src/core/lib/iomgr/work_serializer.h" #include "src/core/lib/slice/slice_hash_table.h" #include "src/core/lib/slice/slice_internal.h" #include "src/core/lib/slice/slice_string_helpers.h" @@ -166,40 +166,35 @@ class XdsClient::ChannelState::AdsCallState private: static void OnTimer(void* arg, grpc_error* error) { ResourceState* self = static_cast(arg); - self->ads_calld_->xds_client()->combiner_->Run( - GRPC_CLOSURE_INIT(&self->timer_callback_, OnTimerLocked, self, - nullptr), - GRPC_ERROR_REF(error)); + GRPC_ERROR_REF(error); // ref owned by lambda + self->ads_calld_->xds_client()->work_serializer_->Run( + [self, error]() { self->OnTimerLocked(error); }, DEBUG_LOCATION); } - static void OnTimerLocked(void* arg, grpc_error* error) { - ResourceState* self = static_cast(arg); - if (error == GRPC_ERROR_NONE && self->timer_pending_) { - self->timer_pending_ = false; + void OnTimerLocked(grpc_error* error) { + if (error == GRPC_ERROR_NONE && timer_pending_) { + timer_pending_ = false; char* msg; gpr_asprintf( &msg, "timeout obtaining resource {type=%s name=%s} from xds server", - self->type_url_.c_str(), self->name_.c_str()); + type_url_.c_str(), name_.c_str()); grpc_error* error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(msg); gpr_free(msg); if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) { - gpr_log(GPR_INFO, "[xds_client %p] %s", - self->ads_calld_->xds_client(), grpc_error_string(error)); + gpr_log(GPR_INFO, "[xds_client %p] %s", ads_calld_->xds_client(), + grpc_error_string(error)); } - if (self->type_url_ == kLdsTypeUrl || self->type_url_ == kRdsTypeUrl) { - self->ads_calld_->xds_client()->service_config_watcher_->OnError( - error); - } else if (self->type_url_ == kCdsTypeUrl) { - ClusterState& state = - self->ads_calld_->xds_client()->cluster_map_[self->name_]; + if (type_url_ == kLdsTypeUrl || type_url_ == kRdsTypeUrl) { + ads_calld_->xds_client()->service_config_watcher_->OnError(error); + } else if (type_url_ == kCdsTypeUrl) { + ClusterState& state = ads_calld_->xds_client()->cluster_map_[name_]; for (const auto& p : state.watchers) { p.first->OnError(GRPC_ERROR_REF(error)); } GRPC_ERROR_UNREF(error); - } else if (self->type_url_ == kEdsTypeUrl) { - EndpointState& state = - self->ads_calld_->xds_client()->endpoint_map_[self->name_]; + } else if (type_url_ == kEdsTypeUrl) { + EndpointState& state = ads_calld_->xds_client()->endpoint_map_[name_]; for (const auto& p : state.watchers) { p.first->OnError(GRPC_ERROR_REF(error)); } @@ -208,8 +203,9 @@ class XdsClient::ChannelState::AdsCallState GPR_UNREACHABLE_CODE(return ); } } - self->ads_calld_.reset(); - self->Unref(); + ads_calld_.reset(); + Unref(); + GRPC_ERROR_UNREF(error); } const std::string type_url_; @@ -243,7 +239,7 @@ class XdsClient::ChannelState::AdsCallState void AcceptEdsUpdate(EdsUpdateMap eds_update_map); static void OnRequestSent(void* arg, grpc_error* error); - static void OnRequestSentLocked(void* arg, grpc_error* error); + void OnRequestSentLocked(grpc_error* error); static void OnResponseReceived(void* arg, grpc_error* error); static void OnStatusReceived(void* arg, grpc_error* error); void OnResponseReceivedLocked(); @@ -393,7 +389,7 @@ class XdsClient::ChannelState::StateWatcher public: explicit StateWatcher(RefCountedPtr parent) : AsyncConnectivityStateWatcherInterface( - parent->xds_client()->logical_thread_), + parent->xds_client()->work_serializer_), parent_(std::move(parent)) {} private: @@ -646,7 +642,7 @@ void XdsClient::ChannelState::RetryableCall::OnRetryTimer( void* arg, grpc_error* error) { RetryableCall* calld = static_cast(arg); GRPC_ERROR_REF(error); // ref owned by lambda - calld->chand_->xds_client()->logical_thread_->Run( + calld->chand_->xds_client()->work_serializer_->Run( [calld, error]() { calld->OnRetryTimerLocked(error); }, DEBUG_LOCATION); } @@ -1077,19 +1073,18 @@ void XdsClient::ChannelState::AdsCallState::AcceptEdsUpdate( void XdsClient::ChannelState::AdsCallState::OnRequestSent(void* arg, grpc_error* error) { AdsCallState* ads_calld = static_cast(arg); - ads_calld->xds_client()->combiner_->Run( - GRPC_CLOSURE_INIT(&ads_calld->on_request_sent_, OnRequestSentLocked, - ads_calld, nullptr), - GRPC_ERROR_REF(error)); + GRPC_ERROR_REF(error); // ref owned by lambda + ads_calld->xds_client()->work_serializer_->Run( + [ads_calld, error]() { ads_calld->OnRequestSentLocked(error); }, + DEBUG_LOCATION); } void XdsClient::ChannelState::AdsCallState::OnRequestSentLocked( - void* arg, grpc_error* error) { - AdsCallState* self = static_cast(arg); - if (self->IsCurrentCallOnChannel() && error == GRPC_ERROR_NONE) { + grpc_error* error) { + if (IsCurrentCallOnChannel() && error == GRPC_ERROR_NONE) { // Clean up the sent message. - grpc_byte_buffer_destroy(self->send_message_payload_); - self->send_message_payload_ = nullptr; + grpc_byte_buffer_destroy(send_message_payload_); + send_message_payload_ = nullptr; // Continue to send another pending message if any. // TODO(roth): The current code to handle buffered messages has the // advantage of sending only the most recent list of resource names for @@ -1099,41 +1094,36 @@ void XdsClient::ChannelState::AdsCallState::OnRequestSentLocked( // order of resource types. We need to fix this if we are seeing some // resource type(s) starved due to frequent requests of other resource // type(s). - auto it = self->buffered_requests_.begin(); - if (it != self->buffered_requests_.end()) { - self->SendMessageLocked(*it); - self->buffered_requests_.erase(it); + auto it = buffered_requests_.begin(); + if (it != buffered_requests_.end()) { + SendMessageLocked(*it); + buffered_requests_.erase(it); } } - self->Unref(DEBUG_LOCATION, "ADS+OnRequestSentLocked"); + Unref(DEBUG_LOCATION, "ADS+OnRequestSentLocked"); + GRPC_ERROR_UNREF(error); } void XdsClient::ChannelState::AdsCallState::OnResponseReceived( - void* arg, grpc_error* error) { + void* arg, grpc_error* /* error */) { AdsCallState* ads_calld = static_cast(arg); - ads_calld->xds_client()->combiner_->Run( - GRPC_CLOSURE_INIT(&ads_calld->on_response_received_, - OnResponseReceivedLocked, ads_calld, nullptr), - GRPC_ERROR_REF(error)); + ads_calld->xds_client()->work_serializer_->Run( + [ads_calld]() { ads_calld->OnResponseReceivedLocked(); }, DEBUG_LOCATION); } -void XdsClient::ChannelState::AdsCallState::OnResponseReceivedLocked( - void* arg, grpc_error* /*error*/) { - AdsCallState* ads_calld = static_cast(arg); - XdsClient* xds_client = ads_calld->xds_client(); +void XdsClient::ChannelState::AdsCallState::OnResponseReceivedLocked() { // Empty payload means the call was cancelled. - if (!ads_calld->IsCurrentCallOnChannel() || - ads_calld->recv_message_payload_ == nullptr) { - ads_calld->Unref(DEBUG_LOCATION, "ADS+OnResponseReceivedLocked"); + if (!IsCurrentCallOnChannel() || recv_message_payload_ == nullptr) { + Unref(DEBUG_LOCATION, "ADS+OnResponseReceivedLocked"); return; } // Read the response. grpc_byte_buffer_reader bbr; - grpc_byte_buffer_reader_init(&bbr, ads_calld->recv_message_payload_); + grpc_byte_buffer_reader_init(&bbr, recv_message_payload_); grpc_slice response_slice = grpc_byte_buffer_reader_readall(&bbr); grpc_byte_buffer_reader_destroy(&bbr); - grpc_byte_buffer_destroy(ads_calld->recv_message_payload_); - ads_calld->recv_message_payload_ = nullptr; + grpc_byte_buffer_destroy(recv_message_payload_); + recv_message_payload_ = nullptr; // TODO(juanlishen): When we convert this to use the xds protocol, the // balancer will send us a fallback timeout such that we should go into // fallback mode if we have lost contact with the balancer after a certain @@ -1152,18 +1142,19 @@ void XdsClient::ChannelState::AdsCallState::OnResponseReceivedLocked( std::string type_url; // Note that XdsAdsResponseDecodeAndParse() also validate the response. grpc_error* parse_error = XdsAdsResponseDecodeAndParse( - response_slice, xds_client->server_name_, xds_client->route_config_name_, - ads_calld->EdsServiceNamesForRequest(), &lds_update, &rds_update, - &cds_update_map, &eds_update_map, &version, &nonce, &type_url); + response_slice, xds_client()->server_name_, + xds_client()->route_config_name_, EdsServiceNamesForRequest(), + &lds_update, &rds_update, &cds_update_map, &eds_update_map, &version, + &nonce, &type_url); grpc_slice_unref_internal(response_slice); if (type_url.empty()) { // Ignore unparsable response. gpr_log(GPR_ERROR, "[xds_client %p] No type_url found. error=%s", - xds_client, grpc_error_string(parse_error)); + xds_client(), grpc_error_string(parse_error)); GRPC_ERROR_UNREF(parse_error); } else { // Update nonce. - auto& state = ads_calld->state_map_[type_url]; + auto& state = state_map_[type_url]; state.nonce = std::move(nonce); // NACK or ACK the response. if (parse_error != GRPC_ERROR_NONE) { @@ -1173,34 +1164,33 @@ void XdsClient::ChannelState::AdsCallState::OnResponseReceivedLocked( gpr_log( GPR_ERROR, "[xds_client %p] ADS response can't be accepted, NACKing. error=%s", - xds_client, grpc_error_string(parse_error)); - ads_calld->SendMessageLocked(type_url); + xds_client(), grpc_error_string(parse_error)); + SendMessageLocked(type_url); } else { - ads_calld->seen_response_ = true; + seen_response_ = true; // Accept the ADS response according to the type_url. if (type_url == kLdsTypeUrl) { - ads_calld->AcceptLdsUpdate(std::move(lds_update)); + AcceptLdsUpdate(std::move(lds_update)); } else if (type_url == kRdsTypeUrl) { - ads_calld->AcceptRdsUpdate(std::move(rds_update)); + AcceptRdsUpdate(std::move(rds_update)); } else if (type_url == kCdsTypeUrl) { - ads_calld->AcceptCdsUpdate(std::move(cds_update_map)); + AcceptCdsUpdate(std::move(cds_update_map)); } else if (type_url == kEdsTypeUrl) { - ads_calld->AcceptEdsUpdate(std::move(eds_update_map)); + AcceptEdsUpdate(std::move(eds_update_map)); } state.version = std::move(version); // ACK the update. - ads_calld->SendMessageLocked(type_url); + SendMessageLocked(type_url); // Start load reporting if needed. - auto& lrs_call = ads_calld->chand()->lrs_calld_; + auto& lrs_call = chand()->lrs_calld_; if (lrs_call != nullptr) { LrsCallState* lrs_calld = lrs_call->calld(); if (lrs_calld != nullptr) lrs_calld->MaybeStartReportingLocked(); } } } - if (xds_client->shutting_down_) { - ads_calld->Unref(DEBUG_LOCATION, - "ADS+OnResponseReceivedLocked+xds_shutdown"); + if (xds_client()->shutting_down_) { + Unref(DEBUG_LOCATION, "ADS+OnResponseReceivedLocked+xds_shutdown"); return; } // Keep listening for updates. @@ -1221,7 +1211,7 @@ void XdsClient::ChannelState::AdsCallState::OnStatusReceived( void* arg, grpc_error* error) { AdsCallState* ads_calld = static_cast(arg); GRPC_ERROR_REF(error); // ref owned by lambda - ads_calld->xds_client()->logical_thread_->Run( + ads_calld->xds_client()->work_serializer_->Run( [ads_calld, error]() { ads_calld->OnStatusReceivedLocked(error); }, DEBUG_LOCATION); } @@ -1300,7 +1290,7 @@ void XdsClient::ChannelState::LrsCallState::Reporter::OnNextReportTimer( void* arg, grpc_error* error) { Reporter* self = static_cast(arg); GRPC_ERROR_REF(error); // ref owned by lambda - self->xds_client()->logical_thread_->Run( + self->xds_client()->work_serializer_->Run( [self, error]() { self->OnNextReportTimerLocked(error); }, DEBUG_LOCATION); } @@ -1352,7 +1342,7 @@ void XdsClient::ChannelState::LrsCallState::Reporter::OnReportDone( void* arg, grpc_error* error) { Reporter* self = static_cast(arg); GRPC_ERROR_REF(error); // ref owned by lambda - self->xds_client()->logical_thread_->Run( + self->xds_client()->work_serializer_->Run( [self, error]() { self->OnReportDoneLocked(error); }, DEBUG_LOCATION); } @@ -1528,7 +1518,7 @@ bool XdsClient::ChannelState::LrsCallState::ShouldSendLoadReports( void XdsClient::ChannelState::LrsCallState::OnInitialRequestSent( void* arg, grpc_error* /*error*/) { LrsCallState* lrs_calld = static_cast(arg); - lrs_calld->xds_client()->logical_thread_->Run( + lrs_calld->xds_client()->work_serializer_->Run( [lrs_calld]() { lrs_calld->OnInitialRequestSentLocked(); }, DEBUG_LOCATION); } @@ -1544,7 +1534,7 @@ void XdsClient::ChannelState::LrsCallState::OnInitialRequestSentLocked() { void XdsClient::ChannelState::LrsCallState::OnResponseReceived( void* arg, grpc_error* /*error*/) { LrsCallState* lrs_calld = static_cast(arg); - lrs_calld->xds_client()->logical_thread_->Run( + lrs_calld->xds_client()->work_serializer_->Run( [lrs_calld]() { lrs_calld->OnResponseReceivedLocked(); }, DEBUG_LOCATION); } @@ -1580,12 +1570,12 @@ void XdsClient::ChannelState::LrsCallState::OnResponseReceivedLocked() { gpr_log(GPR_INFO, "[xds_client %p] LRS response received, %" PRIuPTR " cluster names, load_report_interval=%" PRId64 "ms", - xds_client, new_cluster_names.size(), + xds_client(), new_cluster_names.size(), new_load_reporting_interval); size_t i = 0; for (const auto& name : new_cluster_names) { gpr_log(GPR_INFO, "[xds_client %p] cluster_name %" PRIuPTR ": %s", - xds_client, i++, name.c_str()); + xds_client(), i++, name.c_str()); } } if (new_load_reporting_interval < @@ -1600,8 +1590,8 @@ void XdsClient::ChannelState::LrsCallState::OnResponseReceivedLocked() { } } // Ignore identical update. - if (lrs_calld->cluster_names_ == new_cluster_names && - lrs_calld->load_reporting_interval_ == new_load_reporting_interval) { + if (cluster_names_ == new_cluster_names && + load_reporting_interval_ == new_load_reporting_interval) { if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) { gpr_log(GPR_INFO, "[xds_client %p] Incoming LRS response identical to current, " @@ -1613,8 +1603,8 @@ void XdsClient::ChannelState::LrsCallState::OnResponseReceivedLocked() { // Stop current load reporting (if any) to adopt the new config. reporter_.reset(); // Record the new config. - lrs_calld->cluster_names_ = std::move(new_cluster_names); - lrs_calld->load_reporting_interval_ = new_load_reporting_interval; + cluster_names_ = std::move(new_cluster_names); + load_reporting_interval_ = new_load_reporting_interval; // Try starting sending load report. MaybeStartReportingLocked(); }(); @@ -1641,7 +1631,7 @@ void XdsClient::ChannelState::LrsCallState::OnStatusReceived( void* arg, grpc_error* error) { LrsCallState* lrs_calld = static_cast(arg); GRPC_ERROR_REF(error); // ref owned by lambda - lrs_calld->xds_client()->logical_thread_->Run( + lrs_calld->xds_client()->work_serializer_->Run( [lrs_calld, error]() { lrs_calld->OnStatusReceivedLocked(error); }, DEBUG_LOCATION); } @@ -1696,7 +1686,7 @@ UniquePtr GenerateBuildVersionString() { } // namespace -XdsClient::XdsClient(RefCountedPtr logical_thread, +XdsClient::XdsClient(std::shared_ptr work_serializer, grpc_pollset_set* interested_parties, StringView server_name, std::unique_ptr watcher, @@ -1704,7 +1694,7 @@ XdsClient::XdsClient(RefCountedPtr logical_thread, : InternallyRefCounted(&grpc_xds_client_trace), request_timeout_(GetRequestTimeout(channel_args)), build_version_(GenerateBuildVersionString()), - combiner_(GRPC_COMBINER_REF(combiner, "xds_client")), + work_serializer_(std::move(work_serializer)), interested_parties_(interested_parties), bootstrap_(XdsBootstrap::ReadFromFile(error)), server_name_(server_name), diff --git a/src/core/ext/filters/client_channel/xds/xds_client.h b/src/core/ext/filters/client_channel/xds/xds_client.h index 3abed152e74..3f458893bc8 100644 --- a/src/core/ext/filters/client_channel/xds/xds_client.h +++ b/src/core/ext/filters/client_channel/xds/xds_client.h @@ -32,7 +32,7 @@ #include "src/core/lib/gprpp/ref_counted.h" #include "src/core/lib/gprpp/ref_counted_ptr.h" #include "src/core/lib/gprpp/string_view.h" -#include "src/core/lib/iomgr/logical_thread.h" +#include "src/core/lib/iomgr/work_serializer.h" namespace grpc_core { @@ -73,7 +73,7 @@ class XdsClient : public InternallyRefCounted { // If *error is not GRPC_ERROR_NONE after construction, then there was // an error initializing the client. - XdsClient(RefCountedPtr logical_thread, + XdsClient(std::shared_ptr work_serializer, grpc_pollset_set* interested_parties, StringView server_name, std::unique_ptr watcher, const grpc_channel_args& channel_args, grpc_error** error); @@ -202,12 +202,12 @@ class XdsClient : public InternallyRefCounted { static int ChannelArgCmp(void* p, void* q); static const grpc_arg_pointer_vtable kXdsClientVtable; - + const grpc_millis request_timeout_; grpc_core::UniquePtr build_version_; - RefCountedPtr logical_thread_; + std::shared_ptr work_serializer_; grpc_pollset_set* interested_parties_; std::unique_ptr bootstrap_; diff --git a/src/core/ext/filters/client_channel/xds/xds_client_stats.h b/src/core/ext/filters/client_channel/xds/xds_client_stats.h index a896c4e6877..0b399654134 100644 --- a/src/core/ext/filters/client_channel/xds/xds_client_stats.h +++ b/src/core/ext/filters/client_channel/xds/xds_client_stats.h @@ -132,20 +132,20 @@ class XdsClientStats { // If the refcount is 0, there won't be new calls recorded to the // LocalityStats, so the LocalityStats can be safely deleted when all the // in-progress calls have finished. - // Only be called from the control plane logical_thread. + // Only be called from the control plane work_serializer. void RefByPicker() { picker_refcount_.FetchAdd(1, MemoryOrder::ACQ_REL); } - // Might be called from the control plane logical_thread or the data plane + // Might be called from the control plane work_serializer or the data plane // mutex. // TODO(juanlishen): Once https://github.com/grpc/grpc/pull/19390 is merged, // this method will also only be invoked in the control plane - // logical_thread. We may then be able to simplify the LocalityStats' + // work_serializer. We may then be able to simplify the LocalityStats' // lifetime by making it RefCounted<> and populating the protobuf in its // dtor. void UnrefByPicker() { picker_refcount_.FetchSub(1, MemoryOrder::ACQ_REL); } - // Only be called from the control plane logical_thread. + // Only be called from the control plane work_serializer. // The only place where the picker_refcount_ can be increased is // RefByPicker(), which also can only be called from the control plane - // logical_thread. Also, if the picker_refcount_ is 0, + // work_serializer. Also, if the picker_refcount_ is 0, // total_requests_in_progress_ can't be increased from 0. So it's safe to // delete the LocalityStats right after this method returns true. bool IsSafeToDelete() { @@ -164,12 +164,12 @@ class XdsClientStats { Atomic total_issued_requests_{0}; // Protects load_metric_stats_. A mutex is necessary because the length of // load_metric_stats_ can be accessed by both the callback intercepting the - // call's recv_trailing_metadata (not from any logical_thread) and the load - // reporting thread (from the control plane logical_thread). + // call's recv_trailing_metadata (not from any work_serializer) and the load + // reporting thread (from the control plane work_serializer). Mutex load_metric_stats_mu_; LoadMetricMap load_metric_stats_; - // Can be accessed from either the control plane logical_thread or the data - // plane logical_thread. + // Can be accessed from either the control plane work_serializer or the data + // plane work_serializer. Atomic picker_refcount_{0}; }; @@ -215,7 +215,7 @@ class XdsClientStats { // Protects dropped_requests_. A mutex is necessary because the length of // dropped_requests_ can be accessed by both the picker (from data plane // mutex) and the load reporting thread (from the control plane - // logical_thread). + // work_serializer). Mutex dropped_requests_mu_; DroppedRequestsMap dropped_requests_; // The timestamp of last reporting. For the LB-policy-wide first report, the diff --git a/src/core/lib/iomgr/closure.h b/src/core/lib/iomgr/closure.h index 6234f65c685..a90b694ee0b 100644 --- a/src/core/lib/iomgr/closure.h +++ b/src/core/lib/iomgr/closure.h @@ -251,11 +251,6 @@ class Closure { #endif GRPC_ERROR_UNREF(error); } - - static std::function ToFunction(grpc_closure* closure, - grpc_error* error) { - return [closure, error] { Run(DEBUG_LOCATION, closure, error); }; - } }; } // namespace grpc_core diff --git a/src/core/lib/transport/connectivity_state.cc b/src/core/lib/transport/connectivity_state.cc index b1507391a06..2d34f52e635 100644 --- a/src/core/lib/transport/connectivity_state.cc +++ b/src/core/lib/transport/connectivity_state.cc @@ -59,11 +59,12 @@ class AsyncConnectivityStateWatcherInterface::Notifier { public: Notifier(RefCountedPtr watcher, grpc_connectivity_state state, - const RefCountedPtr& logical_thread) + const std::shared_ptr& work_serializer) : watcher_(std::move(watcher)), state_(state) { - if (logical_thread != nullptr) { - logical_thread->Run([this]() { SendNotification(this, GRPC_ERROR_NONE); }, - DEBUG_LOCATION); + if (work_serializer != nullptr) { + work_serializer->Run( + [this]() { SendNotification(this, GRPC_ERROR_NONE); }, + DEBUG_LOCATION); } else { GRPC_CLOSURE_INIT(&closure_, SendNotification, this, grpc_schedule_on_exec_ctx); @@ -89,7 +90,7 @@ class AsyncConnectivityStateWatcherInterface::Notifier { void AsyncConnectivityStateWatcherInterface::Notify( grpc_connectivity_state state) { - new Notifier(Ref(), state, logical_thread_); // Deletes itself when done. + new Notifier(Ref(), state, work_serializer_); // Deletes itself when done. } // diff --git a/src/core/lib/transport/connectivity_state.h b/src/core/lib/transport/connectivity_state.h index 4eb053eb27e..5ab62bed40c 100644 --- a/src/core/lib/transport/connectivity_state.h +++ b/src/core/lib/transport/connectivity_state.h @@ -29,7 +29,7 @@ #include "src/core/lib/gprpp/orphanable.h" #include "src/core/lib/iomgr/closure.h" #include "src/core/lib/iomgr/exec_ctx.h" -#include "src/core/lib/iomgr/logical_thread.h" +#include "src/core/lib/iomgr/work_serializer.h" namespace grpc_core { @@ -72,14 +72,14 @@ class AsyncConnectivityStateWatcherInterface // If \a combiner is nullptr, then the notification will be scheduled on the // ExecCtx. explicit AsyncConnectivityStateWatcherInterface( - RefCountedPtr logical_thread = nullptr) - : logical_thread_(std::move(logical_thread)) {} + std::shared_ptr work_serializer = nullptr) + : work_serializer_(std::move(work_serializer)) {} // Invoked asynchronously when Notify() is called. virtual void OnConnectivityStateChange(grpc_connectivity_state new_state) = 0; private: - RefCountedPtr logical_thread_; + std::shared_ptr work_serializer_; }; // Tracks connectivity state. Maintains a list of watchers that are diff --git a/test/core/client_channel/resolvers/dns_resolver_connectivity_test.cc b/test/core/client_channel/resolvers/dns_resolver_connectivity_test.cc index 1064653c1d0..0e9a110a9f1 100644 --- a/test/core/client_channel/resolvers/dns_resolver_connectivity_test.cc +++ b/test/core/client_channel/resolvers/dns_resolver_connectivity_test.cc @@ -26,14 +26,14 @@ #include "src/core/ext/filters/client_channel/resolver_registry.h" #include "src/core/ext/filters/client_channel/server_address.h" #include "src/core/lib/channel/channel_args.h" -#include "src/core/lib/iomgr/logical_thread.h" +#include "src/core/lib/iomgr/work_serializer.h" #include "src/core/lib/iomgr/resolve_address.h" #include "src/core/lib/iomgr/timer.h" #include "test/core/util/test_config.h" static gpr_mu g_mu; static bool g_fail_resolution = true; -static grpc_core::RefCountedPtr* g_logical_thread; +static std::shared_ptr* g_work_serializer; static void my_resolve_address(const char* addr, const char* /*default_port*/, grpc_pollset_set* /*interested_parties*/, @@ -66,7 +66,7 @@ static grpc_ares_request* my_dns_lookup_ares_locked( std::unique_ptr* addresses, bool /*check_grpclb*/, char** /*service_config_json*/, int /*query_timeout_ms*/, - grpc_core::RefCountedPtr /*logical_thread*/) { + std::shared_ptr /*work_serializer*/) { gpr_mu_lock(&g_mu); GPR_ASSERT(0 == strcmp("test", addr)); grpc_error* error = GRPC_ERROR_NONE; @@ -99,7 +99,7 @@ static grpc_core::OrphanablePtr create_resolver( GPR_ASSERT(uri); grpc_core::ResolverArgs args; args.uri = uri; - args.logical_thread = *g_logical_thread; + args.work_serializer = *g_work_serializer; args.result_handler = std::move(result_handler); grpc_core::OrphanablePtr resolver = factory->CreateResolver(std::move(args)); @@ -163,8 +163,8 @@ int main(int argc, char** argv) { gpr_mu_init(&g_mu); { grpc_core::ExecCtx exec_ctx; - auto logical_thread = grpc_core::MakeRefCounted(); - g_logical_thread = &logical_thread; + auto work_serializer = grpc_core::MakeRefCounted(); + g_work_serializer = &work_serializer; grpc_set_resolver_impl(&test_resolver); grpc_dns_lookup_ares_locked = my_dns_lookup_ares_locked; grpc_cancel_ares_request_locked = my_cancel_ares_request_locked; diff --git a/test/core/client_channel/resolvers/dns_resolver_cooldown_test.cc b/test/core/client_channel/resolvers/dns_resolver_cooldown_test.cc index 9bf218c8ad8..1bc1c89c97f 100644 --- a/test/core/client_channel/resolvers/dns_resolver_cooldown_test.cc +++ b/test/core/client_channel/resolvers/dns_resolver_cooldown_test.cc @@ -26,7 +26,7 @@ #include "src/core/ext/filters/client_channel/server_address.h" #include "src/core/lib/channel/channel_args.h" #include "src/core/lib/gprpp/memory.h" -#include "src/core/lib/iomgr/logical_thread.h" +#include "src/core/lib/iomgr/work_serializer.h" #include "src/core/lib/iomgr/sockaddr_utils.h" #include "test/core/util/test_config.h" @@ -37,14 +37,14 @@ constexpr int kMinResolutionPeriodForCheckMs = 900; extern grpc_address_resolver_vtable* grpc_resolve_address_impl; static grpc_address_resolver_vtable* default_resolve_address; -static grpc_core::RefCountedPtr* g_logical_thread; +static std::shared_ptr* g_work_serializer; static grpc_ares_request* (*g_default_dns_lookup_ares_locked)( const char* dns_server, const char* name, const char* default_port, grpc_pollset_set* interested_parties, grpc_closure* on_done, std::unique_ptr* addresses, bool check_grpclb, char** service_config_json, int query_timeout_ms, - grpc_core::RefCountedPtr logical_thread); + std::shared_ptr work_serializer); // Counter incremented by test_resolve_address_impl indicating the number of // times a system-level resolution has happened. @@ -95,11 +95,11 @@ static grpc_ares_request* test_dns_lookup_ares_locked( grpc_pollset_set* /*interested_parties*/, grpc_closure* on_done, std::unique_ptr* addresses, bool check_grpclb, char** service_config_json, int query_timeout_ms, - grpc_core::RefCountedPtr logical_thread) { + std::shared_ptr work_serializer) { grpc_ares_request* result = g_default_dns_lookup_ares_locked( dns_server, name, default_port, g_iomgr_args.pollset_set, on_done, addresses, check_grpclb, service_config_json, query_timeout_ms, - std::move(logical_thread)); + std::move(work_serializer)); ++g_resolution_count; static grpc_millis last_resolution_time = 0; grpc_millis now = @@ -272,7 +272,7 @@ static void on_first_resolution(OnResolutionCallbackArg* cb_arg) { gpr_mu_unlock(g_iomgr_args.mu); } -static void start_test_under_logical_thread(void* arg) { +static void start_test_under_work_serializer(void* arg) { OnResolutionCallbackArg* res_cb_arg = static_cast(arg); res_cb_arg->result_handler = new ResultHandler(); @@ -284,7 +284,7 @@ static void start_test_under_logical_thread(void* arg) { GPR_ASSERT(uri != nullptr); grpc_core::ResolverArgs args; args.uri = uri; - args.logical_thread = *g_logical_thread; + args.work_serializer = *g_work_serializer; args.result_handler = std::unique_ptr( res_cb_arg->result_handler); g_resolution_count = 0; @@ -308,8 +308,8 @@ static void test_cooldown() { OnResolutionCallbackArg* res_cb_arg = new OnResolutionCallbackArg(); res_cb_arg->uri_str = "dns:127.0.0.1"; - (*g_logical_thread) - ->Run([res_cb_arg]() { start_test_under_logical_thread(res_cb_arg); }, + (*g_work_serializer) + ->Run([res_cb_arg]() { start_test_under_work_serializer(res_cb_arg); }, DEBUG_LOCATION); grpc_core::ExecCtx::Get()->Flush(); poll_pollset_until_request_done(&g_iomgr_args); @@ -320,8 +320,8 @@ int main(int argc, char** argv) { grpc::testing::TestEnvironment env(argc, argv); grpc_init(); - auto logical_thread = grpc_core::MakeRefCounted(); - g_logical_thread = &logical_thread; + auto work_serializer = grpc_core::MakeRefCounted(); + g_work_serializer = &work_serializer; g_default_dns_lookup_ares_locked = grpc_dns_lookup_ares_locked; grpc_dns_lookup_ares_locked = test_dns_lookup_ares_locked; diff --git a/test/core/client_channel/resolvers/dns_resolver_test.cc b/test/core/client_channel/resolvers/dns_resolver_test.cc index d2b01bf435e..cb701ca0b52 100644 --- a/test/core/client_channel/resolvers/dns_resolver_test.cc +++ b/test/core/client_channel/resolvers/dns_resolver_test.cc @@ -25,10 +25,10 @@ #include "src/core/ext/filters/client_channel/resolver_registry.h" #include "src/core/lib/gpr/string.h" #include "src/core/lib/gprpp/memory.h" -#include "src/core/lib/iomgr/logical_thread.h" +#include "src/core/lib/iomgr/work_serializer.h" #include "test/core/util/test_config.h" -static grpc_core::RefCountedPtr* g_logical_thread; +static std::shared_ptr* g_work_serializer; class TestResultHandler : public grpc_core::Resolver::ResultHandler { void ReturnResult(grpc_core::Resolver::Result /*result*/) override {} @@ -44,7 +44,7 @@ static void test_succeeds(grpc_core::ResolverFactory* factory, GPR_ASSERT(uri); grpc_core::ResolverArgs args; args.uri = uri; - args.logical_thread = *g_logical_thread; + args.work_serializer = *g_work_serializer; args.result_handler = grpc_core::MakeUnique(); grpc_core::OrphanablePtr resolver = factory->CreateResolver(std::move(args)); @@ -61,7 +61,7 @@ static void test_fails(grpc_core::ResolverFactory* factory, GPR_ASSERT(uri); grpc_core::ResolverArgs args; args.uri = uri; - args.logical_thread = *g_logical_thread; + args.work_serializer = *g_work_serializer; args.result_handler = grpc_core::MakeUnique(); grpc_core::OrphanablePtr resolver = factory->CreateResolver(std::move(args)); @@ -73,8 +73,8 @@ int main(int argc, char** argv) { grpc::testing::TestEnvironment env(argc, argv); grpc_init(); { - auto logical_thread = grpc_core::MakeRefCounted(); - g_logical_thread = &logical_thread; + auto work_serializer = grpc_core::MakeRefCounted(); + g_work_serializer = &work_serializer; grpc_core::ResolverFactory* dns = grpc_core::ResolverRegistry::LookupResolverFactory("dns"); diff --git a/test/core/client_channel/resolvers/fake_resolver_test.cc b/test/core/client_channel/resolvers/fake_resolver_test.cc index cbd746c8f6b..9eb4364cc89 100644 --- a/test/core/client_channel/resolvers/fake_resolver_test.cc +++ b/test/core/client_channel/resolvers/fake_resolver_test.cc @@ -28,7 +28,7 @@ #include "src/core/ext/filters/client_channel/server_address.h" #include "src/core/lib/channel/channel_args.h" #include "src/core/lib/gprpp/ref_counted_ptr.h" -#include "src/core/lib/iomgr/logical_thread.h" +#include "src/core/lib/iomgr/work_serializer.h" #include "src/core/lib/security/credentials/fake/fake_credentials.h" #include "test/core/util/test_config.h" @@ -63,7 +63,7 @@ class ResultHandler : public grpc_core::Resolver::ResultHandler { }; static grpc_core::OrphanablePtr build_fake_resolver( - grpc_core::RefCountedPtr logical_thread, + std::shared_ptr work_serializer, grpc_core::FakeResolverResponseGenerator* response_generator, std::unique_ptr result_handler) { grpc_core::ResolverFactory* factory = @@ -74,7 +74,7 @@ static grpc_core::OrphanablePtr build_fake_resolver( grpc_channel_args channel_args = {1, &generator_arg}; grpc_core::ResolverArgs args; args.args = &channel_args; - args.logical_thread = std::move(logical_thread); + args.work_serializer = std::move(work_serializer); args.result_handler = std::move(result_handler); grpc_core::OrphanablePtr resolver = factory->CreateResolver(std::move(args)); @@ -118,7 +118,7 @@ static grpc_core::Resolver::Result create_new_resolver_result() { static void test_fake_resolver() { grpc_core::ExecCtx exec_ctx; - grpc_core::RefCountedPtr logical_thread = + std::shared_ptr work_serializer = grpc_core::MakeRefCounted(); // Create resolver. ResultHandler* result_handler = new ResultHandler(); @@ -126,7 +126,7 @@ static void test_fake_resolver() { response_generator = grpc_core::MakeRefCounted(); grpc_core::OrphanablePtr resolver = build_fake_resolver( - logical_thread, response_generator.get(), + work_serializer, response_generator.get(), std::unique_ptr(result_handler)); GPR_ASSERT(resolver.get() != nullptr); resolver->StartLocked(); diff --git a/test/core/client_channel/resolvers/sockaddr_resolver_test.cc b/test/core/client_channel/resolvers/sockaddr_resolver_test.cc index 7ce2ad9c247..1249b2ffeb7 100644 --- a/test/core/client_channel/resolvers/sockaddr_resolver_test.cc +++ b/test/core/client_channel/resolvers/sockaddr_resolver_test.cc @@ -24,11 +24,11 @@ #include "src/core/ext/filters/client_channel/resolver_registry.h" #include "src/core/lib/channel/channel_args.h" -#include "src/core/lib/iomgr/logical_thread.h" +#include "src/core/lib/iomgr/work_serializer.h" #include "test/core/util/test_config.h" -static grpc_core::RefCountedPtr* g_logical_thread; +static std::shared_ptr* g_work_serializer; class ResultHandler : public grpc_core::Resolver::ResultHandler { public: @@ -46,7 +46,7 @@ static void test_succeeds(grpc_core::ResolverFactory* factory, GPR_ASSERT(uri); grpc_core::ResolverArgs args; args.uri = uri; - args.logical_thread = *g_logical_thread; + args.work_serializer = *g_work_serializer; args.result_handler = grpc_core::MakeUnique(); grpc_core::OrphanablePtr resolver = factory->CreateResolver(std::move(args)); @@ -67,7 +67,7 @@ static void test_fails(grpc_core::ResolverFactory* factory, GPR_ASSERT(uri); grpc_core::ResolverArgs args; args.uri = uri; - args.logical_thread = *g_logical_thread; + args.work_serializer = *g_work_serializer; args.result_handler = grpc_core::MakeUnique(); grpc_core::OrphanablePtr resolver = factory->CreateResolver(std::move(args)); @@ -79,8 +79,8 @@ int main(int argc, char** argv) { grpc::testing::TestEnvironment env(argc, argv); grpc_init(); - auto logical_thread = grpc_core::MakeRefCounted(); - g_logical_thread = &logical_thread; + auto work_serializer = grpc_core::MakeRefCounted(); + g_work_serializer = &work_serializer; grpc_core::ResolverFactory* ipv4 = grpc_core::ResolverRegistry::LookupResolverFactory("ipv4"); diff --git a/test/core/end2end/fuzzers/api_fuzzer.cc b/test/core/end2end/fuzzers/api_fuzzer.cc index e29401dbf5a..c565acc72b3 100644 --- a/test/core/end2end/fuzzers/api_fuzzer.cc +++ b/test/core/end2end/fuzzers/api_fuzzer.cc @@ -380,7 +380,7 @@ grpc_ares_request* my_dns_lookup_ares_locked( std::unique_ptr* addresses, bool /*check_grpclb*/, char** /*service_config_json*/, int /*query_timeout*/, - grpc_core::RefCountedPtr /*combiner*/) { + std::shared_ptr /*combiner*/) { addr_req* r = static_cast(gpr_malloc(sizeof(*r))); r->addr = gpr_strdup(addr); r->on_done = on_done; diff --git a/test/core/end2end/goaway_server_test.cc b/test/core/end2end/goaway_server_test.cc index 3ebbbbdbbfd..61165f01c79 100644 --- a/test/core/end2end/goaway_server_test.cc +++ b/test/core/end2end/goaway_server_test.cc @@ -49,7 +49,7 @@ static grpc_ares_request* (*iomgr_dns_lookup_ares_locked)( grpc_pollset_set* interested_parties, grpc_closure* on_done, std::unique_ptr* addresses, bool check_grpclb, char** service_config_json, int query_timeout_ms, - grpc_core::RefCountedPtr combiner); + std::shared_ptr combiner); static void (*iomgr_cancel_ares_request_locked)(grpc_ares_request* request); @@ -106,7 +106,7 @@ static grpc_ares_request* my_dns_lookup_ares_locked( grpc_pollset_set* interested_parties, grpc_closure* on_done, std::unique_ptr* addresses, bool check_grpclb, char** service_config_json, int query_timeout_ms, - grpc_core::RefCountedPtr combiner) { + std::shared_ptr combiner) { if (0 != strcmp(addr, "test")) { return iomgr_dns_lookup_ares_locked(dns_server, addr, default_port, interested_parties, on_done, addresses, diff --git a/test/core/util/test_lb_policies.cc b/test/core/util/test_lb_policies.cc index ea1a6c2830c..1624ec45402 100644 --- a/test/core/util/test_lb_policies.cc +++ b/test/core/util/test_lb_policies.cc @@ -55,7 +55,7 @@ class ForwardingLoadBalancingPolicy : public LoadBalancingPolicy { const std::string& delegate_policy_name, intptr_t initial_refcount = 1) : LoadBalancingPolicy(std::move(args), initial_refcount) { Args delegate_args; - delegate_args.logical_thread = logical_thread(); + delegate_args.work_serializer = work_serializer(); delegate_args.channel_control_helper = std::move(delegating_helper); delegate_args.args = args.args; delegate_ = LoadBalancingPolicyRegistry::CreateLoadBalancingPolicy( diff --git a/test/cpp/naming/cancel_ares_query_test.cc b/test/cpp/naming/cancel_ares_query_test.cc index 726f7eff765..7cb568e591e 100644 --- a/test/cpp/naming/cancel_ares_query_test.cc +++ b/test/cpp/naming/cancel_ares_query_test.cc @@ -36,7 +36,7 @@ #include "src/core/lib/gpr/string.h" #include "src/core/lib/gprpp/orphanable.h" #include "src/core/lib/gprpp/thd.h" -#include "src/core/lib/iomgr/logical_thread.h" +#include "src/core/lib/iomgr/work_serializer.h" #include "src/core/lib/iomgr/pollset.h" #include "src/core/lib/iomgr/pollset_set.h" #include "test/core/end2end/cq_verifier.h" @@ -81,7 +81,7 @@ struct ArgsStruct { gpr_mu* mu; grpc_pollset* pollset; grpc_pollset_set* pollset_set; - grpc_core::RefCountedPtr lock; + std::shared_ptr lock; grpc_channel_args* channel_args; }; diff --git a/test/cpp/naming/resolver_component_test.cc b/test/cpp/naming/resolver_component_test.cc index 22389f15b1a..d3d30daa07f 100644 --- a/test/cpp/naming/resolver_component_test.cc +++ b/test/cpp/naming/resolver_component_test.cc @@ -51,7 +51,7 @@ #include "src/core/lib/gprpp/orphanable.h" #include "src/core/lib/iomgr/executor.h" #include "src/core/lib/iomgr/iomgr.h" -#include "src/core/lib/iomgr/logical_thread.h" +#include "src/core/lib/iomgr/work_serializer.h" #include "src/core/lib/iomgr/resolve_address.h" #include "src/core/lib/iomgr/sockaddr_utils.h" #include "src/core/lib/iomgr/socket_utils.h" @@ -192,7 +192,7 @@ struct ArgsStruct { gpr_mu* mu; grpc_pollset* pollset; grpc_pollset_set* pollset_set; - grpc_core::RefCountedPtr lock; + std::shared_ptr lock; grpc_channel_args* channel_args; vector expected_addrs; std::string expected_service_config_string; From 9ca286a48f71914e088069f2df5fabf8cd940d2f Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Fri, 7 Feb 2020 16:14:33 -0800 Subject: [PATCH 054/758] Replace LogicalThread with WorkSerializer --- .../filters/client_channel/client_channel.cc | 4 +-- .../resolver/dns/c_ares/dns_resolver_ares.cc | 2 +- .../resolver/dns/native/dns_resolver.cc | 2 +- .../resolver/fake/fake_resolver.cc | 22 +++++++------ .../resolver/fake/fake_resolver.h | 1 - .../ext/filters/client_channel/subchannel.cc | 33 ++++++++----------- .../ext/filters/client_channel/subchannel.h | 2 ++ .../client_channel/xds/xds_client_stats.h | 2 +- .../dns_resolver_connectivity_test.cc | 13 ++++---- .../resolvers/dns_resolver_cooldown_test.cc | 10 +++--- .../resolvers/dns_resolver_test.cc | 7 ++-- .../resolvers/fake_resolver_test.cc | 6 ++-- .../resolvers/sockaddr_resolver_test.cc | 4 +-- test/core/end2end/fuzzers/api_fuzzer.cc | 2 +- test/core/end2end/goaway_server_test.cc | 4 +-- test/cpp/naming/cancel_ares_query_test.cc | 6 ++-- test/cpp/naming/resolver_component_test.cc | 6 ++-- 17 files changed, 60 insertions(+), 66 deletions(-) diff --git a/src/core/ext/filters/client_channel/client_channel.cc b/src/core/ext/filters/client_channel/client_channel.cc index e507aa0c2cb..04062305cfc 100644 --- a/src/core/ext/filters/client_channel/client_channel.cc +++ b/src/core/ext/filters/client_channel/client_channel.cc @@ -149,9 +149,7 @@ class ChannelData { RefCountedPtr service_config() const { return service_config_; } - WorkSerializer* work_serializer() const { - return work_serializer_.get(); - } + WorkSerializer* work_serializer() const { return work_serializer_.get(); } RefCountedPtr GetConnectedSubchannelInDataPlane( SubchannelInterface* subchannel) const; diff --git a/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc b/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc index 2d5ff217e6d..536e689e972 100644 --- a/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +++ b/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc @@ -120,7 +120,7 @@ class AresDnsResolver : public Resolver { }; AresDnsResolver::AresDnsResolver(ResolverArgs args) - : Resolver(args.work_serializer, std::move(args.result_handler)), + : Resolver(std::move(args.work_serializer), std::move(args.result_handler)), backoff_( BackOff::Options() .set_initial_backoff(GRPC_DNS_INITIAL_CONNECT_BACKOFF_SECONDS * diff --git a/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc b/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc index f838601ffd2..5dbab4f0c56 100644 --- a/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +++ b/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc @@ -97,7 +97,7 @@ class NativeDnsResolver : public Resolver { }; NativeDnsResolver::NativeDnsResolver(ResolverArgs args) - : Resolver(args.work_serializer, std::move(args.result_handler)), + : Resolver(std::move(args.work_serializer), std::move(args.result_handler)), backoff_( BackOff::Options() .set_initial_backoff(GRPC_DNS_INITIAL_CONNECT_BACKOFF_SECONDS * diff --git a/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc b/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc index 252c8e9d126..7d679829385 100644 --- a/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +++ b/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc @@ -45,6 +45,8 @@ namespace grpc_core { +// This cannot be in an anonymous namespace, because it is a friend of +// FakeResolverResponseGenerator. class FakeResolver : public Resolver { public: explicit FakeResolver(ResolverArgs args); @@ -87,7 +89,7 @@ class FakeResolver : public Resolver { }; FakeResolver::FakeResolver(ResolverArgs args) - : Resolver(args.work_serializer, std::move(args.result_handler)), + : Resolver(std::move(args.work_serializer), std::move(args.result_handler)), response_generator_( FakeResolverResponseGenerator::GetFromArgs(args.args)) { // Channels sharing the same subchannels may have different resolver response @@ -171,7 +173,7 @@ class FakeResolverResponseSetter { bool has_result = false, bool immediate = true) : resolver_(std::move(resolver)), - result_(result), + result_(std::move(result)), has_result_(has_result), immediate_(immediate) {} void SetResponseLocked(); @@ -185,26 +187,32 @@ class FakeResolverResponseSetter { bool immediate_; }; +// Deletes object when done void FakeResolverResponseSetter::SetReresolutionResponseLocked() { if (!resolver_->shutdown_) { resolver_->reresolution_result_ = std::move(result_); resolver_->has_reresolution_result_ = has_result_; } + delete this; } +// Deletes object when done void FakeResolverResponseSetter::SetResponseLocked() { if (!resolver_->shutdown_) { resolver_->next_result_ = std::move(result_); resolver_->has_next_result_ = true; resolver_->MaybeSendResultLocked(); } + delete this; } +// Deletes object when done void FakeResolverResponseSetter::SetFailureLocked() { if (!resolver_->shutdown_) { resolver_->return_failure_ = true; if (immediate_) resolver_->MaybeSendResultLocked(); } + delete this; } // @@ -231,7 +239,6 @@ void FakeResolverResponseGenerator::SetResponse(Resolver::Result result) { resolver->work_serializer()->Run( [arg]() { arg->SetResponseLocked(); - delete arg; }, DEBUG_LOCATION); } @@ -245,11 +252,10 @@ void FakeResolverResponseGenerator::SetReresolutionResponse( resolver = resolver_->Ref(); } FakeResolverResponseSetter* arg = - new FakeResolverResponseSetter(resolver, std::move(result), true); + new FakeResolverResponseSetter(resolver, std::move(result), true /* has_result */); resolver->work_serializer()->Run( [arg]() { arg->SetReresolutionResponseLocked(); - delete arg; }, DEBUG_LOCATION); } @@ -266,7 +272,6 @@ void FakeResolverResponseGenerator::UnsetReresolutionResponse() { resolver->work_serializer()->Run( [arg]() { arg->SetReresolutionResponseLocked(); - delete arg; }, DEBUG_LOCATION); } @@ -283,7 +288,6 @@ void FakeResolverResponseGenerator::SetFailure() { resolver->work_serializer()->Run( [arg]() { arg->SetFailureLocked(); - delete arg; }, DEBUG_LOCATION); } @@ -296,11 +300,10 @@ void FakeResolverResponseGenerator::SetFailureOnReresolution() { resolver = resolver_->Ref(); } FakeResolverResponseSetter* arg = new FakeResolverResponseSetter( - resolver, Resolver::Result(), false, false); + resolver, Resolver::Result(), false /* has_result */, false /* immediate */); resolver->work_serializer()->Run( [arg]() { arg->SetFailureLocked(); - delete arg; }, DEBUG_LOCATION); } @@ -316,7 +319,6 @@ void FakeResolverResponseGenerator::SetFakeResolver( resolver_->work_serializer()->Run( [arg]() { arg->SetResponseLocked(); - delete arg; }, DEBUG_LOCATION); has_result_ = false; diff --git a/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h b/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h index 5e837a82fd4..b9fd90c069f 100644 --- a/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +++ b/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h @@ -20,7 +20,6 @@ #include #include "src/core/ext/filters/client_channel/resolver.h" -#include "src/core/ext/filters/client_channel/resolver_factory.h" #include "src/core/lib/channel/channel_args.h" #include "src/core/lib/gprpp/ref_counted.h" #include "src/core/lib/iomgr/error.h" diff --git a/src/core/ext/filters/client_channel/subchannel.cc b/src/core/ext/filters/client_channel/subchannel.cc index 2fad1d37cd9..626c825bebe 100644 --- a/src/core/ext/filters/client_channel/subchannel.cc +++ b/src/core/ext/filters/client_channel/subchannel.cc @@ -362,17 +362,17 @@ class Subchannel::ConnectedSubchannelStateWatcher Subchannel* subchannel_; }; -namespace { -// Deletes itself when done -class AsyncWatcherNotifier { +// Asynchronously notifies the \a watcher of a change in the connectvity state +// of \a subchannel to the current \a state. Deletes itself when done. +class Subchannel::AsyncWatcherNotifier { public: AsyncWatcherNotifier( RefCountedPtr watcher, - RefCountedPtr connected_subchannel, - grpc_connectivity_state state) - : watcher_(std::move(watcher)), - connected_subchannel_(std::move(connected_subchannel)), - state_(state) { + Subchannel* subchannel, grpc_connectivity_state state) + : watcher_(std::move(watcher)), state_(state) { + if (state_ == GRPC_CHANNEL_READY) { + connected_subchannel_ = subchannel->connected_subchannel_; + } ExecCtx::Run(DEBUG_LOCATION, GRPC_CLOSURE_INIT( &closure_, @@ -386,12 +386,13 @@ class AsyncWatcherNotifier { this, nullptr), GRPC_ERROR_NONE); } + + private: RefCountedPtr watcher_; RefCountedPtr connected_subchannel_; grpc_connectivity_state state_; grpc_closure closure_; }; -} // namespace // // Subchannel::ConnectivityStateWatcherList @@ -410,11 +411,7 @@ void Subchannel::ConnectivityStateWatcherList::RemoveWatcherLocked( void Subchannel::ConnectivityStateWatcherList::NotifyLocked( Subchannel* subchannel, grpc_connectivity_state state) { for (const auto& p : watchers_) { - RefCountedPtr connected_subchannel; - if (state == GRPC_CHANNEL_READY) { - connected_subchannel = subchannel->connected_subchannel_; - } - new AsyncWatcherNotifier(p.second, connected_subchannel, state); + new AsyncWatcherNotifier(p.second, subchannel, state); } } @@ -453,11 +450,7 @@ class Subchannel::HealthWatcherMap::HealthWatcher grpc_connectivity_state initial_state, RefCountedPtr watcher) { if (state_ != initial_state) { - RefCountedPtr connected_subchannel; - if (state_ == GRPC_CHANNEL_READY) { - connected_subchannel = subchannel_->connected_subchannel_; - } - new AsyncWatcherNotifier(watcher, connected_subchannel, state_); + new AsyncWatcherNotifier(watcher, subchannel_, state_); } watcher_list_.AddWatcherLocked(std::move(watcher)); } @@ -818,7 +811,7 @@ void Subchannel::WatchConnectivityState( } if (health_check_service_name == nullptr) { if (state_ != initial_state) { - new AsyncWatcherNotifier(watcher, connected_subchannel_, state_); + new AsyncWatcherNotifier(watcher, this, state_); } watcher_list_.AddWatcherLocked(std::move(watcher)); } else { diff --git a/src/core/ext/filters/client_channel/subchannel.h b/src/core/ext/filters/client_channel/subchannel.h index dcdce9b6795..732b7c2023f 100644 --- a/src/core/ext/filters/client_channel/subchannel.h +++ b/src/core/ext/filters/client_channel/subchannel.h @@ -332,6 +332,8 @@ class Subchannel { class ConnectedSubchannelStateWatcher; + class AsyncWatcherNotifier; + // Sets the subchannel's connectivity state to \a state. void SetConnectivityStateLocked(grpc_connectivity_state state); diff --git a/src/core/ext/filters/client_channel/xds/xds_client_stats.h b/src/core/ext/filters/client_channel/xds/xds_client_stats.h index 0b399654134..3c8b7b890cb 100644 --- a/src/core/ext/filters/client_channel/xds/xds_client_stats.h +++ b/src/core/ext/filters/client_channel/xds/xds_client_stats.h @@ -169,7 +169,7 @@ class XdsClientStats { Mutex load_metric_stats_mu_; LoadMetricMap load_metric_stats_; // Can be accessed from either the control plane work_serializer or the data - // plane work_serializer. + // plane mutex. Atomic picker_refcount_{0}; }; diff --git a/test/core/client_channel/resolvers/dns_resolver_connectivity_test.cc b/test/core/client_channel/resolvers/dns_resolver_connectivity_test.cc index 0e9a110a9f1..177c9694881 100644 --- a/test/core/client_channel/resolvers/dns_resolver_connectivity_test.cc +++ b/test/core/client_channel/resolvers/dns_resolver_connectivity_test.cc @@ -26,14 +26,14 @@ #include "src/core/ext/filters/client_channel/resolver_registry.h" #include "src/core/ext/filters/client_channel/server_address.h" #include "src/core/lib/channel/channel_args.h" -#include "src/core/lib/iomgr/work_serializer.h" #include "src/core/lib/iomgr/resolve_address.h" #include "src/core/lib/iomgr/timer.h" +#include "src/core/lib/iomgr/work_serializer.h" #include "test/core/util/test_config.h" static gpr_mu g_mu; static bool g_fail_resolution = true; -static std::shared_ptr* g_work_serializer; +static std::shared_ptr* g_work_serializer; static void my_resolve_address(const char* addr, const char* /*default_port*/, grpc_pollset_set* /*interested_parties*/, @@ -66,7 +66,7 @@ static grpc_ares_request* my_dns_lookup_ares_locked( std::unique_ptr* addresses, bool /*check_grpclb*/, char** /*service_config_json*/, int /*query_timeout_ms*/, - std::shared_ptr /*work_serializer*/) { + std::shared_ptr /*work_serializer*/) { gpr_mu_lock(&g_mu); GPR_ASSERT(0 == strcmp("test", addr)); grpc_error* error = GRPC_ERROR_NONE; @@ -161,13 +161,14 @@ int main(int argc, char** argv) { grpc_init(); gpr_mu_init(&g_mu); - { - grpc_core::ExecCtx exec_ctx; - auto work_serializer = grpc_core::MakeRefCounted(); + auto work_serializer = std::make_shared(); g_work_serializer = &work_serializer; grpc_set_resolver_impl(&test_resolver); grpc_dns_lookup_ares_locked = my_dns_lookup_ares_locked; grpc_cancel_ares_request_locked = my_cancel_ares_request_locked; + + { + grpc_core::ExecCtx exec_ctx; ResultHandler* result_handler = new ResultHandler(); grpc_core::OrphanablePtr resolver = create_resolver( "dns:test", diff --git a/test/core/client_channel/resolvers/dns_resolver_cooldown_test.cc b/test/core/client_channel/resolvers/dns_resolver_cooldown_test.cc index 1bc1c89c97f..140704ab68b 100644 --- a/test/core/client_channel/resolvers/dns_resolver_cooldown_test.cc +++ b/test/core/client_channel/resolvers/dns_resolver_cooldown_test.cc @@ -26,8 +26,8 @@ #include "src/core/ext/filters/client_channel/server_address.h" #include "src/core/lib/channel/channel_args.h" #include "src/core/lib/gprpp/memory.h" -#include "src/core/lib/iomgr/work_serializer.h" #include "src/core/lib/iomgr/sockaddr_utils.h" +#include "src/core/lib/iomgr/work_serializer.h" #include "test/core/util/test_config.h" constexpr int kMinResolutionPeriodMs = 1000; @@ -37,14 +37,14 @@ constexpr int kMinResolutionPeriodForCheckMs = 900; extern grpc_address_resolver_vtable* grpc_resolve_address_impl; static grpc_address_resolver_vtable* default_resolve_address; -static std::shared_ptr* g_work_serializer; +static std::shared_ptr* g_work_serializer; static grpc_ares_request* (*g_default_dns_lookup_ares_locked)( const char* dns_server, const char* name, const char* default_port, grpc_pollset_set* interested_parties, grpc_closure* on_done, std::unique_ptr* addresses, bool check_grpclb, char** service_config_json, int query_timeout_ms, - std::shared_ptr work_serializer); + std::shared_ptr work_serializer); // Counter incremented by test_resolve_address_impl indicating the number of // times a system-level resolution has happened. @@ -95,7 +95,7 @@ static grpc_ares_request* test_dns_lookup_ares_locked( grpc_pollset_set* /*interested_parties*/, grpc_closure* on_done, std::unique_ptr* addresses, bool check_grpclb, char** service_config_json, int query_timeout_ms, - std::shared_ptr work_serializer) { + std::shared_ptr work_serializer) { grpc_ares_request* result = g_default_dns_lookup_ares_locked( dns_server, name, default_port, g_iomgr_args.pollset_set, on_done, addresses, check_grpclb, service_config_json, query_timeout_ms, @@ -320,7 +320,7 @@ int main(int argc, char** argv) { grpc::testing::TestEnvironment env(argc, argv); grpc_init(); - auto work_serializer = grpc_core::MakeRefCounted(); + auto work_serializer = std::make_shared(); g_work_serializer = &work_serializer; g_default_dns_lookup_ares_locked = grpc_dns_lookup_ares_locked; diff --git a/test/core/client_channel/resolvers/dns_resolver_test.cc b/test/core/client_channel/resolvers/dns_resolver_test.cc index cb701ca0b52..1b4f8a89a43 100644 --- a/test/core/client_channel/resolvers/dns_resolver_test.cc +++ b/test/core/client_channel/resolvers/dns_resolver_test.cc @@ -28,7 +28,7 @@ #include "src/core/lib/iomgr/work_serializer.h" #include "test/core/util/test_config.h" -static std::shared_ptr* g_work_serializer; +static std::shared_ptr* g_work_serializer; class TestResultHandler : public grpc_core::Resolver::ResultHandler { void ReturnResult(grpc_core::Resolver::Result /*result*/) override {} @@ -72,8 +72,8 @@ static void test_fails(grpc_core::ResolverFactory* factory, int main(int argc, char** argv) { grpc::testing::TestEnvironment env(argc, argv); grpc_init(); - { - auto work_serializer = grpc_core::MakeRefCounted(); + + auto work_serializer = std::make_shared(); g_work_serializer = &work_serializer; grpc_core::ResolverFactory* dns = @@ -90,7 +90,6 @@ int main(int argc, char** argv) { } else { test_succeeds(dns, "dns://8.8.8.8/8.8.8.8:8888"); } - } grpc_shutdown(); return 0; diff --git a/test/core/client_channel/resolvers/fake_resolver_test.cc b/test/core/client_channel/resolvers/fake_resolver_test.cc index 9eb4364cc89..e69eaa0883f 100644 --- a/test/core/client_channel/resolvers/fake_resolver_test.cc +++ b/test/core/client_channel/resolvers/fake_resolver_test.cc @@ -63,7 +63,7 @@ class ResultHandler : public grpc_core::Resolver::ResultHandler { }; static grpc_core::OrphanablePtr build_fake_resolver( - std::shared_ptr work_serializer, + std::shared_ptr work_serializer, grpc_core::FakeResolverResponseGenerator* response_generator, std::unique_ptr result_handler) { grpc_core::ResolverFactory* factory = @@ -118,8 +118,8 @@ static grpc_core::Resolver::Result create_new_resolver_result() { static void test_fake_resolver() { grpc_core::ExecCtx exec_ctx; - std::shared_ptr work_serializer = - grpc_core::MakeRefCounted(); + std::shared_ptr work_serializer = + std::make_shared(); // Create resolver. ResultHandler* result_handler = new ResultHandler(); grpc_core::RefCountedPtr diff --git a/test/core/client_channel/resolvers/sockaddr_resolver_test.cc b/test/core/client_channel/resolvers/sockaddr_resolver_test.cc index 1249b2ffeb7..814841e1044 100644 --- a/test/core/client_channel/resolvers/sockaddr_resolver_test.cc +++ b/test/core/client_channel/resolvers/sockaddr_resolver_test.cc @@ -28,7 +28,7 @@ #include "test/core/util/test_config.h" -static std::shared_ptr* g_work_serializer; +static std::shared_ptr* g_work_serializer; class ResultHandler : public grpc_core::Resolver::ResultHandler { public: @@ -79,7 +79,7 @@ int main(int argc, char** argv) { grpc::testing::TestEnvironment env(argc, argv); grpc_init(); - auto work_serializer = grpc_core::MakeRefCounted(); + auto work_serializer = std::make_shared(); g_work_serializer = &work_serializer; grpc_core::ResolverFactory* ipv4 = diff --git a/test/core/end2end/fuzzers/api_fuzzer.cc b/test/core/end2end/fuzzers/api_fuzzer.cc index c565acc72b3..0d2563d38d3 100644 --- a/test/core/end2end/fuzzers/api_fuzzer.cc +++ b/test/core/end2end/fuzzers/api_fuzzer.cc @@ -380,7 +380,7 @@ grpc_ares_request* my_dns_lookup_ares_locked( std::unique_ptr* addresses, bool /*check_grpclb*/, char** /*service_config_json*/, int /*query_timeout*/, - std::shared_ptr /*combiner*/) { + std::shared_ptr /*work_serializer*/) { addr_req* r = static_cast(gpr_malloc(sizeof(*r))); r->addr = gpr_strdup(addr); r->on_done = on_done; diff --git a/test/core/end2end/goaway_server_test.cc b/test/core/end2end/goaway_server_test.cc index 61165f01c79..ac4534696c5 100644 --- a/test/core/end2end/goaway_server_test.cc +++ b/test/core/end2end/goaway_server_test.cc @@ -49,7 +49,7 @@ static grpc_ares_request* (*iomgr_dns_lookup_ares_locked)( grpc_pollset_set* interested_parties, grpc_closure* on_done, std::unique_ptr* addresses, bool check_grpclb, char** service_config_json, int query_timeout_ms, - std::shared_ptr combiner); + std::shared_ptr combiner); static void (*iomgr_cancel_ares_request_locked)(grpc_ares_request* request); @@ -106,7 +106,7 @@ static grpc_ares_request* my_dns_lookup_ares_locked( grpc_pollset_set* interested_parties, grpc_closure* on_done, std::unique_ptr* addresses, bool check_grpclb, char** service_config_json, int query_timeout_ms, - std::shared_ptr combiner) { + std::shared_ptr combiner) { if (0 != strcmp(addr, "test")) { return iomgr_dns_lookup_ares_locked(dns_server, addr, default_port, interested_parties, on_done, addresses, diff --git a/test/cpp/naming/cancel_ares_query_test.cc b/test/cpp/naming/cancel_ares_query_test.cc index 7cb568e591e..c367dfdb2e7 100644 --- a/test/cpp/naming/cancel_ares_query_test.cc +++ b/test/cpp/naming/cancel_ares_query_test.cc @@ -36,9 +36,9 @@ #include "src/core/lib/gpr/string.h" #include "src/core/lib/gprpp/orphanable.h" #include "src/core/lib/gprpp/thd.h" -#include "src/core/lib/iomgr/work_serializer.h" #include "src/core/lib/iomgr/pollset.h" #include "src/core/lib/iomgr/pollset_set.h" +#include "src/core/lib/iomgr/work_serializer.h" #include "test/core/end2end/cq_verifier.h" #include "test/core/util/cmdline.h" #include "test/core/util/port.h" @@ -81,7 +81,7 @@ struct ArgsStruct { gpr_mu* mu; grpc_pollset* pollset; grpc_pollset_set* pollset_set; - std::shared_ptr lock; + std::shared_ptr lock; grpc_channel_args* channel_args; }; @@ -90,7 +90,7 @@ void ArgsInit(ArgsStruct* args) { grpc_pollset_init(args->pollset, &args->mu); args->pollset_set = grpc_pollset_set_create(); grpc_pollset_set_add_pollset(args->pollset_set, args->pollset); - args->lock = grpc_core::MakeRefCounted(); + args->lock = std::make_shared(); gpr_atm_rel_store(&args->done_atm, 0); args->channel_args = nullptr; } diff --git a/test/cpp/naming/resolver_component_test.cc b/test/cpp/naming/resolver_component_test.cc index d3d30daa07f..fdbc6a1240d 100644 --- a/test/cpp/naming/resolver_component_test.cc +++ b/test/cpp/naming/resolver_component_test.cc @@ -51,10 +51,10 @@ #include "src/core/lib/gprpp/orphanable.h" #include "src/core/lib/iomgr/executor.h" #include "src/core/lib/iomgr/iomgr.h" -#include "src/core/lib/iomgr/work_serializer.h" #include "src/core/lib/iomgr/resolve_address.h" #include "src/core/lib/iomgr/sockaddr_utils.h" #include "src/core/lib/iomgr/socket_utils.h" +#include "src/core/lib/iomgr/work_serializer.h" #include "test/core/util/port.h" #include "test/core/util/test_config.h" @@ -192,7 +192,7 @@ struct ArgsStruct { gpr_mu* mu; grpc_pollset* pollset; grpc_pollset_set* pollset_set; - std::shared_ptr lock; + std::shared_ptr lock; grpc_channel_args* channel_args; vector expected_addrs; std::string expected_service_config_string; @@ -206,7 +206,7 @@ void ArgsInit(ArgsStruct* args) { grpc_pollset_init(args->pollset, &args->mu); args->pollset_set = grpc_pollset_set_create(); grpc_pollset_set_add_pollset(args->pollset_set, args->pollset); - args->lock = grpc_core::MakeRefCounted(); + args->lock = std::make_shared(); gpr_atm_rel_store(&args->done_atm, 0); args->channel_args = nullptr; } From 44c0477d65b62aaff7ad3b646012439a1ea32902 Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Mon, 10 Feb 2020 11:37:48 -0800 Subject: [PATCH 055/758] Remaning commits --- .../filters/client_channel/client_channel.cc | 4 +- .../lb_policy/subchannel_list.h | 2 +- .../client_channel/local_subchannel_pool.h | 4 +- .../resolver/fake/fake_resolver.cc | 45 ++++++------------- .../dns_resolver_connectivity_test.cc | 14 +++--- .../resolvers/dns_resolver_test.cc | 32 ++++++------- 6 files changed, 42 insertions(+), 59 deletions(-) diff --git a/src/core/ext/filters/client_channel/client_channel.cc b/src/core/ext/filters/client_channel/client_channel.cc index 04062305cfc..a1fbd6ae08e 100644 --- a/src/core/ext/filters/client_channel/client_channel.cc +++ b/src/core/ext/filters/client_channel/client_channel.cc @@ -1062,7 +1062,7 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface { void ApplyUpdateInControlPlaneLogicalThread() { if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) { gpr_log(GPR_INFO, - "chand=%p: processing connectivity change in logical thread " + "chand=%p: processing connectivity change in work serializer " "for subchannel wrapper %p subchannel %p " "(connected_subchannel=%p state=%s): watcher=%p", parent_->parent_->chand_, parent_->parent_.get(), @@ -3843,7 +3843,7 @@ bool CallData::PickSubchannelLocked(grpc_call_element* elem, // The picker being null means that the channel is currently in IDLE state. // The incoming call will make the channel exit IDLE. if (chand->picker() == nullptr) { - // Bounce into the control plane logical thread to exit IDLE. + // Bounce into the control plane work serializer to exit IDLE. ExecCtx::Run( DEBUG_LOCATION, GRPC_CLOSURE_CREATE( diff --git a/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h b/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h index 9f85dd0b2a2..33ce8a5c5fd 100644 --- a/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +++ b/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h @@ -62,7 +62,7 @@ class MySubchannelList }; */ -// All methods will be called from within the client_channel logical thread. +// All methods will be called from within the client_channel work serializer. namespace grpc_core { diff --git a/src/core/ext/filters/client_channel/local_subchannel_pool.h b/src/core/ext/filters/client_channel/local_subchannel_pool.h index d26d5c16a7e..7d18d9b53f5 100644 --- a/src/core/ext/filters/client_channel/local_subchannel_pool.h +++ b/src/core/ext/filters/client_channel/local_subchannel_pool.h @@ -38,8 +38,8 @@ class LocalSubchannelPool final : public SubchannelPoolInterface { ~LocalSubchannelPool() override; // Implements interface methods. - // Thread-unsafe. Intended to be invoked within the client_channel logical - // thread. + // Thread-unsafe. Intended to be invoked within the client_channel work + // serializer. Subchannel* RegisterSubchannel(SubchannelKey* key, Subchannel* constructed) override; void UnregisterSubchannel(SubchannelKey* key) override; diff --git a/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc b/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc index 7d679829385..757e2e033ed 100644 --- a/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +++ b/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc @@ -236,11 +236,8 @@ void FakeResolverResponseGenerator::SetResponse(Resolver::Result result) { } FakeResolverResponseSetter* arg = new FakeResolverResponseSetter(resolver, std::move(result)); - resolver->work_serializer()->Run( - [arg]() { - arg->SetResponseLocked(); - }, - DEBUG_LOCATION); + resolver->work_serializer()->Run([arg]() { arg->SetResponseLocked(); }, + DEBUG_LOCATION); } void FakeResolverResponseGenerator::SetReresolutionResponse( @@ -251,13 +248,10 @@ void FakeResolverResponseGenerator::SetReresolutionResponse( GPR_ASSERT(resolver_ != nullptr); resolver = resolver_->Ref(); } - FakeResolverResponseSetter* arg = - new FakeResolverResponseSetter(resolver, std::move(result), true /* has_result */); + FakeResolverResponseSetter* arg = new FakeResolverResponseSetter( + resolver, std::move(result), true /* has_result */); resolver->work_serializer()->Run( - [arg]() { - arg->SetReresolutionResponseLocked(); - }, - DEBUG_LOCATION); + [arg]() { arg->SetReresolutionResponseLocked(); }, DEBUG_LOCATION); } void FakeResolverResponseGenerator::UnsetReresolutionResponse() { @@ -270,10 +264,7 @@ void FakeResolverResponseGenerator::UnsetReresolutionResponse() { FakeResolverResponseSetter* arg = new FakeResolverResponseSetter(resolver, Resolver::Result()); resolver->work_serializer()->Run( - [arg]() { - arg->SetReresolutionResponseLocked(); - }, - DEBUG_LOCATION); + [arg]() { arg->SetReresolutionResponseLocked(); }, DEBUG_LOCATION); } void FakeResolverResponseGenerator::SetFailure() { @@ -285,11 +276,8 @@ void FakeResolverResponseGenerator::SetFailure() { } FakeResolverResponseSetter* arg = new FakeResolverResponseSetter(resolver, Resolver::Result()); - resolver->work_serializer()->Run( - [arg]() { - arg->SetFailureLocked(); - }, - DEBUG_LOCATION); + resolver->work_serializer()->Run([arg]() { arg->SetFailureLocked(); }, + DEBUG_LOCATION); } void FakeResolverResponseGenerator::SetFailureOnReresolution() { @@ -300,12 +288,10 @@ void FakeResolverResponseGenerator::SetFailureOnReresolution() { resolver = resolver_->Ref(); } FakeResolverResponseSetter* arg = new FakeResolverResponseSetter( - resolver, Resolver::Result(), false /* has_result */, false /* immediate */); - resolver->work_serializer()->Run( - [arg]() { - arg->SetFailureLocked(); - }, - DEBUG_LOCATION); + resolver, Resolver::Result(), false /* has_result */, + false /* immediate */); + resolver->work_serializer()->Run([arg]() { arg->SetFailureLocked(); }, + DEBUG_LOCATION); } void FakeResolverResponseGenerator::SetFakeResolver( @@ -316,11 +302,8 @@ void FakeResolverResponseGenerator::SetFakeResolver( if (has_result_) { FakeResolverResponseSetter* arg = new FakeResolverResponseSetter(resolver_, std::move(result_)); - resolver_->work_serializer()->Run( - [arg]() { - arg->SetResponseLocked(); - }, - DEBUG_LOCATION); + resolver_->work_serializer()->Run([arg]() { arg->SetResponseLocked(); }, + DEBUG_LOCATION); has_result_ = false; } } diff --git a/test/core/client_channel/resolvers/dns_resolver_connectivity_test.cc b/test/core/client_channel/resolvers/dns_resolver_connectivity_test.cc index 177c9694881..a5e2e5a6b0e 100644 --- a/test/core/client_channel/resolvers/dns_resolver_connectivity_test.cc +++ b/test/core/client_channel/resolvers/dns_resolver_connectivity_test.cc @@ -161,14 +161,14 @@ int main(int argc, char** argv) { grpc_init(); gpr_mu_init(&g_mu); - auto work_serializer = std::make_shared(); - g_work_serializer = &work_serializer; - grpc_set_resolver_impl(&test_resolver); - grpc_dns_lookup_ares_locked = my_dns_lookup_ares_locked; - grpc_cancel_ares_request_locked = my_cancel_ares_request_locked; - + auto work_serializer = std::make_shared(); + g_work_serializer = &work_serializer; + grpc_set_resolver_impl(&test_resolver); + grpc_dns_lookup_ares_locked = my_dns_lookup_ares_locked; + grpc_cancel_ares_request_locked = my_cancel_ares_request_locked; + { - grpc_core::ExecCtx exec_ctx; + grpc_core::ExecCtx exec_ctx; ResultHandler* result_handler = new ResultHandler(); grpc_core::OrphanablePtr resolver = create_resolver( "dns:test", diff --git a/test/core/client_channel/resolvers/dns_resolver_test.cc b/test/core/client_channel/resolvers/dns_resolver_test.cc index 1b4f8a89a43..04800096e7a 100644 --- a/test/core/client_channel/resolvers/dns_resolver_test.cc +++ b/test/core/client_channel/resolvers/dns_resolver_test.cc @@ -72,24 +72,24 @@ static void test_fails(grpc_core::ResolverFactory* factory, int main(int argc, char** argv) { grpc::testing::TestEnvironment env(argc, argv); grpc_init(); - - auto work_serializer = std::make_shared(); - g_work_serializer = &work_serializer; - grpc_core::ResolverFactory* dns = - grpc_core::ResolverRegistry::LookupResolverFactory("dns"); + auto work_serializer = std::make_shared(); + g_work_serializer = &work_serializer; - test_succeeds(dns, "dns:10.2.1.1"); - test_succeeds(dns, "dns:10.2.1.1:1234"); - test_succeeds(dns, "dns:www.google.com"); - test_succeeds(dns, "dns:///www.google.com"); - grpc_core::UniquePtr resolver = - GPR_GLOBAL_CONFIG_GET(grpc_dns_resolver); - if (gpr_stricmp(resolver.get(), "native") == 0) { - test_fails(dns, "dns://8.8.8.8/8.8.8.8:8888"); - } else { - test_succeeds(dns, "dns://8.8.8.8/8.8.8.8:8888"); - } + grpc_core::ResolverFactory* dns = + grpc_core::ResolverRegistry::LookupResolverFactory("dns"); + + test_succeeds(dns, "dns:10.2.1.1"); + test_succeeds(dns, "dns:10.2.1.1:1234"); + test_succeeds(dns, "dns:www.google.com"); + test_succeeds(dns, "dns:///www.google.com"); + grpc_core::UniquePtr resolver = + GPR_GLOBAL_CONFIG_GET(grpc_dns_resolver); + if (gpr_stricmp(resolver.get(), "native") == 0) { + test_fails(dns, "dns://8.8.8.8/8.8.8.8:8888"); + } else { + test_succeeds(dns, "dns://8.8.8.8/8.8.8.8:8888"); + } grpc_shutdown(); return 0; From 1a00b752f4ca91f7013aa2d642b26d8f162b7be9 Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Mon, 10 Feb 2020 11:55:51 -0800 Subject: [PATCH 056/758] Reviewer comments --- .../ext/filters/client_channel/lb_policy.h | 3 +-- .../ext/filters/client_channel/resolver.h | 4 ++-- .../resolver/dns/c_ares/grpc_ares_wrapper.cc | 7 ++++--- .../resolver/sockaddr/sockaddr_resolver.cc | 2 +- .../resolver/xds/xds_resolver.cc | 3 ++- .../ext/filters/client_channel/xds/xds_api.h | 2 +- .../filters/client_channel/xds/xds_client.cc | 21 ++++++++++--------- 7 files changed, 22 insertions(+), 20 deletions(-) diff --git a/src/core/ext/filters/client_channel/lb_policy.h b/src/core/ext/filters/client_channel/lb_policy.h index da29efa80b6..6cb7e5a4119 100644 --- a/src/core/ext/filters/client_channel/lb_policy.h +++ b/src/core/ext/filters/client_channel/lb_policy.h @@ -310,7 +310,6 @@ class LoadBalancingPolicy : public InternallyRefCounted { /// Args used to instantiate an LB policy. struct Args { /// The work_serializer under which all LB policy calls will be run. - /// Policy does NOT take ownership of the reference to the work_serializer. std::shared_ptr work_serializer; /// Channel control helper. /// Note: LB policies MUST NOT call any method on the helper from @@ -396,7 +395,7 @@ class LoadBalancingPolicy : public InternallyRefCounted { virtual void ShutdownLocked() = 0; private: - /// Logical Thread under which LB policy actions take place. + /// Work Serializer under which LB policy actions take place. std::shared_ptr work_serializer_; /// Owned pointer to interested parties in load balancing decisions. grpc_pollset_set* interested_parties_; diff --git a/src/core/ext/filters/client_channel/resolver.h b/src/core/ext/filters/client_channel/resolver.h index 6beef968efc..5474b462f75 100644 --- a/src/core/ext/filters/client_channel/resolver.h +++ b/src/core/ext/filters/client_channel/resolver.h @@ -122,8 +122,8 @@ class Resolver : public InternallyRefCounted { } protected: - explicit Resolver(std::shared_ptr work_serializer, - std::unique_ptr result_handler); + Resolver(std::shared_ptr work_serializer, + std::unique_ptr result_handler); /// Shuts down the resolver. virtual void ShutdownLocked() = 0; diff --git a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc index a74ea201094..7889b411166 100644 --- a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +++ b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc @@ -372,8 +372,9 @@ void grpc_dns_lookup_ares_continue_after_check_localhost_and_ip_literals_locked( } port.reset(gpr_strdup(default_port)); } - error = grpc_ares_ev_driver_create_locked( - &r->ev_driver, interested_parties, query_timeout_ms, work_serializer, r); + error = grpc_ares_ev_driver_create_locked(&r->ev_driver, interested_parties, + query_timeout_ms, + std::move(work_serializer), r); if (error != GRPC_ERROR_NONE) goto error_cleanup; channel = grpc_ares_ev_driver_get_channel_locked(r->ev_driver); // If dns_server is specified, use it. @@ -624,7 +625,7 @@ static grpc_ares_request* grpc_dns_lookup_ares_locked_impl( // Look up name using c-ares lib. grpc_dns_lookup_ares_continue_after_check_localhost_and_ip_literals_locked( r, dns_server, name, default_port, interested_parties, check_grpclb, - query_timeout_ms, work_serializer); + query_timeout_ms, std::move(work_serializer)); return r; } diff --git a/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc b/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc index 47aeac6ca64..e3eb93527c8 100644 --- a/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +++ b/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc @@ -57,7 +57,7 @@ class SockaddrResolver : public Resolver { SockaddrResolver::SockaddrResolver(ServerAddressList addresses, ResolverArgs args) - : Resolver(args.work_serializer, std::move(args.result_handler)), + : Resolver(std::move(args.work_serializer), std::move(args.result_handler)), addresses_(std::move(addresses)), channel_args_(grpc_channel_args_copy(args.args)) {} diff --git a/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc b/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc index e9f1f4a33fd..ec5fd86f7b0 100644 --- a/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +++ b/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc @@ -33,7 +33,8 @@ namespace { class XdsResolver : public Resolver { public: explicit XdsResolver(ResolverArgs args) - : Resolver(args.work_serializer, std::move(args.result_handler)), + : Resolver(std::move(args.work_serializer), + std::move(args.result_handler)), args_(grpc_channel_args_copy(args.args)), interested_parties_(args.pollset_set) { char* path = args.uri->path; diff --git a/src/core/ext/filters/client_channel/xds/xds_api.h b/src/core/ext/filters/client_channel/xds/xds_api.h index 6738052d53d..7e69f15ea77 100644 --- a/src/core/ext/filters/client_channel/xds/xds_api.h +++ b/src/core/ext/filters/client_channel/xds/xds_api.h @@ -151,7 +151,7 @@ class XdsDropConfig : public RefCounted { DropCategory{std::move(name), parts_per_million}); } - // The only method invoked from the data plane combiner. + // The only method invoked from the data plane mutex. bool ShouldDrop(const std::string** category_name) const; const DropCategoryList& drop_category_list() const { diff --git a/src/core/ext/filters/client_channel/xds/xds_client.cc b/src/core/ext/filters/client_channel/xds/xds_client.cc index 8c40b013e2f..78853468b61 100644 --- a/src/core/ext/filters/client_channel/xds/xds_client.cc +++ b/src/core/ext/filters/client_channel/xds/xds_client.cc @@ -179,26 +179,27 @@ class XdsClient::ChannelState::AdsCallState &msg, "timeout obtaining resource {type=%s name=%s} from xds server", type_url_.c_str(), name_.c_str()); - grpc_error* error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(msg); + grpc_error* watcher_error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(msg); gpr_free(msg); if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) { gpr_log(GPR_INFO, "[xds_client %p] %s", ads_calld_->xds_client(), - grpc_error_string(error)); + grpc_error_string(watcher_error)); } if (type_url_ == kLdsTypeUrl || type_url_ == kRdsTypeUrl) { - ads_calld_->xds_client()->service_config_watcher_->OnError(error); + ads_calld_->xds_client()->service_config_watcher_->OnError( + watcher_error); } else if (type_url_ == kCdsTypeUrl) { ClusterState& state = ads_calld_->xds_client()->cluster_map_[name_]; for (const auto& p : state.watchers) { - p.first->OnError(GRPC_ERROR_REF(error)); + p.first->OnError(GRPC_ERROR_REF(watcher_error)); } - GRPC_ERROR_UNREF(error); + GRPC_ERROR_UNREF(watcher_error); } else if (type_url_ == kEdsTypeUrl) { EndpointState& state = ads_calld_->xds_client()->endpoint_map_[name_]; for (const auto& p : state.watchers) { - p.first->OnError(GRPC_ERROR_REF(error)); + p.first->OnError(GRPC_ERROR_REF(watcher_error)); } - GRPC_ERROR_UNREF(error); + GRPC_ERROR_UNREF(watcher_error); } else { GPR_UNREACHABLE_CODE(return ); } @@ -241,8 +242,8 @@ class XdsClient::ChannelState::AdsCallState static void OnRequestSent(void* arg, grpc_error* error); void OnRequestSentLocked(grpc_error* error); static void OnResponseReceived(void* arg, grpc_error* error); - static void OnStatusReceived(void* arg, grpc_error* error); void OnResponseReceivedLocked(); + static void OnStatusReceived(void* arg, grpc_error* error); void OnStatusReceivedLocked(grpc_error* error); bool IsCurrentCallOnChannel() const; @@ -342,10 +343,10 @@ class XdsClient::ChannelState::LrsCallState }; static void OnInitialRequestSent(void* arg, grpc_error* error); - static void OnResponseReceived(void* arg, grpc_error* error); - static void OnStatusReceived(void* arg, grpc_error* error); void OnInitialRequestSentLocked(); + static void OnResponseReceived(void* arg, grpc_error* error); void OnResponseReceivedLocked(); + static void OnStatusReceived(void* arg, grpc_error* error); void OnStatusReceivedLocked(grpc_error* error); bool IsCurrentCallOnChannel() const; From 066550d6ee9d018634cbd9bcef4871b75a691180 Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Mon, 10 Feb 2020 12:04:02 -0800 Subject: [PATCH 057/758] Remaning logical thread references --- src/core/ext/filters/client_channel/client_channel.cc | 4 ++-- .../resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/core/ext/filters/client_channel/client_channel.cc b/src/core/ext/filters/client_channel/client_channel.cc index a1fbd6ae08e..4e91e1be68f 100644 --- a/src/core/ext/filters/client_channel/client_channel.cc +++ b/src/core/ext/filters/client_channel/client_channel.cc @@ -1054,12 +1054,12 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface { state_(new_state), connected_subchannel_(std::move(connected_subchannel)) { parent_->parent_->chand_->work_serializer_->Run( - [this]() { ApplyUpdateInControlPlaneLogicalThread(); }, + [this]() { ApplyUpdateInControlPlaneWorkSerializer(); }, DEBUG_LOCATION); } private: - void ApplyUpdateInControlPlaneLogicalThread() { + void ApplyUpdateInControlPlaneWorkSerializer() { if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) { gpr_log(GPR_INFO, "chand=%p: processing connectivity change in work serializer " diff --git a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc index 947c3657833..4cb549f619a 100644 --- a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc +++ b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc @@ -161,7 +161,7 @@ class GrpcPolledFdFactoryLibuv : public GrpcPolledFdFactory { GrpcPolledFd* NewGrpcPolledFdLocked( ares_socket_t as, grpc_pollset_set* driver_pollset_set, std::shared_ptr work_serializer) override { - return new GrpcPolledFdLibuv(as, work_serializer); + return new GrpcPolledFdLibuv(as, std::move(work_serializer)); } void ConfigureAresChannelLocked(ares_channel channel) override {} From e79e18b7d340deb8e333208d065a6b6fe5dcf871 Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Mon, 10 Feb 2020 12:54:02 -0800 Subject: [PATCH 058/758] Cleanup --- src/core/lib/iomgr/closure.h | 1 - 1 file changed, 1 deletion(-) diff --git a/src/core/lib/iomgr/closure.h b/src/core/lib/iomgr/closure.h index a90b694ee0b..aae932e305c 100644 --- a/src/core/lib/iomgr/closure.h +++ b/src/core/lib/iomgr/closure.h @@ -23,7 +23,6 @@ #include #include -#include #include #include From ee08000f4154241687141b2513c548a14b381b4f Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Mon, 10 Feb 2020 13:04:04 -0800 Subject: [PATCH 059/758] Clang-format --- .../ext/filters/client_channel/xds/xds_client.cc | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/src/core/ext/filters/client_channel/xds/xds_client.cc b/src/core/ext/filters/client_channel/xds/xds_client.cc index e25d1eda2c2..857b06649c2 100644 --- a/src/core/ext/filters/client_channel/xds/xds_client.cc +++ b/src/core/ext/filters/client_channel/xds/xds_client.cc @@ -187,18 +187,15 @@ class XdsClient::ChannelState::AdsCallState } if (type_url_ == XdsApi::kLdsTypeUrl || type_url_ == XdsApi::kRdsTypeUrl) { - ads_calld_->xds_client()->service_config_watcher_->OnError( - error); + ads_calld_->xds_client()->service_config_watcher_->OnError(error); } else if (type_url_ == XdsApi::kCdsTypeUrl) { - ClusterState& state = - ads_calld_->xds_client()->cluster_map_[name_]; + ClusterState& state = ads_calld_->xds_client()->cluster_map_[name_]; for (const auto& p : state.watchers) { p.first->OnError(GRPC_ERROR_REF(watcher_error)); } GRPC_ERROR_UNREF(error); } else if (type_url_ == XdsApi::kEdsTypeUrl) { - EndpointState& state = - ads_calld_->xds_client()->endpoint_map_[name_]; + EndpointState& state = ads_calld_->xds_client()->endpoint_map_[name_]; for (const auto& p : state.watchers) { p.first->OnError(GRPC_ERROR_REF(watcher_error)); } @@ -1142,9 +1139,10 @@ void XdsClient::ChannelState::AdsCallState::OnResponseReceivedLocked() { std::string type_url; // Note that ParseAdsResponse() also validates the response. grpc_error* parse_error = xds_client()->api_.ParseAdsResponse( - response_slice, xds_client()->server_name_, xds_client()->route_config_name_, - EdsServiceNamesForRequest(), &lds_update, &rds_update, - &cds_update_map, &eds_update_map, &version, &nonce, &type_url); + response_slice, xds_client()->server_name_, + xds_client()->route_config_name_, EdsServiceNamesForRequest(), + &lds_update, &rds_update, &cds_update_map, &eds_update_map, &version, + &nonce, &type_url); grpc_slice_unref_internal(response_slice); if (type_url.empty()) { // Ignore unparsable response. From 68ac18b09554fdc3d88d4be41fb122ec3f9965f7 Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Mon, 10 Feb 2020 13:51:25 -0800 Subject: [PATCH 060/758] Avoid linter warnings --- .../resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc | 2 +- .../resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc | 3 ++- .../client_channel/resolvers/dns_resolver_connectivity_test.cc | 3 ++- test/core/end2end/fuzzers/api_fuzzer.cc | 3 ++- 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc index e1d3884677e..70f784720e1 100644 --- a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +++ b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc @@ -98,7 +98,7 @@ class GrpcPolledFdFactoryPosix : public GrpcPolledFdFactory { }; std::unique_ptr NewGrpcPolledFdFactory( - std::shared_ptr /*work_serializer*/) { + std::shared_ptr work_serializer) { /* NOLINT */ return MakeUnique(); } diff --git a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc index 1be5906a7ba..6f0903089f0 100644 --- a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +++ b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc @@ -577,7 +577,8 @@ class GrpcPolledFdWindows { GrpcPolledFdWindows* polled_fd = static_cast(arg); GRPC_ERROR_REF(error); // ref owned by lambda polled_fd->work_serializer_->Run( - [polled_fd, error]() { OnIocpReadableLocked(error); }, DEBUG_LOCATION); + [polled_fd, error]() { polled_fd->OnIocpReadableLocked(error); }, + DEBUG_LOCATION); } // TODO(apolcyn): improve this error handling to be less conversative. diff --git a/test/core/client_channel/resolvers/dns_resolver_connectivity_test.cc b/test/core/client_channel/resolvers/dns_resolver_connectivity_test.cc index a5e2e5a6b0e..5a80a61e984 100644 --- a/test/core/client_channel/resolvers/dns_resolver_connectivity_test.cc +++ b/test/core/client_channel/resolvers/dns_resolver_connectivity_test.cc @@ -66,7 +66,8 @@ static grpc_ares_request* my_dns_lookup_ares_locked( std::unique_ptr* addresses, bool /*check_grpclb*/, char** /*service_config_json*/, int /*query_timeout_ms*/, - std::shared_ptr /*work_serializer*/) { + std::shared_ptr< + grpc_core::WorkSerializer> /* work_serializer */) { /* NOLINT */ gpr_mu_lock(&g_mu); GPR_ASSERT(0 == strcmp("test", addr)); grpc_error* error = GRPC_ERROR_NONE; diff --git a/test/core/end2end/fuzzers/api_fuzzer.cc b/test/core/end2end/fuzzers/api_fuzzer.cc index 0d2563d38d3..ce900814f3a 100644 --- a/test/core/end2end/fuzzers/api_fuzzer.cc +++ b/test/core/end2end/fuzzers/api_fuzzer.cc @@ -380,7 +380,8 @@ grpc_ares_request* my_dns_lookup_ares_locked( std::unique_ptr* addresses, bool /*check_grpclb*/, char** /*service_config_json*/, int /*query_timeout*/, - std::shared_ptr /*work_serializer*/) { + std::shared_ptr< + grpc_core::WorkSerializer> /* work_serializer */) { /* NOLINT */ addr_req* r = static_cast(gpr_malloc(sizeof(*r))); r->addr = gpr_strdup(addr); r->on_done = on_done; From 8df57e6b2f9c7b174e96d010474e8920dbc37746 Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Mon, 10 Feb 2020 17:41:45 -0800 Subject: [PATCH 061/758] Add missing error ref --- .../client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc index 780b3735da8..7e546a38bfb 100644 --- a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc +++ b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc @@ -330,6 +330,7 @@ static void on_readable_locked(fd_node* fdn, grpc_error* error) { static void on_readable(void* arg, grpc_error* error) { fd_node* fdn = static_cast(arg); + GRPC_ERROR_REF(error); /* ref owned by lambda */ fdn->ev_driver->work_serializer->Run( [fdn, error]() { on_readable_locked(fdn, error); }, DEBUG_LOCATION); } @@ -359,7 +360,7 @@ static void on_writable_locked(fd_node* fdn, grpc_error* error) { static void on_writable(void* arg, grpc_error* error) { fd_node* fdn = static_cast(arg); - GRPC_ERROR_REF(error); + GRPC_ERROR_REF(error); /* ref owned by lambda */ fdn->ev_driver->work_serializer->Run( [fdn, error]() { on_writable_locked(fdn, error); }, DEBUG_LOCATION); } From 903f7fc57a02743795007a750836f1f1bcfd0861 Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Mon, 10 Feb 2020 18:18:55 -0800 Subject: [PATCH 062/758] Compiler error --- .../resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc index d464403bc43..bf93f86f4dd 100644 --- a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc +++ b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc @@ -31,7 +31,7 @@ static grpc_ares_request* grpc_dns_lookup_ares_locked_impl( grpc_pollset_set* interested_parties, grpc_closure* on_done, std::unique_ptr* addrs, bool check_grpclb, char** service_config_json, int query_timeout_ms, - std::shared_ptr work_serializer) { + std::shared_ptr work_serializer) { return NULL; } @@ -40,7 +40,7 @@ grpc_ares_request* (*grpc_dns_lookup_ares_locked)( grpc_pollset_set* interested_parties, grpc_closure* on_done, std::unique_ptr* addrs, bool check_grpclb, char** service_config_json, int query_timeout_ms, - std::shared_ptr work_serializer) = + std::shared_ptr work_serializer) = grpc_dns_lookup_ares_locked_impl; static void grpc_cancel_ares_request_locked_impl(grpc_ares_request* r) {} From 1be7f725dfaefd5478c3c289263b9afd92d77abb Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Mon, 10 Feb 2020 19:41:06 -0800 Subject: [PATCH 063/758] Fix #21969 --- .../filters/client_channel/client_channel.cc | 29 +++++++++++-------- 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/src/core/ext/filters/client_channel/client_channel.cc b/src/core/ext/filters/client_channel/client_channel.cc index 4e91e1be68f..b35d359b915 100644 --- a/src/core/ext/filters/client_channel/client_channel.cc +++ b/src/core/ext/filters/client_channel/client_channel.cc @@ -878,19 +878,24 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface { "chand=%p: destroying subchannel wrapper %p for subchannel %p", chand_, this, subchannel_); } - chand_->subchannel_wrappers_.erase(this); - auto* subchannel_node = subchannel_->channelz_node(); - if (subchannel_node != nullptr) { - auto it = chand_->subchannel_refcount_map_.find(subchannel_); - GPR_ASSERT(it != chand_->subchannel_refcount_map_.end()); - --it->second; - if (it->second == 0) { - chand_->channelz_node_->RemoveChildSubchannel(subchannel_node->uuid()); - chand_->subchannel_refcount_map_.erase(it); + auto *subchannel_wrapper = this; + auto *subchannel = subchannel_; + auto *chand = chand_; + chand_->work_serializer()->Run([chand, subchannel, subchannel_wrapper]() { + chand->subchannel_wrappers_.erase(subchannel_wrapper); + auto* subchannel_node = subchannel->channelz_node(); + if (subchannel_node != nullptr) { + auto it = chand->subchannel_refcount_map_.find(subchannel); + GPR_ASSERT(it != chand->subchannel_refcount_map_.end()); + --it->second; + if (it->second == 0) { + chand->channelz_node_->RemoveChildSubchannel(subchannel_node->uuid()); + chand->subchannel_refcount_map_.erase(it); + } } - } - GRPC_SUBCHANNEL_UNREF(subchannel_, "unref from LB"); - GRPC_CHANNEL_STACK_UNREF(chand_->owning_stack_, "SubchannelWrapper"); + GRPC_SUBCHANNEL_UNREF(subchannel, "unref from LB"); + GRPC_CHANNEL_STACK_UNREF(chand->owning_stack_, "SubchannelWrapper"); + }, DEBUG_LOCATION); } grpc_connectivity_state CheckConnectivityState() override { From 3d17f8d4f842f857f4687a428735246215b2fde6 Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Tue, 11 Feb 2020 01:47:47 -0800 Subject: [PATCH 064/758] Use a different fix for #21969 --- .../filters/client_channel/client_channel.cc | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/src/core/ext/filters/client_channel/client_channel.cc b/src/core/ext/filters/client_channel/client_channel.cc index b35d359b915..8005692782e 100644 --- a/src/core/ext/filters/client_channel/client_channel.cc +++ b/src/core/ext/filters/client_channel/client_channel.cc @@ -878,24 +878,19 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface { "chand=%p: destroying subchannel wrapper %p for subchannel %p", chand_, this, subchannel_); } - auto *subchannel_wrapper = this; - auto *subchannel = subchannel_; - auto *chand = chand_; - chand_->work_serializer()->Run([chand, subchannel, subchannel_wrapper]() { - chand->subchannel_wrappers_.erase(subchannel_wrapper); - auto* subchannel_node = subchannel->channelz_node(); - if (subchannel_node != nullptr) { - auto it = chand->subchannel_refcount_map_.find(subchannel); - GPR_ASSERT(it != chand->subchannel_refcount_map_.end()); - --it->second; - if (it->second == 0) { - chand->channelz_node_->RemoveChildSubchannel(subchannel_node->uuid()); - chand->subchannel_refcount_map_.erase(it); - } + chand_->subchannel_wrappers_.erase(this); + auto* subchannel_node = subchannel_->channelz_node(); + if (subchannel_node != nullptr) { + auto it = chand_->subchannel_refcount_map_.find(subchannel_); + GPR_ASSERT(it != chand_->subchannel_refcount_map_.end()); + --it->second; + if (it->second == 0) { + chand_->channelz_node_->RemoveChildSubchannel(subchannel_node->uuid()); + chand_->subchannel_refcount_map_.erase(it); } - GRPC_SUBCHANNEL_UNREF(subchannel, "unref from LB"); - GRPC_CHANNEL_STACK_UNREF(chand->owning_stack_, "SubchannelWrapper"); - }, DEBUG_LOCATION); + } + GRPC_SUBCHANNEL_UNREF(subchannel_, "unref from LB"); + GRPC_CHANNEL_STACK_UNREF(chand_->owning_stack_, "SubchannelWrapper"); } grpc_connectivity_state CheckConnectivityState() override { @@ -1016,7 +1011,12 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface { parent_(std::move(parent)), last_seen_state_(initial_state) {} - ~WatcherWrapper() { parent_.reset(DEBUG_LOCATION, "WatcherWrapper"); } + ~WatcherWrapper() { + auto* parent = parent_.release(); /* ref owned by lambda */ + parent->chand_->work_serializer_->Run( + [parent]() { parent->Unref(DEBUG_LOCATION, "WatcherWrapper"); }, + DEBUG_LOCATION); + } void OnConnectivityStateChange( grpc_connectivity_state new_state, From 8a04cdafd0bfaac821317dfc36c0d78b6ccd1232 Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Tue, 11 Feb 2020 10:56:08 -0800 Subject: [PATCH 065/758] Fix for #21970 --- src/core/ext/filters/client_channel/client_channel.cc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/core/ext/filters/client_channel/client_channel.cc b/src/core/ext/filters/client_channel/client_channel.cc index 8005692782e..0b78f5bc0d9 100644 --- a/src/core/ext/filters/client_channel/client_channel.cc +++ b/src/core/ext/filters/client_channel/client_channel.cc @@ -126,6 +126,7 @@ class ChannelData { size_t per_rpc_retry_buffer_size() const { return per_rpc_retry_buffer_size_; } + grpc_channel_stack* owning_stack() const { return owning_stack_; } // Note: Does NOT return a new ref. grpc_error* disconnect_error() const { @@ -3848,6 +3849,7 @@ bool CallData::PickSubchannelLocked(grpc_call_element* elem, // The picker being null means that the channel is currently in IDLE state. // The incoming call will make the channel exit IDLE. if (chand->picker() == nullptr) { + GRPC_CHANNEL_STACK_REF(chand->owning_stack(), "PickSubchannelLocked"); // Bounce into the control plane work serializer to exit IDLE. ExecCtx::Run( DEBUG_LOCATION, @@ -3857,6 +3859,8 @@ bool CallData::PickSubchannelLocked(grpc_call_element* elem, chand->work_serializer()->Run( [chand]() { chand->CheckConnectivityState(/*try_to_connect=*/true); + GRPC_CHANNEL_STACK_UNREF(chand->owning_stack(), + "PickSubchannelLocked"); }, DEBUG_LOCATION); }, From 27b3d960633bed05f2d3c9d76a59092276128e51 Mon Sep 17 00:00:00 2001 From: Chengyuan Zhang Date: Thu, 13 Feb 2020 10:56:32 -0800 Subject: [PATCH 066/758] Update interop matrix with Java v1.26.1 --- tools/interop_matrix/client_matrix.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/interop_matrix/client_matrix.py b/tools/interop_matrix/client_matrix.py index 1cba1748313..244f84726e9 100644 --- a/tools/interop_matrix/client_matrix.py +++ b/tools/interop_matrix/client_matrix.py @@ -212,7 +212,7 @@ LANG_RELEASE_MATRIX = { ('v1.23.0', ReleaseInfo()), ('v1.24.0', ReleaseInfo()), ('v1.25.0', ReleaseInfo()), - ('v1.26.0', ReleaseInfo()), + ('v1.26.1', ReleaseInfo()), ]), 'python': OrderedDict([ From 6c6836b59099800f12b6de26d86a97108eaf301c Mon Sep 17 00:00:00 2001 From: Chengyuan Zhang Date: Thu, 13 Feb 2020 14:42:48 -0800 Subject: [PATCH 067/758] Update interop matrix with Java v1.27.1 --- tools/interop_matrix/client_matrix.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/interop_matrix/client_matrix.py b/tools/interop_matrix/client_matrix.py index 244f84726e9..6d872c74ffa 100644 --- a/tools/interop_matrix/client_matrix.py +++ b/tools/interop_matrix/client_matrix.py @@ -213,6 +213,7 @@ LANG_RELEASE_MATRIX = { ('v1.24.0', ReleaseInfo()), ('v1.25.0', ReleaseInfo()), ('v1.26.1', ReleaseInfo()), + ('v1.27.1', ReleaseInfo()), ]), 'python': OrderedDict([ From 0a023f64d0d34165d5bd0ca3d60c265772e05beb Mon Sep 17 00:00:00 2001 From: Tomasz Jonak Date: Mon, 17 Feb 2020 13:36:58 +0100 Subject: [PATCH 068/758] grpc_cli: add info about cmake gRPC_BUILD_TESTS flag To get grpc_cli make target generated with cmake, `gRPC_BUILD_TESTS` flag has to be defined. This is currently not specified in docs. --- doc/command_line_tool.md | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/doc/command_line_tool.md b/doc/command_line_tool.md index 4f40481927e..14f6f7866ab 100644 --- a/doc/command_line_tool.md +++ b/doc/command_line_tool.md @@ -52,13 +52,26 @@ Mac systems with Homebrew: brew install gflags ``` -Once the prerequisites are satisfied, you can build the command line tool with -the command: +Once the prerequisites are satisfied, generate makefiles: + +``` +$ mkdir -p cmake/build +$ cd cmake/build +$ cmake -DgRPC_BUILD_TESTS=ON ../.. +``` + +Finally you can build the command line tool with the command: ``` $ make grpc_cli ``` +To speed up compilation time on linux, you can use make with following flag: + +``` +$ make grpc_cli -j$(nproc) +``` + The main file can be found at https://github.com/grpc/grpc/blob/master/test/cpp/util/grpc_cli.cc From 9bcf81925de5ed1b2b8795a07c448a63f3234f4b Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Fri, 14 Feb 2020 12:21:22 -0800 Subject: [PATCH 069/758] Corret error referencing --- .../resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc | 4 ---- src/core/ext/filters/client_channel/xds/xds_client.cc | 5 +++-- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc index 6f0903089f0..112ffeb0ef2 100644 --- a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +++ b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc @@ -594,7 +594,6 @@ class GrpcPolledFdWindows { * the connection is TCP and read the leftovers * in subsequent c-ares reads. */ if (winsocket_->read_info.wsa_error != WSAEMSGSIZE) { - GRPC_ERROR_UNREF(error); error = GRPC_WSA_ERROR(winsocket_->read_info.wsa_error, "OnIocpReadableInner"); GRPC_CARES_TRACE_LOG( @@ -617,7 +616,6 @@ class GrpcPolledFdWindows { "fd:|%s| OnIocpReadable finishing. read buf length now:|%d|", GetName(), GRPC_SLICE_LENGTH(read_buf_)); ScheduleAndNullReadClosure(error); - GRPC_ERROR_UNREF(error); } static void OnIocpWriteable(void* arg, grpc_error* error) { @@ -633,7 +631,6 @@ class GrpcPolledFdWindows { GPR_ASSERT(socket_type_ == SOCK_STREAM); if (error == GRPC_ERROR_NONE) { if (winsocket_->write_info.wsa_error != 0) { - GRPC_ERROR_UNREF(error); error = GRPC_WSA_ERROR(winsocket_->write_info.wsa_error, "OnIocpWriteableInner"); GRPC_CARES_TRACE_LOG( @@ -655,7 +652,6 @@ class GrpcPolledFdWindows { write_buf_ = grpc_empty_slice(); } ScheduleAndNullWriteClosure(error); - GRPC_ERROR_UNREF(error); } bool gotten_into_driver_list() const { return gotten_into_driver_list_; } diff --git a/src/core/ext/filters/client_channel/xds/xds_client.cc b/src/core/ext/filters/client_channel/xds/xds_client.cc index d8191e66abf..a3ae39d6e45 100644 --- a/src/core/ext/filters/client_channel/xds/xds_client.cc +++ b/src/core/ext/filters/client_channel/xds/xds_client.cc @@ -187,13 +187,14 @@ class XdsClient::ChannelState::AdsCallState } if (type_url_ == XdsApi::kLdsTypeUrl || type_url_ == XdsApi::kRdsTypeUrl) { - ads_calld_->xds_client()->service_config_watcher_->OnError(error); + ads_calld_->xds_client()->service_config_watcher_->OnError( + watcher_error); } else if (type_url_ == XdsApi::kCdsTypeUrl) { ClusterState& state = ads_calld_->xds_client()->cluster_map_[name_]; for (const auto& p : state.watchers) { p.first->OnError(GRPC_ERROR_REF(watcher_error)); } - GRPC_ERROR_UNREF(error); + GRPC_ERROR_UNREF(watcher_error); } else if (type_url_ == XdsApi::kEdsTypeUrl) { EndpointState& state = ads_calld_->xds_client()->endpoint_map_[name_]; for (const auto& p : state.watchers) { From 7adf2f5c650b157958e7c165c481e85370154d9c Mon Sep 17 00:00:00 2001 From: Richard Belleville Date: Fri, 21 Feb 2020 23:28:19 +0000 Subject: [PATCH 070/758] Implement first pass at Python XDS interop client. I discovered a couple of existing shortcomings while implementing this client that mean this is *not yet ready for inclusion in CI*. I nonetheless want to get an early review and integrate this to the master branch, in the interest of small easily reviewable code changes. The first problem was that the bazel build has apparently never pulled roots.pem in as a data dependency. This appears not to have been a problem until XDS enters into the mix. This has been added into the Bazel build with a small change to the pyx_library rule. The larger problem is that there is currently no public Python API to get a peer's identity from the client side. This is crucial to determining the correctness of an interaction of a client-server pair under XDS. I intend to add such an method to the RpcContext interface in an upcoming PR and use it in the interop client. For the moment, I simply fake the peer details. Finally, I add a knob to run_xds_tests.py allowing multiple instances of this test to exist at once. Multiple instances forwarding to the same port cannot exist on GCE, so this enables multiple people to run tests at the same time. --- bazel/cython_library.bzl | 5 +- src/python/grpcio/grpc/_cython/BUILD.bazel | 8 + .../grpcio_tests/tests/interop/BUILD.bazel | 13 ++ .../tests/interop/xds_interop_client.py | 201 ++++++++++++++++++ tools/run_tests/run_xds_tests.py | 6 +- 5 files changed, 231 insertions(+), 2 deletions(-) create mode 100644 src/python/grpcio_tests/tests/interop/xds_interop_client.py diff --git a/bazel/cython_library.bzl b/bazel/cython_library.bzl index 3f34e185380..c9f864231c1 100644 --- a/bazel/cython_library.bzl +++ b/bazel/cython_library.bzl @@ -63,12 +63,15 @@ def pyx_library(name, deps = [], py_deps = [], srcs = [], **kwargs): ) shared_objects.append(shared_object_name) + data = shared_objects[:] + data += kwargs.pop("data", []) + # Now create a py_library with these shared objects as data. native.py_library( name = name, srcs = py_srcs, deps = py_deps, srcs_version = "PY2AND3", - data = shared_objects, + data = data, **kwargs ) diff --git a/src/python/grpcio/grpc/_cython/BUILD.bazel b/src/python/grpcio/grpc/_cython/BUILD.bazel index c7ae040a804..646d31068ca 100644 --- a/src/python/grpcio/grpc/_cython/BUILD.bazel +++ b/src/python/grpcio/grpc/_cython/BUILD.bazel @@ -2,6 +2,13 @@ package(default_visibility = ["//visibility:public"]) load("//bazel:cython_library.bzl", "pyx_library") +genrule( + name = "copy_roots_pem", + srcs = ["//:etc/roots.pem"], + outs = ["_credentials/roots.pem"], + cmd = "cp $(SRCS) $(@)", +) + pyx_library( name = "cygrpc", srcs = glob([ @@ -9,6 +16,7 @@ pyx_library( "cygrpc.pxd", "cygrpc.pyx", ]), + data = [":copy_roots_pem"], deps = [ "//:grpc", ], diff --git a/src/python/grpcio_tests/tests/interop/BUILD.bazel b/src/python/grpcio_tests/tests/interop/BUILD.bazel index 4685852162b..cd47bee2172 100644 --- a/src/python/grpcio_tests/tests/interop/BUILD.bazel +++ b/src/python/grpcio_tests/tests/interop/BUILD.bazel @@ -115,3 +115,16 @@ py2and3_test( "//src/python/grpcio_tests/tests/unit:test_common", ], ) + +py_binary( + name = "xds_interop_client", + srcs = ["xds_interop_client.py"], + python_version = "PY3", + deps = [ + "//src/proto/grpc/testing:empty_py_pb2", + "//src/proto/grpc/testing:py_messages_proto", + "//src/proto/grpc/testing:py_test_proto", + "//src/proto/grpc/testing:test_py_pb2_grpc", + "//src/python/grpcio/grpc:grpcio", + ], +) diff --git a/src/python/grpcio_tests/tests/interop/xds_interop_client.py b/src/python/grpcio_tests/tests/interop/xds_interop_client.py new file mode 100644 index 00000000000..3a79ef0f32a --- /dev/null +++ b/src/python/grpcio_tests/tests/interop/xds_interop_client.py @@ -0,0 +1,201 @@ +# Copyright 2020 The gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import argparse +import signal +import threading +import time +import sys + +from typing import DefaultDict, List, Set +import collections + +from concurrent import futures + +import grpc + +from src.proto.grpc.testing import test_pb2 +from src.proto.grpc.testing import test_pb2_grpc +from src.proto.grpc.testing import messages_pb2 +from src.proto.grpc.testing import empty_pb2 + + +# TODO: Back with a LoadBalancerStatsResponse proto? +class _StatsWatcher: + _start: int + _end: int + _rpcs_needed: int + _rpcs_by_peer: DefaultDict[str, int] + _no_remote_peer: int + _lock: threading.Lock + _condition: threading.Condition + + def __init__(self, start: int, end: int): + self._start = start + self._end = end + self._rpcs_needed = end - start + self._rpcs_by_peer = collections.defaultdict(int) + self._lock = threading.Lock() + self._condition = threading.Condition(self._lock) + self._no_remote_peer = 0 + + def on_rpc_complete(self, request_id: int, peer: str) -> None: + """Records statistics for a single RPC.""" + if self._start <= request_id < self._end: + with self._lock: + if not peer: + self._no_remote_peer += 1 + else: + self._rpcs_by_peer[peer] += 1 + self._rpcs_needed -= 1 + self._condition.notify() + + def await_rpc_stats_response(self, timeout_sec: int + ) -> messages_pb2.LoadBalancerStatsResponse: + """Blocks until a full response has been collected.""" + with self._lock: + self._condition.wait_for(lambda: not self._rpcs_needed, + timeout=float(timeout_sec)) + response = messages_pb2.LoadBalancerStatsResponse() + for peer, count in self._rpcs_by_peer.items(): + response.rpcs_by_peer[peer] = count + response.num_failures = self._no_remote_peer + self._rpcs_needed + return response + + +_global_lock = threading.Lock() +_stop_event = threading.Event() +_global_rpc_id: int = 0 +_watchers: Set[_StatsWatcher] = set() +_global_server = None + + +def _handle_sigint(sig, frame): + _stop_event.set() + _global_server.stop(None) + + +class _LoadBalancerStatsServicer(test_pb2_grpc.LoadBalancerStatsServiceServicer + ): + + def __init__(self): + super(_LoadBalancerStatsServicer).__init__() + + def GetClientStats(self, request: messages_pb2.LoadBalancerStatsRequest, + context: grpc.ServicerContext + ) -> messages_pb2.LoadBalancerStatsResponse: + print("Received stats request.") + sys.stdout.flush() + start = None + end = None + watcher = None + with _global_lock: + start = _global_rpc_id + 1 + end = start + request.num_rpcs + watcher = _StatsWatcher(start, end) + _watchers.add(watcher) + response = watcher.await_rpc_stats_response(request.timeout_sec) + with _global_lock: + _watchers.remove(watcher) + return response + + +# TODO: Accept finer-grained arguments. +def _run_single_channel(args: argparse.Namespace): + global _global_rpc_id # pylint: disable=global-statement + duration_per_query = 1.0 / float(args.qps) + with grpc.insecure_channel(args.server) as channel: + stub = test_pb2_grpc.TestServiceStub(channel) + while not _stop_event.is_set(): + request_id = None + with _global_lock: + request_id = _global_rpc_id + _global_rpc_id += 1 + print(f"Sending request to backend: {request_id}") + sys.stdout.flush() + start = time.time() + end = start + duration_per_query + call, _ = stub.UnaryCall.with_call(messages_pb2.SimpleRequest(), + timeout=float( + args.rpc_timeout_sec)) + print(f"Got result {request_id}") + sys.stdout.flush() + with _global_lock: + for watcher in _watchers: + # TODO: Implement a peer details getter. + peer = f"192.168.1.{request_id % 255}" + watcher.on_rpc_complete(request_id, peer) + if args.print_response: + if call.code() == grpc.StatusCode.OK: + print("Successful response.") + sys.stdout.flush() + else: + print(f"RPC failed: {call}") + sys.stdout.flush() + now = time.time() + while now < end: + time.sleep(end - now) + now = time.time() + + +# TODO: Accept finer-grained arguments. +def _run(args: argparse.Namespace) -> None: + global _global_server # pylint: disable=global-statement + channel_threads: List[threading.Thread] = [] + for i in range(args.num_channels): + thread = threading.Thread(target=_run_single_channel, args=(args,)) + thread.start() + channel_threads.append(thread) + _global_server = grpc.server(futures.ThreadPoolExecutor()) + _global_server.add_insecure_port(f"0.0.0.0:{args.stats_port}") + test_pb2_grpc.add_LoadBalancerStatsServiceServicer_to_server( + _LoadBalancerStatsServicer(), _global_server) + _global_server.start() + _global_server.wait_for_termination() + for i in range(args.num_channels): + thread.join() + + +if __name__ == "__main__": + parser = argparse.ArgumentParser( + description='Run Python XDS interop client.') + parser.add_argument( + "--num_channels", + default=1, + type=int, + help="The number of channels from which to send requests.") + parser.add_argument("--print_response", + default=False, + action="store_true", + help="Write RPC response to STDOUT.") + parser.add_argument( + "--qps", + default=1, + type=int, + help="The number of queries to send from each channel per second.") + parser.add_argument("--rpc_timeout_sec", + default=10, + type=int, + help="The per-RPC timeout in seconds.") + parser.add_argument("--server", + default="localhost:50051", + help="The address of the server.") + parser.add_argument( + "--stats_port", + default=50052, + type=int, + help="The port on which to expose the peer distribution stats service.") + args = parser.parse_args() + signal.signal(signal.SIGINT, _handle_sigint) + _run(args) diff --git a/tools/run_tests/run_xds_tests.py b/tools/run_tests/run_xds_tests.py index 1b1435a93b1..ed950fcad63 100755 --- a/tools/run_tests/run_xds_tests.py +++ b/tools/run_tests/run_xds_tests.py @@ -71,6 +71,10 @@ argp.add_argument( 'Continue with test even when an error occurs during setup. Intended for ' 'manual testing, where attempts to recreate any GCP resources already ' 'existing will result in an error') +argp.add_argument('--service_port', + default=55551, + type=int, + help='The port on which the test server will listen.') argp.add_argument('--verbose', help='verbose log output', default=False, @@ -97,7 +101,7 @@ TARGET_PROXY_NAME = 'test-target-proxy' + args.gcp_suffix FORWARDING_RULE_NAME = 'test-forwarding-rule' + args.gcp_suffix KEEP_GCP_RESOURCES = args.keep_gcp_resources TOLERATE_GCP_ERRORS = args.tolerate_gcp_errors -SERVICE_PORT = 55551 +SERVICE_PORT = args.service_port STATS_PORT = 55552 INSTANCE_GROUP_SIZE = 2 WAIT_FOR_OPERATION_SEC = 60 From ee0349670158de86e8d3691c78aa053b5066f2f2 Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Fri, 21 Feb 2020 16:33:03 -0800 Subject: [PATCH 071/758] Remove unused parameter comment --- .../resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc index 1c383991cdb..3d293eea960 100644 --- a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc +++ b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc @@ -74,7 +74,7 @@ class GrpcPolledFdLibuv : public GrpcPolledFd { return false; } - void ShutdownInternalLocked(grpc_error* /*error*/) { + void ShutdownInternalLocked(grpc_error* error) { uv_poll_stop(handle_); uv_close(reinterpret_cast(handle_), ares_uv_poll_close_cb); if (read_closure_ != nullptr) { @@ -168,7 +168,7 @@ class GrpcPolledFdFactoryLibuv : public GrpcPolledFdFactory { }; std::unique_ptr NewGrpcPolledFdFactory( - std::shared_ptr /*work_serializer*/) { + std::shared_ptr work_serializer) { return absl::make_unique(); } From 32ef13c264e748036785cf69e70728215600c976 Mon Sep 17 00:00:00 2001 From: Gavin Lambert Date: Mon, 24 Feb 2020 10:12:12 +1300 Subject: [PATCH 072/758] Fix cpp paths in tools to match actual codegen. --- src/csharp/Grpc.Tools.Tests/CppGeneratorTest.cs | 4 ++-- src/csharp/Grpc.Tools/GeneratorServices.cs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/csharp/Grpc.Tools.Tests/CppGeneratorTest.cs b/src/csharp/Grpc.Tools.Tests/CppGeneratorTest.cs index bd0405a03a1..37e8f323271 100644 --- a/src/csharp/Grpc.Tools.Tests/CppGeneratorTest.cs +++ b/src/csharp/Grpc.Tools.Tests/CppGeneratorTest.cs @@ -72,8 +72,8 @@ namespace Grpc.Tools.Tests Assert.AreEqual(4, poss.Length); Assert.Contains("foo.pb.cc", poss); Assert.Contains("foo.pb.h", poss); - Assert.Contains("foo_grpc.pb.cc", poss); - Assert.Contains("foo_grpc.pb.h", poss); + Assert.Contains("foo.grpc.pb.cc", poss); + Assert.Contains("foo.grpc.pb.h", poss); } [Test] diff --git a/src/csharp/Grpc.Tools/GeneratorServices.cs b/src/csharp/Grpc.Tools/GeneratorServices.cs index c69c6893a03..903dd3dacd9 100644 --- a/src/csharp/Grpc.Tools/GeneratorServices.cs +++ b/src/csharp/Grpc.Tools/GeneratorServices.cs @@ -157,8 +157,8 @@ namespace Grpc.Tools { fileStem = Path.Combine(outdir, relative, filename); } - outputs[2] = fileStem + "_grpc.pb.cc"; - outputs[3] = fileStem + "_grpc.pb.h"; + outputs[2] = fileStem + ".grpc.pb.cc"; + outputs[3] = fileStem + ".grpc.pb.h"; } return outputs; } From d657d73565010f38889795a23208de4199e4aa69 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Wed, 26 Feb 2020 16:56:12 -0800 Subject: [PATCH 073/758] Integrate existing gRPC Python stack benchmarks with Bazel --- src/python/grpcio_tests/tests/qps/BUILD.bazel | 63 +++++++++++++++++++ .../tests/qps/benchmark_client.py | 6 +- .../tests/qps/benchmark_server.py | 6 +- .../grpcio_tests/tests/qps/qps_worker.py | 2 + .../tests_aio/benchmark/worker.py | 4 +- .../performance/build_performance.sh | 3 +- .../performance/run_worker_python.sh | 2 +- 7 files changed, 77 insertions(+), 9 deletions(-) diff --git a/src/python/grpcio_tests/tests/qps/BUILD.bazel b/src/python/grpcio_tests/tests/qps/BUILD.bazel index c4f5d4dbd1a..adf39ab4244 100644 --- a/src/python/grpcio_tests/tests/qps/BUILD.bazel +++ b/src/python/grpcio_tests/tests/qps/BUILD.bazel @@ -25,3 +25,66 @@ py_library( "//src/proto/grpc/testing:stats_py_pb2", ], ) + +py_library( + name = "benchmark_client", + srcs = ["benchmark_client.py"], + srcs_version = "PY2AND3", + deps = [ + "//src/proto/grpc/testing:benchmark_service_py_pb2_grpc", + "//src/proto/grpc/testing:py_messages_proto", + "//src/python/grpcio/grpc:grpcio", + "//src/python/grpcio_tests/tests/unit:resources", + "//src/python/grpcio_tests/tests/unit:test_common", + ], +) + +py_library( + name = "benchmark_server", + srcs = ["benchmark_server.py"], + srcs_version = "PY2AND3", + deps = [ + "//src/proto/grpc/testing:benchmark_service_py_pb2_grpc", + "//src/proto/grpc/testing:py_messages_proto", + ], +) + +py_library( + name = "client_runner", + srcs = ["client_runner.py"], + srcs_version = "PY2AND3", +) + +py_library( + name = "worker_server", + srcs = ["worker_server.py"], + srcs_version = "PY2AND3", + deps = [ + ":benchmark_client", + ":benchmark_server", + ":histogram", + ":client_runner", + "//src/proto/grpc/testing:benchmark_service_py_pb2_grpc", + "//src/proto/grpc/testing:control_py_pb2", + "//src/proto/grpc/testing:payloads_py_pb2", + "//src/proto/grpc/testing:stats_py_pb2", + "//src/proto/grpc/core:stats_py_pb2", + "//src/proto/grpc/testing:worker_service_py_pb2_grpc", + "//src/python/grpcio/grpc:grpcio", + "//src/python/grpcio_tests/tests/unit:resources", + "//src/python/grpcio_tests/tests/unit:test_common", + ], +) + +py_binary( + name = "qps_worker", + srcs = ["qps_worker.py"], + srcs_version = "PY2AND3", + imports = ["../.."], + deps = [ + ":worker_server", + "//src/proto/grpc/testing:worker_service_py_pb2_grpc", + "//src/python/grpcio/grpc:grpcio", + "//src/python/grpcio_tests/tests/unit:test_common", + ], +) diff --git a/src/python/grpcio_tests/tests/qps/benchmark_client.py b/src/python/grpcio_tests/tests/qps/benchmark_client.py index 78d3d60efa3..17835e7c0db 100644 --- a/src/python/grpcio_tests/tests/qps/benchmark_client.py +++ b/src/python/grpcio_tests/tests/qps/benchmark_client.py @@ -61,14 +61,16 @@ class BenchmarkClient: self._stub = benchmark_service_pb2_grpc.BenchmarkServiceStub( channel) payload = messages_pb2.Payload( - body='\0' * config.payload_config.simple_params.req_size) + body=bytes(b'\0' * + config.payload_config.simple_params.req_size)) self._request = messages_pb2.SimpleRequest( payload=payload, response_size=config.payload_config.simple_params.resp_size) else: self._generic = True self._stub = GenericStub(channel) - self._request = '\0' * config.payload_config.bytebuf_params.req_size + self._request = bytes(b'\0' * + config.payload_config.bytebuf_params.req_size) self._hist = hist self._response_callbacks = [] diff --git a/src/python/grpcio_tests/tests/qps/benchmark_server.py b/src/python/grpcio_tests/tests/qps/benchmark_server.py index 48586d9aa94..75280bd7719 100644 --- a/src/python/grpcio_tests/tests/qps/benchmark_server.py +++ b/src/python/grpcio_tests/tests/qps/benchmark_server.py @@ -20,12 +20,12 @@ class BenchmarkServer(benchmark_service_pb2_grpc.BenchmarkServiceServicer): """Synchronous Server implementation for the Benchmark service.""" def UnaryCall(self, request, context): - payload = messages_pb2.Payload(body='\0' * request.response_size) + payload = messages_pb2.Payload(body=b'\0' * request.response_size) return messages_pb2.SimpleResponse(payload=payload) def StreamingCall(self, request_iterator, context): for request in request_iterator: - payload = messages_pb2.Payload(body='\0' * request.response_size) + payload = messages_pb2.Payload(body=b'\0' * request.response_size) yield messages_pb2.SimpleResponse(payload=payload) @@ -34,7 +34,7 @@ class GenericBenchmarkServer(benchmark_service_pb2_grpc.BenchmarkServiceServicer """Generic Server implementation for the Benchmark service.""" def __init__(self, resp_size): - self._response = '\0' * resp_size + self._response = b'\0' * resp_size def UnaryCall(self, request, context): return self._response diff --git a/src/python/grpcio_tests/tests/qps/qps_worker.py b/src/python/grpcio_tests/tests/qps/qps_worker.py index a7e692821ac..7fe16ea1f5e 100644 --- a/src/python/grpcio_tests/tests/qps/qps_worker.py +++ b/src/python/grpcio_tests/tests/qps/qps_worker.py @@ -15,6 +15,7 @@ import argparse import time +import logging import grpc from src.proto.grpc.testing import worker_service_pb2_grpc @@ -35,6 +36,7 @@ def run_worker_server(port): if __name__ == '__main__': + logging.basicConfig(level=logging.DEBUG) parser = argparse.ArgumentParser( description='gRPC Python performance testing worker') parser.add_argument('--driver_port', diff --git a/src/python/grpcio_tests/tests_aio/benchmark/worker.py b/src/python/grpcio_tests/tests_aio/benchmark/worker.py index 94651b55057..ed516dd787e 100644 --- a/src/python/grpcio_tests/tests_aio/benchmark/worker.py +++ b/src/python/grpcio_tests/tests_aio/benchmark/worker.py @@ -53,6 +53,8 @@ if __name__ == '__main__': if args.uvloop: import uvloop - uvloop.install() + asyncio.set_event_loop_policy(uvloop.EventLoopPolicy()) + loop = uvloop.new_event_loop() + asyncio.set_event_loop(loop) asyncio.get_event_loop().run_until_complete(run_worker_server(args.port)) diff --git a/tools/run_tests/performance/build_performance.sh b/tools/run_tests/performance/build_performance.sh index 0923454f560..4bf2186b26b 100755 --- a/tools/run_tests/performance/build_performance.sh +++ b/tools/run_tests/performance/build_performance.sh @@ -70,8 +70,7 @@ do tools/run_tests/performance/build_performance_node.sh ;; "python") - # python workers are only run with python2.7 and building with multiple python versions is costly - python tools/run_tests/run_tests.py -l "$language" -c "$CONFIG" --compiler python2.7 --build_only -j 8 + $bazel build -c opt //src/python/grpcio_tests/tests/qps:qps_worker ;; "python_asyncio") $bazel build -c opt //src/python/grpcio_tests/tests_aio/benchmark:worker diff --git a/tools/run_tests/performance/run_worker_python.sh b/tools/run_tests/performance/run_worker_python.sh index 5281fce360a..674ae2797e6 100755 --- a/tools/run_tests/performance/run_worker_python.sh +++ b/tools/run_tests/performance/run_worker_python.sh @@ -17,4 +17,4 @@ set -ex cd "$(dirname "$0")/../../.." -PYTHONPATH=src/python/grpcio_tests:src/python/gens py27_native/bin/python src/python/grpcio_tests/tests/qps/qps_worker.py "$@" +bazel-bin/src/python/grpcio_tests/tests/qps/qps_worker "$@" From c6fa7eefb97d43ddbf8c7931b5dc72894ca08f1a Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Mon, 24 Feb 2020 15:26:48 -0800 Subject: [PATCH 074/758] testing with locks in ws Remove no_logging and add missing mu locks --- CMakeLists.txt | 2 - Makefile | 2 - gRPC-Core.podspec | 1 - grpc.gyp | 2 - .../filters/client_channel/client_channel.cc | 13 + .../lb_policy/round_robin/round_robin.cc | 2 +- .../client_channel/lb_policy/xds/xds.cc | 2 +- .../ext/filters/client_channel/subchannel.cc | 67 +- .../ext/filters/client_channel/subchannel.h | 35 +- src/core/lib/transport/connectivity_state.cc | 2 +- test/core/end2end/end2end_nosec_tests.cc | 8 - test/core/end2end/end2end_tests.cc | 8 - test/core/end2end/gen_build_yaml.py | 2 - test/core/end2end/generate_tests.bzl | 1 - test/cpp/end2end/BUILD | 697 ---------------- test/cpp/end2end/xds_end2end_test.cc | 12 +- tools/run_tests/generated/tests.json | 761 +----------------- tools/run_tests/python_utils/jobset.py | 1 + 18 files changed, 113 insertions(+), 1505 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a01abb00b85..2a0a5c061f6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6109,7 +6109,6 @@ add_library(end2end_tests test/core/end2end/tests/max_message_length.cc test/core/end2end/tests/negative_deadline.cc test/core/end2end/tests/no_error_on_hotpath.cc - test/core/end2end/tests/no_logging.cc test/core/end2end/tests/no_op.cc test/core/end2end/tests/payload.cc test/core/end2end/tests/ping.cc @@ -6230,7 +6229,6 @@ add_library(end2end_nosec_tests test/core/end2end/tests/max_message_length.cc test/core/end2end/tests/negative_deadline.cc test/core/end2end/tests/no_error_on_hotpath.cc - test/core/end2end/tests/no_logging.cc test/core/end2end/tests/no_op.cc test/core/end2end/tests/payload.cc test/core/end2end/tests/ping.cc diff --git a/Makefile b/Makefile index 25481e07ce6..5b14a89619f 100644 --- a/Makefile +++ b/Makefile @@ -8885,7 +8885,6 @@ LIBEND2END_TESTS_SRC = \ test/core/end2end/tests/max_message_length.cc \ test/core/end2end/tests/negative_deadline.cc \ test/core/end2end/tests/no_error_on_hotpath.cc \ - test/core/end2end/tests/no_logging.cc \ test/core/end2end/tests/no_op.cc \ test/core/end2end/tests/payload.cc \ test/core/end2end/tests/ping.cc \ @@ -9002,7 +9001,6 @@ LIBEND2END_NOSEC_TESTS_SRC = \ test/core/end2end/tests/max_message_length.cc \ test/core/end2end/tests/negative_deadline.cc \ test/core/end2end/tests/no_error_on_hotpath.cc \ - test/core/end2end/tests/no_logging.cc \ test/core/end2end/tests/no_op.cc \ test/core/end2end/tests/payload.cc \ test/core/end2end/tests/ping.cc \ diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec index d1eb9401223..9bae49d9c2a 100644 --- a/gRPC-Core.podspec +++ b/gRPC-Core.podspec @@ -1440,7 +1440,6 @@ Pod::Spec.new do |s| 'test/core/end2end/tests/max_message_length.cc', 'test/core/end2end/tests/negative_deadline.cc', 'test/core/end2end/tests/no_error_on_hotpath.cc', - 'test/core/end2end/tests/no_logging.cc', 'test/core/end2end/tests/no_op.cc', 'test/core/end2end/tests/payload.cc', 'test/core/end2end/tests/ping.cc', diff --git a/grpc.gyp b/grpc.gyp index 53eb755bec5..1d1cfdd03d2 100644 --- a/grpc.gyp +++ b/grpc.gyp @@ -2616,7 +2616,6 @@ 'test/core/end2end/tests/max_message_length.cc', 'test/core/end2end/tests/negative_deadline.cc', 'test/core/end2end/tests/no_error_on_hotpath.cc', - 'test/core/end2end/tests/no_logging.cc', 'test/core/end2end/tests/no_op.cc', 'test/core/end2end/tests/payload.cc', 'test/core/end2end/tests/ping.cc', @@ -2706,7 +2705,6 @@ 'test/core/end2end/tests/max_message_length.cc', 'test/core/end2end/tests/negative_deadline.cc', 'test/core/end2end/tests/no_error_on_hotpath.cc', - 'test/core/end2end/tests/no_logging.cc', 'test/core/end2end/tests/no_op.cc', 'test/core/end2end/tests/payload.cc', 'test/core/end2end/tests/ping.cc', diff --git a/src/core/ext/filters/client_channel/client_channel.cc b/src/core/ext/filters/client_channel/client_channel.cc index eec74987a70..4877ec45609 100644 --- a/src/core/ext/filters/client_channel/client_channel.cc +++ b/src/core/ext/filters/client_channel/client_channel.cc @@ -1059,9 +1059,14 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface { : parent_(std::move(parent)), state_(new_state), connected_subchannel_(std::move(connected_subchannel)) { + gpr_log(GPR_ERROR, "updater run %p", parent_->mu()); + running_exec_ctx_ = ExecCtx::Get(); parent_->parent_->chand_->work_serializer_->Run( [this]() { ApplyUpdateInControlPlaneWorkSerializer(); }, DEBUG_LOCATION); + if (!run_inline_) { + gpr_mu_unlock(parent_->mu()->get()); + } } private: @@ -1075,6 +1080,11 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface { parent_->parent_->subchannel_, connected_subchannel_.get(), ConnectivityStateName(state_), parent_->watcher_.get()); } + if (ExecCtx::Get() == running_exec_ctx_) { + // Running inline + gpr_mu_unlock(parent_->mu()->get()); + run_inline_ = true; + } // Ignore update if the parent WatcherWrapper has been replaced // since this callback was scheduled. if (parent_->watcher_ == nullptr) return; @@ -1088,6 +1098,9 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface { RefCountedPtr parent_; grpc_connectivity_state state_; RefCountedPtr connected_subchannel_; + bool run_inline_ = false; + /* This can be replaced with something like getting the thread id */ + ExecCtx* running_exec_ctx_ = nullptr; }; std::unique_ptr diff --git a/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc b/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc index a5ab488ec55..5e11bb0fd2e 100644 --- a/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +++ b/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc @@ -44,7 +44,7 @@ namespace grpc_core { -TraceFlag grpc_lb_round_robin_trace(false, "round_robin"); +TraceFlag grpc_lb_round_robin_trace(true, "round_robin"); namespace { diff --git a/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc b/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc index b66d823e51b..83ba785808b 100644 --- a/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc +++ b/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc @@ -67,7 +67,7 @@ namespace grpc_core { -TraceFlag grpc_lb_xds_trace(false, "xds"); +TraceFlag grpc_lb_xds_trace(true, "xds"); namespace { diff --git a/src/core/ext/filters/client_channel/subchannel.cc b/src/core/ext/filters/client_channel/subchannel.cc index 626c825bebe..47288c7c198 100644 --- a/src/core/ext/filters/client_channel/subchannel.cc +++ b/src/core/ext/filters/client_channel/subchannel.cc @@ -364,33 +364,53 @@ class Subchannel::ConnectedSubchannelStateWatcher // Asynchronously notifies the \a watcher of a change in the connectvity state // of \a subchannel to the current \a state. Deletes itself when done. -class Subchannel::AsyncWatcherNotifier { +class Subchannel::AsyncWatcherNotifierLocked { public: - AsyncWatcherNotifier( + AsyncWatcherNotifierLocked( RefCountedPtr watcher, Subchannel* subchannel, grpc_connectivity_state state) - : watcher_(std::move(watcher)), state_(state) { - if (state_ == GRPC_CHANNEL_READY) { - connected_subchannel_ = subchannel->connected_subchannel_; + : subchannel_(subchannel), watcher_(std::move(watcher)) { + gpr_log(GPR_ERROR, "pushing connectivity state change %d", state); + { + MutexLock(watcher_->mu()); + watcher_->PushConnectivityStateChangeLocked(state); } - ExecCtx::Run(DEBUG_LOCATION, - GRPC_CLOSURE_INIT( - &closure_, - [](void* arg, grpc_error* /*error*/) { - auto* self = static_cast(arg); - self->watcher_->OnConnectivityStateChange( - self->state_, - std::move(self->connected_subchannel_)); - delete self; - }, - this, nullptr), - GRPC_ERROR_NONE); + ExecCtx::Run( + DEBUG_LOCATION, + GRPC_CLOSURE_INIT( + &closure_, + [](void* arg, grpc_error* /*error*/) { + auto* self = static_cast(arg); + while (true) { + grpc_connectivity_state state; + RefCountedPtr connected_subchannel; + gpr_log(GPR_ERROR, "lock %p", self->watcher_->mu()); + gpr_mu_lock(self->watcher_->mu()->get()); + { + if (!self->watcher_->PopConnectivityStateChangeLocked( + &state)) { + gpr_mu_unlock(self->watcher_->mu()->get()); + break; + } + gpr_log(GPR_ERROR, "popping connectivity state change %d", + state); + if (state == GRPC_CHANNEL_READY) { + connected_subchannel = + self->subchannel_->connected_subchannel_; + } + } + self->watcher_->OnConnectivityStateChange( + state, std::move(connected_subchannel)); + } + delete self; + }, + this, nullptr), + GRPC_ERROR_NONE); } private: + Subchannel* subchannel_; RefCountedPtr watcher_; - RefCountedPtr connected_subchannel_; - grpc_connectivity_state state_; grpc_closure closure_; }; @@ -411,7 +431,8 @@ void Subchannel::ConnectivityStateWatcherList::RemoveWatcherLocked( void Subchannel::ConnectivityStateWatcherList::NotifyLocked( Subchannel* subchannel, grpc_connectivity_state state) { for (const auto& p : watchers_) { - new AsyncWatcherNotifier(p.second, subchannel, state); + gpr_log(GPR_ERROR, "AsyncWatcherNotifierLocked"); + new AsyncWatcherNotifierLocked(p.second, subchannel, state); } } @@ -450,7 +471,8 @@ class Subchannel::HealthWatcherMap::HealthWatcher grpc_connectivity_state initial_state, RefCountedPtr watcher) { if (state_ != initial_state) { - new AsyncWatcherNotifier(watcher, subchannel_, state_); + gpr_log(GPR_ERROR, "AsyncWatcherNotifierLocked"); + new AsyncWatcherNotifierLocked(watcher, subchannel_, state_); } watcher_list_.AddWatcherLocked(std::move(watcher)); } @@ -811,7 +833,8 @@ void Subchannel::WatchConnectivityState( } if (health_check_service_name == nullptr) { if (state_ != initial_state) { - new AsyncWatcherNotifier(watcher, this, state_); + gpr_log(GPR_ERROR, "AsyncWatcherNotifierLocked"); + new AsyncWatcherNotifierLocked(watcher, this, state_); } watcher_list_.AddWatcherLocked(std::move(watcher)); } else { diff --git a/src/core/ext/filters/client_channel/subchannel.h b/src/core/ext/filters/client_channel/subchannel.h index 732b7c2023f..34dce735768 100644 --- a/src/core/ext/filters/client_channel/subchannel.h +++ b/src/core/ext/filters/client_channel/subchannel.h @@ -21,6 +21,8 @@ #include +#include + #include "src/core/ext/filters/client_channel/client_channel_channelz.h" #include "src/core/ext/filters/client_channel/connector.h" #include "src/core/ext/filters/client_channel/subchannel_pool_interface.h" @@ -194,6 +196,37 @@ class Subchannel { = 0; virtual grpc_pollset_set* interested_parties() = 0; + + // TODO(yashkt): This is currently needed to send the state updates in the + // right order when asynchronously notifying. This will no longer be + // necessary when we have access to EventManager. Enqueues connectivity + // state change notifications. Does NOT + void PushConnectivityStateChangeLocked(grpc_connectivity_state state) { + connectivity_state_queue_.push_back(state); + } + + // Dequeues connectivity state change notifications. If the queue is empty, + // it returns false, otherwise returns true and sets \a state to the popped + // state change. + bool PopConnectivityStateChangeLocked(grpc_connectivity_state* state) { + if (connectivity_state_queue_.empty()) { + return false; + } else { + *state = connectivity_state_queue_.front(); + connectivity_state_queue_.pop_front(); + return true; + } + } + + Mutex* mu() { return &mu_; } + + private: + // Keeps track of the updates that the watcher instance must be notified of. + // TODO(yashkt): This is currently needed to send the state updates in the + // right order when asynchronously notifying. This will no longer be + // necessary when we have access to EventManager. + std::deque connectivity_state_queue_; + Mutex mu_; // protects the queue }; // The ctor and dtor are not intended to use directly. @@ -332,7 +365,7 @@ class Subchannel { class ConnectedSubchannelStateWatcher; - class AsyncWatcherNotifier; + class AsyncWatcherNotifierLocked; // Sets the subchannel's connectivity state to \a state. void SetConnectivityStateLocked(grpc_connectivity_state state); diff --git a/src/core/lib/transport/connectivity_state.cc b/src/core/lib/transport/connectivity_state.cc index 2d34f52e635..b20ee434b99 100644 --- a/src/core/lib/transport/connectivity_state.cc +++ b/src/core/lib/transport/connectivity_state.cc @@ -31,7 +31,7 @@ namespace grpc_core { -TraceFlag grpc_connectivity_state_trace(false, "connectivity_state"); +TraceFlag grpc_connectivity_state_trace(true, "connectivity_state"); const char* ConnectivityStateName(grpc_connectivity_state state) { switch (state) { diff --git a/test/core/end2end/end2end_nosec_tests.cc b/test/core/end2end/end2end_nosec_tests.cc index e01e6ad0104..f9b6e6bc320 100644 --- a/test/core/end2end/end2end_nosec_tests.cc +++ b/test/core/end2end/end2end_nosec_tests.cc @@ -101,8 +101,6 @@ extern void negative_deadline(grpc_end2end_test_config config); extern void negative_deadline_pre_init(void); extern void no_error_on_hotpath(grpc_end2end_test_config config); extern void no_error_on_hotpath_pre_init(void); -extern void no_logging(grpc_end2end_test_config config); -extern void no_logging_pre_init(void); extern void no_op(grpc_end2end_test_config config); extern void no_op_pre_init(void); extern void payload(grpc_end2end_test_config config); @@ -223,7 +221,6 @@ void grpc_end2end_tests_pre_init(void) { max_message_length_pre_init(); negative_deadline_pre_init(); no_error_on_hotpath_pre_init(); - no_logging_pre_init(); no_op_pre_init(); payload_pre_init(); ping_pre_init(); @@ -309,7 +306,6 @@ void grpc_end2end_tests(int argc, char **argv, max_message_length(config); negative_deadline(config); no_error_on_hotpath(config); - no_logging(config); no_op(config); payload(config); ping(config); @@ -498,10 +494,6 @@ void grpc_end2end_tests(int argc, char **argv, no_error_on_hotpath(config); continue; } - if (0 == strcmp("no_logging", argv[i])) { - no_logging(config); - continue; - } if (0 == strcmp("no_op", argv[i])) { no_op(config); continue; diff --git a/test/core/end2end/end2end_tests.cc b/test/core/end2end/end2end_tests.cc index 76fb046b367..8b57ad6ba33 100644 --- a/test/core/end2end/end2end_tests.cc +++ b/test/core/end2end/end2end_tests.cc @@ -103,8 +103,6 @@ extern void negative_deadline(grpc_end2end_test_config config); extern void negative_deadline_pre_init(void); extern void no_error_on_hotpath(grpc_end2end_test_config config); extern void no_error_on_hotpath_pre_init(void); -extern void no_logging(grpc_end2end_test_config config); -extern void no_logging_pre_init(void); extern void no_op(grpc_end2end_test_config config); extern void no_op_pre_init(void); extern void payload(grpc_end2end_test_config config); @@ -226,7 +224,6 @@ void grpc_end2end_tests_pre_init(void) { max_message_length_pre_init(); negative_deadline_pre_init(); no_error_on_hotpath_pre_init(); - no_logging_pre_init(); no_op_pre_init(); payload_pre_init(); ping_pre_init(); @@ -313,7 +310,6 @@ void grpc_end2end_tests(int argc, char **argv, max_message_length(config); negative_deadline(config); no_error_on_hotpath(config); - no_logging(config); no_op(config); payload(config); ping(config); @@ -506,10 +502,6 @@ void grpc_end2end_tests(int argc, char **argv, no_error_on_hotpath(config); continue; } - if (0 == strcmp("no_logging", argv[i])) { - no_logging(config); - continue; - } if (0 == strcmp("no_op", argv[i])) { no_op(config); continue; diff --git a/test/core/end2end/gen_build_yaml.py b/test/core/end2end/gen_build_yaml.py index 889015bed40..a88c4f5c2d6 100755 --- a/test/core/end2end/gen_build_yaml.py +++ b/test/core/end2end/gen_build_yaml.py @@ -228,8 +228,6 @@ END2END_TESTS = { default_test_options, 'no_error_on_hotpath': default_test_options._replace(proxyable=False), - 'no_logging': - default_test_options._replace(traceable=False), 'no_op': default_test_options, 'payload': diff --git a/test/core/end2end/generate_tests.bzl b/test/core/end2end/generate_tests.bzl index 38efc2f1cae..d9d4c66d615 100755 --- a/test/core/end2end/generate_tests.bzl +++ b/test/core/end2end/generate_tests.bzl @@ -243,7 +243,6 @@ END2END_TESTS = { "max_message_length": _test_options(), "negative_deadline": _test_options(), "no_error_on_hotpath": _test_options(proxyable = False), - "no_logging": _test_options(traceable = False), "no_op": _test_options(), "payload": _test_options(), # TODO(juanlishen): This is disabled for now because it depends on some generated functions in diff --git a/test/cpp/end2end/BUILD b/test/cpp/end2end/BUILD index 5288c5622be..4369381fcca 100644 --- a/test/cpp/end2end/BUILD +++ b/test/cpp/end2end/BUILD @@ -61,439 +61,6 @@ grpc_cc_library( ], ) -grpc_cc_test( - name = "async_end2end_test", - srcs = ["async_end2end_test.cc"], - external_deps = [ - "gtest", - ], - tags = ["no_test_ios"], - deps = [ - "//:gpr", - "//:grpc", - "//:grpc++", - "//src/proto/grpc/health/v1:health_proto", - "//src/proto/grpc/testing:echo_messages_proto", - "//src/proto/grpc/testing:echo_proto", - "//src/proto/grpc/testing/duplicate:echo_duplicate_proto", - "//test/core/util:grpc_test_util", - "//test/cpp/util:test_util", - ], -) - -grpc_cc_test( - name = "time_change_test", - srcs = ["time_change_test.cc"], - data = [ - ":client_crash_test_server", - ], - external_deps = [ - "gtest", - ], - tags = [ - "no_test_android", # android_cc_test doesn't work with data dependency. - "no_test_ios", - "no_windows", - ], - deps = [ - ":test_service_impl", - "//:gpr", - "//:grpc", - "//:grpc++", - "//src/proto/grpc/testing:echo_messages_proto", - "//src/proto/grpc/testing:echo_proto", - "//test/core/util:grpc_test_util", - "//test/cpp/util:test_util", - ], -) - -grpc_cc_test( - name = "client_crash_test", - srcs = ["client_crash_test.cc"], - data = [ - ":client_crash_test_server", - ], - external_deps = [ - "gtest", - ], - tags = [ - "no_test_android", # android_cc_test doesn't work with data dependency. - "no_test_ios", - "no_windows", - ], - deps = [ - "//:gpr", - "//:grpc", - "//:grpc++", - "//src/proto/grpc/testing:echo_messages_proto", - "//src/proto/grpc/testing:echo_proto", - "//src/proto/grpc/testing/duplicate:echo_duplicate_proto", - "//test/core/util:grpc_test_util", - "//test/cpp/util:test_util", - ], -) - -grpc_cc_binary( - name = "client_crash_test_server", - testonly = True, - srcs = ["client_crash_test_server.cc"], - external_deps = [ - "gflags", - "gtest", - ], - deps = [ - ":test_service_impl", - "//:gpr", - "//:grpc", - "//:grpc++", - "//src/proto/grpc/testing:echo_messages_proto", - "//src/proto/grpc/testing:echo_proto", - "//src/proto/grpc/testing/duplicate:echo_duplicate_proto", - "//test/core/util:grpc_test_util", - "//test/cpp/util:test_config", - "//test/cpp/util:test_util", - ], -) - -grpc_cc_test( - name = "client_callback_end2end_test", - srcs = ["client_callback_end2end_test.cc"], - external_deps = [ - "gtest", - ], - deps = [ - ":interceptors_util", - ":test_service_impl", - "//:gpr", - "//:grpc", - "//:grpc++", - "//src/proto/grpc/testing:echo_messages_proto", - "//src/proto/grpc/testing:echo_proto", - "//src/proto/grpc/testing:simple_messages_proto", - "//test/core/util:grpc_test_util", - "//test/cpp/util:test_util", - ], -) - -grpc_cc_test( - name = "delegating_channel_test", - srcs = ["delegating_channel_test.cc"], - external_deps = [ - "gtest", - ], - deps = [ - ":test_service_impl", - "//:gpr", - "//:grpc", - "//:grpc++", - "//src/proto/grpc/testing:echo_messages_proto", - "//src/proto/grpc/testing:echo_proto", - "//test/core/util:grpc_test_util", - "//test/cpp/util:test_util", - ], -) - -grpc_cc_test( - name = "client_interceptors_end2end_test", - srcs = ["client_interceptors_end2end_test.cc"], - external_deps = [ - "gtest", - ], - deps = [ - ":interceptors_util", - ":test_service_impl", - "//:gpr", - "//:grpc", - "//:grpc++", - "//src/proto/grpc/testing:echo_messages_proto", - "//src/proto/grpc/testing:echo_proto", - "//test/core/util:grpc_test_util", - "//test/cpp/util:test_util", - ], -) - -grpc_cc_library( - name = "end2end_test_lib", - testonly = True, - srcs = ["end2end_test.cc"], - external_deps = [ - "gtest", - ], - deps = [ - ":interceptors_util", - ":test_service_impl", - "//:gpr", - "//:grpc", - "//:grpc++", - "//src/proto/grpc/testing:echo_messages_proto", - "//src/proto/grpc/testing:echo_proto", - "//src/proto/grpc/testing/duplicate:echo_duplicate_proto", - "//test/core/util:grpc_test_util", - "//test/cpp/util:test_util", - ], - alwayslink = 1, -) - -grpc_cc_test( - name = "channelz_service_test", - srcs = ["channelz_service_test.cc"], - external_deps = [ - "gtest", - ], - deps = [ - ":test_service_impl", - "//:gpr", - "//:grpc", - "//:grpc++", - "//:grpcpp_channelz", - "//src/proto/grpc/channelz:channelz_proto", - "//src/proto/grpc/testing:echo_messages_proto", - "//src/proto/grpc/testing:echo_proto", - "//test/core/util:grpc_test_util", - "//test/cpp/util:test_util", - ], -) - -grpc_cc_test( - name = "server_early_return_test", - srcs = ["server_early_return_test.cc"], - external_deps = [ - "gtest", - ], - deps = [ - "//:gpr", - "//:grpc", - "//:grpc++", - "//src/proto/grpc/testing:echo_messages_proto", - "//src/proto/grpc/testing:echo_proto", - "//test/core/util:grpc_test_util", - "//test/cpp/util:test_util", - ], -) - -grpc_cc_test( - name = "end2end_test", - size = "large", - tags = ["no_test_ios"], - deps = [ - ":end2end_test_lib", - # DO NOT REMOVE THE grpc++ dependence below since the internal build - # system uses it to specialize targets - "//:grpc++", - ], -) - -grpc_cc_test( - name = "exception_test", - srcs = ["exception_test.cc"], - external_deps = [ - "gtest", - ], - deps = [ - "//:gpr", - "//:grpc", - "//:grpc++", - "//src/proto/grpc/testing:echo_messages_proto", - "//src/proto/grpc/testing:echo_proto", - "//test/core/util:grpc_test_util", - "//test/cpp/util:test_util", - ], -) - -grpc_cc_test( - name = "filter_end2end_test", - srcs = ["filter_end2end_test.cc"], - external_deps = [ - "gtest", - ], - deps = [ - "//:gpr", - "//:grpc", - "//:grpc++", - "//src/proto/grpc/testing:echo_messages_proto", - "//src/proto/grpc/testing:echo_proto", - "//src/proto/grpc/testing/duplicate:echo_duplicate_proto", - "//test/core/util:grpc_test_util", - "//test/cpp/util:test_util", - ], -) - -grpc_cc_test( - name = "generic_end2end_test", - srcs = ["generic_end2end_test.cc"], - external_deps = [ - "gtest", - ], - deps = [ - "//:gpr", - "//:grpc", - "//:grpc++", - "//src/proto/grpc/testing:echo_messages_proto", - "//src/proto/grpc/testing:echo_proto", - "//src/proto/grpc/testing/duplicate:echo_duplicate_proto", - "//test/core/util:grpc_test_util", - "//test/cpp/util:test_util", - ], -) - -grpc_cc_test( - name = "health_service_end2end_test", - srcs = ["health_service_end2end_test.cc"], - external_deps = [ - "gtest", - ], - deps = [ - ":test_health_check_service_impl", - ":test_service_impl", - "//:gpr", - "//:grpc", - "//:grpc++", - "//src/proto/grpc/health/v1:health_proto", - "//src/proto/grpc/testing:echo_messages_proto", - "//src/proto/grpc/testing:echo_proto", - "//src/proto/grpc/testing/duplicate:echo_duplicate_proto", - "//test/core/util:grpc_test_util", - "//test/cpp/util:test_util", - ], -) - -grpc_cc_test( - name = "hybrid_end2end_test", - srcs = ["hybrid_end2end_test.cc"], - external_deps = [ - "gtest", - ], - deps = [ - ":test_service_impl", - "//:gpr", - "//:grpc", - "//:grpc++", - "//src/proto/grpc/testing:echo_messages_proto", - "//src/proto/grpc/testing:echo_proto", - "//src/proto/grpc/testing/duplicate:echo_duplicate_proto", - "//test/core/util:grpc_test_util", - "//test/cpp/util:test_util", - ], -) - -grpc_cc_test( - name = "raw_end2end_test", - srcs = ["raw_end2end_test.cc"], - external_deps = [ - "gtest", - ], - deps = [ - ":test_service_impl", - "//:gpr", - "//:grpc", - "//:grpc++", - "//src/proto/grpc/testing:echo_messages_proto", - "//src/proto/grpc/testing:echo_proto", - "//src/proto/grpc/testing/duplicate:echo_duplicate_proto", - "//test/core/util:grpc_test_util", - "//test/cpp/util:test_util", - ], -) - -grpc_cc_test( - name = "mock_test", - srcs = ["mock_test.cc"], - external_deps = [ - "gtest", - ], - deps = [ - "//:gpr", - "//:grpc", - "//:grpc++", - "//:grpc++_test", - "//src/proto/grpc/testing:echo_messages_proto", - "//src/proto/grpc/testing:echo_proto", - "//src/proto/grpc/testing/duplicate:echo_duplicate_proto", - "//test/core/util:grpc_test_util", - "//test/cpp/util:test_util", - ], -) - -grpc_cc_test( - name = "nonblocking_test", - srcs = ["nonblocking_test.cc"], - external_deps = [ - "gtest", - ], - deps = [ - "//:gpr", - "//:grpc", - "//:grpc++", - "//src/proto/grpc/testing:echo_messages_proto", - "//src/proto/grpc/testing:echo_proto", - "//test/core/util:grpc_test_util", - "//test/cpp/util:test_util", - ], -) - -grpc_cc_test( - name = "client_lb_end2end_test", - srcs = ["client_lb_end2end_test.cc"], - external_deps = [ - "gtest", - ], - tags = ["no_windows"], # TODO(jtattermusch): fix test on windows - deps = [ - ":test_service_impl", - "//:gpr", - "//:grpc", - "//:grpc++", - "//src/proto/grpc/testing:echo_messages_proto", - "//src/proto/grpc/testing:echo_proto", - "//src/proto/grpc/testing/duplicate:echo_duplicate_proto", - "//src/proto/grpc/testing/xds:orca_load_report_for_test_proto", - "//test/core/util:grpc_test_util", - "//test/core/util:test_lb_policies", - "//test/cpp/util:test_util", - ], -) - -grpc_cc_test( - name = "service_config_end2end_test", - srcs = ["service_config_end2end_test.cc"], - external_deps = [ - "gtest", - ], - deps = [ - ":test_service_impl", - "//:gpr", - "//:grpc", - "//:grpc++", - "//src/proto/grpc/testing:echo_messages_proto", - "//src/proto/grpc/testing:echo_proto", - "//src/proto/grpc/testing/duplicate:echo_duplicate_proto", - "//test/core/util:grpc_test_util", - "//test/cpp/util:test_util", - ], -) - -grpc_cc_test( - name = "grpclb_end2end_test", - srcs = ["grpclb_end2end_test.cc"], - external_deps = [ - "gtest", - ], - tags = ["no_windows"], # TODO(jtattermusch): fix test on windows - deps = [ - ":test_service_impl", - "//:gpr", - "//:grpc", - "//:grpc++", - "//:grpc_resolver_fake", - "//src/proto/grpc/lb/v1:load_balancer_proto", - "//src/proto/grpc/testing:echo_messages_proto", - "//src/proto/grpc/testing:echo_proto", - "//src/proto/grpc/testing/duplicate:echo_duplicate_proto", - "//test/core/util:grpc_test_util", - "//test/cpp/util:test_util", - ], -) - grpc_cc_test( name = "xds_end2end_test", size = "large", @@ -525,267 +92,3 @@ grpc_cc_test( ], ) -grpc_cc_test( - name = "proto_server_reflection_test", - srcs = ["proto_server_reflection_test.cc"], - external_deps = [ - "gtest", - "gflags", - ], - deps = [ - ":test_service_impl", - "//:gpr", - "//:grpc", - "//:grpc++", - "//:grpc++_reflection", - "//src/proto/grpc/testing:echo_messages_proto", - "//src/proto/grpc/testing:echo_proto", - "//src/proto/grpc/testing/duplicate:echo_duplicate_proto", - "//test/core/util:grpc_test_util", - "//test/cpp/util:grpc++_proto_reflection_desc_db", - "//test/cpp/util:test_util", - ], -) - -grpc_cc_test( - name = "server_builder_plugin_test", - srcs = ["server_builder_plugin_test.cc"], - external_deps = [ - "gtest", - ], - deps = [ - ":test_service_impl", - "//:gpr", - "//:grpc", - "//:grpc++", - "//src/proto/grpc/testing:echo_messages_proto", - "//src/proto/grpc/testing:echo_proto", - "//src/proto/grpc/testing/duplicate:echo_duplicate_proto", - "//test/core/util:grpc_test_util", - "//test/cpp/util:test_util", - ], -) - -grpc_cc_test( - name = "server_crash_test", - srcs = ["server_crash_test.cc"], - data = [ - ":server_crash_test_client", - ], - external_deps = [ - "gtest", - ], - tags = [ - "no_test_android", # android_cc_test doesn't work with data dependency. - "no_test_ios", - "no_windows", - ], - deps = [ - "//:gpr", - "//:grpc", - "//:grpc++", - "//src/proto/grpc/testing:echo_messages_proto", - "//src/proto/grpc/testing:echo_proto", - "//src/proto/grpc/testing/duplicate:echo_duplicate_proto", - "//test/core/util:grpc_test_util", - "//test/cpp/util:test_util", - ], -) - -grpc_cc_binary( - name = "server_crash_test_client", - testonly = True, - srcs = ["server_crash_test_client.cc"], - external_deps = [ - "gflags", - "gtest", - ], - deps = [ - "//:gpr", - "//:grpc", - "//:grpc++", - "//src/proto/grpc/testing:echo_messages_proto", - "//src/proto/grpc/testing:echo_proto", - "//src/proto/grpc/testing/duplicate:echo_duplicate_proto", - "//test/core/util:grpc_test_util", - "//test/cpp/util:test_config", - "//test/cpp/util:test_util", - ], -) - -grpc_cc_test( - name = "server_interceptors_end2end_test", - srcs = ["server_interceptors_end2end_test.cc"], - external_deps = [ - "gtest", - ], - deps = [ - ":interceptors_util", - ":test_service_impl", - "//:gpr", - "//:grpc", - "//:grpc++", - "//src/proto/grpc/testing:echo_messages_proto", - "//src/proto/grpc/testing:echo_proto", - "//test/core/util:grpc_test_util", - "//test/cpp/util:test_util", - ], -) - -grpc_cc_test( - name = "server_load_reporting_end2end_test", - srcs = ["server_load_reporting_end2end_test.cc"], - external_deps = [ - "gtest", - ], - tags = [ - "no_test_ios", - "no_windows", - ], - deps = [ - "//:grpcpp_server_load_reporting", - "//src/proto/grpc/testing:echo_proto", - "//test/cpp/util:test_util", - ], -) - -grpc_cc_test( - name = "flaky_network_test", - srcs = ["flaky_network_test.cc"], - external_deps = [ - "gtest", - ], - tags = [ - "manual", - "no_test_ios", - ], - deps = [ - ":test_service_impl", - "//:gpr", - "//:grpc", - "//:grpc++", - "//src/proto/grpc/testing:echo_messages_proto", - "//src/proto/grpc/testing:echo_proto", - "//test/core/util:grpc_test_util", - "//test/cpp/util:test_util", - ], -) - -grpc_cc_test( - name = "shutdown_test", - srcs = ["shutdown_test.cc"], - external_deps = [ - "gtest", - ], - deps = [ - "//:gpr", - "//:grpc", - "//:grpc++", - "//src/proto/grpc/testing:echo_messages_proto", - "//src/proto/grpc/testing:echo_proto", - "//src/proto/grpc/testing/duplicate:echo_duplicate_proto", - "//test/core/util:grpc_test_util", - "//test/cpp/util:test_util", - ], -) - -grpc_cc_test( - name = "streaming_throughput_test", - srcs = ["streaming_throughput_test.cc"], - external_deps = [ - "gtest", - ], - tags = ["no_windows"], - deps = [ - "//:gpr", - "//:grpc", - "//:grpc++", - "//src/proto/grpc/testing:echo_messages_proto", - "//src/proto/grpc/testing:echo_proto", - "//src/proto/grpc/testing/duplicate:echo_duplicate_proto", - "//test/core/util:grpc_test_util", - "//test/cpp/util:test_util", - ], -) - -grpc_cc_test( - name = "thread_stress_test", - size = "large", - srcs = ["thread_stress_test.cc"], - external_deps = [ - "gtest", - ], - shard_count = 5, - tags = ["no_windows"], # TODO(jtattermusch): fix test on windows - deps = [ - "//:gpr", - "//:grpc", - "//:grpc++", - "//src/proto/grpc/testing:echo_messages_proto", - "//src/proto/grpc/testing:echo_proto", - "//src/proto/grpc/testing/duplicate:echo_duplicate_proto", - "//test/core/util:grpc_test_util", - "//test/cpp/util:test_util", - ], -) - -grpc_cc_test( - name = "cfstream_test", - srcs = ["cfstream_test.cc"], - external_deps = [ - "gtest", - ], - tags = [ - "manual", - "no_test_android", - "no_test_ios", - ], # test requires root, won't work with bazel RBE - deps = [ - ":test_service_impl", - "//:gpr", - "//:grpc", - "//:grpc++", - "//src/proto/grpc/testing:echo_messages_proto", - "//src/proto/grpc/testing:echo_proto", - "//src/proto/grpc/testing:simple_messages_proto", - "//test/core/util:grpc_test_util", - "//test/cpp/util:test_util", - ], -) - -grpc_cc_test( - name = "message_allocator_end2end_test", - srcs = ["message_allocator_end2end_test.cc"], - external_deps = [ - "gtest", - ], - deps = [ - ":test_service_impl", - "//:gpr", - "//:grpc", - "//:grpc++", - "//src/proto/grpc/testing:echo_messages_proto", - "//src/proto/grpc/testing:echo_proto", - "//src/proto/grpc/testing:simple_messages_proto", - "//test/core/util:grpc_test_util", - "//test/cpp/util:test_util", - ], -) - -grpc_cc_test( - name = "port_sharing_end2end_test", - srcs = ["port_sharing_end2end_test.cc"], - external_deps = [ - "gtest", - ], - deps = [ - ":test_service_impl", - "//:gpr", - "//:grpc", - "//:grpc++", - "//src/proto/grpc/testing:echo_messages_proto", - "//src/proto/grpc/testing:echo_proto", - "//test/core/util:grpc_test_util", - "//test/cpp/util:test_util", - ], -) diff --git a/test/cpp/end2end/xds_end2end_test.cc b/test/cpp/end2end/xds_end2end_test.cc index 76a59661334..0ca39a4fd00 100644 --- a/test/cpp/end2end/xds_end2end_test.cc +++ b/test/cpp/end2end/xds_end2end_test.cc @@ -218,10 +218,8 @@ class CountedService : public ServiceType { response_count_ = 0; } - protected: - grpc_core::Mutex mu_; - private: + grpc_core::Mutex mu_; size_t request_count_ = 0; size_t response_count_ = 0; }; @@ -267,7 +265,6 @@ class BackendServiceImpl : public BackendService { clients_.insert(client); } - grpc_core::Mutex mu_; grpc_core::Mutex clients_mu_; std::set clients_; }; @@ -975,7 +972,12 @@ class XdsEnd2endTest : public ::testing::TestWithParam { bool SeenAllBackends(size_t start_index = 0, size_t stop_index = 0) { if (stop_index == 0) stop_index = backends_.size(); for (size_t i = start_index; i < stop_index; ++i) { - if (backends_[i]->backend_service()->request_count() == 0) return false; + if (backends_[i]->backend_service()->request_count() == 0) + return false; + else { + gpr_log(GPR_INFO, "backend %d with request count %lu", i, + backends_[i]->backend_service()->request_count()); + } } return true; } diff --git a/tools/run_tests/generated/tests.json b/tools/run_tests/generated/tests.json index 27d03ad9458..aa975f51395 100644 --- a/tools/run_tests/generated/tests.json +++ b/tools/run_tests/generated/tests.json @@ -7517,29 +7517,6 @@ "posix" ] }, - { - "args": [ - "no_logging" - ], - "ci_platforms": [ - "windows", - "linux", - "mac", - "posix" - ], - "cpu_cost": 1.0, - "exclude_configs": [], - "exclude_iomgrs": [], - "flaky": false, - "language": "c", - "name": "h2_census_test", - "platforms": [ - "windows", - "linux", - "mac", - "posix" - ] - }, { "args": [ "no_op" @@ -9292,29 +9269,6 @@ "posix" ] }, - { - "args": [ - "no_logging" - ], - "ci_platforms": [ - "windows", - "linux", - "mac", - "posix" - ], - "cpu_cost": 1.0, - "exclude_configs": [], - "exclude_iomgrs": [], - "flaky": false, - "language": "c", - "name": "h2_compress_test", - "platforms": [ - "windows", - "linux", - "mac", - "posix" - ] - }, { "args": [ "no_op" @@ -11007,28 +10961,6 @@ "posix" ] }, - { - "args": [ - "no_logging" - ], - "ci_platforms": [ - "windows", - "linux", - "posix" - ], - "cpu_cost": 1.0, - "exclude_configs": [], - "exclude_iomgrs": [], - "flaky": false, - "language": "c", - "name": "h2_fakesec_test", - "platforms": [ - "windows", - "linux", - "mac", - "posix" - ] - }, { "args": [ "no_op" @@ -12600,29 +12532,6 @@ "posix" ] }, - { - "args": [ - "no_logging" - ], - "ci_platforms": [ - "linux", - "mac", - "posix" - ], - "cpu_cost": 1.0, - "exclude_configs": [], - "exclude_iomgrs": [ - "uv" - ], - "flaky": false, - "language": "c", - "name": "h2_fd_test", - "platforms": [ - "linux", - "mac", - "posix" - ] - }, { "args": [ "no_op" @@ -13961,29 +13870,6 @@ "posix" ] }, - { - "args": [ - "no_logging" - ], - "ci_platforms": [ - "windows", - "linux", - "mac", - "posix" - ], - "cpu_cost": 1.0, - "exclude_configs": [], - "exclude_iomgrs": [], - "flaky": false, - "language": "c", - "name": "h2_full_test", - "platforms": [ - "windows", - "linux", - "mac", - "posix" - ] - }, { "args": [ "no_op" @@ -15584,25 +15470,6 @@ "linux" ] }, - { - "args": [ - "no_logging" - ], - "ci_platforms": [ - "linux" - ], - "cpu_cost": 1.0, - "exclude_configs": [], - "exclude_iomgrs": [ - "uv" - ], - "flaky": false, - "language": "c", - "name": "h2_full+pipe_test", - "platforms": [ - "linux" - ] - }, { "args": [ "no_op" @@ -18928,29 +18795,6 @@ "posix" ] }, - { - "args": [ - "no_logging" - ], - "ci_platforms": [ - "windows", - "linux", - "mac", - "posix" - ], - "cpu_cost": 1.0, - "exclude_configs": [], - "exclude_iomgrs": [], - "flaky": false, - "language": "c", - "name": "h2_full+workarounds_test", - "platforms": [ - "windows", - "linux", - "mac", - "posix" - ] - }, { "args": [ "no_op" @@ -20736,30 +20580,6 @@ "posix" ] }, - { - "args": [ - "no_logging" - ], - "ci_platforms": [ - "windows", - "linux", - "posix" - ], - "cpu_cost": 1.0, - "exclude_configs": [], - "exclude_iomgrs": [ - "uv" - ], - "flaky": false, - "language": "c", - "name": "h2_http_proxy_test", - "platforms": [ - "windows", - "linux", - "mac", - "posix" - ] - }, { "args": [ "no_op" @@ -22525,29 +22345,6 @@ "posix" ] }, - { - "args": [ - "no_logging" - ], - "ci_platforms": [ - "linux", - "mac", - "posix" - ], - "cpu_cost": 1.0, - "exclude_configs": [], - "exclude_iomgrs": [ - "uv" - ], - "flaky": false, - "language": "c", - "name": "h2_local_ipv4_test", - "platforms": [ - "linux", - "mac", - "posix" - ] - }, { "args": [ "no_op" @@ -24250,29 +24047,6 @@ "posix" ] }, - { - "args": [ - "no_logging" - ], - "ci_platforms": [ - "linux", - "mac", - "posix" - ], - "cpu_cost": 1.0, - "exclude_configs": [], - "exclude_iomgrs": [ - "uv" - ], - "flaky": false, - "language": "c", - "name": "h2_local_ipv6_test", - "platforms": [ - "linux", - "mac", - "posix" - ] - }, { "args": [ "no_op" @@ -25975,29 +25749,6 @@ "posix" ] }, - { - "args": [ - "no_logging" - ], - "ci_platforms": [ - "linux", - "mac", - "posix" - ], - "cpu_cost": 1.0, - "exclude_configs": [], - "exclude_iomgrs": [ - "uv" - ], - "flaky": false, - "language": "c", - "name": "h2_local_uds_test", - "platforms": [ - "linux", - "mac", - "posix" - ] - }, { "args": [ "no_op" @@ -27785,7 +27536,7 @@ }, { "args": [ - "no_logging" + "no_op" ], "ci_platforms": [ "windows", @@ -27809,7 +27560,7 @@ }, { "args": [ - "no_op" + "payload" ], "ci_platforms": [ "windows", @@ -27833,14 +27584,14 @@ }, { "args": [ - "payload" + "ping" ], "ci_platforms": [ "windows", "linux", "posix" ], - "cpu_cost": 1.0, + "cpu_cost": 0.1, "exclude_configs": [], "exclude_iomgrs": [ "uv" @@ -27857,7 +27608,7 @@ }, { "args": [ - "ping" + "ping_pong_streaming" ], "ci_platforms": [ "windows", @@ -27881,14 +27632,14 @@ }, { "args": [ - "ping_pong_streaming" + "registered_call" ], "ci_platforms": [ "windows", "linux", "posix" ], - "cpu_cost": 0.1, + "cpu_cost": 1.0, "exclude_configs": [], "exclude_iomgrs": [ "uv" @@ -27905,14 +27656,14 @@ }, { "args": [ - "registered_call" + "request_with_flags" ], "ci_platforms": [ "windows", "linux", "posix" ], - "cpu_cost": 1.0, + "cpu_cost": 0.1, "exclude_configs": [], "exclude_iomgrs": [ "uv" @@ -27929,31 +27680,7 @@ }, { "args": [ - "request_with_flags" - ], - "ci_platforms": [ - "windows", - "linux", - "posix" - ], - "cpu_cost": 0.1, - "exclude_configs": [], - "exclude_iomgrs": [ - "uv" - ], - "flaky": false, - "language": "c", - "name": "h2_oauth2_test", - "platforms": [ - "windows", - "linux", - "mac", - "posix" - ] - }, - { - "args": [ - "request_with_payload" + "request_with_payload" ], "ci_platforms": [ "windows", @@ -29439,30 +29166,6 @@ "posix" ] }, - { - "args": [ - "no_logging" - ], - "ci_platforms": [ - "windows", - "linux", - "posix" - ], - "cpu_cost": 1.0, - "exclude_configs": [], - "exclude_iomgrs": [ - "uv" - ], - "flaky": false, - "language": "c", - "name": "h2_proxy_test", - "platforms": [ - "windows", - "linux", - "mac", - "posix" - ] - }, { "args": [ "no_op" @@ -30663,30 +30366,6 @@ "posix" ] }, - { - "args": [ - "no_logging" - ], - "ci_platforms": [ - "windows", - "linux", - "posix" - ], - "cpu_cost": 1.0, - "exclude_configs": [], - "exclude_iomgrs": [ - "uv" - ], - "flaky": false, - "language": "c", - "name": "h2_sockpair_test", - "platforms": [ - "windows", - "linux", - "mac", - "posix" - ] - }, { "args": [ "no_op" @@ -33197,32 +32876,6 @@ "posix" ] }, - { - "args": [ - "no_logging" - ], - "ci_platforms": [ - "windows", - "linux", - "posix" - ], - "cpu_cost": 1.0, - "exclude_configs": [ - "msan" - ], - "exclude_iomgrs": [ - "uv" - ], - "flaky": false, - "language": "c", - "name": "h2_sockpair_1byte_test", - "platforms": [ - "windows", - "linux", - "mac", - "posix" - ] - }, { "args": [ "no_op" @@ -34598,29 +34251,6 @@ "posix" ] }, - { - "args": [ - "no_logging" - ], - "ci_platforms": [ - "windows", - "linux", - "mac", - "posix" - ], - "cpu_cost": 1.0, - "exclude_configs": [], - "exclude_iomgrs": [], - "flaky": false, - "language": "c", - "name": "h2_ssl_test", - "platforms": [ - "windows", - "linux", - "mac", - "posix" - ] - }, { "args": [ "no_op" @@ -36373,29 +36003,6 @@ "posix" ] }, - { - "args": [ - "no_logging" - ], - "ci_platforms": [ - "windows", - "linux", - "mac", - "posix" - ], - "cpu_cost": 1.0, - "exclude_configs": [], - "exclude_iomgrs": [], - "flaky": false, - "language": "c", - "name": "h2_ssl_cred_reload_test", - "platforms": [ - "windows", - "linux", - "mac", - "posix" - ] - }, { "args": [ "no_op" @@ -37989,30 +37596,6 @@ "posix" ] }, - { - "args": [ - "no_logging" - ], - "ci_platforms": [ - "windows", - "linux", - "posix" - ], - "cpu_cost": 1.0, - "exclude_configs": [], - "exclude_iomgrs": [ - "uv" - ], - "flaky": false, - "language": "c", - "name": "h2_ssl_proxy_test", - "platforms": [ - "windows", - "linux", - "mac", - "posix" - ] - }, { "args": [ "no_op" @@ -39324,29 +38907,6 @@ "posix" ] }, - { - "args": [ - "no_logging" - ], - "ci_platforms": [ - "windows", - "linux", - "mac", - "posix" - ], - "cpu_cost": 1.0, - "exclude_configs": [], - "exclude_iomgrs": [], - "flaky": false, - "language": "c", - "name": "h2_tls_test", - "platforms": [ - "windows", - "linux", - "mac", - "posix" - ] - }, { "args": [ "no_op" @@ -41049,29 +40609,6 @@ "posix" ] }, - { - "args": [ - "no_logging" - ], - "ci_platforms": [ - "linux", - "mac", - "posix" - ], - "cpu_cost": 1.0, - "exclude_configs": [], - "exclude_iomgrs": [ - "uv" - ], - "flaky": false, - "language": "c", - "name": "h2_uds_test", - "platforms": [ - "linux", - "mac", - "posix" - ] - }, { "args": [ "no_op" @@ -42544,29 +42081,6 @@ "posix" ] }, - { - "args": [ - "no_logging" - ], - "ci_platforms": [ - "windows", - "linux", - "mac", - "posix" - ], - "cpu_cost": 1.0, - "exclude_configs": [], - "exclude_iomgrs": [], - "flaky": false, - "language": "c", - "name": "inproc_test", - "platforms": [ - "windows", - "linux", - "mac", - "posix" - ] - }, { "args": [ "no_op" @@ -43767,29 +43281,6 @@ "posix" ] }, - { - "args": [ - "no_logging" - ], - "ci_platforms": [ - "windows", - "linux", - "mac", - "posix" - ], - "cpu_cost": 1.0, - "exclude_configs": [], - "exclude_iomgrs": [], - "flaky": false, - "language": "c", - "name": "h2_census_nosec_test", - "platforms": [ - "windows", - "linux", - "mac", - "posix" - ] - }, { "args": [ "no_op" @@ -45519,29 +45010,6 @@ "posix" ] }, - { - "args": [ - "no_logging" - ], - "ci_platforms": [ - "windows", - "linux", - "mac", - "posix" - ], - "cpu_cost": 1.0, - "exclude_configs": [], - "exclude_iomgrs": [], - "flaky": false, - "language": "c", - "name": "h2_compress_nosec_test", - "platforms": [ - "windows", - "linux", - "mac", - "posix" - ] - }, { "args": [ "no_op" @@ -47106,29 +46574,6 @@ "posix" ] }, - { - "args": [ - "no_logging" - ], - "ci_platforms": [ - "linux", - "mac", - "posix" - ], - "cpu_cost": 1.0, - "exclude_configs": [], - "exclude_iomgrs": [ - "uv" - ], - "flaky": false, - "language": "c", - "name": "h2_fd_nosec_test", - "platforms": [ - "linux", - "mac", - "posix" - ] - }, { "args": [ "no_op" @@ -48444,29 +47889,6 @@ "posix" ] }, - { - "args": [ - "no_logging" - ], - "ci_platforms": [ - "windows", - "linux", - "mac", - "posix" - ], - "cpu_cost": 1.0, - "exclude_configs": [], - "exclude_iomgrs": [], - "flaky": false, - "language": "c", - "name": "h2_full_nosec_test", - "platforms": [ - "windows", - "linux", - "mac", - "posix" - ] - }, { "args": [ "no_op" @@ -50048,25 +49470,6 @@ "linux" ] }, - { - "args": [ - "no_logging" - ], - "ci_platforms": [ - "linux" - ], - "cpu_cost": 1.0, - "exclude_configs": [], - "exclude_iomgrs": [ - "uv" - ], - "flaky": false, - "language": "c", - "name": "h2_full+pipe_nosec_test", - "platforms": [ - "linux" - ] - }, { "args": [ "no_op" @@ -53346,29 +52749,6 @@ "posix" ] }, - { - "args": [ - "no_logging" - ], - "ci_platforms": [ - "windows", - "linux", - "mac", - "posix" - ], - "cpu_cost": 1.0, - "exclude_configs": [], - "exclude_iomgrs": [], - "flaky": false, - "language": "c", - "name": "h2_full+workarounds_nosec_test", - "platforms": [ - "windows", - "linux", - "mac", - "posix" - ] - }, { "args": [ "no_op" @@ -55130,30 +54510,6 @@ "posix" ] }, - { - "args": [ - "no_logging" - ], - "ci_platforms": [ - "windows", - "linux", - "posix" - ], - "cpu_cost": 1.0, - "exclude_configs": [], - "exclude_iomgrs": [ - "uv" - ], - "flaky": false, - "language": "c", - "name": "h2_http_proxy_nosec_test", - "platforms": [ - "windows", - "linux", - "mac", - "posix" - ] - }, { "args": [ "no_op" @@ -56786,30 +56142,6 @@ "posix" ] }, - { - "args": [ - "no_logging" - ], - "ci_platforms": [ - "windows", - "linux", - "posix" - ], - "cpu_cost": 1.0, - "exclude_configs": [], - "exclude_iomgrs": [ - "uv" - ], - "flaky": false, - "language": "c", - "name": "h2_proxy_nosec_test", - "platforms": [ - "windows", - "linux", - "mac", - "posix" - ] - }, { "args": [ "no_op" @@ -57986,30 +57318,6 @@ "posix" ] }, - { - "args": [ - "no_logging" - ], - "ci_platforms": [ - "windows", - "linux", - "posix" - ], - "cpu_cost": 1.0, - "exclude_configs": [], - "exclude_iomgrs": [ - "uv" - ], - "flaky": false, - "language": "c", - "name": "h2_sockpair_nosec_test", - "platforms": [ - "windows", - "linux", - "mac", - "posix" - ] - }, { "args": [ "no_op" @@ -60470,32 +59778,6 @@ "posix" ] }, - { - "args": [ - "no_logging" - ], - "ci_platforms": [ - "windows", - "linux", - "posix" - ], - "cpu_cost": 1.0, - "exclude_configs": [ - "msan" - ], - "exclude_iomgrs": [ - "uv" - ], - "flaky": false, - "language": "c", - "name": "h2_sockpair_1byte_nosec_test", - "platforms": [ - "windows", - "linux", - "mac", - "posix" - ] - }, { "args": [ "no_op" @@ -61798,29 +61080,6 @@ "posix" ] }, - { - "args": [ - "no_logging" - ], - "ci_platforms": [ - "linux", - "mac", - "posix" - ], - "cpu_cost": 1.0, - "exclude_configs": [], - "exclude_iomgrs": [ - "uv" - ], - "flaky": false, - "language": "c", - "name": "h2_uds_nosec_test", - "platforms": [ - "linux", - "mac", - "posix" - ] - }, { "args": [ "no_op" diff --git a/tools/run_tests/python_utils/jobset.py b/tools/run_tests/python_utils/jobset.py index d9ae0620da5..57e239ee42b 100755 --- a/tools/run_tests/python_utils/jobset.py +++ b/tools/run_tests/python_utils/jobset.py @@ -130,6 +130,7 @@ def message(tag, msg, explanatory_text=None, do_newline=False): try: if platform_string() == 'windows' or not sys.stdout.isatty(): if explanatory_text: + print(explanatory_text) logging.info(explanatory_text) logging.info('%s: %s', tag, msg) else: From f9dd439421c659d06a3e898bbf6e4b3a9ecfcb1b Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Thu, 27 Feb 2020 12:36:29 -0800 Subject: [PATCH 075/758] Trying out a solution --- .../filters/client_channel/client_channel.cc | 57 ++++++++----------- .../ext/filters/client_channel/subchannel.cc | 46 +++++---------- .../ext/filters/client_channel/subchannel.h | 31 ++++++---- 3 files changed, 59 insertions(+), 75 deletions(-) diff --git a/src/core/ext/filters/client_channel/client_channel.cc b/src/core/ext/filters/client_channel/client_channel.cc index 4b403a38e4d..f68b02e526a 100644 --- a/src/core/ext/filters/client_channel/client_channel.cc +++ b/src/core/ext/filters/client_channel/client_channel.cc @@ -1018,19 +1018,16 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface { DEBUG_LOCATION); } - void OnConnectivityStateChange( - grpc_connectivity_state new_state, - RefCountedPtr connected_subchannel) override { + void OnConnectivityStateChange() override { if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) { gpr_log(GPR_INFO, "chand=%p: connectivity change for subchannel wrapper %p " - "subchannel %p (connected_subchannel=%p state=%s); " + "subchannel %p; " "hopping into work_serializer", - parent_->chand_, parent_.get(), parent_->subchannel_, - connected_subchannel.get(), ConnectivityStateName(new_state)); + parent_->chand_, parent_.get(), parent_->subchannel_); } // Will delete itself. - new Updater(Ref(), new_state, std::move(connected_subchannel)); + new Updater(Ref()); } grpc_pollset_set* interested_parties() override { @@ -1052,20 +1049,11 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface { private: class Updater { public: - Updater(RefCountedPtr parent, - grpc_connectivity_state new_state, - RefCountedPtr connected_subchannel) - : parent_(std::move(parent)), - state_(new_state), - connected_subchannel_(std::move(connected_subchannel)) { - gpr_log(GPR_ERROR, "updater run %p", parent_->mu()); - running_exec_ctx_ = ExecCtx::Get(); + Updater(RefCountedPtr parent) + : parent_(std::move(parent)) { parent_->parent_->chand_->work_serializer_->Run( [this]() { ApplyUpdateInControlPlaneWorkSerializer(); }, DEBUG_LOCATION); - if (!run_inline_) { - gpr_mu_unlock(parent_->mu()->get()); - } } private: @@ -1074,23 +1062,28 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface { gpr_log(GPR_INFO, "chand=%p: processing connectivity change in work serializer " "for subchannel wrapper %p subchannel %p " - "(connected_subchannel=%p state=%s): watcher=%p", + "watcher=%p", parent_->parent_->chand_, parent_->parent_.get(), - parent_->parent_->subchannel_, connected_subchannel_.get(), - ConnectivityStateName(state_), parent_->watcher_.get()); + parent_->parent_->subchannel_, parent_->watcher_.get()); } - if (ExecCtx::Get() == running_exec_ctx_) { - // Running inline - gpr_mu_unlock(parent_->mu()->get()); - run_inline_ = true; + while (true) { + grpc_connectivity_state state; + RefCountedPtr connected_subchannel; + gpr_log(GPR_ERROR, "bout to popping connectivity state change %d", + state); + if (!parent_->PopConnectivityStateChange(&state, + &connected_subchannel)) { + break; + } + gpr_log(GPR_ERROR, "popping connectivity state change %d", state); + // Ignore update if the parent WatcherWrapper has been replaced + // since this callback was scheduled. + if (parent_->watcher_ == nullptr) continue; + parent_->last_seen_state_ = state; + parent_->parent_->MaybeUpdateConnectedSubchannel( + std::move(connected_subchannel)); + parent_->watcher_->OnConnectivityStateChange(state); } - // Ignore update if the parent WatcherWrapper has been replaced - // since this callback was scheduled. - if (parent_->watcher_ == nullptr) return; - parent_->last_seen_state_ = state_; - parent_->parent_->MaybeUpdateConnectedSubchannel( - std::move(connected_subchannel_)); - parent_->watcher_->OnConnectivityStateChange(state_); delete this; } diff --git a/src/core/ext/filters/client_channel/subchannel.cc b/src/core/ext/filters/client_channel/subchannel.cc index 47288c7c198..51fb70a7945 100644 --- a/src/core/ext/filters/client_channel/subchannel.cc +++ b/src/core/ext/filters/client_channel/subchannel.cc @@ -371,40 +371,24 @@ class Subchannel::AsyncWatcherNotifierLocked { Subchannel* subchannel, grpc_connectivity_state state) : subchannel_(subchannel), watcher_(std::move(watcher)) { gpr_log(GPR_ERROR, "pushing connectivity state change %d", state); - { - MutexLock(watcher_->mu()); - watcher_->PushConnectivityStateChangeLocked(state); + RefCountedPtr connected_subchannel; + if (state == GRPC_CHANNEL_READY) { + connected_subchannel = subchannel_->connected_subchannel_; } + watcher_->PushConnectivityStateChange(state, + std::move(connected_subchannel)); + gpr_log(GPR_ERROR, "done pushing"); ExecCtx::Run( DEBUG_LOCATION, - GRPC_CLOSURE_INIT( - &closure_, - [](void* arg, grpc_error* /*error*/) { - auto* self = static_cast(arg); - while (true) { - grpc_connectivity_state state; - RefCountedPtr connected_subchannel; - gpr_log(GPR_ERROR, "lock %p", self->watcher_->mu()); - gpr_mu_lock(self->watcher_->mu()->get()); - { - if (!self->watcher_->PopConnectivityStateChangeLocked( - &state)) { - gpr_mu_unlock(self->watcher_->mu()->get()); - break; - } - gpr_log(GPR_ERROR, "popping connectivity state change %d", - state); - if (state == GRPC_CHANNEL_READY) { - connected_subchannel = - self->subchannel_->connected_subchannel_; - } - } - self->watcher_->OnConnectivityStateChange( - state, std::move(connected_subchannel)); - } - delete self; - }, - this, nullptr), + GRPC_CLOSURE_INIT(&closure_, + [](void* arg, grpc_error* /*error*/) { + gpr_log(GPR_ERROR, "done conn state change exec"); + auto* self = + static_cast(arg); + self->watcher_->OnConnectivityStateChange(); + delete self; + }, + this, nullptr), GRPC_ERROR_NONE); } diff --git a/src/core/ext/filters/client_channel/subchannel.h b/src/core/ext/filters/client_channel/subchannel.h index 34dce735768..87192aa989d 100644 --- a/src/core/ext/filters/client_channel/subchannel.h +++ b/src/core/ext/filters/client_channel/subchannel.h @@ -190,42 +190,49 @@ class Subchannel { // contain a ref to the connected subchannel. When it changes from // READY to some other state, the implementation must release its // ref to the connected subchannel. - virtual void OnConnectivityStateChange( - grpc_connectivity_state new_state, - RefCountedPtr connected_subchannel) // NOLINT + virtual void OnConnectivityStateChange() // NOLINT = 0; virtual grpc_pollset_set* interested_parties() = 0; + // Enqueues connectivity state change notifications. // TODO(yashkt): This is currently needed to send the state updates in the // right order when asynchronously notifying. This will no longer be - // necessary when we have access to EventManager. Enqueues connectivity - // state change notifications. Does NOT - void PushConnectivityStateChangeLocked(grpc_connectivity_state state) { - connectivity_state_queue_.push_back(state); + // necessary when we have access to EventManager. + void PushConnectivityStateChange( + grpc_connectivity_state state, + RefCountedPtr connected_subchannel) { + MutexLock lock(&mu_); + connectivity_state_queue_.push_back( + std::make_pair(state, std::move(connected_subchannel))); } // Dequeues connectivity state change notifications. If the queue is empty, // it returns false, otherwise returns true and sets \a state to the popped // state change. - bool PopConnectivityStateChangeLocked(grpc_connectivity_state* state) { + bool PopConnectivityStateChange( + grpc_connectivity_state* state, + RefCountedPtr* connected_subchannel) { + MutexLock lock(&mu_); if (connectivity_state_queue_.empty()) { return false; } else { - *state = connectivity_state_queue_.front(); + *state = connectivity_state_queue_.front().first; + *connected_subchannel = + std::move(connectivity_state_queue_.front().second); connectivity_state_queue_.pop_front(); return true; } } - Mutex* mu() { return &mu_; } - private: // Keeps track of the updates that the watcher instance must be notified of. // TODO(yashkt): This is currently needed to send the state updates in the // right order when asynchronously notifying. This will no longer be // necessary when we have access to EventManager. - std::deque connectivity_state_queue_; + std::deque< + std::pair>> + connectivity_state_queue_; Mutex mu_; // protects the queue }; From 9d9eaca9a51116a13c0a3e1cce49ae40afc4d6a0 Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Thu, 27 Feb 2020 13:13:43 -0800 Subject: [PATCH 076/758] Clean up code --- src/core/ext/filters/client_channel/client_channel.cc | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/core/ext/filters/client_channel/client_channel.cc b/src/core/ext/filters/client_channel/client_channel.cc index f68b02e526a..2f11ffd9bb5 100644 --- a/src/core/ext/filters/client_channel/client_channel.cc +++ b/src/core/ext/filters/client_channel/client_channel.cc @@ -1088,11 +1088,6 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface { } RefCountedPtr parent_; - grpc_connectivity_state state_; - RefCountedPtr connected_subchannel_; - bool run_inline_ = false; - /* This can be replaced with something like getting the thread id */ - ExecCtx* running_exec_ctx_ = nullptr; }; std::unique_ptr From 18a5fbeb9376a58b7d4e52acf949584f9b681c5d Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Thu, 27 Feb 2020 13:38:31 -0800 Subject: [PATCH 077/758] Make Buildifier happy --- src/python/grpcio_tests/tests/qps/BUILD.bazel | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/python/grpcio_tests/tests/qps/BUILD.bazel b/src/python/grpcio_tests/tests/qps/BUILD.bazel index adf39ab4244..bedb98cd437 100644 --- a/src/python/grpcio_tests/tests/qps/BUILD.bazel +++ b/src/python/grpcio_tests/tests/qps/BUILD.bazel @@ -62,13 +62,13 @@ py_library( deps = [ ":benchmark_client", ":benchmark_server", - ":histogram", ":client_runner", + ":histogram", + "//src/proto/grpc/core:stats_py_pb2", "//src/proto/grpc/testing:benchmark_service_py_pb2_grpc", "//src/proto/grpc/testing:control_py_pb2", "//src/proto/grpc/testing:payloads_py_pb2", "//src/proto/grpc/testing:stats_py_pb2", - "//src/proto/grpc/core:stats_py_pb2", "//src/proto/grpc/testing:worker_service_py_pb2_grpc", "//src/python/grpcio/grpc:grpcio", "//src/python/grpcio_tests/tests/unit:resources", @@ -79,8 +79,8 @@ py_library( py_binary( name = "qps_worker", srcs = ["qps_worker.py"], - srcs_version = "PY2AND3", imports = ["../.."], + srcs_version = "PY2AND3", deps = [ ":worker_server", "//src/proto/grpc/testing:worker_service_py_pb2_grpc", From 05fa7c92553020ebafee33650bdd524cf631c305 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Thu, 27 Feb 2020 13:39:34 -0800 Subject: [PATCH 078/758] Remove logging from qps_worker.py --- src/python/grpcio_tests/tests/qps/qps_worker.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/python/grpcio_tests/tests/qps/qps_worker.py b/src/python/grpcio_tests/tests/qps/qps_worker.py index 7fe16ea1f5e..a7e692821ac 100644 --- a/src/python/grpcio_tests/tests/qps/qps_worker.py +++ b/src/python/grpcio_tests/tests/qps/qps_worker.py @@ -15,7 +15,6 @@ import argparse import time -import logging import grpc from src.proto.grpc.testing import worker_service_pb2_grpc @@ -36,7 +35,6 @@ def run_worker_server(port): if __name__ == '__main__': - logging.basicConfig(level=logging.DEBUG) parser = argparse.ArgumentParser( description='gRPC Python performance testing worker') parser.add_argument('--driver_port', From b5ea30b7b1fd15cbdd95eab9e0aa13dd15537dd4 Mon Sep 17 00:00:00 2001 From: Muxi Yan Date: Fri, 28 Feb 2020 14:09:52 -0800 Subject: [PATCH 079/758] Retry testConcurrentRPCsWithErrors --- .../tests/InteropTests/InteropTests.m | 83 ++++++++++++++----- 1 file changed, 63 insertions(+), 20 deletions(-) diff --git a/src/objective-c/tests/InteropTests/InteropTests.m b/src/objective-c/tests/InteropTests/InteropTests.m index ac0c7898749..aa424c158d7 100644 --- a/src/objective-c/tests/InteropTests/InteropTests.m +++ b/src/objective-c/tests/InteropTests/InteropTests.m @@ -39,6 +39,7 @@ #define TEST_TIMEOUT 32 +static const int kTestRetries = 3; extern const char *kCFStreamVarName; // Convenience constructors for the generated proto messages: @@ -380,6 +381,36 @@ static dispatch_once_t initGlobalInterceptorFactory; RMTTestService *_service; } +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Warc-performSelector-leaks" +- (void)retriableTest:(SEL)selector retries:(int)retries timeout:(NSTimeInterval)timeout { + for (int i = 0; i < retries; i++) { + NSDate *waitUntil = [[NSDate date] dateByAddingTimeInterval:timeout]; + NSCondition *cv = [[NSCondition alloc] init]; + __block BOOL done = NO; + [cv lock]; + dispatch_async(dispatch_get_global_queue(QOS_CLASS_BACKGROUND, 0), ^{ + [self performSelector:selector]; + [cv lock]; + done = YES; + [cv signal]; + [cv unlock]; + }); + while (!done && [waitUntil timeIntervalSinceNow] > 0) { + [cv waitUntilDate:waitUntil]; + } + if (done) { + [cv unlock]; + break; + } else { + [cv unlock]; + [self tearDown]; + [self setUp]; + } + } +} +#pragma clang diagnostic pop + + (XCTestSuite *)defaultTestSuite { if (self == [InteropTests class]) { return [XCTestSuite testSuiteWithName:@"InteropTestsEmptySuite"]; @@ -719,14 +750,13 @@ static dispatch_once_t initGlobalInterceptorFactory; [self waitForExpectationsWithTimeout:TEST_TIMEOUT handler:nil]; } -- (void)testConcurrentRPCsWithErrors { - NSMutableArray *completeExpectations = [NSMutableArray array]; - int num_rpcs = 10; - for (int i = 0; i < num_rpcs; ++i) { - [completeExpectations - addObject:[self expectationWithDescription: - [NSString stringWithFormat:@"Received trailer for RPC %d", i]]]; - +- (void)concurrentRPCsWithErrors { + const int kNumRpcs = 10; + __block int completedCallCount = 0; + NSCondition *cv = [[NSCondition alloc] init]; + NSDate *waitUntil = [[NSDate date] dateByAddingTimeInterval:TEST_TIMEOUT]; + [cv lock]; + for (int i = 0; i < kNumRpcs; ++i) { RMTSimpleRequest *request = [RMTSimpleRequest message]; request.responseType = RMTPayloadType_Compressable; request.responseSize = 314159; @@ -737,20 +767,33 @@ static dispatch_once_t initGlobalInterceptorFactory; request.responseStatus.code = GRPC_STATUS_CANCELLED; } - [_service unaryCallWithRequest:request - handler:^(RMTSimpleResponse *response, NSError *error) { - if (error == nil) { - RMTSimpleResponse *expectedResponse = [RMTSimpleResponse message]; - expectedResponse.payload.type = RMTPayloadType_Compressable; - expectedResponse.payload.body = - [NSMutableData dataWithLength:314159]; - XCTAssertEqualObjects(response, expectedResponse); - } - [completeExpectations[i] fulfill]; - }]; + GRPCProtoCall *call = [_service + RPCToUnaryCallWithRequest:request + handler:^(RMTSimpleResponse *response, NSError *error) { + if (error == nil) { + RMTSimpleResponse *expectedResponse = [RMTSimpleResponse message]; + expectedResponse.payload.type = RMTPayloadType_Compressable; + expectedResponse.payload.body = [NSMutableData dataWithLength:314159]; + XCTAssertEqualObjects(response, expectedResponse); + } + // DEBUG + [cv lock]; + if (++completedCallCount == kNumRpcs) { + [cv signal]; + } + [cv unlock]; + }]; + [call setResponseDispatchQueue:dispatch_queue_create(NULL, DISPATCH_QUEUE_SERIAL)]; + [call start]; + } + while (completedCallCount 0) { + [cv waitUntilDate:waitUntil]; } + [cv unlock]; +} - [self waitForExpectationsWithTimeout:TEST_TIMEOUT handler:nil]; +- (void)testConcurrentRPCsWithErrors { + [self retriableTest:@selector(concurrentRPCsWithErrors) retries:kTestRetries timeout:10]; } - (void)testPacketCoalescing { From 2cdab491a39ae184788d9ad0fc93c8b6ecbad575 Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Mon, 2 Mar 2020 11:19:21 -0800 Subject: [PATCH 080/758] Cleanup --- CMakeLists.txt | 2 ++ Makefile | 2 ++ build_autogenerated.yaml | 2 ++ gRPC-Core.podspec | 1 + grpc.gyp | 2 ++ src/core/ext/filters/client_channel/client_channel.cc | 3 --- .../lb_policy/round_robin/round_robin.cc | 2 +- .../ext/filters/client_channel/lb_policy/xds/xds.cc | 2 +- src/core/ext/filters/client_channel/subchannel.cc | 11 ++--------- src/core/lib/transport/connectivity_state.cc | 2 +- test/core/end2end/end2end_nosec_tests.cc | 8 ++++++++ test/core/end2end/end2end_tests.cc | 8 ++++++++ test/core/end2end/gen_build_yaml.py | 2 ++ test/core/end2end/generate_tests.bzl | 1 + test/cpp/end2end/xds_end2end_test.cc | 7 +------ tools/run_tests/python_utils/jobset.py | 1 - 16 files changed, 34 insertions(+), 22 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6c216bb2134..d0973cffe4e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -934,6 +934,7 @@ add_library(end2end_nosec_tests test/core/end2end/tests/max_message_length.cc test/core/end2end/tests/negative_deadline.cc test/core/end2end/tests/no_error_on_hotpath.cc + test/core/end2end/tests/no_logging.cc test/core/end2end/tests/no_op.cc test/core/end2end/tests/payload.cc test/core/end2end/tests/ping.cc @@ -1064,6 +1065,7 @@ add_library(end2end_tests test/core/end2end/tests/max_message_length.cc test/core/end2end/tests/negative_deadline.cc test/core/end2end/tests/no_error_on_hotpath.cc + test/core/end2end/tests/no_logging.cc test/core/end2end/tests/no_op.cc test/core/end2end/tests/payload.cc test/core/end2end/tests/ping.cc diff --git a/Makefile b/Makefile index 65197ce854e..2b6f2efe939 100644 --- a/Makefile +++ b/Makefile @@ -3324,6 +3324,7 @@ LIBEND2END_NOSEC_TESTS_SRC = \ test/core/end2end/tests/max_message_length.cc \ test/core/end2end/tests/negative_deadline.cc \ test/core/end2end/tests/no_error_on_hotpath.cc \ + test/core/end2end/tests/no_logging.cc \ test/core/end2end/tests/no_op.cc \ test/core/end2end/tests/payload.cc \ test/core/end2end/tests/ping.cc \ @@ -3435,6 +3436,7 @@ LIBEND2END_TESTS_SRC = \ test/core/end2end/tests/max_message_length.cc \ test/core/end2end/tests/negative_deadline.cc \ test/core/end2end/tests/no_error_on_hotpath.cc \ + test/core/end2end/tests/no_logging.cc \ test/core/end2end/tests/no_op.cc \ test/core/end2end/tests/payload.cc \ test/core/end2end/tests/ping.cc \ diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml index 9ce830c2d80..b0d6e8a2ef6 100644 --- a/build_autogenerated.yaml +++ b/build_autogenerated.yaml @@ -72,6 +72,7 @@ libs: - test/core/end2end/tests/max_message_length.cc - test/core/end2end/tests/negative_deadline.cc - test/core/end2end/tests/no_error_on_hotpath.cc + - test/core/end2end/tests/no_logging.cc - test/core/end2end/tests/no_op.cc - test/core/end2end/tests/payload.cc - test/core/end2end/tests/ping.cc @@ -179,6 +180,7 @@ libs: - test/core/end2end/tests/max_message_length.cc - test/core/end2end/tests/negative_deadline.cc - test/core/end2end/tests/no_error_on_hotpath.cc + - test/core/end2end/tests/no_logging.cc - test/core/end2end/tests/no_op.cc - test/core/end2end/tests/payload.cc - test/core/end2end/tests/ping.cc diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec index 23755f0fd4f..d62aff48c64 100644 --- a/gRPC-Core.podspec +++ b/gRPC-Core.podspec @@ -1446,6 +1446,7 @@ Pod::Spec.new do |s| 'test/core/end2end/tests/max_message_length.cc', 'test/core/end2end/tests/negative_deadline.cc', 'test/core/end2end/tests/no_error_on_hotpath.cc', + 'test/core/end2end/tests/no_logging.cc', 'test/core/end2end/tests/no_op.cc', 'test/core/end2end/tests/payload.cc', 'test/core/end2end/tests/ping.cc', diff --git a/grpc.gyp b/grpc.gyp index 32aaebf1c4a..784a0a93f47 100644 --- a/grpc.gyp +++ b/grpc.gyp @@ -221,6 +221,7 @@ 'test/core/end2end/tests/max_message_length.cc', 'test/core/end2end/tests/negative_deadline.cc', 'test/core/end2end/tests/no_error_on_hotpath.cc', + 'test/core/end2end/tests/no_logging.cc', 'test/core/end2end/tests/no_op.cc', 'test/core/end2end/tests/payload.cc', 'test/core/end2end/tests/ping.cc', @@ -321,6 +322,7 @@ 'test/core/end2end/tests/max_message_length.cc', 'test/core/end2end/tests/negative_deadline.cc', 'test/core/end2end/tests/no_error_on_hotpath.cc', + 'test/core/end2end/tests/no_logging.cc', 'test/core/end2end/tests/no_op.cc', 'test/core/end2end/tests/payload.cc', 'test/core/end2end/tests/ping.cc', diff --git a/src/core/ext/filters/client_channel/client_channel.cc b/src/core/ext/filters/client_channel/client_channel.cc index 2f11ffd9bb5..5bab5517b2d 100644 --- a/src/core/ext/filters/client_channel/client_channel.cc +++ b/src/core/ext/filters/client_channel/client_channel.cc @@ -1069,13 +1069,10 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface { while (true) { grpc_connectivity_state state; RefCountedPtr connected_subchannel; - gpr_log(GPR_ERROR, "bout to popping connectivity state change %d", - state); if (!parent_->PopConnectivityStateChange(&state, &connected_subchannel)) { break; } - gpr_log(GPR_ERROR, "popping connectivity state change %d", state); // Ignore update if the parent WatcherWrapper has been replaced // since this callback was scheduled. if (parent_->watcher_ == nullptr) continue; diff --git a/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc b/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc index 5e11bb0fd2e..a5ab488ec55 100644 --- a/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +++ b/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc @@ -44,7 +44,7 @@ namespace grpc_core { -TraceFlag grpc_lb_round_robin_trace(true, "round_robin"); +TraceFlag grpc_lb_round_robin_trace(false, "round_robin"); namespace { diff --git a/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc b/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc index 83ba785808b..b66d823e51b 100644 --- a/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc +++ b/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc @@ -67,7 +67,7 @@ namespace grpc_core { -TraceFlag grpc_lb_xds_trace(true, "xds"); +TraceFlag grpc_lb_xds_trace(false, "xds"); namespace { diff --git a/src/core/ext/filters/client_channel/subchannel.cc b/src/core/ext/filters/client_channel/subchannel.cc index 51fb70a7945..231c333422d 100644 --- a/src/core/ext/filters/client_channel/subchannel.cc +++ b/src/core/ext/filters/client_channel/subchannel.cc @@ -369,20 +369,17 @@ class Subchannel::AsyncWatcherNotifierLocked { AsyncWatcherNotifierLocked( RefCountedPtr watcher, Subchannel* subchannel, grpc_connectivity_state state) - : subchannel_(subchannel), watcher_(std::move(watcher)) { - gpr_log(GPR_ERROR, "pushing connectivity state change %d", state); + : watcher_(std::move(watcher)) { RefCountedPtr connected_subchannel; if (state == GRPC_CHANNEL_READY) { - connected_subchannel = subchannel_->connected_subchannel_; + connected_subchannel = subchannel->connected_subchannel_; } watcher_->PushConnectivityStateChange(state, std::move(connected_subchannel)); - gpr_log(GPR_ERROR, "done pushing"); ExecCtx::Run( DEBUG_LOCATION, GRPC_CLOSURE_INIT(&closure_, [](void* arg, grpc_error* /*error*/) { - gpr_log(GPR_ERROR, "done conn state change exec"); auto* self = static_cast(arg); self->watcher_->OnConnectivityStateChange(); @@ -393,7 +390,6 @@ class Subchannel::AsyncWatcherNotifierLocked { } private: - Subchannel* subchannel_; RefCountedPtr watcher_; grpc_closure closure_; }; @@ -415,7 +411,6 @@ void Subchannel::ConnectivityStateWatcherList::RemoveWatcherLocked( void Subchannel::ConnectivityStateWatcherList::NotifyLocked( Subchannel* subchannel, grpc_connectivity_state state) { for (const auto& p : watchers_) { - gpr_log(GPR_ERROR, "AsyncWatcherNotifierLocked"); new AsyncWatcherNotifierLocked(p.second, subchannel, state); } } @@ -455,7 +450,6 @@ class Subchannel::HealthWatcherMap::HealthWatcher grpc_connectivity_state initial_state, RefCountedPtr watcher) { if (state_ != initial_state) { - gpr_log(GPR_ERROR, "AsyncWatcherNotifierLocked"); new AsyncWatcherNotifierLocked(watcher, subchannel_, state_); } watcher_list_.AddWatcherLocked(std::move(watcher)); @@ -817,7 +811,6 @@ void Subchannel::WatchConnectivityState( } if (health_check_service_name == nullptr) { if (state_ != initial_state) { - gpr_log(GPR_ERROR, "AsyncWatcherNotifierLocked"); new AsyncWatcherNotifierLocked(watcher, this, state_); } watcher_list_.AddWatcherLocked(std::move(watcher)); diff --git a/src/core/lib/transport/connectivity_state.cc b/src/core/lib/transport/connectivity_state.cc index b20ee434b99..2d34f52e635 100644 --- a/src/core/lib/transport/connectivity_state.cc +++ b/src/core/lib/transport/connectivity_state.cc @@ -31,7 +31,7 @@ namespace grpc_core { -TraceFlag grpc_connectivity_state_trace(true, "connectivity_state"); +TraceFlag grpc_connectivity_state_trace(false, "connectivity_state"); const char* ConnectivityStateName(grpc_connectivity_state state) { switch (state) { diff --git a/test/core/end2end/end2end_nosec_tests.cc b/test/core/end2end/end2end_nosec_tests.cc index f9b6e6bc320..e01e6ad0104 100644 --- a/test/core/end2end/end2end_nosec_tests.cc +++ b/test/core/end2end/end2end_nosec_tests.cc @@ -101,6 +101,8 @@ extern void negative_deadline(grpc_end2end_test_config config); extern void negative_deadline_pre_init(void); extern void no_error_on_hotpath(grpc_end2end_test_config config); extern void no_error_on_hotpath_pre_init(void); +extern void no_logging(grpc_end2end_test_config config); +extern void no_logging_pre_init(void); extern void no_op(grpc_end2end_test_config config); extern void no_op_pre_init(void); extern void payload(grpc_end2end_test_config config); @@ -221,6 +223,7 @@ void grpc_end2end_tests_pre_init(void) { max_message_length_pre_init(); negative_deadline_pre_init(); no_error_on_hotpath_pre_init(); + no_logging_pre_init(); no_op_pre_init(); payload_pre_init(); ping_pre_init(); @@ -306,6 +309,7 @@ void grpc_end2end_tests(int argc, char **argv, max_message_length(config); negative_deadline(config); no_error_on_hotpath(config); + no_logging(config); no_op(config); payload(config); ping(config); @@ -494,6 +498,10 @@ void grpc_end2end_tests(int argc, char **argv, no_error_on_hotpath(config); continue; } + if (0 == strcmp("no_logging", argv[i])) { + no_logging(config); + continue; + } if (0 == strcmp("no_op", argv[i])) { no_op(config); continue; diff --git a/test/core/end2end/end2end_tests.cc b/test/core/end2end/end2end_tests.cc index 8b57ad6ba33..76fb046b367 100644 --- a/test/core/end2end/end2end_tests.cc +++ b/test/core/end2end/end2end_tests.cc @@ -103,6 +103,8 @@ extern void negative_deadline(grpc_end2end_test_config config); extern void negative_deadline_pre_init(void); extern void no_error_on_hotpath(grpc_end2end_test_config config); extern void no_error_on_hotpath_pre_init(void); +extern void no_logging(grpc_end2end_test_config config); +extern void no_logging_pre_init(void); extern void no_op(grpc_end2end_test_config config); extern void no_op_pre_init(void); extern void payload(grpc_end2end_test_config config); @@ -224,6 +226,7 @@ void grpc_end2end_tests_pre_init(void) { max_message_length_pre_init(); negative_deadline_pre_init(); no_error_on_hotpath_pre_init(); + no_logging_pre_init(); no_op_pre_init(); payload_pre_init(); ping_pre_init(); @@ -310,6 +313,7 @@ void grpc_end2end_tests(int argc, char **argv, max_message_length(config); negative_deadline(config); no_error_on_hotpath(config); + no_logging(config); no_op(config); payload(config); ping(config); @@ -502,6 +506,10 @@ void grpc_end2end_tests(int argc, char **argv, no_error_on_hotpath(config); continue; } + if (0 == strcmp("no_logging", argv[i])) { + no_logging(config); + continue; + } if (0 == strcmp("no_op", argv[i])) { no_op(config); continue; diff --git a/test/core/end2end/gen_build_yaml.py b/test/core/end2end/gen_build_yaml.py index 23defc9b7e9..d1e78cc6490 100755 --- a/test/core/end2end/gen_build_yaml.py +++ b/test/core/end2end/gen_build_yaml.py @@ -228,6 +228,8 @@ END2END_TESTS = { default_test_options, 'no_error_on_hotpath': default_test_options._replace(proxyable=False), + 'no_logging': + default_test_options._replace(traceable=False), 'no_op': default_test_options, 'payload': diff --git a/test/core/end2end/generate_tests.bzl b/test/core/end2end/generate_tests.bzl index d9d4c66d615..38efc2f1cae 100755 --- a/test/core/end2end/generate_tests.bzl +++ b/test/core/end2end/generate_tests.bzl @@ -243,6 +243,7 @@ END2END_TESTS = { "max_message_length": _test_options(), "negative_deadline": _test_options(), "no_error_on_hotpath": _test_options(proxyable = False), + "no_logging": _test_options(traceable = False), "no_op": _test_options(), "payload": _test_options(), # TODO(juanlishen): This is disabled for now because it depends on some generated functions in diff --git a/test/cpp/end2end/xds_end2end_test.cc b/test/cpp/end2end/xds_end2end_test.cc index 0ca39a4fd00..f7c2173e3fd 100644 --- a/test/cpp/end2end/xds_end2end_test.cc +++ b/test/cpp/end2end/xds_end2end_test.cc @@ -972,12 +972,7 @@ class XdsEnd2endTest : public ::testing::TestWithParam { bool SeenAllBackends(size_t start_index = 0, size_t stop_index = 0) { if (stop_index == 0) stop_index = backends_.size(); for (size_t i = start_index; i < stop_index; ++i) { - if (backends_[i]->backend_service()->request_count() == 0) - return false; - else { - gpr_log(GPR_INFO, "backend %d with request count %lu", i, - backends_[i]->backend_service()->request_count()); - } + if (backends_[i]->backend_service()->request_count() == 0) return false; } return true; } diff --git a/tools/run_tests/python_utils/jobset.py b/tools/run_tests/python_utils/jobset.py index 57e239ee42b..d9ae0620da5 100755 --- a/tools/run_tests/python_utils/jobset.py +++ b/tools/run_tests/python_utils/jobset.py @@ -130,7 +130,6 @@ def message(tag, msg, explanatory_text=None, do_newline=False): try: if platform_string() == 'windows' or not sys.stdout.isatty(): if explanatory_text: - print(explanatory_text) logging.info(explanatory_text) logging.info('%s: %s', tag, msg) else: From f4eba1e871ba0962b2315023097d95c80836b59b Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Wed, 4 Mar 2020 23:54:38 -0500 Subject: [PATCH 081/758] cmake: use more portable way to enable C++11 --- CMakeLists.txt | 13 ++++++++----- templates/CMakeLists.txt.template | 13 ++++++++----- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c87f080e2d5..0d900d69a57 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -152,6 +152,14 @@ if(WIN32) set(_gRPC_PLATFORM_WINDOWS ON) endif() + # Use C99 standard +set(CMAKE_C_STANDARD 99) + +# Add c++11 flags +set(CMAKE_CXX_STANDARD 11) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_CXX_EXTENSIONS OFF) + set(CMAKE_POSITION_INDEPENDENT_CODE TRUE) set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules") @@ -201,11 +209,6 @@ include(cmake/ssl.cmake) include(cmake/upb.cmake) include(cmake/zlib.cmake) -if(NOT MSVC) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") -endif() - if(_gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_IOS) set(_gRPC_ALLTARGETS_LIBRARIES ${CMAKE_DL_LIBS} m pthread) elseif(_gRPC_PLATFORM_ANDROID) diff --git a/templates/CMakeLists.txt.template b/templates/CMakeLists.txt.template index b5b1ae30811..1a5c81f5357 100644 --- a/templates/CMakeLists.txt.template +++ b/templates/CMakeLists.txt.template @@ -242,6 +242,14 @@ set(_gRPC_PLATFORM_WINDOWS ON) endif() + # Use C99 standard + set(CMAKE_C_STANDARD 99) + + # Add c++11 flags + set(CMAKE_CXX_STANDARD 11) + set(CMAKE_CXX_STANDARD_REQUIRED ON) + set(CMAKE_CXX_EXTENSIONS OFF) + ## Some libraries are shared even with BUILD_SHARED_LIBRARIES=OFF set(CMAKE_POSITION_INDEPENDENT_CODE TRUE) set(CMAKE_MODULE_PATH "<%text>${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules") @@ -292,11 +300,6 @@ include(cmake/upb.cmake) include(cmake/zlib.cmake) - if(NOT MSVC) - set(CMAKE_C_FLAGS "<%text>${CMAKE_C_FLAGS} -std=c99") - set(CMAKE_CXX_FLAGS "<%text>${CMAKE_CXX_FLAGS} -std=c++11") - endif() - if(_gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_IOS) set(_gRPC_ALLTARGETS_LIBRARIES <%text>${CMAKE_DL_LIBS} m pthread) elseif(_gRPC_PLATFORM_ANDROID) From 4c75b5c06be6b4c040492038eceb4dd227e8984a Mon Sep 17 00:00:00 2001 From: Karthik Ravi Shankar Date: Thu, 5 Mar 2020 18:22:03 -0800 Subject: [PATCH 082/758] Revert "Revert "Revert "Fold opencensus into grpc_impl namespace""" This reverts commit f66b6547959e1964932872e15498042156ee8c08. --- BUILD | 1 - include/grpcpp/opencensus.h | 26 ++++++++- include/grpcpp/opencensus_impl.h | 47 ---------------- src/cpp/ext/filters/census/grpc_plugin.cc | 65 +++++++++++------------ src/cpp/ext/filters/census/views.cc | 32 ++++++----- 5 files changed, 70 insertions(+), 101 deletions(-) delete mode 100644 include/grpcpp/opencensus_impl.h diff --git a/BUILD b/BUILD index 8fe2d6d2e15..a62ca7e8ec2 100644 --- a/BUILD +++ b/BUILD @@ -2322,7 +2322,6 @@ grpc_cc_library( ], hdrs = [ "include/grpcpp/opencensus.h", - "include/grpcpp/opencensus_impl.h", "src/cpp/ext/filters/census/channel_filter.h", "src/cpp/ext/filters/census/client_filter.h", "src/cpp/ext/filters/census/context.h", diff --git a/include/grpcpp/opencensus.h b/include/grpcpp/opencensus.h index 39bac6bc28c..c99e203e2e6 100644 --- a/include/grpcpp/opencensus.h +++ b/include/grpcpp/opencensus.h @@ -19,7 +19,31 @@ #ifndef GRPCPP_OPENCENSUS_H #define GRPCPP_OPENCENSUS_H -#include "grpcpp/opencensus_impl.h" +#include "opencensus/trace/span.h" + +namespace grpc { +// These symbols in this file will not be included in the binary unless +// grpc_opencensus_plugin build target was added as a dependency. At the moment +// it is only setup to be built with Bazel. + +// Registers the OpenCensus plugin with gRPC, so that it will be used for future +// RPCs. This must be called before any views are created. +void RegisterOpenCensusPlugin(); + +// RPC stats definitions, defined by +// https://github.com/census-instrumentation/opencensus-specs/blob/master/stats/gRPC.md + +// Registers the cumulative gRPC views so that they will be exported by any +// registered stats exporter. For on-task stats, construct a View using the +// ViewDescriptors below. +void RegisterOpenCensusViewsForExport(); + +class ServerContext; + +// Returns the tracing Span for the current RPC. +::opencensus::trace::Span GetSpanFromServerContext(ServerContext* context); + +} // namespace grpc namespace grpc { diff --git a/include/grpcpp/opencensus_impl.h b/include/grpcpp/opencensus_impl.h deleted file mode 100644 index dbcb7c9caeb..00000000000 --- a/include/grpcpp/opencensus_impl.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - * - * Copyright 2019 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef GRPCPP_OPENCENSUS_IMPL_H -#define GRPCPP_OPENCENSUS_IMPL_H - -#include "opencensus/trace/span.h" - -namespace grpc_impl { -class ServerContext; -// These symbols in this file will not be included in the binary unless -// grpc_opencensus_plugin build target was added as a dependency. At the moment -// it is only setup to be built with Bazel. - -// Registers the OpenCensus plugin with gRPC, so that it will be used for future -// RPCs. This must be called before any views are created. -void RegisterOpenCensusPlugin(); - -// RPC stats definitions, defined by -// https://github.com/census-instrumentation/opencensus-specs/blob/master/stats/gRPC.md - -// Registers the cumulative gRPC views so that they will be exported by any -// registered stats exporter. For on-task stats, construct a View using the -// ViewDescriptors below. -void RegisterOpenCensusViewsForExport(); - -// Returns the tracing Span for the current RPC. -::opencensus::trace::Span GetSpanFromServerContext(ServerContext* context); - -} // namespace grpc_impl - -#endif // GRPCPP_OPENCENSUS_IMPL_H diff --git a/src/cpp/ext/filters/census/grpc_plugin.cc b/src/cpp/ext/filters/census/grpc_plugin.cc index 63d6f1bde48..51b7264e10a 100644 --- a/src/cpp/ext/filters/census/grpc_plugin.cc +++ b/src/cpp/ext/filters/census/grpc_plugin.cc @@ -31,6 +31,35 @@ namespace grpc { +void RegisterOpenCensusPlugin() { + RegisterChannelFilter( + "opencensus_client", GRPC_CLIENT_CHANNEL, INT_MAX /* priority */, + nullptr /* condition function */); + RegisterChannelFilter( + "opencensus_server", GRPC_SERVER_CHANNEL, INT_MAX /* priority */, + nullptr /* condition function */); + + // Access measures to ensure they are initialized. Otherwise, creating a view + // before the first RPC would cause an error. + RpcClientSentBytesPerRpc(); + RpcClientReceivedBytesPerRpc(); + RpcClientRoundtripLatency(); + RpcClientServerLatency(); + RpcClientSentMessagesPerRpc(); + RpcClientReceivedMessagesPerRpc(); + + RpcServerSentBytesPerRpc(); + RpcServerReceivedBytesPerRpc(); + RpcServerServerLatency(); + RpcServerSentMessagesPerRpc(); + RpcServerReceivedMessagesPerRpc(); +} + +::opencensus::trace::Span GetSpanFromServerContext(ServerContext* context) { + return reinterpret_cast(context->census_context()) + ->Span(); +} + // These measure definitions should be kept in sync across opencensus // implementations--see // https://github.com/census-instrumentation/opencensus-java/blob/master/contrib/grpc_metrics/src/main/java/io/opencensus/contrib/grpc/metrics/RpcMeasureConstants.java. @@ -98,39 +127,5 @@ ABSL_CONST_INIT const absl::string_view ABSL_CONST_INIT const absl::string_view kRpcServerServerLatencyMeasureName = "grpc.io/server/server_latency"; -} // namespace grpc -namespace grpc_impl { -void RegisterOpenCensusPlugin() { - grpc::RegisterChannelFilter( - "opencensus_client", GRPC_CLIENT_CHANNEL, INT_MAX /* priority */, - nullptr /* condition function */); - grpc::RegisterChannelFilter( - "opencensus_server", GRPC_SERVER_CHANNEL, INT_MAX /* priority */, - nullptr /* condition function */); - - // Access measures to ensure they are initialized. Otherwise, creating a view - // before the first RPC would cause an error. - grpc::RpcClientSentBytesPerRpc(); - grpc::RpcClientReceivedBytesPerRpc(); - grpc::RpcClientRoundtripLatency(); - grpc::RpcClientServerLatency(); - grpc::RpcClientSentMessagesPerRpc(); - grpc::RpcClientReceivedMessagesPerRpc(); - - grpc::RpcServerSentBytesPerRpc(); - grpc::RpcServerReceivedBytesPerRpc(); - grpc::RpcServerServerLatency(); - grpc::RpcServerSentMessagesPerRpc(); - grpc::RpcServerReceivedMessagesPerRpc(); -} - -::opencensus::trace::Span GetSpanFromServerContext( - grpc::ServerContext* context) { - return reinterpret_cast(context->census_context()) - ->Span(); -} - -} // namespace grpc_impl +} // namespace grpc diff --git a/src/cpp/ext/filters/census/views.cc b/src/cpp/ext/filters/census/views.cc index d7e3c81a955..2c0c5f72950 100644 --- a/src/cpp/ext/filters/census/views.cc +++ b/src/cpp/ext/filters/census/views.cc @@ -25,23 +25,6 @@ #include "opencensus/stats/internal/set_aggregation_window.h" #include "opencensus/stats/stats.h" -namespace grpc_impl { - -void RegisterOpenCensusViewsForExport() { - grpc::ClientSentMessagesPerRpcCumulative().RegisterForExport(); - grpc::ClientSentBytesPerRpcCumulative().RegisterForExport(); - grpc::ClientReceivedMessagesPerRpcCumulative().RegisterForExport(); - grpc::ClientReceivedBytesPerRpcCumulative().RegisterForExport(); - grpc::ClientRoundtripLatencyCumulative().RegisterForExport(); - grpc::ClientServerLatencyCumulative().RegisterForExport(); - - grpc::ServerSentMessagesPerRpcCumulative().RegisterForExport(); - grpc::ServerSentBytesPerRpcCumulative().RegisterForExport(); - grpc::ServerReceivedMessagesPerRpcCumulative().RegisterForExport(); - grpc::ServerReceivedBytesPerRpcCumulative().RegisterForExport(); - grpc::ServerServerLatencyCumulative().RegisterForExport(); -} -} // namespace grpc_impl namespace grpc { using ::opencensus::stats::Aggregation; @@ -88,6 +71,21 @@ ViewDescriptor HourDescriptor() { } // namespace +void RegisterOpenCensusViewsForExport() { + ClientSentMessagesPerRpcCumulative().RegisterForExport(); + ClientSentBytesPerRpcCumulative().RegisterForExport(); + ClientReceivedMessagesPerRpcCumulative().RegisterForExport(); + ClientReceivedBytesPerRpcCumulative().RegisterForExport(); + ClientRoundtripLatencyCumulative().RegisterForExport(); + ClientServerLatencyCumulative().RegisterForExport(); + + ServerSentMessagesPerRpcCumulative().RegisterForExport(); + ServerSentBytesPerRpcCumulative().RegisterForExport(); + ServerReceivedMessagesPerRpcCumulative().RegisterForExport(); + ServerReceivedBytesPerRpcCumulative().RegisterForExport(); + ServerServerLatencyCumulative().RegisterForExport(); +} + // client cumulative const ViewDescriptor& ClientSentBytesPerRpcCumulative() { const static ViewDescriptor descriptor = From 162d3d76cb62ca68540a8a60efd99e46687c26c6 Mon Sep 17 00:00:00 2001 From: Karthik Ravi Shankar Date: Thu, 5 Mar 2020 18:55:14 -0800 Subject: [PATCH 083/758] Fix build error due to remaining ::grpc_impl references --- include/grpcpp/opencensus.h | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/include/grpcpp/opencensus.h b/include/grpcpp/opencensus.h index c99e203e2e6..1eed9f7d26d 100644 --- a/include/grpcpp/opencensus.h +++ b/include/grpcpp/opencensus.h @@ -21,6 +21,10 @@ #include "opencensus/trace/span.h" +namespace grpc_impl { +class ServerContext; +} + namespace grpc { // These symbols in this file will not be included in the binary unless // grpc_opencensus_plugin build target was added as a dependency. At the moment @@ -38,10 +42,8 @@ void RegisterOpenCensusPlugin(); // ViewDescriptors below. void RegisterOpenCensusViewsForExport(); -class ServerContext; - // Returns the tracing Span for the current RPC. -::opencensus::trace::Span GetSpanFromServerContext(ServerContext* context); +::opencensus::trace::Span GetSpanFromServerContext(::grpc_impl::ServerContext* context); } // namespace grpc From 3e631d0e97fa248bc64a3daf95f814b36c4834d0 Mon Sep 17 00:00:00 2001 From: Karthik Ravi Shankar Date: Thu, 5 Mar 2020 19:07:52 -0800 Subject: [PATCH 084/758] Fix build error --- include/grpcpp/opencensus.h | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/include/grpcpp/opencensus.h b/include/grpcpp/opencensus.h index 1eed9f7d26d..63edd52e03f 100644 --- a/include/grpcpp/opencensus.h +++ b/include/grpcpp/opencensus.h @@ -47,19 +47,4 @@ void RegisterOpenCensusViewsForExport(); } // namespace grpc -namespace grpc { - -static inline void RegisterOpenCensusPlugin() { - ::grpc_impl::RegisterOpenCensusPlugin(); -} -static inline void RegisterOpenCensusViewsForExport() { - ::grpc_impl::RegisterOpenCensusViewsForExport(); -} -static inline ::opencensus::trace::Span GetSpanFromServerContext( - ::grpc_impl::ServerContext* context) { - return ::grpc_impl::GetSpanFromServerContext(context); -} - -} // namespace grpc - #endif // GRPCPP_OPENCENSUS_H From cf20b1763ecb7c9778a96a6afedc15cb5c444cb8 Mon Sep 17 00:00:00 2001 From: Alexander Polcyn Date: Fri, 6 Mar 2020 16:03:52 -0800 Subject: [PATCH 085/758] run re-initialize submodules after checking out a tag in interop matrix image builder --- tools/interop_matrix/create_matrix_images.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/tools/interop_matrix/create_matrix_images.py b/tools/interop_matrix/create_matrix_images.py index 91a991d534f..9bc457d5b5d 100755 --- a/tools/interop_matrix/create_matrix_images.py +++ b/tools/interop_matrix/create_matrix_images.py @@ -325,6 +325,18 @@ def checkout_grpc_stack(lang, release): '%s: %s' % (str(output), commit_log), do_newline=True) + # git submodule update + jobset.message('START', + 'git submodule update --init at %s from %s' % (release, stack_base), + do_newline=True) + subprocess.check_call(['git', 'submodule', 'update', '--init'], + cwd=stack_base, + stderr=subprocess.STDOUT) + jobset.message('SUCCESS', + 'git submodule update --init', + '%s: %s' % (str(output), commit_log), + do_newline=True) + # Write git log to commit_log so it can be packaged with the docker image. with open(os.path.join(stack_base, 'commit_log'), 'w') as f: f.write(commit_log) From c4dd07aa7527f0904532d459321ea5b6c301d103 Mon Sep 17 00:00:00 2001 From: Alexander Polcyn Date: Mon, 9 Mar 2020 12:13:32 -0700 Subject: [PATCH 086/758] yapf code --- tools/interop_matrix/create_matrix_images.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/interop_matrix/create_matrix_images.py b/tools/interop_matrix/create_matrix_images.py index 9bc457d5b5d..b413ab4c2c7 100755 --- a/tools/interop_matrix/create_matrix_images.py +++ b/tools/interop_matrix/create_matrix_images.py @@ -327,7 +327,8 @@ def checkout_grpc_stack(lang, release): # git submodule update jobset.message('START', - 'git submodule update --init at %s from %s' % (release, stack_base), + 'git submodule update --init at %s from %s' % + (release, stack_base), do_newline=True) subprocess.check_call(['git', 'submodule', 'update', '--init'], cwd=stack_base, From eae488fc6688943cc600fd1a05382e56bd56b4b5 Mon Sep 17 00:00:00 2001 From: Esun Kim Date: Mon, 9 Mar 2020 15:05:57 -0700 Subject: [PATCH 087/758] Update abseil to get the recent patch on LTS 2020_20_25 --- bazel/grpc_deps.bzl | 6 +++--- gRPC-C++.podspec | 2 +- gRPC-Core.podspec | 2 +- templates/gRPC-C++.podspec.template | 2 +- templates/gRPC-Core.podspec.template | 2 +- third_party/abseil-cpp | 2 +- tools/run_tests/sanity/check_submodules.sh | 2 +- 7 files changed, 9 insertions(+), 9 deletions(-) diff --git a/bazel/grpc_deps.bzl b/bazel/grpc_deps.bzl index 67870991763..bc66dfeb1fb 100644 --- a/bazel/grpc_deps.bzl +++ b/bazel/grpc_deps.bzl @@ -197,9 +197,9 @@ def grpc_deps(): if "com_google_absl" not in native.existing_rules(): http_archive( name = "com_google_absl", - sha256 = "c14b840dc57926b8b671805426a82249e5ea0d7fddf709fd4619eb38cbb36fb5", - strip_prefix = "abseil-cpp-b832dce8489ef7b6231384909fd9b68d5a5ff2b7", - url = "https://github.com/abseil/abseil-cpp/archive/b832dce8489ef7b6231384909fd9b68d5a5ff2b7.tar.gz", + sha256 = "f368a8476f4e2e0eccf8a7318b98dafbe30b2600f4e3cf52636e5eb145aba06a", + strip_prefix = "abseil-cpp-df3ea785d8c30a9503321a3d35ee7d35808f190d", + url = "https://github.com/abseil/abseil-cpp/archive/df3ea785d8c30a9503321a3d35ee7d35808f190d.tar.gz", ) if "bazel_toolchains" not in native.existing_rules(): diff --git a/gRPC-C++.podspec b/gRPC-C++.podspec index 06a5a2762b9..8315e96f6ad 100644 --- a/gRPC-C++.podspec +++ b/gRPC-C++.podspec @@ -214,7 +214,7 @@ Pod::Spec.new do |s| ss.header_mappings_dir = '.' ss.dependency "#{s.name}/Interface", version ss.dependency 'gRPC-Core', version - abseil_version = '0.20200225.0' + abseil_version = '1.20200225.0' ss.dependency 'abseil/container/inlined_vector', abseil_version ss.dependency 'abseil/memory/memory', abseil_version ss.dependency 'abseil/strings/str_format', abseil_version diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec index f842a3ae677..f87d5f4603a 100644 --- a/gRPC-Core.podspec +++ b/gRPC-Core.podspec @@ -173,7 +173,7 @@ Pod::Spec.new do |s| ss.libraries = 'z' ss.dependency "#{s.name}/Interface", version ss.dependency 'BoringSSL-GRPC', '0.0.7' - abseil_version = '0.20200225.0' + abseil_version = '1.20200225.0' ss.dependency 'abseil/container/inlined_vector', abseil_version ss.dependency 'abseil/memory/memory', abseil_version ss.dependency 'abseil/strings/str_format', abseil_version diff --git a/templates/gRPC-C++.podspec.template b/templates/gRPC-C++.podspec.template index 3c98a519c46..5281d0bfbe8 100644 --- a/templates/gRPC-C++.podspec.template +++ b/templates/gRPC-C++.podspec.template @@ -164,7 +164,7 @@ ss.header_mappings_dir = '.' ss.dependency "#{s.name}/Interface", version ss.dependency 'gRPC-Core', version - abseil_version = '0.20200225.0' + abseil_version = '1.20200225.0' % for abseil_spec in grpcpp_abseil_specs: ss.dependency '${abseil_spec}', abseil_version % endfor diff --git a/templates/gRPC-Core.podspec.template b/templates/gRPC-Core.podspec.template index 6beb74beb11..ce710321a7e 100644 --- a/templates/gRPC-Core.podspec.template +++ b/templates/gRPC-Core.podspec.template @@ -193,7 +193,7 @@ ss.libraries = 'z' ss.dependency "#{s.name}/Interface", version ss.dependency 'BoringSSL-GRPC', '0.0.7' - abseil_version = '0.20200225.0' + abseil_version = '1.20200225.0' % for abseil_spec in grpc_abseil_specs: ss.dependency '${abseil_spec}', abseil_version % endfor diff --git a/third_party/abseil-cpp b/third_party/abseil-cpp index b832dce8489..df3ea785d8c 160000 --- a/third_party/abseil-cpp +++ b/third_party/abseil-cpp @@ -1 +1 @@ -Subproject commit b832dce8489ef7b6231384909fd9b68d5a5ff2b7 +Subproject commit df3ea785d8c30a9503321a3d35ee7d35808f190d diff --git a/tools/run_tests/sanity/check_submodules.sh b/tools/run_tests/sanity/check_submodules.sh index 7df3f9a37fe..05a28eae178 100755 --- a/tools/run_tests/sanity/check_submodules.sh +++ b/tools/run_tests/sanity/check_submodules.sh @@ -26,7 +26,7 @@ want_submodules=$(mktemp /tmp/submXXXXXX) git submodule | awk '{ print $1 }' | sort > "$submodules" cat << EOF | awk '{ print $1 }' | sort > "$want_submodules" - b832dce8489ef7b6231384909fd9b68d5a5ff2b7 third_party/abseil-cpp (heads/master) + df3ea785d8c30a9503321a3d35ee7d35808f190d third_party/abseil-cpp (heads/master) 090faecb454fbd6e6e17a75ef8146acb037118d4 third_party/benchmark (v1.5.0) 73594cde8c9a52a102c4341c244c833aa61b9c06 third_party/bloaty (remotes/origin/wide-14-g73594cd) 1c2769383f027befac5b75b6cedd25daf3bf4dcf third_party/boringssl-with-bazel (remotes/origin/master-with-bazel) From e00f8b34922f7c589223f46a24b568ea314c4bb9 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Fri, 6 Mar 2020 12:05:05 -0800 Subject: [PATCH 088/758] Use a poller thread to replace custom IO manager --- .../grpc/_cython/_cygrpc/aio/channel.pxd.pxi | 3 +- .../grpc/_cython/_cygrpc/aio/channel.pyx.pxi | 3 +- .../grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi | 25 +- .../_cython/_cygrpc/aio/iomgr/socket.pyx.pxi | 3 + .../grpc/_cython/_cygrpc/aio/poller.pxd.pxi | 11 + .../grpc/_cython/_cygrpc/aio/poller.pyx.pxi | 89 +++ .../grpc/_cython/_cygrpc/aio/server.pxd.pxi | 3 +- .../grpc/_cython/_cygrpc/aio/server.pyx.pxi | 3 +- src/python/grpcio/grpc/_cython/cygrpc.pxd | 1 + src/python/grpcio/grpc/_cython/cygrpc.pyx | 1 + .../grpcio_tests/tests_aio/unit/call_test.py | 564 +++++++++--------- 11 files changed, 417 insertions(+), 289 deletions(-) create mode 100644 src/python/grpcio/grpc/_cython/_cygrpc/aio/poller.pxd.pxi create mode 100644 src/python/grpcio/grpc/_cython/_cygrpc/aio/poller.pyx.pxi diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pxd.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pxd.pxi index 50879b4a224..62215b2d24f 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pxd.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pxd.pxi @@ -21,7 +21,8 @@ cdef enum AioChannelStatus: cdef class AioChannel: cdef: grpc_channel * channel - CallbackCompletionQueue cq + # CallbackCompletionQueue cq + BackgroundCompletionQueue cq object loop bytes _target AioChannelStatus _status diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi index bfa9477b6d1..cc6c5d99306 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi @@ -31,7 +31,8 @@ cdef class AioChannel: options = () cdef _ChannelArgs channel_args = _ChannelArgs(options) self._target = target - self.cq = CallbackCompletionQueue() + # self.cq = CallbackCompletionQueue() + self.cq = BackgroundCompletionQueue() self.loop = loop self._status = AIO_CHANNEL_STATUS_READY diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi index da3f976f117..95c6caf2501 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi @@ -19,22 +19,25 @@ cdef bint _grpc_aio_initialized = False # we should support this use case. So, the gRPC Python Async Stack should use # a single event loop picked by "init_grpc_aio". cdef object _grpc_aio_loop +cdef object _event_loop_thread_ident def init_grpc_aio(): global _grpc_aio_initialized global _grpc_aio_loop + global _event_loop_thread_ident if _grpc_aio_initialized: return else: _grpc_aio_initialized = True + _event_loop_thread_ident = threading.current_thread().ident # Anchors the event loop that the gRPC library going to use. _grpc_aio_loop = asyncio.get_event_loop() # Activates asyncio IO manager - install_asyncio_iomgr() + # install_asyncio_iomgr() # TODO(https://github.com/grpc/grpc/issues/22244) we need a the # grpc_shutdown_blocking() counterpart for this call. Otherwise, the gRPC @@ -44,11 +47,11 @@ def init_grpc_aio(): # Timers are triggered by the Asyncio loop. We disable # the background thread that is being used by the native # gRPC iomgr. - grpc_timer_manager_set_threading(False) + # grpc_timer_manager_set_threading(False) # gRPC callbaks are executed within the same thread used by the Asyncio # event loop, as it is being done by the other Asyncio callbacks. - Executor.SetThreadingAll(False) + # Executor.SetThreadingAll(False) _grpc_aio_initialized = False @@ -56,3 +59,19 @@ def init_grpc_aio(): def grpc_aio_loop(): """Returns the one-and-only gRPC Aio event loop.""" return _grpc_aio_loop + + +cdef grpc_schedule_coroutine(object coro): + """Thread-safely schedules coroutine to gRPC Aio event loop. + + If invoked within the same thread as the event loop, return an + Asyncio.Task. Otherwise, return a concurrent.futures.Future (the sync + Future). For non-asyncio threads, sync Future objects are probably easier + to handle (without worrying other thread-safety stuff). + """ + assert _event_loop_thread_ident != threading.current_thread().ident + return asyncio.run_coroutine_threadsafe(coro, _grpc_aio_loop) + + +def grpc_call_soon_threadsafe(object func, *args): + return _grpc_aio_loop.call_soon_threadsafe(func, *args) diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/iomgr/socket.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/iomgr/socket.pyx.pxi index 65ee6e24e59..11b3653e0bf 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/iomgr/socket.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/iomgr/socket.pyx.pxi @@ -159,6 +159,7 @@ cdef class _AsyncioSocket: return self._reader and not self._reader._transport.is_closing() cdef void close(self): + _LOGGER.debug('closed!') if self.is_connected(): self._writer.close() if self._server: @@ -196,7 +197,9 @@ cdef class _AsyncioSocket: self._new_connection_callback, sock=self._py_socket, ) + _LOGGER.debug('start listen') + _LOGGER.debug('want to listen') grpc_aio_loop().create_task(create_asyncio_server()) cdef accept(self, diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/poller.pxd.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/poller.pxd.pxi new file mode 100644 index 00000000000..c66d24bd502 --- /dev/null +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/poller.pxd.pxi @@ -0,0 +1,11 @@ +cdef gpr_timespec _GPR_INF_FUTURE = gpr_inf_future(GPR_CLOCK_REALTIME) + +cdef class BackgroundCompletionQueue: + cdef grpc_completion_queue *_cq + cdef bint _shutdown + cdef object _shutdown_completed + cdef object _poller + cdef object _poller_running + + cdef _polling(self) + cdef grpc_completion_queue* c_ptr(self) diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/poller.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/poller.pyx.pxi new file mode 100644 index 00000000000..71d429139a4 --- /dev/null +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/poller.pyx.pxi @@ -0,0 +1,89 @@ +# Copyright 2020 The gRPC Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +cdef gpr_timespec _GPR_INF_FUTURE = gpr_inf_future(GPR_CLOCK_REALTIME) + + +def _handle_callback_wrapper(CallbackWrapper callback_wrapper, int success): + try: + CallbackWrapper.functor_run(callback_wrapper.c_functor(), success) + _LOGGER.debug('_handle_callback_wrapper Done') + except Exception as e: + _LOGGER.debug('_handle_callback_wrapper EXP') + _LOGGER.exception(e) + raise + + +cdef class BackgroundCompletionQueue: + + def __cinit__(self): + self._cq = grpc_completion_queue_create_for_next(NULL) + self._shutdown = False + self._shutdown_completed = asyncio.get_event_loop().create_future() + self._poller = None + self._poller_running = asyncio.get_event_loop().create_future() + # asyncio.get_event_loop().create_task(self._start_poller()) + self._poller = threading.Thread(target=self._polling_wrapper) + self._poller.daemon = True + self._poller.start() + + # async def _start_poller(self): + # if self._poller: + # raise UsageError('Poller can only be started once.') + + # self._poller = threading.Thread(target=self._polling_wrapper) + # self._poller.daemon = True + # self._poller.start() + # await self._poller_running + + cdef _polling(self): + cdef grpc_event event + cdef CallbackContext *context + cdef object waiter + grpc_call_soon_threadsafe(self._poller_running.set_result, None) + + while not self._shutdown: + _LOGGER.debug('BackgroundCompletionQueue polling') + with nogil: + event = grpc_completion_queue_next(self._cq, + _GPR_INF_FUTURE, + NULL) + _LOGGER.debug('BackgroundCompletionQueue polling 1') + + if event.type == GRPC_QUEUE_TIMEOUT: + _LOGGER.debug('BackgroundCompletionQueue timeout???') + raise NotImplementedError() + elif event.type == GRPC_QUEUE_SHUTDOWN: + _LOGGER.debug('BackgroundCompletionQueue shutdown!') + self._shutdown = True + grpc_call_soon_threadsafe(self._shutdown_completed.set_result, None) + else: + _LOGGER.debug('BackgroundCompletionQueue event! %d', event.success) + context = event.tag + grpc_call_soon_threadsafe( + _handle_callback_wrapper, + context.callback_wrapper, + event.success) + _LOGGER.debug('BackgroundCompletionQueue polling 2') + + def _polling_wrapper(self): + self._polling() + + async def shutdown(self): + grpc_completion_queue_shutdown(self._cq) + await self._shutdown_completed + grpc_completion_queue_destroy(self._cq) + + cdef grpc_completion_queue* c_ptr(self): + return self._cq diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pxd.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pxd.pxi index daf1ffaf72f..54d75d99890 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pxd.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pxd.pxi @@ -51,7 +51,8 @@ cdef enum AioServerStatus: cdef class AioServer: cdef Server _server - cdef CallbackCompletionQueue _cq + # cdef CallbackCompletionQueue _cq + cdef BackgroundCompletionQueue _cq cdef list _generic_handlers cdef AioServerStatus _status cdef object _loop # asyncio.EventLoop diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi index 3f08a06d183..5adb8a949fe 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi @@ -613,7 +613,8 @@ cdef class AioServer: # NOTE(lidiz) Core objects won't be deallocated automatically. # If AioServer.shutdown is not called, those objects will leak. self._server = Server(options) - self._cq = CallbackCompletionQueue() + # self._cq = CallbackCompletionQueue() + self._cq = BackgroundCompletionQueue() grpc_server_register_completion_queue( self._server.c_server, self._cq.c_ptr(), diff --git a/src/python/grpcio/grpc/_cython/cygrpc.pxd b/src/python/grpcio/grpc/_cython/cygrpc.pxd index 5fd77e03eae..6e7b1aa64b0 100644 --- a/src/python/grpcio/grpc/_cython/cygrpc.pxd +++ b/src/python/grpcio/grpc/_cython/cygrpc.pxd @@ -45,6 +45,7 @@ IF UNAME_SYSNAME != "Windows": include "_cygrpc/aio/iomgr/socket.pxd.pxi" include "_cygrpc/aio/iomgr/timer.pxd.pxi" include "_cygrpc/aio/iomgr/resolver.pxd.pxi" +include "_cygrpc/aio/poller.pxd.pxi" include "_cygrpc/aio/rpc_status.pxd.pxi" include "_cygrpc/aio/grpc_aio.pxd.pxi" include "_cygrpc/aio/callback_common.pxd.pxi" diff --git a/src/python/grpcio/grpc/_cython/cygrpc.pyx b/src/python/grpcio/grpc/_cython/cygrpc.pyx index 2e6401b01d1..0c6ab7e590f 100644 --- a/src/python/grpcio/grpc/_cython/cygrpc.pyx +++ b/src/python/grpcio/grpc/_cython/cygrpc.pyx @@ -72,6 +72,7 @@ include "_cygrpc/aio/iomgr/resolver.pyx.pxi" include "_cygrpc/aio/common.pyx.pxi" include "_cygrpc/aio/rpc_status.pyx.pxi" include "_cygrpc/aio/callback_common.pyx.pxi" +include "_cygrpc/aio/poller.pyx.pxi" include "_cygrpc/aio/grpc_aio.pyx.pxi" include "_cygrpc/aio/call.pyx.pxi" include "_cygrpc/aio/channel.pyx.pxi" diff --git a/src/python/grpcio_tests/tests_aio/unit/call_test.py b/src/python/grpcio_tests/tests_aio/unit/call_test.py index 74bbc04be2f..70eb32f7533 100644 --- a/src/python/grpcio_tests/tests_aio/unit/call_test.py +++ b/src/python/grpcio_tests/tests_aio/unit/call_test.py @@ -47,338 +47,338 @@ class _MulticallableTestMixin(): await self._server.stop(None) -class TestUnaryUnaryCall(_MulticallableTestMixin, AioTestBase): +# class TestUnaryUnaryCall(_MulticallableTestMixin, AioTestBase): - async def test_call_to_string(self): - call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) +# async def test_call_to_string(self): +# call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) - self.assertTrue(str(call) is not None) - self.assertTrue(repr(call) is not None) +# self.assertTrue(str(call) is not None) +# self.assertTrue(repr(call) is not None) - response = await call +# response = await call - self.assertTrue(str(call) is not None) - self.assertTrue(repr(call) is not None) +# self.assertTrue(str(call) is not None) +# self.assertTrue(repr(call) is not None) - async def test_call_ok(self): - call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) +# async def test_call_ok(self): +# call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) - self.assertFalse(call.done()) +# self.assertFalse(call.done()) - response = await call +# response = await call - self.assertTrue(call.done()) - self.assertIsInstance(response, messages_pb2.SimpleResponse) - self.assertEqual(await call.code(), grpc.StatusCode.OK) +# self.assertTrue(call.done()) +# self.assertIsInstance(response, messages_pb2.SimpleResponse) +# self.assertEqual(await call.code(), grpc.StatusCode.OK) - # Response is cached at call object level, reentrance - # returns again the same response - response_retry = await call - self.assertIs(response, response_retry) +# # Response is cached at call object level, reentrance +# # returns again the same response +# response_retry = await call +# self.assertIs(response, response_retry) - async def test_call_rpc_error(self): - async with aio.insecure_channel(_UNREACHABLE_TARGET) as channel: - stub = test_pb2_grpc.TestServiceStub(channel) +# async def test_call_rpc_error(self): +# async with aio.insecure_channel(_UNREACHABLE_TARGET) as channel: +# stub = test_pb2_grpc.TestServiceStub(channel) - call = stub.UnaryCall(messages_pb2.SimpleRequest()) +# call = stub.UnaryCall(messages_pb2.SimpleRequest()) - with self.assertRaises(aio.AioRpcError) as exception_context: - await call +# with self.assertRaises(aio.AioRpcError) as exception_context: +# await call - self.assertEqual(grpc.StatusCode.UNAVAILABLE, - exception_context.exception.code()) +# self.assertEqual(grpc.StatusCode.UNAVAILABLE, +# exception_context.exception.code()) - self.assertTrue(call.done()) - self.assertEqual(grpc.StatusCode.UNAVAILABLE, await call.code()) +# self.assertTrue(call.done()) +# self.assertEqual(grpc.StatusCode.UNAVAILABLE, await call.code()) - async def test_call_code_awaitable(self): - call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) - self.assertEqual(await call.code(), grpc.StatusCode.OK) +# async def test_call_code_awaitable(self): +# call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) +# self.assertEqual(await call.code(), grpc.StatusCode.OK) - async def test_call_details_awaitable(self): - call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) - self.assertEqual('', await call.details()) +# async def test_call_details_awaitable(self): +# call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) +# self.assertEqual('', await call.details()) - async def test_call_initial_metadata_awaitable(self): - call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) - self.assertEqual((), await call.initial_metadata()) +# async def test_call_initial_metadata_awaitable(self): +# call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) +# self.assertEqual((), await call.initial_metadata()) - async def test_call_trailing_metadata_awaitable(self): - call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) - self.assertEqual((), await call.trailing_metadata()) +# async def test_call_trailing_metadata_awaitable(self): +# call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) +# self.assertEqual((), await call.trailing_metadata()) - async def test_call_initial_metadata_cancelable(self): - coro_started = asyncio.Event() - call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) +# async def test_call_initial_metadata_cancelable(self): +# coro_started = asyncio.Event() +# call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) - async def coro(): - coro_started.set() - await call.initial_metadata() +# async def coro(): +# coro_started.set() +# await call.initial_metadata() - task = self.loop.create_task(coro()) - await coro_started.wait() - task.cancel() +# task = self.loop.create_task(coro()) +# await coro_started.wait() +# task.cancel() - # Test that initial metadata can still be asked thought - # a cancellation happened with the previous task - self.assertEqual((), await call.initial_metadata()) +# # Test that initial metadata can still be asked thought +# # a cancellation happened with the previous task +# self.assertEqual((), await call.initial_metadata()) - async def test_call_initial_metadata_multiple_waiters(self): - call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) +# async def test_call_initial_metadata_multiple_waiters(self): +# call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) - async def coro(): - return await call.initial_metadata() +# async def coro(): +# return await call.initial_metadata() - task1 = self.loop.create_task(coro()) - task2 = self.loop.create_task(coro()) +# task1 = self.loop.create_task(coro()) +# task2 = self.loop.create_task(coro()) - await call +# await call - self.assertEqual([(), ()], await asyncio.gather(*[task1, task2])) +# self.assertEqual([(), ()], await asyncio.gather(*[task1, task2])) - async def test_call_code_cancelable(self): - coro_started = asyncio.Event() - call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) +# async def test_call_code_cancelable(self): +# coro_started = asyncio.Event() +# call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) - async def coro(): - coro_started.set() - await call.code() +# async def coro(): +# coro_started.set() +# await call.code() - task = self.loop.create_task(coro()) - await coro_started.wait() - task.cancel() +# task = self.loop.create_task(coro()) +# await coro_started.wait() +# task.cancel() - # Test that code can still be asked thought - # a cancellation happened with the previous task - self.assertEqual(grpc.StatusCode.OK, await call.code()) +# # Test that code can still be asked thought +# # a cancellation happened with the previous task +# self.assertEqual(grpc.StatusCode.OK, await call.code()) - async def test_call_code_multiple_waiters(self): - call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) +# async def test_call_code_multiple_waiters(self): +# call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) - async def coro(): - return await call.code() +# async def coro(): +# return await call.code() - task1 = self.loop.create_task(coro()) - task2 = self.loop.create_task(coro()) +# task1 = self.loop.create_task(coro()) +# task2 = self.loop.create_task(coro()) - await call +# await call - self.assertEqual([grpc.StatusCode.OK, grpc.StatusCode.OK], await - asyncio.gather(task1, task2)) +# self.assertEqual([grpc.StatusCode.OK, grpc.StatusCode.OK], await +# asyncio.gather(task1, task2)) - async def test_cancel_unary_unary(self): - call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) +# async def test_cancel_unary_unary(self): +# call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) - self.assertFalse(call.cancelled()) +# self.assertFalse(call.cancelled()) - self.assertTrue(call.cancel()) - self.assertFalse(call.cancel()) +# self.assertTrue(call.cancel()) +# self.assertFalse(call.cancel()) - with self.assertRaises(asyncio.CancelledError): - await call +# with self.assertRaises(asyncio.CancelledError): +# await call - # The info in the RpcError should match the info in Call object. - self.assertTrue(call.cancelled()) - self.assertEqual(await call.code(), grpc.StatusCode.CANCELLED) - self.assertEqual(await call.details(), - 'Locally cancelled by application!') +# # The info in the RpcError should match the info in Call object. +# self.assertTrue(call.cancelled()) +# self.assertEqual(await call.code(), grpc.StatusCode.CANCELLED) +# self.assertEqual(await call.details(), +# 'Locally cancelled by application!') - async def test_cancel_unary_unary_in_task(self): - coro_started = asyncio.Event() - call = self._stub.EmptyCall(messages_pb2.SimpleRequest()) +# async def test_cancel_unary_unary_in_task(self): +# coro_started = asyncio.Event() +# call = self._stub.EmptyCall(messages_pb2.SimpleRequest()) - async def another_coro(): - coro_started.set() - await call +# async def another_coro(): +# coro_started.set() +# await call - task = self.loop.create_task(another_coro()) - await coro_started.wait() +# task = self.loop.create_task(another_coro()) +# await coro_started.wait() - self.assertFalse(task.done()) - task.cancel() +# self.assertFalse(task.done()) +# task.cancel() - self.assertEqual(grpc.StatusCode.CANCELLED, await call.code()) +# self.assertEqual(grpc.StatusCode.CANCELLED, await call.code()) - with self.assertRaises(asyncio.CancelledError): - await task +# with self.assertRaises(asyncio.CancelledError): +# await task class TestUnaryStreamCall(_MulticallableTestMixin, AioTestBase): - async def test_cancel_unary_stream(self): - # Prepares the request - request = messages_pb2.StreamingOutputCallRequest() - for _ in range(_NUM_STREAM_RESPONSES): - request.response_parameters.append( - messages_pb2.ResponseParameters( - size=_RESPONSE_PAYLOAD_SIZE, - interval_us=_RESPONSE_INTERVAL_US, - )) - - # Invokes the actual RPC - call = self._stub.StreamingOutputCall(request) - self.assertFalse(call.cancelled()) - - response = await call.read() - self.assertIs(type(response), messages_pb2.StreamingOutputCallResponse) - self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) - - self.assertTrue(call.cancel()) - self.assertEqual(grpc.StatusCode.CANCELLED, await call.code()) - self.assertEqual(_LOCAL_CANCEL_DETAILS_EXPECTATION, await - call.details()) - self.assertFalse(call.cancel()) - - with self.assertRaises(asyncio.CancelledError): - await call.read() - self.assertTrue(call.cancelled()) - - async def test_multiple_cancel_unary_stream(self): - # Prepares the request - request = messages_pb2.StreamingOutputCallRequest() - for _ in range(_NUM_STREAM_RESPONSES): - request.response_parameters.append( - messages_pb2.ResponseParameters( - size=_RESPONSE_PAYLOAD_SIZE, - interval_us=_RESPONSE_INTERVAL_US, - )) - - # Invokes the actual RPC - call = self._stub.StreamingOutputCall(request) - self.assertFalse(call.cancelled()) - - response = await call.read() - self.assertIs(type(response), messages_pb2.StreamingOutputCallResponse) - self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) - - self.assertTrue(call.cancel()) - self.assertFalse(call.cancel()) - self.assertFalse(call.cancel()) - self.assertFalse(call.cancel()) - - with self.assertRaises(asyncio.CancelledError): - await call.read() - - async def test_early_cancel_unary_stream(self): - """Test cancellation before receiving messages.""" - # Prepares the request - request = messages_pb2.StreamingOutputCallRequest() - for _ in range(_NUM_STREAM_RESPONSES): - request.response_parameters.append( - messages_pb2.ResponseParameters( - size=_RESPONSE_PAYLOAD_SIZE, - interval_us=_RESPONSE_INTERVAL_US, - )) - - # Invokes the actual RPC - call = self._stub.StreamingOutputCall(request) - - self.assertFalse(call.cancelled()) - self.assertTrue(call.cancel()) - self.assertFalse(call.cancel()) - - with self.assertRaises(asyncio.CancelledError): - await call.read() - - self.assertTrue(call.cancelled()) - - self.assertEqual(grpc.StatusCode.CANCELLED, await call.code()) - self.assertEqual(_LOCAL_CANCEL_DETAILS_EXPECTATION, await - call.details()) - - async def test_late_cancel_unary_stream(self): - """Test cancellation after received all messages.""" - # Prepares the request - request = messages_pb2.StreamingOutputCallRequest() - for _ in range(_NUM_STREAM_RESPONSES): - request.response_parameters.append( - messages_pb2.ResponseParameters(size=_RESPONSE_PAYLOAD_SIZE,)) - - # Invokes the actual RPC - call = self._stub.StreamingOutputCall(request) - - for _ in range(_NUM_STREAM_RESPONSES): - response = await call.read() - self.assertIs(type(response), - messages_pb2.StreamingOutputCallResponse) - self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) - - # After all messages received, it is possible that the final state - # is received or on its way. It's basically a data race, so our - # expectation here is do not crash :) - call.cancel() - self.assertIn(await call.code(), - [grpc.StatusCode.OK, grpc.StatusCode.CANCELLED]) - - async def test_too_many_reads_unary_stream(self): - """Test calling read after received all messages fails.""" - # Prepares the request - request = messages_pb2.StreamingOutputCallRequest() - for _ in range(_NUM_STREAM_RESPONSES): - request.response_parameters.append( - messages_pb2.ResponseParameters(size=_RESPONSE_PAYLOAD_SIZE,)) - - # Invokes the actual RPC - call = self._stub.StreamingOutputCall(request) - - for _ in range(_NUM_STREAM_RESPONSES): - response = await call.read() - self.assertIs(type(response), - messages_pb2.StreamingOutputCallResponse) - self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) - self.assertIs(await call.read(), aio.EOF) - - # After the RPC is finished, further reads will lead to exception. - self.assertEqual(await call.code(), grpc.StatusCode.OK) - self.assertIs(await call.read(), aio.EOF) - - async def test_unary_stream_async_generator(self): - """Sunny day test case for unary_stream.""" - # Prepares the request - request = messages_pb2.StreamingOutputCallRequest() - for _ in range(_NUM_STREAM_RESPONSES): - request.response_parameters.append( - messages_pb2.ResponseParameters(size=_RESPONSE_PAYLOAD_SIZE,)) - - # Invokes the actual RPC - call = self._stub.StreamingOutputCall(request) - self.assertFalse(call.cancelled()) - - async for response in call: - self.assertIs(type(response), - messages_pb2.StreamingOutputCallResponse) - self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) - - self.assertEqual(await call.code(), grpc.StatusCode.OK) - - async def test_cancel_unary_stream_in_task_using_read(self): - coro_started = asyncio.Event() - - # Configs the server method to block forever - request = messages_pb2.StreamingOutputCallRequest() - request.response_parameters.append( - messages_pb2.ResponseParameters( - size=_RESPONSE_PAYLOAD_SIZE, - interval_us=_INFINITE_INTERVAL_US, - )) - - # Invokes the actual RPC - call = self._stub.StreamingOutputCall(request) - - async def another_coro(): - coro_started.set() - await call.read() - - task = self.loop.create_task(another_coro()) - await coro_started.wait() - - self.assertFalse(task.done()) - task.cancel() - - self.assertEqual(grpc.StatusCode.CANCELLED, await call.code()) - - with self.assertRaises(asyncio.CancelledError): - await task + # async def test_cancel_unary_stream(self): + # # Prepares the request + # request = messages_pb2.StreamingOutputCallRequest() + # for _ in range(_NUM_STREAM_RESPONSES): + # request.response_parameters.append( + # messages_pb2.ResponseParameters( + # size=_RESPONSE_PAYLOAD_SIZE, + # interval_us=_RESPONSE_INTERVAL_US, + # )) + + # # Invokes the actual RPC + # call = self._stub.StreamingOutputCall(request) + # self.assertFalse(call.cancelled()) + + # response = await call.read() + # self.assertIs(type(response), messages_pb2.StreamingOutputCallResponse) + # self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) + + # self.assertTrue(call.cancel()) + # self.assertEqual(grpc.StatusCode.CANCELLED, await call.code()) + # self.assertEqual(_LOCAL_CANCEL_DETAILS_EXPECTATION, await + # call.details()) + # self.assertFalse(call.cancel()) + + # with self.assertRaises(asyncio.CancelledError): + # await call.read() + # self.assertTrue(call.cancelled()) + + # async def test_multiple_cancel_unary_stream(self): + # # Prepares the request + # request = messages_pb2.StreamingOutputCallRequest() + # for _ in range(_NUM_STREAM_RESPONSES): + # request.response_parameters.append( + # messages_pb2.ResponseParameters( + # size=_RESPONSE_PAYLOAD_SIZE, + # interval_us=_RESPONSE_INTERVAL_US, + # )) + + # # Invokes the actual RPC + # call = self._stub.StreamingOutputCall(request) + # self.assertFalse(call.cancelled()) + + # response = await call.read() + # self.assertIs(type(response), messages_pb2.StreamingOutputCallResponse) + # self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) + + # self.assertTrue(call.cancel()) + # self.assertFalse(call.cancel()) + # self.assertFalse(call.cancel()) + # self.assertFalse(call.cancel()) + + # with self.assertRaises(asyncio.CancelledError): + # await call.read() + + # async def test_early_cancel_unary_stream(self): + # """Test cancellation before receiving messages.""" + # # Prepares the request + # request = messages_pb2.StreamingOutputCallRequest() + # for _ in range(_NUM_STREAM_RESPONSES): + # request.response_parameters.append( + # messages_pb2.ResponseParameters( + # size=_RESPONSE_PAYLOAD_SIZE, + # interval_us=_RESPONSE_INTERVAL_US, + # )) + + # # Invokes the actual RPC + # call = self._stub.StreamingOutputCall(request) + + # self.assertFalse(call.cancelled()) + # self.assertTrue(call.cancel()) + # self.assertFalse(call.cancel()) + + # with self.assertRaises(asyncio.CancelledError): + # await call.read() + + # self.assertTrue(call.cancelled()) + + # self.assertEqual(grpc.StatusCode.CANCELLED, await call.code()) + # self.assertEqual(_LOCAL_CANCEL_DETAILS_EXPECTATION, await + # call.details()) + + # async def test_late_cancel_unary_stream(self): + # """Test cancellation after received all messages.""" + # # Prepares the request + # request = messages_pb2.StreamingOutputCallRequest() + # for _ in range(_NUM_STREAM_RESPONSES): + # request.response_parameters.append( + # messages_pb2.ResponseParameters(size=_RESPONSE_PAYLOAD_SIZE,)) + + # # Invokes the actual RPC + # call = self._stub.StreamingOutputCall(request) + + # for _ in range(_NUM_STREAM_RESPONSES): + # response = await call.read() + # self.assertIs(type(response), + # messages_pb2.StreamingOutputCallResponse) + # self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) + + # # After all messages received, it is possible that the final state + # # is received or on its way. It's basically a data race, so our + # # expectation here is do not crash :) + # call.cancel() + # self.assertIn(await call.code(), + # [grpc.StatusCode.OK, grpc.StatusCode.CANCELLED]) + + # async def test_too_many_reads_unary_stream(self): + # """Test calling read after received all messages fails.""" + # # Prepares the request + # request = messages_pb2.StreamingOutputCallRequest() + # for _ in range(_NUM_STREAM_RESPONSES): + # request.response_parameters.append( + # messages_pb2.ResponseParameters(size=_RESPONSE_PAYLOAD_SIZE,)) + + # # Invokes the actual RPC + # call = self._stub.StreamingOutputCall(request) + + # for _ in range(_NUM_STREAM_RESPONSES): + # response = await call.read() + # self.assertIs(type(response), + # messages_pb2.StreamingOutputCallResponse) + # self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) + # self.assertIs(await call.read(), aio.EOF) + + # # After the RPC is finished, further reads will lead to exception. + # self.assertEqual(await call.code(), grpc.StatusCode.OK) + # self.assertIs(await call.read(), aio.EOF) + + # async def test_unary_stream_async_generator(self): + # """Sunny day test case for unary_stream.""" + # # Prepares the request + # request = messages_pb2.StreamingOutputCallRequest() + # for _ in range(_NUM_STREAM_RESPONSES): + # request.response_parameters.append( + # messages_pb2.ResponseParameters(size=_RESPONSE_PAYLOAD_SIZE,)) + + # # Invokes the actual RPC + # call = self._stub.StreamingOutputCall(request) + # self.assertFalse(call.cancelled()) + + # async for response in call: + # self.assertIs(type(response), + # messages_pb2.StreamingOutputCallResponse) + # self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) + + # self.assertEqual(await call.code(), grpc.StatusCode.OK) + + # async def test_cancel_unary_stream_in_task_using_read(self): + # coro_started = asyncio.Event() + + # # Configs the server method to block forever + # request = messages_pb2.StreamingOutputCallRequest() + # request.response_parameters.append( + # messages_pb2.ResponseParameters( + # size=_RESPONSE_PAYLOAD_SIZE, + # interval_us=_INFINITE_INTERVAL_US, + # )) + + # # Invokes the actual RPC + # call = self._stub.StreamingOutputCall(request) + + # async def another_coro(): + # coro_started.set() + # await call.read() + + # task = self.loop.create_task(another_coro()) + # await coro_started.wait() + + # self.assertFalse(task.done()) + # task.cancel() + + # self.assertEqual(grpc.StatusCode.CANCELLED, await call.code()) + + # with self.assertRaises(asyncio.CancelledError): + # await task async def test_cancel_unary_stream_in_task_using_async_for(self): coro_started = asyncio.Event() @@ -755,5 +755,5 @@ class TestStreamStreamCall(_MulticallableTestMixin, AioTestBase): if __name__ == '__main__': - logging.basicConfig() + logging.basicConfig(level=logging.DEBUG) unittest.main(verbosity=2) From 464d41f4b8d1a7346c186786022ca9aa6ec9333f Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Fri, 6 Mar 2020 14:08:56 -0800 Subject: [PATCH 089/758] Great. Everything seems working. --- .../grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi | 8 +- .../grpc/_cython/_cygrpc/aio/poller.pyx.pxi | 9 +- .../grpcio/grpc/experimental/aio/_server.py | 2 +- .../grpcio_tests/tests_aio/unit/call_test.py | 562 +++++++++--------- .../tests_aio/unit/server_test.py | 2 - 5 files changed, 288 insertions(+), 295 deletions(-) diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi index 95c6caf2501..16fc967b82e 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi @@ -61,7 +61,7 @@ def grpc_aio_loop(): return _grpc_aio_loop -cdef grpc_schedule_coroutine(object coro): +def grpc_schedule_coroutine(object coro): """Thread-safely schedules coroutine to gRPC Aio event loop. If invoked within the same thread as the event loop, return an @@ -69,8 +69,10 @@ cdef grpc_schedule_coroutine(object coro): Future). For non-asyncio threads, sync Future objects are probably easier to handle (without worrying other thread-safety stuff). """ - assert _event_loop_thread_ident != threading.current_thread().ident - return asyncio.run_coroutine_threadsafe(coro, _grpc_aio_loop) + if _event_loop_thread_ident != threading.current_thread().ident: + return asyncio.run_coroutine_threadsafe(coro, _grpc_aio_loop) + else: + return _grpc_aio_loop.create_task(coro) def grpc_call_soon_threadsafe(object func, *args): diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/poller.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/poller.pyx.pxi index 71d429139a4..ce6df5c90d1 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/poller.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/poller.pyx.pxi @@ -16,13 +16,7 @@ cdef gpr_timespec _GPR_INF_FUTURE = gpr_inf_future(GPR_CLOCK_REALTIME) def _handle_callback_wrapper(CallbackWrapper callback_wrapper, int success): - try: - CallbackWrapper.functor_run(callback_wrapper.c_functor(), success) - _LOGGER.debug('_handle_callback_wrapper Done') - except Exception as e: - _LOGGER.debug('_handle_callback_wrapper EXP') - _LOGGER.exception(e) - raise + CallbackWrapper.functor_run(callback_wrapper.c_functor(), success) cdef class BackgroundCompletionQueue: @@ -33,7 +27,6 @@ cdef class BackgroundCompletionQueue: self._shutdown_completed = asyncio.get_event_loop().create_future() self._poller = None self._poller_running = asyncio.get_event_loop().create_future() - # asyncio.get_event_loop().create_task(self._start_poller()) self._poller = threading.Thread(target=self._polling_wrapper) self._poller.daemon = True self._poller.start() diff --git a/src/python/grpcio/grpc/experimental/aio/_server.py b/src/python/grpcio/grpc/experimental/aio/_server.py index 18e2bf65553..ec0af1d51f3 100644 --- a/src/python/grpcio/grpc/experimental/aio/_server.py +++ b/src/python/grpcio/grpc/experimental/aio/_server.py @@ -162,7 +162,7 @@ class Server(_base_server.Server): be safe to slightly extend the underlying Cython object's life span. """ if hasattr(self, '_server'): - self._loop.create_task(self._server.shutdown(None)) + cygrpc.grpc_schedule_coroutine(self._server.shutdown(None)) def server(migration_thread_pool: Optional[Executor] = None, diff --git a/src/python/grpcio_tests/tests_aio/unit/call_test.py b/src/python/grpcio_tests/tests_aio/unit/call_test.py index 70eb32f7533..e47c00a62ab 100644 --- a/src/python/grpcio_tests/tests_aio/unit/call_test.py +++ b/src/python/grpcio_tests/tests_aio/unit/call_test.py @@ -47,338 +47,338 @@ class _MulticallableTestMixin(): await self._server.stop(None) -# class TestUnaryUnaryCall(_MulticallableTestMixin, AioTestBase): +class TestUnaryUnaryCall(_MulticallableTestMixin, AioTestBase): -# async def test_call_to_string(self): -# call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) + async def test_call_to_string(self): + call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) -# self.assertTrue(str(call) is not None) -# self.assertTrue(repr(call) is not None) + self.assertTrue(str(call) is not None) + self.assertTrue(repr(call) is not None) -# response = await call + response = await call -# self.assertTrue(str(call) is not None) -# self.assertTrue(repr(call) is not None) + self.assertTrue(str(call) is not None) + self.assertTrue(repr(call) is not None) -# async def test_call_ok(self): -# call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) + async def test_call_ok(self): + call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) -# self.assertFalse(call.done()) + self.assertFalse(call.done()) -# response = await call + response = await call -# self.assertTrue(call.done()) -# self.assertIsInstance(response, messages_pb2.SimpleResponse) -# self.assertEqual(await call.code(), grpc.StatusCode.OK) + self.assertTrue(call.done()) + self.assertIsInstance(response, messages_pb2.SimpleResponse) + self.assertEqual(await call.code(), grpc.StatusCode.OK) -# # Response is cached at call object level, reentrance -# # returns again the same response -# response_retry = await call -# self.assertIs(response, response_retry) + # Response is cached at call object level, reentrance + # returns again the same response + response_retry = await call + self.assertIs(response, response_retry) -# async def test_call_rpc_error(self): -# async with aio.insecure_channel(_UNREACHABLE_TARGET) as channel: -# stub = test_pb2_grpc.TestServiceStub(channel) + async def test_call_rpc_error(self): + async with aio.insecure_channel(_UNREACHABLE_TARGET) as channel: + stub = test_pb2_grpc.TestServiceStub(channel) -# call = stub.UnaryCall(messages_pb2.SimpleRequest()) + call = stub.UnaryCall(messages_pb2.SimpleRequest()) -# with self.assertRaises(aio.AioRpcError) as exception_context: -# await call + with self.assertRaises(aio.AioRpcError) as exception_context: + await call -# self.assertEqual(grpc.StatusCode.UNAVAILABLE, -# exception_context.exception.code()) + self.assertEqual(grpc.StatusCode.UNAVAILABLE, + exception_context.exception.code()) -# self.assertTrue(call.done()) -# self.assertEqual(grpc.StatusCode.UNAVAILABLE, await call.code()) + self.assertTrue(call.done()) + self.assertEqual(grpc.StatusCode.UNAVAILABLE, await call.code()) -# async def test_call_code_awaitable(self): -# call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) -# self.assertEqual(await call.code(), grpc.StatusCode.OK) + async def test_call_code_awaitable(self): + call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) + self.assertEqual(await call.code(), grpc.StatusCode.OK) -# async def test_call_details_awaitable(self): -# call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) -# self.assertEqual('', await call.details()) + async def test_call_details_awaitable(self): + call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) + self.assertEqual('', await call.details()) -# async def test_call_initial_metadata_awaitable(self): -# call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) -# self.assertEqual((), await call.initial_metadata()) + async def test_call_initial_metadata_awaitable(self): + call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) + self.assertEqual((), await call.initial_metadata()) -# async def test_call_trailing_metadata_awaitable(self): -# call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) -# self.assertEqual((), await call.trailing_metadata()) + async def test_call_trailing_metadata_awaitable(self): + call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) + self.assertEqual((), await call.trailing_metadata()) -# async def test_call_initial_metadata_cancelable(self): -# coro_started = asyncio.Event() -# call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) + async def test_call_initial_metadata_cancelable(self): + coro_started = asyncio.Event() + call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) -# async def coro(): -# coro_started.set() -# await call.initial_metadata() + async def coro(): + coro_started.set() + await call.initial_metadata() -# task = self.loop.create_task(coro()) -# await coro_started.wait() -# task.cancel() + task = self.loop.create_task(coro()) + await coro_started.wait() + task.cancel() -# # Test that initial metadata can still be asked thought -# # a cancellation happened with the previous task -# self.assertEqual((), await call.initial_metadata()) + # Test that initial metadata can still be asked thought + # a cancellation happened with the previous task + self.assertEqual((), await call.initial_metadata()) -# async def test_call_initial_metadata_multiple_waiters(self): -# call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) + async def test_call_initial_metadata_multiple_waiters(self): + call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) -# async def coro(): -# return await call.initial_metadata() + async def coro(): + return await call.initial_metadata() -# task1 = self.loop.create_task(coro()) -# task2 = self.loop.create_task(coro()) + task1 = self.loop.create_task(coro()) + task2 = self.loop.create_task(coro()) -# await call + await call -# self.assertEqual([(), ()], await asyncio.gather(*[task1, task2])) + self.assertEqual([(), ()], await asyncio.gather(*[task1, task2])) -# async def test_call_code_cancelable(self): -# coro_started = asyncio.Event() -# call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) + async def test_call_code_cancelable(self): + coro_started = asyncio.Event() + call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) -# async def coro(): -# coro_started.set() -# await call.code() + async def coro(): + coro_started.set() + await call.code() -# task = self.loop.create_task(coro()) -# await coro_started.wait() -# task.cancel() + task = self.loop.create_task(coro()) + await coro_started.wait() + task.cancel() -# # Test that code can still be asked thought -# # a cancellation happened with the previous task -# self.assertEqual(grpc.StatusCode.OK, await call.code()) + # Test that code can still be asked thought + # a cancellation happened with the previous task + self.assertEqual(grpc.StatusCode.OK, await call.code()) -# async def test_call_code_multiple_waiters(self): -# call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) + async def test_call_code_multiple_waiters(self): + call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) -# async def coro(): -# return await call.code() + async def coro(): + return await call.code() -# task1 = self.loop.create_task(coro()) -# task2 = self.loop.create_task(coro()) + task1 = self.loop.create_task(coro()) + task2 = self.loop.create_task(coro()) -# await call + await call -# self.assertEqual([grpc.StatusCode.OK, grpc.StatusCode.OK], await -# asyncio.gather(task1, task2)) + self.assertEqual([grpc.StatusCode.OK, grpc.StatusCode.OK], await + asyncio.gather(task1, task2)) -# async def test_cancel_unary_unary(self): -# call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) + async def test_cancel_unary_unary(self): + call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) -# self.assertFalse(call.cancelled()) + self.assertFalse(call.cancelled()) -# self.assertTrue(call.cancel()) -# self.assertFalse(call.cancel()) + self.assertTrue(call.cancel()) + self.assertFalse(call.cancel()) -# with self.assertRaises(asyncio.CancelledError): -# await call + with self.assertRaises(asyncio.CancelledError): + await call -# # The info in the RpcError should match the info in Call object. -# self.assertTrue(call.cancelled()) -# self.assertEqual(await call.code(), grpc.StatusCode.CANCELLED) -# self.assertEqual(await call.details(), -# 'Locally cancelled by application!') + # The info in the RpcError should match the info in Call object. + self.assertTrue(call.cancelled()) + self.assertEqual(await call.code(), grpc.StatusCode.CANCELLED) + self.assertEqual(await call.details(), + 'Locally cancelled by application!') -# async def test_cancel_unary_unary_in_task(self): -# coro_started = asyncio.Event() -# call = self._stub.EmptyCall(messages_pb2.SimpleRequest()) + async def test_cancel_unary_unary_in_task(self): + coro_started = asyncio.Event() + call = self._stub.EmptyCall(messages_pb2.SimpleRequest()) -# async def another_coro(): -# coro_started.set() -# await call + async def another_coro(): + coro_started.set() + await call -# task = self.loop.create_task(another_coro()) -# await coro_started.wait() + task = self.loop.create_task(another_coro()) + await coro_started.wait() -# self.assertFalse(task.done()) -# task.cancel() + self.assertFalse(task.done()) + task.cancel() -# self.assertEqual(grpc.StatusCode.CANCELLED, await call.code()) + self.assertEqual(grpc.StatusCode.CANCELLED, await call.code()) -# with self.assertRaises(asyncio.CancelledError): -# await task + with self.assertRaises(asyncio.CancelledError): + await task class TestUnaryStreamCall(_MulticallableTestMixin, AioTestBase): - # async def test_cancel_unary_stream(self): - # # Prepares the request - # request = messages_pb2.StreamingOutputCallRequest() - # for _ in range(_NUM_STREAM_RESPONSES): - # request.response_parameters.append( - # messages_pb2.ResponseParameters( - # size=_RESPONSE_PAYLOAD_SIZE, - # interval_us=_RESPONSE_INTERVAL_US, - # )) - - # # Invokes the actual RPC - # call = self._stub.StreamingOutputCall(request) - # self.assertFalse(call.cancelled()) - - # response = await call.read() - # self.assertIs(type(response), messages_pb2.StreamingOutputCallResponse) - # self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) - - # self.assertTrue(call.cancel()) - # self.assertEqual(grpc.StatusCode.CANCELLED, await call.code()) - # self.assertEqual(_LOCAL_CANCEL_DETAILS_EXPECTATION, await - # call.details()) - # self.assertFalse(call.cancel()) - - # with self.assertRaises(asyncio.CancelledError): - # await call.read() - # self.assertTrue(call.cancelled()) - - # async def test_multiple_cancel_unary_stream(self): - # # Prepares the request - # request = messages_pb2.StreamingOutputCallRequest() - # for _ in range(_NUM_STREAM_RESPONSES): - # request.response_parameters.append( - # messages_pb2.ResponseParameters( - # size=_RESPONSE_PAYLOAD_SIZE, - # interval_us=_RESPONSE_INTERVAL_US, - # )) - - # # Invokes the actual RPC - # call = self._stub.StreamingOutputCall(request) - # self.assertFalse(call.cancelled()) - - # response = await call.read() - # self.assertIs(type(response), messages_pb2.StreamingOutputCallResponse) - # self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) - - # self.assertTrue(call.cancel()) - # self.assertFalse(call.cancel()) - # self.assertFalse(call.cancel()) - # self.assertFalse(call.cancel()) - - # with self.assertRaises(asyncio.CancelledError): - # await call.read() - - # async def test_early_cancel_unary_stream(self): - # """Test cancellation before receiving messages.""" - # # Prepares the request - # request = messages_pb2.StreamingOutputCallRequest() - # for _ in range(_NUM_STREAM_RESPONSES): - # request.response_parameters.append( - # messages_pb2.ResponseParameters( - # size=_RESPONSE_PAYLOAD_SIZE, - # interval_us=_RESPONSE_INTERVAL_US, - # )) - - # # Invokes the actual RPC - # call = self._stub.StreamingOutputCall(request) - - # self.assertFalse(call.cancelled()) - # self.assertTrue(call.cancel()) - # self.assertFalse(call.cancel()) - - # with self.assertRaises(asyncio.CancelledError): - # await call.read() - - # self.assertTrue(call.cancelled()) - - # self.assertEqual(grpc.StatusCode.CANCELLED, await call.code()) - # self.assertEqual(_LOCAL_CANCEL_DETAILS_EXPECTATION, await - # call.details()) - - # async def test_late_cancel_unary_stream(self): - # """Test cancellation after received all messages.""" - # # Prepares the request - # request = messages_pb2.StreamingOutputCallRequest() - # for _ in range(_NUM_STREAM_RESPONSES): - # request.response_parameters.append( - # messages_pb2.ResponseParameters(size=_RESPONSE_PAYLOAD_SIZE,)) - - # # Invokes the actual RPC - # call = self._stub.StreamingOutputCall(request) - - # for _ in range(_NUM_STREAM_RESPONSES): - # response = await call.read() - # self.assertIs(type(response), - # messages_pb2.StreamingOutputCallResponse) - # self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) - - # # After all messages received, it is possible that the final state - # # is received or on its way. It's basically a data race, so our - # # expectation here is do not crash :) - # call.cancel() - # self.assertIn(await call.code(), - # [grpc.StatusCode.OK, grpc.StatusCode.CANCELLED]) - - # async def test_too_many_reads_unary_stream(self): - # """Test calling read after received all messages fails.""" - # # Prepares the request - # request = messages_pb2.StreamingOutputCallRequest() - # for _ in range(_NUM_STREAM_RESPONSES): - # request.response_parameters.append( - # messages_pb2.ResponseParameters(size=_RESPONSE_PAYLOAD_SIZE,)) - - # # Invokes the actual RPC - # call = self._stub.StreamingOutputCall(request) - - # for _ in range(_NUM_STREAM_RESPONSES): - # response = await call.read() - # self.assertIs(type(response), - # messages_pb2.StreamingOutputCallResponse) - # self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) - # self.assertIs(await call.read(), aio.EOF) - - # # After the RPC is finished, further reads will lead to exception. - # self.assertEqual(await call.code(), grpc.StatusCode.OK) - # self.assertIs(await call.read(), aio.EOF) - - # async def test_unary_stream_async_generator(self): - # """Sunny day test case for unary_stream.""" - # # Prepares the request - # request = messages_pb2.StreamingOutputCallRequest() - # for _ in range(_NUM_STREAM_RESPONSES): - # request.response_parameters.append( - # messages_pb2.ResponseParameters(size=_RESPONSE_PAYLOAD_SIZE,)) - - # # Invokes the actual RPC - # call = self._stub.StreamingOutputCall(request) - # self.assertFalse(call.cancelled()) - - # async for response in call: - # self.assertIs(type(response), - # messages_pb2.StreamingOutputCallResponse) - # self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) - - # self.assertEqual(await call.code(), grpc.StatusCode.OK) - - # async def test_cancel_unary_stream_in_task_using_read(self): - # coro_started = asyncio.Event() - - # # Configs the server method to block forever - # request = messages_pb2.StreamingOutputCallRequest() - # request.response_parameters.append( - # messages_pb2.ResponseParameters( - # size=_RESPONSE_PAYLOAD_SIZE, - # interval_us=_INFINITE_INTERVAL_US, - # )) - - # # Invokes the actual RPC - # call = self._stub.StreamingOutputCall(request) - - # async def another_coro(): - # coro_started.set() - # await call.read() - - # task = self.loop.create_task(another_coro()) - # await coro_started.wait() - - # self.assertFalse(task.done()) - # task.cancel() - - # self.assertEqual(grpc.StatusCode.CANCELLED, await call.code()) - - # with self.assertRaises(asyncio.CancelledError): - # await task + async def test_cancel_unary_stream(self): + # Prepares the request + request = messages_pb2.StreamingOutputCallRequest() + for _ in range(_NUM_STREAM_RESPONSES): + request.response_parameters.append( + messages_pb2.ResponseParameters( + size=_RESPONSE_PAYLOAD_SIZE, + interval_us=_RESPONSE_INTERVAL_US, + )) + + # Invokes the actual RPC + call = self._stub.StreamingOutputCall(request) + self.assertFalse(call.cancelled()) + + response = await call.read() + self.assertIs(type(response), messages_pb2.StreamingOutputCallResponse) + self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) + + self.assertTrue(call.cancel()) + self.assertEqual(grpc.StatusCode.CANCELLED, await call.code()) + self.assertEqual(_LOCAL_CANCEL_DETAILS_EXPECTATION, await + call.details()) + self.assertFalse(call.cancel()) + + with self.assertRaises(asyncio.CancelledError): + await call.read() + self.assertTrue(call.cancelled()) + + async def test_multiple_cancel_unary_stream(self): + # Prepares the request + request = messages_pb2.StreamingOutputCallRequest() + for _ in range(_NUM_STREAM_RESPONSES): + request.response_parameters.append( + messages_pb2.ResponseParameters( + size=_RESPONSE_PAYLOAD_SIZE, + interval_us=_RESPONSE_INTERVAL_US, + )) + + # Invokes the actual RPC + call = self._stub.StreamingOutputCall(request) + self.assertFalse(call.cancelled()) + + response = await call.read() + self.assertIs(type(response), messages_pb2.StreamingOutputCallResponse) + self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) + + self.assertTrue(call.cancel()) + self.assertFalse(call.cancel()) + self.assertFalse(call.cancel()) + self.assertFalse(call.cancel()) + + with self.assertRaises(asyncio.CancelledError): + await call.read() + + async def test_early_cancel_unary_stream(self): + """Test cancellation before receiving messages.""" + # Prepares the request + request = messages_pb2.StreamingOutputCallRequest() + for _ in range(_NUM_STREAM_RESPONSES): + request.response_parameters.append( + messages_pb2.ResponseParameters( + size=_RESPONSE_PAYLOAD_SIZE, + interval_us=_RESPONSE_INTERVAL_US, + )) + + # Invokes the actual RPC + call = self._stub.StreamingOutputCall(request) + + self.assertFalse(call.cancelled()) + self.assertTrue(call.cancel()) + self.assertFalse(call.cancel()) + + with self.assertRaises(asyncio.CancelledError): + await call.read() + + self.assertTrue(call.cancelled()) + + self.assertEqual(grpc.StatusCode.CANCELLED, await call.code()) + self.assertEqual(_LOCAL_CANCEL_DETAILS_EXPECTATION, await + call.details()) + + async def test_late_cancel_unary_stream(self): + """Test cancellation after received all messages.""" + # Prepares the request + request = messages_pb2.StreamingOutputCallRequest() + for _ in range(_NUM_STREAM_RESPONSES): + request.response_parameters.append( + messages_pb2.ResponseParameters(size=_RESPONSE_PAYLOAD_SIZE,)) + + # Invokes the actual RPC + call = self._stub.StreamingOutputCall(request) + + for _ in range(_NUM_STREAM_RESPONSES): + response = await call.read() + self.assertIs(type(response), + messages_pb2.StreamingOutputCallResponse) + self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) + + # After all messages received, it is possible that the final state + # is received or on its way. It's basically a data race, so our + # expectation here is do not crash :) + call.cancel() + self.assertIn(await call.code(), + [grpc.StatusCode.OK, grpc.StatusCode.CANCELLED]) + + async def test_too_many_reads_unary_stream(self): + """Test calling read after received all messages fails.""" + # Prepares the request + request = messages_pb2.StreamingOutputCallRequest() + for _ in range(_NUM_STREAM_RESPONSES): + request.response_parameters.append( + messages_pb2.ResponseParameters(size=_RESPONSE_PAYLOAD_SIZE,)) + + # Invokes the actual RPC + call = self._stub.StreamingOutputCall(request) + + for _ in range(_NUM_STREAM_RESPONSES): + response = await call.read() + self.assertIs(type(response), + messages_pb2.StreamingOutputCallResponse) + self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) + self.assertIs(await call.read(), aio.EOF) + + # After the RPC is finished, further reads will lead to exception. + self.assertEqual(await call.code(), grpc.StatusCode.OK) + self.assertIs(await call.read(), aio.EOF) + + async def test_unary_stream_async_generator(self): + """Sunny day test case for unary_stream.""" + # Prepares the request + request = messages_pb2.StreamingOutputCallRequest() + for _ in range(_NUM_STREAM_RESPONSES): + request.response_parameters.append( + messages_pb2.ResponseParameters(size=_RESPONSE_PAYLOAD_SIZE,)) + + # Invokes the actual RPC + call = self._stub.StreamingOutputCall(request) + self.assertFalse(call.cancelled()) + + async for response in call: + self.assertIs(type(response), + messages_pb2.StreamingOutputCallResponse) + self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) + + self.assertEqual(await call.code(), grpc.StatusCode.OK) + + async def test_cancel_unary_stream_in_task_using_read(self): + coro_started = asyncio.Event() + + # Configs the server method to block forever + request = messages_pb2.StreamingOutputCallRequest() + request.response_parameters.append( + messages_pb2.ResponseParameters( + size=_RESPONSE_PAYLOAD_SIZE, + interval_us=_INFINITE_INTERVAL_US, + )) + + # Invokes the actual RPC + call = self._stub.StreamingOutputCall(request) + + async def another_coro(): + coro_started.set() + await call.read() + + task = self.loop.create_task(another_coro()) + await coro_started.wait() + + self.assertFalse(task.done()) + task.cancel() + + self.assertEqual(grpc.StatusCode.CANCELLED, await call.code()) + + with self.assertRaises(asyncio.CancelledError): + await task async def test_cancel_unary_stream_in_task_using_async_for(self): coro_started = asyncio.Event() diff --git a/src/python/grpcio_tests/tests_aio/unit/server_test.py b/src/python/grpcio_tests/tests_aio/unit/server_test.py index 70240fefee1..e2a2ebacf5b 100644 --- a/src/python/grpcio_tests/tests_aio/unit/server_test.py +++ b/src/python/grpcio_tests/tests_aio/unit/server_test.py @@ -352,7 +352,6 @@ class TestServer(AioTestBase): await call self.assertEqual(grpc.StatusCode.UNAVAILABLE, exception_context.exception.code()) - self.assertIn('GOAWAY', exception_context.exception.details()) async def test_concurrent_graceful_shutdown(self): call = self._channel.unary_unary(_BLOCK_BRIEFLY)(_REQUEST) @@ -388,7 +387,6 @@ class TestServer(AioTestBase): await call self.assertEqual(grpc.StatusCode.UNAVAILABLE, exception_context.exception.code()) - self.assertIn('GOAWAY', exception_context.exception.details()) @unittest.skip('https://github.com/grpc/grpc/issues/20818') async def test_shutdown_before_call(self): From b2839c2bae317d6000fe51a994262a9fd637188b Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Fri, 6 Mar 2020 14:21:07 -0800 Subject: [PATCH 090/758] Add assertion in grpc_call_soon_threadsafe --- src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi index 16fc967b82e..284a6c9a84a 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi @@ -76,4 +76,7 @@ def grpc_schedule_coroutine(object coro): def grpc_call_soon_threadsafe(object func, *args): + # TODO(lidiz) After we are confident, we can drop this assert. Otherwsie, + # we should limit this function to non-grpc-event-loop thread. + assert _event_loop_thread_ident != threading.current_thread().ident return _grpc_aio_loop.call_soon_threadsafe(func, *args) From efd483311cca31915cb22d98da49fda8dbeed2ed Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Fri, 6 Mar 2020 14:25:52 -0800 Subject: [PATCH 091/758] Remove loggings --- .../grpc/_cython/_cygrpc/aio/iomgr/socket.pyx.pxi | 3 --- .../grpc/_cython/_cygrpc/aio/poller.pyx.pxi | 15 --------------- 2 files changed, 18 deletions(-) diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/iomgr/socket.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/iomgr/socket.pyx.pxi index 11b3653e0bf..65ee6e24e59 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/iomgr/socket.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/iomgr/socket.pyx.pxi @@ -159,7 +159,6 @@ cdef class _AsyncioSocket: return self._reader and not self._reader._transport.is_closing() cdef void close(self): - _LOGGER.debug('closed!') if self.is_connected(): self._writer.close() if self._server: @@ -197,9 +196,7 @@ cdef class _AsyncioSocket: self._new_connection_callback, sock=self._py_socket, ) - _LOGGER.debug('start listen') - _LOGGER.debug('want to listen') grpc_aio_loop().create_task(create_asyncio_server()) cdef accept(self, diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/poller.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/poller.pyx.pxi index ce6df5c90d1..51bede8ede5 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/poller.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/poller.pyx.pxi @@ -31,15 +31,6 @@ cdef class BackgroundCompletionQueue: self._poller.daemon = True self._poller.start() - # async def _start_poller(self): - # if self._poller: - # raise UsageError('Poller can only be started once.') - - # self._poller = threading.Thread(target=self._polling_wrapper) - # self._poller.daemon = True - # self._poller.start() - # await self._poller_running - cdef _polling(self): cdef grpc_event event cdef CallbackContext *context @@ -47,28 +38,22 @@ cdef class BackgroundCompletionQueue: grpc_call_soon_threadsafe(self._poller_running.set_result, None) while not self._shutdown: - _LOGGER.debug('BackgroundCompletionQueue polling') with nogil: event = grpc_completion_queue_next(self._cq, _GPR_INF_FUTURE, NULL) - _LOGGER.debug('BackgroundCompletionQueue polling 1') if event.type == GRPC_QUEUE_TIMEOUT: - _LOGGER.debug('BackgroundCompletionQueue timeout???') raise NotImplementedError() elif event.type == GRPC_QUEUE_SHUTDOWN: - _LOGGER.debug('BackgroundCompletionQueue shutdown!') self._shutdown = True grpc_call_soon_threadsafe(self._shutdown_completed.set_result, None) else: - _LOGGER.debug('BackgroundCompletionQueue event! %d', event.success) context = event.tag grpc_call_soon_threadsafe( _handle_callback_wrapper, context.callback_wrapper, event.success) - _LOGGER.debug('BackgroundCompletionQueue polling 2') def _polling_wrapper(self): self._polling() From 221a50bf87269944907098f516424caf5f52304c Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Fri, 6 Mar 2020 15:03:44 -0800 Subject: [PATCH 092/758] Allow multiple asyncio engine --- .../_cygrpc/aio/callback_common.pxd.pxi | 8 ---- .../_cygrpc/aio/callback_common.pyx.pxi | 21 ---------- .../grpc/_cython/_cygrpc/aio/channel.pxd.pxi | 3 +- .../grpc/_cython/_cygrpc/aio/channel.pyx.pxi | 3 +- ...oller.pxd.pxi => completion_queue.pxd.pxi} | 13 +++++- ...oller.pyx.pxi => completion_queue.pyx.pxi} | 41 ++++++++++++++++++- .../grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi | 41 ++++++++++++++----- .../grpc/_cython/_cygrpc/aio/server.pxd.pxi | 3 +- .../grpc/_cython/_cygrpc/aio/server.pyx.pxi | 5 +-- src/python/grpcio/grpc/_cython/cygrpc.pxd | 2 +- src/python/grpcio/grpc/_cython/cygrpc.pyx | 3 +- tools/bazel.rc | 2 + .../linux/grpc_python_bazel_test_in_docker.sh | 1 + 13 files changed, 92 insertions(+), 54 deletions(-) rename src/python/grpcio/grpc/_cython/_cygrpc/aio/{poller.pxd.pxi => completion_queue.pxd.pxi} (51%) rename src/python/grpcio/grpc/_cython/_cygrpc/aio/{poller.pyx.pxi => completion_queue.pyx.pxi} (67%) diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pxd.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pxd.pxi index e99f78a18af..70a1c9b3f27 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pxd.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pxd.pxi @@ -52,13 +52,5 @@ cdef class CallbackWrapper: cdef grpc_experimental_completion_queue_functor *c_functor(self) -cdef class CallbackCompletionQueue: - cdef grpc_completion_queue *_cq - cdef object _shutdown_completed # asyncio.Future - cdef CallbackWrapper _wrapper - - cdef grpc_completion_queue* c_ptr(self) - - cdef class GrpcCallWrapper: cdef grpc_call* call diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi index 24c79533012..33713b8ad64 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi @@ -69,27 +69,6 @@ cdef CallbackFailureHandler CQ_SHUTDOWN_FAILURE_HANDLER = CallbackFailureHandler InternalError) -cdef class CallbackCompletionQueue: - - def __cinit__(self): - self._shutdown_completed = grpc_aio_loop().create_future() - self._wrapper = CallbackWrapper( - self._shutdown_completed, - CQ_SHUTDOWN_FAILURE_HANDLER) - self._cq = grpc_completion_queue_create_for_callback( - self._wrapper.c_functor(), - NULL - ) - - cdef grpc_completion_queue* c_ptr(self): - return self._cq - - async def shutdown(self): - grpc_completion_queue_shutdown(self._cq) - await self._shutdown_completed - grpc_completion_queue_destroy(self._cq) - - class ExecuteBatchError(Exception): pass diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pxd.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pxd.pxi index 62215b2d24f..569e6763c54 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pxd.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pxd.pxi @@ -21,8 +21,7 @@ cdef enum AioChannelStatus: cdef class AioChannel: cdef: grpc_channel * channel - # CallbackCompletionQueue cq - BackgroundCompletionQueue cq + BaseCompletionQueue cq object loop bytes _target AioChannelStatus _status diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi index cc6c5d99306..fa99371b211 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi @@ -31,8 +31,7 @@ cdef class AioChannel: options = () cdef _ChannelArgs channel_args = _ChannelArgs(options) self._target = target - # self.cq = CallbackCompletionQueue() - self.cq = BackgroundCompletionQueue() + self.cq = create_completion_queue() self.loop = loop self._status = AIO_CHANNEL_STATUS_READY diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/poller.pxd.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pxd.pxi similarity index 51% rename from src/python/grpcio/grpc/_cython/_cygrpc/aio/poller.pxd.pxi rename to src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pxd.pxi index c66d24bd502..b5b8c5036cd 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/poller.pxd.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pxd.pxi @@ -1,6 +1,10 @@ cdef gpr_timespec _GPR_INF_FUTURE = gpr_inf_future(GPR_CLOCK_REALTIME) -cdef class BackgroundCompletionQueue: +cdef class BaseCompletionQueue: + + cdef grpc_completion_queue* c_ptr(self) + +cdef class PollerCompletionQueue(BaseCompletionQueue): cdef grpc_completion_queue *_cq cdef bint _shutdown cdef object _shutdown_completed @@ -8,4 +12,9 @@ cdef class BackgroundCompletionQueue: cdef object _poller_running cdef _polling(self) - cdef grpc_completion_queue* c_ptr(self) + + +cdef class CallbackCompletionQueue(BaseCompletionQueue): + cdef grpc_completion_queue *_cq + cdef object _shutdown_completed # asyncio.Future + cdef CallbackWrapper _wrapper diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/poller.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi similarity index 67% rename from src/python/grpcio/grpc/_cython/_cygrpc/aio/poller.pyx.pxi rename to src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi index 51bede8ede5..85ae0c4561a 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/poller.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi @@ -19,7 +19,16 @@ def _handle_callback_wrapper(CallbackWrapper callback_wrapper, int success): CallbackWrapper.functor_run(callback_wrapper.c_functor(), success) -cdef class BackgroundCompletionQueue: +cdef class BaseCompletionQueue: + + async def shutdown(self): + raise NotImplementedError() + + cdef grpc_completion_queue* c_ptr(self): + raise NotImplementedError() + + +cdef class PollerCompletionQueue(BaseCompletionQueue): def __cinit__(self): self._cq = grpc_completion_queue_create_for_next(NULL) @@ -65,3 +74,33 @@ cdef class BackgroundCompletionQueue: cdef grpc_completion_queue* c_ptr(self): return self._cq + + +cdef class CallbackCompletionQueue(BaseCompletionQueue): + + def __cinit__(self): + self._shutdown_completed = grpc_aio_loop().create_future() + self._wrapper = CallbackWrapper( + self._shutdown_completed, + CQ_SHUTDOWN_FAILURE_HANDLER) + self._cq = grpc_completion_queue_create_for_callback( + self._wrapper.c_functor(), + NULL + ) + + cdef grpc_completion_queue* c_ptr(self): + return self._cq + + async def shutdown(self): + grpc_completion_queue_shutdown(self._cq) + await self._shutdown_completed + grpc_completion_queue_destroy(self._cq) + + +cdef BaseCompletionQueue create_completion_queue(): + if grpc_aio_engine is AsyncIOEngine.CUSTOM_IO_MANAGER: + return CallbackCompletionQueue() + elif grpc_aio_engine is AsyncIOEngine.POLLER: + return PollerCompletionQueue() + else: + raise ValueError('Unexpected engine type [%s]' % grpc_aio_engine) diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi index 284a6c9a84a..44064ef95ce 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi @@ -20,38 +20,57 @@ cdef bint _grpc_aio_initialized = False # a single event loop picked by "init_grpc_aio". cdef object _grpc_aio_loop cdef object _event_loop_thread_ident +cdef str _GRPC_ASYNCIO_ENGINE = os.environ.get('GRPC_ASYNCIO_ENGINE', 'default').lower() +grpc_aio_engine = None + + +class AsyncIOEngine(enum.Enum): + DEFAULT = 'default' + CUSTOM_IO_MANAGER = 'custom' + CQ_POLLER = 'poller' def init_grpc_aio(): global _grpc_aio_initialized global _grpc_aio_loop global _event_loop_thread_ident + global grpc_aio_engine + # Marks this function as called if _grpc_aio_initialized: return else: _grpc_aio_initialized = True - _event_loop_thread_ident = threading.current_thread().ident + + # Picks the engine for gRPC AsyncIO Stack + for engine_type in AsyncIOEngine: + if engine_type.value == _GRPC_ASYNCIO_ENGINE: + grpc_aio_engine = engine_type + break + if grpc_aio_engine is None or grpc_aio_engine is AsyncIOEngine.DEFAULT: + grpc_aio_engine = AsyncIOEngine.CUSTOM_IO_MANAGER # Anchors the event loop that the gRPC library going to use. _grpc_aio_loop = asyncio.get_event_loop() - - # Activates asyncio IO manager - # install_asyncio_iomgr() + _event_loop_thread_ident = threading.current_thread().ident # TODO(https://github.com/grpc/grpc/issues/22244) we need a the # grpc_shutdown_blocking() counterpart for this call. Otherwise, the gRPC # library won't shutdown cleanly. grpc_init() - # Timers are triggered by the Asyncio loop. We disable - # the background thread that is being used by the native - # gRPC iomgr. - # grpc_timer_manager_set_threading(False) + if grpc_aio_engine is AsyncIOEngine.CUSTOM_IO_MANAGER: + # Activates asyncio IO manager + install_asyncio_iomgr() + + # Timers are triggered by the Asyncio loop. We disable + # the background thread that is being used by the native + # gRPC iomgr. + grpc_timer_manager_set_threading(False) - # gRPC callbaks are executed within the same thread used by the Asyncio - # event loop, as it is being done by the other Asyncio callbacks. - # Executor.SetThreadingAll(False) + # gRPC callbaks are executed within the same thread used by the Asyncio + # event loop, as it is being done by the other Asyncio callbacks. + Executor.SetThreadingAll(False) _grpc_aio_initialized = False diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pxd.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pxd.pxi index 54d75d99890..18fc9214b27 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pxd.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pxd.pxi @@ -51,8 +51,7 @@ cdef enum AioServerStatus: cdef class AioServer: cdef Server _server - # cdef CallbackCompletionQueue _cq - cdef BackgroundCompletionQueue _cq + cdef BaseCompletionQueue _cq cdef list _generic_handlers cdef AioServerStatus _status cdef object _loop # asyncio.EventLoop diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi index 5adb8a949fe..d8ed9a41fe7 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi @@ -613,8 +613,7 @@ cdef class AioServer: # NOTE(lidiz) Core objects won't be deallocated automatically. # If AioServer.shutdown is not called, those objects will leak. self._server = Server(options) - # self._cq = CallbackCompletionQueue() - self._cq = BackgroundCompletionQueue() + self._cq = create_completion_queue() grpc_server_register_completion_queue( self._server.c_server, self._cq.c_ptr(), @@ -737,7 +736,7 @@ cdef class AioServer: # The shutdown callback won't be called until there is no live RPC. grpc_server_shutdown_and_notify( self._server.c_server, - self._cq._cq, + self._cq.c_ptr(), self._shutdown_callback_wrapper.c_functor()) # Ensures the serving task (coroutine) exits. diff --git a/src/python/grpcio/grpc/_cython/cygrpc.pxd b/src/python/grpcio/grpc/_cython/cygrpc.pxd index 6e7b1aa64b0..166be370227 100644 --- a/src/python/grpcio/grpc/_cython/cygrpc.pxd +++ b/src/python/grpcio/grpc/_cython/cygrpc.pxd @@ -45,7 +45,7 @@ IF UNAME_SYSNAME != "Windows": include "_cygrpc/aio/iomgr/socket.pxd.pxi" include "_cygrpc/aio/iomgr/timer.pxd.pxi" include "_cygrpc/aio/iomgr/resolver.pxd.pxi" -include "_cygrpc/aio/poller.pxd.pxi" +include "_cygrpc/aio/completion_queue.pxd.pxi" include "_cygrpc/aio/rpc_status.pxd.pxi" include "_cygrpc/aio/grpc_aio.pxd.pxi" include "_cygrpc/aio/callback_common.pxd.pxi" diff --git a/src/python/grpcio/grpc/_cython/cygrpc.pyx b/src/python/grpcio/grpc/_cython/cygrpc.pyx index 0c6ab7e590f..5910f10abfd 100644 --- a/src/python/grpcio/grpc/_cython/cygrpc.pyx +++ b/src/python/grpcio/grpc/_cython/cygrpc.pyx @@ -20,6 +20,7 @@ import os import sys import threading import time +import enum import grpc @@ -71,8 +72,8 @@ include "_cygrpc/aio/iomgr/timer.pyx.pxi" include "_cygrpc/aio/iomgr/resolver.pyx.pxi" include "_cygrpc/aio/common.pyx.pxi" include "_cygrpc/aio/rpc_status.pyx.pxi" +include "_cygrpc/aio/completion_queue.pyx.pxi" include "_cygrpc/aio/callback_common.pyx.pxi" -include "_cygrpc/aio/poller.pyx.pxi" include "_cygrpc/aio/grpc_aio.pyx.pxi" include "_cygrpc/aio/call.pyx.pxi" include "_cygrpc/aio/channel.pyx.pxi" diff --git a/tools/bazel.rc b/tools/bazel.rc index 92307805017..6dbcc273223 100644 --- a/tools/bazel.rc +++ b/tools/bazel.rc @@ -89,3 +89,5 @@ build:basicprof --copt=-DGRPC_BASIC_PROFILER build:basicprof --copt=-DGRPC_TIMERS_RDTSC build:python_single_threaded_unary_stream --test_env="GRPC_SINGLE_THREADED_UNARY_STREAM=true" + +build:python_poller_engine --test_env="GRPC_ASYNCIO_ENGINE=poller" diff --git a/tools/internal_ci/linux/grpc_python_bazel_test_in_docker.sh b/tools/internal_ci/linux/grpc_python_bazel_test_in_docker.sh index fef8c8fa9f4..da286c433b5 100755 --- a/tools/internal_ci/linux/grpc_python_bazel_test_in_docker.sh +++ b/tools/internal_ci/linux/grpc_python_bazel_test_in_docker.sh @@ -28,6 +28,7 @@ TEST_TARGETS="//src/python/... //examples/python/..." BAZEL_FLAGS="--spawn_strategy=standalone --genrule_strategy=standalone --test_output=errors" bazel test ${BAZEL_FLAGS} ${TEST_TARGETS} bazel test --config=python_single_threaded_unary_stream ${BAZEL_FLAGS} ${TEST_TARGETS} +bazel test --config=python_poller_engine ${BAZEL_FLAGS} ${TEST_TARGETS} # TODO(https://github.com/grpc/grpc/issues/19854): Move this to a new Kokoro From 1d13ec88de853232febe07eefb6d3a1868e26e82 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Fri, 6 Mar 2020 15:23:23 -0800 Subject: [PATCH 093/758] Segfault while shutting down --- .../_cython/_cygrpc/aio/completion_queue.pxd.pxi | 14 +++++++++++++- .../_cython/_cygrpc/aio/completion_queue.pyx.pxi | 1 + .../grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi | 2 +- .../grpc/_cython/_cygrpc/aio/iomgr/socket.pxd.pxi | 4 ++++ .../grpc/_cython/_cygrpc/aio/iomgr/socket.pyx.pxi | 14 +++++++++++++- .../grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi | 1 + 6 files changed, 33 insertions(+), 3 deletions(-) diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pxd.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pxd.pxi index b5b8c5036cd..708a2745fdf 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pxd.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pxd.pxi @@ -1,4 +1,16 @@ -cdef gpr_timespec _GPR_INF_FUTURE = gpr_inf_future(GPR_CLOCK_REALTIME) +# Copyright 2020 The gRPC Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. cdef class BaseCompletionQueue: diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi index 85ae0c4561a..4b8b326a2da 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi @@ -92,6 +92,7 @@ cdef class CallbackCompletionQueue(BaseCompletionQueue): return self._cq async def shutdown(self): + _LOGGER.debug('CallbackCompletionQueue shutdown') grpc_completion_queue_shutdown(self._cq) await self._shutdown_completed grpc_completion_queue_destroy(self._cq) diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi index 44064ef95ce..fe36a4e63aa 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi @@ -27,7 +27,7 @@ grpc_aio_engine = None class AsyncIOEngine(enum.Enum): DEFAULT = 'default' CUSTOM_IO_MANAGER = 'custom' - CQ_POLLER = 'poller' + POLLER = 'poller' def init_grpc_aio(): diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/iomgr/socket.pxd.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/iomgr/socket.pxd.pxi index cd425d2e941..cfab5549b2e 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/iomgr/socket.pxd.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/iomgr/socket.pxd.pxi @@ -24,10 +24,14 @@ cdef class _AsyncioSocket: object _task_read object _task_write object _task_connect + object _task_listen char * _read_buffer # Caches the picked event loop, so we can avoid the 30ns overhead each # time we need access to the event loop. object _loop + # TODO(lidiz) Drop after 3.6 deprecation. Python 3.7 introduces methods + # like `is_closing()` to help graceful shutdown. + bint _closed # Client-side attributes grpc_custom_connect_callback _grpc_connect_cb diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/iomgr/socket.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/iomgr/socket.pyx.pxi index 65ee6e24e59..f46e657c263 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/iomgr/socket.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/iomgr/socket.pyx.pxi @@ -31,10 +31,12 @@ cdef class _AsyncioSocket: self._task_connect = None self._task_read = None self._task_write = None + self._task_listen = None self._read_buffer = NULL self._server = None self._py_socket = None self._peername = None + self._closed = False @staticmethod cdef _AsyncioSocket create(grpc_custom_socket * grpc_socket, @@ -159,8 +161,14 @@ cdef class _AsyncioSocket: return self._reader and not self._reader._transport.is_closing() cdef void close(self): + if self._closed: + return + else: + self._closed = True if self.is_connected(): self._writer.close() + if self._task_listen and not self._task_listen.done(): + self._task_listen.close() if self._server: self._server.close() # NOTE(lidiz) If the asyncio.Server is created from a Python socket, @@ -170,6 +178,10 @@ cdef class _AsyncioSocket: self._py_socket.close() def _new_connection_callback(self, object reader, object writer): + # If the socket is closed, stop. + if self._closed: + return + # Close the connection if server is not started yet. if self._grpc_accept_cb == NULL: writer.close() @@ -197,7 +209,7 @@ cdef class _AsyncioSocket: sock=self._py_socket, ) - grpc_aio_loop().create_task(create_asyncio_server()) + self._task_listen = grpc_aio_loop().create_task(create_asyncio_server()) cdef accept(self, grpc_custom_socket* grpc_socket_client, diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi index d8ed9a41fe7..1b4f61a9c36 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi @@ -754,6 +754,7 @@ cdef class AioServer: grace: An optional float indicating the length of grace period in seconds. """ + _LOGGER.debug('server shutdown') if self._status == AIO_SERVER_STATUS_READY or self._status == AIO_SERVER_STATUS_STOPPED: return From 0ee33a476286ebaf6a73aaccb0eb56ca89fcd2db Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Fri, 6 Mar 2020 15:40:02 -0800 Subject: [PATCH 094/758] Confusing --- .../_cython/_cygrpc/aio/iomgr/iomgr.pyx.pxi | 2 + .../_cygrpc/aio/iomgr/resolver.pyx.pxi | 3 + .../grpcio_tests/tests_aio/unit/call_test.py | 1216 ++++++++--------- 3 files changed, 611 insertions(+), 610 deletions(-) diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/iomgr/iomgr.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/iomgr/iomgr.pyx.pxi index 37ba5f0d346..1a3dd46dcf4 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/iomgr/iomgr.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/iomgr/iomgr.pyx.pxi @@ -170,6 +170,7 @@ cdef grpc_error* asyncio_resolve( char* host, char* port, grpc_resolved_addresses** res) with gil: + _LOGGER.debug('asyncio_resolve') result = native_socket.getaddrinfo(host, port) res[0] = tuples_to_resolvaddr(result) @@ -178,6 +179,7 @@ cdef void asyncio_resolve_async( grpc_custom_resolver* grpc_resolver, char* host, char* port) with gil: + _LOGGER.debug('asyncio_resolve_async') resolver = _AsyncioResolver.create(grpc_resolver) resolver.resolve(host, port) diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/iomgr/resolver.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/iomgr/resolver.pyx.pxi index 7d47fa77b00..7897368bc83 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/iomgr/resolver.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/iomgr/resolver.pyx.pxi @@ -32,7 +32,9 @@ cdef class _AsyncioResolver: async def _async_resolve(self, bytes host, bytes port): self._task_resolve = None try: + _LOGGER.debug('_AsyncioResolver before') resolved = await grpc_aio_loop().getaddrinfo(host, port) + _LOGGER.debug('_AsyncioResolver after') except Exception as e: grpc_custom_resolve_callback( self._grpc_resolver, @@ -50,6 +52,7 @@ cdef class _AsyncioResolver: cdef void resolve(self, char* host, char* port): assert not self._task_resolve + _LOGGER.debug('_AsyncioResolver resolve') self._task_resolve = grpc_aio_loop().create_task( self._async_resolve(host, port) ) diff --git a/src/python/grpcio_tests/tests_aio/unit/call_test.py b/src/python/grpcio_tests/tests_aio/unit/call_test.py index e47c00a62ab..a9ff5f5dca8 100644 --- a/src/python/grpcio_tests/tests_aio/unit/call_test.py +++ b/src/python/grpcio_tests/tests_aio/unit/call_test.py @@ -49,32 +49,32 @@ class _MulticallableTestMixin(): class TestUnaryUnaryCall(_MulticallableTestMixin, AioTestBase): - async def test_call_to_string(self): - call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) + # async def test_call_to_string(self): + # call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) - self.assertTrue(str(call) is not None) - self.assertTrue(repr(call) is not None) + # self.assertTrue(str(call) is not None) + # self.assertTrue(repr(call) is not None) - response = await call + # response = await call - self.assertTrue(str(call) is not None) - self.assertTrue(repr(call) is not None) + # self.assertTrue(str(call) is not None) + # self.assertTrue(repr(call) is not None) - async def test_call_ok(self): - call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) + # async def test_call_ok(self): + # call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) - self.assertFalse(call.done()) + # self.assertFalse(call.done()) - response = await call + # response = await call - self.assertTrue(call.done()) - self.assertIsInstance(response, messages_pb2.SimpleResponse) - self.assertEqual(await call.code(), grpc.StatusCode.OK) + # self.assertTrue(call.done()) + # self.assertIsInstance(response, messages_pb2.SimpleResponse) + # self.assertEqual(await call.code(), grpc.StatusCode.OK) - # Response is cached at call object level, reentrance - # returns again the same response - response_retry = await call - self.assertIs(response, response_retry) + # # Response is cached at call object level, reentrance + # # returns again the same response + # response_retry = await call + # self.assertIs(response, response_retry) async def test_call_rpc_error(self): async with aio.insecure_channel(_UNREACHABLE_TARGET) as channel: @@ -91,668 +91,664 @@ class TestUnaryUnaryCall(_MulticallableTestMixin, AioTestBase): self.assertTrue(call.done()) self.assertEqual(grpc.StatusCode.UNAVAILABLE, await call.code()) - async def test_call_code_awaitable(self): - call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) - self.assertEqual(await call.code(), grpc.StatusCode.OK) - async def test_call_details_awaitable(self): - call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) - self.assertEqual('', await call.details()) +# async def test_call_code_awaitable(self): +# call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) +# self.assertEqual(await call.code(), grpc.StatusCode.OK) - async def test_call_initial_metadata_awaitable(self): - call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) - self.assertEqual((), await call.initial_metadata()) +# async def test_call_details_awaitable(self): +# call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) +# self.assertEqual('', await call.details()) - async def test_call_trailing_metadata_awaitable(self): - call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) - self.assertEqual((), await call.trailing_metadata()) +# async def test_call_initial_metadata_awaitable(self): +# call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) +# self.assertEqual((), await call.initial_metadata()) - async def test_call_initial_metadata_cancelable(self): - coro_started = asyncio.Event() - call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) +# async def test_call_trailing_metadata_awaitable(self): +# call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) +# self.assertEqual((), await call.trailing_metadata()) - async def coro(): - coro_started.set() - await call.initial_metadata() +# async def test_call_initial_metadata_cancelable(self): +# coro_started = asyncio.Event() +# call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) - task = self.loop.create_task(coro()) - await coro_started.wait() - task.cancel() +# async def coro(): +# coro_started.set() +# await call.initial_metadata() - # Test that initial metadata can still be asked thought - # a cancellation happened with the previous task - self.assertEqual((), await call.initial_metadata()) +# task = self.loop.create_task(coro()) +# await coro_started.wait() +# task.cancel() - async def test_call_initial_metadata_multiple_waiters(self): - call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) +# # Test that initial metadata can still be asked thought +# # a cancellation happened with the previous task +# self.assertEqual((), await call.initial_metadata()) - async def coro(): - return await call.initial_metadata() +# async def test_call_initial_metadata_multiple_waiters(self): +# call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) - task1 = self.loop.create_task(coro()) - task2 = self.loop.create_task(coro()) +# async def coro(): +# return await call.initial_metadata() - await call +# task1 = self.loop.create_task(coro()) +# task2 = self.loop.create_task(coro()) - self.assertEqual([(), ()], await asyncio.gather(*[task1, task2])) +# await call - async def test_call_code_cancelable(self): - coro_started = asyncio.Event() - call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) +# self.assertEqual([(), ()], await asyncio.gather(*[task1, task2])) - async def coro(): - coro_started.set() - await call.code() +# async def test_call_code_cancelable(self): +# coro_started = asyncio.Event() +# call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) - task = self.loop.create_task(coro()) - await coro_started.wait() - task.cancel() +# async def coro(): +# coro_started.set() +# await call.code() - # Test that code can still be asked thought - # a cancellation happened with the previous task - self.assertEqual(grpc.StatusCode.OK, await call.code()) +# task = self.loop.create_task(coro()) +# await coro_started.wait() +# task.cancel() - async def test_call_code_multiple_waiters(self): - call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) +# # Test that code can still be asked thought +# # a cancellation happened with the previous task +# self.assertEqual(grpc.StatusCode.OK, await call.code()) - async def coro(): - return await call.code() +# async def test_call_code_multiple_waiters(self): +# call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) - task1 = self.loop.create_task(coro()) - task2 = self.loop.create_task(coro()) +# async def coro(): +# return await call.code() - await call +# task1 = self.loop.create_task(coro()) +# task2 = self.loop.create_task(coro()) - self.assertEqual([grpc.StatusCode.OK, grpc.StatusCode.OK], await - asyncio.gather(task1, task2)) +# await call - async def test_cancel_unary_unary(self): - call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) +# self.assertEqual([grpc.StatusCode.OK, grpc.StatusCode.OK], await +# asyncio.gather(task1, task2)) - self.assertFalse(call.cancelled()) +# async def test_cancel_unary_unary(self): +# call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) - self.assertTrue(call.cancel()) - self.assertFalse(call.cancel()) +# self.assertFalse(call.cancelled()) - with self.assertRaises(asyncio.CancelledError): - await call +# self.assertTrue(call.cancel()) +# self.assertFalse(call.cancel()) - # The info in the RpcError should match the info in Call object. - self.assertTrue(call.cancelled()) - self.assertEqual(await call.code(), grpc.StatusCode.CANCELLED) - self.assertEqual(await call.details(), - 'Locally cancelled by application!') +# with self.assertRaises(asyncio.CancelledError): +# await call - async def test_cancel_unary_unary_in_task(self): - coro_started = asyncio.Event() - call = self._stub.EmptyCall(messages_pb2.SimpleRequest()) +# # The info in the RpcError should match the info in Call object. +# self.assertTrue(call.cancelled()) +# self.assertEqual(await call.code(), grpc.StatusCode.CANCELLED) +# self.assertEqual(await call.details(), +# 'Locally cancelled by application!') - async def another_coro(): - coro_started.set() - await call +# async def test_cancel_unary_unary_in_task(self): +# coro_started = asyncio.Event() +# call = self._stub.EmptyCall(messages_pb2.SimpleRequest()) - task = self.loop.create_task(another_coro()) - await coro_started.wait() +# async def another_coro(): +# coro_started.set() +# await call - self.assertFalse(task.done()) - task.cancel() +# task = self.loop.create_task(another_coro()) +# await coro_started.wait() - self.assertEqual(grpc.StatusCode.CANCELLED, await call.code()) +# self.assertFalse(task.done()) +# task.cancel() - with self.assertRaises(asyncio.CancelledError): - await task +# self.assertEqual(grpc.StatusCode.CANCELLED, await call.code()) +# with self.assertRaises(asyncio.CancelledError): +# await task -class TestUnaryStreamCall(_MulticallableTestMixin, AioTestBase): +# class TestUnaryStreamCall(_MulticallableTestMixin, AioTestBase): - async def test_cancel_unary_stream(self): - # Prepares the request - request = messages_pb2.StreamingOutputCallRequest() - for _ in range(_NUM_STREAM_RESPONSES): - request.response_parameters.append( - messages_pb2.ResponseParameters( - size=_RESPONSE_PAYLOAD_SIZE, - interval_us=_RESPONSE_INTERVAL_US, - )) +# async def test_cancel_unary_stream(self): +# # Prepares the request +# request = messages_pb2.StreamingOutputCallRequest() +# for _ in range(_NUM_STREAM_RESPONSES): +# request.response_parameters.append( +# messages_pb2.ResponseParameters( +# size=_RESPONSE_PAYLOAD_SIZE, +# interval_us=_RESPONSE_INTERVAL_US, +# )) + +# # Invokes the actual RPC +# call = self._stub.StreamingOutputCall(request) +# self.assertFalse(call.cancelled()) + +# response = await call.read() +# self.assertIs(type(response), messages_pb2.StreamingOutputCallResponse) +# self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) + +# self.assertTrue(call.cancel()) +# self.assertEqual(grpc.StatusCode.CANCELLED, await call.code()) +# self.assertEqual(_LOCAL_CANCEL_DETAILS_EXPECTATION, await +# call.details()) +# self.assertFalse(call.cancel()) + +# with self.assertRaises(asyncio.CancelledError): +# await call.read() +# self.assertTrue(call.cancelled()) + +# async def test_multiple_cancel_unary_stream(self): +# # Prepares the request +# request = messages_pb2.StreamingOutputCallRequest() +# for _ in range(_NUM_STREAM_RESPONSES): +# request.response_parameters.append( +# messages_pb2.ResponseParameters( +# size=_RESPONSE_PAYLOAD_SIZE, +# interval_us=_RESPONSE_INTERVAL_US, +# )) + +# # Invokes the actual RPC +# call = self._stub.StreamingOutputCall(request) +# self.assertFalse(call.cancelled()) + +# response = await call.read() +# self.assertIs(type(response), messages_pb2.StreamingOutputCallResponse) +# self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) + +# self.assertTrue(call.cancel()) +# self.assertFalse(call.cancel()) +# self.assertFalse(call.cancel()) +# self.assertFalse(call.cancel()) + +# with self.assertRaises(asyncio.CancelledError): +# await call.read() + +# async def test_early_cancel_unary_stream(self): +# """Test cancellation before receiving messages.""" +# # Prepares the request +# request = messages_pb2.StreamingOutputCallRequest() +# for _ in range(_NUM_STREAM_RESPONSES): +# request.response_parameters.append( +# messages_pb2.ResponseParameters( +# size=_RESPONSE_PAYLOAD_SIZE, +# interval_us=_RESPONSE_INTERVAL_US, +# )) + +# # Invokes the actual RPC +# call = self._stub.StreamingOutputCall(request) + +# self.assertFalse(call.cancelled()) +# self.assertTrue(call.cancel()) +# self.assertFalse(call.cancel()) + +# with self.assertRaises(asyncio.CancelledError): +# await call.read() + +# self.assertTrue(call.cancelled()) + +# self.assertEqual(grpc.StatusCode.CANCELLED, await call.code()) +# self.assertEqual(_LOCAL_CANCEL_DETAILS_EXPECTATION, await +# call.details()) + +# async def test_late_cancel_unary_stream(self): +# """Test cancellation after received all messages.""" +# # Prepares the request +# request = messages_pb2.StreamingOutputCallRequest() +# for _ in range(_NUM_STREAM_RESPONSES): +# request.response_parameters.append( +# messages_pb2.ResponseParameters(size=_RESPONSE_PAYLOAD_SIZE,)) + +# # Invokes the actual RPC +# call = self._stub.StreamingOutputCall(request) + +# for _ in range(_NUM_STREAM_RESPONSES): +# response = await call.read() +# self.assertIs(type(response), +# messages_pb2.StreamingOutputCallResponse) +# self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) + +# # After all messages received, it is possible that the final state +# # is received or on its way. It's basically a data race, so our +# # expectation here is do not crash :) +# call.cancel() +# self.assertIn(await call.code(), +# [grpc.StatusCode.OK, grpc.StatusCode.CANCELLED]) + +# async def test_too_many_reads_unary_stream(self): +# """Test calling read after received all messages fails.""" +# # Prepares the request +# request = messages_pb2.StreamingOutputCallRequest() +# for _ in range(_NUM_STREAM_RESPONSES): +# request.response_parameters.append( +# messages_pb2.ResponseParameters(size=_RESPONSE_PAYLOAD_SIZE,)) + +# # Invokes the actual RPC +# call = self._stub.StreamingOutputCall(request) + +# for _ in range(_NUM_STREAM_RESPONSES): +# response = await call.read() +# self.assertIs(type(response), +# messages_pb2.StreamingOutputCallResponse) +# self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) +# self.assertIs(await call.read(), aio.EOF) + +# # After the RPC is finished, further reads will lead to exception. +# self.assertEqual(await call.code(), grpc.StatusCode.OK) +# self.assertIs(await call.read(), aio.EOF) + +# async def test_unary_stream_async_generator(self): +# """Sunny day test case for unary_stream.""" +# # Prepares the request +# request = messages_pb2.StreamingOutputCallRequest() +# for _ in range(_NUM_STREAM_RESPONSES): +# request.response_parameters.append( +# messages_pb2.ResponseParameters(size=_RESPONSE_PAYLOAD_SIZE,)) + +# # Invokes the actual RPC +# call = self._stub.StreamingOutputCall(request) +# self.assertFalse(call.cancelled()) + +# async for response in call: +# self.assertIs(type(response), +# messages_pb2.StreamingOutputCallResponse) +# self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) + +# self.assertEqual(await call.code(), grpc.StatusCode.OK) + +# async def test_cancel_unary_stream_in_task_using_read(self): +# coro_started = asyncio.Event() + +# # Configs the server method to block forever +# request = messages_pb2.StreamingOutputCallRequest() +# request.response_parameters.append( +# messages_pb2.ResponseParameters( +# size=_RESPONSE_PAYLOAD_SIZE, +# interval_us=_INFINITE_INTERVAL_US, +# )) + +# # Invokes the actual RPC +# call = self._stub.StreamingOutputCall(request) + +# async def another_coro(): +# coro_started.set() +# await call.read() + +# task = self.loop.create_task(another_coro()) +# await coro_started.wait() + +# self.assertFalse(task.done()) +# task.cancel() + +# self.assertEqual(grpc.StatusCode.CANCELLED, await call.code()) + +# with self.assertRaises(asyncio.CancelledError): +# await task + +# async def test_cancel_unary_stream_in_task_using_async_for(self): +# coro_started = asyncio.Event() + +# # Configs the server method to block forever +# request = messages_pb2.StreamingOutputCallRequest() +# request.response_parameters.append( +# messages_pb2.ResponseParameters( +# size=_RESPONSE_PAYLOAD_SIZE, +# interval_us=_INFINITE_INTERVAL_US, +# )) + +# # Invokes the actual RPC +# call = self._stub.StreamingOutputCall(request) + +# async def another_coro(): +# coro_started.set() +# async for _ in call: +# pass + +# task = self.loop.create_task(another_coro()) +# await coro_started.wait() + +# self.assertFalse(task.done()) +# task.cancel() + +# self.assertEqual(grpc.StatusCode.CANCELLED, await call.code()) + +# with self.assertRaises(asyncio.CancelledError): +# await task - # Invokes the actual RPC - call = self._stub.StreamingOutputCall(request) - self.assertFalse(call.cancelled()) +# def test_call_credentials(self): - response = await call.read() - self.assertIs(type(response), messages_pb2.StreamingOutputCallResponse) - self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) +# class DummyAuth(grpc.AuthMetadataPlugin): - self.assertTrue(call.cancel()) - self.assertEqual(grpc.StatusCode.CANCELLED, await call.code()) - self.assertEqual(_LOCAL_CANCEL_DETAILS_EXPECTATION, await - call.details()) - self.assertFalse(call.cancel()) - - with self.assertRaises(asyncio.CancelledError): - await call.read() - self.assertTrue(call.cancelled()) - - async def test_multiple_cancel_unary_stream(self): - # Prepares the request - request = messages_pb2.StreamingOutputCallRequest() - for _ in range(_NUM_STREAM_RESPONSES): - request.response_parameters.append( - messages_pb2.ResponseParameters( - size=_RESPONSE_PAYLOAD_SIZE, - interval_us=_RESPONSE_INTERVAL_US, - )) - - # Invokes the actual RPC - call = self._stub.StreamingOutputCall(request) - self.assertFalse(call.cancelled()) - - response = await call.read() - self.assertIs(type(response), messages_pb2.StreamingOutputCallResponse) - self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) - - self.assertTrue(call.cancel()) - self.assertFalse(call.cancel()) - self.assertFalse(call.cancel()) - self.assertFalse(call.cancel()) - - with self.assertRaises(asyncio.CancelledError): - await call.read() - - async def test_early_cancel_unary_stream(self): - """Test cancellation before receiving messages.""" - # Prepares the request - request = messages_pb2.StreamingOutputCallRequest() - for _ in range(_NUM_STREAM_RESPONSES): - request.response_parameters.append( - messages_pb2.ResponseParameters( - size=_RESPONSE_PAYLOAD_SIZE, - interval_us=_RESPONSE_INTERVAL_US, - )) - - # Invokes the actual RPC - call = self._stub.StreamingOutputCall(request) - - self.assertFalse(call.cancelled()) - self.assertTrue(call.cancel()) - self.assertFalse(call.cancel()) - - with self.assertRaises(asyncio.CancelledError): - await call.read() - - self.assertTrue(call.cancelled()) - - self.assertEqual(grpc.StatusCode.CANCELLED, await call.code()) - self.assertEqual(_LOCAL_CANCEL_DETAILS_EXPECTATION, await - call.details()) - - async def test_late_cancel_unary_stream(self): - """Test cancellation after received all messages.""" - # Prepares the request - request = messages_pb2.StreamingOutputCallRequest() - for _ in range(_NUM_STREAM_RESPONSES): - request.response_parameters.append( - messages_pb2.ResponseParameters(size=_RESPONSE_PAYLOAD_SIZE,)) - - # Invokes the actual RPC - call = self._stub.StreamingOutputCall(request) - - for _ in range(_NUM_STREAM_RESPONSES): - response = await call.read() - self.assertIs(type(response), - messages_pb2.StreamingOutputCallResponse) - self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) - - # After all messages received, it is possible that the final state - # is received or on its way. It's basically a data race, so our - # expectation here is do not crash :) - call.cancel() - self.assertIn(await call.code(), - [grpc.StatusCode.OK, grpc.StatusCode.CANCELLED]) - - async def test_too_many_reads_unary_stream(self): - """Test calling read after received all messages fails.""" - # Prepares the request - request = messages_pb2.StreamingOutputCallRequest() - for _ in range(_NUM_STREAM_RESPONSES): - request.response_parameters.append( - messages_pb2.ResponseParameters(size=_RESPONSE_PAYLOAD_SIZE,)) - - # Invokes the actual RPC - call = self._stub.StreamingOutputCall(request) - - for _ in range(_NUM_STREAM_RESPONSES): - response = await call.read() - self.assertIs(type(response), - messages_pb2.StreamingOutputCallResponse) - self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) - self.assertIs(await call.read(), aio.EOF) - - # After the RPC is finished, further reads will lead to exception. - self.assertEqual(await call.code(), grpc.StatusCode.OK) - self.assertIs(await call.read(), aio.EOF) - - async def test_unary_stream_async_generator(self): - """Sunny day test case for unary_stream.""" - # Prepares the request - request = messages_pb2.StreamingOutputCallRequest() - for _ in range(_NUM_STREAM_RESPONSES): - request.response_parameters.append( - messages_pb2.ResponseParameters(size=_RESPONSE_PAYLOAD_SIZE,)) - - # Invokes the actual RPC - call = self._stub.StreamingOutputCall(request) - self.assertFalse(call.cancelled()) - - async for response in call: - self.assertIs(type(response), - messages_pb2.StreamingOutputCallResponse) - self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) - - self.assertEqual(await call.code(), grpc.StatusCode.OK) - - async def test_cancel_unary_stream_in_task_using_read(self): - coro_started = asyncio.Event() - - # Configs the server method to block forever - request = messages_pb2.StreamingOutputCallRequest() - request.response_parameters.append( - messages_pb2.ResponseParameters( - size=_RESPONSE_PAYLOAD_SIZE, - interval_us=_INFINITE_INTERVAL_US, - )) - - # Invokes the actual RPC - call = self._stub.StreamingOutputCall(request) - - async def another_coro(): - coro_started.set() - await call.read() - - task = self.loop.create_task(another_coro()) - await coro_started.wait() - - self.assertFalse(task.done()) - task.cancel() - - self.assertEqual(grpc.StatusCode.CANCELLED, await call.code()) - - with self.assertRaises(asyncio.CancelledError): - await task - - async def test_cancel_unary_stream_in_task_using_async_for(self): - coro_started = asyncio.Event() - - # Configs the server method to block forever - request = messages_pb2.StreamingOutputCallRequest() - request.response_parameters.append( - messages_pb2.ResponseParameters( - size=_RESPONSE_PAYLOAD_SIZE, - interval_us=_INFINITE_INTERVAL_US, - )) - - # Invokes the actual RPC - call = self._stub.StreamingOutputCall(request) - - async def another_coro(): - coro_started.set() - async for _ in call: - pass - - task = self.loop.create_task(another_coro()) - await coro_started.wait() - - self.assertFalse(task.done()) - task.cancel() - - self.assertEqual(grpc.StatusCode.CANCELLED, await call.code()) +# def __call__(self, context, callback): +# signature = context.method_name[::-1] +# callback((("test", signature),), None) - with self.assertRaises(asyncio.CancelledError): - await task +# async def coro(): +# server_target, _ = await start_test_server(secure=False) # pylint: disable=unused-variable - def test_call_credentials(self): +# async with aio.insecure_channel(server_target) as channel: +# hi = channel.unary_unary('/grpc.testing.TestService/UnaryCall', +# request_serializer=messages_pb2. +# SimpleRequest.SerializeToString, +# response_deserializer=messages_pb2. +# SimpleResponse.FromString) +# call_credentials = grpc.metadata_call_credentials(DummyAuth()) +# call = hi(messages_pb2.SimpleRequest(), +# credentials=call_credentials) +# response = await call - class DummyAuth(grpc.AuthMetadataPlugin): +# self.assertIsInstance(response, messages_pb2.SimpleResponse) +# self.assertEqual(await call.code(), grpc.StatusCode.OK) - def __call__(self, context, callback): - signature = context.method_name[::-1] - callback((("test", signature),), None) +# self.loop.run_until_complete(coro()) - async def coro(): - server_target, _ = await start_test_server(secure=False) # pylint: disable=unused-variable +# async def test_time_remaining(self): +# request = messages_pb2.StreamingOutputCallRequest() +# # First message comes back immediately +# request.response_parameters.append( +# messages_pb2.ResponseParameters(size=_RESPONSE_PAYLOAD_SIZE,)) +# # Second message comes back after a unit of wait time +# request.response_parameters.append( +# messages_pb2.ResponseParameters( +# size=_RESPONSE_PAYLOAD_SIZE, +# interval_us=_RESPONSE_INTERVAL_US, +# )) - async with aio.insecure_channel(server_target) as channel: - hi = channel.unary_unary('/grpc.testing.TestService/UnaryCall', - request_serializer=messages_pb2. - SimpleRequest.SerializeToString, - response_deserializer=messages_pb2. - SimpleResponse.FromString) - call_credentials = grpc.metadata_call_credentials(DummyAuth()) - call = hi(messages_pb2.SimpleRequest(), - credentials=call_credentials) - response = await call +# call = self._stub.StreamingOutputCall( +# request, timeout=test_constants.SHORT_TIMEOUT * 2) - self.assertIsInstance(response, messages_pb2.SimpleResponse) - self.assertEqual(await call.code(), grpc.StatusCode.OK) +# response = await call.read() +# self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) - self.loop.run_until_complete(coro()) +# # Should be around the same as the timeout +# remained_time = call.time_remaining() +# self.assertGreater(remained_time, test_constants.SHORT_TIMEOUT * 3 // 2) +# self.assertLess(remained_time, test_constants.SHORT_TIMEOUT * 2) - async def test_time_remaining(self): - request = messages_pb2.StreamingOutputCallRequest() - # First message comes back immediately - request.response_parameters.append( - messages_pb2.ResponseParameters(size=_RESPONSE_PAYLOAD_SIZE,)) - # Second message comes back after a unit of wait time - request.response_parameters.append( - messages_pb2.ResponseParameters( - size=_RESPONSE_PAYLOAD_SIZE, - interval_us=_RESPONSE_INTERVAL_US, - )) +# response = await call.read() +# self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) - call = self._stub.StreamingOutputCall( - request, timeout=test_constants.SHORT_TIMEOUT * 2) +# # Should be around the timeout minus a unit of wait time +# remained_time = call.time_remaining() +# self.assertGreater(remained_time, test_constants.SHORT_TIMEOUT // 2) +# self.assertLess(remained_time, test_constants.SHORT_TIMEOUT * 3 // 2) - response = await call.read() - self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) +# self.assertEqual(grpc.StatusCode.OK, await call.code()) - # Should be around the same as the timeout - remained_time = call.time_remaining() - self.assertGreater(remained_time, test_constants.SHORT_TIMEOUT * 3 // 2) - self.assertLess(remained_time, test_constants.SHORT_TIMEOUT * 2) +# class TestStreamUnaryCall(_MulticallableTestMixin, AioTestBase): - response = await call.read() - self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) +# async def test_cancel_stream_unary(self): +# call = self._stub.StreamingInputCall() - # Should be around the timeout minus a unit of wait time - remained_time = call.time_remaining() - self.assertGreater(remained_time, test_constants.SHORT_TIMEOUT // 2) - self.assertLess(remained_time, test_constants.SHORT_TIMEOUT * 3 // 2) +# # Prepares the request +# payload = messages_pb2.Payload(body=b'\0' * _REQUEST_PAYLOAD_SIZE) +# request = messages_pb2.StreamingInputCallRequest(payload=payload) - self.assertEqual(grpc.StatusCode.OK, await call.code()) +# # Sends out requests +# for _ in range(_NUM_STREAM_RESPONSES): +# await call.write(request) +# # Cancels the RPC +# self.assertFalse(call.done()) +# self.assertFalse(call.cancelled()) +# self.assertTrue(call.cancel()) +# self.assertTrue(call.cancelled()) -class TestStreamUnaryCall(_MulticallableTestMixin, AioTestBase): +# await call.done_writing() - async def test_cancel_stream_unary(self): - call = self._stub.StreamingInputCall() +# with self.assertRaises(asyncio.CancelledError): +# await call - # Prepares the request - payload = messages_pb2.Payload(body=b'\0' * _REQUEST_PAYLOAD_SIZE) - request = messages_pb2.StreamingInputCallRequest(payload=payload) +# async def test_early_cancel_stream_unary(self): +# call = self._stub.StreamingInputCall() - # Sends out requests - for _ in range(_NUM_STREAM_RESPONSES): - await call.write(request) +# # Cancels the RPC +# self.assertFalse(call.done()) +# self.assertFalse(call.cancelled()) +# self.assertTrue(call.cancel()) +# self.assertTrue(call.cancelled()) - # Cancels the RPC - self.assertFalse(call.done()) - self.assertFalse(call.cancelled()) - self.assertTrue(call.cancel()) - self.assertTrue(call.cancelled()) +# with self.assertRaises(asyncio.InvalidStateError): +# await call.write(messages_pb2.StreamingInputCallRequest()) - await call.done_writing() +# # Should be no-op +# await call.done_writing() - with self.assertRaises(asyncio.CancelledError): - await call +# with self.assertRaises(asyncio.CancelledError): +# await call - async def test_early_cancel_stream_unary(self): - call = self._stub.StreamingInputCall() +# async def test_write_after_done_writing(self): +# call = self._stub.StreamingInputCall() + +# # Prepares the request +# payload = messages_pb2.Payload(body=b'\0' * _REQUEST_PAYLOAD_SIZE) +# request = messages_pb2.StreamingInputCallRequest(payload=payload) + +# # Sends out requests +# for _ in range(_NUM_STREAM_RESPONSES): +# await call.write(request) + +# # Should be no-op +# await call.done_writing() + +# with self.assertRaises(asyncio.InvalidStateError): +# await call.write(messages_pb2.StreamingInputCallRequest()) - # Cancels the RPC - self.assertFalse(call.done()) - self.assertFalse(call.cancelled()) - self.assertTrue(call.cancel()) - self.assertTrue(call.cancelled()) +# response = await call +# self.assertIsInstance(response, messages_pb2.StreamingInputCallResponse) +# self.assertEqual(_NUM_STREAM_RESPONSES * _REQUEST_PAYLOAD_SIZE, +# response.aggregated_payload_size) - with self.assertRaises(asyncio.InvalidStateError): - await call.write(messages_pb2.StreamingInputCallRequest()) +# self.assertEqual(await call.code(), grpc.StatusCode.OK) + +# async def test_error_in_async_generator(self): +# # Server will pause between responses +# request = messages_pb2.StreamingOutputCallRequest() +# request.response_parameters.append( +# messages_pb2.ResponseParameters( +# size=_RESPONSE_PAYLOAD_SIZE, +# interval_us=_RESPONSE_INTERVAL_US, +# )) - # Should be no-op - await call.done_writing() +# # We expect the request iterator to receive the exception +# request_iterator_received_the_exception = asyncio.Event() - with self.assertRaises(asyncio.CancelledError): - await call +# async def request_iterator(): +# with self.assertRaises(asyncio.CancelledError): +# for _ in range(_NUM_STREAM_RESPONSES): +# yield request +# await asyncio.sleep(test_constants.SHORT_TIMEOUT) +# request_iterator_received_the_exception.set() - async def test_write_after_done_writing(self): - call = self._stub.StreamingInputCall() +# call = self._stub.StreamingInputCall(request_iterator()) + +# # Cancel the RPC after at least one response +# async def cancel_later(): +# await asyncio.sleep(test_constants.SHORT_TIMEOUT * 2) +# call.cancel() + +# cancel_later_task = self.loop.create_task(cancel_later()) + +# # No exceptions here +# with self.assertRaises(asyncio.CancelledError): +# await call - # Prepares the request - payload = messages_pb2.Payload(body=b'\0' * _REQUEST_PAYLOAD_SIZE) - request = messages_pb2.StreamingInputCallRequest(payload=payload) +# await request_iterator_received_the_exception.wait() - # Sends out requests - for _ in range(_NUM_STREAM_RESPONSES): - await call.write(request) - - # Should be no-op - await call.done_writing() - - with self.assertRaises(asyncio.InvalidStateError): - await call.write(messages_pb2.StreamingInputCallRequest()) - - response = await call - self.assertIsInstance(response, messages_pb2.StreamingInputCallResponse) - self.assertEqual(_NUM_STREAM_RESPONSES * _REQUEST_PAYLOAD_SIZE, - response.aggregated_payload_size) - - self.assertEqual(await call.code(), grpc.StatusCode.OK) - - async def test_error_in_async_generator(self): - # Server will pause between responses - request = messages_pb2.StreamingOutputCallRequest() - request.response_parameters.append( - messages_pb2.ResponseParameters( - size=_RESPONSE_PAYLOAD_SIZE, - interval_us=_RESPONSE_INTERVAL_US, - )) - - # We expect the request iterator to receive the exception - request_iterator_received_the_exception = asyncio.Event() - - async def request_iterator(): - with self.assertRaises(asyncio.CancelledError): - for _ in range(_NUM_STREAM_RESPONSES): - yield request - await asyncio.sleep(test_constants.SHORT_TIMEOUT) - request_iterator_received_the_exception.set() - - call = self._stub.StreamingInputCall(request_iterator()) - - # Cancel the RPC after at least one response - async def cancel_later(): - await asyncio.sleep(test_constants.SHORT_TIMEOUT * 2) - call.cancel() - - cancel_later_task = self.loop.create_task(cancel_later()) - - # No exceptions here - with self.assertRaises(asyncio.CancelledError): - await call - - await request_iterator_received_the_exception.wait() - - # No failures in the cancel later task! - await cancel_later_task - - -# Prepares the request that stream in a ping-pong manner. -_STREAM_OUTPUT_REQUEST_ONE_RESPONSE = messages_pb2.StreamingOutputCallRequest() -_STREAM_OUTPUT_REQUEST_ONE_RESPONSE.response_parameters.append( - messages_pb2.ResponseParameters(size=_RESPONSE_PAYLOAD_SIZE)) - - -class TestStreamStreamCall(_MulticallableTestMixin, AioTestBase): - - async def test_cancel(self): - # Invokes the actual RPC - call = self._stub.FullDuplexCall() - - for _ in range(_NUM_STREAM_RESPONSES): - await call.write(_STREAM_OUTPUT_REQUEST_ONE_RESPONSE) - response = await call.read() - self.assertIsInstance(response, - messages_pb2.StreamingOutputCallResponse) - self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) - - # Cancels the RPC - self.assertFalse(call.done()) - self.assertFalse(call.cancelled()) - self.assertTrue(call.cancel()) - self.assertTrue(call.cancelled()) - self.assertEqual(grpc.StatusCode.CANCELLED, await call.code()) - - async def test_cancel_with_pending_read(self): - call = self._stub.FullDuplexCall() - - await call.write(_STREAM_OUTPUT_REQUEST_ONE_RESPONSE) - - # Cancels the RPC - self.assertFalse(call.done()) - self.assertFalse(call.cancelled()) - self.assertTrue(call.cancel()) - self.assertTrue(call.cancelled()) - self.assertEqual(grpc.StatusCode.CANCELLED, await call.code()) - - async def test_cancel_with_ongoing_read(self): - call = self._stub.FullDuplexCall() - coro_started = asyncio.Event() - - async def read_coro(): - coro_started.set() - await call.read() - - read_task = self.loop.create_task(read_coro()) - await coro_started.wait() - self.assertFalse(read_task.done()) - - # Cancels the RPC - self.assertFalse(call.done()) - self.assertFalse(call.cancelled()) - self.assertTrue(call.cancel()) - self.assertTrue(call.cancelled()) - self.assertEqual(grpc.StatusCode.CANCELLED, await call.code()) - - async def test_early_cancel(self): - call = self._stub.FullDuplexCall() - - # Cancels the RPC - self.assertFalse(call.done()) - self.assertFalse(call.cancelled()) - self.assertTrue(call.cancel()) - self.assertTrue(call.cancelled()) - self.assertEqual(grpc.StatusCode.CANCELLED, await call.code()) - - async def test_cancel_after_done_writing(self): - call = self._stub.FullDuplexCall() - await call.done_writing() - - # Cancels the RPC - self.assertFalse(call.done()) - self.assertFalse(call.cancelled()) - self.assertTrue(call.cancel()) - self.assertTrue(call.cancelled()) - self.assertEqual(grpc.StatusCode.CANCELLED, await call.code()) - - async def test_late_cancel(self): - call = self._stub.FullDuplexCall() - await call.done_writing() - self.assertEqual(grpc.StatusCode.OK, await call.code()) - - # Cancels the RPC - self.assertTrue(call.done()) - self.assertFalse(call.cancelled()) - self.assertFalse(call.cancel()) - self.assertFalse(call.cancelled()) - - # Status is still OK - self.assertEqual(grpc.StatusCode.OK, await call.code()) - - async def test_async_generator(self): - - async def request_generator(): - yield _STREAM_OUTPUT_REQUEST_ONE_RESPONSE - yield _STREAM_OUTPUT_REQUEST_ONE_RESPONSE - - call = self._stub.FullDuplexCall(request_generator()) - async for response in call: - self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) - - self.assertEqual(await call.code(), grpc.StatusCode.OK) - - async def test_too_many_reads(self): - - async def request_generator(): - for _ in range(_NUM_STREAM_RESPONSES): - yield _STREAM_OUTPUT_REQUEST_ONE_RESPONSE - - call = self._stub.FullDuplexCall(request_generator()) - for _ in range(_NUM_STREAM_RESPONSES): - response = await call.read() - self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) - self.assertIs(await call.read(), aio.EOF) - - self.assertEqual(await call.code(), grpc.StatusCode.OK) - # After the RPC finished, the read should also produce EOF - self.assertIs(await call.read(), aio.EOF) - - async def test_read_write_after_done_writing(self): - call = self._stub.FullDuplexCall() - - # Writes two requests, and pending two requests - await call.write(_STREAM_OUTPUT_REQUEST_ONE_RESPONSE) - await call.write(_STREAM_OUTPUT_REQUEST_ONE_RESPONSE) - await call.done_writing() - - # Further write should fail - with self.assertRaises(asyncio.InvalidStateError): - await call.write(_STREAM_OUTPUT_REQUEST_ONE_RESPONSE) - - # But read should be unaffected - response = await call.read() - self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) - response = await call.read() - self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) - - self.assertEqual(await call.code(), grpc.StatusCode.OK) - - async def test_error_in_async_generator(self): - # Server will pause between responses - request = messages_pb2.StreamingOutputCallRequest() - request.response_parameters.append( - messages_pb2.ResponseParameters( - size=_RESPONSE_PAYLOAD_SIZE, - interval_us=_RESPONSE_INTERVAL_US, - )) - - # We expect the request iterator to receive the exception - request_iterator_received_the_exception = asyncio.Event() - - async def request_iterator(): - with self.assertRaises(asyncio.CancelledError): - for _ in range(_NUM_STREAM_RESPONSES): - yield request - await asyncio.sleep(test_constants.SHORT_TIMEOUT) - request_iterator_received_the_exception.set() - - call = self._stub.FullDuplexCall(request_iterator()) - - # Cancel the RPC after at least one response - async def cancel_later(): - await asyncio.sleep(test_constants.SHORT_TIMEOUT * 2) - call.cancel() - - cancel_later_task = self.loop.create_task(cancel_later()) - - # No exceptions here - async for response in call: - self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) - - await request_iterator_received_the_exception.wait() - - self.assertEqual(grpc.StatusCode.CANCELLED, await call.code()) - # No failures in the cancel later task! - await cancel_later_task +# # No failures in the cancel later task! +# await cancel_later_task + +# # Prepares the request that stream in a ping-pong manner. +# _STREAM_OUTPUT_REQUEST_ONE_RESPONSE = messages_pb2.StreamingOutputCallRequest() +# _STREAM_OUTPUT_REQUEST_ONE_RESPONSE.response_parameters.append( +# messages_pb2.ResponseParameters(size=_RESPONSE_PAYLOAD_SIZE)) +# class TestStreamStreamCall(_MulticallableTestMixin, AioTestBase): + +# async def test_cancel(self): +# # Invokes the actual RPC +# call = self._stub.FullDuplexCall() + +# for _ in range(_NUM_STREAM_RESPONSES): +# await call.write(_STREAM_OUTPUT_REQUEST_ONE_RESPONSE) +# response = await call.read() +# self.assertIsInstance(response, +# messages_pb2.StreamingOutputCallResponse) +# self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) + +# # Cancels the RPC +# self.assertFalse(call.done()) +# self.assertFalse(call.cancelled()) +# self.assertTrue(call.cancel()) +# self.assertTrue(call.cancelled()) +# self.assertEqual(grpc.StatusCode.CANCELLED, await call.code()) + +# async def test_cancel_with_pending_read(self): +# call = self._stub.FullDuplexCall() + +# await call.write(_STREAM_OUTPUT_REQUEST_ONE_RESPONSE) + +# # Cancels the RPC +# self.assertFalse(call.done()) +# self.assertFalse(call.cancelled()) +# self.assertTrue(call.cancel()) +# self.assertTrue(call.cancelled()) +# self.assertEqual(grpc.StatusCode.CANCELLED, await call.code()) + +# async def test_cancel_with_ongoing_read(self): +# call = self._stub.FullDuplexCall() +# coro_started = asyncio.Event() + +# async def read_coro(): +# coro_started.set() +# await call.read() + +# read_task = self.loop.create_task(read_coro()) +# await coro_started.wait() +# self.assertFalse(read_task.done()) + +# # Cancels the RPC +# self.assertFalse(call.done()) +# self.assertFalse(call.cancelled()) +# self.assertTrue(call.cancel()) +# self.assertTrue(call.cancelled()) +# self.assertEqual(grpc.StatusCode.CANCELLED, await call.code()) + +# async def test_early_cancel(self): +# call = self._stub.FullDuplexCall() + +# # Cancels the RPC +# self.assertFalse(call.done()) +# self.assertFalse(call.cancelled()) +# self.assertTrue(call.cancel()) +# self.assertTrue(call.cancelled()) +# self.assertEqual(grpc.StatusCode.CANCELLED, await call.code()) + +# async def test_cancel_after_done_writing(self): +# call = self._stub.FullDuplexCall() +# await call.done_writing() + +# # Cancels the RPC +# self.assertFalse(call.done()) +# self.assertFalse(call.cancelled()) +# self.assertTrue(call.cancel()) +# self.assertTrue(call.cancelled()) +# self.assertEqual(grpc.StatusCode.CANCELLED, await call.code()) + +# async def test_late_cancel(self): +# call = self._stub.FullDuplexCall() +# await call.done_writing() +# self.assertEqual(grpc.StatusCode.OK, await call.code()) + +# # Cancels the RPC +# self.assertTrue(call.done()) +# self.assertFalse(call.cancelled()) +# self.assertFalse(call.cancel()) +# self.assertFalse(call.cancelled()) + +# # Status is still OK +# self.assertEqual(grpc.StatusCode.OK, await call.code()) + +# async def test_async_generator(self): + +# async def request_generator(): +# yield _STREAM_OUTPUT_REQUEST_ONE_RESPONSE +# yield _STREAM_OUTPUT_REQUEST_ONE_RESPONSE + +# call = self._stub.FullDuplexCall(request_generator()) +# async for response in call: +# self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) + +# self.assertEqual(await call.code(), grpc.StatusCode.OK) + +# async def test_too_many_reads(self): + +# async def request_generator(): +# for _ in range(_NUM_STREAM_RESPONSES): +# yield _STREAM_OUTPUT_REQUEST_ONE_RESPONSE + +# call = self._stub.FullDuplexCall(request_generator()) +# for _ in range(_NUM_STREAM_RESPONSES): +# response = await call.read() +# self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) +# self.assertIs(await call.read(), aio.EOF) + +# self.assertEqual(await call.code(), grpc.StatusCode.OK) +# # After the RPC finished, the read should also produce EOF +# self.assertIs(await call.read(), aio.EOF) + +# async def test_read_write_after_done_writing(self): +# call = self._stub.FullDuplexCall() + +# # Writes two requests, and pending two requests +# await call.write(_STREAM_OUTPUT_REQUEST_ONE_RESPONSE) +# await call.write(_STREAM_OUTPUT_REQUEST_ONE_RESPONSE) +# await call.done_writing() + +# # Further write should fail +# with self.assertRaises(asyncio.InvalidStateError): +# await call.write(_STREAM_OUTPUT_REQUEST_ONE_RESPONSE) + +# # But read should be unaffected +# response = await call.read() +# self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) +# response = await call.read() +# self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) + +# self.assertEqual(await call.code(), grpc.StatusCode.OK) + +# async def test_error_in_async_generator(self): +# # Server will pause between responses +# request = messages_pb2.StreamingOutputCallRequest() +# request.response_parameters.append( +# messages_pb2.ResponseParameters( +# size=_RESPONSE_PAYLOAD_SIZE, +# interval_us=_RESPONSE_INTERVAL_US, +# )) + +# # We expect the request iterator to receive the exception +# request_iterator_received_the_exception = asyncio.Event() + +# async def request_iterator(): +# with self.assertRaises(asyncio.CancelledError): +# for _ in range(_NUM_STREAM_RESPONSES): +# yield request +# await asyncio.sleep(test_constants.SHORT_TIMEOUT) +# request_iterator_received_the_exception.set() + +# call = self._stub.FullDuplexCall(request_iterator()) + +# # Cancel the RPC after at least one response +# async def cancel_later(): +# await asyncio.sleep(test_constants.SHORT_TIMEOUT * 2) +# call.cancel() + +# cancel_later_task = self.loop.create_task(cancel_later()) + +# # No exceptions here +# async for response in call: +# self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) + +# await request_iterator_received_the_exception.wait() + +# self.assertEqual(grpc.StatusCode.CANCELLED, await call.code()) +# # No failures in the cancel later task! +# await cancel_later_task if __name__ == '__main__': logging.basicConfig(level=logging.DEBUG) From 7b7c0ba5fc40085340ceb4070ac9f6a489e0213b Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Fri, 6 Mar 2020 16:15:13 -0800 Subject: [PATCH 095/758] Fix the SEGFAULT caused by initialization ordering --- .../grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi | 20 +- .../_cygrpc/aio/iomgr/resolver.pyx.pxi | 3 - .../grpcio_tests/tests_aio/unit/call_test.py | 1216 +++++++++-------- 3 files changed, 624 insertions(+), 615 deletions(-) diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi index fe36a4e63aa..27a37dfe053 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi @@ -54,15 +54,18 @@ def init_grpc_aio(): _grpc_aio_loop = asyncio.get_event_loop() _event_loop_thread_ident = threading.current_thread().ident - # TODO(https://github.com/grpc/grpc/issues/22244) we need a the - # grpc_shutdown_blocking() counterpart for this call. Otherwise, the gRPC - # library won't shutdown cleanly. - grpc_init() - if grpc_aio_engine is AsyncIOEngine.CUSTOM_IO_MANAGER: - # Activates asyncio IO manager + # Activates asyncio IO manager. + # NOTE(lidiz) Custom IO manager must be activated before the first + # `grpc_init()`. Otherwise, some special configurations in Core won't + # pick up the change, and resulted in SEGFAULT or ABORT. install_asyncio_iomgr() + # TODO(https://github.com/grpc/grpc/issues/22244) we need a the + # grpc_shutdown_blocking() counterpart for this call. Otherwise, the gRPC + # library won't shutdown cleanly. + grpc_init() + # Timers are triggered by the Asyncio loop. We disable # the background thread that is being used by the native # gRPC iomgr. @@ -71,6 +74,11 @@ def init_grpc_aio(): # gRPC callbaks are executed within the same thread used by the Asyncio # event loop, as it is being done by the other Asyncio callbacks. Executor.SetThreadingAll(False) + else: + # TODO(https://github.com/grpc/grpc/issues/22244) we need a the + # grpc_shutdown_blocking() counterpart for this call. Otherwise, the gRPC + # library won't shutdown cleanly. + grpc_init() _grpc_aio_initialized = False diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/iomgr/resolver.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/iomgr/resolver.pyx.pxi index 7897368bc83..7d47fa77b00 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/iomgr/resolver.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/iomgr/resolver.pyx.pxi @@ -32,9 +32,7 @@ cdef class _AsyncioResolver: async def _async_resolve(self, bytes host, bytes port): self._task_resolve = None try: - _LOGGER.debug('_AsyncioResolver before') resolved = await grpc_aio_loop().getaddrinfo(host, port) - _LOGGER.debug('_AsyncioResolver after') except Exception as e: grpc_custom_resolve_callback( self._grpc_resolver, @@ -52,7 +50,6 @@ cdef class _AsyncioResolver: cdef void resolve(self, char* host, char* port): assert not self._task_resolve - _LOGGER.debug('_AsyncioResolver resolve') self._task_resolve = grpc_aio_loop().create_task( self._async_resolve(host, port) ) diff --git a/src/python/grpcio_tests/tests_aio/unit/call_test.py b/src/python/grpcio_tests/tests_aio/unit/call_test.py index a9ff5f5dca8..e47c00a62ab 100644 --- a/src/python/grpcio_tests/tests_aio/unit/call_test.py +++ b/src/python/grpcio_tests/tests_aio/unit/call_test.py @@ -49,32 +49,32 @@ class _MulticallableTestMixin(): class TestUnaryUnaryCall(_MulticallableTestMixin, AioTestBase): - # async def test_call_to_string(self): - # call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) + async def test_call_to_string(self): + call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) - # self.assertTrue(str(call) is not None) - # self.assertTrue(repr(call) is not None) + self.assertTrue(str(call) is not None) + self.assertTrue(repr(call) is not None) - # response = await call + response = await call - # self.assertTrue(str(call) is not None) - # self.assertTrue(repr(call) is not None) + self.assertTrue(str(call) is not None) + self.assertTrue(repr(call) is not None) - # async def test_call_ok(self): - # call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) + async def test_call_ok(self): + call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) - # self.assertFalse(call.done()) + self.assertFalse(call.done()) - # response = await call + response = await call - # self.assertTrue(call.done()) - # self.assertIsInstance(response, messages_pb2.SimpleResponse) - # self.assertEqual(await call.code(), grpc.StatusCode.OK) + self.assertTrue(call.done()) + self.assertIsInstance(response, messages_pb2.SimpleResponse) + self.assertEqual(await call.code(), grpc.StatusCode.OK) - # # Response is cached at call object level, reentrance - # # returns again the same response - # response_retry = await call - # self.assertIs(response, response_retry) + # Response is cached at call object level, reentrance + # returns again the same response + response_retry = await call + self.assertIs(response, response_retry) async def test_call_rpc_error(self): async with aio.insecure_channel(_UNREACHABLE_TARGET) as channel: @@ -91,664 +91,668 @@ class TestUnaryUnaryCall(_MulticallableTestMixin, AioTestBase): self.assertTrue(call.done()) self.assertEqual(grpc.StatusCode.UNAVAILABLE, await call.code()) + async def test_call_code_awaitable(self): + call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) + self.assertEqual(await call.code(), grpc.StatusCode.OK) -# async def test_call_code_awaitable(self): -# call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) -# self.assertEqual(await call.code(), grpc.StatusCode.OK) + async def test_call_details_awaitable(self): + call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) + self.assertEqual('', await call.details()) -# async def test_call_details_awaitable(self): -# call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) -# self.assertEqual('', await call.details()) + async def test_call_initial_metadata_awaitable(self): + call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) + self.assertEqual((), await call.initial_metadata()) -# async def test_call_initial_metadata_awaitable(self): -# call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) -# self.assertEqual((), await call.initial_metadata()) + async def test_call_trailing_metadata_awaitable(self): + call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) + self.assertEqual((), await call.trailing_metadata()) -# async def test_call_trailing_metadata_awaitable(self): -# call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) -# self.assertEqual((), await call.trailing_metadata()) + async def test_call_initial_metadata_cancelable(self): + coro_started = asyncio.Event() + call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) -# async def test_call_initial_metadata_cancelable(self): -# coro_started = asyncio.Event() -# call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) + async def coro(): + coro_started.set() + await call.initial_metadata() -# async def coro(): -# coro_started.set() -# await call.initial_metadata() + task = self.loop.create_task(coro()) + await coro_started.wait() + task.cancel() -# task = self.loop.create_task(coro()) -# await coro_started.wait() -# task.cancel() + # Test that initial metadata can still be asked thought + # a cancellation happened with the previous task + self.assertEqual((), await call.initial_metadata()) -# # Test that initial metadata can still be asked thought -# # a cancellation happened with the previous task -# self.assertEqual((), await call.initial_metadata()) + async def test_call_initial_metadata_multiple_waiters(self): + call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) -# async def test_call_initial_metadata_multiple_waiters(self): -# call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) + async def coro(): + return await call.initial_metadata() -# async def coro(): -# return await call.initial_metadata() + task1 = self.loop.create_task(coro()) + task2 = self.loop.create_task(coro()) -# task1 = self.loop.create_task(coro()) -# task2 = self.loop.create_task(coro()) + await call -# await call + self.assertEqual([(), ()], await asyncio.gather(*[task1, task2])) -# self.assertEqual([(), ()], await asyncio.gather(*[task1, task2])) + async def test_call_code_cancelable(self): + coro_started = asyncio.Event() + call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) -# async def test_call_code_cancelable(self): -# coro_started = asyncio.Event() -# call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) + async def coro(): + coro_started.set() + await call.code() -# async def coro(): -# coro_started.set() -# await call.code() + task = self.loop.create_task(coro()) + await coro_started.wait() + task.cancel() -# task = self.loop.create_task(coro()) -# await coro_started.wait() -# task.cancel() + # Test that code can still be asked thought + # a cancellation happened with the previous task + self.assertEqual(grpc.StatusCode.OK, await call.code()) -# # Test that code can still be asked thought -# # a cancellation happened with the previous task -# self.assertEqual(grpc.StatusCode.OK, await call.code()) + async def test_call_code_multiple_waiters(self): + call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) -# async def test_call_code_multiple_waiters(self): -# call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) + async def coro(): + return await call.code() -# async def coro(): -# return await call.code() + task1 = self.loop.create_task(coro()) + task2 = self.loop.create_task(coro()) -# task1 = self.loop.create_task(coro()) -# task2 = self.loop.create_task(coro()) + await call -# await call + self.assertEqual([grpc.StatusCode.OK, grpc.StatusCode.OK], await + asyncio.gather(task1, task2)) -# self.assertEqual([grpc.StatusCode.OK, grpc.StatusCode.OK], await -# asyncio.gather(task1, task2)) + async def test_cancel_unary_unary(self): + call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) -# async def test_cancel_unary_unary(self): -# call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) + self.assertFalse(call.cancelled()) -# self.assertFalse(call.cancelled()) + self.assertTrue(call.cancel()) + self.assertFalse(call.cancel()) -# self.assertTrue(call.cancel()) -# self.assertFalse(call.cancel()) + with self.assertRaises(asyncio.CancelledError): + await call -# with self.assertRaises(asyncio.CancelledError): -# await call + # The info in the RpcError should match the info in Call object. + self.assertTrue(call.cancelled()) + self.assertEqual(await call.code(), grpc.StatusCode.CANCELLED) + self.assertEqual(await call.details(), + 'Locally cancelled by application!') -# # The info in the RpcError should match the info in Call object. -# self.assertTrue(call.cancelled()) -# self.assertEqual(await call.code(), grpc.StatusCode.CANCELLED) -# self.assertEqual(await call.details(), -# 'Locally cancelled by application!') + async def test_cancel_unary_unary_in_task(self): + coro_started = asyncio.Event() + call = self._stub.EmptyCall(messages_pb2.SimpleRequest()) -# async def test_cancel_unary_unary_in_task(self): -# coro_started = asyncio.Event() -# call = self._stub.EmptyCall(messages_pb2.SimpleRequest()) + async def another_coro(): + coro_started.set() + await call -# async def another_coro(): -# coro_started.set() -# await call + task = self.loop.create_task(another_coro()) + await coro_started.wait() -# task = self.loop.create_task(another_coro()) -# await coro_started.wait() + self.assertFalse(task.done()) + task.cancel() -# self.assertFalse(task.done()) -# task.cancel() + self.assertEqual(grpc.StatusCode.CANCELLED, await call.code()) -# self.assertEqual(grpc.StatusCode.CANCELLED, await call.code()) + with self.assertRaises(asyncio.CancelledError): + await task -# with self.assertRaises(asyncio.CancelledError): -# await task -# class TestUnaryStreamCall(_MulticallableTestMixin, AioTestBase): +class TestUnaryStreamCall(_MulticallableTestMixin, AioTestBase): -# async def test_cancel_unary_stream(self): -# # Prepares the request -# request = messages_pb2.StreamingOutputCallRequest() -# for _ in range(_NUM_STREAM_RESPONSES): -# request.response_parameters.append( -# messages_pb2.ResponseParameters( -# size=_RESPONSE_PAYLOAD_SIZE, -# interval_us=_RESPONSE_INTERVAL_US, -# )) - -# # Invokes the actual RPC -# call = self._stub.StreamingOutputCall(request) -# self.assertFalse(call.cancelled()) - -# response = await call.read() -# self.assertIs(type(response), messages_pb2.StreamingOutputCallResponse) -# self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) - -# self.assertTrue(call.cancel()) -# self.assertEqual(grpc.StatusCode.CANCELLED, await call.code()) -# self.assertEqual(_LOCAL_CANCEL_DETAILS_EXPECTATION, await -# call.details()) -# self.assertFalse(call.cancel()) - -# with self.assertRaises(asyncio.CancelledError): -# await call.read() -# self.assertTrue(call.cancelled()) - -# async def test_multiple_cancel_unary_stream(self): -# # Prepares the request -# request = messages_pb2.StreamingOutputCallRequest() -# for _ in range(_NUM_STREAM_RESPONSES): -# request.response_parameters.append( -# messages_pb2.ResponseParameters( -# size=_RESPONSE_PAYLOAD_SIZE, -# interval_us=_RESPONSE_INTERVAL_US, -# )) - -# # Invokes the actual RPC -# call = self._stub.StreamingOutputCall(request) -# self.assertFalse(call.cancelled()) - -# response = await call.read() -# self.assertIs(type(response), messages_pb2.StreamingOutputCallResponse) -# self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) - -# self.assertTrue(call.cancel()) -# self.assertFalse(call.cancel()) -# self.assertFalse(call.cancel()) -# self.assertFalse(call.cancel()) - -# with self.assertRaises(asyncio.CancelledError): -# await call.read() - -# async def test_early_cancel_unary_stream(self): -# """Test cancellation before receiving messages.""" -# # Prepares the request -# request = messages_pb2.StreamingOutputCallRequest() -# for _ in range(_NUM_STREAM_RESPONSES): -# request.response_parameters.append( -# messages_pb2.ResponseParameters( -# size=_RESPONSE_PAYLOAD_SIZE, -# interval_us=_RESPONSE_INTERVAL_US, -# )) - -# # Invokes the actual RPC -# call = self._stub.StreamingOutputCall(request) - -# self.assertFalse(call.cancelled()) -# self.assertTrue(call.cancel()) -# self.assertFalse(call.cancel()) - -# with self.assertRaises(asyncio.CancelledError): -# await call.read() - -# self.assertTrue(call.cancelled()) - -# self.assertEqual(grpc.StatusCode.CANCELLED, await call.code()) -# self.assertEqual(_LOCAL_CANCEL_DETAILS_EXPECTATION, await -# call.details()) - -# async def test_late_cancel_unary_stream(self): -# """Test cancellation after received all messages.""" -# # Prepares the request -# request = messages_pb2.StreamingOutputCallRequest() -# for _ in range(_NUM_STREAM_RESPONSES): -# request.response_parameters.append( -# messages_pb2.ResponseParameters(size=_RESPONSE_PAYLOAD_SIZE,)) - -# # Invokes the actual RPC -# call = self._stub.StreamingOutputCall(request) - -# for _ in range(_NUM_STREAM_RESPONSES): -# response = await call.read() -# self.assertIs(type(response), -# messages_pb2.StreamingOutputCallResponse) -# self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) - -# # After all messages received, it is possible that the final state -# # is received or on its way. It's basically a data race, so our -# # expectation here is do not crash :) -# call.cancel() -# self.assertIn(await call.code(), -# [grpc.StatusCode.OK, grpc.StatusCode.CANCELLED]) - -# async def test_too_many_reads_unary_stream(self): -# """Test calling read after received all messages fails.""" -# # Prepares the request -# request = messages_pb2.StreamingOutputCallRequest() -# for _ in range(_NUM_STREAM_RESPONSES): -# request.response_parameters.append( -# messages_pb2.ResponseParameters(size=_RESPONSE_PAYLOAD_SIZE,)) - -# # Invokes the actual RPC -# call = self._stub.StreamingOutputCall(request) - -# for _ in range(_NUM_STREAM_RESPONSES): -# response = await call.read() -# self.assertIs(type(response), -# messages_pb2.StreamingOutputCallResponse) -# self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) -# self.assertIs(await call.read(), aio.EOF) - -# # After the RPC is finished, further reads will lead to exception. -# self.assertEqual(await call.code(), grpc.StatusCode.OK) -# self.assertIs(await call.read(), aio.EOF) - -# async def test_unary_stream_async_generator(self): -# """Sunny day test case for unary_stream.""" -# # Prepares the request -# request = messages_pb2.StreamingOutputCallRequest() -# for _ in range(_NUM_STREAM_RESPONSES): -# request.response_parameters.append( -# messages_pb2.ResponseParameters(size=_RESPONSE_PAYLOAD_SIZE,)) - -# # Invokes the actual RPC -# call = self._stub.StreamingOutputCall(request) -# self.assertFalse(call.cancelled()) - -# async for response in call: -# self.assertIs(type(response), -# messages_pb2.StreamingOutputCallResponse) -# self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) - -# self.assertEqual(await call.code(), grpc.StatusCode.OK) - -# async def test_cancel_unary_stream_in_task_using_read(self): -# coro_started = asyncio.Event() - -# # Configs the server method to block forever -# request = messages_pb2.StreamingOutputCallRequest() -# request.response_parameters.append( -# messages_pb2.ResponseParameters( -# size=_RESPONSE_PAYLOAD_SIZE, -# interval_us=_INFINITE_INTERVAL_US, -# )) - -# # Invokes the actual RPC -# call = self._stub.StreamingOutputCall(request) - -# async def another_coro(): -# coro_started.set() -# await call.read() - -# task = self.loop.create_task(another_coro()) -# await coro_started.wait() - -# self.assertFalse(task.done()) -# task.cancel() - -# self.assertEqual(grpc.StatusCode.CANCELLED, await call.code()) - -# with self.assertRaises(asyncio.CancelledError): -# await task - -# async def test_cancel_unary_stream_in_task_using_async_for(self): -# coro_started = asyncio.Event() - -# # Configs the server method to block forever -# request = messages_pb2.StreamingOutputCallRequest() -# request.response_parameters.append( -# messages_pb2.ResponseParameters( -# size=_RESPONSE_PAYLOAD_SIZE, -# interval_us=_INFINITE_INTERVAL_US, -# )) - -# # Invokes the actual RPC -# call = self._stub.StreamingOutputCall(request) - -# async def another_coro(): -# coro_started.set() -# async for _ in call: -# pass - -# task = self.loop.create_task(another_coro()) -# await coro_started.wait() - -# self.assertFalse(task.done()) -# task.cancel() - -# self.assertEqual(grpc.StatusCode.CANCELLED, await call.code()) - -# with self.assertRaises(asyncio.CancelledError): -# await task + async def test_cancel_unary_stream(self): + # Prepares the request + request = messages_pb2.StreamingOutputCallRequest() + for _ in range(_NUM_STREAM_RESPONSES): + request.response_parameters.append( + messages_pb2.ResponseParameters( + size=_RESPONSE_PAYLOAD_SIZE, + interval_us=_RESPONSE_INTERVAL_US, + )) -# def test_call_credentials(self): + # Invokes the actual RPC + call = self._stub.StreamingOutputCall(request) + self.assertFalse(call.cancelled()) -# class DummyAuth(grpc.AuthMetadataPlugin): + response = await call.read() + self.assertIs(type(response), messages_pb2.StreamingOutputCallResponse) + self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) -# def __call__(self, context, callback): -# signature = context.method_name[::-1] -# callback((("test", signature),), None) + self.assertTrue(call.cancel()) + self.assertEqual(grpc.StatusCode.CANCELLED, await call.code()) + self.assertEqual(_LOCAL_CANCEL_DETAILS_EXPECTATION, await + call.details()) + self.assertFalse(call.cancel()) + + with self.assertRaises(asyncio.CancelledError): + await call.read() + self.assertTrue(call.cancelled()) + + async def test_multiple_cancel_unary_stream(self): + # Prepares the request + request = messages_pb2.StreamingOutputCallRequest() + for _ in range(_NUM_STREAM_RESPONSES): + request.response_parameters.append( + messages_pb2.ResponseParameters( + size=_RESPONSE_PAYLOAD_SIZE, + interval_us=_RESPONSE_INTERVAL_US, + )) + + # Invokes the actual RPC + call = self._stub.StreamingOutputCall(request) + self.assertFalse(call.cancelled()) + + response = await call.read() + self.assertIs(type(response), messages_pb2.StreamingOutputCallResponse) + self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) + + self.assertTrue(call.cancel()) + self.assertFalse(call.cancel()) + self.assertFalse(call.cancel()) + self.assertFalse(call.cancel()) + + with self.assertRaises(asyncio.CancelledError): + await call.read() + + async def test_early_cancel_unary_stream(self): + """Test cancellation before receiving messages.""" + # Prepares the request + request = messages_pb2.StreamingOutputCallRequest() + for _ in range(_NUM_STREAM_RESPONSES): + request.response_parameters.append( + messages_pb2.ResponseParameters( + size=_RESPONSE_PAYLOAD_SIZE, + interval_us=_RESPONSE_INTERVAL_US, + )) + + # Invokes the actual RPC + call = self._stub.StreamingOutputCall(request) + + self.assertFalse(call.cancelled()) + self.assertTrue(call.cancel()) + self.assertFalse(call.cancel()) + + with self.assertRaises(asyncio.CancelledError): + await call.read() + + self.assertTrue(call.cancelled()) + + self.assertEqual(grpc.StatusCode.CANCELLED, await call.code()) + self.assertEqual(_LOCAL_CANCEL_DETAILS_EXPECTATION, await + call.details()) + + async def test_late_cancel_unary_stream(self): + """Test cancellation after received all messages.""" + # Prepares the request + request = messages_pb2.StreamingOutputCallRequest() + for _ in range(_NUM_STREAM_RESPONSES): + request.response_parameters.append( + messages_pb2.ResponseParameters(size=_RESPONSE_PAYLOAD_SIZE,)) + + # Invokes the actual RPC + call = self._stub.StreamingOutputCall(request) + + for _ in range(_NUM_STREAM_RESPONSES): + response = await call.read() + self.assertIs(type(response), + messages_pb2.StreamingOutputCallResponse) + self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) + + # After all messages received, it is possible that the final state + # is received or on its way. It's basically a data race, so our + # expectation here is do not crash :) + call.cancel() + self.assertIn(await call.code(), + [grpc.StatusCode.OK, grpc.StatusCode.CANCELLED]) + + async def test_too_many_reads_unary_stream(self): + """Test calling read after received all messages fails.""" + # Prepares the request + request = messages_pb2.StreamingOutputCallRequest() + for _ in range(_NUM_STREAM_RESPONSES): + request.response_parameters.append( + messages_pb2.ResponseParameters(size=_RESPONSE_PAYLOAD_SIZE,)) + + # Invokes the actual RPC + call = self._stub.StreamingOutputCall(request) + + for _ in range(_NUM_STREAM_RESPONSES): + response = await call.read() + self.assertIs(type(response), + messages_pb2.StreamingOutputCallResponse) + self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) + self.assertIs(await call.read(), aio.EOF) + + # After the RPC is finished, further reads will lead to exception. + self.assertEqual(await call.code(), grpc.StatusCode.OK) + self.assertIs(await call.read(), aio.EOF) + + async def test_unary_stream_async_generator(self): + """Sunny day test case for unary_stream.""" + # Prepares the request + request = messages_pb2.StreamingOutputCallRequest() + for _ in range(_NUM_STREAM_RESPONSES): + request.response_parameters.append( + messages_pb2.ResponseParameters(size=_RESPONSE_PAYLOAD_SIZE,)) + + # Invokes the actual RPC + call = self._stub.StreamingOutputCall(request) + self.assertFalse(call.cancelled()) + + async for response in call: + self.assertIs(type(response), + messages_pb2.StreamingOutputCallResponse) + self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) + + self.assertEqual(await call.code(), grpc.StatusCode.OK) + + async def test_cancel_unary_stream_in_task_using_read(self): + coro_started = asyncio.Event() + + # Configs the server method to block forever + request = messages_pb2.StreamingOutputCallRequest() + request.response_parameters.append( + messages_pb2.ResponseParameters( + size=_RESPONSE_PAYLOAD_SIZE, + interval_us=_INFINITE_INTERVAL_US, + )) + + # Invokes the actual RPC + call = self._stub.StreamingOutputCall(request) + + async def another_coro(): + coro_started.set() + await call.read() + + task = self.loop.create_task(another_coro()) + await coro_started.wait() + + self.assertFalse(task.done()) + task.cancel() + + self.assertEqual(grpc.StatusCode.CANCELLED, await call.code()) + + with self.assertRaises(asyncio.CancelledError): + await task + + async def test_cancel_unary_stream_in_task_using_async_for(self): + coro_started = asyncio.Event() + + # Configs the server method to block forever + request = messages_pb2.StreamingOutputCallRequest() + request.response_parameters.append( + messages_pb2.ResponseParameters( + size=_RESPONSE_PAYLOAD_SIZE, + interval_us=_INFINITE_INTERVAL_US, + )) + + # Invokes the actual RPC + call = self._stub.StreamingOutputCall(request) + + async def another_coro(): + coro_started.set() + async for _ in call: + pass + + task = self.loop.create_task(another_coro()) + await coro_started.wait() + + self.assertFalse(task.done()) + task.cancel() + + self.assertEqual(grpc.StatusCode.CANCELLED, await call.code()) -# async def coro(): -# server_target, _ = await start_test_server(secure=False) # pylint: disable=unused-variable + with self.assertRaises(asyncio.CancelledError): + await task -# async with aio.insecure_channel(server_target) as channel: -# hi = channel.unary_unary('/grpc.testing.TestService/UnaryCall', -# request_serializer=messages_pb2. -# SimpleRequest.SerializeToString, -# response_deserializer=messages_pb2. -# SimpleResponse.FromString) -# call_credentials = grpc.metadata_call_credentials(DummyAuth()) -# call = hi(messages_pb2.SimpleRequest(), -# credentials=call_credentials) -# response = await call + def test_call_credentials(self): -# self.assertIsInstance(response, messages_pb2.SimpleResponse) -# self.assertEqual(await call.code(), grpc.StatusCode.OK) + class DummyAuth(grpc.AuthMetadataPlugin): -# self.loop.run_until_complete(coro()) + def __call__(self, context, callback): + signature = context.method_name[::-1] + callback((("test", signature),), None) -# async def test_time_remaining(self): -# request = messages_pb2.StreamingOutputCallRequest() -# # First message comes back immediately -# request.response_parameters.append( -# messages_pb2.ResponseParameters(size=_RESPONSE_PAYLOAD_SIZE,)) -# # Second message comes back after a unit of wait time -# request.response_parameters.append( -# messages_pb2.ResponseParameters( -# size=_RESPONSE_PAYLOAD_SIZE, -# interval_us=_RESPONSE_INTERVAL_US, -# )) + async def coro(): + server_target, _ = await start_test_server(secure=False) # pylint: disable=unused-variable -# call = self._stub.StreamingOutputCall( -# request, timeout=test_constants.SHORT_TIMEOUT * 2) + async with aio.insecure_channel(server_target) as channel: + hi = channel.unary_unary('/grpc.testing.TestService/UnaryCall', + request_serializer=messages_pb2. + SimpleRequest.SerializeToString, + response_deserializer=messages_pb2. + SimpleResponse.FromString) + call_credentials = grpc.metadata_call_credentials(DummyAuth()) + call = hi(messages_pb2.SimpleRequest(), + credentials=call_credentials) + response = await call -# response = await call.read() -# self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) + self.assertIsInstance(response, messages_pb2.SimpleResponse) + self.assertEqual(await call.code(), grpc.StatusCode.OK) -# # Should be around the same as the timeout -# remained_time = call.time_remaining() -# self.assertGreater(remained_time, test_constants.SHORT_TIMEOUT * 3 // 2) -# self.assertLess(remained_time, test_constants.SHORT_TIMEOUT * 2) + self.loop.run_until_complete(coro()) -# response = await call.read() -# self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) + async def test_time_remaining(self): + request = messages_pb2.StreamingOutputCallRequest() + # First message comes back immediately + request.response_parameters.append( + messages_pb2.ResponseParameters(size=_RESPONSE_PAYLOAD_SIZE,)) + # Second message comes back after a unit of wait time + request.response_parameters.append( + messages_pb2.ResponseParameters( + size=_RESPONSE_PAYLOAD_SIZE, + interval_us=_RESPONSE_INTERVAL_US, + )) -# # Should be around the timeout minus a unit of wait time -# remained_time = call.time_remaining() -# self.assertGreater(remained_time, test_constants.SHORT_TIMEOUT // 2) -# self.assertLess(remained_time, test_constants.SHORT_TIMEOUT * 3 // 2) + call = self._stub.StreamingOutputCall( + request, timeout=test_constants.SHORT_TIMEOUT * 2) -# self.assertEqual(grpc.StatusCode.OK, await call.code()) + response = await call.read() + self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) -# class TestStreamUnaryCall(_MulticallableTestMixin, AioTestBase): + # Should be around the same as the timeout + remained_time = call.time_remaining() + self.assertGreater(remained_time, test_constants.SHORT_TIMEOUT * 3 // 2) + self.assertLess(remained_time, test_constants.SHORT_TIMEOUT * 2) -# async def test_cancel_stream_unary(self): -# call = self._stub.StreamingInputCall() + response = await call.read() + self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) -# # Prepares the request -# payload = messages_pb2.Payload(body=b'\0' * _REQUEST_PAYLOAD_SIZE) -# request = messages_pb2.StreamingInputCallRequest(payload=payload) + # Should be around the timeout minus a unit of wait time + remained_time = call.time_remaining() + self.assertGreater(remained_time, test_constants.SHORT_TIMEOUT // 2) + self.assertLess(remained_time, test_constants.SHORT_TIMEOUT * 3 // 2) -# # Sends out requests -# for _ in range(_NUM_STREAM_RESPONSES): -# await call.write(request) + self.assertEqual(grpc.StatusCode.OK, await call.code()) -# # Cancels the RPC -# self.assertFalse(call.done()) -# self.assertFalse(call.cancelled()) -# self.assertTrue(call.cancel()) -# self.assertTrue(call.cancelled()) -# await call.done_writing() +class TestStreamUnaryCall(_MulticallableTestMixin, AioTestBase): -# with self.assertRaises(asyncio.CancelledError): -# await call + async def test_cancel_stream_unary(self): + call = self._stub.StreamingInputCall() -# async def test_early_cancel_stream_unary(self): -# call = self._stub.StreamingInputCall() + # Prepares the request + payload = messages_pb2.Payload(body=b'\0' * _REQUEST_PAYLOAD_SIZE) + request = messages_pb2.StreamingInputCallRequest(payload=payload) -# # Cancels the RPC -# self.assertFalse(call.done()) -# self.assertFalse(call.cancelled()) -# self.assertTrue(call.cancel()) -# self.assertTrue(call.cancelled()) + # Sends out requests + for _ in range(_NUM_STREAM_RESPONSES): + await call.write(request) -# with self.assertRaises(asyncio.InvalidStateError): -# await call.write(messages_pb2.StreamingInputCallRequest()) + # Cancels the RPC + self.assertFalse(call.done()) + self.assertFalse(call.cancelled()) + self.assertTrue(call.cancel()) + self.assertTrue(call.cancelled()) -# # Should be no-op -# await call.done_writing() + await call.done_writing() -# with self.assertRaises(asyncio.CancelledError): -# await call + with self.assertRaises(asyncio.CancelledError): + await call -# async def test_write_after_done_writing(self): -# call = self._stub.StreamingInputCall() - -# # Prepares the request -# payload = messages_pb2.Payload(body=b'\0' * _REQUEST_PAYLOAD_SIZE) -# request = messages_pb2.StreamingInputCallRequest(payload=payload) - -# # Sends out requests -# for _ in range(_NUM_STREAM_RESPONSES): -# await call.write(request) - -# # Should be no-op -# await call.done_writing() - -# with self.assertRaises(asyncio.InvalidStateError): -# await call.write(messages_pb2.StreamingInputCallRequest()) + async def test_early_cancel_stream_unary(self): + call = self._stub.StreamingInputCall() -# response = await call -# self.assertIsInstance(response, messages_pb2.StreamingInputCallResponse) -# self.assertEqual(_NUM_STREAM_RESPONSES * _REQUEST_PAYLOAD_SIZE, -# response.aggregated_payload_size) + # Cancels the RPC + self.assertFalse(call.done()) + self.assertFalse(call.cancelled()) + self.assertTrue(call.cancel()) + self.assertTrue(call.cancelled()) -# self.assertEqual(await call.code(), grpc.StatusCode.OK) - -# async def test_error_in_async_generator(self): -# # Server will pause between responses -# request = messages_pb2.StreamingOutputCallRequest() -# request.response_parameters.append( -# messages_pb2.ResponseParameters( -# size=_RESPONSE_PAYLOAD_SIZE, -# interval_us=_RESPONSE_INTERVAL_US, -# )) + with self.assertRaises(asyncio.InvalidStateError): + await call.write(messages_pb2.StreamingInputCallRequest()) -# # We expect the request iterator to receive the exception -# request_iterator_received_the_exception = asyncio.Event() + # Should be no-op + await call.done_writing() -# async def request_iterator(): -# with self.assertRaises(asyncio.CancelledError): -# for _ in range(_NUM_STREAM_RESPONSES): -# yield request -# await asyncio.sleep(test_constants.SHORT_TIMEOUT) -# request_iterator_received_the_exception.set() + with self.assertRaises(asyncio.CancelledError): + await call -# call = self._stub.StreamingInputCall(request_iterator()) - -# # Cancel the RPC after at least one response -# async def cancel_later(): -# await asyncio.sleep(test_constants.SHORT_TIMEOUT * 2) -# call.cancel() - -# cancel_later_task = self.loop.create_task(cancel_later()) - -# # No exceptions here -# with self.assertRaises(asyncio.CancelledError): -# await call + async def test_write_after_done_writing(self): + call = self._stub.StreamingInputCall() -# await request_iterator_received_the_exception.wait() + # Prepares the request + payload = messages_pb2.Payload(body=b'\0' * _REQUEST_PAYLOAD_SIZE) + request = messages_pb2.StreamingInputCallRequest(payload=payload) -# # No failures in the cancel later task! -# await cancel_later_task - -# # Prepares the request that stream in a ping-pong manner. -# _STREAM_OUTPUT_REQUEST_ONE_RESPONSE = messages_pb2.StreamingOutputCallRequest() -# _STREAM_OUTPUT_REQUEST_ONE_RESPONSE.response_parameters.append( -# messages_pb2.ResponseParameters(size=_RESPONSE_PAYLOAD_SIZE)) + # Sends out requests + for _ in range(_NUM_STREAM_RESPONSES): + await call.write(request) + + # Should be no-op + await call.done_writing() + + with self.assertRaises(asyncio.InvalidStateError): + await call.write(messages_pb2.StreamingInputCallRequest()) + + response = await call + self.assertIsInstance(response, messages_pb2.StreamingInputCallResponse) + self.assertEqual(_NUM_STREAM_RESPONSES * _REQUEST_PAYLOAD_SIZE, + response.aggregated_payload_size) + + self.assertEqual(await call.code(), grpc.StatusCode.OK) + + async def test_error_in_async_generator(self): + # Server will pause between responses + request = messages_pb2.StreamingOutputCallRequest() + request.response_parameters.append( + messages_pb2.ResponseParameters( + size=_RESPONSE_PAYLOAD_SIZE, + interval_us=_RESPONSE_INTERVAL_US, + )) + + # We expect the request iterator to receive the exception + request_iterator_received_the_exception = asyncio.Event() + + async def request_iterator(): + with self.assertRaises(asyncio.CancelledError): + for _ in range(_NUM_STREAM_RESPONSES): + yield request + await asyncio.sleep(test_constants.SHORT_TIMEOUT) + request_iterator_received_the_exception.set() + + call = self._stub.StreamingInputCall(request_iterator()) + + # Cancel the RPC after at least one response + async def cancel_later(): + await asyncio.sleep(test_constants.SHORT_TIMEOUT * 2) + call.cancel() + + cancel_later_task = self.loop.create_task(cancel_later()) + + # No exceptions here + with self.assertRaises(asyncio.CancelledError): + await call + + await request_iterator_received_the_exception.wait() + + # No failures in the cancel later task! + await cancel_later_task + + +# Prepares the request that stream in a ping-pong manner. +_STREAM_OUTPUT_REQUEST_ONE_RESPONSE = messages_pb2.StreamingOutputCallRequest() +_STREAM_OUTPUT_REQUEST_ONE_RESPONSE.response_parameters.append( + messages_pb2.ResponseParameters(size=_RESPONSE_PAYLOAD_SIZE)) + + +class TestStreamStreamCall(_MulticallableTestMixin, AioTestBase): + + async def test_cancel(self): + # Invokes the actual RPC + call = self._stub.FullDuplexCall() + + for _ in range(_NUM_STREAM_RESPONSES): + await call.write(_STREAM_OUTPUT_REQUEST_ONE_RESPONSE) + response = await call.read() + self.assertIsInstance(response, + messages_pb2.StreamingOutputCallResponse) + self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) + + # Cancels the RPC + self.assertFalse(call.done()) + self.assertFalse(call.cancelled()) + self.assertTrue(call.cancel()) + self.assertTrue(call.cancelled()) + self.assertEqual(grpc.StatusCode.CANCELLED, await call.code()) + + async def test_cancel_with_pending_read(self): + call = self._stub.FullDuplexCall() + + await call.write(_STREAM_OUTPUT_REQUEST_ONE_RESPONSE) + + # Cancels the RPC + self.assertFalse(call.done()) + self.assertFalse(call.cancelled()) + self.assertTrue(call.cancel()) + self.assertTrue(call.cancelled()) + self.assertEqual(grpc.StatusCode.CANCELLED, await call.code()) + + async def test_cancel_with_ongoing_read(self): + call = self._stub.FullDuplexCall() + coro_started = asyncio.Event() + + async def read_coro(): + coro_started.set() + await call.read() + + read_task = self.loop.create_task(read_coro()) + await coro_started.wait() + self.assertFalse(read_task.done()) + + # Cancels the RPC + self.assertFalse(call.done()) + self.assertFalse(call.cancelled()) + self.assertTrue(call.cancel()) + self.assertTrue(call.cancelled()) + self.assertEqual(grpc.StatusCode.CANCELLED, await call.code()) + + async def test_early_cancel(self): + call = self._stub.FullDuplexCall() + + # Cancels the RPC + self.assertFalse(call.done()) + self.assertFalse(call.cancelled()) + self.assertTrue(call.cancel()) + self.assertTrue(call.cancelled()) + self.assertEqual(grpc.StatusCode.CANCELLED, await call.code()) + + async def test_cancel_after_done_writing(self): + call = self._stub.FullDuplexCall() + await call.done_writing() + + # Cancels the RPC + self.assertFalse(call.done()) + self.assertFalse(call.cancelled()) + self.assertTrue(call.cancel()) + self.assertTrue(call.cancelled()) + self.assertEqual(grpc.StatusCode.CANCELLED, await call.code()) + + async def test_late_cancel(self): + call = self._stub.FullDuplexCall() + await call.done_writing() + self.assertEqual(grpc.StatusCode.OK, await call.code()) + + # Cancels the RPC + self.assertTrue(call.done()) + self.assertFalse(call.cancelled()) + self.assertFalse(call.cancel()) + self.assertFalse(call.cancelled()) + + # Status is still OK + self.assertEqual(grpc.StatusCode.OK, await call.code()) + + async def test_async_generator(self): + + async def request_generator(): + yield _STREAM_OUTPUT_REQUEST_ONE_RESPONSE + yield _STREAM_OUTPUT_REQUEST_ONE_RESPONSE + + call = self._stub.FullDuplexCall(request_generator()) + async for response in call: + self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) + + self.assertEqual(await call.code(), grpc.StatusCode.OK) + + async def test_too_many_reads(self): + + async def request_generator(): + for _ in range(_NUM_STREAM_RESPONSES): + yield _STREAM_OUTPUT_REQUEST_ONE_RESPONSE + + call = self._stub.FullDuplexCall(request_generator()) + for _ in range(_NUM_STREAM_RESPONSES): + response = await call.read() + self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) + self.assertIs(await call.read(), aio.EOF) + + self.assertEqual(await call.code(), grpc.StatusCode.OK) + # After the RPC finished, the read should also produce EOF + self.assertIs(await call.read(), aio.EOF) + + async def test_read_write_after_done_writing(self): + call = self._stub.FullDuplexCall() + + # Writes two requests, and pending two requests + await call.write(_STREAM_OUTPUT_REQUEST_ONE_RESPONSE) + await call.write(_STREAM_OUTPUT_REQUEST_ONE_RESPONSE) + await call.done_writing() + + # Further write should fail + with self.assertRaises(asyncio.InvalidStateError): + await call.write(_STREAM_OUTPUT_REQUEST_ONE_RESPONSE) + + # But read should be unaffected + response = await call.read() + self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) + response = await call.read() + self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) + + self.assertEqual(await call.code(), grpc.StatusCode.OK) + + async def test_error_in_async_generator(self): + # Server will pause between responses + request = messages_pb2.StreamingOutputCallRequest() + request.response_parameters.append( + messages_pb2.ResponseParameters( + size=_RESPONSE_PAYLOAD_SIZE, + interval_us=_RESPONSE_INTERVAL_US, + )) + + # We expect the request iterator to receive the exception + request_iterator_received_the_exception = asyncio.Event() + + async def request_iterator(): + with self.assertRaises(asyncio.CancelledError): + for _ in range(_NUM_STREAM_RESPONSES): + yield request + await asyncio.sleep(test_constants.SHORT_TIMEOUT) + request_iterator_received_the_exception.set() + + call = self._stub.FullDuplexCall(request_iterator()) + + # Cancel the RPC after at least one response + async def cancel_later(): + await asyncio.sleep(test_constants.SHORT_TIMEOUT * 2) + call.cancel() + + cancel_later_task = self.loop.create_task(cancel_later()) + + # No exceptions here + async for response in call: + self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) + + await request_iterator_received_the_exception.wait() + + self.assertEqual(grpc.StatusCode.CANCELLED, await call.code()) + # No failures in the cancel later task! + await cancel_later_task -# class TestStreamStreamCall(_MulticallableTestMixin, AioTestBase): - -# async def test_cancel(self): -# # Invokes the actual RPC -# call = self._stub.FullDuplexCall() - -# for _ in range(_NUM_STREAM_RESPONSES): -# await call.write(_STREAM_OUTPUT_REQUEST_ONE_RESPONSE) -# response = await call.read() -# self.assertIsInstance(response, -# messages_pb2.StreamingOutputCallResponse) -# self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) - -# # Cancels the RPC -# self.assertFalse(call.done()) -# self.assertFalse(call.cancelled()) -# self.assertTrue(call.cancel()) -# self.assertTrue(call.cancelled()) -# self.assertEqual(grpc.StatusCode.CANCELLED, await call.code()) - -# async def test_cancel_with_pending_read(self): -# call = self._stub.FullDuplexCall() - -# await call.write(_STREAM_OUTPUT_REQUEST_ONE_RESPONSE) - -# # Cancels the RPC -# self.assertFalse(call.done()) -# self.assertFalse(call.cancelled()) -# self.assertTrue(call.cancel()) -# self.assertTrue(call.cancelled()) -# self.assertEqual(grpc.StatusCode.CANCELLED, await call.code()) - -# async def test_cancel_with_ongoing_read(self): -# call = self._stub.FullDuplexCall() -# coro_started = asyncio.Event() - -# async def read_coro(): -# coro_started.set() -# await call.read() - -# read_task = self.loop.create_task(read_coro()) -# await coro_started.wait() -# self.assertFalse(read_task.done()) - -# # Cancels the RPC -# self.assertFalse(call.done()) -# self.assertFalse(call.cancelled()) -# self.assertTrue(call.cancel()) -# self.assertTrue(call.cancelled()) -# self.assertEqual(grpc.StatusCode.CANCELLED, await call.code()) - -# async def test_early_cancel(self): -# call = self._stub.FullDuplexCall() - -# # Cancels the RPC -# self.assertFalse(call.done()) -# self.assertFalse(call.cancelled()) -# self.assertTrue(call.cancel()) -# self.assertTrue(call.cancelled()) -# self.assertEqual(grpc.StatusCode.CANCELLED, await call.code()) - -# async def test_cancel_after_done_writing(self): -# call = self._stub.FullDuplexCall() -# await call.done_writing() - -# # Cancels the RPC -# self.assertFalse(call.done()) -# self.assertFalse(call.cancelled()) -# self.assertTrue(call.cancel()) -# self.assertTrue(call.cancelled()) -# self.assertEqual(grpc.StatusCode.CANCELLED, await call.code()) - -# async def test_late_cancel(self): -# call = self._stub.FullDuplexCall() -# await call.done_writing() -# self.assertEqual(grpc.StatusCode.OK, await call.code()) - -# # Cancels the RPC -# self.assertTrue(call.done()) -# self.assertFalse(call.cancelled()) -# self.assertFalse(call.cancel()) -# self.assertFalse(call.cancelled()) - -# # Status is still OK -# self.assertEqual(grpc.StatusCode.OK, await call.code()) - -# async def test_async_generator(self): - -# async def request_generator(): -# yield _STREAM_OUTPUT_REQUEST_ONE_RESPONSE -# yield _STREAM_OUTPUT_REQUEST_ONE_RESPONSE - -# call = self._stub.FullDuplexCall(request_generator()) -# async for response in call: -# self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) - -# self.assertEqual(await call.code(), grpc.StatusCode.OK) - -# async def test_too_many_reads(self): - -# async def request_generator(): -# for _ in range(_NUM_STREAM_RESPONSES): -# yield _STREAM_OUTPUT_REQUEST_ONE_RESPONSE - -# call = self._stub.FullDuplexCall(request_generator()) -# for _ in range(_NUM_STREAM_RESPONSES): -# response = await call.read() -# self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) -# self.assertIs(await call.read(), aio.EOF) - -# self.assertEqual(await call.code(), grpc.StatusCode.OK) -# # After the RPC finished, the read should also produce EOF -# self.assertIs(await call.read(), aio.EOF) - -# async def test_read_write_after_done_writing(self): -# call = self._stub.FullDuplexCall() - -# # Writes two requests, and pending two requests -# await call.write(_STREAM_OUTPUT_REQUEST_ONE_RESPONSE) -# await call.write(_STREAM_OUTPUT_REQUEST_ONE_RESPONSE) -# await call.done_writing() - -# # Further write should fail -# with self.assertRaises(asyncio.InvalidStateError): -# await call.write(_STREAM_OUTPUT_REQUEST_ONE_RESPONSE) - -# # But read should be unaffected -# response = await call.read() -# self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) -# response = await call.read() -# self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) - -# self.assertEqual(await call.code(), grpc.StatusCode.OK) - -# async def test_error_in_async_generator(self): -# # Server will pause between responses -# request = messages_pb2.StreamingOutputCallRequest() -# request.response_parameters.append( -# messages_pb2.ResponseParameters( -# size=_RESPONSE_PAYLOAD_SIZE, -# interval_us=_RESPONSE_INTERVAL_US, -# )) - -# # We expect the request iterator to receive the exception -# request_iterator_received_the_exception = asyncio.Event() - -# async def request_iterator(): -# with self.assertRaises(asyncio.CancelledError): -# for _ in range(_NUM_STREAM_RESPONSES): -# yield request -# await asyncio.sleep(test_constants.SHORT_TIMEOUT) -# request_iterator_received_the_exception.set() - -# call = self._stub.FullDuplexCall(request_iterator()) - -# # Cancel the RPC after at least one response -# async def cancel_later(): -# await asyncio.sleep(test_constants.SHORT_TIMEOUT * 2) -# call.cancel() - -# cancel_later_task = self.loop.create_task(cancel_later()) - -# # No exceptions here -# async for response in call: -# self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) - -# await request_iterator_received_the_exception.wait() - -# self.assertEqual(grpc.StatusCode.CANCELLED, await call.code()) -# # No failures in the cancel later task! -# await cancel_later_task if __name__ == '__main__': logging.basicConfig(level=logging.DEBUG) From 57fa6ce33c0756569b66a1c641b9a194ef536d05 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Fri, 6 Mar 2020 16:17:48 -0800 Subject: [PATCH 096/758] Make pylint happy --- src/python/grpcio_tests/tests_aio/unit/call_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/python/grpcio_tests/tests_aio/unit/call_test.py b/src/python/grpcio_tests/tests_aio/unit/call_test.py index e47c00a62ab..74bbc04be2f 100644 --- a/src/python/grpcio_tests/tests_aio/unit/call_test.py +++ b/src/python/grpcio_tests/tests_aio/unit/call_test.py @@ -755,5 +755,5 @@ class TestStreamStreamCall(_MulticallableTestMixin, AioTestBase): if __name__ == '__main__': - logging.basicConfig(level=logging.DEBUG) + logging.basicConfig() unittest.main(verbosity=2) From ce68d53dd1069fde05129f83c34da3b39811796e Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Fri, 6 Mar 2020 16:50:11 -0800 Subject: [PATCH 097/758] Make pytype happy --- .../_cython/_cygrpc/aio/completion_queue.pyx.pxi | 1 - .../grpc/_cython/_cygrpc/aio/iomgr/iomgr.pyx.pxi | 2 -- .../grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi | 1 - .../grpcio_tests/tests_aio/unit/server_test.py | 12 +++++------- 4 files changed, 5 insertions(+), 11 deletions(-) diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi index 4b8b326a2da..85ae0c4561a 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi @@ -92,7 +92,6 @@ cdef class CallbackCompletionQueue(BaseCompletionQueue): return self._cq async def shutdown(self): - _LOGGER.debug('CallbackCompletionQueue shutdown') grpc_completion_queue_shutdown(self._cq) await self._shutdown_completed grpc_completion_queue_destroy(self._cq) diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/iomgr/iomgr.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/iomgr/iomgr.pyx.pxi index 1a3dd46dcf4..37ba5f0d346 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/iomgr/iomgr.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/iomgr/iomgr.pyx.pxi @@ -170,7 +170,6 @@ cdef grpc_error* asyncio_resolve( char* host, char* port, grpc_resolved_addresses** res) with gil: - _LOGGER.debug('asyncio_resolve') result = native_socket.getaddrinfo(host, port) res[0] = tuples_to_resolvaddr(result) @@ -179,7 +178,6 @@ cdef void asyncio_resolve_async( grpc_custom_resolver* grpc_resolver, char* host, char* port) with gil: - _LOGGER.debug('asyncio_resolve_async') resolver = _AsyncioResolver.create(grpc_resolver) resolver.resolve(host, port) diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi index 1b4f61a9c36..d8ed9a41fe7 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi @@ -754,7 +754,6 @@ cdef class AioServer: grace: An optional float indicating the length of grace period in seconds. """ - _LOGGER.debug('server shutdown') if self._status == AIO_SERVER_STATUS_READY or self._status == AIO_SERVER_STATUS_STOPPED: return diff --git a/src/python/grpcio_tests/tests_aio/unit/server_test.py b/src/python/grpcio_tests/tests_aio/unit/server_test.py index e2a2ebacf5b..8c4d20b5838 100644 --- a/src/python/grpcio_tests/tests_aio/unit/server_test.py +++ b/src/python/grpcio_tests/tests_aio/unit/server_test.py @@ -348,7 +348,7 @@ class TestServer(AioTestBase): await self._server.stop(test_constants.SHORT_TIMEOUT) - with self.assertRaises(grpc.RpcError) as exception_context: + with self.assertRaises(aio.AioRpcError) as exception_context: await call self.assertEqual(grpc.StatusCode.UNAVAILABLE, exception_context.exception.code()) @@ -383,20 +383,18 @@ class TestServer(AioTestBase): self._server.stop(test_constants.LONG_TIMEOUT), ) - with self.assertRaises(grpc.RpcError) as exception_context: + with self.assertRaises(aio.AioRpcError) as exception_context: await call self.assertEqual(grpc.StatusCode.UNAVAILABLE, exception_context.exception.code()) - @unittest.skip('https://github.com/grpc/grpc/issues/20818') async def test_shutdown_before_call(self): - server_target, server, _ = _start_test_server() - await server.stop(None) + await self._server.stop(None) # Ensures the server is cleaned up at this point. # Some proper exception should be raised. - async with aio.insecure_channel('localhost:%d' % port) as channel: - await channel.unary_unary(_SIMPLE_UNARY_UNARY)(_REQUEST) + with self.assertRaises(aio.AioRpcError): + await self._channel.unary_unary(_SIMPLE_UNARY_UNARY)(_REQUEST) async def test_unimplemented(self): call = self._channel.unary_unary(_UNIMPLEMENTED_METHOD) From 231f9c0c94ab5361583d86e8bafb44e3a5513236 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Mon, 9 Mar 2020 14:14:57 -0700 Subject: [PATCH 098/758] Improve readability --- .../_cygrpc/aio/completion_queue.pxd.pxi | 2 +- .../_cygrpc/aio/completion_queue.pyx.pxi | 12 +-- .../grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi | 100 +++++++++--------- 3 files changed, 57 insertions(+), 57 deletions(-) diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pxd.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pxd.pxi index 708a2745fdf..2b3be97cb3b 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pxd.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pxd.pxi @@ -23,7 +23,7 @@ cdef class PollerCompletionQueue(BaseCompletionQueue): cdef object _poller cdef object _poller_running - cdef _polling(self) + cdef void _poll(self) except * cdef class CallbackCompletionQueue(BaseCompletionQueue): diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi index 85ae0c4561a..c09c276a67a 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi @@ -36,11 +36,11 @@ cdef class PollerCompletionQueue(BaseCompletionQueue): self._shutdown_completed = asyncio.get_event_loop().create_future() self._poller = None self._poller_running = asyncio.get_event_loop().create_future() - self._poller = threading.Thread(target=self._polling_wrapper) + self._poller = threading.Thread(target=self._poll_wrapper) self._poller.daemon = True self._poller.start() - cdef _polling(self): + cdef void _poll(self) except *: cdef grpc_event event cdef CallbackContext *context cdef object waiter @@ -53,7 +53,7 @@ cdef class PollerCompletionQueue(BaseCompletionQueue): NULL) if event.type == GRPC_QUEUE_TIMEOUT: - raise NotImplementedError() + raise AssertionError("Core should not return timeout error!") elif event.type == GRPC_QUEUE_SHUTDOWN: self._shutdown = True grpc_call_soon_threadsafe(self._shutdown_completed.set_result, None) @@ -64,8 +64,8 @@ cdef class PollerCompletionQueue(BaseCompletionQueue): context.callback_wrapper, event.success) - def _polling_wrapper(self): - self._polling() + def _poll_wrapper(self): + self._poll() async def shutdown(self): grpc_completion_queue_shutdown(self._cq) @@ -103,4 +103,4 @@ cdef BaseCompletionQueue create_completion_queue(): elif grpc_aio_engine is AsyncIOEngine.POLLER: return PollerCompletionQueue() else: - raise ValueError('Unexpected engine type [%s]' % grpc_aio_engine) + raise ValueError('Unsupported engine type [%s]' % grpc_aio_engine) diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi index 27a37dfe053..bf76dfebd6a 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi @@ -15,13 +15,14 @@ cdef bint _grpc_aio_initialized = False # NOTE(lidiz) Theoretically, applications can run in multiple event loops as -# long as they are in the same thread with same magic. However, I don't think -# we should support this use case. So, the gRPC Python Async Stack should use -# a single event loop picked by "init_grpc_aio". -cdef object _grpc_aio_loop -cdef object _event_loop_thread_ident +# long as they are in the same thread with same magic. This is not a supported +# use case. So, the gRPC Python Async Stack should use a single event loop +# picked by "init_grpc_aio". +cdef object _grpc_aio_loop # asyncio.AbstractEventLoop +cdef int64_t _event_loop_thread_ident cdef str _GRPC_ASYNCIO_ENGINE = os.environ.get('GRPC_ASYNCIO_ENGINE', 'default').lower() grpc_aio_engine = None +cdef object _grpc_initialization_lock = threading.Lock() class AsyncIOEngine(enum.Enum): @@ -36,51 +37,50 @@ def init_grpc_aio(): global _event_loop_thread_ident global grpc_aio_engine - # Marks this function as called - if _grpc_aio_initialized: - return - else: - _grpc_aio_initialized = True - - # Picks the engine for gRPC AsyncIO Stack - for engine_type in AsyncIOEngine: - if engine_type.value == _GRPC_ASYNCIO_ENGINE: - grpc_aio_engine = engine_type - break - if grpc_aio_engine is None or grpc_aio_engine is AsyncIOEngine.DEFAULT: - grpc_aio_engine = AsyncIOEngine.CUSTOM_IO_MANAGER - - # Anchors the event loop that the gRPC library going to use. - _grpc_aio_loop = asyncio.get_event_loop() - _event_loop_thread_ident = threading.current_thread().ident - - if grpc_aio_engine is AsyncIOEngine.CUSTOM_IO_MANAGER: - # Activates asyncio IO manager. - # NOTE(lidiz) Custom IO manager must be activated before the first - # `grpc_init()`. Otherwise, some special configurations in Core won't - # pick up the change, and resulted in SEGFAULT or ABORT. - install_asyncio_iomgr() - - # TODO(https://github.com/grpc/grpc/issues/22244) we need a the - # grpc_shutdown_blocking() counterpart for this call. Otherwise, the gRPC - # library won't shutdown cleanly. - grpc_init() - - # Timers are triggered by the Asyncio loop. We disable - # the background thread that is being used by the native - # gRPC iomgr. - grpc_timer_manager_set_threading(False) - - # gRPC callbaks are executed within the same thread used by the Asyncio - # event loop, as it is being done by the other Asyncio callbacks. - Executor.SetThreadingAll(False) - else: - # TODO(https://github.com/grpc/grpc/issues/22244) we need a the - # grpc_shutdown_blocking() counterpart for this call. Otherwise, the gRPC - # library won't shutdown cleanly. - grpc_init() - - _grpc_aio_initialized = False + with _grpc_initialization_lock: + # Marks this function as called + if _grpc_aio_initialized: + return + else: + _grpc_aio_initialized = True + + # Picks the engine for gRPC AsyncIO Stack + for engine_type in AsyncIOEngine: + if engine_type.value == _GRPC_ASYNCIO_ENGINE: + grpc_aio_engine = engine_type + break + if grpc_aio_engine is None or grpc_aio_engine is AsyncIOEngine.DEFAULT: + grpc_aio_engine = AsyncIOEngine.CUSTOM_IO_MANAGER + + # Anchors the event loop that the gRPC library going to use. + _grpc_aio_loop = asyncio.get_event_loop() + _event_loop_thread_ident = threading.current_thread().ident + + if grpc_aio_engine is AsyncIOEngine.CUSTOM_IO_MANAGER: + # Activates asyncio IO manager. + # NOTE(lidiz) Custom IO manager must be activated before the first + # `grpc_init()`. Otherwise, some special configurations in Core won't + # pick up the change, and resulted in SEGFAULT or ABORT. + install_asyncio_iomgr() + + # TODO(https://github.com/grpc/grpc/issues/22244) we need a the + # grpc_shutdown_blocking() counterpart for this call. Otherwise, the gRPC + # library won't shutdown cleanly. + grpc_init() + + # Timers are triggered by the Asyncio loop. We disable + # the background thread that is being used by the native + # gRPC iomgr. + grpc_timer_manager_set_threading(False) + + # gRPC callbaks are executed within the same thread used by the Asyncio + # event loop, as it is being done by the other Asyncio callbacks. + Executor.SetThreadingAll(False) + else: + # TODO(https://github.com/grpc/grpc/issues/22244) we need a the + # grpc_shutdown_blocking() counterpart for this call. Otherwise, the gRPC + # library won't shutdown cleanly. + grpc_init() def grpc_aio_loop(): From 5246a7c8ffb2ec888bc9ad4a7839d6a48e6bbd27 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Mon, 9 Mar 2020 15:18:03 -0700 Subject: [PATCH 099/758] Link to a TODO issue --- src/python/grpcio/grpc/_cython/_cygrpc/aio/iomgr/iomgr.pyx.pxi | 1 + 1 file changed, 1 insertion(+) diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/iomgr/iomgr.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/iomgr/iomgr.pyx.pxi index 37ba5f0d346..ac62c41e0f2 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/iomgr/iomgr.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/iomgr/iomgr.pyx.pxi @@ -188,6 +188,7 @@ cdef void asyncio_timer_start(grpc_custom_timer* grpc_timer) with gil: cdef void asyncio_timer_stop(grpc_custom_timer* grpc_timer) with gil: + # TODO(https://github.com/grpc/grpc/issues/22278) remove this if condition if grpc_timer.timer == NULL: return else: From 5b1ecef47fe2b646746c0e9c26a947b89cedb6c3 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Mon, 9 Mar 2020 15:38:34 -0700 Subject: [PATCH 100/758] Simplify the Cython code --- .../_cygrpc/aio/completion_queue.pxd.pxi | 6 ++---- .../_cygrpc/aio/completion_queue.pyx.pxi | 21 ++++++------------- .../grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi | 4 ++-- .../grpcio/grpc/experimental/aio/_server.py | 2 +- 4 files changed, 11 insertions(+), 22 deletions(-) diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pxd.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pxd.pxi index 2b3be97cb3b..54a0e90184a 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pxd.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pxd.pxi @@ -13,20 +13,18 @@ # limitations under the License. cdef class BaseCompletionQueue: + cdef grpc_completion_queue *_cq cdef grpc_completion_queue* c_ptr(self) cdef class PollerCompletionQueue(BaseCompletionQueue): - cdef grpc_completion_queue *_cq cdef bint _shutdown cdef object _shutdown_completed - cdef object _poller - cdef object _poller_running + cdef object _poller_thread cdef void _poll(self) except * cdef class CallbackCompletionQueue(BaseCompletionQueue): - cdef grpc_completion_queue *_cq cdef object _shutdown_completed # asyncio.Future cdef CallbackWrapper _wrapper diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi index c09c276a67a..33d1f348c75 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi @@ -25,7 +25,7 @@ cdef class BaseCompletionQueue: raise NotImplementedError() cdef grpc_completion_queue* c_ptr(self): - raise NotImplementedError() + return self._cq cdef class PollerCompletionQueue(BaseCompletionQueue): @@ -34,17 +34,13 @@ cdef class PollerCompletionQueue(BaseCompletionQueue): self._cq = grpc_completion_queue_create_for_next(NULL) self._shutdown = False self._shutdown_completed = asyncio.get_event_loop().create_future() - self._poller = None - self._poller_running = asyncio.get_event_loop().create_future() - self._poller = threading.Thread(target=self._poll_wrapper) - self._poller.daemon = True - self._poller.start() + self._poller_thread = threading.Thread(target=self._poll_wrapper, daemon=True) + self._poller_thread.start() cdef void _poll(self) except *: cdef grpc_event event cdef CallbackContext *context cdef object waiter - grpc_call_soon_threadsafe(self._poller_running.set_result, None) while not self._shutdown: with nogil: @@ -56,10 +52,10 @@ cdef class PollerCompletionQueue(BaseCompletionQueue): raise AssertionError("Core should not return timeout error!") elif event.type == GRPC_QUEUE_SHUTDOWN: self._shutdown = True - grpc_call_soon_threadsafe(self._shutdown_completed.set_result, None) + aio_loop_call_soon_threadsafe(self._shutdown_completed.set_result, None) else: context = event.tag - grpc_call_soon_threadsafe( + aio_loop_call_soon_threadsafe( _handle_callback_wrapper, context.callback_wrapper, event.success) @@ -71,9 +67,7 @@ cdef class PollerCompletionQueue(BaseCompletionQueue): grpc_completion_queue_shutdown(self._cq) await self._shutdown_completed grpc_completion_queue_destroy(self._cq) - - cdef grpc_completion_queue* c_ptr(self): - return self._cq + self._poller_thread.join() cdef class CallbackCompletionQueue(BaseCompletionQueue): @@ -88,9 +82,6 @@ cdef class CallbackCompletionQueue(BaseCompletionQueue): NULL ) - cdef grpc_completion_queue* c_ptr(self): - return self._cq - async def shutdown(self): grpc_completion_queue_shutdown(self._cq) await self._shutdown_completed diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi index bf76dfebd6a..9a6fdecace3 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi @@ -88,7 +88,7 @@ def grpc_aio_loop(): return _grpc_aio_loop -def grpc_schedule_coroutine(object coro): +def aio_loop_schedule_coroutine(object coro): """Thread-safely schedules coroutine to gRPC Aio event loop. If invoked within the same thread as the event loop, return an @@ -102,7 +102,7 @@ def grpc_schedule_coroutine(object coro): return _grpc_aio_loop.create_task(coro) -def grpc_call_soon_threadsafe(object func, *args): +def aio_loop_call_soon_threadsafe(object func, *args): # TODO(lidiz) After we are confident, we can drop this assert. Otherwsie, # we should limit this function to non-grpc-event-loop thread. assert _event_loop_thread_ident != threading.current_thread().ident diff --git a/src/python/grpcio/grpc/experimental/aio/_server.py b/src/python/grpcio/grpc/experimental/aio/_server.py index ec0af1d51f3..dc90c0a6dca 100644 --- a/src/python/grpcio/grpc/experimental/aio/_server.py +++ b/src/python/grpcio/grpc/experimental/aio/_server.py @@ -162,7 +162,7 @@ class Server(_base_server.Server): be safe to slightly extend the underlying Cython object's life span. """ if hasattr(self, '_server'): - cygrpc.grpc_schedule_coroutine(self._server.shutdown(None)) + cygrpc.aio_loop_schedule_coroutine(self._server.shutdown(None)) def server(migration_thread_pool: Optional[Executor] = None, From 0fa6782cb838f28f940b62ce3d92f464f3040ed4 Mon Sep 17 00:00:00 2001 From: Donna Dionne Date: Mon, 9 Mar 2020 16:30:31 -0700 Subject: [PATCH 101/758] Traffic Splitting RDS Policy Copy and pasted WeightedTarget to be the base of RDS. Commit the original WeightedTarget copy for easy comparison for future commits. --- .../client_channel/lb_policy/xds/rds.cc | 696 ++++++++++++++++++ 1 file changed, 696 insertions(+) create mode 100644 src/core/ext/filters/client_channel/lb_policy/xds/rds.cc diff --git a/src/core/ext/filters/client_channel/lb_policy/xds/rds.cc b/src/core/ext/filters/client_channel/lb_policy/xds/rds.cc new file mode 100644 index 00000000000..af091fdfad6 --- /dev/null +++ b/src/core/ext/filters/client_channel/lb_policy/xds/rds.cc @@ -0,0 +1,696 @@ +// +// Copyright 2018 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#include + +#include +#include +#include + +#include "absl/strings/str_cat.h" + +#include + +#include "src/core/ext/filters/client_channel/lb_policy.h" +#include "src/core/ext/filters/client_channel/lb_policy_factory.h" +#include "src/core/ext/filters/client_channel/lb_policy_registry.h" +#include "src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h" +#include "src/core/lib/channel/channel_args.h" +#include "src/core/lib/gpr/string.h" +#include "src/core/lib/gprpp/orphanable.h" +#include "src/core/lib/gprpp/ref_counted_ptr.h" +#include "src/core/lib/iomgr/combiner.h" +#include "src/core/lib/iomgr/timer.h" + +#define GRPC_WEIGHTED_TARGET_CHILD_RETENTION_INTERVAL_MS (15 * 60 * 1000) + +namespace grpc_core { + +TraceFlag grpc_lb_weighted_target_trace(false, "weighted_target_lb"); + +namespace { + +constexpr char kWeightedTarget[] = "weighted_target_experimental"; + +// Config for weighted_target LB policy. +class WeightedTargetLbConfig : public LoadBalancingPolicy::Config { + public: + struct ChildConfig { + uint32_t weight; + RefCountedPtr config; + }; + + using TargetMap = std::map; + + explicit WeightedTargetLbConfig(TargetMap target_map) + : target_map_(std::move(target_map)) {} + + const char* name() const override { return kWeightedTarget; } + + const TargetMap& target_map() const { return target_map_; } + + private: + TargetMap target_map_; +}; + +// weighted_target LB policy. +class WeightedTargetLb : public LoadBalancingPolicy { + public: + explicit WeightedTargetLb(Args args); + + const char* name() const override { return kWeightedTarget; } + + void UpdateLocked(UpdateArgs args) override; + void ExitIdleLocked() override; + void ResetBackoffLocked() override; + + private: + // A simple wrapper for ref-counting a picker from the child policy. + class ChildPickerWrapper : public RefCounted { + public: + explicit ChildPickerWrapper(std::unique_ptr picker) + : picker_(std::move(picker)) {} + PickResult Pick(PickArgs args) { + return picker_->Pick(std::move(args)); + } + private: + std::unique_ptr picker_; + }; + + // Picks a child using stateless WRR and then delegates to that + // child's picker. + class WeightedPicker : public SubchannelPicker { + public: + // Maintains a weighted list of pickers from each child that is in + // ready state. The first element in the pair represents the end of a + // range proportional to the child's weight. The start of the range + // is the previous value in the vector and is 0 for the first element. + using PickerList = + InlinedVector>, 1>; + + WeightedPicker(RefCountedPtr parent, PickerList pickers) + : parent_(std::move(parent)), pickers_(std::move(pickers)) {} + ~WeightedPicker() { parent_.reset(DEBUG_LOCATION, "WeightedPicker"); } + + PickResult Pick(PickArgs args) override; + + private: + RefCountedPtr parent_; + PickerList pickers_; + }; + + // Each WeightedChild holds a ref to its parent WeightedTargetLb. + class WeightedChild : public InternallyRefCounted { + public: + WeightedChild(RefCountedPtr weighted_target_policy, + const std::string& name); + ~WeightedChild(); + + void Orphan() override; + + void UpdateLocked(const WeightedTargetLbConfig::ChildConfig& config, + const ServerAddressList& addresses, + const grpc_channel_args* args); + void ExitIdleLocked(); + void ResetBackoffLocked(); + void DeactivateLocked(); + + uint32_t weight() const { return weight_; } + grpc_connectivity_state connectivity_state() const { + return connectivity_state_; + } + RefCountedPtr picker_wrapper() const { + return picker_wrapper_; + } + + private: + class Helper : public ChannelControlHelper { + public: + explicit Helper(RefCountedPtr weighted_child) + : weighted_child_(std::move(weighted_child)) {} + + ~Helper() { weighted_child_.reset(DEBUG_LOCATION, "Helper"); } + + RefCountedPtr CreateSubchannel( + const grpc_channel_args& args) override; + void UpdateState(grpc_connectivity_state state, + std::unique_ptr picker) override; + void RequestReresolution() override; + void AddTraceEvent(TraceSeverity severity, StringView message) override; + + private: + RefCountedPtr weighted_child_; + }; + + // Methods for dealing with the child policy. + OrphanablePtr CreateChildPolicyLocked( + const grpc_channel_args* args); + + static void OnDelayedRemovalTimer(void* arg, grpc_error* error); + static void OnDelayedRemovalTimerLocked(void* arg, grpc_error* error); + + // The owning LB policy. + RefCountedPtr weighted_target_policy_; + + // Points to the corresponding key in WeightedTargetLb::targets_. + const std::string& name_; + + uint32_t weight_; + + OrphanablePtr child_policy_; + + RefCountedPtr picker_wrapper_; + grpc_connectivity_state connectivity_state_ = GRPC_CHANNEL_IDLE; + bool seen_failure_since_ready_ = false; + + // States for delayed removal. + grpc_timer delayed_removal_timer_; + grpc_closure on_delayed_removal_timer_; + bool delayed_removal_timer_callback_pending_ = false; + bool shutdown_ = false; + }; + + ~WeightedTargetLb(); + + void ShutdownLocked() override; + + void UpdateStateLocked(); + + const grpc_millis child_retention_interval_ms_; + + // Current config from the resolver. + RefCountedPtr config_; + + // Internal state. + bool shutting_down_ = false; + + // Children. + std::map> targets_; +}; + +// +// WeightedTargetLb::WeightedPicker +// + +WeightedTargetLb::PickResult WeightedTargetLb::WeightedPicker::Pick( + PickArgs args) { + // Generate a random number in [0, total weight). + const uint32_t key = rand() % pickers_[pickers_.size() - 1].first; + // Find the index in pickers_ corresponding to key. + size_t mid = 0; + size_t start_index = 0; + size_t end_index = pickers_.size() - 1; + size_t index = 0; + while (end_index > start_index) { + mid = (start_index + end_index) / 2; + if (pickers_[mid].first > key) { + end_index = mid; + } else if (pickers_[mid].first < key) { + start_index = mid + 1; + } else { + index = mid + 1; + break; + } + } + if (index == 0) index = start_index; + GPR_ASSERT(pickers_[index].first > key); + // Delegate to the child picker. + return pickers_[index].second->Pick(args); +} + +// +// WeightedTargetLb +// + +WeightedTargetLb::WeightedTargetLb(Args args) + : LoadBalancingPolicy(std::move(args)), +// FIXME: new channel arg + child_retention_interval_ms_(grpc_channel_args_find_integer( + args.args, GRPC_ARG_LOCALITY_RETENTION_INTERVAL_MS, + {GRPC_WEIGHTED_TARGET_CHILD_RETENTION_INTERVAL_MS, 0, INT_MAX})) {} + +WeightedTargetLb::~WeightedTargetLb() { + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_weighted_target_trace)) { + gpr_log(GPR_INFO, "[weighted_target_lb %p] destroying weighted_target LB policy", + this); + } +} + +void WeightedTargetLb::ShutdownLocked() { + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_weighted_target_trace)) { + gpr_log(GPR_INFO, "[weighted_target_lb %p] shutting down", this); + } + shutting_down_ = true; + targets_.clear(); +} + +void WeightedTargetLb::ExitIdleLocked() { + for (auto& p : targets_) p.second->ExitIdleLocked(); +} + +void WeightedTargetLb::ResetBackoffLocked() { + for (auto& p : targets_) p.second->ResetBackoffLocked(); +} + +void WeightedTargetLb::UpdateLocked(UpdateArgs args) { + if (shutting_down_) return; + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_weighted_target_trace)) { + gpr_log(GPR_INFO, "[weighted_target_lb %p] Received update", this); + } + // Update config. + config_ = std::move(args.config); + // Deactivate the targets not in the new config. + for (auto it = targets_.begin(); it != targets_.end();) { + const std::string& name = it->first; + WeightedChild* child = it->second.get(); + if (config_->target_map().find(name) != config_->target_map().end()) { + ++it; + continue; + } + if (child_retention_interval_ms_ == 0) { + it = targets_.erase(it); + } else { + child->DeactivateLocked(); + ++it; + } + } + // Add or update the targets in the new config. + for (const auto& p : config_->target_map()) { + const std::string& name = p.first; + const WeightedTargetLbConfig::ChildConfig& config = p.second; + auto it = targets_.find(name); + if (it == targets_.end()) { + it = targets_.emplace(std::make_pair(name, nullptr)).first; + it->second = MakeOrphanable( + Ref(DEBUG_LOCATION, "WeightedChild"), it->first); + } + it->second->UpdateLocked(config, args.addresses, args.args); + } +} + +void WeightedTargetLb::UpdateStateLocked() { + // Construct a new picker which maintains a map of all child pickers + // that are ready. Each child is represented by a portion of the range + // proportional to its weight, such that the total range is the sum of the + // weights of all children. + WeightedPicker::PickerList picker_list; + uint32_t end = 0; + // Also count the number of children in each state, to determine the + // overall state. + size_t num_connecting = 0; + size_t num_idle = 0; + size_t num_transient_failures = 0; + for (const auto& p : targets_) { + const auto& child_name = p.first; + const WeightedChild* child = p.second.get(); + // Skip the targets that are not in the latest update. + if (config_->target_map().find(child_name) == config_->target_map().end()) { + continue; + } + switch (child->connectivity_state()) { + case GRPC_CHANNEL_READY: { + end += child->weight(); + picker_list.push_back(std::make_pair(end, child->picker_wrapper())); + break; + } + case GRPC_CHANNEL_CONNECTING: { + ++num_connecting; + break; + } + case GRPC_CHANNEL_IDLE: { + ++num_idle; + break; + } + case GRPC_CHANNEL_TRANSIENT_FAILURE: { + ++num_transient_failures; + break; + } + default: + GPR_UNREACHABLE_CODE(return ); + } + } + // Determine aggregated connectivity state. + grpc_connectivity_state connectivity_state; + if (picker_list.size() > 0) { + connectivity_state = GRPC_CHANNEL_READY; + } else if (num_connecting > 0) { + connectivity_state = GRPC_CHANNEL_CONNECTING; + } else if (num_idle > 0) { + connectivity_state = GRPC_CHANNEL_IDLE; + } else { + connectivity_state = GRPC_CHANNEL_TRANSIENT_FAILURE; + } + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_weighted_target_trace)) { + gpr_log(GPR_INFO, "[weighted_target_lb %p] connectivity changed to %s", + this, ConnectivityStateName(connectivity_state)); + } + std::unique_ptr picker; + switch (connectivity_state) { + case GRPC_CHANNEL_READY: + picker = absl::make_unique( + Ref(DEBUG_LOCATION, "WeightedPicker"), std::move(picker_list)); + break; + case GRPC_CHANNEL_CONNECTING: + case GRPC_CHANNEL_IDLE: + picker = absl::make_unique( + Ref(DEBUG_LOCATION, "QueuePicker")); + break; + default: + picker = absl::make_unique( + GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "weighted_target: all children report state TRANSIENT_FAILURE")); + } + channel_control_helper()->UpdateState(connectivity_state, std::move(picker)); +} + +// +// WeightedTargetLb::WeightedChild +// + +WeightedTargetLb::WeightedChild::WeightedChild( + RefCountedPtr weighted_target_policy, + const std::string& name) + : weighted_target_policy_(std::move(weighted_target_policy)), name_(name) { + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_weighted_target_trace)) { + gpr_log(GPR_INFO, "[weighted_target_lb %p] created WeightedChild %p for %s", + weighted_target_policy_.get(), this, name_.c_str()); + } +} + +WeightedTargetLb::WeightedChild::~WeightedChild() { + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_weighted_target_trace)) { + gpr_log(GPR_INFO, + "[weighted_target_lb %p] WeightedChild %p %s: destroying child", + weighted_target_policy_.get(), this, name_.c_str()); + } + weighted_target_policy_.reset(DEBUG_LOCATION, "WeightedChild"); +} + +void WeightedTargetLb::WeightedChild::Orphan() { + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_weighted_target_trace)) { + gpr_log(GPR_INFO, + "[weighted_target_lb %p] WeightedChild %p %s: shutting down child", + weighted_target_policy_.get(), this, name_.c_str()); + } + // Remove the child policy's interested_parties pollset_set from the + // xDS policy. + grpc_pollset_set_del_pollset_set(child_policy_->interested_parties(), + weighted_target_policy_->interested_parties()); + child_policy_.reset(); + // Drop our ref to the child's picker, in case it's holding a ref to + // the child. + picker_wrapper_.reset(); + if (delayed_removal_timer_callback_pending_) { + grpc_timer_cancel(&delayed_removal_timer_); + } + shutdown_ = true; + Unref(); +} + +OrphanablePtr +WeightedTargetLb::WeightedChild::CreateChildPolicyLocked( + const grpc_channel_args* args) { + LoadBalancingPolicy::Args lb_policy_args; + lb_policy_args.combiner = weighted_target_policy_->combiner(); + lb_policy_args.args = args; + lb_policy_args.channel_control_helper = + absl::make_unique(this->Ref(DEBUG_LOCATION, "Helper")); + OrphanablePtr lb_policy = + MakeOrphanable(std::move(lb_policy_args), + &grpc_lb_weighted_target_trace); + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_weighted_target_trace)) { + gpr_log(GPR_INFO, + "[weighted_target_lb %p] WeightedChild %p %s: Created new child " + "policy handler %p", + weighted_target_policy_.get(), this, name_.c_str(), + lb_policy.get()); + } + // Add the xDS's interested_parties pollset_set to that of the newly created + // child policy. This will make the child policy progress upon activity on + // xDS LB, which in turn is tied to the application's call. + grpc_pollset_set_add_pollset_set( + lb_policy->interested_parties(), + weighted_target_policy_->interested_parties()); + return lb_policy; +} + +void WeightedTargetLb::WeightedChild::UpdateLocked( + const WeightedTargetLbConfig::ChildConfig& config, + const ServerAddressList& addresses, const grpc_channel_args* args) { + if (weighted_target_policy_->shutting_down_) return; + // Update child weight. + weight_ = config.weight; + // Reactivate if needed. + if (delayed_removal_timer_callback_pending_) { + grpc_timer_cancel(&delayed_removal_timer_); + } + // Create child policy if needed. + if (child_policy_ == nullptr) { + child_policy_ = CreateChildPolicyLocked(args); + } + // Construct update args. + UpdateArgs update_args; + update_args.config = config.config; + update_args.addresses = addresses; + update_args.args = grpc_channel_args_copy(args); + // Update the policy. + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_weighted_target_trace)) { + gpr_log(GPR_INFO, + "[weighted_target_lb %p] WeightedChild %p %s: Updating child " + "policy handler %p", + weighted_target_policy_.get(), this, name_.c_str(), + child_policy_.get()); + } + child_policy_->UpdateLocked(std::move(update_args)); +} + +void WeightedTargetLb::WeightedChild::ExitIdleLocked() { + child_policy_->ExitIdleLocked(); +} + +void WeightedTargetLb::WeightedChild::ResetBackoffLocked() { + child_policy_->ResetBackoffLocked(); +} + +void WeightedTargetLb::WeightedChild::DeactivateLocked() { + // If already deactivated, don't do that again. + if (weight_ == 0) return; + // Set the child weight to 0 so that future picker won't contain this child. + weight_ = 0; + // Start a timer to delete the child. + Ref(DEBUG_LOCATION, "WeightedChild+timer").release(); + GRPC_CLOSURE_INIT(&on_delayed_removal_timer_, OnDelayedRemovalTimer, this, + grpc_schedule_on_exec_ctx); + grpc_timer_init( + &delayed_removal_timer_, + ExecCtx::Get()->Now() + + weighted_target_policy_->child_retention_interval_ms_, + &on_delayed_removal_timer_); + delayed_removal_timer_callback_pending_ = true; +} + +void WeightedTargetLb::WeightedChild::OnDelayedRemovalTimer(void* arg, + grpc_error* error) { + WeightedChild* self = static_cast(arg); + self->weighted_target_policy_->combiner()->Run( + GRPC_CLOSURE_INIT(&self->on_delayed_removal_timer_, + OnDelayedRemovalTimerLocked, self, nullptr), + GRPC_ERROR_REF(error)); +} + +void WeightedTargetLb::WeightedChild::OnDelayedRemovalTimerLocked( + void* arg, grpc_error* error) { + WeightedChild* self = static_cast(arg); + self->delayed_removal_timer_callback_pending_ = false; + if (error == GRPC_ERROR_NONE && !self->shutdown_ && self->weight_ == 0) { + self->weighted_target_policy_->targets_.erase(self->name_); + } + self->Unref(DEBUG_LOCATION, "WeightedChild+timer"); +} + +// +// WeightedTargetLb::WeightedChild::Helper +// + +RefCountedPtr +WeightedTargetLb::WeightedChild::Helper::CreateSubchannel( + const grpc_channel_args& args) { + if (weighted_child_->weighted_target_policy_->shutting_down_) return nullptr; + return weighted_child_->weighted_target_policy_->channel_control_helper()->CreateSubchannel( + args); +} + +void WeightedTargetLb::WeightedChild::Helper::UpdateState( + grpc_connectivity_state state, std::unique_ptr picker) { + if (weighted_child_->weighted_target_policy_->shutting_down_) return; + // Cache the picker in the WeightedChild. + weighted_child_->picker_wrapper_ = + MakeRefCounted(std::move(picker)); + // Decide what state to report for aggregation purposes. + // If we haven't seen a failure since the last time we were in state + // READY, then we report the state change as-is. However, once we do see + // a failure, we report TRANSIENT_FAILURE and ignore any subsequent state + // changes until we go back into state READY. + if (!weighted_child_->seen_failure_since_ready_) { + if (state == GRPC_CHANNEL_TRANSIENT_FAILURE) { + weighted_child_->seen_failure_since_ready_ = true; + } + } else { + if (state != GRPC_CHANNEL_READY) return; + weighted_child_->seen_failure_since_ready_ = false; + } + weighted_child_->connectivity_state_ = state; + // Notify the LB policy. + weighted_child_->weighted_target_policy_->UpdateStateLocked(); +} + +void WeightedTargetLb::WeightedChild::Helper::RequestReresolution() { + if (weighted_child_->weighted_target_policy_->shutting_down_) return; + weighted_child_->weighted_target_policy_->channel_control_helper()->RequestReresolution(); +} + +void WeightedTargetLb::WeightedChild::Helper::AddTraceEvent(TraceSeverity severity, + StringView message) { + if (weighted_child_->weighted_target_policy_->shutting_down_) return; + weighted_child_->weighted_target_policy_->channel_control_helper()->AddTraceEvent( + severity, message); +} + +// +// factory +// + +class WeightedTargetLbFactory : public LoadBalancingPolicyFactory { + public: + OrphanablePtr CreateLoadBalancingPolicy( + LoadBalancingPolicy::Args args) const override { + return MakeOrphanable(std::move(args)); + } + + const char* name() const override { return kWeightedTarget; } + + RefCountedPtr ParseLoadBalancingConfig( + const Json& json, grpc_error** error) const override { + GPR_DEBUG_ASSERT(error != nullptr && *error == GRPC_ERROR_NONE); + if (json.type() == Json::Type::JSON_NULL) { + // weighted_target was mentioned as a policy in the deprecated + // loadBalancingPolicy field or in the client API. + *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "field:loadBalancingPolicy error:weighted_target policy requires " + "configuration. Please use loadBalancingConfig field of service " + "config instead."); + return nullptr; + } + std::vector error_list; + // Weight map. + WeightedTargetLbConfig::TargetMap target_map; + auto it = json.object_value().find("targets"); + if (it == json.object_value().end()) { + error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "field:targets error:required field not present")); + } else if (it->second.type() != Json::Type::OBJECT) { + error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "field:targets error:type should be object")); + } else { + for (const auto& p : it->second.object_value()) { + WeightedTargetLbConfig::ChildConfig child_config; + std::vector child_errors = + ParseChildConfig(p.second, &child_config); + if (!child_errors.empty()) { + // Can't use GRPC_ERROR_CREATE_FROM_VECTOR() here, because the error + // string is not static in this case. + grpc_error* error = GRPC_ERROR_CREATE_FROM_COPIED_STRING( + absl::StrCat("field:targets key:", p.first).c_str()); + for (grpc_error* child_error : child_errors) { + error = grpc_error_add_child(error, child_error); + } + error_list.push_back(error); + } else { + target_map[p.first] = std::move(child_config); + } + } + } + if (!error_list.empty()) { + *error = GRPC_ERROR_CREATE_FROM_VECTOR( + "weighted_target_experimental LB policy config", &error_list); + return nullptr; + } + return MakeRefCounted(std::move(target_map)); + } + + private: + static std::vector ParseChildConfig( + const Json& json, WeightedTargetLbConfig::ChildConfig* child_config) { + std::vector error_list; + if (json.type() != Json::Type::OBJECT) { + error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "value should be of type object")); + return error_list; + } + // Weight. + auto it = json.object_value().find("weight"); + if (it == json.object_value().end()) { + error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "required field \"weight\" not specified")); + } else if (it->second.type() != Json::Type::NUMBER) { + error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "field:weight error:must be of type number")); + } else { + child_config->weight = + gpr_parse_nonnegative_int(it->second.string_value().c_str()); + if (child_config->weight == -1) { + error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "field:weight error:unparseable value")); + } else if (child_config->weight == 0) { + error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "field:weight error:value must be greater than zero")); + } + } + // Child policy. + it = json.object_value().find("childPolicy"); + if (it != json.object_value().end()) { + grpc_error* parse_error = GRPC_ERROR_NONE; + child_config->config = + LoadBalancingPolicyRegistry::ParseLoadBalancingConfig(it->second, + &parse_error); + if (child_config->config == nullptr) { + GPR_DEBUG_ASSERT(parse_error != GRPC_ERROR_NONE); + std::vector child_errors; + child_errors.push_back(parse_error); + error_list.push_back( + GRPC_ERROR_CREATE_FROM_VECTOR("field:childPolicy", &child_errors)); + } + } + return error_list; + } +}; + +} // namespace + +} // namespace grpc_core + +// +// Plugin registration +// + +void grpc_lb_policy_weighted_target_init() { + grpc_core::LoadBalancingPolicyRegistry::Builder:: + RegisterLoadBalancingPolicyFactory( + absl::make_unique()); +} + +void grpc_lb_policy_weighted_target_shutdown() {} From 7a146722db8cd12a8a710bd91ee86a5cbdf25ea8 Mon Sep 17 00:00:00 2001 From: Donna Dionne Date: Mon, 9 Mar 2020 16:47:24 -0700 Subject: [PATCH 102/758] Harded coded a service config to point to xds_routing_experimental With just 1 action, which has 1 child policy: cds_experimental Basically wrapping the previous cds_experimental config inside the new xds_routing_experimental Tested to make sure all current tests still pass. This is just a skeleton code to allow new parsing code to be added and tested. --- BUILD | 26 + .../client_channel/lb_policy/xds/rds.cc | 456 ++++++++---------- .../filters/client_channel/xds/xds_client.cc | 11 +- .../plugin_registry/grpc_plugin_registry.cc | 4 + .../grpc_unsecure_plugin_registry.cc | 4 + test/cpp/end2end/xds_end2end_test.cc | 6 +- 6 files changed, 246 insertions(+), 261 deletions(-) diff --git a/BUILD b/BUILD index 8fe2d6d2e15..a0c9247e74e 100644 --- a/BUILD +++ b/BUILD @@ -320,6 +320,7 @@ grpc_cc_library( "grpc_common", "grpc_lb_policy_cds", "grpc_lb_policy_grpclb", + "grpc_lb_policy_rds", "grpc_lb_policy_xds", "grpc_resolver_xds", ], @@ -338,6 +339,7 @@ grpc_cc_library( "grpc_common", "grpc_lb_policy_cds_secure", "grpc_lb_policy_grpclb_secure", + "grpc_lb_policy_rds_secure", "grpc_lb_policy_xds_secure", "grpc_resolver_xds_secure", "grpc_secure", @@ -1397,6 +1399,30 @@ grpc_cc_library( ], ) +grpc_cc_library( + name = "grpc_lb_policy_rds", + srcs = [ + "src/core/ext/filters/client_channel/lb_policy/xds/rds.cc", + ], + language = "c++", + deps = [ + "grpc_base", + "grpc_client_channel", + ], +) + +grpc_cc_library( + name = "grpc_lb_policy_rds_secure", + srcs = [ + "src/core/ext/filters/client_channel/lb_policy/xds/rds.cc", + ], + language = "c++", + deps = [ + "grpc_base", + "grpc_client_channel", + ], +) + grpc_cc_library( name = "grpc_lb_subchannel_list", hdrs = [ diff --git a/src/core/ext/filters/client_channel/lb_policy/xds/rds.cc b/src/core/ext/filters/client_channel/lb_policy/xds/rds.cc index af091fdfad6..6a730d2a512 100644 --- a/src/core/ext/filters/client_channel/lb_policy/xds/rds.cc +++ b/src/core/ext/filters/client_channel/lb_policy/xds/rds.cc @@ -25,9 +25,9 @@ #include #include "src/core/ext/filters/client_channel/lb_policy.h" +#include "src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h" #include "src/core/ext/filters/client_channel/lb_policy_factory.h" #include "src/core/ext/filters/client_channel/lb_policy_registry.h" -#include "src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h" #include "src/core/lib/channel/channel_args.h" #include "src/core/lib/gpr/string.h" #include "src/core/lib/gprpp/orphanable.h" @@ -39,39 +39,38 @@ namespace grpc_core { -TraceFlag grpc_lb_weighted_target_trace(false, "weighted_target_lb"); +TraceFlag grpc_rds_lb_trace(false, "rds_lb"); namespace { -constexpr char kWeightedTarget[] = "weighted_target_experimental"; +constexpr char kRds[] = "xds_routing_experimental"; -// Config for weighted_target LB policy. -class WeightedTargetLbConfig : public LoadBalancingPolicy::Config { +// Config for rds LB policy. +class RdsLbConfig : public LoadBalancingPolicy::Config { public: struct ChildConfig { - uint32_t weight; RefCountedPtr config; }; - using TargetMap = std::map; + using ActionMap = std::map; - explicit WeightedTargetLbConfig(TargetMap target_map) - : target_map_(std::move(target_map)) {} + explicit RdsLbConfig(ActionMap action_map) + : action_map_(std::move(action_map)) {} - const char* name() const override { return kWeightedTarget; } + const char* name() const override { return kRds; } - const TargetMap& target_map() const { return target_map_; } + const ActionMap& action_map() const { return action_map_; } private: - TargetMap target_map_; + ActionMap action_map_; }; -// weighted_target LB policy. -class WeightedTargetLb : public LoadBalancingPolicy { +// rds LB policy. +class RdsLb : public LoadBalancingPolicy { public: - explicit WeightedTargetLb(Args args); + explicit RdsLb(Args args); - const char* name() const override { return kWeightedTarget; } + const char* name() const override { return kRds; } void UpdateLocked(UpdateArgs args) override; void ExitIdleLocked() override; @@ -83,53 +82,48 @@ class WeightedTargetLb : public LoadBalancingPolicy { public: explicit ChildPickerWrapper(std::unique_ptr picker) : picker_(std::move(picker)) {} - PickResult Pick(PickArgs args) { - return picker_->Pick(std::move(args)); - } + PickResult Pick(PickArgs args) { return picker_->Pick(std::move(args)); } + private: std::unique_ptr picker_; }; // Picks a child using stateless WRR and then delegates to that // child's picker. - class WeightedPicker : public SubchannelPicker { + class RdsPicker : public SubchannelPicker { public: - // Maintains a weighted list of pickers from each child that is in + // Maintains a rds list of pickers from each child that is in // ready state. The first element in the pair represents the end of a // range proportional to the child's weight. The start of the range // is the previous value in the vector and is 0 for the first element. - using PickerList = - InlinedVector>, 1>; + using PickerList = InlinedVector, 1>; - WeightedPicker(RefCountedPtr parent, PickerList pickers) + RdsPicker(RefCountedPtr parent, PickerList pickers) : parent_(std::move(parent)), pickers_(std::move(pickers)) {} - ~WeightedPicker() { parent_.reset(DEBUG_LOCATION, "WeightedPicker"); } + ~RdsPicker() { parent_.reset(DEBUG_LOCATION, "RdsPicker"); } PickResult Pick(PickArgs args) override; private: - RefCountedPtr parent_; + RefCountedPtr parent_; PickerList pickers_; }; - // Each WeightedChild holds a ref to its parent WeightedTargetLb. - class WeightedChild : public InternallyRefCounted { + // Each RdsChild holds a ref to its parent RdsLb. + class RdsChild : public InternallyRefCounted { public: - WeightedChild(RefCountedPtr weighted_target_policy, - const std::string& name); - ~WeightedChild(); + RdsChild(RefCountedPtr rds_policy, const std::string& name); + ~RdsChild(); void Orphan() override; - void UpdateLocked(const WeightedTargetLbConfig::ChildConfig& config, + void UpdateLocked(const RdsLbConfig::ChildConfig& config, const ServerAddressList& addresses, const grpc_channel_args* args); void ExitIdleLocked(); void ResetBackoffLocked(); void DeactivateLocked(); - uint32_t weight() const { return weight_; } grpc_connectivity_state connectivity_state() const { return connectivity_state_; } @@ -140,10 +134,10 @@ class WeightedTargetLb : public LoadBalancingPolicy { private: class Helper : public ChannelControlHelper { public: - explicit Helper(RefCountedPtr weighted_child) - : weighted_child_(std::move(weighted_child)) {} + explicit Helper(RefCountedPtr rds_child) + : rds_child_(std::move(rds_child)) {} - ~Helper() { weighted_child_.reset(DEBUG_LOCATION, "Helper"); } + ~Helper() { rds_child_.reset(DEBUG_LOCATION, "Helper"); } RefCountedPtr CreateSubchannel( const grpc_channel_args& args) override; @@ -153,7 +147,7 @@ class WeightedTargetLb : public LoadBalancingPolicy { void AddTraceEvent(TraceSeverity severity, StringView message) override; private: - RefCountedPtr weighted_child_; + RefCountedPtr rds_child_; }; // Methods for dealing with the child policy. @@ -164,13 +158,11 @@ class WeightedTargetLb : public LoadBalancingPolicy { static void OnDelayedRemovalTimerLocked(void* arg, grpc_error* error); // The owning LB policy. - RefCountedPtr weighted_target_policy_; + RefCountedPtr rds_policy_; - // Points to the corresponding key in WeightedTargetLb::targets_. + // Points to the corresponding key in RdsLb::actions_. const std::string& name_; - uint32_t weight_; - OrphanablePtr child_policy_; RefCountedPtr picker_wrapper_; @@ -184,7 +176,7 @@ class WeightedTargetLb : public LoadBalancingPolicy { bool shutdown_ = false; }; - ~WeightedTargetLb(); + ~RdsLb(); void ShutdownLocked() override; @@ -193,138 +185,116 @@ class WeightedTargetLb : public LoadBalancingPolicy { const grpc_millis child_retention_interval_ms_; // Current config from the resolver. - RefCountedPtr config_; + RefCountedPtr config_; // Internal state. bool shutting_down_ = false; // Children. - std::map> targets_; + std::map> actions_; }; // -// WeightedTargetLb::WeightedPicker +// RdsLb::RdsPicker // -WeightedTargetLb::PickResult WeightedTargetLb::WeightedPicker::Pick( - PickArgs args) { - // Generate a random number in [0, total weight). - const uint32_t key = rand() % pickers_[pickers_.size() - 1].first; - // Find the index in pickers_ corresponding to key. - size_t mid = 0; - size_t start_index = 0; - size_t end_index = pickers_.size() - 1; - size_t index = 0; - while (end_index > start_index) { - mid = (start_index + end_index) / 2; - if (pickers_[mid].first > key) { - end_index = mid; - } else if (pickers_[mid].first < key) { - start_index = mid + 1; - } else { - index = mid + 1; - break; - } - } - if (index == 0) index = start_index; - GPR_ASSERT(pickers_[index].first > key); - // Delegate to the child picker. - return pickers_[index].second->Pick(args); +RdsLb::PickResult RdsLb::RdsPicker::Pick(PickArgs args) { + gpr_log( + GPR_INFO, + "donna Picking not implemented yet, just always use the one and only"); + return pickers_[0]->Pick(args); } // -// WeightedTargetLb +// RdsLb // -WeightedTargetLb::WeightedTargetLb(Args args) +RdsLb::RdsLb(Args args) : LoadBalancingPolicy(std::move(args)), -// FIXME: new channel arg + // FIXME: new channel arg child_retention_interval_ms_(grpc_channel_args_find_integer( args.args, GRPC_ARG_LOCALITY_RETENTION_INTERVAL_MS, {GRPC_WEIGHTED_TARGET_CHILD_RETENTION_INTERVAL_MS, 0, INT_MAX})) {} -WeightedTargetLb::~WeightedTargetLb() { - if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_weighted_target_trace)) { - gpr_log(GPR_INFO, "[weighted_target_lb %p] destroying weighted_target LB policy", - this); +RdsLb::~RdsLb() { + if (GRPC_TRACE_FLAG_ENABLED(grpc_rds_lb_trace)) { + gpr_log(GPR_INFO, "[rds_lb %p] destroying rds LB policy", this); } } -void WeightedTargetLb::ShutdownLocked() { - if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_weighted_target_trace)) { - gpr_log(GPR_INFO, "[weighted_target_lb %p] shutting down", this); +void RdsLb::ShutdownLocked() { + if (GRPC_TRACE_FLAG_ENABLED(grpc_rds_lb_trace)) { + gpr_log(GPR_INFO, "[rds_lb %p] shutting down", this); } shutting_down_ = true; - targets_.clear(); + actions_.clear(); } -void WeightedTargetLb::ExitIdleLocked() { - for (auto& p : targets_) p.second->ExitIdleLocked(); +void RdsLb::ExitIdleLocked() { + for (auto& p : actions_) p.second->ExitIdleLocked(); } -void WeightedTargetLb::ResetBackoffLocked() { - for (auto& p : targets_) p.second->ResetBackoffLocked(); +void RdsLb::ResetBackoffLocked() { + for (auto& p : actions_) p.second->ResetBackoffLocked(); } -void WeightedTargetLb::UpdateLocked(UpdateArgs args) { +void RdsLb::UpdateLocked(UpdateArgs args) { if (shutting_down_) return; - if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_weighted_target_trace)) { - gpr_log(GPR_INFO, "[weighted_target_lb %p] Received update", this); + if (GRPC_TRACE_FLAG_ENABLED(grpc_rds_lb_trace)) { + gpr_log(GPR_INFO, "[rds_lb %p] Received update", this); } // Update config. config_ = std::move(args.config); - // Deactivate the targets not in the new config. - for (auto it = targets_.begin(); it != targets_.end();) { + // Deactivate the actions not in the new config. + for (auto it = actions_.begin(); it != actions_.end();) { const std::string& name = it->first; - WeightedChild* child = it->second.get(); - if (config_->target_map().find(name) != config_->target_map().end()) { + RdsChild* child = it->second.get(); + if (config_->action_map().find(name) != config_->action_map().end()) { ++it; continue; } if (child_retention_interval_ms_ == 0) { - it = targets_.erase(it); + it = actions_.erase(it); } else { child->DeactivateLocked(); ++it; } } - // Add or update the targets in the new config. - for (const auto& p : config_->target_map()) { + // Add or update the actions in the new config. + for (const auto& p : config_->action_map()) { const std::string& name = p.first; - const WeightedTargetLbConfig::ChildConfig& config = p.second; - auto it = targets_.find(name); - if (it == targets_.end()) { - it = targets_.emplace(std::make_pair(name, nullptr)).first; - it->second = MakeOrphanable( - Ref(DEBUG_LOCATION, "WeightedChild"), it->first); + const RdsLbConfig::ChildConfig& config = p.second; + auto it = actions_.find(name); + if (it == actions_.end()) { + it = actions_.emplace(std::make_pair(name, nullptr)).first; + it->second = + MakeOrphanable(Ref(DEBUG_LOCATION, "RdsChild"), it->first); } it->second->UpdateLocked(config, args.addresses, args.args); } } -void WeightedTargetLb::UpdateStateLocked() { +void RdsLb::UpdateStateLocked() { // Construct a new picker which maintains a map of all child pickers // that are ready. Each child is represented by a portion of the range // proportional to its weight, such that the total range is the sum of the // weights of all children. - WeightedPicker::PickerList picker_list; - uint32_t end = 0; + RdsPicker::PickerList picker_list; // Also count the number of children in each state, to determine the // overall state. size_t num_connecting = 0; size_t num_idle = 0; size_t num_transient_failures = 0; - for (const auto& p : targets_) { + for (const auto& p : actions_) { const auto& child_name = p.first; - const WeightedChild* child = p.second.get(); - // Skip the targets that are not in the latest update. - if (config_->target_map().find(child_name) == config_->target_map().end()) { + const RdsChild* child = p.second.get(); + // Skip the actions that are not in the latest update. + if (config_->action_map().find(child_name) == config_->action_map().end()) { continue; } switch (child->connectivity_state()) { case GRPC_CHANNEL_READY: { - end += child->weight(); - picker_list.push_back(std::make_pair(end, child->picker_wrapper())); + picker_list.push_back(child->picker_wrapper()); break; } case GRPC_CHANNEL_CONNECTING: { @@ -354,62 +324,59 @@ void WeightedTargetLb::UpdateStateLocked() { } else { connectivity_state = GRPC_CHANNEL_TRANSIENT_FAILURE; } - if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_weighted_target_trace)) { - gpr_log(GPR_INFO, "[weighted_target_lb %p] connectivity changed to %s", - this, ConnectivityStateName(connectivity_state)); + if (GRPC_TRACE_FLAG_ENABLED(grpc_rds_lb_trace)) { + gpr_log(GPR_INFO, "[rds_lb %p] connectivity changed to %s", this, + ConnectivityStateName(connectivity_state)); } std::unique_ptr picker; switch (connectivity_state) { case GRPC_CHANNEL_READY: - picker = absl::make_unique( - Ref(DEBUG_LOCATION, "WeightedPicker"), std::move(picker_list)); + picker = absl::make_unique(Ref(DEBUG_LOCATION, "RdsPicker"), + std::move(picker_list)); break; case GRPC_CHANNEL_CONNECTING: case GRPC_CHANNEL_IDLE: - picker = absl::make_unique( - Ref(DEBUG_LOCATION, "QueuePicker")); + picker = + absl::make_unique(Ref(DEBUG_LOCATION, "QueuePicker")); break; default: picker = absl::make_unique( GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "weighted_target: all children report state TRANSIENT_FAILURE")); + "rds: all children report state TRANSIENT_FAILURE")); } channel_control_helper()->UpdateState(connectivity_state, std::move(picker)); } // -// WeightedTargetLb::WeightedChild +// RdsLb::RdsChild // -WeightedTargetLb::WeightedChild::WeightedChild( - RefCountedPtr weighted_target_policy, - const std::string& name) - : weighted_target_policy_(std::move(weighted_target_policy)), name_(name) { - if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_weighted_target_trace)) { - gpr_log(GPR_INFO, "[weighted_target_lb %p] created WeightedChild %p for %s", - weighted_target_policy_.get(), this, name_.c_str()); +RdsLb::RdsChild::RdsChild(RefCountedPtr rds_policy, + const std::string& name) + : rds_policy_(std::move(rds_policy)), name_(name) { + if (GRPC_TRACE_FLAG_ENABLED(grpc_rds_lb_trace)) { + gpr_log(GPR_INFO, "[rds_lb %p] created RdsChild %p for %s", + rds_policy_.get(), this, name_.c_str()); } } -WeightedTargetLb::WeightedChild::~WeightedChild() { - if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_weighted_target_trace)) { - gpr_log(GPR_INFO, - "[weighted_target_lb %p] WeightedChild %p %s: destroying child", - weighted_target_policy_.get(), this, name_.c_str()); +RdsLb::RdsChild::~RdsChild() { + if (GRPC_TRACE_FLAG_ENABLED(grpc_rds_lb_trace)) { + gpr_log(GPR_INFO, "[rds_lb %p] RdsChild %p %s: destroying child", + rds_policy_.get(), this, name_.c_str()); } - weighted_target_policy_.reset(DEBUG_LOCATION, "WeightedChild"); + rds_policy_.reset(DEBUG_LOCATION, "RdsChild"); } -void WeightedTargetLb::WeightedChild::Orphan() { - if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_weighted_target_trace)) { - gpr_log(GPR_INFO, - "[weighted_target_lb %p] WeightedChild %p %s: shutting down child", - weighted_target_policy_.get(), this, name_.c_str()); +void RdsLb::RdsChild::Orphan() { + if (GRPC_TRACE_FLAG_ENABLED(grpc_rds_lb_trace)) { + gpr_log(GPR_INFO, "[rds_lb %p] RdsChild %p %s: shutting down child", + rds_policy_.get(), this, name_.c_str()); } // Remove the child policy's interested_parties pollset_set from the // xDS policy. grpc_pollset_set_del_pollset_set(child_policy_->interested_parties(), - weighted_target_policy_->interested_parties()); + rds_policy_->interested_parties()); child_policy_.reset(); // Drop our ref to the child's picker, in case it's holding a ref to // the child. @@ -421,39 +388,35 @@ void WeightedTargetLb::WeightedChild::Orphan() { Unref(); } -OrphanablePtr -WeightedTargetLb::WeightedChild::CreateChildPolicyLocked( +OrphanablePtr RdsLb::RdsChild::CreateChildPolicyLocked( const grpc_channel_args* args) { LoadBalancingPolicy::Args lb_policy_args; - lb_policy_args.combiner = weighted_target_policy_->combiner(); + lb_policy_args.combiner = rds_policy_->combiner(); lb_policy_args.args = args; lb_policy_args.channel_control_helper = absl::make_unique(this->Ref(DEBUG_LOCATION, "Helper")); OrphanablePtr lb_policy = MakeOrphanable(std::move(lb_policy_args), - &grpc_lb_weighted_target_trace); - if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_weighted_target_trace)) { + &grpc_rds_lb_trace); + if (GRPC_TRACE_FLAG_ENABLED(grpc_rds_lb_trace)) { gpr_log(GPR_INFO, - "[weighted_target_lb %p] WeightedChild %p %s: Created new child " + "[rds_lb %p] RdsChild %p %s: Created new child " "policy handler %p", - weighted_target_policy_.get(), this, name_.c_str(), - lb_policy.get()); + rds_policy_.get(), this, name_.c_str(), lb_policy.get()); } // Add the xDS's interested_parties pollset_set to that of the newly created // child policy. This will make the child policy progress upon activity on // xDS LB, which in turn is tied to the application's call. - grpc_pollset_set_add_pollset_set( - lb_policy->interested_parties(), - weighted_target_policy_->interested_parties()); + grpc_pollset_set_add_pollset_set(lb_policy->interested_parties(), + rds_policy_->interested_parties()); return lb_policy; } -void WeightedTargetLb::WeightedChild::UpdateLocked( - const WeightedTargetLbConfig::ChildConfig& config, - const ServerAddressList& addresses, const grpc_channel_args* args) { - if (weighted_target_policy_->shutting_down_) return; +void RdsLb::RdsChild::UpdateLocked(const RdsLbConfig::ChildConfig& config, + const ServerAddressList& addresses, + const grpc_channel_args* args) { + if (rds_policy_->shutting_down_) return; // Update child weight. - weight_ = config.weight; // Reactivate if needed. if (delayed_removal_timer_callback_pending_) { grpc_timer_cancel(&delayed_removal_timer_); @@ -468,212 +431,193 @@ void WeightedTargetLb::WeightedChild::UpdateLocked( update_args.addresses = addresses; update_args.args = grpc_channel_args_copy(args); // Update the policy. - if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_weighted_target_trace)) { + if (GRPC_TRACE_FLAG_ENABLED(grpc_rds_lb_trace)) { gpr_log(GPR_INFO, - "[weighted_target_lb %p] WeightedChild %p %s: Updating child " + "[rds_lb %p] RdsChild %p %s: Updating child " "policy handler %p", - weighted_target_policy_.get(), this, name_.c_str(), - child_policy_.get()); + rds_policy_.get(), this, name_.c_str(), child_policy_.get()); } child_policy_->UpdateLocked(std::move(update_args)); } -void WeightedTargetLb::WeightedChild::ExitIdleLocked() { - child_policy_->ExitIdleLocked(); -} +void RdsLb::RdsChild::ExitIdleLocked() { child_policy_->ExitIdleLocked(); } -void WeightedTargetLb::WeightedChild::ResetBackoffLocked() { +void RdsLb::RdsChild::ResetBackoffLocked() { child_policy_->ResetBackoffLocked(); } -void WeightedTargetLb::WeightedChild::DeactivateLocked() { +void RdsLb::RdsChild::DeactivateLocked() { // If already deactivated, don't do that again. - if (weight_ == 0) return; // Set the child weight to 0 so that future picker won't contain this child. - weight_ = 0; // Start a timer to delete the child. - Ref(DEBUG_LOCATION, "WeightedChild+timer").release(); + Ref(DEBUG_LOCATION, "RdsChild+timer").release(); GRPC_CLOSURE_INIT(&on_delayed_removal_timer_, OnDelayedRemovalTimer, this, grpc_schedule_on_exec_ctx); grpc_timer_init( &delayed_removal_timer_, - ExecCtx::Get()->Now() + - weighted_target_policy_->child_retention_interval_ms_, + ExecCtx::Get()->Now() + rds_policy_->child_retention_interval_ms_, &on_delayed_removal_timer_); delayed_removal_timer_callback_pending_ = true; } -void WeightedTargetLb::WeightedChild::OnDelayedRemovalTimer(void* arg, - grpc_error* error) { - WeightedChild* self = static_cast(arg); - self->weighted_target_policy_->combiner()->Run( +void RdsLb::RdsChild::OnDelayedRemovalTimer(void* arg, grpc_error* error) { + RdsChild* self = static_cast(arg); + self->rds_policy_->combiner()->Run( GRPC_CLOSURE_INIT(&self->on_delayed_removal_timer_, OnDelayedRemovalTimerLocked, self, nullptr), GRPC_ERROR_REF(error)); } -void WeightedTargetLb::WeightedChild::OnDelayedRemovalTimerLocked( - void* arg, grpc_error* error) { - WeightedChild* self = static_cast(arg); +void RdsLb::RdsChild::OnDelayedRemovalTimerLocked(void* arg, + grpc_error* error) { + RdsChild* self = static_cast(arg); self->delayed_removal_timer_callback_pending_ = false; - if (error == GRPC_ERROR_NONE && !self->shutdown_ && self->weight_ == 0) { - self->weighted_target_policy_->targets_.erase(self->name_); + if (error == GRPC_ERROR_NONE && !self->shutdown_) { + self->rds_policy_->actions_.erase(self->name_); } - self->Unref(DEBUG_LOCATION, "WeightedChild+timer"); + self->Unref(DEBUG_LOCATION, "RdsChild+timer"); } // -// WeightedTargetLb::WeightedChild::Helper +// RdsLb::RdsChild::Helper // -RefCountedPtr -WeightedTargetLb::WeightedChild::Helper::CreateSubchannel( +RefCountedPtr RdsLb::RdsChild::Helper::CreateSubchannel( const grpc_channel_args& args) { - if (weighted_child_->weighted_target_policy_->shutting_down_) return nullptr; - return weighted_child_->weighted_target_policy_->channel_control_helper()->CreateSubchannel( + if (rds_child_->rds_policy_->shutting_down_) return nullptr; + return rds_child_->rds_policy_->channel_control_helper()->CreateSubchannel( args); } -void WeightedTargetLb::WeightedChild::Helper::UpdateState( +void RdsLb::RdsChild::Helper::UpdateState( grpc_connectivity_state state, std::unique_ptr picker) { - if (weighted_child_->weighted_target_policy_->shutting_down_) return; - // Cache the picker in the WeightedChild. - weighted_child_->picker_wrapper_ = + if (rds_child_->rds_policy_->shutting_down_) return; + // Cache the picker in the RdsChild. + rds_child_->picker_wrapper_ = MakeRefCounted(std::move(picker)); // Decide what state to report for aggregation purposes. // If we haven't seen a failure since the last time we were in state // READY, then we report the state change as-is. However, once we do see // a failure, we report TRANSIENT_FAILURE and ignore any subsequent state // changes until we go back into state READY. - if (!weighted_child_->seen_failure_since_ready_) { + if (!rds_child_->seen_failure_since_ready_) { if (state == GRPC_CHANNEL_TRANSIENT_FAILURE) { - weighted_child_->seen_failure_since_ready_ = true; + rds_child_->seen_failure_since_ready_ = true; } } else { if (state != GRPC_CHANNEL_READY) return; - weighted_child_->seen_failure_since_ready_ = false; + rds_child_->seen_failure_since_ready_ = false; } - weighted_child_->connectivity_state_ = state; + rds_child_->connectivity_state_ = state; // Notify the LB policy. - weighted_child_->weighted_target_policy_->UpdateStateLocked(); + rds_child_->rds_policy_->UpdateStateLocked(); } -void WeightedTargetLb::WeightedChild::Helper::RequestReresolution() { - if (weighted_child_->weighted_target_policy_->shutting_down_) return; - weighted_child_->weighted_target_policy_->channel_control_helper()->RequestReresolution(); +void RdsLb::RdsChild::Helper::RequestReresolution() { + if (rds_child_->rds_policy_->shutting_down_) return; + rds_child_->rds_policy_->channel_control_helper()->RequestReresolution(); } -void WeightedTargetLb::WeightedChild::Helper::AddTraceEvent(TraceSeverity severity, - StringView message) { - if (weighted_child_->weighted_target_policy_->shutting_down_) return; - weighted_child_->weighted_target_policy_->channel_control_helper()->AddTraceEvent( - severity, message); +void RdsLb::RdsChild::Helper::AddTraceEvent(TraceSeverity severity, + StringView message) { + if (rds_child_->rds_policy_->shutting_down_) return; + rds_child_->rds_policy_->channel_control_helper()->AddTraceEvent(severity, + message); } // // factory // -class WeightedTargetLbFactory : public LoadBalancingPolicyFactory { +class RdsLbFactory : public LoadBalancingPolicyFactory { public: OrphanablePtr CreateLoadBalancingPolicy( LoadBalancingPolicy::Args args) const override { - return MakeOrphanable(std::move(args)); + return MakeOrphanable(std::move(args)); } - const char* name() const override { return kWeightedTarget; } + const char* name() const override { return kRds; } RefCountedPtr ParseLoadBalancingConfig( const Json& json, grpc_error** error) const override { GPR_DEBUG_ASSERT(error != nullptr && *error == GRPC_ERROR_NONE); if (json.type() == Json::Type::JSON_NULL) { - // weighted_target was mentioned as a policy in the deprecated + // rds was mentioned as a policy in the deprecated // loadBalancingPolicy field or in the client API. *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "field:loadBalancingPolicy error:weighted_target policy requires " + "field:loadBalancingPolicy error:rds policy requires " "configuration. Please use loadBalancingConfig field of service " "config instead."); return nullptr; } std::vector error_list; // Weight map. - WeightedTargetLbConfig::TargetMap target_map; - auto it = json.object_value().find("targets"); + RdsLbConfig::ActionMap action_map; + auto it = json.object_value().find("actions"); if (it == json.object_value().end()) { error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "field:targets error:required field not present")); - } else if (it->second.type() != Json::Type::OBJECT) { + "field:actions error:required field not present")); + } else if (it->second.type() != Json::Type::ARRAY) { error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "field:targets error:type should be object")); + "field:actions error:type should be array")); } else { - for (const auto& p : it->second.object_value()) { - WeightedTargetLbConfig::ChildConfig child_config; + for (const auto& p : it->second.array_value()) { + auto it_name = p.object_value().find("name"); + if (it_name == p.object_value().end()) { + error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "field:actions error: each action needs a name")); + } + auto it_child_policy = p.object_value().find("child_policy"); + if (it_child_policy == p.object_value().end()) { + error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "field:actions error: each action needs child policies")); + } + RdsLbConfig::ChildConfig child_config; std::vector child_errors = - ParseChildConfig(p.second, &child_config); + ParseChildConfig(it_child_policy->second, &child_config); if (!child_errors.empty()) { // Can't use GRPC_ERROR_CREATE_FROM_VECTOR() here, because the error // string is not static in this case. grpc_error* error = GRPC_ERROR_CREATE_FROM_COPIED_STRING( - absl::StrCat("field:targets key:", p.first).c_str()); + absl::StrCat("field:actions name:", + it_name->second.string_value()) + .c_str()); for (grpc_error* child_error : child_errors) { error = grpc_error_add_child(error, child_error); } error_list.push_back(error); } else { - target_map[p.first] = std::move(child_config); + action_map[it_name->second.string_value()] = std::move(child_config); } } } if (!error_list.empty()) { *error = GRPC_ERROR_CREATE_FROM_VECTOR( - "weighted_target_experimental LB policy config", &error_list); + "rds_experimental LB policy config", &error_list); return nullptr; } - return MakeRefCounted(std::move(target_map)); + return MakeRefCounted(std::move(action_map)); } private: static std::vector ParseChildConfig( - const Json& json, WeightedTargetLbConfig::ChildConfig* child_config) { + const Json& json, RdsLbConfig::ChildConfig* child_config) { std::vector error_list; - if (json.type() != Json::Type::OBJECT) { + if (json.type() != Json::Type::ARRAY) { error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "value should be of type object")); + "value should be of type array")); return error_list; } - // Weight. - auto it = json.object_value().find("weight"); - if (it == json.object_value().end()) { - error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "required field \"weight\" not specified")); - } else if (it->second.type() != Json::Type::NUMBER) { - error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "field:weight error:must be of type number")); - } else { - child_config->weight = - gpr_parse_nonnegative_int(it->second.string_value().c_str()); - if (child_config->weight == -1) { - error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "field:weight error:unparseable value")); - } else if (child_config->weight == 0) { - error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "field:weight error:value must be greater than zero")); - } - } - // Child policy. - it = json.object_value().find("childPolicy"); - if (it != json.object_value().end()) { - grpc_error* parse_error = GRPC_ERROR_NONE; - child_config->config = - LoadBalancingPolicyRegistry::ParseLoadBalancingConfig(it->second, - &parse_error); - if (child_config->config == nullptr) { - GPR_DEBUG_ASSERT(parse_error != GRPC_ERROR_NONE); - std::vector child_errors; - child_errors.push_back(parse_error); - error_list.push_back( - GRPC_ERROR_CREATE_FROM_VECTOR("field:childPolicy", &child_errors)); - } + grpc_error* parse_error = GRPC_ERROR_NONE; + child_config->config = + LoadBalancingPolicyRegistry::ParseLoadBalancingConfig( + json.array_value(), &parse_error); + if (child_config->config == nullptr) { + GPR_DEBUG_ASSERT(parse_error != GRPC_ERROR_NONE); + std::vector child_errors; + child_errors.push_back(parse_error); + error_list.push_back( + GRPC_ERROR_CREATE_FROM_VECTOR("field:childPolicy", &child_errors)); } return error_list; } @@ -687,10 +631,10 @@ class WeightedTargetLbFactory : public LoadBalancingPolicyFactory { // Plugin registration // -void grpc_lb_policy_weighted_target_init() { +void grpc_lb_policy_rds_init() { grpc_core::LoadBalancingPolicyRegistry::Builder:: RegisterLoadBalancingPolicyFactory( - absl::make_unique()); + absl::make_unique()); } -void grpc_lb_policy_weighted_target_shutdown() {} +void grpc_lb_policy_rds_shutdown() {} diff --git a/src/core/ext/filters/client_channel/xds/xds_client.cc b/src/core/ext/filters/client_channel/xds/xds_client.cc index 42708fca556..a9725a392a9 100644 --- a/src/core/ext/filters/client_channel/xds/xds_client.cc +++ b/src/core/ext/filters/client_channel/xds/xds_client.cc @@ -1946,8 +1946,15 @@ grpc_error* XdsClient::CreateServiceConfig( gpr_asprintf(&json, "{\n" " \"loadBalancingConfig\":[\n" - " { \"cds_experimental\":{\n" - " \"cluster\": \"%s\"\n" + " { \"xds_routing_experimental\":{\n" + " \"actions\":[\n" + " { \"name\": \"default\",\n" + " \"child_policy\":[\n" + " { \"cds_experimental\":{\n" + " \"cluster\": \"%s\"\n" + " } }\n" + " ]\n" + " } ]\n" " } }\n" " ]\n" "}", diff --git a/src/core/plugin_registry/grpc_plugin_registry.cc b/src/core/plugin_registry/grpc_plugin_registry.cc index 20ad526d837..4af79901595 100644 --- a/src/core/plugin_registry/grpc_plugin_registry.cc +++ b/src/core/plugin_registry/grpc_plugin_registry.cc @@ -36,6 +36,8 @@ void grpc_lb_policy_grpclb_init(void); void grpc_lb_policy_grpclb_shutdown(void); void grpc_lb_policy_cds_init(void); void grpc_lb_policy_cds_shutdown(void); +void grpc_lb_policy_rds_init(void); +void grpc_lb_policy_rds_shutdown(void); void grpc_lb_policy_xds_init(void); void grpc_lb_policy_xds_shutdown(void); void grpc_lb_policy_pick_first_init(void); @@ -78,6 +80,8 @@ void grpc_register_built_in_plugins(void) { grpc_lb_policy_grpclb_shutdown); grpc_register_plugin(grpc_lb_policy_cds_init, grpc_lb_policy_cds_shutdown); + grpc_register_plugin(grpc_lb_policy_rds_init, + grpc_lb_policy_rds_shutdown); grpc_register_plugin(grpc_lb_policy_xds_init, grpc_lb_policy_xds_shutdown); grpc_register_plugin(grpc_lb_policy_pick_first_init, diff --git a/src/core/plugin_registry/grpc_unsecure_plugin_registry.cc b/src/core/plugin_registry/grpc_unsecure_plugin_registry.cc index bfed2e22ddd..c150d64bb62 100644 --- a/src/core/plugin_registry/grpc_unsecure_plugin_registry.cc +++ b/src/core/plugin_registry/grpc_unsecure_plugin_registry.cc @@ -44,6 +44,8 @@ void grpc_lb_policy_grpclb_init(void); void grpc_lb_policy_grpclb_shutdown(void); void grpc_lb_policy_cds_init(void); void grpc_lb_policy_cds_shutdown(void); +void grpc_lb_policy_rds_init(void); +void grpc_lb_policy_rds_shutdown(void); void grpc_lb_policy_xds_init(void); void grpc_lb_policy_xds_shutdown(void); void grpc_lb_policy_pick_first_init(void); @@ -86,6 +88,8 @@ void grpc_register_built_in_plugins(void) { grpc_lb_policy_grpclb_shutdown); grpc_register_plugin(grpc_lb_policy_cds_init, grpc_lb_policy_cds_shutdown); + grpc_register_plugin(grpc_lb_policy_rds_init, + grpc_lb_policy_rds_shutdown); grpc_register_plugin(grpc_lb_policy_xds_init, grpc_lb_policy_xds_shutdown); grpc_register_plugin(grpc_lb_policy_pick_first_init, diff --git a/test/cpp/end2end/xds_end2end_test.cc b/test/cpp/end2end/xds_end2end_test.cc index 1fbdbad953e..522ed07d202 100644 --- a/test/cpp/end2end/xds_end2end_test.cc +++ b/test/cpp/end2end/xds_end2end_test.cc @@ -1546,9 +1546,9 @@ TEST_P(BasicTest, Vanilla) { backends_[i]->backend_service()->request_count()); } // Check LB policy name for the channel. - EXPECT_EQ( - (GetParam().use_xds_resolver() ? "cds_experimental" : "xds_experimental"), - channel_->GetLoadBalancingPolicyName()); + EXPECT_EQ((GetParam().use_xds_resolver() ? "xds_routing_experimental" + : "xds_experimental"), + channel_->GetLoadBalancingPolicyName()); } TEST_P(BasicTest, IgnoresUnhealthyEndpoints) { From 5c8f4f97b7cbb4ab99e34ce0273b1142e39d72d6 Mon Sep 17 00:00:00 2001 From: Matthew Stevenson Date: Tue, 10 Mar 2020 09:50:40 -0700 Subject: [PATCH 103/758] Add TSI_CLOSE_NOTIFY result. --- src/core/tsi/transport_security_interface.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/core/tsi/transport_security_interface.h b/src/core/tsi/transport_security_interface.h index 8b4c9299ed4..ac7d15340fa 100644 --- a/src/core/tsi/transport_security_interface.h +++ b/src/core/tsi/transport_security_interface.h @@ -44,6 +44,7 @@ typedef enum { TSI_OUT_OF_RESOURCES = 12, TSI_ASYNC = 13, TSI_HANDSHAKE_SHUTDOWN = 14, + TSI_CLOSE_NOTIFY = 15, // Indicates that the connection should be closed. } tsi_result; typedef enum { From 4741da3a111250f42bb69d83f58db7a5599b2a0b Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Tue, 10 Mar 2020 10:26:46 -0700 Subject: [PATCH 104/758] Remove unused variable --- .../grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi | 1 - 1 file changed, 1 deletion(-) diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi index 33d1f348c75..7dd1f68f10c 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi @@ -40,7 +40,6 @@ cdef class PollerCompletionQueue(BaseCompletionQueue): cdef void _poll(self) except *: cdef grpc_event event cdef CallbackContext *context - cdef object waiter while not self._shutdown: with nogil: From b4d5901b5ed0751a5e4f140c52c152da58fe4e86 Mon Sep 17 00:00:00 2001 From: "Mark D. Roth" Date: Tue, 10 Mar 2020 10:49:24 -0700 Subject: [PATCH 105/758] clean up test code --- test/cpp/end2end/xds_end2end_test.cc | 310 ++++++++++++--------------- 1 file changed, 136 insertions(+), 174 deletions(-) diff --git a/test/cpp/end2end/xds_end2end_test.cc b/test/cpp/end2end/xds_end2end_test.cc index 1fbdbad953e..e8430e3b01c 100644 --- a/test/cpp/end2end/xds_end2end_test.cc +++ b/test/cpp/end2end/xds_end2end_test.cc @@ -400,7 +400,7 @@ class AdsServiceImpl : public AggregatedDiscoveryService::Service, std::pair>; // A struct representing a client's subscription to a particular resource. - struct SubscriberState { + struct SubscriptionState { // Version that the client currently knows about. int current_version = 0; // The queue upon which to place updates when the resource is updated. @@ -408,23 +408,25 @@ class AdsServiceImpl : public AggregatedDiscoveryService::Service, }; // A struct representing the a client's subscription to all the resources. + using SubscriptionNameMap = + std::map; using SubscriptionMap = - std::map>; + std::map; // A struct representing the current state for a resource: // - the version of the resource that is set by the SetResource() methods. - // - a list of subscribers interested in this resource. + // - a list of subscriptions interested in this resource. struct ResourceState { int version = 0; absl::optional resource; - std::set subscribers; + std::set subscriptions; }; // A struct representing the current state for all resources: // LDS, CDS, EDS, and RDS for the class as a whole. - using ResourcesMap = - std::map>; + using ResourceNameMap = + std::map; + using ResourceMap = std::map; AdsServiceImpl(bool enable_load_reporting) { // Construct RDS response data. @@ -475,101 +477,61 @@ class AdsServiceImpl : public AggregatedDiscoveryService::Service, } // Checks whether the client needs to receive a newer version of - // the resource. - bool ClientNeedsResourceUpdate(const string& resource_type, - const string& name, - SubscriptionMap* subscription_map) { - auto subscriber_it = (*subscription_map)[resource_type].find(name); - if (subscriber_it == (*subscription_map)[resource_type].end()) { - gpr_log(GPR_INFO, - "ADS[%p]: Skipping an unsubscribed update for resource %s and " - "name %s", - this, resource_type.c_str(), name.c_str()); - return false; - } - const auto& resource_state = resources_map_[resource_type][name]; - if (subscriber_it->second.current_version < resource_state.version) { - subscriber_it->second.current_version = resource_state.version; - gpr_log(GPR_INFO, - "ADS[%p]: Need to process new %s update %s, bring current to %d", - this, resource_type.c_str(), name.c_str(), - subscriber_it->second.current_version); + // the resource. If so, updates subscription_state->current_version and + // returns true. + bool ClientNeedsResourceUpdate(const ResourceState& resource_state, + SubscriptionState* subscription_state) { + if (subscription_state->current_version < resource_state.version) { + subscription_state->current_version = resource_state.version; return true; - } else { - gpr_log(GPR_INFO, - "ADS[%p]: Skipping an old %s update %s, current is at %d", this, - resource_type.c_str(), name.c_str(), - subscriber_it->second.current_version); - return false; } return false; } - // Resource subscription: - // 1. inserting an entry into the subscription map indexed by resource - // type/name pair. - // 2. inserting or updating an entry into the resources map indexed - // by resource type/name pair about this subscription. - void ResourceSubscribe(const std::string& resource_type, - const std::string& name, UpdateQueue* update_queue, - SubscriptionMap* subscription_map) { - SubscriberState& subscriber_state = - (*subscription_map)[resource_type][name]; - subscriber_state.update_queue = update_queue; - ResourceState& resource_state = resources_map_[resource_type][name]; - resource_state.subscribers.emplace(&subscriber_state); - gpr_log( - GPR_INFO, - "ADS[%p]: subscribe to resource type %s name %s version %d state %p", - this, resource_type.c_str(), name.c_str(), resource_state.version, - &subscriber_state); - } - - // Resource unsubscription: - // 1. update the entry in the resources map indexed - // by resource type/name pair to remove this subscription - // 2. remove this entry from the subscription map. - // 3. remove this resource type from the subscription map if there are no more - // resources subscribed for the resource type. - void ResourceUnsubscribe(const std::string& resource_type, - const std::string& name, - SubscriptionMap* subscription_map) { - auto subscription_by_type_it = subscription_map->find(resource_type); - if (subscription_by_type_it == subscription_map->end()) { - gpr_log(GPR_INFO, "ADS[%p]: resource type %s not subscribed", this, - resource_type.c_str()); - return; - } - auto& subscription_by_type_map = subscription_by_type_it->second; - auto subscription_it = subscription_by_type_map.find(name); - if (subscription_it == subscription_by_type_map.end()) { - gpr_log(GPR_INFO, "ADS[%p]: resource name %s of type %s not subscribed", - this, name.c_str(), resource_type.c_str()); - return; - } - gpr_log(GPR_INFO, - "ADS[%p]: Unsubscribe to resource type %s name %s state %p", this, - resource_type.c_str(), name.c_str(), &subscription_it->second); - auto resource_by_type_it = resources_map_.find(resource_type); - GPR_ASSERT(resource_by_type_it != resources_map_.end()); - auto& resource_by_type_map = resource_by_type_it->second; - auto resource_it = resource_by_type_map.find(name); - GPR_ASSERT(resource_it != resource_by_type_map.end()); - resource_it->second.subscribers.erase(&subscription_it->second); - if (resource_it->second.subscribers.empty() && - !resource_it->second.resource.has_value()) { - gpr_log(GPR_INFO, - "ADS[%p]: Erasing resource type %s name %s from resource map " - "since there are no more subscribers for this unset resource", - this, resource_type.c_str(), name.c_str()); - resource_by_type_map.erase(resource_it); - } - subscription_by_type_map.erase(subscription_it); - if (subscription_by_type_map.empty()) { - gpr_log(GPR_INFO, - "ADS[%p]: Erasing resource type %s from subscription_map", this, - resource_type.c_str()); - subscription_map->erase(subscription_by_type_it); + // Subscribes to a resource if not already subscribed: + // 1. Sets the update_queue field in subscription_state. + // 2. Adds subscription_state to resource_state->subscriptions. + void MaybeSubscribe(const std::string& resource_type, + const std::string& resource_name, + SubscriptionState* subscription_state, + ResourceState* resource_state, + UpdateQueue* update_queue) { + if (subscription_state->update_queue != nullptr) return; + subscription_state->update_queue = update_queue; + resource_state->subscriptions.emplace(subscription_state); + gpr_log(GPR_INFO, "ADS[%p]: subscribe to resource type %s name %s state %p", + this, resource_type.c_str(), resource_name.c_str(), + &subscription_state); + } + + // Removes subscriptions for resources no longer present in the + // current request. + void ProcessUnsubscriptions( + const std::string& resource_type, + const std::set& resources_in_current_request, + SubscriptionNameMap* subscription_name_map, + ResourceNameMap* resource_name_map) { + for (auto it = subscription_name_map->begin(); + it != subscription_name_map->end();) { + const std::string& resource_name = it->first; + SubscriptionState& subscription_state = it->second; + if (resources_in_current_request.find(resource_name) != + resources_in_current_request.end()) { + ++it; + continue; + } + gpr_log(GPR_INFO, "ADS[%p]: Unsubscribe to type=%s name=%s state=%p", + this, resource_type.c_str(), resource_name.c_str(), + &subscription_state); + auto resource_it = resource_name_map->find(resource_name); + GPR_ASSERT(resource_it != resource_name_map->end()); + auto& resource_state = resource_it->second; + resource_state.subscriptions.erase(&subscription_state); + if (resource_state.subscriptions.empty() && + !resource_state.resource.has_value()) { + resource_name_map->erase(resource_it); + } + it = subscription_name_map->erase(it); } } @@ -577,7 +539,7 @@ class AdsServiceImpl : public AggregatedDiscoveryService::Service, // for all resources and by adding all subscribed resources for LDS and CDS. void CompleteBuildingDiscoveryResponse( const std::string& resource_type, const int version, - const SubscriptionMap& subscription_map, + const SubscriptionNameMap& subscription_name_map, const std::set& resources_added_to_response, DiscoveryResponse* response) { resource_type_response_state_[resource_type] = SENT; @@ -587,18 +549,15 @@ class AdsServiceImpl : public AggregatedDiscoveryService::Service, if (resource_type == kLdsTypeUrl || resource_type == kCdsTypeUrl) { // For LDS and CDS we must send back all subscribed resources // (even the unchanged ones) - auto subscription_map_by_type_it = subscription_map.find(resource_type); - GPR_ASSERT(subscription_map_by_type_it != subscription_map.end()); - for (const auto& subscription : subscription_map_by_type_it->second) { - if (resources_added_to_response.find(subscription.first) == + for (const auto& p : subscription_name_map) { + const std::string& resource_name = p.first; + if (resources_added_to_response.find(resource_name) == resources_added_to_response.end()) { - absl::optional& resource = - resources_map_[resource_type][subscription.first].resource; - if (resource.has_value()) { - response->add_resources()->CopyFrom(resource.value()); - } else { - gpr_log(GPR_INFO, "ADS[%p]: Unknown resource type %s and name %s", - this, resource_type.c_str(), subscription.first.c_str()); + const ResourceState& resource_state = + resource_map_[resource_type][resource_name]; + if (resource_state.resource.has_value()) { + response->add_resources()->CopyFrom( + resource_state.resource.value()); } } } @@ -622,7 +581,6 @@ class AdsServiceImpl : public AggregatedDiscoveryService::Service, // Resources that the client will be subscribed to keyed by resource type // url. SubscriptionMap subscription_map; - std::map subscriber_map; // Current Version map keyed by resource type url. std::map resource_type_version; // Creating blocking thread to read from stream. @@ -647,7 +605,8 @@ class AdsServiceImpl : public AggregatedDiscoveryService::Service, DiscoveryRequest request = std::move(requests.front()); requests.pop_front(); did_work = true; - gpr_log(GPR_INFO, "ADS[%p]: Handling request %s with content %s", + gpr_log(GPR_INFO, + "ADS[%p]: Received request for type %s with content %s", this, request.type_url().c_str(), request.DebugString().c_str()); // Identify ACK and NACK by looking for version information and @@ -667,58 +626,51 @@ class AdsServiceImpl : public AggregatedDiscoveryService::Service, // 3. unsubscribe if necessary if (resource_types_to_ignore_.find(request.type_url()) == resource_types_to_ignore_.end()) { + auto& subscription_name_map = + subscription_map[request.type_url()]; + auto& resource_name_map = resource_map_[request.type_url()]; std::set resources_in_current_request; std::set resources_added_to_response; for (const std::string& resource_name : request.resource_names()) { resources_in_current_request.emplace(resource_name); - auto subscriber_it = - subscription_map[request.type_url()].find(resource_name); - if (subscriber_it == - subscription_map[request.type_url()].end()) { - ResourceSubscribe(request.type_url(), resource_name, - &update_queue, &subscription_map); - } - if (ClientNeedsResourceUpdate(request.type_url(), resource_name, - &subscription_map)) { + auto& subscription_state = subscription_name_map[resource_name]; + auto& resource_state = resource_name_map[resource_name]; + MaybeSubscribe(request.type_url(), resource_name, + &subscription_state, &resource_state, + &update_queue); + if (ClientNeedsResourceUpdate(resource_state, + &subscription_state)) { + gpr_log( + GPR_INFO, + "ADS[%p]: Sending update for type=%s name=%s version=%d", + this, request.type_url().c_str(), resource_name.c_str(), + resource_state.version); resources_added_to_response.emplace(resource_name); - gpr_log(GPR_INFO, - "ADS[%p]: Handling resource type %s and name %s", - this, request.type_url().c_str(), - resource_name.c_str()); - auto resource = - resources_map_[request.type_url()][resource_name]; - GPR_ASSERT(resource.resource.has_value()); - response.add_resources()->CopyFrom(resource.resource.value()); - } - } - // Remove subscriptions no longer requested: build a list of - // unsubscriber names first while iterating the subscription_map - // and then erase from the subscription_map in - // ResourceUnsubscribe. - std::set unsubscriber_list; - for (const auto& subscription : - subscription_map[request.type_url()]) { - if (resources_in_current_request.find(subscription.first) == - resources_in_current_request.end()) { - unsubscriber_list.emplace(subscription.first); + if (resource_state.resource.has_value()) { + response.add_resources()->CopyFrom( + resource_state.resource.value()); + } } } - for (const auto& name : unsubscriber_list) { - ResourceUnsubscribe(request.type_url(), name, - &subscription_map); - } - if (!response.resources().empty()) { + // Process unsubscriptions for any resource no longer + // present in the request's resource list. + ProcessUnsubscriptions( + request.type_url(), resources_in_current_request, + &subscription_name_map, &resource_name_map); + // Send response if needed. + if (!resources_added_to_response.empty()) { CompleteBuildingDiscoveryResponse( request.type_url(), ++resource_type_version[request.type_url()], - subscription_map, resources_added_to_response, &response); + subscription_name_map, resources_added_to_response, + &response); } } } } if (!response.resources().empty()) { - gpr_log(GPR_INFO, "ADS[%p]: sending request response '%s'", this, + gpr_log(GPR_INFO, "ADS[%p]: Sending response: %s", this, response.DebugString().c_str()); stream->Write(response); } @@ -727,32 +679,40 @@ class AdsServiceImpl : public AggregatedDiscoveryService::Service, { grpc_core::MutexLock lock(&ads_mu_); if (!update_queue.empty()) { - std::pair update = - std::move(update_queue.front()); + const std::string resource_type = + std::move(update_queue.front().first); + const std::string resource_name = + std::move(update_queue.front().second); update_queue.pop_front(); did_work = true; - gpr_log(GPR_INFO, "ADS[%p]: Handling update type %s name %s", this, - update.first.c_str(), update.second.c_str()); - auto subscriber_it = - subscription_map[update.first].find(update.second); - if (subscriber_it != subscription_map[update.first].end()) { - if (ClientNeedsResourceUpdate(update.first, update.second, - &subscription_map)) { - gpr_log(GPR_INFO, - "ADS[%p]: Updating resource type %s and name %s", this, - update.first.c_str(), update.second.c_str()); - auto resource = resources_map_[update.first][update.second]; - GPR_ASSERT(resource.resource.has_value()); - response.add_resources()->CopyFrom(resource.resource.value()); - CompleteBuildingDiscoveryResponse( - update.first, ++resource_type_version[update.first], - subscription_map, {update.second}, &response); + gpr_log(GPR_INFO, "ADS[%p]: Received update for type=%s name=%s", + this, resource_type.c_str(), resource_name.c_str()); + auto& subscription_name_map = subscription_map[resource_type]; + auto& resource_name_map = resource_map_[resource_type]; + auto it = subscription_name_map.find(resource_name); + if (it != subscription_name_map.end()) { + SubscriptionState& subscription_state = it->second; + ResourceState& resource_state = resource_name_map[resource_name]; + if (ClientNeedsResourceUpdate(resource_state, + &subscription_state)) { + gpr_log( + GPR_INFO, + "ADS[%p]: Sending update for type=%s name=%s version=%d", + this, resource_type.c_str(), resource_name.c_str(), + resource_state.version); + if (resource_state.resource.has_value()) { + response.add_resources()->CopyFrom( + resource_state.resource.value()); + CompleteBuildingDiscoveryResponse( + resource_type, ++resource_type_version[resource_type], + subscription_name_map, {resource_name}, &response); + } } } } } if (!response.resources().empty()) { - gpr_log(GPR_INFO, "ADS[%p]: sending update response '%s'", this, + gpr_log(GPR_INFO, "ADS[%p]: Sending update response: %s", this, response.DebugString().c_str()); stream->Write(response); } @@ -808,13 +768,13 @@ class AdsServiceImpl : public AggregatedDiscoveryService::Service, void SetResource(google::protobuf::Any resource, const std::string& type_url, const std::string& name) { grpc_core::MutexLock lock(&ads_mu_); - ResourceState& state = resources_map_[type_url][name]; + ResourceState& state = resource_map_[type_url][name]; ++state.version; state.resource = std::move(resource); gpr_log(GPR_INFO, "ADS[%p]: Updating %s resource %s to version %u", this, type_url.c_str(), name.c_str(), state.version); - for (SubscriberState* subscriber : state.subscribers) { - subscriber->update_queue->emplace_back(type_url, name); + for (SubscriptionState* subscription : state.subscriptions) { + subscription->update_queue->emplace_back(type_url, name); } } @@ -873,15 +833,17 @@ class AdsServiceImpl : public AggregatedDiscoveryService::Service, { grpc_core::MutexLock lock(&ads_mu_); NotifyDoneWithAdsCallLocked(); - resources_map_.clear(); + resource_map_.clear(); resource_type_response_state_.clear(); } gpr_log(GPR_INFO, "ADS[%p]: shut down", this); } - static ClusterLoadAssignment BuildEdsResource(const EdsResourceArgs& args) { + static ClusterLoadAssignment BuildEdsResource( + const EdsResourceArgs& args, + const char* cluster_name = kDefaultResourceName) { ClusterLoadAssignment assignment; - assignment.set_cluster_name(kDefaultResourceName); + assignment.set_cluster_name(cluster_name); for (const auto& locality : args.locality_list) { auto* endpoints = assignment.add_endpoints(); endpoints->mutable_load_balancing_weight()->set_value(locality.lb_weight); @@ -946,8 +908,8 @@ class AdsServiceImpl : public AggregatedDiscoveryService::Service, // Note that an entry will exist whenever either of the following is true: // - The resource exists (i.e., has been created by SetResource() and has not // yet been destroyed by UnsetResource()). - // - There is at least one subscriber for the resource. - ResourcesMap resources_map_; + // - There is at least one subscription for the resource. + ResourceMap resource_map_; }; class LrsServiceImpl : public LrsService, From c306d7940f311e2382cac637a794ae4f7e2a1c1c Mon Sep 17 00:00:00 2001 From: "Mark D. Roth" Date: Tue, 10 Mar 2020 10:53:39 -0700 Subject: [PATCH 106/758] add test for changing clusters --- test/cpp/end2end/xds_end2end_test.cc | 57 ++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/test/cpp/end2end/xds_end2end_test.cc b/test/cpp/end2end/xds_end2end_test.cc index e8430e3b01c..90922fb96ad 100644 --- a/test/cpp/end2end/xds_end2end_test.cc +++ b/test/cpp/end2end/xds_end2end_test.cc @@ -765,6 +765,18 @@ class AdsServiceImpl : public AggregatedDiscoveryService::Service, resource_types_to_ignore_.emplace(type_url); } + void UnsetResource(const std::string& type_url, const std::string& name) { + grpc_core::MutexLock lock(&ads_mu_); + ResourceState& state = resource_map_[type_url][name]; + ++state.version; + state.resource.reset(); + gpr_log(GPR_INFO, "ADS[%p]: Unsetting %s resource %s to version %u", this, + type_url.c_str(), name.c_str(), state.version); + for (SubscriptionState* subscription : state.subscriptions) { + subscription->update_queue->emplace_back(type_url, name); + } + } + void SetResource(google::protobuf::Any resource, const std::string& type_url, const std::string& name) { grpc_core::MutexLock lock(&ads_mu_); @@ -1639,6 +1651,45 @@ TEST_P(BasicTest, BackendsRestart) { true /* wait_for_ready */); } +using XdsResolverOnlyTest = BasicTest; + +// Tests switching over from one cluster to another. +TEST_P(XdsResolverOnlyTest, ChangeClusters) { + const char* kNewClusterName = "new_cluster_name"; + SetNextResolution({}); + SetNextResolutionForLbChannelAllBalancers(); + AdsServiceImpl::EdsResourceArgs args({ + {"locality0", GetBackendPorts(0, 2)}, + }); + balancers_[0]->ads_service()->SetEdsResource( + AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); + // We need to wait for all backends to come online. + WaitForAllBackends(0, 2); + // Populate new EDS resource. + AdsServiceImpl::EdsResourceArgs args2({ + {"locality0", GetBackendPorts(2, 4)}, + }); + balancers_[0]->ads_service()->SetEdsResource( + AdsServiceImpl::BuildEdsResource(args2, kNewClusterName), + kNewClusterName); + // Populate new CDS resource. + Cluster new_cluster = balancers_[0]->ads_service()->default_cluster(); + new_cluster.set_name(kNewClusterName); + balancers_[0]->ads_service()->SetCdsResource(new_cluster, kNewClusterName); + // Change RDS resource to point to new cluster. + RouteConfiguration new_route_config = + balancers_[0]->ads_service()->default_route_config(); + new_route_config.mutable_virtual_hosts(0)->mutable_routes(0) + ->mutable_route()->set_cluster(kNewClusterName); + Listener listener = + balancers_[0]->ads_service()->BuildListener(new_route_config); + balancers_[0]->ads_service()->SetLdsResource(listener, kDefaultResourceName); + // Wait for all new backends to be used. + std::tuple counts = WaitForAllBackends(2, 4); + // Make sure no RPCs failed in the transition. + EXPECT_EQ(0, std::get<1>(counts)); +} + using SecureNamingTest = BasicTest; // Tests that secure naming check passes if target name is expected. @@ -3307,6 +3358,12 @@ INSTANTIATE_TEST_SUITE_P(XdsTest, EdsTest, TestType(true, true)), &TestTypeName); +// XdsResolverOnlyTest depends on XdsResolver. +INSTANTIATE_TEST_SUITE_P(XdsTest, XdsResolverOnlyTest, + ::testing::Values(TestType(true, false), + TestType(true, true)), + &TestTypeName); + INSTANTIATE_TEST_SUITE_P(XdsTest, LocalityMapTest, ::testing::Values(TestType(false, true), TestType(false, false), From 46b44146552ce4a3dc112d844ce9bbc6b9546d28 Mon Sep 17 00:00:00 2001 From: "Mark D. Roth" Date: Tue, 10 Mar 2020 11:44:39 -0700 Subject: [PATCH 107/758] change logic to send empty response when resources go away --- test/cpp/end2end/xds_end2end_test.cc | 31 ++++++++++++++-------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/test/cpp/end2end/xds_end2end_test.cc b/test/cpp/end2end/xds_end2end_test.cc index 90922fb96ad..1b3d792d9fb 100644 --- a/test/cpp/end2end/xds_end2end_test.cc +++ b/test/cpp/end2end/xds_end2end_test.cc @@ -351,7 +351,6 @@ class ClientStats { std::map dropped_requests_; }; -// TODO(roth): Change this service to a real fake. class AdsServiceImpl : public AggregatedDiscoveryService::Service, public std::enable_shared_from_this { public: @@ -594,7 +593,7 @@ class AdsServiceImpl : public AggregatedDiscoveryService::Service, // Main loop to look for requests and updates. while (true) { // Look for new requests and and decide what to handle. - DiscoveryResponse response; + absl::optional response; // Boolean to keep track if the loop received any work to do: a request // or an update; regardless whether a response was actually sent out. bool did_work = false; @@ -647,8 +646,9 @@ class AdsServiceImpl : public AggregatedDiscoveryService::Service, this, request.type_url().c_str(), resource_name.c_str(), resource_state.version); resources_added_to_response.emplace(resource_name); + if (!response.has_value()) response.emplace(); if (resource_state.resource.has_value()) { - response.add_resources()->CopyFrom( + response->add_resources()->CopyFrom( resource_state.resource.value()); } } @@ -664,17 +664,17 @@ class AdsServiceImpl : public AggregatedDiscoveryService::Service, request.type_url(), ++resource_type_version[request.type_url()], subscription_name_map, resources_added_to_response, - &response); + &response.value()); } } } } - if (!response.resources().empty()) { + if (response.has_value()) { gpr_log(GPR_INFO, "ADS[%p]: Sending response: %s", this, - response.DebugString().c_str()); - stream->Write(response); + response->DebugString().c_str()); + stream->Write(response.value()); } - response.Clear(); + response.reset(); // Look for updates and decide what to handle. { grpc_core::MutexLock lock(&ads_mu_); @@ -700,21 +700,22 @@ class AdsServiceImpl : public AggregatedDiscoveryService::Service, "ADS[%p]: Sending update for type=%s name=%s version=%d", this, resource_type.c_str(), resource_name.c_str(), resource_state.version); + response.emplace(); if (resource_state.resource.has_value()) { - response.add_resources()->CopyFrom( + response->add_resources()->CopyFrom( resource_state.resource.value()); - CompleteBuildingDiscoveryResponse( - resource_type, ++resource_type_version[resource_type], - subscription_name_map, {resource_name}, &response); } + CompleteBuildingDiscoveryResponse( + resource_type, ++resource_type_version[resource_type], + subscription_name_map, {resource_name}, &response.value()); } } } } - if (!response.resources().empty()) { + if (response.has_value()) { gpr_log(GPR_INFO, "ADS[%p]: Sending update response: %s", this, - response.DebugString().c_str()); - stream->Write(response); + response->DebugString().c_str()); + stream->Write(response.value()); } // If we didn't find anything to do, delay before the next loop // iteration; otherwise, check whether we should exit and then From 2c783d7905af60a99a40e2e6edac1400b5279679 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Tue, 10 Mar 2020 13:41:49 -0700 Subject: [PATCH 108/758] Fix the test_time_remaining test --- src/python/grpcio_tests/tests_aio/unit/call_test.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/python/grpcio_tests/tests_aio/unit/call_test.py b/src/python/grpcio_tests/tests_aio/unit/call_test.py index 74bbc04be2f..f845e078684 100644 --- a/src/python/grpcio_tests/tests_aio/unit/call_test.py +++ b/src/python/grpcio_tests/tests_aio/unit/call_test.py @@ -457,16 +457,16 @@ class TestUnaryStreamCall(_MulticallableTestMixin, AioTestBase): # Should be around the same as the timeout remained_time = call.time_remaining() - self.assertGreater(remained_time, test_constants.SHORT_TIMEOUT * 3 // 2) - self.assertLess(remained_time, test_constants.SHORT_TIMEOUT * 2) + self.assertGreater(remained_time, test_constants.SHORT_TIMEOUT * 3 / 2) + self.assertLess(remained_time, test_constants.SHORT_TIMEOUT * 5 / 2) response = await call.read() self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) # Should be around the timeout minus a unit of wait time remained_time = call.time_remaining() - self.assertGreater(remained_time, test_constants.SHORT_TIMEOUT // 2) - self.assertLess(remained_time, test_constants.SHORT_TIMEOUT * 3 // 2) + self.assertGreater(remained_time, test_constants.SHORT_TIMEOUT / 2) + self.assertLess(remained_time, test_constants.SHORT_TIMEOUT * 3 / 2) self.assertEqual(grpc.StatusCode.OK, await call.code()) From 1ff3e8ec57d180f85ac8dd66d6d7439f18383ed7 Mon Sep 17 00:00:00 2001 From: Doug Fawley Date: Tue, 10 Mar 2020 14:25:34 -0700 Subject: [PATCH 109/758] Add v1.28.0 release of grpc-go to interop matrix --- tools/interop_matrix/client_matrix.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/interop_matrix/client_matrix.py b/tools/interop_matrix/client_matrix.py index 1cba1748313..92768508834 100644 --- a/tools/interop_matrix/client_matrix.py +++ b/tools/interop_matrix/client_matrix.py @@ -153,6 +153,7 @@ LANG_RELEASE_MATRIX = { ('v1.25.0', ReleaseInfo(runtimes=['go1.11'])), ('v1.26.0', ReleaseInfo(runtimes=['go1.11'])), ('v1.27.1', ReleaseInfo(runtimes=['go1.11'])), + ('v1.28.0', ReleaseInfo(runtimes=['go1.11'])), ]), 'java': OrderedDict([ From 6227144964d2893e2da6f09d7685ddcf60d82a51 Mon Sep 17 00:00:00 2001 From: Ashitha Santhosh Date: Tue, 10 Mar 2020 14:29:49 -0700 Subject: [PATCH 110/758] Implemented Frame Size Negotiation in ALTS for gRPC C++. --- .../alts/alts_security_connector.cc | 25 +++++++++--- .../alts/handshaker/alts_handshaker_client.cc | 9 ++++- .../alts/handshaker/alts_handshaker_client.h | 12 ++++-- .../alts/handshaker/alts_tsi_handshaker.cc | 39 ++++++++++++++++++- .../tsi/alts/handshaker/alts_tsi_handshaker.h | 5 ++- 5 files changed, 77 insertions(+), 13 deletions(-) diff --git a/src/core/lib/security/security_connector/alts/alts_security_connector.cc b/src/core/lib/security/security_connector/alts/alts_security_connector.cc index 1274edb6e6e..6bfe6ea74c3 100644 --- a/src/core/lib/security/security_connector/alts/alts_security_connector.cc +++ b/src/core/lib/security/security_connector/alts/alts_security_connector.cc @@ -82,10 +82,17 @@ class grpc_alts_channel_security_connector final tsi_handshaker* handshaker = nullptr; const grpc_alts_credentials* creds = static_cast(channel_creds()); - GPR_ASSERT(alts_tsi_handshaker_create(creds->options(), target_name_, - creds->handshaker_service_url(), true, - interested_parties, - &handshaker) == TSI_OK); + size_t user_specified_max_frame_size = 0; + const grpc_arg* arg = + grpc_channel_args_find(args, GRPC_ARG_TSI_MAX_FRAME_SIZE); + if (arg != nullptr && arg->type == GRPC_ARG_INTEGER) { + user_specified_max_frame_size = grpc_channel_arg_get_integer( + arg, {0, 0, std::numeric_limits::max()}); + } + GPR_ASSERT(alts_tsi_handshaker_create( + creds->options(), target_name_, + creds->handshaker_service_url(), true, interested_parties, + &handshaker, user_specified_max_frame_size) == TSI_OK); handshake_manager->Add( grpc_core::SecurityHandshakerCreate(handshaker, this, args)); } @@ -140,9 +147,17 @@ class grpc_alts_server_security_connector final tsi_handshaker* handshaker = nullptr; const grpc_alts_server_credentials* creds = static_cast(server_creds()); + size_t user_specified_max_frame_size = 0; + const grpc_arg* arg = + grpc_channel_args_find(args, GRPC_ARG_TSI_MAX_FRAME_SIZE); + if (arg != nullptr && arg->type == GRPC_ARG_INTEGER) { + user_specified_max_frame_size = grpc_channel_arg_get_integer( + arg, {0, 0, std::numeric_limits::max()}); + } GPR_ASSERT(alts_tsi_handshaker_create( creds->options(), nullptr, creds->handshaker_service_url(), - false, interested_parties, &handshaker) == TSI_OK); + false, interested_parties, &handshaker, + user_specified_max_frame_size) == TSI_OK); handshake_manager->Add( grpc_core::SecurityHandshakerCreate(handshaker, this, args)); } diff --git a/src/core/tsi/alts/handshaker/alts_handshaker_client.cc b/src/core/tsi/alts/handshaker/alts_handshaker_client.cc index 2592763e5a2..5c5a407f54f 100644 --- a/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +++ b/src/core/tsi/alts/handshaker/alts_handshaker_client.cc @@ -102,6 +102,8 @@ typedef struct alts_grpc_handshaker_client { bool receive_status_finished; /* if non-null, contains arguments to complete a TSI next callback. */ recv_message_result* pending_recv_message_result; + /* Maximum frame size used by frame protector. */ + size_t max_frame_size; } alts_grpc_handshaker_client; static void handshaker_client_send_buffer_destroy( @@ -506,6 +508,8 @@ static grpc_byte_buffer* get_serialized_start_client( upb_strview_makez(ptr->data)); ptr = ptr->next; } + grpc_gcp_StartClientHandshakeReq_set_max_frame_size(start_client, + client->max_frame_size); return get_serialized_handshaker_req(req, arena.ptr()); } @@ -565,6 +569,8 @@ static grpc_byte_buffer* get_serialized_start_server( arena.ptr()); grpc_gcp_RpcProtocolVersions_assign_from_struct( server_version, arena.ptr(), &client->options->rpc_versions); + grpc_gcp_StartServerHandshakeReq_set_max_frame_size(start_server, + client->max_frame_size); return get_serialized_handshaker_req(req, arena.ptr()); } @@ -674,7 +680,7 @@ alts_handshaker_client* alts_grpc_handshaker_client_create( grpc_alts_credentials_options* options, const grpc_slice& target_name, grpc_iomgr_cb_func grpc_cb, tsi_handshaker_on_next_done_cb cb, void* user_data, alts_handshaker_client_vtable* vtable_for_testing, - bool is_client) { + bool is_client, size_t max_frame_size) { if (channel == nullptr || handshaker_service_url == nullptr) { gpr_log(GPR_ERROR, "Invalid arguments to alts_handshaker_client_create()"); return nullptr; @@ -694,6 +700,7 @@ alts_handshaker_client* alts_grpc_handshaker_client_create( client->recv_bytes = grpc_empty_slice(); grpc_metadata_array_init(&client->recv_initial_metadata); client->is_client = is_client; + client->max_frame_size = max_frame_size; client->buffer_size = TSI_ALTS_INITIAL_BUFFER_SIZE; client->buffer = static_cast(gpr_zalloc(client->buffer_size)); grpc_slice slice = grpc_slice_from_copied_string(handshaker_service_url); diff --git a/src/core/tsi/alts/handshaker/alts_handshaker_client.h b/src/core/tsi/alts/handshaker/alts_handshaker_client.h index 319a23c88c7..b3af548b405 100644 --- a/src/core/tsi/alts/handshaker/alts_handshaker_client.h +++ b/src/core/tsi/alts/handshaker/alts_handshaker_client.h @@ -117,7 +117,7 @@ void alts_handshaker_client_destroy(alts_handshaker_client* client); * This method creates an ALTS handshaker client. * * - handshaker: ALTS TSI handshaker to which the created handshaker client - * belongs to. + * belongs to. * - channel: grpc channel to ALTS handshaker service. * - handshaker_service_url: address of ALTS handshaker service in the format of * "host:port". @@ -132,8 +132,12 @@ void alts_handshaker_client_destroy(alts_handshaker_client* client); * - vtable_for_testing: ALTS handshaker client vtable instance used for * testing purpose. * - is_client: a boolean value indicating if the created handshaker client is - * used at the client (is_client = true) or server (is_client = false) side. It - * returns the created ALTS handshaker client on success, and NULL on failure. + * used at the client (is_client = true) or server (is_client = false) side. + * - max_frame_size: Maximum frame size used by frame protector (User specified + * maximum frame size if present or default max frame size). + * + * It returns the created ALTS handshaker client on success, and NULL + * on failure. */ alts_handshaker_client* alts_grpc_handshaker_client_create( alts_tsi_handshaker* handshaker, grpc_channel* channel, @@ -141,7 +145,7 @@ alts_handshaker_client* alts_grpc_handshaker_client_create( grpc_alts_credentials_options* options, const grpc_slice& target_name, grpc_iomgr_cb_func grpc_cb, tsi_handshaker_on_next_done_cb cb, void* user_data, alts_handshaker_client_vtable* vtable_for_testing, - bool is_client); + bool is_client, size_t max_frame_size); /** * This method handles handshaker response returned from ALTS handshaker diff --git a/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc b/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc index 0c700306d8f..c9daaecbce6 100644 --- a/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +++ b/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc @@ -41,6 +41,11 @@ #include "src/core/tsi/alts/handshaker/alts_tsi_utils.h" #include "src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.h" +// Frame size negotiation extends send frame size range to +// [kMinFrameSize, kMaxFrameSize] +constexpr size_t kMinFrameSize = 16 * 1024; +constexpr size_t kMaxFrameSize = 128 * 1024; + /* Main struct for ALTS TSI handshaker. */ struct alts_tsi_handshaker { tsi_handshaker base; @@ -63,6 +68,8 @@ struct alts_tsi_handshaker { // shutdown effectively follows base.handshake_shutdown, // but is synchronized by the mutex of this object. bool shutdown; + // Maximum frame size used by frame protector. + size_t max_frame_size; }; /* Main struct for ALTS TSI handshaker result. */ @@ -75,6 +82,8 @@ typedef struct alts_tsi_handshaker_result { grpc_slice rpc_versions; bool is_client; grpc_slice serialized_context; + // Peer's maximum frame size. + size_t max_frame_size; } alts_tsi_handshaker_result; static tsi_result handshaker_result_extract_peer( @@ -156,6 +165,26 @@ static tsi_result handshaker_result_create_zero_copy_grpc_protector( alts_tsi_handshaker_result* result = reinterpret_cast( const_cast(self)); + + // In case the peer does not send max frame size (e.g. peer is gRPC Go or + // peer uses an old binary), the negotiated frame size is set to + // kMinFrameSize (ignoring max_output_protected_frame_size value if + // present). Otherwise, it is based on peer and user specified max frame + // size (if present). + size_t max_frame_size = kMinFrameSize; + if (result->max_frame_size) { + size_t peer_max_frame_size = result->max_frame_size; + max_frame_size = std::min(peer_max_frame_size, + max_output_protected_frame_size == nullptr + ? kMaxFrameSize + : *max_output_protected_frame_size); + max_frame_size = std::max(max_frame_size, kMinFrameSize); + } + max_output_protected_frame_size = &max_frame_size; + gpr_log(GPR_DEBUG, + "After Frame Size Negotiation, maximum frame size used by frame " + "protector equals %zu", + *max_output_protected_frame_size); tsi_result ok = alts_zero_copy_grpc_protector_create( reinterpret_cast(result->key_data), kAltsAes128GcmRekeyKeyLength, /*is_rekey=*/true, result->is_client, @@ -288,6 +317,7 @@ tsi_result alts_tsi_handshaker_result_create(grpc_gcp_HandshakerResp* resp, static_cast(gpr_zalloc(peer_service_account.size + 1)); memcpy(result->peer_identity, peer_service_account.data, peer_service_account.size); + result->max_frame_size = grpc_gcp_HandshakerResult_max_frame_size(hresult); upb::Arena rpc_versions_arena; bool serialized = grpc_gcp_rpc_protocol_versions_encode( peer_rpc_version, rpc_versions_arena.ptr(), &result->rpc_versions); @@ -374,7 +404,8 @@ static tsi_result alts_tsi_handshaker_continue_handshaker_next( handshaker, channel, handshaker->handshaker_service_url, handshaker->interested_parties, handshaker->options, handshaker->target_name, grpc_cb, cb, user_data, - handshaker->client_vtable_for_testing, handshaker->is_client); + handshaker->client_vtable_for_testing, handshaker->is_client, + handshaker->max_frame_size); if (client == nullptr) { gpr_log(GPR_ERROR, "Failed to create ALTS handshaker client"); return TSI_FAILED_PRECONDITION; @@ -570,7 +601,8 @@ bool alts_tsi_handshaker_has_shutdown(alts_tsi_handshaker* handshaker) { tsi_result alts_tsi_handshaker_create( const grpc_alts_credentials_options* options, const char* target_name, const char* handshaker_service_url, bool is_client, - grpc_pollset_set* interested_parties, tsi_handshaker** self) { + grpc_pollset_set* interested_parties, tsi_handshaker** self, + size_t user_specified_max_frame_size) { if (handshaker_service_url == nullptr || self == nullptr || options == nullptr || (is_client && target_name == nullptr)) { gpr_log(GPR_ERROR, "Invalid arguments to alts_tsi_handshaker_create()"); @@ -590,6 +622,9 @@ tsi_result alts_tsi_handshaker_create( handshaker->has_created_handshaker_client = false; handshaker->handshaker_service_url = gpr_strdup(handshaker_service_url); handshaker->options = grpc_alts_credentials_options_copy(options); + handshaker->max_frame_size = user_specified_max_frame_size != 0 + ? user_specified_max_frame_size + : kMaxFrameSize; handshaker->base.vtable = handshaker->use_dedicated_cq ? &handshaker_vtable_dedicated : &handshaker_vtable; diff --git a/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h b/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h index 5bace9affa8..ec3f167af5e 100644 --- a/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +++ b/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h @@ -54,6 +54,8 @@ typedef struct alts_tsi_handshaker alts_tsi_handshaker; * - interested_parties: set of pollsets interested in this connection. * - self: address of ALTS TSI handshaker instance to be returned from the * method. + * - user_specified_max_frame_size: Determines the maximum frame size used by + * frame protector that is specified via user. If unspecified, the value is 0. * * It returns TSI_OK on success and an error status code on failure. Note that * if interested_parties is nullptr, a dedicated TSI thread will be created and @@ -62,7 +64,8 @@ typedef struct alts_tsi_handshaker alts_tsi_handshaker; tsi_result alts_tsi_handshaker_create( const grpc_alts_credentials_options* options, const char* target_name, const char* handshaker_service_url, bool is_client, - grpc_pollset_set* interested_parties, tsi_handshaker** self); + grpc_pollset_set* interested_parties, tsi_handshaker** self, + size_t user_specified_max_frame_size); /** * This method creates an ALTS TSI handshaker result instance. From 2520a81a66decd528337befbe8cffd9968b7692f Mon Sep 17 00:00:00 2001 From: "Mark D. Roth" Date: Tue, 10 Mar 2020 14:59:47 -0700 Subject: [PATCH 111/758] Don't NACK empty updates. --- .../ext/filters/client_channel/xds/xds_api.cc | 60 ++++---- .../ext/filters/client_channel/xds/xds_api.h | 8 +- .../filters/client_channel/xds/xds_client.cc | 141 ++++++++++++------ .../filters/client_channel/xds/xds_client.h | 8 +- 4 files changed, 134 insertions(+), 83 deletions(-) diff --git a/src/core/ext/filters/client_channel/xds/xds_api.cc b/src/core/ext/filters/client_channel/xds/xds_api.cc index e2628cb3f57..9cc6908f3a9 100644 --- a/src/core/ext/filters/client_channel/xds/xds_api.cc +++ b/src/core/ext/filters/client_channel/xds/xds_api.cc @@ -542,15 +542,12 @@ grpc_error* RouteConfigParse( grpc_error* LdsResponseParse(const envoy_api_v2_DiscoveryResponse* response, const std::string& expected_server_name, - XdsApi::LdsUpdate* lds_update, upb_arena* arena) { + absl::optional* lds_update, + upb_arena* arena) { // Get the resources from the response. size_t size; const google_protobuf_Any* const* resources = envoy_api_v2_DiscoveryResponse_resources(response, &size); - if (size < 1) { - return GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "LDS response contains 0 resource."); - } for (size_t i = 0; i < size; ++i) { // Check the type_url of the resource. const upb_strview type_url = google_protobuf_Any_type_url(resources[i]); @@ -593,10 +590,11 @@ grpc_error* LdsResponseParse(const envoy_api_v2_DiscoveryResponse* response, grpc_error* error = RouteConfigParse(route_config, expected_server_name, &rds_update); if (error != GRPC_ERROR_NONE) return error; - lds_update->rds_update.emplace(std::move(rds_update)); + lds_update->emplace(); + (*lds_update)->rds_update.emplace(std::move(rds_update)); const upb_strview route_config_name = envoy_api_v2_RouteConfiguration_name(route_config); - lds_update->route_config_name = + (*lds_update)->route_config_name = std::string(route_config_name.data, route_config_name.size); return GRPC_ERROR_NONE; } @@ -613,26 +611,23 @@ grpc_error* LdsResponseParse(const envoy_api_v2_DiscoveryResponse* response, const upb_strview route_config_name = envoy_config_filter_network_http_connection_manager_v2_Rds_route_config_name( rds); - lds_update->route_config_name = + lds_update->emplace(); + (*lds_update)->route_config_name = std::string(route_config_name.data, route_config_name.size); return GRPC_ERROR_NONE; } - return GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "No listener found for expected server name."); + return GRPC_ERROR_NONE; } grpc_error* RdsResponseParse(const envoy_api_v2_DiscoveryResponse* response, const std::string& expected_server_name, const std::string& expected_route_config_name, - XdsApi::RdsUpdate* rds_update, upb_arena* arena) { + absl::optional* rds_update, + upb_arena* arena) { // Get the resources from the response. size_t size; const google_protobuf_Any* const* resources = envoy_api_v2_DiscoveryResponse_resources(response, &size); - if (size < 1) { - return GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "RDS response contains 0 resource."); - } for (size_t i = 0; i < size; ++i) { // Check the type_url of the resource. const upb_strview type_url = google_protobuf_Any_type_url(resources[i]); @@ -658,24 +653,20 @@ grpc_error* RdsResponseParse(const envoy_api_v2_DiscoveryResponse* response, grpc_error* error = RouteConfigParse(route_config, expected_server_name, &local_rds_update); if (error != GRPC_ERROR_NONE) return error; - *rds_update = std::move(local_rds_update); + rds_update->emplace(std::move(local_rds_update)); return GRPC_ERROR_NONE; } - return GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "No route config found for expected name."); + return GRPC_ERROR_NONE; } -grpc_error* CdsResponseParse(const envoy_api_v2_DiscoveryResponse* response, - XdsApi::CdsUpdateMap* cds_update_map, - upb_arena* arena) { +grpc_error* CdsResponseParse( + const envoy_api_v2_DiscoveryResponse* response, + const std::set& expected_cluster_names, + XdsApi::CdsUpdateMap* cds_update_map, upb_arena* arena) { // Get the resources from the response. size_t size; const google_protobuf_Any* const* resources = envoy_api_v2_DiscoveryResponse_resources(response, &size); - if (size < 1) { - return GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "CDS response contains 0 resource."); - } // Parse all the resources in the CDS response. for (size_t i = 0; i < size; ++i) { XdsApi::CdsUpdate cds_update; @@ -691,6 +682,13 @@ grpc_error* CdsResponseParse(const envoy_api_v2_DiscoveryResponse* response, if (cluster == nullptr) { return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Can't decode cluster."); } + // Ignore unexpected cluster names. + upb_strview cluster_name = envoy_api_v2_Cluster_name(cluster); + StringView cluster_name_strview(cluster_name.data, cluster_name.size); + if (expected_cluster_names.find(cluster_name_strview) == + expected_cluster_names.end()) { + continue; + } // Check the cluster_discovery_type. if (!envoy_api_v2_Cluster_has_type(cluster)) { return GRPC_ERROR_CREATE_FROM_STATIC_STRING("DiscoveryType not found."); @@ -729,7 +727,6 @@ grpc_error* CdsResponseParse(const envoy_api_v2_DiscoveryResponse* response, } cds_update.lrs_load_reporting_server_name.emplace(""); } - upb_strview cluster_name = envoy_api_v2_Cluster_name(cluster); cds_update_map->emplace(std::string(cluster_name.data, cluster_name.size), std::move(cds_update)); } @@ -856,10 +853,6 @@ grpc_error* EdsResponsedParse( size_t size; const google_protobuf_Any* const* resources = envoy_api_v2_DiscoveryResponse_resources(response, &size); - if (size < 1) { - return GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "EDS response contains 0 resource."); - } for (size_t i = 0; i < size; ++i) { XdsApi::EdsUpdate eds_update; // Check the type_url of the resource. @@ -934,8 +927,10 @@ grpc_error* EdsResponsedParse( grpc_error* XdsApi::ParseAdsResponse( const grpc_slice& encoded_response, const std::string& expected_server_name, const std::string& expected_route_config_name, + const std::set& expected_cluster_names, const std::set& expected_eds_service_names, - LdsUpdate* lds_update, RdsUpdate* rds_update, CdsUpdateMap* cds_update_map, + absl::optional* lds_update, + absl::optional* rds_update, CdsUpdateMap* cds_update_map, EdsUpdateMap* eds_update_map, std::string* version, std::string* nonce, std::string* type_url) { upb::Arena arena; @@ -968,7 +963,8 @@ grpc_error* XdsApi::ParseAdsResponse( expected_route_config_name, rds_update, arena.ptr()); } else if (*type_url == kCdsTypeUrl) { - return CdsResponseParse(response, cds_update_map, arena.ptr()); + return CdsResponseParse(response, expected_cluster_names, cds_update_map, + arena.ptr()); } else if (*type_url == kEdsTypeUrl) { return EdsResponsedParse(response, expected_eds_service_names, eds_update_map, arena.ptr()); diff --git a/src/core/ext/filters/client_channel/xds/xds_api.h b/src/core/ext/filters/client_channel/xds/xds_api.h index e894071b9af..78bd177953f 100644 --- a/src/core/ext/filters/client_channel/xds/xds_api.h +++ b/src/core/ext/filters/client_channel/xds/xds_api.h @@ -230,10 +230,12 @@ class XdsApi { const grpc_slice& encoded_response, const std::string& expected_server_name, const std::string& expected_route_config_name, + const std::set& expected_cluster_names, const std::set& expected_eds_service_names, - LdsUpdate* lds_update, RdsUpdate* rds_update, - CdsUpdateMap* cds_update_map, EdsUpdateMap* eds_update_map, - std::string* version, std::string* nonce, std::string* type_url); + absl::optional* lds_update, + absl::optional* rds_update, CdsUpdateMap* cds_update_map, + EdsUpdateMap* eds_update_map, std::string* version, std::string* nonce, + std::string* type_url); // Creates an LRS request querying \a server_name. grpc_slice CreateLrsInitialRequest(const std::string& server_name); diff --git a/src/core/ext/filters/client_channel/xds/xds_client.cc b/src/core/ext/filters/client_channel/xds/xds_client.cc index 42708fca556..f0e730da793 100644 --- a/src/core/ext/filters/client_channel/xds/xds_client.cc +++ b/src/core/ext/filters/client_channel/xds/xds_client.cc @@ -238,8 +238,8 @@ class XdsClient::ChannelState::AdsCallState void SendMessageLocked(const std::string& type_url); - void AcceptLdsUpdate(XdsApi::LdsUpdate lds_update); - void AcceptRdsUpdate(XdsApi::RdsUpdate rds_update); + void AcceptLdsUpdate(absl::optional lds_update); + void AcceptRdsUpdate(absl::optional rds_update); void AcceptCdsUpdate(XdsApi::CdsUpdateMap cds_update_map); void AcceptEdsUpdate(XdsApi::EdsUpdateMap eds_update_map); @@ -860,24 +860,32 @@ bool XdsClient::ChannelState::AdsCallState::HasSubscribedResources() const { } void XdsClient::ChannelState::AdsCallState::AcceptLdsUpdate( - XdsApi::LdsUpdate lds_update) { + absl::optional lds_update) { + if (!lds_update.has_value()) { + gpr_log(GPR_INFO, + "[xds_client %p] LDS update does not include requested resource", + xds_client()); + xds_client()->service_config_watcher_->OnError( + GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "LDS update does not include requested resource")); + return; + } const std::string& cluster_name = - lds_update.rds_update.has_value() - ? lds_update.rds_update.value().cluster_name + lds_update->rds_update.has_value() + ? lds_update->rds_update.value().cluster_name : ""; if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) { gpr_log(GPR_INFO, - "[xds_client %p] LDS update received: " - "route_config_name=%s, " + "[xds_client %p] LDS update received: route_config_name=%s, " "cluster_name=%s (empty if RDS is needed to obtain it)", - xds_client(), lds_update.route_config_name.c_str(), + xds_client(), lds_update->route_config_name.c_str(), cluster_name.c_str()); } auto& lds_state = state_map_[XdsApi::kLdsTypeUrl]; auto& state = lds_state.subscribed_resources[xds_client()->server_name_]; if (state != nullptr) state->Finish(); // Ignore identical update. - if (xds_client()->route_config_name_ == lds_update.route_config_name && + if (xds_client()->route_config_name_ == lds_update->route_config_name && xds_client()->cluster_name_ == cluster_name) { if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) { gpr_log(GPR_INFO, @@ -886,12 +894,15 @@ void XdsClient::ChannelState::AdsCallState::AcceptLdsUpdate( } return; } - xds_client()->route_config_name_ = std::move(lds_update.route_config_name); - if (lds_update.rds_update.has_value()) { + if (!xds_client()->route_config_name_.empty()) { + Unsubscribe(XdsApi::kRdsTypeUrl, xds_client()->route_config_name_); + } + xds_client()->route_config_name_ = std::move(lds_update->route_config_name); + if (lds_update->rds_update.has_value()) { // If cluster_name was found inlined in LDS response, notify the watcher // immediately. xds_client()->cluster_name_ = - std::move(lds_update.rds_update.value().cluster_name); + std::move(lds_update->rds_update.value().cluster_name); RefCountedPtr service_config; grpc_error* error = xds_client()->CreateServiceConfig( xds_client()->cluster_name_, &service_config); @@ -908,19 +919,27 @@ void XdsClient::ChannelState::AdsCallState::AcceptLdsUpdate( } void XdsClient::ChannelState::AdsCallState::AcceptRdsUpdate( - XdsApi::RdsUpdate rds_update) { + absl::optional rds_update) { + if (!rds_update.has_value()) { + gpr_log(GPR_INFO, + "[xds_client %p] RDS update does not include requested resource", + xds_client()); + xds_client()->service_config_watcher_->OnError( + GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "RDS update does not include requested resource")); + return; + } if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) { gpr_log(GPR_INFO, - "[xds_client %p] RDS update received: " - "cluster_name=%s", - xds_client(), rds_update.cluster_name.c_str()); + "[xds_client %p] RDS update received: cluster_name=%s", + xds_client(), rds_update->cluster_name.c_str()); } auto& rds_state = state_map_[XdsApi::kRdsTypeUrl]; auto& state = rds_state.subscribed_resources[xds_client()->route_config_name_]; if (state != nullptr) state->Finish(); // Ignore identical update. - if (xds_client()->cluster_name_ == rds_update.cluster_name) { + if (xds_client()->cluster_name_ == rds_update->cluster_name) { if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) { gpr_log(GPR_INFO, "[xds_client %p] RDS update identical to current, ignoring.", @@ -928,7 +947,7 @@ void XdsClient::ChannelState::AdsCallState::AcceptRdsUpdate( } return; } - xds_client()->cluster_name_ = std::move(rds_update.cluster_name); + xds_client()->cluster_name_ = std::move(rds_update->cluster_name); // Notify the watcher. RefCountedPtr service_config; grpc_error* error = xds_client()->CreateServiceConfig( @@ -944,6 +963,7 @@ void XdsClient::ChannelState::AdsCallState::AcceptRdsUpdate( void XdsClient::ChannelState::AdsCallState::AcceptCdsUpdate( XdsApi::CdsUpdateMap cds_update_map) { auto& cds_state = state_map_[XdsApi::kCdsTypeUrl]; + std::set eds_resource_names_seen; for (auto& p : cds_update_map) { const char* cluster_name = p.first.c_str(); XdsApi::CdsUpdate& cds_update = p.second; @@ -952,21 +972,22 @@ void XdsClient::ChannelState::AdsCallState::AcceptCdsUpdate( if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) { gpr_log(GPR_INFO, "[xds_client %p] CDS update (cluster=%s) received: " - "eds_service_name=%s, " - "lrs_load_reporting_server_name=%s", + "eds_service_name=%s, lrs_load_reporting_server_name=%s", xds_client(), cluster_name, cds_update.eds_service_name.c_str(), cds_update.lrs_load_reporting_server_name.has_value() ? cds_update.lrs_load_reporting_server_name.value().c_str() : "(N/A)"); } - ClusterState& cluster_state = xds_client()->cluster_map_[cluster_name]; + // Record the EDS resource names seen. + eds_resource_names_seen.insert(cds_update.eds_service_name.empty() + ? cluster_name + : cds_update.eds_service_name); // Ignore identical update. + ClusterState& cluster_state = xds_client()->cluster_map_[cluster_name]; if (cluster_state.update.has_value() && - cds_update.eds_service_name == - cluster_state.update.value().eds_service_name && - cds_update.lrs_load_reporting_server_name.value() == - cluster_state.update.value() - .lrs_load_reporting_server_name.value()) { + cds_update.eds_service_name == cluster_state.update->eds_service_name && + cds_update.lrs_load_reporting_server_name == + cluster_state.update->lrs_load_reporting_server_name) { if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) { gpr_log(GPR_INFO, "[xds_client %p] CDS update identical to current, ignoring.", @@ -975,12 +996,41 @@ void XdsClient::ChannelState::AdsCallState::AcceptCdsUpdate( continue; } // Update the cluster state. - cluster_state.update.emplace(std::move(cds_update)); + cluster_state.update = std::move(cds_update); // Notify all watchers. for (const auto& p : cluster_state.watchers) { p.first->OnClusterChanged(cluster_state.update.value()); } } + // For any subscribed resource that is not present in the update, + // remove it from the cache and notify watchers of the error. + for (const auto& p : cds_state.subscribed_resources) { + const std::string& cluster_name = p.first; + if (cds_update_map.find(cluster_name) == cds_update_map.end()) { + ClusterState& cluster_state = xds_client()->cluster_map_[cluster_name]; + cluster_state.update.reset(); + for (const auto& p : cluster_state.watchers) { + p.first->OnError(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "Cluster not present in CDS update")); + } + } + } + // Also remove any EDS resources that are no longer referred to by any CDS + // resources. + auto& eds_state = state_map_[XdsApi::kEdsTypeUrl]; + for (const auto& p : eds_state.subscribed_resources) { + const std::string& eds_resource_name = p.first; + if (eds_resource_names_seen.find(eds_resource_name) == + eds_resource_names_seen.end()) { + EndpointState& endpoint_state = + xds_client()->endpoint_map_[eds_resource_name]; + endpoint_state.update.reset(); + for (const auto& p : endpoint_state.watchers) { + p.first->OnError(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "ClusterLoadAssignment resource removed due to CDS update")); + } + } + } } void XdsClient::ChannelState::AdsCallState::AcceptEdsUpdate( @@ -1043,25 +1093,27 @@ void XdsClient::ChannelState::AdsCallState::AcceptEdsUpdate( EndpointState& endpoint_state = xds_client()->endpoint_map_[eds_service_name]; // Ignore identical update. - const XdsApi::EdsUpdate& prev_update = endpoint_state.update; - const bool priority_list_changed = - prev_update.priority_list_update != eds_update.priority_list_update; - const bool drop_config_changed = - prev_update.drop_config == nullptr || - *prev_update.drop_config != *eds_update.drop_config; - if (!priority_list_changed && !drop_config_changed) { - if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) { - gpr_log(GPR_INFO, - "[xds_client %p] EDS update identical to current, ignoring.", - xds_client()); + if (endpoint_state.update.has_value()) { + const XdsApi::EdsUpdate& prev_update = endpoint_state.update.value(); + const bool priority_list_changed = + prev_update.priority_list_update != eds_update.priority_list_update; + const bool drop_config_changed = + prev_update.drop_config == nullptr || + *prev_update.drop_config != *eds_update.drop_config; + if (!priority_list_changed && !drop_config_changed) { + if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) { + gpr_log(GPR_INFO, + "[xds_client %p] EDS update identical to current, ignoring.", + xds_client()); + } + continue; } - continue; } // Update the cluster state. endpoint_state.update = std::move(eds_update); // Notify all watchers. for (const auto& p : endpoint_state.watchers) { - p.first->OnEndpointChanged(endpoint_state.update); + p.first->OnEndpointChanged(endpoint_state.update.value()); } } } @@ -1135,8 +1187,8 @@ void XdsClient::ChannelState::AdsCallState::OnResponseReceivedLocked( // mode. We will also need to cancel the timer when we receive a serverlist // from the balancer. // Parse the response. - XdsApi::LdsUpdate lds_update; - XdsApi::RdsUpdate rds_update; + absl::optional lds_update; + absl::optional rds_update; XdsApi::CdsUpdateMap cds_update_map; XdsApi::EdsUpdateMap eds_update_map; std::string version; @@ -1145,6 +1197,7 @@ void XdsClient::ChannelState::AdsCallState::OnResponseReceivedLocked( // Note that ParseAdsResponse() also validates the response. grpc_error* parse_error = xds_client->api_.ParseAdsResponse( response_slice, xds_client->server_name_, xds_client->route_config_name_, + ads_calld->ClusterNamesForRequest(), ads_calld->EdsServiceNamesForRequest(), &lds_update, &rds_update, &cds_update_map, &eds_update_map, &version, &nonce, &type_url); grpc_slice_unref_internal(response_slice); @@ -1811,8 +1864,8 @@ void XdsClient::WatchEndpointData( endpoint_state.watchers[w] = std::move(watcher); // If we've already received an EDS update, notify the new watcher // immediately. - if (!endpoint_state.update.priority_list_update.empty()) { - w->OnEndpointChanged(endpoint_state.update); + if (endpoint_state.update.has_value()) { + w->OnEndpointChanged(endpoint_state.update.value()); } chand_->Subscribe(XdsApi::kEdsTypeUrl, eds_service_name_str); } diff --git a/src/core/ext/filters/client_channel/xds/xds_client.h b/src/core/ext/filters/client_channel/xds/xds_client.h index 02e80680399..f3975e80e55 100644 --- a/src/core/ext/filters/client_channel/xds/xds_client.h +++ b/src/core/ext/filters/client_channel/xds/xds_client.h @@ -189,7 +189,7 @@ class XdsClient : public InternallyRefCounted { std::map> watchers; // The latest data seen from CDS. - Optional update; + absl::optional update; }; struct EndpointState { @@ -197,7 +197,7 @@ class XdsClient : public InternallyRefCounted { std::unique_ptr> watchers; // The latest data seen from EDS. - XdsApi::EdsUpdate update; + absl::optional update; }; struct LoadReportState { @@ -241,9 +241,9 @@ class XdsClient : public InternallyRefCounted { std::string route_config_name_; std::string cluster_name_; - // All the received clusters are cached, no matter they are watched or not. + // One entry for each watched CDS resource. std::map cluster_map_; - // Only the watched EDS service names are stored. + // One entry for each watched EDS resource. std::map endpoint_map_; std::map< std::pair, From 19895fb3c76ccbd3aa6d8cb8b1e0bb81482b5cf4 Mon Sep 17 00:00:00 2001 From: "Mark D. Roth" Date: Tue, 10 Mar 2020 15:26:41 -0700 Subject: [PATCH 112/758] Don't set route_config_name when it comes in LDS response. --- src/core/ext/filters/client_channel/xds/xds_api.cc | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/core/ext/filters/client_channel/xds/xds_api.cc b/src/core/ext/filters/client_channel/xds/xds_api.cc index 9cc6908f3a9..6d5087ed028 100644 --- a/src/core/ext/filters/client_channel/xds/xds_api.cc +++ b/src/core/ext/filters/client_channel/xds/xds_api.cc @@ -592,10 +592,6 @@ grpc_error* LdsResponseParse(const envoy_api_v2_DiscoveryResponse* response, if (error != GRPC_ERROR_NONE) return error; lds_update->emplace(); (*lds_update)->rds_update.emplace(std::move(rds_update)); - const upb_strview route_config_name = - envoy_api_v2_RouteConfiguration_name(route_config); - (*lds_update)->route_config_name = - std::string(route_config_name.data, route_config_name.size); return GRPC_ERROR_NONE; } // Validate that RDS must be used to get the route_config dynamically. From 027492ff86b5c24636d9e8fa08f495be69462e26 Mon Sep 17 00:00:00 2001 From: "Mark D. Roth" Date: Tue, 10 Mar 2020 15:28:32 -0700 Subject: [PATCH 113/758] add missing comment --- test/cpp/end2end/xds_end2end_test.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/test/cpp/end2end/xds_end2end_test.cc b/test/cpp/end2end/xds_end2end_test.cc index 1b3d792d9fb..d23644700cf 100644 --- a/test/cpp/end2end/xds_end2end_test.cc +++ b/test/cpp/end2end/xds_end2end_test.cc @@ -495,6 +495,7 @@ class AdsServiceImpl : public AggregatedDiscoveryService::Service, SubscriptionState* subscription_state, ResourceState* resource_state, UpdateQueue* update_queue) { + // The update_queue will be null if we were not previously subscribed. if (subscription_state->update_queue != nullptr) return; subscription_state->update_queue = update_queue; resource_state->subscriptions.emplace(subscription_state); From 6b315db2ba1746bbe779ed6cea5efc40e9a44a0e Mon Sep 17 00:00:00 2001 From: "Mark D. Roth" Date: Tue, 10 Mar 2020 15:57:08 -0700 Subject: [PATCH 114/758] add test for removed cluster resource --- test/cpp/end2end/xds_end2end_test.cc | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/test/cpp/end2end/xds_end2end_test.cc b/test/cpp/end2end/xds_end2end_test.cc index d23644700cf..d7aa02abb0a 100644 --- a/test/cpp/end2end/xds_end2end_test.cc +++ b/test/cpp/end2end/xds_end2end_test.cc @@ -1692,6 +1692,27 @@ TEST_P(XdsResolverOnlyTest, ChangeClusters) { EXPECT_EQ(0, std::get<1>(counts)); } +// Tests that things keep workng if the cluster resource disappears. +TEST_P(XdsResolverOnlyTest, ClusterRemoved) { + SetNextResolution({}); + SetNextResolutionForLbChannelAllBalancers(); + AdsServiceImpl::EdsResourceArgs args({ + {"locality0", GetBackendPorts()}, + }); + balancers_[0]->ads_service()->SetEdsResource( + AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); + // We need to wait for all backends to come online. + WaitForAllBackends(); + // Unset CDS resource. + balancers_[0]->ads_service()->UnsetResource(kCdsTypeUrl, + kDefaultResourceName); + // Make sure RPCs are still succeeding. + CheckRpcSendOk(100 * num_backends_); + // Make sure we ACK'ed the update. + EXPECT_EQ(balancers_[0]->ads_service()->cds_response_state(), + AdsServiceImpl::ACKED); +} + using SecureNamingTest = BasicTest; // Tests that secure naming check passes if target name is expected. From 86cbef7f7221829252803e57844c641440d7f902 Mon Sep 17 00:00:00 2001 From: "Mark D. Roth" Date: Tue, 10 Mar 2020 15:59:28 -0700 Subject: [PATCH 115/758] clang-format --- src/core/ext/filters/client_channel/xds/xds_api.cc | 8 ++++---- src/core/ext/filters/client_channel/xds/xds_client.cc | 3 +-- test/cpp/end2end/xds_end2end_test.cc | 6 ++++-- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/core/ext/filters/client_channel/xds/xds_api.cc b/src/core/ext/filters/client_channel/xds/xds_api.cc index 6d5087ed028..0fcb85e6fd2 100644 --- a/src/core/ext/filters/client_channel/xds/xds_api.cc +++ b/src/core/ext/filters/client_channel/xds/xds_api.cc @@ -655,10 +655,10 @@ grpc_error* RdsResponseParse(const envoy_api_v2_DiscoveryResponse* response, return GRPC_ERROR_NONE; } -grpc_error* CdsResponseParse( - const envoy_api_v2_DiscoveryResponse* response, - const std::set& expected_cluster_names, - XdsApi::CdsUpdateMap* cds_update_map, upb_arena* arena) { +grpc_error* CdsResponseParse(const envoy_api_v2_DiscoveryResponse* response, + const std::set& expected_cluster_names, + XdsApi::CdsUpdateMap* cds_update_map, + upb_arena* arena) { // Get the resources from the response. size_t size; const google_protobuf_Any* const* resources = diff --git a/src/core/ext/filters/client_channel/xds/xds_client.cc b/src/core/ext/filters/client_channel/xds/xds_client.cc index f0e730da793..bf19f44f6da 100644 --- a/src/core/ext/filters/client_channel/xds/xds_client.cc +++ b/src/core/ext/filters/client_channel/xds/xds_client.cc @@ -930,8 +930,7 @@ void XdsClient::ChannelState::AdsCallState::AcceptRdsUpdate( return; } if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) { - gpr_log(GPR_INFO, - "[xds_client %p] RDS update received: cluster_name=%s", + gpr_log(GPR_INFO, "[xds_client %p] RDS update received: cluster_name=%s", xds_client(), rds_update->cluster_name.c_str()); } auto& rds_state = state_map_[XdsApi::kRdsTypeUrl]; diff --git a/test/cpp/end2end/xds_end2end_test.cc b/test/cpp/end2end/xds_end2end_test.cc index d7aa02abb0a..bf173df0af0 100644 --- a/test/cpp/end2end/xds_end2end_test.cc +++ b/test/cpp/end2end/xds_end2end_test.cc @@ -1681,8 +1681,10 @@ TEST_P(XdsResolverOnlyTest, ChangeClusters) { // Change RDS resource to point to new cluster. RouteConfiguration new_route_config = balancers_[0]->ads_service()->default_route_config(); - new_route_config.mutable_virtual_hosts(0)->mutable_routes(0) - ->mutable_route()->set_cluster(kNewClusterName); + new_route_config.mutable_virtual_hosts(0) + ->mutable_routes(0) + ->mutable_route() + ->set_cluster(kNewClusterName); Listener listener = balancers_[0]->ads_service()->BuildListener(new_route_config); balancers_[0]->ads_service()->SetLdsResource(listener, kDefaultResourceName); From 33463cc1ede2a27f395620ab7091166e8e862c56 Mon Sep 17 00:00:00 2001 From: Eric Gribkoff Date: Tue, 10 Mar 2020 14:07:43 -0700 Subject: [PATCH 116/758] support arbitrary IPs in forwarding rule creation --- tools/run_tests/run_xds_tests.py | 52 +++++++++++++++++++++----------- 1 file changed, 35 insertions(+), 17 deletions(-) diff --git a/tools/run_tests/run_xds_tests.py b/tools/run_tests/run_xds_tests.py index b5991d1d8a0..41fffec3f26 100755 --- a/tools/run_tests/run_xds_tests.py +++ b/tools/run_tests/run_xds_tests.py @@ -71,8 +71,8 @@ argp.add_argument( '--client_cmd', default=None, help='Command to launch xDS test client. This script will fill in ' - '{service_host}, {service_port},{stats_port} and {qps} parameters using ' - 'str.format(), and generate the GRPC_XDS_BOOTSTRAP file.') + '{server_uri}, {stats_port} and {qps} parameters using str.format(), and ' + 'generate the GRPC_XDS_BOOTSTRAP file.') argp.add_argument('--zone', default='us-central1-a') argp.add_argument('--secondary_zone', default='us-west1-b', @@ -101,12 +101,16 @@ argp.add_argument('--network', default='global/networks/default', help='GCP network to use') argp.add_argument('--service_port_range', - default='8080:8100', + default='80', type=parse_port_range, help='Listening port for created gRPC backends. Specified as ' 'either a single int or as a range in the format min:max, in ' 'which case an available port p will be chosen s.t. min <= p ' '<= max') +argp.add_argument('--forwarding_rule_ip_prefix', + default='172.16.0.', + help='If set, an available IP with this prefix followed by ' + '0-255 will be used for the generated forwarding rule.') argp.add_argument( '--stats_port', default=8079, @@ -135,6 +139,7 @@ args = argp.parse_args() if args.verbose: logger.setLevel(logging.DEBUG) +_DEFAULT_SERVICE_PORT = 80 _WAIT_FOR_BACKEND_SEC = args.wait_for_backend_sec _WAIT_FOR_OPERATION_SEC = 60 _INSTANCE_GROUP_SIZE = 2 @@ -560,12 +565,12 @@ def create_target_http_proxy(gcp, name): gcp.target_http_proxy = GcpResource(config['name'], result['targetLink']) -def create_global_forwarding_rule(gcp, name, port): +def create_global_forwarding_rule(gcp, name, ip, port): config = { 'name': name, 'loadBalancingScheme': 'INTERNAL_SELF_MANAGED', 'portRange': str(port), - 'IPAddress': '0.0.0.0', + 'IPAddress': ip, 'network': args.network, 'target': gcp.target_http_proxy.url, } @@ -886,18 +891,28 @@ try: create_target_http_proxy(gcp, target_http_proxy_name) potential_service_ports = list(args.service_port_range) random.shuffle(potential_service_ports) + if args.forwarding_rule_ip_prefix == '': + potential_ips = ['0.0.0.0'] + else: + potential_ips = [ + args.forwarding_rule_ip_prefix + str(x) for x in range(256) + ] + random.shuffle(potential_ips) for port in potential_service_ports: - try: - create_global_forwarding_rule(gcp, forwarding_rule_name, port) - gcp.service_port = port - break - except googleapiclient.errors.HttpError as http_error: - logger.warning( - 'Got error %s when attempting to create forwarding rule to ' - 'port %d. Retrying with another port.' % (http_error, port)) + for ip in potential_ips: + try: + create_global_forwarding_rule(gcp, forwarding_rule_name, ip, + port) + gcp.service_port = port + break + except googleapiclient.errors.HttpError as http_error: + logger.warning( + 'Got error %s when attempting to create forwarding rule to ' + '%s:%d. Retrying with another ip:port.' % + (http_error, ip, port)) if not gcp.service_port: - raise Exception('Failed to pick a service port in the range %s' % - args.service_port_range) + raise Exception( + 'Failed to find a valid ip:port for the forwarding rule') create_instance_template(gcp, template_name, args.network, args.source_image) instance_group = add_instance_group(gcp, args.zone, instance_group_name, @@ -975,8 +990,11 @@ try: wait_for_healthy_backends(gcp, backend_service, instance_group) - cmd = args.client_cmd.format(service_host=service_host_name, - service_port=gcp.service_port, + if gcp.service_port == _DEFAULT_SERVICE_PORT: + server_uri = service_host_name + else: + server_uri = service_host_name + ':' + str(gcp.service_port) + cmd = args.client_cmd.format(server_uri=server_uri, stats_port=args.stats_port, qps=args.qps) client_process = start_xds_client(cmd) From 6d4910fa1289c538feedaedb076a978736147bfe Mon Sep 17 00:00:00 2001 From: Eric Gribkoff Date: Tue, 10 Mar 2020 17:25:00 -0700 Subject: [PATCH 117/758] update kokoro command line --- tools/internal_ci/linux/grpc_xds_bazel_test_in_docker.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/internal_ci/linux/grpc_xds_bazel_test_in_docker.sh b/tools/internal_ci/linux/grpc_xds_bazel_test_in_docker.sh index 188aff018ab..c921ba8fca5 100755 --- a/tools/internal_ci/linux/grpc_xds_bazel_test_in_docker.sh +++ b/tools/internal_ci/linux/grpc_xds_bazel_test_in_docker.sh @@ -52,4 +52,4 @@ bazel build test/cpp/interop:xds_interop_client --project_id=grpc-testing \ --gcp_suffix=$(date '+%s') \ --verbose \ - --client_cmd='bazel-bin/test/cpp/interop/xds_interop_client --server=xds-experimental:///{service_host}:{service_port} --stats_port={stats_port} --qps={qps}' + --client_cmd='bazel-bin/test/cpp/interop/xds_interop_client --server=xds-experimental:///{server_uri} --stats_port={stats_port} --qps={qps}' From a61c6c36ba58a2e1e5ce07dd3dd72297978c8c9f Mon Sep 17 00:00:00 2001 From: Donna Dionne Date: Tue, 10 Mar 2020 18:39:04 -0700 Subject: [PATCH 118/758] LocalityMapTest.UpdateMap is rewritten to set the second EDS update more deterministically instead of using a delay. This test popped up as a flake after the refactoring of the xds_end2end test and it can now be rewritten to be more determinsitic. --- test/cpp/end2end/xds_end2end_test.cc | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/test/cpp/end2end/xds_end2end_test.cc b/test/cpp/end2end/xds_end2end_test.cc index 1fbdbad953e..73fe725b1e0 100644 --- a/test/cpp/end2end/xds_end2end_test.cc +++ b/test/cpp/end2end/xds_end2end_test.cc @@ -2207,14 +2207,6 @@ TEST_P(LocalityMapTest, UpdateMap) { }); balancers_[0]->ads_service()->SetEdsResource( AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); - args = AdsServiceImpl::EdsResourceArgs({ - {"locality1", GetBackendPorts(1, 2), 3}, - {"locality2", GetBackendPorts(2, 3), 2}, - {"locality3", GetBackendPorts(3, 4), 6}, - }); - std::thread delayed_resource_setter(std::bind( - &BasicTest::SetEdsResourceWithDelay, this, 0, - AdsServiceImpl::BuildEdsResource(args), 5000, kDefaultResourceName)); // Wait for the first 3 backends to be ready. WaitForAllBackends(0, 3); gpr_log(GPR_INFO, "========= BEFORE FIRST BATCH =========="); @@ -2237,6 +2229,13 @@ TEST_P(LocalityMapTest, UpdateMap) { ::testing::Ge(locality_weight_rate_0[i] * (1 - kErrorTolerance)), ::testing::Le(locality_weight_rate_0[i] * (1 + kErrorTolerance)))); } + args = AdsServiceImpl::EdsResourceArgs({ + {"locality1", GetBackendPorts(1, 2), 3}, + {"locality2", GetBackendPorts(2, 3), 2}, + {"locality3", GetBackendPorts(3, 4), 6}, + }); + balancers_[0]->ads_service()->SetEdsResource( + AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); // Backend 3 hasn't received any request. EXPECT_EQ(0U, backends_[3]->backend_service()->request_count()); // Wait until the locality update has been processed, as signaled by backend 3 @@ -2263,7 +2262,6 @@ TEST_P(LocalityMapTest, UpdateMap) { ::testing::Ge(locality_weight_rate_1[i] * (1 - kErrorTolerance)), ::testing::Le(locality_weight_rate_1[i] * (1 + kErrorTolerance)))); } - delayed_resource_setter.join(); } class FailoverTest : public BasicTest { From 9e84ea1a01dd0837a9e90a883efe152637dea2a4 Mon Sep 17 00:00:00 2001 From: Eric Gribkoff Date: Tue, 10 Mar 2020 22:19:05 -0700 Subject: [PATCH 119/758] Increase logging in xds test suite Include timestamp with Python log statements and log GCP API request bodies. Also enable gRPC core tracers when running the C++ client. --- tools/internal_ci/linux/grpc_xds.cfg | 2 +- .../linux/grpc_xds_bazel_test_in_docker.sh | 2 +- tools/run_tests/run_xds_tests.py | 13 +++++++++++++ 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/tools/internal_ci/linux/grpc_xds.cfg b/tools/internal_ci/linux/grpc_xds.cfg index d547e7c0e08..888be05cde5 100644 --- a/tools/internal_ci/linux/grpc_xds.cfg +++ b/tools/internal_ci/linux/grpc_xds.cfg @@ -16,7 +16,7 @@ # Location of the continuous shell script in repository. build_file: "grpc/tools/internal_ci/linux/grpc_bazel.sh" -timeout_mins: 60 +timeout_mins: 90 env_vars { key: "BAZEL_SCRIPT" value: "tools/internal_ci/linux/grpc_xds_bazel_test_in_docker.sh" diff --git a/tools/internal_ci/linux/grpc_xds_bazel_test_in_docker.sh b/tools/internal_ci/linux/grpc_xds_bazel_test_in_docker.sh index c921ba8fca5..9129e259eef 100755 --- a/tools/internal_ci/linux/grpc_xds_bazel_test_in_docker.sh +++ b/tools/internal_ci/linux/grpc_xds_bazel_test_in_docker.sh @@ -52,4 +52,4 @@ bazel build test/cpp/interop:xds_interop_client --project_id=grpc-testing \ --gcp_suffix=$(date '+%s') \ --verbose \ - --client_cmd='bazel-bin/test/cpp/interop/xds_interop_client --server=xds-experimental:///{server_uri} --stats_port={stats_port} --qps={qps}' + --client_cmd='GRPC_VERBOSITY=debug GRPC_TRACE=xds,xds_client bazel-bin/test/cpp/interop/xds_interop_client --server=xds-experimental:///{server_uri} --stats_port={stats_port} --qps={qps}' diff --git a/tools/run_tests/run_xds_tests.py b/tools/run_tests/run_xds_tests.py index 41fffec3f26..d17b277b685 100755 --- a/tools/run_tests/run_xds_tests.py +++ b/tools/run_tests/run_xds_tests.py @@ -34,6 +34,8 @@ from src.proto.grpc.testing import test_pb2_grpc logger = logging.getLogger() console_handler = logging.StreamHandler() +formatter = logging.Formatter(fmt='%(asctime)s: %(levelname)-8s %(message)s') +console_handler.setFormatter(formatter) logger.addHandler(console_handler) @@ -458,6 +460,8 @@ nohup build/install/grpc-interop-testing/bin/xds-test-server --port=%d 1>/dev/nu } } + + logger.debug('Sending GCP request with body=%s', config) result = gcp.compute.instanceTemplates().insert(project=gcp.project, body=config).execute() wait_for_global_operation(gcp, result['name']) @@ -475,6 +479,7 @@ def add_instance_group(gcp, zone, name, size): }] } + logger.debug('Sending GCP request with body=%s', config) result = gcp.compute.instanceGroupManagers().insert(project=gcp.project, zone=zone, body=config).execute() @@ -496,6 +501,7 @@ def create_health_check(gcp, name): 'portName': 'grpc' } } + logger.debug('Sending GCP request with body=%s', config) result = gcp.compute.healthChecks().insert(project=gcp.project, body=config).execute() wait_for_global_operation(gcp, result['name']) @@ -512,6 +518,7 @@ def create_health_check_firewall_rule(gcp, name): 'sourceRanges': ['35.191.0.0/16', '130.211.0.0/22'], 'targetTags': ['allow-health-checks'], } + logger.debug('Sending GCP request with body=%s', config) result = gcp.compute.firewalls().insert(project=gcp.project, body=config).execute() wait_for_global_operation(gcp, result['name']) @@ -527,6 +534,7 @@ def add_backend_service(gcp, name): 'portName': 'grpc', 'protocol': 'HTTP2' } + logger.debug('Sending GCP request with body=%s', config) result = gcp.compute.backendServices().insert(project=gcp.project, body=config).execute() wait_for_global_operation(gcp, result['name']) @@ -548,6 +556,7 @@ def create_url_map(gcp, name, backend_service, host_name): 'pathMatcher': _PATH_MATCHER_NAME }] } + logger.debug('Sending GCP request with body=%s', config) result = gcp.compute.urlMaps().insert(project=gcp.project, body=config).execute() wait_for_global_operation(gcp, result['name']) @@ -559,6 +568,7 @@ def create_target_http_proxy(gcp, name): 'name': name, 'url_map': gcp.url_map.url, } + logger.debug('Sending GCP request with body=%s', config) result = gcp.compute.targetHttpProxies().insert(project=gcp.project, body=config).execute() wait_for_global_operation(gcp, result['name']) @@ -574,6 +584,7 @@ def create_global_forwarding_rule(gcp, name, ip, port): 'network': args.network, 'target': gcp.target_http_proxy.url, } + logger.debug('Sending GCP request with body=%s', config) result = gcp.compute.globalForwardingRules().insert(project=gcp.project, body=config).execute() wait_for_global_operation(gcp, result['name']) @@ -676,6 +687,7 @@ def patch_backend_instances(gcp, 'maxRate': 1 if balancing_mode == 'RATE' else None } for instance_group in instance_groups], } + logger.debug('Sending GCP request with body=%s', config) result = gcp.compute.backendServices().patch( project=gcp.project, backendService=backend_service.name, body=config).execute() @@ -711,6 +723,7 @@ def patch_url_map_backend_service(gcp, backend_service): 'defaultService': backend_service.url, }] } + logger.debug('Sending GCP request with body=%s', config) result = gcp.compute.urlMaps().patch(project=gcp.project, urlMap=gcp.url_map.name, body=config).execute() From 26e31e15d8e2f16d5ab0a2876ef08f5d4ca101be Mon Sep 17 00:00:00 2001 From: Eric Gribkoff Date: Tue, 10 Mar 2020 22:40:18 -0700 Subject: [PATCH 120/758] blank line --- tools/run_tests/run_xds_tests.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tools/run_tests/run_xds_tests.py b/tools/run_tests/run_xds_tests.py index d17b277b685..3e0a864b4d2 100755 --- a/tools/run_tests/run_xds_tests.py +++ b/tools/run_tests/run_xds_tests.py @@ -460,7 +460,6 @@ nohup build/install/grpc-interop-testing/bin/xds-test-server --port=%d 1>/dev/nu } } - logger.debug('Sending GCP request with body=%s', config) result = gcp.compute.instanceTemplates().insert(project=gcp.project, body=config).execute() From 14e79b2138eae803a47c7185f15267c61f7369df Mon Sep 17 00:00:00 2001 From: Eric Gribkoff Date: Wed, 11 Mar 2020 01:32:15 -0700 Subject: [PATCH 121/758] include test case name in logging --- tools/run_tests/run_xds_tests.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/tools/run_tests/run_xds_tests.py b/tools/run_tests/run_xds_tests.py index 3e0a864b4d2..c713a35a347 100755 --- a/tools/run_tests/run_xds_tests.py +++ b/tools/run_tests/run_xds_tests.py @@ -233,6 +233,7 @@ def wait_until_all_rpcs_go_to_given_backends(backends, def test_backends_restart(gcp, backend_service, instance_group): + logger.info('Running test_backends_restart') instance_names = get_instance_names(gcp, instance_group) num_instances = len(instance_names) start_time = time.time() @@ -263,6 +264,7 @@ def test_backends_restart(gcp, backend_service, instance_group): def test_change_backend_service(gcp, original_backend_service, instance_group, alternate_backend_service, same_zone_instance_group): + logger.info('Running test_change_backend_service') original_backend_instances = get_instance_names(gcp, instance_group) alternate_backend_instances = get_instance_names(gcp, same_zone_instance_group) @@ -288,6 +290,7 @@ def test_change_backend_service(gcp, original_backend_service, instance_group, def test_new_instance_group_receives_traffic(gcp, backend_service, instance_group, same_zone_instance_group): + logger.info('Running test_new_instance_group_receives_traffic') instance_names = get_instance_names(gcp, instance_group) wait_until_all_rpcs_go_to_given_backends(instance_names, _WAIT_FOR_STATS_SEC) @@ -308,6 +311,7 @@ def test_new_instance_group_receives_traffic(gcp, backend_service, def test_ping_pong(gcp, backend_service, instance_group): + logger.info('Running test_ping_pong') wait_for_healthy_backends(gcp, backend_service, instance_group) instance_names = get_instance_names(gcp, instance_group) wait_until_all_rpcs_go_to_given_backends(instance_names, @@ -316,6 +320,7 @@ def test_ping_pong(gcp, backend_service, instance_group): def test_remove_instance_group(gcp, backend_service, instance_group, same_zone_instance_group): + logger.info('Running test_remove_instance_group') try: patch_backend_instances(gcp, backend_service, @@ -341,6 +346,7 @@ def test_remove_instance_group(gcp, backend_service, instance_group, def test_round_robin(gcp, backend_service, instance_group): + logger.info('Running test_round_robin') wait_for_healthy_backends(gcp, backend_service, instance_group) instance_names = get_instance_names(gcp, instance_group) threshold = 1 @@ -362,6 +368,9 @@ def test_round_robin(gcp, backend_service, instance_group): def test_secondary_locality_gets_no_requests_on_partial_primary_failure( gcp, backend_service, primary_instance_group, secondary_zone_instance_group): + logger.info( + 'Running test_secondary_locality_gets_no_requests_on_partial_primary_failure' + ) try: patch_backend_instances( gcp, backend_service, @@ -388,6 +397,8 @@ def test_secondary_locality_gets_no_requests_on_partial_primary_failure( def test_secondary_locality_gets_requests_on_primary_failure( gcp, backend_service, primary_instance_group, secondary_zone_instance_group): + logger.info( + 'Running test_secondary_locality_gets_requests_on_primary_failure') try: patch_backend_instances( gcp, backend_service, From 7c2b70d04a6e0f28ccaec938f4d806bc0aed841d Mon Sep 17 00:00:00 2001 From: Karthik Ravi Shankar Date: Wed, 11 Mar 2020 12:04:33 -0700 Subject: [PATCH 122/758] Fix clang format issue --- include/grpcpp/opencensus.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/include/grpcpp/opencensus.h b/include/grpcpp/opencensus.h index 63edd52e03f..0d66c8d8742 100644 --- a/include/grpcpp/opencensus.h +++ b/include/grpcpp/opencensus.h @@ -43,7 +43,8 @@ void RegisterOpenCensusPlugin(); void RegisterOpenCensusViewsForExport(); // Returns the tracing Span for the current RPC. -::opencensus::trace::Span GetSpanFromServerContext(::grpc_impl::ServerContext* context); +::opencensus::trace::Span GetSpanFromServerContext( + ::grpc_impl::ServerContext* context); } // namespace grpc From af62a34ae5ceb8b0d39a0662cb98c0e406e5b97f Mon Sep 17 00:00:00 2001 From: "Mark D. Roth" Date: Wed, 11 Mar 2020 12:39:42 -0700 Subject: [PATCH 123/758] Improve xds logging. --- doc/environment_variables.md | 5 + .../client_channel/lb_policy/xds/cds.cc | 44 +- .../client_channel/lb_policy/xds/xds.cc | 36 +- .../resolver/xds/xds_resolver.cc | 32 +- .../ext/filters/client_channel/xds/xds_api.cc | 658 +++++++++++++++++- .../ext/filters/client_channel/xds/xds_api.h | 6 +- .../client_channel/xds/xds_bootstrap.cc | 87 ++- .../client_channel/xds/xds_bootstrap.h | 6 +- .../filters/client_channel/xds/xds_client.cc | 72 +- 9 files changed, 890 insertions(+), 56 deletions(-) diff --git a/doc/environment_variables.md b/doc/environment_variables.md index aef14a9842c..e79c390c9a3 100644 --- a/doc/environment_variables.md +++ b/doc/environment_variables.md @@ -49,6 +49,7 @@ some configuration as environment variables that can be set. - cares_resolver - traces operations of the c-ares based DNS resolver - cares_address_sorting - traces operations of the c-ares based DNS resolver's resolved address sorter + - cds_lb - traces cds LB policy - channel - traces operations on the C core channel stack - client_channel_call - traces client channel call batch activity - client_channel_routing - traces client channel call routing, including @@ -77,11 +78,15 @@ some configuration as environment variables that can be set. - server_channel - lightweight trace of significant server channel events - secure_endpoint - traces bytes flowing through encrypted channels - subchannel - traces the connectivity state of subchannel + - subchannel_pool - traces subchannel pool - timer - timers (alarms) in the grpc internals - timer_check - more detailed trace of timer logic in grpc internals - transport_security - traces metadata about secure channel establishment - tcp - traces bytes in and out of a channel - tsi - traces tsi transport security + - xds_client - traces xds client + - xds_lb - traces xds LB policy + - xds_resolver - traces xds resolver The following tracers will only run in binaries built in DEBUG mode. This is accomplished by invoking `CONFIG=dbg make ` diff --git a/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc b/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc index 41c031b97d8..5e7d34823fb 100644 --- a/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +++ b/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc @@ -113,8 +113,14 @@ class CdsLb : public LoadBalancingPolicy { void CdsLb::ClusterWatcher::OnClusterChanged(XdsApi::CdsUpdate cluster_data) { if (GRPC_TRACE_FLAG_ENABLED(grpc_cds_lb_trace)) { - gpr_log(GPR_INFO, "[cdslb %p] received CDS update from xds client", - parent_.get()); + gpr_log(GPR_INFO, + "[cdslb %p] received CDS update from xds client %p: " + "eds_service_name=%s lrs_load_reporting_server_name=%s", + parent_.get(), parent_->xds_client_.get(), + cluster_data.eds_service_name.c_str(), + cluster_data.lrs_load_reporting_server_name.has_value() + ? cluster_data.lrs_load_reporting_server_name.value().c_str() + : "(unset)"); } // Construct config for child policy. Json::Object child_config = { @@ -152,9 +158,18 @@ void CdsLb::ClusterWatcher::OnClusterChanged(XdsApi::CdsUpdate cluster_data) { parent_->child_policy_ = LoadBalancingPolicyRegistry::CreateLoadBalancingPolicy( "xds_experimental", std::move(args)); + if (parent_->child_policy_ == nullptr) { + OnError(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "failed to create xds_experimental child policy")); + return; + } grpc_pollset_set_add_pollset_set( parent_->child_policy_->interested_parties(), parent_->interested_parties()); + if (GRPC_TRACE_FLAG_ENABLED(grpc_cds_lb_trace)) { + gpr_log(GPR_INFO, "[cdslb %p] created child policy xds_experimental (%p)", + parent_.get(), parent_->child_policy_.get()); + } } // Update child policy. UpdateArgs args; @@ -220,9 +235,9 @@ void CdsLb::Helper::AddTraceEvent(TraceSeverity severity, StringView message) { CdsLb::CdsLb(Args args) : LoadBalancingPolicy(std::move(args)), xds_client_(XdsClient::GetFromChannelArgs(*args.args)) { - if (xds_client_ != nullptr && GRPC_TRACE_FLAG_ENABLED(grpc_cds_lb_trace)) { - gpr_log(GPR_INFO, "[cdslb %p] Using xds client %p from channel", this, - xds_client_.get()); + if (GRPC_TRACE_FLAG_ENABLED(grpc_cds_lb_trace)) { + gpr_log(GPR_INFO, "[cdslb %p] created -- using xds client %p from channel", + this, xds_client_.get()); } } @@ -245,6 +260,10 @@ void CdsLb::ShutdownLocked() { } if (xds_client_ != nullptr) { if (cluster_watcher_ != nullptr) { + if (GRPC_TRACE_FLAG_ENABLED(grpc_cds_lb_trace)) { + gpr_log(GPR_INFO, "[cdslb %p] cancelling watch for cluster %s", this, + config_->cluster().c_str()); + } xds_client_->CancelClusterDataWatch( StringView(config_->cluster().c_str()), cluster_watcher_); } @@ -257,12 +276,13 @@ void CdsLb::ResetBackoffLocked() { } void CdsLb::UpdateLocked(UpdateArgs args) { - if (GRPC_TRACE_FLAG_ENABLED(grpc_cds_lb_trace)) { - gpr_log(GPR_INFO, "[cdslb %p] received update", this); - } // Update config. auto old_config = std::move(config_); config_ = std::move(args.config); + if (GRPC_TRACE_FLAG_ENABLED(grpc_cds_lb_trace)) { + gpr_log(GPR_INFO, "[cdslb %p] received update: cluster=%s", this, + config_->cluster().c_str()); + } // Update args. grpc_channel_args_destroy(args_); args_ = args.args; @@ -270,9 +290,17 @@ void CdsLb::UpdateLocked(UpdateArgs args) { // If cluster name changed, cancel watcher and restart. if (old_config == nullptr || old_config->cluster() != config_->cluster()) { if (old_config != nullptr) { + if (GRPC_TRACE_FLAG_ENABLED(grpc_cds_lb_trace)) { + gpr_log(GPR_INFO, "[cdslb %p] cancelling watch for cluster %s", this, + old_config->cluster().c_str()); + } xds_client_->CancelClusterDataWatch( StringView(old_config->cluster().c_str()), cluster_watcher_); } + if (GRPC_TRACE_FLAG_ENABLED(grpc_cds_lb_trace)) { + gpr_log(GPR_INFO, "[cdslb %p] starting watch for cluster %s", this, + config_->cluster().c_str()); + } auto watcher = absl::make_unique(Ref()); cluster_watcher_ = watcher.get(); xds_client_->WatchClusterData(StringView(config_->cluster().c_str()), diff --git a/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc b/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc index 4e16bb50214..5277f22a32a 100644 --- a/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc +++ b/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc @@ -69,7 +69,7 @@ namespace grpc_core { -TraceFlag grpc_lb_xds_trace(false, "xds"); +TraceFlag grpc_lb_xds_trace(false, "xds_lb"); namespace { @@ -619,6 +619,9 @@ class XdsLb::EndpointWatcher : public XdsClient::EndpointWatcherInterface { if (strstr(grpc_error_string(error), "xds call failed")) { xds_policy_->channel_control_helper()->RequestReresolution(); } + } else if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) { + gpr_log(GPR_INFO, "[xdslb %p] xds watcher reported error (ignoring): %s", + xds_policy_.get(), grpc_error_string(error)); } GRPC_ERROR_UNREF(error); } @@ -643,9 +646,8 @@ XdsLb::XdsLb(Args args) locality_map_failover_timeout_ms_(grpc_channel_args_find_integer( args.args, GRPC_ARG_XDS_FAILOVER_TIMEOUT_MS, {GRPC_XDS_DEFAULT_FAILOVER_TIMEOUT_MS, 0, INT_MAX})) { - if (xds_client_from_channel_ != nullptr && - GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) { - gpr_log(GPR_INFO, "[xdslb %p] Using xds client %p from channel", this, + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) { + gpr_log(GPR_INFO, "[xdslb %p] created -- xds client from channel: %p", this, xds_client_from_channel_.get()); } // Record server name. @@ -687,6 +689,10 @@ void XdsLb::ShutdownLocked() { // destroying the Xds client leading to a situation where the Xds lb policy is // never destroyed. if (xds_client_from_channel_ != nullptr) { + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) { + gpr_log(GPR_INFO, "[xdslb %p] cancelling watch for %s", this, + eds_service_name()); + } xds_client()->CancelEndpointDataWatch(StringView(eds_service_name()), endpoint_watcher_); xds_client_from_channel_.reset(); @@ -781,9 +787,17 @@ void XdsLb::UpdateLocked(UpdateArgs args) { if (is_initial_update || strcmp(old_eds_service_name, eds_service_name()) != 0) { if (!is_initial_update) { + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) { + gpr_log(GPR_INFO, "[xdslb %p] cancelling watch for %s", this, + old_eds_service_name); + } xds_client()->CancelEndpointDataWatch(StringView(old_eds_service_name), endpoint_watcher_); } + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) { + gpr_log(GPR_INFO, "[xdslb %p] starting watch for %s", this, + eds_service_name()); + } auto watcher = absl::make_unique( Ref(DEBUG_LOCATION, "EndpointWatcher")); endpoint_watcher_ = watcher.get(); @@ -1071,6 +1085,9 @@ void XdsLb::LocalityMap::ResetBackoffLocked() { } void XdsLb::LocalityMap::UpdateXdsPickerLocked() { + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) { + gpr_log(GPR_INFO, "[xdslb %p] constructing new picker", xds_policy()); + } // Construct a new xds picker which maintains a map of all locality pickers // that are ready. Each locality is represented by a portion of the range // proportional to its weight, such that the total range is the sum of the @@ -1086,6 +1103,11 @@ void XdsLb::LocalityMap::UpdateXdsPickerLocked() { end += locality->weight(); picker_list.push_back( std::make_pair(end, locality->GetLoadReportingPicker())); + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) { + gpr_log(GPR_INFO, "[xdslb %p] locality=%s weight=%d picker=%p", + xds_policy(), locality_name->AsHumanReadableString(), + locality->weight(), picker_list.back().second.get()); + } } xds_policy()->channel_control_helper()->UpdateState( GRPC_CHANNEL_READY, @@ -1492,6 +1514,12 @@ XdsLb::LocalityMap::Locality::Helper::CreateSubchannel( void XdsLb::LocalityMap::Locality::Helper::UpdateState( grpc_connectivity_state state, std::unique_ptr picker) { if (locality_->xds_policy()->shutting_down_) return; + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) { + gpr_log(GPR_INFO, + "[xdslb %p helper %p] child policy handler %p reports state=%s", + locality_->xds_policy(), this, locality_->child_policy_.get(), + ConnectivityStateName(state)); + } // Cache the state and picker in the locality. locality_->connectivity_state_ = state; locality_->picker_wrapper_ = diff --git a/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc b/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc index 8b7354f8621..95fc1535689 100644 --- a/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +++ b/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc @@ -24,6 +24,8 @@ namespace grpc_core { +TraceFlag grpc_xds_resolver_trace(false, "xds_resolver"); + namespace { // @@ -38,14 +40,28 @@ class XdsResolver : public Resolver { interested_parties_(args.pollset_set) { char* path = args.uri->path; if (path[0] == '/') ++path; - server_name_.reset(gpr_strdup(path)); + server_name_ = path; + if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_resolver_trace)) { + gpr_log(GPR_INFO, "[xds_resolver %p] created for server name %s", this, + server_name_.c_str()); + } } - ~XdsResolver() override { grpc_channel_args_destroy(args_); } + ~XdsResolver() override { + grpc_channel_args_destroy(args_); + if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_resolver_trace)) { + gpr_log(GPR_INFO, "[xds_resolver %p] destroyed", this); + } + } void StartLocked() override; - void ShutdownLocked() override { xds_client_.reset(); } + void ShutdownLocked() override { + if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_resolver_trace)) { + gpr_log(GPR_INFO, "[xds_resolver %p] shutting down", this); + } + xds_client_.reset(); + } private: class ServiceConfigWatcher : public XdsClient::ServiceConfigWatcherInterface { @@ -60,7 +76,7 @@ class XdsResolver : public Resolver { RefCountedPtr resolver_; }; - grpc_core::UniquePtr server_name_; + std::string server_name_; const grpc_channel_args* args_; grpc_pollset_set* interested_parties_; OrphanablePtr xds_client_; @@ -69,6 +85,10 @@ class XdsResolver : public Resolver { void XdsResolver::ServiceConfigWatcher::OnServiceConfigChanged( RefCountedPtr service_config) { if (resolver_->xds_client_ == nullptr) return; + if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_resolver_trace)) { + gpr_log(GPR_INFO, "[xds_resolver %p] received updated service config: %s", + resolver_.get(), service_config->json_string().c_str()); + } grpc_arg xds_client_arg = resolver_->xds_client_->MakeChannelArg(); Result result; result.args = @@ -79,6 +99,8 @@ void XdsResolver::ServiceConfigWatcher::OnServiceConfigChanged( void XdsResolver::ServiceConfigWatcher::OnError(grpc_error* error) { if (resolver_->xds_client_ == nullptr) return; + gpr_log(GPR_ERROR, "[xds_resolver %p] received error: %s", resolver_.get(), + grpc_error_string(error)); grpc_arg xds_client_arg = resolver_->xds_client_->MakeChannelArg(); Result result; result.args = @@ -90,7 +112,7 @@ void XdsResolver::ServiceConfigWatcher::OnError(grpc_error* error) { void XdsResolver::StartLocked() { grpc_error* error = GRPC_ERROR_NONE; xds_client_ = MakeOrphanable( - combiner(), interested_parties_, StringView(server_name_.get()), + combiner(), interested_parties_, server_name_, absl::make_unique(Ref()), *args_, &error); if (error != GRPC_ERROR_NONE) { gpr_log(GPR_ERROR, diff --git a/src/core/ext/filters/client_channel/xds/xds_api.cc b/src/core/ext/filters/client_channel/xds/xds_api.cc index e2628cb3f57..9dc6d39ce66 100644 --- a/src/core/ext/filters/client_channel/xds/xds_api.cc +++ b/src/core/ext/filters/client_channel/xds/xds_api.cc @@ -23,6 +23,7 @@ #include #include "absl/strings/str_cat.h" +#include "absl/strings/str_join.h" #include #include @@ -125,8 +126,11 @@ const char* XdsApi::kCdsTypeUrl = "type.googleapis.com/envoy.api.v2.Cluster"; const char* XdsApi::kEdsTypeUrl = "type.googleapis.com/envoy.api.v2.ClusterLoadAssignment"; -XdsApi::XdsApi(const XdsBootstrap::Node* node) - : node_(node), +XdsApi::XdsApi(XdsClient* client, TraceFlag* tracer, + const XdsBootstrap::Node* node) + : client_(client), + tracer_(tracer), + node_(node), build_version_(absl::StrCat("gRPC C-core ", GPR_PLATFORM_STRING, " ", grpc_version_string())), user_agent_name_(absl::StrCat("gRPC C-core ", GPR_PLATFORM_STRING)) {} @@ -289,6 +293,162 @@ envoy_api_v2_DiscoveryRequest* CreateDiscoveryRequest( return request; } +inline absl::string_view UpbStringToAbsl(const upb_strview& str) { + return absl::string_view(str.data, str.size); +} + +inline void AddStringField(const char* name, const upb_strview& value, + std::vector* fields, + bool add_if_empty = false) { + if (value.size > 0 || add_if_empty) { + fields->emplace_back( + absl::StrCat(name, ": \"", UpbStringToAbsl(value), "\"")); + } +} + +inline void AddLocalityField(int indent_level, + const envoy_api_v2_core_Locality* locality, + std::vector* fields) { + std::string indent = + absl::StrJoin(std::vector(indent_level, " "), ""); + // region + std::string field = absl::StrCat(indent, "region"); + AddStringField(field.c_str(), envoy_api_v2_core_Locality_region(locality), + fields); + // zone + field = absl::StrCat(indent, "zone"); + AddStringField(field.c_str(), envoy_api_v2_core_Locality_zone(locality), + fields); + // sub_zone + field = absl::StrCat(indent, "sub_zone"); + AddStringField(field.c_str(), envoy_api_v2_core_Locality_sub_zone(locality), + fields); +} + +void AddNodeLogFields(const envoy_api_v2_core_Node* node, + std::vector* fields) { + fields->emplace_back("node {"); + // id + AddStringField(" id", envoy_api_v2_core_Node_id(node), fields); + // metadata + const google_protobuf_Struct* metadata = + envoy_api_v2_core_Node_metadata(node); + if (metadata != nullptr) { + fields->emplace_back(" metadata {"); + size_t num_entries; + const google_protobuf_Struct_FieldsEntry* const* entries = + google_protobuf_Struct_fields(metadata, &num_entries); + for (size_t i = 0; i < num_entries; ++i) { + fields->emplace_back(" field {"); + // key + AddStringField(" key", + google_protobuf_Struct_FieldsEntry_key(entries[i]), + fields); + // value + const google_protobuf_Value* value = + google_protobuf_Struct_FieldsEntry_value(entries[i]); + if (value != nullptr) { + std::string value_str; + if (google_protobuf_Value_has_string_value(value)) { + value_str = absl::StrCat( + "string_value: \"", + UpbStringToAbsl(google_protobuf_Value_string_value(value)), "\""); + } else if (google_protobuf_Value_has_null_value(value)) { + value_str = "null_value: NULL_VALUE"; + } else if (google_protobuf_Value_has_number_value(value)) { + value_str = absl::StrCat("double_value: ", + google_protobuf_Value_number_value(value)); + } else if (google_protobuf_Value_has_bool_value(value)) { + value_str = absl::StrCat("bool_value: ", + google_protobuf_Value_bool_value(value)); + } else if (google_protobuf_Value_has_struct_value(value)) { + value_str = "struct_value: "; + } else if (google_protobuf_Value_has_list_value(value)) { + value_str = "list_value: "; + } else { + value_str = ""; + } + fields->emplace_back(absl::StrCat(" value { ", value_str, " }")); + } + fields->emplace_back(" }"); + } + fields->emplace_back(" }"); + } + // locality + const envoy_api_v2_core_Locality* locality = + envoy_api_v2_core_Node_locality(node); + if (locality != nullptr) { + fields->emplace_back(" locality {"); + AddLocalityField(2, locality, fields); + fields->emplace_back(" }"); + } + // build_version + AddStringField(" build_version", envoy_api_v2_core_Node_build_version(node), + fields); + // user_agent_name + AddStringField(" user_agent_name", + envoy_api_v2_core_Node_user_agent_name(node), fields); + // user_agent_version + AddStringField(" user_agent_version", + envoy_api_v2_core_Node_user_agent_version(node), fields); + // client_features + size_t num_client_features; + const upb_strview* client_features = + envoy_api_v2_core_Node_client_features(node, &num_client_features); + for (size_t i = 0; i < num_client_features; ++i) { + AddStringField(" client_features", client_features[i], fields); + } + fields->emplace_back("}"); +} + +void MaybeLogDiscoveryRequest(XdsClient* client, TraceFlag* tracer, + const envoy_api_v2_DiscoveryRequest* request) { + if (GRPC_TRACE_FLAG_ENABLED(*tracer) && + gpr_should_log(GPR_LOG_SEVERITY_DEBUG)) { + // TODO(roth): When we can upgrade upb, use upb textformat code to dump + // the raw proto instead of doing this manually. + std::vector fields; + // version_info + AddStringField("version_info", + envoy_api_v2_DiscoveryRequest_version_info(request), + &fields); + // node + const envoy_api_v2_core_Node* node = + envoy_api_v2_DiscoveryRequest_node(request); + if (node != nullptr) AddNodeLogFields(node, &fields); + // resource_names + size_t num_resource_names; + const upb_strview* resource_names = + envoy_api_v2_DiscoveryRequest_resource_names(request, + &num_resource_names); + for (size_t i = 0; i < num_resource_names; ++i) { + AddStringField("resource_names", resource_names[i], &fields); + } + // type_url + AddStringField("type_url", envoy_api_v2_DiscoveryRequest_type_url(request), + &fields); + // response_nonce + AddStringField("response_nonce", + envoy_api_v2_DiscoveryRequest_response_nonce(request), + &fields); + // error_detail + const struct google_rpc_Status* error_detail = + envoy_api_v2_DiscoveryRequest_error_detail(request); + if (error_detail != nullptr) { + fields.emplace_back("error_detail {"); + // code + int32_t code = google_rpc_Status_code(error_detail); + if (code != 0) fields.emplace_back(absl::StrCat(" code: ", code)); + // message + AddStringField(" message", google_rpc_Status_message(error_detail), + &fields); + fields.emplace_back("}"); + } + gpr_log(GPR_DEBUG, "[xds_client %p] constructed ADS request: %s", client, + absl::StrJoin(fields, "\n").c_str()); + } +} + grpc_slice SerializeDiscoveryRequest(upb_arena* arena, envoy_api_v2_DiscoveryRequest* request) { size_t output_length; @@ -305,6 +465,7 @@ grpc_slice XdsApi::CreateUnsupportedTypeNackRequest(const std::string& type_url, upb::Arena arena; envoy_api_v2_DiscoveryRequest* request = CreateDiscoveryRequest( arena.ptr(), type_url.c_str(), /*version=*/"", nonce, error); + MaybeLogDiscoveryRequest(client_, tracer_, request); return SerializeDiscoveryRequest(arena.ptr(), request); } @@ -326,6 +487,7 @@ grpc_slice XdsApi::CreateLdsRequest(const std::string& server_name, envoy_api_v2_DiscoveryRequest_add_resource_names( request, upb_strview_make(server_name.data(), server_name.size()), arena.ptr()); + MaybeLogDiscoveryRequest(client_, tracer_, request); return SerializeDiscoveryRequest(arena.ptr(), request); } @@ -348,6 +510,7 @@ grpc_slice XdsApi::CreateRdsRequest(const std::string& route_config_name, request, upb_strview_make(route_config_name.data(), route_config_name.size()), arena.ptr()); + MaybeLogDiscoveryRequest(client_, tracer_, request); return SerializeDiscoveryRequest(arena.ptr(), request); } @@ -371,6 +534,7 @@ grpc_slice XdsApi::CreateCdsRequest(const std::set& cluster_names, request, upb_strview_make(cluster_name.data(), cluster_name.size()), arena.ptr()); } + MaybeLogDiscoveryRequest(client_, tracer_, request); return SerializeDiscoveryRequest(arena.ptr(), request); } @@ -394,11 +558,347 @@ grpc_slice XdsApi::CreateEdsRequest( upb_strview_make(eds_service_name.data(), eds_service_name.size()), arena.ptr()); } + MaybeLogDiscoveryRequest(client_, tracer_, request); return SerializeDiscoveryRequest(arena.ptr(), request); } namespace { +void MaybeLogDiscoveryResponse(XdsClient* client, TraceFlag* tracer, + const envoy_api_v2_DiscoveryResponse* response) { + if (GRPC_TRACE_FLAG_ENABLED(*tracer) && + gpr_should_log(GPR_LOG_SEVERITY_DEBUG)) { + // TODO(roth): When we can upgrade upb, use upb textformat code to dump + // the raw proto instead of doing this manually. + std::vector fields; + // version_info + AddStringField("version_info", + envoy_api_v2_DiscoveryResponse_version_info(response), + &fields); + // resources + size_t num_resources; + envoy_api_v2_DiscoveryResponse_resources(response, &num_resources); + fields.emplace_back( + absl::StrCat("resources: <", num_resources, " element(s)>")); + // type_url + AddStringField("type_url", + envoy_api_v2_DiscoveryResponse_type_url(response), &fields); + // nonce + AddStringField("nonce", envoy_api_v2_DiscoveryResponse_nonce(response), + &fields); + gpr_log(GPR_DEBUG, "[xds_client %p] received response: %s", client, + absl::StrJoin(fields, "\n").c_str()); + } +} + +void MaybeLogRouteConfiguration( + XdsClient* client, TraceFlag* tracer, + const envoy_api_v2_RouteConfiguration* route_config) { + if (GRPC_TRACE_FLAG_ENABLED(*tracer) && + gpr_should_log(GPR_LOG_SEVERITY_DEBUG)) { + // TODO(roth): When we can upgrade upb, use upb textformat code to dump + // the raw proto instead of doing this manually. + std::vector fields; + // name + AddStringField("name", envoy_api_v2_RouteConfiguration_name(route_config), + &fields); + // virtual_hosts + size_t num_virtual_hosts; + const envoy_api_v2_route_VirtualHost* const* virtual_hosts = + envoy_api_v2_RouteConfiguration_virtual_hosts(route_config, + &num_virtual_hosts); + for (size_t i = 0; i < num_virtual_hosts; ++i) { + const auto* virtual_host = virtual_hosts[i]; + fields.push_back("virtual_hosts {"); + // name + AddStringField( + " name", envoy_api_v2_route_VirtualHost_name(virtual_host), &fields); + // domains + size_t num_domains; + const upb_strview* const domains = + envoy_api_v2_route_VirtualHost_domains(virtual_host, &num_domains); + for (size_t j = 0; j < num_domains; ++j) { + AddStringField(" domains", domains[j], &fields); + } + // routes + size_t num_routes; + const envoy_api_v2_route_Route* const* routes = + envoy_api_v2_route_VirtualHost_routes(virtual_host, &num_routes); + for (size_t j = 0; j < num_routes; ++j) { + const auto* route = routes[j]; + fields.push_back(" route {"); + // name + AddStringField(" name", envoy_api_v2_route_Route_name(route), + &fields); + // match + const envoy_api_v2_route_RouteMatch* match = + envoy_api_v2_route_Route_match(route); + if (match != nullptr) { + fields.emplace_back(" match {"); + // path matching + if (envoy_api_v2_route_RouteMatch_has_prefix(match)) { + AddStringField(" prefix", + envoy_api_v2_route_RouteMatch_prefix(match), &fields, + /*add_if_empty=*/true); + } else if (envoy_api_v2_route_RouteMatch_has_path(match)) { + AddStringField(" path", + envoy_api_v2_route_RouteMatch_path(match), &fields, + /*add_if_empty=*/true); + } else if (envoy_api_v2_route_RouteMatch_has_regex(match)) { + AddStringField(" regex", + envoy_api_v2_route_RouteMatch_regex(match), &fields, + /*add_if_empty=*/true); + } else if (envoy_api_v2_route_RouteMatch_has_safe_regex(match)) { + fields.emplace_back(" safe_regex: "); + } else { + fields.emplace_back(" "); + } + // header matching + size_t num_headers; + envoy_api_v2_route_RouteMatch_headers(match, &num_headers); + if (num_headers > 0) { + fields.emplace_back( + absl::StrCat(" headers: <", num_headers, " element(s)>")); + } + fields.emplace_back(" }"); + } + // action + if (envoy_api_v2_route_Route_has_route(route)) { + const envoy_api_v2_route_RouteAction* action = + envoy_api_v2_route_Route_route(route); + fields.emplace_back(" route {"); + if (envoy_api_v2_route_RouteAction_has_cluster(action)) { + AddStringField(" cluster", + envoy_api_v2_route_RouteAction_cluster(action), + &fields); + } else if (envoy_api_v2_route_RouteAction_has_cluster_header( + action)) { + AddStringField( + " cluster_header", + envoy_api_v2_route_RouteAction_cluster_header(action), &fields); + } else if (envoy_api_v2_route_RouteAction_has_weighted_clusters( + action)) { + fields.emplace_back(" weighted_clusters: "); + } + fields.emplace_back(" }"); + } else if (envoy_api_v2_route_Route_has_redirect(route)) { + fields.emplace_back(" redirect: "); + } else if (envoy_api_v2_route_Route_has_direct_response(route)) { + fields.emplace_back(" direct_response: "); + } else if (envoy_api_v2_route_Route_has_filter_action(route)) { + fields.emplace_back(" filter_action: "); + } + fields.push_back(" }"); + } + fields.push_back("}"); + } + gpr_log(GPR_DEBUG, "[xds_client %p] RouteConfiguration: %s", client, + absl::StrJoin(fields, "\n").c_str()); + } +} + +void MaybeLogCluster(XdsClient* client, TraceFlag* tracer, + const envoy_api_v2_Cluster* cluster) { + if (GRPC_TRACE_FLAG_ENABLED(*tracer) && + gpr_should_log(GPR_LOG_SEVERITY_DEBUG)) { + // TODO(roth): When we can upgrade upb, use upb textformat code to dump + // the raw proto instead of doing this manually. + std::vector fields; + // name + AddStringField("name", envoy_api_v2_Cluster_name(cluster), &fields); + // type + if (envoy_api_v2_Cluster_has_type(cluster)) { + fields.emplace_back( + absl::StrCat("type: ", envoy_api_v2_Cluster_type(cluster))); + } else if (envoy_api_v2_Cluster_has_cluster_type(cluster)) { + fields.emplace_back("cluster_type: "); + } else { + fields.emplace_back(""); + } + // eds_cluster_config + const envoy_api_v2_Cluster_EdsClusterConfig* eds_cluster_config = + envoy_api_v2_Cluster_eds_cluster_config(cluster); + if (eds_cluster_config != nullptr) { + fields.emplace_back("eds_cluster_config {"); + // eds_config + const struct envoy_api_v2_core_ConfigSource* eds_config = + envoy_api_v2_Cluster_EdsClusterConfig_eds_config(eds_cluster_config); + if (eds_config != nullptr) { + if (envoy_api_v2_core_ConfigSource_has_ads(eds_config)) { + fields.emplace_back(" eds_config { ads {} }"); + } else { + fields.emplace_back(" eds_config: "); + } + } + // service_name + AddStringField(" service_name", + envoy_api_v2_Cluster_EdsClusterConfig_service_name( + eds_cluster_config), + &fields); + fields.emplace_back("}"); + } + // lb_policy + fields.emplace_back( + absl::StrCat("lb_policy: ", envoy_api_v2_Cluster_lb_policy(cluster))); + // lrs_server + const envoy_api_v2_core_ConfigSource* lrs_server = + envoy_api_v2_Cluster_lrs_server(cluster); + if (lrs_server != nullptr) { + if (envoy_api_v2_core_ConfigSource_has_self(lrs_server)) { + fields.emplace_back("lrs_server { self {} }"); + } else { + fields.emplace_back("lrs_server: "); + } + } + gpr_log(GPR_DEBUG, "[xds_client %p] Cluster: %s", client, + absl::StrJoin(fields, "\n").c_str()); + } +} + +void MaybeLogClusterLoadAssignment( + XdsClient* client, TraceFlag* tracer, + const envoy_api_v2_ClusterLoadAssignment* cla) { + if (GRPC_TRACE_FLAG_ENABLED(*tracer) && + gpr_should_log(GPR_LOG_SEVERITY_DEBUG)) { + // TODO(roth): When we can upgrade upb, use upb textformat code to dump + // the raw proto instead of doing this manually. + std::vector fields; + // cluster_name + AddStringField("cluster_name", + envoy_api_v2_ClusterLoadAssignment_cluster_name(cla), + &fields); + // endpoints + size_t num_localities; + const struct envoy_api_v2_endpoint_LocalityLbEndpoints* const* + locality_endpoints = + envoy_api_v2_ClusterLoadAssignment_endpoints(cla, &num_localities); + for (size_t i = 0; i < num_localities; ++i) { + const auto* locality_endpoint = locality_endpoints[i]; + fields.emplace_back("endpoints {"); + // locality + const auto* locality = + envoy_api_v2_endpoint_LocalityLbEndpoints_locality(locality_endpoint); + if (locality != nullptr) { + fields.emplace_back(" locality {"); + AddLocalityField(2, locality, &fields); + fields.emplace_back(" }"); + } + // lb_endpoints + size_t num_lb_endpoints; + const envoy_api_v2_endpoint_LbEndpoint* const* lb_endpoints = + envoy_api_v2_endpoint_LocalityLbEndpoints_lb_endpoints( + locality_endpoint, &num_lb_endpoints); + for (size_t j = 0; j < num_lb_endpoints; ++j) { + const auto* lb_endpoint = lb_endpoints[j]; + fields.emplace_back(" lb_endpoints {"); + // health_status + uint32_t health_status = + envoy_api_v2_endpoint_LbEndpoint_health_status(lb_endpoint); + if (health_status > 0) { + fields.emplace_back( + absl::StrCat(" health_status: ", health_status)); + } + // endpoint + const envoy_api_v2_endpoint_Endpoint* endpoint = + envoy_api_v2_endpoint_LbEndpoint_endpoint(lb_endpoint); + if (endpoint != nullptr) { + fields.emplace_back(" endpoint {"); + // address + const auto* address = + envoy_api_v2_endpoint_Endpoint_address(endpoint); + if (address != nullptr) { + fields.emplace_back(" address {"); + // socket_address + const auto* socket_address = + envoy_api_v2_core_Address_socket_address(address); + if (socket_address != nullptr) { + fields.emplace_back(" socket_address {"); + // address + AddStringField( + " address", + envoy_api_v2_core_SocketAddress_address(socket_address), + &fields); + // port_value + if (envoy_api_v2_core_SocketAddress_has_port_value( + socket_address)) { + fields.emplace_back( + absl::StrCat(" port_value: ", + envoy_api_v2_core_SocketAddress_port_value( + socket_address))); + } else { + fields.emplace_back(" "); + } + fields.emplace_back(" }"); + } else { + fields.emplace_back(" "); + } + fields.emplace_back(" }"); + } + fields.emplace_back(" }"); + } + fields.emplace_back(" }"); + } + // load_balancing_weight + const google_protobuf_UInt32Value* lb_weight = + envoy_api_v2_endpoint_LocalityLbEndpoints_load_balancing_weight( + locality_endpoint); + if (lb_weight != nullptr) { + fields.emplace_back( + absl::StrCat(" load_balancing_weight { value: ", + google_protobuf_UInt32Value_value(lb_weight), " }")); + } + // priority + uint32_t priority = + envoy_api_v2_endpoint_LocalityLbEndpoints_priority(locality_endpoint); + if (priority > 0) { + fields.emplace_back(absl::StrCat(" priority: ", priority)); + } + fields.emplace_back("}"); + } + // policy + const envoy_api_v2_ClusterLoadAssignment_Policy* policy = + envoy_api_v2_ClusterLoadAssignment_policy(cla); + if (policy != nullptr) { + fields.emplace_back("policy {"); + // drop_overloads + size_t num_drop_overloads; + const envoy_api_v2_ClusterLoadAssignment_Policy_DropOverload* const* + drop_overloads = + envoy_api_v2_ClusterLoadAssignment_Policy_drop_overloads( + policy, &num_drop_overloads); + for (size_t i = 0; i < num_drop_overloads; ++i) { + auto* drop_overload = drop_overloads[i]; + fields.emplace_back(" drop_overloads {"); + // category + AddStringField( + " category", + envoy_api_v2_ClusterLoadAssignment_Policy_DropOverload_category( + drop_overload), + &fields); + // drop_percentage + const auto* drop_percentage = + envoy_api_v2_ClusterLoadAssignment_Policy_DropOverload_drop_percentage( + drop_overload); + if (drop_percentage != nullptr) { + fields.emplace_back(" drop_percentage {"); + fields.emplace_back(absl::StrCat( + " numerator: ", + envoy_type_FractionalPercent_numerator(drop_percentage))); + fields.emplace_back(absl::StrCat( + " denominator: ", + envoy_type_FractionalPercent_denominator(drop_percentage))); + fields.emplace_back(" }"); + } + fields.emplace_back(" }"); + } + // overprovisioning_factor + fields.emplace_back("}"); + } + gpr_log(GPR_DEBUG, "[xds_client %p] ClusterLoadAssignment: %s", client, + absl::StrJoin(fields, "\n").c_str()); + } +} + // Better match type has smaller value. enum MatchType { EXACT_MATCH, @@ -449,8 +949,10 @@ MatchType DomainPatternMatchType(const std::string& domain_pattern) { } grpc_error* RouteConfigParse( + XdsClient* client, TraceFlag* tracer, const envoy_api_v2_RouteConfiguration* route_config, const std::string& expected_server_name, XdsApi::RdsUpdate* rds_update) { + MaybeLogRouteConfiguration(client, tracer, route_config); // Get the virtual hosts. size_t size; const envoy_api_v2_route_VirtualHost* const* virtual_hosts = @@ -540,7 +1042,8 @@ grpc_error* RouteConfigParse( return GRPC_ERROR_NONE; } -grpc_error* LdsResponseParse(const envoy_api_v2_DiscoveryResponse* response, +grpc_error* LdsResponseParse(XdsClient* client, TraceFlag* tracer, + const envoy_api_v2_DiscoveryResponse* response, const std::string& expected_server_name, XdsApi::LdsUpdate* lds_update, upb_arena* arena) { // Get the resources from the response. @@ -590,8 +1093,8 @@ grpc_error* LdsResponseParse(const envoy_api_v2_DiscoveryResponse* response, envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_route_config( http_connection_manager); XdsApi::RdsUpdate rds_update; - grpc_error* error = - RouteConfigParse(route_config, expected_server_name, &rds_update); + grpc_error* error = RouteConfigParse(client, tracer, route_config, + expected_server_name, &rds_update); if (error != GRPC_ERROR_NONE) return error; lds_update->rds_update.emplace(std::move(rds_update)); const upb_strview route_config_name = @@ -621,7 +1124,8 @@ grpc_error* LdsResponseParse(const envoy_api_v2_DiscoveryResponse* response, "No listener found for expected server name."); } -grpc_error* RdsResponseParse(const envoy_api_v2_DiscoveryResponse* response, +grpc_error* RdsResponseParse(XdsClient* client, TraceFlag* tracer, + const envoy_api_v2_DiscoveryResponse* response, const std::string& expected_server_name, const std::string& expected_route_config_name, XdsApi::RdsUpdate* rds_update, upb_arena* arena) { @@ -655,8 +1159,8 @@ grpc_error* RdsResponseParse(const envoy_api_v2_DiscoveryResponse* response, if (!upb_strview_eql(name, expected_name)) continue; // Parse the route_config. XdsApi::RdsUpdate local_rds_update; - grpc_error* error = - RouteConfigParse(route_config, expected_server_name, &local_rds_update); + grpc_error* error = RouteConfigParse( + client, tracer, route_config, expected_server_name, &local_rds_update); if (error != GRPC_ERROR_NONE) return error; *rds_update = std::move(local_rds_update); return GRPC_ERROR_NONE; @@ -665,7 +1169,8 @@ grpc_error* RdsResponseParse(const envoy_api_v2_DiscoveryResponse* response, "No route config found for expected name."); } -grpc_error* CdsResponseParse(const envoy_api_v2_DiscoveryResponse* response, +grpc_error* CdsResponseParse(XdsClient* client, TraceFlag* tracer, + const envoy_api_v2_DiscoveryResponse* response, XdsApi::CdsUpdateMap* cds_update_map, upb_arena* arena) { // Get the resources from the response. @@ -691,6 +1196,7 @@ grpc_error* CdsResponseParse(const envoy_api_v2_DiscoveryResponse* response, if (cluster == nullptr) { return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Can't decode cluster."); } + MaybeLogCluster(client, tracer, cluster); // Check the cluster_discovery_type. if (!envoy_api_v2_Cluster_has_type(cluster)) { return GRPC_ERROR_CREATE_FROM_STATIC_STRING("DiscoveryType not found."); @@ -849,6 +1355,7 @@ grpc_error* DropParseAndAppend( } grpc_error* EdsResponsedParse( + XdsClient* client, TraceFlag* tracer, const envoy_api_v2_DiscoveryResponse* response, const std::set& expected_eds_service_names, XdsApi::EdsUpdateMap* eds_update_map, upb_arena* arena) { @@ -878,6 +1385,7 @@ grpc_error* EdsResponsedParse( return GRPC_ERROR_CREATE_FROM_STATIC_STRING( "Can't parse cluster_load_assignment."); } + MaybeLogClusterLoadAssignment(client, tracer, cluster_load_assignment); // Check the cluster name (which actually means eds_service_name). Ignore // unexpected names. upb_strview cluster_name = envoy_api_v2_ClusterLoadAssignment_cluster_name( @@ -950,6 +1458,7 @@ grpc_error* XdsApi::ParseAdsResponse( return GRPC_ERROR_CREATE_FROM_STATIC_STRING( "Can't decode the whole response."); } + MaybeLogDiscoveryResponse(client_, tracer_, response); // Record the type_url, the version_info, and the nonce of the response. upb_strview type_url_strview = envoy_api_v2_DiscoveryResponse_type_url(response); @@ -961,17 +1470,19 @@ grpc_error* XdsApi::ParseAdsResponse( *nonce = std::string(nonce_strview.data, nonce_strview.size); // Parse the response according to the resource type. if (*type_url == kLdsTypeUrl) { - return LdsResponseParse(response, expected_server_name, lds_update, - arena.ptr()); + return LdsResponseParse(client_, tracer_, response, expected_server_name, + lds_update, arena.ptr()); } else if (*type_url == kRdsTypeUrl) { - return RdsResponseParse(response, expected_server_name, + return RdsResponseParse(client_, tracer_, response, expected_server_name, expected_route_config_name, rds_update, arena.ptr()); } else if (*type_url == kCdsTypeUrl) { - return CdsResponseParse(response, cds_update_map, arena.ptr()); + return CdsResponseParse(client_, tracer_, response, cds_update_map, + arena.ptr()); } else if (*type_url == kEdsTypeUrl) { - return EdsResponsedParse(response, expected_eds_service_names, - eds_update_map, arena.ptr()); + return EdsResponsedParse(client_, tracer_, response, + expected_eds_service_names, eds_update_map, + arena.ptr()); } else { return GRPC_ERROR_CREATE_FROM_STATIC_STRING( "Unsupported ADS resource type."); @@ -980,6 +1491,121 @@ grpc_error* XdsApi::ParseAdsResponse( namespace { +void MaybeLogLrsRequest( + XdsClient* client, TraceFlag* tracer, + const envoy_service_load_stats_v2_LoadStatsRequest* request) { + if (GRPC_TRACE_FLAG_ENABLED(*tracer) && + gpr_should_log(GPR_LOG_SEVERITY_DEBUG)) { + // TODO(roth): When we can upgrade upb, use upb textformat code to dump + // the raw proto instead of doing this manually. + std::vector fields; + // node + const auto* node = + envoy_service_load_stats_v2_LoadStatsRequest_node(request); + if (node != nullptr) { + AddNodeLogFields(node, &fields); + } + // cluster_stats + size_t num_cluster_stats; + const struct envoy_api_v2_endpoint_ClusterStats* const* cluster_stats = + envoy_service_load_stats_v2_LoadStatsRequest_cluster_stats( + request, &num_cluster_stats); + for (size_t i = 0; i < num_cluster_stats; ++i) { + const auto* cluster_stat = cluster_stats[i]; + fields.emplace_back("cluster_stats {"); + // cluster_name + AddStringField( + " cluster_name", + envoy_api_v2_endpoint_ClusterStats_cluster_name(cluster_stat), + &fields); + // cluster_service_name + AddStringField( + " cluster_service_name", + envoy_api_v2_endpoint_ClusterStats_cluster_service_name(cluster_stat), + &fields); + // upstream_locality_stats + size_t num_stats; + const envoy_api_v2_endpoint_UpstreamLocalityStats* const* stats = + envoy_api_v2_endpoint_ClusterStats_upstream_locality_stats( + cluster_stat, &num_stats); + for (size_t j = 0; j < num_stats; ++j) { + const auto* stat = stats[j]; + fields.emplace_back(" upstream_locality_stats {"); + // locality + const auto* locality = + envoy_api_v2_endpoint_UpstreamLocalityStats_locality(stat); + if (locality != nullptr) { + fields.emplace_back(" locality {"); + AddLocalityField(3, locality, &fields); + fields.emplace_back(" }"); + } + // total_successful_requests + fields.emplace_back(absl::StrCat( + " total_successful_requests: ", + envoy_api_v2_endpoint_UpstreamLocalityStats_total_successful_requests( + stat))); + // total_requests_in_progress + fields.emplace_back(absl::StrCat( + " total_requests_in_progress: ", + envoy_api_v2_endpoint_UpstreamLocalityStats_total_requests_in_progress( + stat))); + // total_error_requests + fields.emplace_back(absl::StrCat( + " total_error_requests: ", + envoy_api_v2_endpoint_UpstreamLocalityStats_total_error_requests( + stat))); + // total_issued_requests + fields.emplace_back(absl::StrCat( + " total_issued_requests: ", + envoy_api_v2_endpoint_UpstreamLocalityStats_total_issued_requests( + stat))); + fields.emplace_back(" }"); + } + // total_dropped_requests + fields.emplace_back(absl::StrCat( + " total_dropped_requests: ", + envoy_api_v2_endpoint_ClusterStats_total_dropped_requests( + cluster_stat))); + // dropped_requests + size_t num_drops; + const envoy_api_v2_endpoint_ClusterStats_DroppedRequests* const* drops = + envoy_api_v2_endpoint_ClusterStats_dropped_requests(cluster_stat, + &num_drops); + for (size_t j = 0; j < num_drops; ++j) { + const auto* drop = drops[j]; + fields.emplace_back(" dropped_requests {"); + // category + AddStringField( + " category", + envoy_api_v2_endpoint_ClusterStats_DroppedRequests_category(drop), + &fields); + // dropped_count + fields.emplace_back(absl::StrCat( + " dropped_count: ", + envoy_api_v2_endpoint_ClusterStats_DroppedRequests_dropped_count( + drop))); + fields.emplace_back(" }"); + } + // load_report_interval + const auto* load_report_interval = + envoy_api_v2_endpoint_ClusterStats_load_report_interval(cluster_stat); + if (load_report_interval != nullptr) { + fields.emplace_back(" load_report_interval {"); + fields.emplace_back(absl::StrCat( + " seconds: ", + google_protobuf_Duration_seconds(load_report_interval))); + fields.emplace_back( + absl::StrCat(" nanos: ", + google_protobuf_Duration_nanos(load_report_interval))); + fields.emplace_back(" }"); + } + fields.emplace_back("}"); + } + gpr_log(GPR_DEBUG, "[xds_client %p] constructed LRS request: %s", client, + absl::StrJoin(fields, "\n").c_str()); + } +} + grpc_slice SerializeLrsRequest( const envoy_service_load_stats_v2_LoadStatsRequest* request, upb_arena* arena) { @@ -1002,6 +1628,7 @@ grpc_slice XdsApi::CreateLrsInitialRequest(const std::string& server_name) { arena.ptr()); PopulateNode(arena.ptr(), node_, build_version_, user_agent_name_, server_name, node_msg); + MaybeLogLrsRequest(client_, tracer_, request); return SerializeLrsRequest(request, arena.ptr()); } @@ -1114,6 +1741,7 @@ grpc_slice XdsApi::CreateLrsRequest( google_protobuf_Duration_set_seconds(load_report_interval, timespec.tv_sec); google_protobuf_Duration_set_nanos(load_report_interval, timespec.tv_nsec); } + MaybeLogLrsRequest(client_, tracer_, request); return SerializeLrsRequest(request, arena.ptr()); } diff --git a/src/core/ext/filters/client_channel/xds/xds_api.h b/src/core/ext/filters/client_channel/xds/xds_api.h index e894071b9af..9e2e0358e3c 100644 --- a/src/core/ext/filters/client_channel/xds/xds_api.h +++ b/src/core/ext/filters/client_channel/xds/xds_api.h @@ -34,6 +34,8 @@ namespace grpc_core { +class XdsClient; + class XdsApi { public: static const char* kLdsTypeUrl; @@ -187,7 +189,7 @@ class XdsApi { std::pair, ClusterLoadReport>; - explicit XdsApi(const XdsBootstrap::Node* node); + XdsApi(XdsClient* client, TraceFlag* tracer, const XdsBootstrap::Node* node); // Creates a request to nack an unsupported resource type. // Takes ownership of \a error. @@ -249,6 +251,8 @@ class XdsApi { grpc_millis* load_reporting_interval); private: + XdsClient* client_; + TraceFlag* tracer_; const XdsBootstrap::Node* node_; const std::string build_version_; const std::string user_agent_name_; diff --git a/src/core/ext/filters/client_channel/xds/xds_bootstrap.cc b/src/core/ext/filters/client_channel/xds/xds_bootstrap.cc index fcc079819bc..6a641714912 100644 --- a/src/core/ext/filters/client_channel/xds/xds_bootstrap.cc +++ b/src/core/ext/filters/client_channel/xds/xds_bootstrap.cc @@ -29,20 +29,97 @@ namespace grpc_core { -std::unique_ptr XdsBootstrap::ReadFromFile(grpc_error** error) { +namespace { + +UniquePtr BootstrapString(const XdsBootstrap& bootstrap) { + gpr_strvec v; + gpr_strvec_init(&v); + char* tmp; + if (bootstrap.node() != nullptr) { + gpr_asprintf(&tmp, + "node={\n" + " id=\"%s\",\n" + " cluster=\"%s\",\n" + " locality={\n" + " region=\"%s\",\n" + " zone=\"%s\",\n" + " subzone=\"%s\"\n" + " },\n" + " metadata=%s,\n" + "},\n", + bootstrap.node()->id.c_str(), + bootstrap.node()->cluster.c_str(), + bootstrap.node()->locality_region.c_str(), + bootstrap.node()->locality_zone.c_str(), + bootstrap.node()->locality_subzone.c_str(), + bootstrap.node()->metadata.Dump().c_str()); + gpr_strvec_add(&v, tmp); + } + gpr_asprintf(&tmp, + "servers=[\n" + " {\n" + " uri=\"%s\",\n" + " creds=[\n", + bootstrap.server().server_uri.c_str()); + gpr_strvec_add(&v, tmp); + for (size_t i = 0; i < bootstrap.server().channel_creds.size(); ++i) { + const auto& creds = bootstrap.server().channel_creds[i]; + gpr_asprintf(&tmp, " {type=\"%s\", config=%s},\n", creds.type.c_str(), + creds.config.Dump().c_str()); + gpr_strvec_add(&v, tmp); + } + gpr_strvec_add(&v, gpr_strdup(" ]\n }\n]")); + UniquePtr result(gpr_strvec_flatten(&v, nullptr)); + gpr_strvec_destroy(&v); + return result; +} + +} // namespace + +std::unique_ptr XdsBootstrap::ReadFromFile(XdsClient* client, + TraceFlag* tracer, + grpc_error** error) { grpc_core::UniquePtr path(gpr_getenv("GRPC_XDS_BOOTSTRAP")); if (path == nullptr) { *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "GRPC_XDS_BOOTSTRAP env var not set"); + "Environment variable GRPC_XDS_BOOTSTRAP not defined"); return nullptr; } + if (GRPC_TRACE_FLAG_ENABLED(*tracer)) { + gpr_log(GPR_INFO, + "[xds_client %p] Got bootstrap file location from " + "GRPC_XDS_BOOTSTRAP environment variable: %s", + client, path.get()); + } grpc_slice contents; *error = grpc_load_file(path.get(), /*add_null_terminator=*/true, &contents); if (*error != GRPC_ERROR_NONE) return nullptr; - Json json = Json::Parse(StringViewFromSlice(contents), error); + StringView contents_str_view = StringViewFromSlice(contents); + if (GRPC_TRACE_FLAG_ENABLED(*tracer)) { + UniquePtr str = StringViewToCString(contents_str_view); + gpr_log(GPR_DEBUG, "[xds_client %p] Bootstrap file contents: %s", client, + str.get()); + } + Json json = Json::Parse(contents_str_view, error); grpc_slice_unref_internal(contents); - if (*error != GRPC_ERROR_NONE) return nullptr; - return absl::make_unique(std::move(json), error); + if (*error != GRPC_ERROR_NONE) { + char* msg; + gpr_asprintf(&msg, "Failed to parse bootstrap file %s", path.get()); + grpc_error* error_out = + GRPC_ERROR_CREATE_REFERENCING_FROM_COPIED_STRING(msg, error, 1); + gpr_free(msg); + GRPC_ERROR_UNREF(*error); + *error = error_out; + return nullptr; + } + std::unique_ptr result = + absl::make_unique(std::move(json), error); + if (*error == GRPC_ERROR_NONE && GRPC_TRACE_FLAG_ENABLED(*tracer)) { + gpr_log(GPR_INFO, + "[xds_client %p] Bootstrap config for creating xds client:\n%s", + client, BootstrapString(*result).get()); + } + return result; } XdsBootstrap::XdsBootstrap(Json json, grpc_error** error) { diff --git a/src/core/ext/filters/client_channel/xds/xds_bootstrap.h b/src/core/ext/filters/client_channel/xds/xds_bootstrap.h index 26599aa9404..d3b04ad922f 100644 --- a/src/core/ext/filters/client_channel/xds/xds_bootstrap.h +++ b/src/core/ext/filters/client_channel/xds/xds_bootstrap.h @@ -33,6 +33,8 @@ namespace grpc_core { +class XdsClient; + class XdsBootstrap { public: struct Node { @@ -56,7 +58,9 @@ class XdsBootstrap { // If *error is not GRPC_ERROR_NONE after returning, then there was an // error reading the file. - static std::unique_ptr ReadFromFile(grpc_error** error); + static std::unique_ptr ReadFromFile(XdsClient* client, + TraceFlag* tracer, + grpc_error** error); // Do not instantiate directly -- use ReadFromFile() above instead. XdsBootstrap(Json json, grpc_error** error); diff --git a/src/core/ext/filters/client_channel/xds/xds_client.cc b/src/core/ext/filters/client_channel/xds/xds_client.cc index 42708fca556..58a80849236 100644 --- a/src/core/ext/filters/client_channel/xds/xds_client.cc +++ b/src/core/ext/filters/client_channel/xds/xds_client.cc @@ -22,6 +22,8 @@ #include #include +#include "absl/strings/str_join.h" + #include #include #include @@ -788,33 +790,46 @@ void XdsClient::ChannelState::AdsCallState::SendMessageLocked( return; } auto& state = state_map_[type_url]; - grpc_error* error = state.error; - state.error = GRPC_ERROR_NONE; grpc_slice request_payload_slice; + std::set resource_names; if (type_url == XdsApi::kLdsTypeUrl) { + resource_names.insert(xds_client()->server_name_); request_payload_slice = xds_client()->api_.CreateLdsRequest( - xds_client()->server_name_, state.version, state.nonce, error, - !sent_initial_message_); + xds_client()->server_name_, state.version, state.nonce, + GRPC_ERROR_REF(state.error), !sent_initial_message_); state.subscribed_resources[xds_client()->server_name_]->Start(Ref()); } else if (type_url == XdsApi::kRdsTypeUrl) { + resource_names.insert(xds_client()->route_config_name_); request_payload_slice = xds_client()->api_.CreateRdsRequest( - xds_client()->route_config_name_, state.version, state.nonce, error, - !sent_initial_message_); + xds_client()->route_config_name_, state.version, state.nonce, + GRPC_ERROR_REF(state.error), !sent_initial_message_); state.subscribed_resources[xds_client()->route_config_name_]->Start(Ref()); } else if (type_url == XdsApi::kCdsTypeUrl) { + resource_names = ClusterNamesForRequest(); request_payload_slice = xds_client()->api_.CreateCdsRequest( - ClusterNamesForRequest(), state.version, state.nonce, error, + resource_names, state.version, state.nonce, GRPC_ERROR_REF(state.error), !sent_initial_message_); } else if (type_url == XdsApi::kEdsTypeUrl) { + resource_names = EdsServiceNamesForRequest(); request_payload_slice = xds_client()->api_.CreateEdsRequest( - EdsServiceNamesForRequest(), state.version, state.nonce, error, + resource_names, state.version, state.nonce, GRPC_ERROR_REF(state.error), !sent_initial_message_); } else { request_payload_slice = xds_client()->api_.CreateUnsupportedTypeNackRequest( - type_url, state.nonce, state.error); + type_url, state.nonce, GRPC_ERROR_REF(state.error)); state_map_.erase(type_url); } sent_initial_message_ = true; + if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) { + gpr_log(GPR_INFO, + "[xds_client %p] sending ADS request: type=%s version=%s nonce=%s " + "error=%s resources=%s", + xds_client(), type_url.c_str(), state.version.c_str(), + state.nonce.c_str(), grpc_error_string(state.error), + absl::StrJoin(resource_names, " ").c_str()); + } + GRPC_ERROR_UNREF(state.error); + state.error = GRPC_ERROR_NONE; // Create message payload. send_message_payload_ = grpc_raw_byte_buffer_create(&request_payload_slice, 1); @@ -1150,7 +1165,8 @@ void XdsClient::ChannelState::AdsCallState::OnResponseReceivedLocked( grpc_slice_unref_internal(response_slice); if (type_url.empty()) { // Ignore unparsable response. - gpr_log(GPR_ERROR, "[xds_client %p] No type_url found. error=%s", + gpr_log(GPR_ERROR, + "[xds_client %p] Error parsing ADS response (%s) -- ignoring", xds_client, grpc_error_string(parse_error)); GRPC_ERROR_UNREF(parse_error); } else { @@ -1162,10 +1178,11 @@ void XdsClient::ChannelState::AdsCallState::OnResponseReceivedLocked( GRPC_ERROR_UNREF(state.error); state.error = parse_error; // NACK unacceptable update. - gpr_log( - GPR_ERROR, - "[xds_client %p] ADS response can't be accepted, NACKing. error=%s", - xds_client, grpc_error_string(parse_error)); + gpr_log(GPR_ERROR, + "[xds_client %p] ADS response invalid for resource type %s " + "version %s, will NACK: nonce=%s error=%s", + xds_client, type_url.c_str(), version.c_str(), + state.nonce.c_str(), grpc_error_string(parse_error)); ads_calld->SendMessageLocked(type_url); } else { ads_calld->seen_response_ = true; @@ -1727,10 +1744,15 @@ XdsClient::XdsClient(Combiner* combiner, grpc_pollset_set* interested_parties, request_timeout_(GetRequestTimeout(channel_args)), combiner_(GRPC_COMBINER_REF(combiner, "xds_client")), interested_parties_(interested_parties), - bootstrap_(XdsBootstrap::ReadFromFile(error)), - api_(bootstrap_ == nullptr ? nullptr : bootstrap_->node()), + bootstrap_( + XdsBootstrap::ReadFromFile(this, &grpc_xds_client_trace, error)), + api_(this, &grpc_xds_client_trace, + bootstrap_ == nullptr ? nullptr : bootstrap_->node()), server_name_(server_name), service_config_watcher_(std::move(watcher)) { + if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) { + gpr_log(GPR_INFO, "[xds_client %p] creating xds client", this); + } if (*error != GRPC_ERROR_NONE) { gpr_log(GPR_ERROR, "[xds_client %p] failed to read bootstrap file: %s", this, grpc_error_string(*error)); @@ -1755,9 +1777,17 @@ XdsClient::XdsClient(Combiner* combiner, grpc_pollset_set* interested_parties, } } -XdsClient::~XdsClient() { GRPC_COMBINER_UNREF(combiner_, "xds_client"); } +XdsClient::~XdsClient() { + if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) { + gpr_log(GPR_INFO, "[xds_client %p] destroying xds client", this); + } + GRPC_COMBINER_UNREF(combiner_, "xds_client"); +} void XdsClient::Orphan() { + if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) { + gpr_log(GPR_INFO, "[xds_client %p] shutting down xds client", this); + } shutting_down_ = true; chand_.reset(); // We do not clear cluster_map_ and endpoint_map_ if the xds client was @@ -1782,6 +1812,10 @@ void XdsClient::WatchClusterData( // If we've already received an CDS update, notify the new watcher // immediately. if (cluster_state.update.has_value()) { + if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) { + gpr_log(GPR_INFO, "[xds_client %p] returning cached cluster data for %s", + this, StringViewToCString(cluster_name).get()); + } w->OnClusterChanged(cluster_state.update.value()); } chand_->Subscribe(XdsApi::kCdsTypeUrl, cluster_name_str); @@ -1812,6 +1846,10 @@ void XdsClient::WatchEndpointData( // If we've already received an EDS update, notify the new watcher // immediately. if (!endpoint_state.update.priority_list_update.empty()) { + if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) { + gpr_log(GPR_INFO, "[xds_client %p] returning cached endpoint data for %s", + this, StringViewToCString(eds_service_name).get()); + } w->OnEndpointChanged(endpoint_state.update); } chand_->Subscribe(XdsApi::kEdsTypeUrl, eds_service_name_str); From 50ea046966b94b10115b0c8630df39ff30b1042f Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Wed, 11 Mar 2020 15:18:29 -0700 Subject: [PATCH 124/758] Update bug_report.md --- .github/ISSUE_TEMPLATE/bug_report.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 66d87f4f508..4727e6533c1 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -7,7 +7,6 @@ assignees: karthikravis --- -@karthikravis +@donnadionne From 5d1651ff659c96f3472ec9cb7d35b50d4e02d06b Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Mon, 16 Mar 2020 11:10:07 -0700 Subject: [PATCH 163/758] Don't graceful shutdown cq to avoid the deadlock --- .../_cython/_cygrpc/aio/completion_queue.pxd.pxi | 2 +- .../_cython/_cygrpc/aio/completion_queue.pyx.pxi | 9 ++++----- .../grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi | 4 ++-- .../tests_aio/unit/compatibility_test.py | 12 ++++-------- 4 files changed, 11 insertions(+), 16 deletions(-) diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pxd.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pxd.pxi index d26e6cf5fa8..a02670d93f0 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pxd.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pxd.pxi @@ -19,11 +19,11 @@ cdef class BaseCompletionQueue: cdef class PollerCompletionQueue(BaseCompletionQueue): cdef bint _shutdown - cdef object _shutdown_completed cdef object _poller_thread cdef object _loop cdef void _poll(self) except * + cdef void shutdown(self) nogil cdef class CallbackCompletionQueue(BaseCompletionQueue): diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi index e0e3dd6abc7..794c83241fa 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi @@ -12,6 +12,8 @@ # See the License for the specific language governing permissions and # limitations under the License. +from libc.stdio cimport printf + cdef gpr_timespec _GPR_INF_FUTURE = gpr_inf_future(GPR_CLOCK_REALTIME) @@ -30,7 +32,6 @@ cdef class PollerCompletionQueue(BaseCompletionQueue): def __cinit__(self): self._cq = grpc_completion_queue_create_for_next(NULL) self._shutdown = False - self._shutdown_completed = threading.Event() self._poller_thread = threading.Thread(target=self._poll_wrapper, daemon=True) self._poller_thread.start() @@ -48,7 +49,6 @@ cdef class PollerCompletionQueue(BaseCompletionQueue): raise AssertionError("Core should not return GRPC_QUEUE_TIMEOUT!") elif event.type == GRPC_QUEUE_SHUTDOWN: self._shutdown = True - self._shutdown_completed.set() else: context = event.tag loop = context.loop @@ -60,11 +60,10 @@ cdef class PollerCompletionQueue(BaseCompletionQueue): def _poll_wrapper(self): self._poll() - def shutdown(self): + cdef void shutdown(self) nogil: + # TODO(https://github.com/grpc/grpc/issues/22365) perform graceful shutdown grpc_completion_queue_shutdown(self._cq) - self._shutdown_completed.wait() grpc_completion_queue_destroy(self._cq) - self._poller_thread.join() cdef class CallbackCompletionQueue(BaseCompletionQueue): diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi index bc2650696f4..8cb113c462c 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi @@ -103,12 +103,12 @@ def _grpc_shutdown_wrapper(_): cdef _actual_aio_shutdown(): if _global_aio_state.engine is AsyncIOEngine.CUSTOM_IO_MANAGER: future = schedule_coro_threadsafe( - _global_aio_state.cq.shutdown, + _global_aio_state.cq.shutdown(), (_global_aio_state.cq)._loop ) future.add_done_callback(_grpc_shutdown_wrapper) elif _global_aio_state.engine is AsyncIOEngine.POLLER: - _global_aio_state.cq.shutdown() + (_global_aio_state.cq).shutdown() grpc_shutdown_blocking() else: raise ValueError('Unsupported engine type [%s]' % _global_aio_state.engine) diff --git a/src/python/grpcio_tests/tests_aio/unit/compatibility_test.py b/src/python/grpcio_tests/tests_aio/unit/compatibility_test.py index 066ff6402c5..1b0e59b47a7 100644 --- a/src/python/grpcio_tests/tests_aio/unit/compatibility_test.py +++ b/src/python/grpcio_tests/tests_aio/unit/compatibility_test.py @@ -16,23 +16,19 @@ import asyncio import logging import os -import unittest +import random import threading +import unittest from concurrent.futures import ThreadPoolExecutor -import time -import random from typing import Callable, Sequence, Tuple import grpc from grpc.experimental import aio -from grpc._cython import cygrpc -from tests_aio.unit._test_base import AioTestBase -from tests.unit.framework.common import test_constants -from tests.unit.framework.common import get_socket from src.proto.grpc.testing import messages_pb2, test_pb2_grpc +from tests.unit.framework.common import test_constants +from tests_aio.unit._test_base import AioTestBase from tests_aio.unit._test_server import start_test_server -from tests_aio.unit import _common _NUM_STREAM_RESPONSES = 5 _REQUEST_PAYLOAD_SIZE = 7 From 562f3ca5f57f425ce0fcaa9e34542e19ab1bf30a Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Mon, 16 Mar 2020 11:21:07 -0700 Subject: [PATCH 164/758] Add port needs a FQN --- src/python/grpcio_tests/tests_aio/unit/compatibility_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/python/grpcio_tests/tests_aio/unit/compatibility_test.py b/src/python/grpcio_tests/tests_aio/unit/compatibility_test.py index 1b0e59b47a7..e3d85e70e69 100644 --- a/src/python/grpcio_tests/tests_aio/unit/compatibility_test.py +++ b/src/python/grpcio_tests/tests_aio/unit/compatibility_test.py @@ -168,7 +168,7 @@ class TestCompatibility(AioTestBase): # The server will spawn its own serving thread. server = grpc.server(ThreadPoolExecutor(), handlers=(GenericHandlers(),)) - port = server.add_insecure_port('0') + port = server.add_insecure_port('localhost:0') server.start() def sync_work() -> None: From 699817b709279d2f4fdd267f76b5724f4c695886 Mon Sep 17 00:00:00 2001 From: Eric Gribkoff Date: Mon, 16 Mar 2020 15:04:34 -0700 Subject: [PATCH 165/758] Increase timeout for GCP API operations --- tools/run_tests/run_xds_tests.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/tools/run_tests/run_xds_tests.py b/tools/run_tests/run_xds_tests.py index d9f4a5efbf3..1c85c4bf3d9 100755 --- a/tools/run_tests/run_xds_tests.py +++ b/tools/run_tests/run_xds_tests.py @@ -147,10 +147,10 @@ if args.verbose: _DEFAULT_SERVICE_PORT = 80 _WAIT_FOR_BACKEND_SEC = args.wait_for_backend_sec -_WAIT_FOR_OPERATION_SEC = 120 +_WAIT_FOR_OPERATION_SEC = 300 _INSTANCE_GROUP_SIZE = 2 _NUM_TEST_RPCS = 10 * args.qps -_WAIT_FOR_STATS_SEC = 120 +_WAIT_FOR_STATS_SEC = 180 _WAIT_FOR_URL_MAP_PATCH_SEC = 300 _BOOTSTRAP_TEMPLATE = """ {{ @@ -715,7 +715,10 @@ def patch_backend_instances(gcp, wait_for_global_operation(gcp, result['name']) -def resize_instance_group(gcp, instance_group, new_size, timeout_sec=120): +def resize_instance_group(gcp, + instance_group, + new_size, + timeout_sec=_WAIT_FOR_OPERATION_SEC): result = gcp.compute.instanceGroupManagers().resize( project=gcp.project, zone=instance_group.zone, From c82f28d428e62dfc177b1066f39fe10ca2ed5187 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Mon, 16 Mar 2020 15:42:31 -0700 Subject: [PATCH 166/758] Use socket to synchronize cq and asyncio --- .../_cygrpc/aio/completion_queue.pxd.pxi | 31 ++++++++- .../_cygrpc/aio/completion_queue.pyx.pxi | 68 +++++++++++++++---- .../grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi | 2 +- .../grpc/_cython/_cygrpc/aio/server.pyx.pxi | 2 +- 4 files changed, 84 insertions(+), 19 deletions(-) diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pxd.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pxd.pxi index a02670d93f0..54d845a94ca 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pxd.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pxd.pxi @@ -12,6 +12,29 @@ # See the License for the specific language governing permissions and # limitations under the License. +cdef extern from "" namespace "std" nogil: + cdef cppclass queue[T]: + queue() + bint empty() + T& front() + void pop() + void push(T&) + size_t size() + + +ctypedef queue[grpc_event] cpp_event_queue + + +IF UNAME_SYSNAME == "Windows": + cdef extern from "winsock2.h" nogil: + ctypedef uint32_t WIN_SOCKET "SOCKET" + WIN_SOCKET win_socket "socket" (int af, int type, int protocol) + int win_socket_send "send" (WIN_SOCKET s, const char *buf, int len, int flags) + + +cdef void _unified_socket_write(int fd) nogil + + cdef class BaseCompletionQueue: cdef grpc_completion_queue *_cq @@ -19,11 +42,15 @@ cdef class BaseCompletionQueue: cdef class PollerCompletionQueue(BaseCompletionQueue): cdef bint _shutdown + cdef cpp_event_queue _queue cdef object _poller_thread + cdef int _write_fd + cdef object _read_socket + cdef object _write_socket cdef object _loop - cdef void _poll(self) except * - cdef void shutdown(self) nogil + cdef void _poll(self) nogil + cdef shutdown(self) cdef class CallbackCompletionQueue(BaseCompletionQueue): diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi index 794c83241fa..4449b369702 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi @@ -12,11 +12,21 @@ # See the License for the specific language governing permissions and # limitations under the License. -from libc.stdio cimport printf +import socket cdef gpr_timespec _GPR_INF_FUTURE = gpr_inf_future(GPR_CLOCK_REALTIME) +IF UNAME_SYSNAME == "Windows": + cdef void _unified_socket_write(int fd) nogil: + win_socket_send(fd, b"1", 1, 0) +ELSE: + from posix cimport unistd + + cdef void _unified_socket_write(int fd) nogil: + unistd.write(fd, b"1", 1) + + def _handle_callback_wrapper(CallbackWrapper callback_wrapper, int success): CallbackWrapper.functor_run(callback_wrapper.c_functor(), success) @@ -30,41 +40,69 @@ cdef class BaseCompletionQueue: cdef class PollerCompletionQueue(BaseCompletionQueue): def __cinit__(self): + self._loop = asyncio.get_event_loop() self._cq = grpc_completion_queue_create_for_next(NULL) self._shutdown = False self._poller_thread = threading.Thread(target=self._poll_wrapper, daemon=True) self._poller_thread.start() - cdef void _poll(self) except *: + self._read_socket, self._write_socket = socket.socketpair() + self._write_fd = self._write_socket.fileno() + self._loop.add_reader(self._read_socket, self._handle_events) + + self._queue = cpp_event_queue() + + cdef void _poll(self) nogil: cdef grpc_event event cdef CallbackContext *context while not self._shutdown: - with nogil: - event = grpc_completion_queue_next(self._cq, - _GPR_INF_FUTURE, - NULL) + event = grpc_completion_queue_next(self._cq, + _GPR_INF_FUTURE, + NULL) if event.type == GRPC_QUEUE_TIMEOUT: - raise AssertionError("Core should not return GRPC_QUEUE_TIMEOUT!") + with gil: + raise AssertionError("Core should not return GRPC_QUEUE_TIMEOUT!") elif event.type == GRPC_QUEUE_SHUTDOWN: self._shutdown = True else: - context = event.tag - loop = context.loop - loop.call_soon_threadsafe( - _handle_callback_wrapper, - context.callback_wrapper, - event.success) + self._queue.push(event) + _unified_socket_write(self._write_fd) def _poll_wrapper(self): - self._poll() + with nogil: + self._poll() - cdef void shutdown(self) nogil: + cdef shutdown(self): # TODO(https://github.com/grpc/grpc/issues/22365) perform graceful shutdown grpc_completion_queue_shutdown(self._cq) grpc_completion_queue_destroy(self._cq) + def _handle_events(self): + cdef bytes data = self._read_socket.recv(1) + cdef grpc_event event + cdef CallbackContext *context + + while not self._queue.empty(): + event = self._queue.front() + self._queue.pop() + + context = event.tag + loop = context.loop + if loop is self._loop: + # Executes callbacks: complete the future + CallbackWrapper.functor_run( + event.tag, + event.success + ) + else: + loop.call_soon_threadsafe( + _handle_callback_wrapper, + context.callback_wrapper, + event.success + ) + cdef class CallbackCompletionQueue(BaseCompletionQueue): diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi index 8cb113c462c..1612f5e3f25 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi @@ -108,7 +108,7 @@ cdef _actual_aio_shutdown(): ) future.add_done_callback(_grpc_shutdown_wrapper) elif _global_aio_state.engine is AsyncIOEngine.POLLER: - (_global_aio_state.cq).shutdown() + _global_aio_state.cq.shutdown() grpc_shutdown_blocking() else: raise ValueError('Unsupported engine type [%s]' % _global_aio_state.engine) diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi index 37c5cffb952..59ba5021815 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi @@ -676,7 +676,7 @@ cdef class AioServer: async def _server_main_loop(self, object server_started): - self._server.start() + self._server.start(backup_queue=False) cdef RPCState rpc_state server_started.set_result(True) From d43ac68bf3f2807918cc0556bddb2251a1483e73 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Mon, 16 Mar 2020 15:48:08 -0700 Subject: [PATCH 167/758] Make the empty service default to SERVING state --- src/python/grpcio_health_checking/grpc_health/v1/_async.py | 2 +- src/python/grpcio_health_checking/grpc_health/v1/health.py | 2 +- .../grpcio_tests/tests/health_check/_health_servicer_test.py | 1 - .../grpcio_tests/tests_aio/health_check/health_servicer_test.py | 2 -- 4 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/python/grpcio_health_checking/grpc_health/v1/_async.py b/src/python/grpcio_health_checking/grpc_health/v1/_async.py index 859cadbd642..752531f5171 100644 --- a/src/python/grpcio_health_checking/grpc_health/v1/_async.py +++ b/src/python/grpcio_health_checking/grpc_health/v1/_async.py @@ -30,7 +30,7 @@ class HealthServicer(_health_pb2_grpc.HealthServicer): _gracefully_shutting_down: bool def __init__(self) -> None: - self._server_status = dict() + self._server_status = {"": _health_pb2.HealthCheckResponse.SERVING} self._server_watchers = collections.defaultdict(asyncio.Condition) self._gracefully_shutting_down = False diff --git a/src/python/grpcio_health_checking/grpc_health/v1/health.py b/src/python/grpcio_health_checking/grpc_health/v1/health.py index 05a16c73380..f7ee639ec8a 100644 --- a/src/python/grpcio_health_checking/grpc_health/v1/health.py +++ b/src/python/grpcio_health_checking/grpc_health/v1/health.py @@ -85,7 +85,7 @@ class HealthServicer(_health_pb2_grpc.HealthServicer): experimental_non_blocking=True, experimental_thread_pool=None): self._lock = threading.RLock() - self._server_status = {} + self._server_status = {"": _health_pb2.HealthCheckResponse.SERVING} self._send_response_callbacks = {} self.Watch.__func__.experimental_non_blocking = experimental_non_blocking self.Watch.__func__.experimental_thread_pool = experimental_thread_pool diff --git a/src/python/grpcio_tests/tests/health_check/_health_servicer_test.py b/src/python/grpcio_tests/tests/health_check/_health_servicer_test.py index b782d80e639..01345aaca08 100644 --- a/src/python/grpcio_tests/tests/health_check/_health_servicer_test.py +++ b/src/python/grpcio_tests/tests/health_check/_health_servicer_test.py @@ -50,7 +50,6 @@ class BaseWatchTests(object): self._servicer = health.HealthServicer( experimental_non_blocking=non_blocking, experimental_thread_pool=thread_pool) - self._servicer.set('', health_pb2.HealthCheckResponse.SERVING) self._servicer.set(_SERVING_SERVICE, health_pb2.HealthCheckResponse.SERVING) self._servicer.set(_UNKNOWN_SERVICE, diff --git a/src/python/grpcio_tests/tests_aio/health_check/health_servicer_test.py b/src/python/grpcio_tests/tests_aio/health_check/health_servicer_test.py index 71166a2beff..ac6c84b2f54 100644 --- a/src/python/grpcio_tests/tests_aio/health_check/health_servicer_test.py +++ b/src/python/grpcio_tests/tests_aio/health_check/health_servicer_test.py @@ -47,8 +47,6 @@ class HealthServicerTest(AioTestBase): async def setUp(self): self._servicer = health.aio.HealthServicer() - await self._servicer.set(health.OVERALL_HEALTH, - health_pb2.HealthCheckResponse.SERVING) await self._servicer.set(_SERVING_SERVICE, health_pb2.HealthCheckResponse.SERVING) await self._servicer.set(_UNKNOWN_SERVICE, From f44e4e2138925952f8e184185b1b770e80746117 Mon Sep 17 00:00:00 2001 From: Mariano Anaya Date: Tue, 14 Jan 2020 16:24:04 +0000 Subject: [PATCH 168/758] Renames according to PR comments --- src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi index dbe673d0bf6..5129e2efed4 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi @@ -125,7 +125,7 @@ cdef class _AioCall(GrpcCallWrapper): if credentials is not None: set_credentials_error = grpc_call_set_credentials(self.call, credentials.c()) if set_credentials_error != GRPC_CALL_OK: - raise Exception("Credentials couldn't have been set") + raise RuntimeError("Credentials couldn't have been set") grpc_slice_unref(method_slice) @@ -178,7 +178,7 @@ cdef class _AioCall(GrpcCallWrapper): def cancel(self, str details): """Cancels the RPC in Core with given RPC status. - + Above abstractions must invoke this method to set Core objects into proper state. """ @@ -286,7 +286,7 @@ cdef class _AioCall(GrpcCallWrapper): bytes request, tuple outbound_initial_metadata): """Performs a unary unary RPC. - + Args: request: the serialized requests in bytes. outbound_initial_metadata: optional outbound metadata. From 88e922c03f5efa8a62b4de433e4116856e41afc4 Mon Sep 17 00:00:00 2001 From: Mariano Anaya Date: Tue, 14 Jan 2020 16:57:07 +0000 Subject: [PATCH 169/758] Make the server test use SSL credentials --- .../grpcio/grpc/_cython/_cygrpc/aio/channel.pxd.pxi | 1 + .../grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi | 5 +++++ .../grpcio_tests/tests_aio/unit/_test_server.py | 13 +++++++++++-- src/python/grpcio_tests/tests_aio/unit/call_test.py | 1 + src/python/grpcio_tests/tests_aio/unit/init_test.py | 13 +++++++++++-- 5 files changed, 29 insertions(+), 4 deletions(-) diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pxd.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pxd.pxi index f49681a4588..03b4990e488 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pxd.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pxd.pxi @@ -24,3 +24,4 @@ cdef class AioChannel: object loop bytes _target AioChannelStatus _status + bint _is_secure diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi index a2882e64b7f..21100444863 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi @@ -36,11 +36,13 @@ cdef class AioChannel: self._status = AIO_CHANNEL_STATUS_READY if credentials is None: + self._is_secure = False self.channel = grpc_insecure_channel_create( target, channel_args.c_args(), NULL) else: + self._is_secure = True self.channel = grpc_secure_channel_create( credentials.c(), target, @@ -122,6 +124,9 @@ cdef class AioChannel: cdef CallCredentials cython_call_credentials if python_call_credentials is not None: + if not self._is_secure: + raise RuntimeError("Call credentials are only valid on secure channels") + cython_call_credentials = python_call_credentials._credentials else: cython_call_credentials = None diff --git a/src/python/grpcio_tests/tests_aio/unit/_test_server.py b/src/python/grpcio_tests/tests_aio/unit/_test_server.py index 7c8afa8ff5c..bcc6e3bc304 100644 --- a/src/python/grpcio_tests/tests_aio/unit/_test_server.py +++ b/src/python/grpcio_tests/tests_aio/unit/_test_server.py @@ -17,6 +17,7 @@ import datetime import grpc from grpc.experimental import aio +from tests.unit import resources from src.proto.grpc.testing import empty_pb2, messages_pb2, test_pb2_grpc from tests_aio.unit import _constants @@ -37,6 +38,11 @@ async def _maybe_echo_metadata(servicer_context): invocation_metadata[_TRAILING_METADATA_KEY]) servicer_context.set_trailing_metadata((trailing_metadatum,)) +_PRIVATE_KEY = resources.private_key() +_CERTIFICATE_CHAIN = resources.certificate_chain() +_TEST_ROOT_CERTIFICATES = resources.test_root_certificates() +_SERVER_CERTS = ((_PRIVATE_KEY, _CERTIFICATE_CHAIN),) + async def _maybe_echo_status(request: messages_pb2.SimpleRequest, servicer_context): @@ -129,8 +135,11 @@ async def start_test_server(port=0, if secure: if server_credentials is None: - server_credentials = grpc.local_server_credentials( - grpc.LocalConnectionType.LOCAL_TCP) + server_credentials = grpc.ssl_server_credentials( + _SERVER_CERTS, + root_certificates=_TEST_ROOT_CERTIFICATES, + require_client_auth=True + ) port = server.add_secure_port('[::]:%d' % port, server_credentials) else: port = server.add_insecure_port('[::]:%d' % port) diff --git a/src/python/grpcio_tests/tests_aio/unit/call_test.py b/src/python/grpcio_tests/tests_aio/unit/call_test.py index f845e078684..68cfe3831a8 100644 --- a/src/python/grpcio_tests/tests_aio/unit/call_test.py +++ b/src/python/grpcio_tests/tests_aio/unit/call_test.py @@ -24,6 +24,7 @@ from grpc.experimental import aio from src.proto.grpc.testing import messages_pb2, test_pb2_grpc from tests.unit.framework.common import test_constants from tests_aio.unit._test_base import AioTestBase + from tests_aio.unit._test_server import start_test_server _NUM_STREAM_RESPONSES = 5 diff --git a/src/python/grpcio_tests/tests_aio/unit/init_test.py b/src/python/grpcio_tests/tests_aio/unit/init_test.py index 8b9a03e2dd3..c415faaf6ac 100644 --- a/src/python/grpcio_tests/tests_aio/unit/init_test.py +++ b/src/python/grpcio_tests/tests_aio/unit/init_test.py @@ -20,6 +20,12 @@ from grpc.experimental import aio from tests_aio.unit._test_server import start_test_server from tests_aio.unit._test_base import AioTestBase +from tests.unit import resources + +_PRIVATE_KEY = resources.private_key() +_CERTIFICATE_CHAIN = resources.certificate_chain() +_TEST_ROOT_CERTIFICATES = resources.test_root_certificates() + class TestInsecureChannel(AioTestBase): @@ -37,8 +43,11 @@ class TestSecureChannel(AioTestBase): async def coro(): server_target, _ = await start_test_server(secure=True) # pylint: disable=unused-variable - credentials = grpc.local_channel_credentials( - grpc.LocalConnectionType.LOCAL_TCP) + credentials = grpc.ssl_channel_credentials( + root_certificates=_TEST_ROOT_CERTIFICATES, + private_key=_PRIVATE_KEY, + certificate_chain=_CERTIFICATE_CHAIN, + ) secure_channel = aio.secure_channel(server_target, credentials) self.assertIsInstance(secure_channel, aio.Channel) From 4ec09a0a2623927361fe73195c8a8f6c7d7bdb4f Mon Sep 17 00:00:00 2001 From: Mariano Anaya Date: Tue, 14 Jan 2020 17:02:40 +0000 Subject: [PATCH 170/758] [WIP] test call credentials --- .../grpcio_tests/tests_aio/unit/call_test.py | 57 ++++++++++--------- 1 file changed, 29 insertions(+), 28 deletions(-) diff --git a/src/python/grpcio_tests/tests_aio/unit/call_test.py b/src/python/grpcio_tests/tests_aio/unit/call_test.py index 68cfe3831a8..836757ca961 100644 --- a/src/python/grpcio_tests/tests_aio/unit/call_test.py +++ b/src/python/grpcio_tests/tests_aio/unit/call_test.py @@ -14,7 +14,6 @@ """Tests behavior of the Call classes.""" import asyncio -import datetime import logging import unittest @@ -24,6 +23,7 @@ from grpc.experimental import aio from src.proto.grpc.testing import messages_pb2, test_pb2_grpc from tests.unit.framework.common import test_constants from tests_aio.unit._test_base import AioTestBase +from tests.unit import resources from tests_aio.unit._test_server import start_test_server @@ -35,6 +35,10 @@ _RESPONSE_INTERVAL_US = test_constants.SHORT_TIMEOUT * 1000 * 1000 _UNREACHABLE_TARGET = '0.1:1111' _INFINITE_INTERVAL_US = 2**31 - 1 +_PRIVATE_KEY = resources.private_key() +_CERTIFICATE_CHAIN = resources.certificate_chain() +_TEST_ROOT_CERTIFICATES = resources.test_root_certificates() + class _MulticallableTestMixin(): @@ -203,6 +207,30 @@ class TestUnaryUnaryCall(_MulticallableTestMixin, AioTestBase): with self.assertRaises(asyncio.CancelledError): await task + def test_call_credentials(self): # FIXME + + async def coro(): + server_target, _ = await start_test_server(secure=True) # pylint: disable=unused-variable + channel_credentials = grpc.ssl_channel_credentials( + root_certificates=_TEST_ROOT_CERTIFICATES, + private_key=_PRIVATE_KEY, + certificate_chain=_CERTIFICATE_CHAIN, + ) + + async with aio.secure_channel(server_target, channel_credentials) as channel: + hi = channel.unary_unary('/grpc.testing.TestService/UnaryCall', + request_serializer=messages_pb2. + SimpleRequest.SerializeToString, + response_deserializer=messages_pb2. + SimpleResponse.FromString) + call = hi(messages_pb2.SimpleRequest()) # , credentials=call_credentials) + response = await call + + self.assertIsInstance(response, messages_pb2.SimpleResponse) + self.assertEqual(await call.code(), grpc.StatusCode.OK) + + self.loop.run_until_complete(coro()) + class TestUnaryStreamCall(_MulticallableTestMixin, AioTestBase): @@ -411,33 +439,6 @@ class TestUnaryStreamCall(_MulticallableTestMixin, AioTestBase): with self.assertRaises(asyncio.CancelledError): await task - def test_call_credentials(self): - - class DummyAuth(grpc.AuthMetadataPlugin): - - def __call__(self, context, callback): - signature = context.method_name[::-1] - callback((("test", signature),), None) - - async def coro(): - server_target, _ = await start_test_server(secure=False) # pylint: disable=unused-variable - - async with aio.insecure_channel(server_target) as channel: - hi = channel.unary_unary('/grpc.testing.TestService/UnaryCall', - request_serializer=messages_pb2. - SimpleRequest.SerializeToString, - response_deserializer=messages_pb2. - SimpleResponse.FromString) - call_credentials = grpc.metadata_call_credentials(DummyAuth()) - call = hi(messages_pb2.SimpleRequest(), - credentials=call_credentials) - response = await call - - self.assertIsInstance(response, messages_pb2.SimpleResponse) - self.assertEqual(await call.code(), grpc.StatusCode.OK) - - self.loop.run_until_complete(coro()) - async def test_time_remaining(self): request = messages_pb2.StreamingOutputCallRequest() # First message comes back immediately From 764be7ed9293a2017ce3b1fe4040389a54fa89b7 Mon Sep 17 00:00:00 2001 From: Mariano Anaya Date: Mon, 20 Jan 2020 09:14:24 +0100 Subject: [PATCH 171/758] Improve error message by including the error code --- .../grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi | 14 +++++++------- .../grpcio_tests/tests_aio/unit/_test_server.py | 9 ++++----- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi index 5129e2efed4..b64f952fca5 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi @@ -125,7 +125,7 @@ cdef class _AioCall(GrpcCallWrapper): if credentials is not None: set_credentials_error = grpc_call_set_credentials(self.call, credentials.c()) if set_credentials_error != GRPC_CALL_OK: - raise RuntimeError("Credentials couldn't have been set") + raise RuntimeError(f"Credentials couldn't have been set: {set_credentials_error}") grpc_slice_unref(method_slice) @@ -209,7 +209,7 @@ cdef class _AioCall(GrpcCallWrapper): def done(self): """Returns if the RPC call has finished. - + Checks if the status has been provided, either because the RPC finished or because was cancelled.. @@ -220,7 +220,7 @@ cdef class _AioCall(GrpcCallWrapper): def cancelled(self): """Returns if the RPC was cancelled. - + Returns: True if the RPC was cancelled. """ @@ -231,7 +231,7 @@ cdef class _AioCall(GrpcCallWrapper): async def status(self): """Returns the status of the RPC call. - + It returns the finshed status of the RPC. If the RPC has not finished yet this function will wait until the RPC gets finished. @@ -254,7 +254,7 @@ cdef class _AioCall(GrpcCallWrapper): async def initial_metadata(self): """Returns the initial metadata of the RPC call. - + If the initial metadata has not been received yet this function will wait until the RPC gets finished. @@ -420,7 +420,7 @@ cdef class _AioCall(GrpcCallWrapper): tuple outbound_initial_metadata, object metadata_sent_observer): """Actual implementation of the complete unary-stream call. - + Needs to pay extra attention to the raise mechanism. If we want to propagate the final status exception, then we have to raise it. Othersize, it would end normally and raise `StopAsyncIteration()`. @@ -490,7 +490,7 @@ cdef class _AioCall(GrpcCallWrapper): outbound_initial_metadata, self._send_initial_metadata_flags, self._loop) - # Notify upper level that sending messages are allowed now. + # Notify upper level that sending messages are allowed now. metadata_sent_observer() # Receives initial metadata. diff --git a/src/python/grpcio_tests/tests_aio/unit/_test_server.py b/src/python/grpcio_tests/tests_aio/unit/_test_server.py index bcc6e3bc304..e5ec53f1476 100644 --- a/src/python/grpcio_tests/tests_aio/unit/_test_server.py +++ b/src/python/grpcio_tests/tests_aio/unit/_test_server.py @@ -24,6 +24,10 @@ from tests_aio.unit import _constants _INITIAL_METADATA_KEY = "x-grpc-test-echo-initial" _TRAILING_METADATA_KEY = "x-grpc-test-echo-trailing-bin" +_PRIVATE_KEY = resources.private_key() +_CERTIFICATE_CHAIN = resources.certificate_chain() +_TEST_ROOT_CERTIFICATES = resources.test_root_certificates() +_SERVER_CERTS = ((_PRIVATE_KEY, _CERTIFICATE_CHAIN),) async def _maybe_echo_metadata(servicer_context): @@ -38,11 +42,6 @@ async def _maybe_echo_metadata(servicer_context): invocation_metadata[_TRAILING_METADATA_KEY]) servicer_context.set_trailing_metadata((trailing_metadatum,)) -_PRIVATE_KEY = resources.private_key() -_CERTIFICATE_CHAIN = resources.certificate_chain() -_TEST_ROOT_CERTIFICATES = resources.test_root_certificates() -_SERVER_CERTS = ((_PRIVATE_KEY, _CERTIFICATE_CHAIN),) - async def _maybe_echo_status(request: messages_pb2.SimpleRequest, servicer_context): From a1bb0bc6f8373226e602548ae437cb7199310909 Mon Sep 17 00:00:00 2001 From: Mariano Anaya Date: Wed, 5 Feb 2020 16:45:07 +0100 Subject: [PATCH 172/758] Set error description --- src/python/grpcio/grpc/experimental/aio/_call.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/python/grpcio/grpc/experimental/aio/_call.py b/src/python/grpcio/grpc/experimental/aio/_call.py index d06cc18d872..d7a963bb892 100644 --- a/src/python/grpcio/grpc/experimental/aio/_call.py +++ b/src/python/grpcio/grpc/experimental/aio/_call.py @@ -281,8 +281,13 @@ class _UnaryResponseMixin(Call): if self._cython_call.is_locally_cancelled(): raise asyncio.CancelledError() else: + call_status = self._cython_call._status + debug_error_string = None + if call_status is not None: + debug_error_string = call_status._debug_error_string raise _create_rpc_error(self._cython_call._initial_metadata, - self._cython_call._status) + call_status, + debug_error_string) else: return response From f2aad7e54c6cf56ce41401bf2e8a5920422966e8 Mon Sep 17 00:00:00 2001 From: Mariano Anaya Date: Wed, 5 Feb 2020 18:17:10 +0100 Subject: [PATCH 173/758] Extend tests for secure channels & credentials --- .../grpcio/grpc/experimental/aio/_call.py | 2 +- src/python/grpcio_tests/tests_aio/tests.json | 1 + .../tests_aio/unit/_test_server.py | 9 +-- .../grpcio_tests/tests_aio/unit/call_test.py | 65 ++++++++++++------- 4 files changed, 47 insertions(+), 30 deletions(-) diff --git a/src/python/grpcio/grpc/experimental/aio/_call.py b/src/python/grpcio/grpc/experimental/aio/_call.py index d7a963bb892..452856d472e 100644 --- a/src/python/grpcio/grpc/experimental/aio/_call.py +++ b/src/python/grpcio/grpc/experimental/aio/_call.py @@ -282,7 +282,7 @@ class _UnaryResponseMixin(Call): raise asyncio.CancelledError() else: call_status = self._cython_call._status - debug_error_string = None + debug_error_string = "" if call_status is not None: debug_error_string = call_status._debug_error_string raise _create_rpc_error(self._cython_call._initial_metadata, diff --git a/src/python/grpcio_tests/tests_aio/tests.json b/src/python/grpcio_tests/tests_aio/tests.json index d79ed422596..91725b53e83 100644 --- a/src/python/grpcio_tests/tests_aio/tests.json +++ b/src/python/grpcio_tests/tests_aio/tests.json @@ -9,6 +9,7 @@ "unit.call_test.TestStreamUnaryCall", "unit.call_test.TestUnaryStreamCall", "unit.call_test.TestUnaryUnaryCall", + "unit.call_test.TestUnaryUnarySecureCall", "unit.channel_argument_test.TestChannelArgument", "unit.channel_ready_test.TestChannelReady", "unit.channel_test.TestChannel", diff --git a/src/python/grpcio_tests/tests_aio/unit/_test_server.py b/src/python/grpcio_tests/tests_aio/unit/_test_server.py index e5ec53f1476..6face0ae41e 100644 --- a/src/python/grpcio_tests/tests_aio/unit/_test_server.py +++ b/src/python/grpcio_tests/tests_aio/unit/_test_server.py @@ -134,11 +134,8 @@ async def start_test_server(port=0, if secure: if server_credentials is None: - server_credentials = grpc.ssl_server_credentials( - _SERVER_CERTS, - root_certificates=_TEST_ROOT_CERTIFICATES, - require_client_auth=True - ) + server_credentials = grpc.local_server_credentials( + grpc.LocalConnectionType.LOCAL_TCP) port = server.add_secure_port('[::]:%d' % port, server_credentials) else: port = server.add_insecure_port('[::]:%d' % port) @@ -146,4 +143,4 @@ async def start_test_server(port=0, await server.start() # NOTE(lidizheng) returning the server to prevent it from deallocation - return 'localhost:%d' % port, server + return '0.0.0.0:%d' % port, server diff --git a/src/python/grpcio_tests/tests_aio/unit/call_test.py b/src/python/grpcio_tests/tests_aio/unit/call_test.py index 836757ca961..13181028b9c 100644 --- a/src/python/grpcio_tests/tests_aio/unit/call_test.py +++ b/src/python/grpcio_tests/tests_aio/unit/call_test.py @@ -52,6 +52,34 @@ class _MulticallableTestMixin(): await self._server.stop(None) + +class _SecureCallMixin: + """A Mixin to run the call tests over a secure channel.""" + + async def setUp(self): + server_credentials = grpc.ssl_server_credentials([ + (resources.private_key(), resources.certificate_chain()) + ]) + channel_credentials = grpc.ssl_channel_credentials( + resources.test_root_certificates()) + + self._server_address, self._server = await start_test_server( + secure=True, server_credentials=server_credentials) + _SERVER_HOST_OVERRIDE = 'foo.test.google.fr' + channel_options = ( + ( + 'grpc.ssl_target_name_override', + _SERVER_HOST_OVERRIDE, + ), + ) + self._channel = aio.secure_channel(self._server_address, channel_credentials, channel_options) + self._stub = test_pb2_grpc.TestServiceStub(self._channel) + + async def tearDown(self): + await self._channel.close() + await self._server.stop(None) + + class TestUnaryUnaryCall(_MulticallableTestMixin, AioTestBase): async def test_call_to_string(self): @@ -60,7 +88,7 @@ class TestUnaryUnaryCall(_MulticallableTestMixin, AioTestBase): self.assertTrue(str(call) is not None) self.assertTrue(repr(call) is not None) - response = await call + await call self.assertTrue(str(call) is not None) self.assertTrue(repr(call) is not None) @@ -207,29 +235,21 @@ class TestUnaryUnaryCall(_MulticallableTestMixin, AioTestBase): with self.assertRaises(asyncio.CancelledError): await task - def test_call_credentials(self): # FIXME - - async def coro(): - server_target, _ = await start_test_server(secure=True) # pylint: disable=unused-variable - channel_credentials = grpc.ssl_channel_credentials( - root_certificates=_TEST_ROOT_CERTIFICATES, - private_key=_PRIVATE_KEY, - certificate_chain=_CERTIFICATE_CHAIN, - ) - - async with aio.secure_channel(server_target, channel_credentials) as channel: - hi = channel.unary_unary('/grpc.testing.TestService/UnaryCall', - request_serializer=messages_pb2. - SimpleRequest.SerializeToString, - response_deserializer=messages_pb2. - SimpleResponse.FromString) - call = hi(messages_pb2.SimpleRequest()) # , credentials=call_credentials) - response = await call + async def test_passing_credentials_fails_over_insecure_channel(self): + call_credentials = grpc.composite_call_credentials( + grpc.access_token_call_credentials("abc"), + grpc.access_token_call_credentials("def"), + ) + with self.assertRaisesRegex(RuntimeError, "Call credentials are only valid on secure channels"): + self._stub.UnaryCall(messages_pb2.SimpleRequest(), credentials=call_credentials) - self.assertIsInstance(response, messages_pb2.SimpleResponse) - self.assertEqual(await call.code(), grpc.StatusCode.OK) - self.loop.run_until_complete(coro()) +class TestUnaryUnarySecureCall(_SecureCallMixin, AioTestBase): + """Calls made over a secure channel.""" + async def test_call_ok_with_credentials(self): + call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) + response = await call + self.assertIsInstance(response, messages_pb2.SimpleResponse) class TestUnaryStreamCall(_MulticallableTestMixin, AioTestBase): @@ -584,7 +604,6 @@ _STREAM_OUTPUT_REQUEST_ONE_RESPONSE.response_parameters.append( class TestStreamStreamCall(_MulticallableTestMixin, AioTestBase): - async def test_cancel(self): # Invokes the actual RPC call = self._stub.FullDuplexCall() From a3459d371dd1691835cc53839138c2e0d5785152 Mon Sep 17 00:00:00 2001 From: Mariano Anaya Date: Wed, 5 Feb 2020 18:25:35 +0100 Subject: [PATCH 174/758] Code cleanup --- src/python/grpcio_tests/tests_aio/unit/_test_server.py | 4 ---- src/python/grpcio_tests/tests_aio/unit/call_test.py | 7 ++----- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/src/python/grpcio_tests/tests_aio/unit/_test_server.py b/src/python/grpcio_tests/tests_aio/unit/_test_server.py index 6face0ae41e..7a8a3139e12 100644 --- a/src/python/grpcio_tests/tests_aio/unit/_test_server.py +++ b/src/python/grpcio_tests/tests_aio/unit/_test_server.py @@ -24,10 +24,6 @@ from tests_aio.unit import _constants _INITIAL_METADATA_KEY = "x-grpc-test-echo-initial" _TRAILING_METADATA_KEY = "x-grpc-test-echo-trailing-bin" -_PRIVATE_KEY = resources.private_key() -_CERTIFICATE_CHAIN = resources.certificate_chain() -_TEST_ROOT_CERTIFICATES = resources.test_root_certificates() -_SERVER_CERTS = ((_PRIVATE_KEY, _CERTIFICATE_CHAIN),) async def _maybe_echo_metadata(servicer_context): diff --git a/src/python/grpcio_tests/tests_aio/unit/call_test.py b/src/python/grpcio_tests/tests_aio/unit/call_test.py index 13181028b9c..a5972f838f1 100644 --- a/src/python/grpcio_tests/tests_aio/unit/call_test.py +++ b/src/python/grpcio_tests/tests_aio/unit/call_test.py @@ -34,10 +34,7 @@ _LOCAL_CANCEL_DETAILS_EXPECTATION = 'Locally cancelled by application!' _RESPONSE_INTERVAL_US = test_constants.SHORT_TIMEOUT * 1000 * 1000 _UNREACHABLE_TARGET = '0.1:1111' _INFINITE_INTERVAL_US = 2**31 - 1 - -_PRIVATE_KEY = resources.private_key() -_CERTIFICATE_CHAIN = resources.certificate_chain() -_TEST_ROOT_CERTIFICATES = resources.test_root_certificates() +_SERVER_HOST_OVERRIDE = 'foo.test.google.fr' class _MulticallableTestMixin(): @@ -65,7 +62,6 @@ class _SecureCallMixin: self._server_address, self._server = await start_test_server( secure=True, server_credentials=server_credentials) - _SERVER_HOST_OVERRIDE = 'foo.test.google.fr' channel_options = ( ( 'grpc.ssl_target_name_override', @@ -250,6 +246,7 @@ class TestUnaryUnarySecureCall(_SecureCallMixin, AioTestBase): call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) response = await call self.assertIsInstance(response, messages_pb2.SimpleResponse) + self.assertEqual(await call.code(), grpc.StatusCode.OK) class TestUnaryStreamCall(_MulticallableTestMixin, AioTestBase): From 33e15156bbcc14a51e78a43a705fd290e4e609e6 Mon Sep 17 00:00:00 2001 From: Mariano Anaya Date: Tue, 11 Feb 2020 13:58:42 +0100 Subject: [PATCH 175/758] [WIP] Feedback on the PR --- .../grpc/_cython/_cygrpc/aio/call.pyx.pxi | 2 +- .../grpcio/grpc/experimental/aio/_call.py | 7 +-- src/python/grpcio_tests/tests_aio/tests.json | 8 +-- .../tests_aio/unit/_test_server.py | 7 +-- .../grpcio_tests/tests_aio/unit/call_test.py | 45 +++------------- .../grpcio_tests/tests_aio/unit/init_test.py | 28 ++++------ .../tests_aio/unit/secure_call_test.py | 51 +++++++++++++++++++ 7 files changed, 77 insertions(+), 71 deletions(-) create mode 100644 src/python/grpcio_tests/tests_aio/unit/secure_call_test.py diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi index b64f952fca5..2e39c75b09f 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi @@ -125,7 +125,7 @@ cdef class _AioCall(GrpcCallWrapper): if credentials is not None: set_credentials_error = grpc_call_set_credentials(self.call, credentials.c()) if set_credentials_error != GRPC_CALL_OK: - raise RuntimeError(f"Credentials couldn't have been set: {set_credentials_error}") + raise RuntimeError("Credentials couldn't have been set: {0}".format(set_credentials_error)) grpc_slice_unref(method_slice) diff --git a/src/python/grpcio/grpc/experimental/aio/_call.py b/src/python/grpcio/grpc/experimental/aio/_call.py index 452856d472e..d06cc18d872 100644 --- a/src/python/grpcio/grpc/experimental/aio/_call.py +++ b/src/python/grpcio/grpc/experimental/aio/_call.py @@ -281,13 +281,8 @@ class _UnaryResponseMixin(Call): if self._cython_call.is_locally_cancelled(): raise asyncio.CancelledError() else: - call_status = self._cython_call._status - debug_error_string = "" - if call_status is not None: - debug_error_string = call_status._debug_error_string raise _create_rpc_error(self._cython_call._initial_metadata, - call_status, - debug_error_string) + self._cython_call._status) else: return response diff --git a/src/python/grpcio_tests/tests_aio/tests.json b/src/python/grpcio_tests/tests_aio/tests.json index 91725b53e83..ace685d169f 100644 --- a/src/python/grpcio_tests/tests_aio/tests.json +++ b/src/python/grpcio_tests/tests_aio/tests.json @@ -9,7 +9,6 @@ "unit.call_test.TestStreamUnaryCall", "unit.call_test.TestUnaryStreamCall", "unit.call_test.TestUnaryUnaryCall", - "unit.call_test.TestUnaryUnarySecureCall", "unit.channel_argument_test.TestChannelArgument", "unit.channel_ready_test.TestChannelReady", "unit.channel_test.TestChannel", @@ -20,10 +19,11 @@ "unit.compression_test.TestCompression", "unit.connectivity_test.TestConnectivityState", "unit.done_callback_test.TestDoneCallback", - "unit.init_test.TestInsecureChannel", - "unit.init_test.TestSecureChannel", + "unit.init_test.TestChannel", + "unit.interceptor_test.TestInterceptedUnaryUnaryCall", + "unit.interceptor_test.TestUnaryUnaryClientInterceptor", "unit.metadata_test.TestMetadata", - "unit.server_interceptor_test.TestServerInterceptor", + "unit.secure_call_test.TestUnaryUnarySecureCall", "unit.server_test.TestServer", "unit.timeout_test.TestTimeout", "unit.wait_for_ready_test.TestWaitForReady" diff --git a/src/python/grpcio_tests/tests_aio/unit/_test_server.py b/src/python/grpcio_tests/tests_aio/unit/_test_server.py index 7a8a3139e12..2396608e5cc 100644 --- a/src/python/grpcio_tests/tests_aio/unit/_test_server.py +++ b/src/python/grpcio_tests/tests_aio/unit/_test_server.py @@ -130,8 +130,9 @@ async def start_test_server(port=0, if secure: if server_credentials is None: - server_credentials = grpc.local_server_credentials( - grpc.LocalConnectionType.LOCAL_TCP) + server_credentials = grpc.ssl_server_credentials([ + (resources.private_key(), resources.certificate_chain()) + ]) port = server.add_secure_port('[::]:%d' % port, server_credentials) else: port = server.add_insecure_port('[::]:%d' % port) @@ -139,4 +140,4 @@ async def start_test_server(port=0, await server.start() # NOTE(lidizheng) returning the server to prevent it from deallocation - return '0.0.0.0:%d' % port, server + return 'localhost:%d' % port, server diff --git a/src/python/grpcio_tests/tests_aio/unit/call_test.py b/src/python/grpcio_tests/tests_aio/unit/call_test.py index a5972f838f1..aba6d319d15 100644 --- a/src/python/grpcio_tests/tests_aio/unit/call_test.py +++ b/src/python/grpcio_tests/tests_aio/unit/call_test.py @@ -34,7 +34,6 @@ _LOCAL_CANCEL_DETAILS_EXPECTATION = 'Locally cancelled by application!' _RESPONSE_INTERVAL_US = test_constants.SHORT_TIMEOUT * 1000 * 1000 _UNREACHABLE_TARGET = '0.1:1111' _INFINITE_INTERVAL_US = 2**31 - 1 -_SERVER_HOST_OVERRIDE = 'foo.test.google.fr' class _MulticallableTestMixin(): @@ -49,33 +48,6 @@ class _MulticallableTestMixin(): await self._server.stop(None) - -class _SecureCallMixin: - """A Mixin to run the call tests over a secure channel.""" - - async def setUp(self): - server_credentials = grpc.ssl_server_credentials([ - (resources.private_key(), resources.certificate_chain()) - ]) - channel_credentials = grpc.ssl_channel_credentials( - resources.test_root_certificates()) - - self._server_address, self._server = await start_test_server( - secure=True, server_credentials=server_credentials) - channel_options = ( - ( - 'grpc.ssl_target_name_override', - _SERVER_HOST_OVERRIDE, - ), - ) - self._channel = aio.secure_channel(self._server_address, channel_credentials, channel_options) - self._stub = test_pb2_grpc.TestServiceStub(self._channel) - - async def tearDown(self): - await self._channel.close() - await self._server.stop(None) - - class TestUnaryUnaryCall(_MulticallableTestMixin, AioTestBase): async def test_call_to_string(self): @@ -236,17 +208,11 @@ class TestUnaryUnaryCall(_MulticallableTestMixin, AioTestBase): grpc.access_token_call_credentials("abc"), grpc.access_token_call_credentials("def"), ) - with self.assertRaisesRegex(RuntimeError, "Call credentials are only valid on secure channels"): - self._stub.UnaryCall(messages_pb2.SimpleRequest(), credentials=call_credentials) - - -class TestUnaryUnarySecureCall(_SecureCallMixin, AioTestBase): - """Calls made over a secure channel.""" - async def test_call_ok_with_credentials(self): - call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) - response = await call - self.assertIsInstance(response, messages_pb2.SimpleResponse) - self.assertEqual(await call.code(), grpc.StatusCode.OK) + with self.assertRaisesRegex( + RuntimeError, + "Call credentials are only valid on secure channels"): + self._stub.UnaryCall(messages_pb2.SimpleRequest(), + credentials=call_credentials) class TestUnaryStreamCall(_MulticallableTestMixin, AioTestBase): @@ -601,6 +567,7 @@ _STREAM_OUTPUT_REQUEST_ONE_RESPONSE.response_parameters.append( class TestStreamStreamCall(_MulticallableTestMixin, AioTestBase): + async def test_cancel(self): # Invokes the actual RPC call = self._stub.FullDuplexCall() diff --git a/src/python/grpcio_tests/tests_aio/unit/init_test.py b/src/python/grpcio_tests/tests_aio/unit/init_test.py index c415faaf6ac..9104a0368c5 100644 --- a/src/python/grpcio_tests/tests_aio/unit/init_test.py +++ b/src/python/grpcio_tests/tests_aio/unit/init_test.py @@ -27,7 +27,7 @@ _CERTIFICATE_CHAIN = resources.certificate_chain() _TEST_ROOT_CERTIFICATES = resources.test_root_certificates() -class TestInsecureChannel(AioTestBase): +class TestChannel(AioTestBase): async def test_insecure_channel(self): server_target, _ = await start_test_server() # pylint: disable=unused-variable @@ -35,24 +35,16 @@ class TestInsecureChannel(AioTestBase): channel = aio.insecure_channel(server_target) self.assertIsInstance(channel, aio.Channel) + async def tests_secure_channel(self): + server_target, _ = await start_test_server(secure=True) # pylint: disable=unused-variable + credentials = grpc.ssl_channel_credentials( + root_certificates=_TEST_ROOT_CERTIFICATES, + private_key=_PRIVATE_KEY, + certificate_chain=_CERTIFICATE_CHAIN, + ) + secure_channel = aio.secure_channel(server_target, credentials) -class TestSecureChannel(AioTestBase): - """Test a secure channel connected to a secure server""" - - def test_secure_channel(self): - - async def coro(): - server_target, _ = await start_test_server(secure=True) # pylint: disable=unused-variable - credentials = grpc.ssl_channel_credentials( - root_certificates=_TEST_ROOT_CERTIFICATES, - private_key=_PRIVATE_KEY, - certificate_chain=_CERTIFICATE_CHAIN, - ) - secure_channel = aio.secure_channel(server_target, credentials) - - self.assertIsInstance(secure_channel, aio.Channel) - - self.loop.run_until_complete(coro()) + self.assertIsInstance(secure_channel, aio.Channel) if __name__ == '__main__': diff --git a/src/python/grpcio_tests/tests_aio/unit/secure_call_test.py b/src/python/grpcio_tests/tests_aio/unit/secure_call_test.py new file mode 100644 index 00000000000..cff870c3054 --- /dev/null +++ b/src/python/grpcio_tests/tests_aio/unit/secure_call_test.py @@ -0,0 +1,51 @@ +import unittest +import logging + +import grpc +from grpc.experimental import aio +from src.proto.grpc.testing import messages_pb2, test_pb2_grpc +from tests_aio.unit._test_base import AioTestBase +from tests_aio.unit._test_server import start_test_server +from tests.unit import resources + +_SERVER_HOST_OVERRIDE = 'foo.test.google.fr' + + +class _SecureCallMixin: + """A Mixin to run the call tests over a secure channel.""" + + async def setUp(self): + server_credentials = grpc.ssl_server_credentials([ + (resources.private_key(), resources.certificate_chain()) + ]) + channel_credentials = grpc.ssl_channel_credentials( + resources.test_root_certificates()) + + self._server_address, self._server = await start_test_server( + secure=True, server_credentials=server_credentials) + channel_options = (( + 'grpc.ssl_target_name_override', + _SERVER_HOST_OVERRIDE, + ),) + self._channel = aio.secure_channel(self._server_address, + channel_credentials, channel_options) + self._stub = test_pb2_grpc.TestServiceStub(self._channel) + + async def tearDown(self): + await self._channel.close() + await self._server.stop(None) + + +class TestUnaryUnarySecureCall(_SecureCallMixin, AioTestBase): + """Calls made over a secure channel.""" + + async def test_call_ok_with_credentials(self): + call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) + response = await call + self.assertIsInstance(response, messages_pb2.SimpleResponse) + self.assertEqual(await call.code(), grpc.StatusCode.OK) + + +if __name__ == '__main__': + logging.basicConfig() + unittest.main(verbosity=2) From 8165cc2d9702cac002d8b0cf4f7d242d22812629 Mon Sep 17 00:00:00 2001 From: Mariano Anaya Date: Fri, 14 Feb 2020 17:13:26 +0100 Subject: [PATCH 176/758] Extend with more tests --- src/python/grpcio_tests/tests_aio/tests.json | 1 + .../tests_aio/unit/secure_call_test.py | 37 ++++++++++++++++++- 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/src/python/grpcio_tests/tests_aio/tests.json b/src/python/grpcio_tests/tests_aio/tests.json index ace685d169f..2aae8533b96 100644 --- a/src/python/grpcio_tests/tests_aio/tests.json +++ b/src/python/grpcio_tests/tests_aio/tests.json @@ -23,6 +23,7 @@ "unit.interceptor_test.TestInterceptedUnaryUnaryCall", "unit.interceptor_test.TestUnaryUnaryClientInterceptor", "unit.metadata_test.TestMetadata", + "unit.secure_call_test.TestUnaryStreamSecureCall", "unit.secure_call_test.TestUnaryUnarySecureCall", "unit.server_test.TestServer", "unit.timeout_test.TestTimeout", diff --git a/src/python/grpcio_tests/tests_aio/unit/secure_call_test.py b/src/python/grpcio_tests/tests_aio/unit/secure_call_test.py index cff870c3054..038a684f509 100644 --- a/src/python/grpcio_tests/tests_aio/unit/secure_call_test.py +++ b/src/python/grpcio_tests/tests_aio/unit/secure_call_test.py @@ -9,6 +9,8 @@ from tests_aio.unit._test_server import start_test_server from tests.unit import resources _SERVER_HOST_OVERRIDE = 'foo.test.google.fr' +_NUM_STREAM_RESPONSES = 5 +_RESPONSE_PAYLOAD_SIZE = 42 class _SecureCallMixin: @@ -37,14 +39,45 @@ class _SecureCallMixin: class TestUnaryUnarySecureCall(_SecureCallMixin, AioTestBase): - """Calls made over a secure channel.""" + """unary_unary Calls made over a secure channel.""" - async def test_call_ok_with_credentials(self): + async def test_call_ok_over_secure_channel(self): call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) response = await call self.assertIsInstance(response, messages_pb2.SimpleResponse) self.assertEqual(await call.code(), grpc.StatusCode.OK) + async def test_call_with_credentials(self): + call_credentials = grpc.composite_call_credentials( + grpc.access_token_call_credentials("abc"), + grpc.access_token_call_credentials("def"), + ) + call = self._stub.UnaryCall(messages_pb2.SimpleRequest(), credentials=call_credentials) + response = await call + + self.assertIsInstance(response, messages_pb2.SimpleResponse) + + +class TestUnaryStreamSecureCall(_SecureCallMixin, AioTestBase): + """unary_stream calls over a secure channel""" + + async def test_unary_stream_async_generator_credentials(self): + request = messages_pb2.StreamingOutputCallRequest() + request.response_parameters.extend( + messages_pb2.ResponseParameters(size=_RESPONSE_PAYLOAD_SIZE,) + for _ in range(_NUM_STREAM_RESPONSES) + ) + call = self._stub.StreamingOutputCall(request) + + async for response in call: + self.assertIsInstance( + response, + messages_pb2.StreamingOutputCallResponse + ) + self.assertEqual(len(response.payload.body), _RESPONSE_PAYLOAD_SIZE) + + self.assertEqual(await call.code(), grpc.StatusCode.OK) + if __name__ == '__main__': logging.basicConfig() From 4d492d28a72d2b82fa28746e9f423efd41cd98ab Mon Sep 17 00:00:00 2001 From: Mariano Anaya Date: Mon, 17 Feb 2020 21:12:34 +0100 Subject: [PATCH 177/758] Add test for full-duplex call --- src/python/grpcio_tests/tests_aio/tests.json | 1 + .../tests_aio/unit/secure_call_test.py | 46 +++++++++++++++---- 2 files changed, 39 insertions(+), 8 deletions(-) diff --git a/src/python/grpcio_tests/tests_aio/tests.json b/src/python/grpcio_tests/tests_aio/tests.json index 2aae8533b96..c8481b912ad 100644 --- a/src/python/grpcio_tests/tests_aio/tests.json +++ b/src/python/grpcio_tests/tests_aio/tests.json @@ -23,6 +23,7 @@ "unit.interceptor_test.TestInterceptedUnaryUnaryCall", "unit.interceptor_test.TestUnaryUnaryClientInterceptor", "unit.metadata_test.TestMetadata", + "unit.secure_call_test.TestStreamStreamSecureCall", "unit.secure_call_test.TestUnaryStreamSecureCall", "unit.secure_call_test.TestUnaryUnarySecureCall", "unit.server_test.TestServer", diff --git a/src/python/grpcio_tests/tests_aio/unit/secure_call_test.py b/src/python/grpcio_tests/tests_aio/unit/secure_call_test.py index 038a684f509..a5d22d483f3 100644 --- a/src/python/grpcio_tests/tests_aio/unit/secure_call_test.py +++ b/src/python/grpcio_tests/tests_aio/unit/secure_call_test.py @@ -52,7 +52,8 @@ class TestUnaryUnarySecureCall(_SecureCallMixin, AioTestBase): grpc.access_token_call_credentials("abc"), grpc.access_token_call_credentials("def"), ) - call = self._stub.UnaryCall(messages_pb2.SimpleRequest(), credentials=call_credentials) + call = self._stub.UnaryCall(messages_pb2.SimpleRequest(), + credentials=call_credentials) response = await call self.assertIsInstance(response, messages_pb2.SimpleResponse) @@ -61,24 +62,53 @@ class TestUnaryUnarySecureCall(_SecureCallMixin, AioTestBase): class TestUnaryStreamSecureCall(_SecureCallMixin, AioTestBase): """unary_stream calls over a secure channel""" - async def test_unary_stream_async_generator_credentials(self): + async def test_unary_stream_async_generator_secure(self): request = messages_pb2.StreamingOutputCallRequest() request.response_parameters.extend( messages_pb2.ResponseParameters(size=_RESPONSE_PAYLOAD_SIZE,) - for _ in range(_NUM_STREAM_RESPONSES) + for _ in range(_NUM_STREAM_RESPONSES)) + call_credentials = grpc.composite_call_credentials( + grpc.access_token_call_credentials("abc"), + grpc.access_token_call_credentials("def"), ) - call = self._stub.StreamingOutputCall(request) + call = self._stub.StreamingOutputCall(request, + credentials=call_credentials) async for response in call: - self.assertIsInstance( - response, - messages_pb2.StreamingOutputCallResponse - ) + self.assertIsInstance(response, + messages_pb2.StreamingOutputCallResponse) self.assertEqual(len(response.payload.body), _RESPONSE_PAYLOAD_SIZE) self.assertEqual(await call.code(), grpc.StatusCode.OK) +# Prepares the request that stream in a ping-pong manner. +_STREAM_OUTPUT_REQUEST_ONE_RESPONSE = messages_pb2.StreamingOutputCallRequest() +_STREAM_OUTPUT_REQUEST_ONE_RESPONSE.response_parameters.append( + messages_pb2.ResponseParameters(size=_RESPONSE_PAYLOAD_SIZE)) + + +class TestStreamStreamSecureCall(_SecureCallMixin, AioTestBase): + + async def test_async_generator_secure_channel(self): + + async def request_generator(): + for _ in range(2): + yield _STREAM_OUTPUT_REQUEST_ONE_RESPONSE + + call_credentials = grpc.composite_call_credentials( + grpc.access_token_call_credentials("abc"), + grpc.access_token_call_credentials("def"), + ) + + call = self._stub.FullDuplexCall(request_generator(), + credentials=call_credentials) + async for response in call: + self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) + + self.assertEqual(await call.code(), grpc.StatusCode.OK) + + if __name__ == '__main__': logging.basicConfig() unittest.main(verbosity=2) From dff4a30b6cfac08df4be687e2637ddd87134748a Mon Sep 17 00:00:00 2001 From: Mariano Anaya Date: Wed, 26 Feb 2020 13:44:48 +0100 Subject: [PATCH 178/758] Fix build & address review comments Fixes https://github.com/grpc/grpc/issues/20532 --- .../grpc/_cython/_cygrpc/aio/call.pyx.pxi | 2 +- .../grpc/_cython/_cygrpc/aio/channel.pyx.pxi | 2 +- .../tests_aio/unit/secure_call_test.py | 18 +++++++++++++++++- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi index 2e39c75b09f..bfbcb8d4fc8 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/call.pyx.pxi @@ -125,7 +125,7 @@ cdef class _AioCall(GrpcCallWrapper): if credentials is not None: set_credentials_error = grpc_call_set_credentials(self.call, credentials.c()) if set_credentials_error != GRPC_CALL_OK: - raise RuntimeError("Credentials couldn't have been set: {0}".format(set_credentials_error)) + raise InternalError("Credentials couldn't have been set: {0}".format(set_credentials_error)) grpc_slice_unref(method_slice) diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi index 21100444863..beadce67b4a 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/channel.pyx.pxi @@ -125,7 +125,7 @@ cdef class AioChannel: cdef CallCredentials cython_call_credentials if python_call_credentials is not None: if not self._is_secure: - raise RuntimeError("Call credentials are only valid on secure channels") + raise UsageError("Call credentials are only valid on secure channels") cython_call_credentials = python_call_credentials._credentials else: diff --git a/src/python/grpcio_tests/tests_aio/unit/secure_call_test.py b/src/python/grpcio_tests/tests_aio/unit/secure_call_test.py index a5d22d483f3..e6b69331d24 100644 --- a/src/python/grpcio_tests/tests_aio/unit/secure_call_test.py +++ b/src/python/grpcio_tests/tests_aio/unit/secure_call_test.py @@ -1,3 +1,18 @@ +# Copyright 2020 The gRPC Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Tests the behaviour of the Call classes under a secure channel.""" + import unittest import logging @@ -89,11 +104,12 @@ _STREAM_OUTPUT_REQUEST_ONE_RESPONSE.response_parameters.append( class TestStreamStreamSecureCall(_SecureCallMixin, AioTestBase): + _STREAM_ITERATIONS = 2 async def test_async_generator_secure_channel(self): async def request_generator(): - for _ in range(2): + for _ in range(self._STREAM_ITERATIONS): yield _STREAM_OUTPUT_REQUEST_ONE_RESPONSE call_credentials = grpc.composite_call_credentials( From a8f7dfe4c5988f2e2e8fa6de02fca48ca85223e8 Mon Sep 17 00:00:00 2001 From: Mariano Anaya Date: Wed, 26 Feb 2020 18:12:25 +0100 Subject: [PATCH 179/758] Update exception used in test --- src/python/grpcio_tests/tests_aio/unit/call_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/python/grpcio_tests/tests_aio/unit/call_test.py b/src/python/grpcio_tests/tests_aio/unit/call_test.py index aba6d319d15..93b27853023 100644 --- a/src/python/grpcio_tests/tests_aio/unit/call_test.py +++ b/src/python/grpcio_tests/tests_aio/unit/call_test.py @@ -209,7 +209,7 @@ class TestUnaryUnaryCall(_MulticallableTestMixin, AioTestBase): grpc.access_token_call_credentials("def"), ) with self.assertRaisesRegex( - RuntimeError, + grpc._cygrpc.UsageError, "Call credentials are only valid on secure channels"): self._stub.UnaryCall(messages_pb2.SimpleRequest(), credentials=call_credentials) From bd4679439c27aec791f3c61f814db22c0b8d3efa Mon Sep 17 00:00:00 2001 From: Mariano Anaya Date: Mon, 2 Mar 2020 14:09:14 +0100 Subject: [PATCH 180/758] Add 'resources' to bazel build file --- src/python/grpcio_tests/tests_aio/interop/BUILD.bazel | 2 ++ src/python/grpcio_tests/tests_aio/tests.json | 1 + src/python/grpcio_tests/tests_aio/unit/BUILD.bazel | 2 ++ 3 files changed, 5 insertions(+) diff --git a/src/python/grpcio_tests/tests_aio/interop/BUILD.bazel b/src/python/grpcio_tests/tests_aio/interop/BUILD.bazel index b5bbdc6df4e..f67ad35cca7 100644 --- a/src/python/grpcio_tests/tests_aio/interop/BUILD.bazel +++ b/src/python/grpcio_tests/tests_aio/interop/BUILD.bazel @@ -56,6 +56,7 @@ py_binary( python_version = "PY3", deps = [ "//src/python/grpcio/grpc:grpcio", + "//src/python/grpcio_tests/tests/interop:resources", "//src/python/grpcio_tests/tests/interop:server", "//src/python/grpcio_tests/tests_aio/unit:_test_server", ], @@ -70,5 +71,6 @@ py_binary( ":methods", "//src/python/grpcio/grpc:grpcio", "//src/python/grpcio_tests/tests/interop:client", + "//src/python/grpcio_tests/tests/interop:resources", ], ) diff --git a/src/python/grpcio_tests/tests_aio/tests.json b/src/python/grpcio_tests/tests_aio/tests.json index c8481b912ad..2fb6893db04 100644 --- a/src/python/grpcio_tests/tests_aio/tests.json +++ b/src/python/grpcio_tests/tests_aio/tests.json @@ -26,6 +26,7 @@ "unit.secure_call_test.TestStreamStreamSecureCall", "unit.secure_call_test.TestUnaryStreamSecureCall", "unit.secure_call_test.TestUnaryUnarySecureCall", + "unit.server_interceptor_test.TestServerInterceptor", "unit.server_test.TestServer", "unit.timeout_test.TestTimeout", "unit.wait_for_ready_test.TestWaitForReady" diff --git a/src/python/grpcio_tests/tests_aio/unit/BUILD.bazel b/src/python/grpcio_tests/tests_aio/unit/BUILD.bazel index ab475bcf97c..1847e9cff6e 100644 --- a/src/python/grpcio_tests/tests_aio/unit/BUILD.bazel +++ b/src/python/grpcio_tests/tests_aio/unit/BUILD.bazel @@ -41,6 +41,7 @@ py_library( "//src/proto/grpc/testing:py_messages_proto", "//src/proto/grpc/testing:test_py_pb2_grpc", "//src/python/grpcio/grpc:grpcio", + "//src/python/grpcio_tests/tests/unit:resources", ], ) @@ -76,6 +77,7 @@ _FLAKY_TESTS = [ "//src/proto/grpc/testing:benchmark_service_py_pb2_grpc", "//src/proto/grpc/testing:py_messages_proto", "//src/python/grpcio/grpc:grpcio", + "//src/python/grpcio_tests/tests/unit:resources", "//src/python/grpcio_tests/tests/unit/framework/common", "@six", ], From 963429864ed8ac2e98c908d38b2dd98ca6c1ff3c Mon Sep 17 00:00:00 2001 From: Mariano Anaya Date: Wed, 11 Mar 2020 15:28:33 +0100 Subject: [PATCH 181/758] Skip failing tests due to a regression Reported at https://github.com/grpc/grpc/issues/22302 --- src/python/grpcio_tests/tests_aio/unit/call_test.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/python/grpcio_tests/tests_aio/unit/call_test.py b/src/python/grpcio_tests/tests_aio/unit/call_test.py index 93b27853023..fc9529d9607 100644 --- a/src/python/grpcio_tests/tests_aio/unit/call_test.py +++ b/src/python/grpcio_tests/tests_aio/unit/call_test.py @@ -184,6 +184,8 @@ class TestUnaryUnaryCall(_MulticallableTestMixin, AioTestBase): self.assertEqual(await call.details(), 'Locally cancelled by application!') + @unittest.skip( + "segmentation fault: https://github.com/grpc/grpc/issues/22302") async def test_cancel_unary_unary_in_task(self): coro_started = asyncio.Event() call = self._stub.EmptyCall(messages_pb2.SimpleRequest()) @@ -363,6 +365,8 @@ class TestUnaryStreamCall(_MulticallableTestMixin, AioTestBase): self.assertEqual(await call.code(), grpc.StatusCode.OK) + @unittest.skip( + "segmentation fault: https://github.com/grpc/grpc/issues/22302") async def test_cancel_unary_stream_in_task_using_read(self): coro_started = asyncio.Event() @@ -392,6 +396,8 @@ class TestUnaryStreamCall(_MulticallableTestMixin, AioTestBase): with self.assertRaises(asyncio.CancelledError): await task + @unittest.skip( + "segmentation fault: https://github.com/grpc/grpc/issues/22302") async def test_cancel_unary_stream_in_task_using_async_for(self): coro_started = asyncio.Event() From da698286e4474188447e3c40041ca3dd2b576450 Mon Sep 17 00:00:00 2001 From: Mariano Anaya Date: Thu, 12 Mar 2020 10:10:20 +0100 Subject: [PATCH 182/758] Fix tests.json Remove tests from the old branch (conflict resolution leftover issue). --- src/python/grpcio_tests/tests_aio/tests.json | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/python/grpcio_tests/tests_aio/tests.json b/src/python/grpcio_tests/tests_aio/tests.json index 2fb6893db04..b2b53a3ad65 100644 --- a/src/python/grpcio_tests/tests_aio/tests.json +++ b/src/python/grpcio_tests/tests_aio/tests.json @@ -20,8 +20,6 @@ "unit.connectivity_test.TestConnectivityState", "unit.done_callback_test.TestDoneCallback", "unit.init_test.TestChannel", - "unit.interceptor_test.TestInterceptedUnaryUnaryCall", - "unit.interceptor_test.TestUnaryUnaryClientInterceptor", "unit.metadata_test.TestMetadata", "unit.secure_call_test.TestStreamStreamSecureCall", "unit.secure_call_test.TestUnaryStreamSecureCall", From 3779b12203261ad90b6bcfb17f77a3186446e8c7 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Fri, 13 Mar 2020 12:10:29 -0700 Subject: [PATCH 183/758] Enable skipped tests --- src/python/grpcio_tests/tests_aio/unit/call_test.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/python/grpcio_tests/tests_aio/unit/call_test.py b/src/python/grpcio_tests/tests_aio/unit/call_test.py index fc9529d9607..93b27853023 100644 --- a/src/python/grpcio_tests/tests_aio/unit/call_test.py +++ b/src/python/grpcio_tests/tests_aio/unit/call_test.py @@ -184,8 +184,6 @@ class TestUnaryUnaryCall(_MulticallableTestMixin, AioTestBase): self.assertEqual(await call.details(), 'Locally cancelled by application!') - @unittest.skip( - "segmentation fault: https://github.com/grpc/grpc/issues/22302") async def test_cancel_unary_unary_in_task(self): coro_started = asyncio.Event() call = self._stub.EmptyCall(messages_pb2.SimpleRequest()) @@ -365,8 +363,6 @@ class TestUnaryStreamCall(_MulticallableTestMixin, AioTestBase): self.assertEqual(await call.code(), grpc.StatusCode.OK) - @unittest.skip( - "segmentation fault: https://github.com/grpc/grpc/issues/22302") async def test_cancel_unary_stream_in_task_using_read(self): coro_started = asyncio.Event() @@ -396,8 +392,6 @@ class TestUnaryStreamCall(_MulticallableTestMixin, AioTestBase): with self.assertRaises(asyncio.CancelledError): await task - @unittest.skip( - "segmentation fault: https://github.com/grpc/grpc/issues/22302") async def test_cancel_unary_stream_in_task_using_async_for(self): coro_started = asyncio.Event() From 59b040d3c4a4889204a7f65a598a77824e1df349 Mon Sep 17 00:00:00 2001 From: Richard Belleville Date: Mon, 16 Mar 2020 16:14:03 -0700 Subject: [PATCH 184/758] Stop leaking threads --- src/python/grpcio/grpc/_auth.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/python/grpcio/grpc/_auth.py b/src/python/grpcio/grpc/_auth.py index 724229a8f56..7cbbf58a606 100644 --- a/src/python/grpcio/grpc/_auth.py +++ b/src/python/grpcio/grpc/_auth.py @@ -40,9 +40,10 @@ def _create_get_token_callback(callback): class GoogleCallCredentials(grpc.AuthMetadataPlugin): """Metadata wrapper for GoogleCredentials from the oauth2client library.""" + _THREAD_POOL = futures.ThreadPoolExecutor() + def __init__(self, credentials): self._credentials = credentials - self._pool = futures.ThreadPoolExecutor(max_workers=1) # Hack to determine if these are JWT creds and we need to pass # additional_claims when getting a token @@ -52,16 +53,14 @@ class GoogleCallCredentials(grpc.AuthMetadataPlugin): def __call__(self, context, callback): # MetadataPlugins cannot block (see grpc.beta.interfaces.py) if self._is_jwt: - future = self._pool.submit( + future = self._THREAD_POOL.submit( self._credentials.get_access_token, additional_claims={'aud': context.service_url}) else: - future = self._pool.submit(self._credentials.get_access_token) + future = self._THREAD_POOL.submit( + self._credentials.get_access_token) future.add_done_callback(_create_get_token_callback(callback)) - def __del__(self): - self._pool.shutdown(wait=False) - class AccessTokenAuthMetadataPlugin(grpc.AuthMetadataPlugin): """Metadata wrapper for raw access token credentials.""" From 84ae7981d2c71fb5f888f1dcc5437856edbdc147 Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Mon, 16 Mar 2020 18:08:42 +0100 Subject: [PATCH 185/758] blacklist a port that cannot be bound on WinRBE --- .../core/util/port_isolated_runtime_environment.cc | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/test/core/util/port_isolated_runtime_environment.cc b/test/core/util/port_isolated_runtime_environment.cc index 1f678c08e57..2402d8bfb54 100644 --- a/test/core/util/port_isolated_runtime_environment.cc +++ b/test/core/util/port_isolated_runtime_environment.cc @@ -43,7 +43,7 @@ static int get_random_port_offset() { static int s_initial_offset = get_random_port_offset(); static gpr_atm s_pick_counter = 0; -int grpc_pick_unused_port_or_die(void) { +static int pick_unused_port_or_die(void) { int orig_counter_val = static_cast(gpr_atm_full_fetch_add(&s_pick_counter, 1)); GPR_ASSERT(orig_counter_val < (MAX_PORT - MIN_PORT + 1)); @@ -51,6 +51,18 @@ int grpc_pick_unused_port_or_die(void) { (s_initial_offset + orig_counter_val) % (MAX_PORT - MIN_PORT + 1); } +int grpc_pick_unused_port_or_die(void) { +retry: + int port = pick_unused_port_or_die(); + // 5985 cannot be bound on Windows RBE and results in + // WSA_ERROR 10013: "An attempt was made to access a socket in a way forbidden + // by its access permissions." + if (port == 5985) { + goto retry; + } + return port; +} + void grpc_recycle_unused_port(int port) { (void)port; } #endif /* GRPC_PORT_ISOLATED_RUNTIME */ From a791e16983e4ea211232ec2fbac4030cb8b666a7 Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Tue, 17 Mar 2020 05:32:17 -0400 Subject: [PATCH 186/758] mark more tests as flaky --- test/core/surface/BUILD | 1 + test/cpp/microbenchmarks/BUILD | 1 + 2 files changed, 2 insertions(+) diff --git a/test/core/surface/BUILD b/test/core/surface/BUILD index 3d2c51e887b..ad36d1c40a6 100644 --- a/test/core/surface/BUILD +++ b/test/core/surface/BUILD @@ -135,6 +135,7 @@ grpc_cc_test( grpc_cc_test( name = "sequential_connectivity_test", srcs = ["sequential_connectivity_test.cc"], + flaky = True, # TODO(b/151696318) language = "C++", deps = [ "//:gpr", diff --git a/test/cpp/microbenchmarks/BUILD b/test/cpp/microbenchmarks/BUILD index 33cca7728af..7e8d371fc3c 100644 --- a/test/cpp/microbenchmarks/BUILD +++ b/test/cpp/microbenchmarks/BUILD @@ -283,6 +283,7 @@ grpc_cc_test( grpc_cc_test( name = "bm_opencensus_plugin", srcs = ["bm_opencensus_plugin.cc"], + flaky = True, # TODO(b/151696309) language = "C++", deps = [ ":helpers_secure", From e863750403e7373e1b793f6367462edf99825e9d Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Tue, 17 Mar 2020 05:34:19 -0400 Subject: [PATCH 187/758] regenerate projects --- Makefile | 2 -- build_autogenerated.yaml | 1 + tools/run_tests/generated/tests.json | 24 ------------------------ 3 files changed, 1 insertion(+), 26 deletions(-) diff --git a/Makefile b/Makefile index 30583575a59..9259c205512 100644 --- a/Makefile +++ b/Makefile @@ -2054,8 +2054,6 @@ test_c: buildtests_c $(Q) $(BINDIR)/$(CONFIG)/secure_endpoint_test || ( echo test secure_endpoint_test failed ; exit 1 ) $(E) "[RUN] Testing security_connector_test" $(Q) $(BINDIR)/$(CONFIG)/security_connector_test || ( echo test security_connector_test failed ; exit 1 ) - $(E) "[RUN] Testing sequential_connectivity_test" - $(Q) $(BINDIR)/$(CONFIG)/sequential_connectivity_test || ( echo test sequential_connectivity_test failed ; exit 1 ) $(E) "[RUN] Testing server_chttp2_test" $(Q) $(BINDIR)/$(CONFIG)/server_chttp2_test || ( echo test server_chttp2_test failed ; exit 1 ) $(E) "[RUN] Testing server_ssl_test" diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml index 008de951943..a17b94019d0 100644 --- a/build_autogenerated.yaml +++ b/build_autogenerated.yaml @@ -4085,6 +4085,7 @@ targets: - upb - name: sequential_connectivity_test build: test + run: false language: c headers: - test/core/end2end/data/ssl_test_data.h diff --git a/tools/run_tests/generated/tests.json b/tools/run_tests/generated/tests.json index 4a64de9fdf3..1d0fef591b5 100644 --- a/tools/run_tests/generated/tests.json +++ b/tools/run_tests/generated/tests.json @@ -2423,30 +2423,6 @@ ], "uses_polling": true }, - { - "args": [], - "benchmark": false, - "ci_platforms": [ - "linux", - "mac", - "posix", - "windows" - ], - "cpu_cost": 1.0, - "exclude_configs": [], - "exclude_iomgrs": [], - "flaky": false, - "gtest": false, - "language": "c", - "name": "sequential_connectivity_test", - "platforms": [ - "linux", - "mac", - "posix", - "windows" - ], - "uses_polling": true - }, { "args": [], "benchmark": false, From d99b541656a9df3bf65c890dea3eac7d0ac4a7f9 Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Tue, 17 Mar 2020 10:53:37 +0100 Subject: [PATCH 188/758] fix a nit in the cmake instructions --- src/cpp/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cpp/README.md b/src/cpp/README.md index d8f81ced47f..96feb96582d 100755 --- a/src/cpp/README.md +++ b/src/cpp/README.md @@ -77,7 +77,7 @@ include(FetchContent) FetchContent_Declare( gRPC GIT_REPOSITORY https://github.com/grpc/grpc - GIT_TAG v1.25.0 + GIT_TAG RELEASE_TAG_HERE # e.g v1.28.0 ) set(FETCHCONTENT_QUIET OFF) FetchContent_MakeAvailable(gRPC) From 2e266a82d979144da4bda840b7dfce21cf2ae216 Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Tue, 17 Mar 2020 06:24:25 -0400 Subject: [PATCH 189/758] mark end2end test as flaky --- test/cpp/end2end/BUILD | 1 + 1 file changed, 1 insertion(+) diff --git a/test/cpp/end2end/BUILD b/test/cpp/end2end/BUILD index 885cae51ab4..5bbee23deee 100644 --- a/test/cpp/end2end/BUILD +++ b/test/cpp/end2end/BUILD @@ -275,6 +275,7 @@ grpc_cc_test( grpc_cc_test( name = "end2end_test", size = "large", + flaky = True, # TODO(b/151704375) tags = ["no_test_ios"], deps = [ ":end2end_test_lib", From b24ddc02fd1d3b185edcb8e7cbe5d8765be54472 Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Tue, 17 Mar 2020 06:26:09 -0400 Subject: [PATCH 190/758] regenerate projects --- Makefile | 2 -- build_autogenerated.yaml | 1 + tools/run_tests/generated/tests.json | 24 ------------------------ 3 files changed, 1 insertion(+), 26 deletions(-) diff --git a/Makefile b/Makefile index 9259c205512..0bcd128cc95 100644 --- a/Makefile +++ b/Makefile @@ -2234,8 +2234,6 @@ test_cxx: buildtests_cxx $(Q) $(BINDIR)/$(CONFIG)/destroy_grpclb_channel_with_active_connect_stress_test || ( echo test destroy_grpclb_channel_with_active_connect_stress_test failed ; exit 1 ) $(E) "[RUN] Testing duplicate_header_bad_client_test" $(Q) $(BINDIR)/$(CONFIG)/duplicate_header_bad_client_test || ( echo test duplicate_header_bad_client_test failed ; exit 1 ) - $(E) "[RUN] Testing end2end_test" - $(Q) $(BINDIR)/$(CONFIG)/end2end_test || ( echo test end2end_test failed ; exit 1 ) $(E) "[RUN] Testing error_details_test" $(Q) $(BINDIR)/$(CONFIG)/error_details_test || ( echo test error_details_test failed ; exit 1 ) $(E) "[RUN] Testing eventmanager_libuv_test" diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml index a17b94019d0..d28144e7f4c 100644 --- a/build_autogenerated.yaml +++ b/build_autogenerated.yaml @@ -5732,6 +5732,7 @@ targets: - name: end2end_test gtest: true build: test + run: false language: c++ headers: - test/cpp/end2end/interceptors_util.h diff --git a/tools/run_tests/generated/tests.json b/tools/run_tests/generated/tests.json index 1d0fef591b5..469dfb43a19 100644 --- a/tools/run_tests/generated/tests.json +++ b/tools/run_tests/generated/tests.json @@ -4409,30 +4409,6 @@ ], "uses_polling": true }, - { - "args": [], - "benchmark": false, - "ci_platforms": [ - "linux", - "mac", - "posix", - "windows" - ], - "cpu_cost": 1.0, - "exclude_configs": [], - "exclude_iomgrs": [], - "flaky": false, - "gtest": true, - "language": "c++", - "name": "end2end_test", - "platforms": [ - "linux", - "mac", - "posix", - "windows" - ], - "uses_polling": true - }, { "args": [], "benchmark": false, From bb8f6126ea2d9cd76b17e5a781dc396eb9f677fd Mon Sep 17 00:00:00 2001 From: Kyle Edwards Date: Tue, 17 Mar 2020 09:09:03 -0400 Subject: [PATCH 191/758] Append to CMAKE_MODULE_PATH instead of replacing it --- templates/CMakeLists.txt.template | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/CMakeLists.txt.template b/templates/CMakeLists.txt.template index 1a5c81f5357..e6fc6c034ab 100644 --- a/templates/CMakeLists.txt.template +++ b/templates/CMakeLists.txt.template @@ -252,7 +252,7 @@ ## Some libraries are shared even with BUILD_SHARED_LIBRARIES=OFF set(CMAKE_POSITION_INDEPENDENT_CODE TRUE) - set(CMAKE_MODULE_PATH "<%text>${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules") + list(APPEND CMAKE_MODULE_PATH "<%text>${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules") if(MSVC) include(cmake/msvc_static_runtime.cmake) From e208197cec2f58f1b17f7bb5e68ade7dd6ced10f Mon Sep 17 00:00:00 2001 From: Kyle Edwards Date: Tue, 17 Mar 2020 09:09:44 -0400 Subject: [PATCH 192/758] Regenerate CMakeLists.txt --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c6d0ec97989..c0b5279d257 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -161,7 +161,7 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) set(CMAKE_POSITION_INDEPENDENT_CODE TRUE) -set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules") +list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules") if(MSVC) include(cmake/msvc_static_runtime.cmake) From 01d635b92aabe1436f1f75d91cc123450d329a3c Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Tue, 17 Mar 2020 12:23:14 -0400 Subject: [PATCH 193/758] improve code readability --- .../util/port_isolated_runtime_environment.cc | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/test/core/util/port_isolated_runtime_environment.cc b/test/core/util/port_isolated_runtime_environment.cc index 2402d8bfb54..5e043e7f970 100644 --- a/test/core/util/port_isolated_runtime_environment.cc +++ b/test/core/util/port_isolated_runtime_environment.cc @@ -43,7 +43,7 @@ static int get_random_port_offset() { static int s_initial_offset = get_random_port_offset(); static gpr_atm s_pick_counter = 0; -static int pick_unused_port_or_die(void) { +static int grpc_pick_unused_port_or_die_impl(void) { int orig_counter_val = static_cast(gpr_atm_full_fetch_add(&s_pick_counter, 1)); GPR_ASSERT(orig_counter_val < (MAX_PORT - MIN_PORT + 1)); @@ -52,15 +52,16 @@ static int pick_unused_port_or_die(void) { } int grpc_pick_unused_port_or_die(void) { -retry: - int port = pick_unused_port_or_die(); - // 5985 cannot be bound on Windows RBE and results in - // WSA_ERROR 10013: "An attempt was made to access a socket in a way forbidden - // by its access permissions." - if (port == 5985) { - goto retry; + while (true) { + int port = grpc_pick_unused_port_or_die_impl(); + // 5985 cannot be bound on Windows RBE and results in + // WSA_ERROR 10013: "An attempt was made to access a socket in a way + // forbidden by its access permissions." + if (port == 5985) { + continue; + } + return port; } - return port; } void grpc_recycle_unused_port(int port) { (void)port; } From 65930d4be96f7367ea7e1cff645680fe5959749a Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Tue, 17 Mar 2020 10:40:05 -0700 Subject: [PATCH 194/758] Remove the socket reader in shutdown --- .../grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi | 1 + 1 file changed, 1 insertion(+) diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi index 4449b369702..8c4fa014130 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi @@ -75,6 +75,7 @@ cdef class PollerCompletionQueue(BaseCompletionQueue): self._poll() cdef shutdown(self): + self._loop.remove_reader(self._read_socket) # TODO(https://github.com/grpc/grpc/issues/22365) perform graceful shutdown grpc_completion_queue_shutdown(self._cq) grpc_completion_queue_destroy(self._cq) From b0ae82fe42de06b7f8fd47d2596362064ef34bbe Mon Sep 17 00:00:00 2001 From: yang-g Date: Tue, 17 Mar 2020 10:55:48 -0700 Subject: [PATCH 195/758] Add comment for error case --- include/grpcpp/server_builder_impl.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/include/grpcpp/server_builder_impl.h b/include/grpcpp/server_builder_impl.h index 294a798bb9c..171f1ac6c84 100644 --- a/include/grpcpp/server_builder_impl.h +++ b/include/grpcpp/server_builder_impl.h @@ -107,6 +107,8 @@ class ServerBuilder { /// traffic (via AddListeningPort) /// 3. [for async api only] completion queues have been added via /// AddCompletionQueue + /// + /// Will return a nullptr on errors. virtual std::unique_ptr BuildAndStart(); /// Register a service. This call does not take ownership of the service. From 1a0655d75ccbafe432b84b545e29e485cef16f91 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Tue, 17 Mar 2020 10:55:52 -0700 Subject: [PATCH 196/758] Add comment about why we can't use cimport --- .../grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pxd.pxi | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pxd.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pxd.pxi index 54d845a94ca..f1a7a996644 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pxd.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pxd.pxi @@ -12,6 +12,8 @@ # See the License for the specific language governing permissions and # limitations under the License. +# NOTE(lidiz) Unfortunately, we can't use "cimport" here because Cython +# links it with exception handling. It introduces new dependencies. cdef extern from "" namespace "std" nogil: cdef cppclass queue[T]: queue() From 34e320a439bf75b51b029cc4ed506397463b81df Mon Sep 17 00:00:00 2001 From: Richard Belleville Date: Tue, 17 Mar 2020 19:13:10 +0000 Subject: [PATCH 197/758] Working client --- .../tests/interop/xds_interop_client.py | 109 +++++++++++++----- 1 file changed, 81 insertions(+), 28 deletions(-) diff --git a/src/python/grpcio_tests/tests/interop/xds_interop_client.py b/src/python/grpcio_tests/tests/interop/xds_interop_client.py index 1f010762508..8d9709f10c3 100644 --- a/src/python/grpcio_tests/tests/interop/xds_interop_client.py +++ b/src/python/grpcio_tests/tests/interop/xds_interop_client.py @@ -13,12 +13,13 @@ # limitations under the License. import argparse +import logging import signal import threading import time import sys -from typing import DefaultDict, List, Set +from typing import DefaultDict, Dict, List, Mapping, Set import collections from concurrent import futures @@ -30,6 +31,16 @@ from src.proto.grpc.testing import test_pb2_grpc from src.proto.grpc.testing import messages_pb2 from src.proto.grpc.testing import empty_pb2 +logger = logging.getLogger() +console_handler = logging.StreamHandler() +formatter = logging.Formatter(fmt='%(asctime)s: %(levelname)-8s %(message)s') +console_handler.setFormatter(formatter) +logger.addHandler(console_handler) + +# TODO: Make this logfile configurable. +file_handler = logging.FileHandler('/tmp/python_xds_interop_client.log', mode='a') +file_handler.setFormatter(formatter) +logger.addHandler(file_handler) # TODO: Back with a LoadBalancerStatsResponse proto? class _StatsWatcher: @@ -64,13 +75,17 @@ class _StatsWatcher: def await_rpc_stats_response(self, timeout_sec: int ) -> messages_pb2.LoadBalancerStatsResponse: """Blocks until a full response has been collected.""" + logger.info("Awaiting RPC stats response") with self._lock: + logger.debug(f"Waiting for {timeout_sec} on condition variable.") self._condition.wait_for(lambda: not self._rpcs_needed, timeout=float(timeout_sec)) + logger.debug(f"Waited for {timeout_sec} on condition variable.") response = messages_pb2.LoadBalancerStatsResponse() for peer, count in self._rpcs_by_peer.items(): response.rpcs_by_peer[peer] = count response.num_failures = self._no_remote_peer + self._rpcs_needed + logger.info("Finished awaiting rpc stats response") return response @@ -95,8 +110,7 @@ class _LoadBalancerStatsServicer(test_pb2_grpc.LoadBalancerStatsServiceServicer def GetClientStats(self, request: messages_pb2.LoadBalancerStatsRequest, context: grpc.ServicerContext ) -> messages_pb2.LoadBalancerStatsResponse: - print("Received stats request.") - sys.stdout.flush() + logger.info("Received stats request.") start = None end = None watcher = None @@ -108,8 +122,62 @@ class _LoadBalancerStatsServicer(test_pb2_grpc.LoadBalancerStatsServiceServicer response = watcher.await_rpc_stats_response(request.timeout_sec) with _global_lock: _watchers.remove(watcher) + logger.info("Returning stats response: {}".format(response)) return response +def _start_rpc(request_id: int, + stub: test_pb2_grpc.TestServiceStub, + timeout: float, + futures: Mapping[int, grpc.Future]) -> None: + logger.info(f"[{threading.get_ident()}] Sending request to backend: {request_id}") + future = stub.UnaryCall.future(messages_pb2.SimpleRequest(), + timeout=timeout) + futures[request_id] = future + + +def _on_rpc_done(rpc_id: int, + future: grpc.Future, + print_response: bool) -> None: + exception = future.exception() + hostname = "" + if exception is not None: + if exception.code() == grpc.StatusCode.DEADLINE_EXCEEDED: + logger.error(f"RPC {rpc_id} timed out") + else: + logger.error(exception) + else: + response = future.result() + logger.info(f"Got result {rpc_id}") + hostname = response.hostname + if print_response: + if future.code() == grpc.StatusCode.OK: + logger.info("Successful response.") + else: + logger.info(f"RPC failed: {call}") + with _global_lock: + for watcher in _watchers: + watcher.on_rpc_complete(rpc_id, hostname) + +def _remove_completed_rpcs(futures: Mapping[int, grpc.Future], + print_response: bool) -> None: + logger.debug("Removing completed RPCs") + done = [] + for future_id, future in futures.items(): + if future.done(): + logger.debug("Calling _on_rpc_done") + _on_rpc_done(future_id, future, args.print_response) + logger.debug("Called _on_rpc_done") + done.append(future_id) + for rpc_id in done: + del futures[rpc_id] + logger.debug("Removed completed RPCs") + + +def _cancel_all_rpcs(futures: Mapping[int, grpc.Future]) -> None: + logger.info("Cancelling all remaining RPCs") + for future in futures.values(): + future.cancel() + # TODO: Accept finer-grained arguments. def _run_single_channel(args: argparse.Namespace): @@ -117,45 +185,28 @@ def _run_single_channel(args: argparse.Namespace): duration_per_query = 1.0 / float(args.qps) with grpc.insecure_channel(args.server) as channel: stub = test_pb2_grpc.TestServiceStub(channel) + futures: Dict[int, grpc.Future] = {} while not _stop_event.is_set(): request_id = None with _global_lock: request_id = _global_rpc_id _global_rpc_id += 1 - print(f"[{threading.get_ident()}] Sending request to backend: {request_id}") - sys.stdout.flush() start = time.time() end = start + duration_per_query - try: - response, call = stub.UnaryCall.with_call(messages_pb2.SimpleRequest(), - timeout=float( - args.rpc_timeout_sec)) - except grpc.RpcError as e: - if e.code() == grpc.StatusCode.DEADLINE_EXCEEDED: - print(f"RPC timed out after {args.rpc_timeout_sec}") - else: - raise - else: - print(f"Got result {request_id}") - sys.stdout.flush() - with _global_lock: - for watcher in _watchers: - watcher.on_rpc_complete(request_id, response.hostname) - if args.print_response: - if call.code() == grpc.StatusCode.OK: - print("Successful response.") - sys.stdout.flush() - else: - print(f"RPC failed: {call}") - sys.stdout.flush() + _start_rpc(request_id, stub, float(args.rpc_timeout_sec), futures) + # TODO: Complete RPCs more frequently than 1 / QPS? + _remove_completed_rpcs(futures, args.print_response) + logger.debug(f"Currently {len(futures)} in-flight RPCs") now = time.time() while now < end: time.sleep(end - now) now = time.time() + _cancel_all_rpcs(futures) # TODO: Accept finer-grained arguments. def _run(args: argparse.Namespace) -> None: + logger.info("Starting python xDS Interop Client.") global _global_server # pylint: disable=global-statement channel_threads: List[threading.Thread] = [] for i in range(args.num_channels): @@ -190,7 +241,7 @@ if __name__ == "__main__": type=int, help="The number of queries to send from each channel per second.") parser.add_argument("--rpc_timeout_sec", - default=10, + default=30, type=int, help="The per-RPC timeout in seconds.") parser.add_argument("--server", @@ -203,4 +254,6 @@ if __name__ == "__main__": help="The port on which to expose the peer distribution stats service.") args = parser.parse_args() signal.signal(signal.SIGINT, _handle_sigint) + logger.setLevel(logging.DEBUG) + # logging.basicConfig(level=logging.INFO, stream=sys.stderr) _run(args) From 24e03778ea3f9bec9e81e1eda3851aa2db3f4a9b Mon Sep 17 00:00:00 2001 From: Richard Belleville Date: Tue, 17 Mar 2020 12:36:22 -0700 Subject: [PATCH 198/758] Revert "Merge pull request #22373 from gnossen/creds_threads_and_breads" This reverts commit 61a0212539214d2b40d1c2deea0a7c2eb9313b85, reversing changes made to 19d8e2c55153327da2cf1701c45dca58f10af29b. --- src/python/grpcio/grpc/_auth.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/python/grpcio/grpc/_auth.py b/src/python/grpcio/grpc/_auth.py index 7cbbf58a606..724229a8f56 100644 --- a/src/python/grpcio/grpc/_auth.py +++ b/src/python/grpcio/grpc/_auth.py @@ -40,10 +40,9 @@ def _create_get_token_callback(callback): class GoogleCallCredentials(grpc.AuthMetadataPlugin): """Metadata wrapper for GoogleCredentials from the oauth2client library.""" - _THREAD_POOL = futures.ThreadPoolExecutor() - def __init__(self, credentials): self._credentials = credentials + self._pool = futures.ThreadPoolExecutor(max_workers=1) # Hack to determine if these are JWT creds and we need to pass # additional_claims when getting a token @@ -53,14 +52,16 @@ class GoogleCallCredentials(grpc.AuthMetadataPlugin): def __call__(self, context, callback): # MetadataPlugins cannot block (see grpc.beta.interfaces.py) if self._is_jwt: - future = self._THREAD_POOL.submit( + future = self._pool.submit( self._credentials.get_access_token, additional_claims={'aud': context.service_url}) else: - future = self._THREAD_POOL.submit( - self._credentials.get_access_token) + future = self._pool.submit(self._credentials.get_access_token) future.add_done_callback(_create_get_token_callback(callback)) + def __del__(self): + self._pool.shutdown(wait=False) + class AccessTokenAuthMetadataPlugin(grpc.AuthMetadataPlugin): """Metadata wrapper for raw access token credentials.""" From 82050ae19264389cdc1746905d7ebddff6a0506d Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Tue, 17 Mar 2020 13:23:11 -0700 Subject: [PATCH 199/758] Initialize credentials after IO engine set --- src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi | 4 ++-- src/python/grpcio/grpc/experimental/aio/__init__.py | 5 ++++- src/python/grpcio_tests/tests_aio/unit/_test_base.py | 3 +++ 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi index 8cb113c462c..35e7c2a38f2 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi @@ -114,7 +114,7 @@ cdef _actual_aio_shutdown(): raise ValueError('Unsupported engine type [%s]' % _global_aio_state.engine) -cdef init_grpc_aio(): +cpdef init_grpc_aio(): """Initialis the gRPC AsyncIO module. Expected to be invoked on critical class constructors. @@ -126,7 +126,7 @@ cdef init_grpc_aio(): _actual_aio_initialization() -cdef shutdown_grpc_aio(): +cpdef shutdown_grpc_aio(): """Shuts down the gRPC AsyncIO module. Expected to be invoked on critical class destructors. diff --git a/src/python/grpcio/grpc/experimental/aio/__init__.py b/src/python/grpcio/grpc/experimental/aio/__init__.py index 31882be24fc..3613908a961 100644 --- a/src/python/grpcio/grpc/experimental/aio/__init__.py +++ b/src/python/grpcio/grpc/experimental/aio/__init__.py @@ -20,7 +20,8 @@ created. AsyncIO doesn't provide thread safety for most of its APIs. from typing import Any, Optional, Sequence, Tuple import grpc -from grpc._cython.cygrpc import (EOF, AbortError, BaseError, InternalError, +from grpc._cython.cygrpc import (init_grpc_aio, shutdown_grpc_aio, EOF, + AbortError, BaseError, InternalError, UsageError) from ._base_call import (Call, RpcContext, StreamStreamCall, StreamUnaryCall, @@ -39,6 +40,8 @@ from ._channel import insecure_channel, secure_channel ################################### __all__ ################################# __all__ = ( + 'init_grpc_aio', + 'shutdown_grpc_aio', 'AioRpcError', 'RpcContext', 'Call', diff --git a/src/python/grpcio_tests/tests_aio/unit/_test_base.py b/src/python/grpcio_tests/tests_aio/unit/_test_base.py index ec5f2112da0..82ec7b456ad 100644 --- a/src/python/grpcio_tests/tests_aio/unit/_test_base.py +++ b/src/python/grpcio_tests/tests_aio/unit/_test_base.py @@ -64,3 +64,6 @@ class AioTestBase(unittest.TestCase): return _async_to_sync_decorator(attr, self._TEST_LOOP) # For other attributes, let them pass. return attr + + +aio.init_grpc_aio() From 030b1b6a84967033d790a0da7071fa1a17ec11d2 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Tue, 17 Mar 2020 13:28:24 -0700 Subject: [PATCH 200/758] Update the pxd as well --- src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pxd.pxi | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pxd.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pxd.pxi index 1755b702015..ebf0660174d 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pxd.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pxd.pxi @@ -23,10 +23,10 @@ cdef class _AioState: cdef grpc_completion_queue *global_completion_queue() -cdef init_grpc_aio() +cpdef init_grpc_aio() -cdef shutdown_grpc_aio() +cpdef shutdown_grpc_aio() cdef extern from "src/core/lib/iomgr/timer_manager.h": From 7fd0c8fc1a426c56be5ebe2d7c0fa30a27f056b6 Mon Sep 17 00:00:00 2001 From: Richard Belleville Date: Tue, 17 Mar 2020 20:34:25 +0000 Subject: [PATCH 201/758] Clean up client --- .../tests/interop/xds_interop_client.py | 55 +++++++++---------- 1 file changed, 25 insertions(+), 30 deletions(-) diff --git a/src/python/grpcio_tests/tests/interop/xds_interop_client.py b/src/python/grpcio_tests/tests/interop/xds_interop_client.py index 8d9709f10c3..bd13d9aeca6 100644 --- a/src/python/grpcio_tests/tests/interop/xds_interop_client.py +++ b/src/python/grpcio_tests/tests/interop/xds_interop_client.py @@ -37,12 +37,7 @@ formatter = logging.Formatter(fmt='%(asctime)s: %(levelname)-8s %(message)s') console_handler.setFormatter(formatter) logger.addHandler(console_handler) -# TODO: Make this logfile configurable. -file_handler = logging.FileHandler('/tmp/python_xds_interop_client.log', mode='a') -file_handler.setFormatter(formatter) -logger.addHandler(file_handler) -# TODO: Back with a LoadBalancerStatsResponse proto? class _StatsWatcher: _start: int _end: int @@ -57,14 +52,13 @@ class _StatsWatcher: self._end = end self._rpcs_needed = end - start self._rpcs_by_peer = collections.defaultdict(int) - self._lock = threading.Lock() - self._condition = threading.Condition(self._lock) + self._condition = threading.Condition() self._no_remote_peer = 0 def on_rpc_complete(self, request_id: int, peer: str) -> None: """Records statistics for a single RPC.""" if self._start <= request_id < self._end: - with self._lock: + with self._condition: if not peer: self._no_remote_peer += 1 else: @@ -75,17 +69,13 @@ class _StatsWatcher: def await_rpc_stats_response(self, timeout_sec: int ) -> messages_pb2.LoadBalancerStatsResponse: """Blocks until a full response has been collected.""" - logger.info("Awaiting RPC stats response") - with self._lock: - logger.debug(f"Waiting for {timeout_sec} on condition variable.") + with self._condition: self._condition.wait_for(lambda: not self._rpcs_needed, timeout=float(timeout_sec)) - logger.debug(f"Waited for {timeout_sec} on condition variable.") response = messages_pb2.LoadBalancerStatsResponse() for peer, count in self._rpcs_by_peer.items(): response.rpcs_by_peer[peer] = count response.num_failures = self._no_remote_peer + self._rpcs_needed - logger.info("Finished awaiting rpc stats response") return response @@ -125,18 +115,16 @@ class _LoadBalancerStatsServicer(test_pb2_grpc.LoadBalancerStatsServiceServicer logger.info("Returning stats response: {}".format(response)) return response -def _start_rpc(request_id: int, - stub: test_pb2_grpc.TestServiceStub, - timeout: float, - futures: Mapping[int, grpc.Future]) -> None: - logger.info(f"[{threading.get_ident()}] Sending request to backend: {request_id}") + +def _start_rpc(request_id: int, stub: test_pb2_grpc.TestServiceStub, + timeout: float, futures: Mapping[int, grpc.Future]) -> None: + logger.info(f"Sending request to backend: {request_id}") future = stub.UnaryCall.future(messages_pb2.SimpleRequest(), - timeout=timeout) + timeout=timeout) futures[request_id] = future -def _on_rpc_done(rpc_id: int, - future: grpc.Future, +def _on_rpc_done(rpc_id: int, future: grpc.Future, print_response: bool) -> None: exception = future.exception() hostname = "" @@ -158,19 +146,17 @@ def _on_rpc_done(rpc_id: int, for watcher in _watchers: watcher.on_rpc_complete(rpc_id, hostname) + def _remove_completed_rpcs(futures: Mapping[int, grpc.Future], - print_response: bool) -> None: + print_response: bool) -> None: logger.debug("Removing completed RPCs") done = [] for future_id, future in futures.items(): if future.done(): - logger.debug("Calling _on_rpc_done") _on_rpc_done(future_id, future, args.print_response) - logger.debug("Called _on_rpc_done") done.append(future_id) for rpc_id in done: del futures[rpc_id] - logger.debug("Removed completed RPCs") def _cancel_all_rpcs(futures: Mapping[int, grpc.Future]) -> None: @@ -179,7 +165,6 @@ def _cancel_all_rpcs(futures: Mapping[int, grpc.Future]) -> None: future.cancel() -# TODO: Accept finer-grained arguments. def _run_single_channel(args: argparse.Namespace): global _global_rpc_id # pylint: disable=global-statement duration_per_query = 1.0 / float(args.qps) @@ -194,7 +179,6 @@ def _run_single_channel(args: argparse.Namespace): start = time.time() end = start + duration_per_query _start_rpc(request_id, stub, float(args.rpc_timeout_sec), futures) - # TODO: Complete RPCs more frequently than 1 / QPS? _remove_completed_rpcs(futures, args.print_response) logger.debug(f"Currently {len(futures)} in-flight RPCs") now = time.time() @@ -204,7 +188,6 @@ def _run_single_channel(args: argparse.Namespace): _cancel_all_rpcs(futures) -# TODO: Accept finer-grained arguments. def _run(args: argparse.Namespace) -> None: logger.info("Starting python xDS Interop Client.") global _global_server # pylint: disable=global-statement @@ -252,8 +235,20 @@ if __name__ == "__main__": default=50052, type=int, help="The port on which to expose the peer distribution stats service.") + parser.add_argument('--verbose', + help='verbose log output', + default=False, + action='store_true') + parser.add_argument("--log_file", + default=None, + type=str, + help="A file to log to.") args = parser.parse_args() signal.signal(signal.SIGINT, _handle_sigint) - logger.setLevel(logging.DEBUG) - # logging.basicConfig(level=logging.INFO, stream=sys.stderr) + if args.verbose: + logger.setLevel(logging.DEBUG) + if args.log_file: + file_handler = logging.FileHandler(args.log_file, mode='a') + file_handler.setFormatter(formatter) + logger.addHandler(file_handler) _run(args) From e88f582cb843cb5d6d4c08061ac98aeaccaa5d52 Mon Sep 17 00:00:00 2001 From: Richard Belleville Date: Tue, 17 Mar 2020 21:10:41 +0000 Subject: [PATCH 202/758] Add Python interop client to CI --- .../linux/grpc_xds_bazel_test_in_docker.sh | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/tools/internal_ci/linux/grpc_xds_bazel_test_in_docker.sh b/tools/internal_ci/linux/grpc_xds_bazel_test_in_docker.sh index 17380860f21..e94cc12fab5 100755 --- a/tools/internal_ci/linux/grpc_xds_bazel_test_in_docker.sh +++ b/tools/internal_ci/linux/grpc_xds_bazel_test_in_docker.sh @@ -45,12 +45,24 @@ touch "$TOOLS_DIR"/src/proto/grpc/testing/__init__.py "$PROTO_SOURCE_DIR"/messages.proto \ "$PROTO_SOURCE_DIR"/empty.proto -bazel build test/cpp/interop:xds_interop_client +export GRPC_VERBOSITY=debug +export GRPC_TRACE=xds_client,xds_resolver,cds_lb,xds_lb -GRPC_VERBOSITY=debug GRPC_TRACE=xds_client,xds_resolver,cds_lb,xds_lb "$PYTHON" \ +bazel build test/cpp/interop:xds_interop_client +"$PYTHON" \ tools/run_tests/run_xds_tests.py \ --test_case=all \ --project_id=grpc-testing \ --gcp_suffix=$(date '+%s') \ --verbose \ --client_cmd='bazel-bin/test/cpp/interop/xds_interop_client --server=xds-experimental:///{server_uri} --stats_port={stats_port} --qps={qps}' + + +bazel build //src/python/grpcio_tests/tests/interop:xds_interop_client +"$PYTHON" \ + tools/run_tests/run_xds_tests.py \ + --test_case=all \ + --project_id=grpc-testing \ + --gcp_suffix=$(date '+%s') \ + --verbose \ + --client_cmd='bazel run //src/python/grpcio_tests/tests/interop:xds_interop_client -- --server=xds-experimental:///{server_uri} --stats_port={stats_port} --qps={qps} --verbose' From 33f4b8336e44cbd4d72c7714348037273039281e Mon Sep 17 00:00:00 2001 From: Vijay Pai Date: Tue, 17 Mar 2020 14:29:34 -0700 Subject: [PATCH 203/758] Add useful comments --- .../grpcpp/impl/codegen/client_callback_impl.h | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/include/grpcpp/impl/codegen/client_callback_impl.h b/include/grpcpp/impl/codegen/client_callback_impl.h index fac67c5f49b..83b183e4a5b 100644 --- a/include/grpcpp/impl/codegen/client_callback_impl.h +++ b/include/grpcpp/impl/codegen/client_callback_impl.h @@ -272,7 +272,10 @@ class ClientBidiReactor { void RemoveHold() { stream_->RemoveHold(); } /// Notifies the application that all operations associated with this RPC - /// have completed and provides the RPC status outcome. + /// have completed and all Holds have been removed. OnDone provides the RPC + /// status outcome for both successful and failed RPCs and will be called in + /// all cases. If it is not called, it indicates an application-level problem + /// (like failure to remove a hold). /// /// \param[in] s The status outcome of this RPC virtual void OnDone(const ::grpc::Status& /*s*/) {} @@ -283,19 +286,21 @@ class ClientBidiReactor { /// call of OnReadDone or OnDone. /// /// \param[in] ok Was the initial metadata read successfully? If false, no - /// new read/write operation will succeed. + /// new read/write operation will succeed, and any further + /// Start* operations should not be called. virtual void OnReadInitialMetadataDone(bool /*ok*/) {} /// Notifies the application that a StartRead operation completed. /// /// \param[in] ok Was it successful? If false, no new read/write operation - /// will succeed. + /// will succeed, and any further Start* should not be called. virtual void OnReadDone(bool /*ok*/) {} - /// Notifies the application that a StartWrite operation completed. + /// Notifies the application that a StartWrite or StartWriteLast operation + /// completed. /// /// \param[in] ok Was it successful? If false, no new read/write operation - /// will succeed. + /// will succeed, and any further Start* should not be called. virtual void OnWriteDone(bool /*ok*/) {} /// Notifies the application that a StartWritesDone operation completed. Note @@ -303,7 +308,8 @@ class ClientBidiReactor { /// those that are implicitly invoked as part of a StartWriteLast. /// /// \param[in] ok Was it successful? If false, the application will later see - /// the failure reflected as a bad status in OnDone. + /// the failure reflected as a bad status in OnDone and no + /// further Start* should be called. virtual void OnWritesDoneDone(bool /*ok*/) {} private: From d812d9d557ee51cffa4a251a1a0feb23354f5a44 Mon Sep 17 00:00:00 2001 From: "Mark D. Roth" Date: Tue, 17 Mar 2020 15:16:49 -0700 Subject: [PATCH 204/758] fix duplicate LDS update detection --- .../client_channel/lb_policy/xds/xds.cc | 10 +-- .../ext/filters/client_channel/xds/xds_api.h | 18 +++++- .../filters/client_channel/xds/xds_client.cc | 61 ++++++++++--------- .../filters/client_channel/xds/xds_client.h | 8 ++- 4 files changed, 59 insertions(+), 38 deletions(-) diff --git a/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc b/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc index a9205b5f4e0..0c390c2a1fe 100644 --- a/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc +++ b/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc @@ -25,6 +25,8 @@ #include #include +#include "absl/types/optional.h" + #include #include #include @@ -80,7 +82,7 @@ class XdsConfig : public LoadBalancingPolicy::Config { XdsConfig(RefCountedPtr child_policy, RefCountedPtr fallback_policy, std::string eds_service_name, - Optional lrs_load_reporting_server_name) + absl::optional lrs_load_reporting_server_name) : child_policy_(std::move(child_policy)), fallback_policy_(std::move(fallback_policy)), eds_service_name_(std::move(eds_service_name)), @@ -101,7 +103,7 @@ class XdsConfig : public LoadBalancingPolicy::Config { return eds_service_name_.empty() ? nullptr : eds_service_name_.c_str(); }; - const Optional& lrs_load_reporting_server_name() const { + const absl::optional& lrs_load_reporting_server_name() const { return lrs_load_reporting_server_name_; }; @@ -109,7 +111,7 @@ class XdsConfig : public LoadBalancingPolicy::Config { RefCountedPtr child_policy_; RefCountedPtr fallback_policy_; std::string eds_service_name_; - Optional lrs_load_reporting_server_name_; + absl::optional lrs_load_reporting_server_name_; }; class XdsLb : public LoadBalancingPolicy { @@ -1656,7 +1658,7 @@ class XdsFactory : public LoadBalancingPolicyFactory { } } if (error_list.empty()) { - Optional optional_lrs_load_reporting_server_name; + absl::optional optional_lrs_load_reporting_server_name; if (lrs_load_reporting_server_name != nullptr) { optional_lrs_load_reporting_server_name.emplace( std::string(lrs_load_reporting_server_name)); diff --git a/src/core/ext/filters/client_channel/xds/xds_api.h b/src/core/ext/filters/client_channel/xds/xds_api.h index b428aa4bbc7..28cae1ae351 100644 --- a/src/core/ext/filters/client_channel/xds/xds_api.h +++ b/src/core/ext/filters/client_channel/xds/xds_api.h @@ -25,12 +25,13 @@ #include +#include "absl/types/optional.h" + #include #include "src/core/ext/filters/client_channel/server_address.h" #include "src/core/ext/filters/client_channel/xds/xds_bootstrap.h" #include "src/core/ext/filters/client_channel/xds/xds_client_stats.h" -#include "src/core/lib/gprpp/optional.h" namespace grpc_core { @@ -46,14 +47,25 @@ class XdsApi { struct RdsUpdate { // The name to use in the CDS request. std::string cluster_name; + + bool operator==(const RdsUpdate& other) const { + return cluster_name == other.cluster_name; + } }; + // TODO(roth): When we can use absl::variant<>, consider using that + // here, to enforce the fact that only one of the two fields can be set. struct LdsUpdate { // The name to use in the RDS request. std::string route_config_name; // The name to use in the CDS request. Present if the LDS response has it // inlined. - Optional rds_update; + absl::optional rds_update; + + bool operator==(const LdsUpdate& other) const { + return route_config_name == other.route_config_name && + rds_update == other.rds_update; + } }; using LdsUpdateMap = std::map; @@ -68,7 +80,7 @@ class XdsApi { // If not set, load reporting will be disabled. // If set to the empty string, will use the same server we obtained the CDS // data from. - Optional lrs_load_reporting_server_name; + absl::optional lrs_load_reporting_server_name; }; using CdsUpdateMap = std::map; diff --git a/src/core/ext/filters/client_channel/xds/xds_client.cc b/src/core/ext/filters/client_channel/xds/xds_client.cc index 65e1e5c4308..3357e308ad5 100644 --- a/src/core/ext/filters/client_channel/xds/xds_client.cc +++ b/src/core/ext/filters/client_channel/xds/xds_client.cc @@ -801,11 +801,12 @@ void XdsClient::ChannelState::AdsCallState::SendMessageLocked( GRPC_ERROR_REF(state.error), !sent_initial_message_); state.subscribed_resources[xds_client()->server_name_]->Start(Ref()); } else if (type_url == XdsApi::kRdsTypeUrl) { - resource_names.insert(xds_client()->route_config_name_); + resource_names.insert(xds_client()->lds_result_->route_config_name); request_payload_slice = xds_client()->api_.CreateRdsRequest( - xds_client()->route_config_name_, state.version, state.nonce, - GRPC_ERROR_REF(state.error), !sent_initial_message_); - state.subscribed_resources[xds_client()->route_config_name_]->Start(Ref()); + xds_client()->lds_result_->route_config_name, state.version, + state.nonce, GRPC_ERROR_REF(state.error), !sent_initial_message_); + state.subscribed_resources[xds_client()->lds_result_->route_config_name] + ->Start(Ref()); } else if (type_url == XdsApi::kCdsTypeUrl) { resource_names = ClusterNamesForRequest(); request_payload_slice = xds_client()->api_.CreateCdsRequest( @@ -888,23 +889,23 @@ void XdsClient::ChannelState::AdsCallState::AcceptLdsUpdate( "LDS update does not include requested resource")); return; } - const std::string& cluster_name = - lds_update->rds_update.has_value() - ? lds_update->rds_update.value().cluster_name - : ""; if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) { gpr_log(GPR_INFO, "[xds_client %p] LDS update received: route_config_name=%s, " - "cluster_name=%s (empty if RDS is needed to obtain it)", - xds_client(), lds_update->route_config_name.c_str(), - cluster_name.c_str()); + "cluster_name=%s", + xds_client(), + (lds_update->route_config_name.empty() + ? lds_update->route_config_name.c_str() + : ""), + (lds_update->rds_update.has_value() + ? lds_update->rds_update->cluster_name.c_str() + : "")); } auto& lds_state = state_map_[XdsApi::kLdsTypeUrl]; auto& state = lds_state.subscribed_resources[xds_client()->server_name_]; if (state != nullptr) state->Finish(); // Ignore identical update. - if (xds_client()->route_config_name_ == lds_update->route_config_name && - xds_client()->cluster_name_ == cluster_name) { + if (xds_client()->lds_result_ == lds_update) { if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) { gpr_log(GPR_INFO, "[xds_client %p] LDS update identical to current, ignoring.", @@ -912,20 +913,19 @@ void XdsClient::ChannelState::AdsCallState::AcceptLdsUpdate( } return; } - if (!xds_client()->route_config_name_.empty()) { + if (xds_client()->lds_result_.has_value() && + !xds_client()->lds_result_->route_config_name.empty()) { Unsubscribe( - XdsApi::kRdsTypeUrl, xds_client()->route_config_name_, + XdsApi::kRdsTypeUrl, xds_client()->lds_result_->route_config_name, /*delay_unsubscription=*/!lds_update->route_config_name.empty()); } - xds_client()->route_config_name_ = std::move(lds_update->route_config_name); - if (lds_update->rds_update.has_value()) { - // If cluster_name was found inlined in LDS response, notify the watcher - // immediately. - xds_client()->cluster_name_ = - std::move(lds_update->rds_update.value().cluster_name); + xds_client()->lds_result_ = std::move(lds_update); + if (xds_client()->lds_result_->rds_update.has_value()) { + // If the RouteConfiguration was found inlined in LDS response, notify + // the watcher immediately. RefCountedPtr service_config; grpc_error* error = xds_client()->CreateServiceConfig( - xds_client()->cluster_name_, &service_config); + xds_client()->lds_result_->rds_update->cluster_name, &service_config); if (error == GRPC_ERROR_NONE) { xds_client()->service_config_watcher_->OnServiceConfigChanged( std::move(service_config)); @@ -934,7 +934,8 @@ void XdsClient::ChannelState::AdsCallState::AcceptLdsUpdate( } } else { // Send RDS request for dynamic resolution. - Subscribe(XdsApi::kRdsTypeUrl, xds_client()->route_config_name_); + Subscribe(XdsApi::kRdsTypeUrl, + xds_client()->lds_result_->route_config_name); } } @@ -955,10 +956,11 @@ void XdsClient::ChannelState::AdsCallState::AcceptRdsUpdate( } auto& rds_state = state_map_[XdsApi::kRdsTypeUrl]; auto& state = - rds_state.subscribed_resources[xds_client()->route_config_name_]; + rds_state + .subscribed_resources[xds_client()->lds_result_->route_config_name]; if (state != nullptr) state->Finish(); // Ignore identical update. - if (xds_client()->cluster_name_ == rds_update->cluster_name) { + if (xds_client()->rds_result_ == rds_update) { if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) { gpr_log(GPR_INFO, "[xds_client %p] RDS update identical to current, ignoring.", @@ -966,11 +968,11 @@ void XdsClient::ChannelState::AdsCallState::AcceptRdsUpdate( } return; } - xds_client()->cluster_name_ = std::move(rds_update->cluster_name); + xds_client()->rds_result_ = std::move(rds_update); // Notify the watcher. RefCountedPtr service_config; grpc_error* error = xds_client()->CreateServiceConfig( - xds_client()->cluster_name_, &service_config); + xds_client()->rds_result_->cluster_name, &service_config); if (error == GRPC_ERROR_NONE) { xds_client()->service_config_watcher_->OnServiceConfigChanged( std::move(service_config)); @@ -1215,7 +1217,10 @@ void XdsClient::ChannelState::AdsCallState::OnResponseReceivedLocked( std::string type_url; // Note that ParseAdsResponse() also validates the response. grpc_error* parse_error = xds_client->api_.ParseAdsResponse( - response_slice, xds_client->server_name_, xds_client->route_config_name_, + response_slice, xds_client->server_name_, + (xds_client->lds_result_.has_value() + ? xds_client->lds_result_->route_config_name + : ""), ads_calld->ClusterNamesForRequest(), ads_calld->EdsServiceNamesForRequest(), &lds_update, &rds_update, &cds_update_map, &eds_update_map, &version, &nonce, &type_url); diff --git a/src/core/ext/filters/client_channel/xds/xds_client.h b/src/core/ext/filters/client_channel/xds/xds_client.h index 228b9a21b47..609890dc02e 100644 --- a/src/core/ext/filters/client_channel/xds/xds_client.h +++ b/src/core/ext/filters/client_channel/xds/xds_client.h @@ -21,13 +21,14 @@ #include +#include "absl/types/optional.h" + #include "src/core/ext/filters/client_channel/service_config.h" #include "src/core/ext/filters/client_channel/xds/xds_api.h" #include "src/core/ext/filters/client_channel/xds/xds_bootstrap.h" #include "src/core/ext/filters/client_channel/xds/xds_client_stats.h" #include "src/core/lib/gprpp/map.h" #include "src/core/lib/gprpp/memory.h" -#include "src/core/lib/gprpp/optional.h" #include "src/core/lib/gprpp/orphanable.h" #include "src/core/lib/gprpp/ref_counted.h" #include "src/core/lib/gprpp/ref_counted_ptr.h" @@ -246,8 +247,9 @@ class XdsClient : public InternallyRefCounted { // The channel for communicating with the xds server. OrphanablePtr chand_; - std::string route_config_name_; - std::string cluster_name_; + absl::optional lds_result_; + absl::optional rds_result_; + // One entry for each watched CDS resource. std::map cluster_map_; // One entry for each watched EDS resource. From d6bd3c37b287cb10d0783b281544a1720fdebf8b Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Tue, 17 Mar 2020 15:32:38 -0700 Subject: [PATCH 205/758] Use mutex to protect queue operations --- .../_cython/_cygrpc/aio/completion_queue.pxd.pxi | 8 ++++++++ .../_cython/_cygrpc/aio/completion_queue.pyx.pxi | 14 +++++++++++--- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pxd.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pxd.pxi index f1a7a996644..e69200c7376 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pxd.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pxd.pxi @@ -24,6 +24,13 @@ cdef extern from "" namespace "std" nogil: size_t size() +cdef extern from "" namespace "std" nogil: + cdef cppclass mutex: + mutex() + void lock() + void unlock() + + ctypedef queue[grpc_event] cpp_event_queue @@ -45,6 +52,7 @@ cdef class BaseCompletionQueue: cdef class PollerCompletionQueue(BaseCompletionQueue): cdef bint _shutdown cdef cpp_event_queue _queue + cdef mutex _queue_mutex cdef object _poller_thread cdef int _write_fd cdef object _read_socket diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi index 8c4fa014130..15d2e18f3d7 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi @@ -67,7 +67,9 @@ cdef class PollerCompletionQueue(BaseCompletionQueue): elif event.type == GRPC_QUEUE_SHUTDOWN: self._shutdown = True else: + self._queue_mutex.lock() self._queue.push(event) + self._queue_mutex.unlock() _unified_socket_write(self._write_fd) def _poll_wrapper(self): @@ -85,9 +87,15 @@ cdef class PollerCompletionQueue(BaseCompletionQueue): cdef grpc_event event cdef CallbackContext *context - while not self._queue.empty(): - event = self._queue.front() - self._queue.pop() + while True: + self._queue_mutex.lock() + if self._queue.empty(): + self._queue_mutex.unlock() + break + else: + event = self._queue.front() + self._queue.pop() + self._queue_mutex.unlock() context = event.tag loop = context.loop From 7ec0eda19161b05c93bf406274fb48334408a1e0 Mon Sep 17 00:00:00 2001 From: Richard Belleville Date: Tue, 17 Mar 2020 23:08:57 +0000 Subject: [PATCH 206/758] Split xDS tests up into separate kokoro jobs --- ...h => grpc_xds_bazel_cpp_test_in_docker.sh} | 16 +----- .../grpc_xds_bazel_python_test_in_docker.sh | 56 +++++++++++++++++++ .../linux/{grpc_xds.cfg => grpc_xds_cpp.cfg} | 2 +- tools/internal_ci/linux/grpc_xds_python.cfg | 23 ++++++++ 4 files changed, 82 insertions(+), 15 deletions(-) rename tools/internal_ci/linux/{grpc_xds_bazel_test_in_docker.sh => grpc_xds_bazel_cpp_test_in_docker.sh} (80%) create mode 100755 tools/internal_ci/linux/grpc_xds_bazel_python_test_in_docker.sh rename tools/internal_ci/linux/{grpc_xds.cfg => grpc_xds_cpp.cfg} (91%) create mode 100644 tools/internal_ci/linux/grpc_xds_python.cfg diff --git a/tools/internal_ci/linux/grpc_xds_bazel_test_in_docker.sh b/tools/internal_ci/linux/grpc_xds_bazel_cpp_test_in_docker.sh similarity index 80% rename from tools/internal_ci/linux/grpc_xds_bazel_test_in_docker.sh rename to tools/internal_ci/linux/grpc_xds_bazel_cpp_test_in_docker.sh index e94cc12fab5..17380860f21 100755 --- a/tools/internal_ci/linux/grpc_xds_bazel_test_in_docker.sh +++ b/tools/internal_ci/linux/grpc_xds_bazel_cpp_test_in_docker.sh @@ -45,24 +45,12 @@ touch "$TOOLS_DIR"/src/proto/grpc/testing/__init__.py "$PROTO_SOURCE_DIR"/messages.proto \ "$PROTO_SOURCE_DIR"/empty.proto -export GRPC_VERBOSITY=debug -export GRPC_TRACE=xds_client,xds_resolver,cds_lb,xds_lb - bazel build test/cpp/interop:xds_interop_client -"$PYTHON" \ - tools/run_tests/run_xds_tests.py \ - --test_case=all \ - --project_id=grpc-testing \ - --gcp_suffix=$(date '+%s') \ - --verbose \ - --client_cmd='bazel-bin/test/cpp/interop/xds_interop_client --server=xds-experimental:///{server_uri} --stats_port={stats_port} --qps={qps}' - -bazel build //src/python/grpcio_tests/tests/interop:xds_interop_client -"$PYTHON" \ +GRPC_VERBOSITY=debug GRPC_TRACE=xds_client,xds_resolver,cds_lb,xds_lb "$PYTHON" \ tools/run_tests/run_xds_tests.py \ --test_case=all \ --project_id=grpc-testing \ --gcp_suffix=$(date '+%s') \ --verbose \ - --client_cmd='bazel run //src/python/grpcio_tests/tests/interop:xds_interop_client -- --server=xds-experimental:///{server_uri} --stats_port={stats_port} --qps={qps} --verbose' + --client_cmd='bazel-bin/test/cpp/interop/xds_interop_client --server=xds-experimental:///{server_uri} --stats_port={stats_port} --qps={qps}' diff --git a/tools/internal_ci/linux/grpc_xds_bazel_python_test_in_docker.sh b/tools/internal_ci/linux/grpc_xds_bazel_python_test_in_docker.sh new file mode 100755 index 00000000000..1eecd28015c --- /dev/null +++ b/tools/internal_ci/linux/grpc_xds_bazel_python_test_in_docker.sh @@ -0,0 +1,56 @@ +#!/usr/bin/env bash +# Copyright 2020 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -ex -o igncr || set -ex + +mkdir -p /var/local/git +git clone /var/local/jenkins/grpc /var/local/git/grpc +(cd /var/local/jenkins/grpc/ && git submodule foreach 'cd /var/local/git/grpc \ +&& git submodule update --init --reference /var/local/jenkins/grpc/${name} \ +${name}') +cd /var/local/git/grpc + +VIRTUAL_ENV=$(mktemp -d) +virtualenv "$VIRTUAL_ENV" +PYTHON="$VIRTUAL_ENV"/bin/python +"$PYTHON" -m pip install --upgrade grpcio-tools google-api-python-client google-auth-httplib2 oauth2client + +# Prepare generated Python code. +TOOLS_DIR=tools/run_tests +PROTO_SOURCE_DIR=src/proto/grpc/testing +PROTO_DEST_DIR="$TOOLS_DIR"/"$PROTO_SOURCE_DIR" +mkdir -p "$PROTO_DEST_DIR" +touch "$TOOLS_DIR"/src/__init__.py +touch "$TOOLS_DIR"/src/proto/__init__.py +touch "$TOOLS_DIR"/src/proto/grpc/__init__.py +touch "$TOOLS_DIR"/src/proto/grpc/testing/__init__.py + +"$PYTHON" -m grpc_tools.protoc \ + --proto_path=. \ + --python_out="$TOOLS_DIR" \ + --grpc_python_out="$TOOLS_DIR" \ + "$PROTO_SOURCE_DIR"/test.proto \ + "$PROTO_SOURCE_DIR"/messages.proto \ + "$PROTO_SOURCE_DIR"/empty.proto + +bazel build //src/python/grpcio_tests/tests/interop:xds_interop_client + +GRPC_VERBOSITY=debug GRPC_TRACE=xds_client,xds_resolver,cds_lb,xds_lb "$PYTHON" \ + tools/run_tests/run_xds_tests.py \ + --test_case=all \ + --project_id=grpc-testing \ + --gcp_suffix=$(date '+%s') \ + --verbose \ + --client_cmd='bazel run //src/python/grpcio_tests/tests/interop:xds_interop_client -- --server=xds-experimental:///{server_uri} --stats_port={stats_port} --qps={qps} --verbose' diff --git a/tools/internal_ci/linux/grpc_xds.cfg b/tools/internal_ci/linux/grpc_xds_cpp.cfg similarity index 91% rename from tools/internal_ci/linux/grpc_xds.cfg rename to tools/internal_ci/linux/grpc_xds_cpp.cfg index 888be05cde5..89e42a45084 100644 --- a/tools/internal_ci/linux/grpc_xds.cfg +++ b/tools/internal_ci/linux/grpc_xds_cpp.cfg @@ -19,5 +19,5 @@ build_file: "grpc/tools/internal_ci/linux/grpc_bazel.sh" timeout_mins: 90 env_vars { key: "BAZEL_SCRIPT" - value: "tools/internal_ci/linux/grpc_xds_bazel_test_in_docker.sh" + value: "tools/internal_ci/linux/grpc_xds_cpp_bazel_test_in_docker.sh" } diff --git a/tools/internal_ci/linux/grpc_xds_python.cfg b/tools/internal_ci/linux/grpc_xds_python.cfg new file mode 100644 index 00000000000..cf6f3d5757b --- /dev/null +++ b/tools/internal_ci/linux/grpc_xds_python.cfg @@ -0,0 +1,23 @@ +# Copyright 2020 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Config file for the internal CI (in protobuf text format) + +# Location of the continuous shell script in repository. +build_file: "grpc/tools/internal_ci/linux/grpc_bazel.sh" +timeout_mins: 90 +env_vars { + key: "BAZEL_SCRIPT" + value: "tools/internal_ci/linux/grpc_xds_python_bazel_test_in_docker.sh" +} From bbecc319cc91b0bc4f994bcc7f1cb71103074224 Mon Sep 17 00:00:00 2001 From: Richard Belleville Date: Tue, 17 Mar 2020 23:25:28 +0000 Subject: [PATCH 207/758] Unrename cpp tests --- tools/internal_ci/linux/{grpc_xds_cpp.cfg => grpc_xds.cfg} | 2 +- ...l_cpp_test_in_docker.sh => grpc_xds_bazel_test_in_docker.sh} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename tools/internal_ci/linux/{grpc_xds_cpp.cfg => grpc_xds.cfg} (91%) rename tools/internal_ci/linux/{grpc_xds_bazel_cpp_test_in_docker.sh => grpc_xds_bazel_test_in_docker.sh} (100%) diff --git a/tools/internal_ci/linux/grpc_xds_cpp.cfg b/tools/internal_ci/linux/grpc_xds.cfg similarity index 91% rename from tools/internal_ci/linux/grpc_xds_cpp.cfg rename to tools/internal_ci/linux/grpc_xds.cfg index 89e42a45084..888be05cde5 100644 --- a/tools/internal_ci/linux/grpc_xds_cpp.cfg +++ b/tools/internal_ci/linux/grpc_xds.cfg @@ -19,5 +19,5 @@ build_file: "grpc/tools/internal_ci/linux/grpc_bazel.sh" timeout_mins: 90 env_vars { key: "BAZEL_SCRIPT" - value: "tools/internal_ci/linux/grpc_xds_cpp_bazel_test_in_docker.sh" + value: "tools/internal_ci/linux/grpc_xds_bazel_test_in_docker.sh" } diff --git a/tools/internal_ci/linux/grpc_xds_bazel_cpp_test_in_docker.sh b/tools/internal_ci/linux/grpc_xds_bazel_test_in_docker.sh similarity index 100% rename from tools/internal_ci/linux/grpc_xds_bazel_cpp_test_in_docker.sh rename to tools/internal_ci/linux/grpc_xds_bazel_test_in_docker.sh From 91bfc400d3a9a4d0375cca7044a8573c96bdf43a Mon Sep 17 00:00:00 2001 From: jiangtaoli2016 Date: Tue, 17 Mar 2020 14:22:53 -0700 Subject: [PATCH 208/758] Update test credentials to use 2048-bit RSA keys --- src/core/tsi/test_creds/README | 29 +++++++++++-------- src/core/tsi/test_creds/badclient.key | 40 +++++++++++++++++---------- src/core/tsi/test_creds/badclient.pem | 35 +++++++++++++---------- src/core/tsi/test_creds/badserver.key | 40 +++++++++++++++++---------- src/core/tsi/test_creds/badserver.pem | 35 +++++++++++++---------- src/core/tsi/test_creds/ca.key | 40 +++++++++++++++++---------- src/core/tsi/test_creds/ca.pem | 31 ++++++++++++--------- src/core/tsi/test_creds/client.key | 40 +++++++++++++++++---------- src/core/tsi/test_creds/client.pem | 30 ++++++++++++-------- src/core/tsi/test_creds/server0.key | 40 +++++++++++++++++---------- src/core/tsi/test_creds/server0.pem | 30 ++++++++++++-------- src/core/tsi/test_creds/server1.key | 40 +++++++++++++++++---------- src/core/tsi/test_creds/server1.pem | 34 +++++++++++++---------- 13 files changed, 288 insertions(+), 176 deletions(-) diff --git a/src/core/tsi/test_creds/README b/src/core/tsi/test_creds/README index eb8482d648f..ab0d851a18b 100644 --- a/src/core/tsi/test_creds/README +++ b/src/core/tsi/test_creds/README @@ -6,7 +6,7 @@ Bad credentials (badclient.* / badserver.*): These are self-signed certificates: -$ openssl req -x509 -newkey rsa:1024 -keyout badserver.key -out badserver.pem \ +$ openssl req -x509 -newkey rsa:2048 -keyout badserver.key -out badserver.pem \ -days 3650 -nodes When prompted for certificate information, everything is default except the @@ -19,44 +19,51 @@ Valid test credentials: The ca is self-signed: ---------------------- -$ openssl req -x509 -new -newkey rsa:1024 -nodes -out ca.pem -config ca-openssl.cnf -days 3650 -extensions v3_req +$ openssl req -x509 -new -newkey rsa:2048 -nodes -keyout ca.key -out ca.pem \ + -config ca-openssl.cnf -days 3650 -extensions v3_req When prompted for certificate information, everything is default. client is issued by CA: ----------------------- -$ openssl genrsa -out client.key.rsa 1024 +$ openssl genrsa -out client.key.rsa 2048 $ openssl pkcs8 -topk8 -in client.key.rsa -out client.key -nocrypt -$ rm client.key.rsa $ openssl req -new -key client.key -out client.csr When prompted for certificate information, everything is default except the common name which is set to testclient. -$ openssl ca -in client.csr -out client.pem +$ openssl x509 -req -CA ca.pem -CAkey ca.key -CAcreateserial -in client.csr \ + -out client.pem -days 3650 server0 is issued by CA: ------------------------ -$ openssl genrsa -out server0.key.rsa 1024 +$ openssl genrsa -out server0.key.rsa 2048 $ openssl pkcs8 -topk8 -in server0.key.rsa -out server0.key -nocrypt -$ rm server0.key.rsa $ openssl req -new -key server0.key -out server0.csr When prompted for certificate information, everything is default except the common name which is set to *.test.google.com.au. -$ openssl ca -in server0.csr -out server0.pem +$ openssl x509 -req -CA ca.pem -CAkey ca.key -CAcreateserial -in server0.csr \ + -out server0.pem -days 3650 server1 is issued by CA with a special config for subject alternative names: ---------------------------------------------------------------------------- -$ openssl genrsa -out server1.key.rsa 1024 +$ openssl genrsa -out server1.key.rsa 2048 $ openssl pkcs8 -topk8 -in server1.key.rsa -out server1.key -nocrypt -$ rm server1.key.rsa $ openssl req -new -key server1.key -out server1.csr -config server1-openssl.cnf When prompted for certificate information, everything is default except the common name which is set to *.test.google.com. -$ openssl ca -in server1.csr -out server1.pem +$ openssl x509 -req -CA ca.pem -CAkey ca.key -CAcreateserial -in server1.csr \ + -out server1.pem -extensions req_ext -extfile server1-openssl.cnf -days 3650 + +Clean up: +--------- +$ rm *.rsa +$ rm *.csr +$ rm ca.srl diff --git a/src/core/tsi/test_creds/badclient.key b/src/core/tsi/test_creds/badclient.key index 5832685122a..6cd102b8308 100644 --- a/src/core/tsi/test_creds/badclient.key +++ b/src/core/tsi/test_creds/badclient.key @@ -1,16 +1,28 @@ -----BEGIN PRIVATE KEY----- -MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBALJfYnFn4nkj52WF -E5W2qUxCfjsEFyuXYYKS/07UPWsv3gpZhtjXgdeGL+dpwEBC0IRDBfGnkMp6YY5S -O7rnEz0X3r/fvgYy+dEl2jnaA6zgc7RzMGl9U11d56gP9FiDC2190mvP/hpq2xLZ -CTbIximpmaoQyxuuH1bbYunesIG/AgMBAAECgYAdqJCEzMIyZE7oaW0tOpcB0BiP -FYoIvH4BKRH8eHvR476mt+YdDhBP1scGUmYeCT4Ej+RgHv2LPTgVYwT9eciP2+E/ -CBCNRel0Sw9JepwW0r+jWJtDY1pp6YXAgNRGX2UflvUsT+o9lZvagf9moLTMyGvU -uLFnsyfLim1B4vXvWQJBANouZllXGZoSrZLtR3VgV4tzRQvJxu84kLeIk64Ov47X -pHVBMTRBfzPEhbBodjr1m5OLaVLqkFcXftzRCrbWoKsCQQDRSoLLXOiLrtJ3DLJC -rX7Y8wrHZrqk5bMdZLGa/UX8RanhVw3+Xp+urd1711umeNJfzu/MCk4a1KkG/CU0 -rqs9AkA4cSx1DD1JSG+yxMNpsAS1xJomFIrsM9vsPt7FdndDwrF+y+CovhDkGYDk -RAHh+svGfZg/pQK2JRPimAmHhzqFAkEAu6Ya70s2FUeB3Mu9aJs2CD6hg3dQEVkB -53DI7TX48d9kGW58VX1xnqS02LyWqAPcW5qm1kLHFLdndaPNmBaj4QJBAJugl367 -9d9t/QLTSuULLaoYv2vJT3s1y9HN89EoaDDEkPVfQu6GVEXgIBtim1sI/VPSzI8H -aXvaTUwblFWSM70= +MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDvdzKDTYvRgjBO +UOrzDwkAZGwNFHHlMYyMGI5tItj3tCzXkbpM0uz3ZjHVahu+eYc+KvYApM64F2dB +b16hs713FCk8mihYABjnSndrQsl/U2v8YFT7DipfLReqqaOGu2o9HdvWfiUlaiC/ +UGGfR+YblpK7CG+7/hvTXtUsMw+OppoeH9z87rhOJMxtiC7XwU5rhEmab/1f1XM/ +nLoZrfDAcTbDywoeu826SJ3mifajq7oK3LDdNLjWZwfEsCO1qp2C4gLvBlOOKsWO +LNby6ByxCOPlCTa0UCaVuoNclYol71jyi17KW+Nk0nNe9yaVcyr6H0z3bImfJhbS +u4rzI93nAgMBAAECggEBAOIPOJRTpGaH7GpCYUpLK0g/hPFkF5EyEWg/1lSYzRIp ++RsX6zOS+zkiNHEv1jkeKNo7XDiHXM7U6RkQtdkZAQdk9PjM3sEUdm4CEnIjfmzA +p/R8TD0kxkNLIkhuFH2gd05y3ZHDS/XiFkAE9eOT0FrC7om6ESD7ZfFIWR18pncW +ZGq7tFAZZRmpkum2D+MJy1gWxIXBxt5madTEpRxQd56toEnfx372F0y4zkcX3pnE +4H6FaJUBjdvKl2QzF5c0jBqgxMRvWP5YfNu8+dmaQORPkpzSptOPmZM9VKV+tJVS +1xnOI6DtrnNZRojegR/E6KhNyiPTYy97UgYzdKS+SSECgYEA+wgSIqrfkeqqotJx +cGxF4x9v/ldKr5hlhJNoKXLkepkcrvhhxfHKgjWz1nZY/+Rpg42GFMvxWRrGTMIJ +ddiOr24p0HCkusWRMKQL7XxvuHDq0ro8SGqXzqWGuH31R+YNP8dy2pqd3OlwzTgg +8v0wwzx8AuyP5Ys4M20Ewv7Xuy0CgYEA9DSGMU8jmjxJ/uPDCXWOEAqtE78wTtIw +uMBv+ge0inc37xf+fN6D/ziTrJvgw/XyT15pmQdOlXx3Sg1h9XBZeIlaeCdFWrFB +oYrVsiuoXRswfkFwA0yOkCsHyGiI4TE0W1rGbqP158IjwXPczBswWI7i/D6LpINL +BD7YYpfHmeMCgYB08AiKr7Cf54H/gSqo5TcVGzLvdzhqXgKEZKp0DHpUhfivpTLe +o8jjKSMSN2U0JvHj/0xDadGO4YMYhJcll3C4VggSejaybpA46WJJCdt9PtSUv36P +eWAoOkFstfhJuufXGxDstnPtUa1jW881gi5x9D4MmqhZlKXkhtdeApr6LQKBgQDd +ItsJt9JTjpirGfC5lhwI5sIICa9jEO9RveEoluWkJYUfG6k1xgHdkYwYWCdXDFZa +DPKuwnEk6MrU4f181joO7sJf35/sGmuGL0SHzQTvGvn0uqkGM8M9RdoMXqzkzzvM +Jg1ej1bUgXcDbTnaEhzbdLiTFsg5NzMtKwOjdDIpZQKBgEIHeJIqiGjYgf7mUlX2 +vNWgFNlzApkFSCQ8TkzkDOjtCdSHfdRDJ6+q8cS2TSQ7QPoAlI1woS0G48TNbVSo +wD0jNVRTdpA6R5FPsg09ohB/caSn0zlGVha2GS08ceYrn7nn4PSZ/UIYTm3pjUlV +H5tvHv0gG2C5vy3tIYQtSQCk -----END PRIVATE KEY----- diff --git a/src/core/tsi/test_creds/badclient.pem b/src/core/tsi/test_creds/badclient.pem index 1785970221f..345da3932d9 100644 --- a/src/core/tsi/test_creds/badclient.pem +++ b/src/core/tsi/test_creds/badclient.pem @@ -1,17 +1,22 @@ -----BEGIN CERTIFICATE----- -MIICoDCCAgmgAwIBAgIJANIz2/zoRiapMA0GCSqGSIb3DQEBBQUAMGkxCzAJBgNV -BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX -aWRnaXRzIFB0eSBMdGQxIjAgBgNVBAMMGWJhZGNsaWVudC50ZXN0Lmdvb2dsZS5j -b20wHhcNMTQwNzI4MjAwODI1WhcNMjQwNzI1MjAwODI1WjBpMQswCQYDVQQGEwJB -VTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0 -cyBQdHkgTHRkMSIwIAYDVQQDDBliYWRjbGllbnQudGVzdC5nb29nbGUuY29tMIGf -MA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyX2JxZ+J5I+dlhROVtqlMQn47BBcr -l2GCkv9O1D1rL94KWYbY14HXhi/nacBAQtCEQwXxp5DKemGOUju65xM9F96/374G -MvnRJdo52gOs4HO0czBpfVNdXeeoD/RYgwttfdJrz/4aatsS2Qk2yMYpqZmqEMsb -rh9W22Lp3rCBvwIDAQABo1AwTjAdBgNVHQ4EFgQU523AJMR8Ds9V8fhf7gu1i0MM -UqAwHwYDVR0jBBgwFoAU523AJMR8Ds9V8fhf7gu1i0MMUqAwDAYDVR0TBAUwAwEB -/zANBgkqhkiG9w0BAQUFAAOBgQCI/tvSBYH1iyfLaCTBKwpdj36+MkR9EeJJmImx -X+bjhKWXwsBX4PDMWvdusr++QGUYtyoya+hfYMXRhXua39mD54xgloQNuu9REDwX -Ffto+aOw3BcYducz6ofxicFK/Y2VeXDurSMpRv5TfGf2Qr6eOOdaRhj6ed7BibHk -X1VGZA== +MIIDszCCApugAwIBAgIUONWbkUn1obHCw9L7lMNEE5REvb8wDQYJKoZIhvcNAQEL +BQAwaTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM +GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEiMCAGA1UEAwwZYmFkY2xpZW50LnRl +c3QuZ29vZ2xlLmNvbTAeFw0yMDAzMTcxNzQzMjNaFw0zMDAzMTUxNzQzMjNaMGkx +CzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRl +cm5ldCBXaWRnaXRzIFB0eSBMdGQxIjAgBgNVBAMMGWJhZGNsaWVudC50ZXN0Lmdv +b2dsZS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDvdzKDTYvR +gjBOUOrzDwkAZGwNFHHlMYyMGI5tItj3tCzXkbpM0uz3ZjHVahu+eYc+KvYApM64 +F2dBb16hs713FCk8mihYABjnSndrQsl/U2v8YFT7DipfLReqqaOGu2o9HdvWfiUl +aiC/UGGfR+YblpK7CG+7/hvTXtUsMw+OppoeH9z87rhOJMxtiC7XwU5rhEmab/1f +1XM/nLoZrfDAcTbDywoeu826SJ3mifajq7oK3LDdNLjWZwfEsCO1qp2C4gLvBlOO +KsWOLNby6ByxCOPlCTa0UCaVuoNclYol71jyi17KW+Nk0nNe9yaVcyr6H0z3bImf +JhbSu4rzI93nAgMBAAGjUzBRMB0GA1UdDgQWBBTKJskEYd2ndrwihPTg2PzYF/kP +gzAfBgNVHSMEGDAWgBTKJskEYd2ndrwihPTg2PzYF/kPgzAPBgNVHRMBAf8EBTAD +AQH/MA0GCSqGSIb3DQEBCwUAA4IBAQBoGwWR0pLM1icX4bIJ6yduFU/A4jSiqET6 +gvJhwgErilqTKfH6Y89rqtzW8k4UurAOCsE4FA6wbkHWwrUMnClY4lkHJh+MuNaJ +nCGrK8wRKGb/mqW9d5pP72Et1Q6OW6DAKqGfjDWh2MzSPHBxcCLeyigO1wqd4W1T +nvvql6l4L+B5IT/c+/EHO3PwbI9v6MGTtLjsZgkRKItaPh+YeJdmBYhRD1BvWb6s +VwEb7aQ1oSF+esUvMmjGVuHXuQvWJahnjYdYT2DikyqR+AwaKzre4GJMHsX3/Cf8 +qdxyI+B1jUwNr7sLA2EYDjnUR0jEHcrOBSpIQyRMGWduj0P16yb9 -----END CERTIFICATE----- diff --git a/src/core/tsi/test_creds/badserver.key b/src/core/tsi/test_creds/badserver.key index abfbde10ff6..1f5a31666cb 100644 --- a/src/core/tsi/test_creds/badserver.key +++ b/src/core/tsi/test_creds/badserver.key @@ -1,16 +1,28 @@ -----BEGIN PRIVATE KEY----- -MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAKeZ1e1y29cmBKaW -oIUwJ5neOJUjx+eD/3nRPe+dvLXEd9+db0fG5RYRR0S3mF1Ywuj4PIxlTW2YprUS -oGSw+tcqWNIzxv94HjwYFkkvER3AblXcDBh0P2zAkzg+nf9AcAsMh0QpDTyrXtMl -gqryjq1/vkhFofKMMbY+aXJdG6OBAgMBAAECgYAAgaB51S0A22aMMkxN2rVj6530 -JWWHN4jgD1fGj41wZyWNkWYyq1Ep3ed/N6bIMWp1VbqpGe0/9YQba/D8HOTFHGRt -72YXnP1e/ds8cxU4x4j1vvqSPtXpMmkiXfXijOvCl9mrMH2xjghFAt6/1Nb9xo1m -VdcOB8OdSuOIw6CI+QJBAN5FZUbS+bRXDWII/FaAih1DBpwCxhYEN+TXPJBxSen6 -kOzGt5g+mB6YqRMZ/qshshwPq7bsgFGfJ2lIdS2t3GsCQQDBCKifV5AAkOdOUrkK -HvoX3qnVmyIA8CyvWLcIWpfZ76QAYh0q0StedKdOMXaB1jTeSJ2KU1nlss7UD1Yw -VbrDAkAwjMHpbW3jiVw//Kx5jIwehiRscWKpLnSzBJyTBFvbwsJjJai2lX2OuVO8 -+2GYKb0Iyhd81j3VFkl6grwtpRtPAkB7+n+yt555fpfRKjhGU9b09cHGu7h/OcK5 -bBVCfE0DYHLI/DsXgPiF1g6Onh4rDdUu3xyv9xDKAqnscV099hHZAkEAvcFBfXZs -tk18N+bUcvXTdZjzZbfLCHlJmwPIspZ8G/6Pn63deg4GVYoCvTwGruah+8y734Ph -7PskfPgUQlB7Ag== +MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDRY2Z886nT6KF4 +tjgJTX0l1M4j8bQp+jKfXz+hwUZbn/PnCXJlu/5denpyu4XrLxr6Ix4Il97SrKfQ +iGaSZQ8hcq6WQdEDfuo/U7R/dk6lYG7q+yg7+xHm02DzVdPLp09kLhU+fWH3Wek0 +9GCk9iC1/sVTIomBYpar61Ris04iA1QveR+LZKNkQ8rL2i191Djs8cdrn9yhWdfJ +Ai89lLl6S6d8cXru1LwtEe0ejctnKf6ANqMnmyWTbHV8h0Cc3fbAnx92HsWDMJKe +8mI0CClauxrlagMHyw10NuFb9/MBEkFPJfxcUyW6F45LmqGHVfcxx6/BU7XRbWx8 +aQM/pt2LAgMBAAECggEBAKWpei3D7op9FDvYF0+s4iXrT0j682r+y8xx5HtK2iql +y6fwPnUlHqPAwl5B5TtkonhjDmEIH0AZYBBJyrVqhWUWQfEZk4+rexOtWzI5XRHU +0QzSt0t1Yf15IcyEDDSlY9fD6gTt2HOFzE+cRVZecRTsxBv5SEd4w/KzFqmcaWXY +Q7mLvCs6eQ55LBQ6EMweZ3XE57qPf71oV8Ckxv/jstLlkE+3JICgEAaiOEzi7oCm +hYbkoU2VNewx5EA5ka52DQzbVYYYuDbjqtVPXCmlVdejBBmUCAlhdjAIDBYq/RMf +sVMagAo19Wt5lYuNGD9qzMUmzZPaVmkg4yUmU8EYFVkCgYEA8Tyup/0yx+/tp8KQ +cLyGc4RDUTfabL8mlvxcbEge9fQ12aHE3cA/hkHCI7AZxwrHYwb1hxzLaOmKYfFC +oLxfzx81p5BO0lQWcKiFZ6ISiku4TPdmBaauKKxd62kFUPO4Q6Zk1MFHMXrvZUxZ +BsK058HZ5JALDdQ5wBfJE5P58rcCgYEA3jPDMiXsH1s5gM/bh0s+cC1AFSst6YM3 +rRPmHrqJJhKgU6gSB0d0LCUdj4/NkQT/Bw8DrfxLIqytsfRLKCx85K6lk8GfCk6T +1OhPKRp8bgg6WDQiJfJMokJN5zrnC02ns1cVdQSPY8bFxB++tv3du6DKLYx0e46D +Q9ojYqWHh80CgYEA0Shh7nkTrFKUZZ3GClkK4eFNVH/uu9bIKKTJpYCqh2mjvvwJ +apKjAU7GepbW4sKvuWZxPyJyIpZKSz0ZHa/2CejvZkcycB5EDo2ujPnyxUF9nA3s +wP2RhuZb0B4QY+3MV6tPRUAG8Bm8ssGNdtUecMqclxVk4Cqfn7N/vZ/RWOUCgYAL +i2rv1xKOioHRVHtWay1iTKeQsf6frEafQnJpVE294afc0NWm9SpvBLqlc9Y9W6IY +bspFJt+MfKZFoaip/K28f+pwY9XshiqeHDfIreybFuhZHtRLXmxm3cUIZ4ILj0xQ +QA0IWGVOzMwHpZKWFViI4BDBDxQaO0xMoS/Hd0w0XQKBgF5uZXXrNLmCeU6oco1R +gjGJE4gRwaSVcVJbs/VLbBmHT1VhBGsiluBuTpbmzDfyHWHJprnthlSTgqHXSax1 +6GvHZ2NHBqmD2uxEGuwBffzhwWVxHpgSrRgvnnaeIph2Iv92/ATN5LCc5vF+SNGx +2kKWYTDSRu9q1xHpXcax+nmJ -----END PRIVATE KEY----- diff --git a/src/core/tsi/test_creds/badserver.pem b/src/core/tsi/test_creds/badserver.pem index 983c979f312..217dd640eba 100644 --- a/src/core/tsi/test_creds/badserver.pem +++ b/src/core/tsi/test_creds/badserver.pem @@ -1,17 +1,22 @@ -----BEGIN CERTIFICATE----- -MIICoDCCAgmgAwIBAgIJAPdqwqsKNy81MA0GCSqGSIb3DQEBBQUAMGkxCzAJBgNV -BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX -aWRnaXRzIFB0eSBMdGQxIjAgBgNVBAMMGWJhZHNlcnZlci50ZXN0Lmdvb2dsZS5j -b20wHhcNMTQwNzI4MjAwODU0WhcNMjQwNzI1MjAwODU0WjBpMQswCQYDVQQGEwJB -VTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0 -cyBQdHkgTHRkMSIwIAYDVQQDDBliYWRzZXJ2ZXIudGVzdC5nb29nbGUuY29tMIGf -MA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCnmdXtctvXJgSmlqCFMCeZ3jiVI8fn -g/950T3vnby1xHffnW9HxuUWEUdEt5hdWMLo+DyMZU1tmKa1EqBksPrXKljSM8b/ -eB48GBZJLxEdwG5V3AwYdD9swJM4Pp3/QHALDIdEKQ08q17TJYKq8o6tf75IRaHy -jDG2PmlyXRujgQIDAQABo1AwTjAdBgNVHQ4EFgQU3u/qvHr9knMBeZyAD7mAA/ec -8cUwHwYDVR0jBBgwFoAU3u/qvHr9knMBeZyAD7mAA/ec8cUwDAYDVR0TBAUwAwEB -/zANBgkqhkiG9w0BAQUFAAOBgQA/FmR1SGLguxCCfhp4CYCbrAePSyPWDi48gTwj -vVZf/OMxdVu/H8sBYFf27BjbrEugAw16DElFtgTZ83pLb2BvkUgb6vBUK5sEkgmh -z88zBsgDp8aCf4STDOLFZMBh/E9ZKkm1zogbEmlTjFp/ceSpa2gNv7OuN4WiorOh -Wvw40g== +MIIDszCCApugAwIBAgIULEum14ranwlUZjuZchSWaHtj8Z4wDQYJKoZIhvcNAQEL +BQAwaTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM +GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEiMCAGA1UEAwwZYmFkc2VydmVyLnRl +c3QuZ29vZ2xlLmNvbTAeFw0yMDAzMTcxNzE5NTRaFw0zMDAzMTUxNzE5NTRaMGkx +CzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRl +cm5ldCBXaWRnaXRzIFB0eSBMdGQxIjAgBgNVBAMMGWJhZHNlcnZlci50ZXN0Lmdv +b2dsZS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDRY2Z886nT +6KF4tjgJTX0l1M4j8bQp+jKfXz+hwUZbn/PnCXJlu/5denpyu4XrLxr6Ix4Il97S +rKfQiGaSZQ8hcq6WQdEDfuo/U7R/dk6lYG7q+yg7+xHm02DzVdPLp09kLhU+fWH3 +Wek09GCk9iC1/sVTIomBYpar61Ris04iA1QveR+LZKNkQ8rL2i191Djs8cdrn9yh +WdfJAi89lLl6S6d8cXru1LwtEe0ejctnKf6ANqMnmyWTbHV8h0Cc3fbAnx92HsWD +MJKe8mI0CClauxrlagMHyw10NuFb9/MBEkFPJfxcUyW6F45LmqGHVfcxx6/BU7XR +bWx8aQM/pt2LAgMBAAGjUzBRMB0GA1UdDgQWBBTYP9Av5QoPxsDRE33wQedENOke +wDAfBgNVHSMEGDAWgBTYP9Av5QoPxsDRE33wQedENOkewDAPBgNVHRMBAf8EBTAD +AQH/MA0GCSqGSIb3DQEBCwUAA4IBAQCXA/Ewb5laDDxJi4YJxnmqQsb4WSsm65Hj +MX21Ii2vzf4XZ+i8c9xBezCae85Bkhtb/oMC/V15DshjVkkJNmdQfAlYD1NASSrN +hTaiQ4AfXWjO7H8o2B/rneZtA21NDCwvFxTXeJzAVnBkpIePR//KmuHjtCMjsrtP +ovckcTRGmhWJJ9sRx4HCsJXygBvnCIIIYC585aU4+nE53UDNT2T+Bd4b1vPmwf9R +9XgbyN6AhQ+0F11zlnftwsJ23nbnXqX/fpG/YZuhnPwaUILRodc6HZQtf/8xpRcA +0dKMdnL2YtBjuL5QFJMLT0mdsmnXj3h/oK8894nYBZYSmlb3bzZK -----END CERTIFICATE----- diff --git a/src/core/tsi/test_creds/ca.key b/src/core/tsi/test_creds/ca.key index 03c4f950e38..03be0bfa6ee 100644 --- a/src/core/tsi/test_creds/ca.key +++ b/src/core/tsi/test_creds/ca.key @@ -1,16 +1,28 @@ -----BEGIN PRIVATE KEY----- -MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAMBA3wVeTGHZR1Ry -e/i+J8a2cu5gXwFV6TnObzGM7bLFCO5i9v4mLo4iFzPsHmWDUxKS3Y8iXbu0eYBl -LoNY0lSvxDx33O+DuwMmVN+DzSD+Eod9zfvwOWHsazYCZT2PhNxnVWIuJXViY4JA -HUGodjx+QAi6yCAurUZGvYXGgZSBAgMBAAECgYAxRi8i9BlFlufGSBVoGmydbJOm -bwLKl9dP3o33ODSP9hok5y6A0w5plWk3AJSF1hPLleK9VcSKYGYnt0clmPVHF35g -bx2rVK8dOT0mn7rz9Zr70jcSz1ETA2QonHZ+Y+niLmcic9At6hRtWiewblUmyFQm -GwggIzi7LOyEUHrEcQJBAOXxyQvnLvtKzXiqcsW/K6rExqVJVk+KF0fzzVyMzTJx -HRBxUVgvGdEJT7j+7P2kcTyafve0BBzDSPIaDyiJ+Y0CQQDWCb7jASFSbu5M3Zcd -Gkr4ZKN1XO3VLQX10b22bQYdF45hrTN2tnzRvVUR4q86VVnXmiGiTqmLkXcA2WWf -pHfFAkAhv9olUBo6MeF0i3frBEMRfm41hk0PwZHnMqZ6pgPcGnQMnMU2rzsXzkkQ -OwJnvAIOxhJKovZTjmofdqmw5odlAkBYVUdRWjsNUTjJwj3GRf6gyq/nFMYWz3EB -RWFdM1ttkDYzu45ctO2IhfHg4sPceDMO1s6AtKQmNI9/azkUjITdAkApNa9yFRzc -TBaDNPd5KVd58LVIzoPQ6i7uMHteLXJUWqSroji6S3s4gKMFJ/dO+ZXIlgQgfJJJ -ZDL4cdrdkeoM +MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCwYvShd+UXQvOg +z4GH6pRT3KGrPDbDw45fma7+I0LJQ4GupoeLuYYfHvcYPTV2I3MLO+VxCp00gfo1 +BIvsNOkGNxrrqNhP27ve9l7YwOuvWdVu4u9+73znRx3GJQ4ie/nF/z6xMcbQL5r5 +UC8yGwuJGOyr6VcpEnKTnORtuwRPJuqnGgn4rsKhLLfJz+RAhjdOKnAS3CQo/iHP +KjoqIZ38M97GJ7icFQic3dtLUFR41nnN5ogLZ6DduR55btypPnlv5h6foLFjRMST +MEroAq39ZSJqUoyBPTBtPFFk7uRQIfdKrp7/Bd4V0n4e91Us+UCDlOcxo2lF1CKH +/ydEWmx3AgMBAAECggEAKrDosKQKKKUlvkg6+6CFIf8GiiFax+ru7KiPuCbkpT3X +h2P67pCKq8Gc4Jr/84YE9DUdBU0iW3ESE/7ztsnflIeF1n/ZSwrN39sVfbTD1n8R +r3LxsHFac8e8pxaU4zfKbmemztBTZFQBWFJV+fSdyCLmNX2WgPRcEuooR366PkWv +xZLAxeDGqpnsa62o1GdGmalxx8aljLN/QcbQi73mR9Osim1OtSd1cyDlZ/8x6OoV +Ae5GDN3Bj0hO9ZKzNWTbQpRw9SHKU6sWXtHlcDx4xi5kN/n9aptn7kixbY9y8uOM +5zjErVGWvxdP94IvlSkrkenwnIjlHBtdlAjVuCFioQKBgQDoJLyfHNWPBnjPGVnK +xcbIIwmf4C9UnZBbHRD3YxU/GBpsPgPh9EwhQTAXlGQGHeuslxCIh4cEfbOIrJ9b +/s3OqeL9CSUaz/N+1av1ZuwOI9CEvNPi51IK+rXNRmVJG8pG6RaKNx57pXaFtmqq +FUtC7twbPECvjspapn61nZYSiQKBgQDCg1tpGwZJJOCIkhYH4wFc4j4p0LxIcBJ2 +E3L9VnQ+APT/x8uitkZsuRY9tmWcHK8/zWTc1GpFdwGUJ9+Yzvprtej+P/buxM9J +Y6ZJZdCIHWDuh3eq+sXS4lwr5fi7ir5m97npG1bXPlOoYIJ7p172EyoNmurRIgiP +LWnzK0jG/wKBgQCRQtOouNFFcyZLaTCPutxdRddy7ESRrRq0eOax9pVH6tw12URy +snyk3naqepdwYG6li82zsSKig8nA/0uktDeyVwoLjhpiwbc7KZc1sxaI7o4/US1B +McBb0G/MqH0elz4myxnomP8BHhOhLflmvnZexrqCbFyJvk8PFFn7aUWMCQKBgDvX +9BCzOszYJqh94X9NrQapqJxu1u6mZFelhjRBHARTgQ0MqC8IS0R58UjNTBeqj5Re +mdCDHar/gSHW3qkBzPPEhMlsXol5TZjzqp5cT7sA5uicDwowmxpVgCwVVeBFQG0n +fDAmtCIGz/A2uQ5YIRQuMzr6VZJAGUgLndQtlfd7AoGBAMq1imggFKd1rt49XCnO +t97lpWOT+TlWYblHr01tOw+esawG5MFucqVI6tGpBSccTRQw6orWf4GK3KmkgQ6J +UgHKjwYsA0sf4U5vppkdkbAbM/WwUPOTQpGFRERyJqMqFGIc4wMtZOJBxXwf+9iD +l8tvan8w/6HugqnI7qqkTgLq -----END PRIVATE KEY----- diff --git a/src/core/tsi/test_creds/ca.pem b/src/core/tsi/test_creds/ca.pem index 6c8511a73c6..49d39cd8ed5 100644 --- a/src/core/tsi/test_creds/ca.pem +++ b/src/core/tsi/test_creds/ca.pem @@ -1,15 +1,20 @@ -----BEGIN CERTIFICATE----- -MIICSjCCAbOgAwIBAgIJAJHGGR4dGioHMA0GCSqGSIb3DQEBCwUAMFYxCzAJBgNV -BAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBX -aWRnaXRzIFB0eSBMdGQxDzANBgNVBAMTBnRlc3RjYTAeFw0xNDExMTEyMjMxMjla -Fw0yNDExMDgyMjMxMjlaMFYxCzAJBgNVBAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0 -YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQxDzANBgNVBAMT -BnRlc3RjYTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwEDfBV5MYdlHVHJ7 -+L4nxrZy7mBfAVXpOc5vMYztssUI7mL2/iYujiIXM+weZYNTEpLdjyJdu7R5gGUu -g1jSVK/EPHfc74O7AyZU34PNIP4Sh33N+/A5YexrNgJlPY+E3GdVYi4ldWJjgkAd -Qah2PH5ACLrIIC6tRka9hcaBlIECAwEAAaMgMB4wDAYDVR0TBAUwAwEB/zAOBgNV -HQ8BAf8EBAMCAgQwDQYJKoZIhvcNAQELBQADgYEAHzC7jdYlzAVmddi/gdAeKPau -sPBG/C2HCWqHzpCUHcKuvMzDVkY/MP2o6JIW2DBbY64bO/FceExhjcykgaYtCH/m -oIU63+CFOTtR7otyQAWHqXa7q4SbCDlG7DyRFxqG0txPtGvy12lgldA2+RgcigQG -Dfcog5wrJytaQ6UA0wE= +MIIDWjCCAkKgAwIBAgIUWrP0VvHcy+LP6UuYNtiL9gBhD5owDQYJKoZIhvcNAQEL +BQAwVjELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM +GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEPMA0GA1UEAwwGdGVzdGNhMB4XDTIw +MDMxNzE4NTk1MVoXDTMwMDMxNTE4NTk1MVowVjELMAkGA1UEBhMCQVUxEzARBgNV +BAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0 +ZDEPMA0GA1UEAwwGdGVzdGNhMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAsGL0oXflF0LzoM+Bh+qUU9yhqzw2w8OOX5mu/iNCyUOBrqaHi7mGHx73GD01 +diNzCzvlcQqdNIH6NQSL7DTpBjca66jYT9u73vZe2MDrr1nVbuLvfu9850cdxiUO +Inv5xf8+sTHG0C+a+VAvMhsLiRjsq+lXKRJyk5zkbbsETybqpxoJ+K7CoSy3yc/k +QIY3TipwEtwkKP4hzyo6KiGd/DPexie4nBUInN3bS1BUeNZ5zeaIC2eg3bkeeW7c +qT55b+Yen6CxY0TEkzBK6AKt/WUialKMgT0wbTxRZO7kUCH3Sq6e/wXeFdJ+HvdV +LPlAg5TnMaNpRdQih/8nRFpsdwIDAQABoyAwHjAMBgNVHRMEBTADAQH/MA4GA1Ud +DwEB/wQEAwICBDANBgkqhkiG9w0BAQsFAAOCAQEAkTrKZjBrJXHps/HrjNCFPb5a +THuGPCSsepe1wkKdSp1h4HGRpLoCgcLysCJ5hZhRpHkRihhef+rFHEe60UePQO3S +CVTtdJB4CYWpcNyXOdqefrbJW5QNljxgi6Fhvs7JJkBqdXIkWXtFk2eRgOIP2Eo9 +/OHQHlYnwZFrk6sp4wPyR+A95S0toZBcyDVz7u+hOW0pGK3wviOe9lvRgj/H3Pwt +bewb0l+MhRig0/DVHamyVxrDRbqInU1/GTNCwcZkXKYFWSf92U+kIcTth24Q1gcw +eZiLl5FfrWokUNytFElXob0V0a5/kbhiLc3yWmvWqHTpqCALbVyF+rKJo2f5Kw== -----END CERTIFICATE----- diff --git a/src/core/tsi/test_creds/client.key b/src/core/tsi/test_creds/client.key index f48d0735d99..349b40033dd 100644 --- a/src/core/tsi/test_creds/client.key +++ b/src/core/tsi/test_creds/client.key @@ -1,16 +1,28 @@ -----BEGIN PRIVATE KEY----- -MIICeQIBADANBgkqhkiG9w0BAQEFAASCAmMwggJfAgEAAoGBAOxUR9uhvhbeVUIM -s5WbH0px0mehl2+6sZpNjzvE2KimZpHzMJHukVH0Ffkvhs0b8+S5Ut9VNUAqd3IM -JCCAEGtRNoQhM1t9Yr2zAckSvbRacp+FL/Cj9eDmyo00KsVGaeefA4Dh4OW+ZhkT -NKcldXqkSuj1sEf244JZYuqZp6/tAgMBAAECgYEAi2NSVqpZMafE5YYUTcMGe6QS -k2jtpsqYgggI2RnLJ/2tNZwYI5pwP8QVSbnMaiF4gokD5hGdrNDfTnb2v+yIwYEH -0w8+oG7Z81KodsiZSIDJfTGsAZhVNwOz9y0VD8BBZZ1/274Zh52AUKLjZS/ZwIbS -W2ywya855dPnH/wj+0ECQQD9X8D920kByTNHhBG18biAEZ4pxs9f0OAG8333eVcI -w2lJDLsYDZrCB2ocgA3lUdozlzPC7YDYw8reg0tkiRY5AkEA7sdNzOeQsQRn7++5 -0bP9DtT/iON1gbfxRzCfCfXdoOtfQWIzTePWtURt9X/5D9NofI0Rg5W2oGy/MLe5 -/sXHVQJBAIup5XrJDkQywNZyAUU2ecn2bCWBFjwtqd+LBmuMciI9fOKsZtEKZrz/ -U0lkeMRoSwvXE8wmGLjjrAbdfohrXFkCQQDZEx/LtIl6JINJQiswVe0tWr6k+ASP -1WXoTm+HYpoF/XUvv9LccNF1IazFj34hwRQwhx7w/V52Ieb+p0jUMYGxAkEAjDhd -9pBO1fKXWiXzi9ZKfoyTNcUq3eBSVKwPG2nItg5ycXengjT5sgcWDnciIzW7BIVI -JiqOszq9GWESErAatg== +MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCyqYRp+DXVp72N +FbQH8hdhTZLycZXOlJhmMsrJmrjn2p7pI/8mTZ/0FC+SGWBGZV+ELiHrmCX5zfaI +Lr9Iuw7Ghr3Vzoefi8r62rLupVPNi/qdqyjWk2dECHC9Z3+Ag3KzKTyerXWjKcvy +KVmM0ZxE0RXhDW/RoQbqZsU2GKg1B2rhUU8KN0gVmKn0rJHOxzRVSYeYLYp5Yn7K +rtPJcKyo9aVuEr7dGANzpyF6lg/nYBWc+9SGwkoLdFvKvABYJMyrbNhHUQfv0fza +Z0P86dfTENrDxzALrzGnqcx3KTrwJjkZ/aSr1tyD0/tXvukRFiPxWBJhjHQ70GqT +FQY19RbhAgMBAAECggEAIL8JUhL4awyvpWhQ8xPgTSlWwbEn8BE0TacJnCILuhNM +BRdf8LlRk/8PKQwVpVF3TFbYSMI+U6b4hMVssfv3HVQc/083dHq+3XOwUCVlUstR +SAzTE2E5EDMr1stdh0SQhV4Nilfos9s5Uk1Z6IGSztoz1GgOErIc/mGPy/aA/hbr +fRWHvTp35+MbCJSvZuOeevX2iLs0dNzqdk6DiOWIH/BVGirVPtO6ykrkuTj1FWiN +hyZ3MBChShlNH2poNX46ntOc7nEus0qteOgxBK8lummFEtlehCA7hd/8xuvYlP0k +7aN684LCRDajmAGpoZO57NSDYQhAFGZeUZ93SMFucQKBgQDe7GGkzZFEiv91u1q9 +lgMy1h5dZjIZKgQaOarPC6wCQMUdqCf6cSLsAPr4T8EDoWsnY7dSnrTZ6YCIFL1T +idg8M3BQXipICCJkFORS76pKKZ0wMn3/NgkSepsmNct91WHr6okvx4tOaoRCtdzU +g7jt4Mr3sfLCiZtqTQyySdMUEwKBgQDNK+ZFKL0XhkWZP+PGKjWG8LWpPiK3d78/ +wYBFXzSTGlkr6FvRmYtZeNwXWRYLB4UxZ9At4hbJVEdi/2dITOz/sehVDyCAjjs3 +gycsc3UJqiZbcw5XKhI5TWBuWxkKENdbMSayogVbp2aSYoRblH764//t0ACmbfTW +KUQRQPB/uwKBgQC5QjjjfPL8w4cJkGoYpFKELO2PMR7xSrmeEc6hwlFwjeNCgjy3 +JM6g0y++rIj7O2qRkY0IXFxvvF3UuWedxTCu1xC/uYHp2ti506LsScB7YZoAM/YB +4iYn9Tx6xLoYGP0H0iGwU2SyBlNkHT8oXU+SYP5MWtYkVbeS3/VtNWz1gQKBgQCA +6Nk4kN0mH7YxEKRzSOfyzeDF4oV7kuB2FYUbkTL+TirC3K58JiYY5Egc31trOKFm +Jlz1xz0b6DkmKWTiV3r9OPHKJ8P7IeJxAZWmZzCdDuwkv0i+WW+z0zsIe3JjEavN +3zb6O7R0HtziksWoqMeTqZeO+wa9iw6vVKQw1wWEqwKBgFHfahFs0DZ5cUTpGpBt +F/AQG7ukgipB6N6AkB9kDbgCs1FLgd199MQrEncug5hfpq8QerbyMatmA+GXoGMb +7vztKEH85yzp4n02FNL6H7xL4VVILvyZHdolmiORJ4qT2hZnl8pEQ2TYuF4RlHUd +nSwXX+2o0J/nF85fm4AwWKAc -----END PRIVATE KEY----- diff --git a/src/core/tsi/test_creds/client.pem b/src/core/tsi/test_creds/client.pem index e332091019b..8815875f327 100644 --- a/src/core/tsi/test_creds/client.pem +++ b/src/core/tsi/test_creds/client.pem @@ -1,14 +1,20 @@ -----BEGIN CERTIFICATE----- -MIICHzCCAYgCAQEwDQYJKoZIhvcNAQEFBQAwVjELMAkGA1UEBhMCQVUxEzARBgNV -BAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0 -ZDEPMA0GA1UEAwwGdGVzdGNhMB4XDTE0MDcxNzIzNTYwMloXDTI0MDcxNDIzNTYw -MlowWjELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM -GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDETMBEGA1UEAwwKdGVzdGNsaWVudDCB -nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA7FRH26G+Ft5VQgyzlZsfSnHSZ6GX -b7qxmk2PO8TYqKZmkfMwke6RUfQV+S+GzRvz5LlS31U1QCp3cgwkIIAQa1E2hCEz -W31ivbMByRK9tFpyn4Uv8KP14ObKjTQqxUZp558DgOHg5b5mGRM0pyV1eqRK6PWw -R/bjglli6pmnr+0CAwEAATANBgkqhkiG9w0BAQUFAAOBgQAStSm5PM7ubROiKK6/ -T2FkKlhiTOx+Ryenm3Eio59emq+jXl+1nhPySX5G2PQzSR5vd1dIhwgZSR4Gyttk -tRZ57k/NI1brUW8joiEOMJA/Mr7H7asx7wIRYDE91Fs8GkKWd5LhoPAQj+qdG35C -OO+svdkmqH0KZo320ZUqdl2ooQ== +MIIDNzCCAh8CFGyX00RCepOv/qCJ1oVdTtY92U83MA0GCSqGSIb3DQEBCwUAMFYx +CzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRl +cm5ldCBXaWRnaXRzIFB0eSBMdGQxDzANBgNVBAMMBnRlc3RjYTAeFw0yMDAzMTgw +MTA2MTBaFw0zMDAzMTYwMTA2MTBaMFoxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApT +b21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQxEzAR +BgNVBAMMCnRlc3RjbGllbnQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQCyqYRp+DXVp72NFbQH8hdhTZLycZXOlJhmMsrJmrjn2p7pI/8mTZ/0FC+SGWBG +ZV+ELiHrmCX5zfaILr9Iuw7Ghr3Vzoefi8r62rLupVPNi/qdqyjWk2dECHC9Z3+A +g3KzKTyerXWjKcvyKVmM0ZxE0RXhDW/RoQbqZsU2GKg1B2rhUU8KN0gVmKn0rJHO +xzRVSYeYLYp5Yn7KrtPJcKyo9aVuEr7dGANzpyF6lg/nYBWc+9SGwkoLdFvKvABY +JMyrbNhHUQfv0fzaZ0P86dfTENrDxzALrzGnqcx3KTrwJjkZ/aSr1tyD0/tXvukR +FiPxWBJhjHQ70GqTFQY19RbhAgMBAAEwDQYJKoZIhvcNAQELBQADggEBAFXCewK8 +cWT+zWxXyGFnouFSBzTi0BMBJRrhsiNoiQxkqityJHWFExiQZie+7CA+EabXCQUB ++JwMSWM29j3mSw10DTfmC3rhheQqGxy304BZyUpdpvI2dt3p/mcsE7O+p4sQrSep +gijiDssKAfxTAmUM93N6+Q8yJK5immxlbeYfijoBvmkzyB/B+qNRPsx0n7aFGnfv +oWfkW296iPhWLiwknpC3xB6oK3vRbK4Zj1OaGb0grK7VN8EyhBix2xVF61i4dzCK +kMIpl7CUpw1Mb2z8q3F2bHBS7iF7g1Ccn5VGcO+aJ+6PWydaeqJ6VEBF0Nwv9woe +mL5AluNRLaqjZvE= -----END CERTIFICATE----- diff --git a/src/core/tsi/test_creds/server0.key b/src/core/tsi/test_creds/server0.key index add153c9aea..261097a87e3 100644 --- a/src/core/tsi/test_creds/server0.key +++ b/src/core/tsi/test_creds/server0.key @@ -1,16 +1,28 @@ -----BEGIN PRIVATE KEY----- -MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBANOmffupIGC8YDau -rOF4eKnHwPszgpkkhWzKsVxhNDBxCVYx4TEjG0XWIO0iyRXupZbUC+7N/8HnEVNa -8F1jYhng14Iiq99cNQbbnuHHhIztmpocrJTxmnhGzoAnRa1Tb+GnAuRoIHRA/V2c -VUE9tbikQugFx/SPgXAw6tfWB+YvAgMBAAECgYEAoEq9qzUBgoHoVEGiSPiWWe8g -5p6yUA1qx2QTQyWTAwT4z0DjjfVKmG99bFsl8+hTnJFnoCp/gnjflEOROwkjp5kG -m0drqOPx1jeipJjpXYTBu49h+WpZ1PF+KhVtxsIm3OOCvh67iWaKyyOVb5Og8aiR -jl6dn/TdG/dlGD8AfUECQQDuNMle6p0oU8amC6O9wIMBroxx2nFstzE6O35PLEzG -/tj0kxxn9Jp2TS9mGaLCzSuXmpjlF4+NOWiBPkrLC2TfAkEA43Xg7uEUkaJAz2/W -m1lIBTLt+4rIQY/2emh33bDcA+rv8rwwrMMIv17/xPx7bs49YqGG5xufD+Rwl6TL -qFXYsQJAPrOwagax1aKvwJeBw3oAQhoTKAkLIEXcdGqipe6QSzVcIIz0xjxxyEAr -AOIwoLxnBCISqwMXq2H4K0UdZPMb2wJAdhdYLY1L6YRMk6XjzImg25oidisKZweA -FvMv8DgHMj2CUAqmVrt3SivfLH1M9C09L3zfFhOAFHcsgX58gav4MQJBANSBnrHj -tIq4l8z79CPUIuu3QyeEh+XwY8s5qE5CNTck0U59lzp9NvENHbkx3KO896TTerko -+8bXHMLkJkHPXms= +MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCei9aKutDNg2mr +COICW4hT6+LVJfI5J6DZ3yqb6MBzbc//VeUj1OCX/vt5vvPm1Qb5XNk1MOIFPEW6 +t2/0Mhj2VbQfjDe/PhZRhwu4PBtuoJBDeBsKkdnxD0I+4G0XRbeTtUsGMGBgWSAd +qHMD2HnEhgydRw0krYjZp4a/HMCnZZ1WFamw1PCvQK6AuWSSk4iHGaYklXUaKd3r +Rlkujr7//ihcvqweJ+OdaTwXD8z4P0YfFe/bkWWpuqIZz1Or/nxiNBtvWKlI8pR2 +K3wkoWsW+6bnFN8u81nstHDardR6zy3B7QXke02q4sddUERcwNFyPqpscetMpnhg +lhjrmnAXAgMBAAECggEAA6pB5GUbLJUMHUsQRnOtPBto2/qLleynmEHDb2U7BbAV +LdbjfCeQpZLcZ10VsFFeXudZkhQ2NV7GUeGpseBymUcz6cLJCx+5Tlsr1y90huMp +UpX1MhJbEmqC4oc3nmEbNEvtlxAJOlD1IBpjxkP71KIwqnYZBK8KSdXIlKRqg7QZ +VUgjA08TmWlZSxnOt1hpt2ZVjTOn7973YoTb4D7SZydMuVjTkwv9YjPFZOZ/wIP4 +JTZczY/bJjEF7QBYL/wtir/vNJlxxi+FunJdoO3blhf8li5QU0iPd/YsyBFBBWfF +vD7QslaB7wQ8zyWxWpPLiWeD83XGE+7CY2+8EpG3AQKBgQDMK6N7jDQCq9F7n+5B +R8YPDMdINpcVsN8bIeEVKSxYE86oADQg/0jPUct+4liUS1dv0DUmUP1U0zbvupX7 +NxE+gI8KFwCyq8nqZ1guW9oO00ZAGo4Rn0TIeoHWVgsE2tDqBFeC2wWYle1AaZLx +ZtFH6Ya4Q3a4xvjkXXabhbBDlwKBgQDGyzuNCGT1Xa1DXKLzyKspahdm9r7QXifo +jjZkcmzwItC535MBbQMq5+THD+WUbWrZ/rJ8KaSsoGmnjaWguSG0WLFpH3UiGn1W +FOSG2UGc0mWyz2p/j97EuhK12fabzn8rkuiohiFXjJDYrAIulcM++0ar3q2LyqXr +gleBEHLHgQKBgEAt44j9rIe+bO44etOIdUjb0nTvvBR0cd18i910AN169HY5Ainx +NXj+FELBcejDuiuKvnpZ8RhOALHg7C54w/HqxYv9aRnBCIqni7+e3e/VF/sknc4K +S7vdTp0KlRIkmpFFZiDbKmopjte1mBxMHrNFRDT99/7jhO98NcFzh9HnAoGAMf62 +sVdlHJg8lO5dRPY4pae6zvhLMNgdLU1mvIhSgWogGD70F6202DuNu8pxsIx8DOsT +NEq80XVeXPcwqmUk5thPdeKlcLg8wUNr3cYRzEDVtsyXOhGSsuMhBX8VmEWskebW +gFuLUxtU6kkIG3MqsVI8icjs2HVUmRAktZ7PXwECgYA9V/zZe2DpP36gp63wRk6S +FI7bDbLPQCKah23mwp3WeP5T+/HmFFRrl0OCaDLwudTolqgPa47CV7JYa9LmJAPj +QBxcnL4CxjlaaS3V9kxVWOXabMEtwSUurELJwFKTEC/AFN9dR/nv4AzXInZznotG +7qDX8EhfjbFVJw4riAmlEw== -----END PRIVATE KEY----- diff --git a/src/core/tsi/test_creds/server0.pem b/src/core/tsi/test_creds/server0.pem index ade75d8563f..ab20787fa5b 100644 --- a/src/core/tsi/test_creds/server0.pem +++ b/src/core/tsi/test_creds/server0.pem @@ -1,14 +1,20 @@ -----BEGIN CERTIFICATE----- -MIICHDCCAYUCAQQwDQYJKoZIhvcNAQEFBQAwVjELMAkGA1UEBhMCQVUxEzARBgNV -BAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0 -ZDEPMA0GA1UEAwwGdGVzdGNhMB4XDTE0MDcyMjE3NTk0OVoXDTI0MDcxOTE3NTk0 -OVowVzELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxFDASBgNVBAoM -C0dvb2dsZSBJbmMuMR0wGwYDVQQDDBQqLnRlc3QuZ29vZ2xlLmNvbS5hdTCBnzAN -BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA06Z9+6kgYLxgNq6s4Xh4qcfA+zOCmSSF -bMqxXGE0MHEJVjHhMSMbRdYg7SLJFe6lltQL7s3/wecRU1rwXWNiGeDXgiKr31w1 -Btue4ceEjO2amhyslPGaeEbOgCdFrVNv4acC5GggdED9XZxVQT21uKRC6AXH9I+B -cDDq19YH5i8CAwEAATANBgkqhkiG9w0BAQUFAAOBgQBtfR5qXG9TTI8YcYh7sA4V -GeNoplp0x6p7OG0NLvbJqAkUnkvjIkk1m1R2AUHhbkxzx6G75JIOoNJcWrCzywBA -BIsaTdmnNysf/s1hQJuD3IHiVb+7Ji0jhttnJlYcMid4o0tJO/a2E9YUxR+9cg0i -obb+Ql3qsvKdWBC1dDLDLw== +MIIDQTCCAikCFGyX00RCepOv/qCJ1oVdTtY92U84MA0GCSqGSIb3DQEBCwUAMFYx +CzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRl +cm5ldCBXaWRnaXRzIFB0eSBMdGQxDzANBgNVBAMMBnRlc3RjYTAeFw0yMDAzMTgw +MTA3MzhaFw0zMDAzMTYwMTA3MzhaMGQxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApT +b21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQxHTAb +BgNVBAMMFCoudGVzdC5nb29nbGUuY29tLmF1MIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEAnovWirrQzYNpqwjiAluIU+vi1SXyOSeg2d8qm+jAc23P/1Xl +I9Tgl/77eb7z5tUG+VzZNTDiBTxFurdv9DIY9lW0H4w3vz4WUYcLuDwbbqCQQ3gb +CpHZ8Q9CPuBtF0W3k7VLBjBgYFkgHahzA9h5xIYMnUcNJK2I2aeGvxzAp2WdVhWp +sNTwr0CugLlkkpOIhxmmJJV1Gind60ZZLo6+//4oXL6sHifjnWk8Fw/M+D9GHxXv +25FlqbqiGc9Tq/58YjQbb1ipSPKUdit8JKFrFvum5xTfLvNZ7LRw2q3Ues8twe0F +5HtNquLHXVBEXMDRcj6qbHHrTKZ4YJYY65pwFwIDAQABMA0GCSqGSIb3DQEBCwUA +A4IBAQCCGvZpM+t83xWPCsz5FyuCqA6LI+j0NMMmKpe1wJ8JcK2o9Qw4d0wPxWdy +0O7Ti2YlJS3gups00zsaFhQymIKUBi5Gc+1VC7qHUUrVtkoIRe6QSpcVlxPVczlD +If1egkjBCUZKVSWqYRKB6AMqjpp7/dF06j6zAaAH54jaLv9VmiBtsFyd017AsC9W ++OG2ke2dNtXySfVX4VusCcji86qb5sr6hNIQWMXk6dZoLDsZvwvVi7KnrqQOza8J +klcJXV8Hsnq/faHr/ZmsIA65N0+H8KuYfbO+s5nKPG9th6ZZAu4aY2VDei++TH+H +EAQhivPNUC1DgCmx0P7vKLhgka7S -----END CERTIFICATE----- diff --git a/src/core/tsi/test_creds/server1.key b/src/core/tsi/test_creds/server1.key index 143a5b87658..086462992cf 100644 --- a/src/core/tsi/test_creds/server1.key +++ b/src/core/tsi/test_creds/server1.key @@ -1,16 +1,28 @@ -----BEGIN PRIVATE KEY----- -MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAOHDFScoLCVJpYDD -M4HYtIdV6Ake/sMNaaKdODjDMsux/4tDydlumN+fm+AjPEK5GHhGn1BgzkWF+slf -3BxhrA/8dNsnunstVA7ZBgA/5qQxMfGAq4wHNVX77fBZOgp9VlSMVfyd9N8YwbBY -AckOeUQadTi2X1S6OgJXgQ0m3MWhAgMBAAECgYAn7qGnM2vbjJNBm0VZCkOkTIWm -V10okw7EPJrdL2mkre9NasghNXbE1y5zDshx5Nt3KsazKOxTT8d0Jwh/3KbaN+YY -tTCbKGW0pXDRBhwUHRcuRzScjli8Rih5UOCiZkhefUTcRb6xIhZJuQy71tjaSy0p -dHZRmYyBYO2YEQ8xoQJBAPrJPhMBkzmEYFtyIEqAxQ/o/A6E+E4w8i+KM7nQCK7q -K4JXzyXVAjLfyBZWHGM2uro/fjqPggGD6QH1qXCkI4MCQQDmdKeb2TrKRh5BY1LR -81aJGKcJ2XbcDu6wMZK4oqWbTX2KiYn9GB0woM6nSr/Y6iy1u145YzYxEV/iMwff -DJULAkB8B2MnyzOg0pNFJqBJuH29bKCcHa8gHJzqXhNO5lAlEbMK95p/P2Wi+4Hd -aiEIAF1BF326QJcvYKmwSmrORp85AkAlSNxRJ50OWrfMZnBgzVjDx3xG6KsFQVk2 -ol6VhqL6dFgKUORFUWBvnKSyhjJxurlPEahV6oo6+A+mPhFY8eUvAkAZQyTdupP3 -XEFQKctGz+9+gKkemDp7LBBMEMBXrGTLPhpEfcjv/7KPdnFHYmhYeBTBnuVmTVWe -F98XJ7tIFfJq +MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDnE443EknxvxBq +6+hvn/t09hl8hx366EBYvZmVM/NC+7igXRAjiJiA/mIaCvL3MS0Iz5hBLxSGICU+ +WproA3GCIFITIwcf/ETyWj/5xpgZ4AKrLrjQmmX8mhwUajfF3UvwMJrCOVqPp67t +PtP+2kBXaqrXdvnvXR41FsIB8V7zIAuIZB6bHQhiGVlc1sgZYsE2EGG9WMmHtS86 +qkAOTjG2XyjmPTGAwhGDpYkYrpzp99IiDh4/Veai81hn0ssQkbry0XRD/Ig3jcHh +23WiriPNJ0JsbgXUSLKRPZObA9VgOLy2aXoN84IMaeK3yy+cwSYG/99w93fUZJte +MXwz4oYZAgMBAAECggEBAIVn2Ncai+4xbH0OLWckabwgyJ4IM9rDc0LIU368O1kU +koais8qP9dujAWgfoh3sGh/YGgKn96VnsZjKHlyMgF+r4TaDJn3k2rlAOWcurGlj +1qaVlsV4HiEzp7pxiDmHhWvp4672Bb6iBG+bsjCUOEk/n9o9KhZzIBluRhtxCmw5 +nw4Do7z00PTvN81260uPWSc04IrytvZUiAIx/5qxD72bij2xJ8t/I9GI8g4FtoVB +8pB6S/hJX1PZhh9VlU6Yk+TOfOVnbebG4W5138LkB835eqk3Zz0qsbc2euoi8Hxi +y1VGwQEmMQ63jXz4c6g+X55ifvUK9Jpn5E8pq+pMd7ECgYEA93lYq+Cr54K4ey5t +sWMa+ye5RqxjzgXj2Kqr55jb54VWG7wp2iGbg8FMlkQwzTJwebzDyCSatguEZLuB +gRGroRnsUOy9vBvhKPOch9bfKIl6qOgzMJB267fBVWx5ybnRbWN/I7RvMQf3k+9y +biCIVnxDLEEYyx7z85/5qxsXg/MCgYEA7wmWKtCTn032Hy9P8OL49T0X6Z8FlkDC +Rk42ygrc/MUbugq9RGUxcCxoImOG9JXUpEtUe31YDm2j+/nbvrjl6/bP2qWs0V7l +dTJl6dABP51pCw8+l4cWgBBX08Lkeen812AAFNrjmDCjX6rHjWHLJcpS18fnRRkP +V1d/AHWX7MMCgYEA6Gsw2guhp0Zf2GCcaNK5DlQab8OL4Hwrpttzo4kuTlwtqNKp +Q9H4al9qfF4Cr1TFya98+EVYf8yFRM3NLNjZpe3gwYf2EerlJj7VLcahw0KKzoN1 +QBENfwgPLRk5sDkx9VhSmcfl/diLroZdpAwtv3vo4nEoxeuGFbKTGx3Qkf0CgYEA +xyR+dcb05Ygm3w4klHQTowQ10s1H80iaUcZBgQuR1ghEtDbUPZHsoR5t1xCB02ys +DgAwLv1bChIvxvH/L6KM8ovZ2LekBX4AviWxoBxJnfz/EVau98B0b1auRN6eSC83 +FRuGldlSOW1z/nSh8ViizSYE5H5HX1qkXEippvFRE88CgYB3Bfu3YQY60ITWIShv +nNkdcbTT9eoP9suaRJjw92Ln+7ZpALYlQMKUZmJ/5uBmLs4RFwUTQruLOPL4yLTH +awADWUzs3IRr1fwn9E+zM8JVyKCnUEM3w4N5UZskGO2klashAd30hWO+knRv/y0r +uGIYs9Ek7YXlXIRVrzMwcsrt1w== -----END PRIVATE KEY----- diff --git a/src/core/tsi/test_creds/server1.pem b/src/core/tsi/test_creds/server1.pem index f3d43fcc5be..88244f856c6 100644 --- a/src/core/tsi/test_creds/server1.pem +++ b/src/core/tsi/test_creds/server1.pem @@ -1,16 +1,22 @@ -----BEGIN CERTIFICATE----- -MIICnDCCAgWgAwIBAgIBBzANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJBVTET -MBEGA1UECBMKU29tZS1TdGF0ZTEhMB8GA1UEChMYSW50ZXJuZXQgV2lkZ2l0cyBQ -dHkgTHRkMQ8wDQYDVQQDEwZ0ZXN0Y2EwHhcNMTUxMTA0MDIyMDI0WhcNMjUxMTAx -MDIyMDI0WjBlMQswCQYDVQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNV -BAcTB0NoaWNhZ28xFTATBgNVBAoTDEV4YW1wbGUsIENvLjEaMBgGA1UEAxQRKi50 -ZXN0Lmdvb2dsZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAOHDFSco -LCVJpYDDM4HYtIdV6Ake/sMNaaKdODjDMsux/4tDydlumN+fm+AjPEK5GHhGn1Bg -zkWF+slf3BxhrA/8dNsnunstVA7ZBgA/5qQxMfGAq4wHNVX77fBZOgp9VlSMVfyd -9N8YwbBYAckOeUQadTi2X1S6OgJXgQ0m3MWhAgMBAAGjazBpMAkGA1UdEwQCMAAw -CwYDVR0PBAQDAgXgME8GA1UdEQRIMEaCECoudGVzdC5nb29nbGUuZnKCGHdhdGVy -em9vaS50ZXN0Lmdvb2dsZS5iZYISKi50ZXN0LnlvdXR1YmUuY29thwTAqAEDMA0G -CSqGSIb3DQEBCwUAA4GBAJFXVifQNub1LUP4JlnX5lXNlo8FxZ2a12AFQs+bzoJ6 -hM044EDjqyxUqSbVePK0ni3w1fHQB5rY9yYC5f8G7aqqTY1QOhoUk8ZTSTRpnkTh -y4jjdvTZeLDVBlueZUTDRmy2feY5aZIU18vFDK08dTG0A87pppuv1LNIR3loveU8 +MIIDtDCCApygAwIBAgIUbJfTREJ6k6/+oInWhV1O1j3ZT0IwDQYJKoZIhvcNAQEL +BQAwVjELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM +GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEPMA0GA1UEAwwGdGVzdGNhMB4XDTIw +MDMxODAzMTA0MloXDTMwMDMxNjAzMTA0MlowZTELMAkGA1UEBhMCVVMxETAPBgNV +BAgMCElsbGlub2lzMRAwDgYDVQQHDAdDaGljYWdvMRUwEwYDVQQKDAxFeGFtcGxl +LCBDby4xGjAYBgNVBAMMESoudGVzdC5nb29nbGUuY29tMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEA5xOONxJJ8b8Qauvob5/7dPYZfIcd+uhAWL2ZlTPz +Qvu4oF0QI4iYgP5iGgry9zEtCM+YQS8UhiAlPlqa6ANxgiBSEyMHH/xE8lo/+caY +GeACqy640Jpl/JocFGo3xd1L8DCawjlaj6eu7T7T/tpAV2qq13b5710eNRbCAfFe +8yALiGQemx0IYhlZXNbIGWLBNhBhvVjJh7UvOqpADk4xtl8o5j0xgMIRg6WJGK6c +6ffSIg4eP1XmovNYZ9LLEJG68tF0Q/yIN43B4dt1oq4jzSdCbG4F1EiykT2TmwPV +YDi8tml6DfOCDGnit8svnMEmBv/fcPd31GSbXjF8M+KGGQIDAQABo2swaTAJBgNV +HRMEAjAAMAsGA1UdDwQEAwIF4DBPBgNVHREESDBGghAqLnRlc3QuZ29vZ2xlLmZy +ghh3YXRlcnpvb2kudGVzdC5nb29nbGUuYmWCEioudGVzdC55b3V0dWJlLmNvbYcE +wKgBAzANBgkqhkiG9w0BAQsFAAOCAQEAS8hDQA8PSgipgAml7Q3/djwQ644ghWQv +C2Kb+r30RCY1EyKNhnQnIIh/OUbBZvh0M0iYsy6xqXgfDhCB93AA6j0i5cS8fkhH +Jl4RK0tSkGQ3YNY4NzXwQP/vmUgfkw8VBAZ4Y4GKxppdATjffIW+srbAmdDruIRM +wPeikgOoRrXf0LA1fi4TqxARzeRwenQpayNfGHTvVF9aJkl8HoaMunTAdG5pIVcr +9GKi/gEMpXUJbbVv3U5frX1Wo4CFo+rZWJ/LyCMeb0jciNLxSdMwj/E/ZuExlyeZ +gc9ctPjSMvgSyXEKv6Vwobleeg88V2ZgzenziORoWj4KszG/lbQZvg== -----END CERTIFICATE----- From 72112d034e40b95d3f015ec94cf189cac0f56983 Mon Sep 17 00:00:00 2001 From: Ashitha Santhosh Date: Tue, 17 Mar 2020 23:37:20 -0700 Subject: [PATCH 209/758] Added tests. --- .../alts/handshaker/alts_handshaker_client.h | 2 +- .../tsi/alts/handshaker/alts_tsi_handshaker.h | 2 +- .../handshaker/alts_handshaker_client_test.cc | 20 ++++++++---- .../handshaker/alts_tsi_handshaker_test.cc | 32 ++++++++++++++++++- 4 files changed, 46 insertions(+), 10 deletions(-) diff --git a/src/core/tsi/alts/handshaker/alts_handshaker_client.h b/src/core/tsi/alts/handshaker/alts_handshaker_client.h index b3af548b405..d8669da01cb 100644 --- a/src/core/tsi/alts/handshaker/alts_handshaker_client.h +++ b/src/core/tsi/alts/handshaker/alts_handshaker_client.h @@ -134,7 +134,7 @@ void alts_handshaker_client_destroy(alts_handshaker_client* client); * - is_client: a boolean value indicating if the created handshaker client is * used at the client (is_client = true) or server (is_client = false) side. * - max_frame_size: Maximum frame size used by frame protector (User specified - * maximum frame size if present or default max frame size). + * maximum frame size if present or default max frame size). * * It returns the created ALTS handshaker client on success, and NULL * on failure. diff --git a/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h b/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h index ec3f167af5e..0c9a5732c48 100644 --- a/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +++ b/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h @@ -55,7 +55,7 @@ typedef struct alts_tsi_handshaker alts_tsi_handshaker; * - self: address of ALTS TSI handshaker instance to be returned from the * method. * - user_specified_max_frame_size: Determines the maximum frame size used by - * frame protector that is specified via user. If unspecified, the value is 0. + * frame protector that is specified via user. If unspecified, the value is 0. * * It returns TSI_OK on success and an error status code on failure. Note that * if interested_parties is nullptr, a dedicated TSI thread will be created and diff --git a/test/core/tsi/alts/handshaker/alts_handshaker_client_test.cc b/test/core/tsi/alts/handshaker/alts_handshaker_client_test.cc index 0e1ab006728..e28bda1d059 100644 --- a/test/core/tsi/alts/handshaker/alts_handshaker_client_test.cc +++ b/test/core/tsi/alts/handshaker/alts_handshaker_client_test.cc @@ -31,6 +31,7 @@ #define ALTS_HANDSHAKER_CLIENT_TEST_TARGET_NAME "bigtable.google.api.com" #define ALTS_HANDSHAKER_CLIENT_TEST_TARGET_SERVICE_ACCOUNT1 "A@google.com" #define ALTS_HANDSHAKER_CLIENT_TEST_TARGET_SERVICE_ACCOUNT2 "B@google.com" +#define ALTS_HANDSHAKER_CLIENT_TEST_MAX_FRAME_SIZE 64 * 1024 const size_t kHandshakerClientOpNum = 4; const size_t kMaxRpcVersionMajor = 3; @@ -155,8 +156,8 @@ static grpc_call_error check_must_not_be_called(grpc_call* /*call*/, /** * A mock grpc_caller used to check correct execution of client_start operation. * It checks if the client_start handshaker request is populated with correct - * handshake_security_protocol, application_protocol, and record_protocol, and - * op is correctly populated. + * handshake_security_protocol, application_protocol, record_protocol and + * max_frame_size, and op is correctly populated. */ static grpc_call_error check_client_start_success(grpc_call* /*call*/, const grpc_op* op, @@ -196,7 +197,8 @@ static grpc_call_error check_client_start_success(grpc_call* /*call*/, GPR_ASSERT(upb_strview_eql( grpc_gcp_StartClientHandshakeReq_target_name(client_start), upb_strview_makez(ALTS_HANDSHAKER_CLIENT_TEST_TARGET_NAME))); - + GPR_ASSERT(grpc_gcp_StartClientHandshakeReq_max_frame_size( + client_start, ALTS_HANDSHAKER_CLIENT_TEST_MAX_FRAME_SIZE)); GPR_ASSERT(validate_op(client, op, nops, true /* is_start */)); return GRPC_CALL_OK; } @@ -204,8 +206,8 @@ static grpc_call_error check_client_start_success(grpc_call* /*call*/, /** * A mock grpc_caller used to check correct execution of server_start operation. * It checks if the server_start handshaker request is populated with correct - * handshake_security_protocol, application_protocol, and record_protocol, and - * op is correctly populated. + * handshake_security_protocol, application_protocol, record_protocol and + * max_frame_size, and op is correctly populated. */ static grpc_call_error check_server_start_success(grpc_call* /*call*/, const grpc_op* op, @@ -245,6 +247,8 @@ static grpc_call_error check_server_start_success(grpc_call* /*call*/, upb_strview_makez(ALTS_RECORD_PROTOCOL))); validate_rpc_protocol_versions( grpc_gcp_StartServerHandshakeReq_rpc_versions(server_start)); + GPR_ASSERT(grpc_gcp_StartServerHandshakeReq_max_frame_size( + server_start, ALTS_HANDSHAKER_CLIENT_TEST_MAX_FRAME_SIZE)); GPR_ASSERT(validate_op(client, op, nops, true /* is_start */)); return GRPC_CALL_OK; } @@ -321,12 +325,14 @@ static alts_handshaker_client_test_config* create_config() { nullptr, config->channel, ALTS_HANDSHAKER_SERVICE_URL_FOR_TESTING, nullptr, server_options, grpc_slice_from_static_string(ALTS_HANDSHAKER_CLIENT_TEST_TARGET_NAME), - nullptr, nullptr, nullptr, nullptr, false); + nullptr, nullptr, nullptr, nullptr, false, + ALTS_HANDSHAKER_CLIENT_TEST_MAX_FRAME_SIZE); config->client = alts_grpc_handshaker_client_create( nullptr, config->channel, ALTS_HANDSHAKER_SERVICE_URL_FOR_TESTING, nullptr, client_options, grpc_slice_from_static_string(ALTS_HANDSHAKER_CLIENT_TEST_TARGET_NAME), - nullptr, nullptr, nullptr, nullptr, true); + nullptr, nullptr, nullptr, nullptr, true, + ALTS_HANDSHAKER_CLIENT_TEST_MAX_FRAME_SIZE); GPR_ASSERT(config->client != nullptr); GPR_ASSERT(config->server != nullptr); grpc_alts_credentials_options_destroy(client_options); diff --git a/test/core/tsi/alts/handshaker/alts_tsi_handshaker_test.cc b/test/core/tsi/alts/handshaker/alts_tsi_handshaker_test.cc index 5dd76d82fdc..bbbf2ae11b8 100644 --- a/test/core/tsi/alts/handshaker/alts_tsi_handshaker_test.cc +++ b/test/core/tsi/alts/handshaker/alts_tsi_handshaker_test.cc @@ -49,6 +49,9 @@ #define ALTS_TSI_HANDSHAKER_TEST_APPLICATION_PROTOCOL \ "test application protocol" #define ALTS_TSI_HANDSHAKER_TEST_RECORD_PROTOCOL "test record protocol" +#define ALTS_TSI_HANDSHAKER_TEST_MAX_FRAME_SIZE 256 * 1024 +#define ALTS_TSI_HANDSHAKER_TEST_DEFAULT_MAX_FRAME_SIZE 128 * 1024 +#define ALTS_TSI_HANDSHAKER_TEST_MIN_MAX_FRAME_SIZE 16 * 1024 using grpc_core::internal::alts_handshaker_client_check_fields_for_testing; using grpc_core::internal::alts_handshaker_client_get_handshaker_for_testing; @@ -164,6 +167,8 @@ static grpc_byte_buffer* generate_handshaker_response( upb_strview_makez(ALTS_TSI_HANDSHAKER_TEST_APPLICATION_PROTOCOL)); grpc_gcp_HandshakerResult_set_record_protocol( result, upb_strview_makez(ALTS_TSI_HANDSHAKER_TEST_RECORD_PROTOCOL)); + grpc_gcp_HandshakerResult_set_max_frame_size( + result, ALTS_TSI_HANDSHAKER_TEST_MAX_FRAME_SIZE); break; case SERVER_NEXT: grpc_gcp_HandshakerResp_set_bytes_consumed( @@ -283,6 +288,17 @@ static void on_client_next_success_cb(tsi_result status, void* user_data, GPR_ASSERT(memcmp(bytes_to_send, ALTS_TSI_HANDSHAKER_TEST_OUT_FRAME, bytes_to_send_size) == 0); GPR_ASSERT(result != nullptr); + // Validate max frame size value after Frame Size Negotiation. Here peer max + // frame size is greater than default value, and user specified max frame size + // is absent. + tsi_zero_copy_grpc_protector* zero_copy_protector; + GPR_ASSERT(tsi_handshaker_result_create_zero_copy_frame_protector( + result, nullptr, &zero_copy_protector) == TSI_OK); + size_t actual_max_frame_size; + tsi_zero_copy_grpc_protector_max_frame_size(zero_copy_protector, + &actual_max_frame_size); + GPR_ASSERT(actual_max_frame_size, + ALTS_TSI_HANDSHAKER_TEST_DEFAULT_MAX_FRAME_SIZE); /* Validate peer identity. */ tsi_peer peer; GPR_ASSERT(tsi_handshaker_result_extract_peer(result, &peer) == TSI_OK); @@ -343,6 +359,20 @@ static void on_server_next_success_cb(tsi_result status, void* user_data, GPR_ASSERT(bytes_to_send_size == 0); GPR_ASSERT(bytes_to_send == nullptr); GPR_ASSERT(result != nullptr); + // Validate max frame size value after Frame Size Negotiation. The negotiated + // frame size value equals minimum send frame size, due to the absence of peer + // max frame size. + tsi_zero_copy_grpc_protector* zero_copy_protector; + size_t user_specified_max_frame_size = + ALTS_TSI_HANDSHAKER_TEST_MAX_FRAME_SIZE; + GPR_ASSERT(tsi_handshaker_result_create_zero_copy_frame_protector( + result, &user_specified_max_frame_size, + &zero_copy_protector) == TSI_OK); + size_t actual_max_frame_size; + tsi_zero_copy_grpc_protector_max_frame_size(zero_copy_protector, + &actual_max_frame_size); + GPR_ASSERT(actual_max_frame_size, + ALTS_TSI_HANDSHAKER_TEST_MIN_MAX_FRAME_SIZE); /* Validate peer identity. */ tsi_peer peer; GPR_ASSERT(tsi_handshaker_result_extract_peer(result, &peer) == TSI_OK); @@ -478,7 +508,7 @@ static tsi_handshaker* create_test_handshaker(bool is_client) { grpc_alts_credentials_client_options_create(); alts_tsi_handshaker_create(options, "target_name", ALTS_HANDSHAKER_SERVICE_URL_FOR_TESTING, is_client, - nullptr, &handshaker); + nullptr, &handshaker, 0); alts_tsi_handshaker* alts_handshaker = reinterpret_cast(handshaker); alts_tsi_handshaker_set_client_vtable_for_testing(alts_handshaker, &vtable); From f1b87b129063402afa493fa90aeef145ab0c93d5 Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Thu, 12 Mar 2020 18:50:08 -0700 Subject: [PATCH 210/758] Disable disappearing_server for Windows --- test/core/end2end/tests/disappearing_server.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/core/end2end/tests/disappearing_server.cc b/test/core/end2end/tests/disappearing_server.cc index 1380b5c362b..280ae7dd00a 100644 --- a/test/core/end2end/tests/disappearing_server.cc +++ b/test/core/end2end/tests/disappearing_server.cc @@ -210,7 +210,9 @@ static void disappearing_server_test(grpc_end2end_test_config config) { void disappearing_server(grpc_end2end_test_config config) { GPR_ASSERT(config.feature_mask & FEATURE_MASK_SUPPORTS_DELAYED_CONNECTION); +#ifndef GPR_WINDOWS /* b/148110727 for more details */ disappearing_server_test(config); +#endif /* GPR_WINDOWS */ } void disappearing_server_pre_init(void) {} From 6738f420fd797d334448b7cb6c7966d114ae3fce Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Wed, 18 Mar 2020 05:10:22 -0400 Subject: [PATCH 211/758] mark channelz_test as flaky --- test/core/channel/BUILD | 1 + 1 file changed, 1 insertion(+) diff --git a/test/core/channel/BUILD b/test/core/channel/BUILD index 88ddea93436..2383620c8ab 100644 --- a/test/core/channel/BUILD +++ b/test/core/channel/BUILD @@ -87,6 +87,7 @@ grpc_cc_test( external_deps = [ "gtest", ], + flaky = True, # TODO(b/151792070) language = "C++", deps = [ "//:gpr", From c9ae8ed9c78848694006dabce772fa152d533274 Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Wed, 18 Mar 2020 05:13:04 -0400 Subject: [PATCH 212/758] regenerate projects --- Makefile | 2 -- build_autogenerated.yaml | 1 + tools/run_tests/generated/tests.json | 24 ------------------------ 3 files changed, 1 insertion(+), 26 deletions(-) diff --git a/Makefile b/Makefile index 01af1280092..c4c6332736b 100644 --- a/Makefile +++ b/Makefile @@ -2206,8 +2206,6 @@ test_cxx: buildtests_cxx $(Q) $(BINDIR)/$(CONFIG)/channelz_registry_test || ( echo test channelz_registry_test failed ; exit 1 ) $(E) "[RUN] Testing channelz_service_test" $(Q) $(BINDIR)/$(CONFIG)/channelz_service_test || ( echo test channelz_service_test failed ; exit 1 ) - $(E) "[RUN] Testing channelz_test" - $(Q) $(BINDIR)/$(CONFIG)/channelz_test || ( echo test channelz_test failed ; exit 1 ) $(E) "[RUN] Testing cli_call_test" $(Q) $(BINDIR)/$(CONFIG)/cli_call_test || ( echo test cli_call_test failed ; exit 1 ) $(E) "[RUN] Testing client_callback_end2end_test" diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml index c57d9605f51..56b33c42228 100644 --- a/build_autogenerated.yaml +++ b/build_autogenerated.yaml @@ -5441,6 +5441,7 @@ targets: - name: channelz_test gtest: true build: test + run: false language: c++ headers: - test/cpp/util/channel_trace_proto_helper.h diff --git a/tools/run_tests/generated/tests.json b/tools/run_tests/generated/tests.json index 32a7e1681cf..16ec891f747 100644 --- a/tools/run_tests/generated/tests.json +++ b/tools/run_tests/generated/tests.json @@ -4077,30 +4077,6 @@ ], "uses_polling": true }, - { - "args": [], - "benchmark": false, - "ci_platforms": [ - "linux", - "mac", - "posix", - "windows" - ], - "cpu_cost": 1.0, - "exclude_configs": [], - "exclude_iomgrs": [], - "flaky": false, - "gtest": true, - "language": "c++", - "name": "channelz_test", - "platforms": [ - "linux", - "mac", - "posix", - "windows" - ], - "uses_polling": true - }, { "args": [], "benchmark": false, From 1316ae2d307427a331a9421bf12d4f15a50681bd Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Wed, 18 Mar 2020 06:08:07 -0400 Subject: [PATCH 213/758] remove run_tests.py sanitizers from run_tests_matrix.py --- tools/run_tests/run_tests_matrix.py | 35 +---------------------------- 1 file changed, 1 insertion(+), 34 deletions(-) diff --git a/tools/run_tests/run_tests_matrix.py b/tools/run_tests/run_tests_matrix.py index 86f2f86037b..730bae8aef9 100755 --- a/tools/run_tests/run_tests_matrix.py +++ b/tools/run_tests/run_tests_matrix.py @@ -30,13 +30,9 @@ os.chdir(_ROOT) _DEFAULT_RUNTESTS_TIMEOUT = 1 * 60 * 60 -# Set the timeout high to allow enough time for sanitizers and pre-building -# clang docker. +# C/C++ tests can take long time _CPP_RUNTESTS_TIMEOUT = 4 * 60 * 60 -# C++ TSAN takes longer than other sanitizers -_CPP_TSAN_RUNTESTS_TIMEOUT = 8 * 60 * 60 - # Set timeout high for ObjC for Cocoapods to install pods _OBJC_RUNTESTS_TIMEOUT = 90 * 60 @@ -261,35 +257,6 @@ def _create_test_jobs(extra_args=[], inner_jobs=_DEFAULT_INNER_JOBS): inner_jobs=inner_jobs, timeout_seconds=_OBJC_RUNTESTS_TIMEOUT) - # sanitizers - test_jobs += _generate_jobs(languages=['c'], - configs=['msan', 'asan', 'tsan', 'ubsan'], - platforms=['linux'], - arch='x64', - compiler='clang7.0', - labels=['sanitizers', 'corelang'], - extra_args=extra_args, - inner_jobs=inner_jobs, - timeout_seconds=_CPP_RUNTESTS_TIMEOUT) - test_jobs += _generate_jobs(languages=['c++'], - configs=['asan'], - platforms=['linux'], - arch='x64', - compiler='clang7.0', - labels=['sanitizers', 'corelang'], - extra_args=extra_args, - inner_jobs=inner_jobs, - timeout_seconds=_CPP_RUNTESTS_TIMEOUT) - test_jobs += _generate_jobs(languages=['c++'], - configs=['tsan'], - platforms=['linux'], - arch='x64', - compiler='clang7.0', - labels=['sanitizers', 'corelang'], - extra_args=extra_args, - inner_jobs=inner_jobs, - timeout_seconds=_CPP_TSAN_RUNTESTS_TIMEOUT) - return test_jobs From 5927f9b625d598d17d8e8fdb686b74d6c5fdf683 Mon Sep 17 00:00:00 2001 From: "Mark D. Roth" Date: Wed, 18 Mar 2020 07:42:32 -0700 Subject: [PATCH 214/758] Gracefully switch xds policy instances when cluster name changes, and other LRS-related fixes. --- .../lb_policy/child_policy_handler.cc | 51 ++- .../lb_policy/child_policy_handler.h | 17 + .../client_channel/lb_policy/xds/xds.cc | 96 +++-- .../ext/filters/client_channel/xds/xds_api.h | 2 +- .../filters/client_channel/xds/xds_client.cc | 116 +++--- .../filters/client_channel/xds/xds_client.h | 11 +- test/cpp/end2end/xds_end2end_test.cc | 350 ++++++++++++++---- 7 files changed, 471 insertions(+), 172 deletions(-) diff --git a/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc b/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc index 14b26404b44..1ed5a6993c6 100644 --- a/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +++ b/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc @@ -16,6 +16,8 @@ #include +#include + #include "src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h" #include "absl/strings/str_cat.h" @@ -138,8 +140,6 @@ void ChildPolicyHandler::ShutdownLocked() { } void ChildPolicyHandler::UpdateLocked(UpdateArgs args) { - // The name of the policy that this update wants us to use. - const char* child_policy_name = args.config->name(); // If the child policy name changes, we need to create a new child // policy. When this happens, we leave child_policy_ as-is and store // the new child policy in pending_child_policy_. Once the new child @@ -166,10 +166,10 @@ void ChildPolicyHandler::UpdateLocked(UpdateArgs args) { // previous update that changed the policy name, or we have already // finished swapping in the new policy; in this case, child_policy_ // is non-null but pending_child_policy_ is null). In this case: - // a. If child_policy_->name() equals child_policy_name, then we - // update the existing child policy. - // b. If child_policy_->name() does not equal child_policy_name, - // we create a new policy. The policy will be stored in + // a. If going from the current config to the new config does not + // require a new policy, then we update the existing child policy. + // b. If going from the current config to the new config does require a + // new policy, we create a new policy. The policy will be stored in // pending_child_policy_ and will later be swapped into // child_policy_ by the helper when the new child transitions // into state READY. @@ -180,10 +180,11 @@ void ChildPolicyHandler::UpdateLocked(UpdateArgs args) { // not yet transitioned into state READY and been swapped into // child_policy_; in this case, both child_policy_ and // pending_child_policy_ are non-null). In this case: - // a. If pending_child_policy_->name() equals child_policy_name, - // then we update the existing pending child policy. - // b. If pending_child_policy->name() does not equal - // child_policy_name, then we create a new policy. The new + // a. If going from the current config to the new config does not + // require a new policy, then we update the existing pending + // child policy. + // b. If going from the current config to the new config does require a + // new child policy, then we create a new policy. The new // policy is stored in pending_child_policy_ (replacing the one // that was there before, which will be immediately shut down) // and will later be swapped into child_policy_ by the helper @@ -191,12 +192,10 @@ void ChildPolicyHandler::UpdateLocked(UpdateArgs args) { const bool create_policy = // case 1 child_policy_ == nullptr || - // case 2b - (pending_child_policy_ == nullptr && - strcmp(child_policy_->name(), child_policy_name) != 0) || - // case 3b - (pending_child_policy_ != nullptr && - strcmp(pending_child_policy_->name(), child_policy_name) != 0); + // cases 2b and 3b + ConfigChangeRequiresNewPolicyInstance(current_config_.get(), + args.config.get()); + current_config_ = args.config; LoadBalancingPolicy* policy_to_update = nullptr; if (create_policy) { // Cases 1, 2b, and 3b: create a new child policy. @@ -205,11 +204,11 @@ void ChildPolicyHandler::UpdateLocked(UpdateArgs args) { if (GRPC_TRACE_FLAG_ENABLED(*tracer_)) { gpr_log(GPR_INFO, "[child_policy_handler %p] creating new %schild policy %s", this, - child_policy_ == nullptr ? "" : "pending ", child_policy_name); + child_policy_ == nullptr ? "" : "pending ", args.config->name()); } auto& lb_policy = child_policy_ == nullptr ? child_policy_ : pending_child_policy_; - lb_policy = CreateChildPolicy(child_policy_name, *args.args); + lb_policy = CreateChildPolicy(args.config->name(), *args.args); policy_to_update = lb_policy.get(); } else { // Cases 2a and 3a: update an existing policy. @@ -257,8 +256,7 @@ OrphanablePtr ChildPolicyHandler::CreateChildPolicy( std::unique_ptr(helper); lb_policy_args.args = &args; OrphanablePtr lb_policy = - LoadBalancingPolicyRegistry::CreateLoadBalancingPolicy( - child_policy_name, std::move(lb_policy_args)); + CreateLoadBalancingPolicy(child_policy_name, std::move(lb_policy_args)); if (GPR_UNLIKELY(lb_policy == nullptr)) { gpr_log(GPR_ERROR, "could not create LB policy \"%s\"", child_policy_name); return nullptr; @@ -277,4 +275,17 @@ OrphanablePtr ChildPolicyHandler::CreateChildPolicy( return lb_policy; } +bool ChildPolicyHandler::ConfigChangeRequiresNewPolicyInstance( + LoadBalancingPolicy::Config* old_config, + LoadBalancingPolicy::Config* new_config) const { + return strcmp(old_config->name(), new_config->name()) != 0; +} + +OrphanablePtr +ChildPolicyHandler::CreateLoadBalancingPolicy( + const char* name, LoadBalancingPolicy::Args args) const { + return LoadBalancingPolicyRegistry::CreateLoadBalancingPolicy( + name, std::move(args)); +} + } // namespace grpc_core diff --git a/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h b/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h index 7a32722d367..d67f3264a87 100644 --- a/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h +++ b/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h @@ -42,6 +42,18 @@ class ChildPolicyHandler : public LoadBalancingPolicy { void ExitIdleLocked() override; void ResetBackoffLocked() override; + // Returns true if transitioning from the old config to the new config + // requires instantiating a new policy object. + virtual bool ConfigChangeRequiresNewPolicyInstance( + LoadBalancingPolicy::Config* old_config, + LoadBalancingPolicy::Config* new_config) const; + + // Instantiates a new policy of the specified name. + // May be overridden by subclasses to avoid recursion when an LB + // policy factory returns a ChildPolicyHandler. + virtual OrphanablePtr CreateLoadBalancingPolicy( + const char* name, LoadBalancingPolicy::Args args) const; + private: class Helper; @@ -55,6 +67,11 @@ class ChildPolicyHandler : public LoadBalancingPolicy { bool shutting_down_ = false; + // The most recent config passed to UpdateLocked(). + // If pending_child_policy_ is non-null, this is the config passed to + // pending_child_policy_; otherwise, it's the config passed to child_policy_. + RefCountedPtr current_config_; + // Child LB policy. OrphanablePtr child_policy_; OrphanablePtr pending_child_policy_; diff --git a/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc b/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc index 0c390c2a1fe..d5109c150d7 100644 --- a/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc +++ b/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc @@ -725,7 +725,6 @@ void XdsLb::UpdateLocked(UpdateArgs args) { } const bool is_initial_update = args_ == nullptr; // Update config. - const char* old_eds_service_name = eds_service_name(); auto old_config = std::move(config_); config_ = std::move(args.config); // Update fallback address list. @@ -773,30 +772,8 @@ void XdsLb::UpdateLocked(UpdateArgs args) { eds_service_name(), eds_service_name()); } } - // Update priority list. - // Note that this comes after updating drop_stats_, since we want that - // to be used by any new picker we create here. - // No need to do this on the initial update, since there won't be any - // priorities to update yet. - if (!is_initial_update) { - const bool update_locality_stats = - config_->lrs_load_reporting_server_name() != - old_config->lrs_load_reporting_server_name() || - strcmp(old_eds_service_name, eds_service_name()) != 0; - UpdatePrioritiesLocked(update_locality_stats); - } - // Update endpoint watcher if needed. - if (is_initial_update || - strcmp(old_eds_service_name, eds_service_name()) != 0) { - if (!is_initial_update) { - if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) { - gpr_log(GPR_INFO, "[xdslb %p] cancelling watch for %s", this, - old_eds_service_name); - } - xds_client()->CancelEndpointDataWatch(StringView(old_eds_service_name), - endpoint_watcher_, - /*delay_unsubscription=*/true); - } + // On the initial update, create the endpoint watcher. + if (is_initial_update) { if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) { gpr_log(GPR_INFO, "[xdslb %p] starting watch for %s", this, eds_service_name()); @@ -806,6 +783,16 @@ void XdsLb::UpdateLocked(UpdateArgs args) { endpoint_watcher_ = watcher.get(); xds_client()->WatchEndpointData(StringView(eds_service_name()), std::move(watcher)); + } else { + // Update priority list. + // Note that this comes after updating drop_stats_, since we want that + // to be used by any new picker we create here. + // No need to do this on the initial update, since there won't be any + // priorities to update yet. + const bool update_locality_stats = + config_->lrs_load_reporting_server_name() != + old_config->lrs_load_reporting_server_name(); + UpdatePrioritiesLocked(update_locality_stats); } } @@ -1000,7 +987,16 @@ OrphanablePtr XdsLb::ExtractLocalityLocked( if (priority == exclude_priority) continue; LocalityMap* locality_map = priorities_[priority].get(); auto locality = locality_map->ExtractLocalityLocked(name); - if (locality != nullptr) return locality; + if (locality != nullptr) { + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) { + gpr_log(GPR_INFO, + "[xdslb %p] moving locality %p %s to new priority (%" PRIu32 + " -> %" PRIu32 ")", + this, locality.get(), name->AsHumanReadableString(), + exclude_priority, priority); + } + return locality; + } } return nullptr; } @@ -1160,6 +1156,10 @@ XdsLb::LocalityMap::ExtractLocalityLocked( } void XdsLb::LocalityMap::DeactivateLocked() { + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) { + gpr_log(GPR_INFO, "[xdslb %p] deactivating priority %" PRIu32, xds_policy(), + priority_); + } // If already deactivated, don't do it again. if (delayed_removal_timer_callback_pending_) return; MaybeCancelFailoverTimerLocked(); @@ -1184,6 +1184,10 @@ bool XdsLb::LocalityMap::MaybeReactivateLocked() { // Don't reactivate a priority that is not higher than the current one. if (priority_ >= xds_policy_->current_priority_) return false; // Reactivate this priority by cancelling deletion timer. + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) { + gpr_log(GPR_INFO, "[xdslb %p] reactivating priority %" PRIu32, xds_policy(), + priority_); + } if (delayed_removal_timer_callback_pending_) { grpc_timer_cancel(&delayed_removal_timer_); } @@ -1440,6 +1444,10 @@ void XdsLb::LocalityMap::Locality::UpdateLocked(uint32_t locality_weight, // Update locality weight. weight_ = locality_weight; if (delayed_removal_timer_callback_pending_) { + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) { + gpr_log(GPR_INFO, "[xdslb %p] Locality %p %s: reactivating", xds_policy(), + this, name_->AsHumanReadableString()); + } grpc_timer_cancel(&delayed_removal_timer_); } // Update locality stats. @@ -1497,6 +1505,10 @@ void XdsLb::LocalityMap::Locality::Orphan() { void XdsLb::LocalityMap::Locality::DeactivateLocked() { // If already deactivated, don't do that again. if (weight_ == 0) return; + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) { + gpr_log(GPR_INFO, "[xdslb %p] Locality %p %s: deactivating", xds_policy(), + this, name_->AsHumanReadableString()); + } // Set the locality weight to 0 so that future xds picker won't contain this // locality. weight_ = 0; @@ -1574,7 +1586,7 @@ class XdsFactory : public LoadBalancingPolicyFactory { public: OrphanablePtr CreateLoadBalancingPolicy( LoadBalancingPolicy::Args args) const override { - return MakeOrphanable(std::move(args)); + return MakeOrphanable(std::move(args), &grpc_lb_xds_trace); } const char* name() const override { return kXds; } @@ -1672,6 +1684,36 @@ class XdsFactory : public LoadBalancingPolicyFactory { return nullptr; } } + + private: + class XdsChildHandler : public ChildPolicyHandler { + public: + XdsChildHandler(Args args, TraceFlag* tracer) + : ChildPolicyHandler(std::move(args), tracer) {} + + bool ConfigChangeRequiresNewPolicyInstance( + LoadBalancingPolicy::Config* old_config, + LoadBalancingPolicy::Config* new_config) const override { + GPR_ASSERT(old_config->name() == kXds); + GPR_ASSERT(new_config->name() == kXds); + XdsConfig* old_xds_config = static_cast(old_config); + XdsConfig* new_xds_config = static_cast(new_config); + const char* old_eds_service_name = + old_xds_config->eds_service_name() == nullptr + ? "" + : old_xds_config->eds_service_name(); + const char* new_eds_service_name = + new_xds_config->eds_service_name() == nullptr + ? "" + : new_xds_config->eds_service_name(); + return strcmp(old_eds_service_name, new_eds_service_name) != 0; + } + + OrphanablePtr CreateLoadBalancingPolicy( + const char* name, LoadBalancingPolicy::Args args) const override { + return MakeOrphanable(std::move(args)); + } + }; }; } // namespace diff --git a/src/core/ext/filters/client_channel/xds/xds_api.h b/src/core/ext/filters/client_channel/xds/xds_api.h index 28cae1ae351..ee45f85dbaf 100644 --- a/src/core/ext/filters/client_channel/xds/xds_api.h +++ b/src/core/ext/filters/client_channel/xds/xds_api.h @@ -192,7 +192,7 @@ class XdsApi { struct ClusterLoadReport { XdsClusterDropStats::DroppedRequestsMap dropped_requests; - std::map, XdsClusterLocalityStats::Snapshot, XdsLocalityName::Less> locality_stats; grpc_millis load_report_interval; diff --git a/src/core/ext/filters/client_channel/xds/xds_client.cc b/src/core/ext/filters/client_channel/xds/xds_client.cc index 3357e308ad5..631c7f9a504 100644 --- a/src/core/ext/filters/client_channel/xds/xds_client.cc +++ b/src/core/ext/filters/client_channel/xds/xds_client.cc @@ -302,7 +302,6 @@ class XdsClient::ChannelState::LrsCallState void Orphan() override; void MaybeStartReportingLocked(); - bool ShouldSendLoadReports(const StringView& cluster_name) const; RetryableCall* parent() { return parent_.get(); } ChannelState* chand() const { return parent_->chand(); } @@ -1414,7 +1413,7 @@ bool LoadReportCountersAreZero(const XdsApi::ClusterLoadReportMap& snapshot) { void XdsClient::ChannelState::LrsCallState::Reporter::SendReportLocked() { // Construct snapshot from all reported stats. XdsApi::ClusterLoadReportMap snapshot = - xds_client()->BuildLoadReportSnapshot(); + xds_client()->BuildLoadReportSnapshot(parent_->cluster_names_); // Skip client load report if the counters were all zero in the last // report and they are still zero in this one. const bool old_val = last_report_counters_were_zero_; @@ -1460,6 +1459,12 @@ void XdsClient::ChannelState::LrsCallState::Reporter::OnReportDoneLocked( Reporter* self = static_cast(arg); grpc_byte_buffer_destroy(self->parent_->send_message_payload_); self->parent_->send_message_payload_ = nullptr; + // If there are no more registered stats to report, cancel the call. + if (self->xds_client()->load_report_map_.empty()) { + self->parent_->chand()->StopLrsCall(); + self->Unref(DEBUG_LOCATION, "Reporter+report_done+no_more_reporters"); + return; + } if (error != GRPC_ERROR_NONE || !self->IsCurrentReporterOnCall()) { // If this reporter is no longer the current one on the call, the reason // might be that it was orphaned for a new one due to config update. @@ -1613,13 +1618,6 @@ void XdsClient::ChannelState::LrsCallState::MaybeStartReportingLocked() { Ref(DEBUG_LOCATION, "LRS+load_report+start"), load_reporting_interval_); } -bool XdsClient::ChannelState::LrsCallState::ShouldSendLoadReports( - const StringView& cluster_name) const { - // Only send load reports for the clusters that are asked for by the LRS - // server. - return cluster_names_.find(std::string(cluster_name)) != cluster_names_.end(); -} - void XdsClient::ChannelState::LrsCallState::OnInitialRequestSent( void* arg, grpc_error* error) { LrsCallState* lrs_calld = static_cast(arg); @@ -1966,19 +1964,14 @@ void XdsClient::RemoveClusterDropStats( LoadReportState& load_report_state = load_report_it->second; // TODO(roth): When we add support for direct federation, use the // server name specified in lrs_server. - // TODO(roth): In principle, we should try to send a final load report - // containing whatever final stats have been accumulated since the - // last load report. auto it = load_report_state.drop_stats.find(cluster_drop_stats); if (it != load_report_state.drop_stats.end()) { - load_report_state.drop_stats.erase(it); - if (load_report_state.drop_stats.empty() && - load_report_state.locality_stats.empty()) { - load_report_map_.erase(load_report_it); - if (chand_ != nullptr && load_report_map_.empty()) { - chand_->StopLrsCall(); - } + // Record final drop stats in deleted_drop_stats, which will be + // added to the next load report. + for (const auto& p : cluster_drop_stats->GetSnapshotAndReset()) { + load_report_state.deleted_drop_stats[p.first] += p.second; } + load_report_state.drop_stats.erase(it); } } @@ -1999,7 +1992,7 @@ RefCountedPtr XdsClient::AddClusterLocalityStats( Ref(DEBUG_LOCATION, "LocalityStats"), lrs_server, it->first.first /*cluster_name*/, it->first.second /*eds_service_name*/, locality); - it->second.locality_stats[std::move(locality)].insert( + it->second.locality_stats[std::move(locality)].locality_stats.insert( cluster_locality_stats.get()); chand_->MaybeStartLrsCall(); return cluster_locality_stats; @@ -2015,25 +2008,16 @@ void XdsClient::RemoveClusterLocalityStats( LoadReportState& load_report_state = load_report_it->second; // TODO(roth): When we add support for direct federation, use the // server name specified in lrs_server. - // TODO(roth): In principle, we should try to send a final load report - // containing whatever final stats have been accumulated since the - // last load report. auto locality_it = load_report_state.locality_stats.find(locality); if (locality_it == load_report_state.locality_stats.end()) return; - auto& locality_set = locality_it->second; + auto& locality_set = locality_it->second.locality_stats; auto it = locality_set.find(cluster_locality_stats); if (it != locality_set.end()) { + // Record final snapshot in deleted_locality_stats, which will be + // added to the next load report. + locality_it->second.deleted_locality_stats.emplace_back( + cluster_locality_stats->GetSnapshotAndReset()); locality_set.erase(it); - if (locality_set.empty()) { - load_report_state.locality_stats.erase(locality_it); - if (load_report_state.locality_stats.empty() && - load_report_state.drop_stats.empty()) { - load_report_map_.erase(load_report_it); - if (chand_ != nullptr && load_report_map_.empty()) { - chand_->StopLrsCall(); - } - } - } } } @@ -2062,32 +2046,70 @@ grpc_error* XdsClient::CreateServiceConfig( return error; } -XdsApi::ClusterLoadReportMap XdsClient::BuildLoadReportSnapshot() { +XdsApi::ClusterLoadReportMap XdsClient::BuildLoadReportSnapshot( + const std::set& clusters) { XdsApi::ClusterLoadReportMap snapshot_map; - for (auto& p : load_report_map_) { - const auto& cluster_key = p.first; // cluster and EDS service name - LoadReportState& load_report = p.second; - XdsApi::ClusterLoadReport& snapshot = snapshot_map[cluster_key]; + for (auto load_report_it = load_report_map_.begin(); + load_report_it != load_report_map_.end();) { + // Cluster key is cluster and EDS service name. + const auto& cluster_key = load_report_it->first; + LoadReportState& load_report = load_report_it->second; + // If the CDS response for a cluster indicates to use LRS but the + // LRS server does not say that it wants reports for this cluster, + // then we'll have stats objects here whose data we're not going to + // include in the load report. However, we still need to clear out + // the data from the stats objects, so that if the LRS server starts + // asking for the data in the future, we don't incorrectly include + // data from previous reporting intervals in that future report. + const bool record_stats = + clusters.find(cluster_key.first) != clusters.end(); + XdsApi::ClusterLoadReport snapshot; // Aggregate drop stats. + snapshot.dropped_requests = std::move(load_report.deleted_drop_stats); for (auto& drop_stats : load_report.drop_stats) { for (const auto& p : drop_stats->GetSnapshotAndReset()) { snapshot.dropped_requests[p.first] += p.second; } } // Aggregate locality stats. - for (auto& p : load_report.locality_stats) { - XdsLocalityName* locality_name = p.first.get(); - auto& locality_stats_set = p.second; + for (auto it = load_report.locality_stats.begin(); + it != load_report.locality_stats.end();) { + const RefCountedPtr& locality_name = it->first; + auto& locality_state = it->second; XdsClusterLocalityStats::Snapshot& locality_snapshot = snapshot.locality_stats[locality_name]; - for (auto& locality_stats : locality_stats_set) { + for (auto& locality_stats : locality_state.locality_stats) { locality_snapshot += locality_stats->GetSnapshotAndReset(); } + // Add final snapshots from recently deleted locality stats objects. + for (auto& deleted_locality_stats : + locality_state.deleted_locality_stats) { + locality_snapshot += deleted_locality_stats; + } + locality_state.deleted_locality_stats.clear(); + // If the only thing left in this entry was final snapshots from + // deleted locality stats objects, remove the entry. + if (locality_state.locality_stats.empty()) { + it = load_report.locality_stats.erase(it); + } else { + ++it; + } + } + if (record_stats) { + // Compute load report interval. + const grpc_millis now = ExecCtx::Get()->Now(); + snapshot.load_report_interval = now - load_report.last_report_time; + load_report.last_report_time = now; + // Record snapshot. + snapshot_map[cluster_key] = std::move(snapshot); + } + // If the only thing left in this entry was final snapshots from + // deleted stats objects, remove the entry. + if (load_report.locality_stats.empty() && load_report.drop_stats.empty()) { + load_report_it = load_report_map_.erase(load_report_it); + } else { + ++load_report_it; } - // Compute load report interval. - const grpc_millis now = ExecCtx::Get()->Now(); - snapshot.load_report_interval = now - load_report.last_report_time; - load_report.last_report_time = now; } return snapshot_map; } diff --git a/src/core/ext/filters/client_channel/xds/xds_client.h b/src/core/ext/filters/client_channel/xds/xds_client.h index 609890dc02e..c6ef4f87b99 100644 --- a/src/core/ext/filters/client_channel/xds/xds_client.h +++ b/src/core/ext/filters/client_channel/xds/xds_client.h @@ -209,8 +209,14 @@ class XdsClient : public InternallyRefCounted { }; struct LoadReportState { + struct LocalityState { + std::set locality_stats; + std::vector deleted_locality_stats; + }; + std::set drop_stats; - std::map, std::set, + XdsClusterDropStats::DroppedRequestsMap deleted_drop_stats; + std::map, LocalityState, XdsLocalityName::Less> locality_stats; grpc_millis last_report_time = ExecCtx::Get()->Now(); @@ -223,7 +229,8 @@ class XdsClient : public InternallyRefCounted { const std::string& cluster_name, RefCountedPtr* service_config) const; - XdsApi::ClusterLoadReportMap BuildLoadReportSnapshot(); + XdsApi::ClusterLoadReportMap BuildLoadReportSnapshot( + const std::set& clusters); // Channel arg vtable functions. static void* ChannelArgCopy(void* p); diff --git a/test/cpp/end2end/xds_end2end_test.cc b/test/cpp/end2end/xds_end2end_test.cc index e747e8ceb42..a2c0ee6f382 100644 --- a/test/cpp/end2end/xds_end2end_test.cc +++ b/test/cpp/end2end/xds_end2end_test.cc @@ -22,7 +22,9 @@ #include #include #include +#include #include +#include #include #include @@ -296,8 +298,9 @@ class ClientStats { }; // Converts from proto message class. - ClientStats(const ClusterStats& cluster_stats) - : total_dropped_requests_(cluster_stats.total_dropped_requests()) { + explicit ClientStats(const ClusterStats& cluster_stats) + : cluster_name_(cluster_stats.cluster_name()), + total_dropped_requests_(cluster_stats.total_dropped_requests()) { for (const auto& input_locality_stats : cluster_stats.upstream_locality_stats()) { locality_stats_.emplace(input_locality_stats.locality().sub_zone(), @@ -310,6 +313,11 @@ class ClientStats { } } + const std::string& cluster_name() const { return cluster_name_; } + + const std::map& locality_stats() const { + return locality_stats_; + } uint64_t total_successful_requests() const { uint64_t sum = 0; for (auto& p : locality_stats_) { @@ -338,7 +346,9 @@ class ClientStats { } return sum; } + uint64_t total_dropped_requests() const { return total_dropped_requests_; } + uint64_t dropped_requests(const grpc::string& category) const { auto iter = dropped_requests_.find(category); GPR_ASSERT(iter != dropped_requests_.end()); @@ -346,6 +356,7 @@ class ClientStats { } private: + std::string cluster_name_; std::map locality_stats_; uint64_t total_dropped_requests_; std::map dropped_requests_; @@ -391,7 +402,6 @@ class AdsServiceImpl : public AggregatedDiscoveryService::Service, }; using Stream = ServerReaderWriter; - using ResponseDelayPair = std::pair; // A queue of resource type/name pairs that have changed since the client // subscribed to them. @@ -933,60 +943,62 @@ class LrsServiceImpl : public LrsService, explicit LrsServiceImpl(int client_load_reporting_interval_seconds) : client_load_reporting_interval_seconds_( - client_load_reporting_interval_seconds) {} + client_load_reporting_interval_seconds), + cluster_names_({kDefaultResourceName}) {} Status StreamLoadStats(ServerContext* /*context*/, Stream* stream) override { gpr_log(GPR_INFO, "LRS[%p]: StreamLoadStats starts", this); + GPR_ASSERT(client_load_reporting_interval_seconds_ > 0); // Take a reference of the LrsServiceImpl object, reference will go // out of scope after this method exits. std::shared_ptr lrs_service_impl = shared_from_this(); - // Read request. + // Read initial request. LoadStatsRequest request; if (stream->Read(&request)) { - if (client_load_reporting_interval_seconds_ > 0) { - IncreaseRequestCount(); - // Send response. - LoadStatsResponse response; - std::string server_name; - auto it = request.node().metadata().fields().find( - "PROXYLESS_CLIENT_HOSTNAME"); - if (it != request.node().metadata().fields().end()) { - server_name = it->second.string_value(); - } - GPR_ASSERT(server_name != ""); - response.add_clusters(server_name); - response.mutable_load_reporting_interval()->set_seconds( - client_load_reporting_interval_seconds_); - stream->Write(response); - IncreaseResponseCount(); - // Wait for report. - request.Clear(); - if (stream->Read(&request)) { - gpr_log(GPR_INFO, "LRS[%p]: received client load report message '%s'", - this, request.DebugString().c_str()); - GPR_ASSERT(request.cluster_stats().size() == 1); - const ClusterStats& cluster_stats = request.cluster_stats()[0]; - // We need to acquire the lock here in order to prevent the notify_one - // below from firing before its corresponding wait is executed. - grpc_core::MutexLock lock(&load_report_mu_); - GPR_ASSERT(client_stats_ == nullptr); - client_stats_.reset(new ClientStats(cluster_stats)); - load_report_ready_ = true; - load_report_cond_.Signal(); + IncreaseRequestCount(); // Only for initial request. + // Verify server name set in metadata. + auto it = + request.node().metadata().fields().find("PROXYLESS_CLIENT_HOSTNAME"); + GPR_ASSERT(it != request.node().metadata().fields().end()); + EXPECT_EQ(it->second.string_value(), kDefaultResourceName); + // Send initial response. + LoadStatsResponse response; + for (const std::string& cluster_name : cluster_names_) { + response.add_clusters(cluster_name); + } + response.mutable_load_reporting_interval()->set_seconds( + client_load_reporting_interval_seconds_); + stream->Write(response); + IncreaseResponseCount(); + // Wait for report. + request.Clear(); + while (stream->Read(&request)) { + gpr_log(GPR_INFO, "LRS[%p]: received client load report message: %s", + this, request.DebugString().c_str()); + std::vector stats; + for (const auto& cluster_stats : request.cluster_stats()) { + stats.emplace_back(cluster_stats); } + grpc_core::MutexLock lock(&load_report_mu_); + result_queue_.emplace_back(std::move(stats)); + if (load_report_cond_ != nullptr) load_report_cond_->Signal(); } // Wait until notified done. grpc_core::MutexLock lock(&lrs_mu_); - lrs_cv_.WaitUntil(&lrs_mu_, [this] { return lrs_done; }); + lrs_cv_.WaitUntil(&lrs_mu_, [this] { return lrs_done_; }); } gpr_log(GPR_INFO, "LRS[%p]: StreamLoadStats done", this); return Status::OK; } + // Must be called before the LRS call is started. + void set_cluster_names(const std::set& cluster_names) { + cluster_names_ = cluster_names; + } + void Start() { - lrs_done = false; - load_report_ready_ = false; - client_stats_.reset(); + lrs_done_ = false; + result_queue_.clear(); } void Shutdown() { @@ -997,12 +1009,18 @@ class LrsServiceImpl : public LrsService, gpr_log(GPR_INFO, "LRS[%p]: shut down", this); } - ClientStats* WaitForLoadReport() { + std::vector WaitForLoadReport() { grpc_core::MutexLock lock(&load_report_mu_); - load_report_cond_.WaitUntil(&load_report_mu_, - [this] { return load_report_ready_; }); - load_report_ready_ = false; - return client_stats_.get(); + grpc_core::CondVar cv; + if (result_queue_.empty()) { + load_report_cond_ = &cv; + load_report_cond_->WaitUntil(&load_report_mu_, + [this] { return !result_queue_.empty(); }); + load_report_cond_ = nullptr; + } + std::vector result = std::move(result_queue_.front()); + result_queue_.pop_front(); + return result; } void NotifyDoneWithLrsCall() { @@ -1010,26 +1028,24 @@ class LrsServiceImpl : public LrsService, NotifyDoneWithLrsCallLocked(); } + private: void NotifyDoneWithLrsCallLocked() { - if (!lrs_done) { - lrs_done = true; + if (!lrs_done_) { + lrs_done_ = true; lrs_cv_.Broadcast(); } } - private: const int client_load_reporting_interval_seconds_; + std::set cluster_names_; grpc_core::CondVar lrs_cv_; - // Protect lrs_done. - grpc_core::Mutex lrs_mu_; - bool lrs_done = false; + grpc_core::Mutex lrs_mu_; // Protects lrs_done_. + bool lrs_done_ = false; - grpc_core::CondVar load_report_cond_; - // Protect the members below. - grpc_core::Mutex load_report_mu_; - std::unique_ptr client_stats_; - bool load_report_ready_ = false; + grpc_core::Mutex load_report_mu_; // Protects the members below. + grpc_core::CondVar* load_report_cond_ = nullptr; + std::deque> result_queue_; }; class TestType { @@ -1720,6 +1736,141 @@ TEST_P(XdsResolverOnlyTest, ClusterRemoved) { AdsServiceImpl::ACKED); } +class XdsResolverLoadReportingOnlyTest : public XdsEnd2endTest { + public: + XdsResolverLoadReportingOnlyTest() : XdsEnd2endTest(4, 1, 3) {} +}; + +// Tests load reporting when switching over from one cluster to another. +TEST_P(XdsResolverLoadReportingOnlyTest, ChangeClusters) { + const char* kNewClusterName = "new_cluster_name"; + balancers_[0]->lrs_service()->set_cluster_names( + {kDefaultResourceName, kNewClusterName}); + SetNextResolution({}); + SetNextResolutionForLbChannelAllBalancers(); + // cluster kDefaultResourceName -> locality0 -> backends 0 and 1 + AdsServiceImpl::EdsResourceArgs args({ + {"locality0", GetBackendPorts(0, 2)}, + }); + balancers_[0]->ads_service()->SetEdsResource( + AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); + // cluster kNewClusterName -> locality1 -> backends 2 and 3 + AdsServiceImpl::EdsResourceArgs args2({ + {"locality1", GetBackendPorts(2, 4)}, + }); + balancers_[0]->ads_service()->SetEdsResource( + AdsServiceImpl::BuildEdsResource(args2, kNewClusterName), + kNewClusterName); + // CDS resource for kNewClusterName. + Cluster new_cluster = balancers_[0]->ads_service()->default_cluster(); + new_cluster.set_name(kNewClusterName); + balancers_[0]->ads_service()->SetCdsResource(new_cluster, kNewClusterName); + // Wait for all backends to come online. + int num_ok = 0; + int num_failure = 0; + int num_drops = 0; + std::tie(num_ok, num_failure, num_drops) = WaitForAllBackends(0, 2); + // The load report received at the balancer should be correct. + std::vector load_report = + balancers_[0]->lrs_service()->WaitForLoadReport(); + EXPECT_THAT( + load_report, + ::testing::ElementsAre(::testing::AllOf( + ::testing::Property(&ClientStats::cluster_name, kDefaultResourceName), + ::testing::Property( + &ClientStats::locality_stats, + ::testing::ElementsAre(::testing::Pair( + "locality0", + ::testing::AllOf( + ::testing::Field(&ClientStats::LocalityStats:: + total_successful_requests, + num_ok), + ::testing::Field(&ClientStats::LocalityStats:: + total_requests_in_progress, + 0UL), + ::testing::Field( + &ClientStats::LocalityStats::total_error_requests, + num_failure), + ::testing::Field( + &ClientStats::LocalityStats::total_issued_requests, + num_failure + num_ok))))), + ::testing::Property(&ClientStats::total_dropped_requests, + num_drops)))); + // Change RDS resource to point to new cluster. + RouteConfiguration new_route_config = + balancers_[0]->ads_service()->default_route_config(); + new_route_config.mutable_virtual_hosts(0) + ->mutable_routes(0) + ->mutable_route() + ->set_cluster(kNewClusterName); + Listener listener = + balancers_[0]->ads_service()->BuildListener(new_route_config); + balancers_[0]->ads_service()->SetLdsResource(listener, kDefaultResourceName); + // Wait for all new backends to be used. + std::tie(num_ok, num_failure, num_drops) = WaitForAllBackends(2, 4); + // The load report received at the balancer should be correct. + load_report = balancers_[0]->lrs_service()->WaitForLoadReport(); + EXPECT_THAT( + load_report, + ::testing::ElementsAre( + ::testing::AllOf( + ::testing::Property(&ClientStats::cluster_name, + kDefaultResourceName), + ::testing::Property( + &ClientStats::locality_stats, + ::testing::ElementsAre(::testing::Pair( + "locality0", + ::testing::AllOf( + ::testing::Field(&ClientStats::LocalityStats:: + total_successful_requests, + ::testing::Lt(num_ok)), + ::testing::Field(&ClientStats::LocalityStats:: + total_requests_in_progress, + 0UL), + ::testing::Field( + &ClientStats::LocalityStats::total_error_requests, + ::testing::Le(num_failure)), + ::testing::Field( + &ClientStats::LocalityStats:: + total_issued_requests, + ::testing::Le(num_failure + num_ok)))))), + ::testing::Property(&ClientStats::total_dropped_requests, + num_drops)), + ::testing::AllOf( + ::testing::Property(&ClientStats::cluster_name, kNewClusterName), + ::testing::Property( + &ClientStats::locality_stats, + ::testing::ElementsAre(::testing::Pair( + "locality1", + ::testing::AllOf( + ::testing::Field(&ClientStats::LocalityStats:: + total_successful_requests, + ::testing::Le(num_ok)), + ::testing::Field(&ClientStats::LocalityStats:: + total_requests_in_progress, + 0UL), + ::testing::Field( + &ClientStats::LocalityStats::total_error_requests, + ::testing::Le(num_failure)), + ::testing::Field( + &ClientStats::LocalityStats:: + total_issued_requests, + ::testing::Le(num_failure + num_ok)))))), + ::testing::Property(&ClientStats::total_dropped_requests, + num_drops)))); + int total_ok = 0; + int total_failure = 0; + for (const ClientStats& client_stats : load_report) { + total_ok += client_stats.total_successful_requests(); + total_failure += client_stats.total_error_requests(); + } + EXPECT_EQ(total_ok, num_ok); + EXPECT_EQ(total_failure, num_failure); + // The LRS service got a single request, and sent a single response. + EXPECT_EQ(1U, balancers_[0]->lrs_service()->request_count()); + EXPECT_EQ(1U, balancers_[0]->lrs_service()->response_count()); +} + using SecureNamingTest = BasicTest; // Tests that secure naming check passes if target name is expected. @@ -3227,14 +3378,50 @@ TEST_P(ClientLoadReportingTest, Vanilla) { EXPECT_EQ(1U, balancers_[0]->lrs_service()->request_count()); EXPECT_EQ(1U, balancers_[0]->lrs_service()->response_count()); // The load report received at the balancer should be correct. - ClientStats* client_stats = balancers_[0]->lrs_service()->WaitForLoadReport(); + std::vector load_report = + balancers_[0]->lrs_service()->WaitForLoadReport(); + ASSERT_EQ(load_report.size(), 1UL); + ClientStats& client_stats = load_report.front(); EXPECT_EQ(kNumRpcsPerAddress * num_backends_ + num_ok, - client_stats->total_successful_requests()); - EXPECT_EQ(0U, client_stats->total_requests_in_progress()); + client_stats.total_successful_requests()); + EXPECT_EQ(0U, client_stats.total_requests_in_progress()); EXPECT_EQ(kNumRpcsPerAddress * num_backends_ + num_ok, - client_stats->total_issued_requests()); - EXPECT_EQ(0U, client_stats->total_error_requests()); - EXPECT_EQ(0U, client_stats->total_dropped_requests()); + client_stats.total_issued_requests()); + EXPECT_EQ(0U, client_stats.total_error_requests()); + EXPECT_EQ(0U, client_stats.total_dropped_requests()); +} + +// Tests that we don't include stats for clusters that are not requested +// by the LRS server. +TEST_P(ClientLoadReportingTest, HonorsClustersRequestedByLrsServer) { + balancers_[0]->lrs_service()->set_cluster_names({"bogus"}); + SetNextResolution({}); + SetNextResolutionForLbChannel({balancers_[0]->port()}); + const size_t kNumRpcsPerAddress = 100; + AdsServiceImpl::EdsResourceArgs args({ + {"locality0", GetBackendPorts()}, + }); + balancers_[0]->ads_service()->SetEdsResource( + AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); + // Wait until all backends are ready. + int num_ok = 0; + int num_failure = 0; + int num_drops = 0; + std::tie(num_ok, num_failure, num_drops) = WaitForAllBackends(); + // Send kNumRpcsPerAddress RPCs per server. + CheckRpcSendOk(kNumRpcsPerAddress * num_backends_); + // Each backend should have gotten 100 requests. + for (size_t i = 0; i < backends_.size(); ++i) { + EXPECT_EQ(kNumRpcsPerAddress, + backends_[i]->backend_service()->request_count()); + } + // The LRS service got a single request, and sent a single response. + EXPECT_EQ(1U, balancers_[0]->lrs_service()->request_count()); + EXPECT_EQ(1U, balancers_[0]->lrs_service()->response_count()); + // The load report received at the balancer should be correct. + std::vector load_report = + balancers_[0]->lrs_service()->WaitForLoadReport(); + ASSERT_EQ(load_report.size(), 0UL); } // Tests that if the balancer restarts, the client load report contains the @@ -3257,12 +3444,15 @@ TEST_P(ClientLoadReportingTest, BalancerRestart) { std::tie(num_ok, num_failure, num_drops) = WaitForAllBackends(/* start_index */ 0, /* stop_index */ kNumBackendsFirstPass); - ClientStats* client_stats = balancers_[0]->lrs_service()->WaitForLoadReport(); + std::vector load_report = + balancers_[0]->lrs_service()->WaitForLoadReport(); + ASSERT_EQ(load_report.size(), 1UL); + ClientStats client_stats = std::move(load_report.front()); EXPECT_EQ(static_cast(num_ok), - client_stats->total_successful_requests()); - EXPECT_EQ(0U, client_stats->total_requests_in_progress()); - EXPECT_EQ(0U, client_stats->total_error_requests()); - EXPECT_EQ(0U, client_stats->total_dropped_requests()); + client_stats.total_successful_requests()); + EXPECT_EQ(0U, client_stats.total_requests_in_progress()); + EXPECT_EQ(0U, client_stats.total_error_requests()); + EXPECT_EQ(0U, client_stats.total_dropped_requests()); // Shut down the balancer. balancers_[0]->Shutdown(); // We should continue using the last EDS response we received from the @@ -3294,11 +3484,13 @@ TEST_P(ClientLoadReportingTest, BalancerRestart) { CheckRpcSendOk(kNumBackendsSecondPass); num_started += kNumBackendsSecondPass; // Check client stats. - client_stats = balancers_[0]->lrs_service()->WaitForLoadReport(); - EXPECT_EQ(num_started, client_stats->total_successful_requests()); - EXPECT_EQ(0U, client_stats->total_requests_in_progress()); - EXPECT_EQ(0U, client_stats->total_error_requests()); - EXPECT_EQ(0U, client_stats->total_dropped_requests()); + load_report = balancers_[0]->lrs_service()->WaitForLoadReport(); + ASSERT_EQ(load_report.size(), 1UL); + client_stats = std::move(load_report.front()); + EXPECT_EQ(num_started, client_stats.total_successful_requests()); + EXPECT_EQ(0U, client_stats.total_requests_in_progress()); + EXPECT_EQ(0U, client_stats.total_error_requests()); + EXPECT_EQ(0U, client_stats.total_dropped_requests()); } class ClientLoadReportingWithDropTest : public XdsEnd2endTest { @@ -3352,15 +3544,18 @@ TEST_P(ClientLoadReportingWithDropTest, Vanilla) { ::testing::Ge(KDropRateForLbAndThrottle * (1 - kErrorTolerance)), ::testing::Le(KDropRateForLbAndThrottle * (1 + kErrorTolerance)))); // Check client stats. - ClientStats* client_stats = balancers_[0]->lrs_service()->WaitForLoadReport(); - EXPECT_EQ(num_drops, client_stats->total_dropped_requests()); + std::vector load_report = + balancers_[0]->lrs_service()->WaitForLoadReport(); + ASSERT_EQ(load_report.size(), 1UL); + ClientStats& client_stats = load_report.front(); + EXPECT_EQ(num_drops, client_stats.total_dropped_requests()); const size_t total_rpc = num_warmup + kNumRpcs; EXPECT_THAT( - client_stats->dropped_requests(kLbDropType), + client_stats.dropped_requests(kLbDropType), ::testing::AllOf( ::testing::Ge(total_rpc * kDropRateForLb * (1 - kErrorTolerance)), ::testing::Le(total_rpc * kDropRateForLb * (1 + kErrorTolerance)))); - EXPECT_THAT(client_stats->dropped_requests(kThrottleDropType), + EXPECT_THAT(client_stats.dropped_requests(kThrottleDropType), ::testing::AllOf( ::testing::Ge(total_rpc * (1 - kDropRateForLb) * kDropRateForThrottle * (1 - kErrorTolerance)), @@ -3417,6 +3612,11 @@ INSTANTIATE_TEST_SUITE_P(XdsTest, XdsResolverOnlyTest, TestType(true, true)), &TestTypeName); +// XdsResolverLoadReprtingOnlyTest depends on XdsResolver and load reporting. +INSTANTIATE_TEST_SUITE_P(XdsTest, XdsResolverLoadReportingOnlyTest, + ::testing::Values(TestType(true, true)), + &TestTypeName); + INSTANTIATE_TEST_SUITE_P(XdsTest, LocalityMapTest, ::testing::Values(TestType(false, true), TestType(false, false), From 738272f3a83c6fff55a44cb12b5e6261e06fcb38 Mon Sep 17 00:00:00 2001 From: ZhenLian Date: Mon, 16 Mar 2020 15:53:12 -0700 Subject: [PATCH 215/758] [ImproveTLS] add a wrapper to error_detail in C core args --- include/grpc/grpc_security.h | 8 ++- .../tls/grpc_tls_credentials_options.h | 25 ++++++-- .../tls/tls_security_connector.cc | 14 +++-- src/cpp/common/tls_credentials_options.cc | 10 ++-- .../grpc_tls_credentials_options_test.cc | 7 +++ test/cpp/client/credentials_test.cc | 57 +++++++++++-------- 6 files changed, 77 insertions(+), 44 deletions(-) diff --git a/include/grpc/grpc_security.h b/include/grpc/grpc_security.h index 3d291c5e2d1..e910b86596b 100644 --- a/include/grpc/grpc_security.h +++ b/include/grpc/grpc_security.h @@ -714,6 +714,10 @@ GRPCAPI grpc_server_credentials* grpc_local_server_credentials_create( /** --- TLS channel/server credentials --- * It is used for experimental purpose for now and subject to change. */ +/** Struct for indicating errors. It is used for + * experimental purpose for now and subject to change. */ +typedef struct grpc_tls_error_details grpc_tls_error_details; + /** Config for TLS key materials. It is used for * experimental purpose for now and subject to change. */ typedef struct grpc_tls_key_materials_config grpc_tls_key_materials_config; @@ -857,7 +861,7 @@ struct grpc_tls_credential_reload_arg { void* cb_user_data; grpc_tls_key_materials_config* key_materials_config; grpc_ssl_certificate_config_reload_status status; - const char* error_details; + grpc_tls_error_details* error_details; grpc_tls_credential_reload_config* config; void* context; void (*destroy_context)(void* ctx); @@ -935,7 +939,7 @@ struct grpc_tls_server_authorization_check_arg { const char* peer_cert; const char* peer_cert_full_chain; grpc_status_code status; - const char* error_details; + grpc_tls_error_details* error_details; grpc_tls_server_authorization_check_config* config; void* context; void (*destroy_context)(void* ctx); diff --git a/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h b/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h index 99e27719712..c411fb2b96b 100644 --- a/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +++ b/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h @@ -27,6 +27,19 @@ #include "src/core/lib/gprpp/ref_counted.h" #include "src/core/lib/security/security_connector/ssl_utils.h" +struct grpc_tls_error_details + : public grpc_core::RefCounted { + public: + grpc_tls_error_details() : error_details_("") {} + void set_error_details(const char* err_details) { + error_details_ = err_details; + } + const std::string& error_details() { return error_details_; } + + private: + std::string error_details_; +}; + /** TLS key materials config. **/ struct grpc_tls_key_materials_config : public grpc_core::RefCounted { @@ -93,8 +106,8 @@ struct grpc_tls_credential_reload_config gpr_log(GPR_ERROR, "schedule API is nullptr"); if (arg != nullptr) { arg->status = GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_FAIL; - arg->error_details = - gpr_strdup("schedule API in credential reload config is nullptr"); + arg->error_details->set_error_details( + "schedule API in credential reload config is nullptr"); } return 1; } @@ -108,8 +121,8 @@ struct grpc_tls_credential_reload_config gpr_log(GPR_ERROR, "cancel API is nullptr."); if (arg != nullptr) { arg->status = GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_FAIL; - arg->error_details = - gpr_strdup("cancel API in credential reload config is nullptr"); + arg->error_details->set_error_details( + "cancel API in credential reload config is nullptr"); } return; } @@ -169,7 +182,7 @@ struct grpc_tls_server_authorization_check_config gpr_log(GPR_ERROR, "schedule API is nullptr"); if (arg != nullptr) { arg->status = GRPC_STATUS_NOT_FOUND; - arg->error_details = gpr_strdup( + arg->error_details->set_error_details( "schedule API in server authorization check config is nullptr"); } return 1; @@ -185,7 +198,7 @@ struct grpc_tls_server_authorization_check_config gpr_log(GPR_ERROR, "cancel API is nullptr."); if (arg != nullptr) { arg->status = GRPC_STATUS_NOT_FOUND; - arg->error_details = gpr_strdup( + arg->error_details->set_error_details( "schedule API in server authorization check config is nullptr"); } return; diff --git a/src/core/lib/security/security_connector/tls/tls_security_connector.cc b/src/core/lib/security/security_connector/tls/tls_security_connector.cc index f7b4df09881..ca361aa074f 100644 --- a/src/core/lib/security/security_connector/tls/tls_security_connector.cc +++ b/src/core/lib/security/security_connector/tls/tls_security_connector.cc @@ -88,6 +88,7 @@ grpc_status_code TlsFetchKeyMaterials( if (credential_reload_config != nullptr) { grpc_tls_credential_reload_arg* arg = new grpc_tls_credential_reload_arg(); arg->key_materials_config = key_materials_config.get(); + arg->error_details = new grpc_tls_error_details(); int result = credential_reload_config->Schedule(arg); if (result) { /** Credential reloading is performed async. This is not yet supported. @@ -105,13 +106,13 @@ grpc_status_code TlsFetchKeyMaterials( } else if (arg->status == GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_FAIL) { gpr_log(GPR_ERROR, "Credential reload failed with an error:"); if (arg->error_details != nullptr) { - gpr_log(GPR_ERROR, "%s", arg->error_details); + gpr_log(GPR_ERROR, "%s", arg->error_details->error_details().c_str()); } reload_status = is_key_materials_empty ? GRPC_STATUS_INTERNAL : GRPC_STATUS_OK; } } - gpr_free((void*)arg->error_details); + delete arg->error_details; /** If the credential reload config was constructed via a wrapped language, * then |arg->context| and |arg->destroy_context| will not be nullptr. In * this case, we must destroy |arg->context|, which stores the wrapped @@ -406,14 +407,14 @@ grpc_error* TlsChannelSecurityConnector::ProcessServerAuthorizationCheckResult( gpr_asprintf(&msg, "Server authorization check is cancelled by the caller with " "error: %s", - arg->error_details); + arg->error_details->error_details().c_str()); error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(msg); } else if (arg->status == GRPC_STATUS_OK) { /* Server authorization check completed successfully but returned check * failure. */ if (!arg->success) { gpr_asprintf(&msg, "Server authorization check failed with error: %s", - arg->error_details); + arg->error_details->error_details().c_str()); error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(msg); } /* Server authorization check did not complete correctly. */ @@ -421,7 +422,7 @@ grpc_error* TlsChannelSecurityConnector::ProcessServerAuthorizationCheckResult( gpr_asprintf( &msg, "Server authorization check did not finish correctly with error: %s", - arg->error_details); + arg->error_details->error_details().c_str()); error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(msg); } gpr_free(msg); @@ -433,6 +434,7 @@ TlsChannelSecurityConnector::ServerAuthorizationCheckArgCreate( void* user_data) { grpc_tls_server_authorization_check_arg* arg = new grpc_tls_server_authorization_check_arg(); + arg->error_details = new grpc_tls_error_details(); arg->cb = ServerAuthorizationCheckDone; arg->cb_user_data = user_data; arg->status = GRPC_STATUS_OK; @@ -447,7 +449,7 @@ void TlsChannelSecurityConnector::ServerAuthorizationCheckArgDestroy( gpr_free((void*)arg->target_name); gpr_free((void*)arg->peer_cert); if (arg->peer_cert_full_chain) gpr_free((void*)arg->peer_cert_full_chain); - gpr_free((void*)arg->error_details); + delete arg->error_details; if (arg->destroy_context != nullptr) { arg->destroy_context(arg->context); } diff --git a/src/cpp/common/tls_credentials_options.cc b/src/cpp/common/tls_credentials_options.cc index d2abe2128c3..c821e100f93 100644 --- a/src/cpp/common/tls_credentials_options.cc +++ b/src/cpp/common/tls_credentials_options.cc @@ -68,8 +68,7 @@ grpc_ssl_certificate_config_reload_status TlsCredentialReloadArg::status() } grpc::string TlsCredentialReloadArg::error_details() const { - grpc::string cpp_error_details(c_arg_->error_details); - return cpp_error_details; + return c_arg_->error_details->error_details(); } void TlsCredentialReloadArg::set_cb_user_data(void* cb_user_data) { @@ -159,7 +158,7 @@ void TlsCredentialReloadArg::set_status( void TlsCredentialReloadArg::set_error_details( const grpc::string& error_details) { - c_arg_->error_details = gpr_strdup(error_details.c_str()); + c_arg_->error_details->set_error_details(error_details.c_str()); } void TlsCredentialReloadArg::OnCredentialReloadDoneCallback() { @@ -221,8 +220,7 @@ grpc_status_code TlsServerAuthorizationCheckArg::status() const { } grpc::string TlsServerAuthorizationCheckArg::error_details() const { - grpc::string cpp_error_details(c_arg_->error_details); - return cpp_error_details; + return c_arg_->error_details->error_details(); } void TlsServerAuthorizationCheckArg::set_cb_user_data(void* cb_user_data) { @@ -254,7 +252,7 @@ void TlsServerAuthorizationCheckArg::set_status(grpc_status_code status) { void TlsServerAuthorizationCheckArg::set_error_details( const grpc::string& error_details) { - c_arg_->error_details = gpr_strdup(error_details.c_str()); + c_arg_->error_details->set_error_details(error_details.c_str()); } void TlsServerAuthorizationCheckArg::OnServerAuthorizationCheckDoneCallback() { diff --git a/test/core/security/grpc_tls_credentials_options_test.cc b/test/core/security/grpc_tls_credentials_options_test.cc index 95bb502e2cf..142aabf5858 100644 --- a/test/core/security/grpc_tls_credentials_options_test.cc +++ b/test/core/security/grpc_tls_credentials_options_test.cc @@ -50,6 +50,13 @@ TEST(GrpcTlsCredentialsOptionsTest, SetKeyMaterials) { delete config; } +TEST(GrpcTlsCredentialsOptionsTest, ErrorDetails) { + grpc_tls_error_details error_details; + EXPECT_STREQ(error_details.error_details().c_str(), ""); + error_details.set_error_details("test error details"); + EXPECT_STREQ(error_details.error_details().c_str(), "test error details"); +} + } // namespace testing int main(int argc, char** argv) { diff --git a/test/cpp/client/credentials_test.cc b/test/cpp/client/credentials_test.cc index 53b8de105f5..a1a0633e1f8 100644 --- a/test/cpp/client/credentials_test.cc +++ b/test/cpp/client/credentials_test.cc @@ -78,7 +78,7 @@ static void tls_server_authorization_check_callback( arg->target_name = gpr_strdup("callback_target_name"); arg->peer_cert = gpr_strdup("callback_peer_cert"); arg->status = GRPC_STATUS_OK; - arg->error_details = gpr_strdup("callback_error_details"); + arg->error_details->set_error_details("callback_error_details"); } class TestTlsServerAuthorizationCheck @@ -342,6 +342,7 @@ TEST_F(CredentialsTest, TlsCredentialReloadConfigSchedule) { std::shared_ptr config( new TlsCredentialReloadConfig(test_credential_reload)); grpc_tls_credential_reload_arg* c_arg = new grpc_tls_credential_reload_arg(); + c_arg->error_details = new grpc_tls_error_details(); c_arg->context = nullptr; TlsCredentialReloadArg* arg = new TlsCredentialReloadArg(c_arg); struct TlsKeyMaterialsConfig::PemKeyCertPair pair1 = {"private_key1", @@ -352,7 +353,6 @@ TEST_F(CredentialsTest, TlsCredentialReloadConfigSchedule) { arg->set_key_materials("pem_root_certs", pair_list); arg->set_status(GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_NEW); arg->set_error_details("error_details"); - const char* error_details_before_schedule = c_arg->error_details; int schedule_output = config->Schedule(arg); EXPECT_EQ(schedule_output, 0); @@ -372,11 +372,11 @@ TEST_F(CredentialsTest, TlsCredentialReloadConfigSchedule) { EXPECT_STREQ(arg->error_details().c_str(), "error_details"); // Cleanup. - gpr_free(const_cast(error_details_before_schedule)); delete c_arg->key_materials_config; if (c_arg->destroy_context != nullptr) { c_arg->destroy_context(c_arg->context); } + delete c_arg->error_details; delete c_arg; delete config->c_config(); } @@ -386,6 +386,7 @@ TEST_F(CredentialsTest, TlsCredentialReloadConfigCppToC) { new TestTlsCredentialReload()); TlsCredentialReloadConfig config(test_credential_reload); grpc_tls_credential_reload_arg c_arg; + c_arg.error_details = new grpc_tls_error_details(); c_arg.context = nullptr; c_arg.cb_user_data = static_cast(nullptr); grpc_tls_key_materials_config c_key_materials; @@ -407,7 +408,7 @@ TEST_F(CredentialsTest, TlsCredentialReloadConfigCppToC) { c_arg.key_materials_config = &c_key_materials; c_arg.status = GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_UNCHANGED; grpc::string test_error_details = "error_details"; - c_arg.error_details = test_error_details.c_str(); + c_arg.error_details->set_error_details(test_error_details.c_str()); grpc_tls_credential_reload_config* c_config = config.c_config(); c_arg.config = c_config; @@ -424,10 +425,12 @@ TEST_F(CredentialsTest, TlsCredentialReloadConfigCppToC) { EXPECT_STREQ(pair_list[1].private_key(), "private_key3"); EXPECT_STREQ(pair_list[1].cert_chain(), "cert_chain3"); EXPECT_EQ(c_arg.status, GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_NEW); - EXPECT_STREQ(c_arg.error_details, test_error_details.c_str()); + EXPECT_STREQ(c_arg.error_details->error_details().c_str(), + test_error_details.c_str()); // Cleanup. c_arg.destroy_context(c_arg.context); + delete c_arg.error_details; delete config.c_config(); } @@ -441,6 +444,7 @@ TEST_F(CredentialsTest, TlsServerAuthorizationCheckArgCallback) { new grpc_tls_server_authorization_check_arg; c_arg->cb = tls_server_authorization_check_callback; c_arg->context = nullptr; + c_arg->error_details = new grpc_tls_error_details(); TlsServerAuthorizationCheckArg* arg = new TlsServerAuthorizationCheckArg(c_arg); arg->set_cb_user_data(nullptr); @@ -451,7 +455,6 @@ TEST_F(CredentialsTest, TlsServerAuthorizationCheckArgCallback) { arg->set_error_details("error_details"); const char* target_name_before_callback = c_arg->target_name; const char* peer_cert_before_callback = c_arg->peer_cert; - const char* error_details_before_callback = c_arg->error_details; arg->OnServerAuthorizationCheckDoneCallback(); EXPECT_STREQ(static_cast(arg->cb_user_data()), "cb_user_data"); @@ -465,10 +468,9 @@ TEST_F(CredentialsTest, TlsServerAuthorizationCheckArgCallback) { // Cleanup. gpr_free(const_cast(target_name_before_callback)); gpr_free(const_cast(peer_cert_before_callback)); - gpr_free(const_cast(error_details_before_callback)); gpr_free(const_cast(c_arg->target_name)); gpr_free(const_cast(c_arg->peer_cert)); - gpr_free(const_cast(c_arg->error_details)); + delete c_arg->error_details; delete arg; delete c_arg; } @@ -479,6 +481,7 @@ TEST_F(CredentialsTest, TlsServerAuthorizationCheckConfigSchedule) { TlsServerAuthorizationCheckConfig config(test_server_authorization_check); grpc_tls_server_authorization_check_arg* c_arg = new grpc_tls_server_authorization_check_arg(); + c_arg->error_details = new grpc_tls_error_details(); c_arg->context = nullptr; TlsServerAuthorizationCheckArg* arg = new TlsServerAuthorizationCheckArg(c_arg); @@ -490,7 +493,6 @@ TEST_F(CredentialsTest, TlsServerAuthorizationCheckConfigSchedule) { arg->set_error_details("error_details"); const char* target_name_before_schedule = c_arg->target_name; const char* peer_cert_before_schedule = c_arg->peer_cert; - const char* error_details_before_schedule = c_arg->error_details; int schedule_output = config.Schedule(arg); EXPECT_EQ(schedule_output, 1); @@ -505,10 +507,9 @@ TEST_F(CredentialsTest, TlsServerAuthorizationCheckConfigSchedule) { gpr_free(arg->cb_user_data()); gpr_free(const_cast(target_name_before_schedule)); gpr_free(const_cast(peer_cert_before_schedule)); - gpr_free(const_cast(error_details_before_schedule)); gpr_free(const_cast(c_arg->target_name)); gpr_free(const_cast(c_arg->peer_cert)); - gpr_free(const_cast(c_arg->error_details)); + delete c_arg->error_details; if (c_arg->destroy_context != nullptr) { c_arg->destroy_context(c_arg->context); } @@ -527,7 +528,8 @@ TEST_F(CredentialsTest, TlsServerAuthorizationCheckConfigCppToC) { c_arg.target_name = "target_name"; c_arg.peer_cert = "peer_cert"; c_arg.status = GRPC_STATUS_UNAUTHENTICATED; - c_arg.error_details = "error_details"; + c_arg.error_details = new grpc_tls_error_details(); + c_arg.error_details->set_error_details("error_details"); c_arg.config = config.c_config(); c_arg.context = nullptr; int c_schedule_output = (c_arg.config)->Schedule(&c_arg); @@ -537,12 +539,13 @@ TEST_F(CredentialsTest, TlsServerAuthorizationCheckConfigCppToC) { EXPECT_STREQ(c_arg.target_name, "sync_target_name"); EXPECT_STREQ(c_arg.peer_cert, "sync_peer_cert"); EXPECT_EQ(c_arg.status, GRPC_STATUS_OK); - EXPECT_STREQ(c_arg.error_details, "sync_error_details"); + EXPECT_STREQ(c_arg.error_details->error_details().c_str(), + "sync_error_details"); // Cleanup. gpr_free(c_arg.cb_user_data); c_arg.destroy_context(c_arg.context); - gpr_free(const_cast(c_arg.error_details)); + delete c_arg.error_details; gpr_free(const_cast(c_arg.target_name)); gpr_free(const_cast(c_arg.peer_cert)); delete config.c_config(); @@ -587,7 +590,9 @@ TEST_F(CredentialsTest, TlsCredentialsOptionsCppToC) { c_options->key_materials_config(); c_credential_reload_arg.status = GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_UNCHANGED; grpc::string test_error_details = "error_details"; - c_credential_reload_arg.error_details = test_error_details.c_str(); + c_credential_reload_arg.error_details = new grpc_tls_error_details(); + c_credential_reload_arg.error_details->set_error_details( + test_error_details.c_str()); c_credential_reload_arg.context = nullptr; grpc_tls_server_authorization_check_config* c_server_authorization_check_config = @@ -599,7 +604,9 @@ TEST_F(CredentialsTest, TlsCredentialsOptionsCppToC) { c_server_authorization_check_arg.target_name = "target_name"; c_server_authorization_check_arg.peer_cert = "peer_cert"; c_server_authorization_check_arg.status = GRPC_STATUS_UNAUTHENTICATED; - c_server_authorization_check_arg.error_details = "error_details"; + c_server_authorization_check_arg.error_details = new grpc_tls_error_details(); + c_server_authorization_check_arg.error_details->set_error_details( + "error_details"); c_server_authorization_check_arg.context = nullptr; EXPECT_STREQ(c_key_materials_config->pem_root_certs(), "pem_root_certs"); EXPECT_EQ( @@ -627,7 +634,7 @@ TEST_F(CredentialsTest, TlsCredentialsOptionsCppToC) { EXPECT_STREQ(c_pair_list[1].cert_chain(), "cert_chain3"); EXPECT_EQ(c_credential_reload_arg.status, GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_NEW); - EXPECT_STREQ(c_credential_reload_arg.error_details, + EXPECT_STREQ(c_credential_reload_arg.error_details->error_details().c_str(), test_error_details.c_str()); int c_server_authorization_check_schedule_output = @@ -642,17 +649,19 @@ TEST_F(CredentialsTest, TlsCredentialsOptionsCppToC) { "sync_target_name"); EXPECT_STREQ(c_server_authorization_check_arg.peer_cert, "sync_peer_cert"); EXPECT_EQ(c_server_authorization_check_arg.status, GRPC_STATUS_OK); - EXPECT_STREQ(c_server_authorization_check_arg.error_details, - "sync_error_details"); + EXPECT_STREQ( + c_server_authorization_check_arg.error_details->error_details().c_str(), + "sync_error_details"); // Cleanup. c_credential_reload_arg.destroy_context(c_credential_reload_arg.context); + delete c_credential_reload_arg.error_details; c_server_authorization_check_arg.destroy_context( c_server_authorization_check_arg.context); gpr_free(c_server_authorization_check_arg.cb_user_data); gpr_free(const_cast(c_server_authorization_check_arg.target_name)); gpr_free(const_cast(c_server_authorization_check_arg.peer_cert)); - gpr_free(const_cast(c_server_authorization_check_arg.error_details)); + delete c_server_authorization_check_arg.error_details; delete c_options; } @@ -698,6 +707,7 @@ TEST_F(CredentialsTest, TlsCredentialReloadConfigErrorMessages) { std::shared_ptr config( new TlsCredentialReloadConfig(nullptr)); grpc_tls_credential_reload_arg* c_arg = new grpc_tls_credential_reload_arg; + c_arg->error_details = new grpc_tls_error_details(); c_arg->context = nullptr; TlsCredentialReloadArg* arg = new TlsCredentialReloadArg(c_arg); int schedule_output = config->Schedule(arg); @@ -706,7 +716,6 @@ TEST_F(CredentialsTest, TlsCredentialReloadConfigErrorMessages) { EXPECT_EQ(arg->status(), GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_FAIL); EXPECT_STREQ(arg->error_details().c_str(), "the interface of the credential reload config is nullptr"); - gpr_free(const_cast(c_arg->error_details)); arg->set_status(GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_UNCHANGED); config->Cancel(arg); @@ -715,10 +724,10 @@ TEST_F(CredentialsTest, TlsCredentialReloadConfigErrorMessages) { "the interface of the credential reload config is nullptr"); // Cleanup. - gpr_free(const_cast(c_arg->error_details)); if (c_arg->destroy_context != nullptr) { c_arg->destroy_context(c_arg->context); } + delete c_arg->error_details; delete c_arg; delete config->c_config(); } @@ -728,6 +737,7 @@ TEST_F(CredentialsTest, TlsServerAuthorizationCheckConfigErrorMessages) { new TlsServerAuthorizationCheckConfig(nullptr)); grpc_tls_server_authorization_check_arg* c_arg = new grpc_tls_server_authorization_check_arg; + c_arg->error_details = new grpc_tls_error_details(); c_arg->context = nullptr; TlsServerAuthorizationCheckArg* arg = new TlsServerAuthorizationCheckArg(c_arg); @@ -738,7 +748,6 @@ TEST_F(CredentialsTest, TlsServerAuthorizationCheckConfigErrorMessages) { EXPECT_STREQ( arg->error_details().c_str(), "the interface of the server authorization check config is nullptr"); - gpr_free(const_cast(c_arg->error_details)); arg->set_status(GRPC_STATUS_OK); config->Cancel(arg); @@ -748,7 +757,7 @@ TEST_F(CredentialsTest, TlsServerAuthorizationCheckConfigErrorMessages) { "the interface of the server authorization check config is nullptr"); // Cleanup. - gpr_free(const_cast(c_arg->error_details)); + delete c_arg->error_details; if (c_arg->destroy_context != nullptr) { c_arg->destroy_context(c_arg->context); } From 48fa2473046007138a9a932e37db8c92132a15a5 Mon Sep 17 00:00:00 2001 From: Donna Dionne Date: Wed, 18 Mar 2020 09:49:26 -0700 Subject: [PATCH 216/758] Building C++ example with grpc++ instead of grpc++_unsecure The example should be build with grpc++, not grpc++_unsecure. For some reason in some branches like master, both versions are built in so problem not detected. This problem surfaced in 1.28x so needs to be fixed to link with the correct grpc++. --- examples/cpp/helloworld/CMakeLists.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/cpp/helloworld/CMakeLists.txt b/examples/cpp/helloworld/CMakeLists.txt index f158a75bd78..a5e2d9bb27c 100644 --- a/examples/cpp/helloworld/CMakeLists.txt +++ b/examples/cpp/helloworld/CMakeLists.txt @@ -60,7 +60,7 @@ if(GRPC_AS_SUBMODULE) else() set(_PROTOBUF_PROTOC $) endif() - set(_GRPC_GRPCPP_UNSECURE grpc++_unsecure) + set(_GRPC_GRPCPP grpc++) if(CMAKE_CROSSCOMPILING) find_program(_GRPC_CPP_PLUGIN_EXECUTABLE grpc_cpp_plugin) else() @@ -87,7 +87,7 @@ elseif(GRPC_FETCHCONTENT) set(_PROTOBUF_LIBPROTOBUF libprotobuf) set(_REFLECTION grpc++_reflection) set(_PROTOBUF_PROTOC $) - set(_GRPC_GRPCPP_UNSECURE grpc++_unsecure) + set(_GRPC_GRPCPP grpc++) if(CMAKE_CROSSCOMPILING) find_program(_GRPC_CPP_PLUGIN_EXECUTABLE grpc_cpp_plugin) else() @@ -116,7 +116,7 @@ else() find_package(gRPC CONFIG REQUIRED) message(STATUS "Using gRPC ${gRPC_VERSION}") - set(_GRPC_GRPCPP_UNSECURE gRPC::grpc++_unsecure) + set(_GRPC_GRPCPP gRPC::grpc++) if(CMAKE_CROSSCOMPILING) find_program(_GRPC_CPP_PLUGIN_EXECUTABLE grpc_cpp_plugin) else() @@ -155,6 +155,6 @@ foreach(_target ${hw_grpc_srcs}) target_link_libraries(${_target} ${_REFLECTION} - ${_GRPC_GRPCPP_UNSECURE} + ${_GRPC_GRPCPP} ${_PROTOBUF_LIBPROTOBUF}) endforeach() From 90afa89c856656a79806202907997e910435f3a8 Mon Sep 17 00:00:00 2001 From: jiangtaoli2016 Date: Wed, 18 Mar 2020 09:53:30 -0700 Subject: [PATCH 217/758] Update c# test credentials --- .../Grpc.IntegrationTesting/data/ca.pem | 31 ++++++++------ .../Grpc.IntegrationTesting/data/server1.key | 40 ++++++++++++------- .../Grpc.IntegrationTesting/data/server1.pem | 34 +++++++++------- 3 files changed, 64 insertions(+), 41 deletions(-) diff --git a/src/csharp/Grpc.IntegrationTesting/data/ca.pem b/src/csharp/Grpc.IntegrationTesting/data/ca.pem index 6c8511a73c6..49d39cd8ed5 100644 --- a/src/csharp/Grpc.IntegrationTesting/data/ca.pem +++ b/src/csharp/Grpc.IntegrationTesting/data/ca.pem @@ -1,15 +1,20 @@ -----BEGIN CERTIFICATE----- -MIICSjCCAbOgAwIBAgIJAJHGGR4dGioHMA0GCSqGSIb3DQEBCwUAMFYxCzAJBgNV -BAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBX -aWRnaXRzIFB0eSBMdGQxDzANBgNVBAMTBnRlc3RjYTAeFw0xNDExMTEyMjMxMjla -Fw0yNDExMDgyMjMxMjlaMFYxCzAJBgNVBAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0 -YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQxDzANBgNVBAMT -BnRlc3RjYTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwEDfBV5MYdlHVHJ7 -+L4nxrZy7mBfAVXpOc5vMYztssUI7mL2/iYujiIXM+weZYNTEpLdjyJdu7R5gGUu -g1jSVK/EPHfc74O7AyZU34PNIP4Sh33N+/A5YexrNgJlPY+E3GdVYi4ldWJjgkAd -Qah2PH5ACLrIIC6tRka9hcaBlIECAwEAAaMgMB4wDAYDVR0TBAUwAwEB/zAOBgNV -HQ8BAf8EBAMCAgQwDQYJKoZIhvcNAQELBQADgYEAHzC7jdYlzAVmddi/gdAeKPau -sPBG/C2HCWqHzpCUHcKuvMzDVkY/MP2o6JIW2DBbY64bO/FceExhjcykgaYtCH/m -oIU63+CFOTtR7otyQAWHqXa7q4SbCDlG7DyRFxqG0txPtGvy12lgldA2+RgcigQG -Dfcog5wrJytaQ6UA0wE= +MIIDWjCCAkKgAwIBAgIUWrP0VvHcy+LP6UuYNtiL9gBhD5owDQYJKoZIhvcNAQEL +BQAwVjELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM +GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEPMA0GA1UEAwwGdGVzdGNhMB4XDTIw +MDMxNzE4NTk1MVoXDTMwMDMxNTE4NTk1MVowVjELMAkGA1UEBhMCQVUxEzARBgNV +BAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0 +ZDEPMA0GA1UEAwwGdGVzdGNhMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAsGL0oXflF0LzoM+Bh+qUU9yhqzw2w8OOX5mu/iNCyUOBrqaHi7mGHx73GD01 +diNzCzvlcQqdNIH6NQSL7DTpBjca66jYT9u73vZe2MDrr1nVbuLvfu9850cdxiUO +Inv5xf8+sTHG0C+a+VAvMhsLiRjsq+lXKRJyk5zkbbsETybqpxoJ+K7CoSy3yc/k +QIY3TipwEtwkKP4hzyo6KiGd/DPexie4nBUInN3bS1BUeNZ5zeaIC2eg3bkeeW7c +qT55b+Yen6CxY0TEkzBK6AKt/WUialKMgT0wbTxRZO7kUCH3Sq6e/wXeFdJ+HvdV +LPlAg5TnMaNpRdQih/8nRFpsdwIDAQABoyAwHjAMBgNVHRMEBTADAQH/MA4GA1Ud +DwEB/wQEAwICBDANBgkqhkiG9w0BAQsFAAOCAQEAkTrKZjBrJXHps/HrjNCFPb5a +THuGPCSsepe1wkKdSp1h4HGRpLoCgcLysCJ5hZhRpHkRihhef+rFHEe60UePQO3S +CVTtdJB4CYWpcNyXOdqefrbJW5QNljxgi6Fhvs7JJkBqdXIkWXtFk2eRgOIP2Eo9 +/OHQHlYnwZFrk6sp4wPyR+A95S0toZBcyDVz7u+hOW0pGK3wviOe9lvRgj/H3Pwt +bewb0l+MhRig0/DVHamyVxrDRbqInU1/GTNCwcZkXKYFWSf92U+kIcTth24Q1gcw +eZiLl5FfrWokUNytFElXob0V0a5/kbhiLc3yWmvWqHTpqCALbVyF+rKJo2f5Kw== -----END CERTIFICATE----- diff --git a/src/csharp/Grpc.IntegrationTesting/data/server1.key b/src/csharp/Grpc.IntegrationTesting/data/server1.key index 143a5b87658..086462992cf 100644 --- a/src/csharp/Grpc.IntegrationTesting/data/server1.key +++ b/src/csharp/Grpc.IntegrationTesting/data/server1.key @@ -1,16 +1,28 @@ -----BEGIN PRIVATE KEY----- -MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAOHDFScoLCVJpYDD -M4HYtIdV6Ake/sMNaaKdODjDMsux/4tDydlumN+fm+AjPEK5GHhGn1BgzkWF+slf -3BxhrA/8dNsnunstVA7ZBgA/5qQxMfGAq4wHNVX77fBZOgp9VlSMVfyd9N8YwbBY -AckOeUQadTi2X1S6OgJXgQ0m3MWhAgMBAAECgYAn7qGnM2vbjJNBm0VZCkOkTIWm -V10okw7EPJrdL2mkre9NasghNXbE1y5zDshx5Nt3KsazKOxTT8d0Jwh/3KbaN+YY -tTCbKGW0pXDRBhwUHRcuRzScjli8Rih5UOCiZkhefUTcRb6xIhZJuQy71tjaSy0p -dHZRmYyBYO2YEQ8xoQJBAPrJPhMBkzmEYFtyIEqAxQ/o/A6E+E4w8i+KM7nQCK7q -K4JXzyXVAjLfyBZWHGM2uro/fjqPggGD6QH1qXCkI4MCQQDmdKeb2TrKRh5BY1LR -81aJGKcJ2XbcDu6wMZK4oqWbTX2KiYn9GB0woM6nSr/Y6iy1u145YzYxEV/iMwff -DJULAkB8B2MnyzOg0pNFJqBJuH29bKCcHa8gHJzqXhNO5lAlEbMK95p/P2Wi+4Hd -aiEIAF1BF326QJcvYKmwSmrORp85AkAlSNxRJ50OWrfMZnBgzVjDx3xG6KsFQVk2 -ol6VhqL6dFgKUORFUWBvnKSyhjJxurlPEahV6oo6+A+mPhFY8eUvAkAZQyTdupP3 -XEFQKctGz+9+gKkemDp7LBBMEMBXrGTLPhpEfcjv/7KPdnFHYmhYeBTBnuVmTVWe -F98XJ7tIFfJq +MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDnE443EknxvxBq +6+hvn/t09hl8hx366EBYvZmVM/NC+7igXRAjiJiA/mIaCvL3MS0Iz5hBLxSGICU+ +WproA3GCIFITIwcf/ETyWj/5xpgZ4AKrLrjQmmX8mhwUajfF3UvwMJrCOVqPp67t +PtP+2kBXaqrXdvnvXR41FsIB8V7zIAuIZB6bHQhiGVlc1sgZYsE2EGG9WMmHtS86 +qkAOTjG2XyjmPTGAwhGDpYkYrpzp99IiDh4/Veai81hn0ssQkbry0XRD/Ig3jcHh +23WiriPNJ0JsbgXUSLKRPZObA9VgOLy2aXoN84IMaeK3yy+cwSYG/99w93fUZJte +MXwz4oYZAgMBAAECggEBAIVn2Ncai+4xbH0OLWckabwgyJ4IM9rDc0LIU368O1kU +koais8qP9dujAWgfoh3sGh/YGgKn96VnsZjKHlyMgF+r4TaDJn3k2rlAOWcurGlj +1qaVlsV4HiEzp7pxiDmHhWvp4672Bb6iBG+bsjCUOEk/n9o9KhZzIBluRhtxCmw5 +nw4Do7z00PTvN81260uPWSc04IrytvZUiAIx/5qxD72bij2xJ8t/I9GI8g4FtoVB +8pB6S/hJX1PZhh9VlU6Yk+TOfOVnbebG4W5138LkB835eqk3Zz0qsbc2euoi8Hxi +y1VGwQEmMQ63jXz4c6g+X55ifvUK9Jpn5E8pq+pMd7ECgYEA93lYq+Cr54K4ey5t +sWMa+ye5RqxjzgXj2Kqr55jb54VWG7wp2iGbg8FMlkQwzTJwebzDyCSatguEZLuB +gRGroRnsUOy9vBvhKPOch9bfKIl6qOgzMJB267fBVWx5ybnRbWN/I7RvMQf3k+9y +biCIVnxDLEEYyx7z85/5qxsXg/MCgYEA7wmWKtCTn032Hy9P8OL49T0X6Z8FlkDC +Rk42ygrc/MUbugq9RGUxcCxoImOG9JXUpEtUe31YDm2j+/nbvrjl6/bP2qWs0V7l +dTJl6dABP51pCw8+l4cWgBBX08Lkeen812AAFNrjmDCjX6rHjWHLJcpS18fnRRkP +V1d/AHWX7MMCgYEA6Gsw2guhp0Zf2GCcaNK5DlQab8OL4Hwrpttzo4kuTlwtqNKp +Q9H4al9qfF4Cr1TFya98+EVYf8yFRM3NLNjZpe3gwYf2EerlJj7VLcahw0KKzoN1 +QBENfwgPLRk5sDkx9VhSmcfl/diLroZdpAwtv3vo4nEoxeuGFbKTGx3Qkf0CgYEA +xyR+dcb05Ygm3w4klHQTowQ10s1H80iaUcZBgQuR1ghEtDbUPZHsoR5t1xCB02ys +DgAwLv1bChIvxvH/L6KM8ovZ2LekBX4AviWxoBxJnfz/EVau98B0b1auRN6eSC83 +FRuGldlSOW1z/nSh8ViizSYE5H5HX1qkXEippvFRE88CgYB3Bfu3YQY60ITWIShv +nNkdcbTT9eoP9suaRJjw92Ln+7ZpALYlQMKUZmJ/5uBmLs4RFwUTQruLOPL4yLTH +awADWUzs3IRr1fwn9E+zM8JVyKCnUEM3w4N5UZskGO2klashAd30hWO+knRv/y0r +uGIYs9Ek7YXlXIRVrzMwcsrt1w== -----END PRIVATE KEY----- diff --git a/src/csharp/Grpc.IntegrationTesting/data/server1.pem b/src/csharp/Grpc.IntegrationTesting/data/server1.pem index f3d43fcc5be..88244f856c6 100644 --- a/src/csharp/Grpc.IntegrationTesting/data/server1.pem +++ b/src/csharp/Grpc.IntegrationTesting/data/server1.pem @@ -1,16 +1,22 @@ -----BEGIN CERTIFICATE----- -MIICnDCCAgWgAwIBAgIBBzANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJBVTET -MBEGA1UECBMKU29tZS1TdGF0ZTEhMB8GA1UEChMYSW50ZXJuZXQgV2lkZ2l0cyBQ -dHkgTHRkMQ8wDQYDVQQDEwZ0ZXN0Y2EwHhcNMTUxMTA0MDIyMDI0WhcNMjUxMTAx -MDIyMDI0WjBlMQswCQYDVQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNV -BAcTB0NoaWNhZ28xFTATBgNVBAoTDEV4YW1wbGUsIENvLjEaMBgGA1UEAxQRKi50 -ZXN0Lmdvb2dsZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAOHDFSco -LCVJpYDDM4HYtIdV6Ake/sMNaaKdODjDMsux/4tDydlumN+fm+AjPEK5GHhGn1Bg -zkWF+slf3BxhrA/8dNsnunstVA7ZBgA/5qQxMfGAq4wHNVX77fBZOgp9VlSMVfyd -9N8YwbBYAckOeUQadTi2X1S6OgJXgQ0m3MWhAgMBAAGjazBpMAkGA1UdEwQCMAAw -CwYDVR0PBAQDAgXgME8GA1UdEQRIMEaCECoudGVzdC5nb29nbGUuZnKCGHdhdGVy -em9vaS50ZXN0Lmdvb2dsZS5iZYISKi50ZXN0LnlvdXR1YmUuY29thwTAqAEDMA0G -CSqGSIb3DQEBCwUAA4GBAJFXVifQNub1LUP4JlnX5lXNlo8FxZ2a12AFQs+bzoJ6 -hM044EDjqyxUqSbVePK0ni3w1fHQB5rY9yYC5f8G7aqqTY1QOhoUk8ZTSTRpnkTh -y4jjdvTZeLDVBlueZUTDRmy2feY5aZIU18vFDK08dTG0A87pppuv1LNIR3loveU8 +MIIDtDCCApygAwIBAgIUbJfTREJ6k6/+oInWhV1O1j3ZT0IwDQYJKoZIhvcNAQEL +BQAwVjELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM +GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEPMA0GA1UEAwwGdGVzdGNhMB4XDTIw +MDMxODAzMTA0MloXDTMwMDMxNjAzMTA0MlowZTELMAkGA1UEBhMCVVMxETAPBgNV +BAgMCElsbGlub2lzMRAwDgYDVQQHDAdDaGljYWdvMRUwEwYDVQQKDAxFeGFtcGxl +LCBDby4xGjAYBgNVBAMMESoudGVzdC5nb29nbGUuY29tMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEA5xOONxJJ8b8Qauvob5/7dPYZfIcd+uhAWL2ZlTPz +Qvu4oF0QI4iYgP5iGgry9zEtCM+YQS8UhiAlPlqa6ANxgiBSEyMHH/xE8lo/+caY +GeACqy640Jpl/JocFGo3xd1L8DCawjlaj6eu7T7T/tpAV2qq13b5710eNRbCAfFe +8yALiGQemx0IYhlZXNbIGWLBNhBhvVjJh7UvOqpADk4xtl8o5j0xgMIRg6WJGK6c +6ffSIg4eP1XmovNYZ9LLEJG68tF0Q/yIN43B4dt1oq4jzSdCbG4F1EiykT2TmwPV +YDi8tml6DfOCDGnit8svnMEmBv/fcPd31GSbXjF8M+KGGQIDAQABo2swaTAJBgNV +HRMEAjAAMAsGA1UdDwQEAwIF4DBPBgNVHREESDBGghAqLnRlc3QuZ29vZ2xlLmZy +ghh3YXRlcnpvb2kudGVzdC5nb29nbGUuYmWCEioudGVzdC55b3V0dWJlLmNvbYcE +wKgBAzANBgkqhkiG9w0BAQsFAAOCAQEAS8hDQA8PSgipgAml7Q3/djwQ644ghWQv +C2Kb+r30RCY1EyKNhnQnIIh/OUbBZvh0M0iYsy6xqXgfDhCB93AA6j0i5cS8fkhH +Jl4RK0tSkGQ3YNY4NzXwQP/vmUgfkw8VBAZ4Y4GKxppdATjffIW+srbAmdDruIRM +wPeikgOoRrXf0LA1fi4TqxARzeRwenQpayNfGHTvVF9aJkl8HoaMunTAdG5pIVcr +9GKi/gEMpXUJbbVv3U5frX1Wo4CFo+rZWJ/LyCMeb0jciNLxSdMwj/E/ZuExlyeZ +gc9ctPjSMvgSyXEKv6Vwobleeg88V2ZgzenziORoWj4KszG/lbQZvg== -----END CERTIFICATE----- From 46bb3769a9344d294270a05f3ee898f4900f76b4 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Wed, 18 Mar 2020 10:13:05 -0700 Subject: [PATCH 218/758] Override the auth plugin behavior --- .../grpc/_cython/_cygrpc/aio/iomgr/iomgr.pyx.pxi | 11 +++++++++++ .../grpc/_cython/_cygrpc/credentials.pyx.pxi | 14 ++++++++------ .../tests_aio/unit/secure_call_test.py | 2 +- 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/iomgr/iomgr.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/iomgr/iomgr.pyx.pxi index ac62c41e0f2..f5b62af5287 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/iomgr/iomgr.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/iomgr/iomgr.pyx.pxi @@ -212,7 +212,18 @@ cdef void asyncio_run_loop(size_t timeout_ms) with gil: pass +def _auth_plugin_callback_wrapper(object cb, + str service_url, + str method_name, + object callback): + asyncio.get_event_loop().call_soon(cb, service_url, method_name, callback) + + def install_asyncio_iomgr(): + # Auth plugins invoke user provided logic in another thread by default. We + # need to override that behavior by registering the call to the event loop. + set_async_callback_func(_auth_plugin_callback_wrapper) + asyncio_resolver_vtable.resolve = asyncio_resolve asyncio_resolver_vtable.resolve_async = asyncio_resolve_async diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi index c736b7a10c5..24d1e2a3b77 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi @@ -34,12 +34,14 @@ cdef class CallCredentials: raise NotImplementedError() -cdef int _get_metadata( - void *state, grpc_auth_metadata_context context, - grpc_credentials_plugin_metadata_cb cb, void *user_data, - grpc_metadata creds_md[GRPC_METADATA_CREDENTIALS_PLUGIN_SYNC_MAX], - size_t *num_creds_md, grpc_status_code *status, - const char **error_details) except * with gil: +cdef int _get_metadata(void *state, + grpc_auth_metadata_context context, + grpc_credentials_plugin_metadata_cb cb, + void *user_data, + grpc_metadata creds_md[GRPC_METADATA_CREDENTIALS_PLUGIN_SYNC_MAX], + size_t *num_creds_md, + grpc_status_code *status, + const char **error_details) except * with gil: cdef size_t metadata_count cdef grpc_metadata *c_metadata def callback(metadata, grpc_status_code status, bytes error_details): diff --git a/src/python/grpcio_tests/tests_aio/unit/secure_call_test.py b/src/python/grpcio_tests/tests_aio/unit/secure_call_test.py index e6b69331d24..7efaddd607e 100644 --- a/src/python/grpcio_tests/tests_aio/unit/secure_call_test.py +++ b/src/python/grpcio_tests/tests_aio/unit/secure_call_test.py @@ -126,5 +126,5 @@ class TestStreamStreamSecureCall(_SecureCallMixin, AioTestBase): if __name__ == '__main__': - logging.basicConfig() + logging.basicConfig(level=logging.DEBUG) unittest.main(verbosity=2) From a82f8f3dd79025913e53de5e9fb544f8093399a0 Mon Sep 17 00:00:00 2001 From: Richard Belleville Date: Wed, 18 Mar 2020 17:15:09 +0000 Subject: [PATCH 219/758] Ensure unit tests don't pick up interop client --- src/python/grpcio_tests/tests/interop/BUILD.bazel | 13 ------------- .../grpcio_tests/tests_py3_only/interop/BUILD.bazel | 12 ++++++++++++ .../interop/xds_interop_client.py | 0 3 files changed, 12 insertions(+), 13 deletions(-) create mode 100644 src/python/grpcio_tests/tests_py3_only/interop/BUILD.bazel rename src/python/grpcio_tests/{tests => tests_py3_only}/interop/xds_interop_client.py (100%) diff --git a/src/python/grpcio_tests/tests/interop/BUILD.bazel b/src/python/grpcio_tests/tests/interop/BUILD.bazel index cd47bee2172..4685852162b 100644 --- a/src/python/grpcio_tests/tests/interop/BUILD.bazel +++ b/src/python/grpcio_tests/tests/interop/BUILD.bazel @@ -115,16 +115,3 @@ py2and3_test( "//src/python/grpcio_tests/tests/unit:test_common", ], ) - -py_binary( - name = "xds_interop_client", - srcs = ["xds_interop_client.py"], - python_version = "PY3", - deps = [ - "//src/proto/grpc/testing:empty_py_pb2", - "//src/proto/grpc/testing:py_messages_proto", - "//src/proto/grpc/testing:py_test_proto", - "//src/proto/grpc/testing:test_py_pb2_grpc", - "//src/python/grpcio/grpc:grpcio", - ], -) diff --git a/src/python/grpcio_tests/tests_py3_only/interop/BUILD.bazel b/src/python/grpcio_tests/tests_py3_only/interop/BUILD.bazel new file mode 100644 index 00000000000..21d207119d0 --- /dev/null +++ b/src/python/grpcio_tests/tests_py3_only/interop/BUILD.bazel @@ -0,0 +1,12 @@ +py_binary( + name = "xds_interop_client", + srcs = ["xds_interop_client.py"], + python_version = "PY3", + deps = [ + "//src/proto/grpc/testing:empty_py_pb2", + "//src/proto/grpc/testing:py_messages_proto", + "//src/proto/grpc/testing:py_test_proto", + "//src/proto/grpc/testing:test_py_pb2_grpc", + "//src/python/grpcio/grpc:grpcio", + ], +) diff --git a/src/python/grpcio_tests/tests/interop/xds_interop_client.py b/src/python/grpcio_tests/tests_py3_only/interop/xds_interop_client.py similarity index 100% rename from src/python/grpcio_tests/tests/interop/xds_interop_client.py rename to src/python/grpcio_tests/tests_py3_only/interop/xds_interop_client.py From e5432a73f86a308805e033609206c2f9c40bd049 Mon Sep 17 00:00:00 2001 From: Donna Dionne Date: Wed, 18 Mar 2020 10:28:26 -0700 Subject: [PATCH 220/758] Adding an error to properly report credential missing CreateXdsChannel. This will allow the failure to properly shutdown everything like this: I0318 17:23:32.444358867 27538 xds_client.cc:1811] [xds_client 0x55ea110cff10] creating xds client I0318 17:23:32.444401674 27538 xds_client.cc:1819] [xds_client 0x55ea110cff10] creating channel to trafficdirector.googleapis.com:443 E0318 17:23:32.444461219 27538 xds_client.cc:1826] [xds_client 0x55ea110cff10] failed to create xds channel: {"created":"@1584552212.444450255","description":"no credential found","file":"/home/donnadionne/v128/grpc/src/core/ext/filters/client_channel/xds/xds_channel.cc","file_line":36} E0318 17:23:32.444515988 27538 xds_resolver.cc:118] Failed to create xds client -- channel will remain in TRANSIENT_FAILURE: {"created":"@1584552212.444450255","description":"no credential found","file":"/home/donnadionne/v128/grpc/src/core/ext/filters/client_channel/xds/xds_channel.cc","file_line":36} I0318 17:23:32.444613149 27538 completion_queue.cc:788] cq_end_op_for_pluck(cq=0x55ea110cfa10, tag=0x7ffd7e2fb1b0, error="No Error", done=0x55ea10c9b035, done_arg=0x55ea110d7310, storage=0x55ea110d7380) I0318 17:23:32.444667902 27538 completion_queue.cc:1319] RETURN_EVENT[0x55ea110cfa10]: OP_COMPLETE: tag:0x7ffd7e2fb1b0 OK I0318 17:23:32.444726001 27538 completion_queue.cc:1425] grpc_completion_queue_destroy(cq=0x55ea110cfa10) I0318 17:23:32.444768059 27538 completion_queue.cc:1419] grpc_completion_queue_shutdown(cq=0x55ea110cfa10) I0318 17:23:32.444812370 27538 init.cc:212] grpc_shutdown(void) 2: Failed to pick subchannel I0318 17:23:32.444928463 27538 call.cc:573] grpc_call_unref(c=0x55ea110d6320) I0318 17:23:32.445024834 27538 metadata_array.cc:34] grpc_metadata_array_destroy(array=0x7ffd7e2fb770) I0318 17:23:32.445071369 27538 metadata_array.cc:34] grpc_metadata_array_destroy(array=0x7ffd7e2fb720) Greeter received: RPC failed I0318 17:23:32.445153945 27538 channel.cc:510] grpc_channel_destroy(channel=0x55ea110c7a80) I0318 17:23:32.445203614 27538 xds_client.cc:1846] [xds_client 0x55ea110cff10] shutting down xds client I0318 17:23:32.445247579 27538 ref_counted.h:199] xds_client:0x55ea110cff18 /home/donnadionne/v128/grpc/src/core/ext/filters/client_channel/xds/xds_client.cc:1860 unref 1 -> 0 XdsClient::Orphan() I0318 17:23:32.445289154 27538 xds_client.cc:1839] [xds_client 0x55ea110cff10] destroying xds client I0318 17:23:32.445353536 27538 init.cc:212] grpc_shutdown(void) I0318 17:23:32.445404973 27538 init.cc:212] grpc_shutdown(void) Instead of silently like this: I0318 01:10:03.085766343 8544 xds_client.cc:1811] [xds_client 0x55fe23fa3f10] creating xds client I0318 01:10:03.085809647 8544 xds_client.cc:1819] [xds_client 0x55fe23fa3f10] creating channel to trafficdirector.googleapis.com:443 I0318 01:10:03.085904230 8544 ref_counted.h:103] xds_client:0x55fe23fa3f18 /home/donnadionne/v128/grpc/src/core/ext/filters/client_channel/xds/xds_client.cc:1831 ref 1 -> 2 XdsClient+ChannelState E0318 01:10:03.085946286 8544 xds_client.cc:483] assertion failed: channel_ != nullptr --- src/core/ext/filters/client_channel/xds/xds_channel.cc | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/core/ext/filters/client_channel/xds/xds_channel.cc b/src/core/ext/filters/client_channel/xds/xds_channel.cc index ffb92064f7c..8edf3df6188 100644 --- a/src/core/ext/filters/client_channel/xds/xds_channel.cc +++ b/src/core/ext/filters/client_channel/xds/xds_channel.cc @@ -30,8 +30,11 @@ grpc_channel_args* ModifyXdsChannelArgs(grpc_channel_args* args) { grpc_channel* CreateXdsChannel(const XdsBootstrap& bootstrap, const grpc_channel_args& args, - grpc_error** /*error*/) { - if (!bootstrap.server().channel_creds.empty()) return nullptr; + grpc_error** error) { + if (!bootstrap.server().channel_creds.empty()) { + *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING("no credential found"); + return nullptr; + } return grpc_insecure_channel_create(bootstrap.server().server_uri.c_str(), &args, nullptr); } From 3e19b04abf7952ba8cdd66e22dcd2ad3117db1e0 Mon Sep 17 00:00:00 2001 From: Donna Dionne Date: Wed, 18 Mar 2020 10:49:58 -0700 Subject: [PATCH 221/758] Fixing the error message. --- src/core/ext/filters/client_channel/xds/xds_channel.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/core/ext/filters/client_channel/xds/xds_channel.cc b/src/core/ext/filters/client_channel/xds/xds_channel.cc index 8edf3df6188..1a3cf54cf0d 100644 --- a/src/core/ext/filters/client_channel/xds/xds_channel.cc +++ b/src/core/ext/filters/client_channel/xds/xds_channel.cc @@ -32,7 +32,8 @@ grpc_channel* CreateXdsChannel(const XdsBootstrap& bootstrap, const grpc_channel_args& args, grpc_error** error) { if (!bootstrap.server().channel_creds.empty()) { - *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING("no credential found"); + *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "credential specified but gRPC not built with security"); return nullptr; } return grpc_insecure_channel_create(bootstrap.server().server_uri.c_str(), From 158a68f4f0306723cff99f37023b40ff0fb9e4af Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Wed, 18 Mar 2020 11:49:26 -0700 Subject: [PATCH 222/758] Annotate channel context manager methods to make pytype happy --- src/python/grpcio/grpc/__init__.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/python/grpcio/grpc/__init__.py b/src/python/grpcio/grpc/__init__.py index 1d140be95f0..a6c9275d5c8 100644 --- a/src/python/grpcio/grpc/__init__.py +++ b/src/python/grpcio/grpc/__init__.py @@ -1076,6 +1076,14 @@ class Channel(six.with_metaclass(abc.ABCMeta)): """ raise NotImplementedError() + def __enter__(self): + """Enters the runtime context related to the channel object.""" + raise NotImplementedError() + + def __exit__(self, exc_type, exc_val, exc_tb): + """Exits the runtime context related to the channel object.""" + raise NotImplementedError() + ########################## Service-Side Context ############################## From 611cf644bc0ca9bedb72d814e385fea7db2905fb Mon Sep 17 00:00:00 2001 From: "Mark D. Roth" Date: Wed, 18 Mar 2020 12:12:34 -0700 Subject: [PATCH 223/758] Use wait_for_ready for xds calls. --- .../filters/client_channel/lb_policy/xds/xds.cc | 16 +++++++++------- .../ext/filters/client_channel/xds/xds_client.cc | 6 ++++-- test/cpp/end2end/xds_end2end_test.cc | 2 +- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc b/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc index d5109c150d7..eeef5fb66c3 100644 --- a/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc +++ b/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc @@ -920,12 +920,14 @@ void XdsLb::UpdateXdsPickerLocked() { // If we are in fallback mode, don't generate an xds picker from localities. if (fallback_policy_ != nullptr) return; if (current_priority_ == UINT32_MAX) { - grpc_error* error = grpc_error_set_int( - GRPC_ERROR_CREATE_FROM_STATIC_STRING("no ready locality map"), - GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE); - channel_control_helper()->UpdateState( - GRPC_CHANNEL_TRANSIENT_FAILURE, - absl::make_unique(error)); + if (fallback_policy_ == nullptr) { + grpc_error* error = grpc_error_set_int( + GRPC_ERROR_CREATE_FROM_STATIC_STRING("no ready locality map"), + GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE); + channel_control_helper()->UpdateState( + GRPC_CHANNEL_TRANSIENT_FAILURE, + absl::make_unique(error)); + } return; } priorities_[current_priority_]->UpdateXdsPickerLocked(); @@ -1022,7 +1024,7 @@ XdsLb::LocalityMap::LocalityMap(RefCountedPtr xds_policy, &on_failover_timer_); failover_timer_callback_pending_ = true; // This is the first locality map ever created, report CONNECTING. - if (priority_ == 0) { + if (priority_ == 0 && xds_policy_->fallback_policy_ == nullptr) { xds_policy_->channel_control_helper()->UpdateState( GRPC_CHANNEL_CONNECTING, absl::make_unique( diff --git a/src/core/ext/filters/client_channel/xds/xds_client.cc b/src/core/ext/filters/client_channel/xds/xds_client.cc index 631c7f9a504..f0634ebe4da 100644 --- a/src/core/ext/filters/client_channel/xds/xds_client.cc +++ b/src/core/ext/filters/client_channel/xds/xds_client.cc @@ -704,7 +704,8 @@ XdsClient::ChannelState::AdsCallState::AdsCallState( grpc_op* op = ops; op->op = GRPC_OP_SEND_INITIAL_METADATA; op->data.send_initial_metadata.count = 0; - op->flags = 0; + op->flags = GRPC_INITIAL_METADATA_WAIT_FOR_READY | + GRPC_INITIAL_METADATA_WAIT_FOR_READY_EXPLICITLY_SET; op->reserved = nullptr; op++; call_error = grpc_call_start_batch_and_execute(call_, ops, (size_t)(op - ops), @@ -1520,7 +1521,8 @@ XdsClient::ChannelState::LrsCallState::LrsCallState( grpc_op* op = ops; op->op = GRPC_OP_SEND_INITIAL_METADATA; op->data.send_initial_metadata.count = 0; - op->flags = 0; + op->flags = GRPC_INITIAL_METADATA_WAIT_FOR_READY | + GRPC_INITIAL_METADATA_WAIT_FOR_READY_EXPLICITLY_SET; op->reserved = nullptr; op++; // Op: send request message. diff --git a/test/cpp/end2end/xds_end2end_test.cc b/test/cpp/end2end/xds_end2end_test.cc index a2c0ee6f382..3d84e6afab2 100644 --- a/test/cpp/end2end/xds_end2end_test.cc +++ b/test/cpp/end2end/xds_end2end_test.cc @@ -3108,7 +3108,7 @@ TEST_P(FallbackTest, FallbackModeIsExitedWhenBalancerSaysToDropAllCalls) { } // Tests that fallback mode is exited if the child policy becomes ready. -TEST_P(FallbackTest, FallbackModeIsExitedAfterChildRready) { +TEST_P(FallbackTest, FallbackModeIsExitedAfterChildReady) { // Return an unreachable balancer and one fallback backend. SetNextResolution({backends_[0]->port()}); SetNextResolutionForLbChannel({g_port_saver->GetPort()}); From 1797b84e0eb871a9773709d7260c4a8bb221f755 Mon Sep 17 00:00:00 2001 From: Alexander Polcyn Date: Wed, 18 Mar 2020 13:06:55 -0700 Subject: [PATCH 224/758] Add 1.27.3 to the interop matrix --- tools/interop_matrix/client_matrix.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tools/interop_matrix/client_matrix.py b/tools/interop_matrix/client_matrix.py index 92768508834..96e2b33c614 100644 --- a/tools/interop_matrix/client_matrix.py +++ b/tools/interop_matrix/client_matrix.py @@ -104,6 +104,7 @@ LANG_RELEASE_MATRIX = { ('v1.24.0', ReleaseInfo()), ('v1.25.0', ReleaseInfo()), ('v1.26.0', ReleaseInfo()), + ('v1.27.3', ReleaseInfo()), ]), 'go': OrderedDict([ @@ -268,6 +269,7 @@ LANG_RELEASE_MATRIX = { ('v1.24.0', ReleaseInfo(runtimes=['python'])), ('v1.25.0', ReleaseInfo(runtimes=['python'])), ('v1.26.0', ReleaseInfo(runtimes=['python'])), + ('v1.27.3', ReleaseInfo(runtimes=['python'])), ]), 'node': OrderedDict([ @@ -325,6 +327,7 @@ LANG_RELEASE_MATRIX = { # If you are not encountering the error in above issue # go ahead and upload the docker image for new releases. ('v1.26.0', ReleaseInfo()), + ('v1.27.3', ReleaseInfo()), ]), 'php': OrderedDict([ @@ -355,6 +358,7 @@ LANG_RELEASE_MATRIX = { ('v1.24.0', ReleaseInfo()), ('v1.25.0', ReleaseInfo()), ('v1.26.0', ReleaseInfo()), + ('v1.27.3', ReleaseInfo()), ]), 'csharp': OrderedDict([ @@ -390,5 +394,6 @@ LANG_RELEASE_MATRIX = { ('v1.24.0', ReleaseInfo()), ('v1.25.0', ReleaseInfo()), ('v1.26.0', ReleaseInfo()), + ('v1.27.3', ReleaseInfo()), ]), } From 6fbf67ed9c1589b013fd0439ea5bf3e26b6a4c7c Mon Sep 17 00:00:00 2001 From: Ashitha Santhosh Date: Wed, 18 Mar 2020 14:11:23 -0700 Subject: [PATCH 225/758] Modified test variable name --- test/core/tsi/alts/handshaker/alts_tsi_handshaker_test.cc | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/test/core/tsi/alts/handshaker/alts_tsi_handshaker_test.cc b/test/core/tsi/alts/handshaker/alts_tsi_handshaker_test.cc index bbbf2ae11b8..a58e36df62f 100644 --- a/test/core/tsi/alts/handshaker/alts_tsi_handshaker_test.cc +++ b/test/core/tsi/alts/handshaker/alts_tsi_handshaker_test.cc @@ -49,9 +49,9 @@ #define ALTS_TSI_HANDSHAKER_TEST_APPLICATION_PROTOCOL \ "test application protocol" #define ALTS_TSI_HANDSHAKER_TEST_RECORD_PROTOCOL "test record protocol" +#define ALTS_TSI_HANDSHAKER_TEST_MIN_FRAME_SIZE 16 * 1024 #define ALTS_TSI_HANDSHAKER_TEST_MAX_FRAME_SIZE 256 * 1024 #define ALTS_TSI_HANDSHAKER_TEST_DEFAULT_MAX_FRAME_SIZE 128 * 1024 -#define ALTS_TSI_HANDSHAKER_TEST_MIN_MAX_FRAME_SIZE 16 * 1024 using grpc_core::internal::alts_handshaker_client_check_fields_for_testing; using grpc_core::internal::alts_handshaker_client_get_handshaker_for_testing; @@ -371,8 +371,7 @@ static void on_server_next_success_cb(tsi_result status, void* user_data, size_t actual_max_frame_size; tsi_zero_copy_grpc_protector_max_frame_size(zero_copy_protector, &actual_max_frame_size); - GPR_ASSERT(actual_max_frame_size, - ALTS_TSI_HANDSHAKER_TEST_MIN_MAX_FRAME_SIZE); + GPR_ASSERT(actual_max_frame_size, ALTS_TSI_HANDSHAKER_TEST_MIN_FRAME_SIZE); /* Validate peer identity. */ tsi_peer peer; GPR_ASSERT(tsi_handshaker_result_extract_peer(result, &peer) == TSI_OK); From 4319d0224604692c1a8ec34301ba9d90c1717cd0 Mon Sep 17 00:00:00 2001 From: Richard Belleville Date: Wed, 18 Mar 2020 22:05:25 +0000 Subject: [PATCH 226/758] Correct python run script path --- tools/internal_ci/linux/grpc_xds_python.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/internal_ci/linux/grpc_xds_python.cfg b/tools/internal_ci/linux/grpc_xds_python.cfg index cf6f3d5757b..e635b334dbd 100644 --- a/tools/internal_ci/linux/grpc_xds_python.cfg +++ b/tools/internal_ci/linux/grpc_xds_python.cfg @@ -19,5 +19,5 @@ build_file: "grpc/tools/internal_ci/linux/grpc_bazel.sh" timeout_mins: 90 env_vars { key: "BAZEL_SCRIPT" - value: "tools/internal_ci/linux/grpc_xds_python_bazel_test_in_docker.sh" + value: "tools/internal_ci/linux/grpc_xds_bazel_python_test_in_docker.sh" } From 56861fb9709fe0ba947e6e5d83ddb88386245c1b Mon Sep 17 00:00:00 2001 From: Richard Belleville Date: Wed, 18 Mar 2020 23:26:20 +0000 Subject: [PATCH 227/758] Fix path to target --- .../internal_ci/linux/grpc_xds_bazel_python_test_in_docker.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/internal_ci/linux/grpc_xds_bazel_python_test_in_docker.sh b/tools/internal_ci/linux/grpc_xds_bazel_python_test_in_docker.sh index 1eecd28015c..0dbea2f59ee 100755 --- a/tools/internal_ci/linux/grpc_xds_bazel_python_test_in_docker.sh +++ b/tools/internal_ci/linux/grpc_xds_bazel_python_test_in_docker.sh @@ -45,7 +45,7 @@ touch "$TOOLS_DIR"/src/proto/grpc/testing/__init__.py "$PROTO_SOURCE_DIR"/messages.proto \ "$PROTO_SOURCE_DIR"/empty.proto -bazel build //src/python/grpcio_tests/tests/interop:xds_interop_client +bazel build //src/python/grpcio_tests/tests_py3_only/interop:xds_interop_client GRPC_VERBOSITY=debug GRPC_TRACE=xds_client,xds_resolver,cds_lb,xds_lb "$PYTHON" \ tools/run_tests/run_xds_tests.py \ @@ -53,4 +53,4 @@ GRPC_VERBOSITY=debug GRPC_TRACE=xds_client,xds_resolver,cds_lb,xds_lb "$PYTHON" --project_id=grpc-testing \ --gcp_suffix=$(date '+%s') \ --verbose \ - --client_cmd='bazel run //src/python/grpcio_tests/tests/interop:xds_interop_client -- --server=xds-experimental:///{server_uri} --stats_port={stats_port} --qps={qps} --verbose' + --client_cmd='bazel run //src/python/grpcio_tests/tests_py3_only/interop:xds_interop_client -- --server=xds-experimental:///{server_uri} --stats_port={stats_port} --qps={qps} --verbose' From 2620763fdde1d68571b977f96e2ef463c763d527 Mon Sep 17 00:00:00 2001 From: jiangtaoli2016 Date: Wed, 18 Mar 2020 16:48:22 -0700 Subject: [PATCH 228/758] Update test creds for php, python, ruby --- src/php/tests/data/ca.pem | 31 ++++++++------ src/php/tests/data/server1.key | 40 ++++++++++++------- src/php/tests/data/server1.pem | 34 +++++++++------- .../tests/interop/credentials/ca.pem | 31 ++++++++------ .../tests/interop/credentials/server1.key | 40 ++++++++++++------- .../tests/interop/credentials/server1.pem | 34 +++++++++------- .../tests/unit/credentials/ca.pem | 31 ++++++++------ .../tests/unit/credentials/server1.key | 40 ++++++++++++------- .../tests/unit/credentials/server1.pem | 34 +++++++++------- src/ruby/spec/testdata/ca.pem | 31 ++++++++------ src/ruby/spec/testdata/client.key | 40 ++++++++++++------- src/ruby/spec/testdata/client.pem | 30 ++++++++------ src/ruby/spec/testdata/server1.key | 40 ++++++++++++------- src/ruby/spec/testdata/server1.pem | 34 +++++++++------- 14 files changed, 300 insertions(+), 190 deletions(-) diff --git a/src/php/tests/data/ca.pem b/src/php/tests/data/ca.pem index 6c8511a73c6..49d39cd8ed5 100755 --- a/src/php/tests/data/ca.pem +++ b/src/php/tests/data/ca.pem @@ -1,15 +1,20 @@ -----BEGIN CERTIFICATE----- -MIICSjCCAbOgAwIBAgIJAJHGGR4dGioHMA0GCSqGSIb3DQEBCwUAMFYxCzAJBgNV -BAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBX -aWRnaXRzIFB0eSBMdGQxDzANBgNVBAMTBnRlc3RjYTAeFw0xNDExMTEyMjMxMjla -Fw0yNDExMDgyMjMxMjlaMFYxCzAJBgNVBAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0 -YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQxDzANBgNVBAMT -BnRlc3RjYTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwEDfBV5MYdlHVHJ7 -+L4nxrZy7mBfAVXpOc5vMYztssUI7mL2/iYujiIXM+weZYNTEpLdjyJdu7R5gGUu -g1jSVK/EPHfc74O7AyZU34PNIP4Sh33N+/A5YexrNgJlPY+E3GdVYi4ldWJjgkAd -Qah2PH5ACLrIIC6tRka9hcaBlIECAwEAAaMgMB4wDAYDVR0TBAUwAwEB/zAOBgNV -HQ8BAf8EBAMCAgQwDQYJKoZIhvcNAQELBQADgYEAHzC7jdYlzAVmddi/gdAeKPau -sPBG/C2HCWqHzpCUHcKuvMzDVkY/MP2o6JIW2DBbY64bO/FceExhjcykgaYtCH/m -oIU63+CFOTtR7otyQAWHqXa7q4SbCDlG7DyRFxqG0txPtGvy12lgldA2+RgcigQG -Dfcog5wrJytaQ6UA0wE= +MIIDWjCCAkKgAwIBAgIUWrP0VvHcy+LP6UuYNtiL9gBhD5owDQYJKoZIhvcNAQEL +BQAwVjELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM +GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEPMA0GA1UEAwwGdGVzdGNhMB4XDTIw +MDMxNzE4NTk1MVoXDTMwMDMxNTE4NTk1MVowVjELMAkGA1UEBhMCQVUxEzARBgNV +BAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0 +ZDEPMA0GA1UEAwwGdGVzdGNhMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAsGL0oXflF0LzoM+Bh+qUU9yhqzw2w8OOX5mu/iNCyUOBrqaHi7mGHx73GD01 +diNzCzvlcQqdNIH6NQSL7DTpBjca66jYT9u73vZe2MDrr1nVbuLvfu9850cdxiUO +Inv5xf8+sTHG0C+a+VAvMhsLiRjsq+lXKRJyk5zkbbsETybqpxoJ+K7CoSy3yc/k +QIY3TipwEtwkKP4hzyo6KiGd/DPexie4nBUInN3bS1BUeNZ5zeaIC2eg3bkeeW7c +qT55b+Yen6CxY0TEkzBK6AKt/WUialKMgT0wbTxRZO7kUCH3Sq6e/wXeFdJ+HvdV +LPlAg5TnMaNpRdQih/8nRFpsdwIDAQABoyAwHjAMBgNVHRMEBTADAQH/MA4GA1Ud +DwEB/wQEAwICBDANBgkqhkiG9w0BAQsFAAOCAQEAkTrKZjBrJXHps/HrjNCFPb5a +THuGPCSsepe1wkKdSp1h4HGRpLoCgcLysCJ5hZhRpHkRihhef+rFHEe60UePQO3S +CVTtdJB4CYWpcNyXOdqefrbJW5QNljxgi6Fhvs7JJkBqdXIkWXtFk2eRgOIP2Eo9 +/OHQHlYnwZFrk6sp4wPyR+A95S0toZBcyDVz7u+hOW0pGK3wviOe9lvRgj/H3Pwt +bewb0l+MhRig0/DVHamyVxrDRbqInU1/GTNCwcZkXKYFWSf92U+kIcTth24Q1gcw +eZiLl5FfrWokUNytFElXob0V0a5/kbhiLc3yWmvWqHTpqCALbVyF+rKJo2f5Kw== -----END CERTIFICATE----- diff --git a/src/php/tests/data/server1.key b/src/php/tests/data/server1.key index 143a5b87658..086462992cf 100755 --- a/src/php/tests/data/server1.key +++ b/src/php/tests/data/server1.key @@ -1,16 +1,28 @@ -----BEGIN PRIVATE KEY----- -MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAOHDFScoLCVJpYDD -M4HYtIdV6Ake/sMNaaKdODjDMsux/4tDydlumN+fm+AjPEK5GHhGn1BgzkWF+slf -3BxhrA/8dNsnunstVA7ZBgA/5qQxMfGAq4wHNVX77fBZOgp9VlSMVfyd9N8YwbBY -AckOeUQadTi2X1S6OgJXgQ0m3MWhAgMBAAECgYAn7qGnM2vbjJNBm0VZCkOkTIWm -V10okw7EPJrdL2mkre9NasghNXbE1y5zDshx5Nt3KsazKOxTT8d0Jwh/3KbaN+YY -tTCbKGW0pXDRBhwUHRcuRzScjli8Rih5UOCiZkhefUTcRb6xIhZJuQy71tjaSy0p -dHZRmYyBYO2YEQ8xoQJBAPrJPhMBkzmEYFtyIEqAxQ/o/A6E+E4w8i+KM7nQCK7q -K4JXzyXVAjLfyBZWHGM2uro/fjqPggGD6QH1qXCkI4MCQQDmdKeb2TrKRh5BY1LR -81aJGKcJ2XbcDu6wMZK4oqWbTX2KiYn9GB0woM6nSr/Y6iy1u145YzYxEV/iMwff -DJULAkB8B2MnyzOg0pNFJqBJuH29bKCcHa8gHJzqXhNO5lAlEbMK95p/P2Wi+4Hd -aiEIAF1BF326QJcvYKmwSmrORp85AkAlSNxRJ50OWrfMZnBgzVjDx3xG6KsFQVk2 -ol6VhqL6dFgKUORFUWBvnKSyhjJxurlPEahV6oo6+A+mPhFY8eUvAkAZQyTdupP3 -XEFQKctGz+9+gKkemDp7LBBMEMBXrGTLPhpEfcjv/7KPdnFHYmhYeBTBnuVmTVWe -F98XJ7tIFfJq +MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDnE443EknxvxBq +6+hvn/t09hl8hx366EBYvZmVM/NC+7igXRAjiJiA/mIaCvL3MS0Iz5hBLxSGICU+ +WproA3GCIFITIwcf/ETyWj/5xpgZ4AKrLrjQmmX8mhwUajfF3UvwMJrCOVqPp67t +PtP+2kBXaqrXdvnvXR41FsIB8V7zIAuIZB6bHQhiGVlc1sgZYsE2EGG9WMmHtS86 +qkAOTjG2XyjmPTGAwhGDpYkYrpzp99IiDh4/Veai81hn0ssQkbry0XRD/Ig3jcHh +23WiriPNJ0JsbgXUSLKRPZObA9VgOLy2aXoN84IMaeK3yy+cwSYG/99w93fUZJte +MXwz4oYZAgMBAAECggEBAIVn2Ncai+4xbH0OLWckabwgyJ4IM9rDc0LIU368O1kU +koais8qP9dujAWgfoh3sGh/YGgKn96VnsZjKHlyMgF+r4TaDJn3k2rlAOWcurGlj +1qaVlsV4HiEzp7pxiDmHhWvp4672Bb6iBG+bsjCUOEk/n9o9KhZzIBluRhtxCmw5 +nw4Do7z00PTvN81260uPWSc04IrytvZUiAIx/5qxD72bij2xJ8t/I9GI8g4FtoVB +8pB6S/hJX1PZhh9VlU6Yk+TOfOVnbebG4W5138LkB835eqk3Zz0qsbc2euoi8Hxi +y1VGwQEmMQ63jXz4c6g+X55ifvUK9Jpn5E8pq+pMd7ECgYEA93lYq+Cr54K4ey5t +sWMa+ye5RqxjzgXj2Kqr55jb54VWG7wp2iGbg8FMlkQwzTJwebzDyCSatguEZLuB +gRGroRnsUOy9vBvhKPOch9bfKIl6qOgzMJB267fBVWx5ybnRbWN/I7RvMQf3k+9y +biCIVnxDLEEYyx7z85/5qxsXg/MCgYEA7wmWKtCTn032Hy9P8OL49T0X6Z8FlkDC +Rk42ygrc/MUbugq9RGUxcCxoImOG9JXUpEtUe31YDm2j+/nbvrjl6/bP2qWs0V7l +dTJl6dABP51pCw8+l4cWgBBX08Lkeen812AAFNrjmDCjX6rHjWHLJcpS18fnRRkP +V1d/AHWX7MMCgYEA6Gsw2guhp0Zf2GCcaNK5DlQab8OL4Hwrpttzo4kuTlwtqNKp +Q9H4al9qfF4Cr1TFya98+EVYf8yFRM3NLNjZpe3gwYf2EerlJj7VLcahw0KKzoN1 +QBENfwgPLRk5sDkx9VhSmcfl/diLroZdpAwtv3vo4nEoxeuGFbKTGx3Qkf0CgYEA +xyR+dcb05Ygm3w4klHQTowQ10s1H80iaUcZBgQuR1ghEtDbUPZHsoR5t1xCB02ys +DgAwLv1bChIvxvH/L6KM8ovZ2LekBX4AviWxoBxJnfz/EVau98B0b1auRN6eSC83 +FRuGldlSOW1z/nSh8ViizSYE5H5HX1qkXEippvFRE88CgYB3Bfu3YQY60ITWIShv +nNkdcbTT9eoP9suaRJjw92Ln+7ZpALYlQMKUZmJ/5uBmLs4RFwUTQruLOPL4yLTH +awADWUzs3IRr1fwn9E+zM8JVyKCnUEM3w4N5UZskGO2klashAd30hWO+knRv/y0r +uGIYs9Ek7YXlXIRVrzMwcsrt1w== -----END PRIVATE KEY----- diff --git a/src/php/tests/data/server1.pem b/src/php/tests/data/server1.pem index f3d43fcc5be..88244f856c6 100755 --- a/src/php/tests/data/server1.pem +++ b/src/php/tests/data/server1.pem @@ -1,16 +1,22 @@ -----BEGIN CERTIFICATE----- -MIICnDCCAgWgAwIBAgIBBzANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJBVTET -MBEGA1UECBMKU29tZS1TdGF0ZTEhMB8GA1UEChMYSW50ZXJuZXQgV2lkZ2l0cyBQ -dHkgTHRkMQ8wDQYDVQQDEwZ0ZXN0Y2EwHhcNMTUxMTA0MDIyMDI0WhcNMjUxMTAx -MDIyMDI0WjBlMQswCQYDVQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNV -BAcTB0NoaWNhZ28xFTATBgNVBAoTDEV4YW1wbGUsIENvLjEaMBgGA1UEAxQRKi50 -ZXN0Lmdvb2dsZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAOHDFSco -LCVJpYDDM4HYtIdV6Ake/sMNaaKdODjDMsux/4tDydlumN+fm+AjPEK5GHhGn1Bg -zkWF+slf3BxhrA/8dNsnunstVA7ZBgA/5qQxMfGAq4wHNVX77fBZOgp9VlSMVfyd -9N8YwbBYAckOeUQadTi2X1S6OgJXgQ0m3MWhAgMBAAGjazBpMAkGA1UdEwQCMAAw -CwYDVR0PBAQDAgXgME8GA1UdEQRIMEaCECoudGVzdC5nb29nbGUuZnKCGHdhdGVy -em9vaS50ZXN0Lmdvb2dsZS5iZYISKi50ZXN0LnlvdXR1YmUuY29thwTAqAEDMA0G -CSqGSIb3DQEBCwUAA4GBAJFXVifQNub1LUP4JlnX5lXNlo8FxZ2a12AFQs+bzoJ6 -hM044EDjqyxUqSbVePK0ni3w1fHQB5rY9yYC5f8G7aqqTY1QOhoUk8ZTSTRpnkTh -y4jjdvTZeLDVBlueZUTDRmy2feY5aZIU18vFDK08dTG0A87pppuv1LNIR3loveU8 +MIIDtDCCApygAwIBAgIUbJfTREJ6k6/+oInWhV1O1j3ZT0IwDQYJKoZIhvcNAQEL +BQAwVjELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM +GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEPMA0GA1UEAwwGdGVzdGNhMB4XDTIw +MDMxODAzMTA0MloXDTMwMDMxNjAzMTA0MlowZTELMAkGA1UEBhMCVVMxETAPBgNV +BAgMCElsbGlub2lzMRAwDgYDVQQHDAdDaGljYWdvMRUwEwYDVQQKDAxFeGFtcGxl +LCBDby4xGjAYBgNVBAMMESoudGVzdC5nb29nbGUuY29tMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEA5xOONxJJ8b8Qauvob5/7dPYZfIcd+uhAWL2ZlTPz +Qvu4oF0QI4iYgP5iGgry9zEtCM+YQS8UhiAlPlqa6ANxgiBSEyMHH/xE8lo/+caY +GeACqy640Jpl/JocFGo3xd1L8DCawjlaj6eu7T7T/tpAV2qq13b5710eNRbCAfFe +8yALiGQemx0IYhlZXNbIGWLBNhBhvVjJh7UvOqpADk4xtl8o5j0xgMIRg6WJGK6c +6ffSIg4eP1XmovNYZ9LLEJG68tF0Q/yIN43B4dt1oq4jzSdCbG4F1EiykT2TmwPV +YDi8tml6DfOCDGnit8svnMEmBv/fcPd31GSbXjF8M+KGGQIDAQABo2swaTAJBgNV +HRMEAjAAMAsGA1UdDwQEAwIF4DBPBgNVHREESDBGghAqLnRlc3QuZ29vZ2xlLmZy +ghh3YXRlcnpvb2kudGVzdC5nb29nbGUuYmWCEioudGVzdC55b3V0dWJlLmNvbYcE +wKgBAzANBgkqhkiG9w0BAQsFAAOCAQEAS8hDQA8PSgipgAml7Q3/djwQ644ghWQv +C2Kb+r30RCY1EyKNhnQnIIh/OUbBZvh0M0iYsy6xqXgfDhCB93AA6j0i5cS8fkhH +Jl4RK0tSkGQ3YNY4NzXwQP/vmUgfkw8VBAZ4Y4GKxppdATjffIW+srbAmdDruIRM +wPeikgOoRrXf0LA1fi4TqxARzeRwenQpayNfGHTvVF9aJkl8HoaMunTAdG5pIVcr +9GKi/gEMpXUJbbVv3U5frX1Wo4CFo+rZWJ/LyCMeb0jciNLxSdMwj/E/ZuExlyeZ +gc9ctPjSMvgSyXEKv6Vwobleeg88V2ZgzenziORoWj4KszG/lbQZvg== -----END CERTIFICATE----- diff --git a/src/python/grpcio_tests/tests/interop/credentials/ca.pem b/src/python/grpcio_tests/tests/interop/credentials/ca.pem index 6c8511a73c6..49d39cd8ed5 100755 --- a/src/python/grpcio_tests/tests/interop/credentials/ca.pem +++ b/src/python/grpcio_tests/tests/interop/credentials/ca.pem @@ -1,15 +1,20 @@ -----BEGIN CERTIFICATE----- -MIICSjCCAbOgAwIBAgIJAJHGGR4dGioHMA0GCSqGSIb3DQEBCwUAMFYxCzAJBgNV -BAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBX -aWRnaXRzIFB0eSBMdGQxDzANBgNVBAMTBnRlc3RjYTAeFw0xNDExMTEyMjMxMjla -Fw0yNDExMDgyMjMxMjlaMFYxCzAJBgNVBAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0 -YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQxDzANBgNVBAMT -BnRlc3RjYTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwEDfBV5MYdlHVHJ7 -+L4nxrZy7mBfAVXpOc5vMYztssUI7mL2/iYujiIXM+weZYNTEpLdjyJdu7R5gGUu -g1jSVK/EPHfc74O7AyZU34PNIP4Sh33N+/A5YexrNgJlPY+E3GdVYi4ldWJjgkAd -Qah2PH5ACLrIIC6tRka9hcaBlIECAwEAAaMgMB4wDAYDVR0TBAUwAwEB/zAOBgNV -HQ8BAf8EBAMCAgQwDQYJKoZIhvcNAQELBQADgYEAHzC7jdYlzAVmddi/gdAeKPau -sPBG/C2HCWqHzpCUHcKuvMzDVkY/MP2o6JIW2DBbY64bO/FceExhjcykgaYtCH/m -oIU63+CFOTtR7otyQAWHqXa7q4SbCDlG7DyRFxqG0txPtGvy12lgldA2+RgcigQG -Dfcog5wrJytaQ6UA0wE= +MIIDWjCCAkKgAwIBAgIUWrP0VvHcy+LP6UuYNtiL9gBhD5owDQYJKoZIhvcNAQEL +BQAwVjELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM +GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEPMA0GA1UEAwwGdGVzdGNhMB4XDTIw +MDMxNzE4NTk1MVoXDTMwMDMxNTE4NTk1MVowVjELMAkGA1UEBhMCQVUxEzARBgNV +BAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0 +ZDEPMA0GA1UEAwwGdGVzdGNhMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAsGL0oXflF0LzoM+Bh+qUU9yhqzw2w8OOX5mu/iNCyUOBrqaHi7mGHx73GD01 +diNzCzvlcQqdNIH6NQSL7DTpBjca66jYT9u73vZe2MDrr1nVbuLvfu9850cdxiUO +Inv5xf8+sTHG0C+a+VAvMhsLiRjsq+lXKRJyk5zkbbsETybqpxoJ+K7CoSy3yc/k +QIY3TipwEtwkKP4hzyo6KiGd/DPexie4nBUInN3bS1BUeNZ5zeaIC2eg3bkeeW7c +qT55b+Yen6CxY0TEkzBK6AKt/WUialKMgT0wbTxRZO7kUCH3Sq6e/wXeFdJ+HvdV +LPlAg5TnMaNpRdQih/8nRFpsdwIDAQABoyAwHjAMBgNVHRMEBTADAQH/MA4GA1Ud +DwEB/wQEAwICBDANBgkqhkiG9w0BAQsFAAOCAQEAkTrKZjBrJXHps/HrjNCFPb5a +THuGPCSsepe1wkKdSp1h4HGRpLoCgcLysCJ5hZhRpHkRihhef+rFHEe60UePQO3S +CVTtdJB4CYWpcNyXOdqefrbJW5QNljxgi6Fhvs7JJkBqdXIkWXtFk2eRgOIP2Eo9 +/OHQHlYnwZFrk6sp4wPyR+A95S0toZBcyDVz7u+hOW0pGK3wviOe9lvRgj/H3Pwt +bewb0l+MhRig0/DVHamyVxrDRbqInU1/GTNCwcZkXKYFWSf92U+kIcTth24Q1gcw +eZiLl5FfrWokUNytFElXob0V0a5/kbhiLc3yWmvWqHTpqCALbVyF+rKJo2f5Kw== -----END CERTIFICATE----- diff --git a/src/python/grpcio_tests/tests/interop/credentials/server1.key b/src/python/grpcio_tests/tests/interop/credentials/server1.key index 143a5b87658..086462992cf 100755 --- a/src/python/grpcio_tests/tests/interop/credentials/server1.key +++ b/src/python/grpcio_tests/tests/interop/credentials/server1.key @@ -1,16 +1,28 @@ -----BEGIN PRIVATE KEY----- -MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAOHDFScoLCVJpYDD -M4HYtIdV6Ake/sMNaaKdODjDMsux/4tDydlumN+fm+AjPEK5GHhGn1BgzkWF+slf -3BxhrA/8dNsnunstVA7ZBgA/5qQxMfGAq4wHNVX77fBZOgp9VlSMVfyd9N8YwbBY -AckOeUQadTi2X1S6OgJXgQ0m3MWhAgMBAAECgYAn7qGnM2vbjJNBm0VZCkOkTIWm -V10okw7EPJrdL2mkre9NasghNXbE1y5zDshx5Nt3KsazKOxTT8d0Jwh/3KbaN+YY -tTCbKGW0pXDRBhwUHRcuRzScjli8Rih5UOCiZkhefUTcRb6xIhZJuQy71tjaSy0p -dHZRmYyBYO2YEQ8xoQJBAPrJPhMBkzmEYFtyIEqAxQ/o/A6E+E4w8i+KM7nQCK7q -K4JXzyXVAjLfyBZWHGM2uro/fjqPggGD6QH1qXCkI4MCQQDmdKeb2TrKRh5BY1LR -81aJGKcJ2XbcDu6wMZK4oqWbTX2KiYn9GB0woM6nSr/Y6iy1u145YzYxEV/iMwff -DJULAkB8B2MnyzOg0pNFJqBJuH29bKCcHa8gHJzqXhNO5lAlEbMK95p/P2Wi+4Hd -aiEIAF1BF326QJcvYKmwSmrORp85AkAlSNxRJ50OWrfMZnBgzVjDx3xG6KsFQVk2 -ol6VhqL6dFgKUORFUWBvnKSyhjJxurlPEahV6oo6+A+mPhFY8eUvAkAZQyTdupP3 -XEFQKctGz+9+gKkemDp7LBBMEMBXrGTLPhpEfcjv/7KPdnFHYmhYeBTBnuVmTVWe -F98XJ7tIFfJq +MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDnE443EknxvxBq +6+hvn/t09hl8hx366EBYvZmVM/NC+7igXRAjiJiA/mIaCvL3MS0Iz5hBLxSGICU+ +WproA3GCIFITIwcf/ETyWj/5xpgZ4AKrLrjQmmX8mhwUajfF3UvwMJrCOVqPp67t +PtP+2kBXaqrXdvnvXR41FsIB8V7zIAuIZB6bHQhiGVlc1sgZYsE2EGG9WMmHtS86 +qkAOTjG2XyjmPTGAwhGDpYkYrpzp99IiDh4/Veai81hn0ssQkbry0XRD/Ig3jcHh +23WiriPNJ0JsbgXUSLKRPZObA9VgOLy2aXoN84IMaeK3yy+cwSYG/99w93fUZJte +MXwz4oYZAgMBAAECggEBAIVn2Ncai+4xbH0OLWckabwgyJ4IM9rDc0LIU368O1kU +koais8qP9dujAWgfoh3sGh/YGgKn96VnsZjKHlyMgF+r4TaDJn3k2rlAOWcurGlj +1qaVlsV4HiEzp7pxiDmHhWvp4672Bb6iBG+bsjCUOEk/n9o9KhZzIBluRhtxCmw5 +nw4Do7z00PTvN81260uPWSc04IrytvZUiAIx/5qxD72bij2xJ8t/I9GI8g4FtoVB +8pB6S/hJX1PZhh9VlU6Yk+TOfOVnbebG4W5138LkB835eqk3Zz0qsbc2euoi8Hxi +y1VGwQEmMQ63jXz4c6g+X55ifvUK9Jpn5E8pq+pMd7ECgYEA93lYq+Cr54K4ey5t +sWMa+ye5RqxjzgXj2Kqr55jb54VWG7wp2iGbg8FMlkQwzTJwebzDyCSatguEZLuB +gRGroRnsUOy9vBvhKPOch9bfKIl6qOgzMJB267fBVWx5ybnRbWN/I7RvMQf3k+9y +biCIVnxDLEEYyx7z85/5qxsXg/MCgYEA7wmWKtCTn032Hy9P8OL49T0X6Z8FlkDC +Rk42ygrc/MUbugq9RGUxcCxoImOG9JXUpEtUe31YDm2j+/nbvrjl6/bP2qWs0V7l +dTJl6dABP51pCw8+l4cWgBBX08Lkeen812AAFNrjmDCjX6rHjWHLJcpS18fnRRkP +V1d/AHWX7MMCgYEA6Gsw2guhp0Zf2GCcaNK5DlQab8OL4Hwrpttzo4kuTlwtqNKp +Q9H4al9qfF4Cr1TFya98+EVYf8yFRM3NLNjZpe3gwYf2EerlJj7VLcahw0KKzoN1 +QBENfwgPLRk5sDkx9VhSmcfl/diLroZdpAwtv3vo4nEoxeuGFbKTGx3Qkf0CgYEA +xyR+dcb05Ygm3w4klHQTowQ10s1H80iaUcZBgQuR1ghEtDbUPZHsoR5t1xCB02ys +DgAwLv1bChIvxvH/L6KM8ovZ2LekBX4AviWxoBxJnfz/EVau98B0b1auRN6eSC83 +FRuGldlSOW1z/nSh8ViizSYE5H5HX1qkXEippvFRE88CgYB3Bfu3YQY60ITWIShv +nNkdcbTT9eoP9suaRJjw92Ln+7ZpALYlQMKUZmJ/5uBmLs4RFwUTQruLOPL4yLTH +awADWUzs3IRr1fwn9E+zM8JVyKCnUEM3w4N5UZskGO2klashAd30hWO+knRv/y0r +uGIYs9Ek7YXlXIRVrzMwcsrt1w== -----END PRIVATE KEY----- diff --git a/src/python/grpcio_tests/tests/interop/credentials/server1.pem b/src/python/grpcio_tests/tests/interop/credentials/server1.pem index f3d43fcc5be..88244f856c6 100755 --- a/src/python/grpcio_tests/tests/interop/credentials/server1.pem +++ b/src/python/grpcio_tests/tests/interop/credentials/server1.pem @@ -1,16 +1,22 @@ -----BEGIN CERTIFICATE----- -MIICnDCCAgWgAwIBAgIBBzANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJBVTET -MBEGA1UECBMKU29tZS1TdGF0ZTEhMB8GA1UEChMYSW50ZXJuZXQgV2lkZ2l0cyBQ -dHkgTHRkMQ8wDQYDVQQDEwZ0ZXN0Y2EwHhcNMTUxMTA0MDIyMDI0WhcNMjUxMTAx -MDIyMDI0WjBlMQswCQYDVQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNV -BAcTB0NoaWNhZ28xFTATBgNVBAoTDEV4YW1wbGUsIENvLjEaMBgGA1UEAxQRKi50 -ZXN0Lmdvb2dsZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAOHDFSco -LCVJpYDDM4HYtIdV6Ake/sMNaaKdODjDMsux/4tDydlumN+fm+AjPEK5GHhGn1Bg -zkWF+slf3BxhrA/8dNsnunstVA7ZBgA/5qQxMfGAq4wHNVX77fBZOgp9VlSMVfyd -9N8YwbBYAckOeUQadTi2X1S6OgJXgQ0m3MWhAgMBAAGjazBpMAkGA1UdEwQCMAAw -CwYDVR0PBAQDAgXgME8GA1UdEQRIMEaCECoudGVzdC5nb29nbGUuZnKCGHdhdGVy -em9vaS50ZXN0Lmdvb2dsZS5iZYISKi50ZXN0LnlvdXR1YmUuY29thwTAqAEDMA0G -CSqGSIb3DQEBCwUAA4GBAJFXVifQNub1LUP4JlnX5lXNlo8FxZ2a12AFQs+bzoJ6 -hM044EDjqyxUqSbVePK0ni3w1fHQB5rY9yYC5f8G7aqqTY1QOhoUk8ZTSTRpnkTh -y4jjdvTZeLDVBlueZUTDRmy2feY5aZIU18vFDK08dTG0A87pppuv1LNIR3loveU8 +MIIDtDCCApygAwIBAgIUbJfTREJ6k6/+oInWhV1O1j3ZT0IwDQYJKoZIhvcNAQEL +BQAwVjELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM +GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEPMA0GA1UEAwwGdGVzdGNhMB4XDTIw +MDMxODAzMTA0MloXDTMwMDMxNjAzMTA0MlowZTELMAkGA1UEBhMCVVMxETAPBgNV +BAgMCElsbGlub2lzMRAwDgYDVQQHDAdDaGljYWdvMRUwEwYDVQQKDAxFeGFtcGxl +LCBDby4xGjAYBgNVBAMMESoudGVzdC5nb29nbGUuY29tMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEA5xOONxJJ8b8Qauvob5/7dPYZfIcd+uhAWL2ZlTPz +Qvu4oF0QI4iYgP5iGgry9zEtCM+YQS8UhiAlPlqa6ANxgiBSEyMHH/xE8lo/+caY +GeACqy640Jpl/JocFGo3xd1L8DCawjlaj6eu7T7T/tpAV2qq13b5710eNRbCAfFe +8yALiGQemx0IYhlZXNbIGWLBNhBhvVjJh7UvOqpADk4xtl8o5j0xgMIRg6WJGK6c +6ffSIg4eP1XmovNYZ9LLEJG68tF0Q/yIN43B4dt1oq4jzSdCbG4F1EiykT2TmwPV +YDi8tml6DfOCDGnit8svnMEmBv/fcPd31GSbXjF8M+KGGQIDAQABo2swaTAJBgNV +HRMEAjAAMAsGA1UdDwQEAwIF4DBPBgNVHREESDBGghAqLnRlc3QuZ29vZ2xlLmZy +ghh3YXRlcnpvb2kudGVzdC5nb29nbGUuYmWCEioudGVzdC55b3V0dWJlLmNvbYcE +wKgBAzANBgkqhkiG9w0BAQsFAAOCAQEAS8hDQA8PSgipgAml7Q3/djwQ644ghWQv +C2Kb+r30RCY1EyKNhnQnIIh/OUbBZvh0M0iYsy6xqXgfDhCB93AA6j0i5cS8fkhH +Jl4RK0tSkGQ3YNY4NzXwQP/vmUgfkw8VBAZ4Y4GKxppdATjffIW+srbAmdDruIRM +wPeikgOoRrXf0LA1fi4TqxARzeRwenQpayNfGHTvVF9aJkl8HoaMunTAdG5pIVcr +9GKi/gEMpXUJbbVv3U5frX1Wo4CFo+rZWJ/LyCMeb0jciNLxSdMwj/E/ZuExlyeZ +gc9ctPjSMvgSyXEKv6Vwobleeg88V2ZgzenziORoWj4KszG/lbQZvg== -----END CERTIFICATE----- diff --git a/src/python/grpcio_tests/tests/unit/credentials/ca.pem b/src/python/grpcio_tests/tests/unit/credentials/ca.pem index 6c8511a73c6..49d39cd8ed5 100755 --- a/src/python/grpcio_tests/tests/unit/credentials/ca.pem +++ b/src/python/grpcio_tests/tests/unit/credentials/ca.pem @@ -1,15 +1,20 @@ -----BEGIN CERTIFICATE----- -MIICSjCCAbOgAwIBAgIJAJHGGR4dGioHMA0GCSqGSIb3DQEBCwUAMFYxCzAJBgNV -BAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBX -aWRnaXRzIFB0eSBMdGQxDzANBgNVBAMTBnRlc3RjYTAeFw0xNDExMTEyMjMxMjla -Fw0yNDExMDgyMjMxMjlaMFYxCzAJBgNVBAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0 -YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQxDzANBgNVBAMT -BnRlc3RjYTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwEDfBV5MYdlHVHJ7 -+L4nxrZy7mBfAVXpOc5vMYztssUI7mL2/iYujiIXM+weZYNTEpLdjyJdu7R5gGUu -g1jSVK/EPHfc74O7AyZU34PNIP4Sh33N+/A5YexrNgJlPY+E3GdVYi4ldWJjgkAd -Qah2PH5ACLrIIC6tRka9hcaBlIECAwEAAaMgMB4wDAYDVR0TBAUwAwEB/zAOBgNV -HQ8BAf8EBAMCAgQwDQYJKoZIhvcNAQELBQADgYEAHzC7jdYlzAVmddi/gdAeKPau -sPBG/C2HCWqHzpCUHcKuvMzDVkY/MP2o6JIW2DBbY64bO/FceExhjcykgaYtCH/m -oIU63+CFOTtR7otyQAWHqXa7q4SbCDlG7DyRFxqG0txPtGvy12lgldA2+RgcigQG -Dfcog5wrJytaQ6UA0wE= +MIIDWjCCAkKgAwIBAgIUWrP0VvHcy+LP6UuYNtiL9gBhD5owDQYJKoZIhvcNAQEL +BQAwVjELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM +GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEPMA0GA1UEAwwGdGVzdGNhMB4XDTIw +MDMxNzE4NTk1MVoXDTMwMDMxNTE4NTk1MVowVjELMAkGA1UEBhMCQVUxEzARBgNV +BAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0 +ZDEPMA0GA1UEAwwGdGVzdGNhMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAsGL0oXflF0LzoM+Bh+qUU9yhqzw2w8OOX5mu/iNCyUOBrqaHi7mGHx73GD01 +diNzCzvlcQqdNIH6NQSL7DTpBjca66jYT9u73vZe2MDrr1nVbuLvfu9850cdxiUO +Inv5xf8+sTHG0C+a+VAvMhsLiRjsq+lXKRJyk5zkbbsETybqpxoJ+K7CoSy3yc/k +QIY3TipwEtwkKP4hzyo6KiGd/DPexie4nBUInN3bS1BUeNZ5zeaIC2eg3bkeeW7c +qT55b+Yen6CxY0TEkzBK6AKt/WUialKMgT0wbTxRZO7kUCH3Sq6e/wXeFdJ+HvdV +LPlAg5TnMaNpRdQih/8nRFpsdwIDAQABoyAwHjAMBgNVHRMEBTADAQH/MA4GA1Ud +DwEB/wQEAwICBDANBgkqhkiG9w0BAQsFAAOCAQEAkTrKZjBrJXHps/HrjNCFPb5a +THuGPCSsepe1wkKdSp1h4HGRpLoCgcLysCJ5hZhRpHkRihhef+rFHEe60UePQO3S +CVTtdJB4CYWpcNyXOdqefrbJW5QNljxgi6Fhvs7JJkBqdXIkWXtFk2eRgOIP2Eo9 +/OHQHlYnwZFrk6sp4wPyR+A95S0toZBcyDVz7u+hOW0pGK3wviOe9lvRgj/H3Pwt +bewb0l+MhRig0/DVHamyVxrDRbqInU1/GTNCwcZkXKYFWSf92U+kIcTth24Q1gcw +eZiLl5FfrWokUNytFElXob0V0a5/kbhiLc3yWmvWqHTpqCALbVyF+rKJo2f5Kw== -----END CERTIFICATE----- diff --git a/src/python/grpcio_tests/tests/unit/credentials/server1.key b/src/python/grpcio_tests/tests/unit/credentials/server1.key index 143a5b87658..086462992cf 100755 --- a/src/python/grpcio_tests/tests/unit/credentials/server1.key +++ b/src/python/grpcio_tests/tests/unit/credentials/server1.key @@ -1,16 +1,28 @@ -----BEGIN PRIVATE KEY----- -MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAOHDFScoLCVJpYDD -M4HYtIdV6Ake/sMNaaKdODjDMsux/4tDydlumN+fm+AjPEK5GHhGn1BgzkWF+slf -3BxhrA/8dNsnunstVA7ZBgA/5qQxMfGAq4wHNVX77fBZOgp9VlSMVfyd9N8YwbBY -AckOeUQadTi2X1S6OgJXgQ0m3MWhAgMBAAECgYAn7qGnM2vbjJNBm0VZCkOkTIWm -V10okw7EPJrdL2mkre9NasghNXbE1y5zDshx5Nt3KsazKOxTT8d0Jwh/3KbaN+YY -tTCbKGW0pXDRBhwUHRcuRzScjli8Rih5UOCiZkhefUTcRb6xIhZJuQy71tjaSy0p -dHZRmYyBYO2YEQ8xoQJBAPrJPhMBkzmEYFtyIEqAxQ/o/A6E+E4w8i+KM7nQCK7q -K4JXzyXVAjLfyBZWHGM2uro/fjqPggGD6QH1qXCkI4MCQQDmdKeb2TrKRh5BY1LR -81aJGKcJ2XbcDu6wMZK4oqWbTX2KiYn9GB0woM6nSr/Y6iy1u145YzYxEV/iMwff -DJULAkB8B2MnyzOg0pNFJqBJuH29bKCcHa8gHJzqXhNO5lAlEbMK95p/P2Wi+4Hd -aiEIAF1BF326QJcvYKmwSmrORp85AkAlSNxRJ50OWrfMZnBgzVjDx3xG6KsFQVk2 -ol6VhqL6dFgKUORFUWBvnKSyhjJxurlPEahV6oo6+A+mPhFY8eUvAkAZQyTdupP3 -XEFQKctGz+9+gKkemDp7LBBMEMBXrGTLPhpEfcjv/7KPdnFHYmhYeBTBnuVmTVWe -F98XJ7tIFfJq +MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDnE443EknxvxBq +6+hvn/t09hl8hx366EBYvZmVM/NC+7igXRAjiJiA/mIaCvL3MS0Iz5hBLxSGICU+ +WproA3GCIFITIwcf/ETyWj/5xpgZ4AKrLrjQmmX8mhwUajfF3UvwMJrCOVqPp67t +PtP+2kBXaqrXdvnvXR41FsIB8V7zIAuIZB6bHQhiGVlc1sgZYsE2EGG9WMmHtS86 +qkAOTjG2XyjmPTGAwhGDpYkYrpzp99IiDh4/Veai81hn0ssQkbry0XRD/Ig3jcHh +23WiriPNJ0JsbgXUSLKRPZObA9VgOLy2aXoN84IMaeK3yy+cwSYG/99w93fUZJte +MXwz4oYZAgMBAAECggEBAIVn2Ncai+4xbH0OLWckabwgyJ4IM9rDc0LIU368O1kU +koais8qP9dujAWgfoh3sGh/YGgKn96VnsZjKHlyMgF+r4TaDJn3k2rlAOWcurGlj +1qaVlsV4HiEzp7pxiDmHhWvp4672Bb6iBG+bsjCUOEk/n9o9KhZzIBluRhtxCmw5 +nw4Do7z00PTvN81260uPWSc04IrytvZUiAIx/5qxD72bij2xJ8t/I9GI8g4FtoVB +8pB6S/hJX1PZhh9VlU6Yk+TOfOVnbebG4W5138LkB835eqk3Zz0qsbc2euoi8Hxi +y1VGwQEmMQ63jXz4c6g+X55ifvUK9Jpn5E8pq+pMd7ECgYEA93lYq+Cr54K4ey5t +sWMa+ye5RqxjzgXj2Kqr55jb54VWG7wp2iGbg8FMlkQwzTJwebzDyCSatguEZLuB +gRGroRnsUOy9vBvhKPOch9bfKIl6qOgzMJB267fBVWx5ybnRbWN/I7RvMQf3k+9y +biCIVnxDLEEYyx7z85/5qxsXg/MCgYEA7wmWKtCTn032Hy9P8OL49T0X6Z8FlkDC +Rk42ygrc/MUbugq9RGUxcCxoImOG9JXUpEtUe31YDm2j+/nbvrjl6/bP2qWs0V7l +dTJl6dABP51pCw8+l4cWgBBX08Lkeen812AAFNrjmDCjX6rHjWHLJcpS18fnRRkP +V1d/AHWX7MMCgYEA6Gsw2guhp0Zf2GCcaNK5DlQab8OL4Hwrpttzo4kuTlwtqNKp +Q9H4al9qfF4Cr1TFya98+EVYf8yFRM3NLNjZpe3gwYf2EerlJj7VLcahw0KKzoN1 +QBENfwgPLRk5sDkx9VhSmcfl/diLroZdpAwtv3vo4nEoxeuGFbKTGx3Qkf0CgYEA +xyR+dcb05Ygm3w4klHQTowQ10s1H80iaUcZBgQuR1ghEtDbUPZHsoR5t1xCB02ys +DgAwLv1bChIvxvH/L6KM8ovZ2LekBX4AviWxoBxJnfz/EVau98B0b1auRN6eSC83 +FRuGldlSOW1z/nSh8ViizSYE5H5HX1qkXEippvFRE88CgYB3Bfu3YQY60ITWIShv +nNkdcbTT9eoP9suaRJjw92Ln+7ZpALYlQMKUZmJ/5uBmLs4RFwUTQruLOPL4yLTH +awADWUzs3IRr1fwn9E+zM8JVyKCnUEM3w4N5UZskGO2klashAd30hWO+knRv/y0r +uGIYs9Ek7YXlXIRVrzMwcsrt1w== -----END PRIVATE KEY----- diff --git a/src/python/grpcio_tests/tests/unit/credentials/server1.pem b/src/python/grpcio_tests/tests/unit/credentials/server1.pem index f3d43fcc5be..88244f856c6 100755 --- a/src/python/grpcio_tests/tests/unit/credentials/server1.pem +++ b/src/python/grpcio_tests/tests/unit/credentials/server1.pem @@ -1,16 +1,22 @@ -----BEGIN CERTIFICATE----- -MIICnDCCAgWgAwIBAgIBBzANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJBVTET -MBEGA1UECBMKU29tZS1TdGF0ZTEhMB8GA1UEChMYSW50ZXJuZXQgV2lkZ2l0cyBQ -dHkgTHRkMQ8wDQYDVQQDEwZ0ZXN0Y2EwHhcNMTUxMTA0MDIyMDI0WhcNMjUxMTAx -MDIyMDI0WjBlMQswCQYDVQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNV -BAcTB0NoaWNhZ28xFTATBgNVBAoTDEV4YW1wbGUsIENvLjEaMBgGA1UEAxQRKi50 -ZXN0Lmdvb2dsZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAOHDFSco -LCVJpYDDM4HYtIdV6Ake/sMNaaKdODjDMsux/4tDydlumN+fm+AjPEK5GHhGn1Bg -zkWF+slf3BxhrA/8dNsnunstVA7ZBgA/5qQxMfGAq4wHNVX77fBZOgp9VlSMVfyd -9N8YwbBYAckOeUQadTi2X1S6OgJXgQ0m3MWhAgMBAAGjazBpMAkGA1UdEwQCMAAw -CwYDVR0PBAQDAgXgME8GA1UdEQRIMEaCECoudGVzdC5nb29nbGUuZnKCGHdhdGVy -em9vaS50ZXN0Lmdvb2dsZS5iZYISKi50ZXN0LnlvdXR1YmUuY29thwTAqAEDMA0G -CSqGSIb3DQEBCwUAA4GBAJFXVifQNub1LUP4JlnX5lXNlo8FxZ2a12AFQs+bzoJ6 -hM044EDjqyxUqSbVePK0ni3w1fHQB5rY9yYC5f8G7aqqTY1QOhoUk8ZTSTRpnkTh -y4jjdvTZeLDVBlueZUTDRmy2feY5aZIU18vFDK08dTG0A87pppuv1LNIR3loveU8 +MIIDtDCCApygAwIBAgIUbJfTREJ6k6/+oInWhV1O1j3ZT0IwDQYJKoZIhvcNAQEL +BQAwVjELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM +GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEPMA0GA1UEAwwGdGVzdGNhMB4XDTIw +MDMxODAzMTA0MloXDTMwMDMxNjAzMTA0MlowZTELMAkGA1UEBhMCVVMxETAPBgNV +BAgMCElsbGlub2lzMRAwDgYDVQQHDAdDaGljYWdvMRUwEwYDVQQKDAxFeGFtcGxl +LCBDby4xGjAYBgNVBAMMESoudGVzdC5nb29nbGUuY29tMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEA5xOONxJJ8b8Qauvob5/7dPYZfIcd+uhAWL2ZlTPz +Qvu4oF0QI4iYgP5iGgry9zEtCM+YQS8UhiAlPlqa6ANxgiBSEyMHH/xE8lo/+caY +GeACqy640Jpl/JocFGo3xd1L8DCawjlaj6eu7T7T/tpAV2qq13b5710eNRbCAfFe +8yALiGQemx0IYhlZXNbIGWLBNhBhvVjJh7UvOqpADk4xtl8o5j0xgMIRg6WJGK6c +6ffSIg4eP1XmovNYZ9LLEJG68tF0Q/yIN43B4dt1oq4jzSdCbG4F1EiykT2TmwPV +YDi8tml6DfOCDGnit8svnMEmBv/fcPd31GSbXjF8M+KGGQIDAQABo2swaTAJBgNV +HRMEAjAAMAsGA1UdDwQEAwIF4DBPBgNVHREESDBGghAqLnRlc3QuZ29vZ2xlLmZy +ghh3YXRlcnpvb2kudGVzdC5nb29nbGUuYmWCEioudGVzdC55b3V0dWJlLmNvbYcE +wKgBAzANBgkqhkiG9w0BAQsFAAOCAQEAS8hDQA8PSgipgAml7Q3/djwQ644ghWQv +C2Kb+r30RCY1EyKNhnQnIIh/OUbBZvh0M0iYsy6xqXgfDhCB93AA6j0i5cS8fkhH +Jl4RK0tSkGQ3YNY4NzXwQP/vmUgfkw8VBAZ4Y4GKxppdATjffIW+srbAmdDruIRM +wPeikgOoRrXf0LA1fi4TqxARzeRwenQpayNfGHTvVF9aJkl8HoaMunTAdG5pIVcr +9GKi/gEMpXUJbbVv3U5frX1Wo4CFo+rZWJ/LyCMeb0jciNLxSdMwj/E/ZuExlyeZ +gc9ctPjSMvgSyXEKv6Vwobleeg88V2ZgzenziORoWj4KszG/lbQZvg== -----END CERTIFICATE----- diff --git a/src/ruby/spec/testdata/ca.pem b/src/ruby/spec/testdata/ca.pem index 6c8511a73c6..49d39cd8ed5 100755 --- a/src/ruby/spec/testdata/ca.pem +++ b/src/ruby/spec/testdata/ca.pem @@ -1,15 +1,20 @@ -----BEGIN CERTIFICATE----- -MIICSjCCAbOgAwIBAgIJAJHGGR4dGioHMA0GCSqGSIb3DQEBCwUAMFYxCzAJBgNV -BAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBX -aWRnaXRzIFB0eSBMdGQxDzANBgNVBAMTBnRlc3RjYTAeFw0xNDExMTEyMjMxMjla -Fw0yNDExMDgyMjMxMjlaMFYxCzAJBgNVBAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0 -YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQxDzANBgNVBAMT -BnRlc3RjYTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwEDfBV5MYdlHVHJ7 -+L4nxrZy7mBfAVXpOc5vMYztssUI7mL2/iYujiIXM+weZYNTEpLdjyJdu7R5gGUu -g1jSVK/EPHfc74O7AyZU34PNIP4Sh33N+/A5YexrNgJlPY+E3GdVYi4ldWJjgkAd -Qah2PH5ACLrIIC6tRka9hcaBlIECAwEAAaMgMB4wDAYDVR0TBAUwAwEB/zAOBgNV -HQ8BAf8EBAMCAgQwDQYJKoZIhvcNAQELBQADgYEAHzC7jdYlzAVmddi/gdAeKPau -sPBG/C2HCWqHzpCUHcKuvMzDVkY/MP2o6JIW2DBbY64bO/FceExhjcykgaYtCH/m -oIU63+CFOTtR7otyQAWHqXa7q4SbCDlG7DyRFxqG0txPtGvy12lgldA2+RgcigQG -Dfcog5wrJytaQ6UA0wE= +MIIDWjCCAkKgAwIBAgIUWrP0VvHcy+LP6UuYNtiL9gBhD5owDQYJKoZIhvcNAQEL +BQAwVjELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM +GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEPMA0GA1UEAwwGdGVzdGNhMB4XDTIw +MDMxNzE4NTk1MVoXDTMwMDMxNTE4NTk1MVowVjELMAkGA1UEBhMCQVUxEzARBgNV +BAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0 +ZDEPMA0GA1UEAwwGdGVzdGNhMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAsGL0oXflF0LzoM+Bh+qUU9yhqzw2w8OOX5mu/iNCyUOBrqaHi7mGHx73GD01 +diNzCzvlcQqdNIH6NQSL7DTpBjca66jYT9u73vZe2MDrr1nVbuLvfu9850cdxiUO +Inv5xf8+sTHG0C+a+VAvMhsLiRjsq+lXKRJyk5zkbbsETybqpxoJ+K7CoSy3yc/k +QIY3TipwEtwkKP4hzyo6KiGd/DPexie4nBUInN3bS1BUeNZ5zeaIC2eg3bkeeW7c +qT55b+Yen6CxY0TEkzBK6AKt/WUialKMgT0wbTxRZO7kUCH3Sq6e/wXeFdJ+HvdV +LPlAg5TnMaNpRdQih/8nRFpsdwIDAQABoyAwHjAMBgNVHRMEBTADAQH/MA4GA1Ud +DwEB/wQEAwICBDANBgkqhkiG9w0BAQsFAAOCAQEAkTrKZjBrJXHps/HrjNCFPb5a +THuGPCSsepe1wkKdSp1h4HGRpLoCgcLysCJ5hZhRpHkRihhef+rFHEe60UePQO3S +CVTtdJB4CYWpcNyXOdqefrbJW5QNljxgi6Fhvs7JJkBqdXIkWXtFk2eRgOIP2Eo9 +/OHQHlYnwZFrk6sp4wPyR+A95S0toZBcyDVz7u+hOW0pGK3wviOe9lvRgj/H3Pwt +bewb0l+MhRig0/DVHamyVxrDRbqInU1/GTNCwcZkXKYFWSf92U+kIcTth24Q1gcw +eZiLl5FfrWokUNytFElXob0V0a5/kbhiLc3yWmvWqHTpqCALbVyF+rKJo2f5Kw== -----END CERTIFICATE----- diff --git a/src/ruby/spec/testdata/client.key b/src/ruby/spec/testdata/client.key index f48d0735d99..349b40033dd 100644 --- a/src/ruby/spec/testdata/client.key +++ b/src/ruby/spec/testdata/client.key @@ -1,16 +1,28 @@ -----BEGIN PRIVATE KEY----- -MIICeQIBADANBgkqhkiG9w0BAQEFAASCAmMwggJfAgEAAoGBAOxUR9uhvhbeVUIM -s5WbH0px0mehl2+6sZpNjzvE2KimZpHzMJHukVH0Ffkvhs0b8+S5Ut9VNUAqd3IM -JCCAEGtRNoQhM1t9Yr2zAckSvbRacp+FL/Cj9eDmyo00KsVGaeefA4Dh4OW+ZhkT -NKcldXqkSuj1sEf244JZYuqZp6/tAgMBAAECgYEAi2NSVqpZMafE5YYUTcMGe6QS -k2jtpsqYgggI2RnLJ/2tNZwYI5pwP8QVSbnMaiF4gokD5hGdrNDfTnb2v+yIwYEH -0w8+oG7Z81KodsiZSIDJfTGsAZhVNwOz9y0VD8BBZZ1/274Zh52AUKLjZS/ZwIbS -W2ywya855dPnH/wj+0ECQQD9X8D920kByTNHhBG18biAEZ4pxs9f0OAG8333eVcI -w2lJDLsYDZrCB2ocgA3lUdozlzPC7YDYw8reg0tkiRY5AkEA7sdNzOeQsQRn7++5 -0bP9DtT/iON1gbfxRzCfCfXdoOtfQWIzTePWtURt9X/5D9NofI0Rg5W2oGy/MLe5 -/sXHVQJBAIup5XrJDkQywNZyAUU2ecn2bCWBFjwtqd+LBmuMciI9fOKsZtEKZrz/ -U0lkeMRoSwvXE8wmGLjjrAbdfohrXFkCQQDZEx/LtIl6JINJQiswVe0tWr6k+ASP -1WXoTm+HYpoF/XUvv9LccNF1IazFj34hwRQwhx7w/V52Ieb+p0jUMYGxAkEAjDhd -9pBO1fKXWiXzi9ZKfoyTNcUq3eBSVKwPG2nItg5ycXengjT5sgcWDnciIzW7BIVI -JiqOszq9GWESErAatg== +MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCyqYRp+DXVp72N +FbQH8hdhTZLycZXOlJhmMsrJmrjn2p7pI/8mTZ/0FC+SGWBGZV+ELiHrmCX5zfaI +Lr9Iuw7Ghr3Vzoefi8r62rLupVPNi/qdqyjWk2dECHC9Z3+Ag3KzKTyerXWjKcvy +KVmM0ZxE0RXhDW/RoQbqZsU2GKg1B2rhUU8KN0gVmKn0rJHOxzRVSYeYLYp5Yn7K +rtPJcKyo9aVuEr7dGANzpyF6lg/nYBWc+9SGwkoLdFvKvABYJMyrbNhHUQfv0fza +Z0P86dfTENrDxzALrzGnqcx3KTrwJjkZ/aSr1tyD0/tXvukRFiPxWBJhjHQ70GqT +FQY19RbhAgMBAAECggEAIL8JUhL4awyvpWhQ8xPgTSlWwbEn8BE0TacJnCILuhNM +BRdf8LlRk/8PKQwVpVF3TFbYSMI+U6b4hMVssfv3HVQc/083dHq+3XOwUCVlUstR +SAzTE2E5EDMr1stdh0SQhV4Nilfos9s5Uk1Z6IGSztoz1GgOErIc/mGPy/aA/hbr +fRWHvTp35+MbCJSvZuOeevX2iLs0dNzqdk6DiOWIH/BVGirVPtO6ykrkuTj1FWiN +hyZ3MBChShlNH2poNX46ntOc7nEus0qteOgxBK8lummFEtlehCA7hd/8xuvYlP0k +7aN684LCRDajmAGpoZO57NSDYQhAFGZeUZ93SMFucQKBgQDe7GGkzZFEiv91u1q9 +lgMy1h5dZjIZKgQaOarPC6wCQMUdqCf6cSLsAPr4T8EDoWsnY7dSnrTZ6YCIFL1T +idg8M3BQXipICCJkFORS76pKKZ0wMn3/NgkSepsmNct91WHr6okvx4tOaoRCtdzU +g7jt4Mr3sfLCiZtqTQyySdMUEwKBgQDNK+ZFKL0XhkWZP+PGKjWG8LWpPiK3d78/ +wYBFXzSTGlkr6FvRmYtZeNwXWRYLB4UxZ9At4hbJVEdi/2dITOz/sehVDyCAjjs3 +gycsc3UJqiZbcw5XKhI5TWBuWxkKENdbMSayogVbp2aSYoRblH764//t0ACmbfTW +KUQRQPB/uwKBgQC5QjjjfPL8w4cJkGoYpFKELO2PMR7xSrmeEc6hwlFwjeNCgjy3 +JM6g0y++rIj7O2qRkY0IXFxvvF3UuWedxTCu1xC/uYHp2ti506LsScB7YZoAM/YB +4iYn9Tx6xLoYGP0H0iGwU2SyBlNkHT8oXU+SYP5MWtYkVbeS3/VtNWz1gQKBgQCA +6Nk4kN0mH7YxEKRzSOfyzeDF4oV7kuB2FYUbkTL+TirC3K58JiYY5Egc31trOKFm +Jlz1xz0b6DkmKWTiV3r9OPHKJ8P7IeJxAZWmZzCdDuwkv0i+WW+z0zsIe3JjEavN +3zb6O7R0HtziksWoqMeTqZeO+wa9iw6vVKQw1wWEqwKBgFHfahFs0DZ5cUTpGpBt +F/AQG7ukgipB6N6AkB9kDbgCs1FLgd199MQrEncug5hfpq8QerbyMatmA+GXoGMb +7vztKEH85yzp4n02FNL6H7xL4VVILvyZHdolmiORJ4qT2hZnl8pEQ2TYuF4RlHUd +nSwXX+2o0J/nF85fm4AwWKAc -----END PRIVATE KEY----- diff --git a/src/ruby/spec/testdata/client.pem b/src/ruby/spec/testdata/client.pem index e332091019b..8815875f327 100644 --- a/src/ruby/spec/testdata/client.pem +++ b/src/ruby/spec/testdata/client.pem @@ -1,14 +1,20 @@ -----BEGIN CERTIFICATE----- -MIICHzCCAYgCAQEwDQYJKoZIhvcNAQEFBQAwVjELMAkGA1UEBhMCQVUxEzARBgNV -BAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0 -ZDEPMA0GA1UEAwwGdGVzdGNhMB4XDTE0MDcxNzIzNTYwMloXDTI0MDcxNDIzNTYw -MlowWjELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM -GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDETMBEGA1UEAwwKdGVzdGNsaWVudDCB -nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA7FRH26G+Ft5VQgyzlZsfSnHSZ6GX -b7qxmk2PO8TYqKZmkfMwke6RUfQV+S+GzRvz5LlS31U1QCp3cgwkIIAQa1E2hCEz -W31ivbMByRK9tFpyn4Uv8KP14ObKjTQqxUZp558DgOHg5b5mGRM0pyV1eqRK6PWw -R/bjglli6pmnr+0CAwEAATANBgkqhkiG9w0BAQUFAAOBgQAStSm5PM7ubROiKK6/ -T2FkKlhiTOx+Ryenm3Eio59emq+jXl+1nhPySX5G2PQzSR5vd1dIhwgZSR4Gyttk -tRZ57k/NI1brUW8joiEOMJA/Mr7H7asx7wIRYDE91Fs8GkKWd5LhoPAQj+qdG35C -OO+svdkmqH0KZo320ZUqdl2ooQ== +MIIDNzCCAh8CFGyX00RCepOv/qCJ1oVdTtY92U83MA0GCSqGSIb3DQEBCwUAMFYx +CzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRl +cm5ldCBXaWRnaXRzIFB0eSBMdGQxDzANBgNVBAMMBnRlc3RjYTAeFw0yMDAzMTgw +MTA2MTBaFw0zMDAzMTYwMTA2MTBaMFoxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApT +b21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQxEzAR +BgNVBAMMCnRlc3RjbGllbnQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQCyqYRp+DXVp72NFbQH8hdhTZLycZXOlJhmMsrJmrjn2p7pI/8mTZ/0FC+SGWBG +ZV+ELiHrmCX5zfaILr9Iuw7Ghr3Vzoefi8r62rLupVPNi/qdqyjWk2dECHC9Z3+A +g3KzKTyerXWjKcvyKVmM0ZxE0RXhDW/RoQbqZsU2GKg1B2rhUU8KN0gVmKn0rJHO +xzRVSYeYLYp5Yn7KrtPJcKyo9aVuEr7dGANzpyF6lg/nYBWc+9SGwkoLdFvKvABY +JMyrbNhHUQfv0fzaZ0P86dfTENrDxzALrzGnqcx3KTrwJjkZ/aSr1tyD0/tXvukR +FiPxWBJhjHQ70GqTFQY19RbhAgMBAAEwDQYJKoZIhvcNAQELBQADggEBAFXCewK8 +cWT+zWxXyGFnouFSBzTi0BMBJRrhsiNoiQxkqityJHWFExiQZie+7CA+EabXCQUB ++JwMSWM29j3mSw10DTfmC3rhheQqGxy304BZyUpdpvI2dt3p/mcsE7O+p4sQrSep +gijiDssKAfxTAmUM93N6+Q8yJK5immxlbeYfijoBvmkzyB/B+qNRPsx0n7aFGnfv +oWfkW296iPhWLiwknpC3xB6oK3vRbK4Zj1OaGb0grK7VN8EyhBix2xVF61i4dzCK +kMIpl7CUpw1Mb2z8q3F2bHBS7iF7g1Ccn5VGcO+aJ+6PWydaeqJ6VEBF0Nwv9woe +mL5AluNRLaqjZvE= -----END CERTIFICATE----- diff --git a/src/ruby/spec/testdata/server1.key b/src/ruby/spec/testdata/server1.key index 143a5b87658..086462992cf 100755 --- a/src/ruby/spec/testdata/server1.key +++ b/src/ruby/spec/testdata/server1.key @@ -1,16 +1,28 @@ -----BEGIN PRIVATE KEY----- -MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAOHDFScoLCVJpYDD -M4HYtIdV6Ake/sMNaaKdODjDMsux/4tDydlumN+fm+AjPEK5GHhGn1BgzkWF+slf -3BxhrA/8dNsnunstVA7ZBgA/5qQxMfGAq4wHNVX77fBZOgp9VlSMVfyd9N8YwbBY -AckOeUQadTi2X1S6OgJXgQ0m3MWhAgMBAAECgYAn7qGnM2vbjJNBm0VZCkOkTIWm -V10okw7EPJrdL2mkre9NasghNXbE1y5zDshx5Nt3KsazKOxTT8d0Jwh/3KbaN+YY -tTCbKGW0pXDRBhwUHRcuRzScjli8Rih5UOCiZkhefUTcRb6xIhZJuQy71tjaSy0p -dHZRmYyBYO2YEQ8xoQJBAPrJPhMBkzmEYFtyIEqAxQ/o/A6E+E4w8i+KM7nQCK7q -K4JXzyXVAjLfyBZWHGM2uro/fjqPggGD6QH1qXCkI4MCQQDmdKeb2TrKRh5BY1LR -81aJGKcJ2XbcDu6wMZK4oqWbTX2KiYn9GB0woM6nSr/Y6iy1u145YzYxEV/iMwff -DJULAkB8B2MnyzOg0pNFJqBJuH29bKCcHa8gHJzqXhNO5lAlEbMK95p/P2Wi+4Hd -aiEIAF1BF326QJcvYKmwSmrORp85AkAlSNxRJ50OWrfMZnBgzVjDx3xG6KsFQVk2 -ol6VhqL6dFgKUORFUWBvnKSyhjJxurlPEahV6oo6+A+mPhFY8eUvAkAZQyTdupP3 -XEFQKctGz+9+gKkemDp7LBBMEMBXrGTLPhpEfcjv/7KPdnFHYmhYeBTBnuVmTVWe -F98XJ7tIFfJq +MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDnE443EknxvxBq +6+hvn/t09hl8hx366EBYvZmVM/NC+7igXRAjiJiA/mIaCvL3MS0Iz5hBLxSGICU+ +WproA3GCIFITIwcf/ETyWj/5xpgZ4AKrLrjQmmX8mhwUajfF3UvwMJrCOVqPp67t +PtP+2kBXaqrXdvnvXR41FsIB8V7zIAuIZB6bHQhiGVlc1sgZYsE2EGG9WMmHtS86 +qkAOTjG2XyjmPTGAwhGDpYkYrpzp99IiDh4/Veai81hn0ssQkbry0XRD/Ig3jcHh +23WiriPNJ0JsbgXUSLKRPZObA9VgOLy2aXoN84IMaeK3yy+cwSYG/99w93fUZJte +MXwz4oYZAgMBAAECggEBAIVn2Ncai+4xbH0OLWckabwgyJ4IM9rDc0LIU368O1kU +koais8qP9dujAWgfoh3sGh/YGgKn96VnsZjKHlyMgF+r4TaDJn3k2rlAOWcurGlj +1qaVlsV4HiEzp7pxiDmHhWvp4672Bb6iBG+bsjCUOEk/n9o9KhZzIBluRhtxCmw5 +nw4Do7z00PTvN81260uPWSc04IrytvZUiAIx/5qxD72bij2xJ8t/I9GI8g4FtoVB +8pB6S/hJX1PZhh9VlU6Yk+TOfOVnbebG4W5138LkB835eqk3Zz0qsbc2euoi8Hxi +y1VGwQEmMQ63jXz4c6g+X55ifvUK9Jpn5E8pq+pMd7ECgYEA93lYq+Cr54K4ey5t +sWMa+ye5RqxjzgXj2Kqr55jb54VWG7wp2iGbg8FMlkQwzTJwebzDyCSatguEZLuB +gRGroRnsUOy9vBvhKPOch9bfKIl6qOgzMJB267fBVWx5ybnRbWN/I7RvMQf3k+9y +biCIVnxDLEEYyx7z85/5qxsXg/MCgYEA7wmWKtCTn032Hy9P8OL49T0X6Z8FlkDC +Rk42ygrc/MUbugq9RGUxcCxoImOG9JXUpEtUe31YDm2j+/nbvrjl6/bP2qWs0V7l +dTJl6dABP51pCw8+l4cWgBBX08Lkeen812AAFNrjmDCjX6rHjWHLJcpS18fnRRkP +V1d/AHWX7MMCgYEA6Gsw2guhp0Zf2GCcaNK5DlQab8OL4Hwrpttzo4kuTlwtqNKp +Q9H4al9qfF4Cr1TFya98+EVYf8yFRM3NLNjZpe3gwYf2EerlJj7VLcahw0KKzoN1 +QBENfwgPLRk5sDkx9VhSmcfl/diLroZdpAwtv3vo4nEoxeuGFbKTGx3Qkf0CgYEA +xyR+dcb05Ygm3w4klHQTowQ10s1H80iaUcZBgQuR1ghEtDbUPZHsoR5t1xCB02ys +DgAwLv1bChIvxvH/L6KM8ovZ2LekBX4AviWxoBxJnfz/EVau98B0b1auRN6eSC83 +FRuGldlSOW1z/nSh8ViizSYE5H5HX1qkXEippvFRE88CgYB3Bfu3YQY60ITWIShv +nNkdcbTT9eoP9suaRJjw92Ln+7ZpALYlQMKUZmJ/5uBmLs4RFwUTQruLOPL4yLTH +awADWUzs3IRr1fwn9E+zM8JVyKCnUEM3w4N5UZskGO2klashAd30hWO+knRv/y0r +uGIYs9Ek7YXlXIRVrzMwcsrt1w== -----END PRIVATE KEY----- diff --git a/src/ruby/spec/testdata/server1.pem b/src/ruby/spec/testdata/server1.pem index f3d43fcc5be..88244f856c6 100755 --- a/src/ruby/spec/testdata/server1.pem +++ b/src/ruby/spec/testdata/server1.pem @@ -1,16 +1,22 @@ -----BEGIN CERTIFICATE----- -MIICnDCCAgWgAwIBAgIBBzANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJBVTET -MBEGA1UECBMKU29tZS1TdGF0ZTEhMB8GA1UEChMYSW50ZXJuZXQgV2lkZ2l0cyBQ -dHkgTHRkMQ8wDQYDVQQDEwZ0ZXN0Y2EwHhcNMTUxMTA0MDIyMDI0WhcNMjUxMTAx -MDIyMDI0WjBlMQswCQYDVQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNV -BAcTB0NoaWNhZ28xFTATBgNVBAoTDEV4YW1wbGUsIENvLjEaMBgGA1UEAxQRKi50 -ZXN0Lmdvb2dsZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAOHDFSco -LCVJpYDDM4HYtIdV6Ake/sMNaaKdODjDMsux/4tDydlumN+fm+AjPEK5GHhGn1Bg -zkWF+slf3BxhrA/8dNsnunstVA7ZBgA/5qQxMfGAq4wHNVX77fBZOgp9VlSMVfyd -9N8YwbBYAckOeUQadTi2X1S6OgJXgQ0m3MWhAgMBAAGjazBpMAkGA1UdEwQCMAAw -CwYDVR0PBAQDAgXgME8GA1UdEQRIMEaCECoudGVzdC5nb29nbGUuZnKCGHdhdGVy -em9vaS50ZXN0Lmdvb2dsZS5iZYISKi50ZXN0LnlvdXR1YmUuY29thwTAqAEDMA0G -CSqGSIb3DQEBCwUAA4GBAJFXVifQNub1LUP4JlnX5lXNlo8FxZ2a12AFQs+bzoJ6 -hM044EDjqyxUqSbVePK0ni3w1fHQB5rY9yYC5f8G7aqqTY1QOhoUk8ZTSTRpnkTh -y4jjdvTZeLDVBlueZUTDRmy2feY5aZIU18vFDK08dTG0A87pppuv1LNIR3loveU8 +MIIDtDCCApygAwIBAgIUbJfTREJ6k6/+oInWhV1O1j3ZT0IwDQYJKoZIhvcNAQEL +BQAwVjELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM +GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEPMA0GA1UEAwwGdGVzdGNhMB4XDTIw +MDMxODAzMTA0MloXDTMwMDMxNjAzMTA0MlowZTELMAkGA1UEBhMCVVMxETAPBgNV +BAgMCElsbGlub2lzMRAwDgYDVQQHDAdDaGljYWdvMRUwEwYDVQQKDAxFeGFtcGxl +LCBDby4xGjAYBgNVBAMMESoudGVzdC5nb29nbGUuY29tMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEA5xOONxJJ8b8Qauvob5/7dPYZfIcd+uhAWL2ZlTPz +Qvu4oF0QI4iYgP5iGgry9zEtCM+YQS8UhiAlPlqa6ANxgiBSEyMHH/xE8lo/+caY +GeACqy640Jpl/JocFGo3xd1L8DCawjlaj6eu7T7T/tpAV2qq13b5710eNRbCAfFe +8yALiGQemx0IYhlZXNbIGWLBNhBhvVjJh7UvOqpADk4xtl8o5j0xgMIRg6WJGK6c +6ffSIg4eP1XmovNYZ9LLEJG68tF0Q/yIN43B4dt1oq4jzSdCbG4F1EiykT2TmwPV +YDi8tml6DfOCDGnit8svnMEmBv/fcPd31GSbXjF8M+KGGQIDAQABo2swaTAJBgNV +HRMEAjAAMAsGA1UdDwQEAwIF4DBPBgNVHREESDBGghAqLnRlc3QuZ29vZ2xlLmZy +ghh3YXRlcnpvb2kudGVzdC5nb29nbGUuYmWCEioudGVzdC55b3V0dWJlLmNvbYcE +wKgBAzANBgkqhkiG9w0BAQsFAAOCAQEAS8hDQA8PSgipgAml7Q3/djwQ644ghWQv +C2Kb+r30RCY1EyKNhnQnIIh/OUbBZvh0M0iYsy6xqXgfDhCB93AA6j0i5cS8fkhH +Jl4RK0tSkGQ3YNY4NzXwQP/vmUgfkw8VBAZ4Y4GKxppdATjffIW+srbAmdDruIRM +wPeikgOoRrXf0LA1fi4TqxARzeRwenQpayNfGHTvVF9aJkl8HoaMunTAdG5pIVcr +9GKi/gEMpXUJbbVv3U5frX1Wo4CFo+rZWJ/LyCMeb0jciNLxSdMwj/E/ZuExlyeZ +gc9ctPjSMvgSyXEKv6Vwobleeg88V2ZgzenziORoWj4KszG/lbQZvg== -----END CERTIFICATE----- From fe283856ef1491f7d97976ef08091d9f7d3e3461 Mon Sep 17 00:00:00 2001 From: Richard Belleville Date: Thu, 19 Mar 2020 00:18:09 +0000 Subject: [PATCH 229/758] Decrease client verbosity --- tools/internal_ci/linux/grpc_xds_bazel_python_test_in_docker.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/internal_ci/linux/grpc_xds_bazel_python_test_in_docker.sh b/tools/internal_ci/linux/grpc_xds_bazel_python_test_in_docker.sh index 0dbea2f59ee..ecb8f8123d0 100755 --- a/tools/internal_ci/linux/grpc_xds_bazel_python_test_in_docker.sh +++ b/tools/internal_ci/linux/grpc_xds_bazel_python_test_in_docker.sh @@ -53,4 +53,4 @@ GRPC_VERBOSITY=debug GRPC_TRACE=xds_client,xds_resolver,cds_lb,xds_lb "$PYTHON" --project_id=grpc-testing \ --gcp_suffix=$(date '+%s') \ --verbose \ - --client_cmd='bazel run //src/python/grpcio_tests/tests_py3_only/interop:xds_interop_client -- --server=xds-experimental:///{server_uri} --stats_port={stats_port} --qps={qps} --verbose' + --client_cmd='bazel run //src/python/grpcio_tests/tests_py3_only/interop:xds_interop_client -- --server=xds-experimental:///{server_uri} --stats_port={stats_port} --qps={qps}' From b21fc9c4d4c0e144028ab5f9c199a38fd33ecc19 Mon Sep 17 00:00:00 2001 From: jiangtaoli2016 Date: Wed, 18 Mar 2020 12:00:10 -0700 Subject: [PATCH 230/758] Add a test on bad SNI and ensure handshake succeeds --- test/core/tsi/ssl_transport_security_test.cc | 37 +++++++++++++++----- 1 file changed, 28 insertions(+), 9 deletions(-) diff --git a/test/core/tsi/ssl_transport_security_test.cc b/test/core/tsi/ssl_transport_security_test.cc index 844a12c261e..ee9f0e3adda 100644 --- a/test/core/tsi/ssl_transport_security_test.cc +++ b/test/core/tsi/ssl_transport_security_test.cc @@ -16,23 +16,23 @@ * */ +#include "src/core/tsi/ssl_transport_security.h" + +#include +#include +#include +#include #include #include #include #include "src/core/lib/iomgr/load_file.h" #include "src/core/lib/security/security_connector/security_connector.h" -#include "src/core/tsi/ssl_transport_security.h" #include "src/core/tsi/transport_security.h" #include "src/core/tsi/transport_security_interface.h" #include "test/core/tsi/transport_security_test_lib.h" #include "test/core/util/test_config.h" -#include -#include -#include -#include - extern "C" { #include #include @@ -45,6 +45,7 @@ extern "C" { #define SSL_TSI_TEST_SERVER_KEY_CERT_PAIRS_NUM 2 #define SSL_TSI_TEST_BAD_SERVER_KEY_CERT_PAIRS_NUM 1 #define SSL_TSI_TEST_CREDENTIALS_DIR "src/core/tsi/test_creds/" +#define SSL_TSI_TEST_WRONG_SNI "test.google.cn" // OpenSSL 1.1 uses AES256 for encryption session ticket by default so specify // different STEK size. @@ -308,10 +309,14 @@ static void ssl_test_check_handshaker_peers(tsi_test_fixture* fixture) { check_session_reusage(ssl_fixture, &peer); check_alpn(ssl_fixture, &peer); check_security_level(&peer); - if (ssl_fixture->server_name_indication != nullptr) { - check_server1_peer(&peer); - } else { + if (ssl_fixture->server_name_indication == nullptr || + strcmp(ssl_fixture->server_name_indication, SSL_TSI_TEST_WRONG_SNI) == + 0) { + // Expect server to use default server0.pem. check_server0_peer(&peer); + } else { + // Expect server to use server1.pem. + check_server1_peer(&peer); } } else { GPR_ASSERT(ssl_fixture->base.client_result == nullptr); @@ -551,6 +556,19 @@ void ssl_tsi_test_do_handshake_with_server_name_indication_wild_star_domain() { tsi_test_fixture_destroy(fixture); } +void ssl_tsi_test_do_handshake_with_wrong_server_name_indication() { + gpr_log(GPR_INFO, + "ssl_tsi_test_do_handshake_with_wrong_server_name_indication"); + /* server certs do not contain "test.google.cn". */ + tsi_test_fixture* fixture = ssl_tsi_test_fixture_create(); + ssl_tsi_test_fixture* ssl_fixture = + reinterpret_cast(fixture); + ssl_fixture->server_name_indication = + const_cast(SSL_TSI_TEST_WRONG_SNI); + tsi_test_do_handshake(fixture); + tsi_test_fixture_destroy(fixture); +} + void ssl_tsi_test_do_handshake_with_bad_server_cert() { gpr_log(GPR_INFO, "ssl_tsi_test_do_handshake_with_bad_server_cert"); tsi_test_fixture* fixture = ssl_tsi_test_fixture_create(); @@ -915,6 +933,7 @@ int main(int argc, char** argv) { ssl_tsi_test_do_handshake_with_client_authentication_and_root_store(); ssl_tsi_test_do_handshake_with_server_name_indication_exact_domain(); ssl_tsi_test_do_handshake_with_server_name_indication_wild_star_domain(); + ssl_tsi_test_do_handshake_with_wrong_server_name_indication(); ssl_tsi_test_do_handshake_with_bad_server_cert(); ssl_tsi_test_do_handshake_with_bad_client_cert(); #ifdef OPENSSL_IS_BORINGSSL From 0b2484ffc873091759ee5fbe17229bf2070757cc Mon Sep 17 00:00:00 2001 From: Stanley Cheung Date: Thu, 19 Mar 2020 01:52:50 -0700 Subject: [PATCH 231/758] PHP: Add allow fork flag to config.m4 --- src/php/ext/grpc/config.m4 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/php/ext/grpc/config.m4 b/src/php/ext/grpc/config.m4 index 7260dbc72ef..5600df34ccf 100755 --- a/src/php/ext/grpc/config.m4 +++ b/src/php/ext/grpc/config.m4 @@ -86,7 +86,7 @@ if test "$PHP_GRPC" != "no"; then PHP_NEW_EXTENSION(grpc, byte_buffer.c call.c call_credentials.c channel.c \ channel_credentials.c completion_queue.c timeval.c server.c \ - server_credentials.c php_grpc.c, $ext_shared, , -Wall -Werror -std=c11) + server_credentials.c php_grpc.c, $ext_shared, , -Wall -Werror -std=c11 -DGRPC_POSIX_FORK_ALLOW_PTHREAD_ATFORK=1) fi if test "$PHP_COVERAGE" = "yes"; then From f8d90ef897046233a044b8f9cd7e0f2c4e118324 Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Thu, 19 Mar 2020 18:29:20 +0100 Subject: [PATCH 232/758] port server must be used for mac bazel tests --- tools/remote_build/mac.bazelrc | 3 --- 1 file changed, 3 deletions(-) diff --git a/tools/remote_build/mac.bazelrc b/tools/remote_build/mac.bazelrc index fb8833a9618..cc201565f71 100644 --- a/tools/remote_build/mac.bazelrc +++ b/tools/remote_build/mac.bazelrc @@ -4,9 +4,6 @@ # but try to use RBE build cache and upload results # to ResultStore -# don't use port server -build --define GRPC_PORT_ISOLATED_RUNTIME=1 - startup --host_jvm_args=-Dbazel.DigestFunction=SHA256 # remote cache is needed not only for build speedup, From 2a9173f5547205abd097e591a292db5103e06fcd Mon Sep 17 00:00:00 2001 From: jiangtaoli2016 Date: Thu, 19 Mar 2020 11:17:58 -0700 Subject: [PATCH 233/758] Update hardcoded test credentials and keys --- test/core/end2end/data/client_certs.cc | 773 ++++++++++++++--------- test/core/end2end/data/server1_cert.cc | 188 +++--- test/core/end2end/data/server1_key.cc | 217 ++++--- test/core/end2end/data/test_root_cert.cc | 165 +++-- 4 files changed, 835 insertions(+), 508 deletions(-) diff --git a/test/core/end2end/data/client_certs.cc b/test/core/end2end/data/client_certs.cc index 46fc13927c4..de761637ff3 100644 --- a/test/core/end2end/data/client_certs.cc +++ b/test/core/end2end/data/client_certs.cc @@ -19,310 +19,501 @@ extern const char test_self_signed_client_cert[] = { 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x42, 0x45, 0x47, 0x49, 0x4e, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2d, 0x2d, - 0x2d, 0x2d, 0x2d, 0x0a, 0x4d, 0x49, 0x49, 0x43, 0x6f, 0x44, 0x43, 0x43, - 0x41, 0x67, 0x6d, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x4a, - 0x41, 0x4e, 0x49, 0x7a, 0x32, 0x2f, 0x7a, 0x6f, 0x52, 0x69, 0x61, 0x70, - 0x4d, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, - 0x44, 0x51, 0x45, 0x42, 0x42, 0x51, 0x55, 0x41, 0x4d, 0x47, 0x6b, 0x78, - 0x43, 0x7a, 0x41, 0x4a, 0x42, 0x67, 0x4e, 0x56, 0x0a, 0x42, 0x41, 0x59, - 0x54, 0x41, 0x6b, 0x46, 0x56, 0x4d, 0x52, 0x4d, 0x77, 0x45, 0x51, 0x59, - 0x44, 0x56, 0x51, 0x51, 0x49, 0x44, 0x41, 0x70, 0x54, 0x62, 0x32, 0x31, - 0x6c, 0x4c, 0x56, 0x4e, 0x30, 0x59, 0x58, 0x52, 0x6c, 0x4d, 0x53, 0x45, - 0x77, 0x48, 0x77, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4b, 0x44, 0x42, 0x68, - 0x4a, 0x62, 0x6e, 0x52, 0x6c, 0x63, 0x6d, 0x35, 0x6c, 0x64, 0x43, 0x42, - 0x58, 0x0a, 0x61, 0x57, 0x52, 0x6e, 0x61, 0x58, 0x52, 0x7a, 0x49, 0x46, - 0x42, 0x30, 0x65, 0x53, 0x42, 0x4d, 0x64, 0x47, 0x51, 0x78, 0x49, 0x6a, - 0x41, 0x67, 0x42, 0x67, 0x4e, 0x56, 0x42, 0x41, 0x4d, 0x4d, 0x47, 0x57, - 0x4a, 0x68, 0x5a, 0x47, 0x4e, 0x73, 0x61, 0x57, 0x56, 0x75, 0x64, 0x43, - 0x35, 0x30, 0x5a, 0x58, 0x4e, 0x30, 0x4c, 0x6d, 0x64, 0x76, 0x62, 0x32, - 0x64, 0x73, 0x5a, 0x53, 0x35, 0x6a, 0x0a, 0x62, 0x32, 0x30, 0x77, 0x48, - 0x68, 0x63, 0x4e, 0x4d, 0x54, 0x51, 0x77, 0x4e, 0x7a, 0x49, 0x34, 0x4d, - 0x6a, 0x41, 0x77, 0x4f, 0x44, 0x49, 0x31, 0x57, 0x68, 0x63, 0x4e, 0x4d, - 0x6a, 0x51, 0x77, 0x4e, 0x7a, 0x49, 0x31, 0x4d, 0x6a, 0x41, 0x77, 0x4f, - 0x44, 0x49, 0x31, 0x57, 0x6a, 0x42, 0x70, 0x4d, 0x51, 0x73, 0x77, 0x43, - 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4a, 0x42, 0x0a, - 0x56, 0x54, 0x45, 0x54, 0x4d, 0x42, 0x45, 0x47, 0x41, 0x31, 0x55, 0x45, - 0x43, 0x41, 0x77, 0x4b, 0x55, 0x32, 0x39, 0x74, 0x5a, 0x53, 0x31, 0x54, - 0x64, 0x47, 0x46, 0x30, 0x5a, 0x54, 0x45, 0x68, 0x4d, 0x42, 0x38, 0x47, - 0x41, 0x31, 0x55, 0x45, 0x43, 0x67, 0x77, 0x59, 0x53, 0x57, 0x35, 0x30, - 0x5a, 0x58, 0x4a, 0x75, 0x5a, 0x58, 0x51, 0x67, 0x56, 0x32, 0x6c, 0x6b, - 0x5a, 0x32, 0x6c, 0x30, 0x0a, 0x63, 0x79, 0x42, 0x51, 0x64, 0x48, 0x6b, - 0x67, 0x54, 0x48, 0x52, 0x6b, 0x4d, 0x53, 0x49, 0x77, 0x49, 0x41, 0x59, - 0x44, 0x56, 0x51, 0x51, 0x44, 0x44, 0x42, 0x6c, 0x69, 0x59, 0x57, 0x52, - 0x6a, 0x62, 0x47, 0x6c, 0x6c, 0x62, 0x6e, 0x51, 0x75, 0x64, 0x47, 0x56, - 0x7a, 0x64, 0x43, 0x35, 0x6e, 0x62, 0x32, 0x39, 0x6e, 0x62, 0x47, 0x55, - 0x75, 0x59, 0x32, 0x39, 0x74, 0x4d, 0x49, 0x47, 0x66, 0x0a, 0x4d, 0x41, - 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, - 0x45, 0x42, 0x41, 0x51, 0x55, 0x41, 0x41, 0x34, 0x47, 0x4e, 0x41, 0x44, - 0x43, 0x42, 0x69, 0x51, 0x4b, 0x42, 0x67, 0x51, 0x43, 0x79, 0x58, 0x32, - 0x4a, 0x78, 0x5a, 0x2b, 0x4a, 0x35, 0x49, 0x2b, 0x64, 0x6c, 0x68, 0x52, - 0x4f, 0x56, 0x74, 0x71, 0x6c, 0x4d, 0x51, 0x6e, 0x34, 0x37, 0x42, 0x42, - 0x63, 0x72, 0x0a, 0x6c, 0x32, 0x47, 0x43, 0x6b, 0x76, 0x39, 0x4f, 0x31, - 0x44, 0x31, 0x72, 0x4c, 0x39, 0x34, 0x4b, 0x57, 0x59, 0x62, 0x59, 0x31, - 0x34, 0x48, 0x58, 0x68, 0x69, 0x2f, 0x6e, 0x61, 0x63, 0x42, 0x41, 0x51, - 0x74, 0x43, 0x45, 0x51, 0x77, 0x58, 0x78, 0x70, 0x35, 0x44, 0x4b, 0x65, - 0x6d, 0x47, 0x4f, 0x55, 0x6a, 0x75, 0x36, 0x35, 0x78, 0x4d, 0x39, 0x46, - 0x39, 0x36, 0x2f, 0x33, 0x37, 0x34, 0x47, 0x0a, 0x4d, 0x76, 0x6e, 0x52, - 0x4a, 0x64, 0x6f, 0x35, 0x32, 0x67, 0x4f, 0x73, 0x34, 0x48, 0x4f, 0x30, - 0x63, 0x7a, 0x42, 0x70, 0x66, 0x56, 0x4e, 0x64, 0x58, 0x65, 0x65, 0x6f, - 0x44, 0x2f, 0x52, 0x59, 0x67, 0x77, 0x74, 0x74, 0x66, 0x64, 0x4a, 0x72, - 0x7a, 0x2f, 0x34, 0x61, 0x61, 0x74, 0x73, 0x53, 0x32, 0x51, 0x6b, 0x32, - 0x79, 0x4d, 0x59, 0x70, 0x71, 0x5a, 0x6d, 0x71, 0x45, 0x4d, 0x73, 0x62, - 0x0a, 0x72, 0x68, 0x39, 0x57, 0x32, 0x32, 0x4c, 0x70, 0x33, 0x72, 0x43, - 0x42, 0x76, 0x77, 0x49, 0x44, 0x41, 0x51, 0x41, 0x42, 0x6f, 0x31, 0x41, - 0x77, 0x54, 0x6a, 0x41, 0x64, 0x42, 0x67, 0x4e, 0x56, 0x48, 0x51, 0x34, - 0x45, 0x46, 0x67, 0x51, 0x55, 0x35, 0x32, 0x33, 0x41, 0x4a, 0x4d, 0x52, - 0x38, 0x44, 0x73, 0x39, 0x56, 0x38, 0x66, 0x68, 0x66, 0x37, 0x67, 0x75, - 0x31, 0x69, 0x30, 0x4d, 0x4d, 0x0a, 0x55, 0x71, 0x41, 0x77, 0x48, 0x77, - 0x59, 0x44, 0x56, 0x52, 0x30, 0x6a, 0x42, 0x42, 0x67, 0x77, 0x46, 0x6f, - 0x41, 0x55, 0x35, 0x32, 0x33, 0x41, 0x4a, 0x4d, 0x52, 0x38, 0x44, 0x73, - 0x39, 0x56, 0x38, 0x66, 0x68, 0x66, 0x37, 0x67, 0x75, 0x31, 0x69, 0x30, - 0x4d, 0x4d, 0x55, 0x71, 0x41, 0x77, 0x44, 0x41, 0x59, 0x44, 0x56, 0x52, - 0x30, 0x54, 0x42, 0x41, 0x55, 0x77, 0x41, 0x77, 0x45, 0x42, 0x0a, 0x2f, - 0x7a, 0x41, 0x4e, 0x42, 0x67, 0x6b, 0x71, 0x68, 0x6b, 0x69, 0x47, 0x39, - 0x77, 0x30, 0x42, 0x41, 0x51, 0x55, 0x46, 0x41, 0x41, 0x4f, 0x42, 0x67, - 0x51, 0x43, 0x49, 0x2f, 0x74, 0x76, 0x53, 0x42, 0x59, 0x48, 0x31, 0x69, - 0x79, 0x66, 0x4c, 0x61, 0x43, 0x54, 0x42, 0x4b, 0x77, 0x70, 0x64, 0x6a, - 0x33, 0x36, 0x2b, 0x4d, 0x6b, 0x52, 0x39, 0x45, 0x65, 0x4a, 0x4a, 0x6d, - 0x49, 0x6d, 0x78, 0x0a, 0x58, 0x2b, 0x62, 0x6a, 0x68, 0x4b, 0x57, 0x58, - 0x77, 0x73, 0x42, 0x58, 0x34, 0x50, 0x44, 0x4d, 0x57, 0x76, 0x64, 0x75, - 0x73, 0x72, 0x2b, 0x2b, 0x51, 0x47, 0x55, 0x59, 0x74, 0x79, 0x6f, 0x79, - 0x61, 0x2b, 0x68, 0x66, 0x59, 0x4d, 0x58, 0x52, 0x68, 0x58, 0x75, 0x61, - 0x33, 0x39, 0x6d, 0x44, 0x35, 0x34, 0x78, 0x67, 0x6c, 0x6f, 0x51, 0x4e, - 0x75, 0x75, 0x39, 0x52, 0x45, 0x44, 0x77, 0x58, 0x0a, 0x46, 0x66, 0x74, - 0x6f, 0x2b, 0x61, 0x4f, 0x77, 0x33, 0x42, 0x63, 0x59, 0x64, 0x75, 0x63, - 0x7a, 0x36, 0x6f, 0x66, 0x78, 0x69, 0x63, 0x46, 0x4b, 0x2f, 0x59, 0x32, - 0x56, 0x65, 0x58, 0x44, 0x75, 0x72, 0x53, 0x4d, 0x70, 0x52, 0x76, 0x35, - 0x54, 0x66, 0x47, 0x66, 0x32, 0x51, 0x72, 0x36, 0x65, 0x4f, 0x4f, 0x64, - 0x61, 0x52, 0x68, 0x6a, 0x36, 0x65, 0x64, 0x37, 0x42, 0x69, 0x62, 0x48, - 0x6b, 0x0a, 0x58, 0x31, 0x56, 0x47, 0x5a, 0x41, 0x3d, 0x3d, 0x0a, 0x2d, - 0x2d, 0x2d, 0x2d, 0x2d, 0x45, 0x4e, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, - 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, - 0x0a, 0x00}; + 0x2d, 0x2d, 0x2d, 0x0a, 0x4d, 0x49, 0x49, 0x44, 0x73, 0x7a, 0x43, 0x43, + 0x41, 0x70, 0x75, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x55, + 0x4f, 0x4e, 0x57, 0x62, 0x6b, 0x55, 0x6e, 0x31, 0x6f, 0x62, 0x48, 0x43, + 0x77, 0x39, 0x4c, 0x37, 0x6c, 0x4d, 0x4e, 0x45, 0x45, 0x35, 0x52, 0x45, + 0x76, 0x62, 0x38, 0x77, 0x44, 0x51, 0x59, 0x4a, 0x4b, 0x6f, 0x5a, 0x49, + 0x68, 0x76, 0x63, 0x4e, 0x41, 0x51, 0x45, 0x4c, 0x0a, 0x42, 0x51, 0x41, + 0x77, 0x61, 0x54, 0x45, 0x4c, 0x4d, 0x41, 0x6b, 0x47, 0x41, 0x31, 0x55, + 0x45, 0x42, 0x68, 0x4d, 0x43, 0x51, 0x56, 0x55, 0x78, 0x45, 0x7a, 0x41, + 0x52, 0x42, 0x67, 0x4e, 0x56, 0x42, 0x41, 0x67, 0x4d, 0x43, 0x6c, 0x4e, + 0x76, 0x62, 0x57, 0x55, 0x74, 0x55, 0x33, 0x52, 0x68, 0x64, 0x47, 0x55, + 0x78, 0x49, 0x54, 0x41, 0x66, 0x42, 0x67, 0x4e, 0x56, 0x42, 0x41, 0x6f, + 0x4d, 0x0a, 0x47, 0x45, 0x6c, 0x75, 0x64, 0x47, 0x56, 0x79, 0x62, 0x6d, + 0x56, 0x30, 0x49, 0x46, 0x64, 0x70, 0x5a, 0x47, 0x64, 0x70, 0x64, 0x48, + 0x4d, 0x67, 0x55, 0x48, 0x52, 0x35, 0x49, 0x45, 0x78, 0x30, 0x5a, 0x44, + 0x45, 0x69, 0x4d, 0x43, 0x41, 0x47, 0x41, 0x31, 0x55, 0x45, 0x41, 0x77, + 0x77, 0x5a, 0x59, 0x6d, 0x46, 0x6b, 0x59, 0x32, 0x78, 0x70, 0x5a, 0x57, + 0x35, 0x30, 0x4c, 0x6e, 0x52, 0x6c, 0x0a, 0x63, 0x33, 0x51, 0x75, 0x5a, + 0x32, 0x39, 0x76, 0x5a, 0x32, 0x78, 0x6c, 0x4c, 0x6d, 0x4e, 0x76, 0x62, + 0x54, 0x41, 0x65, 0x46, 0x77, 0x30, 0x79, 0x4d, 0x44, 0x41, 0x7a, 0x4d, + 0x54, 0x63, 0x78, 0x4e, 0x7a, 0x51, 0x7a, 0x4d, 0x6a, 0x4e, 0x61, 0x46, + 0x77, 0x30, 0x7a, 0x4d, 0x44, 0x41, 0x7a, 0x4d, 0x54, 0x55, 0x78, 0x4e, + 0x7a, 0x51, 0x7a, 0x4d, 0x6a, 0x4e, 0x61, 0x4d, 0x47, 0x6b, 0x78, 0x0a, + 0x43, 0x7a, 0x41, 0x4a, 0x42, 0x67, 0x4e, 0x56, 0x42, 0x41, 0x59, 0x54, + 0x41, 0x6b, 0x46, 0x56, 0x4d, 0x52, 0x4d, 0x77, 0x45, 0x51, 0x59, 0x44, + 0x56, 0x51, 0x51, 0x49, 0x44, 0x41, 0x70, 0x54, 0x62, 0x32, 0x31, 0x6c, + 0x4c, 0x56, 0x4e, 0x30, 0x59, 0x58, 0x52, 0x6c, 0x4d, 0x53, 0x45, 0x77, + 0x48, 0x77, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4b, 0x44, 0x42, 0x68, 0x4a, + 0x62, 0x6e, 0x52, 0x6c, 0x0a, 0x63, 0x6d, 0x35, 0x6c, 0x64, 0x43, 0x42, + 0x58, 0x61, 0x57, 0x52, 0x6e, 0x61, 0x58, 0x52, 0x7a, 0x49, 0x46, 0x42, + 0x30, 0x65, 0x53, 0x42, 0x4d, 0x64, 0x47, 0x51, 0x78, 0x49, 0x6a, 0x41, + 0x67, 0x42, 0x67, 0x4e, 0x56, 0x42, 0x41, 0x4d, 0x4d, 0x47, 0x57, 0x4a, + 0x68, 0x5a, 0x47, 0x4e, 0x73, 0x61, 0x57, 0x56, 0x75, 0x64, 0x43, 0x35, + 0x30, 0x5a, 0x58, 0x4e, 0x30, 0x4c, 0x6d, 0x64, 0x76, 0x0a, 0x62, 0x32, + 0x64, 0x73, 0x5a, 0x53, 0x35, 0x6a, 0x62, 0x32, 0x30, 0x77, 0x67, 0x67, + 0x45, 0x69, 0x4d, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, + 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x41, 0x51, 0x55, 0x41, 0x41, 0x34, + 0x49, 0x42, 0x44, 0x77, 0x41, 0x77, 0x67, 0x67, 0x45, 0x4b, 0x41, 0x6f, + 0x49, 0x42, 0x41, 0x51, 0x44, 0x76, 0x64, 0x7a, 0x4b, 0x44, 0x54, 0x59, + 0x76, 0x52, 0x0a, 0x67, 0x6a, 0x42, 0x4f, 0x55, 0x4f, 0x72, 0x7a, 0x44, + 0x77, 0x6b, 0x41, 0x5a, 0x47, 0x77, 0x4e, 0x46, 0x48, 0x48, 0x6c, 0x4d, + 0x59, 0x79, 0x4d, 0x47, 0x49, 0x35, 0x74, 0x49, 0x74, 0x6a, 0x33, 0x74, + 0x43, 0x7a, 0x58, 0x6b, 0x62, 0x70, 0x4d, 0x30, 0x75, 0x7a, 0x33, 0x5a, + 0x6a, 0x48, 0x56, 0x61, 0x68, 0x75, 0x2b, 0x65, 0x59, 0x63, 0x2b, 0x4b, + 0x76, 0x59, 0x41, 0x70, 0x4d, 0x36, 0x34, 0x0a, 0x46, 0x32, 0x64, 0x42, + 0x62, 0x31, 0x36, 0x68, 0x73, 0x37, 0x31, 0x33, 0x46, 0x43, 0x6b, 0x38, + 0x6d, 0x69, 0x68, 0x59, 0x41, 0x42, 0x6a, 0x6e, 0x53, 0x6e, 0x64, 0x72, + 0x51, 0x73, 0x6c, 0x2f, 0x55, 0x32, 0x76, 0x38, 0x59, 0x46, 0x54, 0x37, + 0x44, 0x69, 0x70, 0x66, 0x4c, 0x52, 0x65, 0x71, 0x71, 0x61, 0x4f, 0x47, + 0x75, 0x32, 0x6f, 0x39, 0x48, 0x64, 0x76, 0x57, 0x66, 0x69, 0x55, 0x6c, + 0x0a, 0x61, 0x69, 0x43, 0x2f, 0x55, 0x47, 0x47, 0x66, 0x52, 0x2b, 0x59, + 0x62, 0x6c, 0x70, 0x4b, 0x37, 0x43, 0x47, 0x2b, 0x37, 0x2f, 0x68, 0x76, + 0x54, 0x58, 0x74, 0x55, 0x73, 0x4d, 0x77, 0x2b, 0x4f, 0x70, 0x70, 0x6f, + 0x65, 0x48, 0x39, 0x7a, 0x38, 0x37, 0x72, 0x68, 0x4f, 0x4a, 0x4d, 0x78, + 0x74, 0x69, 0x43, 0x37, 0x58, 0x77, 0x55, 0x35, 0x72, 0x68, 0x45, 0x6d, + 0x61, 0x62, 0x2f, 0x31, 0x66, 0x0a, 0x31, 0x58, 0x4d, 0x2f, 0x6e, 0x4c, + 0x6f, 0x5a, 0x72, 0x66, 0x44, 0x41, 0x63, 0x54, 0x62, 0x44, 0x79, 0x77, + 0x6f, 0x65, 0x75, 0x38, 0x32, 0x36, 0x53, 0x4a, 0x33, 0x6d, 0x69, 0x66, + 0x61, 0x6a, 0x71, 0x37, 0x6f, 0x4b, 0x33, 0x4c, 0x44, 0x64, 0x4e, 0x4c, + 0x6a, 0x57, 0x5a, 0x77, 0x66, 0x45, 0x73, 0x43, 0x4f, 0x31, 0x71, 0x70, + 0x32, 0x43, 0x34, 0x67, 0x4c, 0x76, 0x42, 0x6c, 0x4f, 0x4f, 0x0a, 0x4b, + 0x73, 0x57, 0x4f, 0x4c, 0x4e, 0x62, 0x79, 0x36, 0x42, 0x79, 0x78, 0x43, + 0x4f, 0x50, 0x6c, 0x43, 0x54, 0x61, 0x30, 0x55, 0x43, 0x61, 0x56, 0x75, + 0x6f, 0x4e, 0x63, 0x6c, 0x59, 0x6f, 0x6c, 0x37, 0x31, 0x6a, 0x79, 0x69, + 0x31, 0x37, 0x4b, 0x57, 0x2b, 0x4e, 0x6b, 0x30, 0x6e, 0x4e, 0x65, 0x39, + 0x79, 0x61, 0x56, 0x63, 0x79, 0x72, 0x36, 0x48, 0x30, 0x7a, 0x33, 0x62, + 0x49, 0x6d, 0x66, 0x0a, 0x4a, 0x68, 0x62, 0x53, 0x75, 0x34, 0x72, 0x7a, + 0x49, 0x39, 0x33, 0x6e, 0x41, 0x67, 0x4d, 0x42, 0x41, 0x41, 0x47, 0x6a, + 0x55, 0x7a, 0x42, 0x52, 0x4d, 0x42, 0x30, 0x47, 0x41, 0x31, 0x55, 0x64, + 0x44, 0x67, 0x51, 0x57, 0x42, 0x42, 0x54, 0x4b, 0x4a, 0x73, 0x6b, 0x45, + 0x59, 0x64, 0x32, 0x6e, 0x64, 0x72, 0x77, 0x69, 0x68, 0x50, 0x54, 0x67, + 0x32, 0x50, 0x7a, 0x59, 0x46, 0x2f, 0x6b, 0x50, 0x0a, 0x67, 0x7a, 0x41, + 0x66, 0x42, 0x67, 0x4e, 0x56, 0x48, 0x53, 0x4d, 0x45, 0x47, 0x44, 0x41, + 0x57, 0x67, 0x42, 0x54, 0x4b, 0x4a, 0x73, 0x6b, 0x45, 0x59, 0x64, 0x32, + 0x6e, 0x64, 0x72, 0x77, 0x69, 0x68, 0x50, 0x54, 0x67, 0x32, 0x50, 0x7a, + 0x59, 0x46, 0x2f, 0x6b, 0x50, 0x67, 0x7a, 0x41, 0x50, 0x42, 0x67, 0x4e, + 0x56, 0x48, 0x52, 0x4d, 0x42, 0x41, 0x66, 0x38, 0x45, 0x42, 0x54, 0x41, + 0x44, 0x0a, 0x41, 0x51, 0x48, 0x2f, 0x4d, 0x41, 0x30, 0x47, 0x43, 0x53, + 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x43, 0x77, + 0x55, 0x41, 0x41, 0x34, 0x49, 0x42, 0x41, 0x51, 0x42, 0x6f, 0x47, 0x77, + 0x57, 0x52, 0x30, 0x70, 0x4c, 0x4d, 0x31, 0x69, 0x63, 0x58, 0x34, 0x62, + 0x49, 0x4a, 0x36, 0x79, 0x64, 0x75, 0x46, 0x55, 0x2f, 0x41, 0x34, 0x6a, + 0x53, 0x69, 0x71, 0x45, 0x54, 0x36, 0x0a, 0x67, 0x76, 0x4a, 0x68, 0x77, + 0x67, 0x45, 0x72, 0x69, 0x6c, 0x71, 0x54, 0x4b, 0x66, 0x48, 0x36, 0x59, + 0x38, 0x39, 0x72, 0x71, 0x74, 0x7a, 0x57, 0x38, 0x6b, 0x34, 0x55, 0x75, + 0x72, 0x41, 0x4f, 0x43, 0x73, 0x45, 0x34, 0x46, 0x41, 0x36, 0x77, 0x62, + 0x6b, 0x48, 0x57, 0x77, 0x72, 0x55, 0x4d, 0x6e, 0x43, 0x6c, 0x59, 0x34, + 0x6c, 0x6b, 0x48, 0x4a, 0x68, 0x2b, 0x4d, 0x75, 0x4e, 0x61, 0x4a, 0x0a, + 0x6e, 0x43, 0x47, 0x72, 0x4b, 0x38, 0x77, 0x52, 0x4b, 0x47, 0x62, 0x2f, + 0x6d, 0x71, 0x57, 0x39, 0x64, 0x35, 0x70, 0x50, 0x37, 0x32, 0x45, 0x74, + 0x31, 0x51, 0x36, 0x4f, 0x57, 0x36, 0x44, 0x41, 0x4b, 0x71, 0x47, 0x66, + 0x6a, 0x44, 0x57, 0x68, 0x32, 0x4d, 0x7a, 0x53, 0x50, 0x48, 0x42, 0x78, + 0x63, 0x43, 0x4c, 0x65, 0x79, 0x69, 0x67, 0x4f, 0x31, 0x77, 0x71, 0x64, + 0x34, 0x57, 0x31, 0x54, 0x0a, 0x6e, 0x76, 0x76, 0x71, 0x6c, 0x36, 0x6c, + 0x34, 0x4c, 0x2b, 0x42, 0x35, 0x49, 0x54, 0x2f, 0x63, 0x2b, 0x2f, 0x45, + 0x48, 0x4f, 0x33, 0x50, 0x77, 0x62, 0x49, 0x39, 0x76, 0x36, 0x4d, 0x47, + 0x54, 0x74, 0x4c, 0x6a, 0x73, 0x5a, 0x67, 0x6b, 0x52, 0x4b, 0x49, 0x74, + 0x61, 0x50, 0x68, 0x2b, 0x59, 0x65, 0x4a, 0x64, 0x6d, 0x42, 0x59, 0x68, + 0x52, 0x44, 0x31, 0x42, 0x76, 0x57, 0x62, 0x36, 0x73, 0x0a, 0x56, 0x77, + 0x45, 0x62, 0x37, 0x61, 0x51, 0x31, 0x6f, 0x53, 0x46, 0x2b, 0x65, 0x73, + 0x55, 0x76, 0x4d, 0x6d, 0x6a, 0x47, 0x56, 0x75, 0x48, 0x58, 0x75, 0x51, + 0x76, 0x57, 0x4a, 0x61, 0x68, 0x6e, 0x6a, 0x59, 0x64, 0x59, 0x54, 0x32, + 0x44, 0x69, 0x6b, 0x79, 0x71, 0x52, 0x2b, 0x41, 0x77, 0x61, 0x4b, 0x7a, + 0x72, 0x65, 0x34, 0x47, 0x4a, 0x4d, 0x48, 0x73, 0x58, 0x33, 0x2f, 0x43, + 0x66, 0x38, 0x0a, 0x71, 0x64, 0x78, 0x79, 0x49, 0x2b, 0x42, 0x31, 0x6a, + 0x55, 0x77, 0x4e, 0x72, 0x37, 0x73, 0x4c, 0x41, 0x32, 0x45, 0x59, 0x44, + 0x6a, 0x6e, 0x55, 0x52, 0x30, 0x6a, 0x45, 0x48, 0x63, 0x72, 0x4f, 0x42, + 0x53, 0x70, 0x49, 0x51, 0x79, 0x52, 0x4d, 0x47, 0x57, 0x64, 0x75, 0x6a, + 0x30, 0x50, 0x31, 0x36, 0x79, 0x62, 0x39, 0x0a, 0x2d, 0x2d, 0x2d, 0x2d, + 0x2d, 0x45, 0x4e, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, + 0x43, 0x41, 0x54, 0x45, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a}; extern const char test_self_signed_client_key[] = { 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x42, 0x45, 0x47, 0x49, 0x4e, 0x20, 0x50, 0x52, 0x49, 0x56, 0x41, 0x54, 0x45, 0x20, 0x4b, 0x45, 0x59, 0x2d, 0x2d, - 0x2d, 0x2d, 0x2d, 0x0a, 0x4d, 0x49, 0x49, 0x43, 0x64, 0x77, 0x49, 0x42, + 0x2d, 0x2d, 0x2d, 0x0a, 0x4d, 0x49, 0x49, 0x45, 0x76, 0x67, 0x49, 0x42, 0x41, 0x44, 0x41, 0x4e, 0x42, 0x67, 0x6b, 0x71, 0x68, 0x6b, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x45, 0x46, 0x41, 0x41, 0x53, 0x43, - 0x41, 0x6d, 0x45, 0x77, 0x67, 0x67, 0x4a, 0x64, 0x41, 0x67, 0x45, 0x41, - 0x41, 0x6f, 0x47, 0x42, 0x41, 0x4c, 0x4a, 0x66, 0x59, 0x6e, 0x46, 0x6e, - 0x34, 0x6e, 0x6b, 0x6a, 0x35, 0x32, 0x57, 0x46, 0x0a, 0x45, 0x35, 0x57, - 0x32, 0x71, 0x55, 0x78, 0x43, 0x66, 0x6a, 0x73, 0x45, 0x46, 0x79, 0x75, - 0x58, 0x59, 0x59, 0x4b, 0x53, 0x2f, 0x30, 0x37, 0x55, 0x50, 0x57, 0x73, - 0x76, 0x33, 0x67, 0x70, 0x5a, 0x68, 0x74, 0x6a, 0x58, 0x67, 0x64, 0x65, - 0x47, 0x4c, 0x2b, 0x64, 0x70, 0x77, 0x45, 0x42, 0x43, 0x30, 0x49, 0x52, - 0x44, 0x42, 0x66, 0x47, 0x6e, 0x6b, 0x4d, 0x70, 0x36, 0x59, 0x59, 0x35, - 0x53, 0x0a, 0x4f, 0x37, 0x72, 0x6e, 0x45, 0x7a, 0x30, 0x58, 0x33, 0x72, - 0x2f, 0x66, 0x76, 0x67, 0x59, 0x79, 0x2b, 0x64, 0x45, 0x6c, 0x32, 0x6a, - 0x6e, 0x61, 0x41, 0x36, 0x7a, 0x67, 0x63, 0x37, 0x52, 0x7a, 0x4d, 0x47, - 0x6c, 0x39, 0x55, 0x31, 0x31, 0x64, 0x35, 0x36, 0x67, 0x50, 0x39, 0x46, - 0x69, 0x44, 0x43, 0x32, 0x31, 0x39, 0x30, 0x6d, 0x76, 0x50, 0x2f, 0x68, - 0x70, 0x71, 0x32, 0x78, 0x4c, 0x5a, 0x0a, 0x43, 0x54, 0x62, 0x49, 0x78, - 0x69, 0x6d, 0x70, 0x6d, 0x61, 0x6f, 0x51, 0x79, 0x78, 0x75, 0x75, 0x48, - 0x31, 0x62, 0x62, 0x59, 0x75, 0x6e, 0x65, 0x73, 0x49, 0x47, 0x2f, 0x41, - 0x67, 0x4d, 0x42, 0x41, 0x41, 0x45, 0x43, 0x67, 0x59, 0x41, 0x64, 0x71, - 0x4a, 0x43, 0x45, 0x7a, 0x4d, 0x49, 0x79, 0x5a, 0x45, 0x37, 0x6f, 0x61, - 0x57, 0x30, 0x74, 0x4f, 0x70, 0x63, 0x42, 0x30, 0x42, 0x69, 0x50, 0x0a, - 0x46, 0x59, 0x6f, 0x49, 0x76, 0x48, 0x34, 0x42, 0x4b, 0x52, 0x48, 0x38, - 0x65, 0x48, 0x76, 0x52, 0x34, 0x37, 0x36, 0x6d, 0x74, 0x2b, 0x59, 0x64, - 0x44, 0x68, 0x42, 0x50, 0x31, 0x73, 0x63, 0x47, 0x55, 0x6d, 0x59, 0x65, - 0x43, 0x54, 0x34, 0x45, 0x6a, 0x2b, 0x52, 0x67, 0x48, 0x76, 0x32, 0x4c, - 0x50, 0x54, 0x67, 0x56, 0x59, 0x77, 0x54, 0x39, 0x65, 0x63, 0x69, 0x50, - 0x32, 0x2b, 0x45, 0x2f, 0x0a, 0x43, 0x42, 0x43, 0x4e, 0x52, 0x65, 0x6c, - 0x30, 0x53, 0x77, 0x39, 0x4a, 0x65, 0x70, 0x77, 0x57, 0x30, 0x72, 0x2b, - 0x6a, 0x57, 0x4a, 0x74, 0x44, 0x59, 0x31, 0x70, 0x70, 0x36, 0x59, 0x58, - 0x41, 0x67, 0x4e, 0x52, 0x47, 0x58, 0x32, 0x55, 0x66, 0x6c, 0x76, 0x55, - 0x73, 0x54, 0x2b, 0x6f, 0x39, 0x6c, 0x5a, 0x76, 0x61, 0x67, 0x66, 0x39, - 0x6d, 0x6f, 0x4c, 0x54, 0x4d, 0x79, 0x47, 0x76, 0x55, 0x0a, 0x75, 0x4c, - 0x46, 0x6e, 0x73, 0x79, 0x66, 0x4c, 0x69, 0x6d, 0x31, 0x42, 0x34, 0x76, - 0x58, 0x76, 0x57, 0x51, 0x4a, 0x42, 0x41, 0x4e, 0x6f, 0x75, 0x5a, 0x6c, - 0x6c, 0x58, 0x47, 0x5a, 0x6f, 0x53, 0x72, 0x5a, 0x4c, 0x74, 0x52, 0x33, - 0x56, 0x67, 0x56, 0x34, 0x74, 0x7a, 0x52, 0x51, 0x76, 0x4a, 0x78, 0x75, - 0x38, 0x34, 0x6b, 0x4c, 0x65, 0x49, 0x6b, 0x36, 0x34, 0x4f, 0x76, 0x34, - 0x37, 0x58, 0x0a, 0x70, 0x48, 0x56, 0x42, 0x4d, 0x54, 0x52, 0x42, 0x66, - 0x7a, 0x50, 0x45, 0x68, 0x62, 0x42, 0x6f, 0x64, 0x6a, 0x72, 0x31, 0x6d, - 0x35, 0x4f, 0x4c, 0x61, 0x56, 0x4c, 0x71, 0x6b, 0x46, 0x63, 0x58, 0x66, - 0x74, 0x7a, 0x52, 0x43, 0x72, 0x62, 0x57, 0x6f, 0x4b, 0x73, 0x43, 0x51, - 0x51, 0x44, 0x52, 0x53, 0x6f, 0x4c, 0x4c, 0x58, 0x4f, 0x69, 0x4c, 0x72, - 0x74, 0x4a, 0x33, 0x44, 0x4c, 0x4a, 0x43, 0x0a, 0x72, 0x58, 0x37, 0x59, - 0x38, 0x77, 0x72, 0x48, 0x5a, 0x72, 0x71, 0x6b, 0x35, 0x62, 0x4d, 0x64, - 0x5a, 0x4c, 0x47, 0x61, 0x2f, 0x55, 0x58, 0x38, 0x52, 0x61, 0x6e, 0x68, - 0x56, 0x77, 0x33, 0x2b, 0x58, 0x70, 0x2b, 0x75, 0x72, 0x64, 0x31, 0x37, - 0x31, 0x31, 0x75, 0x6d, 0x65, 0x4e, 0x4a, 0x66, 0x7a, 0x75, 0x2f, 0x4d, - 0x43, 0x6b, 0x34, 0x61, 0x31, 0x4b, 0x6b, 0x47, 0x2f, 0x43, 0x55, 0x30, - 0x0a, 0x72, 0x71, 0x73, 0x39, 0x41, 0x6b, 0x41, 0x34, 0x63, 0x53, 0x78, - 0x31, 0x44, 0x44, 0x31, 0x4a, 0x53, 0x47, 0x2b, 0x79, 0x78, 0x4d, 0x4e, - 0x70, 0x73, 0x41, 0x53, 0x31, 0x78, 0x4a, 0x6f, 0x6d, 0x46, 0x49, 0x72, - 0x73, 0x4d, 0x39, 0x76, 0x73, 0x50, 0x74, 0x37, 0x46, 0x64, 0x6e, 0x64, - 0x44, 0x77, 0x72, 0x46, 0x2b, 0x79, 0x2b, 0x43, 0x6f, 0x76, 0x68, 0x44, - 0x6b, 0x47, 0x59, 0x44, 0x6b, 0x0a, 0x52, 0x41, 0x48, 0x68, 0x2b, 0x73, - 0x76, 0x47, 0x66, 0x5a, 0x67, 0x2f, 0x70, 0x51, 0x4b, 0x32, 0x4a, 0x52, - 0x50, 0x69, 0x6d, 0x41, 0x6d, 0x48, 0x68, 0x7a, 0x71, 0x46, 0x41, 0x6b, - 0x45, 0x41, 0x75, 0x36, 0x59, 0x61, 0x37, 0x30, 0x73, 0x32, 0x46, 0x55, - 0x65, 0x42, 0x33, 0x4d, 0x75, 0x39, 0x61, 0x4a, 0x73, 0x32, 0x43, 0x44, - 0x36, 0x68, 0x67, 0x33, 0x64, 0x51, 0x45, 0x56, 0x6b, 0x42, 0x0a, 0x35, - 0x33, 0x44, 0x49, 0x37, 0x54, 0x58, 0x34, 0x38, 0x64, 0x39, 0x6b, 0x47, - 0x57, 0x35, 0x38, 0x56, 0x58, 0x31, 0x78, 0x6e, 0x71, 0x53, 0x30, 0x32, - 0x4c, 0x79, 0x57, 0x71, 0x41, 0x50, 0x63, 0x57, 0x35, 0x71, 0x6d, 0x31, - 0x6b, 0x4c, 0x48, 0x46, 0x4c, 0x64, 0x6e, 0x64, 0x61, 0x50, 0x4e, 0x6d, - 0x42, 0x61, 0x6a, 0x34, 0x51, 0x4a, 0x42, 0x41, 0x4a, 0x75, 0x67, 0x6c, - 0x33, 0x36, 0x37, 0x0a, 0x39, 0x64, 0x39, 0x74, 0x2f, 0x51, 0x4c, 0x54, - 0x53, 0x75, 0x55, 0x4c, 0x4c, 0x61, 0x6f, 0x59, 0x76, 0x32, 0x76, 0x4a, - 0x54, 0x33, 0x73, 0x31, 0x79, 0x39, 0x48, 0x4e, 0x38, 0x39, 0x45, 0x6f, - 0x61, 0x44, 0x44, 0x45, 0x6b, 0x50, 0x56, 0x66, 0x51, 0x75, 0x36, 0x47, - 0x56, 0x45, 0x58, 0x67, 0x49, 0x42, 0x74, 0x69, 0x6d, 0x31, 0x73, 0x49, - 0x2f, 0x56, 0x50, 0x53, 0x7a, 0x49, 0x38, 0x48, 0x0a, 0x61, 0x58, 0x76, - 0x61, 0x54, 0x55, 0x77, 0x62, 0x6c, 0x46, 0x57, 0x53, 0x4d, 0x37, 0x30, - 0x3d, 0x0a, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x45, 0x4e, 0x44, 0x20, 0x50, - 0x52, 0x49, 0x56, 0x41, 0x54, 0x45, 0x20, 0x4b, 0x45, 0x59, 0x2d, 0x2d, - 0x2d, 0x2d, 0x2d, 0x0a, 0x00}; + 0x42, 0x4b, 0x67, 0x77, 0x67, 0x67, 0x53, 0x6b, 0x41, 0x67, 0x45, 0x41, + 0x41, 0x6f, 0x49, 0x42, 0x41, 0x51, 0x44, 0x76, 0x64, 0x7a, 0x4b, 0x44, + 0x54, 0x59, 0x76, 0x52, 0x67, 0x6a, 0x42, 0x4f, 0x0a, 0x55, 0x4f, 0x72, + 0x7a, 0x44, 0x77, 0x6b, 0x41, 0x5a, 0x47, 0x77, 0x4e, 0x46, 0x48, 0x48, + 0x6c, 0x4d, 0x59, 0x79, 0x4d, 0x47, 0x49, 0x35, 0x74, 0x49, 0x74, 0x6a, + 0x33, 0x74, 0x43, 0x7a, 0x58, 0x6b, 0x62, 0x70, 0x4d, 0x30, 0x75, 0x7a, + 0x33, 0x5a, 0x6a, 0x48, 0x56, 0x61, 0x68, 0x75, 0x2b, 0x65, 0x59, 0x63, + 0x2b, 0x4b, 0x76, 0x59, 0x41, 0x70, 0x4d, 0x36, 0x34, 0x46, 0x32, 0x64, + 0x42, 0x0a, 0x62, 0x31, 0x36, 0x68, 0x73, 0x37, 0x31, 0x33, 0x46, 0x43, + 0x6b, 0x38, 0x6d, 0x69, 0x68, 0x59, 0x41, 0x42, 0x6a, 0x6e, 0x53, 0x6e, + 0x64, 0x72, 0x51, 0x73, 0x6c, 0x2f, 0x55, 0x32, 0x76, 0x38, 0x59, 0x46, + 0x54, 0x37, 0x44, 0x69, 0x70, 0x66, 0x4c, 0x52, 0x65, 0x71, 0x71, 0x61, + 0x4f, 0x47, 0x75, 0x32, 0x6f, 0x39, 0x48, 0x64, 0x76, 0x57, 0x66, 0x69, + 0x55, 0x6c, 0x61, 0x69, 0x43, 0x2f, 0x0a, 0x55, 0x47, 0x47, 0x66, 0x52, + 0x2b, 0x59, 0x62, 0x6c, 0x70, 0x4b, 0x37, 0x43, 0x47, 0x2b, 0x37, 0x2f, + 0x68, 0x76, 0x54, 0x58, 0x74, 0x55, 0x73, 0x4d, 0x77, 0x2b, 0x4f, 0x70, + 0x70, 0x6f, 0x65, 0x48, 0x39, 0x7a, 0x38, 0x37, 0x72, 0x68, 0x4f, 0x4a, + 0x4d, 0x78, 0x74, 0x69, 0x43, 0x37, 0x58, 0x77, 0x55, 0x35, 0x72, 0x68, + 0x45, 0x6d, 0x61, 0x62, 0x2f, 0x31, 0x66, 0x31, 0x58, 0x4d, 0x2f, 0x0a, + 0x6e, 0x4c, 0x6f, 0x5a, 0x72, 0x66, 0x44, 0x41, 0x63, 0x54, 0x62, 0x44, + 0x79, 0x77, 0x6f, 0x65, 0x75, 0x38, 0x32, 0x36, 0x53, 0x4a, 0x33, 0x6d, + 0x69, 0x66, 0x61, 0x6a, 0x71, 0x37, 0x6f, 0x4b, 0x33, 0x4c, 0x44, 0x64, + 0x4e, 0x4c, 0x6a, 0x57, 0x5a, 0x77, 0x66, 0x45, 0x73, 0x43, 0x4f, 0x31, + 0x71, 0x70, 0x32, 0x43, 0x34, 0x67, 0x4c, 0x76, 0x42, 0x6c, 0x4f, 0x4f, + 0x4b, 0x73, 0x57, 0x4f, 0x0a, 0x4c, 0x4e, 0x62, 0x79, 0x36, 0x42, 0x79, + 0x78, 0x43, 0x4f, 0x50, 0x6c, 0x43, 0x54, 0x61, 0x30, 0x55, 0x43, 0x61, + 0x56, 0x75, 0x6f, 0x4e, 0x63, 0x6c, 0x59, 0x6f, 0x6c, 0x37, 0x31, 0x6a, + 0x79, 0x69, 0x31, 0x37, 0x4b, 0x57, 0x2b, 0x4e, 0x6b, 0x30, 0x6e, 0x4e, + 0x65, 0x39, 0x79, 0x61, 0x56, 0x63, 0x79, 0x72, 0x36, 0x48, 0x30, 0x7a, + 0x33, 0x62, 0x49, 0x6d, 0x66, 0x4a, 0x68, 0x62, 0x53, 0x0a, 0x75, 0x34, + 0x72, 0x7a, 0x49, 0x39, 0x33, 0x6e, 0x41, 0x67, 0x4d, 0x42, 0x41, 0x41, + 0x45, 0x43, 0x67, 0x67, 0x45, 0x42, 0x41, 0x4f, 0x49, 0x50, 0x4f, 0x4a, + 0x52, 0x54, 0x70, 0x47, 0x61, 0x48, 0x37, 0x47, 0x70, 0x43, 0x59, 0x55, + 0x70, 0x4c, 0x4b, 0x30, 0x67, 0x2f, 0x68, 0x50, 0x46, 0x6b, 0x46, 0x35, + 0x45, 0x79, 0x45, 0x57, 0x67, 0x2f, 0x31, 0x6c, 0x53, 0x59, 0x7a, 0x52, + 0x49, 0x70, 0x0a, 0x2b, 0x52, 0x73, 0x58, 0x36, 0x7a, 0x4f, 0x53, 0x2b, + 0x7a, 0x6b, 0x69, 0x4e, 0x48, 0x45, 0x76, 0x31, 0x6a, 0x6b, 0x65, 0x4b, + 0x4e, 0x6f, 0x37, 0x58, 0x44, 0x69, 0x48, 0x58, 0x4d, 0x37, 0x55, 0x36, + 0x52, 0x6b, 0x51, 0x74, 0x64, 0x6b, 0x5a, 0x41, 0x51, 0x64, 0x6b, 0x39, + 0x50, 0x6a, 0x4d, 0x33, 0x73, 0x45, 0x55, 0x64, 0x6d, 0x34, 0x43, 0x45, + 0x6e, 0x49, 0x6a, 0x66, 0x6d, 0x7a, 0x41, 0x0a, 0x70, 0x2f, 0x52, 0x38, + 0x54, 0x44, 0x30, 0x6b, 0x78, 0x6b, 0x4e, 0x4c, 0x49, 0x6b, 0x68, 0x75, + 0x46, 0x48, 0x32, 0x67, 0x64, 0x30, 0x35, 0x79, 0x33, 0x5a, 0x48, 0x44, + 0x53, 0x2f, 0x58, 0x69, 0x46, 0x6b, 0x41, 0x45, 0x39, 0x65, 0x4f, 0x54, + 0x30, 0x46, 0x72, 0x43, 0x37, 0x6f, 0x6d, 0x36, 0x45, 0x53, 0x44, 0x37, + 0x5a, 0x66, 0x46, 0x49, 0x57, 0x52, 0x31, 0x38, 0x70, 0x6e, 0x63, 0x57, + 0x0a, 0x5a, 0x47, 0x71, 0x37, 0x74, 0x46, 0x41, 0x5a, 0x5a, 0x52, 0x6d, + 0x70, 0x6b, 0x75, 0x6d, 0x32, 0x44, 0x2b, 0x4d, 0x4a, 0x79, 0x31, 0x67, + 0x57, 0x78, 0x49, 0x58, 0x42, 0x78, 0x74, 0x35, 0x6d, 0x61, 0x64, 0x54, + 0x45, 0x70, 0x52, 0x78, 0x51, 0x64, 0x35, 0x36, 0x74, 0x6f, 0x45, 0x6e, + 0x66, 0x78, 0x33, 0x37, 0x32, 0x46, 0x30, 0x79, 0x34, 0x7a, 0x6b, 0x63, + 0x58, 0x33, 0x70, 0x6e, 0x45, 0x0a, 0x34, 0x48, 0x36, 0x46, 0x61, 0x4a, + 0x55, 0x42, 0x6a, 0x64, 0x76, 0x4b, 0x6c, 0x32, 0x51, 0x7a, 0x46, 0x35, + 0x63, 0x30, 0x6a, 0x42, 0x71, 0x67, 0x78, 0x4d, 0x52, 0x76, 0x57, 0x50, + 0x35, 0x59, 0x66, 0x4e, 0x75, 0x38, 0x2b, 0x64, 0x6d, 0x61, 0x51, 0x4f, + 0x52, 0x50, 0x6b, 0x70, 0x7a, 0x53, 0x70, 0x74, 0x4f, 0x50, 0x6d, 0x5a, + 0x4d, 0x39, 0x56, 0x4b, 0x56, 0x2b, 0x74, 0x4a, 0x56, 0x53, 0x0a, 0x31, + 0x78, 0x6e, 0x4f, 0x49, 0x36, 0x44, 0x74, 0x72, 0x6e, 0x4e, 0x5a, 0x52, + 0x6f, 0x6a, 0x65, 0x67, 0x52, 0x2f, 0x45, 0x36, 0x4b, 0x68, 0x4e, 0x79, + 0x69, 0x50, 0x54, 0x59, 0x79, 0x39, 0x37, 0x55, 0x67, 0x59, 0x7a, 0x64, + 0x4b, 0x53, 0x2b, 0x53, 0x53, 0x45, 0x43, 0x67, 0x59, 0x45, 0x41, 0x2b, + 0x77, 0x67, 0x53, 0x49, 0x71, 0x72, 0x66, 0x6b, 0x65, 0x71, 0x71, 0x6f, + 0x74, 0x4a, 0x78, 0x0a, 0x63, 0x47, 0x78, 0x46, 0x34, 0x78, 0x39, 0x76, + 0x2f, 0x6c, 0x64, 0x4b, 0x72, 0x35, 0x68, 0x6c, 0x68, 0x4a, 0x4e, 0x6f, + 0x4b, 0x58, 0x4c, 0x6b, 0x65, 0x70, 0x6b, 0x63, 0x72, 0x76, 0x68, 0x68, + 0x78, 0x66, 0x48, 0x4b, 0x67, 0x6a, 0x57, 0x7a, 0x31, 0x6e, 0x5a, 0x59, + 0x2f, 0x2b, 0x52, 0x70, 0x67, 0x34, 0x32, 0x47, 0x46, 0x4d, 0x76, 0x78, + 0x57, 0x52, 0x72, 0x47, 0x54, 0x4d, 0x49, 0x4a, 0x0a, 0x64, 0x64, 0x69, + 0x4f, 0x72, 0x32, 0x34, 0x70, 0x30, 0x48, 0x43, 0x6b, 0x75, 0x73, 0x57, + 0x52, 0x4d, 0x4b, 0x51, 0x4c, 0x37, 0x58, 0x78, 0x76, 0x75, 0x48, 0x44, + 0x71, 0x30, 0x72, 0x6f, 0x38, 0x53, 0x47, 0x71, 0x58, 0x7a, 0x71, 0x57, + 0x47, 0x75, 0x48, 0x33, 0x31, 0x52, 0x2b, 0x59, 0x4e, 0x50, 0x38, 0x64, + 0x79, 0x32, 0x70, 0x71, 0x64, 0x33, 0x4f, 0x6c, 0x77, 0x7a, 0x54, 0x67, + 0x67, 0x0a, 0x38, 0x76, 0x30, 0x77, 0x77, 0x7a, 0x78, 0x38, 0x41, 0x75, + 0x79, 0x50, 0x35, 0x59, 0x73, 0x34, 0x4d, 0x32, 0x30, 0x45, 0x77, 0x76, + 0x37, 0x58, 0x75, 0x79, 0x30, 0x43, 0x67, 0x59, 0x45, 0x41, 0x39, 0x44, + 0x53, 0x47, 0x4d, 0x55, 0x38, 0x6a, 0x6d, 0x6a, 0x78, 0x4a, 0x2f, 0x75, + 0x50, 0x44, 0x43, 0x58, 0x57, 0x4f, 0x45, 0x41, 0x71, 0x74, 0x45, 0x37, + 0x38, 0x77, 0x54, 0x74, 0x49, 0x77, 0x0a, 0x75, 0x4d, 0x42, 0x76, 0x2b, + 0x67, 0x65, 0x30, 0x69, 0x6e, 0x63, 0x33, 0x37, 0x78, 0x66, 0x2b, 0x66, + 0x4e, 0x36, 0x44, 0x2f, 0x7a, 0x69, 0x54, 0x72, 0x4a, 0x76, 0x67, 0x77, + 0x2f, 0x58, 0x79, 0x54, 0x31, 0x35, 0x70, 0x6d, 0x51, 0x64, 0x4f, 0x6c, + 0x58, 0x78, 0x33, 0x53, 0x67, 0x31, 0x68, 0x39, 0x58, 0x42, 0x5a, 0x65, + 0x49, 0x6c, 0x61, 0x65, 0x43, 0x64, 0x46, 0x57, 0x72, 0x46, 0x42, 0x0a, + 0x6f, 0x59, 0x72, 0x56, 0x73, 0x69, 0x75, 0x6f, 0x58, 0x52, 0x73, 0x77, + 0x66, 0x6b, 0x46, 0x77, 0x41, 0x30, 0x79, 0x4f, 0x6b, 0x43, 0x73, 0x48, + 0x79, 0x47, 0x69, 0x49, 0x34, 0x54, 0x45, 0x30, 0x57, 0x31, 0x72, 0x47, + 0x62, 0x71, 0x50, 0x31, 0x35, 0x38, 0x49, 0x6a, 0x77, 0x58, 0x50, 0x63, + 0x7a, 0x42, 0x73, 0x77, 0x57, 0x49, 0x37, 0x69, 0x2f, 0x44, 0x36, 0x4c, + 0x70, 0x49, 0x4e, 0x4c, 0x0a, 0x42, 0x44, 0x37, 0x59, 0x59, 0x70, 0x66, + 0x48, 0x6d, 0x65, 0x4d, 0x43, 0x67, 0x59, 0x42, 0x30, 0x38, 0x41, 0x69, + 0x4b, 0x72, 0x37, 0x43, 0x66, 0x35, 0x34, 0x48, 0x2f, 0x67, 0x53, 0x71, + 0x6f, 0x35, 0x54, 0x63, 0x56, 0x47, 0x7a, 0x4c, 0x76, 0x64, 0x7a, 0x68, + 0x71, 0x58, 0x67, 0x4b, 0x45, 0x5a, 0x4b, 0x70, 0x30, 0x44, 0x48, 0x70, + 0x55, 0x68, 0x66, 0x69, 0x76, 0x70, 0x54, 0x4c, 0x65, 0x0a, 0x6f, 0x38, + 0x6a, 0x6a, 0x4b, 0x53, 0x4d, 0x53, 0x4e, 0x32, 0x55, 0x30, 0x4a, 0x76, + 0x48, 0x6a, 0x2f, 0x30, 0x78, 0x44, 0x61, 0x64, 0x47, 0x4f, 0x34, 0x59, + 0x4d, 0x59, 0x68, 0x4a, 0x63, 0x6c, 0x6c, 0x33, 0x43, 0x34, 0x56, 0x67, + 0x67, 0x53, 0x65, 0x6a, 0x61, 0x79, 0x62, 0x70, 0x41, 0x34, 0x36, 0x57, + 0x4a, 0x4a, 0x43, 0x64, 0x74, 0x39, 0x50, 0x74, 0x53, 0x55, 0x76, 0x33, + 0x36, 0x50, 0x0a, 0x65, 0x57, 0x41, 0x6f, 0x4f, 0x6b, 0x46, 0x73, 0x74, + 0x66, 0x68, 0x4a, 0x75, 0x75, 0x66, 0x58, 0x47, 0x78, 0x44, 0x73, 0x74, + 0x6e, 0x50, 0x74, 0x55, 0x61, 0x31, 0x6a, 0x57, 0x38, 0x38, 0x31, 0x67, + 0x69, 0x35, 0x78, 0x39, 0x44, 0x34, 0x4d, 0x6d, 0x71, 0x68, 0x5a, 0x6c, + 0x4b, 0x58, 0x6b, 0x68, 0x74, 0x64, 0x65, 0x41, 0x70, 0x72, 0x36, 0x4c, + 0x51, 0x4b, 0x42, 0x67, 0x51, 0x44, 0x64, 0x0a, 0x49, 0x74, 0x73, 0x4a, + 0x74, 0x39, 0x4a, 0x54, 0x6a, 0x70, 0x69, 0x72, 0x47, 0x66, 0x43, 0x35, + 0x6c, 0x68, 0x77, 0x49, 0x35, 0x73, 0x49, 0x49, 0x43, 0x61, 0x39, 0x6a, + 0x45, 0x4f, 0x39, 0x52, 0x76, 0x65, 0x45, 0x6f, 0x6c, 0x75, 0x57, 0x6b, + 0x4a, 0x59, 0x55, 0x66, 0x47, 0x36, 0x6b, 0x31, 0x78, 0x67, 0x48, 0x64, + 0x6b, 0x59, 0x77, 0x59, 0x57, 0x43, 0x64, 0x58, 0x44, 0x46, 0x5a, 0x61, + 0x0a, 0x44, 0x50, 0x4b, 0x75, 0x77, 0x6e, 0x45, 0x6b, 0x36, 0x4d, 0x72, + 0x55, 0x34, 0x66, 0x31, 0x38, 0x31, 0x6a, 0x6f, 0x4f, 0x37, 0x73, 0x4a, + 0x66, 0x33, 0x35, 0x2f, 0x73, 0x47, 0x6d, 0x75, 0x47, 0x4c, 0x30, 0x53, + 0x48, 0x7a, 0x51, 0x54, 0x76, 0x47, 0x76, 0x6e, 0x30, 0x75, 0x71, 0x6b, + 0x47, 0x4d, 0x38, 0x4d, 0x39, 0x52, 0x64, 0x6f, 0x4d, 0x58, 0x71, 0x7a, + 0x6b, 0x7a, 0x7a, 0x76, 0x4d, 0x0a, 0x4a, 0x67, 0x31, 0x65, 0x6a, 0x31, + 0x62, 0x55, 0x67, 0x58, 0x63, 0x44, 0x62, 0x54, 0x6e, 0x61, 0x45, 0x68, + 0x7a, 0x62, 0x64, 0x4c, 0x69, 0x54, 0x46, 0x73, 0x67, 0x35, 0x4e, 0x7a, + 0x4d, 0x74, 0x4b, 0x77, 0x4f, 0x6a, 0x64, 0x44, 0x49, 0x70, 0x5a, 0x51, + 0x4b, 0x42, 0x67, 0x45, 0x49, 0x48, 0x65, 0x4a, 0x49, 0x71, 0x69, 0x47, + 0x6a, 0x59, 0x67, 0x66, 0x37, 0x6d, 0x55, 0x6c, 0x58, 0x32, 0x0a, 0x76, + 0x4e, 0x57, 0x67, 0x46, 0x4e, 0x6c, 0x7a, 0x41, 0x70, 0x6b, 0x46, 0x53, + 0x43, 0x51, 0x38, 0x54, 0x6b, 0x7a, 0x6b, 0x44, 0x4f, 0x6a, 0x74, 0x43, + 0x64, 0x53, 0x48, 0x66, 0x64, 0x52, 0x44, 0x4a, 0x36, 0x2b, 0x71, 0x38, + 0x63, 0x53, 0x32, 0x54, 0x53, 0x51, 0x37, 0x51, 0x50, 0x6f, 0x41, 0x6c, + 0x49, 0x31, 0x77, 0x6f, 0x53, 0x30, 0x47, 0x34, 0x38, 0x54, 0x4e, 0x62, + 0x56, 0x53, 0x6f, 0x0a, 0x77, 0x44, 0x30, 0x6a, 0x4e, 0x56, 0x52, 0x54, + 0x64, 0x70, 0x41, 0x36, 0x52, 0x35, 0x46, 0x50, 0x73, 0x67, 0x30, 0x39, + 0x6f, 0x68, 0x42, 0x2f, 0x63, 0x61, 0x53, 0x6e, 0x30, 0x7a, 0x6c, 0x47, + 0x56, 0x68, 0x61, 0x32, 0x47, 0x53, 0x30, 0x38, 0x63, 0x65, 0x59, 0x72, + 0x6e, 0x37, 0x6e, 0x6e, 0x34, 0x50, 0x53, 0x5a, 0x2f, 0x55, 0x49, 0x59, + 0x54, 0x6d, 0x33, 0x70, 0x6a, 0x55, 0x6c, 0x56, 0x0a, 0x48, 0x35, 0x74, + 0x76, 0x48, 0x76, 0x30, 0x67, 0x47, 0x32, 0x43, 0x35, 0x76, 0x79, 0x33, + 0x74, 0x49, 0x59, 0x51, 0x74, 0x53, 0x51, 0x43, 0x6b, 0x0a, 0x2d, 0x2d, + 0x2d, 0x2d, 0x2d, 0x45, 0x4e, 0x44, 0x20, 0x50, 0x52, 0x49, 0x56, 0x41, + 0x54, 0x45, 0x20, 0x4b, 0x45, 0x59, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a}; extern const char test_signed_client_cert[] = { 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x42, 0x45, 0x47, 0x49, 0x4e, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2d, 0x2d, - 0x2d, 0x2d, 0x2d, 0x0a, 0x4d, 0x49, 0x49, 0x43, 0x48, 0x7a, 0x43, 0x43, - 0x41, 0x59, 0x67, 0x43, 0x41, 0x51, 0x45, 0x77, 0x44, 0x51, 0x59, 0x4a, - 0x4b, 0x6f, 0x5a, 0x49, 0x68, 0x76, 0x63, 0x4e, 0x41, 0x51, 0x45, 0x46, - 0x42, 0x51, 0x41, 0x77, 0x56, 0x6a, 0x45, 0x4c, 0x4d, 0x41, 0x6b, 0x47, - 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4d, 0x43, 0x51, 0x56, 0x55, 0x78, - 0x45, 0x7a, 0x41, 0x52, 0x42, 0x67, 0x4e, 0x56, 0x0a, 0x42, 0x41, 0x67, - 0x4d, 0x43, 0x6c, 0x4e, 0x76, 0x62, 0x57, 0x55, 0x74, 0x55, 0x33, 0x52, - 0x68, 0x64, 0x47, 0x55, 0x78, 0x49, 0x54, 0x41, 0x66, 0x42, 0x67, 0x4e, - 0x56, 0x42, 0x41, 0x6f, 0x4d, 0x47, 0x45, 0x6c, 0x75, 0x64, 0x47, 0x56, - 0x79, 0x62, 0x6d, 0x56, 0x30, 0x49, 0x46, 0x64, 0x70, 0x5a, 0x47, 0x64, - 0x70, 0x64, 0x48, 0x4d, 0x67, 0x55, 0x48, 0x52, 0x35, 0x49, 0x45, 0x78, - 0x30, 0x0a, 0x5a, 0x44, 0x45, 0x50, 0x4d, 0x41, 0x30, 0x47, 0x41, 0x31, - 0x55, 0x45, 0x41, 0x77, 0x77, 0x47, 0x64, 0x47, 0x56, 0x7a, 0x64, 0x47, - 0x4e, 0x68, 0x4d, 0x42, 0x34, 0x58, 0x44, 0x54, 0x45, 0x30, 0x4d, 0x44, - 0x63, 0x78, 0x4e, 0x7a, 0x49, 0x7a, 0x4e, 0x54, 0x59, 0x77, 0x4d, 0x6c, - 0x6f, 0x58, 0x44, 0x54, 0x49, 0x30, 0x4d, 0x44, 0x63, 0x78, 0x4e, 0x44, - 0x49, 0x7a, 0x4e, 0x54, 0x59, 0x77, 0x0a, 0x4d, 0x6c, 0x6f, 0x77, 0x57, - 0x6a, 0x45, 0x4c, 0x4d, 0x41, 0x6b, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, - 0x68, 0x4d, 0x43, 0x51, 0x56, 0x55, 0x78, 0x45, 0x7a, 0x41, 0x52, 0x42, - 0x67, 0x4e, 0x56, 0x42, 0x41, 0x67, 0x4d, 0x43, 0x6c, 0x4e, 0x76, 0x62, - 0x57, 0x55, 0x74, 0x55, 0x33, 0x52, 0x68, 0x64, 0x47, 0x55, 0x78, 0x49, - 0x54, 0x41, 0x66, 0x42, 0x67, 0x4e, 0x56, 0x42, 0x41, 0x6f, 0x4d, 0x0a, - 0x47, 0x45, 0x6c, 0x75, 0x64, 0x47, 0x56, 0x79, 0x62, 0x6d, 0x56, 0x30, - 0x49, 0x46, 0x64, 0x70, 0x5a, 0x47, 0x64, 0x70, 0x64, 0x48, 0x4d, 0x67, - 0x55, 0x48, 0x52, 0x35, 0x49, 0x45, 0x78, 0x30, 0x5a, 0x44, 0x45, 0x54, - 0x4d, 0x42, 0x45, 0x47, 0x41, 0x31, 0x55, 0x45, 0x41, 0x77, 0x77, 0x4b, - 0x64, 0x47, 0x56, 0x7a, 0x64, 0x47, 0x4e, 0x73, 0x61, 0x57, 0x56, 0x75, - 0x64, 0x44, 0x43, 0x42, 0x0a, 0x6e, 0x7a, 0x41, 0x4e, 0x42, 0x67, 0x6b, - 0x71, 0x68, 0x6b, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x45, - 0x46, 0x41, 0x41, 0x4f, 0x42, 0x6a, 0x51, 0x41, 0x77, 0x67, 0x59, 0x6b, - 0x43, 0x67, 0x59, 0x45, 0x41, 0x37, 0x46, 0x52, 0x48, 0x32, 0x36, 0x47, - 0x2b, 0x46, 0x74, 0x35, 0x56, 0x51, 0x67, 0x79, 0x7a, 0x6c, 0x5a, 0x73, - 0x66, 0x53, 0x6e, 0x48, 0x53, 0x5a, 0x36, 0x47, 0x58, 0x0a, 0x62, 0x37, - 0x71, 0x78, 0x6d, 0x6b, 0x32, 0x50, 0x4f, 0x38, 0x54, 0x59, 0x71, 0x4b, - 0x5a, 0x6d, 0x6b, 0x66, 0x4d, 0x77, 0x6b, 0x65, 0x36, 0x52, 0x55, 0x66, - 0x51, 0x56, 0x2b, 0x53, 0x2b, 0x47, 0x7a, 0x52, 0x76, 0x7a, 0x35, 0x4c, - 0x6c, 0x53, 0x33, 0x31, 0x55, 0x31, 0x51, 0x43, 0x70, 0x33, 0x63, 0x67, - 0x77, 0x6b, 0x49, 0x49, 0x41, 0x51, 0x61, 0x31, 0x45, 0x32, 0x68, 0x43, - 0x45, 0x7a, 0x0a, 0x57, 0x33, 0x31, 0x69, 0x76, 0x62, 0x4d, 0x42, 0x79, - 0x52, 0x4b, 0x39, 0x74, 0x46, 0x70, 0x79, 0x6e, 0x34, 0x55, 0x76, 0x38, - 0x4b, 0x50, 0x31, 0x34, 0x4f, 0x62, 0x4b, 0x6a, 0x54, 0x51, 0x71, 0x78, - 0x55, 0x5a, 0x70, 0x35, 0x35, 0x38, 0x44, 0x67, 0x4f, 0x48, 0x67, 0x35, - 0x62, 0x35, 0x6d, 0x47, 0x52, 0x4d, 0x30, 0x70, 0x79, 0x56, 0x31, 0x65, - 0x71, 0x52, 0x4b, 0x36, 0x50, 0x57, 0x77, 0x0a, 0x52, 0x2f, 0x62, 0x6a, - 0x67, 0x6c, 0x6c, 0x69, 0x36, 0x70, 0x6d, 0x6e, 0x72, 0x2b, 0x30, 0x43, - 0x41, 0x77, 0x45, 0x41, 0x41, 0x54, 0x41, 0x4e, 0x42, 0x67, 0x6b, 0x71, - 0x68, 0x6b, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x55, 0x46, - 0x41, 0x41, 0x4f, 0x42, 0x67, 0x51, 0x41, 0x53, 0x74, 0x53, 0x6d, 0x35, - 0x50, 0x4d, 0x37, 0x75, 0x62, 0x52, 0x4f, 0x69, 0x4b, 0x4b, 0x36, 0x2f, - 0x0a, 0x54, 0x32, 0x46, 0x6b, 0x4b, 0x6c, 0x68, 0x69, 0x54, 0x4f, 0x78, - 0x2b, 0x52, 0x79, 0x65, 0x6e, 0x6d, 0x33, 0x45, 0x69, 0x6f, 0x35, 0x39, - 0x65, 0x6d, 0x71, 0x2b, 0x6a, 0x58, 0x6c, 0x2b, 0x31, 0x6e, 0x68, 0x50, - 0x79, 0x53, 0x58, 0x35, 0x47, 0x32, 0x50, 0x51, 0x7a, 0x53, 0x52, 0x35, - 0x76, 0x64, 0x31, 0x64, 0x49, 0x68, 0x77, 0x67, 0x5a, 0x53, 0x52, 0x34, - 0x47, 0x79, 0x74, 0x74, 0x6b, 0x0a, 0x74, 0x52, 0x5a, 0x35, 0x37, 0x6b, - 0x2f, 0x4e, 0x49, 0x31, 0x62, 0x72, 0x55, 0x57, 0x38, 0x6a, 0x6f, 0x69, - 0x45, 0x4f, 0x4d, 0x4a, 0x41, 0x2f, 0x4d, 0x72, 0x37, 0x48, 0x37, 0x61, - 0x73, 0x78, 0x37, 0x77, 0x49, 0x52, 0x59, 0x44, 0x45, 0x39, 0x31, 0x46, - 0x73, 0x38, 0x47, 0x6b, 0x4b, 0x57, 0x64, 0x35, 0x4c, 0x68, 0x6f, 0x50, - 0x41, 0x51, 0x6a, 0x2b, 0x71, 0x64, 0x47, 0x33, 0x35, 0x43, 0x0a, 0x4f, - 0x4f, 0x2b, 0x73, 0x76, 0x64, 0x6b, 0x6d, 0x71, 0x48, 0x30, 0x4b, 0x5a, - 0x6f, 0x33, 0x32, 0x30, 0x5a, 0x55, 0x71, 0x64, 0x6c, 0x32, 0x6f, 0x6f, - 0x51, 0x3d, 0x3d, 0x0a, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x45, 0x4e, 0x44, - 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, - 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, 0x00}; + 0x2d, 0x2d, 0x2d, 0x0a, 0x4d, 0x49, 0x49, 0x44, 0x4e, 0x7a, 0x43, 0x43, + 0x41, 0x68, 0x38, 0x43, 0x46, 0x47, 0x79, 0x58, 0x30, 0x30, 0x52, 0x43, + 0x65, 0x70, 0x4f, 0x76, 0x2f, 0x71, 0x43, 0x4a, 0x31, 0x6f, 0x56, 0x64, + 0x54, 0x74, 0x59, 0x39, 0x32, 0x55, 0x38, 0x33, 0x4d, 0x41, 0x30, 0x47, + 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, + 0x43, 0x77, 0x55, 0x41, 0x4d, 0x46, 0x59, 0x78, 0x0a, 0x43, 0x7a, 0x41, + 0x4a, 0x42, 0x67, 0x4e, 0x56, 0x42, 0x41, 0x59, 0x54, 0x41, 0x6b, 0x46, + 0x56, 0x4d, 0x52, 0x4d, 0x77, 0x45, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, + 0x49, 0x44, 0x41, 0x70, 0x54, 0x62, 0x32, 0x31, 0x6c, 0x4c, 0x56, 0x4e, + 0x30, 0x59, 0x58, 0x52, 0x6c, 0x4d, 0x53, 0x45, 0x77, 0x48, 0x77, 0x59, + 0x44, 0x56, 0x51, 0x51, 0x4b, 0x44, 0x42, 0x68, 0x4a, 0x62, 0x6e, 0x52, + 0x6c, 0x0a, 0x63, 0x6d, 0x35, 0x6c, 0x64, 0x43, 0x42, 0x58, 0x61, 0x57, + 0x52, 0x6e, 0x61, 0x58, 0x52, 0x7a, 0x49, 0x46, 0x42, 0x30, 0x65, 0x53, + 0x42, 0x4d, 0x64, 0x47, 0x51, 0x78, 0x44, 0x7a, 0x41, 0x4e, 0x42, 0x67, + 0x4e, 0x56, 0x42, 0x41, 0x4d, 0x4d, 0x42, 0x6e, 0x52, 0x6c, 0x63, 0x33, + 0x52, 0x6a, 0x59, 0x54, 0x41, 0x65, 0x46, 0x77, 0x30, 0x79, 0x4d, 0x44, + 0x41, 0x7a, 0x4d, 0x54, 0x67, 0x77, 0x0a, 0x4d, 0x54, 0x41, 0x32, 0x4d, + 0x54, 0x42, 0x61, 0x46, 0x77, 0x30, 0x7a, 0x4d, 0x44, 0x41, 0x7a, 0x4d, + 0x54, 0x59, 0x77, 0x4d, 0x54, 0x41, 0x32, 0x4d, 0x54, 0x42, 0x61, 0x4d, + 0x46, 0x6f, 0x78, 0x43, 0x7a, 0x41, 0x4a, 0x42, 0x67, 0x4e, 0x56, 0x42, + 0x41, 0x59, 0x54, 0x41, 0x6b, 0x46, 0x56, 0x4d, 0x52, 0x4d, 0x77, 0x45, + 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x49, 0x44, 0x41, 0x70, 0x54, 0x0a, + 0x62, 0x32, 0x31, 0x6c, 0x4c, 0x56, 0x4e, 0x30, 0x59, 0x58, 0x52, 0x6c, + 0x4d, 0x53, 0x45, 0x77, 0x48, 0x77, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4b, + 0x44, 0x42, 0x68, 0x4a, 0x62, 0x6e, 0x52, 0x6c, 0x63, 0x6d, 0x35, 0x6c, + 0x64, 0x43, 0x42, 0x58, 0x61, 0x57, 0x52, 0x6e, 0x61, 0x58, 0x52, 0x7a, + 0x49, 0x46, 0x42, 0x30, 0x65, 0x53, 0x42, 0x4d, 0x64, 0x47, 0x51, 0x78, + 0x45, 0x7a, 0x41, 0x52, 0x0a, 0x42, 0x67, 0x4e, 0x56, 0x42, 0x41, 0x4d, + 0x4d, 0x43, 0x6e, 0x52, 0x6c, 0x63, 0x33, 0x52, 0x6a, 0x62, 0x47, 0x6c, + 0x6c, 0x62, 0x6e, 0x51, 0x77, 0x67, 0x67, 0x45, 0x69, 0x4d, 0x41, 0x30, + 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, + 0x42, 0x41, 0x51, 0x55, 0x41, 0x41, 0x34, 0x49, 0x42, 0x44, 0x77, 0x41, + 0x77, 0x67, 0x67, 0x45, 0x4b, 0x41, 0x6f, 0x49, 0x42, 0x0a, 0x41, 0x51, + 0x43, 0x79, 0x71, 0x59, 0x52, 0x70, 0x2b, 0x44, 0x58, 0x56, 0x70, 0x37, + 0x32, 0x4e, 0x46, 0x62, 0x51, 0x48, 0x38, 0x68, 0x64, 0x68, 0x54, 0x5a, + 0x4c, 0x79, 0x63, 0x5a, 0x58, 0x4f, 0x6c, 0x4a, 0x68, 0x6d, 0x4d, 0x73, + 0x72, 0x4a, 0x6d, 0x72, 0x6a, 0x6e, 0x32, 0x70, 0x37, 0x70, 0x49, 0x2f, + 0x38, 0x6d, 0x54, 0x5a, 0x2f, 0x30, 0x46, 0x43, 0x2b, 0x53, 0x47, 0x57, + 0x42, 0x47, 0x0a, 0x5a, 0x56, 0x2b, 0x45, 0x4c, 0x69, 0x48, 0x72, 0x6d, + 0x43, 0x58, 0x35, 0x7a, 0x66, 0x61, 0x49, 0x4c, 0x72, 0x39, 0x49, 0x75, + 0x77, 0x37, 0x47, 0x68, 0x72, 0x33, 0x56, 0x7a, 0x6f, 0x65, 0x66, 0x69, + 0x38, 0x72, 0x36, 0x32, 0x72, 0x4c, 0x75, 0x70, 0x56, 0x50, 0x4e, 0x69, + 0x2f, 0x71, 0x64, 0x71, 0x79, 0x6a, 0x57, 0x6b, 0x32, 0x64, 0x45, 0x43, + 0x48, 0x43, 0x39, 0x5a, 0x33, 0x2b, 0x41, 0x0a, 0x67, 0x33, 0x4b, 0x7a, + 0x4b, 0x54, 0x79, 0x65, 0x72, 0x58, 0x57, 0x6a, 0x4b, 0x63, 0x76, 0x79, + 0x4b, 0x56, 0x6d, 0x4d, 0x30, 0x5a, 0x78, 0x45, 0x30, 0x52, 0x58, 0x68, + 0x44, 0x57, 0x2f, 0x52, 0x6f, 0x51, 0x62, 0x71, 0x5a, 0x73, 0x55, 0x32, + 0x47, 0x4b, 0x67, 0x31, 0x42, 0x32, 0x72, 0x68, 0x55, 0x55, 0x38, 0x4b, + 0x4e, 0x30, 0x67, 0x56, 0x6d, 0x4b, 0x6e, 0x30, 0x72, 0x4a, 0x48, 0x4f, + 0x0a, 0x78, 0x7a, 0x52, 0x56, 0x53, 0x59, 0x65, 0x59, 0x4c, 0x59, 0x70, + 0x35, 0x59, 0x6e, 0x37, 0x4b, 0x72, 0x74, 0x50, 0x4a, 0x63, 0x4b, 0x79, + 0x6f, 0x39, 0x61, 0x56, 0x75, 0x45, 0x72, 0x37, 0x64, 0x47, 0x41, 0x4e, + 0x7a, 0x70, 0x79, 0x46, 0x36, 0x6c, 0x67, 0x2f, 0x6e, 0x59, 0x42, 0x57, + 0x63, 0x2b, 0x39, 0x53, 0x47, 0x77, 0x6b, 0x6f, 0x4c, 0x64, 0x46, 0x76, + 0x4b, 0x76, 0x41, 0x42, 0x59, 0x0a, 0x4a, 0x4d, 0x79, 0x72, 0x62, 0x4e, + 0x68, 0x48, 0x55, 0x51, 0x66, 0x76, 0x30, 0x66, 0x7a, 0x61, 0x5a, 0x30, + 0x50, 0x38, 0x36, 0x64, 0x66, 0x54, 0x45, 0x4e, 0x72, 0x44, 0x78, 0x7a, + 0x41, 0x4c, 0x72, 0x7a, 0x47, 0x6e, 0x71, 0x63, 0x78, 0x33, 0x4b, 0x54, + 0x72, 0x77, 0x4a, 0x6a, 0x6b, 0x5a, 0x2f, 0x61, 0x53, 0x72, 0x31, 0x74, + 0x79, 0x44, 0x30, 0x2f, 0x74, 0x58, 0x76, 0x75, 0x6b, 0x52, 0x0a, 0x46, + 0x69, 0x50, 0x78, 0x57, 0x42, 0x4a, 0x68, 0x6a, 0x48, 0x51, 0x37, 0x30, + 0x47, 0x71, 0x54, 0x46, 0x51, 0x59, 0x31, 0x39, 0x52, 0x62, 0x68, 0x41, + 0x67, 0x4d, 0x42, 0x41, 0x41, 0x45, 0x77, 0x44, 0x51, 0x59, 0x4a, 0x4b, + 0x6f, 0x5a, 0x49, 0x68, 0x76, 0x63, 0x4e, 0x41, 0x51, 0x45, 0x4c, 0x42, + 0x51, 0x41, 0x44, 0x67, 0x67, 0x45, 0x42, 0x41, 0x46, 0x58, 0x43, 0x65, + 0x77, 0x4b, 0x38, 0x0a, 0x63, 0x57, 0x54, 0x2b, 0x7a, 0x57, 0x78, 0x58, + 0x79, 0x47, 0x46, 0x6e, 0x6f, 0x75, 0x46, 0x53, 0x42, 0x7a, 0x54, 0x69, + 0x30, 0x42, 0x4d, 0x42, 0x4a, 0x52, 0x72, 0x68, 0x73, 0x69, 0x4e, 0x6f, + 0x69, 0x51, 0x78, 0x6b, 0x71, 0x69, 0x74, 0x79, 0x4a, 0x48, 0x57, 0x46, + 0x45, 0x78, 0x69, 0x51, 0x5a, 0x69, 0x65, 0x2b, 0x37, 0x43, 0x41, 0x2b, + 0x45, 0x61, 0x62, 0x58, 0x43, 0x51, 0x55, 0x42, 0x0a, 0x2b, 0x4a, 0x77, + 0x4d, 0x53, 0x57, 0x4d, 0x32, 0x39, 0x6a, 0x33, 0x6d, 0x53, 0x77, 0x31, + 0x30, 0x44, 0x54, 0x66, 0x6d, 0x43, 0x33, 0x72, 0x68, 0x68, 0x65, 0x51, + 0x71, 0x47, 0x78, 0x79, 0x33, 0x30, 0x34, 0x42, 0x5a, 0x79, 0x55, 0x70, + 0x64, 0x70, 0x76, 0x49, 0x32, 0x64, 0x74, 0x33, 0x70, 0x2f, 0x6d, 0x63, + 0x73, 0x45, 0x37, 0x4f, 0x2b, 0x70, 0x34, 0x73, 0x51, 0x72, 0x53, 0x65, + 0x70, 0x0a, 0x67, 0x69, 0x6a, 0x69, 0x44, 0x73, 0x73, 0x4b, 0x41, 0x66, + 0x78, 0x54, 0x41, 0x6d, 0x55, 0x4d, 0x39, 0x33, 0x4e, 0x36, 0x2b, 0x51, + 0x38, 0x79, 0x4a, 0x4b, 0x35, 0x69, 0x6d, 0x6d, 0x78, 0x6c, 0x62, 0x65, + 0x59, 0x66, 0x69, 0x6a, 0x6f, 0x42, 0x76, 0x6d, 0x6b, 0x7a, 0x79, 0x42, + 0x2f, 0x42, 0x2b, 0x71, 0x4e, 0x52, 0x50, 0x73, 0x78, 0x30, 0x6e, 0x37, + 0x61, 0x46, 0x47, 0x6e, 0x66, 0x76, 0x0a, 0x6f, 0x57, 0x66, 0x6b, 0x57, + 0x32, 0x39, 0x36, 0x69, 0x50, 0x68, 0x57, 0x4c, 0x69, 0x77, 0x6b, 0x6e, + 0x70, 0x43, 0x33, 0x78, 0x42, 0x36, 0x6f, 0x4b, 0x33, 0x76, 0x52, 0x62, + 0x4b, 0x34, 0x5a, 0x6a, 0x31, 0x4f, 0x61, 0x47, 0x62, 0x30, 0x67, 0x72, + 0x4b, 0x37, 0x56, 0x4e, 0x38, 0x45, 0x79, 0x68, 0x42, 0x69, 0x78, 0x32, + 0x78, 0x56, 0x46, 0x36, 0x31, 0x69, 0x34, 0x64, 0x7a, 0x43, 0x4b, 0x0a, + 0x6b, 0x4d, 0x49, 0x70, 0x6c, 0x37, 0x43, 0x55, 0x70, 0x77, 0x31, 0x4d, + 0x62, 0x32, 0x7a, 0x38, 0x71, 0x33, 0x46, 0x32, 0x62, 0x48, 0x42, 0x53, + 0x37, 0x69, 0x46, 0x37, 0x67, 0x31, 0x43, 0x63, 0x6e, 0x35, 0x56, 0x47, + 0x63, 0x4f, 0x2b, 0x61, 0x4a, 0x2b, 0x36, 0x50, 0x57, 0x79, 0x64, 0x61, + 0x65, 0x71, 0x4a, 0x36, 0x56, 0x45, 0x42, 0x46, 0x30, 0x4e, 0x77, 0x76, + 0x39, 0x77, 0x6f, 0x65, 0x0a, 0x6d, 0x4c, 0x35, 0x41, 0x6c, 0x75, 0x4e, + 0x52, 0x4c, 0x61, 0x71, 0x6a, 0x5a, 0x76, 0x45, 0x3d, 0x0a, 0x2d, 0x2d, + 0x2d, 0x2d, 0x2d, 0x45, 0x4e, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, + 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a}; extern const char test_signed_client_key[] = { 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x42, 0x45, 0x47, 0x49, 0x4e, 0x20, 0x50, 0x52, 0x49, 0x56, 0x41, 0x54, 0x45, 0x20, 0x4b, 0x45, 0x59, 0x2d, 0x2d, - 0x2d, 0x2d, 0x2d, 0x0a, 0x4d, 0x49, 0x49, 0x43, 0x65, 0x51, 0x49, 0x42, + 0x2d, 0x2d, 0x2d, 0x0a, 0x4d, 0x49, 0x49, 0x45, 0x76, 0x67, 0x49, 0x42, 0x41, 0x44, 0x41, 0x4e, 0x42, 0x67, 0x6b, 0x71, 0x68, 0x6b, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x45, 0x46, 0x41, 0x41, 0x53, 0x43, - 0x41, 0x6d, 0x4d, 0x77, 0x67, 0x67, 0x4a, 0x66, 0x41, 0x67, 0x45, 0x41, - 0x41, 0x6f, 0x47, 0x42, 0x41, 0x4f, 0x78, 0x55, 0x52, 0x39, 0x75, 0x68, - 0x76, 0x68, 0x62, 0x65, 0x56, 0x55, 0x49, 0x4d, 0x0a, 0x73, 0x35, 0x57, - 0x62, 0x48, 0x30, 0x70, 0x78, 0x30, 0x6d, 0x65, 0x68, 0x6c, 0x32, 0x2b, - 0x36, 0x73, 0x5a, 0x70, 0x4e, 0x6a, 0x7a, 0x76, 0x45, 0x32, 0x4b, 0x69, - 0x6d, 0x5a, 0x70, 0x48, 0x7a, 0x4d, 0x4a, 0x48, 0x75, 0x6b, 0x56, 0x48, - 0x30, 0x46, 0x66, 0x6b, 0x76, 0x68, 0x73, 0x30, 0x62, 0x38, 0x2b, 0x53, - 0x35, 0x55, 0x74, 0x39, 0x56, 0x4e, 0x55, 0x41, 0x71, 0x64, 0x33, 0x49, - 0x4d, 0x0a, 0x4a, 0x43, 0x43, 0x41, 0x45, 0x47, 0x74, 0x52, 0x4e, 0x6f, - 0x51, 0x68, 0x4d, 0x31, 0x74, 0x39, 0x59, 0x72, 0x32, 0x7a, 0x41, 0x63, - 0x6b, 0x53, 0x76, 0x62, 0x52, 0x61, 0x63, 0x70, 0x2b, 0x46, 0x4c, 0x2f, - 0x43, 0x6a, 0x39, 0x65, 0x44, 0x6d, 0x79, 0x6f, 0x30, 0x30, 0x4b, 0x73, - 0x56, 0x47, 0x61, 0x65, 0x65, 0x66, 0x41, 0x34, 0x44, 0x68, 0x34, 0x4f, - 0x57, 0x2b, 0x5a, 0x68, 0x6b, 0x54, 0x0a, 0x4e, 0x4b, 0x63, 0x6c, 0x64, - 0x58, 0x71, 0x6b, 0x53, 0x75, 0x6a, 0x31, 0x73, 0x45, 0x66, 0x32, 0x34, - 0x34, 0x4a, 0x5a, 0x59, 0x75, 0x71, 0x5a, 0x70, 0x36, 0x2f, 0x74, 0x41, - 0x67, 0x4d, 0x42, 0x41, 0x41, 0x45, 0x43, 0x67, 0x59, 0x45, 0x41, 0x69, - 0x32, 0x4e, 0x53, 0x56, 0x71, 0x70, 0x5a, 0x4d, 0x61, 0x66, 0x45, 0x35, - 0x59, 0x59, 0x55, 0x54, 0x63, 0x4d, 0x47, 0x65, 0x36, 0x51, 0x53, 0x0a, - 0x6b, 0x32, 0x6a, 0x74, 0x70, 0x73, 0x71, 0x59, 0x67, 0x67, 0x67, 0x49, - 0x32, 0x52, 0x6e, 0x4c, 0x4a, 0x2f, 0x32, 0x74, 0x4e, 0x5a, 0x77, 0x59, - 0x49, 0x35, 0x70, 0x77, 0x50, 0x38, 0x51, 0x56, 0x53, 0x62, 0x6e, 0x4d, - 0x61, 0x69, 0x46, 0x34, 0x67, 0x6f, 0x6b, 0x44, 0x35, 0x68, 0x47, 0x64, - 0x72, 0x4e, 0x44, 0x66, 0x54, 0x6e, 0x62, 0x32, 0x76, 0x2b, 0x79, 0x49, - 0x77, 0x59, 0x45, 0x48, 0x0a, 0x30, 0x77, 0x38, 0x2b, 0x6f, 0x47, 0x37, - 0x5a, 0x38, 0x31, 0x4b, 0x6f, 0x64, 0x73, 0x69, 0x5a, 0x53, 0x49, 0x44, - 0x4a, 0x66, 0x54, 0x47, 0x73, 0x41, 0x5a, 0x68, 0x56, 0x4e, 0x77, 0x4f, - 0x7a, 0x39, 0x79, 0x30, 0x56, 0x44, 0x38, 0x42, 0x42, 0x5a, 0x5a, 0x31, - 0x2f, 0x32, 0x37, 0x34, 0x5a, 0x68, 0x35, 0x32, 0x41, 0x55, 0x4b, 0x4c, - 0x6a, 0x5a, 0x53, 0x2f, 0x5a, 0x77, 0x49, 0x62, 0x53, 0x0a, 0x57, 0x32, - 0x79, 0x77, 0x79, 0x61, 0x38, 0x35, 0x35, 0x64, 0x50, 0x6e, 0x48, 0x2f, - 0x77, 0x6a, 0x2b, 0x30, 0x45, 0x43, 0x51, 0x51, 0x44, 0x39, 0x58, 0x38, - 0x44, 0x39, 0x32, 0x30, 0x6b, 0x42, 0x79, 0x54, 0x4e, 0x48, 0x68, 0x42, - 0x47, 0x31, 0x38, 0x62, 0x69, 0x41, 0x45, 0x5a, 0x34, 0x70, 0x78, 0x73, - 0x39, 0x66, 0x30, 0x4f, 0x41, 0x47, 0x38, 0x33, 0x33, 0x33, 0x65, 0x56, - 0x63, 0x49, 0x0a, 0x77, 0x32, 0x6c, 0x4a, 0x44, 0x4c, 0x73, 0x59, 0x44, - 0x5a, 0x72, 0x43, 0x42, 0x32, 0x6f, 0x63, 0x67, 0x41, 0x33, 0x6c, 0x55, - 0x64, 0x6f, 0x7a, 0x6c, 0x7a, 0x50, 0x43, 0x37, 0x59, 0x44, 0x59, 0x77, - 0x38, 0x72, 0x65, 0x67, 0x30, 0x74, 0x6b, 0x69, 0x52, 0x59, 0x35, 0x41, - 0x6b, 0x45, 0x41, 0x37, 0x73, 0x64, 0x4e, 0x7a, 0x4f, 0x65, 0x51, 0x73, - 0x51, 0x52, 0x6e, 0x37, 0x2b, 0x2b, 0x35, 0x0a, 0x30, 0x62, 0x50, 0x39, - 0x44, 0x74, 0x54, 0x2f, 0x69, 0x4f, 0x4e, 0x31, 0x67, 0x62, 0x66, 0x78, - 0x52, 0x7a, 0x43, 0x66, 0x43, 0x66, 0x58, 0x64, 0x6f, 0x4f, 0x74, 0x66, - 0x51, 0x57, 0x49, 0x7a, 0x54, 0x65, 0x50, 0x57, 0x74, 0x55, 0x52, 0x74, - 0x39, 0x58, 0x2f, 0x35, 0x44, 0x39, 0x4e, 0x6f, 0x66, 0x49, 0x30, 0x52, - 0x67, 0x35, 0x57, 0x32, 0x6f, 0x47, 0x79, 0x2f, 0x4d, 0x4c, 0x65, 0x35, - 0x0a, 0x2f, 0x73, 0x58, 0x48, 0x56, 0x51, 0x4a, 0x42, 0x41, 0x49, 0x75, - 0x70, 0x35, 0x58, 0x72, 0x4a, 0x44, 0x6b, 0x51, 0x79, 0x77, 0x4e, 0x5a, - 0x79, 0x41, 0x55, 0x55, 0x32, 0x65, 0x63, 0x6e, 0x32, 0x62, 0x43, 0x57, - 0x42, 0x46, 0x6a, 0x77, 0x74, 0x71, 0x64, 0x2b, 0x4c, 0x42, 0x6d, 0x75, - 0x4d, 0x63, 0x69, 0x49, 0x39, 0x66, 0x4f, 0x4b, 0x73, 0x5a, 0x74, 0x45, - 0x4b, 0x5a, 0x72, 0x7a, 0x2f, 0x0a, 0x55, 0x30, 0x6c, 0x6b, 0x65, 0x4d, - 0x52, 0x6f, 0x53, 0x77, 0x76, 0x58, 0x45, 0x38, 0x77, 0x6d, 0x47, 0x4c, - 0x6a, 0x6a, 0x72, 0x41, 0x62, 0x64, 0x66, 0x6f, 0x68, 0x72, 0x58, 0x46, - 0x6b, 0x43, 0x51, 0x51, 0x44, 0x5a, 0x45, 0x78, 0x2f, 0x4c, 0x74, 0x49, - 0x6c, 0x36, 0x4a, 0x49, 0x4e, 0x4a, 0x51, 0x69, 0x73, 0x77, 0x56, 0x65, - 0x30, 0x74, 0x57, 0x72, 0x36, 0x6b, 0x2b, 0x41, 0x53, 0x50, 0x0a, 0x31, - 0x57, 0x58, 0x6f, 0x54, 0x6d, 0x2b, 0x48, 0x59, 0x70, 0x6f, 0x46, 0x2f, - 0x58, 0x55, 0x76, 0x76, 0x39, 0x4c, 0x63, 0x63, 0x4e, 0x46, 0x31, 0x49, - 0x61, 0x7a, 0x46, 0x6a, 0x33, 0x34, 0x68, 0x77, 0x52, 0x51, 0x77, 0x68, - 0x78, 0x37, 0x77, 0x2f, 0x56, 0x35, 0x32, 0x49, 0x65, 0x62, 0x2b, 0x70, - 0x30, 0x6a, 0x55, 0x4d, 0x59, 0x47, 0x78, 0x41, 0x6b, 0x45, 0x41, 0x6a, - 0x44, 0x68, 0x64, 0x0a, 0x39, 0x70, 0x42, 0x4f, 0x31, 0x66, 0x4b, 0x58, - 0x57, 0x69, 0x58, 0x7a, 0x69, 0x39, 0x5a, 0x4b, 0x66, 0x6f, 0x79, 0x54, - 0x4e, 0x63, 0x55, 0x71, 0x33, 0x65, 0x42, 0x53, 0x56, 0x4b, 0x77, 0x50, - 0x47, 0x32, 0x6e, 0x49, 0x74, 0x67, 0x35, 0x79, 0x63, 0x58, 0x65, 0x6e, - 0x67, 0x6a, 0x54, 0x35, 0x73, 0x67, 0x63, 0x57, 0x44, 0x6e, 0x63, 0x69, - 0x49, 0x7a, 0x57, 0x37, 0x42, 0x49, 0x56, 0x49, 0x0a, 0x4a, 0x69, 0x71, - 0x4f, 0x73, 0x7a, 0x71, 0x39, 0x47, 0x57, 0x45, 0x53, 0x45, 0x72, 0x41, - 0x61, 0x74, 0x67, 0x3d, 0x3d, 0x0a, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x45, - 0x4e, 0x44, 0x20, 0x50, 0x52, 0x49, 0x56, 0x41, 0x54, 0x45, 0x20, 0x4b, - 0x45, 0x59, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, 0x00}; + 0x42, 0x4b, 0x67, 0x77, 0x67, 0x67, 0x53, 0x6b, 0x41, 0x67, 0x45, 0x41, + 0x41, 0x6f, 0x49, 0x42, 0x41, 0x51, 0x43, 0x79, 0x71, 0x59, 0x52, 0x70, + 0x2b, 0x44, 0x58, 0x56, 0x70, 0x37, 0x32, 0x4e, 0x0a, 0x46, 0x62, 0x51, + 0x48, 0x38, 0x68, 0x64, 0x68, 0x54, 0x5a, 0x4c, 0x79, 0x63, 0x5a, 0x58, + 0x4f, 0x6c, 0x4a, 0x68, 0x6d, 0x4d, 0x73, 0x72, 0x4a, 0x6d, 0x72, 0x6a, + 0x6e, 0x32, 0x70, 0x37, 0x70, 0x49, 0x2f, 0x38, 0x6d, 0x54, 0x5a, 0x2f, + 0x30, 0x46, 0x43, 0x2b, 0x53, 0x47, 0x57, 0x42, 0x47, 0x5a, 0x56, 0x2b, + 0x45, 0x4c, 0x69, 0x48, 0x72, 0x6d, 0x43, 0x58, 0x35, 0x7a, 0x66, 0x61, + 0x49, 0x0a, 0x4c, 0x72, 0x39, 0x49, 0x75, 0x77, 0x37, 0x47, 0x68, 0x72, + 0x33, 0x56, 0x7a, 0x6f, 0x65, 0x66, 0x69, 0x38, 0x72, 0x36, 0x32, 0x72, + 0x4c, 0x75, 0x70, 0x56, 0x50, 0x4e, 0x69, 0x2f, 0x71, 0x64, 0x71, 0x79, + 0x6a, 0x57, 0x6b, 0x32, 0x64, 0x45, 0x43, 0x48, 0x43, 0x39, 0x5a, 0x33, + 0x2b, 0x41, 0x67, 0x33, 0x4b, 0x7a, 0x4b, 0x54, 0x79, 0x65, 0x72, 0x58, + 0x57, 0x6a, 0x4b, 0x63, 0x76, 0x79, 0x0a, 0x4b, 0x56, 0x6d, 0x4d, 0x30, + 0x5a, 0x78, 0x45, 0x30, 0x52, 0x58, 0x68, 0x44, 0x57, 0x2f, 0x52, 0x6f, + 0x51, 0x62, 0x71, 0x5a, 0x73, 0x55, 0x32, 0x47, 0x4b, 0x67, 0x31, 0x42, + 0x32, 0x72, 0x68, 0x55, 0x55, 0x38, 0x4b, 0x4e, 0x30, 0x67, 0x56, 0x6d, + 0x4b, 0x6e, 0x30, 0x72, 0x4a, 0x48, 0x4f, 0x78, 0x7a, 0x52, 0x56, 0x53, + 0x59, 0x65, 0x59, 0x4c, 0x59, 0x70, 0x35, 0x59, 0x6e, 0x37, 0x4b, 0x0a, + 0x72, 0x74, 0x50, 0x4a, 0x63, 0x4b, 0x79, 0x6f, 0x39, 0x61, 0x56, 0x75, + 0x45, 0x72, 0x37, 0x64, 0x47, 0x41, 0x4e, 0x7a, 0x70, 0x79, 0x46, 0x36, + 0x6c, 0x67, 0x2f, 0x6e, 0x59, 0x42, 0x57, 0x63, 0x2b, 0x39, 0x53, 0x47, + 0x77, 0x6b, 0x6f, 0x4c, 0x64, 0x46, 0x76, 0x4b, 0x76, 0x41, 0x42, 0x59, + 0x4a, 0x4d, 0x79, 0x72, 0x62, 0x4e, 0x68, 0x48, 0x55, 0x51, 0x66, 0x76, + 0x30, 0x66, 0x7a, 0x61, 0x0a, 0x5a, 0x30, 0x50, 0x38, 0x36, 0x64, 0x66, + 0x54, 0x45, 0x4e, 0x72, 0x44, 0x78, 0x7a, 0x41, 0x4c, 0x72, 0x7a, 0x47, + 0x6e, 0x71, 0x63, 0x78, 0x33, 0x4b, 0x54, 0x72, 0x77, 0x4a, 0x6a, 0x6b, + 0x5a, 0x2f, 0x61, 0x53, 0x72, 0x31, 0x74, 0x79, 0x44, 0x30, 0x2f, 0x74, + 0x58, 0x76, 0x75, 0x6b, 0x52, 0x46, 0x69, 0x50, 0x78, 0x57, 0x42, 0x4a, + 0x68, 0x6a, 0x48, 0x51, 0x37, 0x30, 0x47, 0x71, 0x54, 0x0a, 0x46, 0x51, + 0x59, 0x31, 0x39, 0x52, 0x62, 0x68, 0x41, 0x67, 0x4d, 0x42, 0x41, 0x41, + 0x45, 0x43, 0x67, 0x67, 0x45, 0x41, 0x49, 0x4c, 0x38, 0x4a, 0x55, 0x68, + 0x4c, 0x34, 0x61, 0x77, 0x79, 0x76, 0x70, 0x57, 0x68, 0x51, 0x38, 0x78, + 0x50, 0x67, 0x54, 0x53, 0x6c, 0x57, 0x77, 0x62, 0x45, 0x6e, 0x38, 0x42, + 0x45, 0x30, 0x54, 0x61, 0x63, 0x4a, 0x6e, 0x43, 0x49, 0x4c, 0x75, 0x68, + 0x4e, 0x4d, 0x0a, 0x42, 0x52, 0x64, 0x66, 0x38, 0x4c, 0x6c, 0x52, 0x6b, + 0x2f, 0x38, 0x50, 0x4b, 0x51, 0x77, 0x56, 0x70, 0x56, 0x46, 0x33, 0x54, + 0x46, 0x62, 0x59, 0x53, 0x4d, 0x49, 0x2b, 0x55, 0x36, 0x62, 0x34, 0x68, + 0x4d, 0x56, 0x73, 0x73, 0x66, 0x76, 0x33, 0x48, 0x56, 0x51, 0x63, 0x2f, + 0x30, 0x38, 0x33, 0x64, 0x48, 0x71, 0x2b, 0x33, 0x58, 0x4f, 0x77, 0x55, + 0x43, 0x56, 0x6c, 0x55, 0x73, 0x74, 0x52, 0x0a, 0x53, 0x41, 0x7a, 0x54, + 0x45, 0x32, 0x45, 0x35, 0x45, 0x44, 0x4d, 0x72, 0x31, 0x73, 0x74, 0x64, + 0x68, 0x30, 0x53, 0x51, 0x68, 0x56, 0x34, 0x4e, 0x69, 0x6c, 0x66, 0x6f, + 0x73, 0x39, 0x73, 0x35, 0x55, 0x6b, 0x31, 0x5a, 0x36, 0x49, 0x47, 0x53, + 0x7a, 0x74, 0x6f, 0x7a, 0x31, 0x47, 0x67, 0x4f, 0x45, 0x72, 0x49, 0x63, + 0x2f, 0x6d, 0x47, 0x50, 0x79, 0x2f, 0x61, 0x41, 0x2f, 0x68, 0x62, 0x72, + 0x0a, 0x66, 0x52, 0x57, 0x48, 0x76, 0x54, 0x70, 0x33, 0x35, 0x2b, 0x4d, + 0x62, 0x43, 0x4a, 0x53, 0x76, 0x5a, 0x75, 0x4f, 0x65, 0x65, 0x76, 0x58, + 0x32, 0x69, 0x4c, 0x73, 0x30, 0x64, 0x4e, 0x7a, 0x71, 0x64, 0x6b, 0x36, + 0x44, 0x69, 0x4f, 0x57, 0x49, 0x48, 0x2f, 0x42, 0x56, 0x47, 0x69, 0x72, + 0x56, 0x50, 0x74, 0x4f, 0x36, 0x79, 0x6b, 0x72, 0x6b, 0x75, 0x54, 0x6a, + 0x31, 0x46, 0x57, 0x69, 0x4e, 0x0a, 0x68, 0x79, 0x5a, 0x33, 0x4d, 0x42, + 0x43, 0x68, 0x53, 0x68, 0x6c, 0x4e, 0x48, 0x32, 0x70, 0x6f, 0x4e, 0x58, + 0x34, 0x36, 0x6e, 0x74, 0x4f, 0x63, 0x37, 0x6e, 0x45, 0x75, 0x73, 0x30, + 0x71, 0x74, 0x65, 0x4f, 0x67, 0x78, 0x42, 0x4b, 0x38, 0x6c, 0x75, 0x6d, + 0x6d, 0x46, 0x45, 0x74, 0x6c, 0x65, 0x68, 0x43, 0x41, 0x37, 0x68, 0x64, + 0x2f, 0x38, 0x78, 0x75, 0x76, 0x59, 0x6c, 0x50, 0x30, 0x6b, 0x0a, 0x37, + 0x61, 0x4e, 0x36, 0x38, 0x34, 0x4c, 0x43, 0x52, 0x44, 0x61, 0x6a, 0x6d, + 0x41, 0x47, 0x70, 0x6f, 0x5a, 0x4f, 0x35, 0x37, 0x4e, 0x53, 0x44, 0x59, + 0x51, 0x68, 0x41, 0x46, 0x47, 0x5a, 0x65, 0x55, 0x5a, 0x39, 0x33, 0x53, + 0x4d, 0x46, 0x75, 0x63, 0x51, 0x4b, 0x42, 0x67, 0x51, 0x44, 0x65, 0x37, + 0x47, 0x47, 0x6b, 0x7a, 0x5a, 0x46, 0x45, 0x69, 0x76, 0x39, 0x31, 0x75, + 0x31, 0x71, 0x39, 0x0a, 0x6c, 0x67, 0x4d, 0x79, 0x31, 0x68, 0x35, 0x64, + 0x5a, 0x6a, 0x49, 0x5a, 0x4b, 0x67, 0x51, 0x61, 0x4f, 0x61, 0x72, 0x50, + 0x43, 0x36, 0x77, 0x43, 0x51, 0x4d, 0x55, 0x64, 0x71, 0x43, 0x66, 0x36, + 0x63, 0x53, 0x4c, 0x73, 0x41, 0x50, 0x72, 0x34, 0x54, 0x38, 0x45, 0x44, + 0x6f, 0x57, 0x73, 0x6e, 0x59, 0x37, 0x64, 0x53, 0x6e, 0x72, 0x54, 0x5a, + 0x36, 0x59, 0x43, 0x49, 0x46, 0x4c, 0x31, 0x54, 0x0a, 0x69, 0x64, 0x67, + 0x38, 0x4d, 0x33, 0x42, 0x51, 0x58, 0x69, 0x70, 0x49, 0x43, 0x43, 0x4a, + 0x6b, 0x46, 0x4f, 0x52, 0x53, 0x37, 0x36, 0x70, 0x4b, 0x4b, 0x5a, 0x30, + 0x77, 0x4d, 0x6e, 0x33, 0x2f, 0x4e, 0x67, 0x6b, 0x53, 0x65, 0x70, 0x73, + 0x6d, 0x4e, 0x63, 0x74, 0x39, 0x31, 0x57, 0x48, 0x72, 0x36, 0x6f, 0x6b, + 0x76, 0x78, 0x34, 0x74, 0x4f, 0x61, 0x6f, 0x52, 0x43, 0x74, 0x64, 0x7a, + 0x55, 0x0a, 0x67, 0x37, 0x6a, 0x74, 0x34, 0x4d, 0x72, 0x33, 0x73, 0x66, + 0x4c, 0x43, 0x69, 0x5a, 0x74, 0x71, 0x54, 0x51, 0x79, 0x79, 0x53, 0x64, + 0x4d, 0x55, 0x45, 0x77, 0x4b, 0x42, 0x67, 0x51, 0x44, 0x4e, 0x4b, 0x2b, + 0x5a, 0x46, 0x4b, 0x4c, 0x30, 0x58, 0x68, 0x6b, 0x57, 0x5a, 0x50, 0x2b, + 0x50, 0x47, 0x4b, 0x6a, 0x57, 0x47, 0x38, 0x4c, 0x57, 0x70, 0x50, 0x69, + 0x4b, 0x33, 0x64, 0x37, 0x38, 0x2f, 0x0a, 0x77, 0x59, 0x42, 0x46, 0x58, + 0x7a, 0x53, 0x54, 0x47, 0x6c, 0x6b, 0x72, 0x36, 0x46, 0x76, 0x52, 0x6d, + 0x59, 0x74, 0x5a, 0x65, 0x4e, 0x77, 0x58, 0x57, 0x52, 0x59, 0x4c, 0x42, + 0x34, 0x55, 0x78, 0x5a, 0x39, 0x41, 0x74, 0x34, 0x68, 0x62, 0x4a, 0x56, + 0x45, 0x64, 0x69, 0x2f, 0x32, 0x64, 0x49, 0x54, 0x4f, 0x7a, 0x2f, 0x73, + 0x65, 0x68, 0x56, 0x44, 0x79, 0x43, 0x41, 0x6a, 0x6a, 0x73, 0x33, 0x0a, + 0x67, 0x79, 0x63, 0x73, 0x63, 0x33, 0x55, 0x4a, 0x71, 0x69, 0x5a, 0x62, + 0x63, 0x77, 0x35, 0x58, 0x4b, 0x68, 0x49, 0x35, 0x54, 0x57, 0x42, 0x75, + 0x57, 0x78, 0x6b, 0x4b, 0x45, 0x4e, 0x64, 0x62, 0x4d, 0x53, 0x61, 0x79, + 0x6f, 0x67, 0x56, 0x62, 0x70, 0x32, 0x61, 0x53, 0x59, 0x6f, 0x52, 0x62, + 0x6c, 0x48, 0x37, 0x36, 0x34, 0x2f, 0x2f, 0x74, 0x30, 0x41, 0x43, 0x6d, + 0x62, 0x66, 0x54, 0x57, 0x0a, 0x4b, 0x55, 0x51, 0x52, 0x51, 0x50, 0x42, + 0x2f, 0x75, 0x77, 0x4b, 0x42, 0x67, 0x51, 0x43, 0x35, 0x51, 0x6a, 0x6a, + 0x6a, 0x66, 0x50, 0x4c, 0x38, 0x77, 0x34, 0x63, 0x4a, 0x6b, 0x47, 0x6f, + 0x59, 0x70, 0x46, 0x4b, 0x45, 0x4c, 0x4f, 0x32, 0x50, 0x4d, 0x52, 0x37, + 0x78, 0x53, 0x72, 0x6d, 0x65, 0x45, 0x63, 0x36, 0x68, 0x77, 0x6c, 0x46, + 0x77, 0x6a, 0x65, 0x4e, 0x43, 0x67, 0x6a, 0x79, 0x33, 0x0a, 0x4a, 0x4d, + 0x36, 0x67, 0x30, 0x79, 0x2b, 0x2b, 0x72, 0x49, 0x6a, 0x37, 0x4f, 0x32, + 0x71, 0x52, 0x6b, 0x59, 0x30, 0x49, 0x58, 0x46, 0x78, 0x76, 0x76, 0x46, + 0x33, 0x55, 0x75, 0x57, 0x65, 0x64, 0x78, 0x54, 0x43, 0x75, 0x31, 0x78, + 0x43, 0x2f, 0x75, 0x59, 0x48, 0x70, 0x32, 0x74, 0x69, 0x35, 0x30, 0x36, + 0x4c, 0x73, 0x53, 0x63, 0x42, 0x37, 0x59, 0x5a, 0x6f, 0x41, 0x4d, 0x2f, + 0x59, 0x42, 0x0a, 0x34, 0x69, 0x59, 0x6e, 0x39, 0x54, 0x78, 0x36, 0x78, + 0x4c, 0x6f, 0x59, 0x47, 0x50, 0x30, 0x48, 0x30, 0x69, 0x47, 0x77, 0x55, + 0x32, 0x53, 0x79, 0x42, 0x6c, 0x4e, 0x6b, 0x48, 0x54, 0x38, 0x6f, 0x58, + 0x55, 0x2b, 0x53, 0x59, 0x50, 0x35, 0x4d, 0x57, 0x74, 0x59, 0x6b, 0x56, + 0x62, 0x65, 0x53, 0x33, 0x2f, 0x56, 0x74, 0x4e, 0x57, 0x7a, 0x31, 0x67, + 0x51, 0x4b, 0x42, 0x67, 0x51, 0x43, 0x41, 0x0a, 0x36, 0x4e, 0x6b, 0x34, + 0x6b, 0x4e, 0x30, 0x6d, 0x48, 0x37, 0x59, 0x78, 0x45, 0x4b, 0x52, 0x7a, + 0x53, 0x4f, 0x66, 0x79, 0x7a, 0x65, 0x44, 0x46, 0x34, 0x6f, 0x56, 0x37, + 0x6b, 0x75, 0x42, 0x32, 0x46, 0x59, 0x55, 0x62, 0x6b, 0x54, 0x4c, 0x2b, + 0x54, 0x69, 0x72, 0x43, 0x33, 0x4b, 0x35, 0x38, 0x4a, 0x69, 0x59, 0x59, + 0x35, 0x45, 0x67, 0x63, 0x33, 0x31, 0x74, 0x72, 0x4f, 0x4b, 0x46, 0x6d, + 0x0a, 0x4a, 0x6c, 0x7a, 0x31, 0x78, 0x7a, 0x30, 0x62, 0x36, 0x44, 0x6b, + 0x6d, 0x4b, 0x57, 0x54, 0x69, 0x56, 0x33, 0x72, 0x39, 0x4f, 0x50, 0x48, + 0x4b, 0x4a, 0x38, 0x50, 0x37, 0x49, 0x65, 0x4a, 0x78, 0x41, 0x5a, 0x57, + 0x6d, 0x5a, 0x7a, 0x43, 0x64, 0x44, 0x75, 0x77, 0x6b, 0x76, 0x30, 0x69, + 0x2b, 0x57, 0x57, 0x2b, 0x7a, 0x30, 0x7a, 0x73, 0x49, 0x65, 0x33, 0x4a, + 0x6a, 0x45, 0x61, 0x76, 0x4e, 0x0a, 0x33, 0x7a, 0x62, 0x36, 0x4f, 0x37, + 0x52, 0x30, 0x48, 0x74, 0x7a, 0x69, 0x6b, 0x73, 0x57, 0x6f, 0x71, 0x4d, + 0x65, 0x54, 0x71, 0x5a, 0x65, 0x4f, 0x2b, 0x77, 0x61, 0x39, 0x69, 0x77, + 0x36, 0x76, 0x56, 0x4b, 0x51, 0x77, 0x31, 0x77, 0x57, 0x45, 0x71, 0x77, + 0x4b, 0x42, 0x67, 0x46, 0x48, 0x66, 0x61, 0x68, 0x46, 0x73, 0x30, 0x44, + 0x5a, 0x35, 0x63, 0x55, 0x54, 0x70, 0x47, 0x70, 0x42, 0x74, 0x0a, 0x46, + 0x2f, 0x41, 0x51, 0x47, 0x37, 0x75, 0x6b, 0x67, 0x69, 0x70, 0x42, 0x36, + 0x4e, 0x36, 0x41, 0x6b, 0x42, 0x39, 0x6b, 0x44, 0x62, 0x67, 0x43, 0x73, + 0x31, 0x46, 0x4c, 0x67, 0x64, 0x31, 0x39, 0x39, 0x4d, 0x51, 0x72, 0x45, + 0x6e, 0x63, 0x75, 0x67, 0x35, 0x68, 0x66, 0x70, 0x71, 0x38, 0x51, 0x65, + 0x72, 0x62, 0x79, 0x4d, 0x61, 0x74, 0x6d, 0x41, 0x2b, 0x47, 0x58, 0x6f, + 0x47, 0x4d, 0x62, 0x0a, 0x37, 0x76, 0x7a, 0x74, 0x4b, 0x45, 0x48, 0x38, + 0x35, 0x79, 0x7a, 0x70, 0x34, 0x6e, 0x30, 0x32, 0x46, 0x4e, 0x4c, 0x36, + 0x48, 0x37, 0x78, 0x4c, 0x34, 0x56, 0x56, 0x49, 0x4c, 0x76, 0x79, 0x5a, + 0x48, 0x64, 0x6f, 0x6c, 0x6d, 0x69, 0x4f, 0x52, 0x4a, 0x34, 0x71, 0x54, + 0x32, 0x68, 0x5a, 0x6e, 0x6c, 0x38, 0x70, 0x45, 0x51, 0x32, 0x54, 0x59, + 0x75, 0x46, 0x34, 0x52, 0x6c, 0x48, 0x55, 0x64, 0x0a, 0x6e, 0x53, 0x77, + 0x58, 0x58, 0x2b, 0x32, 0x6f, 0x30, 0x4a, 0x2f, 0x6e, 0x46, 0x38, 0x35, + 0x66, 0x6d, 0x34, 0x41, 0x77, 0x57, 0x4b, 0x41, 0x63, 0x0a, 0x2d, 0x2d, + 0x2d, 0x2d, 0x2d, 0x45, 0x4e, 0x44, 0x20, 0x50, 0x52, 0x49, 0x56, 0x41, + 0x54, 0x45, 0x20, 0x4b, 0x45, 0x59, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a}; diff --git a/test/core/end2end/data/server1_cert.cc b/test/core/end2end/data/server1_cert.cc index 0943244ecc8..462b28eef3a 100644 --- a/test/core/end2end/data/server1_cert.cc +++ b/test/core/end2end/data/server1_cert.cc @@ -19,82 +19,114 @@ extern const char test_server1_cert[] = { 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x42, 0x45, 0x47, 0x49, 0x4e, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2d, 0x2d, - 0x2d, 0x2d, 0x2d, 0x0a, 0x4d, 0x49, 0x49, 0x43, 0x6e, 0x44, 0x43, 0x43, - 0x41, 0x67, 0x57, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x42, - 0x42, 0x7a, 0x41, 0x4e, 0x42, 0x67, 0x6b, 0x71, 0x68, 0x6b, 0x69, 0x47, - 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x73, 0x46, 0x41, 0x44, 0x42, 0x57, - 0x4d, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, - 0x45, 0x77, 0x4a, 0x42, 0x56, 0x54, 0x45, 0x54, 0x0a, 0x4d, 0x42, 0x45, - 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x42, 0x4d, 0x4b, 0x55, 0x32, 0x39, - 0x74, 0x5a, 0x53, 0x31, 0x54, 0x64, 0x47, 0x46, 0x30, 0x5a, 0x54, 0x45, - 0x68, 0x4d, 0x42, 0x38, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x68, 0x4d, - 0x59, 0x53, 0x57, 0x35, 0x30, 0x5a, 0x58, 0x4a, 0x75, 0x5a, 0x58, 0x51, - 0x67, 0x56, 0x32, 0x6c, 0x6b, 0x5a, 0x32, 0x6c, 0x30, 0x63, 0x79, 0x42, - 0x51, 0x0a, 0x64, 0x48, 0x6b, 0x67, 0x54, 0x48, 0x52, 0x6b, 0x4d, 0x51, - 0x38, 0x77, 0x44, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x45, 0x77, - 0x5a, 0x30, 0x5a, 0x58, 0x4e, 0x30, 0x59, 0x32, 0x45, 0x77, 0x48, 0x68, - 0x63, 0x4e, 0x4d, 0x54, 0x55, 0x78, 0x4d, 0x54, 0x41, 0x30, 0x4d, 0x44, - 0x49, 0x79, 0x4d, 0x44, 0x49, 0x30, 0x57, 0x68, 0x63, 0x4e, 0x4d, 0x6a, - 0x55, 0x78, 0x4d, 0x54, 0x41, 0x78, 0x0a, 0x4d, 0x44, 0x49, 0x79, 0x4d, - 0x44, 0x49, 0x30, 0x57, 0x6a, 0x42, 0x6c, 0x4d, 0x51, 0x73, 0x77, 0x43, - 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4a, 0x56, 0x55, - 0x7a, 0x45, 0x52, 0x4d, 0x41, 0x38, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, - 0x42, 0x4d, 0x49, 0x53, 0x57, 0x78, 0x73, 0x61, 0x57, 0x35, 0x76, 0x61, - 0x58, 0x4d, 0x78, 0x45, 0x44, 0x41, 0x4f, 0x42, 0x67, 0x4e, 0x56, 0x0a, - 0x42, 0x41, 0x63, 0x54, 0x42, 0x30, 0x4e, 0x6f, 0x61, 0x57, 0x4e, 0x68, - 0x5a, 0x32, 0x38, 0x78, 0x46, 0x54, 0x41, 0x54, 0x42, 0x67, 0x4e, 0x56, - 0x42, 0x41, 0x6f, 0x54, 0x44, 0x45, 0x56, 0x34, 0x59, 0x57, 0x31, 0x77, - 0x62, 0x47, 0x55, 0x73, 0x49, 0x45, 0x4e, 0x76, 0x4c, 0x6a, 0x45, 0x61, - 0x4d, 0x42, 0x67, 0x47, 0x41, 0x31, 0x55, 0x45, 0x41, 0x78, 0x51, 0x52, - 0x4b, 0x69, 0x35, 0x30, 0x0a, 0x5a, 0x58, 0x4e, 0x30, 0x4c, 0x6d, 0x64, - 0x76, 0x62, 0x32, 0x64, 0x73, 0x5a, 0x53, 0x35, 0x6a, 0x62, 0x32, 0x30, - 0x77, 0x67, 0x5a, 0x38, 0x77, 0x44, 0x51, 0x59, 0x4a, 0x4b, 0x6f, 0x5a, - 0x49, 0x68, 0x76, 0x63, 0x4e, 0x41, 0x51, 0x45, 0x42, 0x42, 0x51, 0x41, - 0x44, 0x67, 0x59, 0x30, 0x41, 0x4d, 0x49, 0x47, 0x4a, 0x41, 0x6f, 0x47, - 0x42, 0x41, 0x4f, 0x48, 0x44, 0x46, 0x53, 0x63, 0x6f, 0x0a, 0x4c, 0x43, - 0x56, 0x4a, 0x70, 0x59, 0x44, 0x44, 0x4d, 0x34, 0x48, 0x59, 0x74, 0x49, - 0x64, 0x56, 0x36, 0x41, 0x6b, 0x65, 0x2f, 0x73, 0x4d, 0x4e, 0x61, 0x61, - 0x4b, 0x64, 0x4f, 0x44, 0x6a, 0x44, 0x4d, 0x73, 0x75, 0x78, 0x2f, 0x34, - 0x74, 0x44, 0x79, 0x64, 0x6c, 0x75, 0x6d, 0x4e, 0x2b, 0x66, 0x6d, 0x2b, - 0x41, 0x6a, 0x50, 0x45, 0x4b, 0x35, 0x47, 0x48, 0x68, 0x47, 0x6e, 0x31, - 0x42, 0x67, 0x0a, 0x7a, 0x6b, 0x57, 0x46, 0x2b, 0x73, 0x6c, 0x66, 0x33, - 0x42, 0x78, 0x68, 0x72, 0x41, 0x2f, 0x38, 0x64, 0x4e, 0x73, 0x6e, 0x75, - 0x6e, 0x73, 0x74, 0x56, 0x41, 0x37, 0x5a, 0x42, 0x67, 0x41, 0x2f, 0x35, - 0x71, 0x51, 0x78, 0x4d, 0x66, 0x47, 0x41, 0x71, 0x34, 0x77, 0x48, 0x4e, - 0x56, 0x58, 0x37, 0x37, 0x66, 0x42, 0x5a, 0x4f, 0x67, 0x70, 0x39, 0x56, - 0x6c, 0x53, 0x4d, 0x56, 0x66, 0x79, 0x64, 0x0a, 0x39, 0x4e, 0x38, 0x59, - 0x77, 0x62, 0x42, 0x59, 0x41, 0x63, 0x6b, 0x4f, 0x65, 0x55, 0x51, 0x61, - 0x64, 0x54, 0x69, 0x32, 0x58, 0x31, 0x53, 0x36, 0x4f, 0x67, 0x4a, 0x58, - 0x67, 0x51, 0x30, 0x6d, 0x33, 0x4d, 0x57, 0x68, 0x41, 0x67, 0x4d, 0x42, - 0x41, 0x41, 0x47, 0x6a, 0x61, 0x7a, 0x42, 0x70, 0x4d, 0x41, 0x6b, 0x47, - 0x41, 0x31, 0x55, 0x64, 0x45, 0x77, 0x51, 0x43, 0x4d, 0x41, 0x41, 0x77, - 0x0a, 0x43, 0x77, 0x59, 0x44, 0x56, 0x52, 0x30, 0x50, 0x42, 0x41, 0x51, - 0x44, 0x41, 0x67, 0x58, 0x67, 0x4d, 0x45, 0x38, 0x47, 0x41, 0x31, 0x55, - 0x64, 0x45, 0x51, 0x52, 0x49, 0x4d, 0x45, 0x61, 0x43, 0x45, 0x43, 0x6f, + 0x2d, 0x2d, 0x2d, 0x0a, 0x4d, 0x49, 0x49, 0x44, 0x74, 0x44, 0x43, 0x43, + 0x41, 0x70, 0x79, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x55, + 0x62, 0x4a, 0x66, 0x54, 0x52, 0x45, 0x4a, 0x36, 0x6b, 0x36, 0x2f, 0x2b, + 0x6f, 0x49, 0x6e, 0x57, 0x68, 0x56, 0x31, 0x4f, 0x31, 0x6a, 0x33, 0x5a, + 0x54, 0x30, 0x49, 0x77, 0x44, 0x51, 0x59, 0x4a, 0x4b, 0x6f, 0x5a, 0x49, + 0x68, 0x76, 0x63, 0x4e, 0x41, 0x51, 0x45, 0x4c, 0x0a, 0x42, 0x51, 0x41, + 0x77, 0x56, 0x6a, 0x45, 0x4c, 0x4d, 0x41, 0x6b, 0x47, 0x41, 0x31, 0x55, + 0x45, 0x42, 0x68, 0x4d, 0x43, 0x51, 0x56, 0x55, 0x78, 0x45, 0x7a, 0x41, + 0x52, 0x42, 0x67, 0x4e, 0x56, 0x42, 0x41, 0x67, 0x4d, 0x43, 0x6c, 0x4e, + 0x76, 0x62, 0x57, 0x55, 0x74, 0x55, 0x33, 0x52, 0x68, 0x64, 0x47, 0x55, + 0x78, 0x49, 0x54, 0x41, 0x66, 0x42, 0x67, 0x4e, 0x56, 0x42, 0x41, 0x6f, + 0x4d, 0x0a, 0x47, 0x45, 0x6c, 0x75, 0x64, 0x47, 0x56, 0x79, 0x62, 0x6d, + 0x56, 0x30, 0x49, 0x46, 0x64, 0x70, 0x5a, 0x47, 0x64, 0x70, 0x64, 0x48, + 0x4d, 0x67, 0x55, 0x48, 0x52, 0x35, 0x49, 0x45, 0x78, 0x30, 0x5a, 0x44, + 0x45, 0x50, 0x4d, 0x41, 0x30, 0x47, 0x41, 0x31, 0x55, 0x45, 0x41, 0x77, + 0x77, 0x47, 0x64, 0x47, 0x56, 0x7a, 0x64, 0x47, 0x4e, 0x68, 0x4d, 0x42, + 0x34, 0x58, 0x44, 0x54, 0x49, 0x77, 0x0a, 0x4d, 0x44, 0x4d, 0x78, 0x4f, + 0x44, 0x41, 0x7a, 0x4d, 0x54, 0x41, 0x30, 0x4d, 0x6c, 0x6f, 0x58, 0x44, + 0x54, 0x4d, 0x77, 0x4d, 0x44, 0x4d, 0x78, 0x4e, 0x6a, 0x41, 0x7a, 0x4d, + 0x54, 0x41, 0x30, 0x4d, 0x6c, 0x6f, 0x77, 0x5a, 0x54, 0x45, 0x4c, 0x4d, + 0x41, 0x6b, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4d, 0x43, 0x56, + 0x56, 0x4d, 0x78, 0x45, 0x54, 0x41, 0x50, 0x42, 0x67, 0x4e, 0x56, 0x0a, + 0x42, 0x41, 0x67, 0x4d, 0x43, 0x45, 0x6c, 0x73, 0x62, 0x47, 0x6c, 0x75, + 0x62, 0x32, 0x6c, 0x7a, 0x4d, 0x52, 0x41, 0x77, 0x44, 0x67, 0x59, 0x44, + 0x56, 0x51, 0x51, 0x48, 0x44, 0x41, 0x64, 0x44, 0x61, 0x47, 0x6c, 0x6a, + 0x59, 0x57, 0x64, 0x76, 0x4d, 0x52, 0x55, 0x77, 0x45, 0x77, 0x59, 0x44, + 0x56, 0x51, 0x51, 0x4b, 0x44, 0x41, 0x78, 0x46, 0x65, 0x47, 0x46, 0x74, + 0x63, 0x47, 0x78, 0x6c, 0x0a, 0x4c, 0x43, 0x42, 0x44, 0x62, 0x79, 0x34, + 0x78, 0x47, 0x6a, 0x41, 0x59, 0x42, 0x67, 0x4e, 0x56, 0x42, 0x41, 0x4d, + 0x4d, 0x45, 0x53, 0x6f, 0x75, 0x64, 0x47, 0x56, 0x7a, 0x64, 0x43, 0x35, + 0x6e, 0x62, 0x32, 0x39, 0x6e, 0x62, 0x47, 0x55, 0x75, 0x59, 0x32, 0x39, + 0x74, 0x4d, 0x49, 0x49, 0x42, 0x49, 0x6a, 0x41, 0x4e, 0x42, 0x67, 0x6b, + 0x71, 0x68, 0x6b, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x0a, 0x41, 0x51, + 0x45, 0x46, 0x41, 0x41, 0x4f, 0x43, 0x41, 0x51, 0x38, 0x41, 0x4d, 0x49, + 0x49, 0x42, 0x43, 0x67, 0x4b, 0x43, 0x41, 0x51, 0x45, 0x41, 0x35, 0x78, + 0x4f, 0x4f, 0x4e, 0x78, 0x4a, 0x4a, 0x38, 0x62, 0x38, 0x51, 0x61, 0x75, + 0x76, 0x6f, 0x62, 0x35, 0x2f, 0x37, 0x64, 0x50, 0x59, 0x5a, 0x66, 0x49, + 0x63, 0x64, 0x2b, 0x75, 0x68, 0x41, 0x57, 0x4c, 0x32, 0x5a, 0x6c, 0x54, + 0x50, 0x7a, 0x0a, 0x51, 0x76, 0x75, 0x34, 0x6f, 0x46, 0x30, 0x51, 0x49, + 0x34, 0x69, 0x59, 0x67, 0x50, 0x35, 0x69, 0x47, 0x67, 0x72, 0x79, 0x39, + 0x7a, 0x45, 0x74, 0x43, 0x4d, 0x2b, 0x59, 0x51, 0x53, 0x38, 0x55, 0x68, + 0x69, 0x41, 0x6c, 0x50, 0x6c, 0x71, 0x61, 0x36, 0x41, 0x4e, 0x78, 0x67, + 0x69, 0x42, 0x53, 0x45, 0x79, 0x4d, 0x48, 0x48, 0x2f, 0x78, 0x45, 0x38, + 0x6c, 0x6f, 0x2f, 0x2b, 0x63, 0x61, 0x59, 0x0a, 0x47, 0x65, 0x41, 0x43, + 0x71, 0x79, 0x36, 0x34, 0x30, 0x4a, 0x70, 0x6c, 0x2f, 0x4a, 0x6f, 0x63, + 0x46, 0x47, 0x6f, 0x33, 0x78, 0x64, 0x31, 0x4c, 0x38, 0x44, 0x43, 0x61, + 0x77, 0x6a, 0x6c, 0x61, 0x6a, 0x36, 0x65, 0x75, 0x37, 0x54, 0x37, 0x54, + 0x2f, 0x74, 0x70, 0x41, 0x56, 0x32, 0x71, 0x71, 0x31, 0x33, 0x62, 0x35, + 0x37, 0x31, 0x30, 0x65, 0x4e, 0x52, 0x62, 0x43, 0x41, 0x66, 0x46, 0x65, + 0x0a, 0x38, 0x79, 0x41, 0x4c, 0x69, 0x47, 0x51, 0x65, 0x6d, 0x78, 0x30, + 0x49, 0x59, 0x68, 0x6c, 0x5a, 0x58, 0x4e, 0x62, 0x49, 0x47, 0x57, 0x4c, + 0x42, 0x4e, 0x68, 0x42, 0x68, 0x76, 0x56, 0x6a, 0x4a, 0x68, 0x37, 0x55, + 0x76, 0x4f, 0x71, 0x70, 0x41, 0x44, 0x6b, 0x34, 0x78, 0x74, 0x6c, 0x38, + 0x6f, 0x35, 0x6a, 0x30, 0x78, 0x67, 0x4d, 0x49, 0x52, 0x67, 0x36, 0x57, + 0x4a, 0x47, 0x4b, 0x36, 0x63, 0x0a, 0x36, 0x66, 0x66, 0x53, 0x49, 0x67, + 0x34, 0x65, 0x50, 0x31, 0x58, 0x6d, 0x6f, 0x76, 0x4e, 0x59, 0x5a, 0x39, + 0x4c, 0x4c, 0x45, 0x4a, 0x47, 0x36, 0x38, 0x74, 0x46, 0x30, 0x51, 0x2f, + 0x79, 0x49, 0x4e, 0x34, 0x33, 0x42, 0x34, 0x64, 0x74, 0x31, 0x6f, 0x71, + 0x34, 0x6a, 0x7a, 0x53, 0x64, 0x43, 0x62, 0x47, 0x34, 0x46, 0x31, 0x45, + 0x69, 0x79, 0x6b, 0x54, 0x32, 0x54, 0x6d, 0x77, 0x50, 0x56, 0x0a, 0x59, + 0x44, 0x69, 0x38, 0x74, 0x6d, 0x6c, 0x36, 0x44, 0x66, 0x4f, 0x43, 0x44, + 0x47, 0x6e, 0x69, 0x74, 0x38, 0x73, 0x76, 0x6e, 0x4d, 0x45, 0x6d, 0x42, + 0x76, 0x2f, 0x66, 0x63, 0x50, 0x64, 0x33, 0x31, 0x47, 0x53, 0x62, 0x58, + 0x6a, 0x46, 0x38, 0x4d, 0x2b, 0x4b, 0x47, 0x47, 0x51, 0x49, 0x44, 0x41, + 0x51, 0x41, 0x42, 0x6f, 0x32, 0x73, 0x77, 0x61, 0x54, 0x41, 0x4a, 0x42, + 0x67, 0x4e, 0x56, 0x0a, 0x48, 0x52, 0x4d, 0x45, 0x41, 0x6a, 0x41, 0x41, + 0x4d, 0x41, 0x73, 0x47, 0x41, 0x31, 0x55, 0x64, 0x44, 0x77, 0x51, 0x45, + 0x41, 0x77, 0x49, 0x46, 0x34, 0x44, 0x42, 0x50, 0x42, 0x67, 0x4e, 0x56, + 0x48, 0x52, 0x45, 0x45, 0x53, 0x44, 0x42, 0x47, 0x67, 0x68, 0x41, 0x71, + 0x4c, 0x6e, 0x52, 0x6c, 0x63, 0x33, 0x51, 0x75, 0x5a, 0x32, 0x39, 0x76, + 0x5a, 0x32, 0x78, 0x6c, 0x4c, 0x6d, 0x5a, 0x79, 0x0a, 0x67, 0x68, 0x68, + 0x33, 0x59, 0x58, 0x52, 0x6c, 0x63, 0x6e, 0x70, 0x76, 0x62, 0x32, 0x6b, 0x75, 0x64, 0x47, 0x56, 0x7a, 0x64, 0x43, 0x35, 0x6e, 0x62, 0x32, 0x39, - 0x6e, 0x62, 0x47, 0x55, 0x75, 0x5a, 0x6e, 0x4b, 0x43, 0x47, 0x48, 0x64, - 0x68, 0x64, 0x47, 0x56, 0x79, 0x0a, 0x65, 0x6d, 0x39, 0x76, 0x61, 0x53, - 0x35, 0x30, 0x5a, 0x58, 0x4e, 0x30, 0x4c, 0x6d, 0x64, 0x76, 0x62, 0x32, - 0x64, 0x73, 0x5a, 0x53, 0x35, 0x69, 0x5a, 0x59, 0x49, 0x53, 0x4b, 0x69, - 0x35, 0x30, 0x5a, 0x58, 0x4e, 0x30, 0x4c, 0x6e, 0x6c, 0x76, 0x64, 0x58, - 0x52, 0x31, 0x59, 0x6d, 0x55, 0x75, 0x59, 0x32, 0x39, 0x74, 0x68, 0x77, - 0x54, 0x41, 0x71, 0x41, 0x45, 0x44, 0x4d, 0x41, 0x30, 0x47, 0x0a, 0x43, - 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x43, - 0x77, 0x55, 0x41, 0x41, 0x34, 0x47, 0x42, 0x41, 0x4a, 0x46, 0x58, 0x56, - 0x69, 0x66, 0x51, 0x4e, 0x75, 0x62, 0x31, 0x4c, 0x55, 0x50, 0x34, 0x4a, - 0x6c, 0x6e, 0x58, 0x35, 0x6c, 0x58, 0x4e, 0x6c, 0x6f, 0x38, 0x46, 0x78, - 0x5a, 0x32, 0x61, 0x31, 0x32, 0x41, 0x46, 0x51, 0x73, 0x2b, 0x62, 0x7a, - 0x6f, 0x4a, 0x36, 0x0a, 0x68, 0x4d, 0x30, 0x34, 0x34, 0x45, 0x44, 0x6a, - 0x71, 0x79, 0x78, 0x55, 0x71, 0x53, 0x62, 0x56, 0x65, 0x50, 0x4b, 0x30, - 0x6e, 0x69, 0x33, 0x77, 0x31, 0x66, 0x48, 0x51, 0x42, 0x35, 0x72, 0x59, - 0x39, 0x79, 0x59, 0x43, 0x35, 0x66, 0x38, 0x47, 0x37, 0x61, 0x71, 0x71, - 0x54, 0x59, 0x31, 0x51, 0x4f, 0x68, 0x6f, 0x55, 0x6b, 0x38, 0x5a, 0x54, - 0x53, 0x54, 0x52, 0x70, 0x6e, 0x6b, 0x54, 0x68, 0x0a, 0x79, 0x34, 0x6a, - 0x6a, 0x64, 0x76, 0x54, 0x5a, 0x65, 0x4c, 0x44, 0x56, 0x42, 0x6c, 0x75, - 0x65, 0x5a, 0x55, 0x54, 0x44, 0x52, 0x6d, 0x79, 0x32, 0x66, 0x65, 0x59, - 0x35, 0x61, 0x5a, 0x49, 0x55, 0x31, 0x38, 0x76, 0x46, 0x44, 0x4b, 0x30, - 0x38, 0x64, 0x54, 0x47, 0x30, 0x41, 0x38, 0x37, 0x70, 0x70, 0x70, 0x75, - 0x76, 0x31, 0x4c, 0x4e, 0x49, 0x52, 0x33, 0x6c, 0x6f, 0x76, 0x65, 0x55, - 0x38, 0x0a, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x45, 0x4e, 0x44, 0x20, 0x43, - 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2d, 0x2d, - 0x2d, 0x2d, 0x2d, 0x0a, 0x00}; + 0x6e, 0x62, 0x47, 0x55, 0x75, 0x59, 0x6d, 0x57, 0x43, 0x45, 0x69, 0x6f, + 0x75, 0x64, 0x47, 0x56, 0x7a, 0x64, 0x43, 0x35, 0x35, 0x62, 0x33, 0x56, + 0x30, 0x64, 0x57, 0x4a, 0x6c, 0x4c, 0x6d, 0x4e, 0x76, 0x62, 0x59, 0x63, + 0x45, 0x0a, 0x77, 0x4b, 0x67, 0x42, 0x41, 0x7a, 0x41, 0x4e, 0x42, 0x67, + 0x6b, 0x71, 0x68, 0x6b, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, + 0x73, 0x46, 0x41, 0x41, 0x4f, 0x43, 0x41, 0x51, 0x45, 0x41, 0x53, 0x38, + 0x68, 0x44, 0x51, 0x41, 0x38, 0x50, 0x53, 0x67, 0x69, 0x70, 0x67, 0x41, + 0x6d, 0x6c, 0x37, 0x51, 0x33, 0x2f, 0x64, 0x6a, 0x77, 0x51, 0x36, 0x34, + 0x34, 0x67, 0x68, 0x57, 0x51, 0x76, 0x0a, 0x43, 0x32, 0x4b, 0x62, 0x2b, + 0x72, 0x33, 0x30, 0x52, 0x43, 0x59, 0x31, 0x45, 0x79, 0x4b, 0x4e, 0x68, + 0x6e, 0x51, 0x6e, 0x49, 0x49, 0x68, 0x2f, 0x4f, 0x55, 0x62, 0x42, 0x5a, + 0x76, 0x68, 0x30, 0x4d, 0x30, 0x69, 0x59, 0x73, 0x79, 0x36, 0x78, 0x71, + 0x58, 0x67, 0x66, 0x44, 0x68, 0x43, 0x42, 0x39, 0x33, 0x41, 0x41, 0x36, + 0x6a, 0x30, 0x69, 0x35, 0x63, 0x53, 0x38, 0x66, 0x6b, 0x68, 0x48, 0x0a, + 0x4a, 0x6c, 0x34, 0x52, 0x4b, 0x30, 0x74, 0x53, 0x6b, 0x47, 0x51, 0x33, + 0x59, 0x4e, 0x59, 0x34, 0x4e, 0x7a, 0x58, 0x77, 0x51, 0x50, 0x2f, 0x76, + 0x6d, 0x55, 0x67, 0x66, 0x6b, 0x77, 0x38, 0x56, 0x42, 0x41, 0x5a, 0x34, + 0x59, 0x34, 0x47, 0x4b, 0x78, 0x70, 0x70, 0x64, 0x41, 0x54, 0x6a, 0x66, + 0x66, 0x49, 0x57, 0x2b, 0x73, 0x72, 0x62, 0x41, 0x6d, 0x64, 0x44, 0x72, + 0x75, 0x49, 0x52, 0x4d, 0x0a, 0x77, 0x50, 0x65, 0x69, 0x6b, 0x67, 0x4f, + 0x6f, 0x52, 0x72, 0x58, 0x66, 0x30, 0x4c, 0x41, 0x31, 0x66, 0x69, 0x34, + 0x54, 0x71, 0x78, 0x41, 0x52, 0x7a, 0x65, 0x52, 0x77, 0x65, 0x6e, 0x51, + 0x70, 0x61, 0x79, 0x4e, 0x66, 0x47, 0x48, 0x54, 0x76, 0x56, 0x46, 0x39, + 0x61, 0x4a, 0x6b, 0x6c, 0x38, 0x48, 0x6f, 0x61, 0x4d, 0x75, 0x6e, 0x54, + 0x41, 0x64, 0x47, 0x35, 0x70, 0x49, 0x56, 0x63, 0x72, 0x0a, 0x39, 0x47, + 0x4b, 0x69, 0x2f, 0x67, 0x45, 0x4d, 0x70, 0x58, 0x55, 0x4a, 0x62, 0x62, + 0x56, 0x76, 0x33, 0x55, 0x35, 0x66, 0x72, 0x58, 0x31, 0x57, 0x6f, 0x34, + 0x43, 0x46, 0x6f, 0x2b, 0x72, 0x5a, 0x57, 0x4a, 0x2f, 0x4c, 0x79, 0x43, + 0x4d, 0x65, 0x62, 0x30, 0x6a, 0x63, 0x69, 0x4e, 0x4c, 0x78, 0x53, 0x64, + 0x4d, 0x77, 0x6a, 0x2f, 0x45, 0x2f, 0x5a, 0x75, 0x45, 0x78, 0x6c, 0x79, + 0x65, 0x5a, 0x0a, 0x67, 0x63, 0x39, 0x63, 0x74, 0x50, 0x6a, 0x53, 0x4d, + 0x76, 0x67, 0x53, 0x79, 0x58, 0x45, 0x4b, 0x76, 0x36, 0x56, 0x77, 0x6f, + 0x62, 0x6c, 0x65, 0x65, 0x67, 0x38, 0x38, 0x56, 0x32, 0x5a, 0x67, 0x7a, + 0x65, 0x6e, 0x7a, 0x69, 0x4f, 0x52, 0x6f, 0x57, 0x6a, 0x34, 0x4b, 0x73, + 0x7a, 0x47, 0x2f, 0x6c, 0x62, 0x51, 0x5a, 0x76, 0x67, 0x3d, 0x3d, 0x0a, + 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x45, 0x4e, 0x44, 0x20, 0x43, 0x45, 0x52, + 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2d, 0x2d, 0x2d, 0x2d, + 0x2d, 0x0a}; diff --git a/test/core/end2end/data/server1_key.cc b/test/core/end2end/data/server1_key.cc index 8f3ad15c266..efca8670ec4 100644 --- a/test/core/end2end/data/server1_key.cc +++ b/test/core/end2end/data/server1_key.cc @@ -17,77 +17,146 @@ */ extern const char test_server1_key[] = { - 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x42, 0x45, 0x47, 0x49, 0x4e, 0x20, 0x52, - 0x53, 0x41, 0x20, 0x50, 0x52, 0x49, 0x56, 0x41, 0x54, 0x45, 0x20, 0x4b, - 0x45, 0x59, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, 0x4d, 0x49, 0x49, 0x43, - 0x57, 0x77, 0x49, 0x42, 0x41, 0x41, 0x4b, 0x42, 0x67, 0x51, 0x44, 0x68, - 0x77, 0x78, 0x55, 0x6e, 0x4b, 0x43, 0x77, 0x6c, 0x53, 0x61, 0x57, 0x41, - 0x77, 0x7a, 0x4f, 0x42, 0x32, 0x4c, 0x53, 0x48, 0x56, 0x65, 0x67, 0x4a, - 0x48, 0x76, 0x37, 0x44, 0x44, 0x57, 0x6d, 0x69, 0x6e, 0x54, 0x67, 0x34, - 0x77, 0x7a, 0x4c, 0x4c, 0x73, 0x66, 0x2b, 0x4c, 0x51, 0x38, 0x6e, 0x5a, - 0x0a, 0x62, 0x70, 0x6a, 0x66, 0x6e, 0x35, 0x76, 0x67, 0x49, 0x7a, 0x78, - 0x43, 0x75, 0x52, 0x68, 0x34, 0x52, 0x70, 0x39, 0x51, 0x59, 0x4d, 0x35, - 0x46, 0x68, 0x66, 0x72, 0x4a, 0x58, 0x39, 0x77, 0x63, 0x59, 0x61, 0x77, - 0x50, 0x2f, 0x48, 0x54, 0x62, 0x4a, 0x37, 0x70, 0x37, 0x4c, 0x56, 0x51, - 0x4f, 0x32, 0x51, 0x59, 0x41, 0x50, 0x2b, 0x61, 0x6b, 0x4d, 0x54, 0x48, - 0x78, 0x67, 0x4b, 0x75, 0x4d, 0x0a, 0x42, 0x7a, 0x56, 0x56, 0x2b, 0x2b, - 0x33, 0x77, 0x57, 0x54, 0x6f, 0x4b, 0x66, 0x56, 0x5a, 0x55, 0x6a, 0x46, - 0x58, 0x38, 0x6e, 0x66, 0x54, 0x66, 0x47, 0x4d, 0x47, 0x77, 0x57, 0x41, - 0x48, 0x4a, 0x44, 0x6e, 0x6c, 0x45, 0x47, 0x6e, 0x55, 0x34, 0x74, 0x6c, - 0x39, 0x55, 0x75, 0x6a, 0x6f, 0x43, 0x56, 0x34, 0x45, 0x4e, 0x4a, 0x74, - 0x7a, 0x46, 0x6f, 0x51, 0x49, 0x44, 0x41, 0x51, 0x41, 0x42, 0x0a, 0x41, - 0x6f, 0x47, 0x41, 0x4a, 0x2b, 0x36, 0x68, 0x70, 0x7a, 0x4e, 0x72, 0x32, - 0x34, 0x79, 0x54, 0x51, 0x5a, 0x74, 0x46, 0x57, 0x51, 0x70, 0x44, 0x70, - 0x45, 0x79, 0x46, 0x70, 0x6c, 0x64, 0x64, 0x4b, 0x4a, 0x4d, 0x4f, 0x78, - 0x44, 0x79, 0x61, 0x33, 0x53, 0x39, 0x70, 0x70, 0x4b, 0x33, 0x76, 0x54, - 0x57, 0x72, 0x49, 0x49, 0x54, 0x56, 0x32, 0x78, 0x4e, 0x63, 0x75, 0x63, - 0x77, 0x37, 0x49, 0x0a, 0x63, 0x65, 0x54, 0x62, 0x64, 0x79, 0x72, 0x47, - 0x73, 0x79, 0x6a, 0x73, 0x55, 0x30, 0x2f, 0x48, 0x64, 0x43, 0x63, 0x49, - 0x66, 0x39, 0x79, 0x6d, 0x32, 0x6a, 0x66, 0x6d, 0x47, 0x4c, 0x55, 0x77, - 0x6d, 0x79, 0x68, 0x6c, 0x74, 0x4b, 0x56, 0x77, 0x30, 0x51, 0x59, 0x63, - 0x46, 0x42, 0x30, 0x58, 0x4c, 0x6b, 0x63, 0x30, 0x6e, 0x49, 0x35, 0x59, - 0x76, 0x45, 0x59, 0x6f, 0x65, 0x56, 0x44, 0x67, 0x0a, 0x6f, 0x6d, 0x5a, - 0x49, 0x58, 0x6e, 0x31, 0x45, 0x33, 0x45, 0x57, 0x2b, 0x73, 0x53, 0x49, - 0x57, 0x53, 0x62, 0x6b, 0x4d, 0x75, 0x39, 0x62, 0x59, 0x32, 0x6b, 0x73, - 0x74, 0x4b, 0x58, 0x52, 0x32, 0x55, 0x5a, 0x6d, 0x4d, 0x67, 0x57, 0x44, - 0x74, 0x6d, 0x42, 0x45, 0x50, 0x4d, 0x61, 0x45, 0x43, 0x51, 0x51, 0x44, - 0x36, 0x79, 0x54, 0x34, 0x54, 0x41, 0x5a, 0x4d, 0x35, 0x68, 0x47, 0x42, - 0x62, 0x0a, 0x63, 0x69, 0x42, 0x4b, 0x67, 0x4d, 0x55, 0x50, 0x36, 0x50, - 0x77, 0x4f, 0x68, 0x50, 0x68, 0x4f, 0x4d, 0x50, 0x49, 0x76, 0x69, 0x6a, - 0x4f, 0x35, 0x30, 0x41, 0x69, 0x75, 0x36, 0x69, 0x75, 0x43, 0x56, 0x38, - 0x38, 0x6c, 0x31, 0x51, 0x49, 0x79, 0x33, 0x38, 0x67, 0x57, 0x56, 0x68, - 0x78, 0x6a, 0x4e, 0x72, 0x71, 0x36, 0x50, 0x33, 0x34, 0x36, 0x6a, 0x34, - 0x49, 0x42, 0x67, 0x2b, 0x6b, 0x42, 0x0a, 0x39, 0x61, 0x6c, 0x77, 0x70, - 0x43, 0x4f, 0x44, 0x41, 0x6b, 0x45, 0x41, 0x35, 0x6e, 0x53, 0x6e, 0x6d, - 0x39, 0x6b, 0x36, 0x79, 0x6b, 0x59, 0x65, 0x51, 0x57, 0x4e, 0x53, 0x30, - 0x66, 0x4e, 0x57, 0x69, 0x52, 0x69, 0x6e, 0x43, 0x64, 0x6c, 0x32, 0x33, - 0x41, 0x37, 0x75, 0x73, 0x44, 0x47, 0x53, 0x75, 0x4b, 0x4b, 0x6c, 0x6d, - 0x30, 0x31, 0x39, 0x69, 0x6f, 0x6d, 0x4a, 0x2f, 0x52, 0x67, 0x64, 0x0a, - 0x4d, 0x4b, 0x44, 0x4f, 0x70, 0x30, 0x71, 0x2f, 0x32, 0x4f, 0x6f, 0x73, - 0x74, 0x62, 0x74, 0x65, 0x4f, 0x57, 0x4d, 0x32, 0x4d, 0x52, 0x46, 0x66, - 0x34, 0x6a, 0x4d, 0x48, 0x33, 0x77, 0x79, 0x56, 0x43, 0x77, 0x4a, 0x41, - 0x66, 0x41, 0x64, 0x6a, 0x4a, 0x38, 0x73, 0x7a, 0x6f, 0x4e, 0x4b, 0x54, - 0x52, 0x53, 0x61, 0x67, 0x53, 0x62, 0x68, 0x39, 0x76, 0x57, 0x79, 0x67, - 0x6e, 0x42, 0x32, 0x76, 0x0a, 0x49, 0x42, 0x79, 0x63, 0x36, 0x6c, 0x34, - 0x54, 0x54, 0x75, 0x5a, 0x51, 0x4a, 0x52, 0x47, 0x7a, 0x43, 0x76, 0x65, - 0x61, 0x66, 0x7a, 0x39, 0x6c, 0x6f, 0x76, 0x75, 0x42, 0x33, 0x57, 0x6f, - 0x68, 0x43, 0x41, 0x42, 0x64, 0x51, 0x52, 0x64, 0x39, 0x75, 0x6b, 0x43, - 0x58, 0x4c, 0x32, 0x43, 0x70, 0x73, 0x45, 0x70, 0x71, 0x7a, 0x6b, 0x61, - 0x66, 0x4f, 0x51, 0x4a, 0x41, 0x4a, 0x55, 0x6a, 0x63, 0x0a, 0x55, 0x53, - 0x65, 0x64, 0x44, 0x6c, 0x71, 0x33, 0x7a, 0x47, 0x5a, 0x77, 0x59, 0x4d, - 0x31, 0x59, 0x77, 0x38, 0x64, 0x38, 0x52, 0x75, 0x69, 0x72, 0x42, 0x55, - 0x46, 0x5a, 0x4e, 0x71, 0x4a, 0x65, 0x6c, 0x59, 0x61, 0x69, 0x2b, 0x6e, - 0x52, 0x59, 0x43, 0x6c, 0x44, 0x6b, 0x52, 0x56, 0x46, 0x67, 0x62, 0x35, - 0x79, 0x6b, 0x73, 0x6f, 0x59, 0x79, 0x63, 0x62, 0x71, 0x35, 0x54, 0x78, - 0x47, 0x6f, 0x0a, 0x56, 0x65, 0x71, 0x4b, 0x4f, 0x76, 0x67, 0x50, 0x70, - 0x6a, 0x34, 0x52, 0x57, 0x50, 0x48, 0x6c, 0x4c, 0x77, 0x4a, 0x41, 0x47, - 0x55, 0x4d, 0x6b, 0x33, 0x62, 0x71, 0x54, 0x39, 0x31, 0x78, 0x42, 0x55, - 0x43, 0x6e, 0x4c, 0x52, 0x73, 0x2f, 0x76, 0x66, 0x6f, 0x43, 0x70, 0x48, - 0x70, 0x67, 0x36, 0x65, 0x79, 0x77, 0x51, 0x54, 0x42, 0x44, 0x41, 0x56, - 0x36, 0x78, 0x6b, 0x79, 0x7a, 0x34, 0x61, 0x0a, 0x52, 0x48, 0x33, 0x49, - 0x37, 0x2f, 0x2b, 0x79, 0x6a, 0x33, 0x5a, 0x78, 0x52, 0x32, 0x4a, 0x6f, - 0x57, 0x48, 0x67, 0x55, 0x77, 0x5a, 0x37, 0x6c, 0x5a, 0x6b, 0x31, 0x56, - 0x6e, 0x68, 0x66, 0x66, 0x46, 0x79, 0x65, 0x37, 0x53, 0x42, 0x58, 0x79, - 0x61, 0x67, 0x3d, 0x3d, 0x0a, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x45, 0x4e, - 0x44, 0x20, 0x52, 0x53, 0x41, 0x20, 0x50, 0x52, 0x49, 0x56, 0x41, 0x54, - 0x45, 0x20, 0x4b, 0x45, 0x59, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, 0x00}; + 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x42, 0x45, 0x47, 0x49, 0x4e, 0x20, 0x50, + 0x52, 0x49, 0x56, 0x41, 0x54, 0x45, 0x20, 0x4b, 0x45, 0x59, 0x2d, 0x2d, + 0x2d, 0x2d, 0x2d, 0x0a, 0x4d, 0x49, 0x49, 0x45, 0x76, 0x77, 0x49, 0x42, + 0x41, 0x44, 0x41, 0x4e, 0x42, 0x67, 0x6b, 0x71, 0x68, 0x6b, 0x69, 0x47, + 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x45, 0x46, 0x41, 0x41, 0x53, 0x43, + 0x42, 0x4b, 0x6b, 0x77, 0x67, 0x67, 0x53, 0x6c, 0x41, 0x67, 0x45, 0x41, + 0x41, 0x6f, 0x49, 0x42, 0x41, 0x51, 0x44, 0x6e, 0x45, 0x34, 0x34, 0x33, + 0x45, 0x6b, 0x6e, 0x78, 0x76, 0x78, 0x42, 0x71, 0x0a, 0x36, 0x2b, 0x68, + 0x76, 0x6e, 0x2f, 0x74, 0x30, 0x39, 0x68, 0x6c, 0x38, 0x68, 0x78, 0x33, + 0x36, 0x36, 0x45, 0x42, 0x59, 0x76, 0x5a, 0x6d, 0x56, 0x4d, 0x2f, 0x4e, + 0x43, 0x2b, 0x37, 0x69, 0x67, 0x58, 0x52, 0x41, 0x6a, 0x69, 0x4a, 0x69, + 0x41, 0x2f, 0x6d, 0x49, 0x61, 0x43, 0x76, 0x4c, 0x33, 0x4d, 0x53, 0x30, + 0x49, 0x7a, 0x35, 0x68, 0x42, 0x4c, 0x78, 0x53, 0x47, 0x49, 0x43, 0x55, + 0x2b, 0x0a, 0x57, 0x70, 0x72, 0x6f, 0x41, 0x33, 0x47, 0x43, 0x49, 0x46, + 0x49, 0x54, 0x49, 0x77, 0x63, 0x66, 0x2f, 0x45, 0x54, 0x79, 0x57, 0x6a, + 0x2f, 0x35, 0x78, 0x70, 0x67, 0x5a, 0x34, 0x41, 0x4b, 0x72, 0x4c, 0x72, + 0x6a, 0x51, 0x6d, 0x6d, 0x58, 0x38, 0x6d, 0x68, 0x77, 0x55, 0x61, 0x6a, + 0x66, 0x46, 0x33, 0x55, 0x76, 0x77, 0x4d, 0x4a, 0x72, 0x43, 0x4f, 0x56, + 0x71, 0x50, 0x70, 0x36, 0x37, 0x74, 0x0a, 0x50, 0x74, 0x50, 0x2b, 0x32, + 0x6b, 0x42, 0x58, 0x61, 0x71, 0x72, 0x58, 0x64, 0x76, 0x6e, 0x76, 0x58, + 0x52, 0x34, 0x31, 0x46, 0x73, 0x49, 0x42, 0x38, 0x56, 0x37, 0x7a, 0x49, + 0x41, 0x75, 0x49, 0x5a, 0x42, 0x36, 0x62, 0x48, 0x51, 0x68, 0x69, 0x47, + 0x56, 0x6c, 0x63, 0x31, 0x73, 0x67, 0x5a, 0x59, 0x73, 0x45, 0x32, 0x45, + 0x47, 0x47, 0x39, 0x57, 0x4d, 0x6d, 0x48, 0x74, 0x53, 0x38, 0x36, 0x0a, + 0x71, 0x6b, 0x41, 0x4f, 0x54, 0x6a, 0x47, 0x32, 0x58, 0x79, 0x6a, 0x6d, + 0x50, 0x54, 0x47, 0x41, 0x77, 0x68, 0x47, 0x44, 0x70, 0x59, 0x6b, 0x59, + 0x72, 0x70, 0x7a, 0x70, 0x39, 0x39, 0x49, 0x69, 0x44, 0x68, 0x34, 0x2f, + 0x56, 0x65, 0x61, 0x69, 0x38, 0x31, 0x68, 0x6e, 0x30, 0x73, 0x73, 0x51, + 0x6b, 0x62, 0x72, 0x79, 0x30, 0x58, 0x52, 0x44, 0x2f, 0x49, 0x67, 0x33, + 0x6a, 0x63, 0x48, 0x68, 0x0a, 0x32, 0x33, 0x57, 0x69, 0x72, 0x69, 0x50, + 0x4e, 0x4a, 0x30, 0x4a, 0x73, 0x62, 0x67, 0x58, 0x55, 0x53, 0x4c, 0x4b, + 0x52, 0x50, 0x5a, 0x4f, 0x62, 0x41, 0x39, 0x56, 0x67, 0x4f, 0x4c, 0x79, + 0x32, 0x61, 0x58, 0x6f, 0x4e, 0x38, 0x34, 0x49, 0x4d, 0x61, 0x65, 0x4b, + 0x33, 0x79, 0x79, 0x2b, 0x63, 0x77, 0x53, 0x59, 0x47, 0x2f, 0x39, 0x39, + 0x77, 0x39, 0x33, 0x66, 0x55, 0x5a, 0x4a, 0x74, 0x65, 0x0a, 0x4d, 0x58, + 0x77, 0x7a, 0x34, 0x6f, 0x59, 0x5a, 0x41, 0x67, 0x4d, 0x42, 0x41, 0x41, + 0x45, 0x43, 0x67, 0x67, 0x45, 0x42, 0x41, 0x49, 0x56, 0x6e, 0x32, 0x4e, + 0x63, 0x61, 0x69, 0x2b, 0x34, 0x78, 0x62, 0x48, 0x30, 0x4f, 0x4c, 0x57, + 0x63, 0x6b, 0x61, 0x62, 0x77, 0x67, 0x79, 0x4a, 0x34, 0x49, 0x4d, 0x39, + 0x72, 0x44, 0x63, 0x30, 0x4c, 0x49, 0x55, 0x33, 0x36, 0x38, 0x4f, 0x31, + 0x6b, 0x55, 0x0a, 0x6b, 0x6f, 0x61, 0x69, 0x73, 0x38, 0x71, 0x50, 0x39, + 0x64, 0x75, 0x6a, 0x41, 0x57, 0x67, 0x66, 0x6f, 0x68, 0x33, 0x73, 0x47, + 0x68, 0x2f, 0x59, 0x47, 0x67, 0x4b, 0x6e, 0x39, 0x36, 0x56, 0x6e, 0x73, + 0x5a, 0x6a, 0x4b, 0x48, 0x6c, 0x79, 0x4d, 0x67, 0x46, 0x2b, 0x72, 0x34, + 0x54, 0x61, 0x44, 0x4a, 0x6e, 0x33, 0x6b, 0x32, 0x72, 0x6c, 0x41, 0x4f, + 0x57, 0x63, 0x75, 0x72, 0x47, 0x6c, 0x6a, 0x0a, 0x31, 0x71, 0x61, 0x56, + 0x6c, 0x73, 0x56, 0x34, 0x48, 0x69, 0x45, 0x7a, 0x70, 0x37, 0x70, 0x78, + 0x69, 0x44, 0x6d, 0x48, 0x68, 0x57, 0x76, 0x70, 0x34, 0x36, 0x37, 0x32, + 0x42, 0x62, 0x36, 0x69, 0x42, 0x47, 0x2b, 0x62, 0x73, 0x6a, 0x43, 0x55, + 0x4f, 0x45, 0x6b, 0x2f, 0x6e, 0x39, 0x6f, 0x39, 0x4b, 0x68, 0x5a, 0x7a, + 0x49, 0x42, 0x6c, 0x75, 0x52, 0x68, 0x74, 0x78, 0x43, 0x6d, 0x77, 0x35, + 0x0a, 0x6e, 0x77, 0x34, 0x44, 0x6f, 0x37, 0x7a, 0x30, 0x30, 0x50, 0x54, + 0x76, 0x4e, 0x38, 0x31, 0x32, 0x36, 0x30, 0x75, 0x50, 0x57, 0x53, 0x63, + 0x30, 0x34, 0x49, 0x72, 0x79, 0x74, 0x76, 0x5a, 0x55, 0x69, 0x41, 0x49, + 0x78, 0x2f, 0x35, 0x71, 0x78, 0x44, 0x37, 0x32, 0x62, 0x69, 0x6a, 0x32, + 0x78, 0x4a, 0x38, 0x74, 0x2f, 0x49, 0x39, 0x47, 0x49, 0x38, 0x67, 0x34, + 0x46, 0x74, 0x6f, 0x56, 0x42, 0x0a, 0x38, 0x70, 0x42, 0x36, 0x53, 0x2f, + 0x68, 0x4a, 0x58, 0x31, 0x50, 0x5a, 0x68, 0x68, 0x39, 0x56, 0x6c, 0x55, + 0x36, 0x59, 0x6b, 0x2b, 0x54, 0x4f, 0x66, 0x4f, 0x56, 0x6e, 0x62, 0x65, + 0x62, 0x47, 0x34, 0x57, 0x35, 0x31, 0x33, 0x38, 0x4c, 0x6b, 0x42, 0x38, + 0x33, 0x35, 0x65, 0x71, 0x6b, 0x33, 0x5a, 0x7a, 0x30, 0x71, 0x73, 0x62, + 0x63, 0x32, 0x65, 0x75, 0x6f, 0x69, 0x38, 0x48, 0x78, 0x69, 0x0a, 0x79, + 0x31, 0x56, 0x47, 0x77, 0x51, 0x45, 0x6d, 0x4d, 0x51, 0x36, 0x33, 0x6a, + 0x58, 0x7a, 0x34, 0x63, 0x36, 0x67, 0x2b, 0x58, 0x35, 0x35, 0x69, 0x66, + 0x76, 0x55, 0x4b, 0x39, 0x4a, 0x70, 0x6e, 0x35, 0x45, 0x38, 0x70, 0x71, + 0x2b, 0x70, 0x4d, 0x64, 0x37, 0x45, 0x43, 0x67, 0x59, 0x45, 0x41, 0x39, + 0x33, 0x6c, 0x59, 0x71, 0x2b, 0x43, 0x72, 0x35, 0x34, 0x4b, 0x34, 0x65, + 0x79, 0x35, 0x74, 0x0a, 0x73, 0x57, 0x4d, 0x61, 0x2b, 0x79, 0x65, 0x35, + 0x52, 0x71, 0x78, 0x6a, 0x7a, 0x67, 0x58, 0x6a, 0x32, 0x4b, 0x71, 0x72, + 0x35, 0x35, 0x6a, 0x62, 0x35, 0x34, 0x56, 0x57, 0x47, 0x37, 0x77, 0x70, + 0x32, 0x69, 0x47, 0x62, 0x67, 0x38, 0x46, 0x4d, 0x6c, 0x6b, 0x51, 0x77, + 0x7a, 0x54, 0x4a, 0x77, 0x65, 0x62, 0x7a, 0x44, 0x79, 0x43, 0x53, 0x61, + 0x74, 0x67, 0x75, 0x45, 0x5a, 0x4c, 0x75, 0x42, 0x0a, 0x67, 0x52, 0x47, + 0x72, 0x6f, 0x52, 0x6e, 0x73, 0x55, 0x4f, 0x79, 0x39, 0x76, 0x42, 0x76, + 0x68, 0x4b, 0x50, 0x4f, 0x63, 0x68, 0x39, 0x62, 0x66, 0x4b, 0x49, 0x6c, + 0x36, 0x71, 0x4f, 0x67, 0x7a, 0x4d, 0x4a, 0x42, 0x32, 0x36, 0x37, 0x66, + 0x42, 0x56, 0x57, 0x78, 0x35, 0x79, 0x62, 0x6e, 0x52, 0x62, 0x57, 0x4e, + 0x2f, 0x49, 0x37, 0x52, 0x76, 0x4d, 0x51, 0x66, 0x33, 0x6b, 0x2b, 0x39, + 0x79, 0x0a, 0x62, 0x69, 0x43, 0x49, 0x56, 0x6e, 0x78, 0x44, 0x4c, 0x45, + 0x45, 0x59, 0x79, 0x78, 0x37, 0x7a, 0x38, 0x35, 0x2f, 0x35, 0x71, 0x78, + 0x73, 0x58, 0x67, 0x2f, 0x4d, 0x43, 0x67, 0x59, 0x45, 0x41, 0x37, 0x77, + 0x6d, 0x57, 0x4b, 0x74, 0x43, 0x54, 0x6e, 0x30, 0x33, 0x32, 0x48, 0x79, + 0x39, 0x50, 0x38, 0x4f, 0x4c, 0x34, 0x39, 0x54, 0x30, 0x58, 0x36, 0x5a, + 0x38, 0x46, 0x6c, 0x6b, 0x44, 0x43, 0x0a, 0x52, 0x6b, 0x34, 0x32, 0x79, + 0x67, 0x72, 0x63, 0x2f, 0x4d, 0x55, 0x62, 0x75, 0x67, 0x71, 0x39, 0x52, + 0x47, 0x55, 0x78, 0x63, 0x43, 0x78, 0x6f, 0x49, 0x6d, 0x4f, 0x47, 0x39, + 0x4a, 0x58, 0x55, 0x70, 0x45, 0x74, 0x55, 0x65, 0x33, 0x31, 0x59, 0x44, + 0x6d, 0x32, 0x6a, 0x2b, 0x2f, 0x6e, 0x62, 0x76, 0x72, 0x6a, 0x6c, 0x36, + 0x2f, 0x62, 0x50, 0x32, 0x71, 0x57, 0x73, 0x30, 0x56, 0x37, 0x6c, 0x0a, + 0x64, 0x54, 0x4a, 0x6c, 0x36, 0x64, 0x41, 0x42, 0x50, 0x35, 0x31, 0x70, + 0x43, 0x77, 0x38, 0x2b, 0x6c, 0x34, 0x63, 0x57, 0x67, 0x42, 0x42, 0x58, + 0x30, 0x38, 0x4c, 0x6b, 0x65, 0x65, 0x6e, 0x38, 0x31, 0x32, 0x41, 0x41, + 0x46, 0x4e, 0x72, 0x6a, 0x6d, 0x44, 0x43, 0x6a, 0x58, 0x36, 0x72, 0x48, + 0x6a, 0x57, 0x48, 0x4c, 0x4a, 0x63, 0x70, 0x53, 0x31, 0x38, 0x66, 0x6e, + 0x52, 0x52, 0x6b, 0x50, 0x0a, 0x56, 0x31, 0x64, 0x2f, 0x41, 0x48, 0x57, + 0x58, 0x37, 0x4d, 0x4d, 0x43, 0x67, 0x59, 0x45, 0x41, 0x36, 0x47, 0x73, + 0x77, 0x32, 0x67, 0x75, 0x68, 0x70, 0x30, 0x5a, 0x66, 0x32, 0x47, 0x43, + 0x63, 0x61, 0x4e, 0x4b, 0x35, 0x44, 0x6c, 0x51, 0x61, 0x62, 0x38, 0x4f, + 0x4c, 0x34, 0x48, 0x77, 0x72, 0x70, 0x74, 0x74, 0x7a, 0x6f, 0x34, 0x6b, + 0x75, 0x54, 0x6c, 0x77, 0x74, 0x71, 0x4e, 0x4b, 0x70, 0x0a, 0x51, 0x39, + 0x48, 0x34, 0x61, 0x6c, 0x39, 0x71, 0x66, 0x46, 0x34, 0x43, 0x72, 0x31, + 0x54, 0x46, 0x79, 0x61, 0x39, 0x38, 0x2b, 0x45, 0x56, 0x59, 0x66, 0x38, + 0x79, 0x46, 0x52, 0x4d, 0x33, 0x4e, 0x4c, 0x4e, 0x6a, 0x5a, 0x70, 0x65, + 0x33, 0x67, 0x77, 0x59, 0x66, 0x32, 0x45, 0x65, 0x72, 0x6c, 0x4a, 0x6a, + 0x37, 0x56, 0x4c, 0x63, 0x61, 0x68, 0x77, 0x30, 0x4b, 0x4b, 0x7a, 0x6f, + 0x4e, 0x31, 0x0a, 0x51, 0x42, 0x45, 0x4e, 0x66, 0x77, 0x67, 0x50, 0x4c, + 0x52, 0x6b, 0x35, 0x73, 0x44, 0x6b, 0x78, 0x39, 0x56, 0x68, 0x53, 0x6d, + 0x63, 0x66, 0x6c, 0x2f, 0x64, 0x69, 0x4c, 0x72, 0x6f, 0x5a, 0x64, 0x70, + 0x41, 0x77, 0x74, 0x76, 0x33, 0x76, 0x6f, 0x34, 0x6e, 0x45, 0x6f, 0x78, + 0x65, 0x75, 0x47, 0x46, 0x62, 0x4b, 0x54, 0x47, 0x78, 0x33, 0x51, 0x6b, + 0x66, 0x30, 0x43, 0x67, 0x59, 0x45, 0x41, 0x0a, 0x78, 0x79, 0x52, 0x2b, + 0x64, 0x63, 0x62, 0x30, 0x35, 0x59, 0x67, 0x6d, 0x33, 0x77, 0x34, 0x6b, + 0x6c, 0x48, 0x51, 0x54, 0x6f, 0x77, 0x51, 0x31, 0x30, 0x73, 0x31, 0x48, + 0x38, 0x30, 0x69, 0x61, 0x55, 0x63, 0x5a, 0x42, 0x67, 0x51, 0x75, 0x52, + 0x31, 0x67, 0x68, 0x45, 0x74, 0x44, 0x62, 0x55, 0x50, 0x5a, 0x48, 0x73, + 0x6f, 0x52, 0x35, 0x74, 0x31, 0x78, 0x43, 0x42, 0x30, 0x32, 0x79, 0x73, + 0x0a, 0x44, 0x67, 0x41, 0x77, 0x4c, 0x76, 0x31, 0x62, 0x43, 0x68, 0x49, + 0x76, 0x78, 0x76, 0x48, 0x2f, 0x4c, 0x36, 0x4b, 0x4d, 0x38, 0x6f, 0x76, + 0x5a, 0x32, 0x4c, 0x65, 0x6b, 0x42, 0x58, 0x34, 0x41, 0x76, 0x69, 0x57, + 0x78, 0x6f, 0x42, 0x78, 0x4a, 0x6e, 0x66, 0x7a, 0x2f, 0x45, 0x56, 0x61, + 0x75, 0x39, 0x38, 0x42, 0x30, 0x62, 0x31, 0x61, 0x75, 0x52, 0x4e, 0x36, + 0x65, 0x53, 0x43, 0x38, 0x33, 0x0a, 0x46, 0x52, 0x75, 0x47, 0x6c, 0x64, + 0x6c, 0x53, 0x4f, 0x57, 0x31, 0x7a, 0x2f, 0x6e, 0x53, 0x68, 0x38, 0x56, + 0x69, 0x69, 0x7a, 0x53, 0x59, 0x45, 0x35, 0x48, 0x35, 0x48, 0x58, 0x31, + 0x71, 0x6b, 0x58, 0x45, 0x69, 0x70, 0x70, 0x76, 0x46, 0x52, 0x45, 0x38, + 0x38, 0x43, 0x67, 0x59, 0x42, 0x33, 0x42, 0x66, 0x75, 0x33, 0x59, 0x51, + 0x59, 0x36, 0x30, 0x49, 0x54, 0x57, 0x49, 0x53, 0x68, 0x76, 0x0a, 0x6e, + 0x4e, 0x6b, 0x64, 0x63, 0x62, 0x54, 0x54, 0x39, 0x65, 0x6f, 0x50, 0x39, + 0x73, 0x75, 0x61, 0x52, 0x4a, 0x6a, 0x77, 0x39, 0x32, 0x4c, 0x6e, 0x2b, + 0x37, 0x5a, 0x70, 0x41, 0x4c, 0x59, 0x6c, 0x51, 0x4d, 0x4b, 0x55, 0x5a, + 0x6d, 0x4a, 0x2f, 0x35, 0x75, 0x42, 0x6d, 0x4c, 0x73, 0x34, 0x52, 0x46, + 0x77, 0x55, 0x54, 0x51, 0x72, 0x75, 0x4c, 0x4f, 0x50, 0x4c, 0x34, 0x79, + 0x4c, 0x54, 0x48, 0x0a, 0x61, 0x77, 0x41, 0x44, 0x57, 0x55, 0x7a, 0x73, + 0x33, 0x49, 0x52, 0x72, 0x31, 0x66, 0x77, 0x6e, 0x39, 0x45, 0x2b, 0x7a, + 0x4d, 0x38, 0x4a, 0x56, 0x79, 0x4b, 0x43, 0x6e, 0x55, 0x45, 0x4d, 0x33, + 0x77, 0x34, 0x4e, 0x35, 0x55, 0x5a, 0x73, 0x6b, 0x47, 0x4f, 0x32, 0x6b, + 0x6c, 0x61, 0x73, 0x68, 0x41, 0x64, 0x33, 0x30, 0x68, 0x57, 0x4f, 0x2b, + 0x6b, 0x6e, 0x52, 0x76, 0x2f, 0x79, 0x30, 0x72, 0x0a, 0x75, 0x47, 0x49, + 0x59, 0x73, 0x39, 0x45, 0x6b, 0x37, 0x59, 0x58, 0x6c, 0x58, 0x49, 0x52, + 0x56, 0x72, 0x7a, 0x4d, 0x77, 0x63, 0x73, 0x72, 0x74, 0x31, 0x77, 0x3d, + 0x3d, 0x0a, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x45, 0x4e, 0x44, 0x20, 0x50, + 0x52, 0x49, 0x56, 0x41, 0x54, 0x45, 0x20, 0x4b, 0x45, 0x59, 0x2d, 0x2d, + 0x2d, 0x2d, 0x2d, 0x0a}; diff --git a/test/core/end2end/data/test_root_cert.cc b/test/core/end2end/data/test_root_cert.cc index b4771b2cb8d..3fbe7e74cee 100644 --- a/test/core/end2end/data/test_root_cert.cc +++ b/test/core/end2end/data/test_root_cert.cc @@ -19,68 +19,103 @@ extern const char test_root_cert[] = { 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x42, 0x45, 0x47, 0x49, 0x4e, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2d, 0x2d, - 0x2d, 0x2d, 0x2d, 0x0a, 0x4d, 0x49, 0x49, 0x43, 0x49, 0x7a, 0x43, 0x43, - 0x41, 0x59, 0x77, 0x43, 0x43, 0x51, 0x43, 0x46, 0x54, 0x62, 0x46, 0x37, - 0x58, 0x4e, 0x53, 0x76, 0x76, 0x6a, 0x41, 0x4e, 0x42, 0x67, 0x6b, 0x71, - 0x68, 0x6b, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x55, 0x46, - 0x41, 0x44, 0x42, 0x57, 0x4d, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, - 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4a, 0x42, 0x0a, 0x56, 0x54, 0x45, - 0x54, 0x4d, 0x42, 0x45, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x41, 0x77, - 0x4b, 0x55, 0x32, 0x39, 0x74, 0x5a, 0x53, 0x31, 0x54, 0x64, 0x47, 0x46, - 0x30, 0x5a, 0x54, 0x45, 0x68, 0x4d, 0x42, 0x38, 0x47, 0x41, 0x31, 0x55, - 0x45, 0x43, 0x67, 0x77, 0x59, 0x53, 0x57, 0x35, 0x30, 0x5a, 0x58, 0x4a, - 0x75, 0x5a, 0x58, 0x51, 0x67, 0x56, 0x32, 0x6c, 0x6b, 0x5a, 0x32, 0x6c, - 0x30, 0x0a, 0x63, 0x79, 0x42, 0x51, 0x64, 0x48, 0x6b, 0x67, 0x54, 0x48, - 0x52, 0x6b, 0x4d, 0x51, 0x38, 0x77, 0x44, 0x51, 0x59, 0x44, 0x56, 0x51, - 0x51, 0x44, 0x44, 0x41, 0x5a, 0x30, 0x5a, 0x58, 0x4e, 0x30, 0x59, 0x32, - 0x45, 0x77, 0x48, 0x68, 0x63, 0x4e, 0x4d, 0x54, 0x51, 0x77, 0x4e, 0x7a, - 0x45, 0x33, 0x4d, 0x6a, 0x4d, 0x78, 0x4e, 0x7a, 0x55, 0x78, 0x57, 0x68, - 0x63, 0x4e, 0x4d, 0x6a, 0x51, 0x77, 0x0a, 0x4e, 0x7a, 0x45, 0x30, 0x4d, - 0x6a, 0x4d, 0x78, 0x4e, 0x7a, 0x55, 0x78, 0x57, 0x6a, 0x42, 0x57, 0x4d, - 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x45, - 0x77, 0x4a, 0x42, 0x56, 0x54, 0x45, 0x54, 0x4d, 0x42, 0x45, 0x47, 0x41, - 0x31, 0x55, 0x45, 0x43, 0x41, 0x77, 0x4b, 0x55, 0x32, 0x39, 0x74, 0x5a, - 0x53, 0x31, 0x54, 0x64, 0x47, 0x46, 0x30, 0x5a, 0x54, 0x45, 0x68, 0x0a, - 0x4d, 0x42, 0x38, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x67, 0x77, 0x59, - 0x53, 0x57, 0x35, 0x30, 0x5a, 0x58, 0x4a, 0x75, 0x5a, 0x58, 0x51, 0x67, - 0x56, 0x32, 0x6c, 0x6b, 0x5a, 0x32, 0x6c, 0x30, 0x63, 0x79, 0x42, 0x51, - 0x64, 0x48, 0x6b, 0x67, 0x54, 0x48, 0x52, 0x6b, 0x4d, 0x51, 0x38, 0x77, - 0x44, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x44, 0x41, 0x5a, 0x30, - 0x5a, 0x58, 0x4e, 0x30, 0x0a, 0x59, 0x32, 0x45, 0x77, 0x67, 0x5a, 0x38, - 0x77, 0x44, 0x51, 0x59, 0x4a, 0x4b, 0x6f, 0x5a, 0x49, 0x68, 0x76, 0x63, - 0x4e, 0x41, 0x51, 0x45, 0x42, 0x42, 0x51, 0x41, 0x44, 0x67, 0x59, 0x30, - 0x41, 0x4d, 0x49, 0x47, 0x4a, 0x41, 0x6f, 0x47, 0x42, 0x41, 0x4d, 0x42, - 0x41, 0x33, 0x77, 0x56, 0x65, 0x54, 0x47, 0x48, 0x5a, 0x52, 0x31, 0x52, - 0x79, 0x65, 0x2f, 0x69, 0x2b, 0x4a, 0x38, 0x61, 0x32, 0x0a, 0x63, 0x75, - 0x35, 0x67, 0x58, 0x77, 0x46, 0x56, 0x36, 0x54, 0x6e, 0x4f, 0x62, 0x7a, - 0x47, 0x4d, 0x37, 0x62, 0x4c, 0x46, 0x43, 0x4f, 0x35, 0x69, 0x39, 0x76, - 0x34, 0x6d, 0x4c, 0x6f, 0x34, 0x69, 0x46, 0x7a, 0x50, 0x73, 0x48, 0x6d, - 0x57, 0x44, 0x55, 0x78, 0x4b, 0x53, 0x33, 0x59, 0x38, 0x69, 0x58, 0x62, - 0x75, 0x30, 0x65, 0x59, 0x42, 0x6c, 0x4c, 0x6f, 0x4e, 0x59, 0x30, 0x6c, - 0x53, 0x76, 0x0a, 0x78, 0x44, 0x78, 0x33, 0x33, 0x4f, 0x2b, 0x44, 0x75, - 0x77, 0x4d, 0x6d, 0x56, 0x4e, 0x2b, 0x44, 0x7a, 0x53, 0x44, 0x2b, 0x45, - 0x6f, 0x64, 0x39, 0x7a, 0x66, 0x76, 0x77, 0x4f, 0x57, 0x48, 0x73, 0x61, - 0x7a, 0x59, 0x43, 0x5a, 0x54, 0x32, 0x50, 0x68, 0x4e, 0x78, 0x6e, 0x56, - 0x57, 0x49, 0x75, 0x4a, 0x58, 0x56, 0x69, 0x59, 0x34, 0x4a, 0x41, 0x48, - 0x55, 0x47, 0x6f, 0x64, 0x6a, 0x78, 0x2b, 0x0a, 0x51, 0x41, 0x69, 0x36, - 0x79, 0x43, 0x41, 0x75, 0x72, 0x55, 0x5a, 0x47, 0x76, 0x59, 0x58, 0x47, - 0x67, 0x5a, 0x53, 0x42, 0x41, 0x67, 0x4d, 0x42, 0x41, 0x41, 0x45, 0x77, - 0x44, 0x51, 0x59, 0x4a, 0x4b, 0x6f, 0x5a, 0x49, 0x68, 0x76, 0x63, 0x4e, - 0x41, 0x51, 0x45, 0x46, 0x42, 0x51, 0x41, 0x44, 0x67, 0x59, 0x45, 0x41, - 0x51, 0x6f, 0x51, 0x56, 0x44, 0x38, 0x62, 0x77, 0x64, 0x74, 0x57, 0x4a, - 0x0a, 0x41, 0x6e, 0x69, 0x47, 0x42, 0x77, 0x63, 0x43, 0x66, 0x71, 0x59, - 0x79, 0x48, 0x2b, 0x2f, 0x4b, 0x70, 0x41, 0x31, 0x30, 0x41, 0x63, 0x65, - 0x62, 0x4a, 0x56, 0x56, 0x54, 0x79, 0x59, 0x62, 0x59, 0x76, 0x49, 0x39, - 0x51, 0x38, 0x64, 0x36, 0x52, 0x53, 0x56, 0x75, 0x34, 0x50, 0x5a, 0x79, - 0x39, 0x4f, 0x41, 0x4c, 0x48, 0x52, 0x2f, 0x51, 0x72, 0x57, 0x42, 0x64, - 0x59, 0x54, 0x41, 0x79, 0x7a, 0x0a, 0x66, 0x4e, 0x41, 0x6d, 0x63, 0x32, - 0x63, 0x6d, 0x64, 0x6b, 0x53, 0x52, 0x4a, 0x7a, 0x6a, 0x68, 0x49, 0x61, - 0x4f, 0x73, 0x74, 0x6e, 0x51, 0x79, 0x31, 0x4a, 0x2b, 0x46, 0x6b, 0x30, - 0x54, 0x39, 0x58, 0x79, 0x76, 0x51, 0x74, 0x71, 0x34, 0x39, 0x39, 0x79, - 0x46, 0x62, 0x71, 0x39, 0x78, 0x6f, 0x67, 0x55, 0x56, 0x6c, 0x45, 0x47, - 0x48, 0x36, 0x32, 0x78, 0x50, 0x36, 0x76, 0x48, 0x30, 0x59, 0x0a, 0x35, - 0x75, 0x6b, 0x4b, 0x2f, 0x2f, 0x64, 0x43, 0x50, 0x41, 0x7a, 0x41, 0x31, - 0x31, 0x59, 0x75, 0x58, 0x32, 0x72, 0x6e, 0x65, 0x78, 0x30, 0x4a, 0x68, - 0x75, 0x54, 0x51, 0x66, 0x63, 0x49, 0x3d, 0x0a, 0x2d, 0x2d, 0x2d, 0x2d, - 0x2d, 0x45, 0x4e, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, - 0x43, 0x41, 0x54, 0x45, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, 0x00}; + 0x2d, 0x2d, 0x2d, 0x0a, 0x4d, 0x49, 0x49, 0x44, 0x57, 0x6a, 0x43, 0x43, + 0x41, 0x6b, 0x4b, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x55, + 0x57, 0x72, 0x50, 0x30, 0x56, 0x76, 0x48, 0x63, 0x79, 0x2b, 0x4c, 0x50, + 0x36, 0x55, 0x75, 0x59, 0x4e, 0x74, 0x69, 0x4c, 0x39, 0x67, 0x42, 0x68, + 0x44, 0x35, 0x6f, 0x77, 0x44, 0x51, 0x59, 0x4a, 0x4b, 0x6f, 0x5a, 0x49, + 0x68, 0x76, 0x63, 0x4e, 0x41, 0x51, 0x45, 0x4c, 0x0a, 0x42, 0x51, 0x41, + 0x77, 0x56, 0x6a, 0x45, 0x4c, 0x4d, 0x41, 0x6b, 0x47, 0x41, 0x31, 0x55, + 0x45, 0x42, 0x68, 0x4d, 0x43, 0x51, 0x56, 0x55, 0x78, 0x45, 0x7a, 0x41, + 0x52, 0x42, 0x67, 0x4e, 0x56, 0x42, 0x41, 0x67, 0x4d, 0x43, 0x6c, 0x4e, + 0x76, 0x62, 0x57, 0x55, 0x74, 0x55, 0x33, 0x52, 0x68, 0x64, 0x47, 0x55, + 0x78, 0x49, 0x54, 0x41, 0x66, 0x42, 0x67, 0x4e, 0x56, 0x42, 0x41, 0x6f, + 0x4d, 0x0a, 0x47, 0x45, 0x6c, 0x75, 0x64, 0x47, 0x56, 0x79, 0x62, 0x6d, + 0x56, 0x30, 0x49, 0x46, 0x64, 0x70, 0x5a, 0x47, 0x64, 0x70, 0x64, 0x48, + 0x4d, 0x67, 0x55, 0x48, 0x52, 0x35, 0x49, 0x45, 0x78, 0x30, 0x5a, 0x44, + 0x45, 0x50, 0x4d, 0x41, 0x30, 0x47, 0x41, 0x31, 0x55, 0x45, 0x41, 0x77, + 0x77, 0x47, 0x64, 0x47, 0x56, 0x7a, 0x64, 0x47, 0x4e, 0x68, 0x4d, 0x42, + 0x34, 0x58, 0x44, 0x54, 0x49, 0x77, 0x0a, 0x4d, 0x44, 0x4d, 0x78, 0x4e, + 0x7a, 0x45, 0x34, 0x4e, 0x54, 0x6b, 0x31, 0x4d, 0x56, 0x6f, 0x58, 0x44, + 0x54, 0x4d, 0x77, 0x4d, 0x44, 0x4d, 0x78, 0x4e, 0x54, 0x45, 0x34, 0x4e, + 0x54, 0x6b, 0x31, 0x4d, 0x56, 0x6f, 0x77, 0x56, 0x6a, 0x45, 0x4c, 0x4d, + 0x41, 0x6b, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4d, 0x43, 0x51, + 0x56, 0x55, 0x78, 0x45, 0x7a, 0x41, 0x52, 0x42, 0x67, 0x4e, 0x56, 0x0a, + 0x42, 0x41, 0x67, 0x4d, 0x43, 0x6c, 0x4e, 0x76, 0x62, 0x57, 0x55, 0x74, + 0x55, 0x33, 0x52, 0x68, 0x64, 0x47, 0x55, 0x78, 0x49, 0x54, 0x41, 0x66, + 0x42, 0x67, 0x4e, 0x56, 0x42, 0x41, 0x6f, 0x4d, 0x47, 0x45, 0x6c, 0x75, + 0x64, 0x47, 0x56, 0x79, 0x62, 0x6d, 0x56, 0x30, 0x49, 0x46, 0x64, 0x70, + 0x5a, 0x47, 0x64, 0x70, 0x64, 0x48, 0x4d, 0x67, 0x55, 0x48, 0x52, 0x35, + 0x49, 0x45, 0x78, 0x30, 0x0a, 0x5a, 0x44, 0x45, 0x50, 0x4d, 0x41, 0x30, + 0x47, 0x41, 0x31, 0x55, 0x45, 0x41, 0x77, 0x77, 0x47, 0x64, 0x47, 0x56, + 0x7a, 0x64, 0x47, 0x4e, 0x68, 0x4d, 0x49, 0x49, 0x42, 0x49, 0x6a, 0x41, + 0x4e, 0x42, 0x67, 0x6b, 0x71, 0x68, 0x6b, 0x69, 0x47, 0x39, 0x77, 0x30, + 0x42, 0x41, 0x51, 0x45, 0x46, 0x41, 0x41, 0x4f, 0x43, 0x41, 0x51, 0x38, + 0x41, 0x4d, 0x49, 0x49, 0x42, 0x43, 0x67, 0x4b, 0x43, 0x0a, 0x41, 0x51, + 0x45, 0x41, 0x73, 0x47, 0x4c, 0x30, 0x6f, 0x58, 0x66, 0x6c, 0x46, 0x30, + 0x4c, 0x7a, 0x6f, 0x4d, 0x2b, 0x42, 0x68, 0x2b, 0x71, 0x55, 0x55, 0x39, + 0x79, 0x68, 0x71, 0x7a, 0x77, 0x32, 0x77, 0x38, 0x4f, 0x4f, 0x58, 0x35, + 0x6d, 0x75, 0x2f, 0x69, 0x4e, 0x43, 0x79, 0x55, 0x4f, 0x42, 0x72, 0x71, + 0x61, 0x48, 0x69, 0x37, 0x6d, 0x47, 0x48, 0x78, 0x37, 0x33, 0x47, 0x44, + 0x30, 0x31, 0x0a, 0x64, 0x69, 0x4e, 0x7a, 0x43, 0x7a, 0x76, 0x6c, 0x63, + 0x51, 0x71, 0x64, 0x4e, 0x49, 0x48, 0x36, 0x4e, 0x51, 0x53, 0x4c, 0x37, + 0x44, 0x54, 0x70, 0x42, 0x6a, 0x63, 0x61, 0x36, 0x36, 0x6a, 0x59, 0x54, + 0x39, 0x75, 0x37, 0x33, 0x76, 0x5a, 0x65, 0x32, 0x4d, 0x44, 0x72, 0x72, + 0x31, 0x6e, 0x56, 0x62, 0x75, 0x4c, 0x76, 0x66, 0x75, 0x39, 0x38, 0x35, + 0x30, 0x63, 0x64, 0x78, 0x69, 0x55, 0x4f, 0x0a, 0x49, 0x6e, 0x76, 0x35, + 0x78, 0x66, 0x38, 0x2b, 0x73, 0x54, 0x48, 0x47, 0x30, 0x43, 0x2b, 0x61, + 0x2b, 0x56, 0x41, 0x76, 0x4d, 0x68, 0x73, 0x4c, 0x69, 0x52, 0x6a, 0x73, + 0x71, 0x2b, 0x6c, 0x58, 0x4b, 0x52, 0x4a, 0x79, 0x6b, 0x35, 0x7a, 0x6b, + 0x62, 0x62, 0x73, 0x45, 0x54, 0x79, 0x62, 0x71, 0x70, 0x78, 0x6f, 0x4a, + 0x2b, 0x4b, 0x37, 0x43, 0x6f, 0x53, 0x79, 0x33, 0x79, 0x63, 0x2f, 0x6b, + 0x0a, 0x51, 0x49, 0x59, 0x33, 0x54, 0x69, 0x70, 0x77, 0x45, 0x74, 0x77, + 0x6b, 0x4b, 0x50, 0x34, 0x68, 0x7a, 0x79, 0x6f, 0x36, 0x4b, 0x69, 0x47, + 0x64, 0x2f, 0x44, 0x50, 0x65, 0x78, 0x69, 0x65, 0x34, 0x6e, 0x42, 0x55, + 0x49, 0x6e, 0x4e, 0x33, 0x62, 0x53, 0x31, 0x42, 0x55, 0x65, 0x4e, 0x5a, + 0x35, 0x7a, 0x65, 0x61, 0x49, 0x43, 0x32, 0x65, 0x67, 0x33, 0x62, 0x6b, + 0x65, 0x65, 0x57, 0x37, 0x63, 0x0a, 0x71, 0x54, 0x35, 0x35, 0x62, 0x2b, + 0x59, 0x65, 0x6e, 0x36, 0x43, 0x78, 0x59, 0x30, 0x54, 0x45, 0x6b, 0x7a, + 0x42, 0x4b, 0x36, 0x41, 0x4b, 0x74, 0x2f, 0x57, 0x55, 0x69, 0x61, 0x6c, + 0x4b, 0x4d, 0x67, 0x54, 0x30, 0x77, 0x62, 0x54, 0x78, 0x52, 0x5a, 0x4f, + 0x37, 0x6b, 0x55, 0x43, 0x48, 0x33, 0x53, 0x71, 0x36, 0x65, 0x2f, 0x77, + 0x58, 0x65, 0x46, 0x64, 0x4a, 0x2b, 0x48, 0x76, 0x64, 0x56, 0x0a, 0x4c, + 0x50, 0x6c, 0x41, 0x67, 0x35, 0x54, 0x6e, 0x4d, 0x61, 0x4e, 0x70, 0x52, + 0x64, 0x51, 0x69, 0x68, 0x2f, 0x38, 0x6e, 0x52, 0x46, 0x70, 0x73, 0x64, + 0x77, 0x49, 0x44, 0x41, 0x51, 0x41, 0x42, 0x6f, 0x79, 0x41, 0x77, 0x48, + 0x6a, 0x41, 0x4d, 0x42, 0x67, 0x4e, 0x56, 0x48, 0x52, 0x4d, 0x45, 0x42, + 0x54, 0x41, 0x44, 0x41, 0x51, 0x48, 0x2f, 0x4d, 0x41, 0x34, 0x47, 0x41, + 0x31, 0x55, 0x64, 0x0a, 0x44, 0x77, 0x45, 0x42, 0x2f, 0x77, 0x51, 0x45, + 0x41, 0x77, 0x49, 0x43, 0x42, 0x44, 0x41, 0x4e, 0x42, 0x67, 0x6b, 0x71, + 0x68, 0x6b, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x73, 0x46, + 0x41, 0x41, 0x4f, 0x43, 0x41, 0x51, 0x45, 0x41, 0x6b, 0x54, 0x72, 0x4b, + 0x5a, 0x6a, 0x42, 0x72, 0x4a, 0x58, 0x48, 0x70, 0x73, 0x2f, 0x48, 0x72, + 0x6a, 0x4e, 0x43, 0x46, 0x50, 0x62, 0x35, 0x61, 0x0a, 0x54, 0x48, 0x75, + 0x47, 0x50, 0x43, 0x53, 0x73, 0x65, 0x70, 0x65, 0x31, 0x77, 0x6b, 0x4b, + 0x64, 0x53, 0x70, 0x31, 0x68, 0x34, 0x48, 0x47, 0x52, 0x70, 0x4c, 0x6f, + 0x43, 0x67, 0x63, 0x4c, 0x79, 0x73, 0x43, 0x4a, 0x35, 0x68, 0x5a, 0x68, + 0x52, 0x70, 0x48, 0x6b, 0x52, 0x69, 0x68, 0x68, 0x65, 0x66, 0x2b, 0x72, + 0x46, 0x48, 0x45, 0x65, 0x36, 0x30, 0x55, 0x65, 0x50, 0x51, 0x4f, 0x33, + 0x53, 0x0a, 0x43, 0x56, 0x54, 0x74, 0x64, 0x4a, 0x42, 0x34, 0x43, 0x59, + 0x57, 0x70, 0x63, 0x4e, 0x79, 0x58, 0x4f, 0x64, 0x71, 0x65, 0x66, 0x72, + 0x62, 0x4a, 0x57, 0x35, 0x51, 0x4e, 0x6c, 0x6a, 0x78, 0x67, 0x69, 0x36, + 0x46, 0x68, 0x76, 0x73, 0x37, 0x4a, 0x4a, 0x6b, 0x42, 0x71, 0x64, 0x58, + 0x49, 0x6b, 0x57, 0x58, 0x74, 0x46, 0x6b, 0x32, 0x65, 0x52, 0x67, 0x4f, + 0x49, 0x50, 0x32, 0x45, 0x6f, 0x39, 0x0a, 0x2f, 0x4f, 0x48, 0x51, 0x48, + 0x6c, 0x59, 0x6e, 0x77, 0x5a, 0x46, 0x72, 0x6b, 0x36, 0x73, 0x70, 0x34, + 0x77, 0x50, 0x79, 0x52, 0x2b, 0x41, 0x39, 0x35, 0x53, 0x30, 0x74, 0x6f, + 0x5a, 0x42, 0x63, 0x79, 0x44, 0x56, 0x7a, 0x37, 0x75, 0x2b, 0x68, 0x4f, + 0x57, 0x30, 0x70, 0x47, 0x4b, 0x33, 0x77, 0x76, 0x69, 0x4f, 0x65, 0x39, + 0x6c, 0x76, 0x52, 0x67, 0x6a, 0x2f, 0x48, 0x33, 0x50, 0x77, 0x74, 0x0a, + 0x62, 0x65, 0x77, 0x62, 0x30, 0x6c, 0x2b, 0x4d, 0x68, 0x52, 0x69, 0x67, + 0x30, 0x2f, 0x44, 0x56, 0x48, 0x61, 0x6d, 0x79, 0x56, 0x78, 0x72, 0x44, + 0x52, 0x62, 0x71, 0x49, 0x6e, 0x55, 0x31, 0x2f, 0x47, 0x54, 0x4e, 0x43, + 0x77, 0x63, 0x5a, 0x6b, 0x58, 0x4b, 0x59, 0x46, 0x57, 0x53, 0x66, 0x39, + 0x32, 0x55, 0x2b, 0x6b, 0x49, 0x63, 0x54, 0x74, 0x68, 0x32, 0x34, 0x51, + 0x31, 0x67, 0x63, 0x77, 0x0a, 0x65, 0x5a, 0x69, 0x4c, 0x6c, 0x35, 0x46, + 0x66, 0x72, 0x57, 0x6f, 0x6b, 0x55, 0x4e, 0x79, 0x74, 0x46, 0x45, 0x6c, + 0x58, 0x6f, 0x62, 0x30, 0x56, 0x30, 0x61, 0x35, 0x2f, 0x6b, 0x62, 0x68, + 0x69, 0x4c, 0x63, 0x33, 0x79, 0x57, 0x6d, 0x76, 0x57, 0x71, 0x48, 0x54, + 0x70, 0x71, 0x43, 0x41, 0x4c, 0x62, 0x56, 0x79, 0x46, 0x2b, 0x72, 0x4b, + 0x4a, 0x6f, 0x32, 0x66, 0x35, 0x4b, 0x77, 0x3d, 0x3d, 0x0a, 0x2d, 0x2d, + 0x2d, 0x2d, 0x2d, 0x45, 0x4e, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, + 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a}; From b0ac806183fe2fe09be10c519af91264b0926bc5 Mon Sep 17 00:00:00 2001 From: Eric Gribkoff Date: Thu, 19 Mar 2020 11:37:31 -0700 Subject: [PATCH 234/758] set zone in bootstrap file --- tools/run_tests/run_xds_tests.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tools/run_tests/run_xds_tests.py b/tools/run_tests/run_xds_tests.py index 1c85c4bf3d9..6e1366c95b8 100755 --- a/tools/run_tests/run_xds_tests.py +++ b/tools/run_tests/run_xds_tests.py @@ -158,6 +158,9 @@ _BOOTSTRAP_TEMPLATE = """ "id": "{node_id}", "metadata": {{ "TRAFFICDIRECTOR_NETWORK_NAME": "%s" + }}, + "locality": {{ + "zone": "%s" }} }}, "xds_servers": [{{ @@ -169,7 +172,7 @@ _BOOTSTRAP_TEMPLATE = """ }} ] }}] -}}""" % (args.network.split('/')[-1], args.xds_server) +}}""" % (args.network.split('/')[-1], args.zone, args.xds_server) _PATH_MATCHER_NAME = 'path-matcher' _BASE_TEMPLATE_NAME = 'test-template' _BASE_INSTANCE_GROUP_NAME = 'test-ig' From ae0dc69cb1df8793f3ec2b020202dd48a53da472 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Thu, 19 Mar 2020 13:19:41 -0700 Subject: [PATCH 235/758] Fix the typo; I got the wrong branch and waited two hours --- src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi index 35e7c2a38f2..0d01b4ae838 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi @@ -115,8 +115,8 @@ cdef _actual_aio_shutdown(): cpdef init_grpc_aio(): - """Initialis the gRPC AsyncIO module. - + """Initializes the gRPC AsyncIO module. + Expected to be invoked on critical class constructors. E.g., AioChannel, AioServer. """ From c36af6e8df999fa2ee20e96cfef33d268b31f6da Mon Sep 17 00:00:00 2001 From: jiangtaoli2016 Date: Thu, 19 Mar 2020 13:26:44 -0700 Subject: [PATCH 236/758] Change object-c test credentials --- src/core/tsi/test_creds/README | 17 ++++++++++ .../test-certificates.pem | 31 +++++++++++-------- 2 files changed, 35 insertions(+), 13 deletions(-) diff --git a/src/core/tsi/test_creds/README b/src/core/tsi/test_creds/README index ab0d851a18b..dd6a764b23c 100644 --- a/src/core/tsi/test_creds/README +++ b/src/core/tsi/test_creds/README @@ -67,3 +67,20 @@ Clean up: $ rm *.rsa $ rm *.csr $ rm ca.srl + +Sync up with other repositories +=============================== + +You will need to copy the test credentials to the following places +grpc-dart/interop/ +grpc-dotnet/testassets/Certs/InteropTests/ +grpc-go/testdata/ +grpc-java/testing/src/main/resources/certs/ +grpc-node/test/data/ +src/csharp/Grpc.IntegrationTesting/data/ +src/objective-c/tests/TestCertificates.bundle/ +src/php/tests/data/ +src/python/grpcio_tests/tests/interop/credentials/ +src/python/grpcio_tests/tests/unit/credentials/ +src/ruby/spec/testdata/ +test/core/end2end/data/ diff --git a/src/objective-c/tests/TestCertificates.bundle/test-certificates.pem b/src/objective-c/tests/TestCertificates.bundle/test-certificates.pem index 6c8511a73c6..49d39cd8ed5 100644 --- a/src/objective-c/tests/TestCertificates.bundle/test-certificates.pem +++ b/src/objective-c/tests/TestCertificates.bundle/test-certificates.pem @@ -1,15 +1,20 @@ -----BEGIN CERTIFICATE----- -MIICSjCCAbOgAwIBAgIJAJHGGR4dGioHMA0GCSqGSIb3DQEBCwUAMFYxCzAJBgNV -BAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBX -aWRnaXRzIFB0eSBMdGQxDzANBgNVBAMTBnRlc3RjYTAeFw0xNDExMTEyMjMxMjla -Fw0yNDExMDgyMjMxMjlaMFYxCzAJBgNVBAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0 -YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQxDzANBgNVBAMT -BnRlc3RjYTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwEDfBV5MYdlHVHJ7 -+L4nxrZy7mBfAVXpOc5vMYztssUI7mL2/iYujiIXM+weZYNTEpLdjyJdu7R5gGUu -g1jSVK/EPHfc74O7AyZU34PNIP4Sh33N+/A5YexrNgJlPY+E3GdVYi4ldWJjgkAd -Qah2PH5ACLrIIC6tRka9hcaBlIECAwEAAaMgMB4wDAYDVR0TBAUwAwEB/zAOBgNV -HQ8BAf8EBAMCAgQwDQYJKoZIhvcNAQELBQADgYEAHzC7jdYlzAVmddi/gdAeKPau -sPBG/C2HCWqHzpCUHcKuvMzDVkY/MP2o6JIW2DBbY64bO/FceExhjcykgaYtCH/m -oIU63+CFOTtR7otyQAWHqXa7q4SbCDlG7DyRFxqG0txPtGvy12lgldA2+RgcigQG -Dfcog5wrJytaQ6UA0wE= +MIIDWjCCAkKgAwIBAgIUWrP0VvHcy+LP6UuYNtiL9gBhD5owDQYJKoZIhvcNAQEL +BQAwVjELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM +GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEPMA0GA1UEAwwGdGVzdGNhMB4XDTIw +MDMxNzE4NTk1MVoXDTMwMDMxNTE4NTk1MVowVjELMAkGA1UEBhMCQVUxEzARBgNV +BAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0 +ZDEPMA0GA1UEAwwGdGVzdGNhMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAsGL0oXflF0LzoM+Bh+qUU9yhqzw2w8OOX5mu/iNCyUOBrqaHi7mGHx73GD01 +diNzCzvlcQqdNIH6NQSL7DTpBjca66jYT9u73vZe2MDrr1nVbuLvfu9850cdxiUO +Inv5xf8+sTHG0C+a+VAvMhsLiRjsq+lXKRJyk5zkbbsETybqpxoJ+K7CoSy3yc/k +QIY3TipwEtwkKP4hzyo6KiGd/DPexie4nBUInN3bS1BUeNZ5zeaIC2eg3bkeeW7c +qT55b+Yen6CxY0TEkzBK6AKt/WUialKMgT0wbTxRZO7kUCH3Sq6e/wXeFdJ+HvdV +LPlAg5TnMaNpRdQih/8nRFpsdwIDAQABoyAwHjAMBgNVHRMEBTADAQH/MA4GA1Ud +DwEB/wQEAwICBDANBgkqhkiG9w0BAQsFAAOCAQEAkTrKZjBrJXHps/HrjNCFPb5a +THuGPCSsepe1wkKdSp1h4HGRpLoCgcLysCJ5hZhRpHkRihhef+rFHEe60UePQO3S +CVTtdJB4CYWpcNyXOdqefrbJW5QNljxgi6Fhvs7JJkBqdXIkWXtFk2eRgOIP2Eo9 +/OHQHlYnwZFrk6sp4wPyR+A95S0toZBcyDVz7u+hOW0pGK3wviOe9lvRgj/H3Pwt +bewb0l+MhRig0/DVHamyVxrDRbqInU1/GTNCwcZkXKYFWSf92U+kIcTth24Q1gcw +eZiLl5FfrWokUNytFElXob0V0a5/kbhiLc3yWmvWqHTpqCALbVyF+rKJo2f5Kw== -----END CERTIFICATE----- From f9f59ba222868062406e881a2a8736fdd863997b Mon Sep 17 00:00:00 2001 From: Donna Dionne Date: Thu, 19 Mar 2020 14:12:28 -0700 Subject: [PATCH 237/758] Debugging xds_end2endtest LocalityMap UpdateMap by sending more traffic The test is failing due to the backend not getting the expected amount of traffic by a small margin. Increasing traffic and adding debugs. --- test/cpp/end2end/xds_end2end_test.cc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/test/cpp/end2end/xds_end2end_test.cc b/test/cpp/end2end/xds_end2end_test.cc index a2c0ee6f382..616dc56c76a 100644 --- a/test/cpp/end2end/xds_end2end_test.cc +++ b/test/cpp/end2end/xds_end2end_test.cc @@ -2375,7 +2375,7 @@ TEST_P(LocalityMapTest, StressTest) { TEST_P(LocalityMapTest, UpdateMap) { SetNextResolution({}); SetNextResolutionForLbChannelAllBalancers(); - const size_t kNumRpcs = 1000; + const size_t kNumRpcs = 3000; // The locality weight for the first 3 localities. const std::vector kLocalityWeights0 = {2, 3, 4}; const double kTotalLocalityWeight0 = @@ -2417,6 +2417,7 @@ TEST_P(LocalityMapTest, UpdateMap) { } const double kErrorTolerance = 0.2; for (size_t i = 0; i < 3; ++i) { + gpr_log(GPR_INFO, "Locality %zu rete %f", i, locality_picked_rates[i]); EXPECT_THAT( locality_picked_rates[i], ::testing::AllOf( @@ -2434,7 +2435,7 @@ TEST_P(LocalityMapTest, UpdateMap) { EXPECT_EQ(0U, backends_[3]->backend_service()->request_count()); // Wait until the locality update has been processed, as signaled by backend 3 // receiving a request. - WaitForBackend(3); + WaitForAllBackends(3, 4); gpr_log(GPR_INFO, "========= BEFORE SECOND BATCH =========="); // Send kNumRpcs RPCs. CheckRpcSendOk(kNumRpcs); @@ -2450,6 +2451,7 @@ TEST_P(LocalityMapTest, UpdateMap) { kNumRpcs); } for (size_t i = 1; i < 4; ++i) { + gpr_log(GPR_INFO, "Locality %zu rete %f", i, locality_picked_rates[i]); EXPECT_THAT( locality_picked_rates[i], ::testing::AllOf( From d8fc6bd4c6e0200dd5445a4e4349f4cd8357a65d Mon Sep 17 00:00:00 2001 From: Donna Dionne Date: Thu, 19 Mar 2020 14:31:37 -0700 Subject: [PATCH 238/758] Addressing code review comments. --- test/cpp/end2end/xds_end2end_test.cc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/test/cpp/end2end/xds_end2end_test.cc b/test/cpp/end2end/xds_end2end_test.cc index 616dc56c76a..61ea37c1396 100644 --- a/test/cpp/end2end/xds_end2end_test.cc +++ b/test/cpp/end2end/xds_end2end_test.cc @@ -2417,7 +2417,8 @@ TEST_P(LocalityMapTest, UpdateMap) { } const double kErrorTolerance = 0.2; for (size_t i = 0; i < 3; ++i) { - gpr_log(GPR_INFO, "Locality %zu rete %f", i, locality_picked_rates[i]); + gpr_log(GPR_INFO, "Locality %" PRIuPTR " rate %f", i, + locality_picked_rates[i]); EXPECT_THAT( locality_picked_rates[i], ::testing::AllOf( @@ -2451,7 +2452,8 @@ TEST_P(LocalityMapTest, UpdateMap) { kNumRpcs); } for (size_t i = 1; i < 4; ++i) { - gpr_log(GPR_INFO, "Locality %zu rete %f", i, locality_picked_rates[i]); + gpr_log(GPR_INFO, "Locality %" PRIuPTR " rate %f", i, + locality_picked_rates[i]); EXPECT_THAT( locality_picked_rates[i], ::testing::AllOf( From c8de6f64960972f170efa3cac944040ff9774530 Mon Sep 17 00:00:00 2001 From: Richard Belleville Date: Thu, 19 Mar 2020 23:42:22 +0000 Subject: [PATCH 239/758] Increase Python xDS client log verbosity --- tools/internal_ci/linux/grpc_xds_bazel_python_test_in_docker.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/internal_ci/linux/grpc_xds_bazel_python_test_in_docker.sh b/tools/internal_ci/linux/grpc_xds_bazel_python_test_in_docker.sh index ecb8f8123d0..0dbea2f59ee 100755 --- a/tools/internal_ci/linux/grpc_xds_bazel_python_test_in_docker.sh +++ b/tools/internal_ci/linux/grpc_xds_bazel_python_test_in_docker.sh @@ -53,4 +53,4 @@ GRPC_VERBOSITY=debug GRPC_TRACE=xds_client,xds_resolver,cds_lb,xds_lb "$PYTHON" --project_id=grpc-testing \ --gcp_suffix=$(date '+%s') \ --verbose \ - --client_cmd='bazel run //src/python/grpcio_tests/tests_py3_only/interop:xds_interop_client -- --server=xds-experimental:///{server_uri} --stats_port={stats_port} --qps={qps}' + --client_cmd='bazel run //src/python/grpcio_tests/tests_py3_only/interop:xds_interop_client -- --server=xds-experimental:///{server_uri} --stats_port={stats_port} --qps={qps} --verbose' From feeb7158f2cfca0d94cbd362278ed324fe667b6e Mon Sep 17 00:00:00 2001 From: Eric Gribkoff Date: Thu, 19 Mar 2020 22:09:15 -0700 Subject: [PATCH 240/758] Increase wait for VMs to come online --- tools/run_tests/run_xds_tests.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/run_tests/run_xds_tests.py b/tools/run_tests/run_xds_tests.py index 6e1366c95b8..21e09e550d2 100755 --- a/tools/run_tests/run_xds_tests.py +++ b/tools/run_tests/run_xds_tests.py @@ -82,7 +82,7 @@ argp.add_argument('--secondary_zone', argp.add_argument('--qps', default=10, type=int, help='Client QPS') argp.add_argument( '--wait_for_backend_sec', - default=600, + default=1200, type=int, help='Time limit for waiting for created backend services to report ' 'healthy when launching or updated GCP resources') From b91d433ba4290dab5c1f5e742a669d7ee60fb398 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pavel=20Sim=C3=B3?= Date: Fri, 20 Mar 2020 14:13:51 +0100 Subject: [PATCH 241/758] Fix typo --- include/grpcpp/impl/codegen/call_op_set.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/grpcpp/impl/codegen/call_op_set.h b/include/grpcpp/impl/codegen/call_op_set.h index e6d7b900ca1..904100460f0 100644 --- a/include/grpcpp/impl/codegen/call_op_set.h +++ b/include/grpcpp/impl/codegen/call_op_set.h @@ -828,7 +828,7 @@ class CallOpSet; /// the maximum count of ops we'll need in a set. We leverage the /// empty base class optimization to slim this class (especially /// when there are many unused slots used). To avoid duplicate base classes, -/// the template parmeter for CallNoOp is varied by argument position. +/// the template parameter for CallNoOp is varied by argument position. template class CallOpSet : public CallOpSetInterface, public Op1, From 5cd4f8140efde1cb32b54b657607f3478c9c7ab5 Mon Sep 17 00:00:00 2001 From: "Mark D. Roth" Date: Fri, 20 Mar 2020 09:46:44 -0700 Subject: [PATCH 242/758] xds: Fix dumb reversed conditional in log message --- src/core/ext/filters/client_channel/xds/xds_client.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/ext/filters/client_channel/xds/xds_client.cc b/src/core/ext/filters/client_channel/xds/xds_client.cc index f0634ebe4da..40a3e66a513 100644 --- a/src/core/ext/filters/client_channel/xds/xds_client.cc +++ b/src/core/ext/filters/client_channel/xds/xds_client.cc @@ -894,7 +894,7 @@ void XdsClient::ChannelState::AdsCallState::AcceptLdsUpdate( "[xds_client %p] LDS update received: route_config_name=%s, " "cluster_name=%s", xds_client(), - (lds_update->route_config_name.empty() + (!lds_update->route_config_name.empty() ? lds_update->route_config_name.c_str() : ""), (lds_update->rds_update.has_value() From 44e1e7b0fd843a176498357a56815ab4a0c36a32 Mon Sep 17 00:00:00 2001 From: Sayed Ibrahim Hashimi Date: Fri, 20 Mar 2020 13:05:33 -0400 Subject: [PATCH 243/758] minor update to fix msbuild condition to correct syntax --- .../Grpc.Tools/build/_protobuf/Google.Protobuf.Tools.targets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/csharp/Grpc.Tools/build/_protobuf/Google.Protobuf.Tools.targets b/src/csharp/Grpc.Tools/build/_protobuf/Google.Protobuf.Tools.targets index b1030ba1f8b..ad6725f684a 100644 --- a/src/csharp/Grpc.Tools/build/_protobuf/Google.Protobuf.Tools.targets +++ b/src/csharp/Grpc.Tools/build/_protobuf/Google.Protobuf.Tools.targets @@ -137,7 +137,7 @@ %(RelativeDir) - + %(Identity) From 3799b7b80cea0b23cb5cddbe9e520d8163b15a75 Mon Sep 17 00:00:00 2001 From: jiangtaoli2016 Date: Fri, 20 Mar 2020 10:10:49 -0700 Subject: [PATCH 244/758] Update test creds README --- src/core/tsi/test_creds/README | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/core/tsi/test_creds/README b/src/core/tsi/test_creds/README index dd6a764b23c..645fe9fe502 100644 --- a/src/core/tsi/test_creds/README +++ b/src/core/tsi/test_creds/README @@ -71,7 +71,10 @@ $ rm ca.srl Sync up with other repositories =============================== -You will need to copy the test credentials to the following places +Copies of these keys exist in multiple locations across all the grpc repos +(e.g., see the following partial list). You need to be careful when updating +the keys. + grpc-dart/interop/ grpc-dotnet/testassets/Certs/InteropTests/ grpc-go/testdata/ From 13c6b6c612d0740e118e3e3139f81cd850bdd29f Mon Sep 17 00:00:00 2001 From: jiangtaoli2016 Date: Fri, 20 Mar 2020 14:48:02 -0700 Subject: [PATCH 245/758] Append old ca.pem --- src/core/tsi/test_creds/README | 3 + src/core/tsi/test_creds/ca.pem | 15 ++++ .../Grpc.IntegrationTesting/data/ca.pem | 15 ++++ .../test-certificates.pem | 15 ++++ src/php/tests/data/ca.pem | 15 ++++ .../tests/interop/credentials/ca.pem | 15 ++++ .../tests/unit/credentials/ca.pem | 15 ++++ src/ruby/spec/testdata/ca.pem | 15 ++++ test/core/end2end/data/test_root_cert.cc | 74 ++++++++++++++++++- 9 files changed, 181 insertions(+), 1 deletion(-) diff --git a/src/core/tsi/test_creds/README b/src/core/tsi/test_creds/README index 645fe9fe502..dc33d320caf 100644 --- a/src/core/tsi/test_creds/README +++ b/src/core/tsi/test_creds/README @@ -87,3 +87,6 @@ src/python/grpcio_tests/tests/interop/credentials/ src/python/grpcio_tests/tests/unit/credentials/ src/ruby/spec/testdata/ test/core/end2end/data/ + +Please also append old ca.pem into new ca.pem so that tests in the old releases +are interopable with tests in the new releases. diff --git a/src/core/tsi/test_creds/ca.pem b/src/core/tsi/test_creds/ca.pem index 49d39cd8ed5..48f22fbbacb 100644 --- a/src/core/tsi/test_creds/ca.pem +++ b/src/core/tsi/test_creds/ca.pem @@ -18,3 +18,18 @@ CVTtdJB4CYWpcNyXOdqefrbJW5QNljxgi6Fhvs7JJkBqdXIkWXtFk2eRgOIP2Eo9 bewb0l+MhRig0/DVHamyVxrDRbqInU1/GTNCwcZkXKYFWSf92U+kIcTth24Q1gcw eZiLl5FfrWokUNytFElXob0V0a5/kbhiLc3yWmvWqHTpqCALbVyF+rKJo2f5Kw== -----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICSjCCAbOgAwIBAgIJAJHGGR4dGioHMA0GCSqGSIb3DQEBCwUAMFYxCzAJBgNV +BAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBX +aWRnaXRzIFB0eSBMdGQxDzANBgNVBAMTBnRlc3RjYTAeFw0xNDExMTEyMjMxMjla +Fw0yNDExMDgyMjMxMjlaMFYxCzAJBgNVBAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0 +YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQxDzANBgNVBAMT +BnRlc3RjYTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwEDfBV5MYdlHVHJ7 ++L4nxrZy7mBfAVXpOc5vMYztssUI7mL2/iYujiIXM+weZYNTEpLdjyJdu7R5gGUu +g1jSVK/EPHfc74O7AyZU34PNIP4Sh33N+/A5YexrNgJlPY+E3GdVYi4ldWJjgkAd +Qah2PH5ACLrIIC6tRka9hcaBlIECAwEAAaMgMB4wDAYDVR0TBAUwAwEB/zAOBgNV +HQ8BAf8EBAMCAgQwDQYJKoZIhvcNAQELBQADgYEAHzC7jdYlzAVmddi/gdAeKPau +sPBG/C2HCWqHzpCUHcKuvMzDVkY/MP2o6JIW2DBbY64bO/FceExhjcykgaYtCH/m +oIU63+CFOTtR7otyQAWHqXa7q4SbCDlG7DyRFxqG0txPtGvy12lgldA2+RgcigQG +Dfcog5wrJytaQ6UA0wE= +-----END CERTIFICATE----- diff --git a/src/csharp/Grpc.IntegrationTesting/data/ca.pem b/src/csharp/Grpc.IntegrationTesting/data/ca.pem index 49d39cd8ed5..48f22fbbacb 100644 --- a/src/csharp/Grpc.IntegrationTesting/data/ca.pem +++ b/src/csharp/Grpc.IntegrationTesting/data/ca.pem @@ -18,3 +18,18 @@ CVTtdJB4CYWpcNyXOdqefrbJW5QNljxgi6Fhvs7JJkBqdXIkWXtFk2eRgOIP2Eo9 bewb0l+MhRig0/DVHamyVxrDRbqInU1/GTNCwcZkXKYFWSf92U+kIcTth24Q1gcw eZiLl5FfrWokUNytFElXob0V0a5/kbhiLc3yWmvWqHTpqCALbVyF+rKJo2f5Kw== -----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICSjCCAbOgAwIBAgIJAJHGGR4dGioHMA0GCSqGSIb3DQEBCwUAMFYxCzAJBgNV +BAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBX +aWRnaXRzIFB0eSBMdGQxDzANBgNVBAMTBnRlc3RjYTAeFw0xNDExMTEyMjMxMjla +Fw0yNDExMDgyMjMxMjlaMFYxCzAJBgNVBAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0 +YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQxDzANBgNVBAMT +BnRlc3RjYTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwEDfBV5MYdlHVHJ7 ++L4nxrZy7mBfAVXpOc5vMYztssUI7mL2/iYujiIXM+weZYNTEpLdjyJdu7R5gGUu +g1jSVK/EPHfc74O7AyZU34PNIP4Sh33N+/A5YexrNgJlPY+E3GdVYi4ldWJjgkAd +Qah2PH5ACLrIIC6tRka9hcaBlIECAwEAAaMgMB4wDAYDVR0TBAUwAwEB/zAOBgNV +HQ8BAf8EBAMCAgQwDQYJKoZIhvcNAQELBQADgYEAHzC7jdYlzAVmddi/gdAeKPau +sPBG/C2HCWqHzpCUHcKuvMzDVkY/MP2o6JIW2DBbY64bO/FceExhjcykgaYtCH/m +oIU63+CFOTtR7otyQAWHqXa7q4SbCDlG7DyRFxqG0txPtGvy12lgldA2+RgcigQG +Dfcog5wrJytaQ6UA0wE= +-----END CERTIFICATE----- diff --git a/src/objective-c/tests/TestCertificates.bundle/test-certificates.pem b/src/objective-c/tests/TestCertificates.bundle/test-certificates.pem index 49d39cd8ed5..48f22fbbacb 100644 --- a/src/objective-c/tests/TestCertificates.bundle/test-certificates.pem +++ b/src/objective-c/tests/TestCertificates.bundle/test-certificates.pem @@ -18,3 +18,18 @@ CVTtdJB4CYWpcNyXOdqefrbJW5QNljxgi6Fhvs7JJkBqdXIkWXtFk2eRgOIP2Eo9 bewb0l+MhRig0/DVHamyVxrDRbqInU1/GTNCwcZkXKYFWSf92U+kIcTth24Q1gcw eZiLl5FfrWokUNytFElXob0V0a5/kbhiLc3yWmvWqHTpqCALbVyF+rKJo2f5Kw== -----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICSjCCAbOgAwIBAgIJAJHGGR4dGioHMA0GCSqGSIb3DQEBCwUAMFYxCzAJBgNV +BAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBX +aWRnaXRzIFB0eSBMdGQxDzANBgNVBAMTBnRlc3RjYTAeFw0xNDExMTEyMjMxMjla +Fw0yNDExMDgyMjMxMjlaMFYxCzAJBgNVBAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0 +YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQxDzANBgNVBAMT +BnRlc3RjYTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwEDfBV5MYdlHVHJ7 ++L4nxrZy7mBfAVXpOc5vMYztssUI7mL2/iYujiIXM+weZYNTEpLdjyJdu7R5gGUu +g1jSVK/EPHfc74O7AyZU34PNIP4Sh33N+/A5YexrNgJlPY+E3GdVYi4ldWJjgkAd +Qah2PH5ACLrIIC6tRka9hcaBlIECAwEAAaMgMB4wDAYDVR0TBAUwAwEB/zAOBgNV +HQ8BAf8EBAMCAgQwDQYJKoZIhvcNAQELBQADgYEAHzC7jdYlzAVmddi/gdAeKPau +sPBG/C2HCWqHzpCUHcKuvMzDVkY/MP2o6JIW2DBbY64bO/FceExhjcykgaYtCH/m +oIU63+CFOTtR7otyQAWHqXa7q4SbCDlG7DyRFxqG0txPtGvy12lgldA2+RgcigQG +Dfcog5wrJytaQ6UA0wE= +-----END CERTIFICATE----- diff --git a/src/php/tests/data/ca.pem b/src/php/tests/data/ca.pem index 49d39cd8ed5..48f22fbbacb 100755 --- a/src/php/tests/data/ca.pem +++ b/src/php/tests/data/ca.pem @@ -18,3 +18,18 @@ CVTtdJB4CYWpcNyXOdqefrbJW5QNljxgi6Fhvs7JJkBqdXIkWXtFk2eRgOIP2Eo9 bewb0l+MhRig0/DVHamyVxrDRbqInU1/GTNCwcZkXKYFWSf92U+kIcTth24Q1gcw eZiLl5FfrWokUNytFElXob0V0a5/kbhiLc3yWmvWqHTpqCALbVyF+rKJo2f5Kw== -----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICSjCCAbOgAwIBAgIJAJHGGR4dGioHMA0GCSqGSIb3DQEBCwUAMFYxCzAJBgNV +BAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBX +aWRnaXRzIFB0eSBMdGQxDzANBgNVBAMTBnRlc3RjYTAeFw0xNDExMTEyMjMxMjla +Fw0yNDExMDgyMjMxMjlaMFYxCzAJBgNVBAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0 +YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQxDzANBgNVBAMT +BnRlc3RjYTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwEDfBV5MYdlHVHJ7 ++L4nxrZy7mBfAVXpOc5vMYztssUI7mL2/iYujiIXM+weZYNTEpLdjyJdu7R5gGUu +g1jSVK/EPHfc74O7AyZU34PNIP4Sh33N+/A5YexrNgJlPY+E3GdVYi4ldWJjgkAd +Qah2PH5ACLrIIC6tRka9hcaBlIECAwEAAaMgMB4wDAYDVR0TBAUwAwEB/zAOBgNV +HQ8BAf8EBAMCAgQwDQYJKoZIhvcNAQELBQADgYEAHzC7jdYlzAVmddi/gdAeKPau +sPBG/C2HCWqHzpCUHcKuvMzDVkY/MP2o6JIW2DBbY64bO/FceExhjcykgaYtCH/m +oIU63+CFOTtR7otyQAWHqXa7q4SbCDlG7DyRFxqG0txPtGvy12lgldA2+RgcigQG +Dfcog5wrJytaQ6UA0wE= +-----END CERTIFICATE----- diff --git a/src/python/grpcio_tests/tests/interop/credentials/ca.pem b/src/python/grpcio_tests/tests/interop/credentials/ca.pem index 49d39cd8ed5..48f22fbbacb 100755 --- a/src/python/grpcio_tests/tests/interop/credentials/ca.pem +++ b/src/python/grpcio_tests/tests/interop/credentials/ca.pem @@ -18,3 +18,18 @@ CVTtdJB4CYWpcNyXOdqefrbJW5QNljxgi6Fhvs7JJkBqdXIkWXtFk2eRgOIP2Eo9 bewb0l+MhRig0/DVHamyVxrDRbqInU1/GTNCwcZkXKYFWSf92U+kIcTth24Q1gcw eZiLl5FfrWokUNytFElXob0V0a5/kbhiLc3yWmvWqHTpqCALbVyF+rKJo2f5Kw== -----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICSjCCAbOgAwIBAgIJAJHGGR4dGioHMA0GCSqGSIb3DQEBCwUAMFYxCzAJBgNV +BAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBX +aWRnaXRzIFB0eSBMdGQxDzANBgNVBAMTBnRlc3RjYTAeFw0xNDExMTEyMjMxMjla +Fw0yNDExMDgyMjMxMjlaMFYxCzAJBgNVBAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0 +YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQxDzANBgNVBAMT +BnRlc3RjYTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwEDfBV5MYdlHVHJ7 ++L4nxrZy7mBfAVXpOc5vMYztssUI7mL2/iYujiIXM+weZYNTEpLdjyJdu7R5gGUu +g1jSVK/EPHfc74O7AyZU34PNIP4Sh33N+/A5YexrNgJlPY+E3GdVYi4ldWJjgkAd +Qah2PH5ACLrIIC6tRka9hcaBlIECAwEAAaMgMB4wDAYDVR0TBAUwAwEB/zAOBgNV +HQ8BAf8EBAMCAgQwDQYJKoZIhvcNAQELBQADgYEAHzC7jdYlzAVmddi/gdAeKPau +sPBG/C2HCWqHzpCUHcKuvMzDVkY/MP2o6JIW2DBbY64bO/FceExhjcykgaYtCH/m +oIU63+CFOTtR7otyQAWHqXa7q4SbCDlG7DyRFxqG0txPtGvy12lgldA2+RgcigQG +Dfcog5wrJytaQ6UA0wE= +-----END CERTIFICATE----- diff --git a/src/python/grpcio_tests/tests/unit/credentials/ca.pem b/src/python/grpcio_tests/tests/unit/credentials/ca.pem index 49d39cd8ed5..48f22fbbacb 100755 --- a/src/python/grpcio_tests/tests/unit/credentials/ca.pem +++ b/src/python/grpcio_tests/tests/unit/credentials/ca.pem @@ -18,3 +18,18 @@ CVTtdJB4CYWpcNyXOdqefrbJW5QNljxgi6Fhvs7JJkBqdXIkWXtFk2eRgOIP2Eo9 bewb0l+MhRig0/DVHamyVxrDRbqInU1/GTNCwcZkXKYFWSf92U+kIcTth24Q1gcw eZiLl5FfrWokUNytFElXob0V0a5/kbhiLc3yWmvWqHTpqCALbVyF+rKJo2f5Kw== -----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICSjCCAbOgAwIBAgIJAJHGGR4dGioHMA0GCSqGSIb3DQEBCwUAMFYxCzAJBgNV +BAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBX +aWRnaXRzIFB0eSBMdGQxDzANBgNVBAMTBnRlc3RjYTAeFw0xNDExMTEyMjMxMjla +Fw0yNDExMDgyMjMxMjlaMFYxCzAJBgNVBAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0 +YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQxDzANBgNVBAMT +BnRlc3RjYTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwEDfBV5MYdlHVHJ7 ++L4nxrZy7mBfAVXpOc5vMYztssUI7mL2/iYujiIXM+weZYNTEpLdjyJdu7R5gGUu +g1jSVK/EPHfc74O7AyZU34PNIP4Sh33N+/A5YexrNgJlPY+E3GdVYi4ldWJjgkAd +Qah2PH5ACLrIIC6tRka9hcaBlIECAwEAAaMgMB4wDAYDVR0TBAUwAwEB/zAOBgNV +HQ8BAf8EBAMCAgQwDQYJKoZIhvcNAQELBQADgYEAHzC7jdYlzAVmddi/gdAeKPau +sPBG/C2HCWqHzpCUHcKuvMzDVkY/MP2o6JIW2DBbY64bO/FceExhjcykgaYtCH/m +oIU63+CFOTtR7otyQAWHqXa7q4SbCDlG7DyRFxqG0txPtGvy12lgldA2+RgcigQG +Dfcog5wrJytaQ6UA0wE= +-----END CERTIFICATE----- diff --git a/src/ruby/spec/testdata/ca.pem b/src/ruby/spec/testdata/ca.pem index 49d39cd8ed5..48f22fbbacb 100755 --- a/src/ruby/spec/testdata/ca.pem +++ b/src/ruby/spec/testdata/ca.pem @@ -18,3 +18,18 @@ CVTtdJB4CYWpcNyXOdqefrbJW5QNljxgi6Fhvs7JJkBqdXIkWXtFk2eRgOIP2Eo9 bewb0l+MhRig0/DVHamyVxrDRbqInU1/GTNCwcZkXKYFWSf92U+kIcTth24Q1gcw eZiLl5FfrWokUNytFElXob0V0a5/kbhiLc3yWmvWqHTpqCALbVyF+rKJo2f5Kw== -----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIICSjCCAbOgAwIBAgIJAJHGGR4dGioHMA0GCSqGSIb3DQEBCwUAMFYxCzAJBgNV +BAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBX +aWRnaXRzIFB0eSBMdGQxDzANBgNVBAMTBnRlc3RjYTAeFw0xNDExMTEyMjMxMjla +Fw0yNDExMDgyMjMxMjlaMFYxCzAJBgNVBAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0 +YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQxDzANBgNVBAMT +BnRlc3RjYTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwEDfBV5MYdlHVHJ7 ++L4nxrZy7mBfAVXpOc5vMYztssUI7mL2/iYujiIXM+weZYNTEpLdjyJdu7R5gGUu +g1jSVK/EPHfc74O7AyZU34PNIP4Sh33N+/A5YexrNgJlPY+E3GdVYi4ldWJjgkAd +Qah2PH5ACLrIIC6tRka9hcaBlIECAwEAAaMgMB4wDAYDVR0TBAUwAwEB/zAOBgNV +HQ8BAf8EBAMCAgQwDQYJKoZIhvcNAQELBQADgYEAHzC7jdYlzAVmddi/gdAeKPau +sPBG/C2HCWqHzpCUHcKuvMzDVkY/MP2o6JIW2DBbY64bO/FceExhjcykgaYtCH/m +oIU63+CFOTtR7otyQAWHqXa7q4SbCDlG7DyRFxqG0txPtGvy12lgldA2+RgcigQG +Dfcog5wrJytaQ6UA0wE= +-----END CERTIFICATE----- diff --git a/test/core/end2end/data/test_root_cert.cc b/test/core/end2end/data/test_root_cert.cc index 3fbe7e74cee..0735cfb5ad6 100644 --- a/test/core/end2end/data/test_root_cert.cc +++ b/test/core/end2end/data/test_root_cert.cc @@ -118,4 +118,76 @@ extern const char test_root_cert[] = { 0x70, 0x71, 0x43, 0x41, 0x4c, 0x62, 0x56, 0x79, 0x46, 0x2b, 0x72, 0x4b, 0x4a, 0x6f, 0x32, 0x66, 0x35, 0x4b, 0x77, 0x3d, 0x3d, 0x0a, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x45, 0x4e, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, - 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a}; + 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, + 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x42, 0x45, 0x47, 0x49, 0x4e, 0x20, 0x43, + 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2d, 0x2d, + 0x2d, 0x2d, 0x2d, 0x0a, 0x4d, 0x49, 0x49, 0x43, 0x53, 0x6a, 0x43, 0x43, + 0x41, 0x62, 0x4f, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x4a, + 0x41, 0x4a, 0x48, 0x47, 0x47, 0x52, 0x34, 0x64, 0x47, 0x69, 0x6f, 0x48, + 0x4d, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, + 0x44, 0x51, 0x45, 0x42, 0x43, 0x77, 0x55, 0x41, 0x4d, 0x46, 0x59, 0x78, + 0x43, 0x7a, 0x41, 0x4a, 0x42, 0x67, 0x4e, 0x56, 0x0a, 0x42, 0x41, 0x59, + 0x54, 0x41, 0x6b, 0x46, 0x56, 0x4d, 0x52, 0x4d, 0x77, 0x45, 0x51, 0x59, + 0x44, 0x56, 0x51, 0x51, 0x49, 0x45, 0x77, 0x70, 0x54, 0x62, 0x32, 0x31, + 0x6c, 0x4c, 0x56, 0x4e, 0x30, 0x59, 0x58, 0x52, 0x6c, 0x4d, 0x53, 0x45, + 0x77, 0x48, 0x77, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4b, 0x45, 0x78, 0x68, + 0x4a, 0x62, 0x6e, 0x52, 0x6c, 0x63, 0x6d, 0x35, 0x6c, 0x64, 0x43, 0x42, + 0x58, 0x0a, 0x61, 0x57, 0x52, 0x6e, 0x61, 0x58, 0x52, 0x7a, 0x49, 0x46, + 0x42, 0x30, 0x65, 0x53, 0x42, 0x4d, 0x64, 0x47, 0x51, 0x78, 0x44, 0x7a, + 0x41, 0x4e, 0x42, 0x67, 0x4e, 0x56, 0x42, 0x41, 0x4d, 0x54, 0x42, 0x6e, + 0x52, 0x6c, 0x63, 0x33, 0x52, 0x6a, 0x59, 0x54, 0x41, 0x65, 0x46, 0x77, + 0x30, 0x78, 0x4e, 0x44, 0x45, 0x78, 0x4d, 0x54, 0x45, 0x79, 0x4d, 0x6a, + 0x4d, 0x78, 0x4d, 0x6a, 0x6c, 0x61, 0x0a, 0x46, 0x77, 0x30, 0x79, 0x4e, + 0x44, 0x45, 0x78, 0x4d, 0x44, 0x67, 0x79, 0x4d, 0x6a, 0x4d, 0x78, 0x4d, + 0x6a, 0x6c, 0x61, 0x4d, 0x46, 0x59, 0x78, 0x43, 0x7a, 0x41, 0x4a, 0x42, + 0x67, 0x4e, 0x56, 0x42, 0x41, 0x59, 0x54, 0x41, 0x6b, 0x46, 0x56, 0x4d, + 0x52, 0x4d, 0x77, 0x45, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x49, 0x45, + 0x77, 0x70, 0x54, 0x62, 0x32, 0x31, 0x6c, 0x4c, 0x56, 0x4e, 0x30, 0x0a, + 0x59, 0x58, 0x52, 0x6c, 0x4d, 0x53, 0x45, 0x77, 0x48, 0x77, 0x59, 0x44, + 0x56, 0x51, 0x51, 0x4b, 0x45, 0x78, 0x68, 0x4a, 0x62, 0x6e, 0x52, 0x6c, + 0x63, 0x6d, 0x35, 0x6c, 0x64, 0x43, 0x42, 0x58, 0x61, 0x57, 0x52, 0x6e, + 0x61, 0x58, 0x52, 0x7a, 0x49, 0x46, 0x42, 0x30, 0x65, 0x53, 0x42, 0x4d, + 0x64, 0x47, 0x51, 0x78, 0x44, 0x7a, 0x41, 0x4e, 0x42, 0x67, 0x4e, 0x56, + 0x42, 0x41, 0x4d, 0x54, 0x0a, 0x42, 0x6e, 0x52, 0x6c, 0x63, 0x33, 0x52, + 0x6a, 0x59, 0x54, 0x43, 0x42, 0x6e, 0x7a, 0x41, 0x4e, 0x42, 0x67, 0x6b, + 0x71, 0x68, 0x6b, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x45, + 0x46, 0x41, 0x41, 0x4f, 0x42, 0x6a, 0x51, 0x41, 0x77, 0x67, 0x59, 0x6b, + 0x43, 0x67, 0x59, 0x45, 0x41, 0x77, 0x45, 0x44, 0x66, 0x42, 0x56, 0x35, + 0x4d, 0x59, 0x64, 0x6c, 0x48, 0x56, 0x48, 0x4a, 0x37, 0x0a, 0x2b, 0x4c, + 0x34, 0x6e, 0x78, 0x72, 0x5a, 0x79, 0x37, 0x6d, 0x42, 0x66, 0x41, 0x56, + 0x58, 0x70, 0x4f, 0x63, 0x35, 0x76, 0x4d, 0x59, 0x7a, 0x74, 0x73, 0x73, + 0x55, 0x49, 0x37, 0x6d, 0x4c, 0x32, 0x2f, 0x69, 0x59, 0x75, 0x6a, 0x69, + 0x49, 0x58, 0x4d, 0x2b, 0x77, 0x65, 0x5a, 0x59, 0x4e, 0x54, 0x45, 0x70, + 0x4c, 0x64, 0x6a, 0x79, 0x4a, 0x64, 0x75, 0x37, 0x52, 0x35, 0x67, 0x47, + 0x55, 0x75, 0x0a, 0x67, 0x31, 0x6a, 0x53, 0x56, 0x4b, 0x2f, 0x45, 0x50, + 0x48, 0x66, 0x63, 0x37, 0x34, 0x4f, 0x37, 0x41, 0x79, 0x5a, 0x55, 0x33, + 0x34, 0x50, 0x4e, 0x49, 0x50, 0x34, 0x53, 0x68, 0x33, 0x33, 0x4e, 0x2b, + 0x2f, 0x41, 0x35, 0x59, 0x65, 0x78, 0x72, 0x4e, 0x67, 0x4a, 0x6c, 0x50, + 0x59, 0x2b, 0x45, 0x33, 0x47, 0x64, 0x56, 0x59, 0x69, 0x34, 0x6c, 0x64, + 0x57, 0x4a, 0x6a, 0x67, 0x6b, 0x41, 0x64, 0x0a, 0x51, 0x61, 0x68, 0x32, + 0x50, 0x48, 0x35, 0x41, 0x43, 0x4c, 0x72, 0x49, 0x49, 0x43, 0x36, 0x74, + 0x52, 0x6b, 0x61, 0x39, 0x68, 0x63, 0x61, 0x42, 0x6c, 0x49, 0x45, 0x43, + 0x41, 0x77, 0x45, 0x41, 0x41, 0x61, 0x4d, 0x67, 0x4d, 0x42, 0x34, 0x77, + 0x44, 0x41, 0x59, 0x44, 0x56, 0x52, 0x30, 0x54, 0x42, 0x41, 0x55, 0x77, + 0x41, 0x77, 0x45, 0x42, 0x2f, 0x7a, 0x41, 0x4f, 0x42, 0x67, 0x4e, 0x56, + 0x0a, 0x48, 0x51, 0x38, 0x42, 0x41, 0x66, 0x38, 0x45, 0x42, 0x41, 0x4d, + 0x43, 0x41, 0x67, 0x51, 0x77, 0x44, 0x51, 0x59, 0x4a, 0x4b, 0x6f, 0x5a, + 0x49, 0x68, 0x76, 0x63, 0x4e, 0x41, 0x51, 0x45, 0x4c, 0x42, 0x51, 0x41, + 0x44, 0x67, 0x59, 0x45, 0x41, 0x48, 0x7a, 0x43, 0x37, 0x6a, 0x64, 0x59, + 0x6c, 0x7a, 0x41, 0x56, 0x6d, 0x64, 0x64, 0x69, 0x2f, 0x67, 0x64, 0x41, + 0x65, 0x4b, 0x50, 0x61, 0x75, 0x0a, 0x73, 0x50, 0x42, 0x47, 0x2f, 0x43, + 0x32, 0x48, 0x43, 0x57, 0x71, 0x48, 0x7a, 0x70, 0x43, 0x55, 0x48, 0x63, + 0x4b, 0x75, 0x76, 0x4d, 0x7a, 0x44, 0x56, 0x6b, 0x59, 0x2f, 0x4d, 0x50, + 0x32, 0x6f, 0x36, 0x4a, 0x49, 0x57, 0x32, 0x44, 0x42, 0x62, 0x59, 0x36, + 0x34, 0x62, 0x4f, 0x2f, 0x46, 0x63, 0x65, 0x45, 0x78, 0x68, 0x6a, 0x63, + 0x79, 0x6b, 0x67, 0x61, 0x59, 0x74, 0x43, 0x48, 0x2f, 0x6d, 0x0a, 0x6f, + 0x49, 0x55, 0x36, 0x33, 0x2b, 0x43, 0x46, 0x4f, 0x54, 0x74, 0x52, 0x37, + 0x6f, 0x74, 0x79, 0x51, 0x41, 0x57, 0x48, 0x71, 0x58, 0x61, 0x37, 0x71, + 0x34, 0x53, 0x62, 0x43, 0x44, 0x6c, 0x47, 0x37, 0x44, 0x79, 0x52, 0x46, + 0x78, 0x71, 0x47, 0x30, 0x74, 0x78, 0x50, 0x74, 0x47, 0x76, 0x79, 0x31, + 0x32, 0x6c, 0x67, 0x6c, 0x64, 0x41, 0x32, 0x2b, 0x52, 0x67, 0x63, 0x69, + 0x67, 0x51, 0x47, 0x0a, 0x44, 0x66, 0x63, 0x6f, 0x67, 0x35, 0x77, 0x72, + 0x4a, 0x79, 0x74, 0x61, 0x51, 0x36, 0x55, 0x41, 0x30, 0x77, 0x45, 0x3d, + 0x0a, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x45, 0x4e, 0x44, 0x20, 0x43, 0x45, + 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2d, 0x2d, 0x2d, + 0x2d, 0x2d, 0x0a}; From 951abee1747686bcf8d8ec93251b813d7186784c Mon Sep 17 00:00:00 2001 From: jiangtaoli2016 Date: Fri, 20 Mar 2020 16:49:15 -0700 Subject: [PATCH 246/758] Revert "Append old ca.pem" This reverts commit 13c6b6c612d0740e118e3e3139f81cd850bdd29f. --- src/core/tsi/test_creds/README | 3 - src/core/tsi/test_creds/ca.pem | 15 ---- .../Grpc.IntegrationTesting/data/ca.pem | 15 ---- .../test-certificates.pem | 15 ---- src/php/tests/data/ca.pem | 15 ---- .../tests/interop/credentials/ca.pem | 15 ---- .../tests/unit/credentials/ca.pem | 15 ---- src/ruby/spec/testdata/ca.pem | 15 ---- test/core/end2end/data/test_root_cert.cc | 74 +------------------ 9 files changed, 1 insertion(+), 181 deletions(-) diff --git a/src/core/tsi/test_creds/README b/src/core/tsi/test_creds/README index dc33d320caf..645fe9fe502 100644 --- a/src/core/tsi/test_creds/README +++ b/src/core/tsi/test_creds/README @@ -87,6 +87,3 @@ src/python/grpcio_tests/tests/interop/credentials/ src/python/grpcio_tests/tests/unit/credentials/ src/ruby/spec/testdata/ test/core/end2end/data/ - -Please also append old ca.pem into new ca.pem so that tests in the old releases -are interopable with tests in the new releases. diff --git a/src/core/tsi/test_creds/ca.pem b/src/core/tsi/test_creds/ca.pem index 48f22fbbacb..49d39cd8ed5 100644 --- a/src/core/tsi/test_creds/ca.pem +++ b/src/core/tsi/test_creds/ca.pem @@ -18,18 +18,3 @@ CVTtdJB4CYWpcNyXOdqefrbJW5QNljxgi6Fhvs7JJkBqdXIkWXtFk2eRgOIP2Eo9 bewb0l+MhRig0/DVHamyVxrDRbqInU1/GTNCwcZkXKYFWSf92U+kIcTth24Q1gcw eZiLl5FfrWokUNytFElXob0V0a5/kbhiLc3yWmvWqHTpqCALbVyF+rKJo2f5Kw== -----END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICSjCCAbOgAwIBAgIJAJHGGR4dGioHMA0GCSqGSIb3DQEBCwUAMFYxCzAJBgNV -BAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBX -aWRnaXRzIFB0eSBMdGQxDzANBgNVBAMTBnRlc3RjYTAeFw0xNDExMTEyMjMxMjla -Fw0yNDExMDgyMjMxMjlaMFYxCzAJBgNVBAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0 -YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQxDzANBgNVBAMT -BnRlc3RjYTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwEDfBV5MYdlHVHJ7 -+L4nxrZy7mBfAVXpOc5vMYztssUI7mL2/iYujiIXM+weZYNTEpLdjyJdu7R5gGUu -g1jSVK/EPHfc74O7AyZU34PNIP4Sh33N+/A5YexrNgJlPY+E3GdVYi4ldWJjgkAd -Qah2PH5ACLrIIC6tRka9hcaBlIECAwEAAaMgMB4wDAYDVR0TBAUwAwEB/zAOBgNV -HQ8BAf8EBAMCAgQwDQYJKoZIhvcNAQELBQADgYEAHzC7jdYlzAVmddi/gdAeKPau -sPBG/C2HCWqHzpCUHcKuvMzDVkY/MP2o6JIW2DBbY64bO/FceExhjcykgaYtCH/m -oIU63+CFOTtR7otyQAWHqXa7q4SbCDlG7DyRFxqG0txPtGvy12lgldA2+RgcigQG -Dfcog5wrJytaQ6UA0wE= ------END CERTIFICATE----- diff --git a/src/csharp/Grpc.IntegrationTesting/data/ca.pem b/src/csharp/Grpc.IntegrationTesting/data/ca.pem index 48f22fbbacb..49d39cd8ed5 100644 --- a/src/csharp/Grpc.IntegrationTesting/data/ca.pem +++ b/src/csharp/Grpc.IntegrationTesting/data/ca.pem @@ -18,18 +18,3 @@ CVTtdJB4CYWpcNyXOdqefrbJW5QNljxgi6Fhvs7JJkBqdXIkWXtFk2eRgOIP2Eo9 bewb0l+MhRig0/DVHamyVxrDRbqInU1/GTNCwcZkXKYFWSf92U+kIcTth24Q1gcw eZiLl5FfrWokUNytFElXob0V0a5/kbhiLc3yWmvWqHTpqCALbVyF+rKJo2f5Kw== -----END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICSjCCAbOgAwIBAgIJAJHGGR4dGioHMA0GCSqGSIb3DQEBCwUAMFYxCzAJBgNV -BAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBX -aWRnaXRzIFB0eSBMdGQxDzANBgNVBAMTBnRlc3RjYTAeFw0xNDExMTEyMjMxMjla -Fw0yNDExMDgyMjMxMjlaMFYxCzAJBgNVBAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0 -YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQxDzANBgNVBAMT -BnRlc3RjYTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwEDfBV5MYdlHVHJ7 -+L4nxrZy7mBfAVXpOc5vMYztssUI7mL2/iYujiIXM+weZYNTEpLdjyJdu7R5gGUu -g1jSVK/EPHfc74O7AyZU34PNIP4Sh33N+/A5YexrNgJlPY+E3GdVYi4ldWJjgkAd -Qah2PH5ACLrIIC6tRka9hcaBlIECAwEAAaMgMB4wDAYDVR0TBAUwAwEB/zAOBgNV -HQ8BAf8EBAMCAgQwDQYJKoZIhvcNAQELBQADgYEAHzC7jdYlzAVmddi/gdAeKPau -sPBG/C2HCWqHzpCUHcKuvMzDVkY/MP2o6JIW2DBbY64bO/FceExhjcykgaYtCH/m -oIU63+CFOTtR7otyQAWHqXa7q4SbCDlG7DyRFxqG0txPtGvy12lgldA2+RgcigQG -Dfcog5wrJytaQ6UA0wE= ------END CERTIFICATE----- diff --git a/src/objective-c/tests/TestCertificates.bundle/test-certificates.pem b/src/objective-c/tests/TestCertificates.bundle/test-certificates.pem index 48f22fbbacb..49d39cd8ed5 100644 --- a/src/objective-c/tests/TestCertificates.bundle/test-certificates.pem +++ b/src/objective-c/tests/TestCertificates.bundle/test-certificates.pem @@ -18,18 +18,3 @@ CVTtdJB4CYWpcNyXOdqefrbJW5QNljxgi6Fhvs7JJkBqdXIkWXtFk2eRgOIP2Eo9 bewb0l+MhRig0/DVHamyVxrDRbqInU1/GTNCwcZkXKYFWSf92U+kIcTth24Q1gcw eZiLl5FfrWokUNytFElXob0V0a5/kbhiLc3yWmvWqHTpqCALbVyF+rKJo2f5Kw== -----END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICSjCCAbOgAwIBAgIJAJHGGR4dGioHMA0GCSqGSIb3DQEBCwUAMFYxCzAJBgNV -BAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBX -aWRnaXRzIFB0eSBMdGQxDzANBgNVBAMTBnRlc3RjYTAeFw0xNDExMTEyMjMxMjla -Fw0yNDExMDgyMjMxMjlaMFYxCzAJBgNVBAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0 -YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQxDzANBgNVBAMT -BnRlc3RjYTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwEDfBV5MYdlHVHJ7 -+L4nxrZy7mBfAVXpOc5vMYztssUI7mL2/iYujiIXM+weZYNTEpLdjyJdu7R5gGUu -g1jSVK/EPHfc74O7AyZU34PNIP4Sh33N+/A5YexrNgJlPY+E3GdVYi4ldWJjgkAd -Qah2PH5ACLrIIC6tRka9hcaBlIECAwEAAaMgMB4wDAYDVR0TBAUwAwEB/zAOBgNV -HQ8BAf8EBAMCAgQwDQYJKoZIhvcNAQELBQADgYEAHzC7jdYlzAVmddi/gdAeKPau -sPBG/C2HCWqHzpCUHcKuvMzDVkY/MP2o6JIW2DBbY64bO/FceExhjcykgaYtCH/m -oIU63+CFOTtR7otyQAWHqXa7q4SbCDlG7DyRFxqG0txPtGvy12lgldA2+RgcigQG -Dfcog5wrJytaQ6UA0wE= ------END CERTIFICATE----- diff --git a/src/php/tests/data/ca.pem b/src/php/tests/data/ca.pem index 48f22fbbacb..49d39cd8ed5 100755 --- a/src/php/tests/data/ca.pem +++ b/src/php/tests/data/ca.pem @@ -18,18 +18,3 @@ CVTtdJB4CYWpcNyXOdqefrbJW5QNljxgi6Fhvs7JJkBqdXIkWXtFk2eRgOIP2Eo9 bewb0l+MhRig0/DVHamyVxrDRbqInU1/GTNCwcZkXKYFWSf92U+kIcTth24Q1gcw eZiLl5FfrWokUNytFElXob0V0a5/kbhiLc3yWmvWqHTpqCALbVyF+rKJo2f5Kw== -----END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICSjCCAbOgAwIBAgIJAJHGGR4dGioHMA0GCSqGSIb3DQEBCwUAMFYxCzAJBgNV -BAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBX -aWRnaXRzIFB0eSBMdGQxDzANBgNVBAMTBnRlc3RjYTAeFw0xNDExMTEyMjMxMjla -Fw0yNDExMDgyMjMxMjlaMFYxCzAJBgNVBAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0 -YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQxDzANBgNVBAMT -BnRlc3RjYTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwEDfBV5MYdlHVHJ7 -+L4nxrZy7mBfAVXpOc5vMYztssUI7mL2/iYujiIXM+weZYNTEpLdjyJdu7R5gGUu -g1jSVK/EPHfc74O7AyZU34PNIP4Sh33N+/A5YexrNgJlPY+E3GdVYi4ldWJjgkAd -Qah2PH5ACLrIIC6tRka9hcaBlIECAwEAAaMgMB4wDAYDVR0TBAUwAwEB/zAOBgNV -HQ8BAf8EBAMCAgQwDQYJKoZIhvcNAQELBQADgYEAHzC7jdYlzAVmddi/gdAeKPau -sPBG/C2HCWqHzpCUHcKuvMzDVkY/MP2o6JIW2DBbY64bO/FceExhjcykgaYtCH/m -oIU63+CFOTtR7otyQAWHqXa7q4SbCDlG7DyRFxqG0txPtGvy12lgldA2+RgcigQG -Dfcog5wrJytaQ6UA0wE= ------END CERTIFICATE----- diff --git a/src/python/grpcio_tests/tests/interop/credentials/ca.pem b/src/python/grpcio_tests/tests/interop/credentials/ca.pem index 48f22fbbacb..49d39cd8ed5 100755 --- a/src/python/grpcio_tests/tests/interop/credentials/ca.pem +++ b/src/python/grpcio_tests/tests/interop/credentials/ca.pem @@ -18,18 +18,3 @@ CVTtdJB4CYWpcNyXOdqefrbJW5QNljxgi6Fhvs7JJkBqdXIkWXtFk2eRgOIP2Eo9 bewb0l+MhRig0/DVHamyVxrDRbqInU1/GTNCwcZkXKYFWSf92U+kIcTth24Q1gcw eZiLl5FfrWokUNytFElXob0V0a5/kbhiLc3yWmvWqHTpqCALbVyF+rKJo2f5Kw== -----END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICSjCCAbOgAwIBAgIJAJHGGR4dGioHMA0GCSqGSIb3DQEBCwUAMFYxCzAJBgNV -BAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBX -aWRnaXRzIFB0eSBMdGQxDzANBgNVBAMTBnRlc3RjYTAeFw0xNDExMTEyMjMxMjla -Fw0yNDExMDgyMjMxMjlaMFYxCzAJBgNVBAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0 -YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQxDzANBgNVBAMT -BnRlc3RjYTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwEDfBV5MYdlHVHJ7 -+L4nxrZy7mBfAVXpOc5vMYztssUI7mL2/iYujiIXM+weZYNTEpLdjyJdu7R5gGUu -g1jSVK/EPHfc74O7AyZU34PNIP4Sh33N+/A5YexrNgJlPY+E3GdVYi4ldWJjgkAd -Qah2PH5ACLrIIC6tRka9hcaBlIECAwEAAaMgMB4wDAYDVR0TBAUwAwEB/zAOBgNV -HQ8BAf8EBAMCAgQwDQYJKoZIhvcNAQELBQADgYEAHzC7jdYlzAVmddi/gdAeKPau -sPBG/C2HCWqHzpCUHcKuvMzDVkY/MP2o6JIW2DBbY64bO/FceExhjcykgaYtCH/m -oIU63+CFOTtR7otyQAWHqXa7q4SbCDlG7DyRFxqG0txPtGvy12lgldA2+RgcigQG -Dfcog5wrJytaQ6UA0wE= ------END CERTIFICATE----- diff --git a/src/python/grpcio_tests/tests/unit/credentials/ca.pem b/src/python/grpcio_tests/tests/unit/credentials/ca.pem index 48f22fbbacb..49d39cd8ed5 100755 --- a/src/python/grpcio_tests/tests/unit/credentials/ca.pem +++ b/src/python/grpcio_tests/tests/unit/credentials/ca.pem @@ -18,18 +18,3 @@ CVTtdJB4CYWpcNyXOdqefrbJW5QNljxgi6Fhvs7JJkBqdXIkWXtFk2eRgOIP2Eo9 bewb0l+MhRig0/DVHamyVxrDRbqInU1/GTNCwcZkXKYFWSf92U+kIcTth24Q1gcw eZiLl5FfrWokUNytFElXob0V0a5/kbhiLc3yWmvWqHTpqCALbVyF+rKJo2f5Kw== -----END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICSjCCAbOgAwIBAgIJAJHGGR4dGioHMA0GCSqGSIb3DQEBCwUAMFYxCzAJBgNV -BAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBX -aWRnaXRzIFB0eSBMdGQxDzANBgNVBAMTBnRlc3RjYTAeFw0xNDExMTEyMjMxMjla -Fw0yNDExMDgyMjMxMjlaMFYxCzAJBgNVBAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0 -YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQxDzANBgNVBAMT -BnRlc3RjYTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwEDfBV5MYdlHVHJ7 -+L4nxrZy7mBfAVXpOc5vMYztssUI7mL2/iYujiIXM+weZYNTEpLdjyJdu7R5gGUu -g1jSVK/EPHfc74O7AyZU34PNIP4Sh33N+/A5YexrNgJlPY+E3GdVYi4ldWJjgkAd -Qah2PH5ACLrIIC6tRka9hcaBlIECAwEAAaMgMB4wDAYDVR0TBAUwAwEB/zAOBgNV -HQ8BAf8EBAMCAgQwDQYJKoZIhvcNAQELBQADgYEAHzC7jdYlzAVmddi/gdAeKPau -sPBG/C2HCWqHzpCUHcKuvMzDVkY/MP2o6JIW2DBbY64bO/FceExhjcykgaYtCH/m -oIU63+CFOTtR7otyQAWHqXa7q4SbCDlG7DyRFxqG0txPtGvy12lgldA2+RgcigQG -Dfcog5wrJytaQ6UA0wE= ------END CERTIFICATE----- diff --git a/src/ruby/spec/testdata/ca.pem b/src/ruby/spec/testdata/ca.pem index 48f22fbbacb..49d39cd8ed5 100755 --- a/src/ruby/spec/testdata/ca.pem +++ b/src/ruby/spec/testdata/ca.pem @@ -18,18 +18,3 @@ CVTtdJB4CYWpcNyXOdqefrbJW5QNljxgi6Fhvs7JJkBqdXIkWXtFk2eRgOIP2Eo9 bewb0l+MhRig0/DVHamyVxrDRbqInU1/GTNCwcZkXKYFWSf92U+kIcTth24Q1gcw eZiLl5FfrWokUNytFElXob0V0a5/kbhiLc3yWmvWqHTpqCALbVyF+rKJo2f5Kw== -----END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICSjCCAbOgAwIBAgIJAJHGGR4dGioHMA0GCSqGSIb3DQEBCwUAMFYxCzAJBgNV -BAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBX -aWRnaXRzIFB0eSBMdGQxDzANBgNVBAMTBnRlc3RjYTAeFw0xNDExMTEyMjMxMjla -Fw0yNDExMDgyMjMxMjlaMFYxCzAJBgNVBAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0 -YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQxDzANBgNVBAMT -BnRlc3RjYTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwEDfBV5MYdlHVHJ7 -+L4nxrZy7mBfAVXpOc5vMYztssUI7mL2/iYujiIXM+weZYNTEpLdjyJdu7R5gGUu -g1jSVK/EPHfc74O7AyZU34PNIP4Sh33N+/A5YexrNgJlPY+E3GdVYi4ldWJjgkAd -Qah2PH5ACLrIIC6tRka9hcaBlIECAwEAAaMgMB4wDAYDVR0TBAUwAwEB/zAOBgNV -HQ8BAf8EBAMCAgQwDQYJKoZIhvcNAQELBQADgYEAHzC7jdYlzAVmddi/gdAeKPau -sPBG/C2HCWqHzpCUHcKuvMzDVkY/MP2o6JIW2DBbY64bO/FceExhjcykgaYtCH/m -oIU63+CFOTtR7otyQAWHqXa7q4SbCDlG7DyRFxqG0txPtGvy12lgldA2+RgcigQG -Dfcog5wrJytaQ6UA0wE= ------END CERTIFICATE----- diff --git a/test/core/end2end/data/test_root_cert.cc b/test/core/end2end/data/test_root_cert.cc index 0735cfb5ad6..3fbe7e74cee 100644 --- a/test/core/end2end/data/test_root_cert.cc +++ b/test/core/end2end/data/test_root_cert.cc @@ -118,76 +118,4 @@ extern const char test_root_cert[] = { 0x70, 0x71, 0x43, 0x41, 0x4c, 0x62, 0x56, 0x79, 0x46, 0x2b, 0x72, 0x4b, 0x4a, 0x6f, 0x32, 0x66, 0x35, 0x4b, 0x77, 0x3d, 0x3d, 0x0a, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x45, 0x4e, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, - 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, - 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x42, 0x45, 0x47, 0x49, 0x4e, 0x20, 0x43, - 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2d, 0x2d, - 0x2d, 0x2d, 0x2d, 0x0a, 0x4d, 0x49, 0x49, 0x43, 0x53, 0x6a, 0x43, 0x43, - 0x41, 0x62, 0x4f, 0x67, 0x41, 0x77, 0x49, 0x42, 0x41, 0x67, 0x49, 0x4a, - 0x41, 0x4a, 0x48, 0x47, 0x47, 0x52, 0x34, 0x64, 0x47, 0x69, 0x6f, 0x48, - 0x4d, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, 0x33, - 0x44, 0x51, 0x45, 0x42, 0x43, 0x77, 0x55, 0x41, 0x4d, 0x46, 0x59, 0x78, - 0x43, 0x7a, 0x41, 0x4a, 0x42, 0x67, 0x4e, 0x56, 0x0a, 0x42, 0x41, 0x59, - 0x54, 0x41, 0x6b, 0x46, 0x56, 0x4d, 0x52, 0x4d, 0x77, 0x45, 0x51, 0x59, - 0x44, 0x56, 0x51, 0x51, 0x49, 0x45, 0x77, 0x70, 0x54, 0x62, 0x32, 0x31, - 0x6c, 0x4c, 0x56, 0x4e, 0x30, 0x59, 0x58, 0x52, 0x6c, 0x4d, 0x53, 0x45, - 0x77, 0x48, 0x77, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4b, 0x45, 0x78, 0x68, - 0x4a, 0x62, 0x6e, 0x52, 0x6c, 0x63, 0x6d, 0x35, 0x6c, 0x64, 0x43, 0x42, - 0x58, 0x0a, 0x61, 0x57, 0x52, 0x6e, 0x61, 0x58, 0x52, 0x7a, 0x49, 0x46, - 0x42, 0x30, 0x65, 0x53, 0x42, 0x4d, 0x64, 0x47, 0x51, 0x78, 0x44, 0x7a, - 0x41, 0x4e, 0x42, 0x67, 0x4e, 0x56, 0x42, 0x41, 0x4d, 0x54, 0x42, 0x6e, - 0x52, 0x6c, 0x63, 0x33, 0x52, 0x6a, 0x59, 0x54, 0x41, 0x65, 0x46, 0x77, - 0x30, 0x78, 0x4e, 0x44, 0x45, 0x78, 0x4d, 0x54, 0x45, 0x79, 0x4d, 0x6a, - 0x4d, 0x78, 0x4d, 0x6a, 0x6c, 0x61, 0x0a, 0x46, 0x77, 0x30, 0x79, 0x4e, - 0x44, 0x45, 0x78, 0x4d, 0x44, 0x67, 0x79, 0x4d, 0x6a, 0x4d, 0x78, 0x4d, - 0x6a, 0x6c, 0x61, 0x4d, 0x46, 0x59, 0x78, 0x43, 0x7a, 0x41, 0x4a, 0x42, - 0x67, 0x4e, 0x56, 0x42, 0x41, 0x59, 0x54, 0x41, 0x6b, 0x46, 0x56, 0x4d, - 0x52, 0x4d, 0x77, 0x45, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x49, 0x45, - 0x77, 0x70, 0x54, 0x62, 0x32, 0x31, 0x6c, 0x4c, 0x56, 0x4e, 0x30, 0x0a, - 0x59, 0x58, 0x52, 0x6c, 0x4d, 0x53, 0x45, 0x77, 0x48, 0x77, 0x59, 0x44, - 0x56, 0x51, 0x51, 0x4b, 0x45, 0x78, 0x68, 0x4a, 0x62, 0x6e, 0x52, 0x6c, - 0x63, 0x6d, 0x35, 0x6c, 0x64, 0x43, 0x42, 0x58, 0x61, 0x57, 0x52, 0x6e, - 0x61, 0x58, 0x52, 0x7a, 0x49, 0x46, 0x42, 0x30, 0x65, 0x53, 0x42, 0x4d, - 0x64, 0x47, 0x51, 0x78, 0x44, 0x7a, 0x41, 0x4e, 0x42, 0x67, 0x4e, 0x56, - 0x42, 0x41, 0x4d, 0x54, 0x0a, 0x42, 0x6e, 0x52, 0x6c, 0x63, 0x33, 0x52, - 0x6a, 0x59, 0x54, 0x43, 0x42, 0x6e, 0x7a, 0x41, 0x4e, 0x42, 0x67, 0x6b, - 0x71, 0x68, 0x6b, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, 0x45, - 0x46, 0x41, 0x41, 0x4f, 0x42, 0x6a, 0x51, 0x41, 0x77, 0x67, 0x59, 0x6b, - 0x43, 0x67, 0x59, 0x45, 0x41, 0x77, 0x45, 0x44, 0x66, 0x42, 0x56, 0x35, - 0x4d, 0x59, 0x64, 0x6c, 0x48, 0x56, 0x48, 0x4a, 0x37, 0x0a, 0x2b, 0x4c, - 0x34, 0x6e, 0x78, 0x72, 0x5a, 0x79, 0x37, 0x6d, 0x42, 0x66, 0x41, 0x56, - 0x58, 0x70, 0x4f, 0x63, 0x35, 0x76, 0x4d, 0x59, 0x7a, 0x74, 0x73, 0x73, - 0x55, 0x49, 0x37, 0x6d, 0x4c, 0x32, 0x2f, 0x69, 0x59, 0x75, 0x6a, 0x69, - 0x49, 0x58, 0x4d, 0x2b, 0x77, 0x65, 0x5a, 0x59, 0x4e, 0x54, 0x45, 0x70, - 0x4c, 0x64, 0x6a, 0x79, 0x4a, 0x64, 0x75, 0x37, 0x52, 0x35, 0x67, 0x47, - 0x55, 0x75, 0x0a, 0x67, 0x31, 0x6a, 0x53, 0x56, 0x4b, 0x2f, 0x45, 0x50, - 0x48, 0x66, 0x63, 0x37, 0x34, 0x4f, 0x37, 0x41, 0x79, 0x5a, 0x55, 0x33, - 0x34, 0x50, 0x4e, 0x49, 0x50, 0x34, 0x53, 0x68, 0x33, 0x33, 0x4e, 0x2b, - 0x2f, 0x41, 0x35, 0x59, 0x65, 0x78, 0x72, 0x4e, 0x67, 0x4a, 0x6c, 0x50, - 0x59, 0x2b, 0x45, 0x33, 0x47, 0x64, 0x56, 0x59, 0x69, 0x34, 0x6c, 0x64, - 0x57, 0x4a, 0x6a, 0x67, 0x6b, 0x41, 0x64, 0x0a, 0x51, 0x61, 0x68, 0x32, - 0x50, 0x48, 0x35, 0x41, 0x43, 0x4c, 0x72, 0x49, 0x49, 0x43, 0x36, 0x74, - 0x52, 0x6b, 0x61, 0x39, 0x68, 0x63, 0x61, 0x42, 0x6c, 0x49, 0x45, 0x43, - 0x41, 0x77, 0x45, 0x41, 0x41, 0x61, 0x4d, 0x67, 0x4d, 0x42, 0x34, 0x77, - 0x44, 0x41, 0x59, 0x44, 0x56, 0x52, 0x30, 0x54, 0x42, 0x41, 0x55, 0x77, - 0x41, 0x77, 0x45, 0x42, 0x2f, 0x7a, 0x41, 0x4f, 0x42, 0x67, 0x4e, 0x56, - 0x0a, 0x48, 0x51, 0x38, 0x42, 0x41, 0x66, 0x38, 0x45, 0x42, 0x41, 0x4d, - 0x43, 0x41, 0x67, 0x51, 0x77, 0x44, 0x51, 0x59, 0x4a, 0x4b, 0x6f, 0x5a, - 0x49, 0x68, 0x76, 0x63, 0x4e, 0x41, 0x51, 0x45, 0x4c, 0x42, 0x51, 0x41, - 0x44, 0x67, 0x59, 0x45, 0x41, 0x48, 0x7a, 0x43, 0x37, 0x6a, 0x64, 0x59, - 0x6c, 0x7a, 0x41, 0x56, 0x6d, 0x64, 0x64, 0x69, 0x2f, 0x67, 0x64, 0x41, - 0x65, 0x4b, 0x50, 0x61, 0x75, 0x0a, 0x73, 0x50, 0x42, 0x47, 0x2f, 0x43, - 0x32, 0x48, 0x43, 0x57, 0x71, 0x48, 0x7a, 0x70, 0x43, 0x55, 0x48, 0x63, - 0x4b, 0x75, 0x76, 0x4d, 0x7a, 0x44, 0x56, 0x6b, 0x59, 0x2f, 0x4d, 0x50, - 0x32, 0x6f, 0x36, 0x4a, 0x49, 0x57, 0x32, 0x44, 0x42, 0x62, 0x59, 0x36, - 0x34, 0x62, 0x4f, 0x2f, 0x46, 0x63, 0x65, 0x45, 0x78, 0x68, 0x6a, 0x63, - 0x79, 0x6b, 0x67, 0x61, 0x59, 0x74, 0x43, 0x48, 0x2f, 0x6d, 0x0a, 0x6f, - 0x49, 0x55, 0x36, 0x33, 0x2b, 0x43, 0x46, 0x4f, 0x54, 0x74, 0x52, 0x37, - 0x6f, 0x74, 0x79, 0x51, 0x41, 0x57, 0x48, 0x71, 0x58, 0x61, 0x37, 0x71, - 0x34, 0x53, 0x62, 0x43, 0x44, 0x6c, 0x47, 0x37, 0x44, 0x79, 0x52, 0x46, - 0x78, 0x71, 0x47, 0x30, 0x74, 0x78, 0x50, 0x74, 0x47, 0x76, 0x79, 0x31, - 0x32, 0x6c, 0x67, 0x6c, 0x64, 0x41, 0x32, 0x2b, 0x52, 0x67, 0x63, 0x69, - 0x67, 0x51, 0x47, 0x0a, 0x44, 0x66, 0x63, 0x6f, 0x67, 0x35, 0x77, 0x72, - 0x4a, 0x79, 0x74, 0x61, 0x51, 0x36, 0x55, 0x41, 0x30, 0x77, 0x45, 0x3d, - 0x0a, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x45, 0x4e, 0x44, 0x20, 0x43, 0x45, - 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2d, 0x2d, 0x2d, - 0x2d, 0x2d, 0x0a}; + 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a}; From fe426fc6f539e766cc08670f1f89d4c21d8588c4 Mon Sep 17 00:00:00 2001 From: April Schleck Date: Sat, 21 Mar 2020 19:46:03 -0700 Subject: [PATCH 247/758] Make check_call_host not segfault when overridden_target_name_ is null. This was broken by 40dd4a3301ff554c9715e99863b41dde05003035. --- .../security_connector/ssl/ssl_security_connector.cc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc b/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc index 47fdf3ff7fd..bbbe189bb09 100644 --- a/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +++ b/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc @@ -191,8 +191,10 @@ class grpc_ssl_channel_security_connector final grpc_closure* /*on_call_host_checked*/, grpc_error** error) override { return grpc_ssl_check_call_host(host, target_name_.get(), - overridden_target_name_.get(), auth_context, - error); + overridden_target_name_ != nullptr + ? overridden_target_name_.get() + : "", + auth_context, error); } void cancel_check_call_host(grpc_closure* /*on_call_host_checked*/, From 53fc4e5c133104c019b2511e321e9b64286a0d20 Mon Sep 17 00:00:00 2001 From: Ashitha Santhosh Date: Sun, 22 Mar 2020 01:10:43 -0700 Subject: [PATCH 248/758] Fixed error --- .../tsi/alts/handshaker/alts_handshaker_client_test.cc | 8 ++++---- .../core/tsi/alts/handshaker/alts_tsi_handshaker_test.cc | 9 +++++---- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/test/core/tsi/alts/handshaker/alts_handshaker_client_test.cc b/test/core/tsi/alts/handshaker/alts_handshaker_client_test.cc index e28bda1d059..5f9a4b2d745 100644 --- a/test/core/tsi/alts/handshaker/alts_handshaker_client_test.cc +++ b/test/core/tsi/alts/handshaker/alts_handshaker_client_test.cc @@ -197,8 +197,8 @@ static grpc_call_error check_client_start_success(grpc_call* /*call*/, GPR_ASSERT(upb_strview_eql( grpc_gcp_StartClientHandshakeReq_target_name(client_start), upb_strview_makez(ALTS_HANDSHAKER_CLIENT_TEST_TARGET_NAME))); - GPR_ASSERT(grpc_gcp_StartClientHandshakeReq_max_frame_size( - client_start, ALTS_HANDSHAKER_CLIENT_TEST_MAX_FRAME_SIZE)); + GPR_ASSERT(grpc_gcp_StartClientHandshakeReq_max_frame_size(client_start) == + ALTS_HANDSHAKER_CLIENT_TEST_MAX_FRAME_SIZE); GPR_ASSERT(validate_op(client, op, nops, true /* is_start */)); return GRPC_CALL_OK; } @@ -247,8 +247,8 @@ static grpc_call_error check_server_start_success(grpc_call* /*call*/, upb_strview_makez(ALTS_RECORD_PROTOCOL))); validate_rpc_protocol_versions( grpc_gcp_StartServerHandshakeReq_rpc_versions(server_start)); - GPR_ASSERT(grpc_gcp_StartServerHandshakeReq_max_frame_size( - server_start, ALTS_HANDSHAKER_CLIENT_TEST_MAX_FRAME_SIZE)); + GPR_ASSERT(grpc_gcp_StartServerHandshakeReq_max_frame_size(server_start) == + ALTS_HANDSHAKER_CLIENT_TEST_MAX_FRAME_SIZE); GPR_ASSERT(validate_op(client, op, nops, true /* is_start */)); return GRPC_CALL_OK; } diff --git a/test/core/tsi/alts/handshaker/alts_tsi_handshaker_test.cc b/test/core/tsi/alts/handshaker/alts_tsi_handshaker_test.cc index a58e36df62f..0abab1f8ae2 100644 --- a/test/core/tsi/alts/handshaker/alts_tsi_handshaker_test.cc +++ b/test/core/tsi/alts/handshaker/alts_tsi_handshaker_test.cc @@ -27,6 +27,7 @@ #include "src/core/tsi/alts/handshaker/alts_shared_resource.h" #include "src/core/tsi/alts/handshaker/alts_tsi_handshaker.h" #include "src/core/tsi/alts/handshaker/alts_tsi_handshaker_private.h" +#include "src/core/tsi/transport_security_grpc.h" #include "src/proto/grpc/gcp/altscontext.upb.h" #include "test/core/tsi/alts/handshaker/alts_handshaker_service_api_test_lib.h" #include "test/core/util/test_config.h" @@ -291,13 +292,13 @@ static void on_client_next_success_cb(tsi_result status, void* user_data, // Validate max frame size value after Frame Size Negotiation. Here peer max // frame size is greater than default value, and user specified max frame size // is absent. - tsi_zero_copy_grpc_protector* zero_copy_protector; + tsi_zero_copy_grpc_protector* zero_copy_protector = nullptr; GPR_ASSERT(tsi_handshaker_result_create_zero_copy_frame_protector( result, nullptr, &zero_copy_protector) == TSI_OK); size_t actual_max_frame_size; tsi_zero_copy_grpc_protector_max_frame_size(zero_copy_protector, &actual_max_frame_size); - GPR_ASSERT(actual_max_frame_size, + GPR_ASSERT(actual_max_frame_size == ALTS_TSI_HANDSHAKER_TEST_DEFAULT_MAX_FRAME_SIZE); /* Validate peer identity. */ tsi_peer peer; @@ -362,7 +363,7 @@ static void on_server_next_success_cb(tsi_result status, void* user_data, // Validate max frame size value after Frame Size Negotiation. The negotiated // frame size value equals minimum send frame size, due to the absence of peer // max frame size. - tsi_zero_copy_grpc_protector* zero_copy_protector; + tsi_zero_copy_grpc_protector* zero_copy_protector = nullptr; size_t user_specified_max_frame_size = ALTS_TSI_HANDSHAKER_TEST_MAX_FRAME_SIZE; GPR_ASSERT(tsi_handshaker_result_create_zero_copy_frame_protector( @@ -371,7 +372,7 @@ static void on_server_next_success_cb(tsi_result status, void* user_data, size_t actual_max_frame_size; tsi_zero_copy_grpc_protector_max_frame_size(zero_copy_protector, &actual_max_frame_size); - GPR_ASSERT(actual_max_frame_size, ALTS_TSI_HANDSHAKER_TEST_MIN_FRAME_SIZE); + GPR_ASSERT(actual_max_frame_size == ALTS_TSI_HANDSHAKER_TEST_MIN_FRAME_SIZE); /* Validate peer identity. */ tsi_peer peer; GPR_ASSERT(tsi_handshaker_result_extract_peer(result, &peer) == TSI_OK); From 4d41a56e178d39ecf4874c18c2dccef29bbfec24 Mon Sep 17 00:00:00 2001 From: jiangtaoli2016 Date: Sun, 22 Mar 2020 22:34:55 -0700 Subject: [PATCH 249/758] SSL peer match name case-insensitive --- src/core/tsi/ssl_transport_security.cc | 6 ++++-- test/core/tsi/ssl_transport_security_test.cc | 3 +++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/core/tsi/ssl_transport_security.cc b/src/core/tsi/ssl_transport_security.cc index 3f4aa96de6f..cb74590db3d 100644 --- a/src/core/tsi/ssl_transport_security.cc +++ b/src/core/tsi/ssl_transport_security.cc @@ -35,6 +35,8 @@ #include #endif +#include "absl/strings/match.h" + #include #include #include @@ -1658,7 +1660,7 @@ static int does_entry_match_name(grpc_core::StringView entry, if (entry.empty()) return 0; } - if (name == entry) { + if (absl::EqualsIgnoreCase(name, entry)) { return 1; /* Perfect match. */ } if (entry.front() != '*') return 0; @@ -1685,7 +1687,7 @@ static int does_entry_match_name(grpc_core::StringView entry, if (name_subdomain.back() == '.') { name_subdomain.remove_suffix(1); } - return !entry.empty() && name_subdomain == entry; + return !entry.empty() && absl::EqualsIgnoreCase(name_subdomain, entry); } static int ssl_server_handshaker_factory_servername_callback(SSL* ssl, diff --git a/test/core/tsi/ssl_transport_security_test.cc b/test/core/tsi/ssl_transport_security_test.cc index 844a12c261e..2f86f5c9c97 100644 --- a/test/core/tsi/ssl_transport_security_test.cc +++ b/test/core/tsi/ssl_transport_security_test.cc @@ -235,6 +235,9 @@ void check_server0_peer(tsi_peer* peer) { nullptr); GPR_ASSERT(tsi_ssl_peer_matches_name(peer, "foo.test.google.com.au") == 1); GPR_ASSERT(tsi_ssl_peer_matches_name(peer, "bar.test.google.com.au") == 1); + GPR_ASSERT(tsi_ssl_peer_matches_name(peer, "BAR.TEST.GOOGLE.COM.AU") == 1); + GPR_ASSERT(tsi_ssl_peer_matches_name(peer, "Bar.Test.Google.Com.Au") == 1); + GPR_ASSERT(tsi_ssl_peer_matches_name(peer, "bAr.TeST.gOOgle.cOm.AU") == 1); GPR_ASSERT(tsi_ssl_peer_matches_name(peer, "bar.test.google.blah") == 0); GPR_ASSERT(tsi_ssl_peer_matches_name(peer, "foo.bar.test.google.com.au") == 0); From 9e1110cb1190553a9f9fe8e191ceaf43699ba38b Mon Sep 17 00:00:00 2001 From: Eric Gribkoff Date: Sun, 22 Mar 2020 18:53:02 -0700 Subject: [PATCH 250/758] Split logs by test case and run client separately for each test --- tools/internal_ci/linux/grpc_xds.cfg | 6 + tools/run_tests/python_utils/report_utils.py | 6 +- tools/run_tests/run_xds_tests.py | 159 +++++++++++-------- 3 files changed, 106 insertions(+), 65 deletions(-) diff --git a/tools/internal_ci/linux/grpc_xds.cfg b/tools/internal_ci/linux/grpc_xds.cfg index 888be05cde5..62dc527a5e3 100644 --- a/tools/internal_ci/linux/grpc_xds.cfg +++ b/tools/internal_ci/linux/grpc_xds.cfg @@ -21,3 +21,9 @@ env_vars { key: "BAZEL_SCRIPT" value: "tools/internal_ci/linux/grpc_xds_bazel_test_in_docker.sh" } +action { + define_artifacts { + regex: "**/*sponge_log.*" + regex: "github/grpc/reports/**" + } +} diff --git a/tools/run_tests/python_utils/report_utils.py b/tools/run_tests/python_utils/report_utils.py index 43aaf50af04..666edbf63d6 100644 --- a/tools/run_tests/python_utils/report_utils.py +++ b/tools/run_tests/python_utils/report_utils.py @@ -31,9 +31,9 @@ def _filter_msg(msg, output_format): if output_format in ['XML', 'HTML']: # keep whitespaces but remove formfeed and vertical tab characters # that make XML report unparsable. - filtered_msg = filter( - lambda x: x in string.printable and x != '\f' and x != '\v', - msg.decode('UTF-8', 'ignore')) + filtered_msg = ''.join( + filter(lambda x: x in string.printable and x != '\f' and x != '\v', + msg.decode('UTF-8', 'ignore'))) if output_format == 'HTML': filtered_msg = filtered_msg.replace('"', '"') return filtered_msg diff --git a/tools/run_tests/run_xds_tests.py b/tools/run_tests/run_xds_tests.py index 21e09e550d2..55620684b10 100755 --- a/tools/run_tests/run_xds_tests.py +++ b/tools/run_tests/run_xds_tests.py @@ -29,6 +29,9 @@ import time from oauth2client.client import GoogleCredentials +import python_utils.jobset as jobset +import python_utils.report_utils as report_utils + from src.proto.grpc.testing import messages_pb2 from src.proto.grpc.testing import test_pb2_grpc @@ -38,6 +41,26 @@ formatter = logging.Formatter(fmt='%(asctime)s: %(levelname)-8s %(message)s') console_handler.setFormatter(formatter) logger.addHandler(console_handler) +_TEST_CASES = [ + 'backends_restart', + 'change_backend_service', + 'new_instance_group_receives_traffic', + 'ping_pong', + 'remove_instance_group', + 'round_robin', + 'secondary_locality_gets_no_requests_on_partial_primary_failure', + 'secondary_locality_gets_requests_on_primary_failure', +] + + +def parse_test_cases(arg): + if arg == 'all': + return _TEST_CASES + test_cases = arg.split(',') + if all([test_case in _TEST_CASES for test_case in test_cases]): + return test_cases + raise Exception('Failed to parse test cases %s' % arg) + def parse_port_range(port_arg): try: @@ -58,17 +81,9 @@ argp.add_argument( argp.add_argument( '--test_case', default='ping_pong', - choices=[ - 'all', - 'backends_restart', - 'change_backend_service', - 'new_instance_group_receives_traffic', - 'ping_pong', - 'remove_instance_group', - 'round_robin', - 'secondary_locality_gets_no_requests_on_partial_primary_failure', - 'secondary_locality_gets_requests_on_primary_failure', - ]) + type=parse_test_cases, + help='Comma-separated list of test cases to run, or \'all\' to run every ' + 'test. Available tests: %s' % ' '.join(_TEST_CASES)) argp.add_argument( '--client_cmd', default=None, @@ -183,6 +198,9 @@ _BASE_URL_MAP_NAME = 'test-map' _BASE_SERVICE_HOST = 'grpc-test' _BASE_TARGET_PROXY_NAME = 'test-target-proxy' _BASE_FORWARDING_RULE_NAME = 'test-forwarding-rule' +_TEST_LOG_BASE_DIR = 'reports' +_SPONGE_LOG_NAME = 'sponge_log.log' +_SPONGE_XML_NAME = 'sponge_log.xml' def get_client_stats(num_rpcs, timeout_sec): @@ -905,8 +923,6 @@ if args.compute_discovery_document: else: compute = googleapiclient.discovery.build('compute', 'v1') -client_process = None - try: gcp = GcpState(compute, args.project_id) health_check_name = _BASE_HEALTH_CHECK_NAME + args.gcp_suffix @@ -1034,56 +1050,75 @@ try: server_uri = service_host_name else: server_uri = service_host_name + ':' + str(gcp.service_port) - cmd = args.client_cmd.format(server_uri=server_uri, - stats_port=args.stats_port, - qps=args.qps) - client_process = start_xds_client(cmd) - - if args.test_case == 'all': - test_backends_restart(gcp, backend_service, instance_group) - test_change_backend_service(gcp, backend_service, instance_group, - alternate_backend_service, - same_zone_instance_group) - test_new_instance_group_receives_traffic(gcp, backend_service, - instance_group, - same_zone_instance_group) - test_ping_pong(gcp, backend_service, instance_group) - test_remove_instance_group(gcp, backend_service, instance_group, - same_zone_instance_group) - test_round_robin(gcp, backend_service, instance_group) - test_secondary_locality_gets_no_requests_on_partial_primary_failure( - gcp, backend_service, instance_group, secondary_zone_instance_group) - test_secondary_locality_gets_requests_on_primary_failure( - gcp, backend_service, instance_group, secondary_zone_instance_group) - elif args.test_case == 'backends_restart': - test_backends_restart(gcp, backend_service, instance_group) - elif args.test_case == 'change_backend_service': - test_change_backend_service(gcp, backend_service, instance_group, - alternate_backend_service, - same_zone_instance_group) - elif args.test_case == 'new_instance_group_receives_traffic': - test_new_instance_group_receives_traffic(gcp, backend_service, - instance_group, - same_zone_instance_group) - elif args.test_case == 'ping_pong': - test_ping_pong(gcp, backend_service, instance_group) - elif args.test_case == 'remove_instance_group': - test_remove_instance_group(gcp, backend_service, instance_group, - same_zone_instance_group) - elif args.test_case == 'round_robin': - test_round_robin(gcp, backend_service, instance_group) - elif args.test_case == 'secondary_locality_gets_no_requests_on_partial_primary_failure': - test_secondary_locality_gets_no_requests_on_partial_primary_failure( - gcp, backend_service, instance_group, secondary_zone_instance_group) - elif args.test_case == 'secondary_locality_gets_requests_on_primary_failure': - test_secondary_locality_gets_requests_on_primary_failure( - gcp, backend_service, instance_group, secondary_zone_instance_group) - else: - logger.error('Unknown test case: %s', args.test_case) - sys.exit(1) + with tempfile.NamedTemporaryFile(delete=False) as bootstrap_file: + bootstrap_file.write( + _BOOTSTRAP_TEMPLATE.format( + node_id=socket.gethostname()).encode('utf-8')) + bootstrap_path = bootstrap_file.name + client_env = dict(os.environ, GRPC_XDS_BOOTSTRAP=bootstrap_path) + client_cmd = shlex.split( + args.client_cmd.format(server_uri=server_uri, + stats_port=args.stats_port, + qps=args.qps)) + + test_results = {} + for test_case in args.test_case: + result = jobset.JobResult() + log_dir = os.path.join(_TEST_LOG_BASE_DIR, test_case) + if not os.path.exists(log_dir): + os.makedirs(log_dir) + test_log_file = open(os.path.join(log_dir, _SPONGE_LOG_NAME), 'w+') + try: + client_process = subprocess.Popen(client_cmd, + env=client_env, + stderr=subprocess.STDOUT, + stdout=test_log_file) + if test_case == 'backends_restart': + test_backends_restart(gcp, backend_service, instance_group) + elif test_case == 'change_backend_service': + test_change_backend_service(gcp, backend_service, + instance_group, + alternate_backend_service, + same_zone_instance_group) + elif test_case == 'new_instance_group_receives_traffic': + test_new_instance_group_receives_traffic( + gcp, backend_service, instance_group, + same_zone_instance_group) + elif test_case == 'ping_pong': + test_ping_pong(gcp, backend_service, instance_group) + elif test_case == 'remove_instance_group': + test_remove_instance_group(gcp, backend_service, instance_group, + same_zone_instance_group) + elif test_case == 'round_robin': + test_round_robin(gcp, backend_service, instance_group) + elif test_case == 'secondary_locality_gets_no_requests_on_partial_primary_failure': + test_secondary_locality_gets_no_requests_on_partial_primary_failure( + gcp, backend_service, instance_group, + secondary_zone_instance_group) + elif test_case == 'secondary_locality_gets_requests_on_primary_failure': + test_secondary_locality_gets_requests_on_primary_failure( + gcp, backend_service, instance_group, + secondary_zone_instance_group) + else: + logger.error('Unknown test case: %s', test_case) + sys.exit(1) + result.state = 'PASSED' + result.returncode = 0 + except Exception as e: + result.state = 'FAILED' + result.message = str(e).encode('UTF-8') + finally: + if client_process: + client_process.terminate() + test_results[test_case] = [result] + if not os.path.exists(_TEST_LOG_BASE_DIR): + os.makedirs(_TEST_LOG_BASE_DIR) + report_utils.render_junit_xml_report(test_results, + os.path.join(_TEST_LOG_BASE_DIR, + _SPONGE_XML_NAME), + suite_name='xds_tests', + multi_target=True) finally: - if client_process: - client_process.terminate() if not args.keep_gcp_resources: logger.info('Cleaning up GCP resources. This may take some time.') clean_up(gcp) From 7b0cdd43f4e54583f8028d6b5ed469cca8edc11b Mon Sep 17 00:00:00 2001 From: Eric Gribkoff Date: Mon, 23 Mar 2020 00:01:10 -0700 Subject: [PATCH 251/758] to revert: testing on kokoro --- tools/internal_ci/linux/grpc_python_bazel_test.cfg | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/tools/internal_ci/linux/grpc_python_bazel_test.cfg b/tools/internal_ci/linux/grpc_python_bazel_test.cfg index feae924330e..62dc527a5e3 100644 --- a/tools/internal_ci/linux/grpc_python_bazel_test.cfg +++ b/tools/internal_ci/linux/grpc_python_bazel_test.cfg @@ -1,4 +1,4 @@ -# Copyright 2018 gRPC authors. +# Copyright 2020 gRPC authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -16,8 +16,14 @@ # Location of the continuous shell script in repository. build_file: "grpc/tools/internal_ci/linux/grpc_bazel.sh" -timeout_mins: 240 +timeout_mins: 90 env_vars { key: "BAZEL_SCRIPT" - value: "tools/internal_ci/linux/grpc_python_bazel_test_in_docker.sh" + value: "tools/internal_ci/linux/grpc_xds_bazel_test_in_docker.sh" +} +action { + define_artifacts { + regex: "**/*sponge_log.*" + regex: "github/grpc/reports/**" + } } From 70ac4b641822a9abe474dc53cb017fadaf121267 Mon Sep 17 00:00:00 2001 From: Donna Dionne Date: Mon, 23 Mar 2020 00:34:14 -0700 Subject: [PATCH 252/758] Basic Parsing, building service config, and Picking are all exercised with basic tests. --- .../lb_policy/xds/xds_routing.cc | 193 +++++++++++++----- .../ext/filters/client_channel/xds/xds_api.cc | 82 +++++--- .../ext/filters/client_channel/xds/xds_api.h | 10 +- .../filters/client_channel/xds/xds_client.cc | 111 +++++++--- .../filters/client_channel/xds/xds_client.h | 9 +- .../grpc/testing/xds/lds_rds_for_test.proto | 1 + test/cpp/end2end/xds_end2end_test.cc | 85 ++++++++ 7 files changed, 383 insertions(+), 108 deletions(-) diff --git a/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc b/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc index 7e63263c750..2f409d6746b 100644 --- a/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc +++ b/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc @@ -21,6 +21,7 @@ #include #include "absl/strings/str_cat.h" +#include "absl/strings/str_split.h" #include @@ -52,17 +53,23 @@ class XdsRoutingLbConfig : public LoadBalancingPolicy::Config { RefCountedPtr config; }; + using Matcher = std::pair; + using RouteVector = std::vector>; using ActionMap = std::map; - explicit XdsRoutingLbConfig(ActionMap action_map) - : action_map_(std::move(action_map)) {} + explicit XdsRoutingLbConfig(ActionMap action_map, RouteVector route_vector) + : action_map_(std::move(action_map)), + route_vector_(std::move(route_vector)) {} const char* name() const override { return kXdsRouting; } const ActionMap& action_map() const { return action_map_; } + const RouteVector& route_vector() const { return route_vector_; } + private: ActionMap action_map_; + RouteVector route_vector_; }; // xds_routing LB policy. @@ -80,12 +87,15 @@ class XdsRoutingLb : public LoadBalancingPolicy { // A simple wrapper for ref-counting a picker from the child policy. class ChildPickerWrapper : public RefCounted { public: - explicit ChildPickerWrapper(std::unique_ptr picker) - : picker_(std::move(picker)) {} - PickResult Pick(PickArgs args) { - return picker_->Pick(std::move(args)); } + explicit ChildPickerWrapper(const std::string& name, + std::unique_ptr picker) + : name_(name), picker_(std::move(picker)) {} + PickResult Pick(PickArgs args) { return picker_->Pick(std::move(args)); } + + std::string name() { return name_; } private: + std::string name_; std::unique_ptr picker_; }; @@ -99,7 +109,9 @@ class XdsRoutingLb : public LoadBalancingPolicy { // is the previous value in the vector and is 0 for the first element. using PickerList = InlinedVector, 1>; - XdsRoutingPicker(RefCountedPtr parent, PickerList pickers) + using PickerMap = std::map>; + + XdsRoutingPicker(RefCountedPtr parent, PickerMap pickers) : parent_(std::move(parent)), pickers_(std::move(pickers)) {} ~XdsRoutingPicker() { parent_.reset(DEBUG_LOCATION, "XdsRoutingPicker"); } @@ -107,13 +119,14 @@ class XdsRoutingLb : public LoadBalancingPolicy { private: RefCountedPtr parent_; - PickerList pickers_; + PickerMap pickers_; }; // Each XdsRoutingChild holds a ref to its parent XdsRoutingLb. class XdsRoutingChild : public InternallyRefCounted { public: - XdsRoutingChild(RefCountedPtr xds_routing_policy, const std::string& name); + XdsRoutingChild(RefCountedPtr xds_routing_policy, + const std::string& name); ~XdsRoutingChild(); void Orphan() override; @@ -132,6 +145,8 @@ class XdsRoutingLb : public LoadBalancingPolicy { return picker_wrapper_; } + std::string name() const { return name_; } + private: class Helper : public ChannelControlHelper { public: @@ -200,8 +215,31 @@ class XdsRoutingLb : public LoadBalancingPolicy { // XdsRoutingLb::PickResult XdsRoutingLb::XdsRoutingPicker::Pick(PickArgs args) { - gpr_log(GPR_INFO, "donna picked first first"); - return pickers_[0]->Pick(args); + std::string path; + for (const auto& p : *(args.initial_metadata)) { + if (memcmp(p.first.data(), ":path", static_cast(p.first.size())) == + 0) { + path = std::string(p.second.data(), static_cast(p.second.size())); + break; + } + } + std::vector v = absl::StrSplit(path, '/'); + GPR_DEBUG_ASSERT(v.size() == 3); + std::string service = v[1]; + std::string method = v[2]; + for (int i = 0; i < parent_->config_->route_vector().size(); ++i) { + if (service == parent_->config_->route_vector()[i].first.first && + ("" == parent_->config_->route_vector()[i].first.second || + method == parent_->config_->route_vector()[i].first.second)) { + auto picker = pickers_.find(parent_->config_->route_vector()[i].second); + if (picker != pickers_.end()) { + gpr_log(GPR_INFO, "XdsRouting Picked: %s for path %s", + picker->first.c_str(), path.c_str()); + return picker->second.get()->Pick(args); + } + } + } + return pickers_.begin()->second.get()->Pick(args); } // @@ -217,7 +255,8 @@ XdsRoutingLb::XdsRoutingLb(Args args) XdsRoutingLb::~XdsRoutingLb() { if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_routing_lb_trace)) { - gpr_log(GPR_INFO, "[xds_routing_lb %p] destroying xds_routing LB policy", this); + gpr_log(GPR_INFO, "[xds_routing_lb %p] destroying xds_routing LB policy", + this); } } @@ -266,8 +305,8 @@ void XdsRoutingLb::UpdateLocked(UpdateArgs args) { auto it = actions_.find(name); if (it == actions_.end()) { it = actions_.emplace(std::make_pair(name, nullptr)).first; - it->second = - MakeOrphanable(Ref(DEBUG_LOCATION, "XdsRoutingChild"), it->first); + it->second = MakeOrphanable( + Ref(DEBUG_LOCATION, "XdsRoutingChild"), it->first); } it->second->UpdateLocked(config, args.addresses, args.args); } @@ -278,7 +317,7 @@ void XdsRoutingLb::UpdateStateLocked() { // that are ready. Each child is represented by a portion of the range // proportional to its weight, such that the total range is the sum of the // weights of all children. - XdsRoutingPicker::PickerList picker_list; + XdsRoutingPicker::PickerMap picker_map; // Also count the number of children in each state, to determine the // overall state. size_t num_connecting = 0; @@ -293,7 +332,7 @@ void XdsRoutingLb::UpdateStateLocked() { } switch (child->connectivity_state()) { case GRPC_CHANNEL_READY: { - picker_list.push_back(child->picker_wrapper()); + picker_map[child_name] = child->picker_wrapper(); break; } case GRPC_CHANNEL_CONNECTING: { @@ -314,7 +353,7 @@ void XdsRoutingLb::UpdateStateLocked() { } // Determine aggregated connectivity state. grpc_connectivity_state connectivity_state; - if (picker_list.size() > 0) { + if (picker_map.size() > 0) { connectivity_state = GRPC_CHANNEL_READY; } else if (num_connecting > 0) { connectivity_state = GRPC_CHANNEL_CONNECTING; @@ -330,8 +369,8 @@ void XdsRoutingLb::UpdateStateLocked() { std::unique_ptr picker; switch (connectivity_state) { case GRPC_CHANNEL_READY: - picker = absl::make_unique(Ref(DEBUG_LOCATION, "XdsRoutingPicker"), - std::move(picker_list)); + picker = absl::make_unique( + Ref(DEBUG_LOCATION, "XdsRoutingPicker"), std::move(picker_map)); break; case GRPC_CHANNEL_CONNECTING: case GRPC_CHANNEL_IDLE: @@ -350,8 +389,8 @@ void XdsRoutingLb::UpdateStateLocked() { // XdsRoutingLb::XdsRoutingChild // -XdsRoutingLb::XdsRoutingChild::XdsRoutingChild(RefCountedPtr xds_routing_policy, - const std::string& name) +XdsRoutingLb::XdsRoutingChild::XdsRoutingChild( + RefCountedPtr xds_routing_policy, const std::string& name) : xds_routing_policy_(std::move(xds_routing_policy)), name_(name) { if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_routing_lb_trace)) { gpr_log(GPR_INFO, "[xds_routing_lb %p] created XdsRoutingChild %p for %s", @@ -361,7 +400,8 @@ XdsRoutingLb::XdsRoutingChild::XdsRoutingChild(RefCountedPtr xds_r XdsRoutingLb::XdsRoutingChild::~XdsRoutingChild() { if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_routing_lb_trace)) { - gpr_log(GPR_INFO, "[xds_routing_lb %p] XdsRoutingChild %p %s: destroying child", + gpr_log(GPR_INFO, + "[xds_routing_lb %p] XdsRoutingChild %p %s: destroying child", xds_routing_policy_.get(), this, name_.c_str()); } xds_routing_policy_.reset(DEBUG_LOCATION, "XdsRoutingChild"); @@ -369,7 +409,8 @@ XdsRoutingLb::XdsRoutingChild::~XdsRoutingChild() { void XdsRoutingLb::XdsRoutingChild::Orphan() { if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_routing_lb_trace)) { - gpr_log(GPR_INFO, "[xds_routing_lb %p] XdsRoutingChild %p %s: shutting down child", + gpr_log(GPR_INFO, + "[xds_routing_lb %p] XdsRoutingChild %p %s: shutting down child", xds_routing_policy_.get(), this, name_.c_str()); } // Remove the child policy's interested_parties pollset_set from the @@ -387,7 +428,8 @@ void XdsRoutingLb::XdsRoutingChild::Orphan() { Unref(); } -OrphanablePtr XdsRoutingLb::XdsRoutingChild::CreateChildPolicyLocked( +OrphanablePtr +XdsRoutingLb::XdsRoutingChild::CreateChildPolicyLocked( const grpc_channel_args* args) { LoadBalancingPolicy::Args lb_policy_args; lb_policy_args.combiner = xds_routing_policy_->combiner(); @@ -411,9 +453,9 @@ OrphanablePtr XdsRoutingLb::XdsRoutingChild::CreateChildPol return lb_policy; } -void XdsRoutingLb::XdsRoutingChild::UpdateLocked(const XdsRoutingLbConfig::ChildConfig& config, - const ServerAddressList& addresses, - const grpc_channel_args* args) { +void XdsRoutingLb::XdsRoutingChild::UpdateLocked( + const XdsRoutingLbConfig::ChildConfig& config, + const ServerAddressList& addresses, const grpc_channel_args* args) { if (xds_routing_policy_->shutting_down_) return; // Update child weight. // Reactivate if needed. @@ -434,12 +476,15 @@ void XdsRoutingLb::XdsRoutingChild::UpdateLocked(const XdsRoutingLbConfig::Child gpr_log(GPR_INFO, "[xds_routing_lb %p] XdsRoutingChild %p %s: Updating child " "policy handler %p", - xds_routing_policy_.get(), this, name_.c_str(), child_policy_.get()); + xds_routing_policy_.get(), this, name_.c_str(), + child_policy_.get()); } child_policy_->UpdateLocked(std::move(update_args)); } -void XdsRoutingLb::XdsRoutingChild::ExitIdleLocked() { child_policy_->ExitIdleLocked(); } +void XdsRoutingLb::XdsRoutingChild::ExitIdleLocked() { + child_policy_->ExitIdleLocked(); +} void XdsRoutingLb::XdsRoutingChild::ResetBackoffLocked() { child_policy_->ResetBackoffLocked(); @@ -459,7 +504,8 @@ void XdsRoutingLb::XdsRoutingChild::DeactivateLocked() { delayed_removal_timer_callback_pending_ = true; } -void XdsRoutingLb::XdsRoutingChild::OnDelayedRemovalTimer(void* arg, grpc_error* error) { +void XdsRoutingLb::XdsRoutingChild::OnDelayedRemovalTimer(void* arg, + grpc_error* error) { XdsRoutingChild* self = static_cast(arg); self->xds_routing_policy_->combiner()->Run( GRPC_CLOSURE_INIT(&self->on_delayed_removal_timer_, @@ -467,8 +513,8 @@ void XdsRoutingLb::XdsRoutingChild::OnDelayedRemovalTimer(void* arg, grpc_error* GRPC_ERROR_REF(error)); } -void XdsRoutingLb::XdsRoutingChild::OnDelayedRemovalTimerLocked(void* arg, - grpc_error* error) { +void XdsRoutingLb::XdsRoutingChild::OnDelayedRemovalTimerLocked( + void* arg, grpc_error* error) { XdsRoutingChild* self = static_cast(arg); self->delayed_removal_timer_callback_pending_ = false; if (error == GRPC_ERROR_NONE && !self->shutdown_) { @@ -481,21 +527,23 @@ void XdsRoutingLb::XdsRoutingChild::OnDelayedRemovalTimerLocked(void* arg, // XdsRoutingLb::XdsRoutingChild::Helper // -RefCountedPtr XdsRoutingLb::XdsRoutingChild::Helper::CreateSubchannel( +RefCountedPtr +XdsRoutingLb::XdsRoutingChild::Helper::CreateSubchannel( const grpc_channel_args& args) { - gpr_log(GPR_INFO, "donna XdsRoutingChild::Helper::CreateSubchannel"); + gpr_log(GPR_INFO, "XdsRoutingChild::Helper::CreateSubchannel"); if (xds_routing_child_->xds_routing_policy_->shutting_down_) return nullptr; - return xds_routing_child_->xds_routing_policy_->channel_control_helper()->CreateSubchannel( - args); + return xds_routing_child_->xds_routing_policy_->channel_control_helper() + ->CreateSubchannel(args); } void XdsRoutingLb::XdsRoutingChild::Helper::UpdateState( grpc_connectivity_state state, std::unique_ptr picker) { - gpr_log(GPR_INFO, "donna XdsRoutingChild::Helper::UpdateState"); + gpr_log(GPR_INFO, "XdsRoutingChild::Helper::UpdateState %s", + xds_routing_child_->name().c_str()); if (xds_routing_child_->xds_routing_policy_->shutting_down_) return; // Cache the picker in the XdsRoutingChild. - xds_routing_child_->picker_wrapper_ = - MakeRefCounted(std::move(picker)); + xds_routing_child_->picker_wrapper_ = MakeRefCounted( + xds_routing_child_->name(), std::move(picker)); // Decide what state to report for aggregation purposes. // If we haven't seen a failure since the last time we were in state // READY, then we report the state change as-is. However, once we do see @@ -516,14 +564,15 @@ void XdsRoutingLb::XdsRoutingChild::Helper::UpdateState( void XdsRoutingLb::XdsRoutingChild::Helper::RequestReresolution() { if (xds_routing_child_->xds_routing_policy_->shutting_down_) return; - xds_routing_child_->xds_routing_policy_->channel_control_helper()->RequestReresolution(); + xds_routing_child_->xds_routing_policy_->channel_control_helper() + ->RequestReresolution(); } -void XdsRoutingLb::XdsRoutingChild::Helper::AddTraceEvent(TraceSeverity severity, - StringView message) { +void XdsRoutingLb::XdsRoutingChild::Helper::AddTraceEvent( + TraceSeverity severity, StringView message) { if (xds_routing_child_->xds_routing_policy_->shutting_down_) return; - xds_routing_child_->xds_routing_policy_->channel_control_helper()->AddTraceEvent(severity, - message); + xds_routing_child_->xds_routing_policy_->channel_control_helper() + ->AddTraceEvent(severity, message); } // @@ -565,11 +614,14 @@ class XdsRoutingLbFactory : public LoadBalancingPolicyFactory { for (const auto& p : it->second.array_value()) { auto it_cds = p.object_value().find("cds"); auto it_weighted_target = p.object_value().find("weighted_target"); - if (it_cds == p.object_value().end() && it_weighted_target == p.object_value().end()) { + if (it_cds == p.object_value().end() && + it_weighted_target == p.object_value().end()) { error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "field:actions error: each action needs to be either cds or weighted target")); + "field:actions error: each action needs to be either cds or " + "weighted target")); } - auto it_name = (it_cds == p.object_value().end() ? it_weighted_target : it_cds); + auto it_name = + (it_cds == p.object_value().end() ? it_weighted_target : it_cds); auto it_child_policy = p.object_value().find("child_policy"); if (it_child_policy == p.object_value().end()) { error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( @@ -594,12 +646,57 @@ class XdsRoutingLbFactory : public LoadBalancingPolicyFactory { } } } + XdsRoutingLbConfig::RouteVector route_vector; + auto route_iter = json.object_value().find("routes"); + if (route_iter == json.object_value().end()) { + gpr_log(GPR_INFO, "No routes specified"); + } else if (route_iter->second.type() != Json::Type::ARRAY) { + error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "field:routes error:type should be array")); + } else { + for (const auto& p : route_iter->second.array_value()) { + auto method_name = p.object_value().find("methodName"); + if (method_name == p.object_value().end()) { + error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "field:routes error:methodName is required")); + } else { + auto action_name = p.object_value().find("action"); + if (action_name == p.object_value().end()) { + error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "field:routes error:action is required")); + } else { + XdsRoutingLbConfig::Matcher matcher; + auto service = method_name->second.object_value().find("service"); + auto method = method_name->second.object_value().find("method"); + if (service == method_name->second.object_value().end() && + method != method_name->second.object_value().end()) { + error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "field:methodName error: service is empty when method is " + "not")); + } + if (service != method_name->second.object_value().end()) { + matcher.first = service->second.string_value(); + } else { + matcher.first = ""; + } + if (method != method_name->second.object_value().end()) { + matcher.second = method->second.string_value(); + } else { + matcher.first = ""; + } + route_vector.emplace_back(matcher, + action_name->second.string_value()); + } + } + } + } if (!error_list.empty()) { *error = GRPC_ERROR_CREATE_FROM_VECTOR( "xds_routing_experimental LB policy config", &error_list); return nullptr; } - return MakeRefCounted(std::move(action_map)); + return MakeRefCounted(std::move(action_map), + std::move(route_vector)); } private: diff --git a/src/core/ext/filters/client_channel/xds/xds_api.cc b/src/core/ext/filters/client_channel/xds/xds_api.cc index 9f0b17f5865..b8a07c95bf0 100644 --- a/src/core/ext/filters/client_channel/xds/xds_api.cc +++ b/src/core/ext/filters/client_channel/xds/xds_api.cc @@ -24,6 +24,7 @@ #include "absl/strings/str_cat.h" #include "absl/strings/str_join.h" +#include "absl/strings/str_split.h" #include #include @@ -1011,34 +1012,61 @@ grpc_error* RouteConfigParse( return GRPC_ERROR_CREATE_FROM_STATIC_STRING( "No route found in the virtual host."); } - // Only look at the last one in the route list (the default route), - const envoy_api_v2_route_Route* route = routes[size - 1]; - // Validate that the match field must have a prefix field which is an empty - // string. - const envoy_api_v2_route_RouteMatch* match = - envoy_api_v2_route_Route_match(route); - if (!envoy_api_v2_route_RouteMatch_has_prefix(match)) { - return GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "No prefix field found in RouteMatch."); - } - const upb_strview prefix = envoy_api_v2_route_RouteMatch_prefix(match); - if (!upb_strview_eql(prefix, upb_strview_makez(""))) { - return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Prefix is not empty string."); - } - if (!envoy_api_v2_route_Route_has_route(route)) { - return GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "No RouteAction found in route."); - } - const envoy_api_v2_route_RouteAction* route_action = - envoy_api_v2_route_Route_route(route); - // Get the cluster in the RouteAction. - if (!envoy_api_v2_route_RouteAction_has_cluster(route_action)) { - return GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "No cluster found in RouteAction."); + + for (size_t i = 0; i < size; ++i) { + const envoy_api_v2_route_Route* route = routes[i]; + const envoy_api_v2_route_RouteMatch* match = + envoy_api_v2_route_Route_match(route); + XdsApi::RdsRoute rds_route; + const upb_strview prefix = envoy_api_v2_route_RouteMatch_prefix(match); + const upb_strview path = envoy_api_v2_route_RouteMatch_path(match); + if (!upb_strview_eql(prefix, upb_strview_makez(""))) { + std::string prefix_string = std::string(prefix.data, prefix.size); + std::vector v = absl::StrSplit(prefix_string, '/'); + if (v.size() != 2) { + return GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "Prefix not in the required format of /service/"); + } + rds_route.service = v[1]; + if (!upb_strview_eql(path, upb_strview_makez(""))) { + return GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "Prefix is not empty string, path cannot also be non-empty."); + } + } else if (!upb_strview_eql(path, upb_strview_makez(""))) { + std::string path_string = std::string(path.data, path.size); + std::vector v = absl::StrSplit(path_string, '/'); + if (v.size() != 3) { + return GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "Path not in the required format of /service/method"); + } + rds_route.service = v[1]; + rds_route.method = v[2]; + if (!upb_strview_eql(prefix, upb_strview_makez(""))) { + return GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "Path is not empty string, prefix cannot also be non-empty."); + } + } + if (!envoy_api_v2_route_Route_has_route(route)) { + return GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "No RouteAction found in route."); + } + const envoy_api_v2_route_RouteAction* route_action = + envoy_api_v2_route_Route_route(route); + // Get the cluster in the RouteAction. + if (!envoy_api_v2_route_RouteAction_has_cluster(route_action)) { + return GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "No cluster found in RouteAction."); + } + const upb_strview action = + envoy_api_v2_route_RouteAction_cluster(route_action); + rds_route.action_name = std::string(action.data, action.size); + rds_update->routes.emplace_back(std::move(rds_route)); + gpr_log(GPR_INFO, "RouteConfigParse a route %s %s %s %s", + rds_update->routes[i].service.c_str(), + rds_update->routes[i].method.c_str(), + rds_update->routes[i].action_type.c_str(), + rds_update->routes[i].action_name.c_str()); } - const upb_strview cluster = - envoy_api_v2_route_RouteAction_cluster(route_action); - rds_update->cluster_name = std::string(cluster.data, cluster.size); return GRPC_ERROR_NONE; } diff --git a/src/core/ext/filters/client_channel/xds/xds_api.h b/src/core/ext/filters/client_channel/xds/xds_api.h index b428aa4bbc7..175f2d3a28a 100644 --- a/src/core/ext/filters/client_channel/xds/xds_api.h +++ b/src/core/ext/filters/client_channel/xds/xds_api.h @@ -43,9 +43,15 @@ class XdsApi { static const char* kCdsTypeUrl; static const char* kEdsTypeUrl; + struct RdsRoute { + std::string service; + std::string method; + std::string action_type; + std::string action_name; + }; + struct RdsUpdate { - // The name to use in the CDS request. - std::string cluster_name; + std::vector routes; }; struct LdsUpdate { diff --git a/src/core/ext/filters/client_channel/xds/xds_client.cc b/src/core/ext/filters/client_channel/xds/xds_client.cc index 11ef7252cca..0e9cd5c0c29 100644 --- a/src/core/ext/filters/client_channel/xds/xds_client.cc +++ b/src/core/ext/filters/client_channel/xds/xds_client.cc @@ -890,7 +890,7 @@ void XdsClient::ChannelState::AdsCallState::AcceptLdsUpdate( } const std::string& cluster_name = lds_update->rds_update.has_value() - ? lds_update->rds_update.value().cluster_name + ? lds_update->rds_update.value().routes[0].action_name : ""; if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) { gpr_log(GPR_INFO, @@ -898,6 +898,11 @@ void XdsClient::ChannelState::AdsCallState::AcceptLdsUpdate( "cluster_name=%s (empty if RDS is needed to obtain it)", xds_client(), lds_update->route_config_name.c_str(), cluster_name.c_str()); + for (auto route : lds_update->rds_update.value().routes) { + gpr_log(GPR_INFO, "Create service config using %s %s %s %s", + route.service.c_str(), route.method.c_str(), + route.action_type.c_str(), route.action_name.c_str()); + } } auto& lds_state = state_map_[XdsApi::kLdsTypeUrl]; auto& state = lds_state.subscribed_resources[xds_client()->server_name_]; @@ -917,15 +922,15 @@ void XdsClient::ChannelState::AdsCallState::AcceptLdsUpdate( XdsApi::kRdsTypeUrl, xds_client()->route_config_name_, /*delay_unsubscription=*/!lds_update->route_config_name.empty()); } - xds_client()->route_config_name_ = std::move(lds_update->route_config_name); + xds_client()->route_config_name_ = lds_update->route_config_name; if (lds_update->rds_update.has_value()) { // If cluster_name was found inlined in LDS response, notify the watcher // immediately. xds_client()->cluster_name_ = - std::move(lds_update->rds_update.value().cluster_name); + lds_update->rds_update.value().routes[0].action_name; RefCountedPtr service_config; grpc_error* error = xds_client()->CreateServiceConfig( - xds_client()->cluster_name_, &service_config); + lds_update->rds_update.value(), &service_config); if (error == GRPC_ERROR_NONE) { xds_client()->service_config_watcher_->OnServiceConfigChanged( std::move(service_config)); @@ -951,14 +956,14 @@ void XdsClient::ChannelState::AdsCallState::AcceptRdsUpdate( } if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) { gpr_log(GPR_INFO, "[xds_client %p] RDS update received: cluster_name=%s", - xds_client(), rds_update->cluster_name.c_str()); + xds_client(), rds_update->routes[0].action_name.c_str()); } auto& rds_state = state_map_[XdsApi::kRdsTypeUrl]; auto& state = rds_state.subscribed_resources[xds_client()->route_config_name_]; if (state != nullptr) state->Finish(); // Ignore identical update. - if (xds_client()->cluster_name_ == rds_update->cluster_name) { + if (xds_client()->cluster_name_ == rds_update->routes[0].action_name) { if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) { gpr_log(GPR_INFO, "[xds_client %p] RDS update identical to current, ignoring.", @@ -966,11 +971,11 @@ void XdsClient::ChannelState::AdsCallState::AcceptRdsUpdate( } return; } - xds_client()->cluster_name_ = std::move(rds_update->cluster_name); + xds_client()->cluster_name_ = rds_update->routes[0].action_name; // Notify the watcher. RefCountedPtr service_config; - grpc_error* error = xds_client()->CreateServiceConfig( - xds_client()->cluster_name_, &service_config); + grpc_error* error = + xds_client()->CreateServiceConfig(rds_update.value(), &service_config); if (error == GRPC_ERROR_NONE) { xds_client()->service_config_watcher_->OnServiceConfigChanged( std::move(service_config)); @@ -2038,38 +2043,84 @@ void XdsClient::ResetBackoff() { } } -grpc_error* XdsClient::CreateServiceConfig( - const std::string& cluster_name, - RefCountedPtr* service_config) const { +char* XdsClient::CreateServiceConfigActionCluster( + const std::string& cluster_name, const bool without_comma) const { + const char* last_line = without_comma ? "}" : "},"; char* json; gpr_asprintf(&json, - "{\n" - " \"loadBalancingConfig\":[\n" - " { \"xds_routing_experimental\":{\n" - " \"actions\":[\n" - " { \"cds\": \"cluster_1\",\n" - " \"child_policy\":[\n" - " { \"cds_experimental\":{\n" - " \"cluster\": \"%s\"\n" - " } },\n" - " { \"cds_experimental\":{\n" - " \"cluster\": \"%s\"\n" - " } }\n" - " ]\n" - " },\n" - " { \"cds\": \"cluster_2\",\n" + " { \"cds\": \"%s\",\n" " \"child_policy\":[\n" " { \"cds_experimental\":{\n" " \"cluster\": \"%s\"\n" " } }\n" " ]\n" - " } ]\n" + " %s\n", + cluster_name.c_str(), cluster_name.c_str(), last_line); + return json; +} + +char* XdsClient::CreateServiceConfigRoute(const std::string& cluster_name, + const std::string& service, + const std::string& method, + const bool without_comma) const { + const char* last_line = without_comma ? "}" : "},"; + char* json; + gpr_asprintf(&json, + " { \"methodName\":\n" + " { \"service\": \"%s\",\n" + " \"method\": \"%s\"},\n" + " \"action\": \"%s\"\n" + " %s\n", + service.c_str(), method.c_str(), cluster_name.c_str(), + last_line); + return json; +} + +grpc_error* XdsClient::CreateServiceConfig( + const XdsApi::RdsUpdate& rds_update, + RefCountedPtr* service_config) const { + gpr_strvec v; + gpr_strvec_init(&v); + char* json_start; + gpr_asprintf(&json_start, + "{\n" + " \"loadBalancingConfig\":[\n" + " { \"xds_routing_experimental\":{\n" + " \"actions\":[\n"); + gpr_strvec_add(&v, json_start); + for (size_t i = 0; i < rds_update.routes.size(); ++i) { + auto route = rds_update.routes[i]; + // TODO: (donnadionne) CreateServiceConfigActionWeightedTarget + char* action = CreateServiceConfigActionCluster( + route.action_name.c_str(), i == (rds_update.routes.size() - 1)); + gpr_strvec_add(&v, action); + } + char* json_transition; + gpr_asprintf(&json_transition, + " ],\n" + " \"routes\":[\n"); + gpr_strvec_add(&v, json_transition); + for (size_t i = 0; i < rds_update.routes.size(); ++i) { + auto route_info = rds_update.routes[i]; + char* route = CreateServiceConfigRoute( + route_info.action_name.c_str(), route_info.service.c_str(), + route_info.method.c_str(), i == (rds_update.routes.size() - 1)); + gpr_strvec_add(&v, route); + } + char* json_end; + gpr_asprintf(&json_end, + " ]\n" " } }\n" " ]\n" - "}", - cluster_name.c_str(), "blah2", "blah3"); + "}"); + gpr_strvec_add(&v, json_end); + size_t len; + char* json = gpr_strvec_flatten(&v, &len); + gpr_strvec_destroy(&v); grpc_error* error = GRPC_ERROR_NONE; *service_config = ServiceConfig::Create(json, &error); + gpr_log(GPR_INFO, "Built service config: \"%s\"", + service_config->get()->json_string().c_str()); gpr_free(json); return error; } diff --git a/src/core/ext/filters/client_channel/xds/xds_client.h b/src/core/ext/filters/client_channel/xds/xds_client.h index 228b9a21b47..d29ac12e659 100644 --- a/src/core/ext/filters/client_channel/xds/xds_client.h +++ b/src/core/ext/filters/client_channel/xds/xds_client.h @@ -218,8 +218,15 @@ class XdsClient : public InternallyRefCounted { // Sends an error notification to all watchers. void NotifyOnError(grpc_error* error); + char* CreateServiceConfigActionCluster( + const std::string& cluster_name, const bool without_comma = false) const; + char* CreateServiceConfigRoute(const std::string& prefix, + const std::string& service, + const std::string& method, + const bool without_comma = false) const; + grpc_error* CreateServiceConfig( - const std::string& cluster_name, + const XdsApi::RdsUpdate& rds_update, RefCountedPtr* service_config) const; XdsApi::ClusterLoadReportMap BuildLoadReportSnapshot(); diff --git a/src/proto/grpc/testing/xds/lds_rds_for_test.proto b/src/proto/grpc/testing/xds/lds_rds_for_test.proto index 03d700c9017..acf2186115c 100644 --- a/src/proto/grpc/testing/xds/lds_rds_for_test.proto +++ b/src/proto/grpc/testing/xds/lds_rds_for_test.proto @@ -34,6 +34,7 @@ message RouteMatch { // If specified, the route is a prefix rule meaning that the prefix must // match the beginning of the *:path* header. string prefix = 1; + string path = 2; } } diff --git a/test/cpp/end2end/xds_end2end_test.cc b/test/cpp/end2end/xds_end2end_test.cc index 612f8d42c65..15c594cdf8d 100644 --- a/test/cpp/end2end/xds_end2end_test.cc +++ b/test/cpp/end2end/xds_end2end_test.cc @@ -1921,6 +1921,91 @@ TEST_P(LdsTest, Timeout) { CheckRpcSendFailure(); } +TEST_P(LdsTest, XdsRoutingPathMatching) { + const char* kNewClusterName = "new_cluster_name"; + SetNextResolution({}); + SetNextResolutionForLbChannelAllBalancers(); + AdsServiceImpl::EdsResourceArgs args({ + {"locality0", GetBackendPorts(0, 2)}, + }); + balancers_[0]->ads_service()->SetEdsResource( + AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); + // We need to wait for all backends to come online. + WaitForAllBackends(0, 2); + // Populate new EDS resource. + AdsServiceImpl::EdsResourceArgs args2({ + {"locality0", GetBackendPorts(2, 4)}, + }); + balancers_[0]->ads_service()->SetEdsResource( + AdsServiceImpl::BuildEdsResource(args2, kNewClusterName), + kNewClusterName); + // Populate new CDS resource. + Cluster new_cluster = balancers_[0]->ads_service()->default_cluster(); + new_cluster.set_name(kNewClusterName); + balancers_[0]->ads_service()->SetCdsResource(new_cluster, kNewClusterName); + // Change RDS resource to point to new cluster. + RouteConfiguration new_route_config = + balancers_[0]->ads_service()->default_route_config(); + new_route_config.mutable_virtual_hosts(0) + ->mutable_routes(0) + ->mutable_match() + ->set_path("/grpc.testing.EchoTestService/Echo"); + //->set_prefix("/dgrpc.testing.EchoTestService"); + new_route_config.mutable_virtual_hosts(0) + ->mutable_routes(0) + ->mutable_route() + ->set_cluster(kNewClusterName); + Listener listener = + balancers_[0]->ads_service()->BuildListener(new_route_config); + balancers_[0]->ads_service()->SetLdsResource(listener, kDefaultResourceName); + // Wait for all new backends to be used. + std::tuple counts = WaitForAllBackends(2, 4); + // Make sure no RPCs failed in the transition. + EXPECT_EQ(0, std::get<1>(counts)); +} + +TEST_P(LdsTest, XdsRoutingPrefixMatching) { + const char* kNewClusterName = "new_cluster_name"; + SetNextResolution({}); + SetNextResolutionForLbChannelAllBalancers(); + AdsServiceImpl::EdsResourceArgs args({ + {"locality0", GetBackendPorts(0, 2)}, + }); + balancers_[0]->ads_service()->SetEdsResource( + AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); + // We need to wait for all backends to come online. + WaitForAllBackends(0, 2); + // Populate new EDS resource. + AdsServiceImpl::EdsResourceArgs args2({ + {"locality0", GetBackendPorts(2, 4)}, + }); + balancers_[0]->ads_service()->SetEdsResource( + AdsServiceImpl::BuildEdsResource(args2, kNewClusterName), + kNewClusterName); + // Populate new CDS resource. + Cluster new_cluster = balancers_[0]->ads_service()->default_cluster(); + new_cluster.set_name(kNewClusterName); + balancers_[0]->ads_service()->SetCdsResource(new_cluster, kNewClusterName); + // Change RDS resource to point to new cluster. + RouteConfiguration new_route_config = + balancers_[0]->ads_service()->default_route_config(); + new_route_config.mutable_virtual_hosts(0) + ->mutable_routes(0) + ->mutable_match() + ->set_prefix("/grpc.testing.EchoTestService"); + new_route_config.mutable_virtual_hosts(0) + ->mutable_routes(0) + ->mutable_route() + ->set_cluster(kNewClusterName); + Listener listener = + balancers_[0]->ads_service()->BuildListener(new_route_config); + balancers_[0]->ads_service()->SetLdsResource(listener, kDefaultResourceName); + // Wait for all new backends to be used. + std::tuple counts = WaitForAllBackends(2, 4); + // Make sure no RPCs failed in the transition. + EXPECT_EQ(0, std::get<1>(counts)); +} + using RdsTest = BasicTest; // Tests that RDS client should send an ACK upon correct RDS response. From 343b5403df6cbff0845798ef305830e0ddecaeef Mon Sep 17 00:00:00 2001 From: "Mark D. Roth" Date: Fri, 20 Mar 2020 15:12:35 -0700 Subject: [PATCH 253/758] xds: Send RDS request when retrying ADS call. --- .../filters/client_channel/xds/xds_client.cc | 5 + test/cpp/end2end/xds_end2end_test.cc | 103 ++++++++++++++---- 2 files changed, 85 insertions(+), 23 deletions(-) diff --git a/src/core/ext/filters/client_channel/xds/xds_client.cc b/src/core/ext/filters/client_channel/xds/xds_client.cc index 40a3e66a513..9bd8231c584 100644 --- a/src/core/ext/filters/client_channel/xds/xds_client.cc +++ b/src/core/ext/filters/client_channel/xds/xds_client.cc @@ -716,6 +716,11 @@ XdsClient::ChannelState::AdsCallState::AdsCallState( grpc_schedule_on_exec_ctx); if (xds_client()->service_config_watcher_ != nullptr) { Subscribe(XdsApi::kLdsTypeUrl, xds_client()->server_name_); + if (xds_client()->lds_result_.has_value() && + !xds_client()->lds_result_->route_config_name.empty()) { + Subscribe(XdsApi::kRdsTypeUrl, + xds_client()->lds_result_->route_config_name); + } } for (const auto& p : xds_client()->cluster_map_) { Subscribe(XdsApi::kCdsTypeUrl, std::string(p.first)); diff --git a/test/cpp/end2end/xds_end2end_test.cc b/test/cpp/end2end/xds_end2end_test.cc index c0e5aba9dc9..0f4c26ea65e 100644 --- a/test/cpp/end2end/xds_end2end_test.cc +++ b/test/cpp/end2end/xds_end2end_test.cc @@ -577,6 +577,12 @@ class AdsServiceImpl : public AggregatedDiscoveryService::Service, Status StreamAggregatedResources(ServerContext* context, Stream* stream) override { gpr_log(GPR_INFO, "ADS[%p]: StreamAggregatedResources starts", this); + // Resources (type/name pairs) that have changed since the client + // subscribed to them. + UpdateQueue update_queue; + // Resources that the client will be subscribed to keyed by resource type + // url. + SubscriptionMap subscription_map; [&]() { { grpc_core::MutexLock lock(&ads_mu_); @@ -585,12 +591,6 @@ class AdsServiceImpl : public AggregatedDiscoveryService::Service, // Balancer shouldn't receive the call credentials metadata. EXPECT_EQ(context->client_metadata().find(g_kCallCredsMdKey), context->client_metadata().end()); - // Resources (type/name pairs) that have changed since the client - // subscribed to them. - UpdateQueue update_queue; - // Resources that the client will be subscribed to keyed by resource type - // url. - SubscriptionMap subscription_map; // Current Version map keyed by resource type url. std::map resource_type_version; // Creating blocking thread to read from stream. @@ -742,6 +742,21 @@ class AdsServiceImpl : public AggregatedDiscoveryService::Service, } reader.join(); }(); + // Clean up any subscriptions that were still active when the call finished. + { + grpc_core::MutexLock lock(&ads_mu_); + for (auto& p : subscription_map) { + const std::string& type_url = p.first; + SubscriptionNameMap& subscription_name_map = p.second; + for (auto& q : subscription_name_map) { + const std::string& resource_name = q.first; + SubscriptionState& subscription_state = q.second; + ResourceState& resource_state = + resource_map_[type_url][resource_name]; + resource_state.subscriptions.erase(&subscription_state); + } + } + } gpr_log(GPR_INFO, "ADS[%p]: StreamAggregatedResources done", this); return Status::OK; } @@ -857,7 +872,6 @@ class AdsServiceImpl : public AggregatedDiscoveryService::Service, { grpc_core::MutexLock lock(&ads_mu_); NotifyDoneWithAdsCallLocked(); - resource_map_.clear(); resource_type_response_state_.clear(); } gpr_log(GPR_INFO, "ADS[%p]: shut down", this); @@ -1072,8 +1086,7 @@ class XdsEnd2endTest : public ::testing::TestWithParam { protected: XdsEnd2endTest(size_t num_backends, size_t num_balancers, int client_load_reporting_interval_seconds = 100) - : server_host_("localhost"), - num_backends_(num_backends), + : num_backends_(num_backends), num_balancers_(num_balancers), client_load_reporting_interval_seconds_( client_load_reporting_interval_seconds) {} @@ -1101,7 +1114,7 @@ class XdsEnd2endTest : public ::testing::TestWithParam { // Start the backends. for (size_t i = 0; i < num_backends_; ++i) { backends_.emplace_back(new BackendServerThread); - backends_.back()->Start(server_host_); + backends_.back()->Start(); } // Start the load balancers. for (size_t i = 0; i < num_balancers_; ++i) { @@ -1109,7 +1122,7 @@ class XdsEnd2endTest : public ::testing::TestWithParam { new BalancerServerThread(GetParam().enable_load_reporting() ? client_load_reporting_interval_seconds_ : 0)); - balancers_.back()->Start(server_host_); + balancers_.back()->Start(); } ResetStub(); } @@ -1120,10 +1133,10 @@ class XdsEnd2endTest : public ::testing::TestWithParam { } void StartAllBackends() { - for (auto& backend : backends_) backend->Start(server_host_); + for (auto& backend : backends_) backend->Start(); } - void StartBackend(size_t index) { backends_[index]->Start(server_host_); } + void StartBackend(size_t index) { backends_[index]->Start(); } void ShutdownAllBackends() { for (auto& backend : backends_) backend->Shutdown(); @@ -1376,7 +1389,7 @@ class XdsEnd2endTest : public ::testing::TestWithParam { ServerThread() : port_(g_port_saver->GetPort()) {} virtual ~ServerThread(){}; - void Start(const grpc::string& server_host) { + void Start() { gpr_log(GPR_INFO, "starting %s server on port %d", Type(), port_); GPR_ASSERT(!running_); running_ = true; @@ -1386,19 +1399,18 @@ class XdsEnd2endTest : public ::testing::TestWithParam { // by ServerThread::Serve from firing before the wait below is hit. grpc_core::MutexLock lock(&mu); grpc_core::CondVar cond; - thread_.reset(new std::thread( - std::bind(&ServerThread::Serve, this, server_host, &mu, &cond))); + thread_.reset( + new std::thread(std::bind(&ServerThread::Serve, this, &mu, &cond))); cond.Wait(&mu); gpr_log(GPR_INFO, "%s server startup complete", Type()); } - void Serve(const grpc::string& server_host, grpc_core::Mutex* mu, - grpc_core::CondVar* cond) { + void Serve(grpc_core::Mutex* mu, grpc_core::CondVar* cond) { // We need to acquire the lock here in order to prevent the notify_one // below from firing before its corresponding wait is executed. grpc_core::MutexLock lock(mu); std::ostringstream server_address; - server_address << server_host << ":" << port_; + server_address << "localhost:" << port_; ServerBuilder builder; std::shared_ptr creds(new SecureServerCredentials( grpc_fake_transport_security_server_credentials_create())); @@ -1457,8 +1469,8 @@ class XdsEnd2endTest : public ::testing::TestWithParam { : ads_service_(new AdsServiceImpl(client_load_reporting_interval > 0)), lrs_service_(new LrsServiceImpl(client_load_reporting_interval)) {} - std::shared_ptr ads_service() { return ads_service_; } - std::shared_ptr lrs_service() { return lrs_service_; } + AdsServiceImpl* ads_service() { return ads_service_.get(); } + LrsServiceImpl* lrs_service() { return lrs_service_.get(); } private: void RegisterAllServices(ServerBuilder* builder) override { @@ -1482,7 +1494,6 @@ class XdsEnd2endTest : public ::testing::TestWithParam { std::shared_ptr lrs_service_; }; - const grpc::string server_host_; const size_t num_backends_; const size_t num_balancers_; const int client_load_reporting_interval_seconds_; @@ -1736,6 +1747,52 @@ TEST_P(XdsResolverOnlyTest, ClusterRemoved) { AdsServiceImpl::ACKED); } +// Tests that we restart all xDS requests when we reestablish the ADS call. +TEST_P(XdsResolverOnlyTest, RestartsRequestsUponReconnection) { + balancers_[0]->ads_service()->SetLdsToUseDynamicRds(); + const char* kNewClusterName = "new_cluster_name"; + SetNextResolution({}); + SetNextResolutionForLbChannelAllBalancers(); + AdsServiceImpl::EdsResourceArgs args({ + {"locality0", GetBackendPorts(0, 2)}, + }); + balancers_[0]->ads_service()->SetEdsResource( + AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); + // We need to wait for all backends to come online. + WaitForAllBackends(0, 2); + // Now shut down and restart the balancer. When the client + // reconnects, it should automatically restart the requests for all + // resource types. + balancers_[0]->Shutdown(); + balancers_[0]->Start(); + // Make sure things are still working. + CheckRpcSendOk(100); + // Populate new EDS resource. + AdsServiceImpl::EdsResourceArgs args2({ + {"locality0", GetBackendPorts(2, 4)}, + }); + balancers_[0]->ads_service()->SetEdsResource( + AdsServiceImpl::BuildEdsResource(args2, kNewClusterName), + kNewClusterName); + // Populate new CDS resource. + Cluster new_cluster = balancers_[0]->ads_service()->default_cluster(); + new_cluster.set_name(kNewClusterName); + balancers_[0]->ads_service()->SetCdsResource(new_cluster, kNewClusterName); + // Change RDS resource to point to new cluster. + RouteConfiguration new_route_config = + balancers_[0]->ads_service()->default_route_config(); + new_route_config.mutable_virtual_hosts(0) + ->mutable_routes(0) + ->mutable_route() + ->set_cluster(kNewClusterName); + balancers_[0]->ads_service()->SetRdsResource(new_route_config, + kDefaultResourceName); + // Wait for all new backends to be used. + std::tuple counts = WaitForAllBackends(2, 4); + // Make sure no RPCs failed in the transition. + EXPECT_EQ(0, std::get<1>(counts)); +} + class XdsResolverLoadReportingOnlyTest : public XdsEnd2endTest { public: XdsResolverLoadReportingOnlyTest() : XdsEnd2endTest(4, 1, 3) {} @@ -3473,7 +3530,7 @@ TEST_P(ClientLoadReportingTest, BalancerRestart) { int num_started = std::get<0>(WaitForAllBackends( /* start_index */ 0, /* stop_index */ kNumBackendsFirstPass)); // Now restart the balancer, this time pointing to the new backends. - balancers_[0]->Start(server_host_); + balancers_[0]->Start(); args = AdsServiceImpl::EdsResourceArgs({ {"locality0", GetBackendPorts(kNumBackendsFirstPass)}, }); From 94354b2b263c72f89983d9a4a68780c240016cab Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Mon, 23 Mar 2020 16:21:18 +0100 Subject: [PATCH 254/758] get rid of the long deprecated --incompatible_windows_native_test_wrapper flag --- tools/remote_build/windows.bazelrc | 3 --- 1 file changed, 3 deletions(-) diff --git a/tools/remote_build/windows.bazelrc b/tools/remote_build/windows.bazelrc index f4508e00d0f..4f6979478f9 100644 --- a/tools/remote_build/windows.bazelrc +++ b/tools/remote_build/windows.bazelrc @@ -38,9 +38,6 @@ build --define GRPC_PORT_ISOLATED_RUNTIME=1 build --test_tag_filters=-no_windows build --build_tag_filters=-no_windows -# required for the tests to pass on Windows RBE -build --incompatible_windows_native_test_wrapper - # without verbose gRPC logs the test outputs are not very useful test --test_env=GRPC_VERBOSITY=debug From f27c884dea5ef84cd3f9d379a309bc86c02ccadb Mon Sep 17 00:00:00 2001 From: Patrice Chalin Date: Mon, 23 Mar 2020 11:59:17 -0400 Subject: [PATCH 255/758] Add grpc-kotlin Contributes to https://github.com/grpc/grpc.io/issues/132 cc @dwiner @srini100 --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index d3eee331088..a392de0e7e0 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,7 @@ For instructions on how to use the language-specific gRPC runtime for a project, * [Dart](https://github.com/grpc/grpc-dart): pub package `grpc` * [Go](https://github.com/grpc/grpc-go): `go get google.golang.org/grpc` * [Java](https://github.com/grpc/grpc-java): Use JARs from Maven Central Repository + * [Kotlin](https://github.com/grpc/grpc-kotlin): Use JARs from Maven Central Repository * [Node](https://github.com/grpc/grpc-node): `npm install grpc` * [Objective-C](src/objective-c): Add `gRPC-ProtoRPC` dependency to podspec * [PHP](src/php): `pecl install grpc` @@ -77,8 +78,9 @@ Libraries in different languages may be in various states of development. We are | Language | Source repo | |-------------------------|------------------------------------------------------| -| Java | [grpc-java](https://github.com/grpc/grpc-java) | -| Go | [grpc-go](https://github.com/grpc/grpc-go) | +| Java | [grpc-java](https://github.com/grpc/grpc-java) | +| Kotlin | [grpc-kotlin](https://github.com/grpc/grpc-kotlin) | +| Go | [grpc-go](https://github.com/grpc/grpc-go) | | NodeJS | [grpc-node](https://github.com/grpc/grpc-node) | | WebJS | [grpc-web](https://github.com/grpc/grpc-web) | | Dart | [grpc-dart](https://github.com/grpc/grpc-dart) | From 1e73eebdfdecb1af09f3a532240ce7f80cf95e3c Mon Sep 17 00:00:00 2001 From: Patrice Chalin Date: Mon, 23 Mar 2020 12:06:19 -0400 Subject: [PATCH 256/758] Add Kotlin Contributes to https://github.com/grpc/grpc.io/issues/132 cc @dwiner @srini100 --- tools/package_hosting/home.xsl | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/package_hosting/home.xsl b/tools/package_hosting/home.xsl index 3f79303b1b7..8550953174c 100644 --- a/tools/package_hosting/home.xsl +++ b/tools/package_hosting/home.xsl @@ -46,6 +46,7 @@
  • Dart: pub package grpc
  • Go: go get google.golang.org/grpc
  • Java: Use JARs from gRPC Maven Central Repository
  • +
  • Kotlin: Use JARs from gRPC Maven Central Repository
  • Node: npm install grpc
  • Objective-C: Add gRPC-ProtoRPC dependency to podspec
  • PHP: pecl install grpc
  • From 3f8bf3b4113911302e5091f997476ee16cf01630 Mon Sep 17 00:00:00 2001 From: Eric Gribkoff Date: Mon, 23 Mar 2020 09:43:07 -0700 Subject: [PATCH 257/758] adjust report directory --- tools/run_tests/run_xds_tests.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/run_tests/run_xds_tests.py b/tools/run_tests/run_xds_tests.py index 55620684b10..471770433e8 100755 --- a/tools/run_tests/run_xds_tests.py +++ b/tools/run_tests/run_xds_tests.py @@ -198,7 +198,7 @@ _BASE_URL_MAP_NAME = 'test-map' _BASE_SERVICE_HOST = 'grpc-test' _BASE_TARGET_PROXY_NAME = 'test-target-proxy' _BASE_FORWARDING_RULE_NAME = 'test-forwarding-rule' -_TEST_LOG_BASE_DIR = 'reports' +_TEST_LOG_BASE_DIR = 'github/grpc/reports' _SPONGE_LOG_NAME = 'sponge_log.log' _SPONGE_XML_NAME = 'sponge_log.xml' From cbd9c8d6baea5f42bac55957d4cce6bd95244b22 Mon Sep 17 00:00:00 2001 From: Donna Dionne Date: Mon, 23 Mar 2020 10:20:12 -0700 Subject: [PATCH 258/758] Passing C repo manager from Donna Dionne to Mark Roth --- .github/ISSUE_TEMPLATE/bug_report.md | 2 +- .github/ISSUE_TEMPLATE/cleanup_request.md | 2 +- .github/ISSUE_TEMPLATE/feature_request.md | 2 +- .github/pull_request_template.md | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 02656a1b29c..0b5862cfece 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -2,7 +2,7 @@ name: Report a bug about: Create a report to help us improve labels: kind/bug, priority/P2 -assignees: donnadionne +assignees: markroth --- diff --git a/.github/ISSUE_TEMPLATE/cleanup_request.md b/.github/ISSUE_TEMPLATE/cleanup_request.md index 2812dc503d8..33625a6f589 100644 --- a/.github/ISSUE_TEMPLATE/cleanup_request.md +++ b/.github/ISSUE_TEMPLATE/cleanup_request.md @@ -2,7 +2,7 @@ name: Request a cleanup about: Suggest a cleanup in our repository labels: kind/internal cleanup, priority/P2 -assignees: donnadionne +assignees: markroth --- diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index 96a91b56c41..9f67cb93ad1 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -2,7 +2,7 @@ name: Request a feature about: Suggest an idea for this project labels: kind/enhancement, priority/P2 -assignees: donnadionne +assignees: markroth --- diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index eddba6676da..aa56038f22f 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -8,4 +8,4 @@ If you know who should review your pull request, please remove the mentioning be --> -@donnadionne +@markroth From b73b389dd1d20e9f0de02867e9c2b6187ebd3f5d Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Mon, 23 Mar 2020 10:21:33 -0700 Subject: [PATCH 259/758] Change the default IO engine to poller --- .../grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi index d570f478391..33959c44a14 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi @@ -14,18 +14,17 @@ import enum -cdef str _GRPC_ASYNCIO_ENGINE = os.environ.get('GRPC_ASYNCIO_ENGINE', 'default').upper() +cdef str _GRPC_ASYNCIO_ENGINE = os.environ.get('GRPC_ASYNCIO_ENGINE', 'poller').upper() cdef _AioState _global_aio_state = _AioState() class AsyncIOEngine(enum.Enum): - DEFAULT = 'default' CUSTOM_IO_MANAGER = 'custom_io_manager' POLLER = 'poller' cdef _default_asyncio_engine(): - return AsyncIOEngine.CUSTOM_IO_MANAGER + return AsyncIOEngine.POLLER cdef grpc_completion_queue *global_completion_queue(): @@ -76,10 +75,8 @@ cdef _actual_aio_initialization(): # Picks the engine for gRPC AsyncIO Stack _global_aio_state.engine = AsyncIOEngine.__members__.get( _GRPC_ASYNCIO_ENGINE, - AsyncIOEngine.DEFAULT, + _default_asyncio_engine(), ) - if _global_aio_state.engine is AsyncIOEngine.DEFAULT: - _global_aio_state.engine = _default_asyncio_engine() _LOGGER.info('Using %s as I/O engine', _global_aio_state.engine) # Initializes the process-level state accordingly From 5cd773731dc53dbb273d889a912c62a088347115 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Mon, 23 Mar 2020 10:21:50 -0700 Subject: [PATCH 260/758] Assert with public API instead of private API --- src/python/grpcio_tests/tests_aio/unit/call_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/python/grpcio_tests/tests_aio/unit/call_test.py b/src/python/grpcio_tests/tests_aio/unit/call_test.py index 93b27853023..e23548eed71 100644 --- a/src/python/grpcio_tests/tests_aio/unit/call_test.py +++ b/src/python/grpcio_tests/tests_aio/unit/call_test.py @@ -209,7 +209,7 @@ class TestUnaryUnaryCall(_MulticallableTestMixin, AioTestBase): grpc.access_token_call_credentials("def"), ) with self.assertRaisesRegex( - grpc._cygrpc.UsageError, + aio.UsageError, "Call credentials are only valid on secure channels"): self._stub.UnaryCall(messages_pb2.SimpleRequest(), credentials=call_credentials) From f090b04dd47b52d4c364ce78da89297a0c82a270 Mon Sep 17 00:00:00 2001 From: jiangtaoli2016 Date: Mon, 23 Mar 2020 11:16:36 -0700 Subject: [PATCH 261/758] Add NULL-termination to hardcoded test creds string --- test/core/end2end/data/client_certs.cc | 11 +++++++---- test/core/end2end/data/server1_cert.cc | 2 +- test/core/end2end/data/server1_key.cc | 2 +- test/core/end2end/data/test_root_cert.cc | 3 ++- 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/test/core/end2end/data/client_certs.cc b/test/core/end2end/data/client_certs.cc index de761637ff3..8d9cb9129b9 100644 --- a/test/core/end2end/data/client_certs.cc +++ b/test/core/end2end/data/client_certs.cc @@ -128,7 +128,7 @@ extern const char test_self_signed_client_cert[] = { 0x53, 0x70, 0x49, 0x51, 0x79, 0x52, 0x4d, 0x47, 0x57, 0x64, 0x75, 0x6a, 0x30, 0x50, 0x31, 0x36, 0x79, 0x62, 0x39, 0x0a, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x45, 0x4e, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, - 0x43, 0x41, 0x54, 0x45, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a}; + 0x43, 0x41, 0x54, 0x45, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, 0x00}; extern const char test_self_signed_client_key[] = { 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x42, 0x45, 0x47, 0x49, 0x4e, 0x20, 0x50, @@ -272,7 +272,8 @@ extern const char test_self_signed_client_key[] = { 0x76, 0x48, 0x76, 0x30, 0x67, 0x47, 0x32, 0x43, 0x35, 0x76, 0x79, 0x33, 0x74, 0x49, 0x59, 0x51, 0x74, 0x53, 0x51, 0x43, 0x6b, 0x0a, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x45, 0x4e, 0x44, 0x20, 0x50, 0x52, 0x49, 0x56, 0x41, - 0x54, 0x45, 0x20, 0x4b, 0x45, 0x59, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a}; + 0x54, 0x45, 0x20, 0x4b, 0x45, 0x59, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, + 0x00}; extern const char test_signed_client_cert[] = { 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x42, 0x45, 0x47, 0x49, 0x4e, 0x20, 0x43, @@ -372,7 +373,8 @@ extern const char test_signed_client_cert[] = { 0x39, 0x77, 0x6f, 0x65, 0x0a, 0x6d, 0x4c, 0x35, 0x41, 0x6c, 0x75, 0x4e, 0x52, 0x4c, 0x61, 0x71, 0x6a, 0x5a, 0x76, 0x45, 0x3d, 0x0a, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x45, 0x4e, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, - 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a}; + 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, + 0x00}; extern const char test_signed_client_key[] = { 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x42, 0x45, 0x47, 0x49, 0x4e, 0x20, 0x50, @@ -516,4 +518,5 @@ extern const char test_signed_client_key[] = { 0x58, 0x58, 0x2b, 0x32, 0x6f, 0x30, 0x4a, 0x2f, 0x6e, 0x46, 0x38, 0x35, 0x66, 0x6d, 0x34, 0x41, 0x77, 0x57, 0x4b, 0x41, 0x63, 0x0a, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x45, 0x4e, 0x44, 0x20, 0x50, 0x52, 0x49, 0x56, 0x41, - 0x54, 0x45, 0x20, 0x4b, 0x45, 0x59, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a}; + 0x54, 0x45, 0x20, 0x4b, 0x45, 0x59, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, + 0x00}; diff --git a/test/core/end2end/data/server1_cert.cc b/test/core/end2end/data/server1_cert.cc index 462b28eef3a..b780a84d6d1 100644 --- a/test/core/end2end/data/server1_cert.cc +++ b/test/core/end2end/data/server1_cert.cc @@ -129,4 +129,4 @@ extern const char test_server1_cert[] = { 0x7a, 0x47, 0x2f, 0x6c, 0x62, 0x51, 0x5a, 0x76, 0x67, 0x3d, 0x3d, 0x0a, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x45, 0x4e, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2d, 0x2d, 0x2d, 0x2d, - 0x2d, 0x0a}; + 0x2d, 0x0a, 0x00}; diff --git a/test/core/end2end/data/server1_key.cc b/test/core/end2end/data/server1_key.cc index efca8670ec4..c2b09d20d9a 100644 --- a/test/core/end2end/data/server1_key.cc +++ b/test/core/end2end/data/server1_key.cc @@ -159,4 +159,4 @@ extern const char test_server1_key[] = { 0x56, 0x72, 0x7a, 0x4d, 0x77, 0x63, 0x73, 0x72, 0x74, 0x31, 0x77, 0x3d, 0x3d, 0x0a, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x45, 0x4e, 0x44, 0x20, 0x50, 0x52, 0x49, 0x56, 0x41, 0x54, 0x45, 0x20, 0x4b, 0x45, 0x59, 0x2d, 0x2d, - 0x2d, 0x2d, 0x2d, 0x0a}; + 0x2d, 0x2d, 0x2d, 0x0a, 0x00}; diff --git a/test/core/end2end/data/test_root_cert.cc b/test/core/end2end/data/test_root_cert.cc index 3fbe7e74cee..941ebc82dc8 100644 --- a/test/core/end2end/data/test_root_cert.cc +++ b/test/core/end2end/data/test_root_cert.cc @@ -118,4 +118,5 @@ extern const char test_root_cert[] = { 0x70, 0x71, 0x43, 0x41, 0x4c, 0x62, 0x56, 0x79, 0x46, 0x2b, 0x72, 0x4b, 0x4a, 0x6f, 0x32, 0x66, 0x35, 0x4b, 0x77, 0x3d, 0x3d, 0x0a, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x45, 0x4e, 0x44, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, - 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a}; + 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, + 0x00}; From ac79383583e217390f89f6d939be0cfbcf34bd5f Mon Sep 17 00:00:00 2001 From: Donna Dionne Date: Mon, 23 Mar 2020 11:35:55 -0700 Subject: [PATCH 262/758] Debugging xds_end2endtest DropTest Update by sending more initial traffic. --- test/cpp/end2end/xds_end2end_test.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/cpp/end2end/xds_end2end_test.cc b/test/cpp/end2end/xds_end2end_test.cc index 0f4c26ea65e..622022a0bd0 100644 --- a/test/cpp/end2end/xds_end2end_test.cc +++ b/test/cpp/end2end/xds_end2end_test.cc @@ -2855,7 +2855,7 @@ TEST_P(DropTest, DropPerTenThousand) { TEST_P(DropTest, Update) { SetNextResolution({}); SetNextResolutionForLbChannelAllBalancers(); - const size_t kNumRpcs = 1000; + const size_t kNumRpcs = 3000; const uint32_t kDropPerMillionForLb = 100000; const uint32_t kDropPerMillionForThrottle = 200000; const double kDropRateForLb = kDropPerMillionForLb / 1000000.0; @@ -2888,6 +2888,7 @@ TEST_P(DropTest, Update) { gpr_log(GPR_INFO, "========= DONE WITH FIRST BATCH =========="); // The drop rate should be roughly equal to the expectation. double seen_drop_rate = static_cast(num_drops) / kNumRpcs; + gpr_log(GPR_INFO, "First batch drop rate %f", seen_drop_rate); const double kErrorTolerance = 0.3; EXPECT_THAT( seen_drop_rate, @@ -2936,6 +2937,7 @@ TEST_P(DropTest, Update) { gpr_log(GPR_INFO, "========= DONE WITH SECOND BATCH =========="); // The new drop rate should be roughly equal to the expectation. seen_drop_rate = static_cast(num_drops) / kNumRpcs; + gpr_log(GPR_INFO, "Second batch drop rate %f", seen_drop_rate); EXPECT_THAT( seen_drop_rate, ::testing::AllOf( From 69eb5824487f8f86c98e86aa08cb2aa579518d11 Mon Sep 17 00:00:00 2001 From: Vijay Pai Date: Mon, 23 Mar 2020 12:51:45 -0700 Subject: [PATCH 263/758] Register CQ at the right place --- src/cpp/server/server_cc.cc | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/cpp/server/server_cc.cc b/src/cpp/server/server_cc.cc index 34ffd59489f..a30e4911dc0 100644 --- a/src/cpp/server/server_cc.cc +++ b/src/cpp/server/server_cc.cc @@ -1241,6 +1241,12 @@ void Server::Start(grpc::ServerCompletionQueue** cqs, size_t num_cqs) { RegisterCallbackGenericService(unimplemented_service_.get()); } +#ifndef NDEBUG + for (size_t i = 0; i < num_cqs; i++) { + cq_list_.push_back(cqs[i]); + } +#endif + grpc_server_start(server_); if (!has_async_generic_service_ && !has_callback_generic_service_) { @@ -1249,9 +1255,6 @@ void Server::Start(grpc::ServerCompletionQueue** cqs, size_t num_cqs) { } for (size_t i = 0; i < num_cqs; i++) { -#ifndef NDEBUG - cq_list_.push_back(cqs[i]); -#endif if (cqs[i]->IsFrequentlyPolled()) { new UnimplementedAsyncRequest(this, cqs[i]); } From d22e89f7fc4ae5d530f9b23e44df17687615c4da Mon Sep 17 00:00:00 2001 From: Eric Gribkoff Date: Mon, 23 Mar 2020 14:27:15 -0700 Subject: [PATCH 264/758] set OUTPUT_DIR --- .../linux/grpc_python_bazel_test.cfg | 2 +- tools/internal_ci/linux/grpc_xds.cfg | 2 +- tools/internal_ci/linux/grpc_xds.sh | 26 +++++++++++++++++++ tools/internal_ci/linux/grpc_xds_python.cfg | 8 +++++- 4 files changed, 35 insertions(+), 3 deletions(-) create mode 100755 tools/internal_ci/linux/grpc_xds.sh diff --git a/tools/internal_ci/linux/grpc_python_bazel_test.cfg b/tools/internal_ci/linux/grpc_python_bazel_test.cfg index 62dc527a5e3..107404a30e9 100644 --- a/tools/internal_ci/linux/grpc_python_bazel_test.cfg +++ b/tools/internal_ci/linux/grpc_python_bazel_test.cfg @@ -15,7 +15,7 @@ # Config file for the internal CI (in protobuf text format) # Location of the continuous shell script in repository. -build_file: "grpc/tools/internal_ci/linux/grpc_bazel.sh" +build_file: "grpc/tools/internal_ci/linux/grpc_xds.sh" timeout_mins: 90 env_vars { key: "BAZEL_SCRIPT" diff --git a/tools/internal_ci/linux/grpc_xds.cfg b/tools/internal_ci/linux/grpc_xds.cfg index 62dc527a5e3..107404a30e9 100644 --- a/tools/internal_ci/linux/grpc_xds.cfg +++ b/tools/internal_ci/linux/grpc_xds.cfg @@ -15,7 +15,7 @@ # Config file for the internal CI (in protobuf text format) # Location of the continuous shell script in repository. -build_file: "grpc/tools/internal_ci/linux/grpc_bazel.sh" +build_file: "grpc/tools/internal_ci/linux/grpc_xds.sh" timeout_mins: 90 env_vars { key: "BAZEL_SCRIPT" diff --git a/tools/internal_ci/linux/grpc_xds.sh b/tools/internal_ci/linux/grpc_xds.sh new file mode 100755 index 00000000000..6de6588024c --- /dev/null +++ b/tools/internal_ci/linux/grpc_xds.sh @@ -0,0 +1,26 @@ +#!/usr/bin/env bash +# Copyright 2017 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -ex + +# change to grpc repo root +cd $(dirname $0)/../../.. + +source tools/internal_ci/helper_scripts/prepare_build_linux_rc + +export DOCKERFILE_DIR=tools/dockerfile/test/bazel +export DOCKER_RUN_SCRIPT=$BAZEL_SCRIPT +export OUTPUT_DIR=reports +exec tools/run_tests/dockerize/build_and_run_docker.sh diff --git a/tools/internal_ci/linux/grpc_xds_python.cfg b/tools/internal_ci/linux/grpc_xds_python.cfg index e635b334dbd..922b1aa88a1 100644 --- a/tools/internal_ci/linux/grpc_xds_python.cfg +++ b/tools/internal_ci/linux/grpc_xds_python.cfg @@ -15,9 +15,15 @@ # Config file for the internal CI (in protobuf text format) # Location of the continuous shell script in repository. -build_file: "grpc/tools/internal_ci/linux/grpc_bazel.sh" +build_file: "grpc/tools/internal_ci/linux/grpc_xds.sh" timeout_mins: 90 env_vars { key: "BAZEL_SCRIPT" value: "tools/internal_ci/linux/grpc_xds_bazel_python_test_in_docker.sh" } +action { + define_artifacts { + regex: "**/*sponge_log.*" + regex: "github/grpc/reports/**" + } +} From 3fd000148125e5b381086dccaf6276c47e23ef81 Mon Sep 17 00:00:00 2001 From: Richard Belleville Date: Mon, 23 Mar 2020 16:05:41 -0700 Subject: [PATCH 265/758] Add Python xDS example server --- examples/python/xds/README.md | 65 ++++++++++ examples/python/xds/helloworld_pb2.py | 134 +++++++++++++++++++++ examples/python/xds/helloworld_pb2_grpc.py | 46 +++++++ examples/python/xds/server.py | 78 ++++++++++++ 4 files changed, 323 insertions(+) create mode 100644 examples/python/xds/README.md create mode 100644 examples/python/xds/helloworld_pb2.py create mode 100644 examples/python/xds/helloworld_pb2_grpc.py create mode 100644 examples/python/xds/server.py diff --git a/examples/python/xds/README.md b/examples/python/xds/README.md new file mode 100644 index 00000000000..b5c7152f09e --- /dev/null +++ b/examples/python/xds/README.md @@ -0,0 +1,65 @@ +gRPC Hostname Example +===================== + +The hostname example is a Hello World server whose response includes its +hostname. It also supports health and reflection services. This makes it a good +server to test infrastructure, like load balancing. + +The example requires grpc to already be built. You are strongly encouraged +to check out a git release tag, since there will already be a build of gRPC +available. + +### Run the example + +1. Navigate to this directory: + +```sh +cd grpc/examples/python/xds +``` + +2. Run the server + +```sh +python server.py +``` + +3. Verify the Server + +This step is not strictly necessary, but you can use it as a sanity check if +you'd like. If you don't have it, install +[`grpcurl`](https://github.com/fullstorydev/grpcurl/releases). This will allow +you to manually test the service. + +Exercise your server's application-layer service: + +```sh +> grpcurl --plaintext -d '{"name": "you"}' localhost:50051 +{ + "message": "Hello you from rbell.svl.corp.google.com!" +} +``` + +Make sure that all of your server's services are available via reflection: + +```sh +> grpcurl --plaintext localhost:50051 list +grpc.health.v1.Health +grpc.reflection.v1alpha.ServerReflection +helloworld.Greeter +``` + +Make sure that your services are reporting healthy: + +```sh +> grpcurl --plaintext -d '{"service": "helloworld.Greeter"}' localhost:50051 +grpc.health.v1.Health/Check +{ + "status": "SERVING" +} + +> grpcurl --plaintext -d '{"service": ""}' localhost:50051 +grpc.health.v1.Health/Check +{ + "status": "SERVING" +} +``` diff --git a/examples/python/xds/helloworld_pb2.py b/examples/python/xds/helloworld_pb2.py new file mode 100644 index 00000000000..e18ab9acc7a --- /dev/null +++ b/examples/python/xds/helloworld_pb2.py @@ -0,0 +1,134 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: helloworld.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +from google.protobuf import descriptor_pb2 +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='helloworld.proto', + package='helloworld', + syntax='proto3', + serialized_pb=_b('\n\x10helloworld.proto\x12\nhelloworld\"\x1c\n\x0cHelloRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\"\x1d\n\nHelloReply\x12\x0f\n\x07message\x18\x01 \x01(\t2I\n\x07Greeter\x12>\n\x08SayHello\x12\x18.helloworld.HelloRequest\x1a\x16.helloworld.HelloReply\"\x00\x42\x36\n\x1bio.grpc.examples.helloworldB\x0fHelloWorldProtoP\x01\xa2\x02\x03HLWb\x06proto3') +) + + + + +_HELLOREQUEST = _descriptor.Descriptor( + name='HelloRequest', + full_name='helloworld.HelloRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='helloworld.HelloRequest.name', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=32, + serialized_end=60, +) + + +_HELLOREPLY = _descriptor.Descriptor( + name='HelloReply', + full_name='helloworld.HelloReply', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='message', full_name='helloworld.HelloReply.message', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=62, + serialized_end=91, +) + +DESCRIPTOR.message_types_by_name['HelloRequest'] = _HELLOREQUEST +DESCRIPTOR.message_types_by_name['HelloReply'] = _HELLOREPLY +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +HelloRequest = _reflection.GeneratedProtocolMessageType('HelloRequest', (_message.Message,), dict( + DESCRIPTOR = _HELLOREQUEST, + __module__ = 'helloworld_pb2' + # @@protoc_insertion_point(class_scope:helloworld.HelloRequest) + )) +_sym_db.RegisterMessage(HelloRequest) + +HelloReply = _reflection.GeneratedProtocolMessageType('HelloReply', (_message.Message,), dict( + DESCRIPTOR = _HELLOREPLY, + __module__ = 'helloworld_pb2' + # @@protoc_insertion_point(class_scope:helloworld.HelloReply) + )) +_sym_db.RegisterMessage(HelloReply) + + +DESCRIPTOR.has_options = True +DESCRIPTOR._options = _descriptor._ParseOptions(descriptor_pb2.FileOptions(), _b('\n\033io.grpc.examples.helloworldB\017HelloWorldProtoP\001\242\002\003HLW')) + +_GREETER = _descriptor.ServiceDescriptor( + name='Greeter', + full_name='helloworld.Greeter', + file=DESCRIPTOR, + index=0, + options=None, + serialized_start=93, + serialized_end=166, + methods=[ + _descriptor.MethodDescriptor( + name='SayHello', + full_name='helloworld.Greeter.SayHello', + index=0, + containing_service=None, + input_type=_HELLOREQUEST, + output_type=_HELLOREPLY, + options=None, + ), +]) +_sym_db.RegisterServiceDescriptor(_GREETER) + +DESCRIPTOR.services_by_name['Greeter'] = _GREETER + +# @@protoc_insertion_point(module_scope) diff --git a/examples/python/xds/helloworld_pb2_grpc.py b/examples/python/xds/helloworld_pb2_grpc.py new file mode 100644 index 00000000000..18e07d16797 --- /dev/null +++ b/examples/python/xds/helloworld_pb2_grpc.py @@ -0,0 +1,46 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +import grpc + +import helloworld_pb2 as helloworld__pb2 + + +class GreeterStub(object): + """The greeting service definition. + """ + + def __init__(self, channel): + """Constructor. + + Args: + channel: A grpc.Channel. + """ + self.SayHello = channel.unary_unary( + '/helloworld.Greeter/SayHello', + request_serializer=helloworld__pb2.HelloRequest.SerializeToString, + response_deserializer=helloworld__pb2.HelloReply.FromString, + ) + + +class GreeterServicer(object): + """The greeting service definition. + """ + + def SayHello(self, request, context): + """Sends a greeting + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + +def add_GreeterServicer_to_server(servicer, server): + rpc_method_handlers = { + 'SayHello': grpc.unary_unary_rpc_method_handler( + servicer.SayHello, + request_deserializer=helloworld__pb2.HelloRequest.FromString, + response_serializer=helloworld__pb2.HelloReply.SerializeToString, + ), + } + generic_handler = grpc.method_handlers_generic_handler( + 'helloworld.Greeter', rpc_method_handlers) + server.add_generic_rpc_handlers((generic_handler,)) diff --git a/examples/python/xds/server.py b/examples/python/xds/server.py new file mode 100644 index 00000000000..2b459eb39f3 --- /dev/null +++ b/examples/python/xds/server.py @@ -0,0 +1,78 @@ +# Copyright 2020 The gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""The Python implementation of the GRPC helloworld.Greeter server.""" + +from concurrent import futures +import argparse +import logging +import socket + +import grpc + +import helloworld_pb2 +import helloworld_pb2_grpc + +from grpc_reflection.v1alpha import reflection +from grpc_health.v1 import health +from grpc_health.v1 import health_pb2 +from grpc_health.v1 import health_pb2_grpc + +_DESCRIPTION = "A general purpose dummy server." + + +class Greeter(helloworld_pb2_grpc.GreeterServicer): + + def __init__(self, hostname): + self._hostname = hostname if hostname else socket.gethostname() + + def SayHello(self, request, context): + return helloworld_pb2.HelloReply( + message=f"Hello {request.name} from {self._hostname}!") + + +def serve(port, hostname): + server = grpc.server(futures.ThreadPoolExecutor(max_workers=10)) + helloworld_pb2_grpc.add_GreeterServicer_to_server(Greeter(hostname), server) + health_servicer = health.HealthServicer( + experimental_non_blocking=True, + experimental_thread_pool=futures.ThreadPoolExecutor(max_workers=4)) + health_pb2_grpc.add_HealthServicer_to_server(health_servicer, server) + services = tuple( + service.full_name + for service in helloworld_pb2.DESCRIPTOR.services_by_name.values()) + ( + reflection.SERVICE_NAME, health.SERVICE_NAME) + reflection.enable_server_reflection(services, server) + server.add_insecure_port(f"[::]:{port}") + server.start() + overall_server_health = "" + for service in services + (overall_server_health,): + health_servicer.set(service, health_pb2.HealthCheckResponse.SERVING) + server.wait_for_termination() + + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description=_DESCRIPTION) + parser.add_argument("port", + default=50051, + type=int, + nargs="?", + help="The port on which to listen.") + parser.add_argument("hostname", + type=str, + default=None, + nargs="?", + help="The name clients will see in responses.") + args = parser.parse_args() + logging.basicConfig() + serve(args.port, args.hostname) From 2c5aa5fa26a05aa564cbf48ae20d60dc844b4ce2 Mon Sep 17 00:00:00 2001 From: Eric Gribkoff Date: Mon, 23 Mar 2020 16:11:04 -0700 Subject: [PATCH 266/758] find path properly --- tools/run_tests/run_xds_tests.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/run_tests/run_xds_tests.py b/tools/run_tests/run_xds_tests.py index 471770433e8..f518d12e06f 100755 --- a/tools/run_tests/run_xds_tests.py +++ b/tools/run_tests/run_xds_tests.py @@ -198,7 +198,8 @@ _BASE_URL_MAP_NAME = 'test-map' _BASE_SERVICE_HOST = 'grpc-test' _BASE_TARGET_PROXY_NAME = 'test-target-proxy' _BASE_FORWARDING_RULE_NAME = 'test-forwarding-rule' -_TEST_LOG_BASE_DIR = 'github/grpc/reports' +_TEST_LOG_BASE_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), + '../../reports') _SPONGE_LOG_NAME = 'sponge_log.log' _SPONGE_XML_NAME = 'sponge_log.xml' From cbdceeea347f4fb477e808fd5a91725327a8f196 Mon Sep 17 00:00:00 2001 From: Eric Gribkoff Date: Mon, 23 Mar 2020 17:07:30 -0700 Subject: [PATCH 267/758] restore kokoro job --- tools/internal_ci/linux/grpc_python_bazel_test.cfg | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/tools/internal_ci/linux/grpc_python_bazel_test.cfg b/tools/internal_ci/linux/grpc_python_bazel_test.cfg index 107404a30e9..feae924330e 100644 --- a/tools/internal_ci/linux/grpc_python_bazel_test.cfg +++ b/tools/internal_ci/linux/grpc_python_bazel_test.cfg @@ -1,4 +1,4 @@ -# Copyright 2020 gRPC authors. +# Copyright 2018 gRPC authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -15,15 +15,9 @@ # Config file for the internal CI (in protobuf text format) # Location of the continuous shell script in repository. -build_file: "grpc/tools/internal_ci/linux/grpc_xds.sh" -timeout_mins: 90 +build_file: "grpc/tools/internal_ci/linux/grpc_bazel.sh" +timeout_mins: 240 env_vars { key: "BAZEL_SCRIPT" - value: "tools/internal_ci/linux/grpc_xds_bazel_test_in_docker.sh" -} -action { - define_artifacts { - regex: "**/*sponge_log.*" - regex: "github/grpc/reports/**" - } + value: "tools/internal_ci/linux/grpc_python_bazel_test_in_docker.sh" } From 7675e433fe9f09825ac5045712bc094f09e0f5c6 Mon Sep 17 00:00:00 2001 From: Eric Gribkoff Date: Mon, 23 Mar 2020 20:07:46 -0700 Subject: [PATCH 268/758] fix encoding issue with python 3 --- tools/run_tests/run_xds_tests.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tools/run_tests/run_xds_tests.py b/tools/run_tests/run_xds_tests.py index f518d12e06f..1deac8db5a5 100755 --- a/tools/run_tests/run_xds_tests.py +++ b/tools/run_tests/run_xds_tests.py @@ -1107,10 +1107,13 @@ try: result.returncode = 0 except Exception as e: result.state = 'FAILED' - result.message = str(e).encode('UTF-8') + result.message = str(e) finally: if client_process: client_process.terminate() + # Workaround for Python 3, as report_utils will invoke decode() on + # result.message, which has a default value of ''. + result.message = result.message.encode('UTF-8') test_results[test_case] = [result] if not os.path.exists(_TEST_LOG_BASE_DIR): os.makedirs(_TEST_LOG_BASE_DIR) From 46439bcb0f28118fce24387228041f1f50db5a45 Mon Sep 17 00:00:00 2001 From: Donna Dionne Date: Mon, 23 Mar 2020 21:35:52 -0700 Subject: [PATCH 269/758] Fixing the settings_timeout_test flake by reducing pollset_work deadline Intermittently (when we run the test 100 times) we see that at times we are not notified about successful socket connection even within 1 second. The pollset_work deadline is set to 1 second, so when our connection timeout is also set to 1 second, we only had 1 poll. And if that poll didn't let us know about the socket, we didn't get another chance. Reducing the pollset_work deadline to 100ms, now the test runs faster and pass consistently: result for 500 runs: https://source.cloud.google.com/results/invocations/dd1b38f4-0f28-470b-a78b-b485445e44f2/targets/%2F%2Ftest%2Fcore%2Ftransport%2Fchttp2:settings_timeout_test/tests --- test/core/transport/chttp2/settings_timeout_test.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/core/transport/chttp2/settings_timeout_test.cc b/test/core/transport/chttp2/settings_timeout_test.cc index 5edf61c28bd..8680f208b57 100644 --- a/test/core/transport/chttp2/settings_timeout_test.cc +++ b/test/core/transport/chttp2/settings_timeout_test.cc @@ -196,7 +196,7 @@ class Client { GRPC_LOG_IF_ERROR( "grpc_pollset_work", grpc_pollset_work(pollset_, &worker, - grpc_core::ExecCtx::Get()->Now() + 1000)); + grpc_core::ExecCtx::Get()->Now() + 100)); // Flushes any work scheduled before or during polling. grpc_core::ExecCtx::Get()->Flush(); gpr_mu_unlock(mu_); From 0c28a9beaf78e96f280a4a367bb16202ac71af86 Mon Sep 17 00:00:00 2001 From: Richard Belleville Date: Tue, 24 Mar 2020 14:11:17 -0700 Subject: [PATCH 270/758] Specify the Python version --- examples/python/xds/README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/examples/python/xds/README.md b/examples/python/xds/README.md index b5c7152f09e..5dacfc4371e 100644 --- a/examples/python/xds/README.md +++ b/examples/python/xds/README.md @@ -20,6 +20,9 @@ cd grpc/examples/python/xds 2. Run the server ```sh +virtualenv venv -p python3 +source venv/bin/activate +pip install grpcio protobuf python server.py ``` From 11671b04073db623ba21be2b84e44bb8c0c987fb Mon Sep 17 00:00:00 2001 From: Eric Gribkoff Date: Tue, 24 Mar 2020 14:15:12 -0700 Subject: [PATCH 271/758] log exception and init client_process --- tools/run_tests/run_xds_tests.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tools/run_tests/run_xds_tests.py b/tools/run_tests/run_xds_tests.py index 1deac8db5a5..6e5b454e447 100755 --- a/tools/run_tests/run_xds_tests.py +++ b/tools/run_tests/run_xds_tests.py @@ -1069,6 +1069,7 @@ try: if not os.path.exists(log_dir): os.makedirs(log_dir) test_log_file = open(os.path.join(log_dir, _SPONGE_LOG_NAME), 'w+') + client_process = None try: client_process = subprocess.Popen(client_cmd, env=client_env, @@ -1106,6 +1107,7 @@ try: result.state = 'PASSED' result.returncode = 0 except Exception as e: + logger.error('Test case %s failed: %s' % (test_case, e)) result.state = 'FAILED' result.message = str(e) finally: From 571a564f5111c13c812bbfce397c5793131c8da4 Mon Sep 17 00:00:00 2001 From: Richard Belleville Date: Tue, 24 Mar 2020 14:23:25 -0700 Subject: [PATCH 272/758] Add type annotations and comments --- examples/python/xds/README.md | 2 +- examples/python/xds/server.py | 24 ++++++++++++++++++++---- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/examples/python/xds/README.md b/examples/python/xds/README.md index 5dacfc4371e..51bfe715583 100644 --- a/examples/python/xds/README.md +++ b/examples/python/xds/README.md @@ -22,7 +22,7 @@ cd grpc/examples/python/xds ```sh virtualenv venv -p python3 source venv/bin/activate -pip install grpcio protobuf +pip install grpcio protobuf grpcio-reflection grpcio-health-checking python server.py ``` diff --git a/examples/python/xds/server.py b/examples/python/xds/server.py index 2b459eb39f3..3cff567667f 100644 --- a/examples/python/xds/server.py +++ b/examples/python/xds/server.py @@ -16,6 +16,7 @@ from concurrent import futures import argparse import logging +import multiprocessing import socket import grpc @@ -33,31 +34,46 @@ _DESCRIPTION = "A general purpose dummy server." class Greeter(helloworld_pb2_grpc.GreeterServicer): - def __init__(self, hostname): + def __init__(self, hostname: str): self._hostname = hostname if hostname else socket.gethostname() - def SayHello(self, request, context): + def SayHello(self, request: helloworld_pb2.HelloRequest, + context: grpc.ServicerContext) -> helloworld_pb2.HelloReply: return helloworld_pb2.HelloReply( message=f"Hello {request.name} from {self._hostname}!") def serve(port, hostname): - server = grpc.server(futures.ThreadPoolExecutor(max_workers=10)) + server = grpc.server( + futures.ThreadPoolExecutor(max_workers=multiprocessing.cpu_count())) + + # Add the application servicer to the server. helloworld_pb2_grpc.add_GreeterServicer_to_server(Greeter(hostname), server) + + # Create a health check servicer. We use the non-blocking implementation + # to avoid thread starvation. health_servicer = health.HealthServicer( experimental_non_blocking=True, - experimental_thread_pool=futures.ThreadPoolExecutor(max_workers=4)) + experimental_thread_pool=futures.ThreadPoolExecutor(max_workers=1)) health_pb2_grpc.add_HealthServicer_to_server(health_servicer, server) + + # Create a tuple of all of the services we want to export via reflection. services = tuple( service.full_name for service in helloworld_pb2.DESCRIPTOR.services_by_name.values()) + ( reflection.SERVICE_NAME, health.SERVICE_NAME) + + # Add the reflection service to the server. reflection.enable_server_reflection(services, server) server.add_insecure_port(f"[::]:{port}") server.start() + + # Mark all services as healthy. overall_server_health = "" for service in services + (overall_server_health,): health_servicer.set(service, health_pb2.HealthCheckResponse.SERVING) + + # Park the main application thread. server.wait_for_termination() From 52634fb7be1fcd0fc830f68aa541ba103935ba8b Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Tue, 24 Mar 2020 15:59:10 -0700 Subject: [PATCH 273/758] Correct the docstring and implementation of AuthMetadataPlugin --- src/python/grpcio/grpc/__init__.py | 2 +- src/python/grpcio/grpc/_auth.py | 37 +++++++++--------------------- 2 files changed, 12 insertions(+), 27 deletions(-) diff --git a/src/python/grpcio/grpc/__init__.py b/src/python/grpcio/grpc/__init__.py index a6c9275d5c8..9e349c5b023 100644 --- a/src/python/grpcio/grpc/__init__.py +++ b/src/python/grpcio/grpc/__init__.py @@ -628,7 +628,7 @@ class AuthMetadataPlugin(six.with_metaclass(abc.ABCMeta)): def __call__(self, context, callback): """Implements authentication by passing metadata to a callback. - Implementations of this method must not block. + This method will be invoked asynchronously in a separate thread. Args: context: An AuthMetadataContext providing information on the RPC that diff --git a/src/python/grpcio/grpc/_auth.py b/src/python/grpcio/grpc/_auth.py index 724229a8f56..2d38320afff 100644 --- a/src/python/grpcio/grpc/_auth.py +++ b/src/python/grpcio/grpc/_auth.py @@ -14,7 +14,6 @@ """GRPCAuthMetadataPlugins for standard authentication.""" import inspect -from concurrent import futures import grpc @@ -24,43 +23,29 @@ def _sign_request(callback, token, error): callback(metadata, error) -def _create_get_token_callback(callback): - - def get_token_callback(future): - try: - access_token = future.result().access_token - except Exception as exception: # pylint: disable=broad-except - _sign_request(callback, None, exception) - else: - _sign_request(callback, access_token, None) - - return get_token_callback - - class GoogleCallCredentials(grpc.AuthMetadataPlugin): """Metadata wrapper for GoogleCredentials from the oauth2client library.""" def __init__(self, credentials): self._credentials = credentials - self._pool = futures.ThreadPoolExecutor(max_workers=1) - # Hack to determine if these are JWT creds and we need to pass # additional_claims when getting a token self._is_jwt = 'additional_claims' in inspect.getargspec( # pylint: disable=deprecated-method credentials.get_access_token).args def __call__(self, context, callback): - # MetadataPlugins cannot block (see grpc.beta.interfaces.py) - if self._is_jwt: - future = self._pool.submit( - self._credentials.get_access_token, - additional_claims={'aud': context.service_url}) + try: + if self._is_jwt: + access_token = self._credentials.get_access_token( + additional_claims={ + 'aud': context.service_url + }).access_token + else: + access_token = self._credentials.get_access_token().access_token + except Exception as exception: # pylint: disable=broad-except + _sign_request(callback, None, exception) else: - future = self._pool.submit(self._credentials.get_access_token) - future.add_done_callback(_create_get_token_callback(callback)) - - def __del__(self): - self._pool.shutdown(wait=False) + _sign_request(callback, access_token, None) class AccessTokenAuthMetadataPlugin(grpc.AuthMetadataPlugin): From 7d88c61f57f0f6e13c538c038e81464e91f3b308 Mon Sep 17 00:00:00 2001 From: Mariano Anaya Date: Wed, 11 Mar 2020 17:50:26 +0100 Subject: [PATCH 274/758] Initial modelling of the metadata abstraction Create the initial version for the abstraction for the Metadata based on the discussion at https://github.com/grpc/grpc/issues/21953 --- .../grpcio/grpc/experimental/aio/_metadata.py | 72 +++++++++++++++++++ .../grpcio_tests/tests/unit/_metadata_test.py | 67 +++++++++++++++++ 2 files changed, 139 insertions(+) create mode 100644 src/python/grpcio/grpc/experimental/aio/_metadata.py diff --git a/src/python/grpcio/grpc/experimental/aio/_metadata.py b/src/python/grpcio/grpc/experimental/aio/_metadata.py new file mode 100644 index 00000000000..03c39ba9b7a --- /dev/null +++ b/src/python/grpcio/grpc/experimental/aio/_metadata.py @@ -0,0 +1,72 @@ +# Copyright 2020 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Implementation of the metadata abstraction for gRPC Asyncio Python.""" +from typing import List, Tuple, AnyStr, Iterator, Any +from collections import abc, OrderedDict + + +class Metadata(abc.Mapping): + """Metadata abstraction for the asynchronous calls and interceptors. + + The metadata is a mapping from str -> List[str] + + Traits + * Multiple entries are allowed for the same key + * The order of the values by key is preserved + * Getting by an element by key, retrieves the first mapped value + * Supports an immutable view of the data + """ + + def __init__(self, *args) -> None: + self._metadata = OrderedDict() + for md_key, md_value in args: + self.add(md_key, md_value) + + def add(self, key: str, value: str) -> None: + key = key.lower() + self._metadata.setdefault(key, []) + self._metadata[key].append(value) + + def __len__(self) -> int: + return len(self._metadata) + + def __getitem__(self, key: str) -> str: + try: + first, *_ = self._metadata[key.lower()] + return first + except ValueError as e: + raise KeyError("{0!r}".format(key)) from e + + def __iter__(self) -> Iterator[Tuple[AnyStr, AnyStr]]: + for key, values in self._metadata.items(): + for value in values: + yield (key, value) + + def view(self) -> Tuple[AnyStr, AnyStr]: + return tuple(self) + + def get_all(self, key: str) -> List[str]: + """For compatibility with other Metadata abstraction objects (like in Java), + this would return all items under the desired . + """ + return self._metadata.get(key.lower(), []) + + def __contains__(self, key: str) -> bool: + return key.lower() in self._metadata + + def __eq__(self, other: Any) -> bool: + if not isinstance(other, self.__class__): + return NotImplemented + + return self._metadata == other._metadata diff --git a/src/python/grpcio_tests/tests/unit/_metadata_test.py b/src/python/grpcio_tests/tests/unit/_metadata_test.py index 3e7717b04c7..e19da5f3867 100644 --- a/src/python/grpcio_tests/tests/unit/_metadata_test.py +++ b/src/python/grpcio_tests/tests/unit/_metadata_test.py @@ -19,6 +19,7 @@ import logging import grpc from grpc import _channel +from grpc.experimental.aio._metadata import Metadata from tests.unit import test_common from tests.unit.framework.common import test_constants @@ -237,6 +238,72 @@ class MetadataTest(unittest.TestCase): call.trailing_metadata())) +class MetadataTypeTest(unittest.TestCase): + """Tests for the metadata type""" + + _DEFAULT_DATA = (("key1", "value1"), ("key2", "value2")) + _MULTI_ENTRY_DATA = (("key1", "value1"), ("key1", "other value 1"), + ("key2", "value2")) + + def test_init_metadata(self): + test_cases = { + "emtpy": (), + "with-data": self._DEFAULT_DATA, + } + for case, args in test_cases.items(): + with self.subTest(case=case): + metadata = Metadata(*args) + self.assertEqual(len(metadata), len(args)) + + def test_get_item(self): + metadata = Metadata(("key", "value1"), ("key", "value2"), + ("key2", "other value")) + self.assertEqual(metadata["key"], "value1") + self.assertEqual(metadata["key2"], "other value") + self.assertEqual(metadata.get("key"), "value1") + self.assertEqual(metadata.get("key2"), "other value") + + with self.assertRaises(KeyError): + metadata["key not found"] + self.assertIsNone(metadata.get("key not found")) + + def test_view(self): + self.assertEqual( + Metadata(*self._DEFAULT_DATA).view(), self._DEFAULT_DATA) + + def test_add_value(self): + metadata = Metadata() + metadata.add("key", "value") + metadata.add("key", "second value") + metadata.add("key2", "value2") + + self.assertEqual(metadata["key"], "value") + self.assertEqual(metadata["key2"], "value2") + self.assertEqual(metadata["KEY2"], "value2") + + def test_get_all_items(self): + metadata = Metadata(*self._MULTI_ENTRY_DATA) + self.assertEqual(metadata.get_all("key1"), ["value1", "other value 1"]) + self.assertEqual(metadata.get_all("KEY1"), ["value1", "other value 1"]) + self.assertEqual(metadata.get_all("key2"), ["value2"]) + self.assertEqual(metadata.get_all("non existing key"), []) + + def test_container(self): + metadata = Metadata(*self._MULTI_ENTRY_DATA) + for key in ("key1", "Key1", "KEY1"): + with self.subTest(case=key): + self.assertIn(key, metadata, "{0!r} not found".format(key)) + + def test_equals(self): + metadata = Metadata() + for key, value in self._DEFAULT_DATA: + metadata.add(key, value) + metadata2 = Metadata(*self._DEFAULT_DATA) + + self.assertEqual(metadata, metadata2) + self.assertNotEqual(metadata, "foo") + + if __name__ == '__main__': logging.basicConfig() unittest.main(verbosity=2) From 0be36ed606b645b929c591c8eff640b0e7569a57 Mon Sep 17 00:00:00 2001 From: Mariano Anaya Date: Wed, 18 Mar 2020 11:55:32 +0100 Subject: [PATCH 275/758] Add mutability to the MetadataType --- .../grpcio/grpc/experimental/aio/_metadata.py | 28 +++++++++++-------- src/python/grpcio_tests/tests/tests.json | 1 + .../grpcio_tests/tests/unit/_metadata_test.py | 26 +++++++++++------ 3 files changed, 36 insertions(+), 19 deletions(-) diff --git a/src/python/grpcio/grpc/experimental/aio/_metadata.py b/src/python/grpcio/grpc/experimental/aio/_metadata.py index 03c39ba9b7a..d470979d5a4 100644 --- a/src/python/grpcio/grpc/experimental/aio/_metadata.py +++ b/src/python/grpcio/grpc/experimental/aio/_metadata.py @@ -26,15 +26,15 @@ class Metadata(abc.Mapping): * The order of the values by key is preserved * Getting by an element by key, retrieves the first mapped value * Supports an immutable view of the data + * Allows partial mutation on the data without recreating the new object from scratch. """ - def __init__(self, *args) -> None: + def __init__(self, *args: Tuple[str, AnyStr]) -> None: self._metadata = OrderedDict() for md_key, md_value in args: self.add(md_key, md_value) def add(self, key: str, value: str) -> None: - key = key.lower() self._metadata.setdefault(key, []) self._metadata[key].append(value) @@ -43,30 +43,36 @@ class Metadata(abc.Mapping): def __getitem__(self, key: str) -> str: try: - first, *_ = self._metadata[key.lower()] - return first - except ValueError as e: + return self._metadata[key][0] + except (ValueError, IndexError) as e: raise KeyError("{0!r}".format(key)) from e - def __iter__(self) -> Iterator[Tuple[AnyStr, AnyStr]]: + def __setitem__(self, key: str, value: AnyStr) -> None: + self._metadata[key] = [value] + + def __iter__(self) -> Iterator[Tuple[str, AnyStr]]: for key, values in self._metadata.items(): for value in values: yield (key, value) - def view(self) -> Tuple[AnyStr, AnyStr]: - return tuple(self) - def get_all(self, key: str) -> List[str]: """For compatibility with other Metadata abstraction objects (like in Java), this would return all items under the desired . """ - return self._metadata.get(key.lower(), []) + return self._metadata.get(key, []) + + def set_all(self, key: str, values: List[AnyStr]) -> None: + self._metadata[key] = values def __contains__(self, key: str) -> bool: - return key.lower() in self._metadata + return key in self._metadata def __eq__(self, other: Any) -> bool: if not isinstance(other, self.__class__): return NotImplemented return self._metadata == other._metadata + + def __repr__(self): + view = tuple(self) + return f"{0!r}({1!r})".format(self.__class__.__name__, view) diff --git a/src/python/grpcio_tests/tests/tests.json b/src/python/grpcio_tests/tests/tests.json index 196e9f08b0a..c595a4d1bab 100644 --- a/src/python/grpcio_tests/tests/tests.json +++ b/src/python/grpcio_tests/tests/tests.json @@ -60,6 +60,7 @@ "unit._metadata_code_details_test.MetadataCodeDetailsTest", "unit._metadata_flags_test.MetadataFlagsTest", "unit._metadata_test.MetadataTest", + "unit._metadata_test.MetadataTypeTest", "unit._reconnect_test.ReconnectTest", "unit._resource_exhausted_test.ResourceExhaustedTest", "unit._rpc_test.RPCTest", diff --git a/src/python/grpcio_tests/tests/unit/_metadata_test.py b/src/python/grpcio_tests/tests/unit/_metadata_test.py index e19da5f3867..7325d8b12ba 100644 --- a/src/python/grpcio_tests/tests/unit/_metadata_test.py +++ b/src/python/grpcio_tests/tests/unit/_metadata_test.py @@ -267,10 +267,6 @@ class MetadataTypeTest(unittest.TestCase): metadata["key not found"] self.assertIsNone(metadata.get("key not found")) - def test_view(self): - self.assertEqual( - Metadata(*self._DEFAULT_DATA).view(), self._DEFAULT_DATA) - def test_add_value(self): metadata = Metadata() metadata.add("key", "value") @@ -279,7 +275,6 @@ class MetadataTypeTest(unittest.TestCase): self.assertEqual(metadata["key"], "value") self.assertEqual(metadata["key2"], "value2") - self.assertEqual(metadata["KEY2"], "value2") def test_get_all_items(self): metadata = Metadata(*self._MULTI_ENTRY_DATA) @@ -290,9 +285,7 @@ class MetadataTypeTest(unittest.TestCase): def test_container(self): metadata = Metadata(*self._MULTI_ENTRY_DATA) - for key in ("key1", "Key1", "KEY1"): - with self.subTest(case=key): - self.assertIn(key, metadata, "{0!r} not found".format(key)) + self.assertIn("key", metadata) def test_equals(self): metadata = Metadata() @@ -303,6 +296,23 @@ class MetadataTypeTest(unittest.TestCase): self.assertEqual(metadata, metadata2) self.assertNotEqual(metadata, "foo") + def test_repr(self): + metadata = Metadata(*self._DEFAULT_DATA) + expected = "Metadata({0!r})".format(self._DEFAULT_DATA) + self.assertEqual(repr(metadata), expected) + + def test_set(self): + metadata = Metadata(*self._DEFAULT_DATA) + metadata["key"] = "override value" + self.assertEqual(metadata["key"], "override value") + + def test_set_all(self): + metadata = Metadata(self._DEFAULT_DATA) + metadata.set_all("key", ["value1", b"new value 2"]) + + self.assertEqual(metadata["key"], "value1") + self.assertEqual(metadata.get_all("value1"), ["value1", b"new value 2"]) + if __name__ == '__main__': logging.basicConfig() From 1f2d916386603b88e89ab86f20fb9f68b515d044 Mon Sep 17 00:00:00 2001 From: Mariano Anaya Date: Wed, 18 Mar 2020 15:32:21 +0100 Subject: [PATCH 276/758] [aio] Metadata type: Fix tests & __repr__ --- src/python/grpcio/grpc/experimental/aio/_metadata.py | 2 +- src/python/grpcio_tests/tests/unit/_metadata_test.py | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/python/grpcio/grpc/experimental/aio/_metadata.py b/src/python/grpcio/grpc/experimental/aio/_metadata.py index d470979d5a4..6ba04d5e07a 100644 --- a/src/python/grpcio/grpc/experimental/aio/_metadata.py +++ b/src/python/grpcio/grpc/experimental/aio/_metadata.py @@ -75,4 +75,4 @@ class Metadata(abc.Mapping): def __repr__(self): view = tuple(self) - return f"{0!r}({1!r})".format(self.__class__.__name__, view) + return "{0}({1!r})".format(self.__class__.__name__, view) diff --git a/src/python/grpcio_tests/tests/unit/_metadata_test.py b/src/python/grpcio_tests/tests/unit/_metadata_test.py index 7325d8b12ba..75eb61346cd 100644 --- a/src/python/grpcio_tests/tests/unit/_metadata_test.py +++ b/src/python/grpcio_tests/tests/unit/_metadata_test.py @@ -279,13 +279,12 @@ class MetadataTypeTest(unittest.TestCase): def test_get_all_items(self): metadata = Metadata(*self._MULTI_ENTRY_DATA) self.assertEqual(metadata.get_all("key1"), ["value1", "other value 1"]) - self.assertEqual(metadata.get_all("KEY1"), ["value1", "other value 1"]) self.assertEqual(metadata.get_all("key2"), ["value2"]) self.assertEqual(metadata.get_all("non existing key"), []) def test_container(self): metadata = Metadata(*self._MULTI_ENTRY_DATA) - self.assertIn("key", metadata) + self.assertIn("key1", metadata) def test_equals(self): metadata = Metadata() @@ -311,7 +310,7 @@ class MetadataTypeTest(unittest.TestCase): metadata.set_all("key", ["value1", b"new value 2"]) self.assertEqual(metadata["key"], "value1") - self.assertEqual(metadata.get_all("value1"), ["value1", b"new value 2"]) + self.assertEqual(metadata.get_all("key"), ["value1", b"new value 2"]) if __name__ == '__main__': From 6891169b58987064e77bdfd2b9591bcbcb7dcc1c Mon Sep 17 00:00:00 2001 From: Mariano Anaya Date: Thu, 19 Mar 2020 17:53:48 +0100 Subject: [PATCH 277/758] Apply PR feedback * Fix the length of the object to account for all the keys it holds (consider it's a multi-mapping) * Add support for deleting items * Make test stricter --- .../grpcio/grpc/experimental/aio/_metadata.py | 28 +++++++++++++- .../grpcio_tests/tests/unit/_metadata_test.py | 37 ++++++++++++++++--- 2 files changed, 58 insertions(+), 7 deletions(-) diff --git a/src/python/grpcio/grpc/experimental/aio/_metadata.py b/src/python/grpcio/grpc/experimental/aio/_metadata.py index 6ba04d5e07a..4aa0b830a81 100644 --- a/src/python/grpcio/grpc/experimental/aio/_metadata.py +++ b/src/python/grpcio/grpc/experimental/aio/_metadata.py @@ -39,16 +39,40 @@ class Metadata(abc.Mapping): self._metadata[key].append(value) def __len__(self) -> int: - return len(self._metadata) + """Return the total number of elements that there are in the metadata, + including multiple values for the same key. + """ + return sum(map(len, self._metadata.values())) def __getitem__(self, key: str) -> str: + """When calling [], the first element of all those + mapped for is returned. + """ try: return self._metadata[key][0] except (ValueError, IndexError) as e: raise KeyError("{0!r}".format(key)) from e def __setitem__(self, key: str, value: AnyStr) -> None: - self._metadata[key] = [value] + """Calling metadata[] = + Maps to the first instance of . + """ + if key not in self: + self._metadata[key] = [value] + else: + current_values = self.get_all(key) + self._metadata[key] = [value, *current_values[1:]] + + def __delitem__(self, key: str) -> None: + """``del metadata[]`` deletes the first mapping for .""" + current_values = self.get_all(key) + if not current_values: + raise KeyError(repr(key)) + self._metadata[key] = current_values[1:] + + def delete_all(self, key: str) -> None: + """Delete all mappings for .""" + del self._metadata[key] def __iter__(self) -> Iterator[Tuple[str, AnyStr]]: for key, values in self._metadata.items(): diff --git a/src/python/grpcio_tests/tests/unit/_metadata_test.py b/src/python/grpcio_tests/tests/unit/_metadata_test.py index 75eb61346cd..054d54cd932 100644 --- a/src/python/grpcio_tests/tests/unit/_metadata_test.py +++ b/src/python/grpcio_tests/tests/unit/_metadata_test.py @@ -248,7 +248,8 @@ class MetadataTypeTest(unittest.TestCase): def test_init_metadata(self): test_cases = { "emtpy": (), - "with-data": self._DEFAULT_DATA, + "with-single-data": self._DEFAULT_DATA, + "with-multi-data": self._MULTI_ENTRY_DATA, } for case, args in test_cases.items(): with self.subTest(case=case): @@ -301,17 +302,43 @@ class MetadataTypeTest(unittest.TestCase): self.assertEqual(repr(metadata), expected) def test_set(self): - metadata = Metadata(*self._DEFAULT_DATA) - metadata["key"] = "override value" - self.assertEqual(metadata["key"], "override value") + metadata = Metadata(*self._MULTI_ENTRY_DATA) + override_value = "override value" + for _ in range(3): + metadata["key1"] = override_value + + self.assertEqual(metadata["key1"], override_value) + self.assertEqual(metadata.get_all("key1"), + [override_value, "other value 1"]) + + empty_metadata = Metadata() + for _ in range(3): + empty_metadata["key"] = override_value + + self.assertEqual(empty_metadata["key"], override_value) + self.assertEqual(empty_metadata.get_all("key"), [override_value]) def test_set_all(self): - metadata = Metadata(self._DEFAULT_DATA) + metadata = Metadata(*self._DEFAULT_DATA) metadata.set_all("key", ["value1", b"new value 2"]) self.assertEqual(metadata["key"], "value1") self.assertEqual(metadata.get_all("key"), ["value1", b"new value 2"]) + def test_delete_values(self): + metadata = Metadata(*self._MULTI_ENTRY_DATA) + del metadata["key1"] + self.assertEqual(metadata.get("key1"), "other value 1") + + metadata.delete_all("key1") + self.assertNotIn("key1", metadata) + + metadata.delete_all("key2") + self.assertEqual(len(metadata), 0) + + with self.assertRaises(KeyError): + del metadata["other key"] + if __name__ == '__main__': logging.basicConfig() From 3bf67c42534c4dfbfcb86954cbb9e6ab8727ea68 Mon Sep 17 00:00:00 2001 From: Mariano Anaya Date: Tue, 24 Mar 2020 11:00:48 +0100 Subject: [PATCH 278/758] [issue21953] Fix typing in Metadata class definitions --- .../grpcio/grpc/experimental/aio/_metadata.py | 29 ++++++++++--------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/src/python/grpcio/grpc/experimental/aio/_metadata.py b/src/python/grpcio/grpc/experimental/aio/_metadata.py index 4aa0b830a81..ff970106748 100644 --- a/src/python/grpcio/grpc/experimental/aio/_metadata.py +++ b/src/python/grpcio/grpc/experimental/aio/_metadata.py @@ -12,9 +12,12 @@ # See the License for the specific language governing permissions and # limitations under the License. """Implementation of the metadata abstraction for gRPC Asyncio Python.""" -from typing import List, Tuple, AnyStr, Iterator, Any +from typing import List, Tuple, Iterator, Any, Text, Union from collections import abc, OrderedDict +MetadataKey = Text +MetadataValue = Union[str, bytes] + class Metadata(abc.Mapping): """Metadata abstraction for the asynchronous calls and interceptors. @@ -29,12 +32,12 @@ class Metadata(abc.Mapping): * Allows partial mutation on the data without recreating the new object from scratch. """ - def __init__(self, *args: Tuple[str, AnyStr]) -> None: + def __init__(self, *args: Tuple[MetadataKey, MetadataValue]) -> None: self._metadata = OrderedDict() for md_key, md_value in args: self.add(md_key, md_value) - def add(self, key: str, value: str) -> None: + def add(self, key: MetadataKey, value: MetadataValue) -> None: self._metadata.setdefault(key, []) self._metadata[key].append(value) @@ -44,7 +47,7 @@ class Metadata(abc.Mapping): """ return sum(map(len, self._metadata.values())) - def __getitem__(self, key: str) -> str: + def __getitem__(self, key: MetadataKey) -> MetadataValue: """When calling [], the first element of all those mapped for is returned. """ @@ -53,7 +56,7 @@ class Metadata(abc.Mapping): except (ValueError, IndexError) as e: raise KeyError("{0!r}".format(key)) from e - def __setitem__(self, key: str, value: AnyStr) -> None: + def __setitem__(self, key: MetadataKey, value: MetadataValue) -> None: """Calling metadata[] = Maps to the first instance of . """ @@ -63,40 +66,40 @@ class Metadata(abc.Mapping): current_values = self.get_all(key) self._metadata[key] = [value, *current_values[1:]] - def __delitem__(self, key: str) -> None: + def __delitem__(self, key: MetadataKey) -> None: """``del metadata[]`` deletes the first mapping for .""" current_values = self.get_all(key) if not current_values: raise KeyError(repr(key)) self._metadata[key] = current_values[1:] - def delete_all(self, key: str) -> None: + def delete_all(self, key: MetadataKey) -> None: """Delete all mappings for .""" del self._metadata[key] - def __iter__(self) -> Iterator[Tuple[str, AnyStr]]: + def __iter__(self) -> Iterator[Tuple[MetadataKey, MetadataValue]]: for key, values in self._metadata.items(): for value in values: yield (key, value) - def get_all(self, key: str) -> List[str]: + def get_all(self, key: MetadataKey) -> List[MetadataValue]: """For compatibility with other Metadata abstraction objects (like in Java), this would return all items under the desired . """ return self._metadata.get(key, []) - def set_all(self, key: str, values: List[AnyStr]) -> None: + def set_all(self, key: MetadataKey, values: List[MetadataValue]) -> None: self._metadata[key] = values - def __contains__(self, key: str) -> bool: + def __contains__(self, key: MetadataKey) -> bool: return key in self._metadata def __eq__(self, other: Any) -> bool: if not isinstance(other, self.__class__): - return NotImplemented + return NotImplemented # pytype: disable=bad-return-type return self._metadata == other._metadata - def __repr__(self): + def __repr__(self) -> str: view = tuple(self) return "{0}({1!r})".format(self.__class__.__name__, view) From 2be1ec9c6e12b6352f9439f604e8e74088f072cf Mon Sep 17 00:00:00 2001 From: Mariano Anaya Date: Wed, 25 Mar 2020 10:01:21 +0100 Subject: [PATCH 279/758] [issue21953] Move tests to the aio part * Export the new metadata type through the ``__init__.py`` * Move the tests from the old location to the new one for the asynchronous stack. --- .../grpcio/grpc/experimental/aio/__init__.py | 2 + src/python/grpcio_tests/tests/tests.json | 1 - .../grpcio_tests/tests/unit/_metadata_test.py | 103 --------------- src/python/grpcio_tests/tests_aio/tests.json | 1 + .../tests_aio/unit/_metadata_test.py | 125 ++++++++++++++++++ 5 files changed, 128 insertions(+), 104 deletions(-) create mode 100644 src/python/grpcio_tests/tests_aio/unit/_metadata_test.py diff --git a/src/python/grpcio/grpc/experimental/aio/__init__.py b/src/python/grpcio/grpc/experimental/aio/__init__.py index 3613908a961..634795e7cc3 100644 --- a/src/python/grpcio/grpc/experimental/aio/__init__.py +++ b/src/python/grpcio/grpc/experimental/aio/__init__.py @@ -36,6 +36,7 @@ from ._server import server from ._base_server import Server, ServicerContext from ._typing import ChannelArgumentType from ._channel import insecure_channel, secure_channel +from ._metadata import Metadata ################################### __all__ ################################# @@ -68,4 +69,5 @@ __all__ = ( 'BaseError', 'UsageError', 'InternalError', + 'Metadata', ) diff --git a/src/python/grpcio_tests/tests/tests.json b/src/python/grpcio_tests/tests/tests.json index c595a4d1bab..196e9f08b0a 100644 --- a/src/python/grpcio_tests/tests/tests.json +++ b/src/python/grpcio_tests/tests/tests.json @@ -60,7 +60,6 @@ "unit._metadata_code_details_test.MetadataCodeDetailsTest", "unit._metadata_flags_test.MetadataFlagsTest", "unit._metadata_test.MetadataTest", - "unit._metadata_test.MetadataTypeTest", "unit._reconnect_test.ReconnectTest", "unit._resource_exhausted_test.ResourceExhaustedTest", "unit._rpc_test.RPCTest", diff --git a/src/python/grpcio_tests/tests/unit/_metadata_test.py b/src/python/grpcio_tests/tests/unit/_metadata_test.py index 054d54cd932..3e7717b04c7 100644 --- a/src/python/grpcio_tests/tests/unit/_metadata_test.py +++ b/src/python/grpcio_tests/tests/unit/_metadata_test.py @@ -19,7 +19,6 @@ import logging import grpc from grpc import _channel -from grpc.experimental.aio._metadata import Metadata from tests.unit import test_common from tests.unit.framework.common import test_constants @@ -238,108 +237,6 @@ class MetadataTest(unittest.TestCase): call.trailing_metadata())) -class MetadataTypeTest(unittest.TestCase): - """Tests for the metadata type""" - - _DEFAULT_DATA = (("key1", "value1"), ("key2", "value2")) - _MULTI_ENTRY_DATA = (("key1", "value1"), ("key1", "other value 1"), - ("key2", "value2")) - - def test_init_metadata(self): - test_cases = { - "emtpy": (), - "with-single-data": self._DEFAULT_DATA, - "with-multi-data": self._MULTI_ENTRY_DATA, - } - for case, args in test_cases.items(): - with self.subTest(case=case): - metadata = Metadata(*args) - self.assertEqual(len(metadata), len(args)) - - def test_get_item(self): - metadata = Metadata(("key", "value1"), ("key", "value2"), - ("key2", "other value")) - self.assertEqual(metadata["key"], "value1") - self.assertEqual(metadata["key2"], "other value") - self.assertEqual(metadata.get("key"), "value1") - self.assertEqual(metadata.get("key2"), "other value") - - with self.assertRaises(KeyError): - metadata["key not found"] - self.assertIsNone(metadata.get("key not found")) - - def test_add_value(self): - metadata = Metadata() - metadata.add("key", "value") - metadata.add("key", "second value") - metadata.add("key2", "value2") - - self.assertEqual(metadata["key"], "value") - self.assertEqual(metadata["key2"], "value2") - - def test_get_all_items(self): - metadata = Metadata(*self._MULTI_ENTRY_DATA) - self.assertEqual(metadata.get_all("key1"), ["value1", "other value 1"]) - self.assertEqual(metadata.get_all("key2"), ["value2"]) - self.assertEqual(metadata.get_all("non existing key"), []) - - def test_container(self): - metadata = Metadata(*self._MULTI_ENTRY_DATA) - self.assertIn("key1", metadata) - - def test_equals(self): - metadata = Metadata() - for key, value in self._DEFAULT_DATA: - metadata.add(key, value) - metadata2 = Metadata(*self._DEFAULT_DATA) - - self.assertEqual(metadata, metadata2) - self.assertNotEqual(metadata, "foo") - - def test_repr(self): - metadata = Metadata(*self._DEFAULT_DATA) - expected = "Metadata({0!r})".format(self._DEFAULT_DATA) - self.assertEqual(repr(metadata), expected) - - def test_set(self): - metadata = Metadata(*self._MULTI_ENTRY_DATA) - override_value = "override value" - for _ in range(3): - metadata["key1"] = override_value - - self.assertEqual(metadata["key1"], override_value) - self.assertEqual(metadata.get_all("key1"), - [override_value, "other value 1"]) - - empty_metadata = Metadata() - for _ in range(3): - empty_metadata["key"] = override_value - - self.assertEqual(empty_metadata["key"], override_value) - self.assertEqual(empty_metadata.get_all("key"), [override_value]) - - def test_set_all(self): - metadata = Metadata(*self._DEFAULT_DATA) - metadata.set_all("key", ["value1", b"new value 2"]) - - self.assertEqual(metadata["key"], "value1") - self.assertEqual(metadata.get_all("key"), ["value1", b"new value 2"]) - - def test_delete_values(self): - metadata = Metadata(*self._MULTI_ENTRY_DATA) - del metadata["key1"] - self.assertEqual(metadata.get("key1"), "other value 1") - - metadata.delete_all("key1") - self.assertNotIn("key1", metadata) - - metadata.delete_all("key2") - self.assertEqual(len(metadata), 0) - - with self.assertRaises(KeyError): - del metadata["other key"] - - if __name__ == '__main__': logging.basicConfig() unittest.main(verbosity=2) diff --git a/src/python/grpcio_tests/tests_aio/tests.json b/src/python/grpcio_tests/tests_aio/tests.json index b2b53a3ad65..84dbf02b937 100644 --- a/src/python/grpcio_tests/tests_aio/tests.json +++ b/src/python/grpcio_tests/tests_aio/tests.json @@ -3,6 +3,7 @@ "health_check.health_servicer_test.HealthServicerTest", "interop.local_interop_test.InsecureLocalInteropTest", "interop.local_interop_test.SecureLocalInteropTest", + "unit._metadata_test.TestTypeMetadata", "unit.abort_test.TestAbort", "unit.aio_rpc_error_test.TestAioRpcError", "unit.call_test.TestStreamStreamCall", diff --git a/src/python/grpcio_tests/tests_aio/unit/_metadata_test.py b/src/python/grpcio_tests/tests_aio/unit/_metadata_test.py new file mode 100644 index 00000000000..4b63ed92107 --- /dev/null +++ b/src/python/grpcio_tests/tests_aio/unit/_metadata_test.py @@ -0,0 +1,125 @@ +# Copyright 2020 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Tests for the metadata abstraction that's used in the asynchronous driver.""" +import logging +import unittest + +from grpc.experimental.aio._metadata import Metadata + + +class TestTypeMetadata(unittest.TestCase): + """Tests for the metadata type""" + + _DEFAULT_DATA = (("key1", "value1"), ("key2", "value2")) + _MULTI_ENTRY_DATA = (("key1", "value1"), ("key1", "other value 1"), + ("key2", "value2")) + + def test_init_metadata(self): + test_cases = { + "emtpy": (), + "with-single-data": self._DEFAULT_DATA, + "with-multi-data": self._MULTI_ENTRY_DATA, + } + for case, args in test_cases.items(): + with self.subTest(case=case): + metadata = Metadata(*args) + self.assertEqual(len(metadata), len(args)) + + def test_get_item(self): + metadata = Metadata(("key", "value1"), ("key", "value2"), + ("key2", "other value")) + self.assertEqual(metadata["key"], "value1") + self.assertEqual(metadata["key2"], "other value") + self.assertEqual(metadata.get("key"), "value1") + self.assertEqual(metadata.get("key2"), "other value") + + with self.assertRaises(KeyError): + metadata["key not found"] + self.assertIsNone(metadata.get("key not found")) + + def test_add_value(self): + metadata = Metadata() + metadata.add("key", "value") + metadata.add("key", "second value") + metadata.add("key2", "value2") + + self.assertEqual(metadata["key"], "value") + self.assertEqual(metadata["key2"], "value2") + + def test_get_all_items(self): + metadata = Metadata(*self._MULTI_ENTRY_DATA) + self.assertEqual(metadata.get_all("key1"), ["value1", "other value 1"]) + self.assertEqual(metadata.get_all("key2"), ["value2"]) + self.assertEqual(metadata.get_all("non existing key"), []) + + def test_container(self): + metadata = Metadata(*self._MULTI_ENTRY_DATA) + self.assertIn("key1", metadata) + + def test_equals(self): + metadata = Metadata() + for key, value in self._DEFAULT_DATA: + metadata.add(key, value) + metadata2 = Metadata(*self._DEFAULT_DATA) + + self.assertEqual(metadata, metadata2) + self.assertNotEqual(metadata, "foo") + + def test_repr(self): + metadata = Metadata(*self._DEFAULT_DATA) + expected = "Metadata({0!r})".format(self._DEFAULT_DATA) + self.assertEqual(repr(metadata), expected) + + def test_set(self): + metadata = Metadata(*self._MULTI_ENTRY_DATA) + override_value = "override value" + for _ in range(3): + metadata["key1"] = override_value + + self.assertEqual(metadata["key1"], override_value) + self.assertEqual(metadata.get_all("key1"), + [override_value, "other value 1"]) + + empty_metadata = Metadata() + for _ in range(3): + empty_metadata["key"] = override_value + + self.assertEqual(empty_metadata["key"], override_value) + self.assertEqual(empty_metadata.get_all("key"), [override_value]) + + def test_set_all(self): + metadata = Metadata(*self._DEFAULT_DATA) + metadata.set_all("key", ["value1", b"new value 2"]) + + self.assertEqual(metadata["key"], "value1") + self.assertEqual(metadata.get_all("key"), ["value1", b"new value 2"]) + + def test_delete_values(self): + metadata = Metadata(*self._MULTI_ENTRY_DATA) + del metadata["key1"] + self.assertEqual(metadata.get("key1"), "other value 1") + + metadata.delete_all("key1") + self.assertNotIn("key1", metadata) + + metadata.delete_all("key2") + self.assertEqual(len(metadata), 0) + + with self.assertRaises(KeyError): + del metadata["other key"] + + +if __name__ == '__main__': + logging.basicConfig() + unittest.main(verbosity=2) From 3651424ea4208624e43c46e443a1d3fecd2369c0 Mon Sep 17 00:00:00 2001 From: Ashitha Santhosh Date: Wed, 25 Mar 2020 03:01:07 -0700 Subject: [PATCH 280/758] Moved k[Min/Max]FrameSize variables to header file. --- src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc | 6 ++---- src/core/tsi/alts/handshaker/alts_tsi_handshaker.h | 5 +++++ test/core/tsi/alts/handshaker/alts_tsi_handshaker_test.cc | 7 ++----- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc b/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc index c9daaecbce6..b2687825d17 100644 --- a/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +++ b/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc @@ -41,10 +41,8 @@ #include "src/core/tsi/alts/handshaker/alts_tsi_utils.h" #include "src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.h" -// Frame size negotiation extends send frame size range to -// [kMinFrameSize, kMaxFrameSize] -constexpr size_t kMinFrameSize = 16 * 1024; -constexpr size_t kMaxFrameSize = 128 * 1024; +const size_t kMinFrameSize = 16 * 1024; +const size_t kMaxFrameSize = 128 * 1024; /* Main struct for ALTS TSI handshaker. */ struct alts_tsi_handshaker { diff --git a/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h b/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h index 0c9a5732c48..6959c563a5e 100644 --- a/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +++ b/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h @@ -38,6 +38,11 @@ const size_t kTsiAltsNumOfPeerProperties = 5; +// Frame size negotiation extends send frame size range to +// [kMinFrameSize, kMaxFrameSize] +ABSL_CONST_INIT extern const size_t kMinFrameSize; +ABSL_CONST_INIT extern const size_t kMaxFrameSize; + typedef struct alts_tsi_handshaker alts_tsi_handshaker; /** diff --git a/test/core/tsi/alts/handshaker/alts_tsi_handshaker_test.cc b/test/core/tsi/alts/handshaker/alts_tsi_handshaker_test.cc index 0abab1f8ae2..1037313bbec 100644 --- a/test/core/tsi/alts/handshaker/alts_tsi_handshaker_test.cc +++ b/test/core/tsi/alts/handshaker/alts_tsi_handshaker_test.cc @@ -50,9 +50,7 @@ #define ALTS_TSI_HANDSHAKER_TEST_APPLICATION_PROTOCOL \ "test application protocol" #define ALTS_TSI_HANDSHAKER_TEST_RECORD_PROTOCOL "test record protocol" -#define ALTS_TSI_HANDSHAKER_TEST_MIN_FRAME_SIZE 16 * 1024 #define ALTS_TSI_HANDSHAKER_TEST_MAX_FRAME_SIZE 256 * 1024 -#define ALTS_TSI_HANDSHAKER_TEST_DEFAULT_MAX_FRAME_SIZE 128 * 1024 using grpc_core::internal::alts_handshaker_client_check_fields_for_testing; using grpc_core::internal::alts_handshaker_client_get_handshaker_for_testing; @@ -298,8 +296,7 @@ static void on_client_next_success_cb(tsi_result status, void* user_data, size_t actual_max_frame_size; tsi_zero_copy_grpc_protector_max_frame_size(zero_copy_protector, &actual_max_frame_size); - GPR_ASSERT(actual_max_frame_size == - ALTS_TSI_HANDSHAKER_TEST_DEFAULT_MAX_FRAME_SIZE); + GPR_ASSERT(actual_max_frame_size == kMaxFrameSize); /* Validate peer identity. */ tsi_peer peer; GPR_ASSERT(tsi_handshaker_result_extract_peer(result, &peer) == TSI_OK); @@ -372,7 +369,7 @@ static void on_server_next_success_cb(tsi_result status, void* user_data, size_t actual_max_frame_size; tsi_zero_copy_grpc_protector_max_frame_size(zero_copy_protector, &actual_max_frame_size); - GPR_ASSERT(actual_max_frame_size == ALTS_TSI_HANDSHAKER_TEST_MIN_FRAME_SIZE); + GPR_ASSERT(actual_max_frame_size == kMinFrameSize); /* Validate peer identity. */ tsi_peer peer; GPR_ASSERT(tsi_handshaker_result_extract_peer(result, &peer) == TSI_OK); From 38f02d8e2b5dbcd70f72432780adb05aa8d4403d Mon Sep 17 00:00:00 2001 From: "Mark D. Roth" Date: Tue, 24 Mar 2020 12:13:47 -0700 Subject: [PATCH 281/758] xds: NACK EDS update with sparse priorities --- .../ext/filters/client_channel/xds/xds_api.cc | 16 +++++++--- test/cpp/end2end/xds_end2end_test.cc | 30 +++++++++++++++++-- 2 files changed, 40 insertions(+), 6 deletions(-) diff --git a/src/core/ext/filters/client_channel/xds/xds_api.cc b/src/core/ext/filters/client_channel/xds/xds_api.cc index 9f0b17f5865..5a41d0af32a 100644 --- a/src/core/ext/filters/client_channel/xds/xds_api.cc +++ b/src/core/ext/filters/client_channel/xds/xds_api.cc @@ -1347,7 +1347,7 @@ grpc_error* DropParseAndAppend( return GRPC_ERROR_NONE; } -grpc_error* EdsResponsedParse( +grpc_error* EdsResponseParse( XdsClient* client, TraceFlag* tracer, const envoy_api_v2_DiscoveryResponse* response, const std::set& expected_eds_service_names, @@ -1397,6 +1397,14 @@ grpc_error* EdsResponsedParse( if (locality.lb_weight == 0) continue; eds_update.priority_list_update.Add(locality); } + for (uint32_t priority = 0; + priority < eds_update.priority_list_update.size(); ++priority) { + auto* locality_map = eds_update.priority_list_update.Find(priority); + if (locality_map == nullptr || locality_map->size() == 0) { + return GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "EDS update includes sparse priority list"); + } + } // Get the drop config. eds_update.drop_config = MakeRefCounted(); const envoy_api_v2_ClusterLoadAssignment_Policy* policy = @@ -1471,9 +1479,9 @@ grpc_error* XdsApi::ParseAdsResponse( return CdsResponseParse(client_, tracer_, response, expected_cluster_names, cds_update_map, arena.ptr()); } else if (*type_url == kEdsTypeUrl) { - return EdsResponsedParse(client_, tracer_, response, - expected_eds_service_names, eds_update_map, - arena.ptr()); + return EdsResponseParse(client_, tracer_, response, + expected_eds_service_names, eds_update_map, + arena.ptr()); } else { return GRPC_ERROR_CREATE_FROM_STATIC_STRING( "Unsupported ADS resource type."); diff --git a/test/cpp/end2end/xds_end2end_test.cc b/test/cpp/end2end/xds_end2end_test.cc index 622022a0bd0..3050af3caba 100644 --- a/test/cpp/end2end/xds_end2end_test.cc +++ b/test/cpp/end2end/xds_end2end_test.cc @@ -2339,8 +2339,6 @@ TEST_P(CdsTest, Timeout) { using EdsTest = BasicTest; -// TODO(roth): Add tests showing that RPCs fail when EDS data is invalid. - TEST_P(EdsTest, Timeout) { ResetStub(0, 0, "", 500); balancers_[0]->ads_service()->SetResourceIgnore(kEdsTypeUrl); @@ -2349,6 +2347,34 @@ TEST_P(EdsTest, Timeout) { CheckRpcSendFailure(); } +// Tests that EDS client should send a NACK if the EDS update contains +// no localities but does not say to drop all calls. +TEST_P(EdsTest, NacksNoLocalitiesWithoutDropAll) { + SetNextResolution({}); + SetNextResolutionForLbChannelAllBalancers(); + AdsServiceImpl::EdsResourceArgs args; + balancers_[0]->ads_service()->SetEdsResource( + AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); + CheckRpcSendFailure(); + EXPECT_EQ(balancers_[0]->ads_service()->eds_response_state(), + AdsServiceImpl::NACKED); +} + +// Tests that EDS client should send a NACK if the EDS update contains +// sparse priorities. +TEST_P(EdsTest, NacksSparsePriorityList) { + SetNextResolution({}); + SetNextResolutionForLbChannelAllBalancers(); + AdsServiceImpl::EdsResourceArgs args({ + {"locality0", GetBackendPorts(), kDefaultLocalityWeight, 1}, + }); + balancers_[0]->ads_service()->SetEdsResource( + AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); + CheckRpcSendFailure(); + EXPECT_EQ(balancers_[0]->ads_service()->eds_response_state(), + AdsServiceImpl::NACKED); +} + using LocalityMapTest = BasicTest; // Tests that the localities in a locality map are picked according to their From 07d37e944b130ea2649aaf7bb68e35d1e1553956 Mon Sep 17 00:00:00 2001 From: "Mark D. Roth" Date: Wed, 25 Mar 2020 10:05:54 -0700 Subject: [PATCH 282/758] Fix repo manager assignments --- .github/ISSUE_TEMPLATE/bug_report.md | 2 +- .github/ISSUE_TEMPLATE/cleanup_request.md | 2 +- .github/ISSUE_TEMPLATE/feature_request.md | 2 +- .github/pull_request_template.md | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 0b5862cfece..9011a669d3d 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -2,7 +2,7 @@ name: Report a bug about: Create a report to help us improve labels: kind/bug, priority/P2 -assignees: markroth +assignees: markdroth --- diff --git a/.github/ISSUE_TEMPLATE/cleanup_request.md b/.github/ISSUE_TEMPLATE/cleanup_request.md index 33625a6f589..9cf36e6fa0b 100644 --- a/.github/ISSUE_TEMPLATE/cleanup_request.md +++ b/.github/ISSUE_TEMPLATE/cleanup_request.md @@ -2,7 +2,7 @@ name: Request a cleanup about: Suggest a cleanup in our repository labels: kind/internal cleanup, priority/P2 -assignees: markroth +assignees: markdroth --- diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index 9f67cb93ad1..0d9906a9eb0 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -2,7 +2,7 @@ name: Request a feature about: Suggest an idea for this project labels: kind/enhancement, priority/P2 -assignees: markroth +assignees: markdroth --- diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index aa56038f22f..a85cfad9c7a 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -8,4 +8,4 @@ If you know who should review your pull request, please remove the mentioning be --> -@markroth +@markdroth From a8ad4db3aff90b059c4719f68cff8d284ad945a0 Mon Sep 17 00:00:00 2001 From: Mariano Anaya Date: Wed, 25 Mar 2020 18:20:11 +0100 Subject: [PATCH 283/758] [issue21953] Fix import in test Import metadata from the canonical place. --- src/python/grpcio_tests/tests_aio/unit/_metadata_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/python/grpcio_tests/tests_aio/unit/_metadata_test.py b/src/python/grpcio_tests/tests_aio/unit/_metadata_test.py index 4b63ed92107..dda58c5ed53 100644 --- a/src/python/grpcio_tests/tests_aio/unit/_metadata_test.py +++ b/src/python/grpcio_tests/tests_aio/unit/_metadata_test.py @@ -15,7 +15,7 @@ import logging import unittest -from grpc.experimental.aio._metadata import Metadata +from grpc.experimental.aio import Metadata class TestTypeMetadata(unittest.TestCase): From f64e7af7cd70c2c260151445d7f26add74ff331b Mon Sep 17 00:00:00 2001 From: Richard Belleville Date: Wed, 25 Mar 2020 10:35:45 -0700 Subject: [PATCH 284/758] Add requirements.txt --- examples/python/xds/README.md | 2 +- examples/python/xds/requirements.txt | 5 +++++ examples/python/xds/server.py | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 examples/python/xds/requirements.txt diff --git a/examples/python/xds/README.md b/examples/python/xds/README.md index 51bfe715583..bf7809e814d 100644 --- a/examples/python/xds/README.md +++ b/examples/python/xds/README.md @@ -22,7 +22,7 @@ cd grpc/examples/python/xds ```sh virtualenv venv -p python3 source venv/bin/activate -pip install grpcio protobuf grpcio-reflection grpcio-health-checking +pip install -r requirements.txt python server.py ``` diff --git a/examples/python/xds/requirements.txt b/examples/python/xds/requirements.txt new file mode 100644 index 00000000000..a7ac2e7c8b3 --- /dev/null +++ b/examples/python/xds/requirements.txt @@ -0,0 +1,5 @@ +grpcio>=1.28.0 +protobuf +grpcio-reflection +grpcio-health-checking + diff --git a/examples/python/xds/server.py b/examples/python/xds/server.py index 3cff567667f..75043857f3b 100644 --- a/examples/python/xds/server.py +++ b/examples/python/xds/server.py @@ -43,7 +43,7 @@ class Greeter(helloworld_pb2_grpc.GreeterServicer): message=f"Hello {request.name} from {self._hostname}!") -def serve(port, hostname): +def serve(port: int, hostname: str): server = grpc.server( futures.ThreadPoolExecutor(max_workers=multiprocessing.cpu_count())) From d4fb5ea436f4c3d98fc3be45018d243c4630dc11 Mon Sep 17 00:00:00 2001 From: "Mark D. Roth" Date: Wed, 25 Mar 2020 10:45:41 -0700 Subject: [PATCH 285/758] update service config parsing as per recent spec change --- .../filters/client_channel/client_channel.cc | 4 +- .../client_channel/resolver_result_parsing.cc | 15 +- .../client_channel/resolver_result_parsing.h | 8 +- .../filters/client_channel/service_config.cc | 160 ++--- .../filters/client_channel/service_config.h | 26 +- src/core/lib/slice/slice_internal.h | 14 + .../client_channel/service_config_test.cc | 638 +++++++++--------- .../naming/resolver_component_tests_runner.py | 2 +- .../naming/resolver_test_record_groups.yaml | 4 +- 9 files changed, 455 insertions(+), 416 deletions(-) diff --git a/src/core/ext/filters/client_channel/client_channel.cc b/src/core/ext/filters/client_channel/client_channel.cc index a815e1933a6..a48a8a01d70 100644 --- a/src/core/ext/filters/client_channel/client_channel.cc +++ b/src/core/ext/filters/client_channel/client_channel.cc @@ -1630,8 +1630,8 @@ void ChannelData::ProcessLbPolicy( // If not, try the setting from channel args. const char* policy_name = nullptr; if (parsed_service_config != nullptr && - parsed_service_config->parsed_deprecated_lb_policy() != nullptr) { - policy_name = parsed_service_config->parsed_deprecated_lb_policy(); + !parsed_service_config->parsed_deprecated_lb_policy().empty()) { + policy_name = parsed_service_config->parsed_deprecated_lb_policy().c_str(); } else { const grpc_arg* channel_arg = grpc_channel_args_find(resolver_result.args, GRPC_ARG_LB_POLICY_NAME); diff --git a/src/core/ext/filters/client_channel/resolver_result_parsing.cc b/src/core/ext/filters/client_channel/resolver_result_parsing.cc index 080ecd354e6..d87890d1c97 100644 --- a/src/core/ext/filters/client_channel/resolver_result_parsing.cc +++ b/src/core/ext/filters/client_channel/resolver_result_parsing.cc @@ -317,7 +317,7 @@ ClientChannelServiceConfigParser::ParseGlobalParams(const Json& json, GPR_DEBUG_ASSERT(error != nullptr && *error == GRPC_ERROR_NONE); std::vector error_list; RefCountedPtr parsed_lb_config; - grpc_core::UniquePtr lb_policy_name; + std::string lb_policy_name; Optional retry_throttling; const char* health_check_service_name = nullptr; // Parse LB config. @@ -340,16 +340,13 @@ ClientChannelServiceConfigParser::ParseGlobalParams(const Json& json, error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( "field:loadBalancingPolicy error:type should be string")); } else { - lb_policy_name.reset(gpr_strdup(it->second.string_value().c_str())); - char* lb_policy = lb_policy_name.get(); - if (lb_policy != nullptr) { - for (size_t i = 0; i < strlen(lb_policy); ++i) { - lb_policy[i] = tolower(lb_policy[i]); - } + lb_policy_name = it->second.string_value(); + for (size_t i = 0; i < lb_policy_name.size(); ++i) { + lb_policy_name[i] = tolower(lb_policy_name[i]); } bool requires_config = false; if (!LoadBalancingPolicyRegistry::LoadBalancingPolicyExists( - lb_policy, &requires_config)) { + lb_policy_name.c_str(), &requires_config)) { error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( "field:loadBalancingPolicy error:Unknown lb policy")); } else if (requires_config) { @@ -357,7 +354,7 @@ ClientChannelServiceConfigParser::ParseGlobalParams(const Json& json, gpr_asprintf(&error_msg, "field:loadBalancingPolicy error:%s requires a config. " "Please use loadBalancingConfig instead.", - lb_policy); + lb_policy_name.c_str()); error_list.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(error_msg)); gpr_free(error_msg); } diff --git a/src/core/ext/filters/client_channel/resolver_result_parsing.h b/src/core/ext/filters/client_channel/resolver_result_parsing.h index 27d7f6f1396..1f928cfd551 100644 --- a/src/core/ext/filters/client_channel/resolver_result_parsing.h +++ b/src/core/ext/filters/client_channel/resolver_result_parsing.h @@ -46,7 +46,7 @@ class ClientChannelGlobalParsedConfig : public ServiceConfig::ParsedConfig { ClientChannelGlobalParsedConfig( RefCountedPtr parsed_lb_config, - grpc_core::UniquePtr parsed_deprecated_lb_policy, + std::string parsed_deprecated_lb_policy, const Optional& retry_throttling, const char* health_check_service_name) : parsed_lb_config_(std::move(parsed_lb_config)), @@ -62,8 +62,8 @@ class ClientChannelGlobalParsedConfig : public ServiceConfig::ParsedConfig { return parsed_lb_config_; } - const char* parsed_deprecated_lb_policy() const { - return parsed_deprecated_lb_policy_.get(); + const std::string& parsed_deprecated_lb_policy() const { + return parsed_deprecated_lb_policy_; } const char* health_check_service_name() const { @@ -72,7 +72,7 @@ class ClientChannelGlobalParsedConfig : public ServiceConfig::ParsedConfig { private: RefCountedPtr parsed_lb_config_; - grpc_core::UniquePtr parsed_deprecated_lb_policy_; + std::string parsed_deprecated_lb_policy_; Optional retry_throttling_; const char* health_check_service_name_; }; diff --git a/src/core/ext/filters/client_channel/service_config.cc b/src/core/ext/filters/client_channel/service_config.cc index 884f68f2090..f08ebe1a37d 100644 --- a/src/core/ext/filters/client_channel/service_config.cc +++ b/src/core/ext/filters/client_channel/service_config.cc @@ -20,6 +20,8 @@ #include +#include "absl/strings/str_cat.h" + #include #include #include @@ -27,9 +29,7 @@ #include "src/core/lib/gpr/string.h" #include "src/core/lib/json/json.h" -#include "src/core/lib/slice/slice_hash_table.h" #include "src/core/lib/slice/slice_internal.h" -#include "src/core/lib/slice/slice_string_helpers.h" namespace grpc_core { @@ -77,6 +77,12 @@ ServiceConfig::ServiceConfig(std::string json_string, Json json, } } +ServiceConfig::~ServiceConfig() { + for (auto& p : parsed_method_configs_map_) { + grpc_slice_unref_internal(p.first); + } +} + grpc_error* ServiceConfig::ParseGlobalParams() { std::vector error_list; for (size_t i = 0; i < g_registered_parsers->size(); i++) { @@ -91,10 +97,8 @@ grpc_error* ServiceConfig::ParseGlobalParams() { return GRPC_ERROR_CREATE_FROM_VECTOR("Global Params", &error_list); } -grpc_error* ServiceConfig::ParseJsonMethodConfigToServiceConfigVectorTable( - const Json& json, - InlinedVector::Entry, 10>* - entries) { +grpc_error* ServiceConfig::ParseJsonMethodConfig(const Json& json) { + // Parse method config with each registered parser. auto objs_vector = absl::make_unique(); InlinedVector error_list; for (size_t i = 0; i < g_registered_parsers->size(); i++) { @@ -108,8 +112,8 @@ grpc_error* ServiceConfig::ParseJsonMethodConfigToServiceConfigVectorTable( } parsed_method_config_vectors_storage_.push_back(std::move(objs_vector)); const auto* vector_ptr = parsed_method_config_vectors_storage_.back().get(); - // Construct list of paths. - InlinedVector, 10> paths; + // Add an entry for each path. + bool found_name = false; auto it = json.object_value().find("name"); if (it != json.object_value().end()) { if (it->second.type() != Json::Type::ARRAY) { @@ -120,29 +124,42 @@ grpc_error* ServiceConfig::ParseJsonMethodConfigToServiceConfigVectorTable( const Json::Array& name_array = it->second.array_value(); for (const Json& name : name_array) { grpc_error* parse_error = GRPC_ERROR_NONE; - UniquePtr path = ParseJsonMethodName(name, &parse_error); - if (path == nullptr) { + std::string path = ParseJsonMethodName(name, &parse_error); + if (parse_error != GRPC_ERROR_NONE) { error_list.push_back(parse_error); } else { - GPR_DEBUG_ASSERT(parse_error == GRPC_ERROR_NONE); - paths.push_back(std::move(path)); + found_name = true; + if (path.empty()) { + if (default_method_config_vector_ != nullptr) { + error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "field:name error:multiple default method configs")); + } + default_method_config_vector_ = vector_ptr; + } else { + grpc_slice key = grpc_slice_from_copied_string(path.c_str()); + // If the key is not already present in the map, this will + // store a ref to the key in the map. + auto& value = parsed_method_configs_map_[key]; + if (value != nullptr) { + error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "field:name error:multiple method configs with same name")); + // The map entry already existed, so we need to unref the + // key we just created. + grpc_slice_unref_internal(key); + } else { + value = vector_ptr; + } + } } } } - if (paths.size() == 0) { - error_list.push_back( - GRPC_ERROR_CREATE_FROM_STATIC_STRING("No names specified")); - } - // Add entry for each path. - for (size_t i = 0; i < paths.size(); ++i) { - entries->push_back( - {grpc_slice_from_copied_string(paths[i].get()), vector_ptr}); + if (!found_name) { + parsed_method_config_vectors_storage_.pop_back(); } return GRPC_ERROR_CREATE_FROM_VECTOR("methodConfig", &error_list); } grpc_error* ServiceConfig::ParsePerMethodParams() { - InlinedVector::Entry, 10> entries; std::vector error_list; auto it = json_.object_value().find("methodConfig"); if (it != json_.object_value().end()) { @@ -156,91 +173,80 @@ grpc_error* ServiceConfig::ParsePerMethodParams() { "field:methodConfig error:not of type Object")); continue; } - grpc_error* error = ParseJsonMethodConfigToServiceConfigVectorTable( - method_config, &entries); + grpc_error* error = ParseJsonMethodConfig(method_config); if (error != GRPC_ERROR_NONE) { error_list.push_back(error); } } } - if (!entries.empty()) { - parsed_method_configs_table_ = - SliceHashTable::Create( - entries.size(), entries.data(), nullptr); - } return GRPC_ERROR_CREATE_FROM_VECTOR("Method Params", &error_list); } -UniquePtr ServiceConfig::ParseJsonMethodName(const Json& json, - grpc_error** error) { +std::string ServiceConfig::ParseJsonMethodName(const Json& json, + grpc_error** error) { if (json.type() != Json::Type::OBJECT) { *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING( "field:name error:type is not object"); - return nullptr; + return ""; } // Find service name. + const std::string* service_name = nullptr; auto it = json.object_value().find("service"); - if (it == json.object_value().end()) { - *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "field:name error: field:service error:not found"); - return nullptr; // Required field. - } - if (it->second.type() != Json::Type::STRING) { - *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "field:name error: field:service error:not of type string"); - return nullptr; - } - if (it->second.string_value().empty()) { - *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "field:name error: field:service error:empty value"); - return nullptr; + if (it != json.object_value().end() && + it->second.type() != Json::Type::JSON_NULL) { + if (it->second.type() != Json::Type::STRING) { + *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "field:name error: field:service error:not of type string"); + return ""; + } + if (!it->second.string_value().empty()) { + service_name = &it->second.string_value(); + } } - const char* service_name = it->second.string_value().c_str(); - const char* method_name = nullptr; + const std::string* method_name = nullptr; // Find method name. it = json.object_value().find("method"); - if (it != json.object_value().end()) { + if (it != json.object_value().end() && + it->second.type() != Json::Type::JSON_NULL) { if (it->second.type() != Json::Type::STRING) { *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING( "field:name error: field:method error:not of type string"); - return nullptr; + return ""; + } + if (!it->second.string_value().empty()) { + method_name = &it->second.string_value(); } - if (it->second.string_value().empty()) { + } + // If neither service nor method are specified, it's the default. + // Method name may not be specified without service name. + if (service_name == nullptr) { + if (method_name != nullptr) { *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "field:name error: field:method error:empty value"); - return nullptr; + "field:name error:method name populated without service name"); } - method_name = it->second.string_value().c_str(); + return ""; } - char* path; - gpr_asprintf(&path, "/%s/%s", service_name, - method_name == nullptr ? "" : method_name); - return grpc_core::UniquePtr(path); + // Construct path. + return absl::StrCat("/", *service_name, "/", + method_name == nullptr ? "" : *method_name); } const ServiceConfig::ParsedConfigVector* -ServiceConfig::GetMethodParsedConfigVector(const grpc_slice& path) { - if (parsed_method_configs_table_.get() == nullptr) { - return nullptr; - } - const auto* value = parsed_method_configs_table_->Get(path); +ServiceConfig::GetMethodParsedConfigVector(const grpc_slice& path) const { + // Try looking up the full path in the map. + auto it = parsed_method_configs_map_.find(path); + if (it != parsed_method_configs_map_.end()) return it->second; // If we didn't find a match for the path, try looking for a wildcard // entry (i.e., change "/service/method" to "/service/"). - if (value == nullptr) { - char* path_str = grpc_slice_to_c_string(path); - const char* sep = strrchr(path_str, '/') + 1; - const size_t len = (size_t)(sep - path_str); - char* buf = (char*)gpr_malloc(len + 1); // trailing NUL - memcpy(buf, path_str, len); - buf[len] = '\0'; - grpc_slice wildcard_path = grpc_slice_from_copied_string(buf); - gpr_free(buf); - value = parsed_method_configs_table_->Get(wildcard_path); - grpc_slice_unref_internal(wildcard_path); - gpr_free(path_str); - if (value == nullptr) return nullptr; - } - return *value; + UniquePtr path_str(grpc_slice_to_c_string(path)); + char* sep = strrchr(path_str.get(), '/') + 1; + if (sep == nullptr) return nullptr; // Shouldn't ever happen. + *sep = '\0'; + grpc_slice wildcard_path = grpc_slice_from_static_string(path_str.get()); + it = parsed_method_configs_map_.find(wildcard_path); + if (it != parsed_method_configs_map_.end()) return it->second; + // Try default method config, if set. + return default_method_config_vector_; } size_t ServiceConfig::RegisterParser(std::unique_ptr parser) { diff --git a/src/core/ext/filters/client_channel/service_config.h b/src/core/ext/filters/client_channel/service_config.h index 6e9ead52af9..3bba4ec1010 100644 --- a/src/core/ext/filters/client_channel/service_config.h +++ b/src/core/ext/filters/client_channel/service_config.h @@ -19,6 +19,8 @@ #include +#include + #include #include @@ -27,7 +29,7 @@ #include "src/core/lib/gprpp/ref_counted_ptr.h" #include "src/core/lib/iomgr/error.h" #include "src/core/lib/json/json.h" -#include "src/core/lib/slice/slice_hash_table.h" +#include "src/core/lib/slice/slice_internal.h" // The main purpose of the code here is to parse the service config in // JSON form, which will look like this: @@ -129,6 +131,7 @@ class ServiceConfig : public RefCounted { grpc_error** error); ServiceConfig(std::string json_string, Json json, grpc_error** error); + ~ServiceConfig(); const std::string& json_string() const { return json_string_; } @@ -143,7 +146,8 @@ class ServiceConfig : public RefCounted { /// Retrieves the vector of parsed configs for the method identified /// by \a path. The lifetime of the returned vector and contained objects /// is tied to the lifetime of the ServiceConfig object. - const ParsedConfigVector* GetMethodParsedConfigVector(const grpc_slice& path); + const ParsedConfigVector* GetMethodParsedConfigVector( + const grpc_slice& path) const; /// Globally register a service config parser. On successful registration, it /// returns the index at which the parser was registered. On failure, -1 is @@ -162,15 +166,11 @@ class ServiceConfig : public RefCounted { grpc_error* ParseGlobalParams(); grpc_error* ParsePerMethodParams(); - // Returns a path string for the JSON name object specified by \a json. - // Returns null on error, and stores error in \a error. - static UniquePtr ParseJsonMethodName(const Json& json, - grpc_error** error); + // Returns a path string for the JSON name object specified by json. + // Sets *error on error. + static std::string ParseJsonMethodName(const Json& json, grpc_error** error); - grpc_error* ParseJsonMethodConfigToServiceConfigVectorTable( - const Json& json, - InlinedVector::Entry, 10>* - entries); + grpc_error* ParseJsonMethodConfig(const Json& json); std::string json_string_; Json json_; @@ -180,8 +180,10 @@ class ServiceConfig : public RefCounted { // A map from the method name to the parsed config vector. Note that we are // using a raw pointer and not a unique pointer so that we can use the same // vector for multiple names. - RefCountedPtr> - parsed_method_configs_table_; + std::unordered_map + parsed_method_configs_map_; + // Default method config. + const ParsedConfigVector* default_method_config_vector_ = nullptr; // Storage for all the vectors that are being used in // parsed_method_configs_table_. InlinedVector, 32> diff --git a/src/core/lib/slice/slice_internal.h b/src/core/lib/slice/slice_internal.h index e74aba94145..5148aad5055 100644 --- a/src/core/lib/slice/slice_internal.h +++ b/src/core/lib/slice/slice_internal.h @@ -347,4 +347,18 @@ size_t grpc_slice_memory_usage(grpc_slice s); grpc_core::UnmanagedMemorySlice grpc_slice_sub_no_ref( const grpc_core::UnmanagedMemorySlice& source, size_t begin, size_t end); +namespace grpc_core { + +struct SliceHash { + std::size_t operator()(const grpc_slice& slice) const { + return grpc_slice_hash_internal(slice); + } +}; + +} // namespace grpc_core + +inline bool operator==(const grpc_slice& s1, const grpc_slice& s2) { + return grpc_slice_eq(s1, s2); +} + #endif /* GRPC_CORE_LIB_SLICE_SLICE_INTERNAL_H */ diff --git a/test/core/client_channel/service_config_test.cc b/test/core/client_channel/service_config_test.cc index ad874736ffb..d659fbeb51d 100644 --- a/test/core/client_channel/service_config_test.cc +++ b/test/core/client_channel/service_config_test.cc @@ -18,6 +18,8 @@ #include +#include "absl/strings/str_cat.h" + #include #include @@ -127,10 +129,10 @@ class ErrorParser : public ServiceConfig::Parser { static const char* GlobalError() { return "ErrorParser : globalError"; } }; -void VerifyRegexMatch(grpc_error* error, const std::regex& e) { +void VerifyRegexMatch(grpc_error* error, const std::regex& regex) { std::smatch match; - std::string s(grpc_error_string(error)); - EXPECT_TRUE(std::regex_search(s, match, e)); + std::string error_str = grpc_error_string(error); + EXPECT_TRUE(std::regex_search(error_str, match, regex)) << error_str; GRPC_ERROR_UNREF(error); } @@ -139,10 +141,10 @@ class ServiceConfigTest : public ::testing::Test { void SetUp() override { ServiceConfig::Shutdown(); ServiceConfig::Init(); - EXPECT_TRUE( - ServiceConfig::RegisterParser(absl::make_unique()) == 0); - EXPECT_TRUE( - ServiceConfig::RegisterParser(absl::make_unique()) == 1); + EXPECT_EQ(ServiceConfig::RegisterParser(absl::make_unique()), + 0); + EXPECT_EQ(ServiceConfig::RegisterParser(absl::make_unique()), + 1); } }; @@ -150,46 +152,128 @@ TEST_F(ServiceConfigTest, ErrorCheck1) { const char* test_json = ""; grpc_error* error = GRPC_ERROR_NONE; auto svc_cfg = ServiceConfig::Create(test_json, &error); - gpr_log(GPR_ERROR, "%s", grpc_error_string(error)); - ASSERT_TRUE(error != GRPC_ERROR_NONE); - std::regex e(std::string("JSON parse error")); - VerifyRegexMatch(error, e); + std::regex regex(std::string("JSON parse error")); + VerifyRegexMatch(error, regex); } TEST_F(ServiceConfigTest, BasicTest1) { const char* test_json = "{}"; grpc_error* error = GRPC_ERROR_NONE; auto svc_cfg = ServiceConfig::Create(test_json, &error); - EXPECT_TRUE(error == GRPC_ERROR_NONE); + EXPECT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error); +} + +TEST_F(ServiceConfigTest, SkipMethodConfigWithNoNameOrEmptyName) { + const char* test_json = + "{\"methodConfig\": [" + " {\"method_param\":1}," + " {\"name\":[], \"method_param\":1}," + " {\"name\":[{\"service\":\"TestServ\"}], \"method_param\":2}" + "]}"; + grpc_error* error = GRPC_ERROR_NONE; + auto svc_cfg = ServiceConfig::Create(test_json, &error); + ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error); + const auto* vector_ptr = svc_cfg->GetMethodParsedConfigVector( + grpc_slice_from_static_string("/TestServ/TestMethod")); + ASSERT_NE(vector_ptr, nullptr); + auto parsed_config = ((*vector_ptr)[1]).get(); + EXPECT_EQ(static_cast(parsed_config)->value(), 2); +} + +TEST_F(ServiceConfigTest, ErrorDuplicateMethodConfigNames) { + const char* test_json = + "{\"methodConfig\": [" + " {\"name\":[{\"service\":\"TestServ\"}]}," + " {\"name\":[{\"service\":\"TestServ\"}]}" + "]}"; + grpc_error* error = GRPC_ERROR_NONE; + auto svc_cfg = ServiceConfig::Create(test_json, &error); + std::regex regex( + std::string("Service config parsing error.*referenced_errors" + ".*Method Params.*referenced_errors" + ".*methodConfig.*referenced_errors" + ".*multiple method configs with same name")); + VerifyRegexMatch(error, regex); } -TEST_F(ServiceConfigTest, ErrorNoNames) { - const char* test_json = "{\"methodConfig\": [{\"blah\":1}]}"; +TEST_F(ServiceConfigTest, ErrorDuplicateMethodConfigNamesWithNullMethod) { + const char* test_json = + "{\"methodConfig\": [" + " {\"name\":[{\"service\":\"TestServ\",\"method\":null}]}," + " {\"name\":[{\"service\":\"TestServ\"}]}" + "]}"; grpc_error* error = GRPC_ERROR_NONE; auto svc_cfg = ServiceConfig::Create(test_json, &error); - gpr_log(GPR_ERROR, "%s", grpc_error_string(error)); - ASSERT_TRUE(error != GRPC_ERROR_NONE); - std::regex e( - std::string("(Service config parsing error)(.*)(referenced_errors)" - "(.*)(Method Params)(.*)(referenced_errors)" - "(.*)(methodConfig)(.*)(referenced_errors)" - "(.*)(No names specified)")); - VerifyRegexMatch(error, e); + std::regex regex( + std::string("Service config parsing error.*referenced_errors" + ".*Method Params.*referenced_errors" + ".*methodConfig.*referenced_errors" + ".*multiple method configs with same name")); + VerifyRegexMatch(error, regex); } -TEST_F(ServiceConfigTest, ErrorNoNamesWithMultipleMethodConfigs) { +TEST_F(ServiceConfigTest, ErrorDuplicateMethodConfigNamesWithEmptyMethod) { const char* test_json = - "{\"methodConfig\": [{}, {\"name\":[{\"service\":\"TestServ\"}]}]}"; + "{\"methodConfig\": [" + " {\"name\":[{\"service\":\"TestServ\",\"method\":\"\"}]}," + " {\"name\":[{\"service\":\"TestServ\"}]}" + "]}"; grpc_error* error = GRPC_ERROR_NONE; auto svc_cfg = ServiceConfig::Create(test_json, &error); - gpr_log(GPR_ERROR, "%s", grpc_error_string(error)); - ASSERT_TRUE(error != GRPC_ERROR_NONE); - std::regex e( - std::string("(Service config parsing error)(.*)(referenced_errors)" - "(.*)(Method Params)(.*)(referenced_errors)" - "(.*)(methodConfig)(.*)(referenced_errors)" - "(.*)(No names specified)")); - VerifyRegexMatch(error, e); + std::regex regex( + std::string("Service config parsing error.*referenced_errors" + ".*Method Params.*referenced_errors" + ".*methodConfig.*referenced_errors" + ".*multiple method configs with same name")); + VerifyRegexMatch(error, regex); +} + +TEST_F(ServiceConfigTest, ErrorDuplicateDefaultMethodConfigs) { + const char* test_json = + "{\"methodConfig\": [" + " {\"name\":[{}]}," + " {\"name\":[{}]}" + "]}"; + grpc_error* error = GRPC_ERROR_NONE; + auto svc_cfg = ServiceConfig::Create(test_json, &error); + std::regex regex( + std::string("Service config parsing error.*referenced_errors" + ".*Method Params.*referenced_errors" + ".*methodConfig.*referenced_errors" + ".*multiple default method configs")); + VerifyRegexMatch(error, regex); +} + +TEST_F(ServiceConfigTest, ErrorDuplicateDefaultMethodConfigsWithNullService) { + const char* test_json = + "{\"methodConfig\": [" + " {\"name\":[{\"service\":null}]}," + " {\"name\":[{}]}" + "]}"; + grpc_error* error = GRPC_ERROR_NONE; + auto svc_cfg = ServiceConfig::Create(test_json, &error); + std::regex regex( + std::string("Service config parsing error.*referenced_errors" + ".*Method Params.*referenced_errors" + ".*methodConfig.*referenced_errors" + ".*multiple default method configs")); + VerifyRegexMatch(error, regex); +} + +TEST_F(ServiceConfigTest, ErrorDuplicateDefaultMethodConfigsWithEmptyService) { + const char* test_json = + "{\"methodConfig\": [" + " {\"name\":[{\"service\":\"\"}]}," + " {\"name\":[{}]}" + "]}"; + grpc_error* error = GRPC_ERROR_NONE; + auto svc_cfg = ServiceConfig::Create(test_json, &error); + std::regex regex( + std::string("Service config parsing error.*referenced_errors" + ".*Method Params.*referenced_errors" + ".*methodConfig.*referenced_errors" + ".*multiple default method configs")); + VerifyRegexMatch(error, regex); } TEST_F(ServiceConfigTest, ValidMethodConfig) { @@ -197,56 +281,52 @@ TEST_F(ServiceConfigTest, ValidMethodConfig) { "{\"methodConfig\": [{\"name\":[{\"service\":\"TestServ\"}]}]}"; grpc_error* error = GRPC_ERROR_NONE; auto svc_cfg = ServiceConfig::Create(test_json, &error); - EXPECT_TRUE(error == GRPC_ERROR_NONE); + EXPECT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error); } TEST_F(ServiceConfigTest, Parser1BasicTest1) { const char* test_json = "{\"global_param\":5}"; grpc_error* error = GRPC_ERROR_NONE; auto svc_cfg = ServiceConfig::Create(test_json, &error); - ASSERT_TRUE(error == GRPC_ERROR_NONE); - EXPECT_TRUE( - (static_cast(svc_cfg->GetGlobalParsedConfig(0))) - ->value() == 5); - EXPECT_TRUE(svc_cfg->GetMethodParsedConfigVector( - grpc_slice_from_static_string("/TestServ/TestMethod")) == - nullptr); + ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error); + EXPECT_EQ((static_cast(svc_cfg->GetGlobalParsedConfig(0))) + ->value(), + 5); + EXPECT_EQ(svc_cfg->GetMethodParsedConfigVector( + grpc_slice_from_static_string("/TestServ/TestMethod")), + nullptr); } TEST_F(ServiceConfigTest, Parser1BasicTest2) { const char* test_json = "{\"global_param\":1000}"; grpc_error* error = GRPC_ERROR_NONE; auto svc_cfg = ServiceConfig::Create(test_json, &error); - ASSERT_TRUE(error == GRPC_ERROR_NONE); - EXPECT_TRUE( - (static_cast(svc_cfg->GetGlobalParsedConfig(0))) - ->value() == 1000); + ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error); + EXPECT_EQ((static_cast(svc_cfg->GetGlobalParsedConfig(0))) + ->value(), + 1000); } TEST_F(ServiceConfigTest, Parser1ErrorInvalidType) { const char* test_json = "{\"global_param\":\"5\"}"; grpc_error* error = GRPC_ERROR_NONE; auto svc_cfg = ServiceConfig::Create(test_json, &error); - gpr_log(GPR_ERROR, "%s", grpc_error_string(error)); - ASSERT_TRUE(error != GRPC_ERROR_NONE); - std::regex e(std::string("(Service config parsing " - "error)(.*)(referenced_errors)(.*)(Global " - "Params)(.*)(referenced_errors)(.*)") + - TestParser1::InvalidTypeErrorMessage()); - VerifyRegexMatch(error, e); + std::regex regex( + absl::StrCat("Service config parsing error.*referenced_errors.*" + "Global Params.*referenced_errors.*", + TestParser1::InvalidTypeErrorMessage())); + VerifyRegexMatch(error, regex); } TEST_F(ServiceConfigTest, Parser1ErrorInvalidValue) { const char* test_json = "{\"global_param\":-5}"; grpc_error* error = GRPC_ERROR_NONE; auto svc_cfg = ServiceConfig::Create(test_json, &error); - gpr_log(GPR_ERROR, "%s", grpc_error_string(error)); - ASSERT_TRUE(error != GRPC_ERROR_NONE); - std::regex e(std::string("(Service config parsing " - "error)(.*)(referenced_errors)(.*)(Global " - "Params)(.*)(referenced_errors)(.*)") + - TestParser1::InvalidValueErrorMessage()); - VerifyRegexMatch(error, e); + std::regex regex( + absl::StrCat("Service config parsing error.*referenced_errors.*" + "Global Params.*referenced_errors.*", + TestParser1::InvalidValueErrorMessage())); + VerifyRegexMatch(error, regex); } TEST_F(ServiceConfigTest, Parser2BasicTest) { @@ -255,12 +335,12 @@ TEST_F(ServiceConfigTest, Parser2BasicTest) { "\"method_param\":5}]}"; grpc_error* error = GRPC_ERROR_NONE; auto svc_cfg = ServiceConfig::Create(test_json, &error); - ASSERT_TRUE(error == GRPC_ERROR_NONE); + ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error); const auto* vector_ptr = svc_cfg->GetMethodParsedConfigVector( grpc_slice_from_static_string("/TestServ/TestMethod")); - EXPECT_TRUE(vector_ptr != nullptr); + ASSERT_NE(vector_ptr, nullptr); auto parsed_config = ((*vector_ptr)[1]).get(); - EXPECT_TRUE(static_cast(parsed_config)->value() == 5); + EXPECT_EQ(static_cast(parsed_config)->value(), 5); } TEST_F(ServiceConfigTest, Parser2ErrorInvalidType) { @@ -269,14 +349,12 @@ TEST_F(ServiceConfigTest, Parser2ErrorInvalidType) { "\"method_param\":\"5\"}]}"; grpc_error* error = GRPC_ERROR_NONE; auto svc_cfg = ServiceConfig::Create(test_json, &error); - ASSERT_TRUE(error != GRPC_ERROR_NONE); - gpr_log(GPR_ERROR, "%s", grpc_error_string(error)); - std::regex e(std::string("(Service config parsing " - "error)(.*)(referenced_errors\":\\[)(.*)(Method " - "Params)(.*)(referenced_errors)(.*)(methodConfig)(" - ".*)(referenced_errors)(.*)") + - TestParser2::InvalidTypeErrorMessage()); - VerifyRegexMatch(error, e); + std::regex regex( + absl::StrCat("Service config parsing error.*referenced_errors\":\\[.*" + "Method Params.*referenced_errors.*methodConfig.*" + "referenced_errors.*", + TestParser2::InvalidTypeErrorMessage())); + VerifyRegexMatch(error, regex); } TEST_F(ServiceConfigTest, Parser2ErrorInvalidValue) { @@ -285,14 +363,12 @@ TEST_F(ServiceConfigTest, Parser2ErrorInvalidValue) { "\"method_param\":-5}]}"; grpc_error* error = GRPC_ERROR_NONE; auto svc_cfg = ServiceConfig::Create(test_json, &error); - ASSERT_TRUE(error != GRPC_ERROR_NONE); - gpr_log(GPR_ERROR, "%s", grpc_error_string(error)); - std::regex e(std::string("(Service config parsing " - "error)(.*)(referenced_errors\":\\[)(.*)(Method " - "Params)(.*)(referenced_errors)()(.*)(methodConfig)(" - ".*)(referenced_errors)(.*)") + - TestParser2::InvalidValueErrorMessage()); - VerifyRegexMatch(error, e); + std::regex regex( + absl::StrCat("Service config parsing error.*referenced_errors\":\\[.*" + "Method Params.*referenced_errors.*methodConfig.*" + "referenced_errors.*", + TestParser2::InvalidValueErrorMessage())); + VerifyRegexMatch(error, regex); } // Test parsing with ErrorParsers which always add errors @@ -301,10 +377,10 @@ class ErroredParsersScopingTest : public ::testing::Test { void SetUp() override { ServiceConfig::Shutdown(); ServiceConfig::Init(); - EXPECT_TRUE( - ServiceConfig::RegisterParser(absl::make_unique()) == 0); - EXPECT_TRUE( - ServiceConfig::RegisterParser(absl::make_unique()) == 1); + EXPECT_EQ(ServiceConfig::RegisterParser(absl::make_unique()), + 0); + EXPECT_EQ(ServiceConfig::RegisterParser(absl::make_unique()), + 1); } }; @@ -312,33 +388,24 @@ TEST_F(ErroredParsersScopingTest, GlobalParams) { const char* test_json = "{}"; grpc_error* error = GRPC_ERROR_NONE; auto svc_cfg = ServiceConfig::Create(test_json, &error); - ASSERT_TRUE(error != GRPC_ERROR_NONE); - gpr_log(GPR_ERROR, "%s", grpc_error_string(error)); - std::regex e(std::string("(Service config parsing " - "error)(.*)(referenced_errors\":\\[)(.*)(Global " - "Params)(.*)(referenced_errors)()(.*)") + - ErrorParser::GlobalError() + std::string("(.*)") + - ErrorParser::GlobalError()); - VerifyRegexMatch(error, e); + std::regex regex(absl::StrCat( + "Service config parsing error.*referenced_errors\":\\[.*" + "Global Params.*referenced_errors.*", + ErrorParser::GlobalError(), ".*", ErrorParser::GlobalError())); + VerifyRegexMatch(error, regex); } TEST_F(ErroredParsersScopingTest, MethodParams) { const char* test_json = "{\"methodConfig\": [{}]}"; grpc_error* error = GRPC_ERROR_NONE; auto svc_cfg = ServiceConfig::Create(test_json, &error); - ASSERT_TRUE(error != GRPC_ERROR_NONE); - gpr_log(GPR_ERROR, "%s", grpc_error_string(error)); - std::regex e(std::string("(Service config parsing " - "error)(.*)(referenced_errors\":\\[)(.*)(Global " - "Params)(.*)(referenced_errors)()(.*)") + - ErrorParser::GlobalError() + std::string("(.*)") + - ErrorParser::GlobalError() + - std::string("(.*)(Method Params)(.*)(referenced_errors)" - "(.*)(methodConfig)(.*)(referenced_errors)(.*)") + - ErrorParser::MethodError() + std::string("(.*)") + - ErrorParser::MethodError() + - std::string("(.*)(No names specified)")); - VerifyRegexMatch(error, e); + std::regex regex(absl::StrCat( + "Service config parsing error.*referenced_errors\":\\[.*" + "Global Params.*referenced_errors.*", + ErrorParser::GlobalError(), ".*", ErrorParser::GlobalError(), + ".*Method Params.*referenced_errors.*methodConfig.*referenced_errors.*", + ErrorParser::MethodError(), ".*", ErrorParser::MethodError())); + VerifyRegexMatch(error, regex); } class ClientChannelParserTest : public ::testing::Test { @@ -346,9 +413,9 @@ class ClientChannelParserTest : public ::testing::Test { void SetUp() override { ServiceConfig::Shutdown(); ServiceConfig::Init(); - EXPECT_TRUE( + EXPECT_EQ( ServiceConfig::RegisterParser( - absl::make_unique()) == + absl::make_unique()), 0); } }; @@ -357,12 +424,12 @@ TEST_F(ClientChannelParserTest, ValidLoadBalancingConfigPickFirst) { const char* test_json = "{\"loadBalancingConfig\": [{\"pick_first\":{}}]}"; grpc_error* error = GRPC_ERROR_NONE; auto svc_cfg = ServiceConfig::Create(test_json, &error); - ASSERT_TRUE(error == GRPC_ERROR_NONE); + ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error); const auto* parsed_config = static_cast( svc_cfg->GetGlobalParsedConfig(0)); auto lb_config = parsed_config->parsed_lb_config(); - EXPECT_TRUE(strcmp(lb_config->name(), "pick_first") == 0); + EXPECT_STREQ(lb_config->name(), "pick_first"); } TEST_F(ClientChannelParserTest, ValidLoadBalancingConfigRoundRobin) { @@ -370,12 +437,12 @@ TEST_F(ClientChannelParserTest, ValidLoadBalancingConfigRoundRobin) { "{\"loadBalancingConfig\": [{\"round_robin\":{}}, {}]}"; grpc_error* error = GRPC_ERROR_NONE; auto svc_cfg = ServiceConfig::Create(test_json, &error); - ASSERT_TRUE(error == GRPC_ERROR_NONE); + ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error); auto parsed_config = static_cast( svc_cfg->GetGlobalParsedConfig(0)); auto lb_config = parsed_config->parsed_lb_config(); - EXPECT_TRUE(strcmp(lb_config->name(), "round_robin") == 0); + EXPECT_STREQ(lb_config->name(), "round_robin"); } TEST_F(ClientChannelParserTest, ValidLoadBalancingConfigGrpclb) { @@ -384,12 +451,12 @@ TEST_F(ClientChannelParserTest, ValidLoadBalancingConfigGrpclb) { "[{\"grpclb\":{\"childPolicy\":[{\"pick_first\":{}}]}}]}"; grpc_error* error = GRPC_ERROR_NONE; auto svc_cfg = ServiceConfig::Create(test_json, &error); - ASSERT_TRUE(error == GRPC_ERROR_NONE); + ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error); const auto* parsed_config = static_cast( svc_cfg->GetGlobalParsedConfig(0)); auto lb_config = parsed_config->parsed_lb_config(); - EXPECT_TRUE(strcmp(lb_config->name(), "grpclb") == 0); + EXPECT_STREQ(lb_config->name(), "grpclb"); } TEST_F(ClientChannelParserTest, ValidLoadBalancingConfigXds) { @@ -402,105 +469,91 @@ TEST_F(ClientChannelParserTest, ValidLoadBalancingConfigXds) { "}"; grpc_error* error = GRPC_ERROR_NONE; auto svc_cfg = ServiceConfig::Create(test_json, &error); - gpr_log(GPR_ERROR, "%s", grpc_error_string(error)); - ASSERT_TRUE(error == GRPC_ERROR_NONE); + ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error); const auto* parsed_config = static_cast( svc_cfg->GetGlobalParsedConfig(0)); auto lb_config = parsed_config->parsed_lb_config(); - EXPECT_TRUE(strcmp(lb_config->name(), "xds_experimental") == 0); + EXPECT_STREQ(lb_config->name(), "xds_experimental"); } TEST_F(ClientChannelParserTest, UnknownLoadBalancingConfig) { const char* test_json = "{\"loadBalancingConfig\": [{\"unknown\":{}}]}"; grpc_error* error = GRPC_ERROR_NONE; auto svc_cfg = ServiceConfig::Create(test_json, &error); - gpr_log(GPR_ERROR, "%s", grpc_error_string(error)); - ASSERT_TRUE(error != GRPC_ERROR_NONE); - std::regex e( - std::string("(Service config parsing error)(.*)(referenced_errors)" - "(.*)(Global Params)(.*)(referenced_errors)" - "(.*)(Client channel global parser)(.*)(referenced_errors)" - "(.*)(field:loadBalancingConfig)(.*)(referenced_errors)" - "(.*)(No known policy)")); - VerifyRegexMatch(error, e); + std::regex regex( + "Service config parsing error.*referenced_errors.*" + "Global Params.*referenced_errors.*" + "Client channel global parser.*referenced_errors.*" + "field:loadBalancingConfig.*referenced_errors.*" + "No known policy"); + VerifyRegexMatch(error, regex); } TEST_F(ClientChannelParserTest, InvalidGrpclbLoadBalancingConfig) { const char* test_json = - "{\"loadBalancingConfig\": " - "[{\"grpclb\":{\"childPolicy\":[{\"unknown\":{}}]}}]}"; + "{\"loadBalancingConfig\": [" + " {\"grpclb\":{\"childPolicy\":1}}," + " {\"round_robin\":{}}" + "]}"; grpc_error* error = GRPC_ERROR_NONE; auto svc_cfg = ServiceConfig::Create(test_json, &error); - gpr_log(GPR_ERROR, "%s", grpc_error_string(error)); - ASSERT_TRUE(error != GRPC_ERROR_NONE); - std::regex e( - std::string("(Service config parsing error)(.*)(referenced_errors)" - "(.*)(Global Params)(.*)(referenced_errors)" - "(.*)(Client channel global parser)(.*)(referenced_errors)" - "(.*)(field:loadBalancingConfig)(.*)(referenced_errors)" - "(.*)(GrpcLb Parser)(.*)(referenced_errors)" - "(.*)(field:childPolicy)(.*)(referenced_errors)" - "(.*)(No known policy)")); - VerifyRegexMatch(error, e); + std::regex regex( + "Service config parsing error.*referenced_errors.*" + "Global Params.*referenced_errors.*" + "Client channel global parser.*referenced_errors.*" + "field:loadBalancingConfig.*referenced_errors.*" + "GrpcLb Parser.*referenced_errors.*" + "field:childPolicy.*referenced_errors.*" + "type should be array"); + VerifyRegexMatch(error, regex); } TEST_F(ClientChannelParserTest, ValidLoadBalancingPolicy) { const char* test_json = "{\"loadBalancingPolicy\":\"pick_first\"}"; grpc_error* error = GRPC_ERROR_NONE; auto svc_cfg = ServiceConfig::Create(test_json, &error); - ASSERT_TRUE(error == GRPC_ERROR_NONE); + ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error); const auto* parsed_config = static_cast( svc_cfg->GetGlobalParsedConfig(0)); - const auto* lb_policy = parsed_config->parsed_deprecated_lb_policy(); - ASSERT_TRUE(lb_policy != nullptr); - EXPECT_TRUE(strcmp(lb_policy, "pick_first") == 0); + EXPECT_EQ(parsed_config->parsed_deprecated_lb_policy(), "pick_first"); } TEST_F(ClientChannelParserTest, ValidLoadBalancingPolicyAllCaps) { const char* test_json = "{\"loadBalancingPolicy\":\"PICK_FIRST\"}"; grpc_error* error = GRPC_ERROR_NONE; auto svc_cfg = ServiceConfig::Create(test_json, &error); - gpr_log(GPR_ERROR, "%s", grpc_error_string(error)); - ASSERT_TRUE(error == GRPC_ERROR_NONE); + ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error); const auto* parsed_config = static_cast( svc_cfg->GetGlobalParsedConfig(0)); - const auto* lb_policy = parsed_config->parsed_deprecated_lb_policy(); - ASSERT_TRUE(lb_policy != nullptr); - EXPECT_TRUE(strcmp(lb_policy, "pick_first") == 0); + EXPECT_EQ(parsed_config->parsed_deprecated_lb_policy(), "pick_first"); } TEST_F(ClientChannelParserTest, UnknownLoadBalancingPolicy) { const char* test_json = "{\"loadBalancingPolicy\":\"unknown\"}"; grpc_error* error = GRPC_ERROR_NONE; auto svc_cfg = ServiceConfig::Create(test_json, &error); - gpr_log(GPR_ERROR, "%s", grpc_error_string(error)); - ASSERT_TRUE(error != GRPC_ERROR_NONE); - std::regex e( - std::string("(Service config parsing " - "error)(.*)(referenced_errors)(.*)(Global " - "Params)(.*)(referenced_errors)(.*)(Client channel global " - "parser)(.*)(referenced_errors)(.*)(field:" - "loadBalancingPolicy error:Unknown lb policy)")); - VerifyRegexMatch(error, e); + std::regex regex( + "Service config parsing error.*referenced_errors.*" + "Global Params.*referenced_errors.*" + "Client channel global parser.*referenced_errors.*" + "field:loadBalancingPolicy error:Unknown lb policy"); + VerifyRegexMatch(error, regex); } TEST_F(ClientChannelParserTest, LoadBalancingPolicyXdsNotAllowed) { const char* test_json = "{\"loadBalancingPolicy\":\"xds_experimental\"}"; grpc_error* error = GRPC_ERROR_NONE; auto svc_cfg = ServiceConfig::Create(test_json, &error); - gpr_log(GPR_ERROR, "%s", grpc_error_string(error)); - ASSERT_TRUE(error != GRPC_ERROR_NONE); - std::regex e( - std::string("(Service config parsing " - "error)(.*)(referenced_errors)(.*)(Global " - "Params)(.*)(referenced_errors)(.*)(Client channel global " - "parser)(.*)(referenced_errors)(.*)(field:" - "loadBalancingPolicy error:xds_experimental requires a " - "config. Please use loadBalancingConfig instead.)")); - VerifyRegexMatch(error, e); + std::regex regex( + "Service config parsing error.*referenced_errors.*" + "Global Params.*referenced_errors.*" + "Client channel global parser.*referenced_errors.*" + "field:loadBalancingPolicy error:xds_experimental requires " + "a config. Please use loadBalancingConfig instead."); + VerifyRegexMatch(error, regex); } TEST_F(ClientChannelParserTest, ValidRetryThrottling) { @@ -513,8 +566,7 @@ TEST_F(ClientChannelParserTest, ValidRetryThrottling) { "}"; grpc_error* error = GRPC_ERROR_NONE; auto svc_cfg = ServiceConfig::Create(test_json, &error); - gpr_log(GPR_ERROR, "%s", grpc_error_string(error)); - ASSERT_TRUE(error == GRPC_ERROR_NONE); + ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error); const auto* parsed_config = static_cast( svc_cfg->GetGlobalParsedConfig(0)); @@ -532,16 +584,13 @@ TEST_F(ClientChannelParserTest, RetryThrottlingMissingFields) { "}"; grpc_error* error = GRPC_ERROR_NONE; auto svc_cfg = ServiceConfig::Create(test_json, &error); - gpr_log(GPR_ERROR, "%s", grpc_error_string(error)); - ASSERT_TRUE(error != GRPC_ERROR_NONE); - std::regex e( - std::string("(Service config parsing " - "error)(.*)(referenced_errors)(.*)(Global " - "Params)(.*)(referenced_errors)(.*)(Client channel global " - "parser)(.*)(referenced_errors)(.*)(field:retryThrottling " - "field:maxTokens error:Not found)(.*)(field:retryThrottling " - "field:tokenRatio error:Not found)")); - VerifyRegexMatch(error, e); + std::regex regex( + "Service config parsing error.*referenced_errors.*" + "Global Params.*referenced_errors.*" + "Client channel global parser.*referenced_errors.*" + "field:retryThrottling field:maxTokens error:Not found.*" + "field:retryThrottling field:tokenRatio error:Not found"); + VerifyRegexMatch(error, regex); } TEST_F(ClientChannelParserTest, InvalidRetryThrottlingNegativeMaxTokens) { @@ -554,15 +603,13 @@ TEST_F(ClientChannelParserTest, InvalidRetryThrottlingNegativeMaxTokens) { "}"; grpc_error* error = GRPC_ERROR_NONE; auto svc_cfg = ServiceConfig::Create(test_json, &error); - gpr_log(GPR_ERROR, "%s", grpc_error_string(error)); - ASSERT_TRUE(error != GRPC_ERROR_NONE); - std::regex e( - std::string("(Service config parsing " - "error)(.*)(referenced_errors)(.*)(Global " - "Params)(.*)(referenced_errors)(.*)(Client channel global " - "parser)(.*)(referenced_errors)(.*)(field:retryThrottling " - "field:maxTokens error:should be greater than zero)")); - VerifyRegexMatch(error, e); + std::regex regex( + "Service config parsing error.*referenced_errors.*" + "Global Params.*referenced_errors.*" + "Client channel global parser.*referenced_errors.*" + "field:retryThrottling field:maxTokens error:should " + "be greater than zero"); + VerifyRegexMatch(error, regex); } TEST_F(ClientChannelParserTest, InvalidRetryThrottlingInvalidTokenRatio) { @@ -575,15 +622,13 @@ TEST_F(ClientChannelParserTest, InvalidRetryThrottlingInvalidTokenRatio) { "}"; grpc_error* error = GRPC_ERROR_NONE; auto svc_cfg = ServiceConfig::Create(test_json, &error); - gpr_log(GPR_ERROR, "%s", grpc_error_string(error)); - ASSERT_TRUE(error != GRPC_ERROR_NONE); - std::regex e( - std::string("(Service config parsing " - "error)(.*)(referenced_errors)(.*)(Global " - "Params)(.*)(referenced_errors)(.*)(Client channel global " - "parser)(.*)(referenced_errors)(.*)(field:retryThrottling " - "field:tokenRatio error:Failed parsing)")); - VerifyRegexMatch(error, e); + std::regex regex( + "Service config parsing error.*referenced_errors.*" + "Global Params.*referenced_errors.*" + "Client channel global parser.*referenced_errors.*" + "field:retryThrottling field:tokenRatio " + "error:Failed parsing"); + VerifyRegexMatch(error, regex); } TEST_F(ClientChannelParserTest, ValidTimeout) { @@ -598,10 +643,10 @@ TEST_F(ClientChannelParserTest, ValidTimeout) { "}"; grpc_error* error = GRPC_ERROR_NONE; auto svc_cfg = ServiceConfig::Create(test_json, &error); - ASSERT_TRUE(error == GRPC_ERROR_NONE); + ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error); const auto* vector_ptr = svc_cfg->GetMethodParsedConfigVector( grpc_slice_from_static_string("/TestServ/TestMethod")); - EXPECT_TRUE(vector_ptr != nullptr); + ASSERT_NE(vector_ptr, nullptr); auto parsed_config = ((*vector_ptr)[0]).get(); EXPECT_EQ((static_cast( parsed_config)) @@ -621,16 +666,13 @@ TEST_F(ClientChannelParserTest, InvalidTimeout) { "}"; grpc_error* error = GRPC_ERROR_NONE; auto svc_cfg = ServiceConfig::Create(test_json, &error); - gpr_log(GPR_ERROR, "%s", grpc_error_string(error)); - ASSERT_TRUE(error != GRPC_ERROR_NONE); - std::regex e( - std::string("(Service config parsing " - "error)(.*)(referenced_errors)(.*)(Method " - "Params)(.*)(referenced_errors)(.*)(methodConfig)(.*)(" - "referenced_errors)(.*)(Client channel " - "parser)(.*)(referenced_errors)(.*)(field:timeout " - "error:Failed parsing)")); - VerifyRegexMatch(error, e); + std::regex regex( + "Service config parsing error.*referenced_errors.*" + "Method Params.*referenced_errors.*" + "methodConfig.*referenced_errors.*" + "Client channel parser.*referenced_errors.*" + "field:timeout error:Failed parsing"); + VerifyRegexMatch(error, regex); } TEST_F(ClientChannelParserTest, ValidWaitForReady) { @@ -645,12 +687,12 @@ TEST_F(ClientChannelParserTest, ValidWaitForReady) { "}"; grpc_error* error = GRPC_ERROR_NONE; auto svc_cfg = ServiceConfig::Create(test_json, &error); - ASSERT_TRUE(error == GRPC_ERROR_NONE); + ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error); const auto* vector_ptr = svc_cfg->GetMethodParsedConfigVector( grpc_slice_from_static_string("/TestServ/TestMethod")); - EXPECT_TRUE(vector_ptr != nullptr); + ASSERT_NE(vector_ptr, nullptr); auto parsed_config = ((*vector_ptr)[0]).get(); - EXPECT_TRUE( + ASSERT_TRUE( (static_cast( parsed_config)) ->wait_for_ready() @@ -674,16 +716,13 @@ TEST_F(ClientChannelParserTest, InvalidWaitForReady) { "}"; grpc_error* error = GRPC_ERROR_NONE; auto svc_cfg = ServiceConfig::Create(test_json, &error); - gpr_log(GPR_ERROR, "%s", grpc_error_string(error)); - ASSERT_TRUE(error != GRPC_ERROR_NONE); - std::regex e( - std::string("(Service config parsing " - "error)(.*)(referenced_errors)(.*)(Method " - "Params)(.*)(referenced_errors)(.*)(methodConfig)(.*)(" - "referenced_errors)(.*)(Client channel " - "parser)(.*)(referenced_errors)(.*)(field:waitForReady " - "error:Type should be true/false)")); - VerifyRegexMatch(error, e); + std::regex regex( + "Service config parsing error.*referenced_errors.*" + "Method Params.*referenced_errors.*" + "methodConfig.*referenced_errors.*" + "Client channel parser.*referenced_errors.*" + "field:waitForReady error:Type should be true/false"); + VerifyRegexMatch(error, regex); } TEST_F(ClientChannelParserTest, ValidRetryPolicy) { @@ -704,15 +743,14 @@ TEST_F(ClientChannelParserTest, ValidRetryPolicy) { "}"; grpc_error* error = GRPC_ERROR_NONE; auto svc_cfg = ServiceConfig::Create(test_json, &error); - gpr_log(GPR_ERROR, "%s", grpc_error_string(error)); - ASSERT_TRUE(error == GRPC_ERROR_NONE); + ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error); const auto* vector_ptr = svc_cfg->GetMethodParsedConfigVector( grpc_slice_from_static_string("/TestServ/TestMethod")); - EXPECT_TRUE(vector_ptr != nullptr); + ASSERT_NE(vector_ptr, nullptr); const auto* parsed_config = static_cast( ((*vector_ptr)[0]).get()); - EXPECT_TRUE(parsed_config->retry_policy() != nullptr); + ASSERT_NE(parsed_config->retry_policy(), nullptr); EXPECT_EQ(parsed_config->retry_policy()->max_attempts, 3); EXPECT_EQ(parsed_config->retry_policy()->initial_backoff, 1000); EXPECT_EQ(parsed_config->retry_policy()->max_backoff, 120000); @@ -739,16 +777,14 @@ TEST_F(ClientChannelParserTest, InvalidRetryPolicyMaxAttempts) { "}"; grpc_error* error = GRPC_ERROR_NONE; auto svc_cfg = ServiceConfig::Create(test_json, &error); - gpr_log(GPR_ERROR, "%s", grpc_error_string(error)); - ASSERT_TRUE(error != GRPC_ERROR_NONE); - std::regex e(std::string( - "(Service config parsing " - "error)(.*)(referenced_errors)(.*)(Method " - "Params)(.*)(referenced_errors)(.*)(methodConfig)(.*)(referenced_errors)(" - ".*)(Client channel " - "parser)(.*)(referenced_errors)(.*)(retryPolicy)(.*)(referenced_errors)(." - "*)(field:maxAttempts error:should be at least 2)")); - VerifyRegexMatch(error, e); + std::regex regex( + "Service config parsing error.*referenced_errors.*" + "Method Params.*referenced_errors.*" + "methodConfig.*referenced_errors.*" + "Client channel parser.*referenced_errors.*" + "retryPolicy.*referenced_errors.*" + "field:maxAttempts error:should be at least 2"); + VerifyRegexMatch(error, regex); } TEST_F(ClientChannelParserTest, InvalidRetryPolicyInitialBackoff) { @@ -769,16 +805,14 @@ TEST_F(ClientChannelParserTest, InvalidRetryPolicyInitialBackoff) { "}"; grpc_error* error = GRPC_ERROR_NONE; auto svc_cfg = ServiceConfig::Create(test_json, &error); - gpr_log(GPR_ERROR, "%s", grpc_error_string(error)); - ASSERT_TRUE(error != GRPC_ERROR_NONE); - std::regex e(std::string( - "(Service config parsing " - "error)(.*)(referenced_errors)(.*)(Method " - "Params)(.*)(referenced_errors)(.*)(methodConfig)(.*)(referenced_errors)(" - ".*)(Client channel " - "parser)(.*)(referenced_errors)(.*)(retryPolicy)(.*)(referenced_errors)(." - "*)(field:initialBackoff error:Failed to parse)")); - VerifyRegexMatch(error, e); + std::regex regex( + "Service config parsing error.*referenced_errors.*" + "Method Params.*referenced_errors.*" + "methodConfig.*referenced_errors.*" + "Client channel parser.*referenced_errors.*" + "retryPolicy.*referenced_errors.*" + "field:initialBackoff error:Failed to parse"); + VerifyRegexMatch(error, regex); } TEST_F(ClientChannelParserTest, InvalidRetryPolicyMaxBackoff) { @@ -799,16 +833,14 @@ TEST_F(ClientChannelParserTest, InvalidRetryPolicyMaxBackoff) { "}"; grpc_error* error = GRPC_ERROR_NONE; auto svc_cfg = ServiceConfig::Create(test_json, &error); - gpr_log(GPR_ERROR, "%s", grpc_error_string(error)); - ASSERT_TRUE(error != GRPC_ERROR_NONE); - std::regex e(std::string( - "(Service config parsing " - "error)(.*)(referenced_errors)(.*)(Method " - "Params)(.*)(referenced_errors)(.*)(methodConfig)(.*)(referenced_errors)(" - ".*)(Client channel " - "parser)(.*)(referenced_errors)(.*)(retryPolicy)(.*)(referenced_errors)(." - "*)(field:maxBackoff error:failed to parse)")); - VerifyRegexMatch(error, e); + std::regex regex( + "Service config parsing error.*referenced_errors.*" + "Method Params.*referenced_errors.*" + "methodConfig.*referenced_errors.*" + "Client channel parser.*referenced_errors.*" + "retryPolicy.*referenced_errors.*" + "field:maxBackoff error:failed to parse"); + VerifyRegexMatch(error, regex); } TEST_F(ClientChannelParserTest, InvalidRetryPolicyBackoffMultiplier) { @@ -829,16 +861,14 @@ TEST_F(ClientChannelParserTest, InvalidRetryPolicyBackoffMultiplier) { "}"; grpc_error* error = GRPC_ERROR_NONE; auto svc_cfg = ServiceConfig::Create(test_json, &error); - gpr_log(GPR_ERROR, "%s", grpc_error_string(error)); - ASSERT_TRUE(error != GRPC_ERROR_NONE); - std::regex e(std::string( - "(Service config parsing " - "error)(.*)(referenced_errors)(.*)(Method " - "Params)(.*)(referenced_errors)(.*)(methodConfig)(.*)(referenced_errors)(" - ".*)(Client channel " - "parser)(.*)(referenced_errors)(.*)(retryPolicy)(.*)(referenced_errors)(." - "*)(field:backoffMultiplier error:should be of type number)")); - VerifyRegexMatch(error, e); + std::regex regex( + "Service config parsing error.*referenced_errors.*" + "Method Params.*referenced_errors.*" + "methodConfig.*referenced_errors.*" + "Client channel parser.*referenced_errors.*" + "retryPolicy.*referenced_errors.*" + "field:backoffMultiplier error:should be of type number"); + VerifyRegexMatch(error, regex); } TEST_F(ClientChannelParserTest, InvalidRetryPolicyRetryableStatusCodes) { @@ -859,16 +889,14 @@ TEST_F(ClientChannelParserTest, InvalidRetryPolicyRetryableStatusCodes) { "}"; grpc_error* error = GRPC_ERROR_NONE; auto svc_cfg = ServiceConfig::Create(test_json, &error); - gpr_log(GPR_ERROR, "%s", grpc_error_string(error)); - ASSERT_TRUE(error != GRPC_ERROR_NONE); - std::regex e(std::string( - "(Service config parsing " - "error)(.*)(referenced_errors)(.*)(Method " - "Params)(.*)(referenced_errors)(.*)(methodConfig)(.*)(referenced_errors)(" - ".*)(Client channel " - "parser)(.*)(referenced_errors)(.*)(retryPolicy)(.*)(referenced_errors)(." - "*)(field:retryableStatusCodes error:should be non-empty)")); - VerifyRegexMatch(error, e); + std::regex regex( + "Service config parsing error.*referenced_errors.*" + "Method Params.*referenced_errors.*" + "methodConfig.*referenced_errors.*" + "Client channel parser.*referenced_errors.*" + "retryPolicy.*referenced_errors.*" + "field:retryableStatusCodes error:should be non-empty"); + VerifyRegexMatch(error, regex); } TEST_F(ClientChannelParserTest, ValidHealthCheck) { @@ -880,14 +908,13 @@ TEST_F(ClientChannelParserTest, ValidHealthCheck) { "}"; grpc_error* error = GRPC_ERROR_NONE; auto svc_cfg = ServiceConfig::Create(test_json, &error); - ASSERT_TRUE(error == GRPC_ERROR_NONE); + ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error); const auto* parsed_config = static_cast( svc_cfg->GetGlobalParsedConfig(0)); - ASSERT_TRUE(parsed_config != nullptr); - EXPECT_EQ(strcmp(parsed_config->health_check_service_name(), - "health_check_service_name"), - 0); + ASSERT_NE(parsed_config, nullptr); + EXPECT_STREQ(parsed_config->health_check_service_name(), + "health_check_service_name"); } TEST_F(ClientChannelParserTest, InvalidHealthCheckMultipleEntries) { @@ -902,12 +929,10 @@ TEST_F(ClientChannelParserTest, InvalidHealthCheckMultipleEntries) { "}"; grpc_error* error = GRPC_ERROR_NONE; auto svc_cfg = ServiceConfig::Create(test_json, &error); - gpr_log(GPR_ERROR, "%s", grpc_error_string(error)); - ASSERT_TRUE(error != GRPC_ERROR_NONE); - std::regex e( - std::string("(JSON parsing failed)(.*)(referenced_errors)" - "(.*)(duplicate key \"healthCheckConfig\" at index 104)")); - VerifyRegexMatch(error, e); + std::regex regex( + "JSON parsing failed.*referenced_errors.*" + "duplicate key \"healthCheckConfig\" at index 104"); + VerifyRegexMatch(error, regex); } class MessageSizeParserTest : public ::testing::Test { @@ -915,8 +940,9 @@ class MessageSizeParserTest : public ::testing::Test { void SetUp() override { ServiceConfig::Shutdown(); ServiceConfig::Init(); - EXPECT_TRUE(ServiceConfig::RegisterParser( - absl::make_unique()) == 0); + EXPECT_EQ( + ServiceConfig::RegisterParser(absl::make_unique()), + 0); } }; @@ -933,14 +959,13 @@ TEST_F(MessageSizeParserTest, Valid) { "}"; grpc_error* error = GRPC_ERROR_NONE; auto svc_cfg = ServiceConfig::Create(test_json, &error); - gpr_log(GPR_ERROR, "%s", grpc_error_string(error)); - ASSERT_TRUE(error == GRPC_ERROR_NONE); + ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error); const auto* vector_ptr = svc_cfg->GetMethodParsedConfigVector( grpc_slice_from_static_string("/TestServ/TestMethod")); - EXPECT_TRUE(vector_ptr != nullptr); + ASSERT_NE(vector_ptr, nullptr); auto parsed_config = static_cast(((*vector_ptr)[0]).get()); - ASSERT_TRUE(parsed_config != nullptr); + ASSERT_NE(parsed_config, nullptr); EXPECT_EQ(parsed_config->limits().max_send_size, 1024); EXPECT_EQ(parsed_config->limits().max_recv_size, 1024); } @@ -957,16 +982,13 @@ TEST_F(MessageSizeParserTest, InvalidMaxRequestMessageBytes) { "}"; grpc_error* error = GRPC_ERROR_NONE; auto svc_cfg = ServiceConfig::Create(test_json, &error); - gpr_log(GPR_ERROR, "%s", grpc_error_string(error)); - ASSERT_TRUE(error != GRPC_ERROR_NONE); - std::regex e( - std::string("(Service config parsing " - "error)(.*)(referenced_errors)(.*)(Method " - "Params)(.*)(referenced_errors)(.*)(methodConfig)(.*)(" - "referenced_errors)(.*)(Message size " - "parser)(.*)(referenced_errors)(.*)(field:" - "maxRequestMessageBytes error:should be non-negative)")); - VerifyRegexMatch(error, e); + std::regex regex( + "Service config parsing error.*referenced_errors.*" + "Method Params.*referenced_errors.*" + "methodConfig.*referenced_errors.*" + "Message size parser.*referenced_errors.*" + "field:maxRequestMessageBytes error:should be non-negative"); + VerifyRegexMatch(error, regex); } TEST_F(MessageSizeParserTest, InvalidMaxResponseMessageBytes) { @@ -981,16 +1003,14 @@ TEST_F(MessageSizeParserTest, InvalidMaxResponseMessageBytes) { "}"; grpc_error* error = GRPC_ERROR_NONE; auto svc_cfg = ServiceConfig::Create(test_json, &error); - gpr_log(GPR_ERROR, "%s", grpc_error_string(error)); - ASSERT_TRUE(error != GRPC_ERROR_NONE); - std::regex e( - std::string("(Service config parsing " - "error)(.*)(referenced_errors)(.*)(Method " - "Params)(.*)(referenced_errors)(.*)(methodConfig)(.*)(" - "referenced_errors)(.*)(Message size " - "parser)(.*)(referenced_errors)(.*)(field:" - "maxResponseMessageBytes error:should be of type number)")); - VerifyRegexMatch(error, e); + std::regex regex( + "Service config parsing error.*referenced_errors.*" + "Method Params.*referenced_errors.*" + "methodConfig.*referenced_errors.*" + "Message size parser.*referenced_errors.*" + "field:maxResponseMessageBytes error:should be of type " + "number"); + VerifyRegexMatch(error, regex); } } // namespace testing diff --git a/test/cpp/naming/resolver_component_tests_runner.py b/test/cpp/naming/resolver_component_tests_runner.py index 53d9364a35b..274c9a1b345 100755 --- a/test/cpp/naming/resolver_component_tests_runner.py +++ b/test/cpp/naming/resolver_component_tests_runner.py @@ -331,7 +331,7 @@ current_test_subprocess = subprocess.Popen([ args.test_bin_path, '--target_name', 'ipv4-config-causing-fallback-to-tcp.resolver-tests-version-4.grpctestingexp.', '--expected_addrs', '1.2.3.4:443,False', - '--expected_chosen_service_config', '{"loadBalancingPolicy":"round_robin","methodConfig":[{"name":[{"method":"Foo","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooTwo","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooThree","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooFour","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooFive","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooSix","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooSeven","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooEight","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooNine","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooTen","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooEleven","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooTwelve","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooTwelve","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooTwelve","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooTwelve","service":"SimpleService"}],"waitForReady":true}]}', + '--expected_chosen_service_config', '{"loadBalancingPolicy":"round_robin","methodConfig":[{"name":[{"method":"Foo","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooTwo","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooThree","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooFour","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooFive","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooSix","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooSeven","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooEight","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooNine","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooTen","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooEleven","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooTwelve","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooThirteen","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooFourteen","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooFifteen","service":"SimpleService"}],"waitForReady":true}]}', '--expected_service_config_error', '', '--expected_lb_policy', '', '--enable_srv_queries', 'True', diff --git a/test/cpp/naming/resolver_test_record_groups.yaml b/test/cpp/naming/resolver_test_record_groups.yaml index a1d932ae2b7..c44c39faecc 100644 --- a/test/cpp/naming/resolver_test_record_groups.yaml +++ b/test/cpp/naming/resolver_test_record_groups.yaml @@ -205,7 +205,7 @@ resolver_component_tests: - {TTL: '2100', data: '2607:f8b0:400a:801::1002', type: AAAA} - expected_addrs: - {address: '1.2.3.4:443', is_balancer: false} - expected_chosen_service_config: '{"loadBalancingPolicy":"round_robin","methodConfig":[{"name":[{"method":"Foo","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooTwo","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooThree","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooFour","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooFive","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooSix","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooSeven","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooEight","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooNine","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooTen","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooEleven","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooTwelve","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooTwelve","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooTwelve","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooTwelve","service":"SimpleService"}],"waitForReady":true}]}' + expected_chosen_service_config: '{"loadBalancingPolicy":"round_robin","methodConfig":[{"name":[{"method":"Foo","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooTwo","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooThree","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooFour","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooFive","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooSix","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooSeven","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooEight","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooNine","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooTen","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooEleven","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooTwelve","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooThirteen","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooFourteen","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooFifteen","service":"SimpleService"}],"waitForReady":true}]}' expected_service_config_error: null expected_lb_policy: null enable_srv_queries: true @@ -216,7 +216,7 @@ resolver_component_tests: ipv4-config-causing-fallback-to-tcp: - {TTL: '2100', data: 1.2.3.4, type: A} _grpc_config.ipv4-config-causing-fallback-to-tcp: - - {TTL: '2100', data: 'grpc_config=[{"serviceConfig":{"loadBalancingPolicy":"round_robin","methodConfig":[{"name":[{"method":"Foo","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooTwo","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooThree","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooFour","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooFive","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooSix","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooSeven","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooEight","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooNine","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooTen","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooEleven","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooTwelve","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooTwelve","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooTwelve","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooTwelve","service":"SimpleService"}],"waitForReady":true}]}}]', + - {TTL: '2100', data: 'grpc_config=[{"serviceConfig":{"loadBalancingPolicy":"round_robin","methodConfig":[{"name":[{"method":"Foo","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooTwo","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooThree","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooFour","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooFive","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooSix","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooSeven","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooEight","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooNine","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooTen","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooEleven","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooTwelve","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooThirteen","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooFourteen","service":"SimpleService"}],"waitForReady":true},{"name":[{"method":"FooFifteen","service":"SimpleService"}],"waitForReady":true}]}}]', type: TXT} # Tests for which we don't enable SRV queries - expected_addrs: From 9c0cca6318175f00f50f6494650a073f571de622 Mon Sep 17 00:00:00 2001 From: "Mark D. Roth" Date: Wed, 25 Mar 2020 12:07:59 -0700 Subject: [PATCH 286/758] Pass repo manager duty to nicolasnoble. --- .github/ISSUE_TEMPLATE/bug_report.md | 2 +- .github/ISSUE_TEMPLATE/cleanup_request.md | 2 +- .github/ISSUE_TEMPLATE/feature_request.md | 2 +- .github/pull_request_template.md | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 9011a669d3d..f02cf704d1b 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -2,7 +2,7 @@ name: Report a bug about: Create a report to help us improve labels: kind/bug, priority/P2 -assignees: markdroth +assignees: nicolasnoble --- diff --git a/.github/ISSUE_TEMPLATE/cleanup_request.md b/.github/ISSUE_TEMPLATE/cleanup_request.md index 9cf36e6fa0b..11e8be8ef3e 100644 --- a/.github/ISSUE_TEMPLATE/cleanup_request.md +++ b/.github/ISSUE_TEMPLATE/cleanup_request.md @@ -2,7 +2,7 @@ name: Request a cleanup about: Suggest a cleanup in our repository labels: kind/internal cleanup, priority/P2 -assignees: markdroth +assignees: nicolasnoble --- diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index 0d9906a9eb0..fb3dae79227 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -2,7 +2,7 @@ name: Request a feature about: Suggest an idea for this project labels: kind/enhancement, priority/P2 -assignees: markdroth +assignees: nicolasnoble --- diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index a85cfad9c7a..57af6c21597 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -8,4 +8,4 @@ If you know who should review your pull request, please remove the mentioning be --> -@markdroth +@nicolasnoble From fe7f50a324324dd9da1ccd5202205bc777b6d1e9 Mon Sep 17 00:00:00 2001 From: ZhenLian Date: Wed, 25 Mar 2020 14:32:57 -0700 Subject: [PATCH 287/758] fix clang-format issue --- .../security_connector/ssl/ssl_security_connector.cc | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc b/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc index bbbe189bb09..13180724cdc 100644 --- a/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +++ b/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc @@ -190,11 +190,10 @@ class grpc_ssl_channel_security_connector final grpc_auth_context* auth_context, grpc_closure* /*on_call_host_checked*/, grpc_error** error) override { - return grpc_ssl_check_call_host(host, target_name_.get(), - overridden_target_name_ != nullptr - ? overridden_target_name_.get() - : "", - auth_context, error); + return grpc_ssl_check_call_host( + host, target_name_.get(), + overridden_target_name_ != nullptr ? overridden_target_name_.get() : "", + auth_context, error); } void cancel_check_call_host(grpc_closure* /*on_call_host_checked*/, From 79497f8059dfe6106f1d050a392b01072245b597 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Wed, 25 Mar 2020 15:09:21 -0700 Subject: [PATCH 288/758] Downgrade info logs to debug --- src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi | 2 +- src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi index 33959c44a14..4231ca7d8ab 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi @@ -77,7 +77,7 @@ cdef _actual_aio_initialization(): _GRPC_ASYNCIO_ENGINE, _default_asyncio_engine(), ) - _LOGGER.info('Using %s as I/O engine', _global_aio_state.engine) + _LOGGER.debug('Using %s as I/O engine', _global_aio_state.engine) # Initializes the process-level state accordingly if _global_aio_state.engine is AsyncIOEngine.CUSTOM_IO_MANAGER: diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi index 59ba5021815..b538bd9badc 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi @@ -494,7 +494,7 @@ async def _handle_exceptions(RPCState rpc_state, object rpc_coro, object loop): except asyncio.CancelledError: _LOGGER.debug('RPC cancelled for servicer method [%s]', _decode(rpc_state.method())) except _ServerStoppedError: - _LOGGER.info('Aborting RPC due to server stop.') + _LOGGER.debug('Aborting RPC due to server stop.') except Exception as e: _LOGGER.exception('Unexpected [%s] raised by servicer method [%s]' % ( type(e).__name__, From b5b47ce7c764bf716a1ea0eb3acc661620c3e415 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Wed, 25 Mar 2020 16:00:50 -0700 Subject: [PATCH 289/758] Upgrade the server stop log to warning --- src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi index b538bd9badc..668ecab0a85 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi @@ -494,7 +494,7 @@ async def _handle_exceptions(RPCState rpc_state, object rpc_coro, object loop): except asyncio.CancelledError: _LOGGER.debug('RPC cancelled for servicer method [%s]', _decode(rpc_state.method())) except _ServerStoppedError: - _LOGGER.debug('Aborting RPC due to server stop.') + _LOGGER.warning('Aborting method [%s] due to server stop.', _decode(rpc_state.method())) except Exception as e: _LOGGER.exception('Unexpected [%s] raised by servicer method [%s]' % ( type(e).__name__, From c86cfc305c9356a75de3107773e772601d5f5ea5 Mon Sep 17 00:00:00 2001 From: Vijay Pai Date: Wed, 25 Mar 2020 16:13:21 -0700 Subject: [PATCH 290/758] Remove all std::mem_fn and std::bind from service definitions and setup --- .../grpcpp/impl/codegen/method_handler_impl.h | 11 ++- src/compiler/cpp_generator.cc | 76 ++++++++++++------- test/cpp/codegen/compiler_test_golden | 27 ++++++- 3 files changed, 81 insertions(+), 33 deletions(-) diff --git a/include/grpcpp/impl/codegen/method_handler_impl.h b/include/grpcpp/impl/codegen/method_handler_impl.h index 6368b63e1ab..2de193457a1 100644 --- a/include/grpcpp/impl/codegen/method_handler_impl.h +++ b/include/grpcpp/impl/codegen/method_handler_impl.h @@ -303,10 +303,13 @@ class BidiStreamingHandler ::grpc_impl::ServerReaderWriter*)> func, ServiceType* service) + // TODO(vjpai): When gRPC supports C++14, move-capture func in the below : TemplatedBidiStreamingHandler< ::grpc_impl::ServerReaderWriter, false>( - std::bind(func, service, std::placeholders::_1, - std::placeholders::_2)) {} + [func, service]( + ::grpc_impl::ServerContext* ctx, + ::grpc_impl::ServerReaderWriter* + streamer) { return func(service, ctx, streamer); }) {} }; template @@ -321,7 +324,7 @@ class StreamedUnaryHandler func) : TemplatedBidiStreamingHandler< ::grpc_impl::ServerUnaryStreamer, true>( - func) {} + std::move(func)) {} }; template @@ -336,7 +339,7 @@ class SplitServerStreamingHandler func) : TemplatedBidiStreamingHandler< ::grpc_impl::ServerSplitStreamer, false>( - func) {} + std::move(func)) {} }; /// General method handler class for errors that prevent real method use diff --git a/src/compiler/cpp_generator.cc b/src/compiler/cpp_generator.cc index 882e3d60c67..21cf1d69ea7 100644 --- a/src/compiler/cpp_generator.cc +++ b/src/compiler/cpp_generator.cc @@ -1343,11 +1343,14 @@ void PrintHeaderServerMethodStreamedUnary( printer->Print(*vars, "WithStreamedUnaryMethod_$Method$() {\n" " ::grpc::Service::MarkMethodStreamed($Idx$,\n" - " new ::grpc::internal::StreamedUnaryHandler< $Request$, " - "$Response$>(std::bind" - "(&WithStreamedUnaryMethod_$Method$::" - "Streamed$Method$, this, std::placeholders::_1, " - "std::placeholders::_2)));\n" + " new ::grpc::internal::StreamedUnaryHandler<\n" + " $Request$, $Response$>(\n" + " [this](::grpc_impl::ServerContext* context,\n" + " ::grpc_impl::ServerUnaryStreamer<\n" + " $Request$, $Response$>* streamer) {\n" + " return this->Streamed$Method$(context,\n" + " streamer);\n" + " }));\n" "}\n"); printer->Print(*vars, "~WithStreamedUnaryMethod_$Method$() override {\n" @@ -1391,16 +1394,18 @@ void PrintHeaderServerMethodSplitStreaming( "{}\n"); printer->Print(" public:\n"); printer->Indent(); - printer->Print( - *vars, - "WithSplitStreamingMethod_$Method$() {\n" - " ::grpc::Service::MarkMethodStreamed($Idx$,\n" - " new ::grpc::internal::SplitServerStreamingHandler< $Request$, " - "$Response$>(std::bind" - "(&WithSplitStreamingMethod_$Method$::" - "Streamed$Method$, this, std::placeholders::_1, " - "std::placeholders::_2)));\n" - "}\n"); + printer->Print(*vars, + "WithSplitStreamingMethod_$Method$() {\n" + " ::grpc::Service::MarkMethodStreamed($Idx$,\n" + " new ::grpc::internal::SplitServerStreamingHandler<\n" + " $Request$, $Response$>(\n" + " [this](::grpc_impl::ServerContext* context,\n" + " ::grpc_impl::ServerSplitStreamer<\n" + " $Request$, $Response$>* streamer) {\n" + " return this->Streamed$Method$(context,\n" + " streamer);\n" + " }));\n" + "}\n"); printer->Print(*vars, "~WithSplitStreamingMethod_$Method$() override {\n" " BaseClassMustBeDerivedFromService(this);\n" @@ -2251,7 +2256,12 @@ void PrintSourceService(grpc_generator::Printer* printer, " new ::grpc::internal::RpcMethodHandler< $ns$$Service$::Service, " "$Request$, " "$Response$>(\n" - " std::mem_fn(&$ns$$Service$::Service::$Method$), this)));\n"); + " []($ns$$Service$::Service* service,\n" + " ::grpc_impl::ServerContext* ctx,\n" + " const $Request$* req,\n" + " $Response$* resp) {\n" + " return service->$Method$(ctx, req, resp);\n" + " }, this)));\n"); } else if (ClientOnlyStreaming(method.get())) { printer->Print( *vars, @@ -2260,7 +2270,12 @@ void PrintSourceService(grpc_generator::Printer* printer, " ::grpc::internal::RpcMethod::CLIENT_STREAMING,\n" " new ::grpc::internal::ClientStreamingHandler< " "$ns$$Service$::Service, $Request$, $Response$>(\n" - " std::mem_fn(&$ns$$Service$::Service::$Method$), this)));\n"); + " []($ns$$Service$::Service* service,\n" + " ::grpc_impl::ServerContext* ctx,\n" + " ::grpc_impl::ServerReader<$Request$>* reader,\n" + " $Response$* resp) {\n" + " return service->$Method$(ctx, reader, resp);\n" + " }, this)));\n"); } else if (ServerOnlyStreaming(method.get())) { printer->Print( *vars, @@ -2269,16 +2284,25 @@ void PrintSourceService(grpc_generator::Printer* printer, " ::grpc::internal::RpcMethod::SERVER_STREAMING,\n" " new ::grpc::internal::ServerStreamingHandler< " "$ns$$Service$::Service, $Request$, $Response$>(\n" - " std::mem_fn(&$ns$$Service$::Service::$Method$), this)));\n"); + " []($ns$$Service$::Service* service,\n" + " ::grpc_impl::ServerContext* ctx,\n" + " const $Request$* req,\n" + " ::grpc_impl::ServerWriter<$Response$>* writer) {\n" + " return service->$Method$(ctx, req, writer);\n" + " }, this)));\n"); } else if (method->BidiStreaming()) { - printer->Print( - *vars, - "AddMethod(new ::grpc::internal::RpcServiceMethod(\n" - " $prefix$$Service$_method_names[$Idx$],\n" - " ::grpc::internal::RpcMethod::BIDI_STREAMING,\n" - " new ::grpc::internal::BidiStreamingHandler< " - "$ns$$Service$::Service, $Request$, $Response$>(\n" - " std::mem_fn(&$ns$$Service$::Service::$Method$), this)));\n"); + printer->Print(*vars, + "AddMethod(new ::grpc::internal::RpcServiceMethod(\n" + " $prefix$$Service$_method_names[$Idx$],\n" + " ::grpc::internal::RpcMethod::BIDI_STREAMING,\n" + " new ::grpc::internal::BidiStreamingHandler< " + "$ns$$Service$::Service, $Request$, $Response$>(\n" + " []($ns$$Service$::Service* service,\n" + " ::grpc_impl::ServerContext* ctx,\n" + " ::grpc_impl::ServerReaderWriter<$Response$,\n" + " $Request$>* stream) {\n" + " return service->$Method$(ctx, stream);\n" + " }, this)));\n"); } } printer->Outdent(); diff --git a/test/cpp/codegen/compiler_test_golden b/test/cpp/codegen/compiler_test_golden index e6816f2f33c..7ad954d6d9a 100644 --- a/test/cpp/codegen/compiler_test_golden +++ b/test/cpp/codegen/compiler_test_golden @@ -839,7 +839,14 @@ class ServiceA final { public: WithStreamedUnaryMethod_MethodA1() { ::grpc::Service::MarkMethodStreamed(0, - new ::grpc::internal::StreamedUnaryHandler< ::grpc::testing::Request, ::grpc::testing::Response>(std::bind(&WithStreamedUnaryMethod_MethodA1::StreamedMethodA1, this, std::placeholders::_1, std::placeholders::_2))); + new ::grpc::internal::StreamedUnaryHandler< + ::grpc::testing::Request, ::grpc::testing::Response>( + [this](::grpc_impl::ServerContext* context, + ::grpc_impl::ServerUnaryStreamer< + ::grpc::testing::Request, ::grpc::testing::Response>* streamer) { + return this->StreamedMethodA1(context, + streamer); + })); } ~WithStreamedUnaryMethod_MethodA1() override { BaseClassMustBeDerivedFromService(this); @@ -860,7 +867,14 @@ class ServiceA final { public: WithSplitStreamingMethod_MethodA3() { ::grpc::Service::MarkMethodStreamed(2, - new ::grpc::internal::SplitServerStreamingHandler< ::grpc::testing::Request, ::grpc::testing::Response>(std::bind(&WithSplitStreamingMethod_MethodA3::StreamedMethodA3, this, std::placeholders::_1, std::placeholders::_2))); + new ::grpc::internal::SplitServerStreamingHandler< + ::grpc::testing::Request, ::grpc::testing::Response>( + [this](::grpc_impl::ServerContext* context, + ::grpc_impl::ServerSplitStreamer< + ::grpc::testing::Request, ::grpc::testing::Response>* streamer) { + return this->StreamedMethodA3(context, + streamer); + })); } ~WithSplitStreamingMethod_MethodA3() override { BaseClassMustBeDerivedFromService(this); @@ -1129,7 +1143,14 @@ class ServiceB final { public: WithStreamedUnaryMethod_MethodB1() { ::grpc::Service::MarkMethodStreamed(0, - new ::grpc::internal::StreamedUnaryHandler< ::grpc::testing::Request, ::grpc::testing::Response>(std::bind(&WithStreamedUnaryMethod_MethodB1::StreamedMethodB1, this, std::placeholders::_1, std::placeholders::_2))); + new ::grpc::internal::StreamedUnaryHandler< + ::grpc::testing::Request, ::grpc::testing::Response>( + [this](::grpc_impl::ServerContext* context, + ::grpc_impl::ServerUnaryStreamer< + ::grpc::testing::Request, ::grpc::testing::Response>* streamer) { + return this->StreamedMethodB1(context, + streamer); + })); } ~WithStreamedUnaryMethod_MethodB1() override { BaseClassMustBeDerivedFromService(this); From 5182e9f07fdedfbe8547c0b48cec76ab02d7bed4 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Wed, 25 Mar 2020 15:59:26 -0700 Subject: [PATCH 291/758] Eliminates suspicious exceptions in test logs --- .../_cygrpc/aio/callback_common.pyx.pxi | 5 +- .../grpc/_cython/_cygrpc/aio/server.pxd.pxi | 12 +++++ .../grpc/_cython/_cygrpc/aio/server.pyx.pxi | 47 ++++++++++++------- .../tests_aio/interop/local_interop_test.py | 1 - .../grpcio_tests/tests_aio/interop/methods.py | 10 ++-- .../grpcio_tests/tests_aio/unit/call_test.py | 2 +- .../tests_aio/unit/channel_test.py | 2 +- .../tests_aio/unit/client_interceptor_test.py | 2 +- .../tests_aio/unit/close_channel_test.py | 2 +- .../grpcio_tests/tests_aio/unit/init_test.py | 4 +- .../tests_aio/unit/server_interceptor_test.py | 2 +- 11 files changed, 60 insertions(+), 29 deletions(-) diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi index b8f04615297..5bd4f90c07b 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi @@ -70,7 +70,8 @@ cdef CallbackFailureHandler CQ_SHUTDOWN_FAILURE_HANDLER = CallbackFailureHandler InternalError) -class ExecuteBatchError(Exception): pass +class ExecuteBatchError(InternalError): + """Raised upon execute batch returns a fail from Core.""" async def execute_batch(GrpcCallWrapper grpc_call_wrapper, @@ -128,7 +129,7 @@ async def _receive_message(GrpcCallWrapper grpc_call_wrapper, # the callback (e.g. cancelled). # # Since they all indicates finish, they are better be merged. - _LOGGER.debug(e) + _LOGGER.debug('Failed to received message from Core') return receive_op.message() diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pxd.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pxd.pxi index 3923244748a..c2c08161248 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pxd.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pxd.pxi @@ -41,6 +41,18 @@ cdef class RPCState(GrpcCallWrapper): cdef Operation create_send_initial_metadata_op_if_not_sent(self) +cdef class _ServicerContext: + cdef RPCState _rpc_state + cdef object _loop + cdef object _request_deserializer + cdef object _response_serializer + + +cdef class _MessageReceiver: + cdef _ServicerContext _servicer_context + cdef object _agen + + cdef enum AioServerStatus: AIO_SERVER_STATUS_UNKNOWN AIO_SERVER_STATUS_READY diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi index 668ecab0a85..b0c62f9b9f2 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi @@ -109,10 +109,6 @@ cdef class RPCState: cdef class _ServicerContext: - cdef RPCState _rpc_state - cdef object _loop - cdef object _request_deserializer - cdef object _response_serializer def __cinit__(self, RPCState rpc_state, @@ -128,9 +124,9 @@ cdef class _ServicerContext: cdef bytes raw_message self._rpc_state.raise_for_termination() - if self._rpc_state.client_closed: - return EOF raw_message = await _receive_message(self._rpc_state, self._loop) + self._rpc_state.raise_for_termination() + if raw_message is None: return EOF else: @@ -414,15 +410,28 @@ async def _handle_unary_stream_rpc(object method_handler, ) -async def _message_receiver(_ServicerContext servicer_context): +cdef class _MessageReceiver: """Bridge between the async generator API and the reader-writer API.""" - cdef object message - while True: - message = await servicer_context.read() - if message is not EOF: - yield message - else: - break + + def __cinit__(self, _ServicerContext servicer_context): + self._servicer_context = servicer_context + self._agen = None + + async def _async_message_receiver(self): + """An async generator that receives messages.""" + cdef object message + while True: + message = await self._servicer_context.read() + if message is not EOF: + yield message + else: + break + + def __aiter__(self): + # Prevents never awaited warning if application never used the async generator + if self._agen is None: + self._agen = self._async_message_receiver() + return self._agen async def _handle_stream_unary_rpc(object method_handler, @@ -437,7 +446,7 @@ async def _handle_stream_unary_rpc(object method_handler, ) # Prepares the request generator - cdef object request_async_iterator = _message_receiver(servicer_context) + cdef object request_async_iterator = _MessageReceiver(servicer_context) # Finishes the application handler await _finish_handler_with_unary_response( @@ -462,7 +471,7 @@ async def _handle_stream_stream_rpc(object method_handler, ) # Prepares the request generator - cdef object request_async_iterator = _message_receiver(servicer_context) + cdef object request_async_iterator = _MessageReceiver(servicer_context) # Finishes the application handler await _finish_handler_with_stream_responses( @@ -495,6 +504,12 @@ async def _handle_exceptions(RPCState rpc_state, object rpc_coro, object loop): _LOGGER.debug('RPC cancelled for servicer method [%s]', _decode(rpc_state.method())) except _ServerStoppedError: _LOGGER.warning('Aborting method [%s] due to server stop.', _decode(rpc_state.method())) + except ExecuteBatchError: + # If client closed (aka. cancelled), ignore the failed batch operations. + if rpc_state.client_closed: + return + else: + raise except Exception as e: _LOGGER.exception('Unexpected [%s] raised by servicer method [%s]' % ( type(e).__name__, diff --git a/src/python/grpcio_tests/tests_aio/interop/local_interop_test.py b/src/python/grpcio_tests/tests_aio/interop/local_interop_test.py index c8b6083ae39..0db15be3a94 100644 --- a/src/python/grpcio_tests/tests_aio/interop/local_interop_test.py +++ b/src/python/grpcio_tests/tests_aio/interop/local_interop_test.py @@ -64,7 +64,6 @@ class InteropTestCaseMixin: await methods.test_interoperability( methods.TestCase.CANCEL_AFTER_FIRST_RESPONSE, self._stub, None) - @unittest.skip('TODO(https://github.com/grpc/grpc/issues/21707)') async def test_timeout_on_sleeping_server(self): await methods.test_interoperability( methods.TestCase.TIMEOUT_ON_SLEEPING_SERVER, self._stub, None) diff --git a/src/python/grpcio_tests/tests_aio/interop/methods.py b/src/python/grpcio_tests/tests_aio/interop/methods.py index 7c5c1edfd2b..019b3bca894 100644 --- a/src/python/grpcio_tests/tests_aio/interop/methods.py +++ b/src/python/grpcio_tests/tests_aio/interop/methods.py @@ -15,8 +15,9 @@ import argparse import asyncio -import enum import collections +import datetime +import enum import inspect import json import os @@ -220,12 +221,15 @@ async def _cancel_after_first_response(stub: test_pb2_grpc.TestServiceStub): async def _timeout_on_sleeping_server(stub: test_pb2_grpc.TestServiceStub): request_payload_size = 27182 + time_limit = datetime.timedelta(seconds=1) - call = stub.FullDuplexCall(timeout=0.001) + call = stub.FullDuplexCall(timeout=time_limit.total_seconds()) request = messages_pb2.StreamingOutputCallRequest( response_type=messages_pb2.COMPRESSABLE, - payload=messages_pb2.Payload(body=b'\x00' * request_payload_size)) + payload=messages_pb2.Payload(body=b'\x00' * request_payload_size), + response_parameters=(messages_pb2.ResponseParameters( + interval_us=int(time_limit.total_seconds() * 2 * 10**6)),)) await call.write(request) await call.done_writing() try: diff --git a/src/python/grpcio_tests/tests_aio/unit/call_test.py b/src/python/grpcio_tests/tests_aio/unit/call_test.py index e23548eed71..f64f4e44802 100644 --- a/src/python/grpcio_tests/tests_aio/unit/call_test.py +++ b/src/python/grpcio_tests/tests_aio/unit/call_test.py @@ -740,5 +740,5 @@ class TestStreamStreamCall(_MulticallableTestMixin, AioTestBase): if __name__ == '__main__': - logging.basicConfig() + logging.basicConfig(level=logging.DEBUG) unittest.main(verbosity=2) diff --git a/src/python/grpcio_tests/tests_aio/unit/channel_test.py b/src/python/grpcio_tests/tests_aio/unit/channel_test.py index 10949ac180c..58cd555491d 100644 --- a/src/python/grpcio_tests/tests_aio/unit/channel_test.py +++ b/src/python/grpcio_tests/tests_aio/unit/channel_test.py @@ -226,5 +226,5 @@ class TestChannel(AioTestBase): if __name__ == '__main__': - logging.basicConfig(level=logging.INFO) + logging.basicConfig(level=logging.DEBUG) unittest.main(verbosity=2) diff --git a/src/python/grpcio_tests/tests_aio/unit/client_interceptor_test.py b/src/python/grpcio_tests/tests_aio/unit/client_interceptor_test.py index 9fa08a78806..8f5a356ca4a 100644 --- a/src/python/grpcio_tests/tests_aio/unit/client_interceptor_test.py +++ b/src/python/grpcio_tests/tests_aio/unit/client_interceptor_test.py @@ -686,5 +686,5 @@ class TestInterceptedUnaryUnaryCall(AioTestBase): if __name__ == '__main__': - logging.basicConfig() + logging.basicConfig(level=logging.DEBUG) unittest.main(verbosity=2) diff --git a/src/python/grpcio_tests/tests_aio/unit/close_channel_test.py b/src/python/grpcio_tests/tests_aio/unit/close_channel_test.py index f05c74392d9..1e10074c47c 100644 --- a/src/python/grpcio_tests/tests_aio/unit/close_channel_test.py +++ b/src/python/grpcio_tests/tests_aio/unit/close_channel_test.py @@ -134,5 +134,5 @@ class TestCloseChannel(AioTestBase): if __name__ == '__main__': - logging.basicConfig(level=logging.INFO) + logging.basicConfig(level=logging.DEBUG) unittest.main(verbosity=2) diff --git a/src/python/grpcio_tests/tests_aio/unit/init_test.py b/src/python/grpcio_tests/tests_aio/unit/init_test.py index 9104a0368c5..2582857751d 100644 --- a/src/python/grpcio_tests/tests_aio/unit/init_test.py +++ b/src/python/grpcio_tests/tests_aio/unit/init_test.py @@ -35,7 +35,7 @@ class TestChannel(AioTestBase): channel = aio.insecure_channel(server_target) self.assertIsInstance(channel, aio.Channel) - async def tests_secure_channel(self): + async def test_secure_channel(self): server_target, _ = await start_test_server(secure=True) # pylint: disable=unused-variable credentials = grpc.ssl_channel_credentials( root_certificates=_TEST_ROOT_CERTIFICATES, @@ -48,5 +48,5 @@ class TestChannel(AioTestBase): if __name__ == '__main__': - logging.basicConfig() + logging.basicConfig(level=logging.DEBUG) unittest.main(verbosity=2) diff --git a/src/python/grpcio_tests/tests_aio/unit/server_interceptor_test.py b/src/python/grpcio_tests/tests_aio/unit/server_interceptor_test.py index 0c443389967..dabf005591f 100644 --- a/src/python/grpcio_tests/tests_aio/unit/server_interceptor_test.py +++ b/src/python/grpcio_tests/tests_aio/unit/server_interceptor_test.py @@ -164,5 +164,5 @@ class TestServerInterceptor(AioTestBase): if __name__ == '__main__': - logging.basicConfig() + logging.basicConfig(level=logging.DEBUG) unittest.main(verbosity=2) From cf19300da25f07e4fc99070f53fc51f9bc986b60 Mon Sep 17 00:00:00 2001 From: Ashitha Santhosh Date: Wed, 25 Mar 2020 18:34:57 -0700 Subject: [PATCH 292/758] Corrected method name. --- test/core/tsi/alts/handshaker/alts_tsi_handshaker_test.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/core/tsi/alts/handshaker/alts_tsi_handshaker_test.cc b/test/core/tsi/alts/handshaker/alts_tsi_handshaker_test.cc index 1037313bbec..7a866816c6e 100644 --- a/test/core/tsi/alts/handshaker/alts_tsi_handshaker_test.cc +++ b/test/core/tsi/alts/handshaker/alts_tsi_handshaker_test.cc @@ -291,7 +291,7 @@ static void on_client_next_success_cb(tsi_result status, void* user_data, // frame size is greater than default value, and user specified max frame size // is absent. tsi_zero_copy_grpc_protector* zero_copy_protector = nullptr; - GPR_ASSERT(tsi_handshaker_result_create_zero_copy_frame_protector( + GPR_ASSERT(tsi_handshaker_result_create_zero_copy_grpc_protector( result, nullptr, &zero_copy_protector) == TSI_OK); size_t actual_max_frame_size; tsi_zero_copy_grpc_protector_max_frame_size(zero_copy_protector, @@ -363,7 +363,7 @@ static void on_server_next_success_cb(tsi_result status, void* user_data, tsi_zero_copy_grpc_protector* zero_copy_protector = nullptr; size_t user_specified_max_frame_size = ALTS_TSI_HANDSHAKER_TEST_MAX_FRAME_SIZE; - GPR_ASSERT(tsi_handshaker_result_create_zero_copy_frame_protector( + GPR_ASSERT(tsi_handshaker_result_create_zero_copy_grpc_protector( result, &user_specified_max_frame_size, &zero_copy_protector) == TSI_OK); size_t actual_max_frame_size; From bf3954c8ccc3293740bf6008ca7f88a040ad7a68 Mon Sep 17 00:00:00 2001 From: Kislay Kishore Date: Thu, 26 Mar 2020 09:45:11 +0530 Subject: [PATCH 293/758] Fix typo clinet -> client --- include/grpcpp/impl/codegen/sync_stream_impl.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/grpcpp/impl/codegen/sync_stream_impl.h b/include/grpcpp/impl/codegen/sync_stream_impl.h index 80b0bd73d2a..1a67467ebbc 100644 --- a/include/grpcpp/impl/codegen/sync_stream_impl.h +++ b/include/grpcpp/impl/codegen/sync_stream_impl.h @@ -419,7 +419,7 @@ class ClientReaderWriterInterface : public internal::ClientStreamingInterface, virtual void WaitForInitialMetadata() = 0; /// Half close writing from the client. (signal that the stream of messages - /// coming from the clinet is complete). + /// coming from the client is complete). /// Blocks until currently-pending writes are completed. /// Thread-safe with respect to \a ReaderInterface::Read /// From ab9cb78e4d1d852cb610614026a9d104b329f3e9 Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Wed, 25 Mar 2020 21:14:27 -0700 Subject: [PATCH 294/758] Reviewer comments --- .../filters/client_channel/client_channel.cc | 23 +++++++++---------- .../ext/filters/client_channel/subchannel.h | 14 +++++------ .../dns_resolver_connectivity_test.cc | 5 ++-- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/src/core/ext/filters/client_channel/client_channel.cc b/src/core/ext/filters/client_channel/client_channel.cc index fdd60072df4..343026c8bd8 100644 --- a/src/core/ext/filters/client_channel/client_channel.cc +++ b/src/core/ext/filters/client_channel/client_channel.cc @@ -1022,8 +1022,7 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface { if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) { gpr_log(GPR_INFO, "chand=%p: connectivity change for subchannel wrapper %p " - "subchannel %p; " - "hopping into work_serializer", + "subchannel %p; hopping into work_serializer", parent_->chand_, parent_.get(), parent_->subchannel_); } // Will delete itself. @@ -1066,16 +1065,16 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface { parent_->parent_->chand_, parent_->parent_.get(), parent_->parent_->subchannel_, parent_->watcher_.get()); } - while (true) { - grpc_connectivity_state state; - RefCountedPtr connected_subchannel; - if (!parent_->PopConnectivityStateChange(&state, - &connected_subchannel)) { - break; - } - // Ignore update if the parent WatcherWrapper has been replaced - // since this callback was scheduled. - if (parent_->watcher_ == nullptr) continue; + grpc_connectivity_state state; + RefCountedPtr connected_subchannel; + if (!parent_->PopConnectivityStateChange(&state, + &connected_subchannel)) { + // There should be atleast one connectivity change in the queue. + GPR_DEBUG_ASSERT(false); + } + // Ignore update if the parent WatcherWrapper has been replaced + // since this callback was scheduled. + if (parent_->watcher_ != nullptr) { parent_->last_seen_state_ = state; parent_->parent_->MaybeUpdateConnectedSubchannel( std::move(connected_subchannel)); diff --git a/src/core/ext/filters/client_channel/subchannel.h b/src/core/ext/filters/client_channel/subchannel.h index 87192aa989d..89e9e65ec27 100644 --- a/src/core/ext/filters/client_channel/subchannel.h +++ b/src/core/ext/filters/client_channel/subchannel.h @@ -185,17 +185,17 @@ class Subchannel { // Will be invoked whenever the subchannel's connectivity state // changes. There will be only one invocation of this method on a // given watcher instance at any given time. - // - // When the state changes to READY, connected_subchannel will - // contain a ref to the connected subchannel. When it changes from - // READY to some other state, the implementation must release its - // ref to the connected subchannel. - virtual void OnConnectivityStateChange() // NOLINT - = 0; + // Implementations should call PopConnectivityStateChange to get the next + // connectivity state change. + virtual void OnConnectivityStateChange() = 0; virtual grpc_pollset_set* interested_parties() = 0; // Enqueues connectivity state change notifications. + // When the state changes to READY, connected_subchannel will + // contain a ref to the connected subchannel. When it changes from + // READY to some other state, the implementation must release its + // ref to the connected subchannel. // TODO(yashkt): This is currently needed to send the state updates in the // right order when asynchronously notifying. This will no longer be // necessary when we have access to EventManager. diff --git a/test/core/client_channel/resolvers/dns_resolver_connectivity_test.cc b/test/core/client_channel/resolvers/dns_resolver_connectivity_test.cc index 3502b44043e..97f61f281ce 100644 --- a/test/core/client_channel/resolvers/dns_resolver_connectivity_test.cc +++ b/test/core/client_channel/resolvers/dns_resolver_connectivity_test.cc @@ -66,8 +66,9 @@ static grpc_ares_request* my_dns_lookup_ares_locked( std::unique_ptr* addresses, bool /*check_grpclb*/, char** /*service_config_json*/, int /*query_timeout_ms*/, - std::shared_ptr /* work_serializer */) { /* NOLINT - */ + std::shared_ptr< + grpc_core::WorkSerializer> /* work_serializer */) { /* NOLINT + */ gpr_mu_lock(&g_mu); GPR_ASSERT(0 == strcmp("test", addr)); grpc_error* error = GRPC_ERROR_NONE; From cb5fdce2bfcc6a6afd894b2a4ee10a9530b94f4c Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Thu, 26 Mar 2020 10:35:32 -0700 Subject: [PATCH 295/758] Improve readability and fix wording --- .../grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi | 4 ++-- src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pxd.pxi | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi index 5bd4f90c07b..86fc91e76a4 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/callback_common.pyx.pxi @@ -71,7 +71,7 @@ cdef CallbackFailureHandler CQ_SHUTDOWN_FAILURE_HANDLER = CallbackFailureHandler class ExecuteBatchError(InternalError): - """Raised upon execute batch returns a fail from Core.""" + """Raised when execute batch returns a failure from Core.""" async def execute_batch(GrpcCallWrapper grpc_call_wrapper, @@ -129,7 +129,7 @@ async def _receive_message(GrpcCallWrapper grpc_call_wrapper, # the callback (e.g. cancelled). # # Since they all indicates finish, they are better be merged. - _LOGGER.debug('Failed to received message from Core') + _LOGGER.debug('Failed to receive any message from Core') return receive_op.message() diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pxd.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pxd.pxi index c2c08161248..52f491614f1 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pxd.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pxd.pxi @@ -43,9 +43,9 @@ cdef class RPCState(GrpcCallWrapper): cdef class _ServicerContext: cdef RPCState _rpc_state - cdef object _loop - cdef object _request_deserializer - cdef object _response_serializer + cdef object _loop # asyncio.AbstractEventLoop + cdef object _request_deserializer # Callable[[bytes], Any] + cdef object _response_serializer # Callable[[Any], bytes] cdef class _MessageReceiver: From 3cc7aae8eec96839ed40f66f535bb2988a2eb275 Mon Sep 17 00:00:00 2001 From: Ashitha Santhosh Date: Thu, 26 Mar 2020 10:56:20 -0700 Subject: [PATCH 296/758] Fixed memory leak. --- test/core/tsi/alts/handshaker/alts_tsi_handshaker_test.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/core/tsi/alts/handshaker/alts_tsi_handshaker_test.cc b/test/core/tsi/alts/handshaker/alts_tsi_handshaker_test.cc index 7a866816c6e..8f38640ef67 100644 --- a/test/core/tsi/alts/handshaker/alts_tsi_handshaker_test.cc +++ b/test/core/tsi/alts/handshaker/alts_tsi_handshaker_test.cc @@ -297,6 +297,7 @@ static void on_client_next_success_cb(tsi_result status, void* user_data, tsi_zero_copy_grpc_protector_max_frame_size(zero_copy_protector, &actual_max_frame_size); GPR_ASSERT(actual_max_frame_size == kMaxFrameSize); + tsi_zero_copy_grpc_protector_destroy(zero_copy_protector); /* Validate peer identity. */ tsi_peer peer; GPR_ASSERT(tsi_handshaker_result_extract_peer(result, &peer) == TSI_OK); @@ -370,6 +371,7 @@ static void on_server_next_success_cb(tsi_result status, void* user_data, tsi_zero_copy_grpc_protector_max_frame_size(zero_copy_protector, &actual_max_frame_size); GPR_ASSERT(actual_max_frame_size == kMinFrameSize); + tsi_zero_copy_grpc_protector_destroy(zero_copy_protector); /* Validate peer identity. */ tsi_peer peer; GPR_ASSERT(tsi_handshaker_result_extract_peer(result, &peer) == TSI_OK); From c80fdb09a5387dab7774a254c17b662ab4dfabaa Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Thu, 26 Mar 2020 11:47:17 -0700 Subject: [PATCH 297/758] Reviewer comments --- src/core/ext/filters/client_channel/subchannel.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/ext/filters/client_channel/subchannel.h b/src/core/ext/filters/client_channel/subchannel.h index 89e9e65ec27..16926c4818e 100644 --- a/src/core/ext/filters/client_channel/subchannel.h +++ b/src/core/ext/filters/client_channel/subchannel.h @@ -208,8 +208,8 @@ class Subchannel { } // Dequeues connectivity state change notifications. If the queue is empty, - // it returns false, otherwise returns true and sets \a state to the popped - // state change. + // it returns false, otherwise returns true and sets \a state and \a + // connected_subchannel to the popped state change and connected subchannel. bool PopConnectivityStateChange( grpc_connectivity_state* state, RefCountedPtr* connected_subchannel) { From 652b5a8673a339f87ec4903a7bcd5978ac5c973a Mon Sep 17 00:00:00 2001 From: "Mark D. Roth" Date: Thu, 26 Mar 2020 15:48:38 -0700 Subject: [PATCH 298/758] xds: Add tests showing that we do not use localities with no endpoints. --- test/cpp/end2end/xds_end2end_test.cc | 52 ++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/test/cpp/end2end/xds_end2end_test.cc b/test/cpp/end2end/xds_end2end_test.cc index 622022a0bd0..cdeb8ec5e4c 100644 --- a/test/cpp/end2end/xds_end2end_test.cc +++ b/test/cpp/end2end/xds_end2end_test.cc @@ -2393,6 +2393,40 @@ TEST_P(LocalityMapTest, WeightedRoundRobin) { ::testing::Le(kLocalityWeightRate1 * (1 + kErrorTolerance)))); } +// Tests that we correctly handle a locality containing no endpoints. +TEST_P(LocalityMapTest, LocalityContainingNoEndpoints) { + SetNextResolution({}); + SetNextResolutionForLbChannelAllBalancers(); + const size_t kNumRpcs = 5000; + const int kLocalityWeight0 = 2; + const int kLocalityWeight1 = 8; + const int kTotalLocalityWeight = kLocalityWeight0 + kLocalityWeight1; + const double kLocalityWeightRate0 = + static_cast(kLocalityWeight0) / kTotalLocalityWeight; + const double kLocalityWeightRate1 = + static_cast(kLocalityWeight1) / kTotalLocalityWeight; + // ADS response contains 2 localities, each of which contains 1 backend. + AdsServiceImpl::EdsResourceArgs args({ + {"locality0", GetBackendPorts(), kLocalityWeight0}, + {"locality1", {}, kLocalityWeight1}, + }); + balancers_[0]->ads_service()->SetEdsResource( + AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); + // Wait for both backends to be ready. + WaitForAllBackends(); + // Send kNumRpcs RPCs. + CheckRpcSendOk(kNumRpcs); + // All traffic should go to the reachable locality. + EXPECT_EQ(backends_[0]->backend_service()->request_count(), + kNumRpcs / backends_.size()); + EXPECT_EQ(backends_[1]->backend_service()->request_count(), + kNumRpcs / backends_.size()); + EXPECT_EQ(backends_[2]->backend_service()->request_count(), + kNumRpcs / backends_.size()); + EXPECT_EQ(backends_[3]->backend_service()->request_count(), + kNumRpcs / backends_.size()); +} + // Tests that the locality map can work properly even when it contains a large // number of localities. TEST_P(LocalityMapTest, StressTest) { @@ -2570,6 +2604,24 @@ TEST_P(FailoverTest, ChooseHighestPriority) { } } +// Does not choose priority with no endpoints. +TEST_P(FailoverTest, DoesNotUsePriorityWithNoEndpoints) { + SetNextResolution({}); + SetNextResolutionForLbChannelAllBalancers(); + AdsServiceImpl::EdsResourceArgs args({ + {"locality0", GetBackendPorts(0, 1), kDefaultLocalityWeight, 1}, + {"locality1", GetBackendPorts(1, 2), kDefaultLocalityWeight, 2}, + {"locality2", GetBackendPorts(2, 3), kDefaultLocalityWeight, 3}, + {"locality3", {}, kDefaultLocalityWeight, 0}, + }); + balancers_[0]->ads_service()->SetEdsResource( + AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); + WaitForBackend(0, false); + for (size_t i = 1; i < 3; ++i) { + EXPECT_EQ(0U, backends_[i]->backend_service()->request_count()); + } +} + // If the higher priority localities are not reachable, failover to the highest // priority among the rest. TEST_P(FailoverTest, Failover) { From 423a209f57ec99068e7821abc268be89d7a3fd40 Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Fri, 27 Mar 2020 09:41:45 +0100 Subject: [PATCH 299/758] avoid too long test names on RBE Windows --- test/core/end2end/generate_tests.bzl | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/test/core/end2end/generate_tests.bzl b/test/core/end2end/generate_tests.bzl index 28069573b28..2b73af6f715 100755 --- a/test/core/end2end/generate_tests.bzl +++ b/test/core/end2end/generate_tests.bzl @@ -183,7 +183,8 @@ def _test_options( needs_http2 = False, needs_proxy_auth = False, needs_write_buffering = False, - needs_client_channel = False): + needs_client_channel = False, + short_name = None): return struct( needs_fullstack = needs_fullstack, needs_dns = needs_dns, @@ -196,6 +197,7 @@ def _test_options( needs_proxy_auth = needs_proxy_auth, needs_write_buffering = needs_write_buffering, needs_client_channel = needs_client_channel, + short_name = short_name, ) # maps test names to options @@ -284,12 +286,21 @@ END2END_TESTS = { "retry_exceeds_buffer_size_in_subsequent_batch": _test_options( needs_client_channel = True, proxyable = False, + # TODO(jtattermusch): too long bazel test name makes the test flaky on Windows RBE + # See b/151617965 + short_name = "retry_exceeds_buffer_size_in_subseq", ), "retry_non_retriable_status": _test_options( needs_client_channel = True, proxyable = False, ), - "retry_non_retriable_status_before_recv_trailing_metadata_started": _test_options(needs_client_channel = True, proxyable = False), + "retry_non_retriable_status_before_recv_trailing_metadata_started": _test_options( + needs_client_channel = True, + proxyable = False, + # TODO(jtattermusch): too long bazel test name makes the test flaky on Windows RBE + # See b/151617965 + short_name = "retry_non_retriable_status2", + ), "retry_recv_initial_metadata": _test_options( needs_client_channel = True, proxyable = False, @@ -314,6 +325,9 @@ END2END_TESTS = { "retry_streaming_succeeds_before_replay_finished": _test_options( needs_client_channel = True, proxyable = False, + # TODO(jtattermusch): too long bazel test name makes the test flaky on Windows RBE + # See b/151617965 + short_name = "retry_streaming2", ), "retry_throttled": _test_options( needs_client_channel = True, @@ -429,8 +443,9 @@ def grpc_end2end_tests(): if not _compatible(fopt, topt): continue + test_short_name = str(t) if not topt.short_name else topt.short_name native.sh_test( - name = "%s_test@%s" % (f, t), + name = "%s_test@%s" % (f, test_short_name), data = [":%s_test" % f], srcs = ["end2end_test.sh"], args = [ @@ -443,7 +458,7 @@ def grpc_end2end_tests(): for poller in POLLERS: native.sh_test( - name = "%s_test@%s@poller=%s" % (f, t, poller), + name = "%s_test@%s@poller=%s" % (f, test_short_name, poller), data = [":%s_test" % f], srcs = ["end2end_test.sh"], args = [ @@ -499,8 +514,9 @@ def grpc_end2end_nosec_tests(): if topt.secure: continue + test_short_name = str(t) if not topt.short_name else topt.short_name native.sh_test( - name = "%s_nosec_test@%s" % (f, t), + name = "%s_nosec_test@%s" % (f, test_short_name), data = [":%s_nosec_test" % f], srcs = ["end2end_test.sh"], args = [ @@ -513,7 +529,7 @@ def grpc_end2end_nosec_tests(): for poller in POLLERS: native.sh_test( - name = "%s_nosec_test@%s@poller=%s" % (f, t, poller), + name = "%s_nosec_test@%s@poller=%s" % (f, test_short_name, poller), data = [":%s_nosec_test" % f], srcs = ["end2end_test.sh"], args = [ From b4c6d34347dfc9dd7a2f3de6c92338f62907ad79 Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Fri, 27 Mar 2020 11:08:23 -0400 Subject: [PATCH 300/758] fix ssl_transport_security_test on x86 --- test/core/tsi/ssl_transport_security_test.cc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/test/core/tsi/ssl_transport_security_test.cc b/test/core/tsi/ssl_transport_security_test.cc index 4cd5440006d..3f63df33f9e 100644 --- a/test/core/tsi/ssl_transport_security_test.cc +++ b/test/core/tsi/ssl_transport_security_test.cc @@ -659,10 +659,12 @@ void ssl_tsi_test_do_round_trip_for_all_configs() { void ssl_tsi_test_do_round_trip_odd_buffer_size() { gpr_log(GPR_INFO, "ssl_tsi_test_do_round_trip_odd_buffer_size"); -#ifndef MEMORY_SANITIZER +#if !defined(MEMORY_SANITIZER) && !defined(GPR_ARCH_32) const size_t odd_sizes[] = {1025, 2051, 4103, 8207, 16409}; #else - // avoid test being extremely slow under MSAN + // 1. avoid test being extremely slow under MSAN + // 2. on 32-bit, the test is much slower (probably due to lack of boringssl + // asm optimizations) so we only run a subset of tests to avoid timeout const size_t odd_sizes[] = {1025}; #endif const size_t size = sizeof(odd_sizes) / sizeof(size_t); From fcd8bbd34ce95d855211c27f44a3bd68eef227a5 Mon Sep 17 00:00:00 2001 From: "Mark D. Roth" Date: Fri, 27 Mar 2020 09:07:24 -0700 Subject: [PATCH 301/758] minor cleanups in xds_end2end_test --- test/cpp/end2end/xds_end2end_test.cc | 305 +++++++++++++-------------- 1 file changed, 149 insertions(+), 156 deletions(-) diff --git a/test/cpp/end2end/xds_end2end_test.cc b/test/cpp/end2end/xds_end2end_test.cc index 0b9e55dc2dc..9d0f3900d88 100644 --- a/test/cpp/end2end/xds_end2end_test.cc +++ b/test/cpp/end2end/xds_end2end_test.cc @@ -403,40 +403,6 @@ class AdsServiceImpl : public AggregatedDiscoveryService::Service, using Stream = ServerReaderWriter; - // A queue of resource type/name pairs that have changed since the client - // subscribed to them. - using UpdateQueue = std::deque< - std::pair>; - - // A struct representing a client's subscription to a particular resource. - struct SubscriptionState { - // Version that the client currently knows about. - int current_version = 0; - // The queue upon which to place updates when the resource is updated. - UpdateQueue* update_queue; - }; - - // A struct representing the a client's subscription to all the resources. - using SubscriptionNameMap = - std::map; - using SubscriptionMap = - std::map; - - // A struct representing the current state for a resource: - // - the version of the resource that is set by the SetResource() methods. - // - a list of subscriptions interested in this resource. - struct ResourceState { - int version = 0; - absl::optional resource; - std::set subscriptions; - }; - - // A struct representing the current state for all resources: - // LDS, CDS, EDS, and RDS for the class as a whole. - using ResourceNameMap = - std::map; - using ResourceMap = std::map; - AdsServiceImpl(bool enable_load_reporting) { // Construct RDS response data. default_route_config_.set_name(kDefaultResourceName); @@ -462,118 +428,6 @@ class AdsServiceImpl : public AggregatedDiscoveryService::Service, SetCdsResource(default_cluster_, kDefaultResourceName); } - // Starting a thread to do blocking read on the stream until cancel. - void BlockingRead(Stream* stream, std::deque* requests, - bool* stream_closed) { - DiscoveryRequest request; - bool seen_first_request = false; - while (stream->Read(&request)) { - if (!seen_first_request) { - EXPECT_TRUE(request.has_node()); - ASSERT_FALSE(request.node().client_features().empty()); - EXPECT_EQ(request.node().client_features(0), - "envoy.lb.does_not_support_overprovisioning"); - seen_first_request = true; - } - { - grpc_core::MutexLock lock(&ads_mu_); - requests->emplace_back(std::move(request)); - } - } - gpr_log(GPR_INFO, "ADS[%p]: Null read, stream closed", this); - grpc_core::MutexLock lock(&ads_mu_); - *stream_closed = true; - } - - // Checks whether the client needs to receive a newer version of - // the resource. If so, updates subscription_state->current_version and - // returns true. - bool ClientNeedsResourceUpdate(const ResourceState& resource_state, - SubscriptionState* subscription_state) { - if (subscription_state->current_version < resource_state.version) { - subscription_state->current_version = resource_state.version; - return true; - } - return false; - } - - // Subscribes to a resource if not already subscribed: - // 1. Sets the update_queue field in subscription_state. - // 2. Adds subscription_state to resource_state->subscriptions. - void MaybeSubscribe(const std::string& resource_type, - const std::string& resource_name, - SubscriptionState* subscription_state, - ResourceState* resource_state, - UpdateQueue* update_queue) { - // The update_queue will be null if we were not previously subscribed. - if (subscription_state->update_queue != nullptr) return; - subscription_state->update_queue = update_queue; - resource_state->subscriptions.emplace(subscription_state); - gpr_log(GPR_INFO, "ADS[%p]: subscribe to resource type %s name %s state %p", - this, resource_type.c_str(), resource_name.c_str(), - &subscription_state); - } - - // Removes subscriptions for resources no longer present in the - // current request. - void ProcessUnsubscriptions( - const std::string& resource_type, - const std::set& resources_in_current_request, - SubscriptionNameMap* subscription_name_map, - ResourceNameMap* resource_name_map) { - for (auto it = subscription_name_map->begin(); - it != subscription_name_map->end();) { - const std::string& resource_name = it->first; - SubscriptionState& subscription_state = it->second; - if (resources_in_current_request.find(resource_name) != - resources_in_current_request.end()) { - ++it; - continue; - } - gpr_log(GPR_INFO, "ADS[%p]: Unsubscribe to type=%s name=%s state=%p", - this, resource_type.c_str(), resource_name.c_str(), - &subscription_state); - auto resource_it = resource_name_map->find(resource_name); - GPR_ASSERT(resource_it != resource_name_map->end()); - auto& resource_state = resource_it->second; - resource_state.subscriptions.erase(&subscription_state); - if (resource_state.subscriptions.empty() && - !resource_state.resource.has_value()) { - resource_name_map->erase(resource_it); - } - it = subscription_name_map->erase(it); - } - } - - // Completing the building a DiscoveryResponse by adding common information - // for all resources and by adding all subscribed resources for LDS and CDS. - void CompleteBuildingDiscoveryResponse( - const std::string& resource_type, const int version, - const SubscriptionNameMap& subscription_name_map, - const std::set& resources_added_to_response, - DiscoveryResponse* response) { - resource_type_response_state_[resource_type] = SENT; - response->set_type_url(resource_type); - response->set_version_info(absl::StrCat(version)); - response->set_nonce(absl::StrCat(version)); - if (resource_type == kLdsTypeUrl || resource_type == kCdsTypeUrl) { - // For LDS and CDS we must send back all subscribed resources - // (even the unchanged ones) - for (const auto& p : subscription_name_map) { - const std::string& resource_name = p.first; - if (resources_added_to_response.find(resource_name) == - resources_added_to_response.end()) { - const ResourceState& resource_state = - resource_map_[resource_type][resource_name]; - if (resource_state.resource.has_value()) { - response->add_resources()->CopyFrom( - resource_state.resource.value()); - } - } - } - } - } - Status StreamAggregatedResources(ServerContext* context, Stream* stream) override { gpr_log(GPR_INFO, "ADS[%p]: StreamAggregatedResources starts", this); @@ -932,6 +786,152 @@ class AdsServiceImpl : public AggregatedDiscoveryService::Service, } private: + // A queue of resource type/name pairs that have changed since the client + // subscribed to them. + using UpdateQueue = std::deque< + std::pair>; + + // A struct representing a client's subscription to a particular resource. + struct SubscriptionState { + // Version that the client currently knows about. + int current_version = 0; + // The queue upon which to place updates when the resource is updated. + UpdateQueue* update_queue; + }; + + // A struct representing the a client's subscription to all the resources. + using SubscriptionNameMap = + std::map; + using SubscriptionMap = + std::map; + + // A struct representing the current state for a resource: + // - the version of the resource that is set by the SetResource() methods. + // - a list of subscriptions interested in this resource. + struct ResourceState { + int version = 0; + absl::optional resource; + std::set subscriptions; + }; + + // A struct representing the current state for all resources: + // LDS, CDS, EDS, and RDS for the class as a whole. + using ResourceNameMap = + std::map; + using ResourceMap = std::map; + + // Starting a thread to do blocking read on the stream until cancel. + void BlockingRead(Stream* stream, std::deque* requests, + bool* stream_closed) { + DiscoveryRequest request; + bool seen_first_request = false; + while (stream->Read(&request)) { + if (!seen_first_request) { + EXPECT_TRUE(request.has_node()); + ASSERT_FALSE(request.node().client_features().empty()); + EXPECT_EQ(request.node().client_features(0), + "envoy.lb.does_not_support_overprovisioning"); + seen_first_request = true; + } + { + grpc_core::MutexLock lock(&ads_mu_); + requests->emplace_back(std::move(request)); + } + } + gpr_log(GPR_INFO, "ADS[%p]: Null read, stream closed", this); + grpc_core::MutexLock lock(&ads_mu_); + *stream_closed = true; + } + + // Checks whether the client needs to receive a newer version of + // the resource. If so, updates subscription_state->current_version and + // returns true. + bool ClientNeedsResourceUpdate(const ResourceState& resource_state, + SubscriptionState* subscription_state) { + if (subscription_state->current_version < resource_state.version) { + subscription_state->current_version = resource_state.version; + return true; + } + return false; + } + + // Subscribes to a resource if not already subscribed: + // 1. Sets the update_queue field in subscription_state. + // 2. Adds subscription_state to resource_state->subscriptions. + void MaybeSubscribe(const std::string& resource_type, + const std::string& resource_name, + SubscriptionState* subscription_state, + ResourceState* resource_state, + UpdateQueue* update_queue) { + // The update_queue will be null if we were not previously subscribed. + if (subscription_state->update_queue != nullptr) return; + subscription_state->update_queue = update_queue; + resource_state->subscriptions.emplace(subscription_state); + gpr_log(GPR_INFO, "ADS[%p]: subscribe to resource type %s name %s state %p", + this, resource_type.c_str(), resource_name.c_str(), + &subscription_state); + } + + // Removes subscriptions for resources no longer present in the + // current request. + void ProcessUnsubscriptions( + const std::string& resource_type, + const std::set& resources_in_current_request, + SubscriptionNameMap* subscription_name_map, + ResourceNameMap* resource_name_map) { + for (auto it = subscription_name_map->begin(); + it != subscription_name_map->end();) { + const std::string& resource_name = it->first; + SubscriptionState& subscription_state = it->second; + if (resources_in_current_request.find(resource_name) != + resources_in_current_request.end()) { + ++it; + continue; + } + gpr_log(GPR_INFO, "ADS[%p]: Unsubscribe to type=%s name=%s state=%p", + this, resource_type.c_str(), resource_name.c_str(), + &subscription_state); + auto resource_it = resource_name_map->find(resource_name); + GPR_ASSERT(resource_it != resource_name_map->end()); + auto& resource_state = resource_it->second; + resource_state.subscriptions.erase(&subscription_state); + if (resource_state.subscriptions.empty() && + !resource_state.resource.has_value()) { + resource_name_map->erase(resource_it); + } + it = subscription_name_map->erase(it); + } + } + + // Completing the building a DiscoveryResponse by adding common information + // for all resources and by adding all subscribed resources for LDS and CDS. + void CompleteBuildingDiscoveryResponse( + const std::string& resource_type, const int version, + const SubscriptionNameMap& subscription_name_map, + const std::set& resources_added_to_response, + DiscoveryResponse* response) { + resource_type_response_state_[resource_type] = SENT; + response->set_type_url(resource_type); + response->set_version_info(absl::StrCat(version)); + response->set_nonce(absl::StrCat(version)); + if (resource_type == kLdsTypeUrl || resource_type == kCdsTypeUrl) { + // For LDS and CDS we must send back all subscribed resources + // (even the unchanged ones) + for (const auto& p : subscription_name_map) { + const std::string& resource_name = p.first; + if (resources_added_to_response.find(resource_name) == + resources_added_to_response.end()) { + const ResourceState& resource_state = + resource_map_[resource_type][resource_name]; + if (resource_state.resource.has_value()) { + response->add_resources()->CopyFrom( + resource_state.resource.value()); + } + } + } + } + } + grpc_core::CondVar ads_cond_; // Protect the members below. grpc_core::Mutex ads_mu_; @@ -2424,17 +2424,10 @@ TEST_P(LocalityMapTest, LocalityContainingNoEndpoints) { SetNextResolution({}); SetNextResolutionForLbChannelAllBalancers(); const size_t kNumRpcs = 5000; - const int kLocalityWeight0 = 2; - const int kLocalityWeight1 = 8; - const int kTotalLocalityWeight = kLocalityWeight0 + kLocalityWeight1; - const double kLocalityWeightRate0 = - static_cast(kLocalityWeight0) / kTotalLocalityWeight; - const double kLocalityWeightRate1 = - static_cast(kLocalityWeight1) / kTotalLocalityWeight; - // ADS response contains 2 localities, each of which contains 1 backend. + // EDS response contains 2 localities, one with no endpoints. AdsServiceImpl::EdsResourceArgs args({ - {"locality0", GetBackendPorts(), kLocalityWeight0}, - {"locality1", {}, kLocalityWeight1}, + {"locality0", GetBackendPorts()}, + {"locality1", {}}, }); balancers_[0]->ads_service()->SetEdsResource( AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); From a83409bd8708025bad0ab39e14bdac510932e542 Mon Sep 17 00:00:00 2001 From: Eric Gribkoff Date: Fri, 27 Mar 2020 09:52:55 -0700 Subject: [PATCH 302/758] Reduce resource requirements for some test runs Adds --instance_group_size parameter and skips creating IGs in the secondary zone is not used by any of the specified test cases. --- tools/run_tests/run_xds_tests.py | 45 +++++++++++++++++++++++--------- 1 file changed, 32 insertions(+), 13 deletions(-) diff --git a/tools/run_tests/run_xds_tests.py b/tools/run_tests/run_xds_tests.py index 1deac8db5a5..f3ee2fbf06c 100755 --- a/tools/run_tests/run_xds_tests.py +++ b/tools/run_tests/run_xds_tests.py @@ -143,6 +143,15 @@ argp.add_argument('--source_image', argp.add_argument('--machine_type', default='e2-standard-2', help='Machine type for VMs created during the test') +argp.add_argument( + '--instance_group_size', + default=2, + type=int, + help= + 'Number of VMs to create per instance group. Certain test cases (e.g., ' + 'round_robin) may not give meaningful results if this is set to a value ' + 'less than 2.' +) argp.add_argument( '--tolerate_gcp_errors', default=False, @@ -163,7 +172,7 @@ if args.verbose: _DEFAULT_SERVICE_PORT = 80 _WAIT_FOR_BACKEND_SEC = args.wait_for_backend_sec _WAIT_FOR_OPERATION_SEC = 300 -_INSTANCE_GROUP_SIZE = 2 +_INSTANCE_GROUP_SIZE = args.instance_group_size _NUM_TEST_RPCS = 10 * args.qps _WAIT_FOR_STATS_SEC = 180 _WAIT_FOR_URL_MAP_PATCH_SEC = 300 @@ -188,6 +197,12 @@ _BOOTSTRAP_TEMPLATE = """ ] }}] }}""" % (args.network.split('/')[-1], args.zone, args.xds_server) +_TESTS_USING_SECONDARY_IG = [ + 'secondary_locality_gets_no_requests_on_partial_primary_failure', + 'secondary_locality_gets_requests_on_primary_failure' +] +_USE_SECONDARY_IG = any( + [t in args.test_cases for t in _TESTS_USING_SECONDARY_IG]) _PATH_MATCHER_NAME = 'path-matcher' _BASE_TEMPLATE_NAME = 'test-template' _BASE_INSTANCE_GROUP_NAME = 'test-ig' @@ -937,7 +952,8 @@ try: template_name = _BASE_TARGET_PROXY_NAME + args.gcp_suffix instance_group_name = _BASE_INSTANCE_GROUP_NAME + args.gcp_suffix same_zone_instance_group_name = _BASE_INSTANCE_GROUP_NAME + '-same-zone' + args.gcp_suffix - secondary_zone_instance_group_name = _BASE_INSTANCE_GROUP_NAME + '-secondary-zone' + args.gcp_suffix + if _USE_SECONDARY_IG: + secondary_zone_instance_group_name = _BASE_INSTANCE_GROUP_NAME + '-secondary-zone' + args.gcp_suffix try: create_health_check(gcp, health_check_name) create_health_check_firewall_rule(gcp, firewall_name) @@ -977,9 +993,10 @@ try: patch_backend_instances(gcp, backend_service, [instance_group]) same_zone_instance_group = add_instance_group( gcp, args.zone, same_zone_instance_group_name, _INSTANCE_GROUP_SIZE) - secondary_zone_instance_group = add_instance_group( - gcp, args.secondary_zone, secondary_zone_instance_group_name, - _INSTANCE_GROUP_SIZE) + if _USE_SECONDARY_IG: + secondary_zone_instance_group = add_instance_group( + gcp, args.secondary_zone, secondary_zone_instance_group_name, + _INSTANCE_GROUP_SIZE) except googleapiclient.errors.HttpError as http_error: if args.tolerate_gcp_errors: logger.warning( @@ -1020,14 +1037,16 @@ try: same_zone_instance_group_name, result['selfLink'], args.zone) gcp.instance_groups.append(same_zone_instance_group) - result = compute.instanceGroups().get( - project=args.project_id, - zone=args.secondary_zone, - instanceGroup=secondary_zone_instance_group_name).execute() - secondary_zone_instance_group = InstanceGroup( - secondary_zone_instance_group_name, result['selfLink'], - args.secondary_zone) - gcp.instance_groups.append(secondary_zone_instance_group) + if _USE_SECONDARY_IG: + result = compute.instanceGroups().get( + project=args.project_id, + zone=args.secondary_zone, + instanceGroup=secondary_zone_instance_group_name + ).execute() + secondary_zone_instance_group = InstanceGroup( + secondary_zone_instance_group_name, result['selfLink'], + args.secondary_zone) + gcp.instance_groups.append(secondary_zone_instance_group) if not gcp.health_check: result = compute.healthChecks().get( project=args.project_id, From bf85f6c88debd2dea12ece463c36bfd69cc6393a Mon Sep 17 00:00:00 2001 From: Eric Gribkoff Date: Fri, 27 Mar 2020 10:13:03 -0700 Subject: [PATCH 303/758] typo --- tools/run_tests/run_xds_tests.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/run_tests/run_xds_tests.py b/tools/run_tests/run_xds_tests.py index f3ee2fbf06c..196f37db21a 100755 --- a/tools/run_tests/run_xds_tests.py +++ b/tools/run_tests/run_xds_tests.py @@ -202,7 +202,7 @@ _TESTS_USING_SECONDARY_IG = [ 'secondary_locality_gets_requests_on_primary_failure' ] _USE_SECONDARY_IG = any( - [t in args.test_cases for t in _TESTS_USING_SECONDARY_IG]) + [t in args.test_case for t in _TESTS_USING_SECONDARY_IG]) _PATH_MATCHER_NAME = 'path-matcher' _BASE_TEMPLATE_NAME = 'test-template' _BASE_INSTANCE_GROUP_NAME = 'test-ig' From 32a33ae2b15a98f83367e441c0ad384bda1541ce Mon Sep 17 00:00:00 2001 From: Vijay Pai Date: Wed, 25 Mar 2020 19:05:14 -0700 Subject: [PATCH 304/758] Properly set thread-local variable indicating nonblocking test --- test/cpp/end2end/nonblocking_test.cc | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/test/cpp/end2end/nonblocking_test.cc b/test/cpp/end2end/nonblocking_test.cc index eb651df21df..4be070ec717 100644 --- a/test/cpp/end2end/nonblocking_test.cc +++ b/test/cpp/end2end/nonblocking_test.cc @@ -39,14 +39,18 @@ #ifdef GRPC_POSIX_SOCKET // Thread-local variable to so that only polls from this test assert -// non-blocking (not polls from resolver, timer thread, etc) -GPR_TLS_DECL(g_is_nonblocking_test); +// non-blocking (not polls from resolver, timer thread, etc), and only when the +// thread is waiting on polls caused by CompletionQueue::AsyncNext (not for +// picking a port or other reasons). +GPR_TLS_DECL(g_is_nonblocking_poll); namespace { int maybe_assert_non_blocking_poll(struct pollfd* pfds, nfds_t nfds, int timeout) { - if (gpr_tls_get(&g_is_nonblocking_test)) { + // Only assert that this poll should have zero timeout if we're in the + // middle of a zero-timeout CQ Next. + if (gpr_tls_get(&g_is_nonblocking_poll)) { GPR_ASSERT(timeout == 0); } return poll(pfds, nfds, timeout); @@ -74,11 +78,17 @@ class NonblockingTest : public ::testing::Test { } bool LoopForTag(void** tag, bool* ok) { + // Temporarily set the thread-local nonblocking poll flag so that the polls + // caused by this loop are indeed sent by the library with zero timeout. + intptr_t orig_val = gpr_tls_get(&g_is_nonblocking_poll); + gpr_tls_set(&g_is_nonblocking_poll, static_cast(true)); for (;;) { auto r = cq_->AsyncNext(tag, ok, gpr_time_0(GPR_CLOCK_REALTIME)); if (r == CompletionQueue::SHUTDOWN) { + gpr_tls_set(&g_is_nonblocking_poll, orig_val); return false; } else if (r == CompletionQueue::GOT_EVENT) { + gpr_tls_set(&g_is_nonblocking_poll, orig_val); return true; } } @@ -185,10 +195,20 @@ int main(int argc, char** argv) { #ifdef GRPC_POSIX_SOCKET // Override the poll function before anything else can happen grpc_poll_function = maybe_assert_non_blocking_poll; -#endif // GRPC_POSIX_SOCKET grpc::testing::TestEnvironment env(argc, argv); ::testing::InitGoogleTest(&argc, argv); + gpr_tls_init(&g_is_nonblocking_poll); + + // Start the nonblocking poll thread-local variable as false because the + // thread that issues RPCs starts by picking a port (which has non-zero + // timeout). + gpr_tls_set(&g_is_nonblocking_poll, static_cast(false)); + int ret = RUN_ALL_TESTS(); + gpr_tls_destroy(&g_is_nonblocking_poll); return ret; +#else // GRPC_POSIX_SOCKET + return 0; +#endif // GRPC_POSIX_SOCKET } From 0e1c63a7a10cad64e097ae1462d78c8130dafc0a Mon Sep 17 00:00:00 2001 From: "Mark D. Roth" Date: Fri, 27 Mar 2020 15:04:02 -0700 Subject: [PATCH 305/758] xds: don't report TRANSIENT_FAILURE when we're told to drop all --- .../filters/client_channel/client_channel.cc | 6 ++++-- .../client_channel/lb_policy/xds/xds.cc | 21 ++++++++++++++++++- .../ext/filters/client_channel/xds/xds_api.cc | 9 ++++---- .../ext/filters/client_channel/xds/xds_api.h | 5 ++++- .../filters/client_channel/xds/xds_client.cc | 2 +- test/cpp/end2end/xds_end2end_test.cc | 8 +++---- 6 files changed, 36 insertions(+), 15 deletions(-) diff --git a/src/core/ext/filters/client_channel/client_channel.cc b/src/core/ext/filters/client_channel/client_channel.cc index a48a8a01d70..0a5759b6012 100644 --- a/src/core/ext/filters/client_channel/client_channel.cc +++ b/src/core/ext/filters/client_channel/client_channel.cc @@ -3975,8 +3975,10 @@ bool CallData::PickSubchannelLocked(grpc_call_element* elem, if (pick_queued_) RemoveCallFromQueuedPicksLocked(elem); // Handle drops. if (GPR_UNLIKELY(result.subchannel == nullptr)) { - result.error = GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "Call dropped by load balancing policy"); + result.error = grpc_error_set_int( + GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "Call dropped by load balancing policy"), + GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE); } else { // Grab a ref to the connected subchannel while we're still // holding the data plane mutex. diff --git a/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc b/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc index eeef5fb66c3..9196bf628ca 100644 --- a/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc +++ b/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc @@ -496,6 +496,16 @@ XdsLb::PickResult XdsLb::LocalityPicker::Pick(PickArgs args) { result.type = PickResult::PICK_COMPLETE; return result; } + // If we didn't drop, we better have some localities to pick from. + if (pickers_.empty()) { // Should never happen. + PickResult result; + result.type = PickResult::PICK_FAILED; + result.error = + grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "xds picker not given any localities"), + GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_INTERNAL); + return result; + } // Generate a random number in [0, total weight). const uint32_t key = rand() % pickers_[pickers_.size() - 1].first; // Forward pick to whichever locality maps to the range in which the @@ -570,7 +580,7 @@ class XdsLb::EndpointWatcher : public XdsClient::EndpointWatcherInterface { } // If the balancer tells us to drop all the calls, we should exit fallback // mode immediately. - if (update.drop_all) xds_policy_->MaybeExitFallbackMode(); + if (update.drop_config->drop_all()) xds_policy_->MaybeExitFallbackMode(); // Update the drop config. const bool drop_config_changed = xds_policy_->drop_config_ == nullptr || @@ -919,6 +929,15 @@ void XdsLb::UpdatePrioritiesLocked(bool update_locality_stats) { void XdsLb::UpdateXdsPickerLocked() { // If we are in fallback mode, don't generate an xds picker from localities. if (fallback_policy_ != nullptr) return; + // If we're dropping all calls, report READY, even though we won't + // have a selected priority. + if (drop_config_ != nullptr && drop_config_->drop_all()) { + channel_control_helper()->UpdateState( + GRPC_CHANNEL_READY, + absl::make_unique(this, LocalityPicker::PickerList{})); + return; + } + // If we don't have a selected priority, report TRANSIENT_FAILURE. if (current_priority_ == UINT32_MAX) { if (fallback_policy_ == nullptr) { grpc_error* error = grpc_error_set_int( diff --git a/src/core/ext/filters/client_channel/xds/xds_api.cc b/src/core/ext/filters/client_channel/xds/xds_api.cc index 5a41d0af32a..2ac824ba08e 100644 --- a/src/core/ext/filters/client_channel/xds/xds_api.cc +++ b/src/core/ext/filters/client_channel/xds/xds_api.cc @@ -1310,7 +1310,7 @@ grpc_error* LocalityParse( grpc_error* DropParseAndAppend( const envoy_api_v2_ClusterLoadAssignment_Policy_DropOverload* drop_overload, - XdsApi::DropConfig* drop_config, bool* drop_all) { + XdsApi::DropConfig* drop_config) { // Get the category. upb_strview category = envoy_api_v2_ClusterLoadAssignment_Policy_DropOverload_category( @@ -1341,7 +1341,6 @@ grpc_error* DropParseAndAppend( } // Cap numerator to 1000000. numerator = GPR_MIN(numerator, 1000000); - if (numerator == 1000000) *drop_all = true; drop_config->AddCategory(std::string(category.data, category.size), numerator); return GRPC_ERROR_NONE; @@ -1417,13 +1416,13 @@ grpc_error* EdsResponseParse( policy, &drop_size); for (size_t j = 0; j < drop_size; ++j) { grpc_error* error = - DropParseAndAppend(drop_overload[j], eds_update.drop_config.get(), - &eds_update.drop_all); + DropParseAndAppend(drop_overload[j], eds_update.drop_config.get()); if (error != GRPC_ERROR_NONE) return error; } } // Validate the update content. - if (eds_update.priority_list_update.empty() && !eds_update.drop_all) { + if (eds_update.priority_list_update.empty() && + !eds_update.drop_config->drop_all()) { return GRPC_ERROR_CREATE_FROM_STATIC_STRING( "EDS response doesn't contain any valid " "locality but doesn't require to drop all calls."); diff --git a/src/core/ext/filters/client_channel/xds/xds_api.h b/src/core/ext/filters/client_channel/xds/xds_api.h index ee45f85dbaf..0fc4a186542 100644 --- a/src/core/ext/filters/client_channel/xds/xds_api.h +++ b/src/core/ext/filters/client_channel/xds/xds_api.h @@ -164,6 +164,7 @@ class XdsApi { void AddCategory(std::string name, uint32_t parts_per_million) { drop_category_list_.emplace_back( DropCategory{std::move(name), parts_per_million}); + if (parts_per_million == 1000000) drop_all_ = true; } // The only method invoked from the data plane combiner. @@ -173,6 +174,8 @@ class XdsApi { return drop_category_list_; } + bool drop_all() const { return drop_all_; } + bool operator==(const DropConfig& other) const { return drop_category_list_ == other.drop_category_list_; } @@ -180,12 +183,12 @@ class XdsApi { private: DropCategoryList drop_category_list_; + bool drop_all_ = false; }; struct EdsUpdate { PriorityListUpdate priority_list_update; RefCountedPtr drop_config; - bool drop_all = false; }; using EdsUpdateMap = std::map; diff --git a/src/core/ext/filters/client_channel/xds/xds_client.cc b/src/core/ext/filters/client_channel/xds/xds_client.cc index 9bd8231c584..37b300a27f9 100644 --- a/src/core/ext/filters/client_channel/xds/xds_client.cc +++ b/src/core/ext/filters/client_channel/xds/xds_client.cc @@ -1074,7 +1074,7 @@ void XdsClient::ChannelState::AdsCallState::AcceptEdsUpdate( " drop categories received (drop_all=%d)", xds_client(), eds_update.priority_list_update.size(), eds_update.drop_config->drop_category_list().size(), - eds_update.drop_all); + eds_update.drop_config->drop_all()); for (size_t priority = 0; priority < eds_update.priority_list_update.size(); ++priority) { const auto* locality_map_update = eds_update.priority_list_update.Find( diff --git a/test/cpp/end2end/xds_end2end_test.cc b/test/cpp/end2end/xds_end2end_test.cc index 9d0f3900d88..b168a8badd0 100644 --- a/test/cpp/end2end/xds_end2end_test.cc +++ b/test/cpp/end2end/xds_end2end_test.cc @@ -3024,9 +3024,7 @@ TEST_P(DropTest, DropAll) { const uint32_t kDropPerMillionForLb = 100000; const uint32_t kDropPerMillionForThrottle = 1000000; // The ADS response contains two drop categories. - AdsServiceImpl::EdsResourceArgs args({ - {"locality0", GetBackendPorts()}, - }); + AdsServiceImpl::EdsResourceArgs args; args.drop_categories = {{kLbDropType, kDropPerMillionForLb}, {kThrottleDropType, kDropPerMillionForThrottle}}; balancers_[0]->ads_service()->SetEdsResource( @@ -3035,8 +3033,8 @@ TEST_P(DropTest, DropAll) { for (size_t i = 0; i < kNumRpcs; ++i) { EchoResponse response; const Status status = SendRpc(&response); - EXPECT_TRUE(!status.ok() && status.error_message() == - "Call dropped by load balancing policy"); + EXPECT_EQ(status.error_code(), StatusCode::UNAVAILABLE); + EXPECT_EQ(status.error_message(), "Call dropped by load balancing policy"); } } From 3cff1570b53c75e4877a9d60f224c8ccc8d62807 Mon Sep 17 00:00:00 2001 From: Eric Gribkoff Date: Fri, 27 Mar 2020 15:55:32 -0700 Subject: [PATCH 306/758] yapf --- tools/run_tests/run_xds_tests.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/tools/run_tests/run_xds_tests.py b/tools/run_tests/run_xds_tests.py index 196f37db21a..80fd88fbaac 100755 --- a/tools/run_tests/run_xds_tests.py +++ b/tools/run_tests/run_xds_tests.py @@ -147,11 +147,9 @@ argp.add_argument( '--instance_group_size', default=2, type=int, - help= - 'Number of VMs to create per instance group. Certain test cases (e.g., ' + help='Number of VMs to create per instance group. Certain test cases (e.g., ' 'round_robin) may not give meaningful results if this is set to a value ' - 'less than 2.' -) + 'less than 2.') argp.add_argument( '--tolerate_gcp_errors', default=False, From fb90989c7b7997c90b18a49b22c27239d441b65d Mon Sep 17 00:00:00 2001 From: Eric Gribkoff Date: Fri, 27 Mar 2020 16:00:34 -0700 Subject: [PATCH 307/758] fix format, exit(1) if any failures --- tools/run_tests/run_xds_tests.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tools/run_tests/run_xds_tests.py b/tools/run_tests/run_xds_tests.py index 6e5b454e447..61bd8889156 100755 --- a/tools/run_tests/run_xds_tests.py +++ b/tools/run_tests/run_xds_tests.py @@ -1063,6 +1063,7 @@ try: qps=args.qps)) test_results = {} + failed_tests = [] for test_case in args.test_case: result = jobset.JobResult() log_dir = os.path.join(_TEST_LOG_BASE_DIR, test_case) @@ -1107,7 +1108,8 @@ try: result.state = 'PASSED' result.returncode = 0 except Exception as e: - logger.error('Test case %s failed: %s' % (test_case, e)) + logger.error('Test case %s failed: %s', test_case, e) + failed_tests.append(test_case) result.state = 'FAILED' result.message = str(e) finally: @@ -1124,6 +1126,9 @@ try: _SPONGE_XML_NAME), suite_name='xds_tests', multi_target=True) + if failed_tests: + logger.error('Test case(s) %s failed', failed_tests) + sys.exit(1) finally: if not args.keep_gcp_resources: logger.info('Cleaning up GCP resources. This may take some time.') From 2c0a9c1ca8e8fc7d5ccf0069494449bd530b3313 Mon Sep 17 00:00:00 2001 From: Eric Gribkoff Date: Fri, 27 Mar 2020 18:26:12 -0700 Subject: [PATCH 308/758] fix duplicate logs --- tools/run_tests/run_xds_tests.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tools/run_tests/run_xds_tests.py b/tools/run_tests/run_xds_tests.py index 61bd8889156..041fcb4930e 100755 --- a/tools/run_tests/run_xds_tests.py +++ b/tools/run_tests/run_xds_tests.py @@ -39,7 +39,9 @@ logger = logging.getLogger() console_handler = logging.StreamHandler() formatter = logging.Formatter(fmt='%(asctime)s: %(levelname)-8s %(message)s') console_handler.setFormatter(formatter) +logger.handlers = [] logger.addHandler(console_handler) +logger.setLevel(logging.WARNING) _TEST_CASES = [ 'backends_restart', From db07f7963e0063e4484c8af245d5506fa4a2dea6 Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Sun, 29 Mar 2020 15:25:33 +0200 Subject: [PATCH 309/758] speedup ssl_transport_security_test also on Mac --- test/core/tsi/ssl_transport_security_test.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/core/tsi/ssl_transport_security_test.cc b/test/core/tsi/ssl_transport_security_test.cc index 3f63df33f9e..70b8355bc79 100644 --- a/test/core/tsi/ssl_transport_security_test.cc +++ b/test/core/tsi/ssl_transport_security_test.cc @@ -659,12 +659,14 @@ void ssl_tsi_test_do_round_trip_for_all_configs() { void ssl_tsi_test_do_round_trip_odd_buffer_size() { gpr_log(GPR_INFO, "ssl_tsi_test_do_round_trip_odd_buffer_size"); -#if !defined(MEMORY_SANITIZER) && !defined(GPR_ARCH_32) +#if !defined(MEMORY_SANITIZER) && !defined(GPR_ARCH_32) && !defined(__APPLE__) const size_t odd_sizes[] = {1025, 2051, 4103, 8207, 16409}; #else // 1. avoid test being extremely slow under MSAN // 2. on 32-bit, the test is much slower (probably due to lack of boringssl // asm optimizations) so we only run a subset of tests to avoid timeout + // 3. on Mac OS, we have slower testing machines so we only run a subset + // of tests to avoid timeout const size_t odd_sizes[] = {1025}; #endif const size_t size = sizeof(odd_sizes) / sizeof(size_t); From 6ad89b6369d76939c46316d96a33af1663f8a875 Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Sun, 29 Mar 2020 11:01:21 -0400 Subject: [PATCH 310/758] also upload className in upload_rbe_results.py --- tools/run_tests/python_utils/upload_rbe_results.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tools/run_tests/python_utils/upload_rbe_results.py b/tools/run_tests/python_utils/upload_rbe_results.py index f5bf3ccc098..8aedd72afbf 100755 --- a/tools/run_tests/python_utils/upload_rbe_results.py +++ b/tools/run_tests/python_utils/upload_rbe_results.py @@ -37,6 +37,7 @@ _RESULTS_SCHEMA = [ ('build_id', 'INTEGER', 'Build ID of Kokoro job'), ('build_url', 'STRING', 'URL of Kokoro build'), ('test_target', 'STRING', 'Bazel target path'), + ('test_class_name', 'STRING', 'Name of test class'), ('test_case', 'STRING', 'Name of test case'), ('result', 'STRING', 'Test or build result'), ('timestamp', 'TIMESTAMP', 'Timestamp of test run'), @@ -241,6 +242,8 @@ if __name__ == "__main__": % invocation_id, 'test_target': action['id']['targetId'], + 'test_class_name': + test_case['testCase'].get('className', ''), 'test_case': test_case['testCase']['caseName'], 'result': @@ -266,6 +269,8 @@ if __name__ == "__main__": % invocation_id, 'test_target': action['id']['targetId'], + 'test_class_name': + 'N/A', 'test_case': 'N/A', 'result': From a7995e4c4dab5b467767e695f1ce3dfbd4bd70ac Mon Sep 17 00:00:00 2001 From: Muxi Yan Date: Mon, 30 Mar 2020 14:00:21 -0700 Subject: [PATCH 311/758] Use a more compressable client message --- examples/cpp/compression/greeter_client.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/cpp/compression/greeter_client.cc b/examples/cpp/compression/greeter_client.cc index a8428174644..99e2a5973fc 100644 --- a/examples/cpp/compression/greeter_client.cc +++ b/examples/cpp/compression/greeter_client.cc @@ -85,7 +85,7 @@ int main(int argc, char** argv) { args.SetCompressionAlgorithm(GRPC_COMPRESS_GZIP); GreeterClient greeter(grpc::CreateCustomChannel( "localhost:50051", grpc::InsecureChannelCredentials(), args)); - std::string user("world"); + std::string user("world world world world"); std::string reply = greeter.SayHello(user); std::cout << "Greeter received: " << reply << std::endl; From f487d1be61d833a8a8c62b5886ad258dd5794800 Mon Sep 17 00:00:00 2001 From: Donna Dionne Date: Mon, 30 Mar 2020 23:31:54 -0700 Subject: [PATCH 312/758] Addressing code review comments. --- .../lb_policy/xds/xds_routing.cc | 303 ++++++++++-------- .../ext/filters/client_channel/xds/xds_api.cc | 34 +- .../ext/filters/client_channel/xds/xds_api.h | 3 +- .../filters/client_channel/xds/xds_client.cc | 181 +++++------ .../filters/client_channel/xds/xds_client.h | 8 - .../grpc_unsecure_plugin_registry.cc | 4 + test/cpp/end2end/xds_end2end_test.cc | 23 +- 7 files changed, 273 insertions(+), 283 deletions(-) diff --git a/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc b/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc index 2f409d6746b..f23db70bdb4 100644 --- a/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc +++ b/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc @@ -22,6 +22,7 @@ #include "absl/strings/str_cat.h" #include "absl/strings/str_split.h" +#include "absl/strings/string_view.h" #include @@ -52,24 +53,26 @@ class XdsRoutingLbConfig : public LoadBalancingPolicy::Config { struct ChildConfig { RefCountedPtr config; }; - - using Matcher = std::pair; - using RouteVector = std::vector>; + struct Matcher { + std::string service; + std::string method; + }; + using RouteTable = std::vector>; using ActionMap = std::map; - explicit XdsRoutingLbConfig(ActionMap action_map, RouteVector route_vector) + XdsRoutingLbConfig(ActionMap action_map, RouteTable route_table) : action_map_(std::move(action_map)), - route_vector_(std::move(route_vector)) {} + route_table_(std::move(route_table)) {} const char* name() const override { return kXdsRouting; } const ActionMap& action_map() const { return action_map_; } - const RouteVector& route_vector() const { return route_vector_; } + const RouteTable& route_table() const { return route_table_; } private: ActionMap action_map_; - RouteVector route_vector_; + RouteTable route_table_; }; // xds_routing LB policy. @@ -87,39 +90,37 @@ class XdsRoutingLb : public LoadBalancingPolicy { // A simple wrapper for ref-counting a picker from the child policy. class ChildPickerWrapper : public RefCounted { public: - explicit ChildPickerWrapper(const std::string& name, - std::unique_ptr picker) - : name_(name), picker_(std::move(picker)) {} + ChildPickerWrapper(std::string name, + std::unique_ptr picker) + : name_(std::move(name)), picker_(std::move(picker)) {} PickResult Pick(PickArgs args) { return picker_->Pick(std::move(args)); } - std::string name() { return name_; } + const std::string& name() { return name_; } private: std::string name_; std::unique_ptr picker_; }; - // Picks a child using stateless WRR and then delegates to that + // Picks a child using prefix or path matching and then delegates to that // child's picker. - class XdsRoutingPicker : public SubchannelPicker { + class RoutePicker : public SubchannelPicker { public: - // Maintains a xds_routing list of pickers from each child that is in - // ready state. The first element in the pair represents the end of a - // range proportional to the child's weight. The start of the range - // is the previous value in the vector and is 0 for the first element. - using PickerList = InlinedVector, 1>; + struct Route { + XdsRoutingLbConfig::Matcher matcher; + RefCountedPtr picker; + }; - using PickerMap = std::map>; + // Maintains an ordered xds route table as provided by RDS response. + using RouteTable = std::vector; - XdsRoutingPicker(RefCountedPtr parent, PickerMap pickers) - : parent_(std::move(parent)), pickers_(std::move(pickers)) {} - ~XdsRoutingPicker() { parent_.reset(DEBUG_LOCATION, "XdsRoutingPicker"); } + RoutePicker(RouteTable route_table) + : route_table_(std::move(route_table)) {} PickResult Pick(PickArgs args) override; private: - RefCountedPtr parent_; - PickerMap pickers_; + RouteTable route_table_; }; // Each XdsRoutingChild holds a ref to its parent XdsRoutingLb. @@ -145,8 +146,6 @@ class XdsRoutingLb : public LoadBalancingPolicy { return picker_wrapper_; } - std::string name() const { return name_; } - private: class Helper : public ChannelControlHelper { public: @@ -211,35 +210,29 @@ class XdsRoutingLb : public LoadBalancingPolicy { }; // -// XdsRoutingLb::XdsRoutingPicker +// XdsRoutingLb::RoutePicker // -XdsRoutingLb::PickResult XdsRoutingLb::XdsRoutingPicker::Pick(PickArgs args) { - std::string path; +XdsRoutingLb::PickResult XdsRoutingLb::RoutePicker::Pick(PickArgs args) { + absl::string_view path; for (const auto& p : *(args.initial_metadata)) { - if (memcmp(p.first.data(), ":path", static_cast(p.first.size())) == - 0) { - path = std::string(p.second.data(), static_cast(p.second.size())); + if (p.first == ":path") { + path = p.second; break; } } - std::vector v = absl::StrSplit(path, '/'); - GPR_DEBUG_ASSERT(v.size() == 3); - std::string service = v[1]; - std::string method = v[2]; - for (int i = 0; i < parent_->config_->route_vector().size(); ++i) { - if (service == parent_->config_->route_vector()[i].first.first && - ("" == parent_->config_->route_vector()[i].first.second || - method == parent_->config_->route_vector()[i].first.second)) { - auto picker = pickers_.find(parent_->config_->route_vector()[i].second); - if (picker != pickers_.end()) { - gpr_log(GPR_INFO, "XdsRouting Picked: %s for path %s", - picker->first.c_str(), path.c_str()); - return picker->second.get()->Pick(args); + std::vector v = absl::StrSplit(path.substr(1), '/'); + for (int i = 0; i < route_table_.size(); ++i) { + if (v[0] == route_table_[i].matcher.service && + ("" == route_table_[i].matcher.method || + v[1] == route_table_[i].matcher.method)) { + auto picker = route_table_[i].picker; + if (picker != nullptr) { + return picker.get()->Pick(args); } } } - return pickers_.begin()->second.get()->Pick(args); + return route_table_[route_table_.size() - 1].picker.get()->Pick(args); } // @@ -313,11 +306,7 @@ void XdsRoutingLb::UpdateLocked(UpdateArgs args) { } void XdsRoutingLb::UpdateStateLocked() { - // Construct a new picker which maintains a map of all child pickers - // that are ready. Each child is represented by a portion of the range - // proportional to its weight, such that the total range is the sum of the - // weights of all children. - XdsRoutingPicker::PickerMap picker_map; + std::map> picker_map; // Also count the number of children in each state, to determine the // overall state. size_t num_connecting = 0; @@ -367,10 +356,19 @@ void XdsRoutingLb::UpdateStateLocked() { ConnectivityStateName(connectivity_state)); } std::unique_ptr picker; + RoutePicker::RouteTable route_table; switch (connectivity_state) { case GRPC_CHANNEL_READY: - picker = absl::make_unique( - Ref(DEBUG_LOCATION, "XdsRoutingPicker"), std::move(picker_map)); + for (int i = 0; i < config_->route_table().size(); ++i) { + RoutePicker::Route route; + route.matcher = config_->route_table()[i].first; + auto child_picker = picker_map.find(config_->route_table()[i].second); + if (child_picker != picker_map.end()) { + route.picker = child_picker->second; + } + route_table.push_back(std::move(route)); + } + picker = absl::make_unique(std::move(route_table)); break; case GRPC_CHANNEL_CONNECTING: case GRPC_CHANNEL_IDLE: @@ -460,6 +458,7 @@ void XdsRoutingLb::XdsRoutingChild::UpdateLocked( // Update child weight. // Reactivate if needed. if (delayed_removal_timer_callback_pending_) { + delayed_removal_timer_callback_pending_ = false; grpc_timer_cancel(&delayed_removal_timer_); } // Create child policy if needed. @@ -530,7 +529,6 @@ void XdsRoutingLb::XdsRoutingChild::OnDelayedRemovalTimerLocked( RefCountedPtr XdsRoutingLb::XdsRoutingChild::Helper::CreateSubchannel( const grpc_channel_args& args) { - gpr_log(GPR_INFO, "XdsRoutingChild::Helper::CreateSubchannel"); if (xds_routing_child_->xds_routing_policy_->shutting_down_) return nullptr; return xds_routing_child_->xds_routing_policy_->channel_control_helper() ->CreateSubchannel(args); @@ -538,12 +536,15 @@ XdsRoutingLb::XdsRoutingChild::Helper::CreateSubchannel( void XdsRoutingLb::XdsRoutingChild::Helper::UpdateState( grpc_connectivity_state state, std::unique_ptr picker) { - gpr_log(GPR_INFO, "XdsRoutingChild::Helper::UpdateState %s", - xds_routing_child_->name().c_str()); + if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_routing_lb_trace)) { + gpr_log(GPR_INFO, + "XdsRoutingChild::Helper::UpdateState child %s, state %d, piker %p", + xds_routing_child_->name_.c_str(), state, picker.get()); + } if (xds_routing_child_->xds_routing_policy_->shutting_down_) return; // Cache the picker in the XdsRoutingChild. xds_routing_child_->picker_wrapper_ = MakeRefCounted( - xds_routing_child_->name(), std::move(picker)); + xds_routing_child_->name_, std::move(picker)); // Decide what state to report for aggregation purposes. // If we haven't seen a failure since the last time we were in state // READY, then we report the state change as-is. However, once we do see @@ -607,87 +608,67 @@ class XdsRoutingLbFactory : public LoadBalancingPolicyFactory { if (it == json.object_value().end()) { error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( "field:actions error:required field not present")); - } else if (it->second.type() != Json::Type::ARRAY) { + } else if (it->second.type() != Json::Type::OBJECT) { error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "field:actions error:type should be array")); + "field:actions error:type should be object")); } else { - for (const auto& p : it->second.array_value()) { - auto it_cds = p.object_value().find("cds"); - auto it_weighted_target = p.object_value().find("weighted_target"); - if (it_cds == p.object_value().end() && - it_weighted_target == p.object_value().end()) { - error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "field:actions error: each action needs to be either cds or " - "weighted target")); - } - auto it_name = - (it_cds == p.object_value().end() ? it_weighted_target : it_cds); - auto it_child_policy = p.object_value().find("child_policy"); - if (it_child_policy == p.object_value().end()) { - error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "field:actions error: each action needs child policies")); - } + for (const auto& p : it->second.object_value()) { XdsRoutingLbConfig::ChildConfig child_config; std::vector child_errors = - ParseChildConfig(it_child_policy->second, &child_config); + ParseChildConfig(p.second, &child_config); if (!child_errors.empty()) { // Can't use GRPC_ERROR_CREATE_FROM_VECTOR() here, because the error // string is not static in this case. grpc_error* error = GRPC_ERROR_CREATE_FROM_COPIED_STRING( - absl::StrCat("field:actions name:", - it_name->second.string_value()) - .c_str()); + absl::StrCat("field:actions name:", p.first).c_str()); for (grpc_error* child_error : child_errors) { error = grpc_error_add_child(error, child_error); } error_list.push_back(error); } else { - action_map[it_name->second.string_value()] = std::move(child_config); + action_map[p.first] = std::move(child_config); } } } - XdsRoutingLbConfig::RouteVector route_vector; - auto route_iter = json.object_value().find("routes"); - if (route_iter == json.object_value().end()) { - gpr_log(GPR_INFO, "No routes specified"); - } else if (route_iter->second.type() != Json::Type::ARRAY) { + XdsRoutingLbConfig::RouteTable route_table; + it = json.object_value().find("routes"); + if (it == json.object_value().end()) { + error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "field:routes error:required field not present")); + } else if (it->second.type() != Json::Type::ARRAY) { error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( "field:routes error:type should be array")); } else { - for (const auto& p : route_iter->second.array_value()) { - auto method_name = p.object_value().find("methodName"); - if (method_name == p.object_value().end()) { - error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "field:routes error:methodName is required")); - } else { - auto action_name = p.object_value().find("action"); - if (action_name == p.object_value().end()) { - error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "field:routes error:action is required")); - } else { - XdsRoutingLbConfig::Matcher matcher; - auto service = method_name->second.object_value().find("service"); - auto method = method_name->second.object_value().find("method"); - if (service == method_name->second.object_value().end() && - method != method_name->second.object_value().end()) { - error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "field:methodName error: service is empty when method is " - "not")); - } - if (service != method_name->second.object_value().end()) { - matcher.first = service->second.string_value(); - } else { - matcher.first = ""; - } - if (method != method_name->second.object_value().end()) { - matcher.second = method->second.string_value(); - } else { - matcher.first = ""; - } - route_vector.emplace_back(matcher, - action_name->second.string_value()); + for (const auto& route : it->second.array_value()) { + // Parse methodName. + XdsRoutingLbConfig::Matcher matcher; + std::vector route_errors = + ParseRouteConfig(route.object_value(), &matcher); + if (!route_errors.empty()) { + // Can't use GRPC_ERROR_CREATE_FROM_VECTOR() here, because the error + // string is not static in this case. + grpc_error* error = + GRPC_ERROR_CREATE_FROM_COPIED_STRING("field:routes error"); + for (grpc_error* route_error : route_errors) { + error = grpc_error_add_child(error, route_error); } + error_list.push_back(error); } + // Parse action. + std::string cluster_name; + std::vector action_errors = + ParseActionConfig(route.object_value(), &cluster_name); + if (!action_errors.empty()) { + // Can't use GRPC_ERROR_CREATE_FROM_VECTOR() here, because the error + // string is not static in this case. + grpc_error* error = + GRPC_ERROR_CREATE_FROM_COPIED_STRING("field:actions error:"); + for (grpc_error* action_error : action_errors) { + error = grpc_error_add_child(error, action_error); + } + error_list.push_back(error); + } + route_table.emplace_back(std::move(matcher), std::move(cluster_name)); } } if (!error_list.empty()) { @@ -696,28 +677,92 @@ class XdsRoutingLbFactory : public LoadBalancingPolicyFactory { return nullptr; } return MakeRefCounted(std::move(action_map), - std::move(route_vector)); + std::move(route_table)); } private: static std::vector ParseChildConfig( const Json& json, XdsRoutingLbConfig::ChildConfig* child_config) { std::vector error_list; - if (json.type() != Json::Type::ARRAY) { + if (json.type() != Json::Type::OBJECT) { error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "value should be of type array")); + "value should be of type object")); return error_list; } - grpc_error* parse_error = GRPC_ERROR_NONE; - child_config->config = - LoadBalancingPolicyRegistry::ParseLoadBalancingConfig( - json.array_value(), &parse_error); - if (child_config->config == nullptr) { - GPR_DEBUG_ASSERT(parse_error != GRPC_ERROR_NONE); - std::vector child_errors; - child_errors.push_back(parse_error); + auto it = json.object_value().find("child_policy"); + if (it != json.object_value().end()) { + grpc_error* parse_error = GRPC_ERROR_NONE; + child_config->config = + LoadBalancingPolicyRegistry::ParseLoadBalancingConfig(it->second, + &parse_error); + if (child_config->config == nullptr) { + GPR_DEBUG_ASSERT(parse_error != GRPC_ERROR_NONE); + std::vector child_errors; + child_errors.push_back(parse_error); + error_list.push_back( + GRPC_ERROR_CREATE_FROM_VECTOR("field:childPolicy", &child_errors)); + } + } else { error_list.push_back( - GRPC_ERROR_CREATE_FROM_VECTOR("field:childPolicy", &child_errors)); + GRPC_ERROR_CREATE_FROM_STATIC_STRING("did not find childPolicy")); + } + return error_list; + } + + static std::vector ParseRouteConfig( + const Json& json, XdsRoutingLbConfig::Matcher* route_config) { + std::vector error_list; + if (json.type() != Json::Type::OBJECT) { + error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "value should be of type object")); + return error_list; + } + auto method_name = json.object_value().find("methodName"); + if (method_name == json.object_value().end()) { + error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "field:routes error:methodName is required")); + } else if (method_name->second.type() != Json::Type::OBJECT) { + error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "field:routes error:methodName error: type should be object")); + } else { + auto service = method_name->second.object_value().find("service"); + auto method = method_name->second.object_value().find("method"); + if (service != method_name->second.object_value().end()) { + route_config->service = service->second.string_value(); + } else { + route_config->service = ""; + } + if (method != method_name->second.object_value().end()) { + route_config->method = method->second.string_value(); + } else { + route_config->method = ""; + } + if ((route_config->service == "") && (route_config->method != "")) { + error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "field:methodName error: service is empty when method is " + "not")); + } + } + return error_list; + } + + static std::vector ParseActionConfig(const Json& json, + std::string* cluster_name) { + std::vector error_list; + if (json.type() != Json::Type::OBJECT) { + error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "value should be of type object")); + return error_list; + } + auto action_name = json.object_value().find("action"); + if (action_name == json.object_value().end()) { + error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "field:routes error:action is required")); + } else if (action_name->second.type() != Json::Type::STRING) { + error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "field:methodName error:type should be string")); + } else { + *cluster_name = action_name->second.string_value(); } return error_list; } diff --git a/src/core/ext/filters/client_channel/xds/xds_api.cc b/src/core/ext/filters/client_channel/xds/xds_api.cc index b8a07c95bf0..76558647ee2 100644 --- a/src/core/ext/filters/client_channel/xds/xds_api.cc +++ b/src/core/ext/filters/client_channel/xds/xds_api.cc @@ -1012,7 +1012,6 @@ grpc_error* RouteConfigParse( return GRPC_ERROR_CREATE_FROM_STATIC_STRING( "No route found in the virtual host."); } - for (size_t i = 0; i < size; ++i) { const envoy_api_v2_route_Route* route = routes[i]; const envoy_api_v2_route_RouteMatch* match = @@ -1020,28 +1019,28 @@ grpc_error* RouteConfigParse( XdsApi::RdsRoute rds_route; const upb_strview prefix = envoy_api_v2_route_RouteMatch_prefix(match); const upb_strview path = envoy_api_v2_route_RouteMatch_path(match); - if (!upb_strview_eql(prefix, upb_strview_makez(""))) { - std::string prefix_string = std::string(prefix.data, prefix.size); - std::vector v = absl::StrSplit(prefix_string, '/'); - if (v.size() != 2) { + if (prefix.size > 0) { + std::vector v = absl::StrSplit( + absl::string_view(prefix.data, prefix.size).substr(1), '/'); + if (v.size() != 1) { return GRPC_ERROR_CREATE_FROM_STATIC_STRING( "Prefix not in the required format of /service/"); } - rds_route.service = v[1]; - if (!upb_strview_eql(path, upb_strview_makez(""))) { + rds_route.service = std::string(v[0].data(), v[0].size()); + if (path.size > 0) { return GRPC_ERROR_CREATE_FROM_STATIC_STRING( "Prefix is not empty string, path cannot also be non-empty."); } - } else if (!upb_strview_eql(path, upb_strview_makez(""))) { - std::string path_string = std::string(path.data, path.size); - std::vector v = absl::StrSplit(path_string, '/'); - if (v.size() != 3) { + } else if (path.size > 0) { + std::vector v = absl::StrSplit( + absl::string_view(path.data, path.size).substr(1), '/'); + if (v.size() != 2) { return GRPC_ERROR_CREATE_FROM_STATIC_STRING( "Path not in the required format of /service/method"); } - rds_route.service = v[1]; - rds_route.method = v[2]; - if (!upb_strview_eql(prefix, upb_strview_makez(""))) { + rds_route.service = std::string(v[0].data(), v[0].size()); + rds_route.method = std::string(v[1].data(), v[1].size()); + if (prefix.size > 0) { return GRPC_ERROR_CREATE_FROM_STATIC_STRING( "Path is not empty string, prefix cannot also be non-empty."); } @@ -1059,13 +1058,12 @@ grpc_error* RouteConfigParse( } const upb_strview action = envoy_api_v2_route_RouteAction_cluster(route_action); - rds_route.action_name = std::string(action.data, action.size); + rds_route.cluster_name = std::string(action.data, action.size); rds_update->routes.emplace_back(std::move(rds_route)); - gpr_log(GPR_INFO, "RouteConfigParse a route %s %s %s %s", + gpr_log(GPR_INFO, "RouteConfigParse a route %s %s %s", rds_update->routes[i].service.c_str(), rds_update->routes[i].method.c_str(), - rds_update->routes[i].action_type.c_str(), - rds_update->routes[i].action_name.c_str()); + rds_update->routes[i].cluster_name.c_str()); } return GRPC_ERROR_NONE; } diff --git a/src/core/ext/filters/client_channel/xds/xds_api.h b/src/core/ext/filters/client_channel/xds/xds_api.h index 175f2d3a28a..caa2c748a97 100644 --- a/src/core/ext/filters/client_channel/xds/xds_api.h +++ b/src/core/ext/filters/client_channel/xds/xds_api.h @@ -46,8 +46,7 @@ class XdsApi { struct RdsRoute { std::string service; std::string method; - std::string action_type; - std::string action_name; + std::string cluster_name; }; struct RdsUpdate { diff --git a/src/core/ext/filters/client_channel/xds/xds_client.cc b/src/core/ext/filters/client_channel/xds/xds_client.cc index 0e9cd5c0c29..c9679da7b42 100644 --- a/src/core/ext/filters/client_channel/xds/xds_client.cc +++ b/src/core/ext/filters/client_channel/xds/xds_client.cc @@ -22,6 +22,7 @@ #include #include +#include "absl/strings/str_format.h" #include "absl/strings/str_join.h" #include @@ -70,6 +71,35 @@ namespace grpc_core { TraceFlag grpc_xds_client_trace(false, "xds_client"); +namespace { + +std::string CreateServiceConfigActionCluster(const std::string& cluster_name) { + std::string json = absl::StrFormat( + " \"cds:%s\":{\n" + " \"child_policy\":[\n" + " { \"cds_experimental\":{\n" + " \"cluster\": \"%s\"\n" + " } }\n" + " ]\n" + " }", + cluster_name.c_str(), cluster_name.c_str()); + return json; +} + +std::string CreateServiceConfigRoute(const std::string& cluster_name, + const std::string& service, + const std::string& method) { + std::string json = absl::StrFormat( + " { \"methodName\":\n" + " { \"service\": \"%s\",\n" + " \"method\": \"%s\"},\n" + " \"action\": \"cds:%s\"\n" + " }", + service.c_str(), method.c_str(), cluster_name.c_str()); + return json; +} + +} // namespace // // Internal class declarations // @@ -888,35 +918,23 @@ void XdsClient::ChannelState::AdsCallState::AcceptLdsUpdate( "LDS update does not include requested resource")); return; } - const std::string& cluster_name = - lds_update->rds_update.has_value() - ? lds_update->rds_update.value().routes[0].action_name - : ""; if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) { gpr_log(GPR_INFO, - "[xds_client %p] LDS update received: route_config_name=%s, " - "cluster_name=%s (empty if RDS is needed to obtain it)", - xds_client(), lds_update->route_config_name.c_str(), - cluster_name.c_str()); - for (auto route : lds_update->rds_update.value().routes) { - gpr_log(GPR_INFO, "Create service config using %s %s %s %s", - route.service.c_str(), route.method.c_str(), - route.action_type.c_str(), route.action_name.c_str()); + "[xds_client %p] LDS update received: route_config_name=%s", + xds_client(), lds_update->route_config_name.c_str()); + if (lds_update->rds_update.has_value()) { + for (const auto& route : lds_update->rds_update.value().routes) { + gpr_log(GPR_INFO, + "Create service config using route: { service=\"%s\", " + "method=\"%s\" }, cluster=\"%s\" }", + route.service.c_str(), route.method.c_str(), + route.cluster_name.c_str()); + } } } auto& lds_state = state_map_[XdsApi::kLdsTypeUrl]; auto& state = lds_state.subscribed_resources[xds_client()->server_name_]; if (state != nullptr) state->Finish(); - // Ignore identical update. - if (xds_client()->route_config_name_ == lds_update->route_config_name && - xds_client()->cluster_name_ == cluster_name) { - if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) { - gpr_log(GPR_INFO, - "[xds_client %p] LDS update identical to current, ignoring.", - xds_client()); - } - return; - } if (!xds_client()->route_config_name_.empty()) { Unsubscribe( XdsApi::kRdsTypeUrl, xds_client()->route_config_name_, @@ -924,10 +942,8 @@ void XdsClient::ChannelState::AdsCallState::AcceptLdsUpdate( } xds_client()->route_config_name_ = lds_update->route_config_name; if (lds_update->rds_update.has_value()) { - // If cluster_name was found inlined in LDS response, notify the watcher - // immediately. - xds_client()->cluster_name_ = - lds_update->rds_update.value().routes[0].action_name; + // If the RouteConfiguration was found inlined in LDS response, notify the + // watcher immediately. RefCountedPtr service_config; grpc_error* error = xds_client()->CreateServiceConfig( lds_update->rds_update.value(), &service_config); @@ -954,24 +970,10 @@ void XdsClient::ChannelState::AdsCallState::AcceptRdsUpdate( "RDS update does not include requested resource")); return; } - if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) { - gpr_log(GPR_INFO, "[xds_client %p] RDS update received: cluster_name=%s", - xds_client(), rds_update->routes[0].action_name.c_str()); - } auto& rds_state = state_map_[XdsApi::kRdsTypeUrl]; auto& state = rds_state.subscribed_resources[xds_client()->route_config_name_]; if (state != nullptr) state->Finish(); - // Ignore identical update. - if (xds_client()->cluster_name_ == rds_update->routes[0].action_name) { - if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) { - gpr_log(GPR_INFO, - "[xds_client %p] RDS update identical to current, ignoring.", - xds_client()); - } - return; - } - xds_client()->cluster_name_ = rds_update->routes[0].action_name; // Notify the watcher. RefCountedPtr service_config; grpc_error* error = @@ -2043,85 +2045,46 @@ void XdsClient::ResetBackoff() { } } -char* XdsClient::CreateServiceConfigActionCluster( - const std::string& cluster_name, const bool without_comma) const { - const char* last_line = without_comma ? "}" : "},"; - char* json; - gpr_asprintf(&json, - " { \"cds\": \"%s\",\n" - " \"child_policy\":[\n" - " { \"cds_experimental\":{\n" - " \"cluster\": \"%s\"\n" - " } }\n" - " ]\n" - " %s\n", - cluster_name.c_str(), cluster_name.c_str(), last_line); - return json; -} - -char* XdsClient::CreateServiceConfigRoute(const std::string& cluster_name, - const std::string& service, - const std::string& method, - const bool without_comma) const { - const char* last_line = without_comma ? "}" : "},"; - char* json; - gpr_asprintf(&json, - " { \"methodName\":\n" - " { \"service\": \"%s\",\n" - " \"method\": \"%s\"},\n" - " \"action\": \"%s\"\n" - " %s\n", - service.c_str(), method.c_str(), cluster_name.c_str(), - last_line); - return json; -} - grpc_error* XdsClient::CreateServiceConfig( const XdsApi::RdsUpdate& rds_update, RefCountedPtr* service_config) const { - gpr_strvec v; - gpr_strvec_init(&v); - char* json_start; - gpr_asprintf(&json_start, - "{\n" - " \"loadBalancingConfig\":[\n" - " { \"xds_routing_experimental\":{\n" - " \"actions\":[\n"); - gpr_strvec_add(&v, json_start); + std::vector v; + std::string json_start = + ("{\n" + " \"loadBalancingConfig\":[\n" + " { \"xds_routing_experimental\":{\n" + " \"actions\":{\n"); + v.push_back(std::move(json_start)); + std::vector actions_vector; for (size_t i = 0; i < rds_update.routes.size(); ++i) { auto route = rds_update.routes[i]; - // TODO: (donnadionne) CreateServiceConfigActionWeightedTarget - char* action = CreateServiceConfigActionCluster( - route.action_name.c_str(), i == (rds_update.routes.size() - 1)); - gpr_strvec_add(&v, action); - } - char* json_transition; - gpr_asprintf(&json_transition, - " ],\n" - " \"routes\":[\n"); - gpr_strvec_add(&v, json_transition); + actions_vector.push_back( + CreateServiceConfigActionCluster(route.cluster_name.c_str())); + } + v.push_back(absl::StrJoin(actions_vector, ",")); + std::string json_transition = + (" },\n" + " \"routes\":[\n"); + v.push_back(std::move(json_transition)); + std::vector routes_vector; for (size_t i = 0; i < rds_update.routes.size(); ++i) { auto route_info = rds_update.routes[i]; - char* route = CreateServiceConfigRoute( - route_info.action_name.c_str(), route_info.service.c_str(), - route_info.method.c_str(), i == (rds_update.routes.size() - 1)); - gpr_strvec_add(&v, route); - } - char* json_end; - gpr_asprintf(&json_end, - " ]\n" - " } }\n" - " ]\n" - "}"); - gpr_strvec_add(&v, json_end); - size_t len; - char* json = gpr_strvec_flatten(&v, &len); - gpr_strvec_destroy(&v); + routes_vector.push_back(CreateServiceConfigRoute( + route_info.cluster_name.c_str(), route_info.service.c_str(), + route_info.method.c_str())); + } + v.push_back(absl::StrJoin(routes_vector, ",")); + std::string json_end = + (" ]\n" + " } }\n" + " ]\n" + "}"); + v.push_back(std::move(json_end)); + std::string json = absl::StrJoin(v, ""); grpc_error* error = GRPC_ERROR_NONE; - *service_config = ServiceConfig::Create(json, &error); + *service_config = ServiceConfig::Create(json.c_str(), &error); gpr_log(GPR_INFO, "Built service config: \"%s\"", service_config->get()->json_string().c_str()); - gpr_free(json); return error; } diff --git a/src/core/ext/filters/client_channel/xds/xds_client.h b/src/core/ext/filters/client_channel/xds/xds_client.h index d29ac12e659..76a45c9b09f 100644 --- a/src/core/ext/filters/client_channel/xds/xds_client.h +++ b/src/core/ext/filters/client_channel/xds/xds_client.h @@ -218,13 +218,6 @@ class XdsClient : public InternallyRefCounted { // Sends an error notification to all watchers. void NotifyOnError(grpc_error* error); - char* CreateServiceConfigActionCluster( - const std::string& cluster_name, const bool without_comma = false) const; - char* CreateServiceConfigRoute(const std::string& prefix, - const std::string& service, - const std::string& method, - const bool without_comma = false) const; - grpc_error* CreateServiceConfig( const XdsApi::RdsUpdate& rds_update, RefCountedPtr* service_config) const; @@ -254,7 +247,6 @@ class XdsClient : public InternallyRefCounted { OrphanablePtr chand_; std::string route_config_name_; - std::string cluster_name_; // One entry for each watched CDS resource. std::map cluster_map_; // One entry for each watched EDS resource. diff --git a/src/core/plugin_registry/grpc_unsecure_plugin_registry.cc b/src/core/plugin_registry/grpc_unsecure_plugin_registry.cc index bfed2e22ddd..bdc658b76d2 100644 --- a/src/core/plugin_registry/grpc_unsecure_plugin_registry.cc +++ b/src/core/plugin_registry/grpc_unsecure_plugin_registry.cc @@ -46,6 +46,8 @@ void grpc_lb_policy_cds_init(void); void grpc_lb_policy_cds_shutdown(void); void grpc_lb_policy_xds_init(void); void grpc_lb_policy_xds_shutdown(void); +void grpc_lb_policy_xds_routing_init(void); +void grpc_lb_policy_xds_routing_shutdown(void); void grpc_lb_policy_pick_first_init(void); void grpc_lb_policy_pick_first_shutdown(void); void grpc_lb_policy_round_robin_init(void); @@ -88,6 +90,8 @@ void grpc_register_built_in_plugins(void) { grpc_lb_policy_cds_shutdown); grpc_register_plugin(grpc_lb_policy_xds_init, grpc_lb_policy_xds_shutdown); + grpc_register_plugin(grpc_lb_policy_xds_routing_init, + grpc_lb_policy_xds_routing_shutdown); grpc_register_plugin(grpc_lb_policy_pick_first_init, grpc_lb_policy_pick_first_shutdown); grpc_register_plugin(grpc_lb_policy_round_robin_init, diff --git a/test/cpp/end2end/xds_end2end_test.cc b/test/cpp/end2end/xds_end2end_test.cc index 15c594cdf8d..a710f24510e 100644 --- a/test/cpp/end2end/xds_end2end_test.cc +++ b/test/cpp/end2end/xds_end2end_test.cc @@ -1946,15 +1946,9 @@ TEST_P(LdsTest, XdsRoutingPathMatching) { // Change RDS resource to point to new cluster. RouteConfiguration new_route_config = balancers_[0]->ads_service()->default_route_config(); - new_route_config.mutable_virtual_hosts(0) - ->mutable_routes(0) - ->mutable_match() - ->set_path("/grpc.testing.EchoTestService/Echo"); - //->set_prefix("/dgrpc.testing.EchoTestService"); - new_route_config.mutable_virtual_hosts(0) - ->mutable_routes(0) - ->mutable_route() - ->set_cluster(kNewClusterName); + auto* route = new_route_config.mutable_virtual_hosts(0)->mutable_routes(0); + route->mutable_match()->set_path("/grpc.testing.EchoTestService/Echo"); + route->mutable_route()->set_cluster(kNewClusterName); Listener listener = balancers_[0]->ads_service()->BuildListener(new_route_config); balancers_[0]->ads_service()->SetLdsResource(listener, kDefaultResourceName); @@ -1989,14 +1983,9 @@ TEST_P(LdsTest, XdsRoutingPrefixMatching) { // Change RDS resource to point to new cluster. RouteConfiguration new_route_config = balancers_[0]->ads_service()->default_route_config(); - new_route_config.mutable_virtual_hosts(0) - ->mutable_routes(0) - ->mutable_match() - ->set_prefix("/grpc.testing.EchoTestService"); - new_route_config.mutable_virtual_hosts(0) - ->mutable_routes(0) - ->mutable_route() - ->set_cluster(kNewClusterName); + auto* route = new_route_config.mutable_virtual_hosts(0)->mutable_routes(0); + route->mutable_match()->set_prefix("/grpc.testing.EchoTestService"); + route->mutable_route()->set_cluster(kNewClusterName); Listener listener = balancers_[0]->ads_service()->BuildListener(new_route_config); balancers_[0]->ads_service()->SetLdsResource(listener, kDefaultResourceName); From 03411d7be7165c96e548ccb2f64a81d6198e2519 Mon Sep 17 00:00:00 2001 From: "Mark D. Roth" Date: Tue, 31 Mar 2020 07:52:44 -0700 Subject: [PATCH 313/758] Second attempt: grpclb stabilization --- BUILD | 18 ++ BUILD.gn | 2 + CMakeLists.txt | 2 + Makefile | 2 + build_autogenerated.yaml | 4 + config.m4 | 1 + config.w32 | 1 + gRPC-C++.podspec | 2 + gRPC-Core.podspec | 3 + grpc.gemspec | 2 + grpc.gyp | 2 + package.xml | 2 + .../filters/client_channel/client_channel.cc | 19 -- .../client_channel/lb_policy/grpclb/grpclb.cc | 45 +-- .../grpclb/grpclb_balancer_addresses.cc | 89 ++++++ .../grpclb/grpclb_balancer_addresses.h | 40 +++ .../lb_policy/grpclb/grpclb_channel_secure.cc | 5 +- .../lb_policy/subchannel_list.h | 7 - .../resolver/dns/c_ares/dns_resolver_ares.cc | 23 +- .../resolver/dns/c_ares/grpc_ares_wrapper.cc | 43 +-- .../resolver/dns/c_ares/grpc_ares_wrapper.h | 3 +- .../dns/c_ares/grpc_ares_wrapper_fallback.cc | 6 +- .../filters/client_channel/server_address.cc | 15 +- .../filters/client_channel/server_address.h | 13 +- src/python/grpcio/grpc_core_dependencies.py | 1 + .../dns_resolver_connectivity_test.cc | 5 +- .../resolvers/dns_resolver_cooldown_test.cc | 9 +- .../resolvers/fake_resolver_test.cc | 17 +- test/core/end2end/goaway_server_test.cc | 8 +- test/cpp/client/BUILD | 1 + test/cpp/client/client_channel_stress_test.cc | 46 +-- ...channel_with_active_connect_stress_test.cc | 32 +-- test/cpp/end2end/grpclb_end2end_test.cc | 271 +++++++++--------- test/cpp/naming/resolver_component_test.cc | 38 ++- tools/distrib/check_include_guards.py | 4 +- tools/doxygen/Doxyfile.c++.internal | 2 + tools/doxygen/Doxyfile.core.internal | 2 + 37 files changed, 470 insertions(+), 315 deletions(-) create mode 100644 src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc create mode 100644 src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h diff --git a/BUILD b/BUILD index a62ca7e8ec2..992d1d403cc 100644 --- a/BUILD +++ b/BUILD @@ -1235,6 +1235,21 @@ grpc_cc_library( ], ) +grpc_cc_library( + name = "grpc_grpclb_balancer_addresses", + srcs = [ + "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc", + ], + hdrs = [ + "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h", + ], + language = "c++", + deps = [ + "grpc_base", + "grpc_client_channel", + ], +) + grpc_cc_library( name = "grpc_lb_policy_grpclb", srcs = [ @@ -1255,6 +1270,7 @@ grpc_cc_library( deps = [ "grpc_base", "grpc_client_channel", + "grpc_grpclb_balancer_addresses", "grpc_lb_upb", "grpc_resolver_fake", "grpc_transport_chttp2_client_insecure", @@ -1281,6 +1297,7 @@ grpc_cc_library( deps = [ "grpc_base", "grpc_client_channel", + "grpc_grpclb_balancer_addresses", "grpc_lb_upb", "grpc_resolver_fake", "grpc_secure", @@ -1606,6 +1623,7 @@ grpc_cc_library( deps = [ "grpc_base", "grpc_client_channel", + "grpc_grpclb_balancer_addresses", "grpc_resolver_dns_selection", ], ) diff --git a/BUILD.gn b/BUILD.gn index ee40a4db057..306f2bfa6d8 100644 --- a/BUILD.gn +++ b/BUILD.gn @@ -229,6 +229,8 @@ config("grpc_config") { "src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h", "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc", "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h", + "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc", + "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h", "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h", "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc", "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc", diff --git a/CMakeLists.txt b/CMakeLists.txt index c0b5279d257..5a52205e480 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1319,6 +1319,7 @@ add_library(grpc src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc + src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc @@ -1972,6 +1973,7 @@ add_library(grpc_unsecure src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc + src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.cc src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc diff --git a/Makefile b/Makefile index c4c6332736b..08ee1cbe217 100644 --- a/Makefile +++ b/Makefile @@ -3649,6 +3649,7 @@ LIBGRPC_SRC = \ src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc \ src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc \ src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc \ + src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc \ src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc \ src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc \ src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc \ @@ -4277,6 +4278,7 @@ LIBGRPC_UNSECURE_SRC = \ src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc \ src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc \ src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc \ + src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc \ src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.cc \ src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc \ src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc \ diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml index 56b33c42228..14daa48e2b7 100644 --- a/build_autogenerated.yaml +++ b/build_autogenerated.yaml @@ -385,6 +385,7 @@ libs: - src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h - src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h - src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h + - src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h - src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h - src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h - src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h @@ -742,6 +743,7 @@ libs: - src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc - src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc - src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc + - src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc - src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc - src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc - src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc @@ -1279,6 +1281,7 @@ libs: - src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h - src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h - src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h + - src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h - src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h - src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h - src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h @@ -1571,6 +1574,7 @@ libs: - src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc - src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc - src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc + - src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc - src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.cc - src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc - src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc diff --git a/config.m4 b/config.m4 index 7a38e36cd71..66922ad5527 100644 --- a/config.m4 +++ b/config.m4 @@ -53,6 +53,7 @@ if test "$PHP_GRPC" != "no"; then src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc \ src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc \ src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc \ + src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc \ src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc \ src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc \ src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc \ diff --git a/config.w32 b/config.w32 index 089504a1841..541cc74b602 100644 --- a/config.w32 +++ b/config.w32 @@ -22,6 +22,7 @@ if (PHP_GRPC != "no") { "src\\core\\ext\\filters\\client_channel\\lb_policy\\child_policy_handler.cc " + "src\\core\\ext\\filters\\client_channel\\lb_policy\\grpclb\\client_load_reporting_filter.cc " + "src\\core\\ext\\filters\\client_channel\\lb_policy\\grpclb\\grpclb.cc " + + "src\\core\\ext\\filters\\client_channel\\lb_policy\\grpclb\\grpclb_balancer_addresses.cc " + "src\\core\\ext\\filters\\client_channel\\lb_policy\\grpclb\\grpclb_channel_secure.cc " + "src\\core\\ext\\filters\\client_channel\\lb_policy\\grpclb\\grpclb_client_stats.cc " + "src\\core\\ext\\filters\\client_channel\\lb_policy\\grpclb\\load_balancer_api.cc " + diff --git a/gRPC-C++.podspec b/gRPC-C++.podspec index 8315e96f6ad..c8b176b23ea 100644 --- a/gRPC-C++.podspec +++ b/gRPC-C++.podspec @@ -236,6 +236,7 @@ Pod::Spec.new do |s| 'src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h', 'src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h', 'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h', + 'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h', 'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h', 'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h', 'src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h', @@ -685,6 +686,7 @@ Pod::Spec.new do |s| 'src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h', 'src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h', 'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h', + 'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h', 'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h', 'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h', 'src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h', diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec index f87d5f4603a..d140b005d7f 100644 --- a/gRPC-Core.podspec +++ b/gRPC-Core.podspec @@ -212,6 +212,8 @@ Pod::Spec.new do |s| 'src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h', 'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc', 'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h', + 'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc', + 'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h', 'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h', 'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc', 'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc', @@ -1033,6 +1035,7 @@ Pod::Spec.new do |s| 'src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h', 'src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h', 'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h', + 'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h', 'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h', 'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h', 'src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h', diff --git a/grpc.gemspec b/grpc.gemspec index cf0b389f50a..c9a1a8835fd 100644 --- a/grpc.gemspec +++ b/grpc.gemspec @@ -134,6 +134,8 @@ Gem::Specification.new do |s| s.files += %w( src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h ) s.files += %w( src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc ) s.files += %w( src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h ) + s.files += %w( src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc ) + s.files += %w( src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h ) s.files += %w( src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h ) s.files += %w( src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc ) s.files += %w( src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc ) diff --git a/grpc.gyp b/grpc.gyp index c32c0dca814..b065ee6f2af 100644 --- a/grpc.gyp +++ b/grpc.gyp @@ -445,6 +445,7 @@ 'src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc', 'src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc', 'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc', + 'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc', 'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc', 'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc', 'src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc', @@ -934,6 +935,7 @@ 'src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc', 'src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc', 'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc', + 'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc', 'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.cc', 'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc', 'src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc', diff --git a/package.xml b/package.xml index d9d5d1516d8..32930b6f65c 100644 --- a/package.xml +++ b/package.xml @@ -114,6 +114,8 @@ + + diff --git a/src/core/ext/filters/client_channel/client_channel.cc b/src/core/ext/filters/client_channel/client_channel.cc index 0a5759b6012..7dafecc59ba 100644 --- a/src/core/ext/filters/client_channel/client_channel.cc +++ b/src/core/ext/filters/client_channel/client_channel.cc @@ -1637,25 +1637,6 @@ void ChannelData::ProcessLbPolicy( grpc_channel_args_find(resolver_result.args, GRPC_ARG_LB_POLICY_NAME); policy_name = grpc_channel_arg_get_string(channel_arg); } - // Special case: If at least one balancer address is present, we use - // the grpclb policy, regardless of what the resolver has returned. - bool found_balancer_address = false; - for (size_t i = 0; i < resolver_result.addresses.size(); ++i) { - const ServerAddress& address = resolver_result.addresses[i]; - if (address.IsBalancer()) { - found_balancer_address = true; - break; - } - } - if (found_balancer_address) { - if (policy_name != nullptr && strcmp(policy_name, "grpclb") != 0) { - gpr_log(GPR_INFO, - "resolver requested LB policy %s but provided at least one " - "balancer address -- forcing use of grpclb LB policy", - policy_name); - } - policy_name = "grpclb"; - } // Use pick_first if nothing was specified and we didn't select grpclb // above. if (policy_name == nullptr) policy_name = "pick_first"; diff --git a/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc b/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc index 670c4ffdd56..da72451d549 100644 --- a/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +++ b/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc @@ -74,6 +74,7 @@ #include "src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h" #include "src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h" #include "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h" +#include "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h" #include "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h" #include "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h" #include "src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h" @@ -1241,25 +1242,11 @@ void GrpcLb::BalancerCallState::OnBalancerStatusReceivedLocked( // helper code for creating balancer channel // -ServerAddressList ExtractBalancerAddresses(const ServerAddressList& addresses) { - ServerAddressList balancer_addresses; - for (size_t i = 0; i < addresses.size(); ++i) { - if (addresses[i].IsBalancer()) { - // Strip out the is_balancer channel arg, since we don't want to - // recursively use the grpclb policy in the channel used to talk to - // the balancers. Note that we do NOT strip out the balancer_name - // channel arg, since we need that to set the authority correctly - // to talk to the balancers. - static const char* args_to_remove[] = { - GRPC_ARG_ADDRESS_IS_BALANCER, - }; - balancer_addresses.emplace_back( - addresses[i].address(), - grpc_channel_args_copy_and_remove(addresses[i].args(), args_to_remove, - GPR_ARRAY_SIZE(args_to_remove))); - } - } - return balancer_addresses; +ServerAddressList ExtractBalancerAddresses(const grpc_channel_args& args) { + const ServerAddressList* addresses = + FindGrpclbBalancerAddressesInChannelArgs(args); + if (addresses != nullptr) return *addresses; + return ServerAddressList(); } /* Returns the channel args for the LB channel, used to create a bidirectional @@ -1452,27 +1439,25 @@ void GrpcLb::UpdateLocked(UpdateArgs args) { // helpers for UpdateLocked() // -// Returns the backend addresses extracted from the given addresses. -ServerAddressList ExtractBackendAddresses(const ServerAddressList& addresses) { +ServerAddressList AddNullLbTokenToAddresses( + const ServerAddressList& addresses) { static const char* lb_token = ""; grpc_arg arg = grpc_channel_arg_pointer_create( const_cast(GRPC_ARG_GRPCLB_ADDRESS_LB_TOKEN), const_cast(lb_token), &lb_token_arg_vtable); - ServerAddressList backend_addresses; + ServerAddressList addresses_out; for (size_t i = 0; i < addresses.size(); ++i) { - if (!addresses[i].IsBalancer()) { - backend_addresses.emplace_back( - addresses[i].address(), - grpc_channel_args_copy_and_add(addresses[i].args(), &arg, 1)); - } + addresses_out.emplace_back( + addresses[i].address(), + grpc_channel_args_copy_and_add(addresses[i].args(), &arg, 1)); } - return backend_addresses; + return addresses_out; } void GrpcLb::ProcessAddressesAndChannelArgsLocked( const ServerAddressList& addresses, const grpc_channel_args& args) { // Update fallback address list. - fallback_backend_addresses_ = ExtractBackendAddresses(addresses); + fallback_backend_addresses_ = AddNullLbTokenToAddresses(addresses); // Make sure that GRPC_ARG_LB_POLICY_NAME is set in channel args, // since we use this to trigger the client_load_reporting filter. static const char* args_to_remove[] = {GRPC_ARG_LB_POLICY_NAME}; @@ -1482,7 +1467,7 @@ void GrpcLb::ProcessAddressesAndChannelArgsLocked( args_ = grpc_channel_args_copy_and_add_and_remove( &args, args_to_remove, GPR_ARRAY_SIZE(args_to_remove), &new_arg, 1); // Construct args for balancer channel. - ServerAddressList balancer_addresses = ExtractBalancerAddresses(addresses); + ServerAddressList balancer_addresses = ExtractBalancerAddresses(args); grpc_channel_args* lb_channel_args = BuildBalancerChannelArgs( balancer_addresses, response_generator_.get(), &args); // Create balancer channel if needed. diff --git a/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc b/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc new file mode 100644 index 00000000000..2888c3b94ae --- /dev/null +++ b/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc @@ -0,0 +1,89 @@ +// +// Copyright 2019 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#include + +#include "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h" + +#include "src/core/lib/channel/channel_args.h" +#include "src/core/lib/gpr/useful.h" + +// Channel arg key for the list of balancer addresses. +#define GRPC_ARG_GRPCLB_BALANCER_ADDRESSES "grpc.grpclb_balancer_addresses" +// Channel arg key for a string indicating an address's balancer name. +#define GRPC_ARG_ADDRESS_BALANCER_NAME "grpc.address_balancer_name" + +namespace grpc_core { + +namespace { + +void* BalancerAddressesArgCopy(void* p) { + ServerAddressList* address_list = static_cast(p); + return new ServerAddressList(*address_list); +} + +void BalancerAddressesArgDestroy(void* p) { + ServerAddressList* address_list = static_cast(p); + delete address_list; +} + +int BalancerAddressesArgCmp(void* p, void* q) { + ServerAddressList* address_list1 = static_cast(p); + ServerAddressList* address_list2 = static_cast(q); + if (address_list1 == nullptr || address_list2 == nullptr) { + return GPR_ICMP(address_list1, address_list2); + } + if (address_list1->size() > address_list2->size()) return 1; + if (address_list1->size() < address_list2->size()) return -1; + for (size_t i = 0; i < address_list1->size(); ++i) { + int retval = (*address_list1)[i].Cmp((*address_list2)[i]); + if (retval != 0) return retval; + } + return 0; +} + +const grpc_arg_pointer_vtable kBalancerAddressesArgVtable = { + BalancerAddressesArgCopy, BalancerAddressesArgDestroy, + BalancerAddressesArgCmp}; + +} // namespace + +grpc_arg CreateGrpclbBalancerAddressesArg( + const ServerAddressList* address_list) { + return grpc_channel_arg_pointer_create( + const_cast(GRPC_ARG_GRPCLB_BALANCER_ADDRESSES), + const_cast(address_list), + &kBalancerAddressesArgVtable); +} + +const ServerAddressList* FindGrpclbBalancerAddressesInChannelArgs( + const grpc_channel_args& args) { + return grpc_channel_args_find_pointer( + &args, const_cast(GRPC_ARG_GRPCLB_BALANCER_ADDRESSES)); +} + +grpc_arg CreateGrpclbBalancerNameArg(const char* balancer_name) { + return grpc_channel_arg_string_create( + const_cast(GRPC_ARG_ADDRESS_BALANCER_NAME), + const_cast(balancer_name)); +} + +const char* FindGrpclbBalancerNameInChannelArgs(const grpc_channel_args& args) { + return grpc_channel_args_find_string( + &args, const_cast(GRPC_ARG_ADDRESS_BALANCER_NAME)); +} + +} // namespace grpc_core diff --git a/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h b/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h new file mode 100644 index 00000000000..9b6b259deca --- /dev/null +++ b/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h @@ -0,0 +1,40 @@ +// +// Copyright 2019 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#ifndef GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_GRPCLB_GRPCLB_BALANCER_ADDRESSES_H +#define GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_GRPCLB_GRPCLB_BALANCER_ADDRESSES_H + +#include + +#include + +#include "src/core/ext/filters/client_channel/server_address.h" + +namespace grpc_core { + +grpc_arg CreateGrpclbBalancerAddressesArg( + const ServerAddressList* address_list); +const ServerAddressList* FindGrpclbBalancerAddressesInChannelArgs( + const grpc_channel_args& args); + +grpc_arg CreateGrpclbBalancerNameArg(const char* balancer_name); +const char* FindGrpclbBalancerNameInChannelArgs(const grpc_channel_args& args); + +} // namespace grpc_core + +#endif /* \ +GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_GRPCLB_GRPCLB_BALANCER_ADDRESSES_H \ + */ diff --git a/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc b/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc index 5bc4f5157ad..414f8274317 100644 --- a/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +++ b/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc @@ -27,6 +27,7 @@ #include #include "src/core/ext/filters/client_channel/client_channel.h" +#include "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h" #include "src/core/ext/filters/client_channel/server_address.h" #include "src/core/lib/channel/channel_args.h" #include "src/core/lib/gpr/string.h" @@ -55,8 +56,8 @@ RefCountedPtr CreateTargetAuthorityTable( grpc_sockaddr_to_string(&addr_str, &addresses[i].address(), true) > 0); target_authority_entries[i].key = grpc_slice_from_copied_string(addr_str); gpr_free(addr_str); - char* balancer_name = grpc_channel_arg_get_string(grpc_channel_args_find( - addresses[i].args(), GRPC_ARG_ADDRESS_BALANCER_NAME)); + const char* balancer_name = + FindGrpclbBalancerNameInChannelArgs(*addresses[i].args()); target_authority_entries[i].value.reset(gpr_strdup(balancer_name)); } RefCountedPtr target_authority_table = diff --git a/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h b/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h index 4932a6869f1..2d8988926e4 100644 --- a/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +++ b/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h @@ -370,13 +370,6 @@ SubchannelList::SubchannelList( GRPC_ARG_SERVICE_CONFIG}; // Create a subchannel for each address. for (size_t i = 0; i < addresses.size(); i++) { - // TODO(roth): we should ideally hide this from the LB policy code. In - // principle, if we're dealing with this special case in the client_channel - // code for selecting grpclb, then we should also strip out these addresses - // there if we're not using grpclb. - if (addresses[i].IsBalancer()) { - continue; - } InlinedVector args_to_add; const size_t subchannel_address_arg_index = args_to_add.size(); args_to_add.emplace_back( diff --git a/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc b/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc index a8215439d2a..e2a05d03ad3 100644 --- a/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +++ b/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc @@ -30,6 +30,7 @@ #include #include "src/core/ext/filters/client_channel/http_connect_handshaker.h" +#include "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h" #include "src/core/ext/filters/client_channel/lb_policy_registry.h" #include "src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h" #include "src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.h" @@ -107,8 +108,10 @@ class AresDnsResolver : public Resolver { grpc_millis last_resolution_timestamp_ = -1; /// retry backoff state BackOff backoff_; - /// currently resolving addresses + /// currently resolving backend addresses std::unique_ptr addresses_; + /// currently resolving balancer addresses + std::unique_ptr balancer_addresses_; /// currently resolving service config char* service_config_json_ = nullptr; // has shutdown been initiated @@ -328,9 +331,11 @@ void AresDnsResolver::OnResolvedLocked(void* arg, grpc_error* error) { r->Unref(DEBUG_LOCATION, "OnResolvedLocked() shutdown"); return; } - if (r->addresses_ != nullptr) { + if (r->addresses_ != nullptr || r->balancer_addresses_ != nullptr) { Result result; - result.addresses = std::move(*r->addresses_); + if (r->addresses_ != nullptr) { + result.addresses = std::move(*r->addresses_); + } if (r->service_config_json_ != nullptr) { std::string service_config_string = ChooseServiceConfig( r->service_config_json_, &result.service_config_error); @@ -343,9 +348,16 @@ void AresDnsResolver::OnResolvedLocked(void* arg, grpc_error* error) { service_config_string, &result.service_config_error); } } - result.args = grpc_channel_args_copy(r->channel_args_); + InlinedVector new_args; + if (r->balancer_addresses_ != nullptr) { + new_args.push_back( + CreateGrpclbBalancerAddressesArg(r->balancer_addresses_.get())); + } + result.args = grpc_channel_args_copy_and_add( + r->channel_args_, new_args.data(), new_args.size()); r->result_handler()->ReturnResult(std::move(result)); r->addresses_.reset(); + r->balancer_addresses_.reset(); // Reset backoff state so that we start from the beginning when the // next request gets triggered. r->backoff_.Reset(); @@ -424,7 +436,8 @@ void AresDnsResolver::StartResolvingLocked() { GRPC_CLOSURE_INIT(&on_resolved_, OnResolved, this, grpc_schedule_on_exec_ctx); pending_request_ = grpc_dns_lookup_ares_locked( dns_server_, name_to_resolve_, kDefaultPort, interested_parties_, - &on_resolved_, &addresses_, enable_srv_queries_ /* check_grpclb */, + &on_resolved_, &addresses_, + enable_srv_queries_ ? &balancer_addresses_ : nullptr, request_service_config_ ? &service_config_json_ : nullptr, query_timeout_ms_, combiner()); last_resolution_timestamp_ = grpc_core::ExecCtx::Get()->Now(); diff --git a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc index 761bed9a82d..b9960453ccf 100644 --- a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +++ b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc @@ -33,6 +33,7 @@ #include #include +#include "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h" #include "src/core/ext/filters/client_channel/parse_address.h" #include "src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h" #include "src/core/lib/gpr/string.h" @@ -60,6 +61,8 @@ struct grpc_ares_request { grpc_closure* on_done; /** the pointer to receive the resolved addresses */ std::unique_ptr* addresses_out; + /** the pointer to receive the resolved balancer addresses */ + std::unique_ptr* balancer_addresses_out; /** the pointer to receive the service config in JSON */ char** service_config_json_out; /** the evernt driver used by this request */ @@ -184,17 +187,17 @@ static void on_hostbyname_done_locked(void* arg, int status, int /*timeouts*/, GRPC_CARES_TRACE_LOG( "request:%p on_hostbyname_done_locked host=%s ARES_SUCCESS", r, hr->host); - if (*r->addresses_out == nullptr) { - *r->addresses_out = absl::make_unique(); + std::unique_ptr* address_list_ptr = + hr->is_balancer ? r->balancer_addresses_out : r->addresses_out; + if (*address_list_ptr == nullptr) { + *address_list_ptr = absl::make_unique(); } - ServerAddressList& addresses = **r->addresses_out; + ServerAddressList& addresses = **address_list_ptr; for (size_t i = 0; hostent->h_addr_list[i] != nullptr; ++i) { - grpc_core::InlinedVector args_to_add; + grpc_core::InlinedVector args_to_add; if (hr->is_balancer) { - args_to_add.emplace_back(grpc_channel_arg_integer_create( - const_cast(GRPC_ARG_ADDRESS_IS_BALANCER), 1)); - args_to_add.emplace_back(grpc_channel_arg_string_create( - const_cast(GRPC_ARG_ADDRESS_BALANCER_NAME), hr->host)); + args_to_add.emplace_back( + grpc_core::CreateGrpclbBalancerNameArg(hr->host)); } grpc_channel_args* args = grpc_channel_args_copy_and_add( nullptr, args_to_add.data(), args_to_add.size()); @@ -350,7 +353,7 @@ done: void grpc_dns_lookup_ares_continue_after_check_localhost_and_ip_literals_locked( grpc_ares_request* r, const char* dns_server, const char* name, const char* default_port, grpc_pollset_set* interested_parties, - bool check_grpclb, int query_timeout_ms, grpc_core::Combiner* combiner) { + int query_timeout_ms, grpc_core::Combiner* combiner) { grpc_error* error = GRPC_ERROR_NONE; grpc_ares_hostbyname_request* hr = nullptr; ares_channel* channel = nullptr; @@ -425,7 +428,7 @@ void grpc_dns_lookup_ares_continue_after_check_localhost_and_ip_literals_locked( /*is_balancer=*/false); ares_gethostbyname(*channel, hr->host, AF_INET, on_hostbyname_done_locked, hr); - if (check_grpclb) { + if (r->balancer_addresses_out != nullptr) { /* Query the SRV record */ grpc_ares_request_ref_locked(r); char* service_name; @@ -588,7 +591,8 @@ static bool grpc_ares_maybe_resolve_localhost_manually_locked( static grpc_ares_request* grpc_dns_lookup_ares_locked_impl( const char* dns_server, const char* name, const char* default_port, grpc_pollset_set* interested_parties, grpc_closure* on_done, - std::unique_ptr* addrs, bool check_grpclb, + std::unique_ptr* addrs, + std::unique_ptr* balancer_addrs, char** service_config_json, int query_timeout_ms, grpc_core::Combiner* combiner) { grpc_ares_request* r = @@ -596,6 +600,7 @@ static grpc_ares_request* grpc_dns_lookup_ares_locked_impl( r->ev_driver = nullptr; r->on_done = on_done; r->addresses_out = addrs; + r->balancer_addresses_out = balancer_addrs; r->service_config_json_out = service_config_json; r->error = GRPC_ERROR_NONE; r->pending_queries = 0; @@ -618,20 +623,21 @@ static grpc_ares_request* grpc_dns_lookup_ares_locked_impl( // as to cut down on lookups over the network, especially in tests: // https://github.com/grpc/proposal/pull/79 if (target_matches_localhost(name)) { - check_grpclb = false; + r->balancer_addresses_out = nullptr; r->service_config_json_out = nullptr; } // Look up name using c-ares lib. grpc_dns_lookup_ares_continue_after_check_localhost_and_ip_literals_locked( - r, dns_server, name, default_port, interested_parties, check_grpclb, - query_timeout_ms, combiner); + r, dns_server, name, default_port, interested_parties, query_timeout_ms, + combiner); return r; } grpc_ares_request* (*grpc_dns_lookup_ares_locked)( const char* dns_server, const char* name, const char* default_port, grpc_pollset_set* interested_parties, grpc_closure* on_done, - std::unique_ptr* addrs, bool check_grpclb, + std::unique_ptr* addrs, + std::unique_ptr* balancer_addrs, char** service_config_json, int query_timeout_ms, grpc_core::Combiner* combiner) = grpc_dns_lookup_ares_locked_impl; @@ -709,7 +715,6 @@ static void on_dns_lookup_done_locked(void* arg, grpc_error* error) { static_cast(gpr_zalloc( sizeof(grpc_resolved_address) * (*resolved_addresses)->naddrs)); for (size_t i = 0; i < (*resolved_addresses)->naddrs; ++i) { - GPR_ASSERT(!(*r->addresses)[i].IsBalancer()); memcpy(&(*resolved_addresses)->addrs[i], &(*r->addresses)[i].address(), sizeof(grpc_resolved_address)); } @@ -736,9 +741,9 @@ static void grpc_resolve_address_invoke_dns_lookup_ares_locked( grpc_schedule_on_exec_ctx); r->ares_request = grpc_dns_lookup_ares_locked( nullptr /* dns_server */, r->name, r->default_port, r->interested_parties, - &r->on_dns_lookup_done_locked, &r->addresses, false /* check_grpclb */, - nullptr /* service_config_json */, GRPC_DNS_ARES_DEFAULT_QUERY_TIMEOUT_MS, - r->combiner); + &r->on_dns_lookup_done_locked, &r->addresses, + nullptr /* balancer_addresses */, nullptr /* service_config_json */, + GRPC_DNS_ARES_DEFAULT_QUERY_TIMEOUT_MS, r->combiner); } static void grpc_resolve_address_ares_impl(const char* name, diff --git a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h index 115018155b3..bfa888ce9f5 100644 --- a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +++ b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h @@ -63,7 +63,8 @@ extern void (*grpc_resolve_address_ares)(const char* name, extern grpc_ares_request* (*grpc_dns_lookup_ares_locked)( const char* dns_server, const char* name, const char* default_port, grpc_pollset_set* interested_parties, grpc_closure* on_done, - std::unique_ptr* addresses, bool check_grpclb, + std::unique_ptr* addresses, + std::unique_ptr* balancer_addresses, char** service_config_json, int query_timeout_ms, grpc_core::Combiner* combiner); diff --git a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc index fe631f873e9..be880f6c1c2 100644 --- a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc +++ b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc @@ -29,7 +29,8 @@ struct grpc_ares_request { static grpc_ares_request* grpc_dns_lookup_ares_locked_impl( const char* dns_server, const char* name, const char* default_port, grpc_pollset_set* interested_parties, grpc_closure* on_done, - std::unique_ptr* addrs, bool check_grpclb, + std::unique_ptr* addrs, + std::unique_ptr* balancer_addrs, char** service_config_json, int query_timeout_ms, grpc_core::Combiner* combiner) { return NULL; @@ -38,7 +39,8 @@ static grpc_ares_request* grpc_dns_lookup_ares_locked_impl( grpc_ares_request* (*grpc_dns_lookup_ares_locked)( const char* dns_server, const char* name, const char* default_port, grpc_pollset_set* interested_parties, grpc_closure* on_done, - std::unique_ptr* addrs, bool check_grpclb, + std::unique_ptr* addrs, + std::unique_ptr* balancer_addrs, char** service_config_json, int query_timeout_ms, grpc_core::Combiner* combiner) = grpc_dns_lookup_ares_locked_impl; diff --git a/src/core/ext/filters/client_channel/server_address.cc b/src/core/ext/filters/client_channel/server_address.cc index d46896b754b..93d361a8154 100644 --- a/src/core/ext/filters/client_channel/server_address.cc +++ b/src/core/ext/filters/client_channel/server_address.cc @@ -37,15 +37,12 @@ ServerAddress::ServerAddress(const void* address, size_t address_len, address_.len = static_cast(address_len); } -bool ServerAddress::operator==(const ServerAddress& other) const { - return address_.len == other.address_.len && - memcmp(address_.addr, other.address_.addr, address_.len) == 0 && - grpc_channel_args_compare(args_, other.args_) == 0; -} - -bool ServerAddress::IsBalancer() const { - return grpc_channel_arg_get_bool( - grpc_channel_args_find(args_, GRPC_ARG_ADDRESS_IS_BALANCER), false); +int ServerAddress::Cmp(const ServerAddress& other) const { + if (address_.len > other.address_.len) return 1; + if (address_.len < other.address_.len) return -1; + int retval = memcmp(address_.addr, other.address_.addr, address_.len); + if (retval != 0) return retval; + return grpc_channel_args_compare(args_, other.args_); } } // namespace grpc_core diff --git a/src/core/ext/filters/client_channel/server_address.h b/src/core/ext/filters/client_channel/server_address.h index acd71358810..10f49f2f344 100644 --- a/src/core/ext/filters/client_channel/server_address.h +++ b/src/core/ext/filters/client_channel/server_address.h @@ -25,13 +25,6 @@ #include "src/core/lib/gprpp/inlined_vector.h" #include "src/core/lib/iomgr/resolve_address.h" -// Channel arg key for a bool indicating whether an address is a grpclb -// load balancer (as opposed to a backend). -#define GRPC_ARG_ADDRESS_IS_BALANCER "grpc.address_is_balancer" - -// Channel arg key for a string indicating an address's balancer name. -#define GRPC_ARG_ADDRESS_BALANCER_NAME "grpc.address_balancer_name" - namespace grpc_core { // @@ -73,13 +66,13 @@ class ServerAddress { return *this; } - bool operator==(const ServerAddress& other) const; + bool operator==(const ServerAddress& other) const { return Cmp(other) == 0; } + + int Cmp(const ServerAddress& other) const; const grpc_resolved_address& address() const { return address_; } const grpc_channel_args* args() const { return args_; } - bool IsBalancer() const; - private: grpc_resolved_address address_; grpc_channel_args* args_; diff --git a/src/python/grpcio/grpc_core_dependencies.py b/src/python/grpcio/grpc_core_dependencies.py index dd26915d14b..46cce67f77e 100644 --- a/src/python/grpcio/grpc_core_dependencies.py +++ b/src/python/grpcio/grpc_core_dependencies.py @@ -31,6 +31,7 @@ CORE_SOURCE_FILES = [ 'src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc', 'src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc', 'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc', + 'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc', 'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc', 'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc', 'src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc', diff --git a/test/core/client_channel/resolvers/dns_resolver_connectivity_test.cc b/test/core/client_channel/resolvers/dns_resolver_connectivity_test.cc index 56a552ea9ca..2dc86f10291 100644 --- a/test/core/client_channel/resolvers/dns_resolver_connectivity_test.cc +++ b/test/core/client_channel/resolvers/dns_resolver_connectivity_test.cc @@ -64,8 +64,9 @@ static grpc_ares_request* my_dns_lookup_ares_locked( const char* /*dns_server*/, const char* addr, const char* /*default_port*/, grpc_pollset_set* /*interested_parties*/, grpc_closure* on_done, std::unique_ptr* addresses, - bool /*check_grpclb*/, char** /*service_config_json*/, - int /*query_timeout_ms*/, grpc_core::Combiner* /*combiner*/) { + std::unique_ptr* /*balancer_addresses*/, + char** /*service_config_json*/, int /*query_timeout_ms*/, + grpc_core::Combiner* /*combiner*/) { gpr_mu_lock(&g_mu); GPR_ASSERT(0 == strcmp("test", addr)); grpc_error* error = GRPC_ERROR_NONE; diff --git a/test/core/client_channel/resolvers/dns_resolver_cooldown_test.cc b/test/core/client_channel/resolvers/dns_resolver_cooldown_test.cc index 94699bd3b31..14b0d9fe40e 100644 --- a/test/core/client_channel/resolvers/dns_resolver_cooldown_test.cc +++ b/test/core/client_channel/resolvers/dns_resolver_cooldown_test.cc @@ -42,7 +42,8 @@ static grpc_core::Combiner* g_combiner; static grpc_ares_request* (*g_default_dns_lookup_ares_locked)( const char* dns_server, const char* name, const char* default_port, grpc_pollset_set* interested_parties, grpc_closure* on_done, - std::unique_ptr* addresses, bool check_grpclb, + std::unique_ptr* addresses, + std::unique_ptr* balancer_addresses, char** service_config_json, int query_timeout_ms, grpc_core::Combiner* combiner); @@ -93,12 +94,14 @@ static grpc_address_resolver_vtable test_resolver = { static grpc_ares_request* test_dns_lookup_ares_locked( const char* dns_server, const char* name, const char* default_port, grpc_pollset_set* /*interested_parties*/, grpc_closure* on_done, - std::unique_ptr* addresses, bool check_grpclb, + std::unique_ptr* addresses, + std::unique_ptr* balancer_addresses, char** service_config_json, int query_timeout_ms, grpc_core::Combiner* combiner) { grpc_ares_request* result = g_default_dns_lookup_ares_locked( dns_server, name, default_port, g_iomgr_args.pollset_set, on_done, - addresses, check_grpclb, service_config_json, query_timeout_ms, combiner); + addresses, balancer_addresses, service_config_json, query_timeout_ms, + combiner); ++g_resolution_count; static grpc_millis last_resolution_time = 0; grpc_millis now = diff --git a/test/core/client_channel/resolvers/fake_resolver_test.cc b/test/core/client_channel/resolvers/fake_resolver_test.cc index 01d82cbdd05..c9b5828d92e 100644 --- a/test/core/client_channel/resolvers/fake_resolver_test.cc +++ b/test/core/client_channel/resolvers/fake_resolver_test.cc @@ -86,29 +86,18 @@ static grpc_core::Resolver::Result create_new_resolver_result() { static size_t test_counter = 0; const size_t num_addresses = 2; char* uri_string; - char* balancer_name; // Create address list. grpc_core::Resolver::Result result; for (size_t i = 0; i < num_addresses; ++i) { gpr_asprintf(&uri_string, "ipv4:127.0.0.1:100%" PRIuPTR, test_counter * num_addresses + i); grpc_uri* uri = grpc_uri_parse(uri_string, true); - gpr_asprintf(&balancer_name, "balancer%" PRIuPTR, - test_counter * num_addresses + i); grpc_resolved_address address; GPR_ASSERT(grpc_parse_uri(uri, &address)); grpc_core::InlinedVector args_to_add; - const bool is_balancer = num_addresses % 2; - if (is_balancer) { - args_to_add.emplace_back(grpc_channel_arg_integer_create( - const_cast(GRPC_ARG_ADDRESS_IS_BALANCER), 1)); - args_to_add.emplace_back(grpc_channel_arg_string_create( - const_cast(GRPC_ARG_ADDRESS_BALANCER_NAME), balancer_name)); - } - grpc_channel_args* args = grpc_channel_args_copy_and_add( - nullptr, args_to_add.data(), args_to_add.size()); - result.addresses.emplace_back(address.addr, address.len, args); - gpr_free(balancer_name); + result.addresses.emplace_back( + address.addr, address.len, + grpc_channel_args_copy_and_add(nullptr, nullptr, 0)); grpc_uri_destroy(uri); gpr_free(uri_string); } diff --git a/test/core/end2end/goaway_server_test.cc b/test/core/end2end/goaway_server_test.cc index 64603cbc1fc..1ad61154158 100644 --- a/test/core/end2end/goaway_server_test.cc +++ b/test/core/end2end/goaway_server_test.cc @@ -47,7 +47,8 @@ static int g_resolve_port = -1; static grpc_ares_request* (*iomgr_dns_lookup_ares_locked)( const char* dns_server, const char* addr, const char* default_port, grpc_pollset_set* interested_parties, grpc_closure* on_done, - std::unique_ptr* addresses, bool check_grpclb, + std::unique_ptr* addresses, + std::unique_ptr* balancer_addresses, char** service_config_json, int query_timeout_ms, grpc_core::Combiner* combiner); @@ -104,13 +105,14 @@ static grpc_address_resolver_vtable test_resolver = { static grpc_ares_request* my_dns_lookup_ares_locked( const char* dns_server, const char* addr, const char* default_port, grpc_pollset_set* interested_parties, grpc_closure* on_done, - std::unique_ptr* addresses, bool check_grpclb, + std::unique_ptr* addresses, + std::unique_ptr* balancer_addresses, char** service_config_json, int query_timeout_ms, grpc_core::Combiner* combiner) { if (0 != strcmp(addr, "test")) { return iomgr_dns_lookup_ares_locked( dns_server, addr, default_port, interested_parties, on_done, addresses, - check_grpclb, service_config_json, query_timeout_ms, combiner); + balancer_addresses, service_config_json, query_timeout_ms, combiner); } grpc_error* error = GRPC_ERROR_NONE; diff --git a/test/cpp/client/BUILD b/test/cpp/client/BUILD index b895d99724f..011d937bcb8 100644 --- a/test/cpp/client/BUILD +++ b/test/cpp/client/BUILD @@ -34,6 +34,7 @@ grpc_cc_test( grpc_cc_test( name = "client_channel_stress_test", + size = "large", srcs = ["client_channel_stress_test.cc"], # TODO(jtattermusch): test fails frequently on Win RBE, but passes locally # reenable the tests once it works reliably on Win RBE. diff --git a/test/cpp/client/client_channel_stress_test.cc b/test/cpp/client/client_channel_stress_test.cc index 5fcfc11cc4c..8e92d5373ad 100644 --- a/test/cpp/client/client_channel_stress_test.cc +++ b/test/cpp/client/client_channel_stress_test.cc @@ -35,6 +35,7 @@ #include #include +#include "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h" #include "src/core/ext/filters/client_channel/parse_address.h" #include "src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h" #include "src/core/ext/filters/client_channel/server_address.h" @@ -151,7 +152,7 @@ class ClientChannelStressTest { for (const auto& balancer_server : balancer_servers_) { // Select each address with probability of 0.8. if (std::rand() % 10 < 8) { - addresses.emplace_back(AddressData{balancer_server.port_, true, ""}); + addresses.emplace_back(AddressData{balancer_server.port_, ""}); } } std::shuffle(addresses.begin(), addresses.end(), @@ -213,13 +214,12 @@ class ClientChannelStressTest { struct AddressData { int port; - bool is_balancer; grpc::string balancer_name; }; - void SetNextResolution(const std::vector& address_data) { - grpc_core::ExecCtx exec_ctx; - grpc_core::Resolver::Result result; + static grpc_core::ServerAddressList CreateAddressListFromAddressDataList( + const std::vector& address_data) { + grpc_core::ServerAddressList addresses; for (const auto& addr : address_data) { char* lb_uri_str; gpr_asprintf(&lb_uri_str, "ipv4:127.0.0.1:%d", addr.port); @@ -227,20 +227,34 @@ class ClientChannelStressTest { GPR_ASSERT(lb_uri != nullptr); grpc_resolved_address address; GPR_ASSERT(grpc_parse_uri(lb_uri, &address)); - std::vector args_to_add; - if (addr.is_balancer) { - args_to_add.emplace_back(grpc_channel_arg_integer_create( - const_cast(GRPC_ARG_ADDRESS_IS_BALANCER), 1)); - args_to_add.emplace_back(grpc_channel_arg_string_create( - const_cast(GRPC_ARG_ADDRESS_BALANCER_NAME), - const_cast(addr.balancer_name.c_str()))); - } - grpc_channel_args* args = grpc_channel_args_copy_and_add( - nullptr, args_to_add.data(), args_to_add.size()); - result.addresses.emplace_back(address.addr, address.len, args); + grpc_arg arg = + grpc_core::CreateGrpclbBalancerNameArg(addr.balancer_name.c_str()); + grpc_channel_args* args = + grpc_channel_args_copy_and_add(nullptr, &arg, 1); + addresses.emplace_back(address.addr, address.len, args); grpc_uri_destroy(lb_uri); gpr_free(lb_uri_str); } + return addresses; + } + + static grpc_core::Resolver::Result MakeResolverResult( + const std::vector& balancer_address_data) { + grpc_core::Resolver::Result result; + grpc_error* error = GRPC_ERROR_NONE; + result.service_config = grpc_core::ServiceConfig::Create( + "{\"loadBalancingConfig\":[{\"grpclb\":{}}]}", &error); + GPR_ASSERT(error == GRPC_ERROR_NONE); + grpc_core::ServerAddressList balancer_addresses = + CreateAddressListFromAddressDataList(balancer_address_data); + grpc_arg arg = CreateGrpclbBalancerAddressesArg(&balancer_addresses); + result.args = grpc_channel_args_copy_and_add(nullptr, &arg, 1); + return result; + } + + void SetNextResolution(const std::vector& address_data) { + grpc_core::ExecCtx exec_ctx; + grpc_core::Resolver::Result result = MakeResolverResult(address_data); response_generator_->SetResponse(std::move(result)); } diff --git a/test/cpp/client/destroy_grpclb_channel_with_active_connect_stress_test.cc b/test/cpp/client/destroy_grpclb_channel_with_active_connect_stress_test.cc index 7ba76f0da75..d4a942b9870 100644 --- a/test/cpp/client/destroy_grpclb_channel_with_active_connect_stress_test.cc +++ b/test/cpp/client/destroy_grpclb_channel_with_active_connect_stress_test.cc @@ -37,6 +37,7 @@ #include #include +#include "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h" #include "src/core/ext/filters/client_channel/parse_address.h" #include "src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h" #include "src/core/ext/filters/client_channel/server_address.h" @@ -59,24 +60,21 @@ void TryConnectAndDestroy() { // The precise behavior is dependant on the test runtime environment though, // since connect() attempts on this address may unfortunately result in // "network unreachable" errors in some test runtime environments. - char* uri_str; - gpr_asprintf(&uri_str, "ipv6:[0100::1234]:443"); + const char* uri_str = "ipv6:[0100::1234]:443"; grpc_uri* lb_uri = grpc_uri_parse(uri_str, true); - gpr_free(uri_str); - GPR_ASSERT(lb_uri != nullptr); + ASSERT_NE(lb_uri, nullptr); grpc_resolved_address address; - GPR_ASSERT(grpc_parse_uri(lb_uri, &address)); - std::vector address_args_to_add = { - grpc_channel_arg_integer_create( - const_cast(GRPC_ARG_ADDRESS_IS_BALANCER), 1), - }; + ASSERT_TRUE(grpc_parse_uri(lb_uri, &address)); + grpc_uri_destroy(lb_uri); grpc_core::ServerAddressList addresses; - grpc_channel_args* address_args = grpc_channel_args_copy_and_add( - nullptr, address_args_to_add.data(), address_args_to_add.size()); - addresses.emplace_back(address.addr, address.len, address_args); + addresses.emplace_back(address.addr, address.len, nullptr); grpc_core::Resolver::Result lb_address_result; - lb_address_result.addresses = addresses; - grpc_uri_destroy(lb_uri); + grpc_error* error = GRPC_ERROR_NONE; + lb_address_result.service_config = grpc_core::ServiceConfig::Create( + "{\"loadBalancingConfig\":[{\"grpclb\":{}}]}", &error); + ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error); + grpc_arg arg = grpc_core::CreateGrpclbBalancerAddressesArg(&addresses); + lb_address_result.args = grpc_channel_args_copy_and_add(nullptr, &arg, 1); response_generator->SetResponse(lb_address_result); grpc::ChannelArguments args; args.SetPointer(GRPC_ARG_FAKE_RESOLVER_RESPONSE_GENERATOR, @@ -95,9 +93,9 @@ void TryConnectAndDestroy() { // unreachable balancer to begin. The connection should never become ready // because the LB we're trying to connect to is unreachable. channel->GetState(true /* try_to_connect */); - GPR_ASSERT( - !channel->WaitForConnected(grpc_timeout_milliseconds_to_deadline(100))); - GPR_ASSERT("grpclb" == channel->GetLoadBalancingPolicyName()); + ASSERT_FALSE( + channel->WaitForConnected(grpc_timeout_milliseconds_to_deadline(100))); + ASSERT_EQ("grpclb", channel->GetLoadBalancingPolicyName()); channel.reset(); }; diff --git a/test/cpp/end2end/grpclb_end2end_test.cc b/test/cpp/end2end/grpclb_end2end_test.cc index 79969f9c5e3..36c52b9798a 100644 --- a/test/cpp/end2end/grpclb_end2end_test.cc +++ b/test/cpp/end2end/grpclb_end2end_test.cc @@ -35,6 +35,7 @@ #include #include "src/core/ext/filters/client_channel/backup_poller.h" +#include "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h" #include "src/core/ext/filters/client_channel/parse_address.h" #include "src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h" #include "src/core/ext/filters/client_channel/server_address.h" @@ -83,6 +84,13 @@ namespace grpc { namespace testing { namespace { +constexpr char kDefaultServiceConfig[] = + "{\n" + " \"loadBalancingConfig\":[\n" + " { \"grpclb\":{} }\n" + " ]\n" + "}"; + template class CountedService : public ServiceType { public: @@ -514,11 +522,10 @@ class GrpclbEnd2endTest : public ::testing::Test { struct AddressData { int port; - bool is_balancer; grpc::string balancer_name; }; - grpc_core::ServerAddressList CreateLbAddressesFromAddressDataList( + static grpc_core::ServerAddressList CreateLbAddressesFromAddressDataList( const std::vector& address_data) { grpc_core::ServerAddressList addresses; for (const auto& addr : address_data) { @@ -528,16 +535,10 @@ class GrpclbEnd2endTest : public ::testing::Test { GPR_ASSERT(lb_uri != nullptr); grpc_resolved_address address; GPR_ASSERT(grpc_parse_uri(lb_uri, &address)); - std::vector args_to_add; - if (addr.is_balancer) { - args_to_add.emplace_back(grpc_channel_arg_integer_create( - const_cast(GRPC_ARG_ADDRESS_IS_BALANCER), 1)); - args_to_add.emplace_back(grpc_channel_arg_string_create( - const_cast(GRPC_ARG_ADDRESS_BALANCER_NAME), - const_cast(addr.balancer_name.c_str()))); - } - grpc_channel_args* args = grpc_channel_args_copy_and_add( - nullptr, args_to_add.data(), args_to_add.size()); + grpc_arg arg = + grpc_core::CreateGrpclbBalancerNameArg(addr.balancer_name.c_str()); + grpc_channel_args* args = + grpc_channel_args_copy_and_add(nullptr, &arg, 1); addresses.emplace_back(address.addr, address.len, args); grpc_uri_destroy(lb_uri); gpr_free(lb_uri_str); @@ -545,34 +546,50 @@ class GrpclbEnd2endTest : public ::testing::Test { return addresses; } + static grpc_core::Resolver::Result MakeResolverResult( + const std::vector& balancer_address_data, + const std::vector& backend_address_data = {}, + const char* service_config_json = kDefaultServiceConfig) { + grpc_core::Resolver::Result result; + result.addresses = + CreateLbAddressesFromAddressDataList(backend_address_data); + grpc_error* error = GRPC_ERROR_NONE; + result.service_config = + grpc_core::ServiceConfig::Create(service_config_json, &error); + GPR_ASSERT(error == GRPC_ERROR_NONE); + grpc_core::ServerAddressList balancer_addresses = + CreateLbAddressesFromAddressDataList(balancer_address_data); + grpc_arg arg = CreateGrpclbBalancerAddressesArg(&balancer_addresses); + result.args = grpc_channel_args_copy_and_add(nullptr, &arg, 1); + return result; + } + void SetNextResolutionAllBalancers( - const char* service_config_json = nullptr) { + const char* service_config_json = kDefaultServiceConfig) { std::vector addresses; for (size_t i = 0; i < balancers_.size(); ++i) { - addresses.emplace_back(AddressData{balancers_[i]->port_, true, ""}); + addresses.emplace_back(AddressData{balancers_[i]->port_, ""}); } - SetNextResolution(addresses, service_config_json); + SetNextResolution(addresses, {}, service_config_json); } - void SetNextResolution(const std::vector& address_data, - const char* service_config_json = nullptr) { + void SetNextResolution( + const std::vector& balancer_address_data, + const std::vector& backend_address_data = {}, + const char* service_config_json = kDefaultServiceConfig) { grpc_core::ExecCtx exec_ctx; - grpc_core::Resolver::Result result; - result.addresses = CreateLbAddressesFromAddressDataList(address_data); - if (service_config_json != nullptr) { - grpc_error* error = GRPC_ERROR_NONE; - result.service_config = - grpc_core::ServiceConfig::Create(service_config_json, &error); - GRPC_ERROR_UNREF(error); - } + grpc_core::Resolver::Result result = MakeResolverResult( + balancer_address_data, backend_address_data, service_config_json); response_generator_->SetResponse(std::move(result)); } void SetNextReresolutionResponse( - const std::vector& address_data) { + const std::vector& balancer_address_data, + const std::vector& backend_address_data = {}, + const char* service_config_json = kDefaultServiceConfig) { grpc_core::ExecCtx exec_ctx; - grpc_core::Resolver::Result result; - result.addresses = CreateLbAddressesFromAddressDataList(address_data); + grpc_core::Resolver::Result result = MakeResolverResult( + balancer_address_data, backend_address_data, service_config_json); response_generator_->SetReresolutionResponse(std::move(result)); } @@ -747,44 +764,11 @@ TEST_F(SingleBalancerTest, SelectGrpclbWithMigrationServiceConfig) { EXPECT_EQ("grpclb", channel_->GetLoadBalancingPolicyName()); } -TEST_F(SingleBalancerTest, - DoNotSpecialCaseUseGrpclbWithLoadBalancingConfigTest) { - const int kFallbackTimeoutMs = 200 * grpc_test_slowdown_factor(); - ResetStub(kFallbackTimeoutMs); - SetNextResolution({AddressData{backends_[0]->port_, false, ""}, - AddressData{balancers_[0]->port_, true, ""}}, - "{\n" - " \"loadBalancingConfig\":[\n" - " {\"pick_first\":{} }\n" - " ]\n" - "}"); - CheckRpcSendOk(); - // Check LB policy name for the channel. - EXPECT_EQ("pick_first", channel_->GetLoadBalancingPolicyName()); -} - -TEST_F( - SingleBalancerTest, - DoNotSpecialCaseUseGrpclbWithLoadBalancingConfigTestAndNoBackendAddress) { - const int kFallbackTimeoutMs = 200 * grpc_test_slowdown_factor(); - ResetStub(kFallbackTimeoutMs); - SetNextResolution({AddressData{balancers_[0]->port_, true, ""}}, - "{\n" - " \"loadBalancingConfig\":[\n" - " {\"pick_first\":{} }\n" - " ]\n" - "}"); - // This should fail since we do not have a non-balancer backend - CheckRpcSendFailure(); - // Check LB policy name for the channel. - EXPECT_EQ("pick_first", channel_->GetLoadBalancingPolicyName()); -} - TEST_F(SingleBalancerTest, SelectGrpclbWithMigrationServiceConfigAndNoAddresses) { const int kFallbackTimeoutMs = 200 * grpc_test_slowdown_factor(); ResetStub(kFallbackTimeoutMs); - SetNextResolution({}, + SetNextResolution({}, {}, "{\n" " \"loadBalancingConfig\":[\n" " { \"does_not_exist\":{} },\n" @@ -804,23 +788,6 @@ TEST_F(SingleBalancerTest, EXPECT_EQ("grpclb", channel_->GetLoadBalancingPolicyName()); } -TEST_F(SingleBalancerTest, - SelectGrpclbWithMigrationServiceConfigAndNoBalancerAddresses) { - const int kFallbackTimeoutMs = 200 * grpc_test_slowdown_factor(); - ResetStub(kFallbackTimeoutMs); - // Resolution includes fallback address but no balancers. - SetNextResolution({AddressData{backends_[0]->port_, false, ""}}, - "{\n" - " \"loadBalancingConfig\":[\n" - " { \"does_not_exist\":{} },\n" - " { \"grpclb\":{} }\n" - " ]\n" - "}"); - CheckRpcSendOk(1, 1000 /* timeout_ms */, true /* wait_for_ready */); - // Check LB policy name for the channel. - EXPECT_EQ("grpclb", channel_->GetLoadBalancingPolicyName()); -} - TEST_F(SingleBalancerTest, UsePickFirstChildPolicy) { SetNextResolutionAllBalancers( "{\n" @@ -875,7 +842,7 @@ TEST_F(SingleBalancerTest, SwapChildPolicy) { EXPECT_EQ(backends_[i]->service_.request_count(), 0UL); } // Send new resolution that removes child policy from service config. - SetNextResolutionAllBalancers("{}"); + SetNextResolutionAllBalancers(); WaitForAllBackends(); CheckRpcSendOk(kNumRpcs, 1000 /* timeout_ms */, true /* wait_for_ready */); // Check that every backend saw the same number of requests. This verifies @@ -903,9 +870,11 @@ TEST_F(SingleBalancerTest, UpdatesGoToMostRecentChildPolicy) { SetNextResolution( { // Unreachable balancer. - {unreachable_balancer_port, true, ""}, + {unreachable_balancer_port, ""}, + }, + { // Fallback address: first backend. - {backends_[0]->port_, false, ""}, + {backends_[0]->port_, ""}, }, "{\n" " \"loadBalancingConfig\":[\n" @@ -923,9 +892,11 @@ TEST_F(SingleBalancerTest, UpdatesGoToMostRecentChildPolicy) { SetNextResolution( { // Unreachable balancer. - {unreachable_balancer_port, true, ""}, + {unreachable_balancer_port, ""}, + }, + { // Fallback address: unreachable backend. - {unreachable_backend_port, false, ""}, + {unreachable_backend_port, ""}, }, "{\n" " \"loadBalancingConfig\":[\n" @@ -946,10 +917,12 @@ TEST_F(SingleBalancerTest, UpdatesGoToMostRecentChildPolicy) { SetNextResolution( { // Unreachable balancer. - {unreachable_balancer_port, true, ""}, + {unreachable_balancer_port, ""}, + }, + { // Fallback address: second and third backends. - {backends_[1]->port_, false, ""}, - {backends_[2]->port_, false, ""}, + {backends_[1]->port_, ""}, + {backends_[2]->port_, ""}, }, "{\n" " \"loadBalancingConfig\":[\n" @@ -988,7 +961,7 @@ TEST_F(SingleBalancerTest, SameBackendListedMultipleTimes) { TEST_F(SingleBalancerTest, SecureNaming) { ResetStub(0, kApplicationTargetName_ + ";lb"); - SetNextResolution({AddressData{balancers_[0]->port_, true, "lb"}}); + SetNextResolution({AddressData{balancers_[0]->port_, "lb"}}); const size_t kNumRpcsPerAddress = 100; ScheduleResponseForBalancer( 0, BalancerServiceImpl::BuildResponseForBackends(GetBackendPorts(), {}), @@ -1020,7 +993,7 @@ TEST_F(SingleBalancerTest, SecureNamingDeathTest) { ASSERT_DEATH_IF_SUPPORTED( { ResetStub(0, kApplicationTargetName_ + ";lb"); - SetNextResolution({AddressData{balancers_[0]->port_, true, "woops"}}); + SetNextResolution({AddressData{balancers_[0]->port_, "woops"}}); channel_->WaitForConnected(grpc_timeout_seconds_to_deadline(1)); }, ""); @@ -1080,12 +1053,13 @@ TEST_F(SingleBalancerTest, Fallback) { const size_t kNumBackendsInResolution = backends_.size() / 2; ResetStub(kFallbackTimeoutMs); - std::vector addresses; - addresses.emplace_back(AddressData{balancers_[0]->port_, true, ""}); + std::vector balancer_addresses; + balancer_addresses.emplace_back(AddressData{balancers_[0]->port_, ""}); + std::vector backend_addresses; for (size_t i = 0; i < kNumBackendsInResolution; ++i) { - addresses.emplace_back(AddressData{backends_[i]->port_, false, ""}); + backend_addresses.emplace_back(AddressData{backends_[i]->port_, ""}); } - SetNextResolution(addresses); + SetNextResolution(balancer_addresses, backend_addresses); // Send non-empty serverlist only after kServerlistDelayMs. ScheduleResponseForBalancer( @@ -1148,12 +1122,13 @@ TEST_F(SingleBalancerTest, FallbackUpdate) { const size_t kNumBackendsInResolutionUpdate = backends_.size() / 3; ResetStub(kFallbackTimeoutMs); - std::vector addresses; - addresses.emplace_back(AddressData{balancers_[0]->port_, true, ""}); + std::vector balancer_addresses; + balancer_addresses.emplace_back(AddressData{balancers_[0]->port_, ""}); + std::vector backend_addresses; for (size_t i = 0; i < kNumBackendsInResolution; ++i) { - addresses.emplace_back(AddressData{backends_[i]->port_, false, ""}); + backend_addresses.emplace_back(AddressData{backends_[i]->port_, ""}); } - SetNextResolution(addresses); + SetNextResolution(balancer_addresses, backend_addresses); // Send non-empty serverlist only after kServerlistDelayMs. ScheduleResponseForBalancer( @@ -1183,13 +1158,14 @@ TEST_F(SingleBalancerTest, FallbackUpdate) { EXPECT_EQ(0U, backends_[i]->service_.request_count()); } - addresses.clear(); - addresses.emplace_back(AddressData{balancers_[0]->port_, true, ""}); + balancer_addresses.clear(); + balancer_addresses.emplace_back(AddressData{balancers_[0]->port_, ""}); + backend_addresses.clear(); for (size_t i = kNumBackendsInResolution; i < kNumBackendsInResolution + kNumBackendsInResolutionUpdate; ++i) { - addresses.emplace_back(AddressData{backends_[i]->port_, false, ""}); + backend_addresses.emplace_back(AddressData{backends_[i]->port_, ""}); } - SetNextResolution(addresses); + SetNextResolution(balancer_addresses, backend_addresses); // Wait until the resolution update has been processed and all the new // fallback backends are reachable. @@ -1253,14 +1229,15 @@ TEST_F(SingleBalancerTest, // First two backends are fallback, last two are pointed to by balancer. const size_t kNumFallbackBackends = 2; const size_t kNumBalancerBackends = backends_.size() - kNumFallbackBackends; - std::vector addresses; + std::vector backend_addresses; for (size_t i = 0; i < kNumFallbackBackends; ++i) { - addresses.emplace_back(AddressData{backends_[i]->port_, false, ""}); + backend_addresses.emplace_back(AddressData{backends_[i]->port_, ""}); } + std::vector balancer_addresses; for (size_t i = 0; i < balancers_.size(); ++i) { - addresses.emplace_back(AddressData{balancers_[i]->port_, true, ""}); + balancer_addresses.emplace_back(AddressData{balancers_[i]->port_, ""}); } - SetNextResolution(addresses); + SetNextResolution(balancer_addresses, backend_addresses); ScheduleResponseForBalancer(0, BalancerServiceImpl::BuildResponseForBackends( GetBackendPorts(kNumFallbackBackends), {}), @@ -1307,14 +1284,15 @@ TEST_F(SingleBalancerTest, // First two backends are fallback, last two are pointed to by balancer. const size_t kNumFallbackBackends = 2; const size_t kNumBalancerBackends = backends_.size() - kNumFallbackBackends; - std::vector addresses; + std::vector backend_addresses; for (size_t i = 0; i < kNumFallbackBackends; ++i) { - addresses.emplace_back(AddressData{backends_[i]->port_, false, ""}); + backend_addresses.emplace_back(AddressData{backends_[i]->port_, ""}); } + std::vector balancer_addresses; for (size_t i = 0; i < balancers_.size(); ++i) { - addresses.emplace_back(AddressData{balancers_[i]->port_, true, ""}); + balancer_addresses.emplace_back(AddressData{balancers_[i]->port_, ""}); } - SetNextResolution(addresses); + SetNextResolution(balancer_addresses, backend_addresses); ScheduleResponseForBalancer(0, BalancerServiceImpl::BuildResponseForBackends( GetBackendPorts(kNumFallbackBackends), {}), @@ -1358,10 +1336,12 @@ TEST_F(SingleBalancerTest, FallbackEarlyWhenBalancerChannelFails) { const int kFallbackTimeoutMs = 10000 * grpc_test_slowdown_factor(); ResetStub(kFallbackTimeoutMs); // Return an unreachable balancer and one fallback backend. - std::vector addresses; - addresses.emplace_back(AddressData{grpc_pick_unused_port_or_die(), true, ""}); - addresses.emplace_back(AddressData{backends_[0]->port_, false, ""}); - SetNextResolution(addresses); + std::vector balancer_addresses; + balancer_addresses.emplace_back( + AddressData{grpc_pick_unused_port_or_die(), ""}); + std::vector backend_addresses; + backend_addresses.emplace_back(AddressData{backends_[0]->port_, ""}); + SetNextResolution(balancer_addresses, backend_addresses); // Send RPC with deadline less than the fallback timeout and make sure it // succeeds. CheckRpcSendOk(/* times */ 1, /* timeout_ms */ 1000, @@ -1372,10 +1352,11 @@ TEST_F(SingleBalancerTest, FallbackEarlyWhenBalancerCallFails) { const int kFallbackTimeoutMs = 10000 * grpc_test_slowdown_factor(); ResetStub(kFallbackTimeoutMs); // Return one balancer and one fallback backend. - std::vector addresses; - addresses.emplace_back(AddressData{balancers_[0]->port_, true, ""}); - addresses.emplace_back(AddressData{backends_[0]->port_, false, ""}); - SetNextResolution(addresses); + std::vector balancer_addresses; + balancer_addresses.emplace_back(AddressData{balancers_[0]->port_, ""}); + std::vector backend_addresses; + backend_addresses.emplace_back(AddressData{backends_[0]->port_, ""}); + SetNextResolution(balancer_addresses, backend_addresses); // Balancer drops call without sending a serverlist. balancers_[0]->service_.NotifyDoneWithServerlists(); // Send RPC with deadline less than the fallback timeout and make sure it @@ -1388,10 +1369,11 @@ TEST_F(SingleBalancerTest, FallbackControlledByBalancer_BeforeFirstServerlist) { const int kFallbackTimeoutMs = 10000 * grpc_test_slowdown_factor(); ResetStub(kFallbackTimeoutMs); // Return one balancer and one fallback backend. - std::vector addresses; - addresses.emplace_back(AddressData{balancers_[0]->port_, true, ""}); - addresses.emplace_back(AddressData{backends_[0]->port_, false, ""}); - SetNextResolution(addresses); + std::vector balancer_addresses; + balancer_addresses.emplace_back(AddressData{balancers_[0]->port_, ""}); + std::vector backend_addresses; + backend_addresses.emplace_back(AddressData{backends_[0]->port_, ""}); + SetNextResolution(balancer_addresses, backend_addresses); // Balancer explicitly tells client to fallback. LoadBalanceResponse resp; resp.mutable_fallback_response(); @@ -1404,10 +1386,11 @@ TEST_F(SingleBalancerTest, FallbackControlledByBalancer_BeforeFirstServerlist) { TEST_F(SingleBalancerTest, FallbackControlledByBalancer_AfterFirstServerlist) { // Return one balancer and one fallback backend (backend 0). - std::vector addresses; - addresses.emplace_back(AddressData{balancers_[0]->port_, true, ""}); - addresses.emplace_back(AddressData{backends_[0]->port_, false, ""}); - SetNextResolution(addresses); + std::vector balancer_addresses; + balancer_addresses.emplace_back(AddressData{balancers_[0]->port_, ""}); + std::vector backend_addresses; + backend_addresses.emplace_back(AddressData{backends_[0]->port_, ""}); + SetNextResolution(balancer_addresses, backend_addresses); // Balancer initially sends serverlist, then tells client to fall back, // then sends the serverlist again. // The serverlist points to backend 1. @@ -1483,7 +1466,7 @@ TEST_F(UpdatesTest, UpdateBalancersButKeepUsingOriginalBalancer) { EXPECT_EQ(0U, balancers_[2]->service_.response_count()); std::vector addresses; - addresses.emplace_back(AddressData{balancers_[1]->port_, true, ""}); + addresses.emplace_back(AddressData{balancers_[1]->port_, ""}); gpr_log(GPR_INFO, "========= ABOUT TO UPDATE 1 =========="); SetNextResolution(addresses); gpr_log(GPR_INFO, "========= UPDATE 1 DONE =========="); @@ -1542,9 +1525,9 @@ TEST_F(UpdatesTest, UpdateBalancersRepeated) { EXPECT_EQ(0U, balancers_[2]->service_.response_count()); std::vector addresses; - addresses.emplace_back(AddressData{balancers_[0]->port_, true, ""}); - addresses.emplace_back(AddressData{balancers_[1]->port_, true, ""}); - addresses.emplace_back(AddressData{balancers_[2]->port_, true, ""}); + addresses.emplace_back(AddressData{balancers_[0]->port_, ""}); + addresses.emplace_back(AddressData{balancers_[1]->port_, ""}); + addresses.emplace_back(AddressData{balancers_[2]->port_, ""}); gpr_log(GPR_INFO, "========= ABOUT TO UPDATE 1 =========="); SetNextResolution(addresses); gpr_log(GPR_INFO, "========= UPDATE 1 DONE =========="); @@ -1562,8 +1545,8 @@ TEST_F(UpdatesTest, UpdateBalancersRepeated) { balancers_[0]->service_.NotifyDoneWithServerlists(); addresses.clear(); - addresses.emplace_back(AddressData{balancers_[0]->port_, true, ""}); - addresses.emplace_back(AddressData{balancers_[1]->port_, true, ""}); + addresses.emplace_back(AddressData{balancers_[0]->port_, ""}); + addresses.emplace_back(AddressData{balancers_[1]->port_, ""}); gpr_log(GPR_INFO, "========= ABOUT TO UPDATE 2 =========="); SetNextResolution(addresses); gpr_log(GPR_INFO, "========= UPDATE 2 DONE =========="); @@ -1583,7 +1566,7 @@ TEST_F(UpdatesTest, UpdateBalancersRepeated) { TEST_F(UpdatesTest, UpdateBalancersDeadUpdate) { std::vector addresses; - addresses.emplace_back(AddressData{balancers_[0]->port_, true, ""}); + addresses.emplace_back(AddressData{balancers_[0]->port_, ""}); SetNextResolution(addresses); const std::vector first_backend{GetBackendPorts()[0]}; const std::vector second_backend{GetBackendPorts()[1]}; @@ -1623,7 +1606,7 @@ TEST_F(UpdatesTest, UpdateBalancersDeadUpdate) { EXPECT_EQ(0U, balancers_[2]->service_.response_count()); addresses.clear(); - addresses.emplace_back(AddressData{balancers_[1]->port_, true, ""}); + addresses.emplace_back(AddressData{balancers_[1]->port_, ""}); gpr_log(GPR_INFO, "========= ABOUT TO UPDATE 1 =========="); SetNextResolution(addresses); gpr_log(GPR_INFO, "========= UPDATE 1 DONE =========="); @@ -1660,18 +1643,20 @@ TEST_F(UpdatesTest, ReresolveDeadBackend) { ResetStub(500); // The first resolution contains the addresses of a balancer that never // responds, and a fallback backend. - std::vector addresses; - addresses.emplace_back(AddressData{balancers_[0]->port_, true, ""}); - addresses.emplace_back(AddressData{backends_[0]->port_, false, ""}); - SetNextResolution(addresses); + std::vector balancer_addresses; + balancer_addresses.emplace_back(AddressData{balancers_[0]->port_, ""}); + std::vector backend_addresses; + backend_addresses.emplace_back(AddressData{backends_[0]->port_, ""}); + SetNextResolution(balancer_addresses, backend_addresses); // Ask channel to connect to trigger resolver creation. channel_->GetState(true); // The re-resolution result will contain the addresses of the same balancer // and a new fallback backend. - addresses.clear(); - addresses.emplace_back(AddressData{balancers_[0]->port_, true, ""}); - addresses.emplace_back(AddressData{backends_[1]->port_, false, ""}); - SetNextReresolutionResponse(addresses); + balancer_addresses.clear(); + balancer_addresses.emplace_back(AddressData{balancers_[0]->port_, ""}); + backend_addresses.clear(); + backend_addresses.emplace_back(AddressData{backends_[1]->port_, ""}); + SetNextReresolutionResponse(balancer_addresses, backend_addresses); // Start servers and send 10 RPCs per server. gpr_log(GPR_INFO, "========= BEFORE FIRST BATCH =========="); @@ -1720,10 +1705,10 @@ TEST_F(UpdatesWithClientLoadReportingTest, ReresolveDeadBalancer) { // Ask channel to connect to trigger resolver creation. channel_->GetState(true); std::vector addresses; - addresses.emplace_back(AddressData{balancers_[0]->port_, true, ""}); + addresses.emplace_back(AddressData{balancers_[0]->port_, ""}); SetNextResolution(addresses); addresses.clear(); - addresses.emplace_back(AddressData{balancers_[1]->port_, true, ""}); + addresses.emplace_back(AddressData{balancers_[1]->port_, ""}); SetNextReresolutionResponse(addresses); const std::vector first_backend{GetBackendPorts()[0]}; const std::vector second_backend{GetBackendPorts()[1]}; diff --git a/test/cpp/naming/resolver_component_test.cc b/test/cpp/naming/resolver_component_test.cc index b03901b92ee..f323ae0c012 100644 --- a/test/cpp/naming/resolver_component_test.cc +++ b/test/cpp/naming/resolver_component_test.cc @@ -39,6 +39,7 @@ #include "test/cpp/util/test_config.h" #include "src/core/ext/filters/client_channel/client_channel.h" +#include "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h" #include "src/core/ext/filters/client_channel/parse_address.h" #include "src/core/ext/filters/client_channel/resolver.h" #include "src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h" @@ -463,19 +464,20 @@ class CheckingResultHandler : public ResultHandler { void CheckResult(const grpc_core::Resolver::Result& result) override { ArgsStruct* args = args_struct(); - gpr_log(GPR_INFO, "num addrs found: %" PRIdPTR ". expected %" PRIdPTR, - result.addresses.size(), args->expected_addrs.size()); - GPR_ASSERT(result.addresses.size() == args->expected_addrs.size()); std::vector found_lb_addrs; - for (size_t i = 0; i < result.addresses.size(); i++) { - const grpc_core::ServerAddress& addr = result.addresses[i]; - char* str; - grpc_sockaddr_to_string(&str, &addr.address(), 1 /* normalize */); - gpr_log(GPR_INFO, "%s", str); - found_lb_addrs.emplace_back( - GrpcLBAddress(std::string(str), addr.IsBalancer())); - gpr_free(str); + AddActualAddresses(result.addresses, /*is_balancer=*/false, + &found_lb_addrs); + const grpc_core::ServerAddressList* balancer_addresses = + grpc_core::FindGrpclbBalancerAddressesInChannelArgs(*result.args); + if (balancer_addresses != nullptr) { + AddActualAddresses(*balancer_addresses, /*is_balancer=*/true, + &found_lb_addrs); } + gpr_log(GPR_INFO, + "found %" PRIdPTR " backend addresses and %" PRIdPTR + " balancer addresses", + result.addresses.size(), + balancer_addresses == nullptr ? 0L : balancer_addresses->size()); if (args->expected_addrs.size() != found_lb_addrs.size()) { gpr_log(GPR_DEBUG, "found lb addrs size is: %" PRIdPTR @@ -495,6 +497,20 @@ class CheckingResultHandler : public ResultHandler { CheckLBPolicyResultLocked(result.args, args); } } + + private: + static void AddActualAddresses(const grpc_core::ServerAddressList& addresses, + bool is_balancer, + std::vector* out) { + for (size_t i = 0; i < addresses.size(); i++) { + const grpc_core::ServerAddress& addr = addresses[i]; + char* str; + grpc_sockaddr_to_string(&str, &addr.address(), 1 /* normalize */); + gpr_log(GPR_INFO, "%s", str); + out->emplace_back(GrpcLBAddress(std::string(str), is_balancer)); + gpr_free(str); + } + } }; int g_fake_non_responsive_dns_server_port = -1; diff --git a/tools/distrib/check_include_guards.py b/tools/distrib/check_include_guards.py index bc774227fff..2983441176d 100755 --- a/tools/distrib/check_include_guards.py +++ b/tools/distrib/check_include_guards.py @@ -44,7 +44,7 @@ class GuardValidator(object): self.ifndef_re = re.compile(r'#ifndef ([A-Z][A-Z_1-9]*)') self.define_re = re.compile(r'#define ([A-Z][A-Z_1-9]*)') self.endif_c_re = re.compile( - r'#endif /\* ([A-Z][A-Z_1-9]*) (?:\\ *\n *)?\*/') + r'#endif /\* (?: *\\\n *)?([A-Z][A-Z_1-9]*) (?:\\\n *)?\*/$') self.endif_cpp_re = re.compile(r'#endif // ([A-Z][A-Z_1-9]*)') self.failed = False @@ -122,7 +122,7 @@ class GuardValidator(object): # Is there a properly commented #endif? endif_re = self.endif_cpp_re if cpp_header else self.endif_c_re flines = fcontents.rstrip().splitlines() - match = endif_re.search('\n'.join(flines[-2:])) + match = endif_re.search('\n'.join(flines[-3:])) if not match: # No endif. Check if we have the last line as just '#endif' and if so # replace it with a properly commented one. diff --git a/tools/doxygen/Doxyfile.c++.internal b/tools/doxygen/Doxyfile.c++.internal index 5c5d1c9fac5..edbe236dc17 100644 --- a/tools/doxygen/Doxyfile.c++.internal +++ b/tools/doxygen/Doxyfile.c++.internal @@ -1097,6 +1097,8 @@ src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filte src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h \ src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc \ src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h \ +src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc \ +src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h \ src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h \ src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc \ src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc \ diff --git a/tools/doxygen/Doxyfile.core.internal b/tools/doxygen/Doxyfile.core.internal index 20087420e4e..5c03ac61231 100644 --- a/tools/doxygen/Doxyfile.core.internal +++ b/tools/doxygen/Doxyfile.core.internal @@ -894,6 +894,8 @@ src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filte src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h \ src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc \ src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h \ +src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc \ +src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h \ src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h \ src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc \ src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc \ From 03fffe0fcbe3767fbb3ec301960acd34802fb584 Mon Sep 17 00:00:00 2001 From: Vijay Pai Date: Tue, 31 Mar 2020 13:42:32 -0700 Subject: [PATCH 314/758] Document that AddMultipleHolds argument must be positive --- include/grpcpp/impl/codegen/client_callback_impl.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/grpcpp/impl/codegen/client_callback_impl.h b/include/grpcpp/impl/codegen/client_callback_impl.h index 83b183e4a5b..b5adf6b6ea6 100644 --- a/include/grpcpp/impl/codegen/client_callback_impl.h +++ b/include/grpcpp/impl/codegen/client_callback_impl.h @@ -267,6 +267,7 @@ class ClientBidiReactor { /// StartWritesDone that indicates that there will be no more write ops. /// The number of RemoveHold calls must match the total number of AddHold /// calls plus the number of holds added by AddMultipleHolds. + /// The argument to AddMultipleHolds must be positive. void AddHold() { AddMultipleHolds(1); } void AddMultipleHolds(int holds) { stream_->AddHold(holds); } void RemoveHold() { stream_->RemoveHold(); } From df27e42372be77984e575aa121c1a2770e132c2e Mon Sep 17 00:00:00 2001 From: "Mark D. Roth" Date: Tue, 31 Mar 2020 14:18:50 -0700 Subject: [PATCH 315/758] Report RPC failures to LB recv_trailing_metadata callbacks. --- .../filters/client_channel/client_channel.cc | 24 ++++++++++++++- test/cpp/end2end/xds_end2end_test.cc | 29 +++++++++++++------ 2 files changed, 43 insertions(+), 10 deletions(-) diff --git a/src/core/ext/filters/client_channel/client_channel.cc b/src/core/ext/filters/client_channel/client_channel.cc index 0a5759b6012..8de4178f83b 100644 --- a/src/core/ext/filters/client_channel/client_channel.cc +++ b/src/core/ext/filters/client_channel/client_channel.cc @@ -2283,10 +2283,32 @@ void CallData::FreeCachedSendOpDataForCompletedBatch( void CallData::RecvTrailingMetadataReadyForLoadBalancingPolicy( void* arg, grpc_error* error) { CallData* calld = static_cast(arg); + // Set error if call did not succeed. + grpc_error* error_for_lb = GRPC_ERROR_NONE; + if (error != GRPC_ERROR_NONE) { + error_for_lb = error; + } else { + const auto& fields = calld->recv_trailing_metadata_->idx.named; + GPR_ASSERT(fields.grpc_status != nullptr); + grpc_status_code status = + grpc_get_status_code_from_metadata(fields.grpc_status->md); + std::string msg; + if (status != GRPC_STATUS_OK) { + error_for_lb = grpc_error_set_int( + GRPC_ERROR_CREATE_FROM_STATIC_STRING("call failed"), + GRPC_ERROR_INT_GRPC_STATUS, status); + if (fields.grpc_message != nullptr) { + error_for_lb = grpc_error_set_str( + error_for_lb, GRPC_ERROR_STR_GRPC_MESSAGE, + grpc_slice_ref_internal(GRPC_MDVALUE(fields.grpc_message->md))); + } + } + } // Invoke callback to LB policy. Metadata trailing_metadata(calld, calld->recv_trailing_metadata_); - calld->lb_recv_trailing_metadata_ready_(error, &trailing_metadata, + calld->lb_recv_trailing_metadata_ready_(error_for_lb, &trailing_metadata, &calld->lb_call_state_); + if (error == GRPC_ERROR_NONE) GRPC_ERROR_UNREF(error_for_lb); // Chain to original callback. Closure::Run(DEBUG_LOCATION, calld->original_recv_trailing_metadata_ready_, GRPC_ERROR_REF(error)); diff --git a/test/cpp/end2end/xds_end2end_test.cc b/test/cpp/end2end/xds_end2end_test.cc index b168a8badd0..e84692d2812 100644 --- a/test/cpp/end2end/xds_end2end_test.cc +++ b/test/cpp/end2end/xds_end2end_test.cc @@ -1343,11 +1343,15 @@ class XdsEnd2endTest : public ::testing::TestWithParam { } Status SendRpc(EchoResponse* response = nullptr, int timeout_ms = 1000, - bool wait_for_ready = false) { + bool wait_for_ready = false, bool server_fail = false) { const bool local_response = (response == nullptr); if (local_response) response = new EchoResponse; EchoRequest request; request.set_message(kRequestMessage_); + if (server_fail) { + request.mutable_param()->mutable_expected_error()->set_code( + GRPC_STATUS_FAILED_PRECONDITION); + } ClientContext context; context.set_deadline(grpc_timeout_milliseconds_to_deadline(timeout_ms)); if (wait_for_ready) context.set_wait_for_ready(true); @@ -1367,9 +1371,11 @@ class XdsEnd2endTest : public ::testing::TestWithParam { } } - void CheckRpcSendFailure() { - const Status status = SendRpc(); - EXPECT_FALSE(status.ok()); + void CheckRpcSendFailure(const size_t times = 1, bool server_fail = false) { + for (size_t i = 0; i < times; ++i) { + const Status status = SendRpc(nullptr, 1000, false, server_fail); + EXPECT_FALSE(status.ok()); + } } public: @@ -3486,7 +3492,8 @@ class ClientLoadReportingTest : public XdsEnd2endTest { TEST_P(ClientLoadReportingTest, Vanilla) { SetNextResolution({}); SetNextResolutionForLbChannel({balancers_[0]->port()}); - const size_t kNumRpcsPerAddress = 100; + const size_t kNumRpcsPerAddress = 10; + const size_t kNumFailuresPerAddress = 3; // TODO(juanlishen): Partition the backends after multiple localities is // tested. AdsServiceImpl::EdsResourceArgs args({ @@ -3501,9 +3508,11 @@ TEST_P(ClientLoadReportingTest, Vanilla) { std::tie(num_ok, num_failure, num_drops) = WaitForAllBackends(); // Send kNumRpcsPerAddress RPCs per server. CheckRpcSendOk(kNumRpcsPerAddress * num_backends_); - // Each backend should have gotten 100 requests. + CheckRpcSendFailure(kNumFailuresPerAddress * num_backends_, + /*server_fail=*/true); + // Check that each backend got the right number of requests. for (size_t i = 0; i < backends_.size(); ++i) { - EXPECT_EQ(kNumRpcsPerAddress, + EXPECT_EQ(kNumRpcsPerAddress + kNumFailuresPerAddress, backends_[i]->backend_service()->request_count()); } // The LRS service got a single request, and sent a single response. @@ -3517,9 +3526,11 @@ TEST_P(ClientLoadReportingTest, Vanilla) { EXPECT_EQ(kNumRpcsPerAddress * num_backends_ + num_ok, client_stats.total_successful_requests()); EXPECT_EQ(0U, client_stats.total_requests_in_progress()); - EXPECT_EQ(kNumRpcsPerAddress * num_backends_ + num_ok, + EXPECT_EQ((kNumRpcsPerAddress + kNumFailuresPerAddress) * num_backends_ + + num_ok + num_failure, client_stats.total_issued_requests()); - EXPECT_EQ(0U, client_stats.total_error_requests()); + EXPECT_EQ(kNumFailuresPerAddress * num_backends_ + num_failure, + client_stats.total_error_requests()); EXPECT_EQ(0U, client_stats.total_dropped_requests()); } From 397b3ee72e4aa578edbd330b672799e6432071d5 Mon Sep 17 00:00:00 2001 From: Vijay Pai Date: Tue, 31 Mar 2020 16:03:44 -0700 Subject: [PATCH 316/758] Do a debug-check of API use --- .../grpcpp/impl/codegen/client_callback_impl.h | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/include/grpcpp/impl/codegen/client_callback_impl.h b/include/grpcpp/impl/codegen/client_callback_impl.h index b5adf6b6ea6..8e683743e06 100644 --- a/include/grpcpp/impl/codegen/client_callback_impl.h +++ b/include/grpcpp/impl/codegen/client_callback_impl.h @@ -269,7 +269,10 @@ class ClientBidiReactor { /// calls plus the number of holds added by AddMultipleHolds. /// The argument to AddMultipleHolds must be positive. void AddHold() { AddMultipleHolds(1); } - void AddMultipleHolds(int holds) { stream_->AddHold(holds); } + void AddMultipleHolds(int holds) { + GPR_CODEGEN_DEBUG_ASSERT(holds > 0); + stream_->AddHold(holds); + } void RemoveHold() { stream_->RemoveHold(); } /// Notifies the application that all operations associated with this RPC @@ -332,7 +335,10 @@ class ClientReadReactor { void StartRead(Response* resp) { reader_->Read(resp); } void AddHold() { AddMultipleHolds(1); } - void AddMultipleHolds(int holds) { reader_->AddHold(holds); } + void AddMultipleHolds(int holds) { + GPR_CODEGEN_DEBUG_ASSERT(holds > 0); + reader_->AddHold(holds); + } void RemoveHold() { reader_->RemoveHold(); } virtual void OnDone(const ::grpc::Status& /*s*/) {} @@ -365,7 +371,10 @@ class ClientWriteReactor { void StartWritesDone() { writer_->WritesDone(); } void AddHold() { AddMultipleHolds(1); } - void AddMultipleHolds(int holds) { writer_->AddHold(holds); } + void AddMultipleHolds(int holds) { + GPR_CODEGEN_DEBUG_ASSERT(holds > 0); + writer_->AddHold(holds); + } void RemoveHold() { writer_->RemoveHold(); } virtual void OnDone(const ::grpc::Status& /*s*/) {} From aec6be5ec9a11380c50f03b9f5938238e2337a75 Mon Sep 17 00:00:00 2001 From: Alexander Polcyn Date: Tue, 31 Mar 2020 17:01:49 -0700 Subject: [PATCH 317/758] Include request object in c-ares address sorting trace logs --- .../resolver/dns/c_ares/grpc_ares_wrapper.cc | 40 +++++++++++-------- .../naming/resolver_component_tests_runner.py | 2 +- 2 files changed, 25 insertions(+), 17 deletions(-) diff --git a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc index 761bed9a82d..3a3cb3cc367 100644 --- a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +++ b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc @@ -84,25 +84,32 @@ typedef struct grpc_ares_hostbyname_request { bool is_balancer; } grpc_ares_hostbyname_request; -static void log_address_sorting_list(const ServerAddressList& addresses, +static void log_address_sorting_list(const grpc_ares_request* r, + const ServerAddressList& addresses, const char* input_output_str) { for (size_t i = 0; i < addresses.size(); i++) { char* addr_str; if (grpc_sockaddr_to_string(&addr_str, &addresses[i].address(), true)) { - gpr_log(GPR_INFO, "c-ares address sorting: %s[%" PRIuPTR "]=%s", - input_output_str, i, addr_str); + gpr_log( + GPR_INFO, + "(c-ares resolver) request:%p c-ares address sorting: %s[%" PRIuPTR + "]=%s", + r, input_output_str, i, addr_str); gpr_free(addr_str); } else { - gpr_log(GPR_INFO, - "c-ares address sorting: %s[%" PRIuPTR "]=", - input_output_str, i); + gpr_log( + GPR_INFO, + "(c-ares resolver) request:%p c-ares address sorting: %s[%" PRIuPTR + "]=", + r, input_output_str, i); } } } -void grpc_cares_wrapper_address_sorting_sort(ServerAddressList* addresses) { +void grpc_cares_wrapper_address_sorting_sort(const grpc_ares_request* r, + ServerAddressList* addresses) { if (GRPC_TRACE_FLAG_ENABLED(grpc_trace_cares_address_sorting)) { - log_address_sorting_list(*addresses, "input"); + log_address_sorting_list(r, *addresses, "input"); } address_sorting_sortable* sortables = (address_sorting_sortable*)gpr_zalloc( sizeof(address_sorting_sortable) * addresses->size()); @@ -121,7 +128,7 @@ void grpc_cares_wrapper_address_sorting_sort(ServerAddressList* addresses) { gpr_free(sortables); *addresses = std::move(sorted); if (GRPC_TRACE_FLAG_ENABLED(grpc_trace_cares_address_sorting)) { - log_address_sorting_list(*addresses, "output"); + log_address_sorting_list(r, *addresses, "output"); } } @@ -142,7 +149,7 @@ void grpc_ares_complete_request_locked(grpc_ares_request* r) { r->ev_driver = nullptr; ServerAddressList* addresses = r->addresses_out->get(); if (addresses != nullptr) { - grpc_cares_wrapper_address_sorting_sort(addresses); + grpc_cares_wrapper_address_sorting_sort(r, addresses); GRPC_ERROR_UNREF(r->error); r->error = GRPC_ERROR_NONE; // TODO(apolcyn): allow c-ares to return a service config @@ -520,7 +527,7 @@ static bool target_matches_localhost(const char* name) { #ifdef GRPC_ARES_RESOLVE_LOCALHOST_MANUALLY static bool inner_maybe_resolve_localhost_manually_locked( - const char* name, const char* default_port, + const grpc_ares_request* r, const char* name, const char* default_port, std::unique_ptr* addrs, grpc_core::UniquePtr* host, grpc_core::UniquePtr* port) { grpc_core::SplitHostPort(name, host, port); @@ -563,23 +570,24 @@ static bool inner_maybe_resolve_localhost_manually_locked( (*addrs)->emplace_back(&ipv4_loopback_addr, sizeof(ipv4_loopback_addr), nullptr /* args */); // Let the address sorter figure out which one should be tried first. - grpc_cares_wrapper_address_sorting_sort(addrs->get()); + grpc_cares_wrapper_address_sorting_sort(r, addrs->get()); return true; } return false; } static bool grpc_ares_maybe_resolve_localhost_manually_locked( - const char* name, const char* default_port, + const grpc_ares_request* r, const char* name, const char* default_port, std::unique_ptr* addrs) { grpc_core::UniquePtr host; grpc_core::UniquePtr port; - return inner_maybe_resolve_localhost_manually_locked(name, default_port, + return inner_maybe_resolve_localhost_manually_locked(r, name, default_port, addrs, &host, &port); } #else /* GRPC_ARES_RESOLVE_LOCALHOST_MANUALLY */ static bool grpc_ares_maybe_resolve_localhost_manually_locked( - const char* /*name*/, const char* /*default_port*/, + const grpc_ares_request* r, const char* /*name*/, + const char* /*default_port*/, std::unique_ptr* /*addrs*/) { return false; } @@ -609,7 +617,7 @@ static grpc_ares_request* grpc_dns_lookup_ares_locked_impl( return r; } // Early out if the target is localhost and we're on Windows. - if (grpc_ares_maybe_resolve_localhost_manually_locked(name, default_port, + if (grpc_ares_maybe_resolve_localhost_manually_locked(r, name, default_port, addrs)) { grpc_ares_complete_request_locked(r); return r; diff --git a/test/cpp/naming/resolver_component_tests_runner.py b/test/cpp/naming/resolver_component_tests_runner.py index 274c9a1b345..e5ff9cd294a 100755 --- a/test/cpp/naming/resolver_component_tests_runner.py +++ b/test/cpp/naming/resolver_component_tests_runner.py @@ -55,7 +55,7 @@ if cur_resolver and cur_resolver != 'ares': 'needs to use GRPC_DNS_RESOLVER=ares.')) test_runner_log('Exit 1 without running tests.') sys.exit(1) -os.environ.update({'GRPC_TRACE': 'cares_resolver'}) +os.environ.update({'GRPC_TRACE': 'cares_resolver,cares_address_sorting'}) def wait_until_dns_server_is_up(args, dns_server_subprocess, From 8db85b3e079d4df38bb8155bc75ec9129a5752e4 Mon Sep 17 00:00:00 2001 From: Eric Gribkoff Date: Tue, 31 Mar 2020 19:16:37 -0700 Subject: [PATCH 318/758] Add --path_to_server_binary arg for prebuilt images --- tools/run_tests/run_xds_tests.py | 51 +++++++++++++++++++++----------- 1 file changed, 33 insertions(+), 18 deletions(-) diff --git a/tools/run_tests/run_xds_tests.py b/tools/run_tests/run_xds_tests.py index 3f9fab3c806..c770f17d735 100755 --- a/tools/run_tests/run_xds_tests.py +++ b/tools/run_tests/run_xds_tests.py @@ -142,6 +142,11 @@ argp.add_argument('--xds_server', argp.add_argument('--source_image', default='projects/debian-cloud/global/images/family/debian-9', help='Source image for VMs created during the test') +argp.add_argument('--path_to_server_binary', + default=None, + type=str, + help='If set, the server binary must already be pre-built on ' + 'the specified source image') argp.add_argument('--machine_type', default='e2-standard-2', help='Machine type for VMs created during the test') @@ -473,7 +478,27 @@ def test_secondary_locality_gets_requests_on_primary_failure( patch_backend_instances(gcp, backend_service, [primary_instance_group]) -def create_instance_template(gcp, name, network, source_image, machine_type): +def get_startup_script(path_to_server_binary, service_port): + if path_to_server_binary: + return "nohup %s --port=%d 1>/dev/null &" % (path_to_server_binary, + service_port) + else: + return """#!/bin/bash +sudo apt update +sudo apt install -y git default-jdk +mkdir java_server +pushd java_server +git clone https://github.com/grpc/grpc-java.git +pushd grpc-java +pushd interop-testing +../gradlew installDist -x test -PskipCodegen=true -PskipAndroid=true + +nohup build/install/grpc-interop-testing/bin/xds-test-server \ + --port=%d 1>/dev/null &""" % service_port + + +def create_instance_template(gcp, name, network, source_image, machine_type, + startup_script): config = { 'name': name, 'properties': { @@ -499,21 +524,8 @@ def create_instance_template(gcp, name, network, source_image, machine_type): }], 'metadata': { 'items': [{ - 'key': - 'startup-script', - 'value': - """#!/bin/bash -sudo apt update -sudo apt install -y git default-jdk -mkdir java_server -pushd java_server -git clone https://github.com/grpc/grpc-java.git -pushd grpc-java -pushd interop-testing -../gradlew installDist -x test -PskipCodegen=true -PskipAndroid=true - -nohup build/install/grpc-interop-testing/bin/xds-test-server --port=%d 1>/dev/null &""" - % gcp.service_port + 'key': 'startup-script', + 'value': startup_script }] } } @@ -949,7 +961,7 @@ try: service_host_name = _BASE_SERVICE_HOST + args.gcp_suffix target_http_proxy_name = _BASE_TARGET_PROXY_NAME + args.gcp_suffix forwarding_rule_name = _BASE_FORWARDING_RULE_NAME + args.gcp_suffix - template_name = _BASE_TARGET_PROXY_NAME + args.gcp_suffix + template_name = _BASE_TEMPLATE_NAME + args.gcp_suffix instance_group_name = _BASE_INSTANCE_GROUP_NAME + args.gcp_suffix same_zone_instance_group_name = _BASE_INSTANCE_GROUP_NAME + '-same-zone' + args.gcp_suffix if _USE_SECONDARY_IG: @@ -986,8 +998,11 @@ try: if not gcp.service_port: raise Exception( 'Failed to find a valid ip:port for the forwarding rule') + startup_script = get_startup_script(args.path_to_server_binary, + gcp.service_port) create_instance_template(gcp, template_name, args.network, - args.source_image, args.machine_type) + args.source_image, args.machine_type, + startup_script) instance_group = add_instance_group(gcp, args.zone, instance_group_name, _INSTANCE_GROUP_SIZE) patch_backend_instances(gcp, backend_service, [instance_group]) From 30e078f122d8375faa5401b0469c05a96cfd0168 Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Wed, 1 Apr 2020 10:11:26 +0200 Subject: [PATCH 319/758] Improve bazel RBE documentation --- tools/remote_build/README.md | 33 +++++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/tools/remote_build/README.md b/tools/remote_build/README.md index 2d1a629b0eb..849ceb4fec3 100644 --- a/tools/remote_build/README.md +++ b/tools/remote_build/README.md @@ -17,30 +17,55 @@ and tests run by Kokoro CI. ## Running remote build manually from dev workstation -Run from repository root (opt, dbg): +IMPORTANT: The OS from which you run the bazel command needs to always match your desired build & execution platform. If you want to run tests on linux, you need to run bazel from a linux machine, to execute tests on windows you need to be on windows etc. If you don't follow this guideline, the build might still appear like it's working, but you'll get nonsensical results (e.g. will be test configured as if on mac, but actually running on linux). + +### Linux + +For `opt` or `dbg` run this command: ``` # manual run of bazel tests remotely on Foundry bazel --bazelrc=tools/remote_build/manual.bazelrc test --config=opt //test/... ``` -Sanitizer runs (asan, msan, tsan, ubsan): +This also works for sanitizer runs (`asan`, `msan`, `tsan`, `ubsan`): ``` # manual run of bazel tests remotely on Foundry with given sanitizer bazel --bazelrc=tools/remote_build/manual.bazelrc test --config=asan //test/... ``` -Run on Windows MSVC: +### Windows + ``` # manual run of bazel tests remotely on RBE Windows (must be run from Windows machine) bazel --bazelrc=tools/remote_build/windows.bazelrc test --config=windows_opt //test/... ``` -Run on MacOS (experimental for now): +NOTE: Unlike on Linux and Mac, the bazel version won't get autoselected for you, +so check that you're using the [right bazel version](https://github.com/grpc/grpc/blob/master/tools/bazel). + +### MacOS + +There is no such thing as Mac RBE cluster, so a real remote build on Macs is currently impossible. +The following setup will build and run test on you local mac machine, but will give +you the RBE-like look & feel (e.g. a results link will be generated and some extra configuration will +be used). + ``` # manual run of bazel tests on Mac (must be run from Mac machine) # NOTE: it's not really a "remote execution", but uploads results to ResultStore bazel --bazelrc=tools/remote_build/mac.bazelrc test --config=opt //test/... ``` +NOTE: Because this is essentially a local run, you'll need to run start port server first (`tools/run_tests/start_port_server.py`) + +## Running local builds with bazel + +On all platforms, you can generally still use bazel builds & tests locally without any extra settings, but you might need to +start port server first (`tools/run_tests/start_port_server.py`) to be able to run the tests locally. + +E.g.: `bazel test --config=opt //test/...` + +## Bazel command line options + Available command line options can be found in [Bazel command line reference](https://docs.bazel.build/versions/master/command-line-reference.html) From dcdd04fcaa486271d3452f45e754743ec4f70654 Mon Sep 17 00:00:00 2001 From: "Mark D. Roth" Date: Wed, 1 Apr 2020 07:49:52 -0700 Subject: [PATCH 320/758] Fix flakiness in grpclb_end2end_test ReresolveDeadBalancer test case. --- test/cpp/end2end/grpclb_end2end_test.cc | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/test/cpp/end2end/grpclb_end2end_test.cc b/test/cpp/end2end/grpclb_end2end_test.cc index 79969f9c5e3..56a7bdada5b 100644 --- a/test/cpp/end2end/grpclb_end2end_test.cc +++ b/test/cpp/end2end/grpclb_end2end_test.cc @@ -1717,6 +1717,13 @@ class UpdatesWithClientLoadReportingTest : public GrpclbEnd2endTest { }; TEST_F(UpdatesWithClientLoadReportingTest, ReresolveDeadBalancer) { + const std::vector first_backend{GetBackendPorts()[0]}; + const std::vector second_backend{GetBackendPorts()[1]}; + ScheduleResponseForBalancer( + 0, BalancerServiceImpl::BuildResponseForBackends(first_backend, {}), 0); + ScheduleResponseForBalancer( + 1, BalancerServiceImpl::BuildResponseForBackends(second_backend, {}), 0); + // Ask channel to connect to trigger resolver creation. channel_->GetState(true); std::vector addresses; @@ -1725,13 +1732,6 @@ TEST_F(UpdatesWithClientLoadReportingTest, ReresolveDeadBalancer) { addresses.clear(); addresses.emplace_back(AddressData{balancers_[1]->port_, true, ""}); SetNextReresolutionResponse(addresses); - const std::vector first_backend{GetBackendPorts()[0]}; - const std::vector second_backend{GetBackendPorts()[1]}; - - ScheduleResponseForBalancer( - 0, BalancerServiceImpl::BuildResponseForBackends(first_backend, {}), 0); - ScheduleResponseForBalancer( - 1, BalancerServiceImpl::BuildResponseForBackends(second_backend, {}), 0); // Start servers and send 10 RPCs per server. gpr_log(GPR_INFO, "========= BEFORE FIRST BATCH =========="); From bac25901d7125f30092fd63aba95ca9675654875 Mon Sep 17 00:00:00 2001 From: "Mark D. Roth" Date: Wed, 1 Apr 2020 08:28:46 -0700 Subject: [PATCH 321/758] Fix flakiness in grpclb SingleBalancerWithClientLoadReportingTest.Vanilla test. --- test/cpp/end2end/grpclb_end2end_test.cc | 56 +++++++++++++++---------- 1 file changed, 34 insertions(+), 22 deletions(-) diff --git a/test/cpp/end2end/grpclb_end2end_test.cc b/test/cpp/end2end/grpclb_end2end_test.cc index 79969f9c5e3..5e42c5ee017 100644 --- a/test/cpp/end2end/grpclb_end2end_test.cc +++ b/test/cpp/end2end/grpclb_end2end_test.cc @@ -16,6 +16,7 @@ * */ +#include #include #include #include @@ -253,30 +254,31 @@ class BalancerServiceImpl : public BalancerService { if (client_load_reporting_interval_seconds_ > 0) { request.Clear(); - if (stream->Read(&request)) { + while (stream->Read(&request)) { gpr_log(GPR_INFO, "LB[%p]: received client load report message '%s'", this, request.DebugString().c_str()); GPR_ASSERT(request.has_client_stats()); - // We need to acquire the lock here in order to prevent the notify_one - // below from firing before its corresponding wait is executed. - grpc::internal::MutexLock lock(&mu_); - client_stats_.num_calls_started += + ClientStats load_report; + load_report.num_calls_started = request.client_stats().num_calls_started(); - client_stats_.num_calls_finished += + load_report.num_calls_finished = request.client_stats().num_calls_finished(); - client_stats_.num_calls_finished_with_client_failed_to_send += + load_report.num_calls_finished_with_client_failed_to_send = request.client_stats() .num_calls_finished_with_client_failed_to_send(); - client_stats_.num_calls_finished_known_received += + load_report.num_calls_finished_known_received = request.client_stats().num_calls_finished_known_received(); for (const auto& drop_token_count : request.client_stats().calls_finished_with_drop()) { - client_stats_ - .drop_token_counts[drop_token_count.load_balance_token()] += + load_report + .drop_token_counts[drop_token_count.load_balance_token()] = drop_token_count.num_calls(); } - load_report_ready_ = true; - load_report_cond_.Signal(); + // We need to acquire the lock here in order to prevent the notify_one + // below from firing before its corresponding wait is executed. + grpc::internal::MutexLock lock(&mu_); + load_report_queue_.emplace_back(std::move(load_report)); + if (load_report_cond_ != nullptr) load_report_cond_->Signal(); } } } @@ -293,9 +295,8 @@ class BalancerServiceImpl : public BalancerService { void Start() { grpc::internal::MutexLock lock(&mu_); serverlist_done_ = false; - load_report_ready_ = false; responses_and_delays_.clear(); - client_stats_.Reset(); + load_report_queue_.clear(); } void Shutdown() { @@ -327,11 +328,18 @@ class BalancerServiceImpl : public BalancerService { return response; } - const ClientStats& WaitForLoadReport() { + ClientStats WaitForLoadReport() { grpc::internal::MutexLock lock(&mu_); - load_report_cond_.WaitUntil(&mu_, [this] { return load_report_ready_; }); - load_report_ready_ = false; - return client_stats_; + grpc::internal::CondVar cv; + if (load_report_queue_.empty()) { + load_report_cond_ = &cv; + load_report_cond_->WaitUntil( + &mu_, [this] { return !load_report_queue_.empty(); }); + load_report_cond_ = nullptr; + } + ClientStats load_report = std::move(load_report_queue_.front()); + load_report_queue_.pop_front(); + return load_report; } void NotifyDoneWithServerlists() { @@ -357,12 +365,12 @@ class BalancerServiceImpl : public BalancerService { const int client_load_reporting_interval_seconds_; std::vector responses_and_delays_; + grpc::internal::Mutex mu_; - grpc::internal::CondVar load_report_cond_; - bool load_report_ready_ = false; grpc::internal::CondVar serverlist_cond_; bool serverlist_done_ = false; - ClientStats client_stats_; + grpc::internal::CondVar* load_report_cond_ = nullptr; + std::deque load_report_queue_; }; class GrpclbEnd2endTest : public ::testing::Test { @@ -1900,7 +1908,11 @@ TEST_F(SingleBalancerWithClientLoadReportingTest, Vanilla) { // and sent a single response. EXPECT_EQ(1U, balancers_[0]->service_.response_count()); - const ClientStats client_stats = WaitForLoadReports(); + ClientStats client_stats; + do { + client_stats += WaitForLoadReports(); + } while (client_stats.num_calls_finished != + kNumRpcsPerAddress * num_backends_ + num_ok); EXPECT_EQ(kNumRpcsPerAddress * num_backends_ + num_ok, client_stats.num_calls_started); EXPECT_EQ(kNumRpcsPerAddress * num_backends_ + num_ok, From a8d8f9db8cb09f4f199a0f3a8a85d75a0fd3f6fd Mon Sep 17 00:00:00 2001 From: Alexander Polcyn Date: Wed, 1 Apr 2020 10:53:51 -0700 Subject: [PATCH 322/758] update template --- templates/test/cpp/naming/resolver_component_tests_defs.include | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/test/cpp/naming/resolver_component_tests_defs.include b/templates/test/cpp/naming/resolver_component_tests_defs.include index d38316cbe68..8be5ba21bbd 100644 --- a/templates/test/cpp/naming/resolver_component_tests_defs.include +++ b/templates/test/cpp/naming/resolver_component_tests_defs.include @@ -55,7 +55,7 @@ if cur_resolver and cur_resolver != 'ares': 'needs to use GRPC_DNS_RESOLVER=ares.')) test_runner_log('Exit 1 without running tests.') sys.exit(1) -os.environ.update({'GRPC_TRACE': 'cares_resolver'}) +os.environ.update({'GRPC_TRACE': 'cares_resolver,cares_address_sorting'}) def wait_until_dns_server_is_up(args, dns_server_subprocess, From 292c07b432f77bf66993b5166f55aa7cbd2b48a2 Mon Sep 17 00:00:00 2001 From: Alexander Polcyn Date: Wed, 1 Apr 2020 11:03:22 -0700 Subject: [PATCH 323/758] Fix link error in address sorting test --- .../resolver/dns/c_ares/grpc_ares_wrapper.h | 2 +- test/cpp/naming/address_sorting_test.cc | 52 +++++++++---------- 2 files changed, 27 insertions(+), 27 deletions(-) diff --git a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h index 115018155b3..78333e0def5 100644 --- a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +++ b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h @@ -89,7 +89,7 @@ bool grpc_ares_query_ipv6(); /* Sorts destinations in lb_addrs according to RFC 6724. */ void grpc_cares_wrapper_address_sorting_sort( - grpc_core::ServerAddressList* addresses); + const grpc_ares_request* request, grpc_core::ServerAddressList* addresses); #endif /* GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_RESOLVER_DNS_C_ARES_GRPC_ARES_WRAPPER_H \ */ diff --git a/test/cpp/naming/address_sorting_test.cc b/test/cpp/naming/address_sorting_test.cc index c04ac4d83ba..dd49a2c92e5 100644 --- a/test/cpp/naming/address_sorting_test.cc +++ b/test/cpp/naming/address_sorting_test.cc @@ -212,7 +212,7 @@ TEST_F(AddressSortingTest, TestDepriotizesUnreachableAddresses) { {"1.2.3.4:443", AF_INET}, {"5.6.7.8:443", AF_INET}, }); - grpc_cares_wrapper_address_sorting_sort(&lb_addrs); + grpc_cares_wrapper_address_sorting_sort(nullptr, &lb_addrs); VerifyLbAddrOutputs(lb_addrs, { "1.2.3.4:443", "5.6.7.8:443", @@ -231,7 +231,7 @@ TEST_F(AddressSortingTest, TestDepriotizesUnsupportedDomainIpv6) { {"[2607:f8b0:400a:801::1002]:443", AF_INET6}, {"1.2.3.4:443", AF_INET}, }); - grpc_cares_wrapper_address_sorting_sort(&lb_addrs); + grpc_cares_wrapper_address_sorting_sort(nullptr, &lb_addrs); VerifyLbAddrOutputs(lb_addrs, { "1.2.3.4:443", "[2607:f8b0:400a:801::1002]:443", @@ -251,7 +251,7 @@ TEST_F(AddressSortingTest, TestDepriotizesUnsupportedDomainIpv4) { {"[2607:f8b0:400a:801::1002]:443", AF_INET6}, {"1.2.3.4:443", AF_INET}, }); - grpc_cares_wrapper_address_sorting_sort(&lb_addrs); + grpc_cares_wrapper_address_sorting_sort(nullptr, &lb_addrs); VerifyLbAddrOutputs(lb_addrs, { "[2607:f8b0:400a:801::1002]:443", "1.2.3.4:443", @@ -275,7 +275,7 @@ TEST_F(AddressSortingTest, TestDepriotizesNonMatchingScope) { {"[2000:f8b0:400a:801::1002]:443", AF_INET6}, {"[fec0::5000]:443", AF_INET6}, }); - grpc_cares_wrapper_address_sorting_sort(&lb_addrs); + grpc_cares_wrapper_address_sorting_sort(nullptr, &lb_addrs); VerifyLbAddrOutputs(lb_addrs, { "[fec0::5000]:443", "[2000:f8b0:400a:801::1002]:443", @@ -298,7 +298,7 @@ TEST_F(AddressSortingTest, TestUsesLabelFromDefaultTable) { {"[2002::5001]:443", AF_INET6}, {"[2001::5001]:443", AF_INET6}, }); - grpc_cares_wrapper_address_sorting_sort(&lb_addrs); + grpc_cares_wrapper_address_sorting_sort(nullptr, &lb_addrs); VerifyLbAddrOutputs(lb_addrs, { "[2001::5001]:443", "[2002::5001]:443", @@ -321,7 +321,7 @@ TEST_F(AddressSortingTest, TestUsesLabelFromDefaultTableInputFlipped) { {"[2001::5001]:443", AF_INET6}, {"[2002::5001]:443", AF_INET6}, }); - grpc_cares_wrapper_address_sorting_sort(&lb_addrs); + grpc_cares_wrapper_address_sorting_sort(nullptr, &lb_addrs); VerifyLbAddrOutputs(lb_addrs, { "[2001::5001]:443", "[2002::5001]:443", @@ -344,7 +344,7 @@ TEST_F(AddressSortingTest, {"[3ffe::5001]:443", AF_INET6}, {"1.2.3.4:443", AF_INET}, }); - grpc_cares_wrapper_address_sorting_sort(&lb_addrs); + grpc_cares_wrapper_address_sorting_sort(nullptr, &lb_addrs); VerifyLbAddrOutputs( lb_addrs, { // The AF_INET address should be IPv4-mapped by the sort, @@ -377,7 +377,7 @@ TEST_F(AddressSortingTest, {v4_compat_dest, AF_INET6}, {"[::1]:443", AF_INET6}, }); - grpc_cares_wrapper_address_sorting_sort(&lb_addrs); + grpc_cares_wrapper_address_sorting_sort(nullptr, &lb_addrs); VerifyLbAddrOutputs(lb_addrs, { "[::1]:443", v4_compat_dest, @@ -400,7 +400,7 @@ TEST_F(AddressSortingTest, {"[1234::2]:443", AF_INET6}, {"[::1]:443", AF_INET6}, }); - grpc_cares_wrapper_address_sorting_sort(&lb_addrs); + grpc_cares_wrapper_address_sorting_sort(nullptr, &lb_addrs); VerifyLbAddrOutputs( lb_addrs, { @@ -424,7 +424,7 @@ TEST_F(AddressSortingTest, {"[2001::1234]:443", AF_INET6}, {"[2000::5001]:443", AF_INET6}, }); - grpc_cares_wrapper_address_sorting_sort(&lb_addrs); + grpc_cares_wrapper_address_sorting_sort(nullptr, &lb_addrs); VerifyLbAddrOutputs( lb_addrs, { // The 2000::/16 address should match the ::/0 prefix rule @@ -448,7 +448,7 @@ TEST_F( {"[2001::1231]:443", AF_INET6}, {"[2000::5001]:443", AF_INET6}, }); - grpc_cares_wrapper_address_sorting_sort(&lb_addrs); + grpc_cares_wrapper_address_sorting_sort(nullptr, &lb_addrs); VerifyLbAddrOutputs(lb_addrs, { "[2000::5001]:443", "[2001::1231]:443", @@ -469,7 +469,7 @@ TEST_F(AddressSortingTest, {"[fec0::1234]:443", AF_INET6}, {"[fc00::5001]:443", AF_INET6}, }); - grpc_cares_wrapper_address_sorting_sort(&lb_addrs); + grpc_cares_wrapper_address_sorting_sort(nullptr, &lb_addrs); VerifyLbAddrOutputs(lb_addrs, { "[fc00::5001]:443", "[fec0::1234]:443", @@ -494,7 +494,7 @@ TEST_F( {"[::ffff:1.1.1.2]:443", AF_INET6}, {"[1234::2]:443", AF_INET6}, }); - grpc_cares_wrapper_address_sorting_sort(&lb_addrs); + grpc_cares_wrapper_address_sorting_sort(nullptr, &lb_addrs); VerifyLbAddrOutputs(lb_addrs, { // ::ffff:0:2 should match the v4-mapped // precedence entry and be deprioritized. @@ -521,7 +521,7 @@ TEST_F(AddressSortingTest, TestPrefersSmallerScope) { {"[3ffe::5001]:443", AF_INET6}, {"[fec0::1234]:443", AF_INET6}, }); - grpc_cares_wrapper_address_sorting_sort(&lb_addrs); + grpc_cares_wrapper_address_sorting_sort(nullptr, &lb_addrs); VerifyLbAddrOutputs(lb_addrs, { "[fec0::1234]:443", "[3ffe::5001]:443", @@ -546,7 +546,7 @@ TEST_F(AddressSortingTest, TestPrefersLongestMatchingSrcDstPrefix) { {"[3ffe:5001::]:443", AF_INET6}, {"[3ffe:1234::]:443", AF_INET6}, }); - grpc_cares_wrapper_address_sorting_sort(&lb_addrs); + grpc_cares_wrapper_address_sorting_sort(nullptr, &lb_addrs); VerifyLbAddrOutputs(lb_addrs, { "[3ffe:1234::]:443", "[3ffe:5001::]:443", @@ -567,7 +567,7 @@ TEST_F(AddressSortingTest, {"[3ffe::5001]:443", AF_INET6}, {"[3ffe::1234]:443", AF_INET6}, }); - grpc_cares_wrapper_address_sorting_sort(&lb_addrs); + grpc_cares_wrapper_address_sorting_sort(nullptr, &lb_addrs); VerifyLbAddrOutputs(lb_addrs, { "[3ffe::1234]:443", "[3ffe::5001]:443", @@ -587,7 +587,7 @@ TEST_F(AddressSortingTest, TestPrefersLongestPrefixStressInnerBytePrefix) { {"[3ffe:8000::]:443", AF_INET6}, {"[3ffe:2000::]:443", AF_INET6}, }); - grpc_cares_wrapper_address_sorting_sort(&lb_addrs); + grpc_cares_wrapper_address_sorting_sort(nullptr, &lb_addrs); VerifyLbAddrOutputs(lb_addrs, { "[3ffe:2000::]:443", "[3ffe:8000::]:443", @@ -607,7 +607,7 @@ TEST_F(AddressSortingTest, TestPrefersLongestPrefixDiffersOnHighestBitOfByte) { {"[3ffe:6::]:443", AF_INET6}, {"[3ffe:c::]:443", AF_INET6}, }); - grpc_cares_wrapper_address_sorting_sort(&lb_addrs); + grpc_cares_wrapper_address_sorting_sort(nullptr, &lb_addrs); VerifyLbAddrOutputs(lb_addrs, { "[3ffe:c::]:443", "[3ffe:6::]:443", @@ -629,7 +629,7 @@ TEST_F(AddressSortingTest, TestPrefersLongestPrefixDiffersByLastBit) { {"[3ffe:1111:1111:1110::]:443", AF_INET6}, {"[3ffe:1111:1111:1111::]:443", AF_INET6}, }); - grpc_cares_wrapper_address_sorting_sort(&lb_addrs); + grpc_cares_wrapper_address_sorting_sort(nullptr, &lb_addrs); VerifyLbAddrOutputs(lb_addrs, { "[3ffe:1111:1111:1111::]:443", "[3ffe:1111:1111:1110::]:443", @@ -651,7 +651,7 @@ TEST_F(AddressSortingTest, TestStableSort) { {"[3ffe::1234]:443", AF_INET6}, {"[3ffe::1235]:443", AF_INET6}, }); - grpc_cares_wrapper_address_sorting_sort(&lb_addrs); + grpc_cares_wrapper_address_sorting_sort(nullptr, &lb_addrs); VerifyLbAddrOutputs(lb_addrs, { "[3ffe::1234]:443", "[3ffe::1235]:443", @@ -677,7 +677,7 @@ TEST_F(AddressSortingTest, TestStableSortFiveElements) { {"[3ffe::1234]:443", AF_INET6}, {"[3ffe::1235]:443", AF_INET6}, }); - grpc_cares_wrapper_address_sorting_sort(&lb_addrs); + grpc_cares_wrapper_address_sorting_sort(nullptr, &lb_addrs); VerifyLbAddrOutputs(lb_addrs, { "[3ffe::1231]:443", "[3ffe::1232]:443", @@ -698,7 +698,7 @@ TEST_F(AddressSortingTest, TestStableSortNoSrcAddrsExist) { {"[3ffe::1234]:443", AF_INET6}, {"[3ffe::1235]:443", AF_INET6}, }); - grpc_cares_wrapper_address_sorting_sort(&lb_addrs); + grpc_cares_wrapper_address_sorting_sort(nullptr, &lb_addrs); VerifyLbAddrOutputs(lb_addrs, { "[3ffe::1231]:443", "[3ffe::1232]:443", @@ -716,7 +716,7 @@ TEST_F(AddressSortingTest, TestStableSortNoSrcAddrsExistWithIpv4) { {"[::ffff:5.6.7.8]:443", AF_INET6}, {"1.2.3.4:443", AF_INET}, }); - grpc_cares_wrapper_address_sorting_sort(&lb_addrs); + grpc_cares_wrapper_address_sorting_sort(nullptr, &lb_addrs); VerifyLbAddrOutputs(lb_addrs, { "[::ffff:5.6.7.8]:443", "1.2.3.4:443", @@ -744,7 +744,7 @@ TEST_F(AddressSortingTest, TestStableSortV4CompatAndSiteLocalAddresses) { {"[fec0::2000]:443", AF_INET6}, {v4_compat_dest, AF_INET6}, }); - grpc_cares_wrapper_address_sorting_sort(&lb_addrs); + grpc_cares_wrapper_address_sorting_sort(nullptr, &lb_addrs); VerifyLbAddrOutputs(lb_addrs, { // The sort should be stable since @@ -765,7 +765,7 @@ TEST_F(AddressSortingTest, TestPrefersIpv6Loopback) { {"[::1]:443", AF_INET6}, {"127.0.0.1:443", AF_INET}, }); - grpc_cares_wrapper_address_sorting_sort(&lb_addrs); + grpc_cares_wrapper_address_sorting_sort(nullptr, &lb_addrs); VerifyLbAddrOutputs(lb_addrs, { "[::1]:443", "127.0.0.1:443", @@ -779,7 +779,7 @@ TEST_F(AddressSortingTest, TestPrefersIpv6LoopbackInputsFlipped) { {"127.0.0.1:443", AF_INET}, {"[::1]:443", AF_INET6}, }); - grpc_cares_wrapper_address_sorting_sort(&lb_addrs); + grpc_cares_wrapper_address_sorting_sort(nullptr, &lb_addrs); VerifyLbAddrOutputs(lb_addrs, { "[::1]:443", "127.0.0.1:443", From 425f04caac95e3a186b65becb9ab7b2923e41b6e Mon Sep 17 00:00:00 2001 From: Eric Gribkoff Date: Wed, 1 Apr 2020 11:26:17 -0700 Subject: [PATCH 324/758] Use prebuilt server image in xds kokokoro job --- tools/internal_ci/linux/grpc_xds_bazel_python_test_in_docker.sh | 2 ++ tools/internal_ci/linux/grpc_xds_bazel_test_in_docker.sh | 2 ++ 2 files changed, 4 insertions(+) diff --git a/tools/internal_ci/linux/grpc_xds_bazel_python_test_in_docker.sh b/tools/internal_ci/linux/grpc_xds_bazel_python_test_in_docker.sh index 0dbea2f59ee..8a1a200b249 100755 --- a/tools/internal_ci/linux/grpc_xds_bazel_python_test_in_docker.sh +++ b/tools/internal_ci/linux/grpc_xds_bazel_python_test_in_docker.sh @@ -51,6 +51,8 @@ GRPC_VERBOSITY=debug GRPC_TRACE=xds_client,xds_resolver,cds_lb,xds_lb "$PYTHON" tools/run_tests/run_xds_tests.py \ --test_case=all \ --project_id=grpc-testing \ + --source_image=projects/grpc-testing/global/images/xds-test-server \ + --path_to_server_binary=/java_server/grpc-java/interop-testing/build/install/grpc-interop-testing/bin/xds-test-server \ --gcp_suffix=$(date '+%s') \ --verbose \ --client_cmd='bazel run //src/python/grpcio_tests/tests_py3_only/interop:xds_interop_client -- --server=xds-experimental:///{server_uri} --stats_port={stats_port} --qps={qps} --verbose' diff --git a/tools/internal_ci/linux/grpc_xds_bazel_test_in_docker.sh b/tools/internal_ci/linux/grpc_xds_bazel_test_in_docker.sh index 17380860f21..03587d76a0c 100755 --- a/tools/internal_ci/linux/grpc_xds_bazel_test_in_docker.sh +++ b/tools/internal_ci/linux/grpc_xds_bazel_test_in_docker.sh @@ -51,6 +51,8 @@ GRPC_VERBOSITY=debug GRPC_TRACE=xds_client,xds_resolver,cds_lb,xds_lb "$PYTHON" tools/run_tests/run_xds_tests.py \ --test_case=all \ --project_id=grpc-testing \ + --source_image=projects/grpc-testing/global/images/xds-test-server \ + --path_to_server_binary=/java_server/grpc-java/interop-testing/build/install/grpc-interop-testing/bin/xds-test-server \ --gcp_suffix=$(date '+%s') \ --verbose \ --client_cmd='bazel-bin/test/cpp/interop/xds_interop_client --server=xds-experimental:///{server_uri} --stats_port={stats_port} --qps={qps}' From 936ab4da4f134c2133374d23ff263324c2943796 Mon Sep 17 00:00:00 2001 From: Eric Gribkoff Date: Wed, 1 Apr 2020 11:31:19 -0700 Subject: [PATCH 325/758] to revert: run on kokoro --- tools/internal_ci/linux/grpc_python_bazel_test.cfg | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/tools/internal_ci/linux/grpc_python_bazel_test.cfg b/tools/internal_ci/linux/grpc_python_bazel_test.cfg index feae924330e..107404a30e9 100644 --- a/tools/internal_ci/linux/grpc_python_bazel_test.cfg +++ b/tools/internal_ci/linux/grpc_python_bazel_test.cfg @@ -1,4 +1,4 @@ -# Copyright 2018 gRPC authors. +# Copyright 2020 gRPC authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -15,9 +15,15 @@ # Config file for the internal CI (in protobuf text format) # Location of the continuous shell script in repository. -build_file: "grpc/tools/internal_ci/linux/grpc_bazel.sh" -timeout_mins: 240 +build_file: "grpc/tools/internal_ci/linux/grpc_xds.sh" +timeout_mins: 90 env_vars { key: "BAZEL_SCRIPT" - value: "tools/internal_ci/linux/grpc_python_bazel_test_in_docker.sh" + value: "tools/internal_ci/linux/grpc_xds_bazel_test_in_docker.sh" +} +action { + define_artifacts { + regex: "**/*sponge_log.*" + regex: "github/grpc/reports/**" + } } From 67d70ee059eadd09f7faadefb49519c69186e99f Mon Sep 17 00:00:00 2001 From: Muxi Yan Date: Wed, 1 Apr 2020 11:53:20 -0700 Subject: [PATCH 326/758] Remove docker, and update scripts --- src/objective-c/BoringSSL-GRPC.podspec | 487 +----------------- .../BoringSSL-GRPC.podspec.template | 14 +- .../distrib/check_boringssl_prefix_symbol.sh | 18 +- .../generate_boringssl_prefix_header.sh | 60 +++ tools/distrib/upgrade_boringssl_objc.sh | 44 -- .../Dockerfile | 36 -- .../generate_boringssl_prefix_header.sh | 41 -- tools/dockerfile/test/sanity/Dockerfile | 1 - 8 files changed, 74 insertions(+), 627 deletions(-) create mode 100755 tools/distrib/generate_boringssl_prefix_header.sh delete mode 100755 tools/distrib/upgrade_boringssl_objc.sh delete mode 100644 tools/dockerfile/grpc_objc/generate_boringssl_prefix_header/Dockerfile delete mode 100755 tools/dockerfile/grpc_objc/generate_boringssl_prefix_header/generate_boringssl_prefix_header.sh diff --git a/src/objective-c/BoringSSL-GRPC.podspec b/src/objective-c/BoringSSL-GRPC.podspec index c1257f47237..0490b16a211 100644 --- a/src/objective-c/BoringSSL-GRPC.podspec +++ b/src/objective-c/BoringSSL-GRPC.podspec @@ -1631,492 +1631,9 @@ Pod::Spec.new do |s| # outputs a gzip+base64 encoded version of boringssl_prefix_symbols.h because of Cocoapods' # limit on the 'prepare_command' field length. The encoded header is put at # /src/boringssl/boringssl_prefix_symbols.h.gz.b64. Here we decode the content and inject - # the header to correcty location in BoringSSL. + # the header to the correct location in BoringSSL. base64 -D < include/openssl/boringssl_prefix_symbols.h - H4sICH9e2F0AA2JvcmluZ3NzbF9wcmVmaXhfc3ltYm9scy5oAK2dXXPbRpa/7/dTqP57s1s1tWvJ - cSZzSUt0zI0taUg6G+8NCiRBCWOSYABQtvPp/9147ZdzGvgduCo1kwh4ngM2Gv2GRvd///fVbXb+ - nqdPz+XVf2z/8+rm1fUvf7v6NcueDsnV4rT9r3/77/9W/1w9JvkxLYo0O12V2dWlSP52tVXg366O - 2S7dq/+PT7v/zvKrXVqUebq5lMlV+ZwWV0W2L7/GeXK1Vwfj03ftOl/yc1YkV1/T8vlK/Vn/f3Yp - r/ZJcqWQ5yRPNt+vnvL4VCa7v12d8+wl3SU7JYxL9T/JVbzJXhJt2nbXfsrKdJvoq6jjnvvrbQ+d - z0mcX6Wnq/hw0GSaFO2vW7+fX60e3q3/d7acXy1WV4/Lh98Xd/O7q/83W6n//n9Xs/u76qTZp/X7 - h+XV3WJ1+2G2+Li6mn34cKWo5ex+vZivtOt/F+v3V8v5r7OlQh4UpXy9+/72w6e7xf2vFbj4+Phh - oaL0gquHd9rxcb68fa/+Mnu7+LBYf67Cv1us7+er1X8px9X9w9X89/n9+mr1XnuMK3s7v/qwmL39 - ML96p/5rdv9Z61aP89vF7MPf1HUv57frvylF+2/qpNuH+9X8n5+UTp1zdTf7OPtVX0hFt/9Z/bD3 - s/XqQcVdqp+3+vRhrX/Gu+XDx6sPDyt95VefVnMVY7aeaVqlobrk1d8UN1cXuNTXPVP/3K4XD/fa - pwAVer2c6eu4n//6YfHr/P52rtmHClg/LNW5n1YN87er2XKx0kEfPq01/aCd2qQ09/PqnDr1dXqo - a6muYr5UCfFxVonf2Xfjv/5Nw28flsq5Wn2IZnd30eNy/m7xx9U5LsqkuCq/Zlcq653KdJ8meaEy - j8r82SlRN6HUWUxl6mOh/6BFaZnkcalzXLa/OsbbPLtKvp3jU5UJ1T9pWVzF+dPlqHzF1SZRcFIF - Sk9P//Vv/75L9ukpIS/nP+K/XW3+kzwULdRPX9YnBB3miVfx1b//+1Wk/2fzbz21eIj2UVEc6Gvo - /1j/4W898J+Wo0hK1NIgvedu/WEVbQ+pSqromKjiYTdW55OOVaAjPUWSvyS5RGeRjlWXhdHmst+r - 7CZxE7wd4eU6upGnrE8TdqGW9YlT2qc9+5SUCKfDk8rTZXpMdM2GeQ3Ssz6rGu6QCMU27LlFicD8 - +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 EOF # We are renaming openssl to openssl_grpc so that there is no conflict with openssl if it exists diff --git a/templates/src/objective-c/BoringSSL-GRPC.podspec.template b/templates/src/objective-c/BoringSSL-GRPC.podspec.template index 22bdb6f8869..beb053aace4 100644 --- a/templates/src/objective-c/BoringSSL-GRPC.podspec.template +++ b/templates/src/objective-c/BoringSSL-GRPC.podspec.template @@ -1,8 +1,14 @@ %YAML 1.2 --- | <%! - import subprocess + import subprocess, base64 + import gzip boringssl_commit = subprocess.check_output(['git', 'rev-parse', 'HEAD'], cwd='third_party/boringssl').decode().strip() + prefix_f = open("src/boringssl/boringssl_prefix_symbols.h", "rb") + prefix = prefix_f.read() + prefix_gzip = gzip.compress(prefix) + prefix_gzip_b64 = base64.b64encode(prefix_gzip) + prefix_f.close() %> # This file has been automatically generated from a template file. @@ -232,11 +238,9 @@ # outputs a gzip+base64 encoded version of boringssl_prefix_symbols.h because of Cocoapods' # limit on the 'prepare_command' field length. The encoded header is put at # /src/boringssl/boringssl_prefix_symbols.h.gz.b64. Here we decode the content and inject - # the header to correcty location in BoringSSL. + # the header to the correct location in BoringSSL. base64 -D < include/openssl/boringssl_prefix_symbols.h - % for line in open("src/boringssl/boringssl_prefix_symbols.h.gz.b64", "r").readlines(): - ${line}\ - % endfor + ${prefix_gzip_b64} EOF # We are renaming openssl to openssl_grpc so that there is no conflict with openssl if it exists diff --git a/tools/distrib/check_boringssl_prefix_symbol.sh b/tools/distrib/check_boringssl_prefix_symbol.sh index d0912d89b61..ecf48660e8c 100755 --- a/tools/distrib/check_boringssl_prefix_symbol.sh +++ b/tools/distrib/check_boringssl_prefix_symbol.sh @@ -20,20 +20,8 @@ cd "$(dirname $0)" cd ../../third_party/boringssl BORINGSSL_COMMIT=$(git rev-parse HEAD) +PREFIX_SYMBOLS_COMMIT=$(cat ../../src/boringssl/boringssl_prefix_symbols.h | head -n1 | awk '{print $NF}') -mkdir -p ./build -cd build -cmake .. -make -j4 -go run ../util/read_symbols.go ssl/libssl.a > ./symbols.txt -go run ../util/read_symbols.go crypto/libcrypto.a >> ./symbols.txt +[ $BORINGSSL_COMMIT == $PREFIX_SYMBOLS_COMMIT ] || { echo "The BoringSSL commit does not match the commit of the prefix symbols (src/boringssl/boringssl_prefix_symbols.h). Run tools/distrib/regenerate_boringssl_prefix_symbols.sh to update the prefix symbols." ; exit 1 ; } -cmake .. -DBORINGSSL_PREFIX=GRPC -DBORINGSSL_PREFIX_SYMBOLS=symbols.txt -make boringssl_prefix_symbols -gzip -c symbol_prefix_include/boringssl_prefix_symbols.h | base64 > boringssl_prefix_symbols.h.gz.b64 - -diff ../../../src/boringssl/boringssl_prefix_symbols.h.gz.b64 boringssl_prefix_symbols.h.gz.b64 - -result=$? - -exit $result +exit 0 diff --git a/tools/distrib/generate_boringssl_prefix_header.sh b/tools/distrib/generate_boringssl_prefix_header.sh new file mode 100755 index 00000000000..e2b1ae67995 --- /dev/null +++ b/tools/distrib/generate_boringssl_prefix_header.sh @@ -0,0 +1,60 @@ +#!/bin/bash +# Copyright 2018 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Generate the list of boringssl symbols that need to be renamed based on the +# current boringssl submodule. The script should be run after a boringssl +# upgrade in third_party/boringssl. Note that after the script is run, you will +# typically need to manually upgrade the BoringSSL-GRPC podspec +# (templates/src/objective-c/BoringSSL-GRPC.podspec.template) version and the +# corresponding version number in gRPC-Core podspec +# (templates/gRPC-Core.podspec.template). + +set -ev + +cd "$(dirname $0)" +cd ../../third_party/boringssl + +BORINGSSL_COMMIT=$(git rev-parse HEAD) +BORINGSSL_PREFIX_HEADERS_DIR=src/boringssl + +# generate the prefix header +mkdir -p build +cd build +cmake .. +make clean +make -j + +[ -f ssl/libssl.a ] || { echo "Failed to build libssl.a" ; exit 1 ; } +[ -f crypto/libcrypto.a ] || { echo "Failed to build libcrypto.a" ; exit 1 ; } + +go run ../util/read_symbols.go ssl/libssl.a > ./symbols.txt +go run ../util/read_symbols.go crypto/libcrypto.a >> ./symbols.txt + +# generates boringssl_prefix_symbols.h +cmake .. -DBORINGSSL_PREFIX=GRPC -DBORINGSSL_PREFIX_SYMBOLS=symbols.txt +make boringssl_prefix_symbols + +[ -f symbol_prefix_include/boringssl_prefix_symbols.h ] || { echo "Failed to build boringssl_prefix_symbols.sh" ; exit 1 ; } + +cd ../../.. +mkdir -p $BORINGSSL_PREFIX_HEADERS_DIR +echo "// generated by generate_boringssl_prefix_header.sh on BoringSSL commit: $BORINGSSL_COMMIT" > $BORINGSSL_PREFIX_HEADERS_DIR/boringssl_prefix_symbols.h +echo "" >> $BORINGSSL_PREFIX_HEADERS_DIR/boringssl_prefix_symbols.h +cat third_party/boringssl/build/symbol_prefix_include/boringssl_prefix_symbols.h >> $BORINGSSL_PREFIX_HEADERS_DIR/boringssl_prefix_symbols.h + +# Regenerated the project +tools/buildgen/generate_projects.sh + +exit 0 diff --git a/tools/distrib/upgrade_boringssl_objc.sh b/tools/distrib/upgrade_boringssl_objc.sh deleted file mode 100755 index c31a2f302d7..00000000000 --- a/tools/distrib/upgrade_boringssl_objc.sh +++ /dev/null @@ -1,44 +0,0 @@ -#!/bin/bash -# Copyright 2018 gRPC authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# Generate the list of boringssl symbols that need to be shadowed based on the -# current boringssl submodule. Requires local toolchain to build boringssl. - -set -e - -cd "$(dirname $0)" -cd ../../third_party/boringssl - -BORINGSSL_COMMIT=$(git rev-parse HEAD) -BORINGSSL_PREFIX_HEADERS_DIR=src/boringssl - -# Do the following in grpc root directory -cd ../.. - -docker build tools/dockerfile/grpc_objc/generate_boringssl_prefix_header -t grpc/boringssl_prefix_header -mkdir -p $BORINGSSL_PREFIX_HEADERS_DIR -docker run -it --rm -v $(pwd)/$BORINGSSL_PREFIX_HEADERS_DIR:/output grpc/boringssl_prefix_header $BORINGSSL_COMMIT - -# Increase the minor version by 1 -POD_VER=$(cat templates/src/objective-c/BoringSSL-GRPC.podspec.template | grep 'version = ' | perl -pe '($_)=/([0-9]+([.][0-9]+)+)/') -POD_VER_NEW="${POD_VER%.*}.$((${POD_VER##*.}+1))" -sed -i.grpc_back -e "s/version = '$POD_VER'/version = '$POD_VER_NEW'/g" templates/src/objective-c/BoringSSL-GRPC.podspec.template -sed -i.grpc_back -e "s/dependency 'BoringSSL-GRPC', '$POD_VER'/dependency 'BoringSSL-GRPC', '$POD_VER_NEW'/g" templates/gRPC-Core.podspec.template -rm templates/src/objective-c/BoringSSL-GRPC.podspec.template.grpc_back templates/gRPC-Core.podspec.template.grpc_back - -# Regenerated the project -tools/buildgen/generate_projects.sh - -exit 0 diff --git a/tools/dockerfile/grpc_objc/generate_boringssl_prefix_header/Dockerfile b/tools/dockerfile/grpc_objc/generate_boringssl_prefix_header/Dockerfile deleted file mode 100644 index dc5d0c98360..00000000000 --- a/tools/dockerfile/grpc_objc/generate_boringssl_prefix_header/Dockerfile +++ /dev/null @@ -1,36 +0,0 @@ -# Copyright 2019 gRPC authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -FROM debian:buster - -ENV BORINGSSL_COMMIT=master - -RUN apt-get update && apt-get install -y \ - autoconf \ - cmake \ - curl \ - g++ \ - gcc \ - git \ - gnupg \ - golang \ - perl - -COPY generate_boringssl_prefix_header.sh / - -VOLUME /output - -WORKDIR / - -ENTRYPOINT ["/generate_boringssl_prefix_header.sh"] diff --git a/tools/dockerfile/grpc_objc/generate_boringssl_prefix_header/generate_boringssl_prefix_header.sh b/tools/dockerfile/grpc_objc/generate_boringssl_prefix_header/generate_boringssl_prefix_header.sh deleted file mode 100755 index 4f1a573bbec..00000000000 --- a/tools/dockerfile/grpc_objc/generate_boringssl_prefix_header/generate_boringssl_prefix_header.sh +++ /dev/null @@ -1,41 +0,0 @@ -#!/bin/bash -# Copyright 2019 gRPC authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -[ $# == 1 ] || { echo "Usage: generate_boringssl_prefix_header.sh " ; exit 1 ; } - -git clone -n https://github.com/google/boringssl.git -cd boringssl -git checkout $1 || { echo "Unable to checkout the commit $1" ; exit 1 ; } -mkdir build -cd build -cmake .. - -# gcc crashes on docker when using -j with too many cores. Limiting to 4 seems to be fine. -make -j4 - -[ -f ssl/libssl.a ] || { echo "Failed to build libssl.a" ; exit 1 ; } -[ -f crypto/libcrypto.a ] || { echo "Failed to build libcrypto.a" ; exit 1 ; } - -go run ../util/read_symbols.go ssl/libssl.a > ./symbols.txt -go run ../util/read_symbols.go crypto/libcrypto.a >> ./symbols.txt - -cmake .. -DBORINGSSL_PREFIX=GRPC -DBORINGSSL_PREFIX_SYMBOLS=symbols.txt -make boringssl_prefix_symbols - -[ -f symbol_prefix_include/boringssl_prefix_symbols.h ] || { echo "Failed to build boringssl_prefix_symbols.sh" ; exit 1 ; } - -gzip -c symbol_prefix_include/boringssl_prefix_symbols.h | base64 > /output/boringssl_prefix_symbols.h.gz.b64 - -exit 0 diff --git a/tools/dockerfile/test/sanity/Dockerfile b/tools/dockerfile/test/sanity/Dockerfile index e51412fc785..aa03520f8a4 100644 --- a/tools/dockerfile/test/sanity/Dockerfile +++ b/tools/dockerfile/test/sanity/Dockerfile @@ -21,7 +21,6 @@ RUN apt-get update && apt-get install -y \ build-essential \ bzip2 \ ccache \ - cmake \ curl \ dnsutils \ gcc \ From 215a192de386a5fd70862d17be9e0435c44a5551 Mon Sep 17 00:00:00 2001 From: Muxi Yan Date: Wed, 1 Apr 2020 11:54:34 -0700 Subject: [PATCH 327/758] Remove .gz.b64 --- src/boringssl/boringssl_prefix_symbols.h | 3243 +++++++++++++++++ .../boringssl_prefix_symbols.h.gz.b64 | 484 --- 2 files changed, 3243 insertions(+), 484 deletions(-) create mode 100644 src/boringssl/boringssl_prefix_symbols.h delete mode 100644 src/boringssl/boringssl_prefix_symbols.h.gz.b64 diff --git a/src/boringssl/boringssl_prefix_symbols.h b/src/boringssl/boringssl_prefix_symbols.h new file mode 100644 index 00000000000..e5805fa5abc --- /dev/null +++ b/src/boringssl/boringssl_prefix_symbols.h @@ -0,0 +1,3243 @@ +// generated by generate_boringssl_prefix_header.sh on BoringSSL commit: 7f02881e96e51f1873afcf384d02f782b48967ca +// Copyright (c) 2018, Google Inc. +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION +// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +// BORINGSSL_ADD_PREFIX pastes two identifiers into one. It performs one +// iteration of macro expansion on its arguments before pasting. +#define BORINGSSL_ADD_PREFIX(a, b) BORINGSSL_ADD_PREFIX_INNER(a, b) +#define BORINGSSL_ADD_PREFIX_INNER(a, b) a ## _ ## b + +#define GRPC_BIO_f_ssl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_f_ssl) +#define GRPC_BIO_set_ssl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_set_ssl) +#define GRPC_DTLS_client_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DTLS_client_method) +#define GRPC_DTLS_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DTLS_method) +#define GRPC_DTLS_server_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DTLS_server_method) +#define GRPC_DTLS_with_buffers_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DTLS_with_buffers_method) +#define GRPC_DTLSv1_2_client_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DTLSv1_2_client_method) +#define GRPC_DTLSv1_2_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DTLSv1_2_method) +#define GRPC_DTLSv1_2_server_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DTLSv1_2_server_method) +#define GRPC_DTLSv1_client_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DTLSv1_client_method) +#define GRPC_DTLSv1_get_timeout BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DTLSv1_get_timeout) +#define GRPC_DTLSv1_handle_timeout BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DTLSv1_handle_timeout) +#define GRPC_DTLSv1_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DTLSv1_method) +#define GRPC_DTLSv1_server_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DTLSv1_server_method) +#define GRPC_DTLSv1_set_initial_timeout_duration BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DTLSv1_set_initial_timeout_duration) +#define GRPC_ERR_load_SSL_strings BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ERR_load_SSL_strings) +#define GRPC_OPENSSL_init_ssl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OPENSSL_init_ssl) +#define GRPC_PEM_read_SSL_SESSION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_SSL_SESSION) +#define GRPC_PEM_read_bio_SSL_SESSION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_bio_SSL_SESSION) +#define GRPC_PEM_write_SSL_SESSION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_SSL_SESSION) +#define GRPC_PEM_write_bio_SSL_SESSION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_bio_SSL_SESSION) +#define GRPC_SSL_CIPHER_description BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CIPHER_description) +#define GRPC_SSL_CIPHER_get_auth_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CIPHER_get_auth_nid) +#define GRPC_SSL_CIPHER_get_bits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CIPHER_get_bits) +#define GRPC_SSL_CIPHER_get_cipher_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CIPHER_get_cipher_nid) +#define GRPC_SSL_CIPHER_get_digest_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CIPHER_get_digest_nid) +#define GRPC_SSL_CIPHER_get_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CIPHER_get_id) +#define GRPC_SSL_CIPHER_get_kx_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CIPHER_get_kx_name) +#define GRPC_SSL_CIPHER_get_kx_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CIPHER_get_kx_nid) +#define GRPC_SSL_CIPHER_get_max_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CIPHER_get_max_version) +#define GRPC_SSL_CIPHER_get_min_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CIPHER_get_min_version) +#define GRPC_SSL_CIPHER_get_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CIPHER_get_name) +#define GRPC_SSL_CIPHER_get_prf_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CIPHER_get_prf_nid) +#define GRPC_SSL_CIPHER_get_rfc_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CIPHER_get_rfc_name) +#define GRPC_SSL_CIPHER_get_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CIPHER_get_value) +#define GRPC_SSL_CIPHER_get_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CIPHER_get_version) +#define GRPC_SSL_CIPHER_is_aead BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CIPHER_is_aead) +#define GRPC_SSL_CIPHER_is_block_cipher BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CIPHER_is_block_cipher) +#define GRPC_SSL_CIPHER_standard_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CIPHER_standard_name) +#define GRPC_SSL_COMP_add_compression_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_COMP_add_compression_method) +#define GRPC_SSL_COMP_free_compression_methods BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_COMP_free_compression_methods) +#define GRPC_SSL_COMP_get0_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_COMP_get0_name) +#define GRPC_SSL_COMP_get_compression_methods BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_COMP_get_compression_methods) +#define GRPC_SSL_COMP_get_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_COMP_get_id) +#define GRPC_SSL_COMP_get_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_COMP_get_name) +#define GRPC_SSL_CTX_add0_chain_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_add0_chain_cert) +#define GRPC_SSL_CTX_add1_chain_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_add1_chain_cert) +#define GRPC_SSL_CTX_add_cert_compression_alg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_add_cert_compression_alg) +#define GRPC_SSL_CTX_add_client_CA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_add_client_CA) +#define GRPC_SSL_CTX_add_extra_chain_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_add_extra_chain_cert) +#define GRPC_SSL_CTX_add_session BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_add_session) +#define GRPC_SSL_CTX_check_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_check_private_key) +#define GRPC_SSL_CTX_cipher_in_group BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_cipher_in_group) +#define GRPC_SSL_CTX_clear_chain_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_clear_chain_certs) +#define GRPC_SSL_CTX_clear_extra_chain_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_clear_extra_chain_certs) +#define GRPC_SSL_CTX_clear_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_clear_mode) +#define GRPC_SSL_CTX_clear_options BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_clear_options) +#define GRPC_SSL_CTX_enable_ocsp_stapling BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_enable_ocsp_stapling) +#define GRPC_SSL_CTX_enable_pq_experiment_signal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_enable_pq_experiment_signal) +#define GRPC_SSL_CTX_enable_signed_cert_timestamps BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_enable_signed_cert_timestamps) +#define GRPC_SSL_CTX_enable_tls_channel_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_enable_tls_channel_id) +#define GRPC_SSL_CTX_flush_sessions BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_flush_sessions) +#define GRPC_SSL_CTX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_free) +#define GRPC_SSL_CTX_get0_certificate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_get0_certificate) +#define GRPC_SSL_CTX_get0_chain_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_get0_chain_certs) +#define GRPC_SSL_CTX_get0_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_get0_param) +#define GRPC_SSL_CTX_get0_privatekey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_get0_privatekey) +#define GRPC_SSL_CTX_get_cert_store BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_get_cert_store) +#define GRPC_SSL_CTX_get_channel_id_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_get_channel_id_cb) +#define GRPC_SSL_CTX_get_ciphers BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_get_ciphers) +#define GRPC_SSL_CTX_get_client_CA_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_get_client_CA_list) +#define GRPC_SSL_CTX_get_default_passwd_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_get_default_passwd_cb) +#define GRPC_SSL_CTX_get_default_passwd_cb_userdata BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_get_default_passwd_cb_userdata) +#define GRPC_SSL_CTX_get_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_get_ex_data) +#define GRPC_SSL_CTX_get_ex_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_get_ex_new_index) +#define GRPC_SSL_CTX_get_extra_chain_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_get_extra_chain_certs) +#define GRPC_SSL_CTX_get_info_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_get_info_callback) +#define GRPC_SSL_CTX_get_keylog_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_get_keylog_callback) +#define GRPC_SSL_CTX_get_max_cert_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_get_max_cert_list) +#define GRPC_SSL_CTX_get_max_proto_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_get_max_proto_version) +#define GRPC_SSL_CTX_get_min_proto_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_get_min_proto_version) +#define GRPC_SSL_CTX_get_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_get_mode) +#define GRPC_SSL_CTX_get_options BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_get_options) +#define GRPC_SSL_CTX_get_quiet_shutdown BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_get_quiet_shutdown) +#define GRPC_SSL_CTX_get_read_ahead BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_get_read_ahead) +#define GRPC_SSL_CTX_get_session_cache_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_get_session_cache_mode) +#define GRPC_SSL_CTX_get_timeout BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_get_timeout) +#define GRPC_SSL_CTX_get_tlsext_ticket_keys BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_get_tlsext_ticket_keys) +#define GRPC_SSL_CTX_get_verify_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_get_verify_callback) +#define GRPC_SSL_CTX_get_verify_depth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_get_verify_depth) +#define GRPC_SSL_CTX_get_verify_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_get_verify_mode) +#define GRPC_SSL_CTX_load_verify_locations BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_load_verify_locations) +#define GRPC_SSL_CTX_need_tmp_RSA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_need_tmp_RSA) +#define GRPC_SSL_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_new) +#define GRPC_SSL_CTX_remove_session BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_remove_session) +#define GRPC_SSL_CTX_sess_accept BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_sess_accept) +#define GRPC_SSL_CTX_sess_accept_good BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_sess_accept_good) +#define GRPC_SSL_CTX_sess_accept_renegotiate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_sess_accept_renegotiate) +#define GRPC_SSL_CTX_sess_cache_full BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_sess_cache_full) +#define GRPC_SSL_CTX_sess_cb_hits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_sess_cb_hits) +#define GRPC_SSL_CTX_sess_connect BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_sess_connect) +#define GRPC_SSL_CTX_sess_connect_good BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_sess_connect_good) +#define GRPC_SSL_CTX_sess_connect_renegotiate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_sess_connect_renegotiate) +#define GRPC_SSL_CTX_sess_get_cache_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_sess_get_cache_size) +#define GRPC_SSL_CTX_sess_get_get_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_sess_get_get_cb) +#define GRPC_SSL_CTX_sess_get_new_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_sess_get_new_cb) +#define GRPC_SSL_CTX_sess_get_remove_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_sess_get_remove_cb) +#define GRPC_SSL_CTX_sess_hits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_sess_hits) +#define GRPC_SSL_CTX_sess_misses BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_sess_misses) +#define GRPC_SSL_CTX_sess_number BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_sess_number) +#define GRPC_SSL_CTX_sess_set_cache_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_sess_set_cache_size) +#define GRPC_SSL_CTX_sess_set_get_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_sess_set_get_cb) +#define GRPC_SSL_CTX_sess_set_new_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_sess_set_new_cb) +#define GRPC_SSL_CTX_sess_set_remove_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_sess_set_remove_cb) +#define GRPC_SSL_CTX_sess_timeouts BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_sess_timeouts) +#define GRPC_SSL_CTX_set0_buffer_pool BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set0_buffer_pool) +#define GRPC_SSL_CTX_set0_chain BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set0_chain) +#define GRPC_SSL_CTX_set0_client_CAs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set0_client_CAs) +#define GRPC_SSL_CTX_set0_verify_cert_store BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set0_verify_cert_store) +#define GRPC_SSL_CTX_set1_chain BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set1_chain) +#define GRPC_SSL_CTX_set1_curves BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set1_curves) +#define GRPC_SSL_CTX_set1_curves_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set1_curves_list) +#define GRPC_SSL_CTX_set1_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set1_param) +#define GRPC_SSL_CTX_set1_sigalgs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set1_sigalgs) +#define GRPC_SSL_CTX_set1_sigalgs_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set1_sigalgs_list) +#define GRPC_SSL_CTX_set1_tls_channel_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set1_tls_channel_id) +#define GRPC_SSL_CTX_set1_verify_cert_store BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set1_verify_cert_store) +#define GRPC_SSL_CTX_set_allow_unknown_alpn_protos BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_allow_unknown_alpn_protos) +#define GRPC_SSL_CTX_set_alpn_protos BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_alpn_protos) +#define GRPC_SSL_CTX_set_alpn_select_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_alpn_select_cb) +#define GRPC_SSL_CTX_set_cert_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_cert_cb) +#define GRPC_SSL_CTX_set_cert_store BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_cert_store) +#define GRPC_SSL_CTX_set_cert_verify_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_cert_verify_callback) +#define GRPC_SSL_CTX_set_chain_and_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_chain_and_key) +#define GRPC_SSL_CTX_set_channel_id_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_channel_id_cb) +#define GRPC_SSL_CTX_set_cipher_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_cipher_list) +#define GRPC_SSL_CTX_set_client_CA_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_client_CA_list) +#define GRPC_SSL_CTX_set_client_cert_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_client_cert_cb) +#define GRPC_SSL_CTX_set_current_time_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_current_time_cb) +#define GRPC_SSL_CTX_set_custom_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_custom_verify) +#define GRPC_SSL_CTX_set_default_passwd_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_default_passwd_cb) +#define GRPC_SSL_CTX_set_default_passwd_cb_userdata BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_default_passwd_cb_userdata) +#define GRPC_SSL_CTX_set_default_verify_paths BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_default_verify_paths) +#define GRPC_SSL_CTX_set_dos_protection_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_dos_protection_cb) +#define GRPC_SSL_CTX_set_early_data_enabled BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_early_data_enabled) +#define GRPC_SSL_CTX_set_ed25519_enabled BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_ed25519_enabled) +#define GRPC_SSL_CTX_set_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_ex_data) +#define GRPC_SSL_CTX_set_false_start_allowed_without_alpn BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_false_start_allowed_without_alpn) +#define GRPC_SSL_CTX_set_grease_enabled BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_grease_enabled) +#define GRPC_SSL_CTX_set_ignore_tls13_downgrade BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_ignore_tls13_downgrade) +#define GRPC_SSL_CTX_set_info_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_info_callback) +#define GRPC_SSL_CTX_set_keylog_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_keylog_callback) +#define GRPC_SSL_CTX_set_max_cert_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_max_cert_list) +#define GRPC_SSL_CTX_set_max_proto_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_max_proto_version) +#define GRPC_SSL_CTX_set_max_send_fragment BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_max_send_fragment) +#define GRPC_SSL_CTX_set_min_proto_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_min_proto_version) +#define GRPC_SSL_CTX_set_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_mode) +#define GRPC_SSL_CTX_set_msg_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_msg_callback) +#define GRPC_SSL_CTX_set_msg_callback_arg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_msg_callback_arg) +#define GRPC_SSL_CTX_set_next_proto_select_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_next_proto_select_cb) +#define GRPC_SSL_CTX_set_next_protos_advertised_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_next_protos_advertised_cb) +#define GRPC_SSL_CTX_set_ocsp_response BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_ocsp_response) +#define GRPC_SSL_CTX_set_options BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_options) +#define GRPC_SSL_CTX_set_private_key_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_private_key_method) +#define GRPC_SSL_CTX_set_psk_client_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_psk_client_callback) +#define GRPC_SSL_CTX_set_psk_server_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_psk_server_callback) +#define GRPC_SSL_CTX_set_purpose BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_purpose) +#define GRPC_SSL_CTX_set_quic_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_quic_method) +#define GRPC_SSL_CTX_set_quiet_shutdown BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_quiet_shutdown) +#define GRPC_SSL_CTX_set_read_ahead BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_read_ahead) +#define GRPC_SSL_CTX_set_retain_only_sha256_of_client_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_retain_only_sha256_of_client_certs) +#define GRPC_SSL_CTX_set_reverify_on_resume BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_reverify_on_resume) +#define GRPC_SSL_CTX_set_rsa_pss_rsae_certs_enabled BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_rsa_pss_rsae_certs_enabled) +#define GRPC_SSL_CTX_set_select_certificate_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_select_certificate_cb) +#define GRPC_SSL_CTX_set_session_cache_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_session_cache_mode) +#define GRPC_SSL_CTX_set_session_id_context BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_session_id_context) +#define GRPC_SSL_CTX_set_session_psk_dhe_timeout BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_session_psk_dhe_timeout) +#define GRPC_SSL_CTX_set_signed_cert_timestamp_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_signed_cert_timestamp_list) +#define GRPC_SSL_CTX_set_signing_algorithm_prefs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_signing_algorithm_prefs) +#define GRPC_SSL_CTX_set_srtp_profiles BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_srtp_profiles) +#define GRPC_SSL_CTX_set_strict_cipher_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_strict_cipher_list) +#define GRPC_SSL_CTX_set_ticket_aead_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_ticket_aead_method) +#define GRPC_SSL_CTX_set_timeout BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_timeout) +#define GRPC_SSL_CTX_set_tls_channel_id_enabled BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_tls_channel_id_enabled) +#define GRPC_SSL_CTX_set_tlsext_servername_arg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_tlsext_servername_arg) +#define GRPC_SSL_CTX_set_tlsext_servername_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_tlsext_servername_callback) +#define GRPC_SSL_CTX_set_tlsext_status_arg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_tlsext_status_arg) +#define GRPC_SSL_CTX_set_tlsext_status_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_tlsext_status_cb) +#define GRPC_SSL_CTX_set_tlsext_ticket_key_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_tlsext_ticket_key_cb) +#define GRPC_SSL_CTX_set_tlsext_ticket_keys BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_tlsext_ticket_keys) +#define GRPC_SSL_CTX_set_tlsext_use_srtp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_tlsext_use_srtp) +#define GRPC_SSL_CTX_set_tmp_dh BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_tmp_dh) +#define GRPC_SSL_CTX_set_tmp_dh_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_tmp_dh_callback) +#define GRPC_SSL_CTX_set_tmp_ecdh BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_tmp_ecdh) +#define GRPC_SSL_CTX_set_tmp_rsa BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_tmp_rsa) +#define GRPC_SSL_CTX_set_tmp_rsa_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_tmp_rsa_callback) +#define GRPC_SSL_CTX_set_trust BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_trust) +#define GRPC_SSL_CTX_set_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_verify) +#define GRPC_SSL_CTX_set_verify_algorithm_prefs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_verify_algorithm_prefs) +#define GRPC_SSL_CTX_set_verify_depth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_verify_depth) +#define GRPC_SSL_CTX_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_up_ref) +#define GRPC_SSL_CTX_use_PrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_use_PrivateKey) +#define GRPC_SSL_CTX_use_PrivateKey_ASN1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_use_PrivateKey_ASN1) +#define GRPC_SSL_CTX_use_PrivateKey_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_use_PrivateKey_file) +#define GRPC_SSL_CTX_use_RSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_use_RSAPrivateKey) +#define GRPC_SSL_CTX_use_RSAPrivateKey_ASN1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_use_RSAPrivateKey_ASN1) +#define GRPC_SSL_CTX_use_RSAPrivateKey_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_use_RSAPrivateKey_file) +#define GRPC_SSL_CTX_use_certificate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_use_certificate) +#define GRPC_SSL_CTX_use_certificate_ASN1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_use_certificate_ASN1) +#define GRPC_SSL_CTX_use_certificate_chain_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_use_certificate_chain_file) +#define GRPC_SSL_CTX_use_certificate_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_use_certificate_file) +#define GRPC_SSL_CTX_use_psk_identity_hint BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_use_psk_identity_hint) +#define GRPC_SSL_SESSION_early_data_capable BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_SESSION_early_data_capable) +#define GRPC_SSL_SESSION_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_SESSION_free) +#define GRPC_SSL_SESSION_from_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_SESSION_from_bytes) +#define GRPC_SSL_SESSION_get0_cipher BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_SESSION_get0_cipher) +#define GRPC_SSL_SESSION_get0_id_context BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_SESSION_get0_id_context) +#define GRPC_SSL_SESSION_get0_ocsp_response BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_SESSION_get0_ocsp_response) +#define GRPC_SSL_SESSION_get0_peer BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_SESSION_get0_peer) +#define GRPC_SSL_SESSION_get0_peer_certificates BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_SESSION_get0_peer_certificates) +#define GRPC_SSL_SESSION_get0_peer_sha256 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_SESSION_get0_peer_sha256) +#define GRPC_SSL_SESSION_get0_signed_cert_timestamp_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_SESSION_get0_signed_cert_timestamp_list) +#define GRPC_SSL_SESSION_get0_ticket BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_SESSION_get0_ticket) +#define GRPC_SSL_SESSION_get_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_SESSION_get_ex_data) +#define GRPC_SSL_SESSION_get_ex_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_SESSION_get_ex_new_index) +#define GRPC_SSL_SESSION_get_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_SESSION_get_id) +#define GRPC_SSL_SESSION_get_master_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_SESSION_get_master_key) +#define GRPC_SSL_SESSION_get_protocol_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_SESSION_get_protocol_version) +#define GRPC_SSL_SESSION_get_ticket_lifetime_hint BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_SESSION_get_ticket_lifetime_hint) +#define GRPC_SSL_SESSION_get_time BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_SESSION_get_time) +#define GRPC_SSL_SESSION_get_timeout BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_SESSION_get_timeout) +#define GRPC_SSL_SESSION_get_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_SESSION_get_version) +#define GRPC_SSL_SESSION_has_peer_sha256 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_SESSION_has_peer_sha256) +#define GRPC_SSL_SESSION_has_ticket BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_SESSION_has_ticket) +#define GRPC_SSL_SESSION_is_resumable BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_SESSION_is_resumable) +#define GRPC_SSL_SESSION_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_SESSION_new) +#define GRPC_SSL_SESSION_set1_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_SESSION_set1_id) +#define GRPC_SSL_SESSION_set1_id_context BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_SESSION_set1_id_context) +#define GRPC_SSL_SESSION_set_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_SESSION_set_ex_data) +#define GRPC_SSL_SESSION_set_protocol_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_SESSION_set_protocol_version) +#define GRPC_SSL_SESSION_set_ticket BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_SESSION_set_ticket) +#define GRPC_SSL_SESSION_set_time BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_SESSION_set_time) +#define GRPC_SSL_SESSION_set_timeout BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_SESSION_set_timeout) +#define GRPC_SSL_SESSION_should_be_single_use BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_SESSION_should_be_single_use) +#define GRPC_SSL_SESSION_to_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_SESSION_to_bytes) +#define GRPC_SSL_SESSION_to_bytes_for_ticket BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_SESSION_to_bytes_for_ticket) +#define GRPC_SSL_SESSION_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_SESSION_up_ref) +#define GRPC_SSL_accept BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_accept) +#define GRPC_SSL_add0_chain_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_add0_chain_cert) +#define GRPC_SSL_add1_chain_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_add1_chain_cert) +#define GRPC_SSL_add_client_CA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_add_client_CA) +#define GRPC_SSL_add_file_cert_subjects_to_stack BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_add_file_cert_subjects_to_stack) +#define GRPC_SSL_alert_desc_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_alert_desc_string) +#define GRPC_SSL_alert_desc_string_long BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_alert_desc_string_long) +#define GRPC_SSL_alert_from_verify_result BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_alert_from_verify_result) +#define GRPC_SSL_alert_type_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_alert_type_string) +#define GRPC_SSL_alert_type_string_long BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_alert_type_string_long) +#define GRPC_SSL_cache_hit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_cache_hit) +#define GRPC_SSL_certs_clear BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_certs_clear) +#define GRPC_SSL_check_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_check_private_key) +#define GRPC_SSL_clear BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_clear) +#define GRPC_SSL_clear_chain_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_clear_chain_certs) +#define GRPC_SSL_clear_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_clear_mode) +#define GRPC_SSL_clear_options BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_clear_options) +#define GRPC_SSL_connect BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_connect) +#define GRPC_SSL_cutthrough_complete BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_cutthrough_complete) +#define GRPC_SSL_delegated_credential_used BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_delegated_credential_used) +#define GRPC_SSL_do_handshake BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_do_handshake) +#define GRPC_SSL_dup_CA_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_dup_CA_list) +#define GRPC_SSL_early_callback_ctx_extension_get BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_early_callback_ctx_extension_get) +#define GRPC_SSL_early_data_accepted BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_early_data_accepted) +#define GRPC_SSL_enable_ocsp_stapling BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_enable_ocsp_stapling) +#define GRPC_SSL_enable_signed_cert_timestamps BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_enable_signed_cert_timestamps) +#define GRPC_SSL_enable_tls_channel_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_enable_tls_channel_id) +#define GRPC_SSL_error_description BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_error_description) +#define GRPC_SSL_export_keying_material BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_export_keying_material) +#define GRPC_SSL_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_free) +#define GRPC_SSL_generate_key_block BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_generate_key_block) +#define GRPC_SSL_get0_alpn_selected BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get0_alpn_selected) +#define GRPC_SSL_get0_certificate_types BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get0_certificate_types) +#define GRPC_SSL_get0_chain_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get0_chain_certs) +#define GRPC_SSL_get0_next_proto_negotiated BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get0_next_proto_negotiated) +#define GRPC_SSL_get0_ocsp_response BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get0_ocsp_response) +#define GRPC_SSL_get0_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get0_param) +#define GRPC_SSL_get0_peer_certificates BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get0_peer_certificates) +#define GRPC_SSL_get0_peer_verify_algorithms BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get0_peer_verify_algorithms) +#define GRPC_SSL_get0_server_requested_CAs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get0_server_requested_CAs) +#define GRPC_SSL_get0_session_id_context BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get0_session_id_context) +#define GRPC_SSL_get0_signed_cert_timestamp_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get0_signed_cert_timestamp_list) +#define GRPC_SSL_get1_session BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get1_session) +#define GRPC_SSL_get_SSL_CTX BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_SSL_CTX) +#define GRPC_SSL_get_certificate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_certificate) +#define GRPC_SSL_get_cipher_by_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_cipher_by_value) +#define GRPC_SSL_get_cipher_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_cipher_list) +#define GRPC_SSL_get_ciphers BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_ciphers) +#define GRPC_SSL_get_client_CA_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_client_CA_list) +#define GRPC_SSL_get_client_random BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_client_random) +#define GRPC_SSL_get_current_cipher BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_current_cipher) +#define GRPC_SSL_get_current_compression BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_current_compression) +#define GRPC_SSL_get_current_expansion BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_current_expansion) +#define GRPC_SSL_get_curve_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_curve_id) +#define GRPC_SSL_get_curve_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_curve_name) +#define GRPC_SSL_get_default_timeout BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_default_timeout) +#define GRPC_SSL_get_early_data_reason BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_early_data_reason) +#define GRPC_SSL_get_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_error) +#define GRPC_SSL_get_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_ex_data) +#define GRPC_SSL_get_ex_data_X509_STORE_CTX_idx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_ex_data_X509_STORE_CTX_idx) +#define GRPC_SSL_get_ex_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_ex_new_index) +#define GRPC_SSL_get_extms_support BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_extms_support) +#define GRPC_SSL_get_fd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_fd) +#define GRPC_SSL_get_finished BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_finished) +#define GRPC_SSL_get_info_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_info_callback) +#define GRPC_SSL_get_ivs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_ivs) +#define GRPC_SSL_get_key_block_len BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_key_block_len) +#define GRPC_SSL_get_max_cert_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_max_cert_list) +#define GRPC_SSL_get_max_proto_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_max_proto_version) +#define GRPC_SSL_get_min_proto_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_min_proto_version) +#define GRPC_SSL_get_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_mode) +#define GRPC_SSL_get_negotiated_token_binding_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_negotiated_token_binding_param) +#define GRPC_SSL_get_options BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_options) +#define GRPC_SSL_get_peer_cert_chain BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_peer_cert_chain) +#define GRPC_SSL_get_peer_certificate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_peer_certificate) +#define GRPC_SSL_get_peer_finished BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_peer_finished) +#define GRPC_SSL_get_peer_full_cert_chain BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_peer_full_cert_chain) +#define GRPC_SSL_get_peer_quic_transport_params BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_peer_quic_transport_params) +#define GRPC_SSL_get_peer_signature_algorithm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_peer_signature_algorithm) +#define GRPC_SSL_get_pending_cipher BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_pending_cipher) +#define GRPC_SSL_get_privatekey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_privatekey) +#define GRPC_SSL_get_psk_identity BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_psk_identity) +#define GRPC_SSL_get_psk_identity_hint BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_psk_identity_hint) +#define GRPC_SSL_get_quiet_shutdown BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_quiet_shutdown) +#define GRPC_SSL_get_rbio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_rbio) +#define GRPC_SSL_get_read_ahead BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_read_ahead) +#define GRPC_SSL_get_read_sequence BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_read_sequence) +#define GRPC_SSL_get_rfd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_rfd) +#define GRPC_SSL_get_secure_renegotiation_support BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_secure_renegotiation_support) +#define GRPC_SSL_get_selected_srtp_profile BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_selected_srtp_profile) +#define GRPC_SSL_get_server_random BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_server_random) +#define GRPC_SSL_get_server_tmp_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_server_tmp_key) +#define GRPC_SSL_get_servername BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_servername) +#define GRPC_SSL_get_servername_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_servername_type) +#define GRPC_SSL_get_session BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_session) +#define GRPC_SSL_get_shared_ciphers BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_shared_ciphers) +#define GRPC_SSL_get_shutdown BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_shutdown) +#define GRPC_SSL_get_signature_algorithm_digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_signature_algorithm_digest) +#define GRPC_SSL_get_signature_algorithm_key_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_signature_algorithm_key_type) +#define GRPC_SSL_get_signature_algorithm_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_signature_algorithm_name) +#define GRPC_SSL_get_srtp_profiles BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_srtp_profiles) +#define GRPC_SSL_get_ticket_age_skew BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_ticket_age_skew) +#define GRPC_SSL_get_tls_channel_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_tls_channel_id) +#define GRPC_SSL_get_tls_unique BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_tls_unique) +#define GRPC_SSL_get_tlsext_status_ocsp_resp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_tlsext_status_ocsp_resp) +#define GRPC_SSL_get_tlsext_status_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_tlsext_status_type) +#define GRPC_SSL_get_verify_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_verify_callback) +#define GRPC_SSL_get_verify_depth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_verify_depth) +#define GRPC_SSL_get_verify_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_verify_mode) +#define GRPC_SSL_get_verify_result BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_verify_result) +#define GRPC_SSL_get_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_version) +#define GRPC_SSL_get_wbio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_wbio) +#define GRPC_SSL_get_wfd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_wfd) +#define GRPC_SSL_get_write_sequence BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_write_sequence) +#define GRPC_SSL_in_early_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_in_early_data) +#define GRPC_SSL_in_false_start BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_in_false_start) +#define GRPC_SSL_in_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_in_init) +#define GRPC_SSL_is_dtls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_is_dtls) +#define GRPC_SSL_is_init_finished BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_is_init_finished) +#define GRPC_SSL_is_server BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_is_server) +#define GRPC_SSL_is_signature_algorithm_rsa_pss BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_is_signature_algorithm_rsa_pss) +#define GRPC_SSL_is_tls13_downgrade BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_is_tls13_downgrade) +#define GRPC_SSL_is_token_binding_negotiated BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_is_token_binding_negotiated) +#define GRPC_SSL_key_update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_key_update) +#define GRPC_SSL_library_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_library_init) +#define GRPC_SSL_load_client_CA_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_load_client_CA_file) +#define GRPC_SSL_load_error_strings BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_load_error_strings) +#define GRPC_SSL_magic_pending_session_ptr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_magic_pending_session_ptr) +#define GRPC_SSL_max_seal_overhead BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_max_seal_overhead) +#define GRPC_SSL_need_tmp_RSA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_need_tmp_RSA) +#define GRPC_SSL_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_new) +#define GRPC_SSL_num_renegotiations BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_num_renegotiations) +#define GRPC_SSL_peek BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_peek) +#define GRPC_SSL_pending BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_pending) +#define GRPC_SSL_pq_experiment_signal_seen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_pq_experiment_signal_seen) +#define GRPC_SSL_process_quic_post_handshake BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_process_quic_post_handshake) +#define GRPC_SSL_provide_quic_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_provide_quic_data) +#define GRPC_SSL_quic_max_handshake_flight_len BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_quic_max_handshake_flight_len) +#define GRPC_SSL_quic_read_level BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_quic_read_level) +#define GRPC_SSL_quic_write_level BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_quic_write_level) +#define GRPC_SSL_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_read) +#define GRPC_SSL_renegotiate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_renegotiate) +#define GRPC_SSL_renegotiate_pending BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_renegotiate_pending) +#define GRPC_SSL_reset_early_data_reject BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_reset_early_data_reject) +#define GRPC_SSL_select_next_proto BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_select_next_proto) +#define GRPC_SSL_send_fatal_alert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_send_fatal_alert) +#define GRPC_SSL_session_reused BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_session_reused) +#define GRPC_SSL_set0_chain BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set0_chain) +#define GRPC_SSL_set0_client_CAs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set0_client_CAs) +#define GRPC_SSL_set0_rbio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set0_rbio) +#define GRPC_SSL_set0_verify_cert_store BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set0_verify_cert_store) +#define GRPC_SSL_set0_wbio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set0_wbio) +#define GRPC_SSL_set1_chain BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set1_chain) +#define GRPC_SSL_set1_curves BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set1_curves) +#define GRPC_SSL_set1_curves_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set1_curves_list) +#define GRPC_SSL_set1_delegated_credential BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set1_delegated_credential) +#define GRPC_SSL_set1_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set1_param) +#define GRPC_SSL_set1_sigalgs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set1_sigalgs) +#define GRPC_SSL_set1_sigalgs_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set1_sigalgs_list) +#define GRPC_SSL_set1_tls_channel_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set1_tls_channel_id) +#define GRPC_SSL_set1_verify_cert_store BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set1_verify_cert_store) +#define GRPC_SSL_set_SSL_CTX BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_SSL_CTX) +#define GRPC_SSL_set_accept_state BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_accept_state) +#define GRPC_SSL_set_alpn_protos BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_alpn_protos) +#define GRPC_SSL_set_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_bio) +#define GRPC_SSL_set_cert_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_cert_cb) +#define GRPC_SSL_set_chain_and_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_chain_and_key) +#define GRPC_SSL_set_cipher_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_cipher_list) +#define GRPC_SSL_set_client_CA_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_client_CA_list) +#define GRPC_SSL_set_connect_state BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_connect_state) +#define GRPC_SSL_set_custom_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_custom_verify) +#define GRPC_SSL_set_early_data_enabled BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_early_data_enabled) +#define GRPC_SSL_set_enforce_rsa_key_usage BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_enforce_rsa_key_usage) +#define GRPC_SSL_set_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_ex_data) +#define GRPC_SSL_set_fd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_fd) +#define GRPC_SSL_set_ignore_tls13_downgrade BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_ignore_tls13_downgrade) +#define GRPC_SSL_set_info_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_info_callback) +#define GRPC_SSL_set_jdk11_workaround BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_jdk11_workaround) +#define GRPC_SSL_set_max_cert_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_max_cert_list) +#define GRPC_SSL_set_max_proto_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_max_proto_version) +#define GRPC_SSL_set_max_send_fragment BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_max_send_fragment) +#define GRPC_SSL_set_min_proto_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_min_proto_version) +#define GRPC_SSL_set_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_mode) +#define GRPC_SSL_set_msg_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_msg_callback) +#define GRPC_SSL_set_msg_callback_arg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_msg_callback_arg) +#define GRPC_SSL_set_mtu BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_mtu) +#define GRPC_SSL_set_ocsp_response BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_ocsp_response) +#define GRPC_SSL_set_options BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_options) +#define GRPC_SSL_set_private_key_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_private_key_method) +#define GRPC_SSL_set_psk_client_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_psk_client_callback) +#define GRPC_SSL_set_psk_server_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_psk_server_callback) +#define GRPC_SSL_set_purpose BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_purpose) +#define GRPC_SSL_set_quic_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_quic_method) +#define GRPC_SSL_set_quic_transport_params BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_quic_transport_params) +#define GRPC_SSL_set_quiet_shutdown BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_quiet_shutdown) +#define GRPC_SSL_set_read_ahead BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_read_ahead) +#define GRPC_SSL_set_renegotiate_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_renegotiate_mode) +#define GRPC_SSL_set_retain_only_sha256_of_client_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_retain_only_sha256_of_client_certs) +#define GRPC_SSL_set_rfd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_rfd) +#define GRPC_SSL_set_session BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_session) +#define GRPC_SSL_set_session_id_context BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_session_id_context) +#define GRPC_SSL_set_shed_handshake_config BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_shed_handshake_config) +#define GRPC_SSL_set_shutdown BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_shutdown) +#define GRPC_SSL_set_signed_cert_timestamp_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_signed_cert_timestamp_list) +#define GRPC_SSL_set_signing_algorithm_prefs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_signing_algorithm_prefs) +#define GRPC_SSL_set_srtp_profiles BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_srtp_profiles) +#define GRPC_SSL_set_state BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_state) +#define GRPC_SSL_set_strict_cipher_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_strict_cipher_list) +#define GRPC_SSL_set_tls_channel_id_enabled BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_tls_channel_id_enabled) +#define GRPC_SSL_set_tlsext_host_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_tlsext_host_name) +#define GRPC_SSL_set_tlsext_status_ocsp_resp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_tlsext_status_ocsp_resp) +#define GRPC_SSL_set_tlsext_status_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_tlsext_status_type) +#define GRPC_SSL_set_tlsext_use_srtp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_tlsext_use_srtp) +#define GRPC_SSL_set_tmp_dh BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_tmp_dh) +#define GRPC_SSL_set_tmp_dh_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_tmp_dh_callback) +#define GRPC_SSL_set_tmp_ecdh BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_tmp_ecdh) +#define GRPC_SSL_set_tmp_rsa BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_tmp_rsa) +#define GRPC_SSL_set_tmp_rsa_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_tmp_rsa_callback) +#define GRPC_SSL_set_token_binding_params BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_token_binding_params) +#define GRPC_SSL_set_trust BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_trust) +#define GRPC_SSL_set_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_verify) +#define GRPC_SSL_set_verify_depth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_verify_depth) +#define GRPC_SSL_set_verify_result BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_verify_result) +#define GRPC_SSL_set_wfd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_wfd) +#define GRPC_SSL_shutdown BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_shutdown) +#define GRPC_SSL_state BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_state) +#define GRPC_SSL_state_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_state_string) +#define GRPC_SSL_state_string_long BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_state_string_long) +#define GRPC_SSL_total_renegotiations BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_total_renegotiations) +#define GRPC_SSL_use_PrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_use_PrivateKey) +#define GRPC_SSL_use_PrivateKey_ASN1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_use_PrivateKey_ASN1) +#define GRPC_SSL_use_PrivateKey_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_use_PrivateKey_file) +#define GRPC_SSL_use_RSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_use_RSAPrivateKey) +#define GRPC_SSL_use_RSAPrivateKey_ASN1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_use_RSAPrivateKey_ASN1) +#define GRPC_SSL_use_RSAPrivateKey_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_use_RSAPrivateKey_file) +#define GRPC_SSL_use_certificate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_use_certificate) +#define GRPC_SSL_use_certificate_ASN1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_use_certificate_ASN1) +#define GRPC_SSL_use_certificate_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_use_certificate_file) +#define GRPC_SSL_use_psk_identity_hint BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_use_psk_identity_hint) +#define GRPC_SSL_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_version) +#define GRPC_SSL_want BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_want) +#define GRPC_SSL_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_write) +#define GRPC_SSLv23_client_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSLv23_client_method) +#define GRPC_SSLv23_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSLv23_method) +#define GRPC_SSLv23_server_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSLv23_server_method) +#define GRPC_TLS_client_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_TLS_client_method) +#define GRPC_TLS_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_TLS_method) +#define GRPC_TLS_server_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_TLS_server_method) +#define GRPC_TLS_with_buffers_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_TLS_with_buffers_method) +#define GRPC_TLSv1_1_client_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_TLSv1_1_client_method) +#define GRPC_TLSv1_1_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_TLSv1_1_method) +#define GRPC_TLSv1_1_server_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_TLSv1_1_server_method) +#define GRPC_TLSv1_2_client_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_TLSv1_2_client_method) +#define GRPC_TLSv1_2_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_TLSv1_2_method) +#define GRPC_TLSv1_2_server_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_TLSv1_2_server_method) +#define GRPC_TLSv1_client_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_TLSv1_client_method) +#define GRPC_TLSv1_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_TLSv1_method) +#define GRPC_TLSv1_server_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_TLSv1_server_method) +#define GRPC_d2i_SSL_SESSION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_SSL_SESSION) +#define GRPC_d2i_SSL_SESSION_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_SSL_SESSION_bio) +#define GRPC_i2d_SSL_SESSION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_SSL_SESSION) +#define GRPC_i2d_SSL_SESSION_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_SSL_SESSION_bio) +#define GRPC_sk_CRYPTO_BUFFER_call_copy_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_CRYPTO_BUFFER_call_copy_func) +#define GRPC_sk_CRYPTO_BUFFER_call_free_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_CRYPTO_BUFFER_call_free_func) +#define GRPC_sk_CRYPTO_BUFFER_deep_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_CRYPTO_BUFFER_deep_copy) +#define GRPC_sk_CRYPTO_BUFFER_new_null BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_CRYPTO_BUFFER_new_null) +#define GRPC_sk_CRYPTO_BUFFER_num BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_CRYPTO_BUFFER_num) +#define GRPC_sk_CRYPTO_BUFFER_push BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_CRYPTO_BUFFER_push) +#define GRPC_sk_CRYPTO_BUFFER_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_CRYPTO_BUFFER_set) +#define GRPC_sk_CRYPTO_BUFFER_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_CRYPTO_BUFFER_value) +#define GRPC_sk_SRTP_PROTECTION_PROFILE_new_null BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_SRTP_PROTECTION_PROFILE_new_null) +#define GRPC_sk_SRTP_PROTECTION_PROFILE_num BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_SRTP_PROTECTION_PROFILE_num) +#define GRPC_sk_SRTP_PROTECTION_PROFILE_push BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_SRTP_PROTECTION_PROFILE_push) +#define GRPC_sk_SSL_CIPHER_call_cmp_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_SSL_CIPHER_call_cmp_func) +#define GRPC_sk_SSL_CIPHER_delete BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_SSL_CIPHER_delete) +#define GRPC_sk_SSL_CIPHER_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_SSL_CIPHER_dup) +#define GRPC_sk_SSL_CIPHER_find BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_SSL_CIPHER_find) +#define GRPC_sk_SSL_CIPHER_new_null BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_SSL_CIPHER_new_null) +#define GRPC_sk_SSL_CIPHER_num BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_SSL_CIPHER_num) +#define GRPC_sk_SSL_CIPHER_push BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_SSL_CIPHER_push) +#define GRPC_sk_SSL_CIPHER_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_SSL_CIPHER_value) +#define GRPC_sk_X509_NAME_call_cmp_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_X509_NAME_call_cmp_func) +#define GRPC_sk_X509_NAME_call_copy_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_X509_NAME_call_copy_func) +#define GRPC_sk_X509_NAME_call_free_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_X509_NAME_call_free_func) +#define GRPC_sk_X509_NAME_deep_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_X509_NAME_deep_copy) +#define GRPC_sk_X509_NAME_find BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_X509_NAME_find) +#define GRPC_sk_X509_NAME_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_X509_NAME_free) +#define GRPC_sk_X509_NAME_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_X509_NAME_new) +#define GRPC_sk_X509_NAME_new_null BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_X509_NAME_new_null) +#define GRPC_sk_X509_NAME_pop_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_X509_NAME_pop_free) +#define GRPC_sk_X509_NAME_push BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_X509_NAME_push) +#define GRPC_sk_X509_NAME_set_cmp_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_X509_NAME_set_cmp_func) +#define GRPC_sk_X509_NAME_sort BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_X509_NAME_sort) +#define GRPC_sk_X509_call_free_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_X509_call_free_func) +#define GRPC_sk_X509_new_null BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_X509_new_null) +#define GRPC_sk_X509_num BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_X509_num) +#define GRPC_sk_X509_pop_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_X509_pop_free) +#define GRPC_sk_X509_shift BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_X509_shift) +#define GRPC_sk_X509_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_X509_value) +#define GRPC_ACCESS_DESCRIPTION_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ACCESS_DESCRIPTION_free) +#define GRPC_ACCESS_DESCRIPTION_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ACCESS_DESCRIPTION_it) +#define GRPC_ACCESS_DESCRIPTION_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ACCESS_DESCRIPTION_new) +#define GRPC_AES_CMAC BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_AES_CMAC) +#define GRPC_AES_cbc_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_AES_cbc_encrypt) +#define GRPC_AES_cfb128_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_AES_cfb128_encrypt) +#define GRPC_AES_ctr128_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_AES_ctr128_encrypt) +#define GRPC_AES_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_AES_decrypt) +#define GRPC_AES_ecb_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_AES_ecb_encrypt) +#define GRPC_AES_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_AES_encrypt) +#define GRPC_AES_ofb128_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_AES_ofb128_encrypt) +#define GRPC_AES_set_decrypt_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_AES_set_decrypt_key) +#define GRPC_AES_set_encrypt_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_AES_set_encrypt_key) +#define GRPC_AES_unwrap_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_AES_unwrap_key) +#define GRPC_AES_unwrap_key_padded BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_AES_unwrap_key_padded) +#define GRPC_AES_wrap_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_AES_wrap_key) +#define GRPC_AES_wrap_key_padded BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_AES_wrap_key_padded) +#define GRPC_ASN1_ANY_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_ANY_it) +#define GRPC_ASN1_BIT_STRING_check BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_BIT_STRING_check) +#define GRPC_ASN1_BIT_STRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_BIT_STRING_free) +#define GRPC_ASN1_BIT_STRING_get_bit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_BIT_STRING_get_bit) +#define GRPC_ASN1_BIT_STRING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_BIT_STRING_it) +#define GRPC_ASN1_BIT_STRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_BIT_STRING_new) +#define GRPC_ASN1_BIT_STRING_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_BIT_STRING_set) +#define GRPC_ASN1_BIT_STRING_set_bit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_BIT_STRING_set_bit) +#define GRPC_ASN1_BMPSTRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_BMPSTRING_free) +#define GRPC_ASN1_BMPSTRING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_BMPSTRING_it) +#define GRPC_ASN1_BMPSTRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_BMPSTRING_new) +#define GRPC_ASN1_BOOLEAN_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_BOOLEAN_it) +#define GRPC_ASN1_ENUMERATED_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_ENUMERATED_free) +#define GRPC_ASN1_ENUMERATED_get BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_ENUMERATED_get) +#define GRPC_ASN1_ENUMERATED_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_ENUMERATED_it) +#define GRPC_ASN1_ENUMERATED_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_ENUMERATED_new) +#define GRPC_ASN1_ENUMERATED_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_ENUMERATED_set) +#define GRPC_ASN1_ENUMERATED_to_BN BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_ENUMERATED_to_BN) +#define GRPC_ASN1_FBOOLEAN_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_FBOOLEAN_it) +#define GRPC_ASN1_GENERALIZEDTIME_adj BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_GENERALIZEDTIME_adj) +#define GRPC_ASN1_GENERALIZEDTIME_check BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_GENERALIZEDTIME_check) +#define GRPC_ASN1_GENERALIZEDTIME_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_GENERALIZEDTIME_free) +#define GRPC_ASN1_GENERALIZEDTIME_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_GENERALIZEDTIME_it) +#define GRPC_ASN1_GENERALIZEDTIME_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_GENERALIZEDTIME_new) +#define GRPC_ASN1_GENERALIZEDTIME_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_GENERALIZEDTIME_print) +#define GRPC_ASN1_GENERALIZEDTIME_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_GENERALIZEDTIME_set) +#define GRPC_ASN1_GENERALIZEDTIME_set_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_GENERALIZEDTIME_set_string) +#define GRPC_ASN1_GENERALSTRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_GENERALSTRING_free) +#define GRPC_ASN1_GENERALSTRING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_GENERALSTRING_it) +#define GRPC_ASN1_GENERALSTRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_GENERALSTRING_new) +#define GRPC_ASN1_IA5STRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_IA5STRING_free) +#define GRPC_ASN1_IA5STRING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_IA5STRING_it) +#define GRPC_ASN1_IA5STRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_IA5STRING_new) +#define GRPC_ASN1_INTEGER_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_INTEGER_cmp) +#define GRPC_ASN1_INTEGER_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_INTEGER_dup) +#define GRPC_ASN1_INTEGER_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_INTEGER_free) +#define GRPC_ASN1_INTEGER_get BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_INTEGER_get) +#define GRPC_ASN1_INTEGER_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_INTEGER_it) +#define GRPC_ASN1_INTEGER_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_INTEGER_new) +#define GRPC_ASN1_INTEGER_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_INTEGER_set) +#define GRPC_ASN1_INTEGER_set_uint64 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_INTEGER_set_uint64) +#define GRPC_ASN1_INTEGER_to_BN BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_INTEGER_to_BN) +#define GRPC_ASN1_NULL_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_NULL_free) +#define GRPC_ASN1_NULL_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_NULL_it) +#define GRPC_ASN1_NULL_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_NULL_new) +#define GRPC_ASN1_OBJECT_create BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_OBJECT_create) +#define GRPC_ASN1_OBJECT_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_OBJECT_free) +#define GRPC_ASN1_OBJECT_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_OBJECT_it) +#define GRPC_ASN1_OBJECT_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_OBJECT_new) +#define GRPC_ASN1_OCTET_STRING_NDEF_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_OCTET_STRING_NDEF_it) +#define GRPC_ASN1_OCTET_STRING_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_OCTET_STRING_cmp) +#define GRPC_ASN1_OCTET_STRING_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_OCTET_STRING_dup) +#define GRPC_ASN1_OCTET_STRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_OCTET_STRING_free) +#define GRPC_ASN1_OCTET_STRING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_OCTET_STRING_it) +#define GRPC_ASN1_OCTET_STRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_OCTET_STRING_new) +#define GRPC_ASN1_OCTET_STRING_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_OCTET_STRING_set) +#define GRPC_ASN1_PRINTABLESTRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_PRINTABLESTRING_free) +#define GRPC_ASN1_PRINTABLESTRING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_PRINTABLESTRING_it) +#define GRPC_ASN1_PRINTABLESTRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_PRINTABLESTRING_new) +#define GRPC_ASN1_PRINTABLE_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_PRINTABLE_free) +#define GRPC_ASN1_PRINTABLE_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_PRINTABLE_it) +#define GRPC_ASN1_PRINTABLE_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_PRINTABLE_new) +#define GRPC_ASN1_PRINTABLE_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_PRINTABLE_type) +#define GRPC_ASN1_SEQUENCE_ANY_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_SEQUENCE_ANY_it) +#define GRPC_ASN1_SEQUENCE_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_SEQUENCE_it) +#define GRPC_ASN1_SET_ANY_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_SET_ANY_it) +#define GRPC_ASN1_STRING_TABLE_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_STRING_TABLE_add) +#define GRPC_ASN1_STRING_TABLE_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_STRING_TABLE_cleanup) +#define GRPC_ASN1_STRING_TABLE_get BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_STRING_TABLE_get) +#define GRPC_ASN1_STRING_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_STRING_cmp) +#define GRPC_ASN1_STRING_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_STRING_copy) +#define GRPC_ASN1_STRING_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_STRING_data) +#define GRPC_ASN1_STRING_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_STRING_dup) +#define GRPC_ASN1_STRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_STRING_free) +#define GRPC_ASN1_STRING_get0_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_STRING_get0_data) +#define GRPC_ASN1_STRING_get_default_mask BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_STRING_get_default_mask) +#define GRPC_ASN1_STRING_length BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_STRING_length) +#define GRPC_ASN1_STRING_length_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_STRING_length_set) +#define GRPC_ASN1_STRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_STRING_new) +#define GRPC_ASN1_STRING_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_STRING_print) +#define GRPC_ASN1_STRING_print_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_STRING_print_ex) +#define GRPC_ASN1_STRING_print_ex_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_STRING_print_ex_fp) +#define GRPC_ASN1_STRING_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_STRING_set) +#define GRPC_ASN1_STRING_set0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_STRING_set0) +#define GRPC_ASN1_STRING_set_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_STRING_set_by_NID) +#define GRPC_ASN1_STRING_set_default_mask BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_STRING_set_default_mask) +#define GRPC_ASN1_STRING_set_default_mask_asc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_STRING_set_default_mask_asc) +#define GRPC_ASN1_STRING_to_UTF8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_STRING_to_UTF8) +#define GRPC_ASN1_STRING_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_STRING_type) +#define GRPC_ASN1_STRING_type_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_STRING_type_new) +#define GRPC_ASN1_T61STRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_T61STRING_free) +#define GRPC_ASN1_T61STRING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_T61STRING_it) +#define GRPC_ASN1_T61STRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_T61STRING_new) +#define GRPC_ASN1_TBOOLEAN_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_TBOOLEAN_it) +#define GRPC_ASN1_TIME_adj BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_TIME_adj) +#define GRPC_ASN1_TIME_check BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_TIME_check) +#define GRPC_ASN1_TIME_diff BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_TIME_diff) +#define GRPC_ASN1_TIME_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_TIME_free) +#define GRPC_ASN1_TIME_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_TIME_it) +#define GRPC_ASN1_TIME_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_TIME_new) +#define GRPC_ASN1_TIME_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_TIME_print) +#define GRPC_ASN1_TIME_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_TIME_set) +#define GRPC_ASN1_TIME_set_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_TIME_set_string) +#define GRPC_ASN1_TIME_to_generalizedtime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_TIME_to_generalizedtime) +#define GRPC_ASN1_TYPE_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_TYPE_cmp) +#define GRPC_ASN1_TYPE_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_TYPE_free) +#define GRPC_ASN1_TYPE_get BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_TYPE_get) +#define GRPC_ASN1_TYPE_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_TYPE_new) +#define GRPC_ASN1_TYPE_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_TYPE_set) +#define GRPC_ASN1_TYPE_set1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_TYPE_set1) +#define GRPC_ASN1_UNIVERSALSTRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_UNIVERSALSTRING_free) +#define GRPC_ASN1_UNIVERSALSTRING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_UNIVERSALSTRING_it) +#define GRPC_ASN1_UNIVERSALSTRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_UNIVERSALSTRING_new) +#define GRPC_ASN1_UTCTIME_adj BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_UTCTIME_adj) +#define GRPC_ASN1_UTCTIME_check BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_UTCTIME_check) +#define GRPC_ASN1_UTCTIME_cmp_time_t BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_UTCTIME_cmp_time_t) +#define GRPC_ASN1_UTCTIME_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_UTCTIME_free) +#define GRPC_ASN1_UTCTIME_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_UTCTIME_it) +#define GRPC_ASN1_UTCTIME_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_UTCTIME_new) +#define GRPC_ASN1_UTCTIME_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_UTCTIME_print) +#define GRPC_ASN1_UTCTIME_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_UTCTIME_set) +#define GRPC_ASN1_UTCTIME_set_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_UTCTIME_set_string) +#define GRPC_ASN1_UTF8STRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_UTF8STRING_free) +#define GRPC_ASN1_UTF8STRING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_UTF8STRING_it) +#define GRPC_ASN1_UTF8STRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_UTF8STRING_new) +#define GRPC_ASN1_VISIBLESTRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_VISIBLESTRING_free) +#define GRPC_ASN1_VISIBLESTRING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_VISIBLESTRING_it) +#define GRPC_ASN1_VISIBLESTRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_VISIBLESTRING_new) +#define GRPC_ASN1_digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_digest) +#define GRPC_ASN1_generate_nconf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_generate_nconf) +#define GRPC_ASN1_generate_v3 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_generate_v3) +#define GRPC_ASN1_get_object BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_get_object) +#define GRPC_ASN1_item_d2i BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_item_d2i) +#define GRPC_ASN1_item_d2i_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_item_d2i_bio) +#define GRPC_ASN1_item_d2i_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_item_d2i_fp) +#define GRPC_ASN1_item_digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_item_digest) +#define GRPC_ASN1_item_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_item_dup) +#define GRPC_ASN1_item_ex_d2i BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_item_ex_d2i) +#define GRPC_ASN1_item_ex_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_item_ex_free) +#define GRPC_ASN1_item_ex_i2d BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_item_ex_i2d) +#define GRPC_ASN1_item_ex_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_item_ex_new) +#define GRPC_ASN1_item_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_item_free) +#define GRPC_ASN1_item_i2d BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_item_i2d) +#define GRPC_ASN1_item_i2d_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_item_i2d_bio) +#define GRPC_ASN1_item_i2d_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_item_i2d_fp) +#define GRPC_ASN1_item_ndef_i2d BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_item_ndef_i2d) +#define GRPC_ASN1_item_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_item_new) +#define GRPC_ASN1_item_pack BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_item_pack) +#define GRPC_ASN1_item_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_item_sign) +#define GRPC_ASN1_item_sign_ctx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_item_sign_ctx) +#define GRPC_ASN1_item_unpack BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_item_unpack) +#define GRPC_ASN1_item_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_item_verify) +#define GRPC_ASN1_mbstring_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_mbstring_copy) +#define GRPC_ASN1_mbstring_ncopy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_mbstring_ncopy) +#define GRPC_ASN1_object_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_object_size) +#define GRPC_ASN1_primitive_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_primitive_free) +#define GRPC_ASN1_primitive_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_primitive_new) +#define GRPC_ASN1_put_eoc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_put_eoc) +#define GRPC_ASN1_put_object BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_put_object) +#define GRPC_ASN1_tag2bit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_tag2bit) +#define GRPC_ASN1_tag2str BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_tag2str) +#define GRPC_ASN1_template_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_template_free) +#define GRPC_ASN1_template_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_template_new) +#define GRPC_AUTHORITY_INFO_ACCESS_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_AUTHORITY_INFO_ACCESS_free) +#define GRPC_AUTHORITY_INFO_ACCESS_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_AUTHORITY_INFO_ACCESS_it) +#define GRPC_AUTHORITY_INFO_ACCESS_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_AUTHORITY_INFO_ACCESS_new) +#define GRPC_AUTHORITY_KEYID_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_AUTHORITY_KEYID_free) +#define GRPC_AUTHORITY_KEYID_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_AUTHORITY_KEYID_it) +#define GRPC_AUTHORITY_KEYID_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_AUTHORITY_KEYID_new) +#define GRPC_BASIC_CONSTRAINTS_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BASIC_CONSTRAINTS_free) +#define GRPC_BASIC_CONSTRAINTS_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BASIC_CONSTRAINTS_it) +#define GRPC_BASIC_CONSTRAINTS_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BASIC_CONSTRAINTS_new) +#define GRPC_BIO_append_filename BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_append_filename) +#define GRPC_BIO_callback_ctrl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_callback_ctrl) +#define GRPC_BIO_clear_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_clear_flags) +#define GRPC_BIO_clear_retry_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_clear_retry_flags) +#define GRPC_BIO_copy_next_retry BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_copy_next_retry) +#define GRPC_BIO_ctrl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_ctrl) +#define GRPC_BIO_ctrl_get_read_request BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_ctrl_get_read_request) +#define GRPC_BIO_ctrl_get_write_guarantee BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_ctrl_get_write_guarantee) +#define GRPC_BIO_ctrl_pending BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_ctrl_pending) +#define GRPC_BIO_do_connect BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_do_connect) +#define GRPC_BIO_eof BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_eof) +#define GRPC_BIO_find_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_find_type) +#define GRPC_BIO_flush BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_flush) +#define GRPC_BIO_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_free) +#define GRPC_BIO_free_all BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_free_all) +#define GRPC_BIO_get_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_get_data) +#define GRPC_BIO_get_fd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_get_fd) +#define GRPC_BIO_get_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_get_fp) +#define GRPC_BIO_get_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_get_init) +#define GRPC_BIO_get_mem_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_get_mem_data) +#define GRPC_BIO_get_mem_ptr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_get_mem_ptr) +#define GRPC_BIO_get_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_get_new_index) +#define GRPC_BIO_get_retry_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_get_retry_flags) +#define GRPC_BIO_get_retry_reason BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_get_retry_reason) +#define GRPC_BIO_get_shutdown BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_get_shutdown) +#define GRPC_BIO_gets BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_gets) +#define GRPC_BIO_hexdump BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_hexdump) +#define GRPC_BIO_indent BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_indent) +#define GRPC_BIO_int_ctrl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_int_ctrl) +#define GRPC_BIO_mem_contents BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_mem_contents) +#define GRPC_BIO_meth_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_meth_free) +#define GRPC_BIO_meth_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_meth_new) +#define GRPC_BIO_meth_set_create BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_meth_set_create) +#define GRPC_BIO_meth_set_ctrl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_meth_set_ctrl) +#define GRPC_BIO_meth_set_destroy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_meth_set_destroy) +#define GRPC_BIO_meth_set_gets BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_meth_set_gets) +#define GRPC_BIO_meth_set_puts BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_meth_set_puts) +#define GRPC_BIO_meth_set_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_meth_set_read) +#define GRPC_BIO_meth_set_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_meth_set_write) +#define GRPC_BIO_method_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_method_type) +#define GRPC_BIO_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_new) +#define GRPC_BIO_new_bio_pair BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_new_bio_pair) +#define GRPC_BIO_new_connect BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_new_connect) +#define GRPC_BIO_new_fd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_new_fd) +#define GRPC_BIO_new_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_new_file) +#define GRPC_BIO_new_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_new_fp) +#define GRPC_BIO_new_mem_buf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_new_mem_buf) +#define GRPC_BIO_new_socket BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_new_socket) +#define GRPC_BIO_next BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_next) +#define GRPC_BIO_number_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_number_read) +#define GRPC_BIO_number_written BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_number_written) +#define GRPC_BIO_pending BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_pending) +#define GRPC_BIO_pop BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_pop) +#define GRPC_BIO_printf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_printf) +#define GRPC_BIO_ptr_ctrl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_ptr_ctrl) +#define GRPC_BIO_push BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_push) +#define GRPC_BIO_puts BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_puts) +#define GRPC_BIO_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_read) +#define GRPC_BIO_read_asn1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_read_asn1) +#define GRPC_BIO_read_filename BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_read_filename) +#define GRPC_BIO_reset BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_reset) +#define GRPC_BIO_rw_filename BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_rw_filename) +#define GRPC_BIO_s_connect BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_s_connect) +#define GRPC_BIO_s_fd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_s_fd) +#define GRPC_BIO_s_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_s_file) +#define GRPC_BIO_s_mem BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_s_mem) +#define GRPC_BIO_s_socket BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_s_socket) +#define GRPC_BIO_set_close BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_set_close) +#define GRPC_BIO_set_conn_hostname BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_set_conn_hostname) +#define GRPC_BIO_set_conn_int_port BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_set_conn_int_port) +#define GRPC_BIO_set_conn_port BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_set_conn_port) +#define GRPC_BIO_set_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_set_data) +#define GRPC_BIO_set_fd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_set_fd) +#define GRPC_BIO_set_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_set_flags) +#define GRPC_BIO_set_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_set_fp) +#define GRPC_BIO_set_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_set_init) +#define GRPC_BIO_set_mem_buf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_set_mem_buf) +#define GRPC_BIO_set_mem_eof_return BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_set_mem_eof_return) +#define GRPC_BIO_set_nbio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_set_nbio) +#define GRPC_BIO_set_retry_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_set_retry_read) +#define GRPC_BIO_set_retry_special BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_set_retry_special) +#define GRPC_BIO_set_retry_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_set_retry_write) +#define GRPC_BIO_set_shutdown BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_set_shutdown) +#define GRPC_BIO_set_write_buffer_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_set_write_buffer_size) +#define GRPC_BIO_should_io_special BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_should_io_special) +#define GRPC_BIO_should_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_should_read) +#define GRPC_BIO_should_retry BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_should_retry) +#define GRPC_BIO_should_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_should_write) +#define GRPC_BIO_shutdown_wr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_shutdown_wr) +#define GRPC_BIO_snprintf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_snprintf) +#define GRPC_BIO_test_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_test_flags) +#define GRPC_BIO_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_up_ref) +#define GRPC_BIO_vfree BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_vfree) +#define GRPC_BIO_vsnprintf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_vsnprintf) +#define GRPC_BIO_wpending BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_wpending) +#define GRPC_BIO_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_write) +#define GRPC_BIO_write_all BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_write_all) +#define GRPC_BIO_write_filename BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_write_filename) +#define GRPC_BN_BLINDING_convert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_BLINDING_convert) +#define GRPC_BN_BLINDING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_BLINDING_free) +#define GRPC_BN_BLINDING_invert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_BLINDING_invert) +#define GRPC_BN_BLINDING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_BLINDING_new) +#define GRPC_BN_CTX_end BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_CTX_end) +#define GRPC_BN_CTX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_CTX_free) +#define GRPC_BN_CTX_get BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_CTX_get) +#define GRPC_BN_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_CTX_new) +#define GRPC_BN_CTX_start BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_CTX_start) +#define GRPC_BN_GENCB_call BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_GENCB_call) +#define GRPC_BN_GENCB_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_GENCB_set) +#define GRPC_BN_MONT_CTX_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_MONT_CTX_copy) +#define GRPC_BN_MONT_CTX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_MONT_CTX_free) +#define GRPC_BN_MONT_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_MONT_CTX_new) +#define GRPC_BN_MONT_CTX_new_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_MONT_CTX_new_consttime) +#define GRPC_BN_MONT_CTX_new_for_modulus BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_MONT_CTX_new_for_modulus) +#define GRPC_BN_MONT_CTX_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_MONT_CTX_set) +#define GRPC_BN_MONT_CTX_set_locked BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_MONT_CTX_set_locked) +#define GRPC_BN_abs_is_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_abs_is_word) +#define GRPC_BN_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_add) +#define GRPC_BN_add_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_add_word) +#define GRPC_BN_asc2bn BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_asc2bn) +#define GRPC_BN_bin2bn BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_bin2bn) +#define GRPC_BN_bn2bin BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_bn2bin) +#define GRPC_BN_bn2bin_padded BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_bn2bin_padded) +#define GRPC_BN_bn2binpad BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_bn2binpad) +#define GRPC_BN_bn2cbb_padded BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_bn2cbb_padded) +#define GRPC_BN_bn2dec BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_bn2dec) +#define GRPC_BN_bn2hex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_bn2hex) +#define GRPC_BN_bn2le_padded BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_bn2le_padded) +#define GRPC_BN_bn2mpi BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_bn2mpi) +#define GRPC_BN_clear BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_clear) +#define GRPC_BN_clear_bit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_clear_bit) +#define GRPC_BN_clear_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_clear_free) +#define GRPC_BN_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_cmp) +#define GRPC_BN_cmp_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_cmp_word) +#define GRPC_BN_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_copy) +#define GRPC_BN_count_low_zero_bits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_count_low_zero_bits) +#define GRPC_BN_dec2bn BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_dec2bn) +#define GRPC_BN_div BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_div) +#define GRPC_BN_div_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_div_word) +#define GRPC_BN_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_dup) +#define GRPC_BN_enhanced_miller_rabin_primality_test BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_enhanced_miller_rabin_primality_test) +#define GRPC_BN_equal_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_equal_consttime) +#define GRPC_BN_exp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_exp) +#define GRPC_BN_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_free) +#define GRPC_BN_from_montgomery BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_from_montgomery) +#define GRPC_BN_gcd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_gcd) +#define GRPC_BN_generate_prime_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_generate_prime_ex) +#define GRPC_BN_get_rfc3526_prime_1536 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_get_rfc3526_prime_1536) +#define GRPC_BN_get_u64 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_get_u64) +#define GRPC_BN_get_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_get_word) +#define GRPC_BN_hex2bn BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_hex2bn) +#define GRPC_BN_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_init) +#define GRPC_BN_is_bit_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_is_bit_set) +#define GRPC_BN_is_negative BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_is_negative) +#define GRPC_BN_is_odd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_is_odd) +#define GRPC_BN_is_one BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_is_one) +#define GRPC_BN_is_pow2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_is_pow2) +#define GRPC_BN_is_prime_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_is_prime_ex) +#define GRPC_BN_is_prime_fasttest_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_is_prime_fasttest_ex) +#define GRPC_BN_is_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_is_word) +#define GRPC_BN_is_zero BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_is_zero) +#define GRPC_BN_le2bn BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_le2bn) +#define GRPC_BN_lshift BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_lshift) +#define GRPC_BN_lshift1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_lshift1) +#define GRPC_BN_marshal_asn1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_marshal_asn1) +#define GRPC_BN_mask_bits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_mask_bits) +#define GRPC_BN_mod_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_mod_add) +#define GRPC_BN_mod_add_quick BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_mod_add_quick) +#define GRPC_BN_mod_exp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_mod_exp) +#define GRPC_BN_mod_exp2_mont BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_mod_exp2_mont) +#define GRPC_BN_mod_exp_mont BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_mod_exp_mont) +#define GRPC_BN_mod_exp_mont_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_mod_exp_mont_consttime) +#define GRPC_BN_mod_exp_mont_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_mod_exp_mont_word) +#define GRPC_BN_mod_inverse BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_mod_inverse) +#define GRPC_BN_mod_inverse_blinded BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_mod_inverse_blinded) +#define GRPC_BN_mod_inverse_odd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_mod_inverse_odd) +#define GRPC_BN_mod_lshift BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_mod_lshift) +#define GRPC_BN_mod_lshift1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_mod_lshift1) +#define GRPC_BN_mod_lshift1_quick BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_mod_lshift1_quick) +#define GRPC_BN_mod_lshift_quick BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_mod_lshift_quick) +#define GRPC_BN_mod_mul BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_mod_mul) +#define GRPC_BN_mod_mul_montgomery BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_mod_mul_montgomery) +#define GRPC_BN_mod_pow2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_mod_pow2) +#define GRPC_BN_mod_sqr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_mod_sqr) +#define GRPC_BN_mod_sqrt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_mod_sqrt) +#define GRPC_BN_mod_sub BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_mod_sub) +#define GRPC_BN_mod_sub_quick BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_mod_sub_quick) +#define GRPC_BN_mod_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_mod_word) +#define GRPC_BN_mpi2bn BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_mpi2bn) +#define GRPC_BN_mul BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_mul) +#define GRPC_BN_mul_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_mul_word) +#define GRPC_BN_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_new) +#define GRPC_BN_nnmod BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_nnmod) +#define GRPC_BN_nnmod_pow2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_nnmod_pow2) +#define GRPC_BN_num_bits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_num_bits) +#define GRPC_BN_num_bits_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_num_bits_word) +#define GRPC_BN_num_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_num_bytes) +#define GRPC_BN_one BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_one) +#define GRPC_BN_parse_asn1_unsigned BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_parse_asn1_unsigned) +#define GRPC_BN_primality_test BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_primality_test) +#define GRPC_BN_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_print) +#define GRPC_BN_print_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_print_fp) +#define GRPC_BN_pseudo_rand BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_pseudo_rand) +#define GRPC_BN_pseudo_rand_range BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_pseudo_rand_range) +#define GRPC_BN_rand BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_rand) +#define GRPC_BN_rand_range BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_rand_range) +#define GRPC_BN_rand_range_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_rand_range_ex) +#define GRPC_BN_rshift BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_rshift) +#define GRPC_BN_rshift1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_rshift1) +#define GRPC_BN_set_bit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_set_bit) +#define GRPC_BN_set_negative BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_set_negative) +#define GRPC_BN_set_u64 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_set_u64) +#define GRPC_BN_set_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_set_word) +#define GRPC_BN_sqr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_sqr) +#define GRPC_BN_sqrt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_sqrt) +#define GRPC_BN_sub BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_sub) +#define GRPC_BN_sub_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_sub_word) +#define GRPC_BN_to_ASN1_ENUMERATED BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_to_ASN1_ENUMERATED) +#define GRPC_BN_to_ASN1_INTEGER BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_to_ASN1_INTEGER) +#define GRPC_BN_to_montgomery BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_to_montgomery) +#define GRPC_BN_uadd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_uadd) +#define GRPC_BN_ucmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_ucmp) +#define GRPC_BN_usub BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_usub) +#define GRPC_BN_value_one BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_value_one) +#define GRPC_BN_zero BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_zero) +#define GRPC_BORINGSSL_function_hit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BORINGSSL_function_hit) +#define GRPC_BORINGSSL_self_test BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BORINGSSL_self_test) +#define GRPC_BUF_MEM_append BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BUF_MEM_append) +#define GRPC_BUF_MEM_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BUF_MEM_free) +#define GRPC_BUF_MEM_grow BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BUF_MEM_grow) +#define GRPC_BUF_MEM_grow_clean BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BUF_MEM_grow_clean) +#define GRPC_BUF_MEM_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BUF_MEM_new) +#define GRPC_BUF_MEM_reserve BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BUF_MEM_reserve) +#define GRPC_BUF_memdup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BUF_memdup) +#define GRPC_BUF_strdup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BUF_strdup) +#define GRPC_BUF_strlcat BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BUF_strlcat) +#define GRPC_BUF_strlcpy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BUF_strlcpy) +#define GRPC_BUF_strndup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BUF_strndup) +#define GRPC_BUF_strnlen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BUF_strnlen) +#define GRPC_CBB_add_asn1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_add_asn1) +#define GRPC_CBB_add_asn1_bool BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_add_asn1_bool) +#define GRPC_CBB_add_asn1_octet_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_add_asn1_octet_string) +#define GRPC_CBB_add_asn1_oid_from_text BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_add_asn1_oid_from_text) +#define GRPC_CBB_add_asn1_uint64 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_add_asn1_uint64) +#define GRPC_CBB_add_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_add_bytes) +#define GRPC_CBB_add_space BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_add_space) +#define GRPC_CBB_add_u16 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_add_u16) +#define GRPC_CBB_add_u16_length_prefixed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_add_u16_length_prefixed) +#define GRPC_CBB_add_u24 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_add_u24) +#define GRPC_CBB_add_u24_length_prefixed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_add_u24_length_prefixed) +#define GRPC_CBB_add_u32 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_add_u32) +#define GRPC_CBB_add_u64 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_add_u64) +#define GRPC_CBB_add_u8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_add_u8) +#define GRPC_CBB_add_u8_length_prefixed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_add_u8_length_prefixed) +#define GRPC_CBB_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_cleanup) +#define GRPC_CBB_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_data) +#define GRPC_CBB_did_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_did_write) +#define GRPC_CBB_discard_child BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_discard_child) +#define GRPC_CBB_finish BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_finish) +#define GRPC_CBB_finish_i2d BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_finish_i2d) +#define GRPC_CBB_flush BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_flush) +#define GRPC_CBB_flush_asn1_set_of BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_flush_asn1_set_of) +#define GRPC_CBB_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_init) +#define GRPC_CBB_init_fixed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_init_fixed) +#define GRPC_CBB_len BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_len) +#define GRPC_CBB_reserve BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_reserve) +#define GRPC_CBB_zero BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_zero) +#define GRPC_CBS_asn1_ber_to_der BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_asn1_ber_to_der) +#define GRPC_CBS_asn1_bitstring_has_bit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_asn1_bitstring_has_bit) +#define GRPC_CBS_asn1_oid_to_text BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_asn1_oid_to_text) +#define GRPC_CBS_contains_zero_byte BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_contains_zero_byte) +#define GRPC_CBS_copy_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_copy_bytes) +#define GRPC_CBS_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_data) +#define GRPC_CBS_get_any_asn1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_get_any_asn1) +#define GRPC_CBS_get_any_asn1_element BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_get_any_asn1_element) +#define GRPC_CBS_get_any_ber_asn1_element BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_get_any_ber_asn1_element) +#define GRPC_CBS_get_asn1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_get_asn1) +#define GRPC_CBS_get_asn1_bool BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_get_asn1_bool) +#define GRPC_CBS_get_asn1_element BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_get_asn1_element) +#define GRPC_CBS_get_asn1_implicit_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_get_asn1_implicit_string) +#define GRPC_CBS_get_asn1_uint64 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_get_asn1_uint64) +#define GRPC_CBS_get_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_get_bytes) +#define GRPC_CBS_get_last_u8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_get_last_u8) +#define GRPC_CBS_get_optional_asn1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_get_optional_asn1) +#define GRPC_CBS_get_optional_asn1_bool BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_get_optional_asn1_bool) +#define GRPC_CBS_get_optional_asn1_octet_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_get_optional_asn1_octet_string) +#define GRPC_CBS_get_optional_asn1_uint64 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_get_optional_asn1_uint64) +#define GRPC_CBS_get_u16 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_get_u16) +#define GRPC_CBS_get_u16_length_prefixed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_get_u16_length_prefixed) +#define GRPC_CBS_get_u24 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_get_u24) +#define GRPC_CBS_get_u24_length_prefixed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_get_u24_length_prefixed) +#define GRPC_CBS_get_u32 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_get_u32) +#define GRPC_CBS_get_u64 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_get_u64) +#define GRPC_CBS_get_u8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_get_u8) +#define GRPC_CBS_get_u8_length_prefixed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_get_u8_length_prefixed) +#define GRPC_CBS_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_init) +#define GRPC_CBS_is_valid_asn1_bitstring BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_is_valid_asn1_bitstring) +#define GRPC_CBS_len BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_len) +#define GRPC_CBS_mem_equal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_mem_equal) +#define GRPC_CBS_peek_asn1_tag BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_peek_asn1_tag) +#define GRPC_CBS_skip BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_skip) +#define GRPC_CBS_stow BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_stow) +#define GRPC_CBS_strdup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_strdup) +#define GRPC_CERTIFICATEPOLICIES_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CERTIFICATEPOLICIES_free) +#define GRPC_CERTIFICATEPOLICIES_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CERTIFICATEPOLICIES_it) +#define GRPC_CERTIFICATEPOLICIES_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CERTIFICATEPOLICIES_new) +#define GRPC_CMAC_CTX_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CMAC_CTX_copy) +#define GRPC_CMAC_CTX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CMAC_CTX_free) +#define GRPC_CMAC_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CMAC_CTX_new) +#define GRPC_CMAC_Final BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CMAC_Final) +#define GRPC_CMAC_Init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CMAC_Init) +#define GRPC_CMAC_Reset BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CMAC_Reset) +#define GRPC_CMAC_Update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CMAC_Update) +#define GRPC_CONF_VALUE_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CONF_VALUE_new) +#define GRPC_CONF_modules_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CONF_modules_free) +#define GRPC_CONF_modules_load_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CONF_modules_load_file) +#define GRPC_CONF_parse_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CONF_parse_list) +#define GRPC_CRL_DIST_POINTS_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRL_DIST_POINTS_free) +#define GRPC_CRL_DIST_POINTS_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRL_DIST_POINTS_it) +#define GRPC_CRL_DIST_POINTS_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRL_DIST_POINTS_new) +#define GRPC_CRYPTO_BUFFER_POOL_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_BUFFER_POOL_free) +#define GRPC_CRYPTO_BUFFER_POOL_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_BUFFER_POOL_new) +#define GRPC_CRYPTO_BUFFER_alloc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_BUFFER_alloc) +#define GRPC_CRYPTO_BUFFER_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_BUFFER_data) +#define GRPC_CRYPTO_BUFFER_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_BUFFER_free) +#define GRPC_CRYPTO_BUFFER_init_CBS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_BUFFER_init_CBS) +#define GRPC_CRYPTO_BUFFER_len BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_BUFFER_len) +#define GRPC_CRYPTO_BUFFER_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_BUFFER_new) +#define GRPC_CRYPTO_BUFFER_new_from_CBS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_BUFFER_new_from_CBS) +#define GRPC_CRYPTO_BUFFER_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_BUFFER_up_ref) +#define GRPC_CRYPTO_MUTEX_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_MUTEX_cleanup) +#define GRPC_CRYPTO_MUTEX_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_MUTEX_init) +#define GRPC_CRYPTO_MUTEX_lock_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_MUTEX_lock_read) +#define GRPC_CRYPTO_MUTEX_lock_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_MUTEX_lock_write) +#define GRPC_CRYPTO_MUTEX_unlock_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_MUTEX_unlock_read) +#define GRPC_CRYPTO_MUTEX_unlock_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_MUTEX_unlock_write) +#define GRPC_CRYPTO_POLYVAL_finish BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_POLYVAL_finish) +#define GRPC_CRYPTO_POLYVAL_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_POLYVAL_init) +#define GRPC_CRYPTO_POLYVAL_update_blocks BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_POLYVAL_update_blocks) +#define GRPC_CRYPTO_STATIC_MUTEX_lock_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_STATIC_MUTEX_lock_read) +#define GRPC_CRYPTO_STATIC_MUTEX_lock_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_STATIC_MUTEX_lock_write) +#define GRPC_CRYPTO_STATIC_MUTEX_unlock_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_STATIC_MUTEX_unlock_read) +#define GRPC_CRYPTO_STATIC_MUTEX_unlock_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_STATIC_MUTEX_unlock_write) +#define GRPC_CRYPTO_THREADID_current BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_THREADID_current) +#define GRPC_CRYPTO_THREADID_set_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_THREADID_set_callback) +#define GRPC_CRYPTO_THREADID_set_numeric BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_THREADID_set_numeric) +#define GRPC_CRYPTO_THREADID_set_pointer BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_THREADID_set_pointer) +#define GRPC_CRYPTO_cbc128_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_cbc128_decrypt) +#define GRPC_CRYPTO_cbc128_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_cbc128_encrypt) +#define GRPC_CRYPTO_cfb128_1_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_cfb128_1_encrypt) +#define GRPC_CRYPTO_cfb128_8_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_cfb128_8_encrypt) +#define GRPC_CRYPTO_cfb128_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_cfb128_encrypt) +#define GRPC_CRYPTO_chacha_20 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_chacha_20) +#define GRPC_CRYPTO_cleanup_all_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_cleanup_all_ex_data) +#define GRPC_CRYPTO_ctr128_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_ctr128_encrypt) +#define GRPC_CRYPTO_ctr128_encrypt_ctr32 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_ctr128_encrypt_ctr32) +#define GRPC_CRYPTO_free_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_free_ex_data) +#define GRPC_CRYPTO_gcm128_aad BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_gcm128_aad) +#define GRPC_CRYPTO_gcm128_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_gcm128_decrypt) +#define GRPC_CRYPTO_gcm128_decrypt_ctr32 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_gcm128_decrypt_ctr32) +#define GRPC_CRYPTO_gcm128_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_gcm128_encrypt) +#define GRPC_CRYPTO_gcm128_encrypt_ctr32 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_gcm128_encrypt_ctr32) +#define GRPC_CRYPTO_gcm128_finish BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_gcm128_finish) +#define GRPC_CRYPTO_gcm128_init_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_gcm128_init_key) +#define GRPC_CRYPTO_gcm128_setiv BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_gcm128_setiv) +#define GRPC_CRYPTO_gcm128_tag BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_gcm128_tag) +#define GRPC_CRYPTO_get_dynlock_create_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_get_dynlock_create_callback) +#define GRPC_CRYPTO_get_dynlock_destroy_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_get_dynlock_destroy_callback) +#define GRPC_CRYPTO_get_dynlock_lock_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_get_dynlock_lock_callback) +#define GRPC_CRYPTO_get_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_get_ex_data) +#define GRPC_CRYPTO_get_ex_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_get_ex_new_index) +#define GRPC_CRYPTO_get_lock_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_get_lock_name) +#define GRPC_CRYPTO_get_locking_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_get_locking_callback) +#define GRPC_CRYPTO_get_thread_local BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_get_thread_local) +#define GRPC_CRYPTO_ghash_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_ghash_init) +#define GRPC_CRYPTO_has_asm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_has_asm) +#define GRPC_CRYPTO_hchacha20 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_hchacha20) +#define GRPC_CRYPTO_is_confidential_build BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_is_confidential_build) +#define GRPC_CRYPTO_library_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_library_init) +#define GRPC_CRYPTO_malloc_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_malloc_init) +#define GRPC_CRYPTO_memcmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_memcmp) +#define GRPC_CRYPTO_new_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_new_ex_data) +#define GRPC_CRYPTO_num_locks BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_num_locks) +#define GRPC_CRYPTO_ofb128_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_ofb128_encrypt) +#define GRPC_CRYPTO_once BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_once) +#define GRPC_CRYPTO_poly1305_finish BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_poly1305_finish) +#define GRPC_CRYPTO_poly1305_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_poly1305_init) +#define GRPC_CRYPTO_poly1305_update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_poly1305_update) +#define GRPC_CRYPTO_rdrand BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_rdrand) +#define GRPC_CRYPTO_rdrand_multiple8_buf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_rdrand_multiple8_buf) +#define GRPC_CRYPTO_refcount_dec_and_test_zero BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_refcount_dec_and_test_zero) +#define GRPC_CRYPTO_refcount_inc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_refcount_inc) +#define GRPC_CRYPTO_set_add_lock_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_set_add_lock_callback) +#define GRPC_CRYPTO_set_dynlock_create_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_set_dynlock_create_callback) +#define GRPC_CRYPTO_set_dynlock_destroy_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_set_dynlock_destroy_callback) +#define GRPC_CRYPTO_set_dynlock_lock_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_set_dynlock_lock_callback) +#define GRPC_CRYPTO_set_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_set_ex_data) +#define GRPC_CRYPTO_set_id_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_set_id_callback) +#define GRPC_CRYPTO_set_locking_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_set_locking_callback) +#define GRPC_CRYPTO_set_thread_local BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_set_thread_local) +#define GRPC_CRYPTO_sysrand BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_sysrand) +#define GRPC_CRYPTO_tls1_prf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_tls1_prf) +#define GRPC_CTR_DRBG_clear BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CTR_DRBG_clear) +#define GRPC_CTR_DRBG_generate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CTR_DRBG_generate) +#define GRPC_CTR_DRBG_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CTR_DRBG_init) +#define GRPC_CTR_DRBG_reseed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CTR_DRBG_reseed) +#define GRPC_ChaCha20_ctr32 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ChaCha20_ctr32) +#define GRPC_DES_decrypt3 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DES_decrypt3) +#define GRPC_DES_ecb3_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DES_ecb3_encrypt) +#define GRPC_DES_ecb_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DES_ecb_encrypt) +#define GRPC_DES_ede2_cbc_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DES_ede2_cbc_encrypt) +#define GRPC_DES_ede3_cbc_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DES_ede3_cbc_encrypt) +#define GRPC_DES_encrypt3 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DES_encrypt3) +#define GRPC_DES_ncbc_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DES_ncbc_encrypt) +#define GRPC_DES_set_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DES_set_key) +#define GRPC_DES_set_key_unchecked BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DES_set_key_unchecked) +#define GRPC_DES_set_odd_parity BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DES_set_odd_parity) +#define GRPC_DH_check BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DH_check) +#define GRPC_DH_check_pub_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DH_check_pub_key) +#define GRPC_DH_compute_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DH_compute_key) +#define GRPC_DH_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DH_free) +#define GRPC_DH_generate_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DH_generate_key) +#define GRPC_DH_generate_parameters_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DH_generate_parameters_ex) +#define GRPC_DH_get0_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DH_get0_key) +#define GRPC_DH_get0_pqg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DH_get0_pqg) +#define GRPC_DH_get_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DH_get_ex_data) +#define GRPC_DH_get_ex_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DH_get_ex_new_index) +#define GRPC_DH_marshal_parameters BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DH_marshal_parameters) +#define GRPC_DH_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DH_new) +#define GRPC_DH_num_bits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DH_num_bits) +#define GRPC_DH_parse_parameters BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DH_parse_parameters) +#define GRPC_DH_set0_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DH_set0_key) +#define GRPC_DH_set0_pqg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DH_set0_pqg) +#define GRPC_DH_set_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DH_set_ex_data) +#define GRPC_DH_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DH_size) +#define GRPC_DH_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DH_up_ref) +#define GRPC_DHparams_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DHparams_dup) +#define GRPC_DIRECTORYSTRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DIRECTORYSTRING_free) +#define GRPC_DIRECTORYSTRING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DIRECTORYSTRING_it) +#define GRPC_DIRECTORYSTRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DIRECTORYSTRING_new) +#define GRPC_DISPLAYTEXT_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DISPLAYTEXT_free) +#define GRPC_DISPLAYTEXT_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DISPLAYTEXT_it) +#define GRPC_DISPLAYTEXT_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DISPLAYTEXT_new) +#define GRPC_DIST_POINT_NAME_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DIST_POINT_NAME_free) +#define GRPC_DIST_POINT_NAME_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DIST_POINT_NAME_it) +#define GRPC_DIST_POINT_NAME_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DIST_POINT_NAME_new) +#define GRPC_DIST_POINT_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DIST_POINT_free) +#define GRPC_DIST_POINT_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DIST_POINT_it) +#define GRPC_DIST_POINT_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DIST_POINT_new) +#define GRPC_DIST_POINT_set_dpname BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DIST_POINT_set_dpname) +#define GRPC_DSA_SIG_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DSA_SIG_free) +#define GRPC_DSA_SIG_marshal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DSA_SIG_marshal) +#define GRPC_DSA_SIG_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DSA_SIG_new) +#define GRPC_DSA_SIG_parse BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DSA_SIG_parse) +#define GRPC_DSA_check_signature BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DSA_check_signature) +#define GRPC_DSA_do_check_signature BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DSA_do_check_signature) +#define GRPC_DSA_do_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DSA_do_sign) +#define GRPC_DSA_do_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DSA_do_verify) +#define GRPC_DSA_dup_DH BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DSA_dup_DH) +#define GRPC_DSA_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DSA_free) +#define GRPC_DSA_generate_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DSA_generate_key) +#define GRPC_DSA_generate_parameters_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DSA_generate_parameters_ex) +#define GRPC_DSA_get0_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DSA_get0_key) +#define GRPC_DSA_get0_pqg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DSA_get0_pqg) +#define GRPC_DSA_get_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DSA_get_ex_data) +#define GRPC_DSA_get_ex_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DSA_get_ex_new_index) +#define GRPC_DSA_marshal_parameters BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DSA_marshal_parameters) +#define GRPC_DSA_marshal_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DSA_marshal_private_key) +#define GRPC_DSA_marshal_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DSA_marshal_public_key) +#define GRPC_DSA_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DSA_new) +#define GRPC_DSA_parse_parameters BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DSA_parse_parameters) +#define GRPC_DSA_parse_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DSA_parse_private_key) +#define GRPC_DSA_parse_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DSA_parse_public_key) +#define GRPC_DSA_set0_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DSA_set0_key) +#define GRPC_DSA_set0_pqg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DSA_set0_pqg) +#define GRPC_DSA_set_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DSA_set_ex_data) +#define GRPC_DSA_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DSA_sign) +#define GRPC_DSA_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DSA_size) +#define GRPC_DSA_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DSA_up_ref) +#define GRPC_DSA_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DSA_verify) +#define GRPC_DSAparams_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DSAparams_dup) +#define GRPC_ECDH_compute_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ECDH_compute_key) +#define GRPC_ECDH_compute_key_fips BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ECDH_compute_key_fips) +#define GRPC_ECDSA_SIG_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ECDSA_SIG_free) +#define GRPC_ECDSA_SIG_from_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ECDSA_SIG_from_bytes) +#define GRPC_ECDSA_SIG_get0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ECDSA_SIG_get0) +#define GRPC_ECDSA_SIG_marshal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ECDSA_SIG_marshal) +#define GRPC_ECDSA_SIG_max_len BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ECDSA_SIG_max_len) +#define GRPC_ECDSA_SIG_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ECDSA_SIG_new) +#define GRPC_ECDSA_SIG_parse BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ECDSA_SIG_parse) +#define GRPC_ECDSA_SIG_set0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ECDSA_SIG_set0) +#define GRPC_ECDSA_SIG_to_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ECDSA_SIG_to_bytes) +#define GRPC_ECDSA_do_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ECDSA_do_sign) +#define GRPC_ECDSA_do_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ECDSA_do_verify) +#define GRPC_ECDSA_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ECDSA_sign) +#define GRPC_ECDSA_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ECDSA_size) +#define GRPC_ECDSA_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ECDSA_verify) +#define GRPC_EC_GFp_mont_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_GFp_mont_method) +#define GRPC_EC_GFp_nistp224_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_GFp_nistp224_method) +#define GRPC_EC_GFp_nistp256_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_GFp_nistp256_method) +#define GRPC_EC_GFp_nistz256_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_GFp_nistz256_method) +#define GRPC_EC_GROUP_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_GROUP_cmp) +#define GRPC_EC_GROUP_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_GROUP_dup) +#define GRPC_EC_GROUP_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_GROUP_free) +#define GRPC_EC_GROUP_get0_generator BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_GROUP_get0_generator) +#define GRPC_EC_GROUP_get0_order BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_GROUP_get0_order) +#define GRPC_EC_GROUP_get_cofactor BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_GROUP_get_cofactor) +#define GRPC_EC_GROUP_get_curve_GFp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_GROUP_get_curve_GFp) +#define GRPC_EC_GROUP_get_curve_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_GROUP_get_curve_name) +#define GRPC_EC_GROUP_get_degree BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_GROUP_get_degree) +#define GRPC_EC_GROUP_get_order BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_GROUP_get_order) +#define GRPC_EC_GROUP_method_of BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_GROUP_method_of) +#define GRPC_EC_GROUP_new_by_curve_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_GROUP_new_by_curve_name) +#define GRPC_EC_GROUP_new_curve_GFp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_GROUP_new_curve_GFp) +#define GRPC_EC_GROUP_order_bits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_GROUP_order_bits) +#define GRPC_EC_GROUP_set_asn1_flag BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_GROUP_set_asn1_flag) +#define GRPC_EC_GROUP_set_generator BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_GROUP_set_generator) +#define GRPC_EC_GROUP_set_point_conversion_form BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_GROUP_set_point_conversion_form) +#define GRPC_EC_KEY_check_fips BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_KEY_check_fips) +#define GRPC_EC_KEY_check_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_KEY_check_key) +#define GRPC_EC_KEY_derive_from_secret BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_KEY_derive_from_secret) +#define GRPC_EC_KEY_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_KEY_dup) +#define GRPC_EC_KEY_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_KEY_free) +#define GRPC_EC_KEY_generate_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_KEY_generate_key) +#define GRPC_EC_KEY_generate_key_fips BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_KEY_generate_key_fips) +#define GRPC_EC_KEY_get0_group BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_KEY_get0_group) +#define GRPC_EC_KEY_get0_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_KEY_get0_private_key) +#define GRPC_EC_KEY_get0_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_KEY_get0_public_key) +#define GRPC_EC_KEY_get_conv_form BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_KEY_get_conv_form) +#define GRPC_EC_KEY_get_enc_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_KEY_get_enc_flags) +#define GRPC_EC_KEY_get_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_KEY_get_ex_data) +#define GRPC_EC_KEY_get_ex_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_KEY_get_ex_new_index) +#define GRPC_EC_KEY_is_opaque BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_KEY_is_opaque) +#define GRPC_EC_KEY_key2buf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_KEY_key2buf) +#define GRPC_EC_KEY_marshal_curve_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_KEY_marshal_curve_name) +#define GRPC_EC_KEY_marshal_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_KEY_marshal_private_key) +#define GRPC_EC_KEY_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_KEY_new) +#define GRPC_EC_KEY_new_by_curve_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_KEY_new_by_curve_name) +#define GRPC_EC_KEY_new_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_KEY_new_method) +#define GRPC_EC_KEY_parse_curve_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_KEY_parse_curve_name) +#define GRPC_EC_KEY_parse_parameters BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_KEY_parse_parameters) +#define GRPC_EC_KEY_parse_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_KEY_parse_private_key) +#define GRPC_EC_KEY_set_asn1_flag BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_KEY_set_asn1_flag) +#define GRPC_EC_KEY_set_conv_form BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_KEY_set_conv_form) +#define GRPC_EC_KEY_set_enc_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_KEY_set_enc_flags) +#define GRPC_EC_KEY_set_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_KEY_set_ex_data) +#define GRPC_EC_KEY_set_group BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_KEY_set_group) +#define GRPC_EC_KEY_set_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_KEY_set_private_key) +#define GRPC_EC_KEY_set_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_KEY_set_public_key) +#define GRPC_EC_KEY_set_public_key_affine_coordinates BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_KEY_set_public_key_affine_coordinates) +#define GRPC_EC_KEY_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_KEY_up_ref) +#define GRPC_EC_METHOD_get_field_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_METHOD_get_field_type) +#define GRPC_EC_POINT_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_POINT_add) +#define GRPC_EC_POINT_clear_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_POINT_clear_free) +#define GRPC_EC_POINT_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_POINT_cmp) +#define GRPC_EC_POINT_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_POINT_copy) +#define GRPC_EC_POINT_dbl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_POINT_dbl) +#define GRPC_EC_POINT_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_POINT_dup) +#define GRPC_EC_POINT_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_POINT_free) +#define GRPC_EC_POINT_get_affine_coordinates_GFp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_POINT_get_affine_coordinates_GFp) +#define GRPC_EC_POINT_invert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_POINT_invert) +#define GRPC_EC_POINT_is_at_infinity BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_POINT_is_at_infinity) +#define GRPC_EC_POINT_is_on_curve BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_POINT_is_on_curve) +#define GRPC_EC_POINT_mul BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_POINT_mul) +#define GRPC_EC_POINT_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_POINT_new) +#define GRPC_EC_POINT_oct2point BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_POINT_oct2point) +#define GRPC_EC_POINT_point2cbb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_POINT_point2cbb) +#define GRPC_EC_POINT_point2oct BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_POINT_point2oct) +#define GRPC_EC_POINT_set_affine_coordinates_GFp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_POINT_set_affine_coordinates_GFp) +#define GRPC_EC_POINT_set_compressed_coordinates_GFp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_POINT_set_compressed_coordinates_GFp) +#define GRPC_EC_POINT_set_to_infinity BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_POINT_set_to_infinity) +#define GRPC_EC_curve_nid2nist BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_curve_nid2nist) +#define GRPC_EC_curve_nist2nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_curve_nist2nid) +#define GRPC_EC_get_builtin_curves BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_get_builtin_curves) +#define GRPC_ED25519_keypair BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ED25519_keypair) +#define GRPC_ED25519_keypair_from_seed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ED25519_keypair_from_seed) +#define GRPC_ED25519_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ED25519_sign) +#define GRPC_ED25519_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ED25519_verify) +#define GRPC_EDIPARTYNAME_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EDIPARTYNAME_free) +#define GRPC_EDIPARTYNAME_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EDIPARTYNAME_it) +#define GRPC_EDIPARTYNAME_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EDIPARTYNAME_new) +#define GRPC_ENGINE_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ENGINE_free) +#define GRPC_ENGINE_get_ECDSA_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ENGINE_get_ECDSA_method) +#define GRPC_ENGINE_get_RSA_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ENGINE_get_RSA_method) +#define GRPC_ENGINE_load_builtin_engines BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ENGINE_load_builtin_engines) +#define GRPC_ENGINE_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ENGINE_new) +#define GRPC_ENGINE_register_all_complete BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ENGINE_register_all_complete) +#define GRPC_ENGINE_set_ECDSA_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ENGINE_set_ECDSA_method) +#define GRPC_ENGINE_set_RSA_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ENGINE_set_RSA_method) +#define GRPC_ERR_SAVE_STATE_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ERR_SAVE_STATE_free) +#define GRPC_ERR_add_error_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ERR_add_error_data) +#define GRPC_ERR_add_error_dataf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ERR_add_error_dataf) +#define GRPC_ERR_clear_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ERR_clear_error) +#define GRPC_ERR_clear_system_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ERR_clear_system_error) +#define GRPC_ERR_error_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ERR_error_string) +#define GRPC_ERR_error_string_n BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ERR_error_string_n) +#define GRPC_ERR_free_strings BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ERR_free_strings) +#define GRPC_ERR_func_error_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ERR_func_error_string) +#define GRPC_ERR_get_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ERR_get_error) +#define GRPC_ERR_get_error_line BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ERR_get_error_line) +#define GRPC_ERR_get_error_line_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ERR_get_error_line_data) +#define GRPC_ERR_get_next_error_library BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ERR_get_next_error_library) +#define GRPC_ERR_lib_error_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ERR_lib_error_string) +#define GRPC_ERR_load_BIO_strings BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ERR_load_BIO_strings) +#define GRPC_ERR_load_ERR_strings BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ERR_load_ERR_strings) +#define GRPC_ERR_load_RAND_strings BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ERR_load_RAND_strings) +#define GRPC_ERR_load_crypto_strings BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ERR_load_crypto_strings) +#define GRPC_ERR_peek_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ERR_peek_error) +#define GRPC_ERR_peek_error_line BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ERR_peek_error_line) +#define GRPC_ERR_peek_error_line_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ERR_peek_error_line_data) +#define GRPC_ERR_peek_last_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ERR_peek_last_error) +#define GRPC_ERR_peek_last_error_line BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ERR_peek_last_error_line) +#define GRPC_ERR_peek_last_error_line_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ERR_peek_last_error_line_data) +#define GRPC_ERR_pop_to_mark BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ERR_pop_to_mark) +#define GRPC_ERR_print_errors BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ERR_print_errors) +#define GRPC_ERR_print_errors_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ERR_print_errors_cb) +#define GRPC_ERR_print_errors_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ERR_print_errors_fp) +#define GRPC_ERR_put_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ERR_put_error) +#define GRPC_ERR_reason_error_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ERR_reason_error_string) +#define GRPC_ERR_remove_state BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ERR_remove_state) +#define GRPC_ERR_remove_thread_state BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ERR_remove_thread_state) +#define GRPC_ERR_restore_state BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ERR_restore_state) +#define GRPC_ERR_save_state BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ERR_save_state) +#define GRPC_ERR_set_mark BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ERR_set_mark) +#define GRPC_EVP_AEAD_CTX_aead BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_AEAD_CTX_aead) +#define GRPC_EVP_AEAD_CTX_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_AEAD_CTX_cleanup) +#define GRPC_EVP_AEAD_CTX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_AEAD_CTX_free) +#define GRPC_EVP_AEAD_CTX_get_iv BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_AEAD_CTX_get_iv) +#define GRPC_EVP_AEAD_CTX_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_AEAD_CTX_init) +#define GRPC_EVP_AEAD_CTX_init_with_direction BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_AEAD_CTX_init_with_direction) +#define GRPC_EVP_AEAD_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_AEAD_CTX_new) +#define GRPC_EVP_AEAD_CTX_open BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_AEAD_CTX_open) +#define GRPC_EVP_AEAD_CTX_open_gather BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_AEAD_CTX_open_gather) +#define GRPC_EVP_AEAD_CTX_seal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_AEAD_CTX_seal) +#define GRPC_EVP_AEAD_CTX_seal_scatter BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_AEAD_CTX_seal_scatter) +#define GRPC_EVP_AEAD_CTX_tag_len BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_AEAD_CTX_tag_len) +#define GRPC_EVP_AEAD_CTX_zero BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_AEAD_CTX_zero) +#define GRPC_EVP_AEAD_key_length BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_AEAD_key_length) +#define GRPC_EVP_AEAD_max_overhead BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_AEAD_max_overhead) +#define GRPC_EVP_AEAD_max_tag_len BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_AEAD_max_tag_len) +#define GRPC_EVP_AEAD_nonce_length BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_AEAD_nonce_length) +#define GRPC_EVP_BytesToKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_BytesToKey) +#define GRPC_EVP_CIPHER_CTX_block_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_CIPHER_CTX_block_size) +#define GRPC_EVP_CIPHER_CTX_cipher BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_CIPHER_CTX_cipher) +#define GRPC_EVP_CIPHER_CTX_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_CIPHER_CTX_cleanup) +#define GRPC_EVP_CIPHER_CTX_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_CIPHER_CTX_copy) +#define GRPC_EVP_CIPHER_CTX_ctrl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_CIPHER_CTX_ctrl) +#define GRPC_EVP_CIPHER_CTX_encrypting BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_CIPHER_CTX_encrypting) +#define GRPC_EVP_CIPHER_CTX_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_CIPHER_CTX_flags) +#define GRPC_EVP_CIPHER_CTX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_CIPHER_CTX_free) +#define GRPC_EVP_CIPHER_CTX_get_app_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_CIPHER_CTX_get_app_data) +#define GRPC_EVP_CIPHER_CTX_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_CIPHER_CTX_init) +#define GRPC_EVP_CIPHER_CTX_iv_length BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_CIPHER_CTX_iv_length) +#define GRPC_EVP_CIPHER_CTX_key_length BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_CIPHER_CTX_key_length) +#define GRPC_EVP_CIPHER_CTX_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_CIPHER_CTX_mode) +#define GRPC_EVP_CIPHER_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_CIPHER_CTX_new) +#define GRPC_EVP_CIPHER_CTX_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_CIPHER_CTX_nid) +#define GRPC_EVP_CIPHER_CTX_reset BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_CIPHER_CTX_reset) +#define GRPC_EVP_CIPHER_CTX_set_app_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_CIPHER_CTX_set_app_data) +#define GRPC_EVP_CIPHER_CTX_set_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_CIPHER_CTX_set_flags) +#define GRPC_EVP_CIPHER_CTX_set_key_length BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_CIPHER_CTX_set_key_length) +#define GRPC_EVP_CIPHER_CTX_set_padding BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_CIPHER_CTX_set_padding) +#define GRPC_EVP_CIPHER_block_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_CIPHER_block_size) +#define GRPC_EVP_CIPHER_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_CIPHER_flags) +#define GRPC_EVP_CIPHER_iv_length BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_CIPHER_iv_length) +#define GRPC_EVP_CIPHER_key_length BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_CIPHER_key_length) +#define GRPC_EVP_CIPHER_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_CIPHER_mode) +#define GRPC_EVP_CIPHER_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_CIPHER_nid) +#define GRPC_EVP_Cipher BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_Cipher) +#define GRPC_EVP_CipherFinal_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_CipherFinal_ex) +#define GRPC_EVP_CipherInit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_CipherInit) +#define GRPC_EVP_CipherInit_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_CipherInit_ex) +#define GRPC_EVP_CipherUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_CipherUpdate) +#define GRPC_EVP_DecodeBase64 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_DecodeBase64) +#define GRPC_EVP_DecodeBlock BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_DecodeBlock) +#define GRPC_EVP_DecodeFinal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_DecodeFinal) +#define GRPC_EVP_DecodeInit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_DecodeInit) +#define GRPC_EVP_DecodeUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_DecodeUpdate) +#define GRPC_EVP_DecodedLength BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_DecodedLength) +#define GRPC_EVP_DecryptFinal_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_DecryptFinal_ex) +#define GRPC_EVP_DecryptInit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_DecryptInit) +#define GRPC_EVP_DecryptInit_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_DecryptInit_ex) +#define GRPC_EVP_DecryptUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_DecryptUpdate) +#define GRPC_EVP_Digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_Digest) +#define GRPC_EVP_DigestFinal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_DigestFinal) +#define GRPC_EVP_DigestFinalXOF BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_DigestFinalXOF) +#define GRPC_EVP_DigestFinal_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_DigestFinal_ex) +#define GRPC_EVP_DigestInit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_DigestInit) +#define GRPC_EVP_DigestInit_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_DigestInit_ex) +#define GRPC_EVP_DigestSign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_DigestSign) +#define GRPC_EVP_DigestSignFinal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_DigestSignFinal) +#define GRPC_EVP_DigestSignInit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_DigestSignInit) +#define GRPC_EVP_DigestSignUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_DigestSignUpdate) +#define GRPC_EVP_DigestUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_DigestUpdate) +#define GRPC_EVP_DigestVerify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_DigestVerify) +#define GRPC_EVP_DigestVerifyFinal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_DigestVerifyFinal) +#define GRPC_EVP_DigestVerifyInit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_DigestVerifyInit) +#define GRPC_EVP_DigestVerifyUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_DigestVerifyUpdate) +#define GRPC_EVP_EncodeBlock BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_EncodeBlock) +#define GRPC_EVP_EncodeFinal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_EncodeFinal) +#define GRPC_EVP_EncodeInit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_EncodeInit) +#define GRPC_EVP_EncodeUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_EncodeUpdate) +#define GRPC_EVP_EncodedLength BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_EncodedLength) +#define GRPC_EVP_EncryptFinal_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_EncryptFinal_ex) +#define GRPC_EVP_EncryptInit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_EncryptInit) +#define GRPC_EVP_EncryptInit_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_EncryptInit_ex) +#define GRPC_EVP_EncryptUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_EncryptUpdate) +#define GRPC_EVP_MD_CTX_block_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_MD_CTX_block_size) +#define GRPC_EVP_MD_CTX_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_MD_CTX_cleanup) +#define GRPC_EVP_MD_CTX_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_MD_CTX_copy) +#define GRPC_EVP_MD_CTX_copy_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_MD_CTX_copy_ex) +#define GRPC_EVP_MD_CTX_create BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_MD_CTX_create) +#define GRPC_EVP_MD_CTX_destroy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_MD_CTX_destroy) +#define GRPC_EVP_MD_CTX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_MD_CTX_free) +#define GRPC_EVP_MD_CTX_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_MD_CTX_init) +#define GRPC_EVP_MD_CTX_md BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_MD_CTX_md) +#define GRPC_EVP_MD_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_MD_CTX_new) +#define GRPC_EVP_MD_CTX_reset BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_MD_CTX_reset) +#define GRPC_EVP_MD_CTX_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_MD_CTX_size) +#define GRPC_EVP_MD_CTX_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_MD_CTX_type) +#define GRPC_EVP_MD_block_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_MD_block_size) +#define GRPC_EVP_MD_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_MD_flags) +#define GRPC_EVP_MD_meth_get_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_MD_meth_get_flags) +#define GRPC_EVP_MD_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_MD_size) +#define GRPC_EVP_MD_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_MD_type) +#define GRPC_EVP_PBE_scrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PBE_scrypt) +#define GRPC_EVP_PKCS82PKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKCS82PKEY) +#define GRPC_EVP_PKEY2PKCS8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY2PKCS8) +#define GRPC_EVP_PKEY_CTX_ctrl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_CTX_ctrl) +#define GRPC_EVP_PKEY_CTX_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_CTX_dup) +#define GRPC_EVP_PKEY_CTX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_CTX_free) +#define GRPC_EVP_PKEY_CTX_get0_pkey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_CTX_get0_pkey) +#define GRPC_EVP_PKEY_CTX_get0_rsa_oaep_label BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_CTX_get0_rsa_oaep_label) +#define GRPC_EVP_PKEY_CTX_get_rsa_mgf1_md BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_CTX_get_rsa_mgf1_md) +#define GRPC_EVP_PKEY_CTX_get_rsa_oaep_md BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_CTX_get_rsa_oaep_md) +#define GRPC_EVP_PKEY_CTX_get_rsa_padding BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_CTX_get_rsa_padding) +#define GRPC_EVP_PKEY_CTX_get_rsa_pss_saltlen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_CTX_get_rsa_pss_saltlen) +#define GRPC_EVP_PKEY_CTX_get_signature_md BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_CTX_get_signature_md) +#define GRPC_EVP_PKEY_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_CTX_new) +#define GRPC_EVP_PKEY_CTX_new_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_CTX_new_id) +#define GRPC_EVP_PKEY_CTX_set0_rsa_oaep_label BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_CTX_set0_rsa_oaep_label) +#define GRPC_EVP_PKEY_CTX_set_ec_param_enc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_CTX_set_ec_param_enc) +#define GRPC_EVP_PKEY_CTX_set_ec_paramgen_curve_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_CTX_set_ec_paramgen_curve_nid) +#define GRPC_EVP_PKEY_CTX_set_rsa_keygen_bits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_CTX_set_rsa_keygen_bits) +#define GRPC_EVP_PKEY_CTX_set_rsa_keygen_pubexp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_CTX_set_rsa_keygen_pubexp) +#define GRPC_EVP_PKEY_CTX_set_rsa_mgf1_md BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_CTX_set_rsa_mgf1_md) +#define GRPC_EVP_PKEY_CTX_set_rsa_oaep_md BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_CTX_set_rsa_oaep_md) +#define GRPC_EVP_PKEY_CTX_set_rsa_padding BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_CTX_set_rsa_padding) +#define GRPC_EVP_PKEY_CTX_set_rsa_pss_saltlen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_CTX_set_rsa_pss_saltlen) +#define GRPC_EVP_PKEY_CTX_set_signature_md BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_CTX_set_signature_md) +#define GRPC_EVP_PKEY_assign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_assign) +#define GRPC_EVP_PKEY_assign_DSA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_assign_DSA) +#define GRPC_EVP_PKEY_assign_EC_KEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_assign_EC_KEY) +#define GRPC_EVP_PKEY_assign_RSA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_assign_RSA) +#define GRPC_EVP_PKEY_base_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_base_id) +#define GRPC_EVP_PKEY_bits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_bits) +#define GRPC_EVP_PKEY_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_cmp) +#define GRPC_EVP_PKEY_cmp_parameters BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_cmp_parameters) +#define GRPC_EVP_PKEY_copy_parameters BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_copy_parameters) +#define GRPC_EVP_PKEY_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_decrypt) +#define GRPC_EVP_PKEY_decrypt_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_decrypt_init) +#define GRPC_EVP_PKEY_derive BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_derive) +#define GRPC_EVP_PKEY_derive_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_derive_init) +#define GRPC_EVP_PKEY_derive_set_peer BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_derive_set_peer) +#define GRPC_EVP_PKEY_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_encrypt) +#define GRPC_EVP_PKEY_encrypt_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_encrypt_init) +#define GRPC_EVP_PKEY_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_free) +#define GRPC_EVP_PKEY_get0_DH BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_get0_DH) +#define GRPC_EVP_PKEY_get0_DSA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_get0_DSA) +#define GRPC_EVP_PKEY_get0_EC_KEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_get0_EC_KEY) +#define GRPC_EVP_PKEY_get0_RSA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_get0_RSA) +#define GRPC_EVP_PKEY_get1_DH BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_get1_DH) +#define GRPC_EVP_PKEY_get1_DSA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_get1_DSA) +#define GRPC_EVP_PKEY_get1_EC_KEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_get1_EC_KEY) +#define GRPC_EVP_PKEY_get1_RSA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_get1_RSA) +#define GRPC_EVP_PKEY_get1_tls_encodedpoint BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_get1_tls_encodedpoint) +#define GRPC_EVP_PKEY_get_raw_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_get_raw_private_key) +#define GRPC_EVP_PKEY_get_raw_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_get_raw_public_key) +#define GRPC_EVP_PKEY_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_id) +#define GRPC_EVP_PKEY_is_opaque BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_is_opaque) +#define GRPC_EVP_PKEY_keygen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_keygen) +#define GRPC_EVP_PKEY_keygen_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_keygen_init) +#define GRPC_EVP_PKEY_missing_parameters BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_missing_parameters) +#define GRPC_EVP_PKEY_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_new) +#define GRPC_EVP_PKEY_new_raw_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_new_raw_private_key) +#define GRPC_EVP_PKEY_new_raw_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_new_raw_public_key) +#define GRPC_EVP_PKEY_paramgen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_paramgen) +#define GRPC_EVP_PKEY_paramgen_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_paramgen_init) +#define GRPC_EVP_PKEY_print_params BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_print_params) +#define GRPC_EVP_PKEY_print_private BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_print_private) +#define GRPC_EVP_PKEY_print_public BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_print_public) +#define GRPC_EVP_PKEY_set1_DSA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_set1_DSA) +#define GRPC_EVP_PKEY_set1_EC_KEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_set1_EC_KEY) +#define GRPC_EVP_PKEY_set1_RSA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_set1_RSA) +#define GRPC_EVP_PKEY_set1_tls_encodedpoint BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_set1_tls_encodedpoint) +#define GRPC_EVP_PKEY_set_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_set_type) +#define GRPC_EVP_PKEY_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_sign) +#define GRPC_EVP_PKEY_sign_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_sign_init) +#define GRPC_EVP_PKEY_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_size) +#define GRPC_EVP_PKEY_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_type) +#define GRPC_EVP_PKEY_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_up_ref) +#define GRPC_EVP_PKEY_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_verify) +#define GRPC_EVP_PKEY_verify_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_verify_init) +#define GRPC_EVP_PKEY_verify_recover BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_verify_recover) +#define GRPC_EVP_PKEY_verify_recover_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_verify_recover_init) +#define GRPC_EVP_SignFinal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_SignFinal) +#define GRPC_EVP_SignInit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_SignInit) +#define GRPC_EVP_SignInit_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_SignInit_ex) +#define GRPC_EVP_SignUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_SignUpdate) +#define GRPC_EVP_VerifyFinal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_VerifyFinal) +#define GRPC_EVP_VerifyInit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_VerifyInit) +#define GRPC_EVP_VerifyInit_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_VerifyInit_ex) +#define GRPC_EVP_VerifyUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_VerifyUpdate) +#define GRPC_EVP_add_cipher_alias BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_add_cipher_alias) +#define GRPC_EVP_add_digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_add_digest) +#define GRPC_EVP_aead_aes_128_cbc_sha1_tls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aead_aes_128_cbc_sha1_tls) +#define GRPC_EVP_aead_aes_128_cbc_sha1_tls_implicit_iv BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aead_aes_128_cbc_sha1_tls_implicit_iv) +#define GRPC_EVP_aead_aes_128_cbc_sha256_tls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aead_aes_128_cbc_sha256_tls) +#define GRPC_EVP_aead_aes_128_ccm_bluetooth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aead_aes_128_ccm_bluetooth) +#define GRPC_EVP_aead_aes_128_ccm_bluetooth_8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aead_aes_128_ccm_bluetooth_8) +#define GRPC_EVP_aead_aes_128_ctr_hmac_sha256 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aead_aes_128_ctr_hmac_sha256) +#define GRPC_EVP_aead_aes_128_gcm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aead_aes_128_gcm) +#define GRPC_EVP_aead_aes_128_gcm_siv BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aead_aes_128_gcm_siv) +#define GRPC_EVP_aead_aes_128_gcm_tls12 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aead_aes_128_gcm_tls12) +#define GRPC_EVP_aead_aes_128_gcm_tls13 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aead_aes_128_gcm_tls13) +#define GRPC_EVP_aead_aes_192_gcm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aead_aes_192_gcm) +#define GRPC_EVP_aead_aes_256_cbc_sha1_tls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aead_aes_256_cbc_sha1_tls) +#define GRPC_EVP_aead_aes_256_cbc_sha1_tls_implicit_iv BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aead_aes_256_cbc_sha1_tls_implicit_iv) +#define GRPC_EVP_aead_aes_256_cbc_sha256_tls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aead_aes_256_cbc_sha256_tls) +#define GRPC_EVP_aead_aes_256_cbc_sha384_tls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aead_aes_256_cbc_sha384_tls) +#define GRPC_EVP_aead_aes_256_ctr_hmac_sha256 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aead_aes_256_ctr_hmac_sha256) +#define GRPC_EVP_aead_aes_256_gcm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aead_aes_256_gcm) +#define GRPC_EVP_aead_aes_256_gcm_siv BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aead_aes_256_gcm_siv) +#define GRPC_EVP_aead_aes_256_gcm_tls12 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aead_aes_256_gcm_tls12) +#define GRPC_EVP_aead_aes_256_gcm_tls13 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aead_aes_256_gcm_tls13) +#define GRPC_EVP_aead_chacha20_poly1305 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aead_chacha20_poly1305) +#define GRPC_EVP_aead_des_ede3_cbc_sha1_tls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aead_des_ede3_cbc_sha1_tls) +#define GRPC_EVP_aead_des_ede3_cbc_sha1_tls_implicit_iv BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aead_des_ede3_cbc_sha1_tls_implicit_iv) +#define GRPC_EVP_aead_null_sha1_tls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aead_null_sha1_tls) +#define GRPC_EVP_aead_xchacha20_poly1305 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aead_xchacha20_poly1305) +#define GRPC_EVP_aes_128_cbc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aes_128_cbc) +#define GRPC_EVP_aes_128_ctr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aes_128_ctr) +#define GRPC_EVP_aes_128_ecb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aes_128_ecb) +#define GRPC_EVP_aes_128_gcm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aes_128_gcm) +#define GRPC_EVP_aes_128_ofb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aes_128_ofb) +#define GRPC_EVP_aes_192_cbc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aes_192_cbc) +#define GRPC_EVP_aes_192_ctr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aes_192_ctr) +#define GRPC_EVP_aes_192_ecb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aes_192_ecb) +#define GRPC_EVP_aes_192_gcm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aes_192_gcm) +#define GRPC_EVP_aes_192_ofb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aes_192_ofb) +#define GRPC_EVP_aes_256_cbc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aes_256_cbc) +#define GRPC_EVP_aes_256_ctr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aes_256_ctr) +#define GRPC_EVP_aes_256_ecb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aes_256_ecb) +#define GRPC_EVP_aes_256_gcm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aes_256_gcm) +#define GRPC_EVP_aes_256_ofb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aes_256_ofb) +#define GRPC_EVP_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_cleanup) +#define GRPC_EVP_des_cbc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_des_cbc) +#define GRPC_EVP_des_ecb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_des_ecb) +#define GRPC_EVP_des_ede BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_des_ede) +#define GRPC_EVP_des_ede3 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_des_ede3) +#define GRPC_EVP_des_ede3_cbc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_des_ede3_cbc) +#define GRPC_EVP_des_ede3_ecb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_des_ede3_ecb) +#define GRPC_EVP_des_ede_cbc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_des_ede_cbc) +#define GRPC_EVP_enc_null BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_enc_null) +#define GRPC_EVP_get_cipherbyname BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_get_cipherbyname) +#define GRPC_EVP_get_cipherbynid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_get_cipherbynid) +#define GRPC_EVP_get_digestbyname BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_get_digestbyname) +#define GRPC_EVP_get_digestbynid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_get_digestbynid) +#define GRPC_EVP_get_digestbyobj BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_get_digestbyobj) +#define GRPC_EVP_has_aes_hardware BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_has_aes_hardware) +#define GRPC_EVP_marshal_digest_algorithm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_marshal_digest_algorithm) +#define GRPC_EVP_marshal_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_marshal_private_key) +#define GRPC_EVP_marshal_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_marshal_public_key) +#define GRPC_EVP_md4 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_md4) +#define GRPC_EVP_md5 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_md5) +#define GRPC_EVP_md5_sha1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_md5_sha1) +#define GRPC_EVP_parse_digest_algorithm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_parse_digest_algorithm) +#define GRPC_EVP_parse_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_parse_private_key) +#define GRPC_EVP_parse_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_parse_public_key) +#define GRPC_EVP_rc2_40_cbc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_rc2_40_cbc) +#define GRPC_EVP_rc2_cbc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_rc2_cbc) +#define GRPC_EVP_rc4 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_rc4) +#define GRPC_EVP_sha1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_sha1) +#define GRPC_EVP_sha224 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_sha224) +#define GRPC_EVP_sha256 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_sha256) +#define GRPC_EVP_sha384 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_sha384) +#define GRPC_EVP_sha512 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_sha512) +#define GRPC_EVP_tls_cbc_copy_mac BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_tls_cbc_copy_mac) +#define GRPC_EVP_tls_cbc_digest_record BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_tls_cbc_digest_record) +#define GRPC_EVP_tls_cbc_record_digest_supported BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_tls_cbc_record_digest_supported) +#define GRPC_EVP_tls_cbc_remove_padding BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_tls_cbc_remove_padding) +#define GRPC_EXTENDED_KEY_USAGE_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EXTENDED_KEY_USAGE_free) +#define GRPC_EXTENDED_KEY_USAGE_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EXTENDED_KEY_USAGE_it) +#define GRPC_EXTENDED_KEY_USAGE_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EXTENDED_KEY_USAGE_new) +#define GRPC_FIPS_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_FIPS_mode) +#define GRPC_FIPS_mode_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_FIPS_mode_set) +#define GRPC_GENERAL_NAMES_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_GENERAL_NAMES_free) +#define GRPC_GENERAL_NAMES_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_GENERAL_NAMES_it) +#define GRPC_GENERAL_NAMES_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_GENERAL_NAMES_new) +#define GRPC_GENERAL_NAME_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_GENERAL_NAME_cmp) +#define GRPC_GENERAL_NAME_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_GENERAL_NAME_dup) +#define GRPC_GENERAL_NAME_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_GENERAL_NAME_free) +#define GRPC_GENERAL_NAME_get0_otherName BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_GENERAL_NAME_get0_otherName) +#define GRPC_GENERAL_NAME_get0_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_GENERAL_NAME_get0_value) +#define GRPC_GENERAL_NAME_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_GENERAL_NAME_it) +#define GRPC_GENERAL_NAME_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_GENERAL_NAME_new) +#define GRPC_GENERAL_NAME_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_GENERAL_NAME_print) +#define GRPC_GENERAL_NAME_set0_othername BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_GENERAL_NAME_set0_othername) +#define GRPC_GENERAL_NAME_set0_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_GENERAL_NAME_set0_value) +#define GRPC_GENERAL_SUBTREE_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_GENERAL_SUBTREE_free) +#define GRPC_GENERAL_SUBTREE_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_GENERAL_SUBTREE_it) +#define GRPC_GENERAL_SUBTREE_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_GENERAL_SUBTREE_new) +#define GRPC_HKDF BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_HKDF) +#define GRPC_HKDF_expand BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_HKDF_expand) +#define GRPC_HKDF_extract BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_HKDF_extract) +#define GRPC_HMAC BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_HMAC) +#define GRPC_HMAC_CTX_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_HMAC_CTX_cleanup) +#define GRPC_HMAC_CTX_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_HMAC_CTX_copy) +#define GRPC_HMAC_CTX_copy_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_HMAC_CTX_copy_ex) +#define GRPC_HMAC_CTX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_HMAC_CTX_free) +#define GRPC_HMAC_CTX_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_HMAC_CTX_init) +#define GRPC_HMAC_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_HMAC_CTX_new) +#define GRPC_HMAC_CTX_reset BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_HMAC_CTX_reset) +#define GRPC_HMAC_Final BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_HMAC_Final) +#define GRPC_HMAC_Init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_HMAC_Init) +#define GRPC_HMAC_Init_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_HMAC_Init_ex) +#define GRPC_HMAC_Update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_HMAC_Update) +#define GRPC_HMAC_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_HMAC_size) +#define GRPC_HRSS_decap BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_HRSS_decap) +#define GRPC_HRSS_encap BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_HRSS_encap) +#define GRPC_HRSS_generate_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_HRSS_generate_key) +#define GRPC_HRSS_marshal_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_HRSS_marshal_public_key) +#define GRPC_HRSS_parse_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_HRSS_parse_public_key) +#define GRPC_HRSS_poly2_rotr_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_HRSS_poly2_rotr_consttime) +#define GRPC_HRSS_poly3_invert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_HRSS_poly3_invert) +#define GRPC_HRSS_poly3_mul BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_HRSS_poly3_mul) +#define GRPC_ISSUING_DIST_POINT_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ISSUING_DIST_POINT_free) +#define GRPC_ISSUING_DIST_POINT_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ISSUING_DIST_POINT_it) +#define GRPC_ISSUING_DIST_POINT_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ISSUING_DIST_POINT_new) +#define GRPC_MD4 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_MD4) +#define GRPC_MD4_Final BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_MD4_Final) +#define GRPC_MD4_Init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_MD4_Init) +#define GRPC_MD4_Transform BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_MD4_Transform) +#define GRPC_MD4_Update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_MD4_Update) +#define GRPC_MD5 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_MD5) +#define GRPC_MD5_Final BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_MD5_Final) +#define GRPC_MD5_Init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_MD5_Init) +#define GRPC_MD5_Transform BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_MD5_Transform) +#define GRPC_MD5_Update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_MD5_Update) +#define GRPC_METHOD_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_METHOD_ref) +#define GRPC_METHOD_unref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_METHOD_unref) +#define GRPC_NAME_CONSTRAINTS_check BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_NAME_CONSTRAINTS_check) +#define GRPC_NAME_CONSTRAINTS_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_NAME_CONSTRAINTS_free) +#define GRPC_NAME_CONSTRAINTS_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_NAME_CONSTRAINTS_it) +#define GRPC_NAME_CONSTRAINTS_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_NAME_CONSTRAINTS_new) +#define GRPC_NCONF_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_NCONF_free) +#define GRPC_NCONF_get_section BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_NCONF_get_section) +#define GRPC_NCONF_get_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_NCONF_get_string) +#define GRPC_NCONF_load BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_NCONF_load) +#define GRPC_NCONF_load_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_NCONF_load_bio) +#define GRPC_NCONF_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_NCONF_new) +#define GRPC_NETSCAPE_SPKAC_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_NETSCAPE_SPKAC_free) +#define GRPC_NETSCAPE_SPKAC_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_NETSCAPE_SPKAC_it) +#define GRPC_NETSCAPE_SPKAC_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_NETSCAPE_SPKAC_new) +#define GRPC_NETSCAPE_SPKI_b64_decode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_NETSCAPE_SPKI_b64_decode) +#define GRPC_NETSCAPE_SPKI_b64_encode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_NETSCAPE_SPKI_b64_encode) +#define GRPC_NETSCAPE_SPKI_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_NETSCAPE_SPKI_free) +#define GRPC_NETSCAPE_SPKI_get_pubkey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_NETSCAPE_SPKI_get_pubkey) +#define GRPC_NETSCAPE_SPKI_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_NETSCAPE_SPKI_it) +#define GRPC_NETSCAPE_SPKI_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_NETSCAPE_SPKI_new) +#define GRPC_NETSCAPE_SPKI_set_pubkey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_NETSCAPE_SPKI_set_pubkey) +#define GRPC_NETSCAPE_SPKI_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_NETSCAPE_SPKI_sign) +#define GRPC_NETSCAPE_SPKI_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_NETSCAPE_SPKI_verify) +#define GRPC_NOTICEREF_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_NOTICEREF_free) +#define GRPC_NOTICEREF_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_NOTICEREF_it) +#define GRPC_NOTICEREF_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_NOTICEREF_new) +#define GRPC_OBJ_cbs2nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OBJ_cbs2nid) +#define GRPC_OBJ_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OBJ_cleanup) +#define GRPC_OBJ_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OBJ_cmp) +#define GRPC_OBJ_create BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OBJ_create) +#define GRPC_OBJ_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OBJ_dup) +#define GRPC_OBJ_find_sigid_algs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OBJ_find_sigid_algs) +#define GRPC_OBJ_find_sigid_by_algs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OBJ_find_sigid_by_algs) +#define GRPC_OBJ_get0_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OBJ_get0_data) +#define GRPC_OBJ_length BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OBJ_length) +#define GRPC_OBJ_ln2nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OBJ_ln2nid) +#define GRPC_OBJ_nid2cbb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OBJ_nid2cbb) +#define GRPC_OBJ_nid2ln BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OBJ_nid2ln) +#define GRPC_OBJ_nid2obj BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OBJ_nid2obj) +#define GRPC_OBJ_nid2sn BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OBJ_nid2sn) +#define GRPC_OBJ_obj2nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OBJ_obj2nid) +#define GRPC_OBJ_obj2txt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OBJ_obj2txt) +#define GRPC_OBJ_sn2nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OBJ_sn2nid) +#define GRPC_OBJ_txt2nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OBJ_txt2nid) +#define GRPC_OBJ_txt2obj BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OBJ_txt2obj) +#define GRPC_OPENSSL_add_all_algorithms_conf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OPENSSL_add_all_algorithms_conf) +#define GRPC_OPENSSL_built_in_curves BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OPENSSL_built_in_curves) +#define GRPC_OPENSSL_cleanse BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OPENSSL_cleanse) +#define GRPC_OPENSSL_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OPENSSL_cleanup) +#define GRPC_OPENSSL_clear_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OPENSSL_clear_free) +#define GRPC_OPENSSL_config BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OPENSSL_config) +#define GRPC_OPENSSL_cpuid_setup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OPENSSL_cpuid_setup) +#define GRPC_OPENSSL_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OPENSSL_free) +#define GRPC_OPENSSL_gmtime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OPENSSL_gmtime) +#define GRPC_OPENSSL_gmtime_adj BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OPENSSL_gmtime_adj) +#define GRPC_OPENSSL_gmtime_diff BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OPENSSL_gmtime_diff) +#define GRPC_OPENSSL_hash32 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OPENSSL_hash32) +#define GRPC_OPENSSL_ia32cap_P BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OPENSSL_ia32cap_P) +#define GRPC_OPENSSL_init_crypto BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OPENSSL_init_crypto) +#define GRPC_OPENSSL_load_builtin_modules BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OPENSSL_load_builtin_modules) +#define GRPC_OPENSSL_malloc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OPENSSL_malloc) +#define GRPC_OPENSSL_malloc_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OPENSSL_malloc_init) +#define GRPC_OPENSSL_no_config BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OPENSSL_no_config) +#define GRPC_OPENSSL_realloc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OPENSSL_realloc) +#define GRPC_OPENSSL_strcasecmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OPENSSL_strcasecmp) +#define GRPC_OPENSSL_strdup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OPENSSL_strdup) +#define GRPC_OPENSSL_strncasecmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OPENSSL_strncasecmp) +#define GRPC_OPENSSL_strnlen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OPENSSL_strnlen) +#define GRPC_OPENSSL_tolower BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OPENSSL_tolower) +#define GRPC_OTHERNAME_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OTHERNAME_cmp) +#define GRPC_OTHERNAME_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OTHERNAME_free) +#define GRPC_OTHERNAME_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OTHERNAME_it) +#define GRPC_OTHERNAME_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OTHERNAME_new) +#define GRPC_OpenSSL_add_all_algorithms BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OpenSSL_add_all_algorithms) +#define GRPC_OpenSSL_add_all_ciphers BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OpenSSL_add_all_ciphers) +#define GRPC_OpenSSL_add_all_digests BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OpenSSL_add_all_digests) +#define GRPC_OpenSSL_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OpenSSL_version) +#define GRPC_OpenSSL_version_num BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OpenSSL_version_num) +#define GRPC_PEM_ASN1_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_ASN1_read) +#define GRPC_PEM_ASN1_read_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_ASN1_read_bio) +#define GRPC_PEM_ASN1_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_ASN1_write) +#define GRPC_PEM_ASN1_write_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_ASN1_write_bio) +#define GRPC_PEM_X509_INFO_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_X509_INFO_read) +#define GRPC_PEM_X509_INFO_read_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_X509_INFO_read_bio) +#define GRPC_PEM_X509_INFO_write_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_X509_INFO_write_bio) +#define GRPC_PEM_bytes_read_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_bytes_read_bio) +#define GRPC_PEM_def_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_def_callback) +#define GRPC_PEM_dek_info BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_dek_info) +#define GRPC_PEM_do_header BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_do_header) +#define GRPC_PEM_get_EVP_CIPHER_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_get_EVP_CIPHER_INFO) +#define GRPC_PEM_proc_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_proc_type) +#define GRPC_PEM_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read) +#define GRPC_PEM_read_DHparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_DHparams) +#define GRPC_PEM_read_DSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_DSAPrivateKey) +#define GRPC_PEM_read_DSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_DSA_PUBKEY) +#define GRPC_PEM_read_DSAparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_DSAparams) +#define GRPC_PEM_read_ECPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_ECPrivateKey) +#define GRPC_PEM_read_EC_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_EC_PUBKEY) +#define GRPC_PEM_read_PKCS7 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_PKCS7) +#define GRPC_PEM_read_PKCS8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_PKCS8) +#define GRPC_PEM_read_PKCS8_PRIV_KEY_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_PKCS8_PRIV_KEY_INFO) +#define GRPC_PEM_read_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_PUBKEY) +#define GRPC_PEM_read_PrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_PrivateKey) +#define GRPC_PEM_read_RSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_RSAPrivateKey) +#define GRPC_PEM_read_RSAPublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_RSAPublicKey) +#define GRPC_PEM_read_RSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_RSA_PUBKEY) +#define GRPC_PEM_read_X509 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_X509) +#define GRPC_PEM_read_X509_AUX BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_X509_AUX) +#define GRPC_PEM_read_X509_CRL BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_X509_CRL) +#define GRPC_PEM_read_X509_REQ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_X509_REQ) +#define GRPC_PEM_read_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_bio) +#define GRPC_PEM_read_bio_DHparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_bio_DHparams) +#define GRPC_PEM_read_bio_DSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_bio_DSAPrivateKey) +#define GRPC_PEM_read_bio_DSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_bio_DSA_PUBKEY) +#define GRPC_PEM_read_bio_DSAparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_bio_DSAparams) +#define GRPC_PEM_read_bio_ECPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_bio_ECPrivateKey) +#define GRPC_PEM_read_bio_EC_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_bio_EC_PUBKEY) +#define GRPC_PEM_read_bio_PKCS7 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_bio_PKCS7) +#define GRPC_PEM_read_bio_PKCS8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_bio_PKCS8) +#define GRPC_PEM_read_bio_PKCS8_PRIV_KEY_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_bio_PKCS8_PRIV_KEY_INFO) +#define GRPC_PEM_read_bio_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_bio_PUBKEY) +#define GRPC_PEM_read_bio_PrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_bio_PrivateKey) +#define GRPC_PEM_read_bio_RSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_bio_RSAPrivateKey) +#define GRPC_PEM_read_bio_RSAPublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_bio_RSAPublicKey) +#define GRPC_PEM_read_bio_RSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_bio_RSA_PUBKEY) +#define GRPC_PEM_read_bio_X509 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_bio_X509) +#define GRPC_PEM_read_bio_X509_AUX BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_bio_X509_AUX) +#define GRPC_PEM_read_bio_X509_CRL BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_bio_X509_CRL) +#define GRPC_PEM_read_bio_X509_REQ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_bio_X509_REQ) +#define GRPC_PEM_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write) +#define GRPC_PEM_write_DHparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_DHparams) +#define GRPC_PEM_write_DSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_DSAPrivateKey) +#define GRPC_PEM_write_DSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_DSA_PUBKEY) +#define GRPC_PEM_write_DSAparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_DSAparams) +#define GRPC_PEM_write_ECPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_ECPrivateKey) +#define GRPC_PEM_write_EC_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_EC_PUBKEY) +#define GRPC_PEM_write_PKCS7 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_PKCS7) +#define GRPC_PEM_write_PKCS8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_PKCS8) +#define GRPC_PEM_write_PKCS8PrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_PKCS8PrivateKey) +#define GRPC_PEM_write_PKCS8PrivateKey_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_PKCS8PrivateKey_nid) +#define GRPC_PEM_write_PKCS8_PRIV_KEY_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_PKCS8_PRIV_KEY_INFO) +#define GRPC_PEM_write_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_PUBKEY) +#define GRPC_PEM_write_PrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_PrivateKey) +#define GRPC_PEM_write_RSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_RSAPrivateKey) +#define GRPC_PEM_write_RSAPublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_RSAPublicKey) +#define GRPC_PEM_write_RSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_RSA_PUBKEY) +#define GRPC_PEM_write_X509 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_X509) +#define GRPC_PEM_write_X509_AUX BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_X509_AUX) +#define GRPC_PEM_write_X509_CRL BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_X509_CRL) +#define GRPC_PEM_write_X509_REQ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_X509_REQ) +#define GRPC_PEM_write_X509_REQ_NEW BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_X509_REQ_NEW) +#define GRPC_PEM_write_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_bio) +#define GRPC_PEM_write_bio_DHparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_bio_DHparams) +#define GRPC_PEM_write_bio_DSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_bio_DSAPrivateKey) +#define GRPC_PEM_write_bio_DSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_bio_DSA_PUBKEY) +#define GRPC_PEM_write_bio_DSAparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_bio_DSAparams) +#define GRPC_PEM_write_bio_ECPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_bio_ECPrivateKey) +#define GRPC_PEM_write_bio_EC_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_bio_EC_PUBKEY) +#define GRPC_PEM_write_bio_PKCS7 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_bio_PKCS7) +#define GRPC_PEM_write_bio_PKCS8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_bio_PKCS8) +#define GRPC_PEM_write_bio_PKCS8PrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_bio_PKCS8PrivateKey) +#define GRPC_PEM_write_bio_PKCS8PrivateKey_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_bio_PKCS8PrivateKey_nid) +#define GRPC_PEM_write_bio_PKCS8_PRIV_KEY_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_bio_PKCS8_PRIV_KEY_INFO) +#define GRPC_PEM_write_bio_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_bio_PUBKEY) +#define GRPC_PEM_write_bio_PrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_bio_PrivateKey) +#define GRPC_PEM_write_bio_RSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_bio_RSAPrivateKey) +#define GRPC_PEM_write_bio_RSAPublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_bio_RSAPublicKey) +#define GRPC_PEM_write_bio_RSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_bio_RSA_PUBKEY) +#define GRPC_PEM_write_bio_X509 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_bio_X509) +#define GRPC_PEM_write_bio_X509_AUX BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_bio_X509_AUX) +#define GRPC_PEM_write_bio_X509_CRL BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_bio_X509_CRL) +#define GRPC_PEM_write_bio_X509_REQ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_bio_X509_REQ) +#define GRPC_PEM_write_bio_X509_REQ_NEW BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_bio_X509_REQ_NEW) +#define GRPC_PKCS12_PBE_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PKCS12_PBE_add) +#define GRPC_PKCS12_create BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PKCS12_create) +#define GRPC_PKCS12_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PKCS12_free) +#define GRPC_PKCS12_get_key_and_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PKCS12_get_key_and_certs) +#define GRPC_PKCS12_parse BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PKCS12_parse) +#define GRPC_PKCS12_verify_mac BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PKCS12_verify_mac) +#define GRPC_PKCS5_PBKDF2_HMAC BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PKCS5_PBKDF2_HMAC) +#define GRPC_PKCS5_PBKDF2_HMAC_SHA1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PKCS5_PBKDF2_HMAC_SHA1) +#define GRPC_PKCS5_pbe2_decrypt_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PKCS5_pbe2_decrypt_init) +#define GRPC_PKCS5_pbe2_encrypt_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PKCS5_pbe2_encrypt_init) +#define GRPC_PKCS7_bundle_CRLs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PKCS7_bundle_CRLs) +#define GRPC_PKCS7_bundle_certificates BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PKCS7_bundle_certificates) +#define GRPC_PKCS7_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PKCS7_free) +#define GRPC_PKCS7_get_CRLs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PKCS7_get_CRLs) +#define GRPC_PKCS7_get_PEM_CRLs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PKCS7_get_PEM_CRLs) +#define GRPC_PKCS7_get_PEM_certificates BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PKCS7_get_PEM_certificates) +#define GRPC_PKCS7_get_certificates BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PKCS7_get_certificates) +#define GRPC_PKCS7_get_raw_certificates BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PKCS7_get_raw_certificates) +#define GRPC_PKCS7_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PKCS7_sign) +#define GRPC_PKCS7_type_is_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PKCS7_type_is_data) +#define GRPC_PKCS7_type_is_digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PKCS7_type_is_digest) +#define GRPC_PKCS7_type_is_encrypted BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PKCS7_type_is_encrypted) +#define GRPC_PKCS7_type_is_enveloped BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PKCS7_type_is_enveloped) +#define GRPC_PKCS7_type_is_signed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PKCS7_type_is_signed) +#define GRPC_PKCS7_type_is_signedAndEnveloped BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PKCS7_type_is_signedAndEnveloped) +#define GRPC_PKCS8_PRIV_KEY_INFO_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PKCS8_PRIV_KEY_INFO_free) +#define GRPC_PKCS8_PRIV_KEY_INFO_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PKCS8_PRIV_KEY_INFO_it) +#define GRPC_PKCS8_PRIV_KEY_INFO_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PKCS8_PRIV_KEY_INFO_new) +#define GRPC_PKCS8_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PKCS8_decrypt) +#define GRPC_PKCS8_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PKCS8_encrypt) +#define GRPC_PKCS8_marshal_encrypted_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PKCS8_marshal_encrypted_private_key) +#define GRPC_PKCS8_parse_encrypted_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PKCS8_parse_encrypted_private_key) +#define GRPC_PKCS8_pkey_get0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PKCS8_pkey_get0) +#define GRPC_PKCS8_pkey_set0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PKCS8_pkey_set0) +#define GRPC_PKEY_USAGE_PERIOD_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PKEY_USAGE_PERIOD_free) +#define GRPC_PKEY_USAGE_PERIOD_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PKEY_USAGE_PERIOD_it) +#define GRPC_PKEY_USAGE_PERIOD_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PKEY_USAGE_PERIOD_new) +#define GRPC_POLICYINFO_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_POLICYINFO_free) +#define GRPC_POLICYINFO_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_POLICYINFO_it) +#define GRPC_POLICYINFO_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_POLICYINFO_new) +#define GRPC_POLICYQUALINFO_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_POLICYQUALINFO_free) +#define GRPC_POLICYQUALINFO_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_POLICYQUALINFO_it) +#define GRPC_POLICYQUALINFO_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_POLICYQUALINFO_new) +#define GRPC_POLICY_CONSTRAINTS_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_POLICY_CONSTRAINTS_free) +#define GRPC_POLICY_CONSTRAINTS_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_POLICY_CONSTRAINTS_it) +#define GRPC_POLICY_CONSTRAINTS_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_POLICY_CONSTRAINTS_new) +#define GRPC_POLICY_MAPPINGS_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_POLICY_MAPPINGS_it) +#define GRPC_POLICY_MAPPING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_POLICY_MAPPING_free) +#define GRPC_POLICY_MAPPING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_POLICY_MAPPING_it) +#define GRPC_POLICY_MAPPING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_POLICY_MAPPING_new) +#define GRPC_PROXY_CERT_INFO_EXTENSION_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PROXY_CERT_INFO_EXTENSION_free) +#define GRPC_PROXY_CERT_INFO_EXTENSION_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PROXY_CERT_INFO_EXTENSION_it) +#define GRPC_PROXY_CERT_INFO_EXTENSION_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PROXY_CERT_INFO_EXTENSION_new) +#define GRPC_PROXY_POLICY_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PROXY_POLICY_free) +#define GRPC_PROXY_POLICY_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PROXY_POLICY_it) +#define GRPC_PROXY_POLICY_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PROXY_POLICY_new) +#define GRPC_RAND_SSLeay BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RAND_SSLeay) +#define GRPC_RAND_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RAND_add) +#define GRPC_RAND_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RAND_bytes) +#define GRPC_RAND_bytes_with_additional_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RAND_bytes_with_additional_data) +#define GRPC_RAND_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RAND_cleanup) +#define GRPC_RAND_egd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RAND_egd) +#define GRPC_RAND_enable_fork_unsafe_buffering BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RAND_enable_fork_unsafe_buffering) +#define GRPC_RAND_file_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RAND_file_name) +#define GRPC_RAND_get_rand_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RAND_get_rand_method) +#define GRPC_RAND_load_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RAND_load_file) +#define GRPC_RAND_poll BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RAND_poll) +#define GRPC_RAND_pseudo_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RAND_pseudo_bytes) +#define GRPC_RAND_seed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RAND_seed) +#define GRPC_RAND_set_rand_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RAND_set_rand_method) +#define GRPC_RAND_set_urandom_fd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RAND_set_urandom_fd) +#define GRPC_RAND_status BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RAND_status) +#define GRPC_RC4 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RC4) +#define GRPC_RC4_set_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RC4_set_key) +#define GRPC_RSAPrivateKey_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSAPrivateKey_dup) +#define GRPC_RSAPublicKey_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSAPublicKey_dup) +#define GRPC_RSAZ_1024_mod_exp_avx2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSAZ_1024_mod_exp_avx2) +#define GRPC_RSA_PSS_PARAMS_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_PSS_PARAMS_free) +#define GRPC_RSA_PSS_PARAMS_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_PSS_PARAMS_it) +#define GRPC_RSA_PSS_PARAMS_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_PSS_PARAMS_new) +#define GRPC_RSA_add_pkcs1_prefix BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_add_pkcs1_prefix) +#define GRPC_RSA_bits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_bits) +#define GRPC_RSA_blinding_on BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_blinding_on) +#define GRPC_RSA_check_fips BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_check_fips) +#define GRPC_RSA_check_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_check_key) +#define GRPC_RSA_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_decrypt) +#define GRPC_RSA_default_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_default_method) +#define GRPC_RSA_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_encrypt) +#define GRPC_RSA_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_flags) +#define GRPC_RSA_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_free) +#define GRPC_RSA_generate_key_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_generate_key_ex) +#define GRPC_RSA_generate_key_fips BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_generate_key_fips) +#define GRPC_RSA_get0_crt_params BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_get0_crt_params) +#define GRPC_RSA_get0_factors BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_get0_factors) +#define GRPC_RSA_get0_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_get0_key) +#define GRPC_RSA_get_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_get_ex_data) +#define GRPC_RSA_get_ex_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_get_ex_new_index) +#define GRPC_RSA_is_opaque BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_is_opaque) +#define GRPC_RSA_marshal_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_marshal_private_key) +#define GRPC_RSA_marshal_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_marshal_public_key) +#define GRPC_RSA_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_new) +#define GRPC_RSA_new_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_new_method) +#define GRPC_RSA_padding_add_PKCS1_OAEP_mgf1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_padding_add_PKCS1_OAEP_mgf1) +#define GRPC_RSA_padding_add_PKCS1_PSS_mgf1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_padding_add_PKCS1_PSS_mgf1) +#define GRPC_RSA_padding_add_PKCS1_type_1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_padding_add_PKCS1_type_1) +#define GRPC_RSA_padding_add_PKCS1_type_2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_padding_add_PKCS1_type_2) +#define GRPC_RSA_padding_add_none BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_padding_add_none) +#define GRPC_RSA_padding_check_PKCS1_OAEP_mgf1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_padding_check_PKCS1_OAEP_mgf1) +#define GRPC_RSA_padding_check_PKCS1_type_1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_padding_check_PKCS1_type_1) +#define GRPC_RSA_padding_check_PKCS1_type_2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_padding_check_PKCS1_type_2) +#define GRPC_RSA_parse_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_parse_private_key) +#define GRPC_RSA_parse_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_parse_public_key) +#define GRPC_RSA_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_print) +#define GRPC_RSA_private_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_private_decrypt) +#define GRPC_RSA_private_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_private_encrypt) +#define GRPC_RSA_private_key_from_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_private_key_from_bytes) +#define GRPC_RSA_private_key_to_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_private_key_to_bytes) +#define GRPC_RSA_private_transform BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_private_transform) +#define GRPC_RSA_public_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_public_decrypt) +#define GRPC_RSA_public_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_public_encrypt) +#define GRPC_RSA_public_key_from_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_public_key_from_bytes) +#define GRPC_RSA_public_key_to_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_public_key_to_bytes) +#define GRPC_RSA_set0_crt_params BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_set0_crt_params) +#define GRPC_RSA_set0_factors BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_set0_factors) +#define GRPC_RSA_set0_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_set0_key) +#define GRPC_RSA_set_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_set_ex_data) +#define GRPC_RSA_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_sign) +#define GRPC_RSA_sign_pss_mgf1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_sign_pss_mgf1) +#define GRPC_RSA_sign_raw BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_sign_raw) +#define GRPC_RSA_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_size) +#define GRPC_RSA_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_up_ref) +#define GRPC_RSA_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_verify) +#define GRPC_RSA_verify_PKCS1_PSS_mgf1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_verify_PKCS1_PSS_mgf1) +#define GRPC_RSA_verify_pss_mgf1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_verify_pss_mgf1) +#define GRPC_RSA_verify_raw BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_verify_raw) +#define GRPC_SHA1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SHA1) +#define GRPC_SHA1_Final BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SHA1_Final) +#define GRPC_SHA1_Init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SHA1_Init) +#define GRPC_SHA1_Transform BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SHA1_Transform) +#define GRPC_SHA1_Update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SHA1_Update) +#define GRPC_SHA224 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SHA224) +#define GRPC_SHA224_Final BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SHA224_Final) +#define GRPC_SHA224_Init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SHA224_Init) +#define GRPC_SHA224_Update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SHA224_Update) +#define GRPC_SHA256 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SHA256) +#define GRPC_SHA256_Final BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SHA256_Final) +#define GRPC_SHA256_Init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SHA256_Init) +#define GRPC_SHA256_Transform BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SHA256_Transform) +#define GRPC_SHA256_TransformBlocks BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SHA256_TransformBlocks) +#define GRPC_SHA256_Update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SHA256_Update) +#define GRPC_SHA384 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SHA384) +#define GRPC_SHA384_Final BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SHA384_Final) +#define GRPC_SHA384_Init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SHA384_Init) +#define GRPC_SHA384_Update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SHA384_Update) +#define GRPC_SHA512 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SHA512) +#define GRPC_SHA512_Final BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SHA512_Final) +#define GRPC_SHA512_Init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SHA512_Init) +#define GRPC_SHA512_Transform BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SHA512_Transform) +#define GRPC_SHA512_Update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SHA512_Update) +#define GRPC_SIPHASH_24 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SIPHASH_24) +#define GRPC_SPAKE2_CTX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SPAKE2_CTX_free) +#define GRPC_SPAKE2_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SPAKE2_CTX_new) +#define GRPC_SPAKE2_generate_msg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SPAKE2_generate_msg) +#define GRPC_SPAKE2_process_msg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SPAKE2_process_msg) +#define GRPC_SSLeay BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSLeay) +#define GRPC_SSLeay_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSLeay_version) +#define GRPC_SXNETID_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SXNETID_free) +#define GRPC_SXNETID_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SXNETID_it) +#define GRPC_SXNETID_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SXNETID_new) +#define GRPC_SXNET_add_id_INTEGER BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SXNET_add_id_INTEGER) +#define GRPC_SXNET_add_id_asc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SXNET_add_id_asc) +#define GRPC_SXNET_add_id_ulong BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SXNET_add_id_ulong) +#define GRPC_SXNET_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SXNET_free) +#define GRPC_SXNET_get_id_INTEGER BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SXNET_get_id_INTEGER) +#define GRPC_SXNET_get_id_asc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SXNET_get_id_asc) +#define GRPC_SXNET_get_id_ulong BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SXNET_get_id_ulong) +#define GRPC_SXNET_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SXNET_it) +#define GRPC_SXNET_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SXNET_new) +#define GRPC_USERNOTICE_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_USERNOTICE_free) +#define GRPC_USERNOTICE_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_USERNOTICE_it) +#define GRPC_USERNOTICE_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_USERNOTICE_new) +#define GRPC_UTF8_getc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_UTF8_getc) +#define GRPC_UTF8_putc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_UTF8_putc) +#define GRPC_X25519 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X25519) +#define GRPC_X25519_keypair BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X25519_keypair) +#define GRPC_X25519_public_from_private BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X25519_public_from_private) +#define GRPC_X509V3_EXT_CRL_add_nconf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509V3_EXT_CRL_add_nconf) +#define GRPC_X509V3_EXT_REQ_add_nconf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509V3_EXT_REQ_add_nconf) +#define GRPC_X509V3_EXT_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509V3_EXT_add) +#define GRPC_X509V3_EXT_add_alias BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509V3_EXT_add_alias) +#define GRPC_X509V3_EXT_add_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509V3_EXT_add_list) +#define GRPC_X509V3_EXT_add_nconf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509V3_EXT_add_nconf) +#define GRPC_X509V3_EXT_add_nconf_sk BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509V3_EXT_add_nconf_sk) +#define GRPC_X509V3_EXT_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509V3_EXT_cleanup) +#define GRPC_X509V3_EXT_d2i BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509V3_EXT_d2i) +#define GRPC_X509V3_EXT_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509V3_EXT_free) +#define GRPC_X509V3_EXT_get BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509V3_EXT_get) +#define GRPC_X509V3_EXT_get_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509V3_EXT_get_nid) +#define GRPC_X509V3_EXT_i2d BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509V3_EXT_i2d) +#define GRPC_X509V3_EXT_nconf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509V3_EXT_nconf) +#define GRPC_X509V3_EXT_nconf_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509V3_EXT_nconf_nid) +#define GRPC_X509V3_EXT_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509V3_EXT_print) +#define GRPC_X509V3_EXT_print_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509V3_EXT_print_fp) +#define GRPC_X509V3_EXT_val_prn BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509V3_EXT_val_prn) +#define GRPC_X509V3_NAME_from_section BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509V3_NAME_from_section) +#define GRPC_X509V3_add1_i2d BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509V3_add1_i2d) +#define GRPC_X509V3_add_standard_extensions BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509V3_add_standard_extensions) +#define GRPC_X509V3_add_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509V3_add_value) +#define GRPC_X509V3_add_value_bool BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509V3_add_value_bool) +#define GRPC_X509V3_add_value_bool_nf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509V3_add_value_bool_nf) +#define GRPC_X509V3_add_value_int BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509V3_add_value_int) +#define GRPC_X509V3_add_value_uchar BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509V3_add_value_uchar) +#define GRPC_X509V3_conf_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509V3_conf_free) +#define GRPC_X509V3_extensions_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509V3_extensions_print) +#define GRPC_X509V3_get_d2i BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509V3_get_d2i) +#define GRPC_X509V3_get_section BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509V3_get_section) +#define GRPC_X509V3_get_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509V3_get_string) +#define GRPC_X509V3_get_value_bool BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509V3_get_value_bool) +#define GRPC_X509V3_get_value_int BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509V3_get_value_int) +#define GRPC_X509V3_parse_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509V3_parse_list) +#define GRPC_X509V3_section_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509V3_section_free) +#define GRPC_X509V3_set_ctx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509V3_set_ctx) +#define GRPC_X509V3_set_nconf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509V3_set_nconf) +#define GRPC_X509V3_string_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509V3_string_free) +#define GRPC_X509_ALGORS_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_ALGORS_it) +#define GRPC_X509_ALGOR_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_ALGOR_cmp) +#define GRPC_X509_ALGOR_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_ALGOR_dup) +#define GRPC_X509_ALGOR_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_ALGOR_free) +#define GRPC_X509_ALGOR_get0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_ALGOR_get0) +#define GRPC_X509_ALGOR_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_ALGOR_it) +#define GRPC_X509_ALGOR_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_ALGOR_new) +#define GRPC_X509_ALGOR_set0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_ALGOR_set0) +#define GRPC_X509_ALGOR_set_md BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_ALGOR_set_md) +#define GRPC_X509_ATTRIBUTE_SET_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_ATTRIBUTE_SET_it) +#define GRPC_X509_ATTRIBUTE_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_ATTRIBUTE_count) +#define GRPC_X509_ATTRIBUTE_create BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_ATTRIBUTE_create) +#define GRPC_X509_ATTRIBUTE_create_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_ATTRIBUTE_create_by_NID) +#define GRPC_X509_ATTRIBUTE_create_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_ATTRIBUTE_create_by_OBJ) +#define GRPC_X509_ATTRIBUTE_create_by_txt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_ATTRIBUTE_create_by_txt) +#define GRPC_X509_ATTRIBUTE_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_ATTRIBUTE_dup) +#define GRPC_X509_ATTRIBUTE_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_ATTRIBUTE_free) +#define GRPC_X509_ATTRIBUTE_get0_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_ATTRIBUTE_get0_data) +#define GRPC_X509_ATTRIBUTE_get0_object BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_ATTRIBUTE_get0_object) +#define GRPC_X509_ATTRIBUTE_get0_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_ATTRIBUTE_get0_type) +#define GRPC_X509_ATTRIBUTE_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_ATTRIBUTE_it) +#define GRPC_X509_ATTRIBUTE_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_ATTRIBUTE_new) +#define GRPC_X509_ATTRIBUTE_set1_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_ATTRIBUTE_set1_data) +#define GRPC_X509_ATTRIBUTE_set1_object BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_ATTRIBUTE_set1_object) +#define GRPC_X509_CERT_AUX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CERT_AUX_free) +#define GRPC_X509_CERT_AUX_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CERT_AUX_it) +#define GRPC_X509_CERT_AUX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CERT_AUX_new) +#define GRPC_X509_CERT_AUX_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CERT_AUX_print) +#define GRPC_X509_CINF_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CINF_free) +#define GRPC_X509_CINF_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CINF_it) +#define GRPC_X509_CINF_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CINF_new) +#define GRPC_X509_CRL_INFO_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_INFO_free) +#define GRPC_X509_CRL_INFO_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_INFO_it) +#define GRPC_X509_CRL_INFO_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_INFO_new) +#define GRPC_X509_CRL_METHOD_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_METHOD_free) +#define GRPC_X509_CRL_METHOD_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_METHOD_new) +#define GRPC_X509_CRL_add0_revoked BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_add0_revoked) +#define GRPC_X509_CRL_add1_ext_i2d BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_add1_ext_i2d) +#define GRPC_X509_CRL_add_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_add_ext) +#define GRPC_X509_CRL_check_suiteb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_check_suiteb) +#define GRPC_X509_CRL_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_cmp) +#define GRPC_X509_CRL_delete_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_delete_ext) +#define GRPC_X509_CRL_diff BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_diff) +#define GRPC_X509_CRL_digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_digest) +#define GRPC_X509_CRL_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_dup) +#define GRPC_X509_CRL_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_free) +#define GRPC_X509_CRL_get0_by_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_get0_by_cert) +#define GRPC_X509_CRL_get0_by_serial BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_get0_by_serial) +#define GRPC_X509_CRL_get0_lastUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_get0_lastUpdate) +#define GRPC_X509_CRL_get0_nextUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_get0_nextUpdate) +#define GRPC_X509_CRL_get0_signature BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_get0_signature) +#define GRPC_X509_CRL_get_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_get_ext) +#define GRPC_X509_CRL_get_ext_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_get_ext_by_NID) +#define GRPC_X509_CRL_get_ext_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_get_ext_by_OBJ) +#define GRPC_X509_CRL_get_ext_by_critical BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_get_ext_by_critical) +#define GRPC_X509_CRL_get_ext_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_get_ext_count) +#define GRPC_X509_CRL_get_ext_d2i BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_get_ext_d2i) +#define GRPC_X509_CRL_get_meth_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_get_meth_data) +#define GRPC_X509_CRL_get_signature_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_get_signature_nid) +#define GRPC_X509_CRL_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_it) +#define GRPC_X509_CRL_match BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_match) +#define GRPC_X509_CRL_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_new) +#define GRPC_X509_CRL_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_print) +#define GRPC_X509_CRL_print_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_print_fp) +#define GRPC_X509_CRL_set_default_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_set_default_method) +#define GRPC_X509_CRL_set_issuer_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_set_issuer_name) +#define GRPC_X509_CRL_set_lastUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_set_lastUpdate) +#define GRPC_X509_CRL_set_meth_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_set_meth_data) +#define GRPC_X509_CRL_set_nextUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_set_nextUpdate) +#define GRPC_X509_CRL_set_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_set_version) +#define GRPC_X509_CRL_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_sign) +#define GRPC_X509_CRL_sign_ctx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_sign_ctx) +#define GRPC_X509_CRL_sort BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_sort) +#define GRPC_X509_CRL_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_up_ref) +#define GRPC_X509_CRL_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_verify) +#define GRPC_X509_EXTENSIONS_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_EXTENSIONS_it) +#define GRPC_X509_EXTENSION_create_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_EXTENSION_create_by_NID) +#define GRPC_X509_EXTENSION_create_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_EXTENSION_create_by_OBJ) +#define GRPC_X509_EXTENSION_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_EXTENSION_dup) +#define GRPC_X509_EXTENSION_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_EXTENSION_free) +#define GRPC_X509_EXTENSION_get_critical BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_EXTENSION_get_critical) +#define GRPC_X509_EXTENSION_get_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_EXTENSION_get_data) +#define GRPC_X509_EXTENSION_get_object BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_EXTENSION_get_object) +#define GRPC_X509_EXTENSION_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_EXTENSION_it) +#define GRPC_X509_EXTENSION_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_EXTENSION_new) +#define GRPC_X509_EXTENSION_set_critical BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_EXTENSION_set_critical) +#define GRPC_X509_EXTENSION_set_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_EXTENSION_set_data) +#define GRPC_X509_EXTENSION_set_object BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_EXTENSION_set_object) +#define GRPC_X509_INFO_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_INFO_free) +#define GRPC_X509_INFO_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_INFO_new) +#define GRPC_X509_LOOKUP_by_alias BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_LOOKUP_by_alias) +#define GRPC_X509_LOOKUP_by_fingerprint BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_LOOKUP_by_fingerprint) +#define GRPC_X509_LOOKUP_by_issuer_serial BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_LOOKUP_by_issuer_serial) +#define GRPC_X509_LOOKUP_by_subject BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_LOOKUP_by_subject) +#define GRPC_X509_LOOKUP_ctrl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_LOOKUP_ctrl) +#define GRPC_X509_LOOKUP_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_LOOKUP_file) +#define GRPC_X509_LOOKUP_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_LOOKUP_free) +#define GRPC_X509_LOOKUP_hash_dir BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_LOOKUP_hash_dir) +#define GRPC_X509_LOOKUP_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_LOOKUP_init) +#define GRPC_X509_LOOKUP_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_LOOKUP_new) +#define GRPC_X509_LOOKUP_shutdown BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_LOOKUP_shutdown) +#define GRPC_X509_NAME_ENTRIES_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_ENTRIES_it) +#define GRPC_X509_NAME_ENTRY_create_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_ENTRY_create_by_NID) +#define GRPC_X509_NAME_ENTRY_create_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_ENTRY_create_by_OBJ) +#define GRPC_X509_NAME_ENTRY_create_by_txt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_ENTRY_create_by_txt) +#define GRPC_X509_NAME_ENTRY_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_ENTRY_dup) +#define GRPC_X509_NAME_ENTRY_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_ENTRY_free) +#define GRPC_X509_NAME_ENTRY_get_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_ENTRY_get_data) +#define GRPC_X509_NAME_ENTRY_get_object BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_ENTRY_get_object) +#define GRPC_X509_NAME_ENTRY_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_ENTRY_it) +#define GRPC_X509_NAME_ENTRY_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_ENTRY_new) +#define GRPC_X509_NAME_ENTRY_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_ENTRY_set) +#define GRPC_X509_NAME_ENTRY_set_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_ENTRY_set_data) +#define GRPC_X509_NAME_ENTRY_set_object BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_ENTRY_set_object) +#define GRPC_X509_NAME_INTERNAL_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_INTERNAL_it) +#define GRPC_X509_NAME_add_entry BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_add_entry) +#define GRPC_X509_NAME_add_entry_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_add_entry_by_NID) +#define GRPC_X509_NAME_add_entry_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_add_entry_by_OBJ) +#define GRPC_X509_NAME_add_entry_by_txt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_add_entry_by_txt) +#define GRPC_X509_NAME_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_cmp) +#define GRPC_X509_NAME_delete_entry BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_delete_entry) +#define GRPC_X509_NAME_digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_digest) +#define GRPC_X509_NAME_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_dup) +#define GRPC_X509_NAME_entry_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_entry_count) +#define GRPC_X509_NAME_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_free) +#define GRPC_X509_NAME_get0_der BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_get0_der) +#define GRPC_X509_NAME_get_entry BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_get_entry) +#define GRPC_X509_NAME_get_index_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_get_index_by_NID) +#define GRPC_X509_NAME_get_index_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_get_index_by_OBJ) +#define GRPC_X509_NAME_get_text_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_get_text_by_NID) +#define GRPC_X509_NAME_get_text_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_get_text_by_OBJ) +#define GRPC_X509_NAME_hash BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_hash) +#define GRPC_X509_NAME_hash_old BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_hash_old) +#define GRPC_X509_NAME_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_it) +#define GRPC_X509_NAME_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_new) +#define GRPC_X509_NAME_oneline BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_oneline) +#define GRPC_X509_NAME_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_print) +#define GRPC_X509_NAME_print_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_print_ex) +#define GRPC_X509_NAME_print_ex_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_print_ex_fp) +#define GRPC_X509_NAME_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_set) +#define GRPC_X509_OBJECT_free_contents BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_OBJECT_free_contents) +#define GRPC_X509_OBJECT_get0_X509 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_OBJECT_get0_X509) +#define GRPC_X509_OBJECT_get_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_OBJECT_get_type) +#define GRPC_X509_OBJECT_idx_by_subject BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_OBJECT_idx_by_subject) +#define GRPC_X509_OBJECT_retrieve_by_subject BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_OBJECT_retrieve_by_subject) +#define GRPC_X509_OBJECT_retrieve_match BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_OBJECT_retrieve_match) +#define GRPC_X509_OBJECT_up_ref_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_OBJECT_up_ref_count) +#define GRPC_X509_PKEY_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_PKEY_free) +#define GRPC_X509_PKEY_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_PKEY_new) +#define GRPC_X509_POLICY_NODE_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_POLICY_NODE_print) +#define GRPC_X509_PUBKEY_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_PUBKEY_free) +#define GRPC_X509_PUBKEY_get BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_PUBKEY_get) +#define GRPC_X509_PUBKEY_get0_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_PUBKEY_get0_param) +#define GRPC_X509_PUBKEY_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_PUBKEY_it) +#define GRPC_X509_PUBKEY_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_PUBKEY_new) +#define GRPC_X509_PUBKEY_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_PUBKEY_set) +#define GRPC_X509_PUBKEY_set0_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_PUBKEY_set0_param) +#define GRPC_X509_PURPOSE_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_PURPOSE_add) +#define GRPC_X509_PURPOSE_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_PURPOSE_cleanup) +#define GRPC_X509_PURPOSE_get0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_PURPOSE_get0) +#define GRPC_X509_PURPOSE_get0_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_PURPOSE_get0_name) +#define GRPC_X509_PURPOSE_get0_sname BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_PURPOSE_get0_sname) +#define GRPC_X509_PURPOSE_get_by_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_PURPOSE_get_by_id) +#define GRPC_X509_PURPOSE_get_by_sname BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_PURPOSE_get_by_sname) +#define GRPC_X509_PURPOSE_get_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_PURPOSE_get_count) +#define GRPC_X509_PURPOSE_get_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_PURPOSE_get_id) +#define GRPC_X509_PURPOSE_get_trust BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_PURPOSE_get_trust) +#define GRPC_X509_PURPOSE_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_PURPOSE_set) +#define GRPC_X509_REQ_INFO_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REQ_INFO_free) +#define GRPC_X509_REQ_INFO_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REQ_INFO_it) +#define GRPC_X509_REQ_INFO_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REQ_INFO_new) +#define GRPC_X509_REQ_add1_attr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REQ_add1_attr) +#define GRPC_X509_REQ_add1_attr_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REQ_add1_attr_by_NID) +#define GRPC_X509_REQ_add1_attr_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REQ_add1_attr_by_OBJ) +#define GRPC_X509_REQ_add1_attr_by_txt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REQ_add1_attr_by_txt) +#define GRPC_X509_REQ_add_extensions BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REQ_add_extensions) +#define GRPC_X509_REQ_add_extensions_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REQ_add_extensions_nid) +#define GRPC_X509_REQ_check_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REQ_check_private_key) +#define GRPC_X509_REQ_delete_attr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REQ_delete_attr) +#define GRPC_X509_REQ_digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REQ_digest) +#define GRPC_X509_REQ_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REQ_dup) +#define GRPC_X509_REQ_extension_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REQ_extension_nid) +#define GRPC_X509_REQ_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REQ_free) +#define GRPC_X509_REQ_get0_signature BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REQ_get0_signature) +#define GRPC_X509_REQ_get1_email BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REQ_get1_email) +#define GRPC_X509_REQ_get_attr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REQ_get_attr) +#define GRPC_X509_REQ_get_attr_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REQ_get_attr_by_NID) +#define GRPC_X509_REQ_get_attr_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REQ_get_attr_by_OBJ) +#define GRPC_X509_REQ_get_attr_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REQ_get_attr_count) +#define GRPC_X509_REQ_get_extension_nids BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REQ_get_extension_nids) +#define GRPC_X509_REQ_get_extensions BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REQ_get_extensions) +#define GRPC_X509_REQ_get_pubkey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REQ_get_pubkey) +#define GRPC_X509_REQ_get_signature_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REQ_get_signature_nid) +#define GRPC_X509_REQ_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REQ_it) +#define GRPC_X509_REQ_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REQ_new) +#define GRPC_X509_REQ_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REQ_print) +#define GRPC_X509_REQ_print_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REQ_print_ex) +#define GRPC_X509_REQ_print_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REQ_print_fp) +#define GRPC_X509_REQ_set_extension_nids BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REQ_set_extension_nids) +#define GRPC_X509_REQ_set_pubkey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REQ_set_pubkey) +#define GRPC_X509_REQ_set_subject_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REQ_set_subject_name) +#define GRPC_X509_REQ_set_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REQ_set_version) +#define GRPC_X509_REQ_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REQ_sign) +#define GRPC_X509_REQ_sign_ctx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REQ_sign_ctx) +#define GRPC_X509_REQ_to_X509 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REQ_to_X509) +#define GRPC_X509_REQ_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REQ_verify) +#define GRPC_X509_REVOKED_add1_ext_i2d BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REVOKED_add1_ext_i2d) +#define GRPC_X509_REVOKED_add_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REVOKED_add_ext) +#define GRPC_X509_REVOKED_delete_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REVOKED_delete_ext) +#define GRPC_X509_REVOKED_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REVOKED_dup) +#define GRPC_X509_REVOKED_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REVOKED_free) +#define GRPC_X509_REVOKED_get0_revocationDate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REVOKED_get0_revocationDate) +#define GRPC_X509_REVOKED_get0_serialNumber BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REVOKED_get0_serialNumber) +#define GRPC_X509_REVOKED_get_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REVOKED_get_ext) +#define GRPC_X509_REVOKED_get_ext_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REVOKED_get_ext_by_NID) +#define GRPC_X509_REVOKED_get_ext_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REVOKED_get_ext_by_OBJ) +#define GRPC_X509_REVOKED_get_ext_by_critical BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REVOKED_get_ext_by_critical) +#define GRPC_X509_REVOKED_get_ext_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REVOKED_get_ext_count) +#define GRPC_X509_REVOKED_get_ext_d2i BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REVOKED_get_ext_d2i) +#define GRPC_X509_REVOKED_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REVOKED_it) +#define GRPC_X509_REVOKED_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REVOKED_new) +#define GRPC_X509_REVOKED_set_revocationDate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REVOKED_set_revocationDate) +#define GRPC_X509_REVOKED_set_serialNumber BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REVOKED_set_serialNumber) +#define GRPC_X509_SIG_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_SIG_free) +#define GRPC_X509_SIG_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_SIG_it) +#define GRPC_X509_SIG_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_SIG_new) +#define GRPC_X509_STORE_CTX_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_CTX_cleanup) +#define GRPC_X509_STORE_CTX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_CTX_free) +#define GRPC_X509_STORE_CTX_get0_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_CTX_get0_cert) +#define GRPC_X509_STORE_CTX_get0_current_crl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_CTX_get0_current_crl) +#define GRPC_X509_STORE_CTX_get0_current_issuer BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_CTX_get0_current_issuer) +#define GRPC_X509_STORE_CTX_get0_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_CTX_get0_param) +#define GRPC_X509_STORE_CTX_get0_parent_ctx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_CTX_get0_parent_ctx) +#define GRPC_X509_STORE_CTX_get0_policy_tree BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_CTX_get0_policy_tree) +#define GRPC_X509_STORE_CTX_get0_store BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_CTX_get0_store) +#define GRPC_X509_STORE_CTX_get0_untrusted BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_CTX_get0_untrusted) +#define GRPC_X509_STORE_CTX_get1_chain BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_CTX_get1_chain) +#define GRPC_X509_STORE_CTX_get1_issuer BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_CTX_get1_issuer) +#define GRPC_X509_STORE_CTX_get_chain BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_CTX_get_chain) +#define GRPC_X509_STORE_CTX_get_current_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_CTX_get_current_cert) +#define GRPC_X509_STORE_CTX_get_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_CTX_get_error) +#define GRPC_X509_STORE_CTX_get_error_depth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_CTX_get_error_depth) +#define GRPC_X509_STORE_CTX_get_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_CTX_get_ex_data) +#define GRPC_X509_STORE_CTX_get_ex_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_CTX_get_ex_new_index) +#define GRPC_X509_STORE_CTX_get_explicit_policy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_CTX_get_explicit_policy) +#define GRPC_X509_STORE_CTX_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_CTX_init) +#define GRPC_X509_STORE_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_CTX_new) +#define GRPC_X509_STORE_CTX_purpose_inherit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_CTX_purpose_inherit) +#define GRPC_X509_STORE_CTX_set0_crls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_CTX_set0_crls) +#define GRPC_X509_STORE_CTX_set0_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_CTX_set0_param) +#define GRPC_X509_STORE_CTX_set_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_CTX_set_cert) +#define GRPC_X509_STORE_CTX_set_chain BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_CTX_set_chain) +#define GRPC_X509_STORE_CTX_set_default BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_CTX_set_default) +#define GRPC_X509_STORE_CTX_set_depth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_CTX_set_depth) +#define GRPC_X509_STORE_CTX_set_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_CTX_set_error) +#define GRPC_X509_STORE_CTX_set_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_CTX_set_ex_data) +#define GRPC_X509_STORE_CTX_set_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_CTX_set_flags) +#define GRPC_X509_STORE_CTX_set_purpose BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_CTX_set_purpose) +#define GRPC_X509_STORE_CTX_set_time BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_CTX_set_time) +#define GRPC_X509_STORE_CTX_set_trust BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_CTX_set_trust) +#define GRPC_X509_STORE_CTX_set_verify_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_CTX_set_verify_cb) +#define GRPC_X509_STORE_CTX_trusted_stack BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_CTX_trusted_stack) +#define GRPC_X509_STORE_CTX_zero BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_CTX_zero) +#define GRPC_X509_STORE_add_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_add_cert) +#define GRPC_X509_STORE_add_crl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_add_crl) +#define GRPC_X509_STORE_add_lookup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_add_lookup) +#define GRPC_X509_STORE_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_free) +#define GRPC_X509_STORE_get0_objects BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_get0_objects) +#define GRPC_X509_STORE_get0_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_get0_param) +#define GRPC_X509_STORE_get1_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_get1_certs) +#define GRPC_X509_STORE_get1_crls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_get1_crls) +#define GRPC_X509_STORE_get_by_subject BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_get_by_subject) +#define GRPC_X509_STORE_get_cert_crl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_get_cert_crl) +#define GRPC_X509_STORE_get_check_crl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_get_check_crl) +#define GRPC_X509_STORE_get_check_issued BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_get_check_issued) +#define GRPC_X509_STORE_get_check_revocation BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_get_check_revocation) +#define GRPC_X509_STORE_get_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_get_cleanup) +#define GRPC_X509_STORE_get_get_crl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_get_get_crl) +#define GRPC_X509_STORE_get_get_issuer BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_get_get_issuer) +#define GRPC_X509_STORE_get_lookup_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_get_lookup_certs) +#define GRPC_X509_STORE_get_lookup_crls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_get_lookup_crls) +#define GRPC_X509_STORE_get_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_get_verify) +#define GRPC_X509_STORE_get_verify_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_get_verify_cb) +#define GRPC_X509_STORE_load_locations BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_load_locations) +#define GRPC_X509_STORE_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_new) +#define GRPC_X509_STORE_set0_additional_untrusted BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_set0_additional_untrusted) +#define GRPC_X509_STORE_set1_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_set1_param) +#define GRPC_X509_STORE_set_cert_crl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_set_cert_crl) +#define GRPC_X509_STORE_set_check_crl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_set_check_crl) +#define GRPC_X509_STORE_set_check_issued BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_set_check_issued) +#define GRPC_X509_STORE_set_check_revocation BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_set_check_revocation) +#define GRPC_X509_STORE_set_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_set_cleanup) +#define GRPC_X509_STORE_set_default_paths BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_set_default_paths) +#define GRPC_X509_STORE_set_depth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_set_depth) +#define GRPC_X509_STORE_set_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_set_flags) +#define GRPC_X509_STORE_set_get_crl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_set_get_crl) +#define GRPC_X509_STORE_set_get_issuer BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_set_get_issuer) +#define GRPC_X509_STORE_set_lookup_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_set_lookup_certs) +#define GRPC_X509_STORE_set_lookup_crls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_set_lookup_crls) +#define GRPC_X509_STORE_set_purpose BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_set_purpose) +#define GRPC_X509_STORE_set_trust BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_set_trust) +#define GRPC_X509_STORE_set_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_set_verify) +#define GRPC_X509_STORE_set_verify_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_set_verify_cb) +#define GRPC_X509_STORE_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_up_ref) +#define GRPC_X509_TRUST_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_TRUST_add) +#define GRPC_X509_TRUST_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_TRUST_cleanup) +#define GRPC_X509_TRUST_get0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_TRUST_get0) +#define GRPC_X509_TRUST_get0_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_TRUST_get0_name) +#define GRPC_X509_TRUST_get_by_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_TRUST_get_by_id) +#define GRPC_X509_TRUST_get_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_TRUST_get_count) +#define GRPC_X509_TRUST_get_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_TRUST_get_flags) +#define GRPC_X509_TRUST_get_trust BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_TRUST_get_trust) +#define GRPC_X509_TRUST_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_TRUST_set) +#define GRPC_X509_TRUST_set_default BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_TRUST_set_default) +#define GRPC_X509_VAL_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_VAL_free) +#define GRPC_X509_VAL_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_VAL_it) +#define GRPC_X509_VAL_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_VAL_new) +#define GRPC_X509_VERIFY_PARAM_add0_policy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_VERIFY_PARAM_add0_policy) +#define GRPC_X509_VERIFY_PARAM_add0_table BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_VERIFY_PARAM_add0_table) +#define GRPC_X509_VERIFY_PARAM_add1_host BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_VERIFY_PARAM_add1_host) +#define GRPC_X509_VERIFY_PARAM_clear_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_VERIFY_PARAM_clear_flags) +#define GRPC_X509_VERIFY_PARAM_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_VERIFY_PARAM_free) +#define GRPC_X509_VERIFY_PARAM_get0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_VERIFY_PARAM_get0) +#define GRPC_X509_VERIFY_PARAM_get0_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_VERIFY_PARAM_get0_name) +#define GRPC_X509_VERIFY_PARAM_get0_peername BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_VERIFY_PARAM_get0_peername) +#define GRPC_X509_VERIFY_PARAM_get_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_VERIFY_PARAM_get_count) +#define GRPC_X509_VERIFY_PARAM_get_depth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_VERIFY_PARAM_get_depth) +#define GRPC_X509_VERIFY_PARAM_get_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_VERIFY_PARAM_get_flags) +#define GRPC_X509_VERIFY_PARAM_inherit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_VERIFY_PARAM_inherit) +#define GRPC_X509_VERIFY_PARAM_lookup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_VERIFY_PARAM_lookup) +#define GRPC_X509_VERIFY_PARAM_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_VERIFY_PARAM_new) +#define GRPC_X509_VERIFY_PARAM_set1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_VERIFY_PARAM_set1) +#define GRPC_X509_VERIFY_PARAM_set1_email BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_VERIFY_PARAM_set1_email) +#define GRPC_X509_VERIFY_PARAM_set1_host BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_VERIFY_PARAM_set1_host) +#define GRPC_X509_VERIFY_PARAM_set1_ip BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_VERIFY_PARAM_set1_ip) +#define GRPC_X509_VERIFY_PARAM_set1_ip_asc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_VERIFY_PARAM_set1_ip_asc) +#define GRPC_X509_VERIFY_PARAM_set1_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_VERIFY_PARAM_set1_name) +#define GRPC_X509_VERIFY_PARAM_set1_policies BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_VERIFY_PARAM_set1_policies) +#define GRPC_X509_VERIFY_PARAM_set_depth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_VERIFY_PARAM_set_depth) +#define GRPC_X509_VERIFY_PARAM_set_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_VERIFY_PARAM_set_flags) +#define GRPC_X509_VERIFY_PARAM_set_hostflags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_VERIFY_PARAM_set_hostflags) +#define GRPC_X509_VERIFY_PARAM_set_purpose BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_VERIFY_PARAM_set_purpose) +#define GRPC_X509_VERIFY_PARAM_set_time BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_VERIFY_PARAM_set_time) +#define GRPC_X509_VERIFY_PARAM_set_trust BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_VERIFY_PARAM_set_trust) +#define GRPC_X509_VERIFY_PARAM_table_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_VERIFY_PARAM_table_cleanup) +#define GRPC_X509_add1_ext_i2d BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_add1_ext_i2d) +#define GRPC_X509_add1_reject_object BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_add1_reject_object) +#define GRPC_X509_add1_trust_object BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_add1_trust_object) +#define GRPC_X509_add_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_add_ext) +#define GRPC_X509_alias_get0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_alias_get0) +#define GRPC_X509_alias_set1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_alias_set1) +#define GRPC_X509_chain_check_suiteb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_chain_check_suiteb) +#define GRPC_X509_chain_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_chain_up_ref) +#define GRPC_X509_check_akid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_check_akid) +#define GRPC_X509_check_ca BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_check_ca) +#define GRPC_X509_check_email BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_check_email) +#define GRPC_X509_check_host BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_check_host) +#define GRPC_X509_check_ip BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_check_ip) +#define GRPC_X509_check_ip_asc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_check_ip_asc) +#define GRPC_X509_check_issued BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_check_issued) +#define GRPC_X509_check_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_check_private_key) +#define GRPC_X509_check_purpose BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_check_purpose) +#define GRPC_X509_check_trust BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_check_trust) +#define GRPC_X509_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_cmp) +#define GRPC_X509_cmp_current_time BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_cmp_current_time) +#define GRPC_X509_cmp_time BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_cmp_time) +#define GRPC_X509_delete_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_delete_ext) +#define GRPC_X509_digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_digest) +#define GRPC_X509_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_dup) +#define GRPC_X509_email_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_email_free) +#define GRPC_X509_find_by_issuer_and_serial BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_find_by_issuer_and_serial) +#define GRPC_X509_find_by_subject BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_find_by_subject) +#define GRPC_X509_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_free) +#define GRPC_X509_get0_extensions BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_get0_extensions) +#define GRPC_X509_get0_notAfter BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_get0_notAfter) +#define GRPC_X509_get0_notBefore BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_get0_notBefore) +#define GRPC_X509_get0_pubkey_bitstr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_get0_pubkey_bitstr) +#define GRPC_X509_get0_signature BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_get0_signature) +#define GRPC_X509_get0_tbs_sigalg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_get0_tbs_sigalg) +#define GRPC_X509_get1_email BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_get1_email) +#define GRPC_X509_get1_ocsp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_get1_ocsp) +#define GRPC_X509_get_default_cert_area BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_get_default_cert_area) +#define GRPC_X509_get_default_cert_dir BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_get_default_cert_dir) +#define GRPC_X509_get_default_cert_dir_env BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_get_default_cert_dir_env) +#define GRPC_X509_get_default_cert_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_get_default_cert_file) +#define GRPC_X509_get_default_cert_file_env BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_get_default_cert_file_env) +#define GRPC_X509_get_default_private_dir BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_get_default_private_dir) +#define GRPC_X509_get_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_get_ex_data) +#define GRPC_X509_get_ex_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_get_ex_new_index) +#define GRPC_X509_get_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_get_ext) +#define GRPC_X509_get_ext_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_get_ext_by_NID) +#define GRPC_X509_get_ext_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_get_ext_by_OBJ) +#define GRPC_X509_get_ext_by_critical BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_get_ext_by_critical) +#define GRPC_X509_get_ext_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_get_ext_count) +#define GRPC_X509_get_ext_d2i BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_get_ext_d2i) +#define GRPC_X509_get_extended_key_usage BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_get_extended_key_usage) +#define GRPC_X509_get_extension_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_get_extension_flags) +#define GRPC_X509_get_issuer_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_get_issuer_name) +#define GRPC_X509_get_key_usage BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_get_key_usage) +#define GRPC_X509_get_pubkey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_get_pubkey) +#define GRPC_X509_get_serialNumber BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_get_serialNumber) +#define GRPC_X509_get_signature_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_get_signature_nid) +#define GRPC_X509_get_subject_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_get_subject_name) +#define GRPC_X509_gmtime_adj BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_gmtime_adj) +#define GRPC_X509_issuer_and_serial_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_issuer_and_serial_cmp) +#define GRPC_X509_issuer_and_serial_hash BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_issuer_and_serial_hash) +#define GRPC_X509_issuer_name_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_issuer_name_cmp) +#define GRPC_X509_issuer_name_hash BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_issuer_name_hash) +#define GRPC_X509_issuer_name_hash_old BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_issuer_name_hash_old) +#define GRPC_X509_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_it) +#define GRPC_X509_keyid_get0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_keyid_get0) +#define GRPC_X509_keyid_set1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_keyid_set1) +#define GRPC_X509_load_cert_crl_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_load_cert_crl_file) +#define GRPC_X509_load_cert_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_load_cert_file) +#define GRPC_X509_load_crl_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_load_crl_file) +#define GRPC_X509_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_new) +#define GRPC_X509_ocspid_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_ocspid_print) +#define GRPC_X509_parse_from_buffer BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_parse_from_buffer) +#define GRPC_X509_policy_check BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_policy_check) +#define GRPC_X509_policy_level_get0_node BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_policy_level_get0_node) +#define GRPC_X509_policy_level_node_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_policy_level_node_count) +#define GRPC_X509_policy_node_get0_parent BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_policy_node_get0_parent) +#define GRPC_X509_policy_node_get0_policy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_policy_node_get0_policy) +#define GRPC_X509_policy_node_get0_qualifiers BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_policy_node_get0_qualifiers) +#define GRPC_X509_policy_tree_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_policy_tree_free) +#define GRPC_X509_policy_tree_get0_level BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_policy_tree_get0_level) +#define GRPC_X509_policy_tree_get0_policies BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_policy_tree_get0_policies) +#define GRPC_X509_policy_tree_get0_user_policies BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_policy_tree_get0_user_policies) +#define GRPC_X509_policy_tree_level_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_policy_tree_level_count) +#define GRPC_X509_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_print) +#define GRPC_X509_print_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_print_ex) +#define GRPC_X509_print_ex_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_print_ex_fp) +#define GRPC_X509_print_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_print_fp) +#define GRPC_X509_pubkey_digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_pubkey_digest) +#define GRPC_X509_reject_clear BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_reject_clear) +#define GRPC_X509_set_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_set_ex_data) +#define GRPC_X509_set_issuer_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_set_issuer_name) +#define GRPC_X509_set_notAfter BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_set_notAfter) +#define GRPC_X509_set_notBefore BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_set_notBefore) +#define GRPC_X509_set_pubkey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_set_pubkey) +#define GRPC_X509_set_serialNumber BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_set_serialNumber) +#define GRPC_X509_set_subject_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_set_subject_name) +#define GRPC_X509_set_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_set_version) +#define GRPC_X509_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_sign) +#define GRPC_X509_sign_ctx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_sign_ctx) +#define GRPC_X509_signature_dump BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_signature_dump) +#define GRPC_X509_signature_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_signature_print) +#define GRPC_X509_subject_name_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_subject_name_cmp) +#define GRPC_X509_subject_name_hash BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_subject_name_hash) +#define GRPC_X509_subject_name_hash_old BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_subject_name_hash_old) +#define GRPC_X509_supported_extension BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_supported_extension) +#define GRPC_X509_time_adj BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_time_adj) +#define GRPC_X509_time_adj_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_time_adj_ex) +#define GRPC_X509_to_X509_REQ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_to_X509_REQ) +#define GRPC_X509_trust_clear BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_trust_clear) +#define GRPC_X509_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_up_ref) +#define GRPC_X509_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_verify) +#define GRPC_X509_verify_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_verify_cert) +#define GRPC_X509_verify_cert_error_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_verify_cert_error_string) +#define GRPC_X509at_add1_attr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509at_add1_attr) +#define GRPC_X509at_add1_attr_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509at_add1_attr_by_NID) +#define GRPC_X509at_add1_attr_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509at_add1_attr_by_OBJ) +#define GRPC_X509at_add1_attr_by_txt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509at_add1_attr_by_txt) +#define GRPC_X509at_delete_attr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509at_delete_attr) +#define GRPC_X509at_get0_data_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509at_get0_data_by_OBJ) +#define GRPC_X509at_get_attr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509at_get_attr) +#define GRPC_X509at_get_attr_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509at_get_attr_by_NID) +#define GRPC_X509at_get_attr_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509at_get_attr_by_OBJ) +#define GRPC_X509at_get_attr_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509at_get_attr_count) +#define GRPC_X509v3_add_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509v3_add_ext) +#define GRPC_X509v3_delete_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509v3_delete_ext) +#define GRPC_X509v3_get_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509v3_get_ext) +#define GRPC_X509v3_get_ext_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509v3_get_ext_by_NID) +#define GRPC_X509v3_get_ext_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509v3_get_ext_by_OBJ) +#define GRPC_X509v3_get_ext_by_critical BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509v3_get_ext_by_critical) +#define GRPC_X509v3_get_ext_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509v3_get_ext_count) +#define GRPC_a2i_GENERAL_NAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_a2i_GENERAL_NAME) +#define GRPC_a2i_IPADDRESS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_a2i_IPADDRESS) +#define GRPC_a2i_IPADDRESS_NC BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_a2i_IPADDRESS_NC) +#define GRPC_a2i_ipadd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_a2i_ipadd) +#define GRPC_abi_test_bad_unwind_temporary BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_bad_unwind_temporary) +#define GRPC_abi_test_bad_unwind_wrong_register BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_bad_unwind_wrong_register) +#define GRPC_abi_test_clobber_r10 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_clobber_r10) +#define GRPC_abi_test_clobber_r11 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_clobber_r11) +#define GRPC_abi_test_clobber_r12 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_clobber_r12) +#define GRPC_abi_test_clobber_r13 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_clobber_r13) +#define GRPC_abi_test_clobber_r14 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_clobber_r14) +#define GRPC_abi_test_clobber_r15 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_clobber_r15) +#define GRPC_abi_test_clobber_r8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_clobber_r8) +#define GRPC_abi_test_clobber_r9 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_clobber_r9) +#define GRPC_abi_test_clobber_rax BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_clobber_rax) +#define GRPC_abi_test_clobber_rbp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_clobber_rbp) +#define GRPC_abi_test_clobber_rbx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_clobber_rbx) +#define GRPC_abi_test_clobber_rcx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_clobber_rcx) +#define GRPC_abi_test_clobber_rdi BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_clobber_rdi) +#define GRPC_abi_test_clobber_rdx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_clobber_rdx) +#define GRPC_abi_test_clobber_rsi BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_clobber_rsi) +#define GRPC_abi_test_clobber_xmm0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_clobber_xmm0) +#define GRPC_abi_test_clobber_xmm1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_clobber_xmm1) +#define GRPC_abi_test_clobber_xmm10 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_clobber_xmm10) +#define GRPC_abi_test_clobber_xmm11 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_clobber_xmm11) +#define GRPC_abi_test_clobber_xmm12 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_clobber_xmm12) +#define GRPC_abi_test_clobber_xmm13 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_clobber_xmm13) +#define GRPC_abi_test_clobber_xmm14 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_clobber_xmm14) +#define GRPC_abi_test_clobber_xmm15 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_clobber_xmm15) +#define GRPC_abi_test_clobber_xmm2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_clobber_xmm2) +#define GRPC_abi_test_clobber_xmm3 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_clobber_xmm3) +#define GRPC_abi_test_clobber_xmm4 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_clobber_xmm4) +#define GRPC_abi_test_clobber_xmm5 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_clobber_xmm5) +#define GRPC_abi_test_clobber_xmm6 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_clobber_xmm6) +#define GRPC_abi_test_clobber_xmm7 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_clobber_xmm7) +#define GRPC_abi_test_clobber_xmm8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_clobber_xmm8) +#define GRPC_abi_test_clobber_xmm9 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_clobber_xmm9) +#define GRPC_abi_test_get_and_clear_direction_flag BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_get_and_clear_direction_flag) +#define GRPC_abi_test_set_direction_flag BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_set_direction_flag) +#define GRPC_abi_test_trampoline BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_trampoline) +#define GRPC_abi_test_unwind_return BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_unwind_return) +#define GRPC_abi_test_unwind_start BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_unwind_start) +#define GRPC_abi_test_unwind_stop BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_unwind_stop) +#define GRPC_aes128gcmsiv_aes_ks BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_aes128gcmsiv_aes_ks) +#define GRPC_aes128gcmsiv_aes_ks_enc_x1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_aes128gcmsiv_aes_ks_enc_x1) +#define GRPC_aes128gcmsiv_dec BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_aes128gcmsiv_dec) +#define GRPC_aes128gcmsiv_ecb_enc_block BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_aes128gcmsiv_ecb_enc_block) +#define GRPC_aes128gcmsiv_enc_msg_x4 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_aes128gcmsiv_enc_msg_x4) +#define GRPC_aes128gcmsiv_enc_msg_x8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_aes128gcmsiv_enc_msg_x8) +#define GRPC_aes128gcmsiv_kdf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_aes128gcmsiv_kdf) +#define GRPC_aes256gcmsiv_aes_ks BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_aes256gcmsiv_aes_ks) +#define GRPC_aes256gcmsiv_aes_ks_enc_x1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_aes256gcmsiv_aes_ks_enc_x1) +#define GRPC_aes256gcmsiv_dec BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_aes256gcmsiv_dec) +#define GRPC_aes256gcmsiv_ecb_enc_block BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_aes256gcmsiv_ecb_enc_block) +#define GRPC_aes256gcmsiv_enc_msg_x4 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_aes256gcmsiv_enc_msg_x4) +#define GRPC_aes256gcmsiv_enc_msg_x8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_aes256gcmsiv_enc_msg_x8) +#define GRPC_aes256gcmsiv_kdf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_aes256gcmsiv_kdf) +#define GRPC_aes_ctr_set_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_aes_ctr_set_key) +#define GRPC_aes_hw_cbc_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_aes_hw_cbc_encrypt) +#define GRPC_aes_hw_ctr32_encrypt_blocks BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_aes_hw_ctr32_encrypt_blocks) +#define GRPC_aes_hw_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_aes_hw_decrypt) +#define GRPC_aes_hw_ecb_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_aes_hw_ecb_encrypt) +#define GRPC_aes_hw_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_aes_hw_encrypt) +#define GRPC_aes_hw_set_decrypt_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_aes_hw_set_decrypt_key) +#define GRPC_aes_hw_set_encrypt_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_aes_hw_set_encrypt_key) +#define GRPC_aes_nohw_cbc_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_aes_nohw_cbc_encrypt) +#define GRPC_aes_nohw_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_aes_nohw_decrypt) +#define GRPC_aes_nohw_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_aes_nohw_encrypt) +#define GRPC_aes_nohw_set_decrypt_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_aes_nohw_set_decrypt_key) +#define GRPC_aes_nohw_set_encrypt_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_aes_nohw_set_encrypt_key) +#define GRPC_aesgcmsiv_htable6_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_aesgcmsiv_htable6_init) +#define GRPC_aesgcmsiv_htable_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_aesgcmsiv_htable_init) +#define GRPC_aesgcmsiv_htable_polyval BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_aesgcmsiv_htable_polyval) +#define GRPC_aesgcmsiv_polyval_horner BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_aesgcmsiv_polyval_horner) +#define GRPC_aesni_gcm_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_aesni_gcm_decrypt) +#define GRPC_aesni_gcm_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_aesni_gcm_encrypt) +#define GRPC_asn1_do_adb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_asn1_do_adb) +#define GRPC_asn1_enc_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_asn1_enc_free) +#define GRPC_asn1_enc_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_asn1_enc_init) +#define GRPC_asn1_enc_restore BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_asn1_enc_restore) +#define GRPC_asn1_enc_save BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_asn1_enc_save) +#define GRPC_asn1_ex_c2i BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_asn1_ex_c2i) +#define GRPC_asn1_ex_i2c BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_asn1_ex_i2c) +#define GRPC_asn1_generalizedtime_to_tm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_asn1_generalizedtime_to_tm) +#define GRPC_asn1_get_choice_selector BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_asn1_get_choice_selector) +#define GRPC_asn1_get_field_ptr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_asn1_get_field_ptr) +#define GRPC_asn1_item_combine_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_asn1_item_combine_free) +#define GRPC_asn1_refcount_dec_and_test_zero BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_asn1_refcount_dec_and_test_zero) +#define GRPC_asn1_refcount_set_one BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_asn1_refcount_set_one) +#define GRPC_asn1_set_choice_selector BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_asn1_set_choice_selector) +#define GRPC_asn1_utctime_to_tm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_asn1_utctime_to_tm) +#define GRPC_beeu_mod_inverse_vartime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_beeu_mod_inverse_vartime) +#define GRPC_bio_clear_socket_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bio_clear_socket_error) +#define GRPC_bio_fd_should_retry BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bio_fd_should_retry) +#define GRPC_bio_ip_and_port_to_socket_and_addr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bio_ip_and_port_to_socket_and_addr) +#define GRPC_bio_sock_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bio_sock_error) +#define GRPC_bio_socket_nbio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bio_socket_nbio) +#define GRPC_bn_abs_sub_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_abs_sub_consttime) +#define GRPC_bn_add_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_add_words) +#define GRPC_bn_copy_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_copy_words) +#define GRPC_bn_div_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_div_consttime) +#define GRPC_bn_expand BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_expand) +#define GRPC_bn_fits_in_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_fits_in_words) +#define GRPC_bn_from_montgomery BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_from_montgomery) +#define GRPC_bn_from_montgomery_small BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_from_montgomery_small) +#define GRPC_bn_gather5 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_gather5) +#define GRPC_bn_in_range_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_in_range_words) +#define GRPC_bn_is_bit_set_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_is_bit_set_words) +#define GRPC_bn_is_relatively_prime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_is_relatively_prime) +#define GRPC_bn_jacobi BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_jacobi) +#define GRPC_bn_lcm_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_lcm_consttime) +#define GRPC_bn_less_than_montgomery_R BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_less_than_montgomery_R) +#define GRPC_bn_less_than_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_less_than_words) +#define GRPC_bn_miller_rabin_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_miller_rabin_init) +#define GRPC_bn_miller_rabin_iteration BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_miller_rabin_iteration) +#define GRPC_bn_minimal_width BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_minimal_width) +#define GRPC_bn_mod_add_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_mod_add_consttime) +#define GRPC_bn_mod_add_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_mod_add_words) +#define GRPC_bn_mod_exp_base_2_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_mod_exp_base_2_consttime) +#define GRPC_bn_mod_exp_mont_small BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_mod_exp_mont_small) +#define GRPC_bn_mod_inverse_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_mod_inverse_consttime) +#define GRPC_bn_mod_inverse_prime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_mod_inverse_prime) +#define GRPC_bn_mod_inverse_prime_mont_small BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_mod_inverse_prime_mont_small) +#define GRPC_bn_mod_inverse_secret_prime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_mod_inverse_secret_prime) +#define GRPC_bn_mod_lshift1_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_mod_lshift1_consttime) +#define GRPC_bn_mod_lshift_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_mod_lshift_consttime) +#define GRPC_bn_mod_mul_montgomery_small BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_mod_mul_montgomery_small) +#define GRPC_bn_mod_sub_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_mod_sub_consttime) +#define GRPC_bn_mod_sub_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_mod_sub_words) +#define GRPC_bn_mod_u16_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_mod_u16_consttime) +#define GRPC_bn_mont_n0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_mont_n0) +#define GRPC_bn_mul_add_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_mul_add_words) +#define GRPC_bn_mul_comba4 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_mul_comba4) +#define GRPC_bn_mul_comba8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_mul_comba8) +#define GRPC_bn_mul_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_mul_consttime) +#define GRPC_bn_mul_mont BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_mul_mont) +#define GRPC_bn_mul_mont_gather5 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_mul_mont_gather5) +#define GRPC_bn_mul_small BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_mul_small) +#define GRPC_bn_mul_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_mul_words) +#define GRPC_bn_odd_number_is_obviously_composite BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_odd_number_is_obviously_composite) +#define GRPC_bn_one_to_montgomery BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_one_to_montgomery) +#define GRPC_bn_power5 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_power5) +#define GRPC_bn_rand_range_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_rand_range_words) +#define GRPC_bn_rand_secret_range BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_rand_secret_range) +#define GRPC_bn_reduce_once BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_reduce_once) +#define GRPC_bn_reduce_once_in_place BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_reduce_once_in_place) +#define GRPC_bn_resize_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_resize_words) +#define GRPC_bn_rshift1_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_rshift1_words) +#define GRPC_bn_rshift_secret_shift BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_rshift_secret_shift) +#define GRPC_bn_rshift_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_rshift_words) +#define GRPC_bn_scatter5 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_scatter5) +#define GRPC_bn_select_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_select_words) +#define GRPC_bn_set_minimal_width BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_set_minimal_width) +#define GRPC_bn_set_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_set_words) +#define GRPC_bn_sqr8x_internal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_sqr8x_internal) +#define GRPC_bn_sqr_comba4 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_sqr_comba4) +#define GRPC_bn_sqr_comba8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_sqr_comba8) +#define GRPC_bn_sqr_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_sqr_consttime) +#define GRPC_bn_sqr_small BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_sqr_small) +#define GRPC_bn_sqr_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_sqr_words) +#define GRPC_bn_sqrx8x_internal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_sqrx8x_internal) +#define GRPC_bn_sub_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_sub_words) +#define GRPC_bn_to_montgomery_small BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_to_montgomery_small) +#define GRPC_bn_uadd_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_uadd_consttime) +#define GRPC_bn_usub_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_usub_consttime) +#define GRPC_bn_wexpand BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_wexpand) +#define GRPC_boringssl_fips_self_test BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_boringssl_fips_self_test) +#define GRPC_c2i_ASN1_BIT_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_c2i_ASN1_BIT_STRING) +#define GRPC_c2i_ASN1_INTEGER BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_c2i_ASN1_INTEGER) +#define GRPC_c2i_ASN1_OBJECT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_c2i_ASN1_OBJECT) +#define GRPC_cbb_add_latin1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_cbb_add_latin1) +#define GRPC_cbb_add_ucs2_be BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_cbb_add_ucs2_be) +#define GRPC_cbb_add_utf32_be BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_cbb_add_utf32_be) +#define GRPC_cbb_add_utf8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_cbb_add_utf8) +#define GRPC_cbb_get_utf8_len BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_cbb_get_utf8_len) +#define GRPC_cbs_get_latin1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_cbs_get_latin1) +#define GRPC_cbs_get_ucs2_be BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_cbs_get_ucs2_be) +#define GRPC_cbs_get_utf32_be BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_cbs_get_utf32_be) +#define GRPC_cbs_get_utf8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_cbs_get_utf8) +#define GRPC_chacha20_poly1305_open BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_chacha20_poly1305_open) +#define GRPC_chacha20_poly1305_seal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_chacha20_poly1305_seal) +#define GRPC_crypto_gcm_clmul_enabled BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_crypto_gcm_clmul_enabled) +#define GRPC_d2i_ACCESS_DESCRIPTION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_ACCESS_DESCRIPTION) +#define GRPC_d2i_ASN1_BIT_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_ASN1_BIT_STRING) +#define GRPC_d2i_ASN1_BMPSTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_ASN1_BMPSTRING) +#define GRPC_d2i_ASN1_BOOLEAN BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_ASN1_BOOLEAN) +#define GRPC_d2i_ASN1_ENUMERATED BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_ASN1_ENUMERATED) +#define GRPC_d2i_ASN1_GENERALIZEDTIME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_ASN1_GENERALIZEDTIME) +#define GRPC_d2i_ASN1_GENERALSTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_ASN1_GENERALSTRING) +#define GRPC_d2i_ASN1_IA5STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_ASN1_IA5STRING) +#define GRPC_d2i_ASN1_INTEGER BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_ASN1_INTEGER) +#define GRPC_d2i_ASN1_NULL BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_ASN1_NULL) +#define GRPC_d2i_ASN1_OBJECT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_ASN1_OBJECT) +#define GRPC_d2i_ASN1_OCTET_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_ASN1_OCTET_STRING) +#define GRPC_d2i_ASN1_PRINTABLE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_ASN1_PRINTABLE) +#define GRPC_d2i_ASN1_PRINTABLESTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_ASN1_PRINTABLESTRING) +#define GRPC_d2i_ASN1_SEQUENCE_ANY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_ASN1_SEQUENCE_ANY) +#define GRPC_d2i_ASN1_SET_ANY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_ASN1_SET_ANY) +#define GRPC_d2i_ASN1_T61STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_ASN1_T61STRING) +#define GRPC_d2i_ASN1_TIME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_ASN1_TIME) +#define GRPC_d2i_ASN1_TYPE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_ASN1_TYPE) +#define GRPC_d2i_ASN1_UNIVERSALSTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_ASN1_UNIVERSALSTRING) +#define GRPC_d2i_ASN1_UTCTIME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_ASN1_UTCTIME) +#define GRPC_d2i_ASN1_UTF8STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_ASN1_UTF8STRING) +#define GRPC_d2i_ASN1_VISIBLESTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_ASN1_VISIBLESTRING) +#define GRPC_d2i_AUTHORITY_INFO_ACCESS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_AUTHORITY_INFO_ACCESS) +#define GRPC_d2i_AUTHORITY_KEYID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_AUTHORITY_KEYID) +#define GRPC_d2i_AutoPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_AutoPrivateKey) +#define GRPC_d2i_BASIC_CONSTRAINTS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_BASIC_CONSTRAINTS) +#define GRPC_d2i_CERTIFICATEPOLICIES BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_CERTIFICATEPOLICIES) +#define GRPC_d2i_CRL_DIST_POINTS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_CRL_DIST_POINTS) +#define GRPC_d2i_DHparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_DHparams) +#define GRPC_d2i_DHparams_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_DHparams_bio) +#define GRPC_d2i_DIRECTORYSTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_DIRECTORYSTRING) +#define GRPC_d2i_DISPLAYTEXT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_DISPLAYTEXT) +#define GRPC_d2i_DIST_POINT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_DIST_POINT) +#define GRPC_d2i_DIST_POINT_NAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_DIST_POINT_NAME) +#define GRPC_d2i_DSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_DSAPrivateKey) +#define GRPC_d2i_DSAPrivateKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_DSAPrivateKey_bio) +#define GRPC_d2i_DSAPrivateKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_DSAPrivateKey_fp) +#define GRPC_d2i_DSAPublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_DSAPublicKey) +#define GRPC_d2i_DSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_DSA_PUBKEY) +#define GRPC_d2i_DSA_PUBKEY_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_DSA_PUBKEY_bio) +#define GRPC_d2i_DSA_PUBKEY_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_DSA_PUBKEY_fp) +#define GRPC_d2i_DSA_SIG BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_DSA_SIG) +#define GRPC_d2i_DSAparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_DSAparams) +#define GRPC_d2i_ECDSA_SIG BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_ECDSA_SIG) +#define GRPC_d2i_ECParameters BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_ECParameters) +#define GRPC_d2i_ECPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_ECPrivateKey) +#define GRPC_d2i_ECPrivateKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_ECPrivateKey_bio) +#define GRPC_d2i_ECPrivateKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_ECPrivateKey_fp) +#define GRPC_d2i_EC_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_EC_PUBKEY) +#define GRPC_d2i_EC_PUBKEY_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_EC_PUBKEY_bio) +#define GRPC_d2i_EC_PUBKEY_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_EC_PUBKEY_fp) +#define GRPC_d2i_EDIPARTYNAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_EDIPARTYNAME) +#define GRPC_d2i_EXTENDED_KEY_USAGE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_EXTENDED_KEY_USAGE) +#define GRPC_d2i_GENERAL_NAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_GENERAL_NAME) +#define GRPC_d2i_GENERAL_NAMES BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_GENERAL_NAMES) +#define GRPC_d2i_ISSUING_DIST_POINT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_ISSUING_DIST_POINT) +#define GRPC_d2i_NETSCAPE_SPKAC BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_NETSCAPE_SPKAC) +#define GRPC_d2i_NETSCAPE_SPKI BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_NETSCAPE_SPKI) +#define GRPC_d2i_NOTICEREF BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_NOTICEREF) +#define GRPC_d2i_OTHERNAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_OTHERNAME) +#define GRPC_d2i_PKCS12 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_PKCS12) +#define GRPC_d2i_PKCS12_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_PKCS12_bio) +#define GRPC_d2i_PKCS12_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_PKCS12_fp) +#define GRPC_d2i_PKCS7 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_PKCS7) +#define GRPC_d2i_PKCS7_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_PKCS7_bio) +#define GRPC_d2i_PKCS8PrivateKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_PKCS8PrivateKey_bio) +#define GRPC_d2i_PKCS8PrivateKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_PKCS8PrivateKey_fp) +#define GRPC_d2i_PKCS8_PRIV_KEY_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_PKCS8_PRIV_KEY_INFO) +#define GRPC_d2i_PKCS8_PRIV_KEY_INFO_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_PKCS8_PRIV_KEY_INFO_bio) +#define GRPC_d2i_PKCS8_PRIV_KEY_INFO_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_PKCS8_PRIV_KEY_INFO_fp) +#define GRPC_d2i_PKCS8_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_PKCS8_bio) +#define GRPC_d2i_PKCS8_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_PKCS8_fp) +#define GRPC_d2i_PKEY_USAGE_PERIOD BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_PKEY_USAGE_PERIOD) +#define GRPC_d2i_POLICYINFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_POLICYINFO) +#define GRPC_d2i_POLICYQUALINFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_POLICYQUALINFO) +#define GRPC_d2i_PROXY_CERT_INFO_EXTENSION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_PROXY_CERT_INFO_EXTENSION) +#define GRPC_d2i_PROXY_POLICY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_PROXY_POLICY) +#define GRPC_d2i_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_PUBKEY) +#define GRPC_d2i_PUBKEY_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_PUBKEY_bio) +#define GRPC_d2i_PUBKEY_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_PUBKEY_fp) +#define GRPC_d2i_PrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_PrivateKey) +#define GRPC_d2i_PrivateKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_PrivateKey_bio) +#define GRPC_d2i_PrivateKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_PrivateKey_fp) +#define GRPC_d2i_PublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_PublicKey) +#define GRPC_d2i_RSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_RSAPrivateKey) +#define GRPC_d2i_RSAPrivateKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_RSAPrivateKey_bio) +#define GRPC_d2i_RSAPrivateKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_RSAPrivateKey_fp) +#define GRPC_d2i_RSAPublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_RSAPublicKey) +#define GRPC_d2i_RSAPublicKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_RSAPublicKey_bio) +#define GRPC_d2i_RSAPublicKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_RSAPublicKey_fp) +#define GRPC_d2i_RSA_PSS_PARAMS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_RSA_PSS_PARAMS) +#define GRPC_d2i_RSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_RSA_PUBKEY) +#define GRPC_d2i_RSA_PUBKEY_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_RSA_PUBKEY_bio) +#define GRPC_d2i_RSA_PUBKEY_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_RSA_PUBKEY_fp) +#define GRPC_d2i_SXNET BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_SXNET) +#define GRPC_d2i_SXNETID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_SXNETID) +#define GRPC_d2i_USERNOTICE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_USERNOTICE) +#define GRPC_d2i_X509 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_X509) +#define GRPC_d2i_X509_ALGOR BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_X509_ALGOR) +#define GRPC_d2i_X509_ALGORS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_X509_ALGORS) +#define GRPC_d2i_X509_ATTRIBUTE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_X509_ATTRIBUTE) +#define GRPC_d2i_X509_AUX BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_X509_AUX) +#define GRPC_d2i_X509_CERT_AUX BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_X509_CERT_AUX) +#define GRPC_d2i_X509_CINF BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_X509_CINF) +#define GRPC_d2i_X509_CRL BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_X509_CRL) +#define GRPC_d2i_X509_CRL_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_X509_CRL_INFO) +#define GRPC_d2i_X509_CRL_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_X509_CRL_bio) +#define GRPC_d2i_X509_CRL_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_X509_CRL_fp) +#define GRPC_d2i_X509_EXTENSION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_X509_EXTENSION) +#define GRPC_d2i_X509_EXTENSIONS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_X509_EXTENSIONS) +#define GRPC_d2i_X509_NAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_X509_NAME) +#define GRPC_d2i_X509_NAME_ENTRY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_X509_NAME_ENTRY) +#define GRPC_d2i_X509_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_X509_PUBKEY) +#define GRPC_d2i_X509_REQ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_X509_REQ) +#define GRPC_d2i_X509_REQ_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_X509_REQ_INFO) +#define GRPC_d2i_X509_REQ_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_X509_REQ_bio) +#define GRPC_d2i_X509_REQ_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_X509_REQ_fp) +#define GRPC_d2i_X509_REVOKED BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_X509_REVOKED) +#define GRPC_d2i_X509_SIG BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_X509_SIG) +#define GRPC_d2i_X509_VAL BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_X509_VAL) +#define GRPC_d2i_X509_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_X509_bio) +#define GRPC_d2i_X509_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_X509_fp) +#define GRPC_dsa_asn1_meth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_dsa_asn1_meth) +#define GRPC_ec_GFp_mont_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_GFp_mont_add) +#define GRPC_ec_GFp_mont_bignum_to_felem BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_GFp_mont_bignum_to_felem) +#define GRPC_ec_GFp_mont_dbl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_GFp_mont_dbl) +#define GRPC_ec_GFp_mont_felem_mul BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_GFp_mont_felem_mul) +#define GRPC_ec_GFp_mont_felem_sqr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_GFp_mont_felem_sqr) +#define GRPC_ec_GFp_mont_felem_to_bignum BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_GFp_mont_felem_to_bignum) +#define GRPC_ec_GFp_mont_group_finish BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_GFp_mont_group_finish) +#define GRPC_ec_GFp_mont_group_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_GFp_mont_group_init) +#define GRPC_ec_GFp_mont_group_set_curve BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_GFp_mont_group_set_curve) +#define GRPC_ec_GFp_mont_mul BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_GFp_mont_mul) +#define GRPC_ec_GFp_mont_mul_base BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_GFp_mont_mul_base) +#define GRPC_ec_GFp_mont_mul_public BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_GFp_mont_mul_public) +#define GRPC_ec_GFp_nistp_recode_scalar_bits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_GFp_nistp_recode_scalar_bits) +#define GRPC_ec_GFp_simple_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_GFp_simple_cmp) +#define GRPC_ec_GFp_simple_cmp_x_coordinate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_GFp_simple_cmp_x_coordinate) +#define GRPC_ec_GFp_simple_group_finish BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_GFp_simple_group_finish) +#define GRPC_ec_GFp_simple_group_get_curve BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_GFp_simple_group_get_curve) +#define GRPC_ec_GFp_simple_group_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_GFp_simple_group_init) +#define GRPC_ec_GFp_simple_group_set_curve BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_GFp_simple_group_set_curve) +#define GRPC_ec_GFp_simple_invert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_GFp_simple_invert) +#define GRPC_ec_GFp_simple_is_at_infinity BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_GFp_simple_is_at_infinity) +#define GRPC_ec_GFp_simple_is_on_curve BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_GFp_simple_is_on_curve) +#define GRPC_ec_GFp_simple_mont_inv_mod_ord_vartime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_GFp_simple_mont_inv_mod_ord_vartime) +#define GRPC_ec_GFp_simple_point_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_GFp_simple_point_copy) +#define GRPC_ec_GFp_simple_point_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_GFp_simple_point_init) +#define GRPC_ec_GFp_simple_point_set_affine_coordinates BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_GFp_simple_point_set_affine_coordinates) +#define GRPC_ec_GFp_simple_point_set_to_infinity BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_GFp_simple_point_set_to_infinity) +#define GRPC_ec_asn1_meth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_asn1_meth) +#define GRPC_ec_bignum_to_felem BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_bignum_to_felem) +#define GRPC_ec_bignum_to_scalar BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_bignum_to_scalar) +#define GRPC_ec_cmp_x_coordinate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_cmp_x_coordinate) +#define GRPC_ec_compute_wNAF BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_compute_wNAF) +#define GRPC_ec_felem_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_felem_add) +#define GRPC_ec_felem_equal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_felem_equal) +#define GRPC_ec_felem_neg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_felem_neg) +#define GRPC_ec_felem_non_zero_mask BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_felem_non_zero_mask) +#define GRPC_ec_felem_select BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_felem_select) +#define GRPC_ec_felem_sub BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_felem_sub) +#define GRPC_ec_felem_to_bignum BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_felem_to_bignum) +#define GRPC_ec_get_x_coordinate_as_scalar BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_get_x_coordinate_as_scalar) +#define GRPC_ec_group_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_group_new) +#define GRPC_ec_pkey_meth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_pkey_meth) +#define GRPC_ec_point_get_affine_coordinate_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_point_get_affine_coordinate_bytes) +#define GRPC_ec_point_mul_scalar BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_point_mul_scalar) +#define GRPC_ec_point_mul_scalar_base BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_point_mul_scalar_base) +#define GRPC_ec_point_mul_scalar_public BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_point_mul_scalar_public) +#define GRPC_ec_random_nonzero_scalar BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_random_nonzero_scalar) +#define GRPC_ec_scalar_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_scalar_add) +#define GRPC_ec_scalar_equal_vartime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_scalar_equal_vartime) +#define GRPC_ec_scalar_from_montgomery BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_scalar_from_montgomery) +#define GRPC_ec_scalar_inv_montgomery BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_scalar_inv_montgomery) +#define GRPC_ec_scalar_inv_montgomery_vartime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_scalar_inv_montgomery_vartime) +#define GRPC_ec_scalar_is_zero BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_scalar_is_zero) +#define GRPC_ec_scalar_mul_montgomery BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_scalar_mul_montgomery) +#define GRPC_ec_scalar_to_montgomery BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_scalar_to_montgomery) +#define GRPC_ec_simple_scalar_inv_montgomery BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_simple_scalar_inv_montgomery) +#define GRPC_ecp_nistz256_avx2_select_w7 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ecp_nistz256_avx2_select_w7) +#define GRPC_ecp_nistz256_mul_mont BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ecp_nistz256_mul_mont) +#define GRPC_ecp_nistz256_neg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ecp_nistz256_neg) +#define GRPC_ecp_nistz256_ord_mul_mont BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ecp_nistz256_ord_mul_mont) +#define GRPC_ecp_nistz256_ord_sqr_mont BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ecp_nistz256_ord_sqr_mont) +#define GRPC_ecp_nistz256_point_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ecp_nistz256_point_add) +#define GRPC_ecp_nistz256_point_add_affine BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ecp_nistz256_point_add_affine) +#define GRPC_ecp_nistz256_point_double BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ecp_nistz256_point_double) +#define GRPC_ecp_nistz256_select_w5 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ecp_nistz256_select_w5) +#define GRPC_ecp_nistz256_select_w7 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ecp_nistz256_select_w7) +#define GRPC_ecp_nistz256_sqr_mont BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ecp_nistz256_sqr_mont) +#define GRPC_ed25519_asn1_meth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ed25519_asn1_meth) +#define GRPC_ed25519_pkey_meth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ed25519_pkey_meth) +#define GRPC_gcm_ghash_4bit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_gcm_ghash_4bit) +#define GRPC_gcm_ghash_avx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_gcm_ghash_avx) +#define GRPC_gcm_ghash_clmul BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_gcm_ghash_clmul) +#define GRPC_gcm_ghash_ssse3 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_gcm_ghash_ssse3) +#define GRPC_gcm_gmult_4bit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_gcm_gmult_4bit) +#define GRPC_gcm_gmult_avx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_gcm_gmult_avx) +#define GRPC_gcm_gmult_clmul BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_gcm_gmult_clmul) +#define GRPC_gcm_gmult_ssse3 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_gcm_gmult_ssse3) +#define GRPC_gcm_init_4bit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_gcm_init_4bit) +#define GRPC_gcm_init_avx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_gcm_init_avx) +#define GRPC_gcm_init_clmul BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_gcm_init_clmul) +#define GRPC_gcm_init_ssse3 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_gcm_init_ssse3) +#define GRPC_i2a_ACCESS_DESCRIPTION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2a_ACCESS_DESCRIPTION) +#define GRPC_i2a_ASN1_ENUMERATED BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2a_ASN1_ENUMERATED) +#define GRPC_i2a_ASN1_INTEGER BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2a_ASN1_INTEGER) +#define GRPC_i2a_ASN1_OBJECT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2a_ASN1_OBJECT) +#define GRPC_i2a_ASN1_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2a_ASN1_STRING) +#define GRPC_i2c_ASN1_BIT_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2c_ASN1_BIT_STRING) +#define GRPC_i2c_ASN1_INTEGER BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2c_ASN1_INTEGER) +#define GRPC_i2d_ACCESS_DESCRIPTION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_ACCESS_DESCRIPTION) +#define GRPC_i2d_ASN1_BIT_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_ASN1_BIT_STRING) +#define GRPC_i2d_ASN1_BMPSTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_ASN1_BMPSTRING) +#define GRPC_i2d_ASN1_BOOLEAN BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_ASN1_BOOLEAN) +#define GRPC_i2d_ASN1_ENUMERATED BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_ASN1_ENUMERATED) +#define GRPC_i2d_ASN1_GENERALIZEDTIME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_ASN1_GENERALIZEDTIME) +#define GRPC_i2d_ASN1_GENERALSTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_ASN1_GENERALSTRING) +#define GRPC_i2d_ASN1_IA5STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_ASN1_IA5STRING) +#define GRPC_i2d_ASN1_INTEGER BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_ASN1_INTEGER) +#define GRPC_i2d_ASN1_NULL BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_ASN1_NULL) +#define GRPC_i2d_ASN1_OBJECT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_ASN1_OBJECT) +#define GRPC_i2d_ASN1_OCTET_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_ASN1_OCTET_STRING) +#define GRPC_i2d_ASN1_PRINTABLE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_ASN1_PRINTABLE) +#define GRPC_i2d_ASN1_PRINTABLESTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_ASN1_PRINTABLESTRING) +#define GRPC_i2d_ASN1_SEQUENCE_ANY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_ASN1_SEQUENCE_ANY) +#define GRPC_i2d_ASN1_SET_ANY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_ASN1_SET_ANY) +#define GRPC_i2d_ASN1_T61STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_ASN1_T61STRING) +#define GRPC_i2d_ASN1_TIME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_ASN1_TIME) +#define GRPC_i2d_ASN1_TYPE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_ASN1_TYPE) +#define GRPC_i2d_ASN1_UNIVERSALSTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_ASN1_UNIVERSALSTRING) +#define GRPC_i2d_ASN1_UTCTIME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_ASN1_UTCTIME) +#define GRPC_i2d_ASN1_UTF8STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_ASN1_UTF8STRING) +#define GRPC_i2d_ASN1_VISIBLESTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_ASN1_VISIBLESTRING) +#define GRPC_i2d_AUTHORITY_INFO_ACCESS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_AUTHORITY_INFO_ACCESS) +#define GRPC_i2d_AUTHORITY_KEYID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_AUTHORITY_KEYID) +#define GRPC_i2d_BASIC_CONSTRAINTS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_BASIC_CONSTRAINTS) +#define GRPC_i2d_CERTIFICATEPOLICIES BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_CERTIFICATEPOLICIES) +#define GRPC_i2d_CRL_DIST_POINTS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_CRL_DIST_POINTS) +#define GRPC_i2d_DHparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_DHparams) +#define GRPC_i2d_DHparams_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_DHparams_bio) +#define GRPC_i2d_DIRECTORYSTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_DIRECTORYSTRING) +#define GRPC_i2d_DISPLAYTEXT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_DISPLAYTEXT) +#define GRPC_i2d_DIST_POINT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_DIST_POINT) +#define GRPC_i2d_DIST_POINT_NAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_DIST_POINT_NAME) +#define GRPC_i2d_DSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_DSAPrivateKey) +#define GRPC_i2d_DSAPrivateKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_DSAPrivateKey_bio) +#define GRPC_i2d_DSAPrivateKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_DSAPrivateKey_fp) +#define GRPC_i2d_DSAPublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_DSAPublicKey) +#define GRPC_i2d_DSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_DSA_PUBKEY) +#define GRPC_i2d_DSA_PUBKEY_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_DSA_PUBKEY_bio) +#define GRPC_i2d_DSA_PUBKEY_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_DSA_PUBKEY_fp) +#define GRPC_i2d_DSA_SIG BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_DSA_SIG) +#define GRPC_i2d_DSAparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_DSAparams) +#define GRPC_i2d_ECDSA_SIG BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_ECDSA_SIG) +#define GRPC_i2d_ECParameters BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_ECParameters) +#define GRPC_i2d_ECPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_ECPrivateKey) +#define GRPC_i2d_ECPrivateKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_ECPrivateKey_bio) +#define GRPC_i2d_ECPrivateKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_ECPrivateKey_fp) +#define GRPC_i2d_EC_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_EC_PUBKEY) +#define GRPC_i2d_EC_PUBKEY_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_EC_PUBKEY_bio) +#define GRPC_i2d_EC_PUBKEY_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_EC_PUBKEY_fp) +#define GRPC_i2d_EDIPARTYNAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_EDIPARTYNAME) +#define GRPC_i2d_EXTENDED_KEY_USAGE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_EXTENDED_KEY_USAGE) +#define GRPC_i2d_GENERAL_NAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_GENERAL_NAME) +#define GRPC_i2d_GENERAL_NAMES BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_GENERAL_NAMES) +#define GRPC_i2d_ISSUING_DIST_POINT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_ISSUING_DIST_POINT) +#define GRPC_i2d_NETSCAPE_SPKAC BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_NETSCAPE_SPKAC) +#define GRPC_i2d_NETSCAPE_SPKI BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_NETSCAPE_SPKI) +#define GRPC_i2d_NOTICEREF BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_NOTICEREF) +#define GRPC_i2d_OTHERNAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_OTHERNAME) +#define GRPC_i2d_PKCS12 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_PKCS12) +#define GRPC_i2d_PKCS12_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_PKCS12_bio) +#define GRPC_i2d_PKCS12_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_PKCS12_fp) +#define GRPC_i2d_PKCS7 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_PKCS7) +#define GRPC_i2d_PKCS7_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_PKCS7_bio) +#define GRPC_i2d_PKCS8PrivateKeyInfo_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_PKCS8PrivateKeyInfo_bio) +#define GRPC_i2d_PKCS8PrivateKeyInfo_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_PKCS8PrivateKeyInfo_fp) +#define GRPC_i2d_PKCS8PrivateKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_PKCS8PrivateKey_bio) +#define GRPC_i2d_PKCS8PrivateKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_PKCS8PrivateKey_fp) +#define GRPC_i2d_PKCS8PrivateKey_nid_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_PKCS8PrivateKey_nid_bio) +#define GRPC_i2d_PKCS8PrivateKey_nid_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_PKCS8PrivateKey_nid_fp) +#define GRPC_i2d_PKCS8_PRIV_KEY_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_PKCS8_PRIV_KEY_INFO) +#define GRPC_i2d_PKCS8_PRIV_KEY_INFO_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_PKCS8_PRIV_KEY_INFO_bio) +#define GRPC_i2d_PKCS8_PRIV_KEY_INFO_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_PKCS8_PRIV_KEY_INFO_fp) +#define GRPC_i2d_PKCS8_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_PKCS8_bio) +#define GRPC_i2d_PKCS8_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_PKCS8_fp) +#define GRPC_i2d_PKEY_USAGE_PERIOD BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_PKEY_USAGE_PERIOD) +#define GRPC_i2d_POLICYINFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_POLICYINFO) +#define GRPC_i2d_POLICYQUALINFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_POLICYQUALINFO) +#define GRPC_i2d_PROXY_CERT_INFO_EXTENSION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_PROXY_CERT_INFO_EXTENSION) +#define GRPC_i2d_PROXY_POLICY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_PROXY_POLICY) +#define GRPC_i2d_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_PUBKEY) +#define GRPC_i2d_PUBKEY_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_PUBKEY_bio) +#define GRPC_i2d_PUBKEY_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_PUBKEY_fp) +#define GRPC_i2d_PrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_PrivateKey) +#define GRPC_i2d_PrivateKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_PrivateKey_bio) +#define GRPC_i2d_PrivateKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_PrivateKey_fp) +#define GRPC_i2d_PublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_PublicKey) +#define GRPC_i2d_RSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_RSAPrivateKey) +#define GRPC_i2d_RSAPrivateKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_RSAPrivateKey_bio) +#define GRPC_i2d_RSAPrivateKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_RSAPrivateKey_fp) +#define GRPC_i2d_RSAPublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_RSAPublicKey) +#define GRPC_i2d_RSAPublicKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_RSAPublicKey_bio) +#define GRPC_i2d_RSAPublicKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_RSAPublicKey_fp) +#define GRPC_i2d_RSA_PSS_PARAMS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_RSA_PSS_PARAMS) +#define GRPC_i2d_RSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_RSA_PUBKEY) +#define GRPC_i2d_RSA_PUBKEY_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_RSA_PUBKEY_bio) +#define GRPC_i2d_RSA_PUBKEY_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_RSA_PUBKEY_fp) +#define GRPC_i2d_SXNET BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_SXNET) +#define GRPC_i2d_SXNETID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_SXNETID) +#define GRPC_i2d_USERNOTICE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_USERNOTICE) +#define GRPC_i2d_X509 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_X509) +#define GRPC_i2d_X509_ALGOR BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_X509_ALGOR) +#define GRPC_i2d_X509_ALGORS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_X509_ALGORS) +#define GRPC_i2d_X509_ATTRIBUTE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_X509_ATTRIBUTE) +#define GRPC_i2d_X509_AUX BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_X509_AUX) +#define GRPC_i2d_X509_CERT_AUX BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_X509_CERT_AUX) +#define GRPC_i2d_X509_CINF BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_X509_CINF) +#define GRPC_i2d_X509_CRL BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_X509_CRL) +#define GRPC_i2d_X509_CRL_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_X509_CRL_INFO) +#define GRPC_i2d_X509_CRL_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_X509_CRL_bio) +#define GRPC_i2d_X509_CRL_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_X509_CRL_fp) +#define GRPC_i2d_X509_EXTENSION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_X509_EXTENSION) +#define GRPC_i2d_X509_EXTENSIONS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_X509_EXTENSIONS) +#define GRPC_i2d_X509_NAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_X509_NAME) +#define GRPC_i2d_X509_NAME_ENTRY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_X509_NAME_ENTRY) +#define GRPC_i2d_X509_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_X509_PUBKEY) +#define GRPC_i2d_X509_REQ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_X509_REQ) +#define GRPC_i2d_X509_REQ_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_X509_REQ_INFO) +#define GRPC_i2d_X509_REQ_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_X509_REQ_bio) +#define GRPC_i2d_X509_REQ_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_X509_REQ_fp) +#define GRPC_i2d_X509_REVOKED BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_X509_REVOKED) +#define GRPC_i2d_X509_SIG BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_X509_SIG) +#define GRPC_i2d_X509_VAL BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_X509_VAL) +#define GRPC_i2d_X509_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_X509_bio) +#define GRPC_i2d_X509_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_X509_fp) +#define GRPC_i2d_re_X509_CRL_tbs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_re_X509_CRL_tbs) +#define GRPC_i2d_re_X509_REQ_tbs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_re_X509_REQ_tbs) +#define GRPC_i2d_re_X509_tbs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_re_X509_tbs) +#define GRPC_i2o_ECPublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2o_ECPublicKey) +#define GRPC_i2s_ASN1_ENUMERATED BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2s_ASN1_ENUMERATED) +#define GRPC_i2s_ASN1_ENUMERATED_TABLE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2s_ASN1_ENUMERATED_TABLE) +#define GRPC_i2s_ASN1_INTEGER BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2s_ASN1_INTEGER) +#define GRPC_i2s_ASN1_OCTET_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2s_ASN1_OCTET_STRING) +#define GRPC_i2t_ASN1_OBJECT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2t_ASN1_OBJECT) +#define GRPC_i2v_ASN1_BIT_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2v_ASN1_BIT_STRING) +#define GRPC_i2v_GENERAL_NAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2v_GENERAL_NAME) +#define GRPC_i2v_GENERAL_NAMES BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2v_GENERAL_NAMES) +#define GRPC_kBoringSSLRSASqrtTwo BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_kBoringSSLRSASqrtTwo) +#define GRPC_kBoringSSLRSASqrtTwoLen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_kBoringSSLRSASqrtTwoLen) +#define GRPC_kOpenSSLReasonStringData BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_kOpenSSLReasonStringData) +#define GRPC_kOpenSSLReasonValues BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_kOpenSSLReasonValues) +#define GRPC_kOpenSSLReasonValuesLen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_kOpenSSLReasonValuesLen) +#define GRPC_level_add_node BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_level_add_node) +#define GRPC_level_find_node BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_level_find_node) +#define GRPC_lh_delete BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_lh_delete) +#define GRPC_lh_doall_arg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_lh_doall_arg) +#define GRPC_lh_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_lh_free) +#define GRPC_lh_insert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_lh_insert) +#define GRPC_lh_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_lh_new) +#define GRPC_lh_num_items BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_lh_num_items) +#define GRPC_lh_retrieve BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_lh_retrieve) +#define GRPC_lh_retrieve_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_lh_retrieve_key) +#define GRPC_lh_strhash BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_lh_strhash) +#define GRPC_md4_block_data_order BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_md4_block_data_order) +#define GRPC_md5_block_asm_data_order BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_md5_block_asm_data_order) +#define GRPC_o2i_ECPublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_o2i_ECPublicKey) +#define GRPC_pkcs12_iterations_acceptable BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_pkcs12_iterations_acceptable) +#define GRPC_pkcs12_key_gen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_pkcs12_key_gen) +#define GRPC_pkcs12_pbe_encrypt_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_pkcs12_pbe_encrypt_init) +#define GRPC_pkcs7_bundle BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_pkcs7_bundle) +#define GRPC_pkcs7_parse_header BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_pkcs7_parse_header) +#define GRPC_pkcs8_pbe_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_pkcs8_pbe_decrypt) +#define GRPC_policy_cache_find_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_policy_cache_find_data) +#define GRPC_policy_cache_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_policy_cache_free) +#define GRPC_policy_cache_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_policy_cache_set) +#define GRPC_policy_cache_set_mapping BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_policy_cache_set_mapping) +#define GRPC_policy_data_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_policy_data_free) +#define GRPC_policy_data_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_policy_data_new) +#define GRPC_policy_node_cmp_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_policy_node_cmp_new) +#define GRPC_policy_node_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_policy_node_free) +#define GRPC_policy_node_match BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_policy_node_match) +#define GRPC_rand_fork_unsafe_buffering_enabled BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_rand_fork_unsafe_buffering_enabled) +#define GRPC_rsa_asn1_meth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_rsa_asn1_meth) +#define GRPC_rsa_default_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_rsa_default_decrypt) +#define GRPC_rsa_default_private_transform BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_rsa_default_private_transform) +#define GRPC_rsa_default_sign_raw BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_rsa_default_sign_raw) +#define GRPC_rsa_default_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_rsa_default_size) +#define GRPC_rsa_pkey_meth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_rsa_pkey_meth) +#define GRPC_rsaz_1024_gather5_avx2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_rsaz_1024_gather5_avx2) +#define GRPC_rsaz_1024_mul_avx2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_rsaz_1024_mul_avx2) +#define GRPC_rsaz_1024_norm2red_avx2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_rsaz_1024_norm2red_avx2) +#define GRPC_rsaz_1024_red2norm_avx2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_rsaz_1024_red2norm_avx2) +#define GRPC_rsaz_1024_scatter5_avx2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_rsaz_1024_scatter5_avx2) +#define GRPC_rsaz_1024_sqr_avx2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_rsaz_1024_sqr_avx2) +#define GRPC_s2i_ASN1_INTEGER BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_s2i_ASN1_INTEGER) +#define GRPC_s2i_ASN1_OCTET_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_s2i_ASN1_OCTET_STRING) +#define GRPC_sha1_block_data_order BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sha1_block_data_order) +#define GRPC_sha256_block_data_order BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sha256_block_data_order) +#define GRPC_sha512_block_data_order BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sha512_block_data_order) +#define GRPC_sk_deep_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_deep_copy) +#define GRPC_sk_delete BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_delete) +#define GRPC_sk_delete_ptr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_delete_ptr) +#define GRPC_sk_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_dup) +#define GRPC_sk_find BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_find) +#define GRPC_sk_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_free) +#define GRPC_sk_insert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_insert) +#define GRPC_sk_is_sorted BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_is_sorted) +#define GRPC_sk_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_new) +#define GRPC_sk_new_null BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_new_null) +#define GRPC_sk_num BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_num) +#define GRPC_sk_pop BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_pop) +#define GRPC_sk_pop_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_pop_free) +#define GRPC_sk_pop_free_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_pop_free_ex) +#define GRPC_sk_push BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_push) +#define GRPC_sk_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_set) +#define GRPC_sk_set_cmp_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_set_cmp_func) +#define GRPC_sk_shift BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_shift) +#define GRPC_sk_sort BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_sort) +#define GRPC_sk_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_value) +#define GRPC_sk_zero BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_zero) +#define GRPC_tree_find_sk BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_tree_find_sk) +#define GRPC_v2i_ASN1_BIT_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_v2i_ASN1_BIT_STRING) +#define GRPC_v2i_GENERAL_NAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_v2i_GENERAL_NAME) +#define GRPC_v2i_GENERAL_NAMES BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_v2i_GENERAL_NAMES) +#define GRPC_v2i_GENERAL_NAME_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_v2i_GENERAL_NAME_ex) +#define GRPC_v3_akey_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_v3_akey_id) +#define GRPC_v3_alt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_v3_alt) +#define GRPC_v3_bcons BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_v3_bcons) +#define GRPC_v3_cpols BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_v3_cpols) +#define GRPC_v3_crl_invdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_v3_crl_invdate) +#define GRPC_v3_crl_num BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_v3_crl_num) +#define GRPC_v3_crl_reason BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_v3_crl_reason) +#define GRPC_v3_crld BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_v3_crld) +#define GRPC_v3_delta_crl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_v3_delta_crl) +#define GRPC_v3_ext_ku BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_v3_ext_ku) +#define GRPC_v3_freshest_crl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_v3_freshest_crl) +#define GRPC_v3_idp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_v3_idp) +#define GRPC_v3_info BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_v3_info) +#define GRPC_v3_inhibit_anyp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_v3_inhibit_anyp) +#define GRPC_v3_key_usage BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_v3_key_usage) +#define GRPC_v3_name_constraints BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_v3_name_constraints) +#define GRPC_v3_ns_ia5_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_v3_ns_ia5_list) +#define GRPC_v3_nscert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_v3_nscert) +#define GRPC_v3_ocsp_accresp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_v3_ocsp_accresp) +#define GRPC_v3_ocsp_nocheck BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_v3_ocsp_nocheck) +#define GRPC_v3_pci BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_v3_pci) +#define GRPC_v3_pkey_usage_period BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_v3_pkey_usage_period) +#define GRPC_v3_policy_constraints BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_v3_policy_constraints) +#define GRPC_v3_policy_mappings BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_v3_policy_mappings) +#define GRPC_v3_sinfo BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_v3_sinfo) +#define GRPC_v3_skey_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_v3_skey_id) +#define GRPC_v3_sxnet BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_v3_sxnet) +#define GRPC_vpaes_cbc_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_vpaes_cbc_encrypt) +#define GRPC_vpaes_ctr32_encrypt_blocks BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_vpaes_ctr32_encrypt_blocks) +#define GRPC_vpaes_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_vpaes_decrypt) +#define GRPC_vpaes_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_vpaes_encrypt) +#define GRPC_vpaes_set_decrypt_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_vpaes_set_decrypt_key) +#define GRPC_vpaes_set_encrypt_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_vpaes_set_encrypt_key) +#define GRPC_x25519_asn1_meth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_x25519_asn1_meth) +#define GRPC_x25519_ge_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_x25519_ge_add) +#define GRPC_x25519_ge_frombytes_vartime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_x25519_ge_frombytes_vartime) +#define GRPC_x25519_ge_p1p1_to_p2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_x25519_ge_p1p1_to_p2) +#define GRPC_x25519_ge_p1p1_to_p3 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_x25519_ge_p1p1_to_p3) +#define GRPC_x25519_ge_p3_to_cached BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_x25519_ge_p3_to_cached) +#define GRPC_x25519_ge_scalarmult BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_x25519_ge_scalarmult) +#define GRPC_x25519_ge_scalarmult_base BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_x25519_ge_scalarmult_base) +#define GRPC_x25519_ge_scalarmult_small_precomp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_x25519_ge_scalarmult_small_precomp) +#define GRPC_x25519_ge_sub BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_x25519_ge_sub) +#define GRPC_x25519_ge_tobytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_x25519_ge_tobytes) +#define GRPC_x25519_pkey_meth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_x25519_pkey_meth) +#define GRPC_x25519_sc_reduce BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_x25519_sc_reduce) +#define GRPC_x509_digest_sign_algorithm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_x509_digest_sign_algorithm) +#define GRPC_x509_digest_verify_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_x509_digest_verify_init) +#define GRPC_x509_print_rsa_pss_params BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_x509_print_rsa_pss_params) +#define GRPC_x509_rsa_ctx_to_pss BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_x509_rsa_ctx_to_pss) +#define GRPC_x509_rsa_pss_to_ctx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_x509_rsa_pss_to_ctx) +#define GRPC_x509v3_bytes_to_hex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_x509v3_bytes_to_hex) +#define GRPC_x509v3_hex_to_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_x509v3_hex_to_bytes) +#define GRPC_x509v3_looks_like_dns_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_x509v3_looks_like_dns_name) +#define GRPC_x509v3_name_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_x509v3_name_cmp) diff --git a/src/boringssl/boringssl_prefix_symbols.h.gz.b64 b/src/boringssl/boringssl_prefix_symbols.h.gz.b64 deleted file mode 100644 index 3118c524da5..00000000000 --- a/src/boringssl/boringssl_prefix_symbols.h.gz.b64 +++ /dev/null @@ -1,484 +0,0 @@ -H4sICH9e2F0AA2JvcmluZ3NzbF9wcmVmaXhfc3ltYm9scy5oAK2dXXPbRpa/7/dTqP57s1s1tWvJ -cSZzSUt0zI0taUg6G+8NCiRBCWOSYABQtvPp/9147ZdzGvgduCo1kwh4ngM2Gv2GRvd///fVbXb+ -nqdPz+XVf2z/8+rm1fUvf7v6NcueDsnV4rT9r3/77/9W/1w9JvkxLYo0O12V2dWlSP52tVXg366O -2S7dq/+PT7v/zvKrXVqUebq5lMlV+ZwWV0W2L7/GeXK1Vwfj03ftOl/yc1YkV1/T8vlK/Vn/f3Yp -r/ZJcqWQ5yRPNt+vnvL4VCa7v12d8+wl3SU7JYxL9T/JVbzJXhJt2nbXfsrKdJvoq6jjnvvrbQ+d -z0mcX6Wnq/hw0GSaFO2vW7+fX60e3q3/d7acXy1WV4/Lh98Xd/O7q/83W6n//n9Xs/u76qTZp/X7 -h+XV3WJ1+2G2+Li6mn34cKWo5ex+vZivtOt/F+v3V8v5r7OlQh4UpXy9+/72w6e7xf2vFbj4+Phh -oaL0gquHd9rxcb68fa/+Mnu7+LBYf67Cv1us7+er1X8px9X9w9X89/n9+mr1XnuMK3s7v/qwmL39 -ML96p/5rdv9Z61aP89vF7MPf1HUv57frvylF+2/qpNuH+9X8n5+UTp1zdTf7OPtVX0hFt/9Z/bD3 -s/XqQcVdqp+3+vRhrX/Gu+XDx6sPDyt95VefVnMVY7aeaVqlobrk1d8UN1cXuNTXPVP/3K4XD/fa -pwAVer2c6eu4n//6YfHr/P52rtmHClg/LNW5n1YN87er2XKx0kEfPq01/aCd2qQ09/PqnDr1dXqo -a6muYr5UCfFxVonf2Xfjv/5Nw28flsq5Wn2IZnd30eNy/m7xx9U5LsqkuCq/Zlcq653KdJ8meaEy -j8r82SlRN6HUWUxl6mOh/6BFaZnkcalzXLa/OsbbPLtKvp3jU5UJ1T9pWVzF+dPlqHzF1SZRcFIF -Sk9P//Vv/75L9ukpIS/nP+K/XW3+kzwULdRPX9YnBB3miVfx1b//+1Wk/2fzbz21eIj2UVEc6Gvo -/1j/4W898J+Wo0hK1NIgvedu/WEVbQ+pSqromKjiYTdW55OOVaAjPUWSvyS5RGeRjlWXhdHmst+r -7CZxE7wd4eU6upGnrE8TdqGW9YlT2qc9+5SUCKfDk8rTZXpMdM2GeQ3Ssz6rGu6QCMU27LlFicD8 -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 From bebd78ee265596c6aa8aed4bc3ff5eaabab0b14a Mon Sep 17 00:00:00 2001 From: Muxi Yan Date: Wed, 1 Apr 2020 12:07:14 -0700 Subject: [PATCH 328/758] Restore inadvertent change --- tools/dockerfile/test/sanity/Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/dockerfile/test/sanity/Dockerfile b/tools/dockerfile/test/sanity/Dockerfile index aa03520f8a4..e51412fc785 100644 --- a/tools/dockerfile/test/sanity/Dockerfile +++ b/tools/dockerfile/test/sanity/Dockerfile @@ -21,6 +21,7 @@ RUN apt-get update && apt-get install -y \ build-essential \ bzip2 \ ccache \ + cmake \ curl \ dnsutils \ gcc \ From 63fb190f4460d45d1562f63863705f2bfde57c1a Mon Sep 17 00:00:00 2001 From: Eric Gribkoff Date: Wed, 1 Apr 2020 12:26:50 -0700 Subject: [PATCH 329/758] Revert "to revert: run on kokoro" This reverts commit 936ab4da4f134c2133374d23ff263324c2943796. --- tools/internal_ci/linux/grpc_python_bazel_test.cfg | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/tools/internal_ci/linux/grpc_python_bazel_test.cfg b/tools/internal_ci/linux/grpc_python_bazel_test.cfg index 107404a30e9..feae924330e 100644 --- a/tools/internal_ci/linux/grpc_python_bazel_test.cfg +++ b/tools/internal_ci/linux/grpc_python_bazel_test.cfg @@ -1,4 +1,4 @@ -# Copyright 2020 gRPC authors. +# Copyright 2018 gRPC authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -15,15 +15,9 @@ # Config file for the internal CI (in protobuf text format) # Location of the continuous shell script in repository. -build_file: "grpc/tools/internal_ci/linux/grpc_xds.sh" -timeout_mins: 90 +build_file: "grpc/tools/internal_ci/linux/grpc_bazel.sh" +timeout_mins: 240 env_vars { key: "BAZEL_SCRIPT" - value: "tools/internal_ci/linux/grpc_xds_bazel_test_in_docker.sh" -} -action { - define_artifacts { - regex: "**/*sponge_log.*" - regex: "github/grpc/reports/**" - } + value: "tools/internal_ci/linux/grpc_python_bazel_test_in_docker.sh" } From ee31a696abf9919eb13cc3c2c53dc80b39efdb2f Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Wed, 1 Apr 2020 13:25:33 -0700 Subject: [PATCH 330/758] Cast metadata to tuple --- src/python/grpcio/grpc/experimental/aio/_call.py | 6 +++--- src/python/grpcio_tests/tests_aio/unit/metadata_test.py | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/python/grpcio/grpc/experimental/aio/_call.py b/src/python/grpcio/grpc/experimental/aio/_call.py index d06cc18d872..78da009ec01 100644 --- a/src/python/grpcio/grpc/experimental/aio/_call.py +++ b/src/python/grpcio/grpc/experimental/aio/_call.py @@ -105,7 +105,7 @@ class AioRpcError(grpc.RpcError): """ return self._details - def initial_metadata(self) -> Optional[Dict]: + def initial_metadata(self) -> Optional[MetadataType]: """Accesses the initial metadata sent by the server. Returns: @@ -113,7 +113,7 @@ class AioRpcError(grpc.RpcError): """ return self._initial_metadata - def trailing_metadata(self) -> Optional[Dict]: + def trailing_metadata(self) -> Optional[MetadataType]: """Accesses the trailing metadata sent by the server. Returns: @@ -171,7 +171,7 @@ class Call: loop: asyncio.AbstractEventLoop) -> None: self._loop = loop self._cython_call = cython_call - self._metadata = metadata + self._metadata = tuple(metadata) self._request_serializer = request_serializer self._response_deserializer = response_deserializer diff --git a/src/python/grpcio_tests/tests_aio/unit/metadata_test.py b/src/python/grpcio_tests/tests_aio/unit/metadata_test.py index 961ec29fceb..bc05ed9b07b 100644 --- a/src/python/grpcio_tests/tests_aio/unit/metadata_test.py +++ b/src/python/grpcio_tests/tests_aio/unit/metadata_test.py @@ -216,8 +216,8 @@ class TestMetadata(AioTestBase): multicallable = self._client.unary_unary(_TEST_CLIENT_TO_SERVER) for exception_type, metadata in _INVALID_METADATA_TEST_CASES: with self.subTest(metadata=metadata): - call = multicallable(_REQUEST, metadata=metadata) with self.assertRaises(exception_type): + call = multicallable(_REQUEST, metadata=metadata) await call async def test_generic_handler(self): From dc1d1e165d932d4afdee1870df02fbed21e759d9 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Wed, 1 Apr 2020 13:38:39 -0700 Subject: [PATCH 331/758] Add two more metadata tests --- .../grpcio_tests/tests_aio/unit/metadata_test.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/python/grpcio_tests/tests_aio/unit/metadata_test.py b/src/python/grpcio_tests/tests_aio/unit/metadata_test.py index bc05ed9b07b..b1a772df7be 100644 --- a/src/python/grpcio_tests/tests_aio/unit/metadata_test.py +++ b/src/python/grpcio_tests/tests_aio/unit/metadata_test.py @@ -210,6 +210,20 @@ class TestMetadata(AioTestBase): self.assertEqual(_RESPONSE, await call) self.assertEqual(grpc.StatusCode.OK, await call.code()) + async def test_from_client_to_server_with_list(self): + multicallable = self._client.unary_unary(_TEST_CLIENT_TO_SERVER) + call = multicallable( + _REQUEST, metadata=list(_INITIAL_METADATA_FROM_CLIENT_TO_SERVER)) + self.assertEqual(_RESPONSE, await call) + self.assertEqual(grpc.StatusCode.OK, await call.code()) + + async def test_from_client_to_server_with_iterator(self): + multicallable = self._client.unary_unary(_TEST_CLIENT_TO_SERVER) + call = multicallable( + _REQUEST, metadata=iter(_INITIAL_METADATA_FROM_CLIENT_TO_SERVER)) + self.assertEqual(_RESPONSE, await call) + self.assertEqual(grpc.StatusCode.OK, await call.code()) + @unittest.skipIf(platform.system() == 'Windows', 'https://github.com/grpc/grpc/issues/21943') async def test_invalid_metadata(self): From 2c24272bbdad1bad50b3c73d994a53e6ed4bfc13 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Wed, 1 Apr 2020 14:30:15 -0700 Subject: [PATCH 332/758] Cast the complete queue to sub class to avoid AttributeError --- src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi index 4231ca7d8ab..eaddb3952d0 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/grpc_aio.pyx.pxi @@ -105,7 +105,7 @@ cdef _actual_aio_shutdown(): ) future.add_done_callback(_grpc_shutdown_wrapper) elif _global_aio_state.engine is AsyncIOEngine.POLLER: - _global_aio_state.cq.shutdown() + (_global_aio_state.cq).shutdown() grpc_shutdown_blocking() else: raise ValueError('Unsupported engine type [%s]' % _global_aio_state.engine) From 5cab83380896fab4c37628667cc2530e66df2db9 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Wed, 1 Apr 2020 15:11:26 -0700 Subject: [PATCH 333/758] Make sanity tests happy --- src/python/grpcio/grpc/experimental/aio/_call.py | 2 +- src/python/grpcio_tests/tests_aio/unit/metadata_test.py | 7 ------- 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/src/python/grpcio/grpc/experimental/aio/_call.py b/src/python/grpcio/grpc/experimental/aio/_call.py index 78da009ec01..c038b3a3ffa 100644 --- a/src/python/grpcio/grpc/experimental/aio/_call.py +++ b/src/python/grpcio/grpc/experimental/aio/_call.py @@ -17,7 +17,7 @@ import asyncio from functools import partial import logging import enum -from typing import AsyncIterable, Awaitable, Dict, Optional +from typing import AsyncIterable, Awaitable, Optional import grpc from grpc import _common diff --git a/src/python/grpcio_tests/tests_aio/unit/metadata_test.py b/src/python/grpcio_tests/tests_aio/unit/metadata_test.py index b1a772df7be..6551e4ca084 100644 --- a/src/python/grpcio_tests/tests_aio/unit/metadata_test.py +++ b/src/python/grpcio_tests/tests_aio/unit/metadata_test.py @@ -217,13 +217,6 @@ class TestMetadata(AioTestBase): self.assertEqual(_RESPONSE, await call) self.assertEqual(grpc.StatusCode.OK, await call.code()) - async def test_from_client_to_server_with_iterator(self): - multicallable = self._client.unary_unary(_TEST_CLIENT_TO_SERVER) - call = multicallable( - _REQUEST, metadata=iter(_INITIAL_METADATA_FROM_CLIENT_TO_SERVER)) - self.assertEqual(_RESPONSE, await call) - self.assertEqual(grpc.StatusCode.OK, await call.code()) - @unittest.skipIf(platform.system() == 'Windows', 'https://github.com/grpc/grpc/issues/21943') async def test_invalid_metadata(self): From 386977ff419e8f309dcf0f87225c411e5c2a08d0 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Wed, 1 Apr 2020 15:16:55 -0700 Subject: [PATCH 334/758] Annotate metadata variable as Tuple instead of Sequence --- src/python/grpcio/grpc/experimental/aio/_call.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/python/grpcio/grpc/experimental/aio/_call.py b/src/python/grpcio/grpc/experimental/aio/_call.py index c038b3a3ffa..25e8f7eeaa8 100644 --- a/src/python/grpcio/grpc/experimental/aio/_call.py +++ b/src/python/grpcio/grpc/experimental/aio/_call.py @@ -14,10 +14,10 @@ """Invocation-side implementation of gRPC Asyncio Python.""" import asyncio -from functools import partial -import logging import enum -from typing import AsyncIterable, Awaitable, Optional +import logging +from functools import partial +from typing import AsyncIterable, Awaitable, Optional, Tuple import grpc from grpc import _common @@ -25,7 +25,8 @@ from grpc._cython import cygrpc from . import _base_call from ._typing import (DeserializingFunction, DoneCallbackType, MetadataType, - RequestType, ResponseType, SerializingFunction) + MetadatumType, RequestType, ResponseType, + SerializingFunction) __all__ = 'AioRpcError', 'Call', 'UnaryUnaryCall', 'UnaryStreamCall' @@ -161,7 +162,7 @@ class Call: _loop: asyncio.AbstractEventLoop _code: grpc.StatusCode _cython_call: cygrpc._AioCall - _metadata: MetadataType + _metadata: Tuple[MetadatumType] _request_serializer: SerializingFunction _response_deserializer: DeserializingFunction From 1680d41ccd9b75e969083391bde309e57a250f77 Mon Sep 17 00:00:00 2001 From: jiangtaoli2016 Date: Wed, 1 Apr 2020 16:48:03 -0700 Subject: [PATCH 335/758] remove hardcoded test credentials --- test/core/end2end/BUILD | 7 ++ .../core/end2end/h2_ssl_session_reuse_test.cc | 76 ++++++++++++------- 2 files changed, 55 insertions(+), 28 deletions(-) diff --git a/test/core/end2end/BUILD b/test/core/end2end/BUILD index f5ef0bac994..d173b209897 100644 --- a/test/core/end2end/BUILD +++ b/test/core/end2end/BUILD @@ -190,6 +190,13 @@ grpc_end2end_nosec_tests() grpc_cc_test( name = "h2_ssl_session_reuse_test", srcs = ["h2_ssl_session_reuse_test.cc"], + data = [ + "//src/core/tsi/test_creds:ca.pem", + "//src/core/tsi/test_creds:client.key", + "//src/core/tsi/test_creds:client.pem", + "//src/core/tsi/test_creds:server1.key", + "//src/core/tsi/test_creds:server1.pem", + ], external_deps = [ "gtest", ], diff --git a/test/core/end2end/h2_ssl_session_reuse_test.cc b/test/core/end2end/h2_ssl_session_reuse_test.cc index ed450aebf1b..2683f3df175 100644 --- a/test/core/end2end/h2_ssl_session_reuse_test.cc +++ b/test/core/end2end/h2_ssl_session_reuse_test.cc @@ -16,26 +16,29 @@ * */ -#include "test/core/end2end/end2end_tests.h" - -#include -#include - #include #include +#include +#include +#include #include "src/core/lib/channel/channel_args.h" #include "src/core/lib/gpr/string.h" #include "src/core/lib/gpr/tmpfile.h" #include "src/core/lib/gprpp/host_port.h" +#include "src/core/lib/iomgr/load_file.h" #include "src/core/lib/security/credentials/credentials.h" #include "src/core/lib/security/security_connector/ssl_utils_config.h" #include "test/core/end2end/cq_verifier.h" -#include "test/core/end2end/data/ssl_test_data.h" +#include "test/core/end2end/end2end_tests.h" #include "test/core/util/port.h" #include "test/core/util/test_config.h" -#include +#define CA_CERT_PATH "src/core/tsi/test_creds/ca.pem" +#define CLIENT_CERT_PATH "src/core/tsi/test_creds/client.pem" +#define CLIENT_KEY_PATH "src/core/tsi/test_creds/client.key" +#define SERVER_CERT_PATH "src/core/tsi/test_creds/server1.pem" +#define SERVER_KEY_PATH "src/core/tsi/test_creds/server1.key" namespace grpc { namespace testing { @@ -46,10 +49,22 @@ void* tag(intptr_t t) { return (void*)t; } gpr_timespec five_seconds_time() { return grpc_timeout_seconds_to_deadline(5); } grpc_server* server_create(grpc_completion_queue* cq, char* server_addr) { - grpc_ssl_pem_key_cert_pair pem_cert_key_pair = {test_server1_key, - test_server1_cert}; + grpc_slice ca_slice, cert_slice, key_slice; + GPR_ASSERT(GRPC_LOG_IF_ERROR("load_file", + grpc_load_file(CA_CERT_PATH, 1, &ca_slice))); + GPR_ASSERT(GRPC_LOG_IF_ERROR( + "load_file", grpc_load_file(SERVER_CERT_PATH, 1, &cert_slice))); + GPR_ASSERT(GRPC_LOG_IF_ERROR("load_file", + grpc_load_file(SERVER_KEY_PATH, 1, &key_slice))); + const char* ca_cert = + reinterpret_cast GRPC_SLICE_START_PTR(ca_slice); + const char* server_cert = + reinterpret_cast GRPC_SLICE_START_PTR(cert_slice); + const char* server_key = + reinterpret_cast GRPC_SLICE_START_PTR(key_slice); + grpc_ssl_pem_key_cert_pair pem_cert_key_pair = {server_key, server_cert}; grpc_server_credentials* server_creds = grpc_ssl_server_credentials_create_ex( - test_root_cert, &pem_cert_key_pair, 1, + ca_cert, &pem_cert_key_pair, 1, GRPC_SSL_REQUEST_CLIENT_CERTIFICATE_AND_VERIFY, nullptr); grpc_server* server = grpc_server_create(nullptr, nullptr); @@ -59,14 +74,30 @@ grpc_server* server_create(grpc_completion_queue* cq, char* server_addr) { grpc_server_credentials_release(server_creds); grpc_server_start(server); + grpc_slice_unref(cert_slice); + grpc_slice_unref(key_slice); + grpc_slice_unref(ca_slice); return server; } grpc_channel* client_create(char* server_addr, grpc_ssl_session_cache* cache) { - grpc_ssl_pem_key_cert_pair signed_client_key_cert_pair = { - test_signed_client_key, test_signed_client_cert}; + grpc_slice ca_slice, cert_slice, key_slice; + GPR_ASSERT(GRPC_LOG_IF_ERROR("load_file", + grpc_load_file(CA_CERT_PATH, 1, &ca_slice))); + GPR_ASSERT(GRPC_LOG_IF_ERROR( + "load_file", grpc_load_file(CLIENT_CERT_PATH, 1, &cert_slice))); + GPR_ASSERT(GRPC_LOG_IF_ERROR("load_file", + grpc_load_file(CLIENT_KEY_PATH, 1, &key_slice))); + const char* ca_cert = + reinterpret_cast GRPC_SLICE_START_PTR(ca_slice); + const char* client_cert = + reinterpret_cast GRPC_SLICE_START_PTR(cert_slice); + const char* client_key = + reinterpret_cast GRPC_SLICE_START_PTR(key_slice); + grpc_ssl_pem_key_cert_pair signed_client_key_cert_pair = {client_key, + client_cert}; grpc_channel_credentials* client_creds = grpc_ssl_credentials_create( - test_root_cert, &signed_client_key_cert_pair, nullptr, nullptr); + ca_cert, &signed_client_key_cert_pair, nullptr, nullptr); grpc_arg args[] = { grpc_channel_arg_string_create( @@ -88,6 +119,9 @@ grpc_channel* client_create(char* server_addr, grpc_ssl_session_cache* cache) { grpc_channel_args_destroy(client_args); } + grpc_slice_unref(cert_slice); + grpc_slice_unref(key_slice); + grpc_slice_unref(ca_slice); return client; } @@ -253,27 +287,13 @@ TEST(H2SessionReuseTest, SingleReuse) { } // namespace grpc int main(int argc, char** argv) { - FILE* roots_file; - size_t roots_size = strlen(test_root_cert); - char* roots_filename; - grpc::testing::TestEnvironment env(argc, argv); - /* Set the SSL roots env var. */ - roots_file = gpr_tmpfile("chttp2_ssl_session_reuse_test", &roots_filename); - GPR_ASSERT(roots_filename != nullptr); - GPR_ASSERT(roots_file != nullptr); - GPR_ASSERT(fwrite(test_root_cert, 1, roots_size, roots_file) == roots_size); - fclose(roots_file); - GPR_GLOBAL_CONFIG_SET(grpc_default_ssl_roots_file_path, roots_filename); + GPR_GLOBAL_CONFIG_SET(grpc_default_ssl_roots_file_path, CA_CERT_PATH); grpc_init(); ::testing::InitGoogleTest(&argc, argv); int ret = RUN_ALL_TESTS(); grpc_shutdown(); - /* Cleanup. */ - remove(roots_filename); - gpr_free(roots_filename); - return ret; } From f15a6bf6e4ed78baa732be8702a8885c84d922f1 Mon Sep 17 00:00:00 2001 From: Richard Belleville Date: Wed, 1 Apr 2020 23:34:14 -0700 Subject: [PATCH 336/758] Add version check for Python 3.6 to simple stubs --- src/python/grpcio/grpc/experimental/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/python/grpcio/grpc/experimental/__init__.py b/src/python/grpcio/grpc/experimental/__init__.py index 6364e36b631..2c63908fe6d 100644 --- a/src/python/grpcio/grpc/experimental/__init__.py +++ b/src/python/grpcio/grpc/experimental/__init__.py @@ -85,6 +85,6 @@ __all__ = ( 'insecure_channel_credentials', ) -if sys.version_info[0] >= 3: +if sys.version_info[0] == 3 and sys.version_info[1] >= 6: from grpc._simple_stubs import unary_unary, unary_stream, stream_unary, stream_stream __all__ = __all__ + (unary_unary, unary_stream, stream_unary, stream_stream) From 326939fb64324ff1b480f43caab6fdb7de7b54dc Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Thu, 2 Apr 2020 14:06:49 +0200 Subject: [PATCH 337/758] temporarily disable node tests --- tools/run_tests/helper_scripts/run_grpc-node.sh | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tools/run_tests/helper_scripts/run_grpc-node.sh b/tools/run_tests/helper_scripts/run_grpc-node.sh index d14753a4d54..f54d69e9a32 100755 --- a/tools/run_tests/helper_scripts/run_grpc-node.sh +++ b/tools/run_tests/helper_scripts/run_grpc-node.sh @@ -27,4 +27,7 @@ rm -rf ./../grpc-node git clone --recursive https://github.com/grpc/grpc-node ./../grpc-node cd ./../grpc-node -./test-grpc-submodule.sh "$CURRENT_COMMIT" +echo "TODO(jtattermusch): Skipping grpc-node's ./test-grpc-submodule.sh $CURRENT_COMMIT" +echo "because it currently doesn't provide any useful signal." +echo "See b/152833238" +#./test-grpc-submodule.sh "$CURRENT_COMMIT" From 41cfae42345f32d0278e932039dc8a1a38006884 Mon Sep 17 00:00:00 2001 From: "Mark D. Roth" Date: Thu, 2 Apr 2020 08:13:26 -0700 Subject: [PATCH 338/758] Revert "Merge pull request #19693 from apolcyn/control_plane_creds" This reverts commit 162fccdb90b9fec5801584b751f0f33af2795449, reversing changes made to 228e7557fafb41ba4dcd3da7a55be9786573af13. --- CMakeLists.txt | 35 -- Makefile | 51 -- build_autogenerated.yaml | 19 - .../lib/security/credentials/credentials.cc | 84 ---- .../lib/security/credentials/credentials.h | 56 --- src/core/lib/surface/init_secure.cc | 5 +- test/core/end2end/fuzzers/client_fuzzer.cc | 3 - test/core/end2end/fuzzers/server_fuzzer.cc | 3 - test/core/security/BUILD | 13 - test/core/security/alts_credentials_fuzzer.cc | 3 - .../control_plane_credentials_test.cc | 458 ------------------ test/core/slice/percent_decode_fuzzer.cc | 3 - test/core/slice/percent_encode_fuzzer.cc | 3 - tools/run_tests/generated/tests.json | 24 - 14 files changed, 1 insertion(+), 759 deletions(-) delete mode 100644 test/core/security/control_plane_credentials_test.cc diff --git a/CMakeLists.txt b/CMakeLists.txt index 5a52205e480..4496b174ba6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -457,7 +457,6 @@ if(gRPC_BUILD_TESTS) add_dependencies(buildtests_c compression_test) add_dependencies(buildtests_c concurrent_connectivity_test) add_dependencies(buildtests_c connection_refused_test) - add_dependencies(buildtests_c control_plane_credentials_test) add_dependencies(buildtests_c cpu_test) add_dependencies(buildtests_c dns_resolver_connectivity_using_ares_resolver_test) add_dependencies(buildtests_c dns_resolver_connectivity_using_native_resolver_test) @@ -4825,40 +4824,6 @@ target_link_libraries(connection_refused_test ) -endif() -if(gRPC_BUILD_TESTS) - -add_executable(control_plane_credentials_test - test/core/end2end/cq_verifier.cc - test/core/end2end/data/client_certs.cc - test/core/end2end/data/server1_cert.cc - test/core/end2end/data/server1_key.cc - test/core/end2end/data/test_root_cert.cc - test/core/security/control_plane_credentials_test.cc -) - -target_include_directories(control_plane_credentials_test - PRIVATE - ${CMAKE_CURRENT_SOURCE_DIR} - ${CMAKE_CURRENT_SOURCE_DIR}/include - ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} - ${_gRPC_SSL_INCLUDE_DIR} - ${_gRPC_UPB_GENERATED_DIR} - ${_gRPC_UPB_GRPC_GENERATED_DIR} - ${_gRPC_UPB_INCLUDE_DIR} - ${_gRPC_ZLIB_INCLUDE_DIR} -) - -target_link_libraries(control_plane_credentials_test - ${_gRPC_ALLTARGETS_LIBRARIES} - grpc_test_util - grpc - gpr - address_sorting - upb -) - - endif() if(gRPC_BUILD_TESTS) diff --git a/Makefile b/Makefile index 08ee1cbe217..fa732c6cfcd 100644 --- a/Makefile +++ b/Makefile @@ -1047,7 +1047,6 @@ completion_queue_threading_test: $(BINDIR)/$(CONFIG)/completion_queue_threading_ compression_test: $(BINDIR)/$(CONFIG)/compression_test concurrent_connectivity_test: $(BINDIR)/$(CONFIG)/concurrent_connectivity_test connection_refused_test: $(BINDIR)/$(CONFIG)/connection_refused_test -control_plane_credentials_test: $(BINDIR)/$(CONFIG)/control_plane_credentials_test cpu_test: $(BINDIR)/$(CONFIG)/cpu_test dns_resolver_connectivity_using_ares_resolver_test: $(BINDIR)/$(CONFIG)/dns_resolver_connectivity_using_ares_resolver_test dns_resolver_connectivity_using_native_resolver_test: $(BINDIR)/$(CONFIG)/dns_resolver_connectivity_using_native_resolver_test @@ -1424,7 +1423,6 @@ buildtests_c: privatelibs_c \ $(BINDIR)/$(CONFIG)/compression_test \ $(BINDIR)/$(CONFIG)/concurrent_connectivity_test \ $(BINDIR)/$(CONFIG)/connection_refused_test \ - $(BINDIR)/$(CONFIG)/control_plane_credentials_test \ $(BINDIR)/$(CONFIG)/cpu_test \ $(BINDIR)/$(CONFIG)/dns_resolver_connectivity_using_ares_resolver_test \ $(BINDIR)/$(CONFIG)/dns_resolver_connectivity_using_native_resolver_test \ @@ -1924,8 +1922,6 @@ test_c: buildtests_c $(Q) $(BINDIR)/$(CONFIG)/concurrent_connectivity_test || ( echo test concurrent_connectivity_test failed ; exit 1 ) $(E) "[RUN] Testing connection_refused_test" $(Q) $(BINDIR)/$(CONFIG)/connection_refused_test || ( echo test connection_refused_test failed ; exit 1 ) - $(E) "[RUN] Testing control_plane_credentials_test" - $(Q) $(BINDIR)/$(CONFIG)/control_plane_credentials_test || ( echo test control_plane_credentials_test failed ; exit 1 ) $(E) "[RUN] Testing cpu_test" $(Q) $(BINDIR)/$(CONFIG)/cpu_test || ( echo test cpu_test failed ; exit 1 ) $(E) "[RUN] Testing dns_resolver_connectivity_using_ares_resolver_test" @@ -7842,53 +7838,6 @@ endif endif -CONTROL_PLANE_CREDENTIALS_TEST_SRC = \ - test/core/end2end/cq_verifier.cc \ - test/core/end2end/data/client_certs.cc \ - test/core/end2end/data/server1_cert.cc \ - test/core/end2end/data/server1_key.cc \ - test/core/end2end/data/test_root_cert.cc \ - test/core/security/control_plane_credentials_test.cc \ - -CONTROL_PLANE_CREDENTIALS_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(CONTROL_PLANE_CREDENTIALS_TEST_SRC)))) -ifeq ($(NO_SECURE),true) - -# You can't build secure targets if you don't have OpenSSL. - -$(BINDIR)/$(CONFIG)/control_plane_credentials_test: openssl_dep_error - -else - - - -$(BINDIR)/$(CONFIG)/control_plane_credentials_test: $(CONTROL_PLANE_CREDENTIALS_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a - $(E) "[LD] Linking $@" - $(Q) mkdir -p `dirname $@` - $(Q) $(LDXX) $(LDFLAGS) $(CONTROL_PLANE_CREDENTIALS_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/control_plane_credentials_test - -endif - -$(OBJDIR)/$(CONFIG)/test/core/end2end/cq_verifier.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a - -$(OBJDIR)/$(CONFIG)/test/core/end2end/data/client_certs.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a - -$(OBJDIR)/$(CONFIG)/test/core/end2end/data/server1_cert.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a - -$(OBJDIR)/$(CONFIG)/test/core/end2end/data/server1_key.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a - -$(OBJDIR)/$(CONFIG)/test/core/end2end/data/test_root_cert.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a - -$(OBJDIR)/$(CONFIG)/test/core/security/control_plane_credentials_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a - -deps_control_plane_credentials_test: $(CONTROL_PLANE_CREDENTIALS_TEST_OBJS:.o=.dep) - -ifneq ($(NO_SECURE),true) -ifneq ($(NO_DEPS),true) --include $(CONTROL_PLANE_CREDENTIALS_TEST_OBJS:.o=.dep) -endif -endif - - CPU_TEST_SRC = \ test/core/gpr/cpu_test.cc \ diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml index 14daa48e2b7..c7dd893aa72 100644 --- a/build_autogenerated.yaml +++ b/build_autogenerated.yaml @@ -3143,25 +3143,6 @@ targets: - gpr - address_sorting - upb -- name: control_plane_credentials_test - build: test - language: c - headers: - - test/core/end2end/cq_verifier.h - - test/core/end2end/data/ssl_test_data.h - src: - - test/core/end2end/cq_verifier.cc - - test/core/end2end/data/client_certs.cc - - test/core/end2end/data/server1_cert.cc - - test/core/end2end/data/server1_key.cc - - test/core/end2end/data/test_root_cert.cc - - test/core/security/control_plane_credentials_test.cc - deps: - - grpc_test_util - - grpc - - gpr - - address_sorting - - upb - name: cpu_test build: test language: c diff --git a/src/core/lib/security/credentials/credentials.cc b/src/core/lib/security/credentials/credentials.cc index 8ef58d2a4b4..90452d68d61 100644 --- a/src/core/lib/security/credentials/credentials.cc +++ b/src/core/lib/security/credentials/credentials.cc @@ -45,90 +45,6 @@ void grpc_channel_credentials_release(grpc_channel_credentials* creds) { if (creds) creds->Unref(); } -static std::map, - grpc_core::RefCountedPtr, - grpc_core::StringLess>* g_grpc_control_plane_creds; -static gpr_mu g_control_plane_creds_mu; - -static void do_control_plane_creds_init() { - gpr_mu_init(&g_control_plane_creds_mu); - GPR_ASSERT(g_grpc_control_plane_creds == nullptr); - g_grpc_control_plane_creds = - new std::map, - grpc_core::RefCountedPtr, - grpc_core::StringLess>(); -} - -void grpc_control_plane_credentials_init() { - static gpr_once once_init_control_plane_creds = GPR_ONCE_INIT; - gpr_once_init(&once_init_control_plane_creds, do_control_plane_creds_init); -} - -void grpc_test_only_control_plane_credentials_destroy() { - delete g_grpc_control_plane_creds; - g_grpc_control_plane_creds = nullptr; - gpr_mu_destroy(&g_control_plane_creds_mu); -} - -void grpc_test_only_control_plane_credentials_force_init() { - if (g_grpc_control_plane_creds == nullptr) { - do_control_plane_creds_init(); - } -} - -bool grpc_channel_credentials_attach_credentials( - grpc_channel_credentials* credentials, const char* authority, - grpc_channel_credentials* control_plane_creds) { - grpc_core::ExecCtx exec_ctx; - return credentials->attach_credentials(authority, control_plane_creds->Ref()); -} - -bool grpc_control_plane_credentials_register( - const char* authority, grpc_channel_credentials* control_plane_creds) { - grpc_core::ExecCtx exec_ctx; - { - grpc_core::MutexLock lock(&g_control_plane_creds_mu); - auto key = grpc_core::UniquePtr(gpr_strdup(authority)); - if (g_grpc_control_plane_creds->find(key) != - g_grpc_control_plane_creds->end()) { - return false; - } - (*g_grpc_control_plane_creds)[std::move(key)] = control_plane_creds->Ref(); - } - return true; -} - -bool grpc_channel_credentials::attach_credentials( - const char* authority, - grpc_core::RefCountedPtr control_plane_creds) { - auto key = grpc_core::UniquePtr(gpr_strdup(authority)); - if (local_control_plane_creds_.find(key) != - local_control_plane_creds_.end()) { - return false; - } - local_control_plane_creds_[std::move(key)] = std::move(control_plane_creds); - return true; -} - -grpc_core::RefCountedPtr -grpc_channel_credentials::get_control_plane_credentials(const char* authority) { - { - auto key = grpc_core::UniquePtr(gpr_strdup(authority)); - auto local_lookup = local_control_plane_creds_.find(key); - if (local_lookup != local_control_plane_creds_.end()) { - return local_lookup->second; - } - { - grpc_core::MutexLock lock(&g_control_plane_creds_mu); - auto global_lookup = g_grpc_control_plane_creds->find(key); - if (global_lookup != g_grpc_control_plane_creds->end()) { - return global_lookup->second; - } - } - } - return duplicate_without_call_credentials(); -} - void grpc_call_credentials_release(grpc_call_credentials* creds) { GRPC_API_TRACE("grpc_call_credentials_release(creds=%p)", 1, (creds)); grpc_core::ExecCtx exec_ctx; diff --git a/src/core/lib/security/credentials/credentials.h b/src/core/lib/security/credentials/credentials.h index 4d1af0588f6..e7385537b0f 100644 --- a/src/core/lib/security/credentials/credentials.h +++ b/src/core/lib/security/credentials/credentials.h @@ -28,9 +28,7 @@ #include #include "src/core/lib/transport/metadata_batch.h" -#include "src/core/lib/gprpp/map.h" #include "src/core/lib/gprpp/ref_counted.h" -#include "src/core/lib/gprpp/sync.h" #include "src/core/lib/http/httpcli.h" #include "src/core/lib/http/parser.h" #include "src/core/lib/iomgr/polling_entity.h" @@ -131,29 +129,10 @@ struct grpc_channel_credentials return args; } - // Attaches control_plane_creds to the local registry, under authority, - // if no other creds are currently registered under authority. Returns - // true if registered successfully and false if not. - bool attach_credentials( - const char* authority, - grpc_core::RefCountedPtr control_plane_creds); - - // Gets the control plane credentials registered under authority. This - // prefers the local control plane creds registry but falls back to the - // global registry. Lastly, this returns self but with any attached - // call credentials stripped off, in the case that neither the local - // registry nor the global registry have an entry for authority. - grpc_core::RefCountedPtr - get_control_plane_credentials(const char* authority); - const char* type() const { return type_; } private: const char* type_; - std::map, - grpc_core::RefCountedPtr, - grpc_core::StringLess> - local_control_plane_creds_; }; /* Util to encapsulate the channel credentials in a channel arg. */ @@ -167,41 +146,6 @@ grpc_channel_credentials* grpc_channel_credentials_from_arg( grpc_channel_credentials* grpc_channel_credentials_find_in_args( const grpc_channel_args* args); -/** EXPERIMENTAL. API MAY CHANGE IN THE FUTURE. - Attaches \a control_plane_creds to \a credentials - under the key \a authority. Returns false if \a authority - is already present, in which case no changes are made. - Note that this API is not thread safe. Only one thread may - attach control plane creds to a given credentials object at - any one time, and new control plane creds must not be - attached after \a credentials has been used to create a channel. */ -bool grpc_channel_credentials_attach_credentials( - grpc_channel_credentials* credentials, const char* authority, - grpc_channel_credentials* control_plane_creds); - -/** EXPERIMENTAL. API MAY CHANGE IN THE FUTURE. - Registers \a control_plane_creds in the global registry - under the key \a authority. Returns false if \a authority - is already present, in which case no changes are made. */ -bool grpc_control_plane_credentials_register( - const char* authority, grpc_channel_credentials* control_plane_creds); - -/* Initializes global control plane credentials data. */ -void grpc_control_plane_credentials_init(); - -/* Test only: destroy global control plane credentials data. - * This API is meant for use by a few tests that need to - * satisdy grpc_core::LeakDetector. */ -void grpc_test_only_control_plane_credentials_destroy(); - -/* Test only: force re-initialization of global control - * plane credentials data if it was previously destroyed. - * This API is meant to be used in - * tandem with the - * grpc_test_only_control_plane_credentials_destroy, for - * the few tests that need it. */ -void grpc_test_only_control_plane_credentials_force_init(); - /* --- grpc_credentials_mdelem_array. --- */ typedef struct { diff --git a/src/core/lib/surface/init_secure.cc b/src/core/lib/surface/init_secure.cc index f2c236dd79e..428c5815c98 100644 --- a/src/core/lib/surface/init_secure.cc +++ b/src/core/lib/surface/init_secure.cc @@ -78,7 +78,4 @@ void grpc_register_security_filters(void) { maybe_prepend_server_auth_filter, nullptr); } -void grpc_security_init() { - grpc_core::SecurityRegisterHandshakerFactories(); - grpc_control_plane_credentials_init(); -} +void grpc_security_init() { grpc_core::SecurityRegisterHandshakerFactories(); } diff --git a/test/core/end2end/fuzzers/client_fuzzer.cc b/test/core/end2end/fuzzers/client_fuzzer.cc index 420479d3f28..6584103f79e 100644 --- a/test/core/end2end/fuzzers/client_fuzzer.cc +++ b/test/core/end2end/fuzzers/client_fuzzer.cc @@ -24,7 +24,6 @@ #include "src/core/ext/transport/chttp2/transport/chttp2_transport.h" #include "src/core/lib/iomgr/executor.h" -#include "src/core/lib/security/credentials/credentials.h" #include "src/core/lib/slice/slice_internal.h" #include "src/core/lib/surface/channel.h" #include "test/core/util/mock_endpoint.h" @@ -42,7 +41,6 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { grpc_test_only_set_slice_hash_seed(0); if (squelch) gpr_set_log_function(dont_log); grpc_init(); - grpc_test_only_control_plane_credentials_force_init(); { grpc_core::ExecCtx exec_ctx; grpc_core::Executor::SetThreadingAll(false); @@ -158,7 +156,6 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { grpc_byte_buffer_destroy(response_payload_recv); } } - grpc_test_only_control_plane_credentials_destroy(); grpc_shutdown_blocking(); return 0; } diff --git a/test/core/end2end/fuzzers/server_fuzzer.cc b/test/core/end2end/fuzzers/server_fuzzer.cc index 61cbc7d45af..1fabd8ca172 100644 --- a/test/core/end2end/fuzzers/server_fuzzer.cc +++ b/test/core/end2end/fuzzers/server_fuzzer.cc @@ -20,7 +20,6 @@ #include "src/core/ext/transport/chttp2/transport/chttp2_transport.h" #include "src/core/lib/iomgr/executor.h" -#include "src/core/lib/security/credentials/credentials.h" #include "src/core/lib/slice/slice_internal.h" #include "src/core/lib/surface/server.h" #include "test/core/util/mock_endpoint.h" @@ -39,7 +38,6 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { grpc_test_only_set_slice_hash_seed(0); if (squelch) gpr_set_log_function(dont_log); grpc_init(); - grpc_test_only_control_plane_credentials_force_init(); { grpc_core::ExecCtx exec_ctx; grpc_core::Executor::SetThreadingAll(false); @@ -133,7 +131,6 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { grpc_server_destroy(server); grpc_completion_queue_destroy(cq); } - grpc_test_only_control_plane_credentials_destroy(); grpc_shutdown(); return 0; } diff --git a/test/core/security/BUILD b/test/core/security/BUILD index d13e51def7e..d4ffb2b3a32 100644 --- a/test/core/security/BUILD +++ b/test/core/security/BUILD @@ -79,19 +79,6 @@ grpc_cc_test( ], ) -grpc_cc_test( - name = "control_plane_credentials_test", - srcs = ["control_plane_credentials_test.cc"], - language = "C++", - deps = [ - "//:gpr", - "//:grpc", - "//test/core/end2end:cq_verifier", - "//test/core/end2end:ssl_test_data", - "//test/core/util:grpc_test_util", - ], -) - grpc_cc_test( name = "json_token_test", srcs = ["json_token_test.cc"], diff --git a/test/core/security/alts_credentials_fuzzer.cc b/test/core/security/alts_credentials_fuzzer.cc index c772495f63b..42e683f64b2 100644 --- a/test/core/security/alts_credentials_fuzzer.cc +++ b/test/core/security/alts_credentials_fuzzer.cc @@ -29,7 +29,6 @@ #include "src/core/lib/security/credentials/alts/alts_credentials.h" #include "src/core/lib/security/credentials/alts/check_gcp_environment.h" #include "src/core/lib/security/credentials/alts/grpc_alts_credentials_options.h" -#include "src/core/lib/security/credentials/credentials.h" using grpc_core::testing::grpc_fuzzer_get_next_byte; using grpc_core::testing::grpc_fuzzer_get_next_string; @@ -68,7 +67,6 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { gpr_free(grpc_trace_fuzzer); input_stream inp = {data, data + size}; grpc_init(); - grpc_test_only_control_plane_credentials_force_init(); bool is_on_gcp = grpc_alts_is_running_on_gcp(); while (inp.cur != inp.end) { bool enable_untrusted_alts = grpc_fuzzer_get_next_byte(&inp) & 0x01; @@ -107,7 +105,6 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { } gpr_free(handshaker_service_url); } - grpc_test_only_control_plane_credentials_destroy(); grpc_shutdown(); return 0; } diff --git a/test/core/security/control_plane_credentials_test.cc b/test/core/security/control_plane_credentials_test.cc deleted file mode 100644 index d7c401d9ad1..00000000000 --- a/test/core/security/control_plane_credentials_test.cc +++ /dev/null @@ -1,458 +0,0 @@ -/* - * - * Copyright 2019 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#include - -#include "src/core/lib/security/credentials/credentials.h" - -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#include "src/core/lib/gprpp/host_port.h" -#include "src/core/lib/iomgr/error.h" -#include "src/core/lib/security/credentials/composite/composite_credentials.h" -#include "src/core/lib/slice/slice_string_helpers.h" - -#include "test/core/util/port.h" -#include "test/core/util/test_config.h" - -#include "test/core/end2end/cq_verifier.h" -#include "test/core/end2end/data/ssl_test_data.h" - -namespace { - -grpc_completion_queue* g_cq; -grpc_server* g_server; -int g_port; - -void drain_cq(grpc_completion_queue* cq) { - grpc_event ev; - do { - ev = grpc_completion_queue_next( - cq, grpc_timeout_milliseconds_to_deadline(5000), nullptr); - } while (ev.type != GRPC_QUEUE_SHUTDOWN); -} - -void* tag(int i) { return (void*)static_cast(i); } - -grpc_channel_credentials* create_test_ssl_plus_token_channel_creds( - const char* token) { - grpc_channel_credentials* channel_creds = - grpc_ssl_credentials_create(test_root_cert, nullptr, nullptr, nullptr); - grpc_call_credentials* call_creds = - grpc_access_token_credentials_create(token, nullptr); - grpc_channel_credentials* composite_creds = - grpc_composite_channel_credentials_create(channel_creds, call_creds, - nullptr); - grpc_channel_credentials_release(channel_creds); - grpc_call_credentials_release(call_creds); - return composite_creds; -} - -grpc_server_credentials* create_test_ssl_server_creds() { - grpc_ssl_pem_key_cert_pair pem_cert_key_pair = {test_server1_key, - test_server1_cert}; - return grpc_ssl_server_credentials_create_ex( - test_root_cert, &pem_cert_key_pair, 1, - GRPC_SSL_DONT_REQUEST_CLIENT_CERTIFICATE, nullptr); -} - -// Perform a simple RPC and capture the ASCII value of the -// authorization metadata sent to the server, if any. Return -// nullptr if no authorization metadata was sent to the server. -grpc_core::UniquePtr perform_call_and_get_authorization_header( - grpc_channel_credentials* channel_creds) { - // Create a new channel and call - grpc_core::UniquePtr server_addr = nullptr; - grpc_core::JoinHostPort(&server_addr, "localhost", g_port); - grpc_arg ssl_name_override = { - GRPC_ARG_STRING, - const_cast(GRPC_SSL_TARGET_NAME_OVERRIDE_ARG), - {const_cast("foo.test.google.fr")}}; - grpc_channel_args* channel_args = - grpc_channel_args_copy_and_add(nullptr, &ssl_name_override, 1); - grpc_channel* channel = grpc_secure_channel_create( - channel_creds, server_addr.get(), channel_args, nullptr); - grpc_channel_args_destroy(channel_args); - grpc_call* c; - grpc_call* s; - cq_verifier* cqv = cq_verifier_create(g_cq); - grpc_op ops[6]; - grpc_op* op; - grpc_metadata_array initial_metadata_recv; - grpc_metadata_array trailing_metadata_recv; - grpc_metadata_array request_metadata_recv; - grpc_call_details call_details; - grpc_status_code status; - grpc_call_error error; - grpc_slice details; - gpr_timespec deadline = grpc_timeout_seconds_to_deadline(5); - grpc_slice request_payload_slice = grpc_slice_from_copied_string("request"); - grpc_byte_buffer* request_payload = - grpc_raw_byte_buffer_create(&request_payload_slice, 1); - grpc_slice response_payload_slice = grpc_slice_from_copied_string("response"); - grpc_byte_buffer* response_payload = - grpc_raw_byte_buffer_create(&response_payload_slice, 1); - grpc_byte_buffer* request_payload_recv = nullptr; - grpc_byte_buffer* response_payload_recv = nullptr; - // Start a call - c = grpc_channel_create_call(channel, nullptr, GRPC_PROPAGATE_DEFAULTS, g_cq, - grpc_slice_from_static_string("/foo"), nullptr, - deadline, nullptr); - GPR_ASSERT(c); - grpc_metadata_array_init(&initial_metadata_recv); - grpc_metadata_array_init(&trailing_metadata_recv); - grpc_metadata_array_init(&request_metadata_recv); - grpc_call_details_init(&call_details); - memset(ops, 0, sizeof(ops)); - op = ops; - op->op = GRPC_OP_SEND_INITIAL_METADATA; - op->data.send_initial_metadata.count = 0; - op->flags = 0; - op->reserved = nullptr; - op++; - op->op = GRPC_OP_SEND_MESSAGE; - op->data.send_message.send_message = request_payload; - op->flags = 0; - op->reserved = nullptr; - op->op = GRPC_OP_SEND_CLOSE_FROM_CLIENT; - op->flags = 0; - op->reserved = nullptr; - op++; - op->op = GRPC_OP_RECV_INITIAL_METADATA; - op->data.recv_initial_metadata.recv_initial_metadata = &initial_metadata_recv; - op->flags = 0; - op->reserved = nullptr; - op++; - op->op = GRPC_OP_RECV_MESSAGE; - op->data.recv_message.recv_message = &response_payload_recv; - op->op = GRPC_OP_RECV_STATUS_ON_CLIENT; - op->data.recv_status_on_client.trailing_metadata = &trailing_metadata_recv; - op->data.recv_status_on_client.status = &status; - op->data.recv_status_on_client.status_details = &details; - op->flags = 0; - op->reserved = nullptr; - op++; - error = grpc_call_start_batch(c, ops, static_cast(op - ops), tag(1), - nullptr); - GPR_ASSERT(GRPC_CALL_OK == error); - // Request a call on the server - error = - grpc_server_request_call(g_server, &s, &call_details, - &request_metadata_recv, g_cq, g_cq, tag(101)); - GPR_ASSERT(GRPC_CALL_OK == error); - CQ_EXPECT_COMPLETION(cqv, tag(101), 1); - cq_verify(cqv); - memset(ops, 0, sizeof(ops)); - op = ops; - op->op = GRPC_OP_SEND_INITIAL_METADATA; - op->data.send_initial_metadata.count = 0; - op->flags = 0; - op->reserved = nullptr; - op++; - op->op = GRPC_OP_SEND_MESSAGE; - op->data.send_message.send_message = response_payload; - op->flags = 0; - op->op = GRPC_OP_SEND_STATUS_FROM_SERVER; - op->data.send_status_from_server.trailing_metadata_count = 0; - op->data.send_status_from_server.status = GRPC_STATUS_OK; - op->flags = 0; - op->reserved = nullptr; - op++; - op->op = GRPC_OP_RECV_MESSAGE; - op->data.recv_message.recv_message = &request_payload_recv; - op->op = GRPC_OP_RECV_CLOSE_ON_SERVER; - op->flags = 0; - op->reserved = nullptr; - op++; - error = grpc_call_start_batch(s, ops, static_cast(op - ops), tag(102), - nullptr); - GPR_ASSERT(GRPC_CALL_OK == error); - CQ_EXPECT_COMPLETION(cqv, tag(102), 1); - CQ_EXPECT_COMPLETION(cqv, tag(1), 1); - cq_verify(cqv); - GPR_ASSERT(status == GRPC_STATUS_OK); - // Extract the ascii value of the authorization header, if present - grpc_core::UniquePtr authorization_header_val; - gpr_log(GPR_DEBUG, "RPC done. Now examine received metadata on server..."); - for (size_t i = 0; i < request_metadata_recv.count; i++) { - char* cur_key = - grpc_dump_slice(request_metadata_recv.metadata[i].key, GPR_DUMP_ASCII); - char* cur_val = grpc_dump_slice(request_metadata_recv.metadata[i].value, - GPR_DUMP_ASCII); - gpr_log(GPR_DEBUG, "key[%" PRIdPTR "]=%s val[%" PRIdPTR "]=%s", i, cur_key, - i, cur_val); - if (gpr_stricmp(cur_key, "authorization") == 0) { - // This test is broken if we found multiple authorization headers. - GPR_ASSERT(authorization_header_val == nullptr); - authorization_header_val.reset(gpr_strdup(cur_val)); - gpr_log(GPR_DEBUG, "Found authorization header: %s", - authorization_header_val.get()); - } - gpr_free(cur_key); - gpr_free(cur_val); - } - // cleanup - grpc_slice_unref(details); - grpc_metadata_array_destroy(&initial_metadata_recv); - grpc_metadata_array_destroy(&trailing_metadata_recv); - grpc_metadata_array_destroy(&request_metadata_recv); - grpc_call_details_destroy(&call_details); - grpc_byte_buffer_destroy(request_payload); - grpc_byte_buffer_destroy(response_payload); - grpc_byte_buffer_destroy(request_payload_recv); - grpc_byte_buffer_destroy(response_payload_recv); - grpc_call_unref(c); - grpc_call_unref(s); - cq_verifier_destroy(cqv); - grpc_channel_destroy(channel); - return authorization_header_val; -} - -void test_attach_and_get() { - grpc_channel_credentials* main_creds = - create_test_ssl_plus_token_channel_creds("main-auth-header"); - grpc_channel_credentials* foo_creds = - create_test_ssl_plus_token_channel_creds("foo-auth-header"); - grpc_channel_credentials* bar_creds = - create_test_ssl_plus_token_channel_creds("bar-auth-header"); - auto foo_key = grpc_core::UniquePtr(gpr_strdup("foo")); - GPR_ASSERT(grpc_channel_credentials_attach_credentials( - main_creds, foo_key.get(), foo_creds) == true); - auto bar_key = grpc_core::UniquePtr(gpr_strdup("bar")); - GPR_ASSERT(grpc_channel_credentials_attach_credentials( - main_creds, bar_key.get(), bar_creds) == true); - GPR_ASSERT(grpc_channel_credentials_attach_credentials(main_creds, "foo", - foo_creds) == false); - GPR_ASSERT(grpc_channel_credentials_attach_credentials(main_creds, "bar", - bar_creds) == false); - grpc_channel_credentials_release(foo_creds); - grpc_channel_credentials_release(bar_creds); - { - // Creds that send auth header with value "foo-auth-header" are attached on - // main creds under key "foo" - auto foo_auth_header = perform_call_and_get_authorization_header( - main_creds->get_control_plane_credentials("foo").get()); - GPR_ASSERT(foo_auth_header != nullptr && - gpr_stricmp(foo_auth_header.get(), "Bearer foo-auth-header") == - 0); - } - { - // Creds that send auth header with value "bar-auth-header" are attached on - // main creds under key "bar" - auto bar_auth_header = perform_call_and_get_authorization_header( - main_creds->get_control_plane_credentials("bar").get()); - GPR_ASSERT(bar_auth_header != nullptr && - gpr_stricmp(bar_auth_header.get(), "Bearer bar-auth-header") == - 0); - } - { - // Sanity check that the main creds themselves send an authorization header - // with value "main". - auto main_auth_header = - perform_call_and_get_authorization_header(main_creds); - GPR_ASSERT(main_auth_header != nullptr && - gpr_stricmp(main_auth_header.get(), "Bearer main-auth-header") == - 0); - } - { - // If a key isn't mapped in the per channel or global registries, then the - // credentials should be returned but with their per-call creds stripped. - // The end effect is that we shouldn't see any authorization metadata - // sent from client to server. - auto unmapped_auth_header = perform_call_and_get_authorization_header( - main_creds->get_control_plane_credentials("unmapped").get()); - GPR_ASSERT(unmapped_auth_header == nullptr); - } - grpc_channel_credentials_release(main_creds); -} - -void test_registering_same_creds_under_different_keys() { - grpc_channel_credentials* main_creds = - create_test_ssl_plus_token_channel_creds("main-auth-header"); - grpc_channel_credentials* foo_creds = - create_test_ssl_plus_token_channel_creds("foo-auth-header"); - auto foo_key = grpc_core::UniquePtr(gpr_strdup("foo")); - GPR_ASSERT(grpc_channel_credentials_attach_credentials( - main_creds, foo_key.get(), foo_creds) == true); - auto foo2_key = grpc_core::UniquePtr(gpr_strdup("foo2")); - GPR_ASSERT(grpc_channel_credentials_attach_credentials( - main_creds, foo2_key.get(), foo_creds) == true); - GPR_ASSERT(grpc_channel_credentials_attach_credentials(main_creds, "foo", - foo_creds) == false); - GPR_ASSERT(grpc_channel_credentials_attach_credentials(main_creds, "foo2", - foo_creds) == false); - grpc_channel_credentials_release(foo_creds); - { - // Access foo creds via foo - auto foo_auth_header = perform_call_and_get_authorization_header( - main_creds->get_control_plane_credentials("foo").get()); - GPR_ASSERT(foo_auth_header != nullptr && - gpr_stricmp(foo_auth_header.get(), "Bearer foo-auth-header") == - 0); - } - { - // Access foo creds via foo2 - auto foo_auth_header = perform_call_and_get_authorization_header( - main_creds->get_control_plane_credentials("foo2").get()); - GPR_ASSERT(foo_auth_header != nullptr && - gpr_stricmp(foo_auth_header.get(), "Bearer foo-auth-header") == - 0); - } - grpc_channel_credentials_release(main_creds); -} - -// Note that this test uses control plane creds registered in the global -// map. This global registration is done before this and any other -// test is invoked. -void test_attach_and_get_with_global_registry() { - grpc_channel_credentials* main_creds = - create_test_ssl_plus_token_channel_creds("main-auth-header"); - grpc_channel_credentials* global_override_creds = - create_test_ssl_plus_token_channel_creds("global-override-auth-header"); - grpc_channel_credentials* random_creds = - create_test_ssl_plus_token_channel_creds("random-auth-header"); - auto global_key = grpc_core::UniquePtr(gpr_strdup("global")); - GPR_ASSERT(grpc_channel_credentials_attach_credentials( - main_creds, global_key.get(), global_override_creds) == true); - GPR_ASSERT(grpc_channel_credentials_attach_credentials( - main_creds, "global", global_override_creds) == false); - grpc_channel_credentials_release(global_override_creds); - { - // The global registry should be used if a key isn't registered on the per - // channel registry - auto global_auth_header = perform_call_and_get_authorization_header( - random_creds->get_control_plane_credentials("global").get()); - GPR_ASSERT(global_auth_header != nullptr && - gpr_stricmp(global_auth_header.get(), - "Bearer global-auth-header") == 0); - } - { - // The per-channel registry should be preferred over the global registry - auto override_auth_header = perform_call_and_get_authorization_header( - main_creds->get_control_plane_credentials("global").get()); - GPR_ASSERT(override_auth_header != nullptr && - gpr_stricmp(override_auth_header.get(), - "Bearer global-override-auth-header") == 0); - } - { - // Sanity check that random creds themselves send authorization header with - // value "random". - auto random_auth_header = - perform_call_and_get_authorization_header(random_creds); - GPR_ASSERT(random_auth_header != nullptr && - gpr_stricmp(random_auth_header.get(), - "Bearer random-auth-header") == 0); - } - { - // If a key isn't mapped in the per channel or global registries, then the - // credentials should be returned but with their per-call creds stripped. - // The end effect is that we shouldn't see any authorization metadata - // sent from client to server. - auto unmapped_auth_header = perform_call_and_get_authorization_header( - random_creds->get_control_plane_credentials("unmapped").get()); - GPR_ASSERT(unmapped_auth_header == nullptr); - } - grpc_channel_credentials_release(main_creds); - grpc_channel_credentials_release(random_creds); -} - -} // namespace - -int main(int argc, char** argv) { - { - grpc::testing::TestEnvironment env(argc, argv); - grpc_init(); - // First setup a global server for all tests to use - g_cq = grpc_completion_queue_create_for_next(nullptr); - grpc_server_credentials* server_creds = create_test_ssl_server_creds(); - g_server = grpc_server_create(nullptr, nullptr); - g_port = grpc_pick_unused_port_or_die(); - grpc_server_register_completion_queue(g_server, g_cq, nullptr); - grpc_core::UniquePtr localaddr; - grpc_core::JoinHostPort(&localaddr, "localhost", g_port); - GPR_ASSERT(grpc_server_add_secure_http2_port(g_server, localaddr.get(), - server_creds)); - grpc_server_credentials_release(server_creds); - grpc_server_start(g_server); - { - // First, Register one channel creds in the global registry; all tests - // will have access. - grpc_channel_credentials* global_creds = - create_test_ssl_plus_token_channel_creds("global-auth-header"); - auto global_key = grpc_core::UniquePtr(gpr_strdup("global")); - GPR_ASSERT(grpc_control_plane_credentials_register(global_key.get(), - global_creds) == true); - GPR_ASSERT(grpc_control_plane_credentials_register( - "global", global_creds) == false); - grpc_channel_credentials_release(global_creds); - } - // Run tests - { - test_attach_and_get(); - test_registering_same_creds_under_different_keys(); - test_attach_and_get_with_global_registry(); - } - // cleanup - grpc_completion_queue* shutdown_cq = - grpc_completion_queue_create_for_pluck(nullptr); - grpc_server_shutdown_and_notify(g_server, shutdown_cq, tag(1000)); - GPR_ASSERT(grpc_completion_queue_pluck(shutdown_cq, tag(1000), - grpc_timeout_seconds_to_deadline(5), - nullptr) - .type == GRPC_OP_COMPLETE); - grpc_server_destroy(g_server); - grpc_completion_queue_shutdown(shutdown_cq); - grpc_completion_queue_destroy(shutdown_cq); - grpc_completion_queue_shutdown(g_cq); - drain_cq(g_cq); - grpc_completion_queue_destroy(g_cq); - grpc_shutdown(); - } - { - grpc::testing::TestEnvironment env(argc, argv); - grpc_init(); - // The entries in the global registry must still persist through - // a full shutdown and restart of the library. - grpc_channel_credentials* global_creds = - create_test_ssl_plus_token_channel_creds("global-auth-header"); - auto global_key = grpc_core::UniquePtr(gpr_strdup("global")); - GPR_ASSERT(grpc_control_plane_credentials_register(global_key.get(), - global_creds) == false); - grpc_channel_credentials_release(global_creds); - // Sanity check that unmapped authorities can still register in - // the global registry. - grpc_channel_credentials* global_creds_2 = - create_test_ssl_plus_token_channel_creds("global-auth-header"); - GPR_ASSERT(grpc_control_plane_credentials_register("global_2", - global_creds_2) == true); - GPR_ASSERT(grpc_control_plane_credentials_register( - "global_2", global_creds_2) == false); - grpc_channel_credentials_release(global_creds_2); - grpc_shutdown(); - } - return 0; -} diff --git a/test/core/slice/percent_decode_fuzzer.cc b/test/core/slice/percent_decode_fuzzer.cc index 5f0de7293fe..7e62ed136a9 100644 --- a/test/core/slice/percent_decode_fuzzer.cc +++ b/test/core/slice/percent_decode_fuzzer.cc @@ -24,7 +24,6 @@ #include #include -#include "src/core/lib/security/credentials/credentials.h" #include "src/core/lib/slice/percent_encoding.h" bool squelch = true; @@ -32,7 +31,6 @@ bool leak_check = true; extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { grpc_init(); - grpc_test_only_control_plane_credentials_force_init(); grpc_slice input = grpc_slice_from_copied_buffer((const char*)data, size); grpc_slice output; if (grpc_strict_percent_decode_slice( @@ -45,7 +43,6 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { } grpc_slice_unref(grpc_permissive_percent_decode_slice(input)); grpc_slice_unref(input); - grpc_test_only_control_plane_credentials_destroy(); grpc_shutdown_blocking(); return 0; } diff --git a/test/core/slice/percent_encode_fuzzer.cc b/test/core/slice/percent_encode_fuzzer.cc index a028013f064..10239784139 100644 --- a/test/core/slice/percent_encode_fuzzer.cc +++ b/test/core/slice/percent_encode_fuzzer.cc @@ -24,7 +24,6 @@ #include #include -#include "src/core/lib/security/credentials/credentials.h" #include "src/core/lib/slice/percent_encoding.h" bool squelch = true; @@ -32,7 +31,6 @@ bool leak_check = true; static void test(const uint8_t* data, size_t size, const uint8_t* dict) { grpc_init(); - grpc_test_only_control_plane_credentials_force_init(); grpc_slice input = grpc_slice_from_copied_buffer(reinterpret_cast(data), size); grpc_slice output = grpc_percent_encode_slice(input, dict); @@ -48,7 +46,6 @@ static void test(const uint8_t* data, size_t size, const uint8_t* dict) { grpc_slice_unref(output); grpc_slice_unref(decoded_output); grpc_slice_unref(permissive_decoded_output); - grpc_test_only_control_plane_credentials_destroy(); grpc_shutdown_blocking(); } diff --git a/tools/run_tests/generated/tests.json b/tools/run_tests/generated/tests.json index 16ec891f747..b2d5d88c2f1 100644 --- a/tools/run_tests/generated/tests.json +++ b/tools/run_tests/generated/tests.json @@ -881,30 +881,6 @@ ], "uses_polling": true }, - { - "args": [], - "benchmark": false, - "ci_platforms": [ - "linux", - "mac", - "posix", - "windows" - ], - "cpu_cost": 1.0, - "exclude_configs": [], - "exclude_iomgrs": [], - "flaky": false, - "gtest": false, - "language": "c", - "name": "control_plane_credentials_test", - "platforms": [ - "linux", - "mac", - "posix", - "windows" - ], - "uses_polling": true - }, { "args": [], "benchmark": false, From c1953880f7111f2106e986088d097ad98ea74343 Mon Sep 17 00:00:00 2001 From: Richard Belleville Date: Thu, 2 Apr 2020 00:35:31 -0700 Subject: [PATCH 339/758] Modify tests accordingly --- .../grpcio_tests/tests/protoc_plugin/_python_plugin_test.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/python/grpcio_tests/tests/protoc_plugin/_python_plugin_test.py b/src/python/grpcio_tests/tests/protoc_plugin/_python_plugin_test.py index 94ffecc63f0..634117b1b07 100644 --- a/src/python/grpcio_tests/tests/protoc_plugin/_python_plugin_test.py +++ b/src/python/grpcio_tests/tests/protoc_plugin/_python_plugin_test.py @@ -504,7 +504,8 @@ class PythonPluginTest(unittest.TestCase): service.server.stop(None) -@unittest.skipIf(sys.version_info[0] < 3, "Unsupported on Python 2.") +@unittest.skipIf(sys.version_info[0] < 3 or sys.version_info[1] < 6, + "Unsupported on Python 2.") class SimpleStubsPluginTest(unittest.TestCase): servicer_methods = _ServicerMethods() From a483a6320efd46b60500552c9de21466276fd834 Mon Sep 17 00:00:00 2001 From: "Mark D. Roth" Date: Thu, 2 Apr 2020 10:12:11 -0700 Subject: [PATCH 340/758] Fix compression fuzzers. --- test/core/compression/message_compress_fuzzer.cc | 2 -- test/core/compression/message_decompress_fuzzer.cc | 2 -- test/core/compression/stream_compression_fuzzer.cc | 2 -- test/core/compression/stream_decompression_fuzzer.cc | 2 -- 4 files changed, 8 deletions(-) diff --git a/test/core/compression/message_compress_fuzzer.cc b/test/core/compression/message_compress_fuzzer.cc index 1ea0853d2a3..aa844b7b864 100644 --- a/test/core/compression/message_compress_fuzzer.cc +++ b/test/core/compression/message_compress_fuzzer.cc @@ -39,7 +39,6 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { grpc_core::testing::LeakDetector leak_detector(true); grpc_init(); - grpc_test_only_control_plane_credentials_force_init(); grpc_slice_buffer input_buffer; grpc_slice_buffer_init(&input_buffer); grpc_slice_buffer_add(&input_buffer, @@ -52,7 +51,6 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { grpc_slice_buffer_destroy(&input_buffer); grpc_slice_buffer_destroy(&output_buffer); - grpc_test_only_control_plane_credentials_destroy(); grpc_shutdown_blocking(); return 0; } diff --git a/test/core/compression/message_decompress_fuzzer.cc b/test/core/compression/message_decompress_fuzzer.cc index c600a740782..3f316699a79 100644 --- a/test/core/compression/message_decompress_fuzzer.cc +++ b/test/core/compression/message_decompress_fuzzer.cc @@ -39,7 +39,6 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { grpc_core::testing::LeakDetector leak_detector(true); grpc_init(); - grpc_test_only_control_plane_credentials_force_init(); grpc_slice_buffer input_buffer; grpc_slice_buffer_init(&input_buffer); grpc_slice_buffer_add(&input_buffer, @@ -52,7 +51,6 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { grpc_slice_buffer_destroy(&input_buffer); grpc_slice_buffer_destroy(&output_buffer); - grpc_test_only_control_plane_credentials_destroy(); grpc_shutdown_blocking(); return 0; } diff --git a/test/core/compression/stream_compression_fuzzer.cc b/test/core/compression/stream_compression_fuzzer.cc index c147aa5bfd6..c8316084f1b 100644 --- a/test/core/compression/stream_compression_fuzzer.cc +++ b/test/core/compression/stream_compression_fuzzer.cc @@ -31,7 +31,6 @@ bool leak_check = true; extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { grpc_core::testing::LeakDetector leak_detector(true); grpc_init(); - grpc_test_only_control_plane_credentials_force_init(); auto* context = grpc_stream_compression_context_create( GRPC_STREAM_COMPRESSION_GZIP_COMPRESS); grpc_slice_buffer input_buffer; @@ -48,7 +47,6 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { grpc_stream_compression_context_destroy(context); grpc_slice_buffer_destroy(&input_buffer); grpc_slice_buffer_destroy(&output_buffer); - grpc_test_only_control_plane_credentials_destroy(); grpc_shutdown_blocking(); return 0; } diff --git a/test/core/compression/stream_decompression_fuzzer.cc b/test/core/compression/stream_decompression_fuzzer.cc index e460e6db25f..78c8efd47fd 100644 --- a/test/core/compression/stream_decompression_fuzzer.cc +++ b/test/core/compression/stream_decompression_fuzzer.cc @@ -31,7 +31,6 @@ bool leak_check = true; extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { grpc_core::testing::LeakDetector leak_detector(true); grpc_init(); - grpc_test_only_control_plane_credentials_force_init(); auto* context = grpc_stream_compression_context_create( GRPC_STREAM_COMPRESSION_GZIP_DECOMPRESS); grpc_slice_buffer input_buffer; @@ -49,7 +48,6 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { grpc_stream_compression_context_destroy(context); grpc_slice_buffer_destroy(&input_buffer); grpc_slice_buffer_destroy(&output_buffer); - grpc_test_only_control_plane_credentials_destroy(); grpc_shutdown_blocking(); return 0; } From d18091014c9c8e23bd31026bf4a3408764eb38b1 Mon Sep 17 00:00:00 2001 From: Muxi Yan Date: Thu, 2 Apr 2020 12:18:49 -0700 Subject: [PATCH 341/758] Mark completion_queue_threading_test flaky --- test/core/surface/BUILD | 1 + 1 file changed, 1 insertion(+) diff --git a/test/core/surface/BUILD b/test/core/surface/BUILD index ad36d1c40a6..58087f518d7 100644 --- a/test/core/surface/BUILD +++ b/test/core/surface/BUILD @@ -55,6 +55,7 @@ grpc_cc_test( grpc_cc_test( name = "completion_queue_threading_test", srcs = ["completion_queue_threading_test.cc"], + flaky = True, language = "C++", deps = [ "//:gpr", From 9a9fe5b3619a9947ab8e58a4f7a7314f6d4b7be1 Mon Sep 17 00:00:00 2001 From: Muxi Yan Date: Thu, 2 Apr 2020 12:27:39 -0700 Subject: [PATCH 342/758] build_projects --- Makefile | 2 -- build_autogenerated.yaml | 1 + tools/run_tests/generated/tests.json | 24 ------------------------ 3 files changed, 1 insertion(+), 26 deletions(-) diff --git a/Makefile b/Makefile index 08ee1cbe217..0d433070f53 100644 --- a/Makefile +++ b/Makefile @@ -1916,8 +1916,6 @@ test_c: buildtests_c $(Q) $(BINDIR)/$(CONFIG)/cmdline_test || ( echo test cmdline_test failed ; exit 1 ) $(E) "[RUN] Testing combiner_test" $(Q) $(BINDIR)/$(CONFIG)/combiner_test || ( echo test combiner_test failed ; exit 1 ) - $(E) "[RUN] Testing completion_queue_threading_test" - $(Q) $(BINDIR)/$(CONFIG)/completion_queue_threading_test || ( echo test completion_queue_threading_test failed ; exit 1 ) $(E) "[RUN] Testing compression_test" $(Q) $(BINDIR)/$(CONFIG)/compression_test || ( echo test compression_test failed ; exit 1 ) $(E) "[RUN] Testing concurrent_connectivity_test" diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml index 14daa48e2b7..f51c2d1aa2a 100644 --- a/build_autogenerated.yaml +++ b/build_autogenerated.yaml @@ -3094,6 +3094,7 @@ targets: - mac - name: completion_queue_threading_test build: test + run: false language: c headers: [] src: diff --git a/tools/run_tests/generated/tests.json b/tools/run_tests/generated/tests.json index 16ec891f747..264603dd1cd 100644 --- a/tools/run_tests/generated/tests.json +++ b/tools/run_tests/generated/tests.json @@ -785,30 +785,6 @@ ], "uses_polling": true }, - { - "args": [], - "benchmark": false, - "ci_platforms": [ - "linux", - "mac", - "posix", - "windows" - ], - "cpu_cost": 1.0, - "exclude_configs": [], - "exclude_iomgrs": [], - "flaky": false, - "gtest": false, - "language": "c", - "name": "completion_queue_threading_test", - "platforms": [ - "linux", - "mac", - "posix", - "windows" - ], - "uses_polling": true - }, { "args": [], "benchmark": false, From 0f47005ad61f6e932769c424f1ebe3be222d674d Mon Sep 17 00:00:00 2001 From: Nicolas Noble Date: Thu, 2 Apr 2020 12:47:01 -0700 Subject: [PATCH 343/758] Removing obsolete comment. --- tools/bazel.rc | 3 --- 1 file changed, 3 deletions(-) diff --git a/tools/bazel.rc b/tools/bazel.rc index 6dbcc273223..b27d9cb0675 100644 --- a/tools/bazel.rc +++ b/tools/bazel.rc @@ -1,7 +1,4 @@ # bazelrc file -# bazel >= 0.18 looks for %workspace%/.bazelrc (which redirects here) -# Older bazel versions look for %workspace%/tools/bazel.rc (this file) -# See https://github.com/bazelbuild/bazel/issues/6319 build --client_env=CC=clang build --copt=-DGRPC_BAZEL_BUILD From 8e188e65400b4b0a4c1fa911ce0c0ff46791d140 Mon Sep 17 00:00:00 2001 From: Donna Dionne Date: Thu, 2 Apr 2020 13:13:00 -0700 Subject: [PATCH 344/758] Addressing code review changes (before writing new test) --- .../lb_policy/xds/xds_routing.cc | 266 ++++++++++-------- .../ext/filters/client_channel/xds/xds_api.cc | 14 +- .../ext/filters/client_channel/xds/xds_api.h | 3 +- .../filters/client_channel/xds/xds_client.cc | 108 +++---- 4 files changed, 219 insertions(+), 172 deletions(-) diff --git a/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc b/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc index f23db70bdb4..703f670186f 100644 --- a/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc +++ b/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc @@ -50,15 +50,17 @@ constexpr char kXdsRouting[] = "xds_routing_experimental"; // Config for xds_routing LB policy. class XdsRoutingLbConfig : public LoadBalancingPolicy::Config { public: - struct ChildConfig { - RefCountedPtr config; - }; struct Matcher { std::string service; std::string method; }; - using RouteTable = std::vector>; - using ActionMap = std::map; + struct Route { + Matcher matcher; + std::string action; + }; + using RouteTable = std::vector; + using ActionMap = + std::map>; XdsRoutingLbConfig(ActionMap action_map, RouteTable route_table) : action_map_(std::move(action_map)), @@ -95,7 +97,7 @@ class XdsRoutingLb : public LoadBalancingPolicy { : name_(std::move(name)), picker_(std::move(picker)) {} PickResult Pick(PickArgs args) { return picker_->Pick(std::move(args)); } - const std::string& name() { return name_; } + const std::string& name() const { return name_; } private: std::string name_; @@ -114,7 +116,7 @@ class XdsRoutingLb : public LoadBalancingPolicy { // Maintains an ordered xds route table as provided by RDS response. using RouteTable = std::vector; - RoutePicker(RouteTable route_table) + explicit RoutePicker(RouteTable route_table) : route_table_(std::move(route_table)) {} PickResult Pick(PickArgs args) override; @@ -132,7 +134,7 @@ class XdsRoutingLb : public LoadBalancingPolicy { void Orphan() override; - void UpdateLocked(const XdsRoutingLbConfig::ChildConfig& config, + void UpdateLocked(RefCountedPtr config, const ServerAddressList& addresses, const grpc_channel_args* args); void ExitIdleLocked(); @@ -221,18 +223,24 @@ XdsRoutingLb::PickResult XdsRoutingLb::RoutePicker::Pick(PickArgs args) { break; } } - std::vector v = absl::StrSplit(path.substr(1), '/'); - for (int i = 0; i < route_table_.size(); ++i) { - if (v[0] == route_table_[i].matcher.service && - ("" == route_table_[i].matcher.method || - v[1] == route_table_[i].matcher.method)) { - auto picker = route_table_[i].picker; - if (picker != nullptr) { - return picker.get()->Pick(args); - } + std::vector path_elements = + absl::StrSplit(path.substr(1), '/'); + for (const Route& route : route_table_) { + if ((path_elements[0] == route.matcher.service && + (path_elements[1] == route.matcher.method || + "" == route.matcher.method)) || + ("" == route.matcher.service && "" == route.matcher.method)) { + return route.picker.get()->Pick(args); } } - return route_table_[route_table_.size() - 1].picker.get()->Pick(args); + PickResult result; + result.type = PickResult::PICK_FAILED; + result.error = + grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "xds routing picker not given any picker; default " + "route not configured"), + GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_INTERNAL); + return result; } // @@ -294,7 +302,7 @@ void XdsRoutingLb::UpdateLocked(UpdateArgs args) { // Add or update the actions in the new config. for (const auto& p : config_->action_map()) { const std::string& name = p.first; - const XdsRoutingLbConfig::ChildConfig& config = p.second; + RefCountedPtr config = p.second; auto it = actions_.find(name); if (it == actions_.end()) { it = actions_.emplace(std::make_pair(name, nullptr)).first; @@ -306,9 +314,9 @@ void XdsRoutingLb::UpdateLocked(UpdateArgs args) { } void XdsRoutingLb::UpdateStateLocked() { - std::map> picker_map; // Also count the number of children in each state, to determine the // overall state. + size_t num_ready = 0; size_t num_connecting = 0; size_t num_idle = 0; size_t num_transient_failures = 0; @@ -321,7 +329,7 @@ void XdsRoutingLb::UpdateStateLocked() { } switch (child->connectivity_state()) { case GRPC_CHANNEL_READY: { - picker_map[child_name] = child->picker_wrapper(); + ++num_ready; break; } case GRPC_CHANNEL_CONNECTING: { @@ -342,7 +350,7 @@ void XdsRoutingLb::UpdateStateLocked() { } // Determine aggregated connectivity state. grpc_connectivity_state connectivity_state; - if (picker_map.size() > 0) { + if (num_ready > 0) { connectivity_state = GRPC_CHANNEL_READY; } else if (num_connecting > 0) { connectivity_state = GRPC_CHANNEL_CONNECTING; @@ -356,20 +364,30 @@ void XdsRoutingLb::UpdateStateLocked() { ConnectivityStateName(connectivity_state)); } std::unique_ptr picker; - RoutePicker::RouteTable route_table; switch (connectivity_state) { - case GRPC_CHANNEL_READY: + case GRPC_CHANNEL_READY: { + RoutePicker::RouteTable route_table; for (int i = 0; i < config_->route_table().size(); ++i) { RoutePicker::Route route; - route.matcher = config_->route_table()[i].first; - auto child_picker = picker_map.find(config_->route_table()[i].second); - if (child_picker != picker_map.end()) { - route.picker = child_picker->second; + route.matcher = config_->route_table()[i].matcher; + auto it = actions_.find(config_->route_table()[i].action); + if (it != actions_.end()) { + route.picker = it->second->picker_wrapper(); + } else { + gpr_log(GPR_INFO, + "[xds_routing_lb %p] child policy may have mis-behaved and " + "did not return a picker, creating a QueuePicker for %s", + this, config_->route_table()[i].action.c_str()); + route.picker = MakeRefCounted( + config_->route_table()[i].action, + absl::make_unique( + Ref(DEBUG_LOCATION, "QueuePicker"))); } route_table.push_back(std::move(route)); } picker = absl::make_unique(std::move(route_table)); break; + } case GRPC_CHANNEL_CONNECTING: case GRPC_CHANNEL_IDLE: picker = @@ -452,7 +470,7 @@ XdsRoutingLb::XdsRoutingChild::CreateChildPolicyLocked( } void XdsRoutingLb::XdsRoutingChild::UpdateLocked( - const XdsRoutingLbConfig::ChildConfig& config, + RefCountedPtr config, const ServerAddressList& addresses, const grpc_channel_args* args) { if (xds_routing_policy_->shutting_down_) return; // Update child weight. @@ -467,7 +485,7 @@ void XdsRoutingLb::XdsRoutingChild::UpdateLocked( } // Construct update args. UpdateArgs update_args; - update_args.config = config.config; + update_args.config = config; update_args.addresses = addresses; update_args.args = grpc_channel_args_copy(args); // Update the policy. @@ -538,8 +556,10 @@ void XdsRoutingLb::XdsRoutingChild::Helper::UpdateState( grpc_connectivity_state state, std::unique_ptr picker) { if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_routing_lb_trace)) { gpr_log(GPR_INFO, - "XdsRoutingChild::Helper::UpdateState child %s, state %d, piker %p", - xds_routing_child_->name_.c_str(), state, picker.get()); + "[xds_routing_lb %p] child %s: received update: state=%s picker=%p", + xds_routing_child_->xds_routing_policy_.get(), + xds_routing_child_->name_.c_str(), ConnectivityStateName(state), + picker.get()); } if (xds_routing_child_->xds_routing_policy_->shutting_down_) return; // Cache the picker in the XdsRoutingChild. @@ -604,6 +624,7 @@ class XdsRoutingLbFactory : public LoadBalancingPolicyFactory { std::vector error_list; // action map. XdsRoutingLbConfig::ActionMap action_map; + std::set action_in_use_set; auto it = json.object_value().find("actions"); if (it == json.object_value().end()) { error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( @@ -613,7 +634,7 @@ class XdsRoutingLbFactory : public LoadBalancingPolicyFactory { "field:actions error:type should be object")); } else { for (const auto& p : it->second.object_value()) { - XdsRoutingLbConfig::ChildConfig child_config; + RefCountedPtr child_config; std::vector child_errors = ParseChildConfig(p.second, &child_config); if (!child_errors.empty()) { @@ -630,6 +651,10 @@ class XdsRoutingLbFactory : public LoadBalancingPolicyFactory { } } } + if (action_map.size() == 0) { + error_list.push_back( + GRPC_ERROR_CREATE_FROM_COPIED_STRING("no valid actions configured")); + } XdsRoutingLbConfig::RouteTable route_table; it = json.object_value().find("routes"); if (it == json.object_value().end()) { @@ -639,36 +664,76 @@ class XdsRoutingLbFactory : public LoadBalancingPolicyFactory { error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( "field:routes error:type should be array")); } else { - for (const auto& route : it->second.array_value()) { - // Parse methodName. - XdsRoutingLbConfig::Matcher matcher; - std::vector route_errors = - ParseRouteConfig(route.object_value(), &matcher); - if (!route_errors.empty()) { - // Can't use GRPC_ERROR_CREATE_FROM_VECTOR() here, because the error - // string is not static in this case. - grpc_error* error = - GRPC_ERROR_CREATE_FROM_COPIED_STRING("field:routes error"); - for (grpc_error* route_error : route_errors) { - error = grpc_error_add_child(error, route_error); + const Json::Array& array = it->second.array_value(); + for (size_t i = 0; i < array.size(); ++i) { + const Json& element = array[i]; + if (element.type() != Json::Type::OBJECT) { + error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + absl::StrCat("filed: routes element: ", i, + " should be of type object") + .c_str())); + } else { + XdsRoutingLbConfig::Route route; + // Parse MethodName. + auto it = element.object_value().find("methodName"); + if (it == json.object_value().end()) { + error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + absl::StrCat("field:routes element: ", i, + " methodName is required") + .c_str())); + } else if (it->second.type() != Json::Type::OBJECT) { + error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + absl::StrCat("field:routes element: ", i, + " methodName type should be object") + .c_str())); + } else { + std::vector route_errors = + ParseRouteConfig(it->second, &route.matcher); + if (!route_errors.empty()) { + grpc_error* error = GRPC_ERROR_CREATE_FROM_COPIED_STRING( + absl::StrCat("field:routes element: ", i, " error").c_str()); + for (grpc_error* route_error : route_errors) { + error = grpc_error_add_child(error, route_error); + } + error_list.push_back(error); + } } - error_list.push_back(error); - } - // Parse action. - std::string cluster_name; - std::vector action_errors = - ParseActionConfig(route.object_value(), &cluster_name); - if (!action_errors.empty()) { - // Can't use GRPC_ERROR_CREATE_FROM_VECTOR() here, because the error - // string is not static in this case. - grpc_error* error = - GRPC_ERROR_CREATE_FROM_COPIED_STRING("field:actions error:"); - for (grpc_error* action_error : action_errors) { - error = grpc_error_add_child(error, action_error); + // Parse action. + it = element.object_value().find("action"); + if (it == json.object_value().end()) { + error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + absl::StrCat("field:routes element: ", i, " action is required") + .c_str())); + } else if (it->second.type() != Json::Type::STRING) { + error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + absl::StrCat("field:routes element: ", i, + " action type should be string") + .c_str())); + } else { + route.action = it->second.string_value(); } - error_list.push_back(error); + // Validate action exists and mark it as used. + if (action_map.find(route.action) == action_map.end()) { + grpc_error* error = GRPC_ERROR_CREATE_FROM_STATIC_STRING( + absl::StrCat("action ", route.action, " does not exist") + .c_str()); + error_list.push_back(error); + } else { + action_in_use_set.insert(route.action); + } + route_table.emplace_back(std::move(route)); } - route_table.emplace_back(std::move(matcher), std::move(cluster_name)); + } + } + if (route_table.size() == 0) { + grpc_error* error = + GRPC_ERROR_CREATE_FROM_STATIC_STRING("no valid routes configured"); + error_list.push_back(error); + } + for (const auto& action : action_map) { + if (action_in_use_set.find(action.first) == action_in_use_set.end()) { + error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + absl::StrCat("action ", action.first, " is never used").c_str())); } } if (!error_list.empty()) { @@ -682,7 +747,8 @@ class XdsRoutingLbFactory : public LoadBalancingPolicyFactory { private: static std::vector ParseChildConfig( - const Json& json, XdsRoutingLbConfig::ChildConfig* child_config) { + const Json& json, + RefCountedPtr* child_config) { std::vector error_list; if (json.type() != Json::Type::OBJECT) { error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( @@ -690,21 +756,20 @@ class XdsRoutingLbFactory : public LoadBalancingPolicyFactory { return error_list; } auto it = json.object_value().find("child_policy"); - if (it != json.object_value().end()) { + if (it == json.object_value().end()) { + error_list.push_back( + GRPC_ERROR_CREATE_FROM_STATIC_STRING("did not find childPolicy")); + } else { grpc_error* parse_error = GRPC_ERROR_NONE; - child_config->config = - LoadBalancingPolicyRegistry::ParseLoadBalancingConfig(it->second, - &parse_error); - if (child_config->config == nullptr) { + *child_config = LoadBalancingPolicyRegistry::ParseLoadBalancingConfig( + it->second, &parse_error); + if (*child_config == nullptr) { GPR_DEBUG_ASSERT(parse_error != GRPC_ERROR_NONE); std::vector child_errors; child_errors.push_back(parse_error); error_list.push_back( GRPC_ERROR_CREATE_FROM_VECTOR("field:childPolicy", &child_errors)); } - } else { - error_list.push_back( - GRPC_ERROR_CREATE_FROM_STATIC_STRING("did not find childPolicy")); } return error_list; } @@ -712,57 +777,32 @@ class XdsRoutingLbFactory : public LoadBalancingPolicyFactory { static std::vector ParseRouteConfig( const Json& json, XdsRoutingLbConfig::Matcher* route_config) { std::vector error_list; - if (json.type() != Json::Type::OBJECT) { - error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "value should be of type object")); - return error_list; - } - auto method_name = json.object_value().find("methodName"); - if (method_name == json.object_value().end()) { + // Parse service + auto it = json.object_value().find("service"); + if (it == json.object_value().end()) { error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "field:routes error:methodName is required")); - } else if (method_name->second.type() != Json::Type::OBJECT) { + "field:service error: required field not present")); + } else if (it->second.type() != Json::Type::STRING) { error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "field:routes error:methodName error: type should be object")); + "field:service error: should be string")); } else { - auto service = method_name->second.object_value().find("service"); - auto method = method_name->second.object_value().find("method"); - if (service != method_name->second.object_value().end()) { - route_config->service = service->second.string_value(); - } else { - route_config->service = ""; - } - if (method != method_name->second.object_value().end()) { - route_config->method = method->second.string_value(); - } else { - route_config->method = ""; - } - if ((route_config->service == "") && (route_config->method != "")) { - error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "field:methodName error: service is empty when method is " - "not")); - } + route_config->service = it->second.string_value(); } - return error_list; - } - - static std::vector ParseActionConfig(const Json& json, - std::string* cluster_name) { - std::vector error_list; - if (json.type() != Json::Type::OBJECT) { - error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "value should be of type object")); - return error_list; - } - auto action_name = json.object_value().find("action"); - if (action_name == json.object_value().end()) { + // Parse method + it = json.object_value().find("method"); + if (it == json.object_value().end()) { error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "field:routes error:action is required")); - } else if (action_name->second.type() != Json::Type::STRING) { + "field:method error: required field not present")); + } else if (it->second.type() != Json::Type::STRING) { error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "field:methodName error:type should be string")); + "field:method error: should be string")); } else { - *cluster_name = action_name->second.string_value(); + route_config->method = it->second.string_value(); + } + if (route_config->service == "" && route_config->method != "") { + error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "field:methodName error: service is empty when method is " + "not")); } return error_list; } diff --git a/src/core/ext/filters/client_channel/xds/xds_api.cc b/src/core/ext/filters/client_channel/xds/xds_api.cc index eca6f52a0df..2c18af46a16 100644 --- a/src/core/ext/filters/client_channel/xds/xds_api.cc +++ b/src/core/ext/filters/client_channel/xds/xds_api.cc @@ -1020,26 +1020,26 @@ grpc_error* RouteConfigParse( const upb_strview prefix = envoy_api_v2_route_RouteMatch_prefix(match); const upb_strview path = envoy_api_v2_route_RouteMatch_path(match); if (prefix.size > 0) { - std::vector v = absl::StrSplit( + std::vector prefix_elements = absl::StrSplit( absl::string_view(prefix.data, prefix.size).substr(1), '/'); - if (v.size() != 1) { + if (prefix_elements.size() != 1) { return GRPC_ERROR_CREATE_FROM_STATIC_STRING( "Prefix not in the required format of /service/"); } - rds_route.service = std::string(v[0].data(), v[0].size()); + rds_route.service = std::string(prefix_elements[0]); if (path.size > 0) { return GRPC_ERROR_CREATE_FROM_STATIC_STRING( "Prefix is not empty string, path cannot also be non-empty."); } } else if (path.size > 0) { - std::vector v = absl::StrSplit( + std::vector path_elements = absl::StrSplit( absl::string_view(path.data, path.size).substr(1), '/'); - if (v.size() != 2) { + if (path_elements.size() != 2) { return GRPC_ERROR_CREATE_FROM_STATIC_STRING( "Path not in the required format of /service/method"); } - rds_route.service = std::string(v[0].data(), v[0].size()); - rds_route.method = std::string(v[1].data(), v[1].size()); + rds_route.service = std::string(path_elements[0]); + rds_route.method = std::string(path_elements[1]); if (prefix.size > 0) { return GRPC_ERROR_CREATE_FROM_STATIC_STRING( "Path is not empty string, prefix cannot also be non-empty."); diff --git a/src/core/ext/filters/client_channel/xds/xds_api.h b/src/core/ext/filters/client_channel/xds/xds_api.h index dc42681ecb4..28b173f019e 100644 --- a/src/core/ext/filters/client_channel/xds/xds_api.h +++ b/src/core/ext/filters/client_channel/xds/xds_api.h @@ -50,8 +50,7 @@ class XdsApi { std::string cluster_name; bool operator==(const RdsRoute& other) const { - return (service == other.service && - method == other.method && + return (service == other.service && method == other.method && cluster_name == other.cluster_name); } }; diff --git a/src/core/ext/filters/client_channel/xds/xds_client.cc b/src/core/ext/filters/client_channel/xds/xds_client.cc index db5f33ecc7a..29ca7e78901 100644 --- a/src/core/ext/filters/client_channel/xds/xds_client.cc +++ b/src/core/ext/filters/client_channel/xds/xds_client.cc @@ -71,35 +71,6 @@ namespace grpc_core { TraceFlag grpc_xds_client_trace(false, "xds_client"); -namespace { - -std::string CreateServiceConfigActionCluster(const std::string& cluster_name) { - std::string json = absl::StrFormat( - " \"cds:%s\":{\n" - " \"child_policy\":[\n" - " { \"cds_experimental\":{\n" - " \"cluster\": \"%s\"\n" - " } }\n" - " ]\n" - " }", - cluster_name.c_str(), cluster_name.c_str()); - return json; -} - -std::string CreateServiceConfigRoute(const std::string& cluster_name, - const std::string& service, - const std::string& method) { - std::string json = absl::StrFormat( - " { \"methodName\":\n" - " { \"service\": \"%s\",\n" - " \"method\": \"%s\"},\n" - " \"action\": \"cds:%s\"\n" - " }", - service.c_str(), method.c_str(), cluster_name.c_str()); - return json; -} - -} // namespace // // Internal class declarations // @@ -934,7 +905,7 @@ void XdsClient::ChannelState::AdsCallState::AcceptLdsUpdate( if (lds_update->rds_update.has_value()) { for (const auto& route : lds_update->rds_update.value().routes) { gpr_log(GPR_INFO, - "Create service config using route: { service=\"%s\", " + " route: { service=\"%s\", " "method=\"%s\" }, cluster=\"%s\" }", route.service.c_str(), route.method.c_str(), route.cluster_name.c_str()); @@ -989,6 +960,16 @@ void XdsClient::ChannelState::AdsCallState::AcceptRdsUpdate( GRPC_ERROR_CREATE_FROM_STATIC_STRING( "RDS update does not include requested resource")); return; + } else { + if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) { + for (const auto& route : rds_update.value().routes) { + gpr_log(GPR_INFO, + " route: { service=\"%s\", " + "method=\"%s\" }, cluster=\"%s\" }", + route.service.c_str(), route.method.c_str(), + route.cluster_name.c_str()); + } + } } auto& rds_state = state_map_[XdsApi::kRdsTypeUrl]; auto& state = @@ -2065,27 +2046,55 @@ void XdsClient::ResetBackoff() { } } +namespace { +std::string CreateServiceConfigActionCluster(const std::string& cluster_name) { + std::string json = absl::StrFormat( + " \"cds:%s\":{\n" + " \"child_policy\":[ {\n" + " \"cds_experimental\":{\n" + " \"cluster\": \"%s\"\n" + " }\n" + " } ]\n" + " }", + cluster_name.c_str(), cluster_name.c_str()); + return json; +} + +std::string CreateServiceConfigRoute(const std::string& cluster_name, + const std::string& service, + const std::string& method) { + std::string json = absl::StrFormat( + " { \n" + " \"methodName\": {\n" + " \"service\": \"%s\",\n" + " \"method\": \"%s\"\n" + " },\n" + " \"action\": \"cds:%s\"\n" + " }", + service.c_str(), method.c_str(), cluster_name.c_str()); + return json; +} +} // namespace + grpc_error* XdsClient::CreateServiceConfig( const XdsApi::RdsUpdate& rds_update, RefCountedPtr* service_config) const { - std::vector v; - std::string json_start = - ("{\n" - " \"loadBalancingConfig\":[\n" - " { \"xds_routing_experimental\":{\n" - " \"actions\":{\n"); - v.push_back(std::move(json_start)); + std::vector config_parts; + config_parts.push_back( + "{\n" + " \"loadBalancingConfig\":[\n" + " { \"xds_routing_experimental\":{\n" + " \"actions\":{\n"); std::vector actions_vector; for (size_t i = 0; i < rds_update.routes.size(); ++i) { auto route = rds_update.routes[i]; actions_vector.push_back( CreateServiceConfigActionCluster(route.cluster_name.c_str())); } - v.push_back(absl::StrJoin(actions_vector, ",")); - std::string json_transition = - (" },\n" - " \"routes\":[\n"); - v.push_back(std::move(json_transition)); + config_parts.push_back(absl::StrJoin(actions_vector, ",\n")); + config_parts.push_back( + " },\n" + " \"routes\":[\n"); std::vector routes_vector; for (size_t i = 0; i < rds_update.routes.size(); ++i) { auto route_info = rds_update.routes[i]; @@ -2093,14 +2102,13 @@ grpc_error* XdsClient::CreateServiceConfig( route_info.cluster_name.c_str(), route_info.service.c_str(), route_info.method.c_str())); } - v.push_back(absl::StrJoin(routes_vector, ",")); - std::string json_end = - (" ]\n" - " } }\n" - " ]\n" - "}"); - v.push_back(std::move(json_end)); - std::string json = absl::StrJoin(v, ""); + config_parts.push_back(absl::StrJoin(routes_vector, ",\n")); + config_parts.push_back( + " ]\n" + " } }\n" + " ]\n" + "}"); + std::string json = absl::StrJoin(config_parts, ""); grpc_error* error = GRPC_ERROR_NONE; *service_config = ServiceConfig::Create(json.c_str(), &error); gpr_log(GPR_INFO, "Built service config: \"%s\"", From 86568c4de2d38e0ce1135e1e623b4a57b2700729 Mon Sep 17 00:00:00 2001 From: Eric Gribkoff Date: Thu, 2 Apr 2020 15:33:35 -0700 Subject: [PATCH 345/758] Update pip before installing grpcio --- tools/internal_ci/linux/grpc_xds_bazel_python_test_in_docker.sh | 1 + tools/internal_ci/linux/grpc_xds_bazel_test_in_docker.sh | 1 + tools/run_tests/helper_scripts/prep_xds.sh | 1 + 3 files changed, 3 insertions(+) diff --git a/tools/internal_ci/linux/grpc_xds_bazel_python_test_in_docker.sh b/tools/internal_ci/linux/grpc_xds_bazel_python_test_in_docker.sh index 8a1a200b249..6ed8856bf0d 100755 --- a/tools/internal_ci/linux/grpc_xds_bazel_python_test_in_docker.sh +++ b/tools/internal_ci/linux/grpc_xds_bazel_python_test_in_docker.sh @@ -25,6 +25,7 @@ cd /var/local/git/grpc VIRTUAL_ENV=$(mktemp -d) virtualenv "$VIRTUAL_ENV" PYTHON="$VIRTUAL_ENV"/bin/python +"$PYTHON" -m pip install --upgrade pip "$PYTHON" -m pip install --upgrade grpcio-tools google-api-python-client google-auth-httplib2 oauth2client # Prepare generated Python code. diff --git a/tools/internal_ci/linux/grpc_xds_bazel_test_in_docker.sh b/tools/internal_ci/linux/grpc_xds_bazel_test_in_docker.sh index 03587d76a0c..d0a1338817b 100755 --- a/tools/internal_ci/linux/grpc_xds_bazel_test_in_docker.sh +++ b/tools/internal_ci/linux/grpc_xds_bazel_test_in_docker.sh @@ -25,6 +25,7 @@ cd /var/local/git/grpc VIRTUAL_ENV=$(mktemp -d) virtualenv "$VIRTUAL_ENV" PYTHON="$VIRTUAL_ENV"/bin/python +"$PYTHON" -m pip install --upgrade pip "$PYTHON" -m pip install --upgrade grpcio grpcio-tools google-api-python-client google-auth-httplib2 oauth2client # Prepare generated Python code. diff --git a/tools/run_tests/helper_scripts/prep_xds.sh b/tools/run_tests/helper_scripts/prep_xds.sh index 9c3a67386ea..ab15e2eb1c8 100755 --- a/tools/run_tests/helper_scripts/prep_xds.sh +++ b/tools/run_tests/helper_scripts/prep_xds.sh @@ -19,6 +19,7 @@ set -ex cd "$(dirname "$0")/../../.." sudo apt-get install -y python3-pip +sudo python3 -m pip install --upgrade pip sudo python3 -m pip install grpcio grpcio-tools google-api-python-client google-auth-httplib2 oauth2client # Prepare generated Python code. From 23c32621d6336fa2540d1872e607b80d7594e059 Mon Sep 17 00:00:00 2001 From: Richard Belleville Date: Thu, 2 Apr 2020 15:36:07 -0700 Subject: [PATCH 346/758] Fix all_the_cpythons. Add 3.5 to defaults --- .../Dockerfile.template | 6 ++++- third_party/abseil-cpp | 2 +- .../python_stretch_default_x64/Dockerfile | 23 +++++++++++++++++++ tools/run_tests/run_tests.py | 1 + 4 files changed, 30 insertions(+), 2 deletions(-) diff --git a/templates/tools/dockerfile/test/python_stretch_default_x64/Dockerfile.template b/templates/tools/dockerfile/test/python_stretch_default_x64/Dockerfile.template index ccb88e75302..bb4a9f29c01 100644 --- a/templates/tools/dockerfile/test/python_stretch_default_x64/Dockerfile.template +++ b/templates/tools/dockerfile/test/python_stretch_default_x64/Dockerfile.template @@ -16,7 +16,11 @@ <%include file="../../python_stretch.include"/> <%include file="../../compile_python_36.include"/> - + <%include file="../../compile_python_38.include"/> + + RUN apt-get update && apt-get install -y python3.5 python3.5-dev + RUN curl https://bootstrap.pypa.io/get-pip.py | python3.5 + RUN apt-get update && apt-get -t buster install -y python3.7 python3-all-dev RUN curl https://bootstrap.pypa.io/get-pip.py | python3.7 diff --git a/third_party/abseil-cpp b/third_party/abseil-cpp index df3ea785d8c..b832dce8489 160000 --- a/third_party/abseil-cpp +++ b/third_party/abseil-cpp @@ -1 +1 @@ -Subproject commit df3ea785d8c30a9503321a3d35ee7d35808f190d +Subproject commit b832dce8489ef7b6231384909fd9b68d5a5ff2b7 diff --git a/tools/dockerfile/test/python_stretch_default_x64/Dockerfile b/tools/dockerfile/test/python_stretch_default_x64/Dockerfile index 9a1d6c09deb..713fd6fe230 100644 --- a/tools/dockerfile/test/python_stretch_default_x64/Dockerfile +++ b/tools/dockerfile/test/python_stretch_default_x64/Dockerfile @@ -84,6 +84,29 @@ RUN cd /tmp && \ RUN python3.6 -m ensurepip && \ python3.6 -m pip install coverage +#================= +# Compile CPython 3.8.0b4 from source + +RUN apt-get update && apt-get install -y zlib1g-dev libssl-dev +RUN apt-get update && apt-get install -y jq build-essential libffi-dev + +RUN cd /tmp && \ + wget -q https://www.python.org/ftp/python/3.8.0/Python-3.8.0b4.tgz && \ + tar xzvf Python-3.8.0b4.tgz && \ + cd Python-3.8.0b4 && \ + ./configure && \ + make install + +RUN cd /tmp && \ + echo "b8f4f897df967014ddb42033b90c3058 Python-3.8.0b4.tgz" > checksum.md5 && \ + md5sum -c checksum.md5 + +RUN python3.8 -m ensurepip && \ + python3.8 -m pip install coverage + + +RUN apt-get update && apt-get install -y python3.5 python3.5-dev +RUN curl https://bootstrap.pypa.io/get-pip.py | python3.5 RUN apt-get update && apt-get -t buster install -y python3.7 python3-all-dev RUN curl https://bootstrap.pypa.io/get-pip.py | python3.7 diff --git a/tools/run_tests/run_tests.py b/tools/run_tests/run_tests.py index a3d255110f0..8ed4c88f683 100755 --- a/tools/run_tests/run_tests.py +++ b/tools/run_tests/run_tests.py @@ -869,6 +869,7 @@ class PythonLanguage(object): else: return ( python27_config, + python35_config, python36_config, python37_config, ) From a39479ac2763815a93ee2649f26cd74855bb1c9f Mon Sep 17 00:00:00 2001 From: Eric Anderson Date: Thu, 2 Apr 2020 17:09:35 -0700 Subject: [PATCH 347/758] Add --bootstrap_file to run_xds_tests.py This allows using an external bootstrap generator. --- tools/run_tests/run_xds_tests.py | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/tools/run_tests/run_xds_tests.py b/tools/run_tests/run_xds_tests.py index c770f17d735..7fd0cfcc693 100755 --- a/tools/run_tests/run_xds_tests.py +++ b/tools/run_tests/run_xds_tests.py @@ -86,12 +86,17 @@ argp.add_argument( type=parse_test_cases, help='Comma-separated list of test cases to run, or \'all\' to run every ' 'test. Available tests: %s' % ' '.join(_TEST_CASES)) +argp.add_argument( + '--bootstrap_file', + default='', + help='File to reference via GRPC_XDS_BOOTSTRAP. Disables built-in ' + 'bootstrap generation') argp.add_argument( '--client_cmd', default=None, - help='Command to launch xDS test client. This script will fill in ' - '{server_uri}, {stats_port} and {qps} parameters using str.format(), and ' - 'generate the GRPC_XDS_BOOTSTRAP file.') + help='Command to launch xDS test client. {server_uri}, {stats_port} and ' + '{qps} references will be replaced using str.format(). GRPC_XDS_BOOTSTRAP ' + 'will be set for the command') argp.add_argument('--zone', default='us-central1-a') argp.add_argument('--secondary_zone', default='us-west1-b', @@ -1085,11 +1090,14 @@ try: server_uri = service_host_name else: server_uri = service_host_name + ':' + str(gcp.service_port) - with tempfile.NamedTemporaryFile(delete=False) as bootstrap_file: - bootstrap_file.write( - _BOOTSTRAP_TEMPLATE.format( - node_id=socket.gethostname()).encode('utf-8')) - bootstrap_path = bootstrap_file.name + if args.bootstrap_file: + bootstrap_path = os.path.abspath(args.bootstrap_file) + else: + with tempfile.NamedTemporaryFile(delete=False) as bootstrap_file: + bootstrap_file.write( + _BOOTSTRAP_TEMPLATE.format( + node_id=socket.gethostname()).encode('utf-8')) + bootstrap_path = bootstrap_file.name client_env = dict(os.environ, GRPC_XDS_BOOTSTRAP=bootstrap_path) client_cmd = shlex.split( args.client_cmd.format(server_uri=server_uri, From 80414f6cf847cf9351d6ee8f804ae6a34953e0ec Mon Sep 17 00:00:00 2001 From: Muxi Yan Date: Thu, 2 Apr 2020 17:13:51 -0700 Subject: [PATCH 348/758] Fix BoringSSL-GRPC template --- src/objective-c/BoringSSL-GRPC.podspec | 8 +++---- .../BoringSSL-GRPC.podspec.template | 23 +++++++++++-------- 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/src/objective-c/BoringSSL-GRPC.podspec b/src/objective-c/BoringSSL-GRPC.podspec index 0490b16a211..10ff1278c31 100644 --- a/src/objective-c/BoringSSL-GRPC.podspec +++ b/src/objective-c/BoringSSL-GRPC.podspec @@ -1629,11 +1629,11 @@ Pod::Spec.new do |s| # this moment. It has to be generated by BoringSSL's users and be injected to BoringSSL build. # gRPC generates this file in script /tools/distrib/upgrade_boringssl_objc.sh. This script # outputs a gzip+base64 encoded version of boringssl_prefix_symbols.h because of Cocoapods' - # limit on the 'prepare_command' field length. The encoded header is put at - # /src/boringssl/boringssl_prefix_symbols.h.gz.b64. Here we decode the content and inject - # the header to the correct location in BoringSSL. + # limit on the 'prepare_command' field length. The encoded header is generated from + # /src/boringssl/boringssl_prefix_symbols.h. Here we decode the content and inject the header to + # the correct location in BoringSSL. base64 -D < include/openssl/boringssl_prefix_symbols.h - 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 EOF # We are renaming openssl to openssl_grpc so that there is no conflict with openssl if it exists diff --git a/templates/src/objective-c/BoringSSL-GRPC.podspec.template b/templates/src/objective-c/BoringSSL-GRPC.podspec.template index beb053aace4..a875a5d2310 100644 --- a/templates/src/objective-c/BoringSSL-GRPC.podspec.template +++ b/templates/src/objective-c/BoringSSL-GRPC.podspec.template @@ -2,13 +2,16 @@ --- | <%! import subprocess, base64 - import gzip + import gzip, shutil, os + boringssl_commit = subprocess.check_output(['git', 'rev-parse', 'HEAD'], cwd='third_party/boringssl').decode().strip() - prefix_f = open("src/boringssl/boringssl_prefix_symbols.h", "rb") - prefix = prefix_f.read() - prefix_gzip = gzip.compress(prefix) - prefix_gzip_b64 = base64.b64encode(prefix_gzip) - prefix_f.close() + # TODO(mxyan): move to python3 style gzip compression when possible + with open('src/boringssl/boringssl_prefix_symbols.h', 'rb') as f_in, gzip.open('src/boringssl/boringssl_prefix_symbols.h.gz', 'wb') as f_out: + shutil.copyfileobj(f_in, f_out) + with open('src/boringssl/boringssl_prefix_symbols.h.gz', 'rb') as f_in: + prefix_gz = f_in.read() + os.remove('src/boringssl/boringssl_prefix_symbols.h.gz') + prefix_gz_b64 = base64.b64encode(prefix_gz) %> # This file has been automatically generated from a template file. @@ -236,11 +239,11 @@ # this moment. It has to be generated by BoringSSL's users and be injected to BoringSSL build. # gRPC generates this file in script /tools/distrib/upgrade_boringssl_objc.sh. This script # outputs a gzip+base64 encoded version of boringssl_prefix_symbols.h because of Cocoapods' - # limit on the 'prepare_command' field length. The encoded header is put at - # /src/boringssl/boringssl_prefix_symbols.h.gz.b64. Here we decode the content and inject - # the header to the correct location in BoringSSL. + # limit on the 'prepare_command' field length. The encoded header is generated from + # /src/boringssl/boringssl_prefix_symbols.h. Here we decode the content and inject the header to + # the correct location in BoringSSL. base64 -D < include/openssl/boringssl_prefix_symbols.h - ${prefix_gzip_b64} + ${prefix_gz_b64} EOF # We are renaming openssl to openssl_grpc so that there is no conflict with openssl if it exists From fca13200828ca20e3a1a19f9ba2dc13d5c436e5b Mon Sep 17 00:00:00 2001 From: Muxi Yan Date: Thu, 2 Apr 2020 17:21:29 -0700 Subject: [PATCH 349/758] Upgrade BoringSSL commit number --- src/objective-c/BoringSSL-GRPC.podspec | 2 +- templates/src/objective-c/BoringSSL-GRPC.podspec.template | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/objective-c/BoringSSL-GRPC.podspec b/src/objective-c/BoringSSL-GRPC.podspec index 10ff1278c31..548d4f64e09 100644 --- a/src/objective-c/BoringSSL-GRPC.podspec +++ b/src/objective-c/BoringSSL-GRPC.podspec @@ -41,7 +41,7 @@ Pod::Spec.new do |s| s.name = 'BoringSSL-GRPC' - version = '0.0.6' + version = '0.0.7' s.version = version s.summary = 'BoringSSL is a fork of OpenSSL that is designed to meet Google\'s needs.' # Adapted from the homepage: diff --git a/templates/src/objective-c/BoringSSL-GRPC.podspec.template b/templates/src/objective-c/BoringSSL-GRPC.podspec.template index a875a5d2310..62af7c931b5 100644 --- a/templates/src/objective-c/BoringSSL-GRPC.podspec.template +++ b/templates/src/objective-c/BoringSSL-GRPC.podspec.template @@ -55,7 +55,7 @@ Pod::Spec.new do |s| s.name = 'BoringSSL-GRPC' - version = '0.0.6' + version = '0.0.7' s.version = version s.summary = 'BoringSSL is a fork of OpenSSL that is designed to meet Google\'s needs.' # Adapted from the homepage: From 843efcf3a072b08a3fc077bba8c7e757267c07a3 Mon Sep 17 00:00:00 2001 From: Eric Gribkoff Date: Thu, 2 Apr 2020 16:12:23 -0700 Subject: [PATCH 350/758] Add param to echo captured client output in logs --- tools/run_tests/run_xds_tests.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/tools/run_tests/run_xds_tests.py b/tools/run_tests/run_xds_tests.py index c770f17d735..ee272632b85 100755 --- a/tools/run_tests/run_xds_tests.py +++ b/tools/run_tests/run_xds_tests.py @@ -169,6 +169,12 @@ argp.add_argument('--verbose', help='verbose log output', default=False, action='store_true') +# TODO(ericgribkoff) Remove this param once the sponge-formatted log files are +# visible in all test environments. +argp.add_argument('--log_client_output', + help='Log captured client output', + default=False, + action='store_true') args = argp.parse_args() if args.verbose: @@ -1103,7 +1109,8 @@ try: log_dir = os.path.join(_TEST_LOG_BASE_DIR, test_case) if not os.path.exists(log_dir): os.makedirs(log_dir) - test_log_file = open(os.path.join(log_dir, _SPONGE_LOG_NAME), 'w+') + test_log_filename = os.path.join(log_dir, _SPONGE_LOG_NAME) + test_log_file = open(test_log_filename, 'w+') client_process = None try: client_process = subprocess.Popen(client_cmd, @@ -1149,10 +1156,15 @@ try: finally: if client_process: client_process.terminate() + test_log_file.close() # Workaround for Python 3, as report_utils will invoke decode() on # result.message, which has a default value of ''. result.message = result.message.encode('UTF-8') test_results[test_case] = [result] + if args.log_client_output: + logger.info('Client output:') + with open(test_log_filename, 'r') as client_output: + logger.info(client_output.read()) if not os.path.exists(_TEST_LOG_BASE_DIR): os.makedirs(_TEST_LOG_BASE_DIR) report_utils.render_junit_xml_report(test_results, From 4ce897eddc994509f54ece9a478831ea276a2871 Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Thu, 2 Apr 2020 18:54:18 -0700 Subject: [PATCH 351/758] C++ize message compress filter --- .../message_compress_filter.cc | 458 ++++++++++-------- 1 file changed, 244 insertions(+), 214 deletions(-) diff --git a/src/core/ext/filters/http/message_compress/message_compress_filter.cc b/src/core/ext/filters/http/message_compress/message_compress_filter.cc index 27f0333bee4..fcee54ebfe3 100644 --- a/src/core/ext/filters/http/message_compress/message_compress_filter.cc +++ b/src/core/ext/filters/http/message_compress/message_compress_filter.cc @@ -40,94 +40,153 @@ #include "src/core/lib/surface/call.h" #include "src/core/lib/transport/static_metadata.h" -static void start_send_message_batch(void* arg, grpc_error* unused); -static void send_message_on_complete(void* arg, grpc_error* error); -static void on_send_message_next_done(void* arg, grpc_error* error); - namespace { -struct channel_data { +class ChannelData { + public: + ChannelData(grpc_channel_element_args* args) { + // Get the enabled and the default algorithms from channel args. + enabled_compression_algorithms_bitset_ = + grpc_channel_args_compression_algorithm_get_states(args->channel_args); + default_compression_algorithm_ = + grpc_channel_args_get_channel_default_compression_algorithm( + args->channel_args); + // Make sure the default is enabled. + if (!GPR_BITGET(enabled_compression_algorithms_bitset_, + default_compression_algorithm_)) { + const char* name; + GPR_ASSERT(grpc_compression_algorithm_name(default_compression_algorithm_, + &name) == 1); + gpr_log(GPR_ERROR, + "default compression algorithm %s not enabled: switching to none", + name); + default_compression_algorithm_ = GRPC_COMPRESS_NONE; + } + enabled_message_compression_algorithms_bitset_ = + grpc_compression_bitset_to_message_bitset( + enabled_compression_algorithms_bitset_); + enabled_stream_compression_algorithms_bitset_ = + grpc_compression_bitset_to_stream_bitset( + enabled_compression_algorithms_bitset_); + GPR_ASSERT(!args->is_last); + } + + grpc_compression_algorithm default_compression_algorithm() const { + return default_compression_algorithm_; + } + + uint32_t enabled_compression_algorithms_bitset() const { + return enabled_compression_algorithms_bitset_; + } + + uint32_t enabled_message_compression_algorithms_bitset() const { + return enabled_message_compression_algorithms_bitset_; + } + + uint32_t enabled_stream_compression_algorithms_bitset() const { + return enabled_stream_compression_algorithms_bitset_; + } + + private: /** The default, channel-level, compression algorithm */ - grpc_compression_algorithm default_compression_algorithm; + grpc_compression_algorithm default_compression_algorithm_; /** Bitset of enabled compression algorithms */ - uint32_t enabled_compression_algorithms_bitset; + uint32_t enabled_compression_algorithms_bitset_; /** Bitset of enabled message compression algorithms */ - uint32_t enabled_message_compression_algorithms_bitset; + uint32_t enabled_message_compression_algorithms_bitset_; /** Bitset of enabled stream compression algorithms */ - uint32_t enabled_stream_compression_algorithms_bitset; + uint32_t enabled_stream_compression_algorithms_bitset_; }; -struct call_data { - call_data(grpc_call_element* elem, const grpc_call_element_args& args) - : call_combiner(args.call_combiner) { - channel_data* channeld = static_cast(elem->channel_data); +class CallData { + public: + CallData(grpc_call_element* elem, const grpc_call_element_args& args) + : elem_(elem), call_combiner_(args.call_combiner) { + ChannelData* channeld = static_cast(elem_->channel_data); // The call's message compression algorithm is set to channel's default // setting. It can be overridden later by initial metadata. - if (GPR_LIKELY(GPR_BITGET(channeld->enabled_compression_algorithms_bitset, - channeld->default_compression_algorithm))) { - message_compression_algorithm = + if (GPR_LIKELY(GPR_BITGET(channeld->enabled_compression_algorithms_bitset(), + channeld->default_compression_algorithm()))) { + message_compression_algorithm_ = grpc_compression_algorithm_to_message_compression_algorithm( - channeld->default_compression_algorithm); + channeld->default_compression_algorithm()); } - GRPC_CLOSURE_INIT(&start_send_message_batch_in_call_combiner, - start_send_message_batch, elem, - grpc_schedule_on_exec_ctx); + GRPC_CLOSURE_INIT(&start_send_message_batch_in_call_combiner_, + StartSendMessageBatch, this, grpc_schedule_on_exec_ctx); } - ~call_data() { - if (state_initialized) { - grpc_slice_buffer_destroy_internal(&slices); + ~CallData() { + if (state_initialized_) { + grpc_slice_buffer_destroy_internal(&slices_); } - GRPC_ERROR_UNREF(cancel_error); + GRPC_ERROR_UNREF(cancel_error_); } - grpc_core::CallCombiner* call_combiner; - grpc_message_compression_algorithm message_compression_algorithm = + static void CompressStartTransportStreamOpBatch( + grpc_call_element* elem, grpc_transport_stream_op_batch* batch); + + bool SkipMessageCompression(); + void InitializeState(); + + grpc_error* ProcessSendInitialMetadata(grpc_metadata_batch* initial_metadata); + + // Methods for processing a send_message batch + static void StartSendMessageBatch(void* arg, grpc_error* unused); + static void OnSendMessageNextDone(void* arg, grpc_error* error); + grpc_error* PullSliceFromSendMessage(); + void ContinueReadingSendMessage(); + void FinishSendMessage(); + void SendMessageBatchContinue(); + static void FailSendMessageBatchInCallCombiner(void* arg, grpc_error* error); + + static void SendMessageOnComplete(void* arg, grpc_error* error); + + private: + grpc_call_element* elem_ = nullptr; + grpc_core::CallCombiner* call_combiner_ = nullptr; + grpc_message_compression_algorithm message_compression_algorithm_ = GRPC_MESSAGE_COMPRESS_NONE; - grpc_error* cancel_error = GRPC_ERROR_NONE; - grpc_transport_stream_op_batch* send_message_batch = nullptr; - bool seen_initial_metadata = false; + grpc_error* cancel_error_ = GRPC_ERROR_NONE; + grpc_transport_stream_op_batch* send_message_batch_ = nullptr; + bool seen_initial_metadata_ = false; /* Set to true, if the fields below are initialized. */ - bool state_initialized = false; - grpc_closure start_send_message_batch_in_call_combiner; + bool state_initialized_ = false; + grpc_closure start_send_message_batch_in_call_combiner_; /* The fields below are only initialized when we compress the payload. * Keep them at the bottom of the struct, so they don't pollute the * cache-lines. */ - grpc_linked_mdelem message_compression_algorithm_storage; - grpc_linked_mdelem stream_compression_algorithm_storage; - grpc_linked_mdelem accept_encoding_storage; - grpc_linked_mdelem accept_stream_encoding_storage; - grpc_slice_buffer slices; /**< Buffers up input slices to be compressed */ + grpc_linked_mdelem message_compression_algorithm_storage_; + grpc_linked_mdelem stream_compression_algorithm_storage_; + grpc_linked_mdelem accept_encoding_storage_; + grpc_linked_mdelem accept_stream_encoding_storage_; + grpc_slice_buffer slices_; /**< Buffers up input slices to be compressed */ grpc_core::ManualConstructor - replacement_stream; - grpc_closure* original_send_message_on_complete; - grpc_closure send_message_on_complete; - grpc_closure on_send_message_next_done; + replacement_stream_; + grpc_closure* original_send_message_on_complete_ = nullptr; + grpc_closure send_message_on_complete_; + grpc_closure on_send_message_next_done_; }; -} // namespace - // Returns true if we should skip message compression for the current message. -static bool skip_message_compression(grpc_call_element* elem) { - call_data* calld = static_cast(elem->call_data); +bool CallData::SkipMessageCompression() { // If the flags of this message indicate that it shouldn't be compressed, we // skip message compression. uint32_t flags = - calld->send_message_batch->payload->send_message.send_message->flags(); + send_message_batch_->payload->send_message.send_message->flags(); if (flags & (GRPC_WRITE_NO_COMPRESS | GRPC_WRITE_INTERNAL_COMPRESS)) { return true; } // If this call doesn't have any message compression algorithm set, skip // message compression. - return calld->message_compression_algorithm == GRPC_MESSAGE_COMPRESS_NONE; + return message_compression_algorithm_ == GRPC_MESSAGE_COMPRESS_NONE; } // Determines the compression algorithm from the initial metadata and the // channel's default setting. -static grpc_compression_algorithm find_compression_algorithm( - grpc_metadata_batch* initial_metadata, channel_data* channeld) { +grpc_compression_algorithm FindCompressionAlgorithm( + grpc_metadata_batch* initial_metadata, ChannelData* channeld) { if (initial_metadata->idx.named.grpc_internal_encoding_request == nullptr) { - return channeld->default_compression_algorithm; + return channeld->default_compression_algorithm(); } grpc_compression_algorithm compression_algorithm; // Parse the compression algorithm from the initial metadata. @@ -143,7 +202,7 @@ static grpc_compression_algorithm find_compression_algorithm( // enabled. // TODO(juanlishen): Maybe use channel default or abort() if the algorithm // from the initial metadata is disabled. - if (GPR_LIKELY(GPR_BITGET(channeld->enabled_compression_algorithms_bitset, + if (GPR_LIKELY(GPR_BITGET(channeld->enabled_compression_algorithms_bitset(), compression_algorithm))) { return compression_algorithm; } @@ -158,30 +217,24 @@ static grpc_compression_algorithm find_compression_algorithm( return GRPC_COMPRESS_NONE; } -static void initialize_state(grpc_call_element* elem, call_data* calld) { - GPR_DEBUG_ASSERT(!calld->state_initialized); - calld->state_initialized = true; - grpc_slice_buffer_init(&calld->slices); - GRPC_CLOSURE_INIT(&calld->send_message_on_complete, - ::send_message_on_complete, elem, +void CallData::InitializeState() { + GPR_DEBUG_ASSERT(!state_initialized_); + state_initialized_ = true; + grpc_slice_buffer_init(&slices_); + GRPC_CLOSURE_INIT(&send_message_on_complete_, SendMessageOnComplete, this, grpc_schedule_on_exec_ctx); - GRPC_CLOSURE_INIT(&calld->on_send_message_next_done, - ::on_send_message_next_done, elem, + GRPC_CLOSURE_INIT(&on_send_message_next_done_, OnSendMessageNextDone, this, grpc_schedule_on_exec_ctx); } -static grpc_error* process_send_initial_metadata( - grpc_call_element* elem, - grpc_metadata_batch* initial_metadata) GRPC_MUST_USE_RESULT; -static grpc_error* process_send_initial_metadata( - grpc_call_element* elem, grpc_metadata_batch* initial_metadata) { - call_data* calld = static_cast(elem->call_data); - channel_data* channeld = static_cast(elem->channel_data); +grpc_error* CallData::ProcessSendInitialMetadata( + grpc_metadata_batch* initial_metadata) { + ChannelData* channeld = static_cast(elem_->channel_data); // Find the compression algorithm. grpc_compression_algorithm compression_algorithm = - find_compression_algorithm(initial_metadata, channeld); + FindCompressionAlgorithm(initial_metadata, channeld); // Note that at most one of the following algorithms can be set. - calld->message_compression_algorithm = + message_compression_algorithm_ = grpc_compression_algorithm_to_message_compression_algorithm( compression_algorithm); grpc_stream_compression_algorithm stream_compression_algorithm = @@ -189,257 +242,253 @@ static grpc_error* process_send_initial_metadata( compression_algorithm); // Hint compression algorithm. grpc_error* error = GRPC_ERROR_NONE; - if (calld->message_compression_algorithm != GRPC_MESSAGE_COMPRESS_NONE) { - initialize_state(elem, calld); + if (message_compression_algorithm_ != GRPC_MESSAGE_COMPRESS_NONE) { + InitializeState(); error = grpc_metadata_batch_add_tail( - initial_metadata, &calld->message_compression_algorithm_storage, + initial_metadata, &message_compression_algorithm_storage_, grpc_message_compression_encoding_mdelem( - calld->message_compression_algorithm), + message_compression_algorithm_), GRPC_BATCH_GRPC_ENCODING); } else if (stream_compression_algorithm != GRPC_STREAM_COMPRESS_NONE) { - initialize_state(elem, calld); + InitializeState(); error = grpc_metadata_batch_add_tail( - initial_metadata, &calld->stream_compression_algorithm_storage, + initial_metadata, &stream_compression_algorithm_storage_, grpc_stream_compression_encoding_mdelem(stream_compression_algorithm), GRPC_BATCH_CONTENT_ENCODING); } if (error != GRPC_ERROR_NONE) return error; // Convey supported compression algorithms. error = grpc_metadata_batch_add_tail( - initial_metadata, &calld->accept_encoding_storage, + initial_metadata, &accept_encoding_storage_, GRPC_MDELEM_ACCEPT_ENCODING_FOR_ALGORITHMS( - channeld->enabled_message_compression_algorithms_bitset), + channeld->enabled_message_compression_algorithms_bitset()), GRPC_BATCH_GRPC_ACCEPT_ENCODING); if (error != GRPC_ERROR_NONE) return error; // Do not overwrite accept-encoding header if it already presents (e.g., added // by some proxy). if (!initial_metadata->idx.named.accept_encoding) { error = grpc_metadata_batch_add_tail( - initial_metadata, &calld->accept_stream_encoding_storage, + initial_metadata, &accept_stream_encoding_storage_, GRPC_MDELEM_ACCEPT_STREAM_ENCODING_FOR_ALGORITHMS( - channeld->enabled_stream_compression_algorithms_bitset), + channeld->enabled_stream_compression_algorithms_bitset()), GRPC_BATCH_ACCEPT_ENCODING); } return error; } -static void send_message_on_complete(void* arg, grpc_error* error) { - grpc_call_element* elem = static_cast(arg); - call_data* calld = static_cast(elem->call_data); - grpc_slice_buffer_reset_and_unref_internal(&calld->slices); +void CallData::SendMessageOnComplete(void* arg, grpc_error* error) { + CallData* calld = static_cast(arg); + grpc_slice_buffer_reset_and_unref_internal(&calld->slices_); grpc_core::Closure::Run(DEBUG_LOCATION, - calld->original_send_message_on_complete, + calld->original_send_message_on_complete_, GRPC_ERROR_REF(error)); } -static void send_message_batch_continue(grpc_call_element* elem) { - call_data* calld = static_cast(elem->call_data); +void CallData::SendMessageBatchContinue() { // Note: The call to grpc_call_next_op() results in yielding the - // call combiner, so we need to clear calld->send_message_batch + // call combiner, so we need to clear calld->send_message_batch_ // before we do that. grpc_transport_stream_op_batch* send_message_batch = - calld->send_message_batch; - calld->send_message_batch = nullptr; - grpc_call_next_op(elem, send_message_batch); + this->send_message_batch_; + send_message_batch_ = nullptr; + grpc_call_next_op(elem_, send_message_batch); } -static void finish_send_message(grpc_call_element* elem) { - call_data* calld = static_cast(elem->call_data); - GPR_DEBUG_ASSERT(calld->message_compression_algorithm != +void CallData::FinishSendMessage() { + GPR_DEBUG_ASSERT(message_compression_algorithm_ != GRPC_MESSAGE_COMPRESS_NONE); // Compress the data if appropriate. grpc_slice_buffer tmp; grpc_slice_buffer_init(&tmp); uint32_t send_flags = - calld->send_message_batch->payload->send_message.send_message->flags(); - bool did_compress = grpc_msg_compress(calld->message_compression_algorithm, - &calld->slices, &tmp); + send_message_batch_->payload->send_message.send_message->flags(); + bool did_compress = + grpc_msg_compress(message_compression_algorithm_, &slices_, &tmp); if (did_compress) { if (GRPC_TRACE_FLAG_ENABLED(grpc_compression_trace)) { const char* algo_name; - const size_t before_size = calld->slices.length; + const size_t before_size = slices_.length; const size_t after_size = tmp.length; const float savings_ratio = 1.0f - static_cast(after_size) / static_cast(before_size); GPR_ASSERT(grpc_message_compression_algorithm_name( - calld->message_compression_algorithm, &algo_name)); + message_compression_algorithm_, &algo_name)); gpr_log(GPR_INFO, "Compressed[%s] %" PRIuPTR " bytes vs. %" PRIuPTR " bytes (%.2f%% savings)", algo_name, before_size, after_size, 100 * savings_ratio); } - grpc_slice_buffer_swap(&calld->slices, &tmp); + grpc_slice_buffer_swap(&slices_, &tmp); send_flags |= GRPC_WRITE_INTERNAL_COMPRESS; } else { if (GRPC_TRACE_FLAG_ENABLED(grpc_compression_trace)) { const char* algo_name; GPR_ASSERT(grpc_message_compression_algorithm_name( - calld->message_compression_algorithm, &algo_name)); + message_compression_algorithm_, &algo_name)); gpr_log(GPR_INFO, "Algorithm '%s' enabled but decided not to compress. Input size: " "%" PRIuPTR, - algo_name, calld->slices.length); + algo_name, slices_.length); } } grpc_slice_buffer_destroy_internal(&tmp); // Swap out the original byte stream with our new one and send the // batch down. - calld->replacement_stream.Init(&calld->slices, send_flags); - calld->send_message_batch->payload->send_message.send_message.reset( - calld->replacement_stream.get()); - calld->original_send_message_on_complete = - calld->send_message_batch->on_complete; - calld->send_message_batch->on_complete = &calld->send_message_on_complete; - send_message_batch_continue(elem); + replacement_stream_.Init(&slices_, send_flags); + send_message_batch_->payload->send_message.send_message.reset( + replacement_stream_.get()); + original_send_message_on_complete_ = send_message_batch_->on_complete; + send_message_batch_->on_complete = &send_message_on_complete_; + SendMessageBatchContinue(); } -static void fail_send_message_batch_in_call_combiner(void* arg, - grpc_error* error) { - call_data* calld = static_cast(arg); - if (calld->send_message_batch != nullptr) { +void CallData::FailSendMessageBatchInCallCombiner(void* arg, + grpc_error* error) { + CallData* calld = static_cast(arg); + if (calld->send_message_batch_ != nullptr) { grpc_transport_stream_op_batch_finish_with_failure( - calld->send_message_batch, GRPC_ERROR_REF(error), calld->call_combiner); - calld->send_message_batch = nullptr; + calld->send_message_batch_, GRPC_ERROR_REF(error), + calld->call_combiner_); + calld->send_message_batch_ = nullptr; } } -// Pulls a slice from the send_message byte stream and adds it to calld->slices. -static grpc_error* pull_slice_from_send_message(call_data* calld) { +// Pulls a slice from the send_message byte stream and adds it to +// calld->slices_. +grpc_error* CallData::PullSliceFromSendMessage() { grpc_slice incoming_slice; grpc_error* error = - calld->send_message_batch->payload->send_message.send_message->Pull( + send_message_batch_->payload->send_message.send_message->Pull( &incoming_slice); if (error == GRPC_ERROR_NONE) { - grpc_slice_buffer_add(&calld->slices, incoming_slice); + grpc_slice_buffer_add(&slices_, incoming_slice); } return error; } // Reads as many slices as possible from the send_message byte stream. -// If all data has been read, invokes finish_send_message(). Otherwise, +// If all data has been read, invokes FinishSendMessage(). Otherwise, // an async call to ByteStream::Next() has been started, which will // eventually result in calling on_send_message_next_done(). -static void continue_reading_send_message(grpc_call_element* elem) { - call_data* calld = static_cast(elem->call_data); - if (calld->slices.length == - calld->send_message_batch->payload->send_message.send_message->length()) { - finish_send_message(elem); +void CallData::ContinueReadingSendMessage() { + if (slices_.length == + send_message_batch_->payload->send_message.send_message->length()) { + FinishSendMessage(); return; } - while (calld->send_message_batch->payload->send_message.send_message->Next( - ~static_cast(0), &calld->on_send_message_next_done)) { - grpc_error* error = pull_slice_from_send_message(calld); + while (send_message_batch_->payload->send_message.send_message->Next( + ~static_cast(0), &on_send_message_next_done_)) { + grpc_error* error = PullSliceFromSendMessage(); if (error != GRPC_ERROR_NONE) { // Closure callback; does not take ownership of error. - fail_send_message_batch_in_call_combiner(calld, error); + FailSendMessageBatchInCallCombiner(this, error); GRPC_ERROR_UNREF(error); return; } - if (calld->slices.length == calld->send_message_batch->payload->send_message - .send_message->length()) { - finish_send_message(elem); + if (slices_.length == + send_message_batch_->payload->send_message.send_message->length()) { + FinishSendMessage(); break; } } } // Async callback for ByteStream::Next(). -static void on_send_message_next_done(void* arg, grpc_error* error) { - grpc_call_element* elem = static_cast(arg); - call_data* calld = static_cast(elem->call_data); +void CallData::OnSendMessageNextDone(void* arg, grpc_error* error) { + CallData* calld = static_cast(arg); if (error != GRPC_ERROR_NONE) { // Closure callback; does not take ownership of error. - fail_send_message_batch_in_call_combiner(calld, error); + FailSendMessageBatchInCallCombiner(calld, error); return; } - error = pull_slice_from_send_message(calld); + error = calld->PullSliceFromSendMessage(); if (error != GRPC_ERROR_NONE) { // Closure callback; does not take ownership of error. - fail_send_message_batch_in_call_combiner(calld, error); + FailSendMessageBatchInCallCombiner(calld, error); GRPC_ERROR_UNREF(error); return; } - if (calld->slices.length == - calld->send_message_batch->payload->send_message.send_message->length()) { - finish_send_message(elem); + if (calld->slices_.length == calld->send_message_batch_->payload->send_message + .send_message->length()) { + calld->FinishSendMessage(); } else { - continue_reading_send_message(elem); + calld->ContinueReadingSendMessage(); } } -static void start_send_message_batch(void* arg, grpc_error* /*unused*/) { - grpc_call_element* elem = static_cast(arg); - if (skip_message_compression(elem)) { - send_message_batch_continue(elem); +void CallData::StartSendMessageBatch(void* arg, grpc_error* /*unused*/) { + CallData* calld = static_cast(arg); + if (calld->SkipMessageCompression()) { + calld->SendMessageBatchContinue(); } else { - continue_reading_send_message(elem); + calld->ContinueReadingSendMessage(); } } -static void compress_start_transport_stream_op_batch( +void CallData::CompressStartTransportStreamOpBatch( grpc_call_element* elem, grpc_transport_stream_op_batch* batch) { GPR_TIMER_SCOPE("compress_start_transport_stream_op_batch", 0); - call_data* calld = static_cast(elem->call_data); + CallData* calld = static_cast(elem->call_data); // Handle cancel_stream. if (batch->cancel_stream) { - GRPC_ERROR_UNREF(calld->cancel_error); - calld->cancel_error = + GRPC_ERROR_UNREF(calld->cancel_error_); + calld->cancel_error_ = GRPC_ERROR_REF(batch->payload->cancel_stream.cancel_error); - if (calld->send_message_batch != nullptr) { - if (!calld->seen_initial_metadata) { + if (calld->send_message_batch_ != nullptr) { + if (!calld->seen_initial_metadata_) { GRPC_CALL_COMBINER_START( - calld->call_combiner, - GRPC_CLOSURE_CREATE(fail_send_message_batch_in_call_combiner, calld, + calld->call_combiner_, + GRPC_CLOSURE_CREATE(FailSendMessageBatchInCallCombiner, calld, grpc_schedule_on_exec_ctx), - GRPC_ERROR_REF(calld->cancel_error), "failing send_message op"); + GRPC_ERROR_REF(calld->cancel_error_), "failing send_message op"); } else { - calld->send_message_batch->payload->send_message.send_message->Shutdown( - GRPC_ERROR_REF(calld->cancel_error)); + calld->send_message_batch_->payload->send_message.send_message + ->Shutdown(GRPC_ERROR_REF(calld->cancel_error_)); } } - } else if (calld->cancel_error != GRPC_ERROR_NONE) { + } else if (calld->cancel_error_ != GRPC_ERROR_NONE) { grpc_transport_stream_op_batch_finish_with_failure( - batch, GRPC_ERROR_REF(calld->cancel_error), calld->call_combiner); + batch, GRPC_ERROR_REF(calld->cancel_error_), calld->call_combiner_); return; } // Handle send_initial_metadata. if (batch->send_initial_metadata) { - GPR_ASSERT(!calld->seen_initial_metadata); - grpc_error* error = process_send_initial_metadata( - elem, batch->payload->send_initial_metadata.send_initial_metadata); + GPR_ASSERT(!calld->seen_initial_metadata_); + grpc_error* error = calld->ProcessSendInitialMetadata( + batch->payload->send_initial_metadata.send_initial_metadata); if (error != GRPC_ERROR_NONE) { grpc_transport_stream_op_batch_finish_with_failure(batch, error, - calld->call_combiner); + calld->call_combiner_); return; } - calld->seen_initial_metadata = true; + calld->seen_initial_metadata_ = true; // If we had previously received a batch containing a send_message op, // handle it now. Note that we need to re-enter the call combiner // for this, since we can't send two batches down while holding the // call combiner, since the connected_channel filter (at the bottom of // the call stack) will release the call combiner for each batch it sees. - if (calld->send_message_batch != nullptr) { + if (calld->send_message_batch_ != nullptr) { GRPC_CALL_COMBINER_START( - calld->call_combiner, - &calld->start_send_message_batch_in_call_combiner, GRPC_ERROR_NONE, + calld->call_combiner_, + &calld->start_send_message_batch_in_call_combiner_, GRPC_ERROR_NONE, "starting send_message after send_initial_metadata"); } } // Handle send_message. if (batch->send_message) { - GPR_ASSERT(calld->send_message_batch == nullptr); - calld->send_message_batch = batch; + GPR_ASSERT(calld->send_message_batch_ == nullptr); + calld->send_message_batch_ = batch; // If we have not yet seen send_initial_metadata, then we have to // wait. We save the batch in calld and then drop the call // combiner, which we'll have to pick up again later when we get // send_initial_metadata. - if (!calld->seen_initial_metadata) { + if (!calld->seen_initial_metadata_) { GRPC_CALL_COMBINER_STOP( - calld->call_combiner, + calld->call_combiner_, "send_message batch pending send_initial_metadata"); return; } - start_send_message_batch(elem, GRPC_ERROR_NONE); + StartSendMessageBatch(calld, GRPC_ERROR_NONE); } else { // Pass control down the stack. grpc_call_next_op(elem, batch); @@ -447,63 +496,44 @@ static void compress_start_transport_stream_op_batch( } /* Constructor for call_data */ -static grpc_error* compress_init_call_elem(grpc_call_element* elem, - const grpc_call_element_args* args) { - new (elem->call_data) call_data(elem, *args); +static grpc_error* CompressInitCallElem(grpc_call_element* elem, + const grpc_call_element_args* args) { + new (elem->call_data) CallData(elem, *args); return GRPC_ERROR_NONE; } /* Destructor for call_data */ -static void compress_destroy_call_elem( - grpc_call_element* elem, const grpc_call_final_info* /*final_info*/, - grpc_closure* /*ignored*/) { - call_data* calld = static_cast(elem->call_data); - calld->~call_data(); +static void CompressDestroyCallElem(grpc_call_element* elem, + const grpc_call_final_info* /*final_info*/, + grpc_closure* /*ignored*/) { + CallData* calld = static_cast(elem->call_data); + calld->~CallData(); } -/* Constructor for channel_data */ -static grpc_error* compress_init_channel_elem(grpc_channel_element* elem, - grpc_channel_element_args* args) { - channel_data* channeld = static_cast(elem->channel_data); - // Get the enabled and the default algorithms from channel args. - channeld->enabled_compression_algorithms_bitset = - grpc_channel_args_compression_algorithm_get_states(args->channel_args); - channeld->default_compression_algorithm = - grpc_channel_args_get_channel_default_compression_algorithm( - args->channel_args); - // Make sure the default is enabled. - if (!GPR_BITGET(channeld->enabled_compression_algorithms_bitset, - channeld->default_compression_algorithm)) { - const char* name; - GPR_ASSERT(grpc_compression_algorithm_name( - channeld->default_compression_algorithm, &name) == 1); - gpr_log(GPR_ERROR, - "default compression algorithm %s not enabled: switching to none", - name); - channeld->default_compression_algorithm = GRPC_COMPRESS_NONE; - } - channeld->enabled_message_compression_algorithms_bitset = - grpc_compression_bitset_to_message_bitset( - channeld->enabled_compression_algorithms_bitset); - channeld->enabled_stream_compression_algorithms_bitset = - grpc_compression_bitset_to_stream_bitset( - channeld->enabled_compression_algorithms_bitset); - GPR_ASSERT(!args->is_last); +/* Constructor for ChannelData */ +static grpc_error* CompressInitChannelElem(grpc_channel_element* elem, + grpc_channel_element_args* args) { + new (elem->channel_data) ChannelData(args); return GRPC_ERROR_NONE; } /* Destructor for channel data */ -static void compress_destroy_channel_elem(grpc_channel_element* /*elem*/) {} +void CompressDestroyChannelElem(grpc_channel_element* elem) { + ChannelData* channeld = static_cast(elem->channel_data); + channeld->~ChannelData(); +} + +} // namespace const grpc_channel_filter grpc_message_compress_filter = { - compress_start_transport_stream_op_batch, + CallData::CompressStartTransportStreamOpBatch, grpc_channel_next_op, - sizeof(call_data), - compress_init_call_elem, + sizeof(CallData), + CompressInitCallElem, grpc_call_stack_ignore_set_pollset_or_pollset_set, - compress_destroy_call_elem, - sizeof(channel_data), - compress_init_channel_elem, - compress_destroy_channel_elem, + CompressDestroyCallElem, + sizeof(ChannelData), + CompressInitChannelElem, + CompressDestroyChannelElem, grpc_channel_next_get_info, "message_compress"}; From 1e5aa76adf015c8bb14bba3863a5b762033b3d06 Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Thu, 2 Apr 2020 22:07:04 -0700 Subject: [PATCH 352/758] Some notes on new filter implementation --- src/core/lib/channel/channel_stack.h | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/core/lib/channel/channel_stack.h b/src/core/lib/channel/channel_stack.h index f9272871931..87e675951b3 100644 --- a/src/core/lib/channel/channel_stack.h +++ b/src/core/lib/channel/channel_stack.h @@ -31,7 +31,18 @@ chains are linear, then channel stacks provide a mechanism to minimize allocations for that chain. Call stacks are created by channel stacks and represent the per-call data - for that stack. */ + for that stack. + + Implementations should take care of the following details for a batch - + 1. Synchronization is achieved with a CallCombiner. View + src/core/lib/iomgr/call_combiner.h for more details. + 2. If the filter wants to inject an error on the way down, it needs to call + grpc_transport_stream_op_batch_finish_with_failure from within the call + combiner. This will cause any batch callbacks to be called with that error. + 3. If the filter wants to inject an error on the way up (from a callback), it + should also inject that error in the recv_trailing_metadata callback so that + it can have an effect on the call status. +*/ #include From 576f79dff0e425b509283addb1f2a87209c9eab3 Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Fri, 3 Apr 2020 07:34:54 +0200 Subject: [PATCH 353/758] cleanup gen_build_yaml.py for end2end tests --- test/core/end2end/README | 2 +- test/core/end2end/gen_build_yaml.py | 402 +-------------------- tools/buildgen/generate_build_additions.sh | 2 +- 3 files changed, 17 insertions(+), 389 deletions(-) diff --git a/test/core/end2end/README b/test/core/end2end/README index a18172a7a1d..51cc144039d 100644 --- a/test/core/end2end/README +++ b/test/core/end2end/README @@ -3,5 +3,5 @@ forms a complete end-to-end test. To add a new test or fixture: - add the code to the relevant directory -- update gen_build_yaml.py to reflect the change +- update generate_tests.bzl to reflect the change - regenerate projects diff --git a/test/core/end2end/gen_build_yaml.py b/test/core/end2end/gen_build_yaml.py index d1e78cc6490..3cb31686619 100755 --- a/test/core/end2end/gen_build_yaml.py +++ b/test/core/end2end/gen_build_yaml.py @@ -11,408 +11,36 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -"""Generates the appropriate build.json data for all the end2end tests.""" - -from __future__ import print_function +"""Generates the list of end2end test cases from generate_tests.bzl""" +import os +import sys import yaml -import collections -import hashlib - -FixtureOptions = collections.namedtuple( - 'FixtureOptions', - 'fullstack includes_proxy dns_resolver name_resolution secure platforms ci_mac tracing exclude_configs exclude_iomgrs large_writes enables_compression supports_compression is_inproc is_http2 supports_proxy_auth supports_write_buffering client_channel' -) -default_unsecure_fixture_options = FixtureOptions( - True, False, True, True, False, ['windows', 'linux', 'mac', 'posix'], True, - False, [], [], True, False, True, False, True, False, True, True) -socketpair_unsecure_fixture_options = default_unsecure_fixture_options._replace( - fullstack=False, dns_resolver=False, client_channel=False) -default_secure_fixture_options = default_unsecure_fixture_options._replace( - secure=True) -uds_fixture_options = default_unsecure_fixture_options._replace( - dns_resolver=False, - platforms=['linux', 'mac', 'posix'], - exclude_iomgrs=['uv']) -local_fixture_options = default_secure_fixture_options._replace( - dns_resolver=False, - platforms=['linux', 'mac', 'posix'], - exclude_iomgrs=['uv']) -fd_unsecure_fixture_options = default_unsecure_fixture_options._replace( - dns_resolver=False, - fullstack=False, - platforms=['linux', 'mac', 'posix'], - exclude_iomgrs=['uv'], - client_channel=False) -inproc_fixture_options = default_secure_fixture_options._replace( - dns_resolver=False, - fullstack=False, - name_resolution=False, - supports_compression=False, - is_inproc=True, - is_http2=False, - supports_write_buffering=False, - client_channel=False) - -# maps fixture name to whether it requires the security library -END2END_FIXTURES = { - 'h2_compress': - default_unsecure_fixture_options._replace(enables_compression=True), - 'h2_census': - default_unsecure_fixture_options, - # This cmake target is disabled for now because it depends on OpenCensus, - # which is Bazel-only. - # 'h2_load_reporting': default_unsecure_fixture_options, - 'h2_fakesec': - default_secure_fixture_options._replace(ci_mac=False), - 'h2_fd': - fd_unsecure_fixture_options, - 'h2_full': - default_unsecure_fixture_options, - 'h2_full+pipe': - default_unsecure_fixture_options._replace(platforms=['linux'], - exclude_iomgrs=['uv']), - 'h2_full+trace': - default_unsecure_fixture_options._replace(tracing=True), - 'h2_full+workarounds': - default_unsecure_fixture_options, - 'h2_http_proxy': - default_unsecure_fixture_options._replace(ci_mac=False, - exclude_iomgrs=['uv'], - supports_proxy_auth=True), - 'h2_oauth2': - default_secure_fixture_options._replace(ci_mac=False, - exclude_iomgrs=['uv']), - 'h2_proxy': - default_unsecure_fixture_options._replace(includes_proxy=True, - ci_mac=False, - exclude_iomgrs=['uv']), - 'h2_sockpair_1byte': - socketpair_unsecure_fixture_options._replace(ci_mac=False, - exclude_configs=['msan'], - large_writes=False, - exclude_iomgrs=['uv']), - 'h2_sockpair': - socketpair_unsecure_fixture_options._replace(ci_mac=False, - exclude_iomgrs=['uv']), - 'h2_sockpair+trace': - socketpair_unsecure_fixture_options._replace(ci_mac=False, - tracing=True, - large_writes=False, - exclude_iomgrs=['uv']), - 'h2_ssl': - default_secure_fixture_options, - 'h2_ssl_cred_reload': - default_secure_fixture_options, - 'h2_tls': - default_secure_fixture_options, - 'h2_local_uds': - local_fixture_options, - 'h2_local_ipv4': - local_fixture_options, - 'h2_local_ipv6': - local_fixture_options, - 'h2_ssl_proxy': - default_secure_fixture_options._replace(includes_proxy=True, - ci_mac=False, - exclude_iomgrs=['uv']), - 'h2_uds': - uds_fixture_options, - 'inproc': - inproc_fixture_options -} -TestOptions = collections.namedtuple( - 'TestOptions', - 'needs_fullstack needs_dns needs_names proxyable secure traceable cpu_cost exclude_iomgrs large_writes flaky allows_compression needs_compression exclude_inproc needs_http2 needs_proxy_auth needs_write_buffering needs_client_channel' -) -default_test_options = TestOptions(False, False, False, True, False, True, 1.0, - [], False, False, True, False, False, False, - False, False, False) -connectivity_test_options = default_test_options._replace(needs_fullstack=True) +_ROOT = os.path.abspath(os.path.join(os.path.dirname(sys.argv[0]), '../../..')) +os.chdir(_ROOT) -LOWCPU = 0.1 -# maps test names to options -END2END_TESTS = { - 'authority_not_supported': - default_test_options, - 'bad_hostname': - default_test_options._replace(needs_names=True), - 'bad_ping': - connectivity_test_options._replace(proxyable=False), - 'binary_metadata': - default_test_options._replace(cpu_cost=LOWCPU), - 'resource_quota_server': - default_test_options._replace(large_writes=True, - proxyable=False, - allows_compression=False), - 'call_creds': - default_test_options._replace(secure=True), - 'cancel_after_accept': - default_test_options._replace(cpu_cost=LOWCPU), - 'cancel_after_client_done': - default_test_options._replace(cpu_cost=LOWCPU), - 'cancel_after_invoke': - default_test_options._replace(cpu_cost=LOWCPU), - 'cancel_after_round_trip': - default_test_options._replace(cpu_cost=LOWCPU), - 'cancel_before_invoke': - default_test_options._replace(cpu_cost=LOWCPU), - 'cancel_in_a_vacuum': - default_test_options._replace(cpu_cost=LOWCPU), - 'cancel_with_status': - default_test_options._replace(cpu_cost=LOWCPU), - 'compressed_payload': - default_test_options._replace(proxyable=False, needs_compression=True), - 'connectivity': - connectivity_test_options._replace(needs_names=True, - proxyable=False, - cpu_cost=LOWCPU, - exclude_iomgrs=['uv']), - 'channelz': - default_test_options, - 'default_host': - default_test_options._replace(needs_fullstack=True, - needs_dns=True, - needs_names=True), - 'call_host_override': - default_test_options._replace(needs_fullstack=True, - needs_dns=True, - needs_names=True), - 'disappearing_server': - connectivity_test_options._replace(flaky=True, needs_names=True), - 'empty_batch': - default_test_options._replace(cpu_cost=LOWCPU), - 'filter_causes_close': - default_test_options._replace(cpu_cost=LOWCPU), - 'filter_call_init_fails': - default_test_options, - 'filter_context': - default_test_options, - 'filter_latency': - default_test_options._replace(cpu_cost=LOWCPU), - 'filter_status_code': - default_test_options._replace(cpu_cost=LOWCPU), - 'graceful_server_shutdown': - default_test_options._replace(cpu_cost=LOWCPU, exclude_inproc=True), - 'hpack_size': - default_test_options._replace(proxyable=False, - traceable=False, - cpu_cost=LOWCPU), - 'high_initial_seqno': - default_test_options._replace(cpu_cost=LOWCPU), - 'idempotent_request': - default_test_options, - 'invoke_large_request': - default_test_options, - 'keepalive_timeout': - default_test_options._replace(proxyable=False, - cpu_cost=LOWCPU, - needs_http2=True), - 'large_metadata': - default_test_options, - 'max_concurrent_streams': - default_test_options._replace(proxyable=False, - cpu_cost=LOWCPU, - exclude_inproc=True), - 'max_connection_age': - default_test_options._replace(cpu_cost=LOWCPU, exclude_inproc=True), - 'max_connection_idle': - connectivity_test_options._replace(proxyable=False, - exclude_iomgrs=['uv'], - cpu_cost=LOWCPU), - 'max_message_length': - default_test_options._replace(cpu_cost=LOWCPU), - 'negative_deadline': - default_test_options, - 'no_error_on_hotpath': - default_test_options._replace(proxyable=False), - 'no_logging': - default_test_options._replace(traceable=False), - 'no_op': - default_test_options, - 'payload': - default_test_options, - # This cmake target is disabled for now because it depends on OpenCensus, - # which is Bazel-only. - # 'load_reporting_hook': default_test_options, - 'ping_pong_streaming': - default_test_options._replace(cpu_cost=LOWCPU), - 'ping': - connectivity_test_options._replace(proxyable=False, cpu_cost=LOWCPU), - 'proxy_auth': - default_test_options._replace(needs_proxy_auth=True), - 'registered_call': - default_test_options, - 'request_with_flags': - default_test_options._replace(proxyable=False, cpu_cost=LOWCPU), - 'request_with_payload': - default_test_options._replace(cpu_cost=LOWCPU), - # TODO(roth): Remove proxyable=False for all retry tests once we - # have a way for the proxy to propagate the fact that trailing - # metadata is available when initial metadata is returned. - # See https://github.com/grpc/grpc/issues/14467 for context. - 'retry': - default_test_options._replace(cpu_cost=LOWCPU, - needs_client_channel=True, - proxyable=False), - 'retry_cancellation': - default_test_options._replace(cpu_cost=LOWCPU, - needs_client_channel=True, - proxyable=False), - 'retry_disabled': - default_test_options._replace(cpu_cost=LOWCPU, - needs_client_channel=True, - proxyable=False), - 'retry_exceeds_buffer_size_in_initial_batch': - default_test_options._replace(cpu_cost=LOWCPU, - needs_client_channel=True, - proxyable=False), - 'retry_exceeds_buffer_size_in_subsequent_batch': - default_test_options._replace(cpu_cost=LOWCPU, - needs_client_channel=True, - proxyable=False), - 'retry_non_retriable_status': - default_test_options._replace(cpu_cost=LOWCPU, - needs_client_channel=True, - proxyable=False), - 'retry_non_retriable_status_before_recv_trailing_metadata_started': - default_test_options._replace(cpu_cost=LOWCPU, - needs_client_channel=True, - proxyable=False), - 'retry_recv_initial_metadata': - default_test_options._replace(cpu_cost=LOWCPU, - needs_client_channel=True, - proxyable=False), - 'retry_recv_message': - default_test_options._replace(cpu_cost=LOWCPU, - needs_client_channel=True, - proxyable=False), - 'retry_server_pushback_delay': - default_test_options._replace(cpu_cost=LOWCPU, - needs_client_channel=True, - proxyable=False), - 'retry_server_pushback_disabled': - default_test_options._replace(cpu_cost=LOWCPU, - needs_client_channel=True, - proxyable=False), - 'retry_streaming': - default_test_options._replace(cpu_cost=LOWCPU, - needs_client_channel=True, - proxyable=False), - 'retry_streaming_after_commit': - default_test_options._replace(cpu_cost=LOWCPU, - needs_client_channel=True, - proxyable=False), - 'retry_streaming_succeeds_before_replay_finished': - default_test_options._replace(cpu_cost=LOWCPU, - needs_client_channel=True, - proxyable=False), - 'retry_throttled': - default_test_options._replace(cpu_cost=LOWCPU, - needs_client_channel=True, - proxyable=False), - 'retry_too_many_attempts': - default_test_options._replace(cpu_cost=LOWCPU, - needs_client_channel=True, - proxyable=False), - 'server_finishes_request': - default_test_options._replace(cpu_cost=LOWCPU), - 'shutdown_finishes_calls': - default_test_options._replace(cpu_cost=LOWCPU), - 'shutdown_finishes_tags': - default_test_options._replace(cpu_cost=LOWCPU), - 'simple_cacheable_request': - default_test_options._replace(cpu_cost=LOWCPU), - 'stream_compression_compressed_payload': - default_test_options._replace(proxyable=False, exclude_inproc=True), - 'stream_compression_payload': - default_test_options._replace(exclude_inproc=True), - 'stream_compression_ping_pong_streaming': - default_test_options._replace(exclude_inproc=True), - 'simple_delayed_request': - connectivity_test_options, - 'simple_metadata': - default_test_options, - 'simple_request': - default_test_options, - 'streaming_error_response': - default_test_options._replace(cpu_cost=LOWCPU), - 'trailing_metadata': - default_test_options, - 'workaround_cronet_compression': - default_test_options, - 'write_buffering': - default_test_options._replace(cpu_cost=LOWCPU, - needs_write_buffering=True), - 'write_buffering_at_end': - default_test_options._replace(cpu_cost=LOWCPU, - needs_write_buffering=True), -} +def load(*args): + """Replacement of bazel's load() function""" + pass -def compatible(f, t): - if END2END_TESTS[t].needs_fullstack: - if not END2END_FIXTURES[f].fullstack: - return False - if END2END_TESTS[t].needs_dns: - if not END2END_FIXTURES[f].dns_resolver: - return False - if END2END_TESTS[t].needs_names: - if not END2END_FIXTURES[f].name_resolution: - return False - if not END2END_TESTS[t].proxyable: - if END2END_FIXTURES[f].includes_proxy: - return False - if not END2END_TESTS[t].traceable: - if END2END_FIXTURES[f].tracing: - return False - if END2END_TESTS[t].large_writes: - if not END2END_FIXTURES[f].large_writes: - return False - if not END2END_TESTS[t].allows_compression: - if END2END_FIXTURES[f].enables_compression: - return False - if END2END_TESTS[t].needs_compression: - if not END2END_FIXTURES[f].supports_compression: - return False - if END2END_TESTS[t].exclude_inproc: - if END2END_FIXTURES[f].is_inproc: - return False - if END2END_TESTS[t].needs_http2: - if not END2END_FIXTURES[f].is_http2: - return False - if END2END_TESTS[t].needs_proxy_auth: - if not END2END_FIXTURES[f].supports_proxy_auth: - return False - if END2END_TESTS[t].needs_write_buffering: - if not END2END_FIXTURES[f].supports_write_buffering: - return False - if END2END_TESTS[t].needs_client_channel: - if not END2END_FIXTURES[f].client_channel: - return False - return True +def struct(**kwargs): + return kwargs # all the args as a dict -def without(l, e): - l = l[:] - l.remove(e) - return l +# generate_tests.bzl is now the source of truth for end2end tests. +# The .bzl file is basically a python file and we can "execute" it +# to get access to the variables it defines. +execfile('test/core/end2end/generate_tests.bzl') -# Originally, this method was used to generate end2end test cases for build.yaml, -# but since the test cases are now extracted from bazel BUILD file, -# this is not used for generating run_tests.py test cases anymore. -# Nevertheless, subset of the output is still used by end2end_tests.cc.template -# and end2end_nosec_tests.cc.template -# TODO(jtattermusch): cleanup this file, so that it only generates the data we need. -# Right now there's some duplication between generate_tests.bzl and this file. def main(): json = { # needed by end2end_tests.cc.template and end2end_nosec_tests.cc.template 'core_end2end_tests': - dict((t, END2END_TESTS[t].secure) for t in END2END_TESTS.keys()) + dict((t, END2END_TESTS[t]['secure']) for t in END2END_TESTS.keys()) } print(yaml.dump(json)) diff --git a/tools/buildgen/generate_build_additions.sh b/tools/buildgen/generate_build_additions.sh index 01d839284fc..e873789e9a9 100755 --- a/tools/buildgen/generate_build_additions.sh +++ b/tools/buildgen/generate_build_additions.sh @@ -23,7 +23,7 @@ gen_build_yaml_dirs=" \ src/upb \ src/zlib \ src/c-ares \ - test/core/end2end \ + test/core/end2end \ test/cpp/naming \ tools/run_tests/lb_interop_tests" From e4ea74131dbefdf5a6892d271f2ac218fddcb3c2 Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Fri, 3 Apr 2020 08:12:31 +0200 Subject: [PATCH 354/758] add a bug reference --- test/core/surface/BUILD | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/core/surface/BUILD b/test/core/surface/BUILD index 58087f518d7..37a371dc4e8 100644 --- a/test/core/surface/BUILD +++ b/test/core/surface/BUILD @@ -55,7 +55,7 @@ grpc_cc_test( grpc_cc_test( name = "completion_queue_threading_test", srcs = ["completion_queue_threading_test.cc"], - flaky = True, + flaky = True, # TODO(b/153064668) language = "C++", deps = [ "//:gpr", From 2ac5fde78aa3e56ba05af81c79b87faca78f611b Mon Sep 17 00:00:00 2001 From: Eric Anderson Date: Fri, 3 Apr 2020 09:43:37 -0700 Subject: [PATCH 355/758] Fix indentation --- tools/run_tests/run_xds_tests.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tools/run_tests/run_xds_tests.py b/tools/run_tests/run_xds_tests.py index 7fd0cfcc693..b9d662aaa0c 100755 --- a/tools/run_tests/run_xds_tests.py +++ b/tools/run_tests/run_xds_tests.py @@ -1091,13 +1091,13 @@ try: else: server_uri = service_host_name + ':' + str(gcp.service_port) if args.bootstrap_file: - bootstrap_path = os.path.abspath(args.bootstrap_file) + bootstrap_path = os.path.abspath(args.bootstrap_file) else: - with tempfile.NamedTemporaryFile(delete=False) as bootstrap_file: - bootstrap_file.write( - _BOOTSTRAP_TEMPLATE.format( - node_id=socket.gethostname()).encode('utf-8')) - bootstrap_path = bootstrap_file.name + with tempfile.NamedTemporaryFile(delete=False) as bootstrap_file: + bootstrap_file.write( + _BOOTSTRAP_TEMPLATE.format( + node_id=socket.gethostname()).encode('utf-8')) + bootstrap_path = bootstrap_file.name client_env = dict(os.environ, GRPC_XDS_BOOTSTRAP=bootstrap_path) client_cmd = shlex.split( args.client_cmd.format(server_uri=server_uri, From 8b1a6c8f45a28cf96c352d42fd608eaab05af4ba Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Fri, 3 Apr 2020 11:25:36 -0700 Subject: [PATCH 356/758] Accepts normal iterable of request messages --- .../grpc/experimental/aio/_base_channel.py | 15 +++++--- .../grpcio/grpc/experimental/aio/_call.py | 37 +++++++++++-------- .../grpcio/grpc/experimental/aio/_channel.py | 10 ++--- .../grpcio/grpc/experimental/aio/_typing.py | 5 ++- .../grpcio_tests/tests_aio/unit/call_test.py | 26 +++++++++++++ 5 files changed, 65 insertions(+), 28 deletions(-) diff --git a/src/python/grpcio/grpc/experimental/aio/_base_channel.py b/src/python/grpcio/grpc/experimental/aio/_base_channel.py index 1168c260e97..663afe096eb 100644 --- a/src/python/grpcio/grpc/experimental/aio/_base_channel.py +++ b/src/python/grpcio/grpc/experimental/aio/_base_channel.py @@ -14,12 +14,13 @@ """Abstract base classes for Channel objects and Multicallable objects.""" import abc -from typing import Any, AsyncIterable, Optional +from typing import Any, AsyncIterable, Iterable, Optional import grpc from . import _base_call -from ._typing import DeserializingFunction, MetadataType, SerializingFunction +from ._typing import (DeserializingFunction, MetadataType, RequestIterableType, + SerializingFunction) _IMMUTABLE_EMPTY_TUPLE = tuple() @@ -105,7 +106,7 @@ class StreamUnaryMultiCallable(abc.ABC): @abc.abstractmethod def __call__(self, - request_async_iterator: Optional[AsyncIterable[Any]] = None, + request_iterator: Optional[RequestIterableType] = None, timeout: Optional[float] = None, metadata: Optional[MetadataType] = _IMMUTABLE_EMPTY_TUPLE, credentials: Optional[grpc.CallCredentials] = None, @@ -115,7 +116,8 @@ class StreamUnaryMultiCallable(abc.ABC): """Asynchronously invokes the underlying RPC. Args: - request: The request value for the RPC. + request_iterator: An optional async iterable or iterable of request + messages for the RPC. timeout: An optional duration of time in seconds to allow for the RPC. metadata: Optional :term:`metadata` to be transmitted to the @@ -142,7 +144,7 @@ class StreamStreamMultiCallable(abc.ABC): @abc.abstractmethod def __call__(self, - request_async_iterator: Optional[AsyncIterable[Any]] = None, + request_iterator: Optional[RequestIterableType] = None, timeout: Optional[float] = None, metadata: Optional[MetadataType] = _IMMUTABLE_EMPTY_TUPLE, credentials: Optional[grpc.CallCredentials] = None, @@ -152,7 +154,8 @@ class StreamStreamMultiCallable(abc.ABC): """Asynchronously invokes the underlying RPC. Args: - request: The request value for the RPC. + request_iterator: An optional async iterable or iterable of request + messages for the RPC. timeout: An optional duration of time in seconds to allow for the RPC. metadata: Optional :term:`metadata` to be transmitted to the diff --git a/src/python/grpcio/grpc/experimental/aio/_call.py b/src/python/grpcio/grpc/experimental/aio/_call.py index 25e8f7eeaa8..8fafcde2a1b 100644 --- a/src/python/grpcio/grpc/experimental/aio/_call.py +++ b/src/python/grpcio/grpc/experimental/aio/_call.py @@ -15,6 +15,7 @@ import asyncio import enum +import inspect import logging from functools import partial from typing import AsyncIterable, Awaitable, Optional, Tuple @@ -25,8 +26,8 @@ from grpc._cython import cygrpc from . import _base_call from ._typing import (DeserializingFunction, DoneCallbackType, MetadataType, - MetadatumType, RequestType, ResponseType, - SerializingFunction) + MetadatumType, RequestIterableType, RequestType, + ResponseType, SerializingFunction) __all__ = 'AioRpcError', 'Call', 'UnaryUnaryCall', 'UnaryStreamCall' @@ -363,14 +364,14 @@ class _StreamRequestMixin(Call): _request_style: _APIStyle def _init_stream_request_mixin( - self, request_async_iterator: Optional[AsyncIterable[RequestType]]): + self, request_iterator: Optional[RequestIterableType]): self._metadata_sent = asyncio.Event(loop=self._loop) self._done_writing_flag = False # If user passes in an async iterator, create a consumer Task. - if request_async_iterator is not None: + if request_iterator is not None: self._async_request_poller = self._loop.create_task( - self._consume_request_iterator(request_async_iterator)) + self._consume_request_iterator(request_iterator)) self._request_style = _APIStyle.ASYNC_GENERATOR else: self._async_request_poller = None @@ -392,12 +393,18 @@ class _StreamRequestMixin(Call): def _metadata_sent_observer(self): self._metadata_sent.set() - async def _consume_request_iterator( - self, request_async_iterator: AsyncIterable[RequestType]) -> None: + async def _consume_request_iterator(self, + request_iterator: RequestIterableType + ) -> None: try: - async for request in request_async_iterator: - await self._write(request) - await self._done_writing() + if inspect.isasyncgen(request_iterator): + async for request in request_iterator: + await self._write(request) + await self._done_writing() + else: + for request in request_iterator: + await self._write(request) + await self._done_writing() except AioRpcError as rpc_error: # Rpc status should be exposed through other API. Exceptions raised # within this Task won't be retrieved by another coroutine. It's @@ -538,8 +545,7 @@ class StreamUnaryCall(_StreamRequestMixin, _UnaryResponseMixin, Call, """ # pylint: disable=too-many-arguments - def __init__(self, - request_async_iterator: Optional[AsyncIterable[RequestType]], + def __init__(self, request_iterator: Optional[RequestIterableType], deadline: Optional[float], metadata: MetadataType, credentials: Optional[grpc.CallCredentials], wait_for_ready: Optional[bool], channel: cygrpc.AioChannel, @@ -550,7 +556,7 @@ class StreamUnaryCall(_StreamRequestMixin, _UnaryResponseMixin, Call, channel.call(method, deadline, credentials, wait_for_ready), metadata, request_serializer, response_deserializer, loop) - self._init_stream_request_mixin(request_async_iterator) + self._init_stream_request_mixin(request_iterator) self._init_unary_response_mixin(self._conduct_rpc()) async def _conduct_rpc(self) -> ResponseType: @@ -577,8 +583,7 @@ class StreamStreamCall(_StreamRequestMixin, _StreamResponseMixin, Call, _initializer: asyncio.Task # pylint: disable=too-many-arguments - def __init__(self, - request_async_iterator: Optional[AsyncIterable[RequestType]], + def __init__(self, request_iterator: Optional[RequestIterableType], deadline: Optional[float], metadata: MetadataType, credentials: Optional[grpc.CallCredentials], wait_for_ready: Optional[bool], channel: cygrpc.AioChannel, @@ -589,7 +594,7 @@ class StreamStreamCall(_StreamRequestMixin, _StreamResponseMixin, Call, channel.call(method, deadline, credentials, wait_for_ready), metadata, request_serializer, response_deserializer, loop) self._initializer = self._loop.create_task(self._prepare_rpc()) - self._init_stream_request_mixin(request_async_iterator) + self._init_stream_request_mixin(request_iterator) self._init_stream_response_mixin(self._initializer) async def _prepare_rpc(self): diff --git a/src/python/grpcio/grpc/experimental/aio/_channel.py b/src/python/grpcio/grpc/experimental/aio/_channel.py index 24a38e1f3d0..859a6ddd846 100644 --- a/src/python/grpcio/grpc/experimental/aio/_channel.py +++ b/src/python/grpcio/grpc/experimental/aio/_channel.py @@ -27,7 +27,7 @@ from ._call import (StreamStreamCall, StreamUnaryCall, UnaryStreamCall, from ._interceptor import (InterceptedUnaryUnaryCall, UnaryUnaryClientInterceptor) from ._typing import (ChannelArgumentType, DeserializingFunction, MetadataType, - SerializingFunction) + SerializingFunction, RequestIterableType) from ._utils import _timeout_to_deadline _IMMUTABLE_EMPTY_TUPLE = tuple() @@ -146,7 +146,7 @@ class StreamUnaryMultiCallable(_BaseMultiCallable, _base_channel.StreamUnaryMultiCallable): def __call__(self, - request_async_iterator: Optional[AsyncIterable[Any]] = None, + request_iterator: Optional[RequestIterableType] = None, timeout: Optional[float] = None, metadata: Optional[MetadataType] = _IMMUTABLE_EMPTY_TUPLE, credentials: Optional[grpc.CallCredentials] = None, @@ -158,7 +158,7 @@ class StreamUnaryMultiCallable(_BaseMultiCallable, deadline = _timeout_to_deadline(timeout) - call = StreamUnaryCall(request_async_iterator, deadline, metadata, + call = StreamUnaryCall(request_iterator, deadline, metadata, credentials, wait_for_ready, self._channel, self._method, self._request_serializer, self._response_deserializer, self._loop) @@ -170,7 +170,7 @@ class StreamStreamMultiCallable(_BaseMultiCallable, _base_channel.StreamStreamMultiCallable): def __call__(self, - request_async_iterator: Optional[AsyncIterable[Any]] = None, + request_iterator: Optional[RequestIterableType] = None, timeout: Optional[float] = None, metadata: Optional[MetadataType] = _IMMUTABLE_EMPTY_TUPLE, credentials: Optional[grpc.CallCredentials] = None, @@ -182,7 +182,7 @@ class StreamStreamMultiCallable(_BaseMultiCallable, deadline = _timeout_to_deadline(timeout) - call = StreamStreamCall(request_async_iterator, deadline, metadata, + call = StreamStreamCall(request_iterator, deadline, metadata, credentials, wait_for_ready, self._channel, self._method, self._request_serializer, self._response_deserializer, self._loop) diff --git a/src/python/grpcio/grpc/experimental/aio/_typing.py b/src/python/grpcio/grpc/experimental/aio/_typing.py index ccd2f529936..205f6dc6227 100644 --- a/src/python/grpcio/grpc/experimental/aio/_typing.py +++ b/src/python/grpcio/grpc/experimental/aio/_typing.py @@ -13,7 +13,9 @@ # limitations under the License. """Common types for gRPC Async API""" -from typing import Any, AnyStr, Callable, Sequence, Tuple, TypeVar +from typing import (Any, AnyStr, AsyncIterable, Callable, Iterable, Sequence, + Tuple, TypeVar, Union) + from grpc._cython.cygrpc import EOF RequestType = TypeVar('RequestType') @@ -25,3 +27,4 @@ MetadataType = Sequence[MetadatumType] ChannelArgumentType = Sequence[Tuple[str, Any]] EOFType = type(EOF) DoneCallbackType = Callable[[Any], None] +RequestIterableType = Union[Iterable[Any], AsyncIterable[Any]] diff --git a/src/python/grpcio_tests/tests_aio/unit/call_test.py b/src/python/grpcio_tests/tests_aio/unit/call_test.py index f64f4e44802..5b52f0e1724 100644 --- a/src/python/grpcio_tests/tests_aio/unit/call_test.py +++ b/src/python/grpcio_tests/tests_aio/unit/call_test.py @@ -559,6 +559,23 @@ class TestStreamUnaryCall(_MulticallableTestMixin, AioTestBase): # No failures in the cancel later task! await cancel_later_task + async def test_normal_iterable_requests(self): + # Prepares the request + payload = messages_pb2.Payload(body=b'\0' * _REQUEST_PAYLOAD_SIZE) + request = messages_pb2.StreamingInputCallRequest(payload=payload) + requests = [request] * _NUM_STREAM_RESPONSES + + # Sends out requests + call = self._stub.StreamingInputCall(requests) + + # RPC should succeed + response = await call + self.assertIsInstance(response, messages_pb2.StreamingInputCallResponse) + self.assertEqual(_NUM_STREAM_RESPONSES * _REQUEST_PAYLOAD_SIZE, + response.aggregated_payload_size) + + self.assertEqual(await call.code(), grpc.StatusCode.OK) + # Prepares the request that stream in a ping-pong manner. _STREAM_OUTPUT_REQUEST_ONE_RESPONSE = messages_pb2.StreamingOutputCallRequest() @@ -738,6 +755,15 @@ class TestStreamStreamCall(_MulticallableTestMixin, AioTestBase): # No failures in the cancel later task! await cancel_later_task + async def test_normal_iterable_requests(self): + requests = [_STREAM_OUTPUT_REQUEST_ONE_RESPONSE] * _NUM_STREAM_RESPONSES + + call = self._stub.FullDuplexCall(iter(requests)) + async for response in call: + self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) + + self.assertEqual(await call.code(), grpc.StatusCode.OK) + if __name__ == '__main__': logging.basicConfig(level=logging.DEBUG) From e00eb2fec2d74184f19708661895866e8f959e2b Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Fri, 3 Apr 2020 11:36:33 -0700 Subject: [PATCH 357/758] Make pylint happy --- src/python/grpcio/grpc/experimental/aio/_base_channel.py | 2 +- src/python/grpcio/grpc/experimental/aio/_channel.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/python/grpcio/grpc/experimental/aio/_base_channel.py b/src/python/grpcio/grpc/experimental/aio/_base_channel.py index 663afe096eb..11744f0882a 100644 --- a/src/python/grpcio/grpc/experimental/aio/_base_channel.py +++ b/src/python/grpcio/grpc/experimental/aio/_base_channel.py @@ -14,7 +14,7 @@ """Abstract base classes for Channel objects and Multicallable objects.""" import abc -from typing import Any, AsyncIterable, Iterable, Optional +from typing import Any, Optional import grpc diff --git a/src/python/grpcio/grpc/experimental/aio/_channel.py b/src/python/grpcio/grpc/experimental/aio/_channel.py index 859a6ddd846..5e669e1a3f5 100644 --- a/src/python/grpcio/grpc/experimental/aio/_channel.py +++ b/src/python/grpcio/grpc/experimental/aio/_channel.py @@ -15,7 +15,7 @@ import asyncio import sys -from typing import Any, AsyncIterable, Iterable, Optional, Sequence +from typing import Any, Iterable, Optional, Sequence import grpc from grpc import _common, _compression, _grpcio_metadata From a65844c63a00ac39db1c627fb11dcb76b544714b Mon Sep 17 00:00:00 2001 From: Muxi Yan Date: Fri, 3 Apr 2020 11:44:37 -0700 Subject: [PATCH 358/758] build_project --- build_autogenerated.yaml | 234 -- gRPC-Core.podspec | 9 +- src/objective-c/BoringSSL-GRPC.podspec | 4718 +---------------------- tools/dockerfile/test/sanity/Dockerfile | 1 - tools/doxygen/Doxyfile.c++.internal | 1 - 5 files changed, 3 insertions(+), 4960 deletions(-) diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml index 410e9fa650e..9520e03cd46 100644 --- a/build_autogenerated.yaml +++ b/build_autogenerated.yaml @@ -8,32 +8,6 @@ libs: - third_party/address_sorting/address_sorting_internal.h - third_party/address_sorting/include/address_sorting/address_sorting.h src: -<<<<<<< HEAD:build.yaml - - src/core/tsi/alts/crypt/aes_gcm.cc - - src/core/tsi/alts/crypt/gsec.cc - - src/core/tsi/alts/frame_protector/alts_counter.cc - - src/core/tsi/alts/frame_protector/alts_crypter.cc - - src/core/tsi/alts/frame_protector/alts_frame_protector.cc - - src/core/tsi/alts/frame_protector/alts_record_protocol_crypter_common.cc - - src/core/tsi/alts/frame_protector/alts_seal_privacy_integrity_crypter.cc - - src/core/tsi/alts/frame_protector/alts_unseal_privacy_integrity_crypter.cc - - src/core/tsi/alts/frame_protector/frame_handler.cc - - src/core/tsi/alts/handshaker/alts_handshaker_client.cc - - src/core/tsi/alts/handshaker/alts_shared_resource.cc - - src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc - - src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc - - src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.cc - - src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc - - src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.cc - - src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc - uses: - - alts_util - - grpc_base - - grpc_transport_chttp2_client_insecure - - tsi_interface - - tsi -- name: alts_upb -======= - third_party/address_sorting/address_sorting.c - third_party/address_sorting/address_sorting_posix.c - third_party/address_sorting/address_sorting_windows.c @@ -43,7 +17,6 @@ libs: build: private language: c public_headers: [] ->>>>>>> upstream/master:build_autogenerated.yaml headers: - test/core/end2end/cq_verifier.h - test/core/end2end/data/ssl_test_data.h @@ -744,7 +717,6 @@ libs: - src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.h - src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.h - src/core/tsi/fake_transport_security.h - - src/core/tsi/grpc_shadow_boringssl.h - src/core/tsi/local_transport_security.h - src/core/tsi/ssl/session_cache/ssl_session.h - src/core/tsi/ssl/session_cache/ssl_session_cache.h @@ -1107,21 +1079,6 @@ libs: - src/core/lib/surface/event_string.cc - src/core/lib/surface/init.cc - src/core/lib/surface/init_secure.cc -<<<<<<< HEAD:build.yaml - uses: - - alts_tsi - - grpc_base - - grpc_transport_chttp2_alpn - - tsi -- name: grpc_server_backward_compatibility - headers: - - src/core/ext/filters/workarounds/workaround_utils.h - src: - - src/core/ext/filters/workarounds/workaround_utils.cc - uses: - - grpc_base -- name: grpc_test_util_base -======= - src/core/lib/surface/lame_client.cc - src/core/lib/surface/metadata_array.cc - src/core/lib/surface/server.cc @@ -1196,7 +1153,6 @@ libs: build: private language: c public_headers: [] ->>>>>>> upstream/master:build_autogenerated.yaml headers: - test/core/util/cmdline.h - test/core/util/debugger_macros.h @@ -1658,195 +1614,6 @@ libs: - src/core/ext/filters/client_channel/xds/xds_channel.cc - src/core/ext/filters/client_channel/xds/xds_client.cc - src/core/ext/filters/client_channel/xds/xds_client_stats.cc -<<<<<<< HEAD:build.yaml - uses: - - envoy_ads_upb - - grpc_base - - grpc_client_channel -- name: grpc_xds_client_secure - headers: - - src/core/ext/filters/client_channel/xds/xds_api.h - - src/core/ext/filters/client_channel/xds/xds_bootstrap.h - - src/core/ext/filters/client_channel/xds/xds_channel.h - - src/core/ext/filters/client_channel/xds/xds_channel_args.h - - src/core/ext/filters/client_channel/xds/xds_client.h - - src/core/ext/filters/client_channel/xds/xds_client_stats.h - src: - - src/core/ext/filters/client_channel/xds/xds_api.cc - - src/core/ext/filters/client_channel/xds/xds_bootstrap.cc - - src/core/ext/filters/client_channel/xds/xds_channel_secure.cc - - src/core/ext/filters/client_channel/xds/xds_client.cc - - src/core/ext/filters/client_channel/xds/xds_client_stats.cc - uses: - - envoy_ads_upb - - grpc_base - - grpc_client_channel - - grpc_secure -- name: grpcpp_channelz_proto - src: - - src/proto/grpc/channelz/channelz.proto -- name: proto_gen_validate_upb - headers: - - src/core/ext/upb-generated/gogoproto/gogo.upb.h - - src/core/ext/upb-generated/validate/validate.upb.h - src: - - src/core/ext/upb-generated/gogoproto/gogo.upb.c - - src/core/ext/upb-generated/validate/validate.upb.c - uses: - - google_api_upb -- name: transport_security_test_lib - headers: - - test/core/tsi/transport_security_test_lib.h - src: - - test/core/tsi/transport_security_test_lib.cc - deps: - - grpc -- name: tsi - headers: - - src/core/tsi/fake_transport_security.h - - src/core/tsi/local_transport_security.h - - src/core/tsi/ssl/session_cache/ssl_session.h - - src/core/tsi/ssl/session_cache/ssl_session_cache.h - - src/core/tsi/ssl_transport_security.h - - src/core/tsi/ssl_types.h - - src/core/tsi/transport_security_grpc.h - src: - - src/core/tsi/fake_transport_security.cc - - src/core/tsi/local_transport_security.cc - - src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc - - src/core/tsi/ssl/session_cache/ssl_session_cache.cc - - src/core/tsi/ssl/session_cache/ssl_session_openssl.cc - - src/core/tsi/ssl_transport_security.cc - - src/core/tsi/transport_security_grpc.cc - deps: - - gpr - uses: - - tsi_interface - - grpc_base - - grpc_trace -- name: tsi_interface - headers: - - src/core/tsi/transport_security.h - - src/core/tsi/transport_security_interface.h - src: - - src/core/tsi/transport_security.cc - deps: - - gpr - uses: - - grpc_trace -libs: -- name: address_sorting - build: all - language: c - headers: - - third_party/address_sorting/address_sorting_internal.h - - third_party/address_sorting/include/address_sorting/address_sorting.h - src: - - third_party/address_sorting/address_sorting.c - - third_party/address_sorting/address_sorting_posix.c - - third_party/address_sorting/address_sorting_windows.c - secure: false -- name: alts_test_util - build: private - language: c - headers: - - test/core/tsi/alts/crypt/gsec_test_util.h - - test/core/tsi/alts/handshaker/alts_handshaker_service_api_test_lib.h - src: - - test/core/tsi/alts/crypt/gsec_test_util.cc - - test/core/tsi/alts/handshaker/alts_handshaker_service_api_test_lib.cc - deps: - - grpc - secure: true -- name: gpr - build: all - language: c - filegroups: - - gpr_base - secure: false -- name: grpc - build: all - language: c - src: - - src/core/lib/surface/init.cc - baselib: true - deps_linkage: static - dll: true - filegroups: - - grpc_base - - grpc_transport_chttp2_server_secure - - grpc_transport_chttp2_client_secure - - grpc_transport_chttp2_server_insecure - - grpc_transport_chttp2_client_insecure - - grpc_transport_inproc - - grpc_lb_policy_grpclb_secure - - grpc_lb_policy_cds_secure - - grpc_lb_policy_xds_secure - - grpc_lb_policy_pick_first - - grpc_lb_policy_round_robin - - grpc_resolver_dns_ares - - grpc_resolver_dns_native - - grpc_resolver_sockaddr - - grpc_resolver_fake - - grpc_resolver_xds_secure - - grpc_secure - - census - - grpc_client_idle_filter - - grpc_max_age_filter - - grpc_message_size_filter - - grpc_deadline_filter - - grpc_client_authority_filter - - grpc_workaround_cronet_compression_filter - - grpc_server_backward_compatibility - generate_plugin_registry: true - secure: true -- name: grpc_cronet - build: all - language: c - src: - - src/core/ext/transport/cronet/plugin_registry/grpc_cronet_plugin_registry.cc - - src/core/lib/surface/init.cc - baselib: true - deps_linkage: static - dll: true - filegroups: - - grpc_base - - grpc_transport_cronet_client_secure - - grpc_transport_chttp2_client_secure - platforms: - - linux - secure: true -- name: grpc_test_util - build: private - language: c - headers: - - test/core/end2end/data/ssl_test_data.h - - test/core/security/oauth2_utils.h - src: - - test/core/end2end/data/client_certs.cc - - test/core/end2end/data/server1_cert.cc - - test/core/end2end/data/server1_key.cc - - test/core/end2end/data/test_root_cert.cc - - test/core/security/oauth2_utils.cc - deps: - - gpr - - grpc - filegroups: - - grpc_test_util_base -- name: grpc_test_util_unsecure - build: private - language: c - deps: - - gpr - - grpc_unsecure - filegroups: - - grpc_test_util_base - secure: false -- name: grpc_unsecure - build: all - language: c - src: -======= - src/core/ext/filters/client_idle/client_idle_filter.cc - src/core/ext/filters/deadline/deadline_filter.cc - src/core/ext/filters/http/client/http_client_filter.cc @@ -2093,7 +1860,6 @@ libs: - src/core/lib/surface/completion_queue.cc - src/core/lib/surface/completion_queue_factory.cc - src/core/lib/surface/event_string.cc ->>>>>>> upstream/master:build_autogenerated.yaml - src/core/lib/surface/init.cc - src/core/lib/surface/init_unsecure.cc - src/core/lib/surface/lame_client.cc diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec index cd1982713d5..f27ff005b97 100644 --- a/gRPC-Core.podspec +++ b/gRPC-Core.podspec @@ -172,11 +172,7 @@ Pod::Spec.new do |s| ss.header_mappings_dir = '.' ss.libraries = 'z' ss.dependency "#{s.name}/Interface", version -<<<<<<< HEAD - ss.dependency 'BoringSSL-GRPC', '0.0.6' - ss.compiler_flags = '-DBORINGSSL_PREFIX=GRPC' -======= - ss.dependency 'BoringSSL-GRPC', '0.0.7' + ss.dependency 'BoringSSL-GRPC', '0.0.8' abseil_version = '1.20200225.0' ss.dependency 'abseil/container/inlined_vector', abseil_version ss.dependency 'abseil/memory/memory', abseil_version @@ -184,8 +180,7 @@ Pod::Spec.new do |s| ss.dependency 'abseil/strings/strings', abseil_version ss.dependency 'abseil/time/time', abseil_version ss.dependency 'abseil/types/optional', abseil_version - ss.compiler_flags = '-DGRPC_SHADOW_BORINGSSL_SYMBOLS' ->>>>>>> upstream/master + ss.compiler_flags = '-DBORINGSSL_PREFIX=GRPC' ss.source_files = 'src/core/ext/filters/census/grpc_context.cc', 'src/core/ext/filters/client_channel/backend_metric.cc', diff --git a/src/objective-c/BoringSSL-GRPC.podspec b/src/objective-c/BoringSSL-GRPC.podspec index d28dda69994..1b86cb2d2a2 100644 --- a/src/objective-c/BoringSSL-GRPC.podspec +++ b/src/objective-c/BoringSSL-GRPC.podspec @@ -202,1425 +202,6 @@ Pod::Spec.new do |s| } EOF -<<<<<<< HEAD - # To build boringssl, we need the generated file err_data.c, which is normally generated - # by boringssl's err_data_generate.go, but we already have a copy of err_data.c checked into the - # grpc/grpc repository that gets regenerated whenever we update the third_party/boringssl submodule. - # To make the podspec independent of the grpc repository, the .podspec.template just copies - # the contents of err_data.c directly into the .podspec. - # TODO(jtattermusch): avoid needing to run tools/buildgen/generate_projects.sh twice on update - # TODO(jtattermusch): another pre-generated copy of err_data.c is under third_party/boringssl-with-bazel - # investigate if we could use it. - cat > err_data.c < - #include - #include - - - OPENSSL_STATIC_ASSERT(ERR_LIB_NONE == 1, "library value changed"); - OPENSSL_STATIC_ASSERT(ERR_LIB_SYS == 2, "library value changed"); - OPENSSL_STATIC_ASSERT(ERR_LIB_BN == 3, "library value changed"); - OPENSSL_STATIC_ASSERT(ERR_LIB_RSA == 4, "library value changed"); - OPENSSL_STATIC_ASSERT(ERR_LIB_DH == 5, "library value changed"); - OPENSSL_STATIC_ASSERT(ERR_LIB_EVP == 6, "library value changed"); - OPENSSL_STATIC_ASSERT(ERR_LIB_BUF == 7, "library value changed"); - OPENSSL_STATIC_ASSERT(ERR_LIB_OBJ == 8, "library value changed"); - OPENSSL_STATIC_ASSERT(ERR_LIB_PEM == 9, "library value changed"); - OPENSSL_STATIC_ASSERT(ERR_LIB_DSA == 10, "library value changed"); - OPENSSL_STATIC_ASSERT(ERR_LIB_X509 == 11, "library value changed"); - OPENSSL_STATIC_ASSERT(ERR_LIB_ASN1 == 12, "library value changed"); - OPENSSL_STATIC_ASSERT(ERR_LIB_CONF == 13, "library value changed"); - OPENSSL_STATIC_ASSERT(ERR_LIB_CRYPTO == 14, "library value changed"); - OPENSSL_STATIC_ASSERT(ERR_LIB_EC == 15, "library value changed"); - OPENSSL_STATIC_ASSERT(ERR_LIB_SSL == 16, "library value changed"); - OPENSSL_STATIC_ASSERT(ERR_LIB_BIO == 17, "library value changed"); - OPENSSL_STATIC_ASSERT(ERR_LIB_PKCS7 == 18, "library value changed"); - OPENSSL_STATIC_ASSERT(ERR_LIB_PKCS8 == 19, "library value changed"); - OPENSSL_STATIC_ASSERT(ERR_LIB_X509V3 == 20, "library value changed"); - OPENSSL_STATIC_ASSERT(ERR_LIB_RAND == 21, "library value changed"); - OPENSSL_STATIC_ASSERT(ERR_LIB_ENGINE == 22, "library value changed"); - OPENSSL_STATIC_ASSERT(ERR_LIB_OCSP == 23, "library value changed"); - OPENSSL_STATIC_ASSERT(ERR_LIB_UI == 24, "library value changed"); - OPENSSL_STATIC_ASSERT(ERR_LIB_COMP == 25, "library value changed"); - OPENSSL_STATIC_ASSERT(ERR_LIB_ECDSA == 26, "library value changed"); - OPENSSL_STATIC_ASSERT(ERR_LIB_ECDH == 27, "library value changed"); - OPENSSL_STATIC_ASSERT(ERR_LIB_HMAC == 28, "library value changed"); - OPENSSL_STATIC_ASSERT(ERR_LIB_DIGEST == 29, "library value changed"); - OPENSSL_STATIC_ASSERT(ERR_LIB_CIPHER == 30, "library value changed"); - OPENSSL_STATIC_ASSERT(ERR_LIB_HKDF == 31, "library value changed"); - OPENSSL_STATIC_ASSERT(ERR_LIB_USER == 32, "library value changed"); - OPENSSL_STATIC_ASSERT(ERR_NUM_LIBS == 33, "number of libraries changed"); - - const uint32_t kOpenSSLReasonValues[] = { - 0xc32083a, - 0xc328854, - 0xc330863, - 0xc338873, - 0xc340882, - 0xc34889b, - 0xc3508a7, - 0xc3588c4, - 0xc3608e4, - 0xc3688f2, - 0xc370902, - 0xc37890f, - 0xc38091f, - 0xc38892a, - 0xc390940, - 0xc39894f, - 0xc3a0963, - 0xc3a8847, - 0xc3b00ea, - 0xc3b88d6, - 0x10320847, - 0x1032959f, - 0x103315ab, - 0x103395c4, - 0x103415d7, - 0x10348f27, - 0x10350c60, - 0x103595ea, - 0x10361614, - 0x10369627, - 0x10371646, - 0x1037965f, - 0x10381674, - 0x10389692, - 0x103916a1, - 0x103996bd, - 0x103a16d8, - 0x103a96e7, - 0x103b1703, - 0x103b971e, - 0x103c1744, - 0x103c80ea, - 0x103d1755, - 0x103d9769, - 0x103e1788, - 0x103e9797, - 0x103f17ae, - 0x103f97c1, - 0x10400c24, - 0x104097d4, - 0x104117f2, - 0x10419805, - 0x1042181f, - 0x1042982f, - 0x10431843, - 0x10439859, - 0x10441871, - 0x10449886, - 0x1045189a, - 0x104598ac, - 0x104605fd, - 0x1046894f, - 0x104718c1, - 0x104798d8, - 0x104818ed, - 0x104898fb, - 0x10490e73, - 0x10499735, - 0x104a15ff, - 0x14320c07, - 0x14328c15, - 0x14330c24, - 0x14338c36, - 0x143400ac, - 0x143480ea, - 0x18320083, - 0x18328f7d, - 0x183300ac, - 0x18338f93, - 0x18340fa7, - 0x183480ea, - 0x18350fbc, - 0x18358fd4, - 0x18360fe9, - 0x18368ffd, - 0x18371021, - 0x18379037, - 0x1838104b, - 0x1838905b, - 0x18390a75, - 0x1839906b, - 0x183a1091, - 0x183a90b7, - 0x183b0c7f, - 0x183b9106, - 0x183c1118, - 0x183c9123, - 0x183d1133, - 0x183d9144, - 0x183e1155, - 0x183e9167, - 0x183f1190, - 0x183f91a9, - 0x184011c1, - 0x184086d5, - 0x184110da, - 0x184190a5, - 0x184210c4, - 0x18428c6c, - 0x18431080, - 0x184390ec, - 0x203211fb, - 0x203291e8, - 0x24321207, - 0x24328995, - 0x24331219, - 0x24339226, - 0x24341233, - 0x24349245, - 0x24351254, - 0x24359271, - 0x2436127e, - 0x2436928c, - 0x2437129a, - 0x243792a8, - 0x243812b1, - 0x243892be, - 0x243912d1, - 0x28320c54, - 0x28328c7f, - 0x28330c24, - 0x28338c92, - 0x28340c60, - 0x283480ac, - 0x283500ea, - 0x28358c6c, - 0x2c322f0c, - 0x2c3292e8, - 0x2c332f1a, - 0x2c33af2c, - 0x2c342f40, - 0x2c34af52, - 0x2c352f6d, - 0x2c35af7f, - 0x2c362f92, - 0x2c36832d, - 0x2c372f9f, - 0x2c37afb1, - 0x2c382fd6, - 0x2c38afed, - 0x2c392ffb, - 0x2c39b00b, - 0x2c3a301d, - 0x2c3ab031, - 0x2c3b3042, - 0x2c3bb061, - 0x2c3c12fa, - 0x2c3c9310, - 0x2c3d3075, - 0x2c3d9329, - 0x2c3e3092, - 0x2c3eb0a0, - 0x2c3f30b8, - 0x2c3fb0d0, - 0x2c4030fa, - 0x2c4091fb, - 0x2c41310b, - 0x2c41b11e, - 0x2c4211c1, - 0x2c42b12f, - 0x2c430722, - 0x2c43b053, - 0x2c442fc4, - 0x2c44b0dd, - 0x30320000, - 0x30328015, - 0x3033001f, - 0x30338038, - 0x3034004a, - 0x30348064, - 0x3035006b, - 0x30358083, - 0x30360094, - 0x303680ac, - 0x303700b9, - 0x303780c8, - 0x303800ea, - 0x303880f7, - 0x3039010a, - 0x30398125, - 0x303a013a, - 0x303a814e, - 0x303b0162, - 0x303b8173, - 0x303c018c, - 0x303c81a9, - 0x303d01b7, - 0x303d81cb, - 0x303e01db, - 0x303e81f4, - 0x303f0204, - 0x303f8217, - 0x30400226, - 0x30408232, - 0x30410247, - 0x30418257, - 0x3042026e, - 0x3042827b, - 0x3043028e, - 0x3043829d, - 0x304402b2, - 0x304482d3, - 0x304502e6, - 0x304582f9, - 0x30460312, - 0x3046832d, - 0x3047034a, - 0x3047835c, - 0x3048036a, - 0x3048837b, - 0x3049038a, - 0x304983a2, - 0x304a03b4, - 0x304a83c8, - 0x304b03e0, - 0x304b83f3, - 0x304c03fe, - 0x304c840f, - 0x304d041b, - 0x304d8431, - 0x304e043f, - 0x304e8455, - 0x304f0467, - 0x304f8479, - 0x3050049c, - 0x305084af, - 0x305104c0, - 0x305184d0, - 0x305204e8, - 0x305284fd, - 0x30530515, - 0x30538529, - 0x30540541, - 0x3054855a, - 0x30550573, - 0x30558590, - 0x3056059b, - 0x305685b3, - 0x305705c3, - 0x305785d4, - 0x305805e7, - 0x305885fd, - 0x30590606, - 0x3059861b, - 0x305a062e, - 0x305a863d, - 0x305b065d, - 0x305b866c, - 0x305c068d, - 0x305c86a9, - 0x305d06b5, - 0x305d86d5, - 0x305e06f1, - 0x305e8702, - 0x305f0718, - 0x305f8722, - 0x3060048c, - 0x34320b65, - 0x34328b79, - 0x34330b96, - 0x34338ba9, - 0x34340bb8, - 0x34348bf1, - 0x34350bd5, - 0x3c320083, - 0x3c328cbc, - 0x3c330cd5, - 0x3c338cf0, - 0x3c340d0d, - 0x3c348d37, - 0x3c350d52, - 0x3c358d78, - 0x3c360d91, - 0x3c368da9, - 0x3c370dba, - 0x3c378dc8, - 0x3c380dd5, - 0x3c388de9, - 0x3c390c7f, - 0x3c398e0c, - 0x3c3a0e20, - 0x3c3a890f, - 0x3c3b0e30, - 0x3c3b8e4b, - 0x3c3c0e5d, - 0x3c3c8e90, - 0x3c3d0e9a, - 0x3c3d8eae, - 0x3c3e0ebc, - 0x3c3e8ee1, - 0x3c3f0ca8, - 0x3c3f8eca, - 0x3c4000ac, - 0x3c4080ea, - 0x3c410d28, - 0x3c418d67, - 0x3c420e73, - 0x3c428dfd, - 0x40321971, - 0x40329987, - 0x403319b5, - 0x403399bf, - 0x403419d6, - 0x403499f4, - 0x40351a04, - 0x40359a16, - 0x40361a23, - 0x40369a2f, - 0x40371a44, - 0x40379a56, - 0x40381a61, - 0x40389a73, - 0x40390f27, - 0x40399a83, - 0x403a1a96, - 0x403a9ab7, - 0x403b1ac8, - 0x403b9ad8, - 0x403c0064, - 0x403c8083, - 0x403d1b5c, - 0x403d9b72, - 0x403e1b81, - 0x403e9bb9, - 0x403f1bd3, - 0x403f9bfb, - 0x40401c10, - 0x40409c24, - 0x40411c41, - 0x40419c5c, - 0x40421c75, - 0x40429c88, - 0x40431c9c, - 0x40439cb4, - 0x40441ccb, - 0x404480ac, - 0x40451ce0, - 0x40459cf2, - 0x40461d16, - 0x40469d36, - 0x40471d44, - 0x40479d6b, - 0x40481ddc, - 0x40489e0f, - 0x40491e26, - 0x40499e40, - 0x404a1e57, - 0x404a9e75, - 0x404b1e8d, - 0x404b9ea4, - 0x404c1eba, - 0x404c9ecc, - 0x404d1eed, - 0x404d9f26, - 0x404e1f3a, - 0x404e9f47, - 0x404f1f8e, - 0x404f9fd4, - 0x4050202b, - 0x4050a03f, - 0x40512072, - 0x40522082, - 0x4052a0a6, - 0x405320be, - 0x4053a0d1, - 0x405420e6, - 0x4054a109, - 0x40552117, - 0x4055a154, - 0x40562161, - 0x4056a17a, - 0x40572192, - 0x4057a1a5, - 0x405821ba, - 0x4058a1e1, - 0x40592210, - 0x4059a23d, - 0x405a2251, - 0x405aa261, - 0x405b2279, - 0x405ba28a, - 0x405c229d, - 0x405ca2dc, - 0x405d22e9, - 0x405da30e, - 0x405e234c, - 0x405e8ab3, - 0x405f236d, - 0x405fa37a, - 0x40602388, - 0x4060a3aa, - 0x4061240b, - 0x4061a443, - 0x4062245a, - 0x4062a46b, - 0x40632490, - 0x4063a4a5, - 0x406424bc, - 0x4064a4e8, - 0x40652503, - 0x4065a51a, - 0x40662532, - 0x4066a55c, - 0x40672587, - 0x4067a5cc, - 0x40682614, - 0x4068a635, - 0x40692667, - 0x4069a695, - 0x406a26b6, - 0x406aa6d6, - 0x406b285e, - 0x406ba881, - 0x406c2897, - 0x406cab3a, - 0x406d2b69, - 0x406dab91, - 0x406e2bbf, - 0x406eac0c, - 0x406f2c47, - 0x406fac7f, - 0x40702c92, - 0x4070acaf, - 0x40710802, - 0x4071acc1, - 0x40722cd4, - 0x4072ad0a, - 0x40732d22, - 0x407394fa, - 0x40742d36, - 0x4074ad50, - 0x40752d61, - 0x4075ad75, - 0x40762d83, - 0x407692be, - 0x40772da8, - 0x4077adca, - 0x40782de5, - 0x4078ae1e, - 0x40792e35, - 0x4079ae4b, - 0x407a2e77, - 0x407aae8a, - 0x407b2e9f, - 0x407baeb1, - 0x407c2ee2, - 0x407caeeb, - 0x407d2650, - 0x407d9fe4, - 0x407e2dfa, - 0x407ea1f1, - 0x407f1d58, - 0x407f9afe, - 0x40801f9e, - 0x40809d80, - 0x40812094, - 0x40819f78, - 0x40822baa, - 0x40829ae4, - 0x408321cc, - 0x4083a4cd, - 0x40841d94, - 0x4084a229, - 0x408522ae, - 0x4085a3d2, - 0x4086232e, - 0x40869ffe, - 0x40872bf0, - 0x4087a420, - 0x40881b45, - 0x4088a5df, - 0x40891b94, - 0x40899b21, - 0x408a28cf, - 0x408a9912, - 0x408b2ec6, - 0x408bac5c, - 0x408c22be, - 0x408c992e, - 0x408d1df5, - 0x408d9dc6, - 0x408e1f0f, - 0x408ea134, - 0x408f25f3, - 0x408fa3ee, - 0x409025a8, - 0x4090a300, - 0x409128b7, - 0x40919954, - 0x40921be1, - 0x4092ac2b, - 0x40932ced, - 0x4093a00f, - 0x40941da8, - 0x4094a8e8, - 0x4095247c, - 0x4095ae57, - 0x40962bd7, - 0x40969fb7, - 0x4097205a, - 0x40979f5e, - 0x41f42789, - 0x41f9281b, - 0x41fe270e, - 0x41fea92b, - 0x41ff2a1c, - 0x420327a2, - 0x420827c4, - 0x4208a800, - 0x420926f2, - 0x4209a83a, - 0x420a2749, - 0x420aa729, - 0x420b2769, - 0x420ba7e2, - 0x420c2a38, - 0x420ca8f8, - 0x420d2912, - 0x420da949, - 0x42122963, - 0x421729ff, - 0x4217a9a5, - 0x421c29c7, - 0x421f2982, - 0x42212a4f, - 0x422629e2, - 0x422b2b1e, - 0x422baacc, - 0x422c2b06, - 0x422caa8b, - 0x422d2a6a, - 0x422daaeb, - 0x422e2ab1, - 0x4432072d, - 0x4432873c, - 0x44330748, - 0x44338756, - 0x44340769, - 0x4434877a, - 0x44350781, - 0x4435878b, - 0x4436079e, - 0x443687b4, - 0x443707c6, - 0x443787d3, - 0x443807e2, - 0x443887ea, - 0x44390802, - 0x44398810, - 0x443a0823, - 0x483212e8, - 0x483292fa, - 0x48331310, - 0x48339329, - 0x4c32134e, - 0x4c32935e, - 0x4c331371, - 0x4c339391, - 0x4c3400ac, - 0x4c3480ea, - 0x4c35139d, - 0x4c3593ab, - 0x4c3613c7, - 0x4c3693ed, - 0x4c3713fc, - 0x4c37940a, - 0x4c38141f, - 0x4c38942b, - 0x4c39144b, - 0x4c399475, - 0x4c3a148e, - 0x4c3a94a7, - 0x4c3b05fd, - 0x4c3b94c0, - 0x4c3c14d2, - 0x4c3c94e1, - 0x4c3d14fa, - 0x4c3d8c47, - 0x4c3e1567, - 0x4c3e9509, - 0x4c3f1589, - 0x4c3f92be, - 0x4c40151f, - 0x4c40933a, - 0x4c411557, - 0x4c4193da, - 0x4c421543, - 0x50323141, - 0x5032b150, - 0x5033315b, - 0x5033b16b, - 0x50343184, - 0x5034b19e, - 0x503531ac, - 0x5035b1c2, - 0x503631d4, - 0x5036b1ea, - 0x50373203, - 0x5037b216, - 0x5038322e, - 0x5038b23f, - 0x50393254, - 0x5039b268, - 0x503a3288, - 0x503ab29e, - 0x503b32b6, - 0x503bb2c8, - 0x503c32e4, - 0x503cb2fb, - 0x503d3314, - 0x503db32a, - 0x503e3337, - 0x503eb34d, - 0x503f335f, - 0x503f837b, - 0x50403372, - 0x5040b382, - 0x5041339c, - 0x5041b3ab, - 0x504233c5, - 0x5042b3e2, - 0x504333f2, - 0x5043b402, - 0x50443411, - 0x50448431, - 0x50453425, - 0x5045b443, - 0x50463456, - 0x5046b46c, - 0x5047347e, - 0x5047b493, - 0x504834b9, - 0x5048b4c7, - 0x504934da, - 0x5049b4ef, - 0x504a3505, - 0x504ab515, - 0x504b3535, - 0x504bb548, - 0x504c356b, - 0x504cb599, - 0x504d35ab, - 0x504db5c8, - 0x504e35e3, - 0x504eb5ff, - 0x504f3611, - 0x504fb628, - 0x50503637, - 0x505086f1, - 0x5051364a, - 0x58320f65, - 0x68320f27, - 0x68328c7f, - 0x68330c92, - 0x68338f35, - 0x68340f45, - 0x683480ea, - 0x6c320eed, - 0x6c328c36, - 0x6c330ef8, - 0x6c338f11, - 0x74320a1b, - 0x743280ac, - 0x74330c47, - 0x78320980, - 0x78328995, - 0x783309a1, - 0x78338083, - 0x783409b0, - 0x783489c5, - 0x783509e4, - 0x78358a06, - 0x78360a1b, - 0x78368a31, - 0x78370a41, - 0x78378a62, - 0x78380a75, - 0x78388a87, - 0x78390a94, - 0x78398ab3, - 0x783a0ac8, - 0x783a8ad6, - 0x783b0ae0, - 0x783b8af4, - 0x783c0b0b, - 0x783c8b20, - 0x783d0b37, - 0x783d8b4c, - 0x783e0aa2, - 0x783e8a54, - 0x7c3211d7, - }; - - const size_t kOpenSSLReasonValuesLen = sizeof(kOpenSSLReasonValues) / sizeof(kOpenSSLReasonValues[0]); - - const char kOpenSSLReasonStringData[] = - "ASN1_LENGTH_MISMATCH\\0" - "AUX_ERROR\\0" - "BAD_GET_ASN1_OBJECT_CALL\\0" - "BAD_OBJECT_HEADER\\0" - "BMPSTRING_IS_WRONG_LENGTH\\0" - "BN_LIB\\0" - "BOOLEAN_IS_WRONG_LENGTH\\0" - "BUFFER_TOO_SMALL\\0" - "CONTEXT_NOT_INITIALISED\\0" - "DECODE_ERROR\\0" - "DEPTH_EXCEEDED\\0" - "DIGEST_AND_KEY_TYPE_NOT_SUPPORTED\\0" - "ENCODE_ERROR\\0" - "ERROR_GETTING_TIME\\0" - "EXPECTING_AN_ASN1_SEQUENCE\\0" - "EXPECTING_AN_INTEGER\\0" - "EXPECTING_AN_OBJECT\\0" - "EXPECTING_A_BOOLEAN\\0" - "EXPECTING_A_TIME\\0" - "EXPLICIT_LENGTH_MISMATCH\\0" - "EXPLICIT_TAG_NOT_CONSTRUCTED\\0" - "FIELD_MISSING\\0" - "FIRST_NUM_TOO_LARGE\\0" - "HEADER_TOO_LONG\\0" - "ILLEGAL_BITSTRING_FORMAT\\0" - "ILLEGAL_BOOLEAN\\0" - "ILLEGAL_CHARACTERS\\0" - "ILLEGAL_FORMAT\\0" - "ILLEGAL_HEX\\0" - "ILLEGAL_IMPLICIT_TAG\\0" - "ILLEGAL_INTEGER\\0" - "ILLEGAL_NESTED_TAGGING\\0" - "ILLEGAL_NULL\\0" - "ILLEGAL_NULL_VALUE\\0" - "ILLEGAL_OBJECT\\0" - "ILLEGAL_OPTIONAL_ANY\\0" - "ILLEGAL_OPTIONS_ON_ITEM_TEMPLATE\\0" - "ILLEGAL_TAGGED_ANY\\0" - "ILLEGAL_TIME_VALUE\\0" - "INTEGER_NOT_ASCII_FORMAT\\0" - "INTEGER_TOO_LARGE_FOR_LONG\\0" - "INVALID_BIT_STRING_BITS_LEFT\\0" - "INVALID_BMPSTRING\\0" - "INVALID_DIGIT\\0" - "INVALID_MODIFIER\\0" - "INVALID_NUMBER\\0" - "INVALID_OBJECT_ENCODING\\0" - "INVALID_SEPARATOR\\0" - "INVALID_TIME_FORMAT\\0" - "INVALID_UNIVERSALSTRING\\0" - "INVALID_UTF8STRING\\0" - "LIST_ERROR\\0" - "MISSING_ASN1_EOS\\0" - "MISSING_EOC\\0" - "MISSING_SECOND_NUMBER\\0" - "MISSING_VALUE\\0" - "MSTRING_NOT_UNIVERSAL\\0" - "MSTRING_WRONG_TAG\\0" - "NESTED_ASN1_ERROR\\0" - "NESTED_ASN1_STRING\\0" - "NESTED_TOO_DEEP\\0" - "NON_HEX_CHARACTERS\\0" - "NOT_ASCII_FORMAT\\0" - "NOT_ENOUGH_DATA\\0" - "NO_MATCHING_CHOICE_TYPE\\0" - "NULL_IS_WRONG_LENGTH\\0" - "OBJECT_NOT_ASCII_FORMAT\\0" - "ODD_NUMBER_OF_CHARS\\0" - "SECOND_NUMBER_TOO_LARGE\\0" - "SEQUENCE_LENGTH_MISMATCH\\0" - "SEQUENCE_NOT_CONSTRUCTED\\0" - "SEQUENCE_OR_SET_NEEDS_CONFIG\\0" - "SHORT_LINE\\0" - "STREAMING_NOT_SUPPORTED\\0" - "STRING_TOO_LONG\\0" - "STRING_TOO_SHORT\\0" - "TAG_VALUE_TOO_HIGH\\0" - "TIME_NOT_ASCII_FORMAT\\0" - "TOO_LONG\\0" - "TYPE_NOT_CONSTRUCTED\\0" - "TYPE_NOT_PRIMITIVE\\0" - "UNEXPECTED_EOC\\0" - "UNIVERSALSTRING_IS_WRONG_LENGTH\\0" - "UNKNOWN_FORMAT\\0" - "UNKNOWN_MESSAGE_DIGEST_ALGORITHM\\0" - "UNKNOWN_SIGNATURE_ALGORITHM\\0" - "UNKNOWN_TAG\\0" - "UNSUPPORTED_ANY_DEFINED_BY_TYPE\\0" - "UNSUPPORTED_PUBLIC_KEY_TYPE\\0" - "UNSUPPORTED_TYPE\\0" - "WRONG_PUBLIC_KEY_TYPE\\0" - "WRONG_TAG\\0" - "WRONG_TYPE\\0" - "BAD_FOPEN_MODE\\0" - "BROKEN_PIPE\\0" - "CONNECT_ERROR\\0" - "ERROR_SETTING_NBIO\\0" - "INVALID_ARGUMENT\\0" - "IN_USE\\0" - "KEEPALIVE\\0" - "NBIO_CONNECT_ERROR\\0" - "NO_HOSTNAME_SPECIFIED\\0" - "NO_PORT_SPECIFIED\\0" - "NO_SUCH_FILE\\0" - "NULL_PARAMETER\\0" - "SYS_LIB\\0" - "UNABLE_TO_CREATE_SOCKET\\0" - "UNINITIALIZED\\0" - "UNSUPPORTED_METHOD\\0" - "WRITE_TO_READ_ONLY_BIO\\0" - "ARG2_LT_ARG3\\0" - "BAD_ENCODING\\0" - "BAD_RECIPROCAL\\0" - "BIGNUM_TOO_LONG\\0" - "BITS_TOO_SMALL\\0" - "CALLED_WITH_EVEN_MODULUS\\0" - "DIV_BY_ZERO\\0" - "EXPAND_ON_STATIC_BIGNUM_DATA\\0" - "INPUT_NOT_REDUCED\\0" - "INVALID_INPUT\\0" - "INVALID_RANGE\\0" - "NEGATIVE_NUMBER\\0" - "NOT_A_SQUARE\\0" - "NOT_INITIALIZED\\0" - "NO_INVERSE\\0" - "PRIVATE_KEY_TOO_LARGE\\0" - "P_IS_NOT_PRIME\\0" - "TOO_MANY_ITERATIONS\\0" - "TOO_MANY_TEMPORARY_VARIABLES\\0" - "AES_KEY_SETUP_FAILED\\0" - "BAD_DECRYPT\\0" - "BAD_KEY_LENGTH\\0" - "CTRL_NOT_IMPLEMENTED\\0" - "CTRL_OPERATION_NOT_IMPLEMENTED\\0" - "DATA_NOT_MULTIPLE_OF_BLOCK_LENGTH\\0" - "INITIALIZATION_ERROR\\0" - "INPUT_NOT_INITIALIZED\\0" - "INVALID_AD_SIZE\\0" - "INVALID_KEY_LENGTH\\0" - "INVALID_NONCE\\0" - "INVALID_NONCE_SIZE\\0" - "INVALID_OPERATION\\0" - "IV_TOO_LARGE\\0" - "NO_CIPHER_SET\\0" - "NO_DIRECTION_SET\\0" - "OUTPUT_ALIASES_INPUT\\0" - "TAG_TOO_LARGE\\0" - "TOO_LARGE\\0" - "UNSUPPORTED_AD_SIZE\\0" - "UNSUPPORTED_INPUT_SIZE\\0" - "UNSUPPORTED_KEY_SIZE\\0" - "UNSUPPORTED_NONCE_SIZE\\0" - "UNSUPPORTED_TAG_SIZE\\0" - "WRONG_FINAL_BLOCK_LENGTH\\0" - "LIST_CANNOT_BE_NULL\\0" - "MISSING_CLOSE_SQUARE_BRACKET\\0" - "MISSING_EQUAL_SIGN\\0" - "NO_CLOSE_BRACE\\0" - "UNABLE_TO_CREATE_NEW_SECTION\\0" - "VARIABLE_EXPANSION_TOO_LONG\\0" - "VARIABLE_HAS_NO_VALUE\\0" - "BAD_GENERATOR\\0" - "INVALID_PUBKEY\\0" - "MODULUS_TOO_LARGE\\0" - "NO_PRIVATE_VALUE\\0" - "UNKNOWN_HASH\\0" - "BAD_Q_VALUE\\0" - "BAD_VERSION\\0" - "INVALID_PARAMETERS\\0" - "MISSING_PARAMETERS\\0" - "NEED_NEW_SETUP_VALUES\\0" - "BIGNUM_OUT_OF_RANGE\\0" - "COORDINATES_OUT_OF_RANGE\\0" - "D2I_ECPKPARAMETERS_FAILURE\\0" - "EC_GROUP_NEW_BY_NAME_FAILURE\\0" - "GROUP2PKPARAMETERS_FAILURE\\0" - "GROUP_MISMATCH\\0" - "I2D_ECPKPARAMETERS_FAILURE\\0" - "INCOMPATIBLE_OBJECTS\\0" - "INVALID_COFACTOR\\0" - "INVALID_COMPRESSED_POINT\\0" - "INVALID_COMPRESSION_BIT\\0" - "INVALID_ENCODING\\0" - "INVALID_FIELD\\0" - "INVALID_FORM\\0" - "INVALID_GROUP_ORDER\\0" - "INVALID_PRIVATE_KEY\\0" - "INVALID_SCALAR\\0" - "MISSING_PRIVATE_KEY\\0" - "NON_NAMED_CURVE\\0" - "PKPARAMETERS2GROUP_FAILURE\\0" - "POINT_AT_INFINITY\\0" - "POINT_IS_NOT_ON_CURVE\\0" - "PUBLIC_KEY_VALIDATION_FAILED\\0" - "SLOT_FULL\\0" - "UNDEFINED_GENERATOR\\0" - "UNKNOWN_GROUP\\0" - "UNKNOWN_ORDER\\0" - "WRONG_CURVE_PARAMETERS\\0" - "WRONG_ORDER\\0" - "KDF_FAILED\\0" - "POINT_ARITHMETIC_FAILURE\\0" - "UNKNOWN_DIGEST_LENGTH\\0" - "BAD_SIGNATURE\\0" - "NOT_IMPLEMENTED\\0" - "RANDOM_NUMBER_GENERATION_FAILED\\0" - "OPERATION_NOT_SUPPORTED\\0" - "COMMAND_NOT_SUPPORTED\\0" - "DIFFERENT_KEY_TYPES\\0" - "DIFFERENT_PARAMETERS\\0" - "EXPECTING_AN_EC_KEY_KEY\\0" - "EXPECTING_AN_RSA_KEY\\0" - "EXPECTING_A_DSA_KEY\\0" - "ILLEGAL_OR_UNSUPPORTED_PADDING_MODE\\0" - "INVALID_DIGEST_LENGTH\\0" - "INVALID_DIGEST_TYPE\\0" - "INVALID_KEYBITS\\0" - "INVALID_MGF1_MD\\0" - "INVALID_PADDING_MODE\\0" - "INVALID_PEER_KEY\\0" - "INVALID_PSS_SALTLEN\\0" - "INVALID_SIGNATURE\\0" - "KEYS_NOT_SET\\0" - "MEMORY_LIMIT_EXCEEDED\\0" - "NOT_A_PRIVATE_KEY\\0" - "NOT_XOF_OR_INVALID_LENGTH\\0" - "NO_DEFAULT_DIGEST\\0" - "NO_KEY_SET\\0" - "NO_MDC2_SUPPORT\\0" - "NO_NID_FOR_CURVE\\0" - "NO_OPERATION_SET\\0" - "NO_PARAMETERS_SET\\0" - "OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE\\0" - "OPERATON_NOT_INITIALIZED\\0" - "UNKNOWN_PUBLIC_KEY_TYPE\\0" - "UNSUPPORTED_ALGORITHM\\0" - "OUTPUT_TOO_LARGE\\0" - "INVALID_OID_STRING\\0" - "UNKNOWN_NID\\0" - "BAD_BASE64_DECODE\\0" - "BAD_END_LINE\\0" - "BAD_IV_CHARS\\0" - "BAD_PASSWORD_READ\\0" - "CIPHER_IS_NULL\\0" - "ERROR_CONVERTING_PRIVATE_KEY\\0" - "NOT_DEK_INFO\\0" - "NOT_ENCRYPTED\\0" - "NOT_PROC_TYPE\\0" - "NO_START_LINE\\0" - "READ_KEY\\0" - "SHORT_HEADER\\0" - "UNSUPPORTED_CIPHER\\0" - "UNSUPPORTED_ENCRYPTION\\0" - "BAD_PKCS7_VERSION\\0" - "NOT_PKCS7_SIGNED_DATA\\0" - "NO_CERTIFICATES_INCLUDED\\0" - "NO_CRLS_INCLUDED\\0" - "BAD_ITERATION_COUNT\\0" - "BAD_PKCS12_DATA\\0" - "BAD_PKCS12_VERSION\\0" - "CIPHER_HAS_NO_OBJECT_IDENTIFIER\\0" - "CRYPT_ERROR\\0" - "ENCRYPT_ERROR\\0" - "ERROR_SETTING_CIPHER_PARAMS\\0" - "INCORRECT_PASSWORD\\0" - "INVALID_CHARACTERS\\0" - "KEYGEN_FAILURE\\0" - "KEY_GEN_ERROR\\0" - "METHOD_NOT_SUPPORTED\\0" - "MISSING_MAC\\0" - "MULTIPLE_PRIVATE_KEYS_IN_PKCS12\\0" - "PKCS12_PUBLIC_KEY_INTEGRITY_NOT_SUPPORTED\\0" - "PKCS12_TOO_DEEPLY_NESTED\\0" - "PRIVATE_KEY_DECODE_ERROR\\0" - "PRIVATE_KEY_ENCODE_ERROR\\0" - "UNKNOWN_ALGORITHM\\0" - "UNKNOWN_CIPHER\\0" - "UNKNOWN_CIPHER_ALGORITHM\\0" - "UNKNOWN_DIGEST\\0" - "UNSUPPORTED_KEYLENGTH\\0" - "UNSUPPORTED_KEY_DERIVATION_FUNCTION\\0" - "UNSUPPORTED_OPTIONS\\0" - "UNSUPPORTED_PRF\\0" - "UNSUPPORTED_PRIVATE_KEY_ALGORITHM\\0" - "UNSUPPORTED_SALT_TYPE\\0" - "BAD_E_VALUE\\0" - "BAD_FIXED_HEADER_DECRYPT\\0" - "BAD_PAD_BYTE_COUNT\\0" - "BAD_RSA_PARAMETERS\\0" - "BLOCK_TYPE_IS_NOT_01\\0" - "BLOCK_TYPE_IS_NOT_02\\0" - "BN_NOT_INITIALIZED\\0" - "CANNOT_RECOVER_MULTI_PRIME_KEY\\0" - "CRT_PARAMS_ALREADY_GIVEN\\0" - "CRT_VALUES_INCORRECT\\0" - "DATA_LEN_NOT_EQUAL_TO_MOD_LEN\\0" - "DATA_TOO_LARGE\\0" - "DATA_TOO_LARGE_FOR_KEY_SIZE\\0" - "DATA_TOO_LARGE_FOR_MODULUS\\0" - "DATA_TOO_SMALL\\0" - "DATA_TOO_SMALL_FOR_KEY_SIZE\\0" - "DIGEST_TOO_BIG_FOR_RSA_KEY\\0" - "D_E_NOT_CONGRUENT_TO_1\\0" - "D_OUT_OF_RANGE\\0" - "EMPTY_PUBLIC_KEY\\0" - "FIRST_OCTET_INVALID\\0" - "INCONSISTENT_SET_OF_CRT_VALUES\\0" - "INTERNAL_ERROR\\0" - "INVALID_MESSAGE_LENGTH\\0" - "KEY_SIZE_TOO_SMALL\\0" - "LAST_OCTET_INVALID\\0" - "MUST_HAVE_AT_LEAST_TWO_PRIMES\\0" - "NO_PUBLIC_EXPONENT\\0" - "NULL_BEFORE_BLOCK_MISSING\\0" - "N_NOT_EQUAL_P_Q\\0" - "OAEP_DECODING_ERROR\\0" - "ONLY_ONE_OF_P_Q_GIVEN\\0" - "OUTPUT_BUFFER_TOO_SMALL\\0" - "PADDING_CHECK_FAILED\\0" - "PKCS_DECODING_ERROR\\0" - "SLEN_CHECK_FAILED\\0" - "SLEN_RECOVERY_FAILED\\0" - "UNKNOWN_ALGORITHM_TYPE\\0" - "UNKNOWN_PADDING_TYPE\\0" - "VALUE_MISSING\\0" - "WRONG_SIGNATURE_LENGTH\\0" - "ALPN_MISMATCH_ON_EARLY_DATA\\0" - "APPLICATION_DATA_INSTEAD_OF_HANDSHAKE\\0" - "APPLICATION_DATA_ON_SHUTDOWN\\0" - "APP_DATA_IN_HANDSHAKE\\0" - "ATTEMPT_TO_REUSE_SESSION_IN_DIFFERENT_CONTEXT\\0" - "BAD_ALERT\\0" - "BAD_CHANGE_CIPHER_SPEC\\0" - "BAD_DATA_RETURNED_BY_CALLBACK\\0" - "BAD_DH_P_LENGTH\\0" - "BAD_DIGEST_LENGTH\\0" - "BAD_ECC_CERT\\0" - "BAD_ECPOINT\\0" - "BAD_HANDSHAKE_RECORD\\0" - "BAD_HELLO_REQUEST\\0" - "BAD_LENGTH\\0" - "BAD_PACKET_LENGTH\\0" - "BAD_RSA_ENCRYPT\\0" - "BAD_SRTP_MKI_VALUE\\0" - "BAD_SRTP_PROTECTION_PROFILE_LIST\\0" - "BAD_SSL_FILETYPE\\0" - "BAD_WRITE_RETRY\\0" - "BIO_NOT_SET\\0" - "BLOCK_CIPHER_PAD_IS_WRONG\\0" - "BUFFERED_MESSAGES_ON_CIPHER_CHANGE\\0" - "CANNOT_HAVE_BOTH_PRIVKEY_AND_METHOD\\0" - "CANNOT_PARSE_LEAF_CERT\\0" - "CA_DN_LENGTH_MISMATCH\\0" - "CA_DN_TOO_LONG\\0" - "CCS_RECEIVED_EARLY\\0" - "CERTIFICATE_AND_PRIVATE_KEY_MISMATCH\\0" - "CERTIFICATE_VERIFY_FAILED\\0" - "CERT_CB_ERROR\\0" - "CERT_DECOMPRESSION_FAILED\\0" - "CERT_LENGTH_MISMATCH\\0" - "CHANNEL_ID_NOT_P256\\0" - "CHANNEL_ID_SIGNATURE_INVALID\\0" - "CIPHER_OR_HASH_UNAVAILABLE\\0" - "CLIENTHELLO_PARSE_FAILED\\0" - "CLIENTHELLO_TLSEXT\\0" - "CONNECTION_REJECTED\\0" - "CONNECTION_TYPE_NOT_SET\\0" - "CUSTOM_EXTENSION_ERROR\\0" - "DATA_LENGTH_TOO_LONG\\0" - "DECRYPTION_FAILED\\0" - "DECRYPTION_FAILED_OR_BAD_RECORD_MAC\\0" - "DH_PUBLIC_VALUE_LENGTH_IS_WRONG\\0" - "DH_P_TOO_LONG\\0" - "DIGEST_CHECK_FAILED\\0" - "DOWNGRADE_DETECTED\\0" - "DTLS_MESSAGE_TOO_BIG\\0" - "DUPLICATE_EXTENSION\\0" - "DUPLICATE_KEY_SHARE\\0" - "DUPLICATE_SIGNATURE_ALGORITHM\\0" - "EARLY_DATA_NOT_IN_USE\\0" - "ECC_CERT_NOT_FOR_SIGNING\\0" - "EMPTY_HELLO_RETRY_REQUEST\\0" - "EMS_STATE_INCONSISTENT\\0" - "ENCRYPTED_LENGTH_TOO_LONG\\0" - "ERROR_ADDING_EXTENSION\\0" - "ERROR_IN_RECEIVED_CIPHER_LIST\\0" - "ERROR_PARSING_EXTENSION\\0" - "EXCESSIVE_MESSAGE_SIZE\\0" - "EXTRA_DATA_IN_MESSAGE\\0" - "FRAGMENT_MISMATCH\\0" - "GOT_NEXT_PROTO_WITHOUT_EXTENSION\\0" - "HANDSHAKE_FAILURE_ON_CLIENT_HELLO\\0" - "HANDSHAKE_NOT_COMPLETE\\0" - "HTTPS_PROXY_REQUEST\\0" - "HTTP_REQUEST\\0" - "INAPPROPRIATE_FALLBACK\\0" - "INCONSISTENT_CLIENT_HELLO\\0" - "INVALID_ALPN_PROTOCOL\\0" - "INVALID_COMMAND\\0" - "INVALID_COMPRESSION_LIST\\0" - "INVALID_DELEGATED_CREDENTIAL\\0" - "INVALID_MESSAGE\\0" - "INVALID_OUTER_RECORD_TYPE\\0" - "INVALID_SCT_LIST\\0" - "INVALID_SIGNATURE_ALGORITHM\\0" - "INVALID_SSL_SESSION\\0" - "INVALID_TICKET_KEYS_LENGTH\\0" - "KEY_USAGE_BIT_INCORRECT\\0" - "LENGTH_MISMATCH\\0" - "MISSING_EXTENSION\\0" - "MISSING_KEY_SHARE\\0" - "MISSING_RSA_CERTIFICATE\\0" - "MISSING_TMP_DH_KEY\\0" - "MISSING_TMP_ECDH_KEY\\0" - "MIXED_SPECIAL_OPERATOR_WITH_GROUPS\\0" - "MTU_TOO_SMALL\\0" - "NEGOTIATED_BOTH_NPN_AND_ALPN\\0" - "NEGOTIATED_TB_WITHOUT_EMS_OR_RI\\0" - "NESTED_GROUP\\0" - "NO_CERTIFICATES_RETURNED\\0" - "NO_CERTIFICATE_ASSIGNED\\0" - "NO_CERTIFICATE_SET\\0" - "NO_CIPHERS_AVAILABLE\\0" - "NO_CIPHERS_PASSED\\0" - "NO_CIPHERS_SPECIFIED\\0" - "NO_CIPHER_MATCH\\0" - "NO_COMMON_SIGNATURE_ALGORITHMS\\0" - "NO_COMPRESSION_SPECIFIED\\0" - "NO_GROUPS_SPECIFIED\\0" - "NO_METHOD_SPECIFIED\\0" - "NO_P256_SUPPORT\\0" - "NO_PRIVATE_KEY_ASSIGNED\\0" - "NO_RENEGOTIATION\\0" - "NO_REQUIRED_DIGEST\\0" - "NO_SHARED_CIPHER\\0" - "NO_SHARED_GROUP\\0" - "NO_SUPPORTED_VERSIONS_ENABLED\\0" - "NULL_SSL_CTX\\0" - "NULL_SSL_METHOD_PASSED\\0" - "OCSP_CB_ERROR\\0" - "OLD_SESSION_CIPHER_NOT_RETURNED\\0" - "OLD_SESSION_PRF_HASH_MISMATCH\\0" - "OLD_SESSION_VERSION_NOT_RETURNED\\0" - "PARSE_TLSEXT\\0" - "PATH_TOO_LONG\\0" - "PEER_DID_NOT_RETURN_A_CERTIFICATE\\0" - "PEER_ERROR_UNSUPPORTED_CERTIFICATE_TYPE\\0" - "PRE_SHARED_KEY_MUST_BE_LAST\\0" - "PRIVATE_KEY_OPERATION_FAILED\\0" - "PROTOCOL_IS_SHUTDOWN\\0" - "PSK_IDENTITY_BINDER_COUNT_MISMATCH\\0" - "PSK_IDENTITY_NOT_FOUND\\0" - "PSK_NO_CLIENT_CB\\0" - "PSK_NO_SERVER_CB\\0" - "QUIC_INTERNAL_ERROR\\0" - "READ_TIMEOUT_EXPIRED\\0" - "RECORD_LENGTH_MISMATCH\\0" - "RECORD_TOO_LARGE\\0" - "RENEGOTIATION_EMS_MISMATCH\\0" - "RENEGOTIATION_ENCODING_ERR\\0" - "RENEGOTIATION_MISMATCH\\0" - "REQUIRED_CIPHER_MISSING\\0" - "RESUMED_EMS_SESSION_WITHOUT_EMS_EXTENSION\\0" - "RESUMED_NON_EMS_SESSION_WITH_EMS_EXTENSION\\0" - "SCSV_RECEIVED_WHEN_RENEGOTIATING\\0" - "SECOND_SERVERHELLO_VERSION_MISMATCH\\0" - "SERVERHELLO_TLSEXT\\0" - "SERVER_CERT_CHANGED\\0" - "SERVER_ECHOED_INVALID_SESSION_ID\\0" - "SESSION_ID_CONTEXT_UNINITIALIZED\\0" - "SESSION_MAY_NOT_BE_CREATED\\0" - "SHUTDOWN_WHILE_IN_INIT\\0" - "SIGNATURE_ALGORITHMS_EXTENSION_SENT_BY_SERVER\\0" - "SRTP_COULD_NOT_ALLOCATE_PROFILES\\0" - "SRTP_UNKNOWN_PROTECTION_PROFILE\\0" - "SSL3_EXT_INVALID_SERVERNAME\\0" - "SSLV3_ALERT_BAD_CERTIFICATE\\0" - "SSLV3_ALERT_BAD_RECORD_MAC\\0" - "SSLV3_ALERT_CERTIFICATE_EXPIRED\\0" - "SSLV3_ALERT_CERTIFICATE_REVOKED\\0" - "SSLV3_ALERT_CERTIFICATE_UNKNOWN\\0" - "SSLV3_ALERT_CLOSE_NOTIFY\\0" - "SSLV3_ALERT_DECOMPRESSION_FAILURE\\0" - "SSLV3_ALERT_HANDSHAKE_FAILURE\\0" - "SSLV3_ALERT_ILLEGAL_PARAMETER\\0" - "SSLV3_ALERT_NO_CERTIFICATE\\0" - "SSLV3_ALERT_UNEXPECTED_MESSAGE\\0" - "SSLV3_ALERT_UNSUPPORTED_CERTIFICATE\\0" - "SSL_CTX_HAS_NO_DEFAULT_SSL_VERSION\\0" - "SSL_HANDSHAKE_FAILURE\\0" - "SSL_SESSION_ID_CONTEXT_TOO_LONG\\0" - "SSL_SESSION_ID_TOO_LONG\\0" - "TICKET_ENCRYPTION_FAILED\\0" - "TLS13_DOWNGRADE\\0" - "TLSV1_ALERT_ACCESS_DENIED\\0" - "TLSV1_ALERT_DECODE_ERROR\\0" - "TLSV1_ALERT_DECRYPTION_FAILED\\0" - "TLSV1_ALERT_DECRYPT_ERROR\\0" - "TLSV1_ALERT_EXPORT_RESTRICTION\\0" - "TLSV1_ALERT_INAPPROPRIATE_FALLBACK\\0" - "TLSV1_ALERT_INSUFFICIENT_SECURITY\\0" - "TLSV1_ALERT_INTERNAL_ERROR\\0" - "TLSV1_ALERT_NO_RENEGOTIATION\\0" - "TLSV1_ALERT_PROTOCOL_VERSION\\0" - "TLSV1_ALERT_RECORD_OVERFLOW\\0" - "TLSV1_ALERT_UNKNOWN_CA\\0" - "TLSV1_ALERT_USER_CANCELLED\\0" - "TLSV1_BAD_CERTIFICATE_HASH_VALUE\\0" - "TLSV1_BAD_CERTIFICATE_STATUS_RESPONSE\\0" - "TLSV1_CERTIFICATE_REQUIRED\\0" - "TLSV1_CERTIFICATE_UNOBTAINABLE\\0" - "TLSV1_UNKNOWN_PSK_IDENTITY\\0" - "TLSV1_UNRECOGNIZED_NAME\\0" - "TLSV1_UNSUPPORTED_EXTENSION\\0" - "TLS_PEER_DID_NOT_RESPOND_WITH_CERTIFICATE_LIST\\0" - "TLS_RSA_ENCRYPTED_VALUE_LENGTH_IS_WRONG\\0" - "TOO_MANY_EMPTY_FRAGMENTS\\0" - "TOO_MANY_KEY_UPDATES\\0" - "TOO_MANY_WARNING_ALERTS\\0" - "TOO_MUCH_READ_EARLY_DATA\\0" - "TOO_MUCH_SKIPPED_EARLY_DATA\\0" - "UNABLE_TO_FIND_ECDH_PARAMETERS\\0" - "UNCOMPRESSED_CERT_TOO_LARGE\\0" - "UNEXPECTED_EXTENSION\\0" - "UNEXPECTED_EXTENSION_ON_EARLY_DATA\\0" - "UNEXPECTED_MESSAGE\\0" - "UNEXPECTED_OPERATOR_IN_GROUP\\0" - "UNEXPECTED_RECORD\\0" - "UNKNOWN_ALERT_TYPE\\0" - "UNKNOWN_CERTIFICATE_TYPE\\0" - "UNKNOWN_CERT_COMPRESSION_ALG\\0" - "UNKNOWN_CIPHER_RETURNED\\0" - "UNKNOWN_CIPHER_TYPE\\0" - "UNKNOWN_KEY_EXCHANGE_TYPE\\0" - "UNKNOWN_PROTOCOL\\0" - "UNKNOWN_SSL_VERSION\\0" - "UNKNOWN_STATE\\0" - "UNSAFE_LEGACY_RENEGOTIATION_DISABLED\\0" - "UNSUPPORTED_COMPRESSION_ALGORITHM\\0" - "UNSUPPORTED_ELLIPTIC_CURVE\\0" - "UNSUPPORTED_PROTOCOL\\0" - "UNSUPPORTED_PROTOCOL_FOR_CUSTOM_KEY\\0" - "WRONG_CERTIFICATE_TYPE\\0" - "WRONG_CIPHER_RETURNED\\0" - "WRONG_CURVE\\0" - "WRONG_ENCRYPTION_LEVEL_RECEIVED\\0" - "WRONG_MESSAGE_TYPE\\0" - "WRONG_SIGNATURE_TYPE\\0" - "WRONG_SSL_VERSION\\0" - "WRONG_VERSION_NUMBER\\0" - "WRONG_VERSION_ON_EARLY_DATA\\0" - "X509_LIB\\0" - "X509_VERIFICATION_SETUP_PROBLEMS\\0" - "AKID_MISMATCH\\0" - "BAD_X509_FILETYPE\\0" - "BASE64_DECODE_ERROR\\0" - "CANT_CHECK_DH_KEY\\0" - "CERT_ALREADY_IN_HASH_TABLE\\0" - "CRL_ALREADY_DELTA\\0" - "CRL_VERIFY_FAILURE\\0" - "IDP_MISMATCH\\0" - "INVALID_DIRECTORY\\0" - "INVALID_FIELD_NAME\\0" - "INVALID_PARAMETER\\0" - "INVALID_PSS_PARAMETERS\\0" - "INVALID_TRUST\\0" - "ISSUER_MISMATCH\\0" - "KEY_TYPE_MISMATCH\\0" - "KEY_VALUES_MISMATCH\\0" - "LOADING_CERT_DIR\\0" - "LOADING_DEFAULTS\\0" - "NAME_TOO_LONG\\0" - "NEWER_CRL_NOT_NEWER\\0" - "NO_CERT_SET_FOR_US_TO_VERIFY\\0" - "NO_CRL_NUMBER\\0" - "PUBLIC_KEY_DECODE_ERROR\\0" - "PUBLIC_KEY_ENCODE_ERROR\\0" - "SHOULD_RETRY\\0" - "SIGNATURE_ALGORITHM_MISMATCH\\0" - "UNKNOWN_KEY_TYPE\\0" - "UNKNOWN_PURPOSE_ID\\0" - "UNKNOWN_TRUST_ID\\0" - "WRONG_LOOKUP_TYPE\\0" - "BAD_IP_ADDRESS\\0" - "BAD_OBJECT\\0" - "BN_DEC2BN_ERROR\\0" - "BN_TO_ASN1_INTEGER_ERROR\\0" - "CANNOT_FIND_FREE_FUNCTION\\0" - "DIRNAME_ERROR\\0" - "DISTPOINT_ALREADY_SET\\0" - "DUPLICATE_ZONE_ID\\0" - "ERROR_CONVERTING_ZONE\\0" - "ERROR_CREATING_EXTENSION\\0" - "ERROR_IN_EXTENSION\\0" - "EXPECTED_A_SECTION_NAME\\0" - "EXTENSION_EXISTS\\0" - "EXTENSION_NAME_ERROR\\0" - "EXTENSION_NOT_FOUND\\0" - "EXTENSION_SETTING_NOT_SUPPORTED\\0" - "EXTENSION_VALUE_ERROR\\0" - "ILLEGAL_EMPTY_EXTENSION\\0" - "ILLEGAL_HEX_DIGIT\\0" - "INCORRECT_POLICY_SYNTAX_TAG\\0" - "INVALID_BOOLEAN_STRING\\0" - "INVALID_EXTENSION_STRING\\0" - "INVALID_MULTIPLE_RDNS\\0" - "INVALID_NAME\\0" - "INVALID_NULL_ARGUMENT\\0" - "INVALID_NULL_NAME\\0" - "INVALID_NULL_VALUE\\0" - "INVALID_NUMBERS\\0" - "INVALID_OBJECT_IDENTIFIER\\0" - "INVALID_OPTION\\0" - "INVALID_POLICY_IDENTIFIER\\0" - "INVALID_PROXY_POLICY_SETTING\\0" - "INVALID_PURPOSE\\0" - "INVALID_SECTION\\0" - "INVALID_SYNTAX\\0" - "ISSUER_DECODE_ERROR\\0" - "NEED_ORGANIZATION_AND_NUMBERS\\0" - "NO_CONFIG_DATABASE\\0" - "NO_ISSUER_CERTIFICATE\\0" - "NO_ISSUER_DETAILS\\0" - "NO_POLICY_IDENTIFIER\\0" - "NO_PROXY_CERT_POLICY_LANGUAGE_DEFINED\\0" - "NO_PUBLIC_KEY\\0" - "NO_SUBJECT_DETAILS\\0" - "ODD_NUMBER_OF_DIGITS\\0" - "OPERATION_NOT_DEFINED\\0" - "OTHERNAME_ERROR\\0" - "POLICY_LANGUAGE_ALREADY_DEFINED\\0" - "POLICY_PATH_LENGTH\\0" - "POLICY_PATH_LENGTH_ALREADY_DEFINED\\0" - "POLICY_WHEN_PROXY_LANGUAGE_REQUIRES_NO_POLICY\\0" - "SECTION_NOT_FOUND\\0" - "UNABLE_TO_GET_ISSUER_DETAILS\\0" - "UNABLE_TO_GET_ISSUER_KEYID\\0" - "UNKNOWN_BIT_STRING_ARGUMENT\\0" - "UNKNOWN_EXTENSION\\0" - "UNKNOWN_EXTENSION_NAME\\0" - "UNKNOWN_OPTION\\0" - "UNSUPPORTED_OPTION\\0" - "USER_TOO_LONG\\0" - ""; - - EOF - # To avoid symbol conflict with OpenSSL, gRPC needs to rename all the BoringSSL symbols with a # prefix. This is done with BoringSSL's BORINGSSL_PREFIX mechanism # (https://github.com/google/boringssl/blob/75148d7abf12bdd1797fec3c5da9a21963703516/BUILDING.md#building-with-prefixed-symbols). @@ -1632,3312 +213,15 @@ Pod::Spec.new do |s| # /src/boringssl/boringssl_prefix_symbols.h. Here we decode the content and inject the header to # the correct location in BoringSSL. base64 -D < include/openssl/boringssl_prefix_symbols.h - H4sICH1/hl4C/2JvcmluZ3NzbF9wcmVmaXhfc3ltYm9scy5oAKy9XXPbSJK2fb6/QvHsyfNETOxacqtb857REm1zW5a0JNXb3hMESIAUxiDARgGS1b/+rQJAEB+ZWahMREzMjEXc1w3UdxUKWf/5nxf7MAkzPw+Di8178w9vk2ZRslcq9o5ZuIt+ei+hH4TZf6iXizS5+FT+ulrdX2zTwyHK/7+L33Yfrm5uLsN//hpeX+4ub3776O+2u483vwQfrna/3Vxtfrn556+/bf1/+8//vLhNj+9ZtH/JL/7v9v9dXH24vPnHxZc03cfhxSLZ/oe+xFz1FGaHSKlI2+XpRaHCf2iz4/s/Lg5pEO30//pJ8J9pdhFEKs+iTZGHF/lLpC5Uusvf/Cy82Okf/eTdsI5FdkxVePEW5fr+s/J/0yK/2IXhhZa8hFloHj7zE50O/7g4ZulrFOgUyV/8XP9XeOFv0tfQkLbNvSdpHm1DcxeV7/F8v6efjsfQzy6i5MKPY6OMQnV6uvXX+cXq8fP6f2bL+cVidfG0fPxjcTe/u/g/s5X+9/+5mD3clRfNntdfH5cXd4vV7f1s8W11Mbu/v9Cq5exhvZivDOt/FuuvF8v5l9lSSx61SvPO7Ifb++e7xcOXUrj49nS/0C5nwMXjZ8P4Nl/eftV/mX1a3C/W30v7z4v1w3y1+g/NuHh4vJj/MX9YX6y+Gk7rzj7NL+4Xs0/384vP+l+zh+8Gt3qa3y5m9//Q972c367/oRGn/6cvun18WM3/+1nj9DUXd7Nvsy/mRkr16Z/lg32drVeP2nepH2/1fL82j/F5+fjt4v5xZe784nk11x6z9cyodRrqW179Q+vm+gaX5r5n+j+368Xjg+FpgbZeL2fmPh7mX+4XX+YPt3OjfSwF68elvvZ5VWv+cTFbLlbG9PF5bdSPhlkW4ceHh3l5TZX6Jj30vZR3MV/qhPg2K8Gfu7nxH/9mxJ8el5qpa483u7vznpbzz4s/L46+ykN1kb+lF7roJXm0i8JM6cKjC3+ahDoTclPEdKE+KPMHA4pyU1lNiUt3Fwd/m6UX4c+jn5SFUP8nytWFn+2Lg+api02oxWFppCvvf/zbvwe6YicheDv/1//Hxeb/gT95C/3oy+oCktG+8MK/+Pd/v/DMf23+rVF9WT7dep8Wj97O0y0NfCPnP1Z/+EdP9f+GNBXmLF6t6xHv1vcrbxtHOg29Q6jbjcAJPJRDfC4YJ6owew0zNrgjh/imCfU2xW6nSynbBYAAXq+X3pUwB4YIzEdiQJNlOTJEwD7idBqRSntdUfLoEJoulOHQksP8F92pxqHEokuAXfhJRKWNOJdH5LFpqKIkyiM/Pj2iFxR1V8CyxHm9O5gvl16c+oFnWGbgpQeJTpYQoOfx+DR/ML+aW3JuyPviHvtp/s3Lwtp+pUc3pgt34UMAzGMTpXKfHgTwesv0QEBkNCCgLtJHAik9N/PL7eJJD8i8IFTbLDo6F2wYgfuYJskvdGeURAHXqM2gnTZmYCZwMXraYRsd9aRG+jRnCu0WRPtQ5VK3M4V2k7nY6D9+eol/CCUWNcLuI3uSikC7HPyfnu5NlKD+9DAWvyiZxO+Mof2kWWXPp2O2k2ZUjaB9st1W/DQnBu306seFyKYEWDzkZcCa/5HyfN1Bcj1qOcnfxOn2R90MCnzaGNxP5XrQ6meBqBh0IJDX47cnzw8Cb5sejllYrldxBqsWFua8y8IQuFzxvDEa5q6L1Qdm6nbkBH+6h0NglHcU8K2igCKLEg1Ns/Wfpvh88LYvvm7wt2GWu3sMGbjT5QROl6Ocyp872efHe64lCKO8qxn87YxveCIQLuHPPPMnSNABiPBU1fOzrWo94rB9CXUzfcyiV/MG5Ef4zvIZUDC3anCtH3qfpcWR59VlYE5x6GetBFY8rz6FdOtnqsRzwCKdD2kQCsyMnOSn5VRS8jw1AXEJE38Th166VUfTmx/jKOG1HBCI9jz+pdP6GGaReWHgqWif+LHEGuLRd2CuCesGz6xE6fs+HJXkHmAifRd5rExxS5IwZvWpGAlx3cWFejm1TbyH7SIwHz1c4tG1EGGWYyKTuNEu2uoGj8XvQ0gvYZPSh1BeRz/zD3yXUk7yq06C29P0GLhTVfpVbl7/MY1aCMqnKeredsO3alMot7L3U3yfSk85nMZBXhypnG/UwRB++u9+Eee65Cj1JkrDAcnF1StUmAV+7k9n3yCJ+wh/eiLTWk87JOGbHi8F4U+JTQMhvaYYAYEkwjVKdqm39eN4429/sB07FMJNtzpxupf79TiEo1mJLJsiUYXsUCxuxyzNU/6CFkaiXHU+T+TaJ1Gu3HHzSUywJWPmlp5w+KuIzO6NlyIP0jd+gnUxhF/5as5/Ya0/DhCETz2k01VDzytleTREEb6cd++AnnKIlW7Y9IXbH1ULwC8eQxThq2tCtHuXt1k9jt0xCI/5i9SuhNi9RAWlxUCcyhf49WVxuvX5tRskIa5JqCdy+eHoLVe8pa02APV4Y6LfEGIWHtLXULR01UUgPuZXz99udQFhmbT0dgdvn6aB1KaEjPDKwiTcp3nEnV4iLMq5aiN3RRzzHc8M0mnjvUTMwWEbQHqkej61FRSLGjDCQ1gw2pQxbpMUDQBGeZczujJvVfS3wLbLsTmWV29kbhXD5mQmN1KnimFzqts1qVmDofxklcxWw8zO/1DAr/SUQ1IcNpyX0F095aAmKtdqdLlWE5RrNapcqwnKtRpVrtU05VqNLdf1QFtQ9k4E1CX/UO/R9o5pyu0QuxDKq1zo4LuUcpJ/Wo1TApOGQTmdpgiy1VcYhfteylLw0paC+oIie2W3do3e7sBf5OlDKC/+Kv9ZTvFVtPfjvSC5asAID2GCtSmU2wTvxwAO5ThZTbp0qUmentunb16R/EjSN7Pr4lgvp7EzEyeSdzGF72gnFcZmNMzuvfoYwq/a2MI3qvU2B1GJGVdSyoumWFrCYJR3+WbATwL2npUBhXYTvuNTI9/xqfMWdEm71mZQTvJ3fWrsu77WheIq0MFQfkWWmSvNcE9k2OWQjrrWHOqCLPBrUQi3ad6dKod3p2r6d6eK8+60LapbjaOfvyjxHbRhlHeqyq5FN/fl+wVByvdJhGvoZ/F7+cK33mzDHogAKMo3uLq+vvyn3LTLoRwF78WV9b24uWLnxyo0m8SyeoQSBl4dI6HszNnWNjBxT/ss9LVWmsxdDOEX7RPdxZsx6eVHz7z922d+wB81wDjKX/zmXo18c68menOvRr+5V5O8uVcj39yryd7cK4c396drVaiHULvM35tNjyLXDolynWS/gHLYL6Ak+wUUvV+g/FlNUDTbkJFenp/tJ/EzIMIzMa+rq4SWz7Yg2Chv5fnBq9l1qcJgmhvoEYm7KHclZ6E6poniF6MOhXIT7D9R1v0nqvzGr9nvz/6cCkVRvupHMwWQVhiAZXGuYxVM4txjUc51NCe2W6UnHP4qoq00G1sM2km6b0mN3bek5PuW1Jh9S9VFuVlOSBM9sFYv/tX1r166a09WlcDfhibvq57U6OmFbjiKQyi4jz6K8lW+LuXK/G9Y3aR4ZIsjifs49RDnzfaSlh+kke6T7GZTLrvZ2heb1aY0yXV/JfY9o0b4mvYteAlFu+oIHnUH0OcvsiE4jrTcR5TszZeLaaYngIcyrqAS3QTAo+4gy49mlLKL4lDg26ZQbnkWbadZvhyiCN96D6T5sl3agQ1RpK+sZNtLcvdlkbj1hHG0vxnnVsMU80WzaLIA0pzcxYMuHDniPnI/L9QkKdCQRrsKOqw+yO553lQ8gW8H5uKtpnNWdt/CrNnphk5qeuJQjrrrCF74RqXcyp+gsnQ5FsdwK3wmA7B46GGfyELr7Q7TJFwbRHlmhaCbLNUEXfgayvr+qZ4MTDXAgXF2f/5XBmrcVwaFWXHZsRwqKcbVjcVTtfTxO/M1dhcxysebrR4uJzArOeMczdBxCkfDIRyXq9kEydmhjHWTJeoQNdpXlLRDFOEr/eS9xxjnJEvXPmikZ7UvRJSyMG6k/2TOFk8zp64ib+fv3kvEfHcDkgDXOvJl+9Xz1j+aOYizLY4ifFmxINpikp0evM17zphmDxGETxXKgRecDWDYnASLRwjH5ih7SYKjbL7HUJqihjDGpV1BldyygxvlXy0gT+BcgWyeEy7HjeTa7qiaGMrcKwbtxN7FAjDsTvwoDxjI4snYBt2VW/gHczxExtrgCWMsfuXr3G0as7cUUDCLd71WEUe7sNxkyOqMbUDrPRxCoechHOHBWTMFGBanKTLRnncvvpqkUe1xLI7CBuyMIHwiVb3hE43P2hDCi/MFektLkMvPHwQNVa23O4jHST0O7SjuWdSonkVN2Soqt1bx/DpG5Ggt50ra8il7y6cmaPnUqJZPvaRFHHgb8yFqso9DMznjWwIwwjtPhTOgE2CEh7dLM2nxAFiEM3MNsCsH+MzwFWjUCml0YXtkYWlUYXtEYVlEX1s0X/O7WRipv3IqNv8Kt7kyxUFPIRjL/hYedAexudKc0lEfB+Pu2SeMcfHidAqrEoP6lcsY9Zq66fvjnOk4BKGe+fsxlKVkizDGRZKSfQzgV23weYnck65RQtRyv1QZj9ede9ZCZHEU6TERpJl3jt2zOEL0mOjQgvjMZGxmWVxmW0xmbvAcPGbOtsjzlywt9i9lUPc4ZLxDABiAUxDG4d6c7epts7BckfZjM3BxnwOgJMg1Lc9f07O3H+4P1hZDbD124H6i2dIC5Gr5vNnAv81/msCbYXmYppkAO9vZgOg9lEv41ZiGkVMAA3KaIsr4yAjj08b2do3rPU1M77HxvMMs0wNoybFlAwLk8vOYZuVuHtNxHnS9zCJGqHYYA/ix3hYhb4maI6bNLqjyZBxn8hAB+uQf2pEIGFVpiMB82u8ZzZhG8bwGGNRP0FWPiIBenXRz/q6oiYvGTEMQhfnK3nqNetsliO5ORnaf6L3W6PdZ5wv724UkpgMW5lx/spOFfxW6/dWtMSemEkrCXcWb+REO6jjdWzv3t3X7MjIPM3poWwyzTzsXOOiTFiFL9sj09JhDtSd+88481A5g0E7cPLfs3pecZkCfZDDBKQajTjBoXZTp4Xt6kNhUBMyljj/C3PgxRNh8zuduyczOHIujHpb5idivoeBuryFnKNwWk2zWoXFdOcI/BSjhvkcAGIhTazZlAkkw82RAwdzM2J/nYJQYlfl+jN5x0frV+/P6wz+91fpxOS83wUXBT4kZgMP9+Ts9RuzwqE/fOChPFUczV2KatAiIy45XD3dYDdR/idRLyKTWYoQti1Qy5nyR8ppXXl+odQixmS16ccirxx0C4iKLczLmdJJpTiYZeyrJNCeSjD2NhH0SCXEKSRWQ+jTt9PL0R5h4G13nzaoHexZoQSL3wV2lpk9BKTdZneaLzPCvAMPmJBnc9yGUl6gx6xBIlyKOJ0nAHojyLINE5Hq8q8qVuLLkKL4ziKP8yzMZ8yILz7N9vjsAQ72rmiIYw3cRmA//gL2uHOO3dvrzHFqAER68rZAgBXETxiMZdYZSGbN/E6UsuhFiTH5sE+t5TM0FyixRJduQb3EiYC7MoWCGjgVVuDWV8ny8hVn1kgxoKSB6D9UCeieAAtMcIKGu1bIif0WiQ6BdzJeu3JamiyB92LPqs9zKL18+CE1KBurEX0+hVzPVi5+ZpVXBYloXgfoIWkhL2wj0o14Q7UPmdALHOfibmQ+/UBBAh3vgl3wEhnmLIsXsR0SJaX2U4O9DT/1g7PkGGJiT7NX3EEH4FEn0F3Mh/izH+a3gHc07Pq4ZxBrlzK4HQwziJw0kP+58QvHZhCPOJZSeSWg/j7B1BXOL5YCAu7B7LXrF4407Gn7DR8NvzHHkGzqOfNMtZygbAHcRgE+UtBbLnS06apjeikjNwbfkMD9KIhbY6CCi8gLdbLgTKx1MNF78RZU+APaoBoIceKVEqEBPXsdBZFnhONhfGh18iEB8OguKgu03BAtwNoOy4hhw1vTOUoAbR5vMz955laMthtjmBNnz+2nWvBJgYE7V9rxqy7riGXUQgM/B30fbZoGrifmYu9cmlAS6mojjfuyluvaxFlEGBMBFdIav5fxezpeT8BeTSXHorm645/QQAfgcw9B9cGdEIKvMZQau1EHEv8wmAj0wMvHnq7Yy1hnMeHeGkiDXLN2aYwnLtexjqnLBZnKCBTu/RkFYXc0afwwIgEsVF1pXleZWvF0c7V9y1ltJkoa5l8uQcfgaxjy/sx5zqMZ5AosWAPDIOM1TBrdIkiOE6RODW7+yayfAAJ1Uf5fJvzjfrCAcwLGO/Hze2OvsNSCALuYEDH0jcfW9GMOkCwA9ql4xC1kfxnTlIJ99pil5nqn0LFP7OablFawXNY0So8rPcxx9Kmp54Rv7Kd7Qp7jk5+ollavs81Xps1XF56qOOFO1vAT6VIxnBpEwV94+DvIEV9HprZaTW+Wnto45sXWK01rHndQ60Smto09oVYKd64rcuV4eYFp+OFcu1LKeoQPAPASnutpPdDVXMNs8D23x2IdV0me1ys8wHXN+qfQ0UftJohOcIjrqBNHyourrYkER7RAwF9EJnmNO75zoJMfRpziWFya7NNuG5UpfuWyl/D0vDUES5srchU1HJ1K8vcMK2zs84UmITqcgyk9AHHP6obnmX8GPy0vvLc1++FlaJLy060MQL9le4DHnHU5z1uHYcw6nOeNw7PmG05xtOPZcQ/aZhsR5huKzDEecYzjJGYYjzy8sL8sLHj4vEKLsg98x5wBKzgCkz/+b6Oy/0ef+TXXm3/jz/qY662/8OX+SM/7o8/2kZ/vZz/VrrhBv6kZJuKtkX9qoUwSFJwhaTw+sLjiveLLb4z4E9Zr8lEL2CYWKufdXoXt/lWCnpSJ3Wk50pt7o8/TKC1/CoPWWQ1+8i3gdHUhCXQX1yVKTJgwr4Hwu35Rn8rmdxyc/i2/MOXzVwXncuTE1J57gZL/Rp/pNeO6d05l3rTO8XsxbU9bOWwhCe4l3diqnnZ1qmp2dauzOzilOWBt3uprgZDXyVLUpTlQbd5qa6CQ1yylqkhPU6NPTJjk5beSpaeVlw+9Oec0pBMI8Wae0USe0CU5nI09mE5+KNuJENCXefaxG7D5WzP28Ct3Pyx/XEGMaXn+L9bXm79xAtm2xhc0LXzsgAC55avYdCPeRQRDAS3h6nvXkvClOzRt3Yt4Up+WNOylPfkremBPyJjodb/TJeBOdijf6RDzpaXj2k/AmOQVv5Al4k5w+N/LkuWlOnRt74hx3/RxfMX/zGbdrRBDL7PdzhxnVkPZ69fG02sJb6BsAYA8+nKLWC6R8eAfQ81jfrwRJM1ADdCYW5fGTY6AG6G9R/uJtit1Ol3KuB8AYOr1eepeylB8SEBcBnuSKcmJIAF2uxGl0NSKNriR4kitNo6sRaSRNIXv6sNEEU5oyVLoEV1H7gBknek9Lk533VAH6nkN0FbDvvaelyc73Duh7DnrYcbv8/rR+9D49f/48X5brFd42PerRYpFsndwsrFHOJuT4VM4Ny+YchOGxvE+ZaYOx+ZmAhUkRxzK7E8XqVhyERsXB5nEs1IvMxBBsLsrxDAcIYPNwD0MMI4Y+q+X6SSsf1/PbtamM+v9+XtzP2aXBxnO4A/cSQqDG+3JKDcUCnM0m4cXT16YxOhxZrQvGIR3N5vc8FFhVANqjOEoMiiNJ138PBHgjJ/nsoj9E0D6MAt5Rk3RWMe7KST6rSerrhw5ljN6H2be5rGogGLsfd4yBcayO7LEFxqEc2WMKAEH5cKpoV03SXY+NGagpuuvn3n2xhc1qWoYEyuWYHoVpdCKQLowGpqum6OUmf3Hlb1NIN9eQhQM1Qp+gio+q3aKCZSlTjH7qpEOIogJqKZvqJdrx8rJUIlRWb3dW9qiz21s99/Xu5qvb5eKpHDE6JwfCsDs5hkoBCXYX11YURvR95ivv9tvs1o1ciwDWdrP1wmSbvTseDtzTQuTd5vLqhg/vyCF+non4HTnAD0IeuNYBxHC7Yd9uSwuRuVSUmMpyL7XlnirPCSl/df4uEdAjDrU/26GlBxyK5C3zjyz4WUpyvaMfBI5bEkEC4MK+d+LOpfdtuevVw6U3e/ju3H6fdRDx02LtrdZGWZ0P7M7uEywu7h0dALB47MuvjXORTc2wOAlNrHznbnSotzi4Ll8CeruDODcUkRvfnmRFq6OnHVhP0VLTdF5mt+Ug//Hxfj574N17o4XI84fnb/PlbD2/YyZ9D2Dx2HNKaldvcYhkBtZUYmVwV29xUMI0UtY0ylPv04PIoyRALp8lRfUzXVa/zB+0/f3if+d364Wes/vBv9w9AMgYL2bHCmLG+PEqI0QZ48bJrCFjjBOr+gCQMV7HzHXTHI4Z48equABkpBdnA7SFRTiL+uchw+4kKJNkX929RlIe6T57MbsWpVlXTztw0qqtpumsNOrIQf7Dev7FvPY8HBn0s5hiu77E7IspNjNXW2qKzhootcQUOxKgI5LMKylnMcVWkhRRdIqYFrDQrfyvv4gsagblxBx6deQQ/+H5/p5ZJBspyuUUmFqIMllF5aSEqI+f/mt+uzbhAF0/NRjKCT4vjVtigs1J50ZKcFlpfdaC5Nv1vJnZP9zNP/NuHqBY3VgdRp9gdWF1HX2C1YVZmvoIq484c0bkC6+U9QhWF1Y30CdALk/6x/Xs0/1clDUQZYwbJ4OGjDFOrGwCIKSXNPXs6SZLMVtaCVPJnj7O4QQAPeSwmv/38/zhds5+zdADkB4iPsZeC259Td11VXKr5PODgMHvEawu2zj0E04/AlGsbqwpQ59AuLD6XbrHPf3quputLybYzoE1+2KKLcjbgMxRXvNp6XPOb8U+yJKlIdAunv7NL2IT0VH9kJh1QIRnHCZ7x1gOQ7mVzxuCDBCED6vzoXvm+lfmkmhbbaN74U+ZgQaM8PB2R7GNZhBOkmym89ecHiBBf6DZ3ubde1jcSRxqhMVnkvqtxtfv/qWer7aT+RoY4Z2n3vP68w3brtZTDqwhYUtsYYualRMA8lj/einqtrp62oEzLmyraTorhTpykC95J7qm34nyX4RSbz8lrzzp95zlr0G02zHBRopymcWPelPKfj1KvBPlvwil3n5KXnnS7zn5LzepN5ri15gj3l2Wl+iWdx8mYebH0d9hYMJfMr2GINDz+9OcN1c6KVEqs3yfpCiXNXM8KVEqr4TXSpSq2PeqiHs1h8vwsZcQ9/lh8cd8uRK+OYcoY9w4TdaQMcaJlc0ABPRa3/I7uJaYYjO7uY6c5B+OZcxdLxeYNAzKiVnCWmqKHgnuPyLvm1eCzmKKzewQO3KKz2qOWmILm905Dhmw0+cbWfPUBVg8eEWoJbfwmQWprYcc/lisFtL3QkOG3YmTXH2C3YWVaAME5BNE+1AxnqHSQcRq+JXrmaiJzO5O7upJh9ePAvzrR5ide+nG+fTVnhYiR3l4MPGE3LknJUV1jg40UJN0zkJeS4yzmcWvJcbZBfumC/yOzVle7EysxBSb13K11RQ9ugr4cC2m2Kw2qiVG2YIkIdODnxhUSpioW/y6WKtJOrsuVmKUneg/CxLlJMf57AJClY6jz5kZNFKUa07EYHKNlOR62/yngG3kKL9IBClSiVE2I8p7XwyxD5s6EDfvHXNHTvIToUGCOVS9vs6cvxktVUsMsfX05hDl0WvIbAi7etqBVUU7cpBf5F6YMt4C1UKMyR2nnbUQOff3V6zPKGshxtRliMfUQpAZHo5xGZ6aVSw6cpLPKhRtdZ/+vP6qlevv3uLh8+MpIoX7U6CYUX6uOYxARnk5pyBGQd1+n39f3EnS8AyweLDT7SS38Plp1eh7Dp9mq8Wtd/v4oGfCs8XDmlHWYITVxzGtIIDVwzW9QELfZfHo+cdjeb5rFIfOx0cBesChOax0m2exM7+jhuhx6GfeLvb3yp191qLkLMyzdxG/RYBcTGS7xBwUVV7n7tHVQw6sZEdSW/+5XP8oz4fMwr8K12k9SqHcygMEvH3hZ36ShyHfsAfCPE2Rdl3q7YsBdpCejnN3Jp+lADdMd85ArQFIJlSg++aXjhKixq6x7RoVRMsYJQBqx+s/e34cs3hGCDDLTZKuWzrbQoTpeLDUWYbxjjzeEeFFSZSziEaIMA9mlY6blicxwT46DtZ7WoRsAgDq6uC4+XKgRuiSHqmnJx1046wcD6KBAIgH62Szvhhms5IFSouX8GdQHNyrSa0DiCZfE/daUslAXs7r309CgGnKdnnGb8JIybYYZOcvvAa8UWJU5wFyS4gxy3in7h+xAnrSgZOBHTVFD/TYKkvf+QY1gPJgVbqOmqIfCwndqCl65npE+kBN0d0PzBrKEX7KHKm1tACZU43gGmT6sU2Uekc/yjjIRoywuUPplhYhM0ZalQzjuZ5O1xZizCOPeER4puHeFDsWtNYiZJVuf4S8bKqkIPcnh/gTZBWHTZjx2oGWFiebSqw7RC68lgN87jQVn6EeU/dipTUQyezWci9OlQzi5RmvozwJISZnWnqEZ6WsTgrpm1hFESmD5RKLr5JLFrBUYlT2mmFHDdIVo8EoVRDtTXCnb9R9KnYfpIgeSHH6HwX3PorX9yis5zEHJx4YOK0Cacy+QeE9QzkkjlPFeOiTEqPqHPNeUpWzStKAQLmY2dnR9QwFkEC5yBwIOmvFRuGrX4q3+qWw1a/yB9b6SaPEqEce8ojwWGtqCl9TU/XaFWek19IS5DDdmeWfIkvYBmcE4pO4brxqCxFms2TFK2dnOclXx3Ab+bHAoiaQLrxJZ0+POLDX7RS9btfMdusjet032aAUyO0lLeLA0xNMdo70CbgLr1CdtRSZ88qwLcbZzELUEoPsqgDoCxjoRguRE+aM4yQEmHmouB3FWQpwi6NOfPc7rWQA75W1ovqKrKa+spPylUjLN+5k9Q2frfKKKFY2q3aD8zKwUaJU9gSkK+/zH7xP94uHuyr0TvIauo7nhnrCwb2Q9cQEO5LdfGS7d+dVza52SL5d/+mFjofynWUwj5PAJx1MdP2Y+CyDeYxkrGUwT+V+xrrDUjhkfpk/3H4qtwy5Qs9KjKrc07IRDpnfHh/W5ZM4b1Xuiwk2p0B1xASbURTaWppsWiOVO4cHQCkWt12aeYc0KOJCifxaHMKRUZDaWprsxWZhJJAY1Iihj79RXqS8tzRz5rekADdw5wUwh3dztQ4gqu3VJnHmlaohbRMlDFqlAmj6z5E7rVRhNM5RW30xxj76TO7Rh5nbzYZ/v2cxyA7CLQOqVSDtxXUn0EkF0uKQ/9iNFiQfjhGDqVVDWrn11RVWihCW85FXbSHG5HSQZyVAdd0s9ADEmKn+yGrJTjqAyBhmwKOLbVokpo948/4Os9SkrnIHDxBDH12ZGK1lpQJo0aszKnoFOaycOekAYuFcZobfLes/hsmLn2zDwDtEcWzeSftlm5xFBz+O8vdyRcLVaAwTuJO/Cj/mD+F6coD/0znFtGTI4dR+uN7vsvSgR35Jvk8PYfbuDu3Ih/z91rnAaQnAOQVFMFkYeu7d0gAAeeRettt+vL76tb7q8vrjr+5GEAV2KxyPCjnLYB6nfp90Q6LuxhntWKUa0txfCD2A74IezHBcN7yc2chZCVKTcO+bz0QZ2JMU5Kbu04RKBdMSzg1qFUg7pm9XDJyRwTxm/WxJCe7O102rWaAWGLQYoBOnEqEzRP2DGSkweEY25MUho0qWIoBVnnPvDCtVGO2Sh7sc8g5+pl50d+q+A6irhcjqB2v01wgBZhpwVgNqGcrz/ioix1gJfTHMZoxEahnKuyoHAkxqJUbZEvQIMn/IB1MsbpwWZgCAPcr3CYr1GLWU5Hqb2HzREQj4JwTtkwYijxSrU7w276ykqJd87CXJ5bcCHQDlIbWgHA5FzAFrGcoTTFmGBNiFMzA66WCi+ivjALUM5eVMIFKOVbFhAYsNyuMXrEYMs7mNKNJ2HiPGwKpSATRGiQdLuy6nrOesdUMi4+UX+M4rSXRaOpOMCGGx6ttZCVCLA2uQd9LhRFaWdMQI+11PS1hcIxwyGRNFcJZ49E2XasbSXpGY8F7u/T+AAHxEK362tT33GL4nEcJy3jJ71gFEFRZB6mW++86MlpTkmv/ahwJ6BRh6cG4avlv+bdrur/qNsWzQEQNs1ngyQ8aSGW8cmWFjyPIMHvdlt1oG87iLZG0tTGashipsNVQxV0MVuhrKGL2BIzfOqA0esTFGa+BIzQy0WGlV64bEPK1irM0fnr/Nl7P1/M6VPSTgLvWx1lyLWg7y+dOMjnjILhiLRQW4UlQwXt0W4LvbglGgCrBEvfpxEXLGH41wyOQso0JrqM3FuyLZ5lGaeC+uLSSIQH1UGO8YI5qhvu/w/Nn7Nv9WxzFzg3ekCNf9JWNLiDD3WfrGYhohwayON2WTKznCd54ynXUI0Xzvmb3yErfWAuRDeHB+I9/IAJ7KMw6vksG8eOvnHKDRYUTX3SFnHUxMmA+doE+dxGHCIsaDb+dvP30qV/adX4q0hQTT26RpzAaXaoqebnPeaSQohXSLgmqDQu4acwHHUH6Fntw5DmEBPeLgvjjQUSJUdfS3IYtaKhFqcfkri6l1OPF06O0x07//dFyCIDiY4xUvJ7UOJ07zDEMO5vjxiufw8QojMst3gZbr4oYHvEF50yTyzYg05pzM3tIBROfvz08iiBVxPoXsKEGq2vpZ4G1fojhgkFtqgK7/FTlGNjnLUJ7zmRFdKcR1jgvaqDBa1QeY9QfHmKggAXBx3oB1EiEsj1e7zlKA6zpSqjUAiTPGbukAovME9CQasFb1aCnMzDJBEGaO2IEedYjy+mCIF185rwTiGMzPDJX0HTHGW0MA4GHCM/pRourN1+/OTRuEAH2O76wBV1sKcBmt+wpu3Vfltk0/eefMBLpiC9sL4/DgGvkTgxBepjBP4tcHYZ7sdCPSjDmD6qkpuih1xqWKFx2OcbSNmBM1HER5suZOAz3iwKvKjRKhxr7K3YevHS1CTo9mUZGz9xEkjHHhF9shZpSfYCnAhhvlLyhwEAjxdJ8JNzqcKJzgoBzM8YqXTNBMuPllmmcYMROur3SeCTc6jMgsPAVeVnhNCdqKiGfCGAbwY8wtVvDcYmX2vr/6cRT0xp7ueJgDOLrPOlbgrGNVBQEzX4E58xolQD2G4Y/qKXLfPR06aoCufkRHZ6gRQazc8f3OSQSynN8/nGV93ny5Xnxe3M7W86fH+8XtYs44YwmDjPByrR0gYoSP67sqhNF3+ja75YX86CgxqntGtJUY1TkpWkKI+TlKXKt1I4N4C+cm86SCaEvnwLNnGcR7PgauZwe0dH3i48Nn74/Z/fPcPVc6Uohbhi0JFaMU9dUUPU7rwL98iwYB+VQbJOPIcZdAT9snL++9u8Vq7T098k6VgwAWD9dCPZBb+M4FaKgfOHx/Wj+al66f50t92eM9J6FAht3J/XEgBOnjx7Hj0aaAnnRwX9cayEm+MDusOVEuSeuxg8DjhCB9nMeZfTVJlxUlWykqo0SZt+CydGpjSD9GpEkIAHt8e17P/+S9vgMAlIf7xKivpugm3pV7kFYYYfVhvEuEGZRTkUzwTC3ICC/hc7UpsJseWX/XQxjWy02IQLtwS1xbTzsU5RjP25jnVhKrDgj2XK1n68XtFMUdJo11ZRcSBDXCV1gVMNZ452me2V4/1l+X89nd4s7bFlnm/HIDZlicyrMA6vN5RXZt0AjPpDiEWbQVW9acEY7HNEpy1zfMOAd23G62l1c3JoRV9n5k5V+XQLqEidSlJiAuu4255lLk02OQTjcTOI17JrkP7fLi6/94Vx9YBicxwq6GWmYy4oU/2TMOAIP45Zk0xTqEMS7mn67vKXAO7Fie/itIwLYedthvD+ZefF6vdVaTdEFL0yWMceHnC8QhHQXlrUsY4yJ+rhHlrb6SP/TtAEiPcgr+I3wXuJwQpI/uDR1DMgJ60sH5LU9fjdDNOUXv1XCsOttVNAYicHb/+mjWyW6gz7PfQXXfE9l3YLi3oOFtyUk+7wRvhIE7lQ/sfC4EBKA9zKZDaSb1Obhj/lIe8KcFrq96YAbi9OKbjcXMefpZDdPNFk1fHTjoWopwqxEab3TXiGF2VJ4quIvMWeGRH3ubwnlzOQGCPeNok/nZOzsf2nrY4VCunLMNWnKEHx5cv/3tKGGqqfyCdqolR/jFwWOvHDVimJ2K5znpiHlOmmxZzZ7RwcRjGr9ffvxwLRgn9RAWH26Z7AAsHgXjFTKIgH2ywDnuSEdJUU0ApTw6xuGN83mDBAdxDHdVVHE9S/CMpoxN6v6xgY1mcY+SrchP62EHs3hkvqgSj7dAEO454UhXuY501cQjXeU80lVTjnSV20hXyUa6yjbSLU8JDcRP1ELgPlOMQdXoMaiaYAyqRo1B1bviNp+1FObmsbr0jhmrzTxp++T10rtbfvrCOJmjK8W4p9DwPPRJjdHdu9q2EqOaz9RcN/R2tX3yi39rBuicRaGOtMe9m69O618fnahtIcAMt5uPrIFeXwyzJWiKHIRX5i0EH98DwB4fpR4fbR4JM0dPQoCZSO45oe/XNIquS4MtHU70imT7EjofXAYSEJdUj3mOfhblvNs/y/v8r15p7EatRQjLOxYb94TuiQF2ejgWetTFIZ+lQ67zxrJaMyQ1x4swbrGtJcg6E/1DmIeZcg1jiFIgt/wD7xkqHUI8/rVnEbUOJLLGl10pyuWtoAL6ocPpXIJzJrh6DAlDF9eNgJUE4HAi6LZ0Q2K1U5n/9H390EExy69Cy69ill+Fll/FL7+KKr/O587XmiGJsfmyUQ1oZXYp59PC2sI+c7Gc364fl99X6yXrfGcIYPFwHMQP5Ra+c6Ud6gcOq6f72ff1/M81J4W6YoLtnDJtKcF1T5GOdkiuvwHwHmbf5qwUGQAsHu4p05Nb+IwU6utxB0kC0WnDTxYqRQSJQaZDufh1dH7VCRL6LquZt1pw2q+WEGHWAwUWttYiZOeEPusQYtmts5ilEqBW8wkTaN7Pi8yd3dMDDkEqNhkiYB/zMwdudDDxNcyi3TuHWSkhqu797766I0sZwGPVCaQ+8CdnPTHFFkzPUAzoxxngtoQY03mI2xLCTN4gt6vFycxpGgAAPKQTNRBB+WTRK7eAAgzKqdjE0VZm1CAAH07vAPcMsskiAMA9BKk/IOAu/JTvAwAPxW0XFN4uKG67oPB2QQnaBUW2C6xuEukj3afStQhgcSbTjQzgMTtvrOfmTs/byh51fitYs+2LLWxvFx2VyKAkDF24Y/OulOCmnBOfIADqYbpnJt1IUS5nbjFQE/Sfzl9KD9Qo3bV/6ihRqvsMpqdFyYqfh4rKwzwVlb6THORz5iwdJUZlNH09LUhm3ix6p869x1kG8tiPjTyz9+VzfZCsHhi9OJ7jN5TD/CRS+fHq6heBRw9B+Vz/KvZpELjP33Kfv0mf5ePzk+e6qbctxJiu3XtbiDEZXWNLiVHLOWU9HU4zHr/LIJ3SzDX+MqAnHPRIY+dvJU/SEEiXInsNTSET2JwQdh/n1VCEQTkF4Z5dvs56ykGW9XTOVzXcNZT7UI7xzeLF5l2cHQMM5ScsYx0E5lMmqvtbZ0CPOahTyOBd7PiZHYygfITNWAdB+ZQf55svX8zp5+Y8sl2aHfieIG7o//v8e72AzZiD9dQU3X0G2RXDbF1OIl0Wy2mUCreZY/g8lIK4ufe/tQzmcfrekw4mshfJAb3dgV1kBhDMy4wAspSX7Gc1QeeuGiIMyom3cggjUJ+ywrNajgEA9wiTbdlqKq5HAyA8GMuLQznJ5718QBiwU6S89Oj/VbCqeSOG2boYXLl+2NSVwtzTGwL+sASm0G7Cimh/f1Jf6L50dJKhPNkYDoTgXryJa1cN06v3E7IH6TMoJ+ZLIYRBOsnKlu3tUH2ZaEw6AOAeohZe2Vt4JW3hlb2FV7IWXtla+HLQzR04NGKcLSxRPQThIxo0dAljXDx/Z67QRUTPwaLEd19bHgeF74Xxkq2jHFK/zddfH+/KznoXhXHg5e9H54YNhAy9qn1irkeCt4UYs/zwjTVb6OtRB/fVykaIMl3jzHeUGDXYxDyoFqLMgvn04MyOufOyo8So5VFJg9rEWc6x8bA7iMx6Qs5zq7QoWXm++QTdxD7ImSWnyyCc0qQapbBtTgDM41Awy6kWYkzG2BXbG9v8lG7zq3KpiEdu5Bi//PFqu9nw+I2c5uvbkPC1HOOriWuccq5x1ZDtcMxCpcJgurvAmdSd5KmwivYgQ6969hAFV4nrSQoDNU5Xub4g4NIr9ZBeHjdXRHEe1c2D8/BpSOi73F1dX1/+0wysjn7kuCjd1dLk03qo41exKAVxc39v3xIiTM679o50wF08zZbr77yPTgZqiu74XUVPS5Gde4+euM9++LJ44KTGWQcTTQ2odj5w1jpgBu60FPssLS7lkTGnKh0me/274nhBHNjROacbGczLwr1u8cyRrHFcdhtxmLMyHQTBnmqCUqBGlQIlLgWKLAXLpbea/TEvA6pz6stQDziYmEphlqUZY01lILfyd0KDHeBQTVLLa5zpLS1KVu+65B1EBm0E4FM9H+Ogw77YwvYSEd1LAH4ZErr6XTnT22KIXSRbWeIMCIBL+UKGlbmNkqJ6sfk7G13KrXxe5QUYiFMS/jxfWka+ZJkNMYCf/kWW6X0A5GG6xE+LR3bJ7QMwD/N/RB4tAOaxnD3cyUzaBMylDK6Tyny6DMCpPK2UVxnPUpLLq449vd2BVyEhCOZVHiIuSKqz3u4gSLQeZKSXIPkgEuSaHs1qwsHPfrj7nLUQOTP7p8o7cK8mbbGF7W03IrzW2xx2R5nD7gg5FOxyW+AlNgt9lSayjgNggE6H9NUMW1yDBvbFOLuO4CiyaDNAJ5WnGf8xWmqArnx2Cp2lEFcPIlhV9iTsM/948mbz2V159K/vetbWQE3ROecNQgDKw32O2FdTdDOCczz7AtBTDs7RMgdqG917i/IXL4iycJtHaSIz68Eob+eVlZ6YYqfHUPAgRm2je3s/f3HdLY9AKC8Vun5X2Ffb6J7a+nkueZQ2hXLL/b37h4wAgPJwjhM+UGN0s/tCm+/zFx7/rMcczKeaup/KXtitbptAuYhyogXAPBIT2l+UWm0C4PLJfGu5Tn933czTkQLc28XT1/myLAvlKZyMTxcxCu22jY6c5mRAsLgwe9whwuLjvF9lqLc45FksctB62qEOnus8asYotBtjhyAAsHhwxkI9Pe1Q7oE5HhlzVZxDO7LGRz29xeGV25BBENpL0MeAFNrtkAai8mD0tANnjNeVW/hRIOJHAc03keFFxasE0B5qojqjRtcZc6W4vWkgdq9pSnWXZHc9+kEgbLxbGNxPPk4YM0YQ5Zcln8Qt3IjWTV4GxuS9pEWjWzNBS4O0MswBHzrKK3/4HCV+7BpvbyhH+QtWd9tISS7/tms1Sn92P3mrLwbYd+FWF5lPvgp//cWZ3RbjbNMwcNFGi5LLjGaSSy1KZpWQsxTlMvOwLUbZwT2vZeqoYboZ/LMrZU+PO3AT/aSlyYJbx2tmfQE/W89qiB7tQ8VIklKG8pi15qylyX8+fpbAtZzms/KxI0f5vALYSEku/7aJ0lf+vnLeL9uRklxJWWn0pIMgzU9yks+tmj0A6iHiW9h/MHYt98QWtiR/WwSLiyCPzwCLhygf2gjAZ57wxzEtLUrm5UJLi5JZKX+WolxmarfFKJs7jumoYbpoHNPT4w7cRCfGMa1fBbeO9yT1BfxsJccx3+6k7yIGBNyF+3bgm+1t/OkCzluBlpYmc3K3Kyf45SG3bHypxun1CbZcfC3H+ax1/2/kDohvgt0J38i9CfWvh4DLPQQ4lbMe/Y3acVD/yFsnbotxtqTW0/Xd/QP+rhYmy9oqWzvFWwc9CWGm+dakCknAhXcJsAs3RfC04OYfkndPn+aecj9ttCuFuL/frm6unn6ff3fnNlKQO/9+VV7B4J6kCJf/jrmjpugBo6dtiyk2q8XvqCl6FUDtB2PvxRBh9cmU76V+ePRifxPGQscuzOJdXn3Y7y45nREGGuNZ3uEUnjVojCf3bRkGGuWplKf8OOfsRKJgNu/meClxIrdJlCtn3NEWW9heFIjwXkTevZqyHiq3eliGp9pWwcnMZhqRcYc01nUfJudICNPYd5C2+zBppRtKo3EPA2yBOXgfi0348ziZe4Ub4y9ugdX4FlhN1QKr8S2wmqoFVuNbYDVlC6zcWmA1WQusRrbAvlKchf6Wliabs38kdKO3OFSx2UQmFcLisxQ+yRJ/ko2vQnZHVYtRNrthpFpB50huLSHBZEfrhBmok1nUElt1IZhXEDLnjS2xhc1baxoQcBcTt5zLN1qaLLr9BmDxKPerhYxdRRAE86p3NPM8arGFLUisNgFz4c+OqZlxOcF0PPG1L6bZ3Lb5pCbpkh6mBSA9lqInWJJPcClJ+0s67S9FaX9pSftLadpf2tP+UpT2l9a0z2Nlqp55i8iIgEiiCF8v89/48YMJkNWTGUsY52CO3AETPlZixtEfyDF+NcHjwSstTRZ0Di0A5nGI9EA22YsHTkMO5sheGyLWhcyaziR1AwBZPYV1Y8jBHE9rKTyfk9pGF5S3DgL1KcNDVGfHMm1aBItLlY0imwph8SnzTmRTEjAXJeqTlaVPVtI+Wdn7ZCXqk5WlT1bT9cnKpU8uA9Jy3kp21CidvYpDreGU6xb8Ot7Icf7f3PSA3/yWv/FTmUphzqkBXS1GfuVtyGxpabIgB1sAi0cWbs3X9SKbmjHOSf5UbRDgyd+pTO1RZu9OJvYln37ibPNqaREyc/seuctZsk+Y3iEs2BtM7go+/8hJ5Y4apTNT2rLP2MRErQIgeH4c+e4DqT4A8Qh435WcpRDXBKXyQ+VdXt14283WUy9+2eW622AkF1cvOhz10CtiRTYaRR15N+Zg6KlSoWZZnbcHbxMXYZ6mjG3UOMrJ17uZ0Nm7sXrnmfdy8E/JJPTuwmze++1B5qcBIzz0SOpV7GMgY7x0Mbu8kruVmLF+H6fx+0j6/fNKmF8VgPIw1XSaFrBPcnGdpgWkqCPvRtwCDlkjnT/e/DKZc82yOk/VDgEwm7eoXNeAER6ydqgFGeMlbIc6mLF+H6fxQ9uh7Yuv/3P1wTum8fvlxw/XPL8BBvML9I2FQfhxgkYJRDn5ypslKxa7n6SIY+HzdxCYz8+JMvjnuBxuhogMl0ZLkfOMT84zghy6RjruagkyrymkR2PVr+mOf89ai5H1qIKdg5WWInNzsNISZHYOVlqCzM5BYnxW/crOwUqLkOuhAotcaykyMwdrLUHm5mCtJcjcHKRGItWv3BystQCZ+9Eo/rWo6aU45aHWIURObtU6jMiINVXrcOJHLvIjwWQn50lMsdkJW4txtuS2kbs2Z2mbkYgz9iQEmGYzR7V0uHl3P+wdANg8GHtCenrEoVqiFDxFG2DzYD5FS29xSDf/EjloPeDw4quyRXzxs+DNz9zTqQ8APA5+pkfKcX0nnh/v0yzKX9w7BQxEeEq2jAAMyom/UWSIgHwC97BsWgOSrhmka5hUToI4uFIIMI86MUJ5WYExqJ+knAwIuAu/jPQBgEe2vfJ++cDqZs5ShMuFYsRfGDSoLLNKH1LyzOLa1S8cmpYhPMbKH7rGVy0+cnhaBvOuGWtqlQzgmdUXsxRTfmVx8N0LTB9AeNQV2+wHyAK2UYdCuFUXnC5XxfGYZnnI90V45B2UZ/5wv6qDMX2/P9fzh7v5ndno5T2vZl84Z5LCDLuT68t/iGB3cd6dCiJ6Pp8XTyv3WL2NCqN5rkFYOsoe9cv8Yb6c3XvmyOaVe7YO5STfMTP7YpLtmoUDNUF3/kauL6bYrhEy+mKKLcpQW35W36uk5myfB9epFMGxOr76cSF1KxmUk6Co0iVVVFBt5bTcVcynl3KKr5qcSkQ53uVYHYU5rmw5vnr+tF7OBdWlDbB4MAvWWW7hc4tXS99z+Pr7nVvEXiMAGF748+gngTOq1sHEPPO3OQdZCvvMb7NbN5YWAAx2nMG+GGW7xhjsKCmq65bIvhhjO1etjhKjOm8c7igxqmsVagsxpnvsvK4U4rpvuj3LIN6ClZoLJCU5G2zbQojJ2Fbb0kFE5+8WGlWftlytzDf4vmONb2QQL0xYvFIG8fZhEmac9ayBGqILlzwRBuQkWjYDCaBLGr9feVmaZ7p1S1SeR45jHpSCuX3U7dJrmOU8l5Mapx+KmIvW0h53sVo9a5F3t1itvafHxcPavZVHGHYnx5YKJNhdXHsCGNHz+Xbntlinrx8SGI1/owJozk3/SQSw1pmfqF2aHZyBjRKgMpr+s2zAu3YEXQ8JrBy4RnLgmpMD13AOXLNz4JrIgWteDlwjOTBff328c/4M7yyDeUXCJJbCHrOcO94+PqzWy5muyStv+xI6BviHETYf51YUJNhcHIsboLc5uLaeEKDvoX/+zEigRgbyyiCXjIPBB2qcnmeu6/N9MciOU8dDlM8ylOdtopTJNFKQ61wUTqo+bb5e3c6e5t7q6Xc9DncvCEM97eBaS/pqmu6cLAM5wV94m19/MXML11cQGMTqVX08L/SqIKSXKNsXtlxflJVOTw1cJxYYhPQSFLAFXb4WouK1sJYuNUUqqXGp5BwUYSgn+YwP9yFA3+NxvbidaxGjxHakKNe19LSEKNO51LSVPerjp//ytht15boPrqWDiIyl1ZYOIh4YtANIcj9E5SwDeAHjOQPwGfW/AlMTosBsfFLO1J6edti8i01qBOBTvsJzPkm6owSojIN7zzKIl7CKfSUDePqvV9vNxhlY6xBinLCAcYLwXPejtnQIUfHuUEF3qF1YmVLrEGL+M2cRtQ4gKl65UVi50S4sYK1DiJx8rnV94tP8wVxuwkf4cXzelanMgqnbdN7CQpw3RRSbYKpVuHrFcuwxEKeyB1Ihy6HWUmTXvqKrJciZ+whmKMf4OmOiPY9dSjHusdC9iB5gclPlrEcc2GlCpMb+4PyaoSslubpi/EvANnKaH0S7ncTA6BGHF1+9fLxiwSspwo38j1db/+g9sdCNGqObt5lltOaUxz/rEYdq4cU0P7r1OaRBETObMAiEeB5045puWS6VlOS6v9cH9IhDkkoanEaN0PUonp0wtRYhqzzb+ip0nqgM5Dg/KNjsoCC4ifDGE+udJ65He/S0CDlP4/TNMRJeT9snr7/Ol6wtpR0lSnXvkTpSlOtaHVtClOm6ztBR9qnHMIHHfW4WKMbiV311KDOrGRan6uMAmVPNQJxe9U24vgnpaWmylxQHCd3oew5P82/ebPVwaRpRt5lOR0lRnV+LDNQY/U0XsZCHLqUkl3/bjRzg/3n94Z/e4uHzIy/Bu3Irn/UMQwTpw08sgAE4bd7zUPGfpisH+Prf3lZX7o3v+I66LwbZP/SQapcyuJUQYqbei34ax961owSo5qWL+bDpdvGkO4syV5z5AANwOmZ6nOkcn7ijBKis2oTUobKw3H1lxFwfqFH6avZUfd/6u+NbIBhB+HhPz59cQ5UDesJBlFAnOcaf30oTqk3AXUTJ1MgxvjlM+Dceu5RS3Bs+94bkauHij/JLPVZzgIFQT0EGWFJfWILs5Wcpr8/LMfXZXFRuvRXZnAiEiyg3ltZWw3T9PLZRUlRv9vwnn2zUJP12eS+gazVJX87/W0DXaozOGTkRY6bTT8Jesk0gXeS1a4Cx+InKf5dhcRInoK0HNRfJe9E+hXYTJ5+1RzUXCXrVRm7j38j4N1b+FL0sAiO9hRk0IncmKHHjyttymvZhObZ9kPfCfYrFTZxby1GtEb9XPqltdH7v3CZYXdi9dJtgdWH31m0C4MJb1sJWtKq1FXZH3ZXjfFEVBBiUE7c69AGUhyy5iD65ukLUIQ8RhI8ssah+uLqC1wm3tCT5RkC+ocniDOhRxrp5rnuKSBLtKhxcoCTcVVLYbCVNnGH2vFpO0I4tR7VjokHEEEH5yHJlaW8vWQOHs5TksoYMXTnN5wwWunKazxkmdOVWvvcw/x+hh0GgPpzlA+qdTvObdFxiWUFoXTRBvR6zhtC5UlbvrKsIncvkyWgds4gXEmCMxU+eiPYxDH8xoae3OtwIHW7sDpNk0NixDXCtYHyD0Ozuk4xzxq+itK6XFs4xJXOSDB2Xl8uJ2snl6HZygnHQiNWUzoXyXFuOa5cF4yJiRaV7gWB8ZFlT6V3EHydZVlV6F/HHS2PWVToXCcZNfUzfT7cjl1fe06e52Tzm5tGRwlzGx3IdJUx13gTZ0sFEsyXkh27E/STwtmHmuP0Og8BeZWQiDr8Uwsz6mGTX4MsDNUC/1jn8+93nK/fgeQO1je6tvs4uZRYlAvQ5bsIr85272Wnvvv8cYeBOYSJ3ajMAp9+8TZEEcWiaK/cC21FTdFOUo1201dVR4NKmgG6sSv0bVqd/K2sjM2FOUpRrmlcB+yQn+cJkhzCo3wReo3wy/20Krz4G9HOOKHCWgTyzoc+LlPtnyUM5zXc/mxsCkB51wxIGApuGYXF6DeP0KHSqGaSTyTiRTQUY4TFLgvkEjzWEAd69OR6vlYQgI7wYHdcQMcLH9TsRhAE61Z01g18rQWpd9hnUWglST6Exm5rFPp1mBA+8gypo5lT+BA12N4NnE8CB43XS4mQlICuI3BwN8TRfLh7vOHUTQlh9nOvlEGD1cK+TAKHv8ni/uP3ObMa6WpzsmjhtJU51To6OFOT+9/PsXpIWHT3twEqTlpqm89KmLQf5soiJCMPuxEorOm4icA0vzSyxE+uLvs2engyD+SgtOcln50lbTzuIHsB6/8w8aMn7/OXjnzqP5st1NSYpDxFaLR4fGElFokb7uiYgARrt6ZysFAl0rTOCmagtNUVnJV2jpci8BDqLe+zl7OHO06LQdxujtXQQ0XU1+CSCWOW3je60UobyvLcofzGOkQnMak4HdZ2YW1iQMycIT1sIMcM9I6W1CGQl/iYOvV2a/fCKRPm70NsUu13oHJzWSoPcd5G+2vngoK4U4lZrPkngHcL8JWWkVg8AeZSxUcxduNMbKcQ9po7HNDcqkKbCIki5FaqthugqDBmJa1QwTZhryp5r5pLCXJMevB3T4qwHHXI/LxhpXen6xFu3kwH09UNCedOuM/KWrk9svwF3jkY5UAP00+tuFrwtHrL/17v8cPWLiWVkDpHy/NefV64OAGLo4z2tVt7TbDn7xpiLAHrawXHsMVDTdNfxx1AO8E3kkeOPrbr0jpn+6aezQx8AeGwix/eyJxHEiqPEHIXqOcZB6WkBcnkCgO4Oju73epaiXOd631YCVM76aEsHEnd+EeesVn8gB/ictdeWDiDuYn/vnlmlCqJxmgekTWgfyOR61BagtzmwCu2AALrkH7xtlnuM3Z+AHnPY+ds8zZj4WoyxORXvJISZOkMYc5auFifrZtrTzRSr0HQBgEekvPTo/1W4F/RGCVCbo8GYbx0QBuXEO2AMRgA+nK4W7l9NbjBb1LMU4NYngpfdb7kbyHuczZ+8w3536WxEsEY5m0HGRMYn1Cjf8oXsFK4VaLzn1VSeVxbPJE1CkZcBEB7VCGOq8gPSRroL83KIcvG9ms4XztHySENB6zgg4C78ltFy8mJ5ifMx1o0KppXPwx3L9vSEA3fs2dMTDuUgKksPnCUeFGPxy9MJ3PLU6pWzTq0DCZBLVeDYhaAjx/nsItCR43xpAYAotBs/+4cMwEkJx/7KOvZXkrG/osf+ijv2V/jYXwnG/ooc+zvveTyJEJZ3VIrXl3fUGD3z33hgLQSZf4cM3t/QyKY4Op9deZYBPMb5U2cZypMOnEEK7sYuDT097sApEWdpj+v8NQHw7YD5E+Mg2LMM4jkfBduoIBrvMNiuFOIyjoNt6YbEq6tfXGFaAnJ4OdIIYSYnV046mMhLwbMSoF7/6oy7/hXkMNPwJISZrDSsdTCRXbo7Ygv7U5xufyiRQ4WAfZjloFEOqR9vnOuSloAcXjlohDCTUw5OOpjIS8Ozcki9vrxyxWkJyOGlYSOEmZw0POlgIrsudcQwm5c/Z2Wfunj6Olt99Vz7jEbW5z3Nfp9febfrP91f0PS0ONl1ubcrhbnN65WD2nPgbT3sYMKVh2ZkxjNoyft8901p4H606o+sYyu60j73z4f5esHYt98WIkzXqtvIEJ5z0TrrIGK5qBsF3uJhPf8yX7qjewDKw1dbPl+LKXYRp44b24ZykM8rE2iJKF+qidK7C6A8eOl9FlNsbnq35SCfU1+Q2sKrK0BNeV7Nl9XZx+7FoafFyY4P3lHiVNck6Er73PXnG5ODbsWqUUG0Y8GhGVWP9ufV9fWlW+ySSgJyzILd0Y8yBu8khbn1Umm5JFsvZnM8AEzf7/rDP//4aDbRmy/Mq3d3zoesYhDcywQXEXt1ILiX6870rpTken4c+UpArwC0Rxw5ft4N6GkHUS6My4HqEk/9ENtoBu7E2W8/lOP84CrisrUU5zr3Fz0tTtYtKhespSTXOSDaUI7zoys2W0txrqisW8p5VT4FqdIAcA/3V+F9sYXt7Y4ivNbjDq/lVquEa1DLYX59aKXu6lS4zV1nfhgE9tKt0SW3iJ60KNl8C5AEfmY2mOdhYmaiimkEoXBfnbxFyHUqxRa2t0nTWGRQEsa4eLxaPoDYvJi1sQOweRTbFz+TuZQI2Kdsc7gdUCOG2edSx2+4+gzYyXQozN65luJcQXvSkhP83Pl7u4Eap8tqXpdgc2FmcQcAe1S7xLhj4bMaptdZxK4GbT3mkHvb/CcPXkpxLntM04gRdlmy+IlylgN8b3b/5XHp/PFSV4pynY/T7kpxblCwuUFBcFmJ3NLiZOcIOT0tTmZnHZlzrmtRXSnOVYJ0UGQ6mGp0CARsrQbp6/Vy8el5PfdW7kueIIF22aZFIjIpARYP9wivIGGMi7d59x4Wd3KzGjTW8/HTf03jqUFjPfOf+TSeGkR78lrAtpzmM1vCjp52KL+zct5OiUFGeKWbf+kBgtitwozwcz6GGoPQXrIWydYa8fqBtpzm63b3UlwKGsgIL3kpaGEgvzIozuz5T2YV6shJPifjW2KSzcr2tpqk82ahPT3osHj4zE33kxTlstK7EqJMXjrXSpC6vGfGHB3KST4rNc5iks1LlZYao3+br79yYj5CAIsH+xnOeszBD4IPXha+pj/CgOfRJhAul2bZh7XCOiAQLuYStoERY+zq+zxVRHm44Rm0CagLZ45bCzFmEMah+fKMmzBnPeoQ7XZMtlbiVOcw2D0tSi6YqYyMdM1P/GaAqv/lsE0P4U2scx69TbC5qDCL/FjmUzFIp9hXOWOzKAYhvRJdbMVeZwjpZT5M8vMik1g1DMKJX5VrsYXNnmQPGSOcWFPrIWOE0zaL8mgrKOB9kM2TufoyQNh8OG9J+gDKw8SOYM6rBgjKpyn8rDfuMAbz4w458dHmwc+3LzxoKcW47MEfMerjTppOUpLL2W/QUWN0s64qCC5FcCjHSKkizNyjWmIQykvaNXYZlJOwTqsxdbp8GSXsgLsMyonzdQAEQD1cP63uKCkq6zViR43SU+640SgxKuPT6J4WIzM+ku5pIXITUJr3brIjJ/nStxQIaKwnayiFgGhP1gyqI6f5vNkUGSO9d0V5YhV7QAhz7I68BnfIsDtxl6YhCu0mqlLWGsUa/VAR5HsXqInKgRpdDtQE5UCNKgdqknKgyHIgWB8m14b5a7fUuu394+Pvz0+miePt8+8DaA/9wz7MmGNtEEP71YNM7jIOAqI9VcEsYAME4bPNM/7zGDHBdo743hdTbFa9aIkJ9ouv9Og7ytj8E4DwcD66tC8m2Ky6fdYSZPVS5EH6lrDxJwDkUW4nnz+sl4s5bzTZA5Ae36UDSow02pU1pMRIo11ZW18wksWVNZTt6i0OvFagB7B48AeXAGSEF3dYAWIsfpHMx1rHWC1RV29xUKHsEVSY2x3k+a/G5b+aJv+VPf/Nt+7Lh9k9vwi0CKhL+eY3ybN3pkejtzvIGvI+ZpwfvwnvY8b58RvvPgb1Y70mPylR6ulFt6AotBG4D/PFdkuMs9m9GdWPVZnCfJ3VJ6Augn6S7CGrfZ1hxmSf5BRfVGgaPelQRuKXtR99zDg/fvvRx5B+ueTNM0QZ5SZ7uJx+/1xeZ6ZZTAsjJbleGgcCtpGjfHaXS/S0/JEWNcZKkzCOEm7TUatROnP55qylya6HugzlVj7rfWyfgLrwx7bIqFZXpvltFQTBfIya66aRsVAHUQi3spE3f2A7NQTahbmTvwcgPKLgp2hdDsQQflmYZ1H4Gk5hCrDGODN3XoAYwq96dckdBgEQyKs8Rp03EmqkKJfV/p6UILU6k/bh8Y7dUA4QoM/zJ0G6nMUEmxNWpaWlyR+q2PUSgxpB+ET8B4io++eVmkZLkJUgzRWZ5kqe5sqS5sunx9WcFYuqLabY3NhHfQDlwfuWuK220Zk7pwYIq4+awEiNcCrfkAUiowoxwkf+TA3F5sbs1wYIm4806ezplmeFEj5JiaB8mE1XI4bYJvyd4H16R07yOT1FS0yyWb1FW43Ryy+A/DzPePhGbuWzVyEgyig31ioERBnlxlqghSiEmyTQFcAY58TbNg5zMMfqKy7uEWw4BvOrV5T55b4FQD2YC9JnLUrmjF5qIcZs8omf3R0E5sNvhKn2V/ql0JBBOF164cGPYrZLrSccBAXzpLbRRc1xDzLGi90Y9yBWL+aAa8ignDpFXfHdupxRjlO4kU7HYsNugM96ykH4RRKIwfy4gzJ8PMYeihGjMOYqTyMluazF8Laapu+OEvoO7ZHURPVMja5nSlj6lbX0myvqJVjmBB6iUG7s73d6ANSD9f3OSUlRed/vtNUYPU+ZLyVaYozN/dbmrIXJfzz+Pr8TRnyAKBY33lfRPQDlIYmjMGSQTrxRcyOm2NxR7VlN0cuRqYkFsvVN9Mw71md/BMzqXW1ZfygOmzATOrdRFl9ZoSC+yu9dIhgKQ5yRjswBMcQZ6cj/IIeAjfFmD8kBzBg/1pf7AITyigQPFJFPwRxfNmKKbTr0qRqSIcvmPE0z0idBrqvFF2abfFJiVE6+VzqMyMrvWggy14/LeXn4HftN1wBB+zBTuqOnHcqugxeuB4CM8SqyLEzMx4ex3PLMcnCuvhabzLzCjfBnvt6FKOPcyqThDPVR1BjfNI62714uLLl91ghnlaeZ3LOkjHDTPaZ558aJQoeRrK6X3vbFjxKhY00Z4TZJTbkcW0MmebiRz3ZuOuRNX4dldw6zLJWmaQUZ6aVnccf8ZRLHCjXC9yfz6x4QM8pP99nV5u0JTBvWGOejbqOivG6r5OYdHO3P+9y1q6cdeCOotpzmH4vsmCpz6MaLHneKHqaHon3LvVJ61KAkjg1khJe471cj+/4yroOwTTsxRjhJW2w1rsVuRcCSutWYMX7CVrOB2L3EfYIa1yeoadpmNbZtNhfuYn8vrWcVxO5VNwJStxpj98ujg9jMMEY48faIARC7V7Va7m03Ur8GRHvWw19zVNz2h8SzA6I9/w6zVGJl9LiDWZ6XtMInvcWBP4Wu5TQ/TtMf/EWOMwF3kaxv0GsbreMq2I1Pm2FxEvXvY+b11bxNFwnJ09QEm4tgXNQASA/RtzcQhXYzDy2pLG2GxancJie1OkHGeJVz60BuV3HGOJ5XpuWuZ5bFWbbe2kLQPlV0PFHu1Qi7j2xxpUuh3apWWNx6dDjjHGUtSRtD+3H3BvQJY1wE46L9uDFRnPqm66wqBjsBuxTcTTDHJ+f35YxVDwIi4+/H8gVTFEjew6Wsbz4TSBdxH6NG9TFqij5Gjetj1ER9jBrdx6gJ+xjl1McoeR+jxvQx7UjeRz9/URK3DsjmKVjLGLGOIZ7nj5jjK3n/rMb0z2qS/lmN7J/VRP2zGt0/q2n6ZzW2f55gXWbUmox4lWTECokSjzXUiLHGJGswI9dfuLHR22qIvl4+r9a8r40bKc5lt9UdOc7nfWV81tJk5gblHoD04H7z2wPQHszdZz0A7cHsVXoA2oPZavQAuAfr29tGSnL5b0UGCMjnjxn3pLCTEqNyXvb9gcZFNL+w5jG1EGTOl4vP372n2XL2rTo0kPuKFyONc839DSfiMwIa43npvaScCgFzrI6mNc64FR0jWV2ZxbqPsPrwupIBYpQPs2OBOeMcj2GYTeV6Yo1x5nY+MGeUI3MSBXNGOU5RJ8g+sHMlexMGRLG6cV8uARCrF69r6BGsLmapSGhjEKN8uB9KI6BxnhP0Cg1nnGN0nMIvOo5183y1ncbRkMa5TtB6NpxxjuXoIwrVFK4n1hjnSVpQNboFVRO1oGp0C2quNIV7KteGNcqZvciCkUa58rbAgJhxfrzJGsyxOpZjZv5yA86CnGXfoNq+PS1/z8Ly22ZuOPwhA3Uq01dm1EYgPrwvGYmvZ8tjkpiD9rMWJ/MGCWctRC43UApPfB8ycCfummFbDdONu/+Ds3B11uLkrc/lbn2cyhyJtcQ4mzfiOmtxMmdkdVJSVN4Iqq0m6Mz3kLa3jxPEyBoVH6u+iNtNd+Q4n9lBtsQgm3OEBXJ6hf5z880Mb/jQJ2AufDpGlURVoKMpcKOa4RHNWHEZkHgMZUPFXDQ7ayGy/mfQOsTP1//ingiIoihf9kbEHgD0YKUXllLlIpkkXFUPgHokaT7b5ZyX3x05xf8U7lhfa3b1qEMVLMjbRLnKuY/RYaBOgth49rh45RX5Rpmr/HjPtDgDEA/2chIdc6/8Nd2qIxNspAi32fxS7pnys9BneQwxo/xYx1hClLFuXpi8TuNoSKNceeeMgpjRfhM95gll8z0N18TZ2QJhnuyvrizfwcq/fh3zzSs7ZhARK0gaI8geG0gaE8geC2iSGEAjY/8IY/5YY/2IYvxYYvs0MTKDMDCzI69Q/j5k2/Q4pGMZm5C5IAtAMK96yMlbzO8BMA9hwlnTixuhkY5NuhfHJ9qPiEs0QfTTUZFP9+I4k/sRMSb3BzP/9PzgXwx+o4XIg6kRb2YPYsb58Q6YgzmEo0la0bOdADYP0fM0hDEuvOPzIAroxuhU4Pf8uiGIAuYa+lmLk3lr6GctRC6/ljl9gMEc/A4ZtJPUhXYQPgbxBKztFMgOCjPH09nCDNPcVkP0o5+p0Ntl6cHbFLsdp/MZIECfKlBVuYbKsGipCXocvobxaQEkCNk+PY7V0VzEHXUiIMKzvKgVdozt2QeN82Ru8URAozz/Kvw42kVhpibwPcMIbxNQjbk22SfYXMqbKrNf5nXmjHLkb3FBUaN8Cz04mdK8w7PdQVXLZDW1DwI9eY013kqzY+lTcfRFx8laTpLlx+enYvPXC87cF0EdOcSvN26Uu6Td8W01RBfFFrJEFFLSGbayz7DNJfwXH201Qee+9ujIMT53/k6friCPLzwmrrD8/IYxZzeIzm2wnNnAO68BO6uBf04DdUbDeXkjKDhT466edmD2Ej0A6NHKZd4Uv0+wuvAm+QPEKB/eNB/EwH7HY5qZMFnN0ibHbQCBvPirWNQa1uk31pChJQbZaXNqCIN9FoPscj8js/ttiSE2d08evhuP+50z/nXz6XNkVmC0ltjCrkPVqly3H3uRUYcEuPq54JTPttjC5r4jAxgjnDjvygDGCCfOyZ4AA3aSnETZlcP8cn5mBqyCNOszUCf2YxCnFrZ+FRQw+4mFvYv4SWUvXcKzCgcEwOX1I3vf+VkKcwV7CztqmM59h3+WklxuERoQrC6cAjQgWF3Y7/NhDO3HK659QM/Dv4q8L/OH+XJ27z3Mvs2d+H0xwF48acxyvlo5gxslRfUebvlgLQbY0dE1IEmj6tM2kZeHekC28QOvSN7MVtA8POgxsZ+5jZlI0gjXtyxN9noMt4+U68KFHYf5b+N0oyfyXnb5gefYAtg9LqUel3aPK6nHld3jo9Tjo93jF6nHL3aPa6nHtdXjRmhxY3X4p9Dhn1YH/6fQwv9p9dgchR6bo91D+hwb+3NspR5bu0cQCT2CyO4hfY7A/hxK+hzK+hw/Dwdhw24II1wuxS6XY1zkD3M56mkmeJxRz3Ml97ka4/NR7vNxjM8vcp9fxvhcy32uR/jIs2dM7sgzZ0zeyLNmTM7IM2ZMvvwqdvl1hMtvYpffRrjciF1uRrj8U+yCjpPKlRY946iCdgVRFm7z0zZrnitFxO6iDCcygfeQgznmmX8wmy2SkOd01mMO9VQuC/MiS3gmHYTFR+W+44I+SLC6pEehSToY64bq8upmvz2o6NX8w/vhtmcH0NsdvDDZej8vpUY1hvILwi3fRYspdrjdlHewiVPHLY84hvTTFx3U3vv5i8CsYYxyupnA6YZy+hHs+BZaPGRfXf8qKs19vd2BWZoRDOXHKM0dMcUWlWYEQ/qxSzPEGOV0M4HTDeXEKM0d8ZDtbfOs7FhddzX1tAD55c3bbrbmybL3Y+4M78oRfp59vDpdUhUJxTICOLCjLuTcp6mlMLcu1lx2S47wBWyKW4WKq9KNU4SGCNznlD8CnxYC8ElSYZntAzAPbilqizG26N4t9y3NbQhCeUlyHIIMveq28aUMHPer+3G/MMLiI7cZ5aJnMO+vjm9XMQjqVf/uvaRZ4vpuDIEMvZLI01dyq01XjdKZFaer7tNVcukFqecHbvHiWjqIaEYLzt+WdJQY1b1ktpUYNdNzRNc92X0xxlb+KxNslCD1p7d1/EC/pUOI0dWWRdQ6iLgPdUXx4+jvMCh3W+aplx/cDUAM7GfOekqjbajb1Djc5o5nKWMQzGsXhXHgHXOmSyOH+FEeHrxtetjoPzOr0QAB+WThrtwzYlqectGsXCpxPhXXwiKdTf+XJqHAryZALmqKMqHGlYki30rKeUfe42/CsPAOaaBbMPPpQei9+plzUDsM0veK0nrpVOk5ButUchgB+OwCT72kRVwuMTrumAH0gIMJJqmLotmlblK2vh/zJz8I3J+KxgH+5gpmCp6lCNd8DKT/Pwtca/vkxPNNlLBio1uOROXuZQwAAB5B4L2lWaCc2SfhkLlNj+886Fk5pAZ65MdOiY54yA5/HnXBcYVWqiFtF+VK12xeEnTEANt89n5Ik3yfHkLXajqQW/meOvhxLHSpIEOvvZ+/hNm1K72WDXk61TI/2Ye8hO+qAboygQfLHojH7+lBhyyM/Tx6DeN387GVezkHEEOff/nbdBO5oivVkBZvD/x62RED7FApL3/xk3ZpWjqbgBTKjZXBPfmQf4jiuNxFpseB7lMnCGDzyPVw3fnMVpQCuSWRrtveWxQ4HiPRFwPstOzJ+WVrAMA9WPndEcNs3UN4G1+P765kjwFxcEdTynkN95AAu5yGraKHGkBoL1Z7OACM8BCmH8ainVW4zcJc/pBtDuwYq5dol1/K8m4AobymsLI5HYpYPGzBOLCjaGQ+AOAe7LapEcPs4vJX2f13AJCHLvnJB3dyKQN4Omf4bXVbDLPN+oz/CwdcKQnqDZt6g1G5+dYWw2yTARys0eFE7mC/r4cdeNX9JISZ7HKGlLFUF7+kjLZhRunp5jVKC6UH6Tqfj6nSgyxXLysQuIekXNTizx8HgKHHMX1j5HOlGtIys6AjmNX19YhD3W2WF7Is2gDAIwyKbahTb+tOP0tJrpm/HmNfZNAwICcV/c3Ng5YWINdDCR66LcbYp8wp/8Fz6CBQH8EjYE+gtn6eM+rTSQcQy3Vz3r22tRA5l80IBwDYg3nr+H3/ld381GU/N4fdOncjXTVIZ44tzkqCesOm3mBU5tiiI4bZrH66EcJMXmk4CUHmT1lx+EmXB+6YnhjPd7pkXioDiKFPIVqQKSyrMYVoSlVY5lNvvEX+N3iVPzUBaJQyIXmP5hzAeFe+Y3WjI5Ce1/Yq8marh0vv02LtrdYG5WQD6DGHxcN6/mW+5OFrMcZ+/PRf89s1D11p++TNppzTmeXuxG2/c1eKcIutuvI2IQtcazFyvvvIR9dinH3D5d4ATLM/wvzkxWHizG2LB+zyYE5e7rWlCJeXex0tRublXleMs2+43EHuvfj6P1dlvNz3y48frr306JqHIMLqo0LHfhNG9H3Mjrm03D63jc1EO0zMnkO3Fh2D9LwC0/Lc3pq4JXfz1e1y8bRePD44OcEIyEfQtgfWtv18xbcnkcFJjvIfH+/nswcmvRJj7PnD87f5crae3/HwZz3mUEfWWfzv/G69cIzMg0EsXpLc6CAwn8XsWuLRyFE+Y7QQ0KOF5ueH5/t7HtgoMSpjDBKQY5Dzr7fruawGtwmYy5P+cT37dM8sn43cypc8SA+Cea3m//08f7ide7OH7zyjNgF3WUsM1hR7/eulJJ0aOcpnN0RU67P+/sSlaiVGfX5Y/DFfrmStWg+Ceq1v+UlTi3H25xvRIzR6zOGPxWohrGEdBOTzvP6qEevvupX9/FiPQtytIArp9vv8++JO4FPqIYciT5+qEx1/d/y2ZygH+J9mq8Wtd/v4oFN0phsv97QaEACX2/lyvfi8uNXDkKfH+8XtYu7uAzAgp+W9d7dYrb2nR9bT9PSAw93Xo5/5B+WMPgkJpue6kbYvhtiLpe68H5ffmdWupwcdVk/3s+/r+Z9rBr3RwuQ6JzjgWkpy3YNRAnrIYTUTVNuO2kbnFZo+werieMAIBEA8ik0cbbnJdBLDbO/p+ZNuWjnkWkpyuUnfktN8XqKf1Qh9tfjC4modTOQ2iSclQJ3fcu+0UYLUJ2MY5q4nXPXFMJtf5dtiC5tV6voAmwej5PX0oAO3QjZKispMGLo2nn9nJQlZF+d3i6fZcv2d1Qm1xRD7z/X84W5+Z4aW3vNq9oXhMEAAPuyozgEd1bn/80oEh0Zyi9XqWWslo4whAvB5mK9Xt7Onubd6+n126+zRlVv4CxF+AdEf1ws99p5/dieflAD1cf11vmQVmUYJUJ9+v105xqM8y1Aeq1k5S3Euo0FplAj1NxbxN4zGfvTfiCe/EXZlAGOEEzOxb2x9WnmRWfn7o2wmzYIBz6jLGOfET78hZ6QjNx0HGNSP/0zUU7DvG7nTU5foPc2Xi8c7BrxHgFzMQsd3XpFqpCj3v59n9wL2SQ7xl49/fi9XbKrMLgcSK85rRJSEulY3xzSqxBCbN2xFx6yCASs5WuUPValxqmBeQ85qpB2BtQ+QNf+2lp+9cEGtWixFK0dLy8rRUrxytByxcrSUrhwt7StHS8nK0ZJeOWr/zE6kNsDmwUyilh528J5WK0/PEmffVhyDlhzj89rFJbW+tpStry1t62tL0fra0rK+tvpTz6icqaUKozHeLNU6gPi80tOncmbmDD1LAa45BMqZaEQIy5vdf3lcsoiVlOSuBOAVSl6vl4tPz+s5E36So/znP5nk5z8xZjm0YoNPapSuB21Mslai1OU9E7q8J5i8uVtHTdE5bVlbTLEZ7VhLi5H5w/au3MpfCQ3QGslaYWqUFNWbP6yX3/nsSo85MLvVlhYju54l3BYSTEHdOakpOrvu1GKKza07lRYn//H4O2PTZluMsTkvxU5CjPnHjNmmaiHGZOcakWPc3BrmlPKrkHeH0PFzvY6yRw233pfPdRQR1/Mde1qCvIn2SXEwHy7twjg8sF16HMIx2MRsF60lyKWz+XqczW8IVhf1VyZ00QSri07OKmGFXg2HcNxnaXH09G+RemHbtSFWL+foTTDC6lPGuywyx5i1BIdwlJQ+utyZ7yxM+CIJvgRYPI7lUoDIpULAPrpk5EcvC7dpEJoPrGM/MyHdFMcQY8HOKjoc49DbHo4cr7PaRvd+ets0zYIo8fNQZtVBkb7S2gtgRvjtJTULJo1w5bYbA8gILzXZE6pRT1iGoJI8XQWgPZTn5/pCk835u8SrA7J5pok4JVsU0q1siXRKlCGWdP1hxRcehyTv45hGSV4GZBU4nyEjvIR14wwZ4WVKtL8z17RaKSV2h7Ej70ePdCYo2CBveAe8QX9bOGQKB+TWcfj5gqrD5BtU+qGDtAu093smOFORh97bw+yzM72lHZKr4TJjutUIMWb4V+HHPGopxbhJuOdRtRBl6kbWxLn3Dr76waS3EZhPFQmHZ1BpUXKxYWKLDcZkT8asczAz+GmXeN0+MGsnTgJcy2FJEr45m5yEQ+bxR/jOahEbIcAsG+M91Ct4m3dGj2MFYvdQBrtj5Utfb3dgzfVAyAgv3pwPwQz9THC3tGwTyiaBl4QgZOhV3wqjCT8rUWrZEnMHkxADdZKEqEcpqFs1rhWadSEjvYSJCcNwb+V+FsxAjdK7YW+ZJl0I6sUPQIkwAKdqLDxNESFYA+dqYefvq+tfPf/151UTMO83R1eUQzmyoreCBMrFfdTWFVNsMzmVP0WbYnMzgeDkbicK5VZ1Oe6NO4QY5VMPESawq0l21yDV3ajYsaJQbqfqcM23ahBjfH6T+5A1V14KsRIYXF1fX/6TO93vqxE6c+jcV/foJkbT/sVXL94vG8eVoa4U5eqmlYnVSpRaxpVickstSlZKhR+Z5FILkbVhzkzhRopyWSl8UqJUZgqftSiZmcJnLUA2K3C8BG6UGJWTvCchxuQl7lmKcXlJe5b2uNGVL43QBiMgH0EMMkCPOXDiafXFGJsR+aqnxciMiBo97YC8FcXEA/SYAy/Ft3SKB/JyGYwpl4EwlQJrKgWSyIFDOcpnRA7sizE2u9YG1lobyCMHYhCLlyQ3qMiBzUW8yIFDOcpn1bvAWu9YkQM7SozKaj8Dsv0MhJEDQQLmwoscOJRb+ZIHoSMHNpexIweCBNxlLTFYU2xe5MChHOWzGyKq9XGOHNhRYlRJ5EAMgnoxIgf2xTibFTkQ0GMO/MiBMALyEUcORCmkm3vkQEAPOMgi+4EEwEUa2Q9hQE6CyH6AHnBgRfZrCwmm8174vhhiCyL7AXrQgRfZr6eFyZyYO10pyXX/9gfQQw7s77MHahudV2gs32cPr3H8pAICIB6s77P7YpjN+USqKyW53KTHvzzuXcBLdPTL49Pvrp8GtXQwkdskIpH9zG+8yH4dJUhlRvbri2E2v8oTkf36P7NKnSWy3+ASRsmjI/tVV3ArJBbZr/MbM2Ho2siO7NcXQ2xuZL++GGLLIvvBCMCHHdmvL7awVyI4NJITRvaDEYCPILLfUG7hL0T4BURnRfbrKAEqL7JfRwlQGZH9zjKUx2pW0Mh+rR8ZDQoW2e/0228s4m8Yjf3ovxFP3gqWt0h2KdsD4Ix0ZCb8EGP3m+Lpxj3ZBE817omSKJjkqWrOSMcJnq7CYH6C6IwIY5wTPy2t0RmxK7lpaYvOeL6Q/0zUU7DvG7lTSXRGkAC58KIzdqUolxWdcSiH+JNEZyRJqCsjOmNfDLF5Uw903iGYdJAzDv50g5prCOam5MxU2tVZezlZB2fr29iLT9TK01K0+re0rP4txat/yxGrf0vp6t/Svvq3lKz+LenVP1F0Rghg82AmER6dsb6CG51xKMf4vHZxSa2RLmVrpEvbGulStEa6tKyRukdnbFQYjfH2Do7OaH5hRmfsSgGuc3TGkwhhMaIzdqUkdyUAr1AyKzrjUI7yHYMotoUYkxWdcaBG6a7RGTtKlLq8Z0KX9wSTN3ejojN2fue0ZUR0xs7PjHYMj87Y/MoftpPRGYcXrIQGaI1krRJi0Rk7vzGiMwJ6zIHZreLRGZtfXaMztoUEU1B3kOiMnd/ZdQeOztj5mVt3wOiMrV/dozP2xRib82ITic7Y/OQanbEtxJjsXCNyjJtbYE5l4bkZzDfuL3V7esLBFBaJQ60nHCR0iJyad7LMCVZHOyAr4e5xZd09PrjC42zPRSiYG2/ftaL3XSvxPmY1Yh9zLtiHnZP7sF+F31G8Wr+jeJW8RX6l3yK/it4iv5JvkX98SrMo2WudnlGu/sry9ZtbawkBRnjch4nYRjP6To/HMDHXhL5Kk1VuJHd+7rtZIRDS6w8/LhxjvUCAER7OKQczek5x+BrG5YfgSRq4fd7dlYJc/W82uNH2yS9eEMahYwSvRgXQUj/Wz5HtnYEn4ZC5y0Ln+zOaISlKlGvoxUY1pLnGVaokAKc4eFEeOm6cawuHzCzUVS58dU63kw4nej8cxxA97ZCs8sx8eu0KrWU93iH4xdvE6faHF+jmxkSdCN3iEEGAgcd1fYmvDnwfGNLzSquzclmjt562Rz7+2KrLK1OAMj+P0kR5/nYbHnPfNTQFBYI9TSSDvWMT3JXC3OMm9MJkm70fGWEyEQbg9Ju3KZKAkUonIcg8+pkKvZfQdy1JQznAvykfLAjLB3PGd9R9eqqL17u39bcvYdXRBK6jBRhB+rj2CQM1RVdhzodrsYXtHfzjUQ+IRB4nCOxVtifcRGrEBNu18+tpYbIZoZTBQZn0tp5w4KZLIybYBz/fvrDhpbpHN1HxvF2a/fCKRPm7ULchu11oBtS6nTJtrFukJDuu788++yIjzr4wv+l/+yYiCKdVAvSEw7F6A+3l+umVfvgD22tAIlzV/1/auWUpCgNh+H12Mm+jjivpBeRgjMKRJhkSbNrVTypchKSiXcUzfN+vAjEXTqq6Nv73/mKHTYKXGQ+1wf9QiJu3T9GKTK0Psfuz/yuuhStVewzbtVH1iCKbAxubbciY8Ky/8Zd+36rzlpCVI5vkT9jDmVuSVo5skpWFcxsvzsqRT/rXbgoZ8chvfX+XPX8Xwzk3e/4ONcQpZbHbNnxBDWkK7IW2NQdzpElHeP19YxLmiJP8MaUMfSf+JYg5ybMjM5WzCeNanhFIxNoZsq4zqQc63lQRMIiJ2sEamdTEmLGZKcRmhdWtU+SvOYOpk9pVHRDUI5qurhmywCFG4j7mA5J6jCbfXx5BPaw7Y+LyRqF6rtSjiLcjTkeNTGqijiQHBPWEgc2layRDOLOIuawu9M8IEOLS9GcVmNR0hyl2qipAqYu8H/TIRCYHd0uYnCBWTFiCkfM+9QmYq2oIjySwV9Vi+I37Y5P8442d+pAjfJxwEAUMWCra/8ETQ3y1I7tql3pOUjeWagpQ6pJG12RXgBBXW8Pe3mdq0Zc1inup/1dPDPe1YbGOoxxI1Hpm+JD7xPfnfEfWH6PqZjB1qt6JW0cVDlRq83+OtlTWcT7kkk3N1dlQhR5BPM1Fk0WewUxldYLtXptv+kdbsKkZ2onOFlfy0zKDqbMpPqGgSWNdW1SNIz/aMY8kWFEVR1FXltyaLVDMK6m9+ZlKbVpaA0tN/mYjX7UlmzE3WpZK3ljmkU3NRlZUoUcQz3x/CKPaSpObpUSAZIwrDvw7LTVkU8bVDG7EhKd+y2kmLN5OWF5vweZ6C7ZvFPlxCFDsMoWyQp7ktHRJk8Y0bnftYT8vjYbpGMuJQTRoHmdVYEWiVv7v8+q3gSHWmEp+PwI1ZFOmH46fsjBEKf2WIgj96xoI42Hf3FBLe6zIrBXqIIXKXqxyQy882USzMzsosGP2zKin4H3GYWvGIZ9xgBPCujL3wiwV2ZyhMhCUAGCmPAU/yKAXV8tafpJmP+H1NQOFqonFp9/r8vnEEogrMmt1ml5yL6FxO29hsX9d/2Q8bCWscnWSddFnOHbDK/Xn6gpjmbAYW9RX3VaupI1U85oXeXffLbt8099jyjiwJNNCHaGwcGutYOzel7VgaXCGdH1ojiwjZ83nEuAzQGPkel7Ck0cSYJIl/Dn4M0pFT4h4PMEfCKVE6U9hyuMJtdY368doNyXOfsAGA0JOEKLB84YRJ7VhXLO/f/0H471n2grTBAA= + H4sICPaDh14C/2JvcmluZ3NzbF9wcmVmaXhfc3ltYm9scy5oAKy9XXPbSJK2fb6/QvHsyfNETOxacqtb857REm1zW5a0JNXb3hMESIAUxiDARgGS1b/+rQJAEB+ZWahMREzMjEXc1w3UdxUKWf/5nxf7MAkzPw+Di8178w9vk2ZRslcq9o5ZuIt+ei+hH4TZf6iXizS5+FT+ulrdX2zTwyHK/7+L33Yfrm5uLsN//hpeX+4ub3776O+2u483vwQfrna/3Vxtfrn556+/bf1/+8//vLhNj+9ZtH/JL/7v9v9dXH24vPnHxZc03cfhxSLZ/oe+xFz1FGaHSKlI2+XpRaHCf2iz4/s/Lg5pEO30//pJ8J9pdhFEKs+iTZGHF/lLpC5Uusvf/Cy82Okf/eTdsI5FdkxVePEW5fr+s/J/0yK/2IXhhZa8hFloHj7zE50O/7g4ZulrFOgUyV/8XP9XeOFv0tfQkLbNvSdpHm1DcxeV7/F8v6efjsfQzy6i5MKPY6OMQnV6uvXX+cXq8fP6f2bL+cVidfG0fPxjcTe/u/g/s5X+9/+5mD3clRfNntdfH5cXd4vV7f1s8W11Mbu/v9Cq5exhvZivDOt/FuuvF8v5l9lSSx61SvPO7Ifb++e7xcOXUrj49nS/0C5nwMXjZ8P4Nl/eftV/mX1a3C/W30v7z4v1w3y1+g/NuHh4vJj/MX9YX6y+Gk7rzj7NL+4Xs0/384vP+l+zh+8Gt3qa3y5m9//Q972c367/oRGn/6cvun18WM3/+1nj9DUXd7Nvsy/mRkr16Z/lg32drVeP2nepH2/1fL82j/F5+fjt4v5xZe784nk11x6z9cyodRrqW179Q+vm+gaX5r5n+j+368Xjg+FpgbZeL2fmPh7mX+4XX+YPt3OjfSwF68elvvZ5VWv+cTFbLlbG9PF5bdSPhlkW4ceHh3l5TZX6Jj30vZR3MV/qhPg2K8Gfu7nxH/9mxJ8el5qpa483u7vznpbzz4s/L46+ykN1kb+lF7roJXm0i8JM6cKjC3+ahDoTclPEdKE+KPMHA4pyU1lNiUt3Fwd/m6UX4c+jn5SFUP8nytWFn+2Lg+api02oxWFppCvvf/zbvwe6YicheDv/1//Hxeb/gT95C/3oy+oCktG+8MK/+Pd/v/DMf23+rVF9WT7dep8Wj97O0y0NfCPnP1Z/+EdP9f+GNBXmLF6t6xHv1vcrbxtHOg29Q6jbjcAJPJRDfC4YJ6owew0zNrgjh/imCfU2xW6nSynbBYAAXq+X3pUwB4YIzEdiQJNlOTJEwD7idBqRSntdUfLoEJoulOHQksP8F92pxqHEokuAXfhJRKWNOJdH5LFpqKIkyiM/Pj2iFxR1V8CyxHm9O5gvl16c+oFnWGbgpQeJTpYQoOfx+DR/ML+aW3JuyPviHvtp/s3Lwtp+pUc3pgt34UMAzGMTpXKfHgTwesv0QEBkNCCgLtJHAik9N/PL7eJJD8i8IFTbLDo6F2wYgfuYJskvdGeURAHXqM2gnTZmYCZwMXraYRsd9aRG+jRnCu0WRPtQ5VK3M4V2k7nY6D9+eol/CCUWNcLuI3uSikC7HPyfnu5NlKD+9DAWvyiZxO+Mof2kWWXPp2O2k2ZUjaB9st1W/DQnBu306seFyKYEWDzkZcCa/5HyfN1Bcj1qOcnfxOn2R90MCnzaGNxP5XrQ6meBqBh0IJDX47cnzw8Cb5sejllYrldxBqsWFua8y8IQuFzxvDEa5q6L1Qdm6nbkBH+6h0NglHcU8K2igCKLEg1Ns/Wfpvh88LYvvm7wt2GWu3sMGbjT5QROl6Ocyp872efHe64lCKO8qxn87YxveCIQLuHPPPMnSNABiPBU1fOzrWo94rB9CXUzfcyiV/MG5Ef4zvIZUDC3anCtH3qfpcWR59VlYE5x6GetBFY8rz6FdOtnqsRzwCKdD2kQCsyMnOSn5VRS8jw1AXEJE38Th166VUfTmx/jKOG1HBCI9jz+pdP6GGaReWHgqWif+LHEGuLRd2CuCesGz6xE6fs+HJXkHmAifRd5rExxS5IwZvWpGAlx3cWFejm1TbyH7SIwHz1c4tG1EGGWYyKTuNEu2uoGj8XvQ0gvYZPSh1BeRz/zD3yXUk7yq06C29P0GLhTVfpVbl7/MY1aCMqnKeredsO3alMot7L3U3yfSk85nMZBXhypnG/UwRB++u9+Eee65Cj1JkrDAcnF1StUmAV+7k9n3yCJ+wh/eiLTWk87JOGbHi8F4U+JTQMhvaYYAYEkwjVKdqm39eN4429/sB07FMJNtzpxupf79TiEo1mJLJsiUYXsUCxuxyzNU/6CFkaiXHU+T+TaJ1Gu3HHzSUywJWPmlp5w+KuIzO6NlyIP0jd+gnUxhF/5as5/Ya0/DhCETz2k01VDzytleTREEb6cd++AnnKIlW7Y9IXbH1ULwC8eQxThq2tCtHuXt1k9jt0xCI/5i9SuhNi9RAWlxUCcyhf49WVxuvX5tRskIa5JqCdy+eHoLVe8pa02APV4Y6LfEGIWHtLXULR01UUgPuZXz99udQFhmbT0dgdvn6aB1KaEjPDKwiTcp3nEnV4iLMq5aiN3RRzzHc8M0mnjvUTMwWEbQHqkej61FRSLGjDCQ1gw2pQxbpMUDQBGeZczujJvVfS3wLbLsTmWV29kbhXD5mQmN1KnimFzqts1qVmDofxklcxWw8zO/1DAr/SUQ1IcNpyX0F095aAmKtdqdLlWE5RrNapcqwnKtRpVrtU05VqNLdf1QFtQ9k4E1CX/UO/R9o5pyu0QuxDKq1zo4LuUcpJ/Wo1TApOGQTmdpgiy1VcYhfteylLw0paC+oIie2W3do3e7sBf5OlDKC/+Kv9ZTvFVtPfjvSC5asAID2GCtSmU2wTvxwAO5ThZTbp0qUmentunb16R/EjSN7Pr4lgvp7EzEyeSdzGF72gnFcZmNMzuvfoYwq/a2MI3qvU2B1GJGVdSyoumWFrCYJR3+WbATwL2npUBhXYTvuNTI9/xqfMWdEm71mZQTvJ3fWrsu77WheIq0MFQfkWWmSvNcE9k2OWQjrrWHOqCLPBrUQi3ad6dKod3p2r6d6eK8+60LapbjaOfvyjxHbRhlHeqyq5FN/fl+wVByvdJhGvoZ/F7+cK33mzDHogAKMo3uLq+vvyn3LTLoRwF78WV9b24uWLnxyo0m8SyeoQSBl4dI6HszNnWNjBxT/ss9LVWmsxdDOEX7RPdxZsx6eVHz7z922d+wB81wDjKX/zmXo18c68menOvRr+5V5O8uVcj39yryd7cK4c396drVaiHULvM35tNjyLXDolynWS/gHLYL6Ak+wUUvV+g/FlNUDTbkJFenp/tJ/EzIMIzMa+rq4SWz7Yg2Chv5fnBq9l1qcJgmhvoEYm7KHclZ6E6poniF6MOhXIT7D9R1v0nqvzGr9nvz/6cCkVRvupHMwWQVhiAZXGuYxVM4txjUc51NCe2W6UnHP4qoq00G1sM2km6b0mN3bek5PuW1Jh9S9VFuVlOSBM9sFYv/tX1r166a09WlcDfhibvq57U6OmFbjiKQyi4jz6K8lW+LuXK/G9Y3aR4ZIsjifs49RDnzfaSlh+kke6T7GZTLrvZ2heb1aY0yXV/JfY9o0b4mvYteAlFu+oIHnUH0OcvsiE4jrTcR5TszZeLaaYngIcyrqAS3QTAo+4gy49mlLKL4lDg26ZQbnkWbadZvhyiCN96D6T5sl3agQ1RpK+sZNtLcvdlkbj1hHG0vxnnVsMU80WzaLIA0pzcxYMuHDniPnI/L9QkKdCQRrsKOqw+yO553lQ8gW8H5uKtpnNWdt/CrNnphk5qeuJQjrrrCF74RqXcyp+gsnQ5FsdwK3wmA7B46GGfyELr7Q7TJFwbRHlmhaCbLNUEXfgayvr+qZ4MTDXAgXF2f/5XBmrcVwaFWXHZsRwqKcbVjcVTtfTxO/M1dhcxysebrR4uJzArOeMczdBxCkfDIRyXq9kEydmhjHWTJeoQNdpXlLRDFOEr/eS9xxjnJEvXPmikZ7UvRJSyMG6k/2TOFk8zp64ib+fv3kvEfHcDkgDXOvJl+9Xz1j+aOYizLY4ifFmxINpikp0evM17zphmDxGETxXKgRecDWDYnASLRwjH5ih7SYKjbL7HUJqihjDGpV1BldyygxvlXy0gT+BcgWyeEy7HjeTa7qiaGMrcKwbtxN7FAjDsTvwoDxjI4snYBt2VW/gHczxExtrgCWMsfuXr3G0as7cUUDCLd71WEUe7sNxkyOqMbUDrPRxCoechHOHBWTMFGBanKTLRnncvvpqkUe1xLI7CBuyMIHwiVb3hE43P2hDCi/MFektLkMvPHwQNVa23O4jHST0O7SjuWdSonkVN2Soqt1bx/DpG5Ggt50ra8il7y6cmaPnUqJZPvaRFHHgb8yFqso9DMznjWwIwwjtPhTOgE2CEh7dLM2nxAFiEM3MNsCsH+MzwFWjUCml0YXtkYWlUYXtEYVlEX1s0X/O7WRipv3IqNv8Kt7kyxUFPIRjL/hYedAexudKc0lEfB+Pu2SeMcfHidAqrEoP6lcsY9Zq66fvjnOk4BKGe+fsxlKVkizDGRZKSfQzgV23weYnck65RQtRyv1QZj9ede9ZCZHEU6TERpJl3jt2zOEL0mOjQgvjMZGxmWVxmW0xmbvAcPGbOtsjzlywt9i9lUPc4ZLxDABiAUxDG4d6c7epts7BckfZjM3BxnwOgJMg1Lc9f07O3H+4P1hZDbD124H6i2dIC5Gr5vNnAv81/msCbYXmYppkAO9vZgOg9lEv41ZiGkVMAA3KaIsr4yAjj08b2do3rPU1M77HxvMMs0wNoybFlAwLk8vOYZuVuHtNxHnS9zCJGqHYYA/ix3hYhb4maI6bNLqjyZBxn8hAB+uQf2pEIGFVpiMB82u8ZzZhG8bwGGNRP0FWPiIBenXRz/q6oiYvGTEMQhfnK3nqNetsliO5ORnaf6L3W6PdZ5wv724UkpgMW5lx/spOFfxW6/dWtMSemEkrCXcWb+REO6jjdWzv3t3X7MjIPM3poWwyzTzsXOOiTFiFL9sj09JhDtSd+88481A5g0E7cPLfs3pecZkCfZDDBKQajTjBoXZTp4Xt6kNhUBMyljj/C3PgxRNh8zuduyczOHIujHpb5idivoeBuryFnKNwWk2zWoXFdOcI/BSjhvkcAGIhTazZlAkkw82RAwdzM2J/nYJQYlfl+jN5x0frV+/P6wz+91fpxOS83wUXBT4kZgMP9+Ts9RuzwqE/fOChPFUczV2KatAiIy45XD3dYDdR/idRLyKTWYoQti1Qy5nyR8ppXXl+odQixmS16ccirxx0C4iKLczLmdJJpTiYZeyrJNCeSjD2NhH0SCXEKSRWQ+jTt9PL0R5h4G13nzaoHexZoQSL3wV2lpk9BKTdZneaLzPCvAMPmJBnc9yGUl6gx6xBIlyKOJ0nAHojyLINE5Hq8q8qVuLLkKL4ziKP8yzMZ8yILz7N9vjsAQ72rmiIYw3cRmA//gL2uHOO3dvrzHFqAER68rZAgBXETxiMZdYZSGbN/E6UsuhFiTH5sE+t5TM0FyixRJduQb3EiYC7MoWCGjgVVuDWV8ny8hVn1kgxoKSB6D9UCeieAAtMcIKGu1bIif0WiQ6BdzJeu3JamiyB92LPqs9zKL18+CE1KBurEX0+hVzPVi5+ZpVXBYloXgfoIWkhL2wj0o14Q7UPmdALHOfibmQ+/UBBAh3vgl3wEhnmLIsXsR0SJaX2U4O9DT/1g7PkGGJiT7NX3EEH4FEn0F3Mh/izH+a3gHc07Pq4ZxBrlzK4HQwziJw0kP+58QvHZhCPOJZSeSWg/j7B1BXOL5YCAu7B7LXrF4407Gn7DR8NvzHHkGzqOfNMtZygbAHcRgE+UtBbLnS06apjeikjNwbfkMD9KIhbY6CCi8gLdbLgTKx1MNF78RZU+APaoBoIceKVEqEBPXsdBZFnhONhfGh18iEB8OguKgu03BAtwNoOy4hhw1vTOUoAbR5vMz955laMthtjmBNnz+2nWvBJgYE7V9rxqy7riGXUQgM/B30fbZoGrifmYu9cmlAS6mojjfuyluvaxFlEGBMBFdIav5fxezpeT8BeTSXHorm645/QQAfgcw9B9cGdEIKvMZQau1EHEv8wmAj0wMvHnq7Yy1hnMeHeGkiDXLN2aYwnLtexjqnLBZnKCBTu/RkFYXc0afwwIgEsVF1pXleZWvF0c7V9y1ltJkoa5l8uQcfgaxjy/sx5zqMZ5AosWAPDIOM1TBrdIkiOE6RODW7+yayfAAJ1Uf5fJvzjfrCAcwLGO/Hze2OvsNSCALuYEDH0jcfW9GMOkCwA9ql4xC1kfxnTlIJ99pil5nqn0LFP7OablFawXNY0So8rPcxx9Kmp54Rv7Kd7Qp7jk5+ollavs81Xps1XF56qOOFO1vAT6VIxnBpEwV94+DvIEV9HprZaTW+Wnto45sXWK01rHndQ60Smto09oVYKd64rcuV4eYFp+OFcu1LKeoQPAPASnutpPdDVXMNs8D23x2IdV0me1ys8wHXN+qfQ0UftJohOcIjrqBNHyourrYkER7RAwF9EJnmNO75zoJMfRpziWFya7NNuG5UpfuWyl/D0vDUES5srchU1HJ1K8vcMK2zs84UmITqcgyk9AHHP6obnmX8GPy0vvLc1++FlaJLy060MQL9le4DHnHU5z1uHYcw6nOeNw7PmG05xtOPZcQ/aZhsR5huKzDEecYzjJGYYjzy8sL8sLHj4vEKLsg98x5wBKzgCkz/+b6Oy/0ef+TXXm3/jz/qY662/8OX+SM/7o8/2kZ/vZz/VrrhBv6kZJuKtkX9qoUwSFJwhaTw+sLjiveLLb4z4E9Zr8lEL2CYWKufdXoXt/lWCnpSJ3Wk50pt7o8/TKC1/CoPWWQ1+8i3gdHUhCXQX1yVKTJgwr4Hwu35Rn8rmdxyc/i2/MOXzVwXncuTE1J57gZL/Rp/pNeO6d05l3rTO8XsxbU9bOWwhCe4l3diqnnZ1qmp2dauzOzilOWBt3uprgZDXyVLUpTlQbd5qa6CQ1yylqkhPU6NPTJjk5beSpaeVlw+9Oec0pBMI8Wae0USe0CU5nI09mE5+KNuJENCXefaxG7D5WzP28Ct3Pyx/XEGMaXn+L9bXm79xAtm2xhc0LXzsgAC55avYdCPeRQRDAS3h6nvXkvClOzRt3Yt4Up+WNOylPfkremBPyJjodb/TJeBOdijf6RDzpaXj2k/AmOQVv5Al4k5w+N/LkuWlOnRt74hx3/RxfMX/zGbdrRBDL7PdzhxnVkPZ69fG02sJb6BsAYA8+nKLWC6R8eAfQ81jfrwRJM1ADdCYW5fGTY6AG6G9R/uJtit1Ol3KuB8AYOr1eepeylB8SEBcBnuSKcmJIAF2uxGl0NSKNriR4kitNo6sRaSRNIXv6sNEEU5oyVLoEV1H7gBknek9Lk533VAH6nkN0FbDvvaelyc73Duh7DnrYcbv8/rR+9D49f/48X5brFd42PerRYpFsndwsrFHOJuT4VM4Ny+YchOGxvE+ZaYOx+ZmAhUkRxzK7E8XqVhyERsXB5nEs1IvMxBBsLsrxDAcIYPNwD0MMI4Y+q+X6SSsf1/PbtamM+v9+XtzP2aXBxnO4A/cSQqDG+3JKDcUCnM0m4cXT16YxOhxZrQvGIR3N5vc8FFhVANqjOEoMiiNJ138PBHgjJ/nsoj9E0D6MAt5Rk3RWMe7KST6rSerrhw5ljN6H2be5rGogGLsfd4yBcayO7LEFxqEc2WMKAEH5cKpoV03SXY+NGagpuuvn3n2xhc1qWoYEyuWYHoVpdCKQLowGpqum6OUmf3Hlb1NIN9eQhQM1Qp+gio+q3aKCZSlTjH7qpEOIogJqKZvqJdrx8rJUIlRWb3dW9qiz21s99/Xu5qvb5eKpHDE6JwfCsDs5hkoBCXYX11YURvR95ivv9tvs1o1ciwDWdrP1wmSbvTseDtzTQuTd5vLqhg/vyCF+non4HTnAD0IeuNYBxHC7Yd9uSwuRuVSUmMpyL7XlnirPCSl/df4uEdAjDrU/26GlBxyK5C3zjyz4WUpyvaMfBI5bEkEC4MK+d+LOpfdtuevVw6U3e/ju3H6fdRDx02LtrdZGWZ0P7M7uEywu7h0dALB47MuvjXORTc2wOAlNrHznbnSotzi4Ll8CeruDODcUkRvfnmRFq6OnHVhP0VLTdF5mt+Ug//Hxfj574N17o4XI84fnb/PlbD2/YyZ9D2Dx2HNKaldvcYhkBtZUYmVwV29xUMI0UtY0ylPv04PIoyRALp8lRfUzXVa/zB+0/f3if+d364Wes/vBv9w9AMgYL2bHCmLG+PEqI0QZ48bJrCFjjBOr+gCQMV7HzHXTHI4Z48equABkpBdnA7SFRTiL+uchw+4kKJNkX929RlIe6T57MbsWpVlXTztw0qqtpumsNOrIQf7Dev7FvPY8HBn0s5hiu77E7IspNjNXW2qKzhootcQUOxKgI5LMKylnMcVWkhRRdIqYFrDQrfyvv4gsagblxBx6deQQ/+H5/p5ZJBspyuUUmFqIMllF5aSEqI+f/mt+uzbhAF0/NRjKCT4vjVtigs1J50ZKcFlpfdaC5Nv1vJnZP9zNP/NuHqBY3VgdRp9gdWF1HX2C1YVZmvoIq484c0bkC6+U9QhWF1Y30CdALk/6x/Xs0/1clDUQZYwbJ4OGjDFOrGwCIKSXNPXs6SZLMVtaCVPJnj7O4QQAPeSwmv/38/zhds5+zdADkB4iPsZeC259Td11VXKr5PODgMHvEawu2zj0E04/AlGsbqwpQ59AuLD6XbrHPf3quputLybYzoE1+2KKLcjbgMxRXvNp6XPOb8U+yJKlIdAunv7NL2IT0VH9kJh1QIRnHCZ7x1gOQ7mVzxuCDBCED6vzoXvm+lfmkmhbbaN74U+ZgQaM8PB2R7GNZhBOkmym89ecHiBBf6DZ3ubde1jcSRxqhMVnkvqtxtfv/qWer7aT+RoY4Z2n3vP68w3brtZTDqwhYUtsYYualRMA8lj/einqtrp62oEzLmyraTorhTpykC95J7qm34nyX4RSbz8lrzzp95zlr0G02zHBRopymcWPelPKfj1KvBPlvwil3n5KXnnS7zn5LzepN5ri15gj3l2Wl+iWdx8mYebH0d9hYMJfMr2GINDz+9OcN1c6KVEqs3yfpCiXNXM8KVEqr4TXSpSq2PeqiHs1h8vwsZcQ9/lh8cd8uRK+OYcoY9w4TdaQMcaJlc0ABPRa3/I7uJaYYjO7uY6c5B+OZcxdLxeYNAzKiVnCWmqKHgnuPyLvm1eCzmKKzewQO3KKz2qOWmILm905Dhmw0+cbWfPUBVg8eEWoJbfwmQWprYcc/lisFtL3QkOG3YmTXH2C3YWVaAME5BNE+1AxnqHSQcRq+JXrmaiJzO5O7upJh9ePAvzrR5ide+nG+fTVnhYiR3l4MPGE3LknJUV1jg40UJN0zkJeS4yzmcWvJcbZBfumC/yOzVle7EysxBSb13K11RQ9ugr4cC2m2Kw2qiVG2YIkIdODnxhUSpioW/y6WKtJOrsuVmKUneg/CxLlJMf57AJClY6jz5kZNFKUa07EYHKNlOR62/yngG3kKL9IBClSiVE2I8p7XwyxD5s6EDfvHXNHTvIToUGCOVS9vs6cvxktVUsMsfX05hDl0WvIbAi7etqBVUU7cpBf5F6YMt4C1UKMyR2nnbUQOff3V6zPKGshxtRliMfUQpAZHo5xGZ6aVSw6cpLPKhRtdZ/+vP6qlevv3uLh8+MpIoX7U6CYUX6uOYxARnk5pyBGQd1+n39f3EnS8AyweLDT7SS38Plp1eh7Dp9mq8Wtd/v4oGfCs8XDmlHWYITVxzGtIIDVwzW9QELfZfHo+cdjeb5rFIfOx0cBesChOax0m2exM7+jhuhx6GfeLvb3yp191qLkLMyzdxG/RYBcTGS7xBwUVV7n7tHVQw6sZEdSW/+5XP8oz4fMwr8K12k9SqHcygMEvH3hZ36ShyHfsAfCPE2Rdl3q7YsBdpCejnN3Jp+lADdMd85ArQFIJlSg++aXjhKixq6x7RoVRMsYJQBqx+s/e34cs3hGCDDLTZKuWzrbQoTpeLDUWYbxjjzeEeFFSZSziEaIMA9mlY6blicxwT46DtZ7WoRsAgDq6uC4+XKgRuiSHqmnJx1046wcD6KBAIgH62Szvhhms5IFSouX8GdQHNyrSa0DiCZfE/daUslAXs7r309CgGnKdnnGb8JIybYYZOcvvAa8UWJU5wFyS4gxy3in7h+xAnrSgZOBHTVFD/TYKkvf+QY1gPJgVbqOmqIfCwndqCl65npE+kBN0d0PzBrKEX7KHKm1tACZU43gGmT6sU2Uekc/yjjIRoywuUPplhYhM0ZalQzjuZ5O1xZizCOPeER4puHeFDsWtNYiZJVuf4S8bKqkIPcnh/gTZBWHTZjx2oGWFiebSqw7RC68lgN87jQVn6EeU/dipTUQyezWci9OlQzi5RmvozwJISZnWnqEZ6WsTgrpm1hFESmD5RKLr5JLFrBUYlT2mmFHDdIVo8EoVRDtTXCnb9R9KnYfpIgeSHH6HwX3PorX9yis5zEHJx4YOK0Cacy+QeE9QzkkjlPFeOiTEqPqHPNeUpWzStKAQLmY2dnR9QwFkEC5yBwIOmvFRuGrX4q3+qWw1a/yB9b6SaPEqEce8ojwWGtqCl9TU/XaFWek19IS5DDdmeWfIkvYBmcE4pO4brxqCxFms2TFK2dnOclXx3Ab+bHAoiaQLrxJZ0+POLDX7RS9btfMdusjet032aAUyO0lLeLA0xNMdo70CbgLr1CdtRSZ88qwLcbZzELUEoPsqgDoCxjoRguRE+aM4yQEmHmouB3FWQpwi6NOfPc7rWQA75W1ovqKrKa+spPylUjLN+5k9Q2frfKKKFY2q3aD8zKwUaJU9gSkK+/zH7xP94uHuyr0TvIauo7nhnrCwb2Q9cQEO5LdfGS7d+dVza52SL5d/+mFjofynWUwj5PAJx1MdP2Y+CyDeYxkrGUwT+V+xrrDUjhkfpk/3H4qtwy5Qs9KjKrc07IRDpnfHh/W5ZM4b1Xuiwk2p0B1xASbURTaWppsWiOVO4cHQCkWt12aeYc0KOJCifxaHMKRUZDaWprsxWZhJJAY1Iihj79RXqS8tzRz5rekADdw5wUwh3dztQ4gqu3VJnHmlaohbRMlDFqlAmj6z5E7rVRhNM5RW30xxj76TO7Rh5nbzYZ/v2cxyA7CLQOqVSDtxXUn0EkF0uKQ/9iNFiQfjhGDqVVDWrn11RVWihCW85FXbSHG5HSQZyVAdd0s9ADEmKn+yGrJTjqAyBhmwKOLbVokpo948/4Os9SkrnIHDxBDH12ZGK1lpQJo0aszKnoFOaycOekAYuFcZobfLes/hsmLn2zDwDtEcWzeSftlm5xFBz+O8vdyRcLVaAwTuJO/Cj/mD+F6coD/0znFtGTI4dR+uN7vsvSgR35Jvk8PYfbuDu3Ih/z91rnAaQnAOQVFMFkYeu7d0gAAeeRettt+vL76tb7q8vrjr+5GEAV2KxyPCjnLYB6nfp90Q6LuxhntWKUa0txfCD2A74IezHBcN7yc2chZCVKTcO+bz0QZ2JMU5Kbu04RKBdMSzg1qFUg7pm9XDJyRwTxm/WxJCe7O102rWaAWGLQYoBOnEqEzRP2DGSkweEY25MUho0qWIoBVnnPvDCtVGO2Sh7sc8g5+pl50d+q+A6irhcjqB2v01wgBZhpwVgNqGcrz/ioix1gJfTHMZoxEahnKuyoHAkxqJUbZEvQIMn/IB1MsbpwWZgCAPcr3CYr1GLWU5Hqb2HzREQj4JwTtkwYijxSrU7w276ykqJd87CXJ5bcCHQDlIbWgHA5FzAFrGcoTTFmGBNiFMzA66WCi+ivjALUM5eVMIFKOVbFhAYsNyuMXrEYMs7mNKNJ2HiPGwKpSATRGiQdLuy6nrOesdUMi4+UX+M4rSXRaOpOMCGGx6ttZCVCLA2uQd9LhRFaWdMQI+11PS1hcIxwyGRNFcJZ49E2XasbSXpGY8F7u/T+AAHxEK362tT33GL4nEcJy3jJ71gFEFRZB6mW++86MlpTkmv/ahwJ6BRh6cG4avlv+bdrur/qNsWzQEQNs1ngyQ8aSGW8cmWFjyPIMHvdlt1oG87iLZG0tTGashipsNVQxV0MVuhrKGL2BIzfOqA0esTFGa+BIzQy0WGlV64bEPK1irM0fnr/Nl7P1/M6VPSTgLvWx1lyLWg7y+dOMjnjILhiLRQW4UlQwXt0W4LvbglGgCrBEvfpxEXLGH41wyOQso0JrqM3FuyLZ5lGaeC+uLSSIQH1UGO8YI5qhvu/w/Nn7Nv9WxzFzg3ekCNf9JWNLiDD3WfrGYhohwayON2WTKznCd54ynXUI0Xzvmb3yErfWAuRDeHB+I9/IAJ7KMw6vksG8eOvnHKDRYUTX3SFnHUxMmA+doE+dxGHCIsaDb+dvP30qV/adX4q0hQTT26RpzAaXaoqebnPeaSQohXSLgmqDQu4acwHHUH6Fntw5DmEBPeLgvjjQUSJUdfS3IYtaKhFqcfkri6l1OPF06O0x07//dFyCIDiY4xUvJ7UOJ07zDEMO5vjxiufw8QojMst3gZbr4oYHvEF50yTyzYg05pzM3tIBROfvz08iiBVxPoXsKEGq2vpZ4G1fojhgkFtqgK7/FTlGNjnLUJ7zmRFdKcR1jgvaqDBa1QeY9QfHmKggAXBx3oB1EiEsj1e7zlKA6zpSqjUAiTPGbukAovME9CQasFb1aCnMzDJBEGaO2IEedYjy+mCIF185rwTiGMzPDJX0HTHGW0MA4GHCM/pRourN1+/OTRuEAH2O76wBV1sKcBmt+wpu3Vfltk0/eefMBLpiC9sL4/DgGvkTgxBepjBP4tcHYZ7sdCPSjDmD6qkpuih1xqWKFx2OcbSNmBM1HER5suZOAz3iwKvKjRKhxr7K3YevHS1CTo9mUZGz9xEkjHHhF9shZpSfYCnAhhvlLyhwEAjxdJ8JNzqcKJzgoBzM8YqXTNBMuPllmmcYMROur3SeCTc6jMgsPAVeVnhNCdqKiGfCGAbwY8wtVvDcYmX2vr/6cRT0xp7ueJgDOLrPOlbgrGNVBQEzX4E58xolQD2G4Y/qKXLfPR06aoCufkRHZ6gRQazc8f3OSQSynN8/nGV93ny5Xnxe3M7W86fH+8XtYs44YwmDjPByrR0gYoSP67sqhNF3+ja75YX86CgxqntGtJUY1TkpWkKI+TlKXKt1I4N4C+cm86SCaEvnwLNnGcR7PgauZwe0dH3i48Nn74/Z/fPcPVc6Uohbhi0JFaMU9dUUPU7rwL98iwYB+VQbJOPIcZdAT9snL++9u8Vq7T098k6VgwAWD9dCPZBb+M4FaKgfOHx/Wj+al66f50t92eM9J6FAht3J/XEgBOnjx7Hj0aaAnnRwX9cayEm+MDusOVEuSeuxg8DjhCB9nMeZfTVJlxUlWykqo0SZt+CydGpjSD9GpEkIAHt8e17P/+S9vgMAlIf7xKivpugm3pV7kFYYYfVhvEuEGZRTkUzwTC3ICC/hc7UpsJseWX/XQxjWy02IQLtwS1xbTzsU5RjP25jnVhKrDgj2XK1n68XtFMUdJo11ZRcSBDXCV1gVMNZ452me2V4/1l+X89nd4s7bFlnm/HIDZlicyrMA6vN5RXZt0AjPpDiEWbQVW9acEY7HNEpy1zfMOAd23G62l1c3JoRV9n5k5V+XQLqEidSlJiAuu4255lLk02OQTjcTOI17JrkP7fLi6/94Vx9YBicxwq6GWmYy4oU/2TMOAIP45Zk0xTqEMS7mn67vKXAO7Fie/itIwLYedthvD+ZefF6vdVaTdEFL0yWMceHnC8QhHQXlrUsY4yJ+rhHlrb6SP/TtAEiPcgr+I3wXuJwQpI/uDR1DMgJ60sH5LU9fjdDNOUXv1XCsOttVNAYicHb/+mjWyW6gz7PfQXXfE9l3YLi3oOFtyUk+7wRvhIE7lQ/sfC4EBKA9zKZDaSb1Obhj/lIe8KcFrq96YAbi9OKbjcXMefpZDdPNFk1fHTjoWopwqxEab3TXiGF2VJ4quIvMWeGRH3ubwnlzOQGCPeNok/nZOzsf2nrY4VCunLMNWnKEHx5cv/3tKGGqqfyCdqolR/jFwWOvHDVimJ2K5znpiHlOmmxZzZ7RwcRjGr9ffvxwLRgn9RAWH26Z7AAsHgXjFTKIgH2ywDnuSEdJUU0ApTw6xuGN83mDBAdxDHdVVHE9S/CMpoxN6v6xgY1mcY+SrchP62EHs3hkvqgSj7dAEO454UhXuY501cQjXeU80lVTjnSV20hXyUa6yjbSLU8JDcRP1ELgPlOMQdXoMaiaYAyqRo1B1bviNp+1FObmsbr0jhmrzTxp++T10rtbfvrCOJmjK8W4p9DwPPRJjdHdu9q2EqOaz9RcN/R2tX3yi39rBuicRaGOtMe9m69O618fnahtIcAMt5uPrIFeXwyzJWiKHIRX5i0EH98DwB4fpR4fbR4JM0dPQoCZSO45oe/XNIquS4MtHU70imT7EjofXAYSEJdUj3mOfhblvNs/y/v8r15p7EatRQjLOxYb94TuiQF2ejgWetTFIZ+lQ67zxrJaMyQ1x4swbrGtJcg6E/1DmIeZcg1jiFIgt/wD7xkqHUI8/rVnEbUOJLLGl10pyuWtoAL6ocPpXIJzJrh6DAlDF9eNgJUE4HAi6LZ0Q2K1U5n/9H390EExy69Cy69ill+Fll/FL7+KKr/O587XmiGJsfmyUQ1oZXYp59PC2sI+c7Gc364fl99X6yXrfGcIYPFwHMQP5Ra+c6Ud6gcOq6f72ff1/M81J4W6YoLtnDJtKcF1T5GOdkiuvwHwHmbf5qwUGQAsHu4p05Nb+IwU6utxB0kC0WnDTxYqRQSJQaZDufh1dH7VCRL6LquZt1pw2q+WEGHWAwUWttYiZOeEPusQYtmts5ilEqBW8wkTaN7Pi8yd3dMDDkEqNhkiYB/zMwdudDDxNcyi3TuHWSkhqu797766I0sZwGPVCaQ+8CdnPTHFFkzPUAzoxxngtoQY03mI2xLCTN4gt6vFycxpGgAAPKQTNRBB+WTRK7eAAgzKqdjE0VZm1CAAH07vAPcMsskiAMA9BKk/IOAu/JTvAwAPxW0XFN4uKG67oPB2QQnaBUW2C6xuEukj3afStQhgcSbTjQzgMTtvrOfmTs/byh51fitYs+2LLWxvFx2VyKAkDF24Y/OulOCmnBOfIADqYbpnJt1IUS5nbjFQE/Sfzl9KD9Qo3bV/6ihRqvsMpqdFyYqfh4rKwzwVlb6THORz5iwdJUZlNH09LUhm3ix6p869x1kG8tiPjTyz9+VzfZCsHhi9OJ7jN5TD/CRS+fHq6heBRw9B+Vz/KvZpELjP33Kfv0mf5ePzk+e6qbctxJiu3XtbiDEZXWNLiVHLOWU9HU4zHr/LIJ3SzDX+MqAnHPRIY+dvJU/SEEiXInsNTSET2JwQdh/n1VCEQTkF4Z5dvs56ykGW9XTOVzXcNZT7UI7xzeLF5l2cHQMM5ScsYx0E5lMmqvtbZ0CPOahTyOBd7PiZHYygfITNWAdB+ZQf55svX8zp5+Y8sl2aHfieIG7o//v8e72AzZiD9dQU3X0G2RXDbF1OIl0Wy2mUCreZY/g8lIK4ufe/tQzmcfrekw4mshfJAb3dgV1kBhDMy4wAspSX7Gc1QeeuGiIMyom3cggjUJ+ywrNajgEA9wiTbdlqKq5HAyA8GMuLQznJ5718QBiwU6S89Oj/VbCqeSOG2boYXLl+2NSVwtzTGwL+sASm0G7Cimh/f1Jf6L50dJKhPNkYDoTgXryJa1cN06v3E7IH6TMoJ+ZLIYRBOsnKlu3tUH2ZaEw6AOAeohZe2Vt4JW3hlb2FV7IWXtla+HLQzR04NGKcLSxRPQThIxo0dAljXDx/Z67QRUTPwaLEd19bHgeF74Xxkq2jHFK/zddfH+/KznoXhXHg5e9H54YNhAy9qn1irkeCt4UYs/zwjTVb6OtRB/fVykaIMl3jzHeUGDXYxDyoFqLMgvn04MyOufOyo8So5VFJg9rEWc6x8bA7iMx6Qs5zq7QoWXm++QTdxD7ImSWnyyCc0qQapbBtTgDM41Awy6kWYkzG2BXbG9v8lG7zq3KpiEdu5Bi//PFqu9nw+I2c5uvbkPC1HOOriWuccq5x1ZDtcMxCpcJgurvAmdSd5KmwivYgQ6969hAFV4nrSQoDNU5Xub4g4NIr9ZBeHjdXRHEe1c2D8/BpSOi73F1dX1/+0wysjn7kuCjd1dLk03qo41exKAVxc39v3xIiTM679o50wF08zZbr77yPTgZqiu74XUVPS5Gde4+euM9++LJ44KTGWQcTTQ2odj5w1jpgBu60FPssLS7lkTGnKh0me/274nhBHNjROacbGczLwr1u8cyRrHFcdhtxmLMyHQTBnmqCUqBGlQIlLgWKLAXLpbea/TEvA6pz6stQDziYmEphlqUZY01lILfyd0KDHeBQTVLLa5zpLS1KVu+65B1EBm0E4FM9H+Ogw77YwvYSEd1LAH4ZErr6XTnT22KIXSRbWeIMCIBL+UKGlbmNkqJ6sfk7G13KrXxe5QUYiFMS/jxfWka+ZJkNMYCf/kWW6X0A5GG6xE+LR3bJ7QMwD/N/RB4tAOaxnD3cyUzaBMylDK6Tyny6DMCpPK2UVxnPUpLLq449vd2BVyEhCOZVHiIuSKqz3u4gSLQeZKSXIPkgEuSaHs1qwsHPfrj7nLUQOTP7p8o7cK8mbbGF7W03IrzW2xx2R5nD7gg5FOxyW+AlNgt9lSayjgNggE6H9NUMW1yDBvbFOLuO4CiyaDNAJ5WnGf8xWmqArnx2Cp2lEFcPIlhV9iTsM/948mbz2V159K/vetbWQE3ROecNQgDKw32O2FdTdDOCczz7AtBTDs7RMgdqG917i/IXL4iycJtHaSIz68Eob+eVlZ6YYqfHUPAgRm2je3s/f3HdLY9AKC8Vun5X2Ffb6J7a+nkueZQ2hXLL/b37h4wAgPJwjhM+UGN0s/tCm+/zFx7/rMcczKeaup/KXtitbptAuYhyogXAPBIT2l+UWm0C4PLJfGu5Tn933czTkQLc28XT1/myLAvlKZyMTxcxCu22jY6c5mRAsLgwe9whwuLjvF9lqLc45FksctB62qEOnus8asYotBtjhyAAsHhwxkI9Pe1Q7oE5HhlzVZxDO7LGRz29xeGV25BBENpL0MeAFNrtkAai8mD0tANnjNeVW/hRIOJHAc03keFFxasE0B5qojqjRtcZc6W4vWkgdq9pSnWXZHc9+kEgbLxbGNxPPk4YM0YQ5Zcln8Qt3IjWTV4GxuS9pEWjWzNBS4O0MswBHzrKK3/4HCV+7BpvbyhH+QtWd9tISS7/tms1Sn92P3mrLwbYd+FWF5lPvgp//cWZ3RbjbNMwcNFGi5LLjGaSSy1KZpWQsxTlMvOwLUbZwT2vZeqoYboZ/LMrZU+PO3AT/aSlyYJbx2tmfQE/W89qiB7tQ8VIklKG8pi15qylyX8+fpbAtZzms/KxI0f5vALYSEku/7aJ0lf+vnLeL9uRklxJWWn0pIMgzU9yks+tmj0A6iHiW9h/MHYt98QWtiR/WwSLiyCPzwCLhygf2gjAZ57wxzEtLUrm5UJLi5JZKX+WolxmarfFKJs7jumoYbpoHNPT4w7cRCfGMa1fBbeO9yT1BfxsJccx3+6k7yIGBNyF+3bgm+1t/OkCzluBlpYmc3K3Kyf45SG3bHypxun1CbZcfC3H+ax1/2/kDohvgt0J38i9CfWvh4DLPQQ4lbMe/Y3acVD/yFsnbotxtqTW0/Xd/QP+rhYmy9oqWzvFWwc9CWGm+dakCknAhXcJsAs3RfC04OYfkndPn+aecj9ttCuFuL/frm6unn6ff3fnNlKQO/9+VV7B4J6kCJf/jrmjpugBo6dtiyk2q8XvqCl6FUDtB2PvxRBh9cmU76V+ePRifxPGQscuzOJdXn3Y7y45nREGGuNZ3uEUnjVojCf3bRkGGuWplKf8OOfsRKJgNu/meClxIrdJlCtn3NEWW9heFIjwXkTevZqyHiq3eliGp9pWwcnMZhqRcYc01nUfJudICNPYd5C2+zBppRtKo3EPA2yBOXgfi0348ziZe4Ub4y9ugdX4FlhN1QKr8S2wmqoFVuNbYDVlC6zcWmA1WQusRrbAvlKchf6Wliabs38kdKO3OFSx2UQmFcLisxQ+yRJ/ko2vQnZHVYtRNrthpFpB50huLSHBZEfrhBmok1nUElt1IZhXEDLnjS2xhc1baxoQcBcTt5zLN1qaLLr9BmDxKPerhYxdRRAE86p3NPM8arGFLUisNgFz4c+OqZlxOcF0PPG1L6bZ3Lb5pCbpkh6mBSA9lqInWJJPcClJ+0s67S9FaX9pSftLadpf2tP+UpT2l9a0z2Nlqp55i8iIgEiiCF8v89/48YMJkNWTGUsY52CO3AETPlZixtEfyDF+NcHjwSstTRZ0Di0A5nGI9EA22YsHTkMO5sheGyLWhcyaziR1AwBZPYV1Y8jBHE9rKTyfk9pGF5S3DgL1KcNDVGfHMm1aBItLlY0imwph8SnzTmRTEjAXJeqTlaVPVtI+Wdn7ZCXqk5WlT1bT9cnKpU8uA9Jy3kp21CidvYpDreGU6xb8Ot7Icf7f3PSA3/yWv/FTmUphzqkBXS1GfuVtyGxpabIgB1sAi0cWbs3X9SKbmjHOSf5UbRDgyd+pTO1RZu9OJvYln37ibPNqaREyc/seuctZsk+Y3iEs2BtM7go+/8hJ5Y4apTNT2rLP2MRErQIgeH4c+e4DqT4A8Qh435WcpRDXBKXyQ+VdXt14283WUy9+2eW622AkF1cvOhz10CtiRTYaRR15N+Zg6KlSoWZZnbcHbxMXYZ6mjG3UOMrJ17uZ0Nm7sXrnmfdy8E/JJPTuwmze++1B5qcBIzz0SOpV7GMgY7x0Mbu8kruVmLF+H6fx+0j6/fNKmF8VgPIw1XSaFrBPcnGdpgWkqCPvRtwCDlkjnT/e/DKZc82yOk/VDgEwm7eoXNeAER6ydqgFGeMlbIc6mLF+H6fxQ9uh7Yuv/3P1wTum8fvlxw/XPL8BBvML9I2FQfhxgkYJRDn5ypslKxa7n6SIY+HzdxCYz8+JMvjnuBxuhogMl0ZLkfOMT84zghy6RjruagkyrymkR2PVr+mOf89ai5H1qIKdg5WWInNzsNISZHYOVlqCzM5BYnxW/crOwUqLkOuhAotcaykyMwdrLUHm5mCtJcjcHKRGItWv3BystQCZ+9Eo/rWo6aU45aHWIURObtU6jMiINVXrcOJHLvIjwWQn50lMsdkJW4txtuS2kbs2Z2mbkYgz9iQEmGYzR7V0uHl3P+wdANg8GHtCenrEoVqiFDxFG2DzYD5FS29xSDf/EjloPeDw4quyRXzxs+DNz9zTqQ8APA5+pkfKcX0nnh/v0yzKX9w7BQxEeEq2jAAMyom/UWSIgHwC97BsWgOSrhmka5hUToI4uFIIMI86MUJ5WYExqJ+knAwIuAu/jPQBgEe2vfJ++cDqZs5ShMuFYsRfGDSoLLNKH1LyzOLa1S8cmpYhPMbKH7rGVy0+cnhaBvOuGWtqlQzgmdUXsxRTfmVx8N0LTB9AeNQV2+wHyAK2UYdCuFUXnC5XxfGYZnnI90V45B2UZ/5wv6qDMX2/P9fzh7v5ndno5T2vZl84Z5LCDLuT68t/iGB3cd6dCiJ6Pp8XTyv3WL2NCqN5rkFYOsoe9cv8Yb6c3XvmyOaVe7YO5STfMTP7YpLtmoUDNUF3/kauL6bYrhEy+mKKLcpQW35W36uk5myfB9epFMGxOr76cSF1KxmUk6Co0iVVVFBt5bTcVcynl3KKr5qcSkQ53uVYHYU5rmw5vnr+tF7OBdWlDbB4MAvWWW7hc4tXS99z+Pr7nVvEXiMAGF748+gngTOq1sHEPPO3OQdZCvvMb7NbN5YWAAx2nMG+GGW7xhjsKCmq65bIvhhjO1etjhKjOm8c7igxqmsVagsxpnvsvK4U4rpvuj3LIN6ClZoLJCU5G2zbQojJ2Fbb0kFE5+8WGlWftlytzDf4vmONb2QQL0xYvFIG8fZhEmac9ayBGqILlzwRBuQkWjYDCaBLGr9feVmaZ7p1S1SeR45jHpSCuX3U7dJrmOU8l5Mapx+KmIvW0h53sVo9a5F3t1itvafHxcPavZVHGHYnx5YKJNhdXHsCGNHz+Xbntlinrx8SGI1/owJozk3/SQSw1pmfqF2aHZyBjRKgMpr+s2zAu3YEXQ8JrBy4RnLgmpMD13AOXLNz4JrIgWteDlwjOTBff328c/4M7yyDeUXCJJbCHrOcO94+PqzWy5muyStv+xI6BviHETYf51YUJNhcHIsboLc5uLaeEKDvoX/+zEigRgbyyiCXjIPBB2qcnmeu6/N9MciOU8dDlM8ylOdtopTJNFKQ61wUTqo+bb5e3c6e5t7q6Xc9DncvCEM97eBaS/pqmu6cLAM5wV94m19/MXML11cQGMTqVX08L/SqIKSXKNsXtlxflJVOTw1cJxYYhPQSFLAFXb4WouK1sJYuNUUqqXGp5BwUYSgn+YwP9yFA3+NxvbidaxGjxHakKNe19LSEKNO51LSVPerjp//ytht15boPrqWDiIyl1ZYOIh4YtANIcj9E5SwDeAHjOQPwGfW/AlMTosBsfFLO1J6edti8i01qBOBTvsJzPkm6owSojIN7zzKIl7CKfSUDePqvV9vNxhlY6xBinLCAcYLwXPejtnQIUfHuUEF3qF1YmVLrEGL+M2cRtQ4gKl65UVi50S4sYK1DiJx8rnV94tP8wVxuwkf4cXzelanMgqnbdN7CQpw3RRSbYKpVuHrFcuwxEKeyB1Ihy6HWUmTXvqKrJciZ+whmKMf4OmOiPY9dSjHusdC9iB5gclPlrEcc2GlCpMb+4PyaoSslubpi/EvANnKaH0S7ncTA6BGHF1+9fLxiwSspwo38j1db/+g9sdCNGqObt5lltOaUxz/rEYdq4cU0P7r1OaRBETObMAiEeB5045puWS6VlOS6v9cH9IhDkkoanEaN0PUonp0wtRYhqzzb+ip0nqgM5Dg/KNjsoCC4ifDGE+udJ65He/S0CDlP4/TNMRJeT9snr7/Ol6wtpR0lSnXvkTpSlOtaHVtClOm6ztBR9qnHMIHHfW4WKMbiV311KDOrGRan6uMAmVPNQJxe9U24vgnpaWmylxQHCd3oew5P82/ebPVwaRpRt5lOR0lRnV+LDNQY/U0XsZCHLqUkl3/bjRzg/3n94Z/e4uHzIy/Bu3Irn/UMQwTpw08sgAE4bd7zUPGfpisH+Prf3lZX7o3v+I66LwbZP/SQapcyuJUQYqbei34ax961owSo5qWL+bDpdvGkO4syV5z5AANwOmZ6nOkcn7ijBKis2oTUobKw3H1lxFwfqFH6avZUfd/6u+NbIBhB+HhPz59cQ5UDesJBlFAnOcaf30oTqk3AXUTJ1MgxvjlM+Dceu5RS3Bs+94bkauHij/JLPVZzgIFQT0EGWFJfWILs5Wcpr8/LMfXZXFRuvRXZnAiEiyg3ltZWw3T9PLZRUlRv9vwnn2zUJP12eS+gazVJX87/W0DXaozOGTkRY6bTT8Jesk0gXeS1a4Cx+InKf5dhcRInoK0HNRfJe9E+hXYTJ5+1RzUXCXrVRm7j38j4N1b+FL0sAiO9hRk0IncmKHHjyttymvZhObZ9kPfCfYrFTZxby1GtEb9XPqltdH7v3CZYXdi9dJtgdWH31m0C4MJb1sJWtKq1FXZH3ZXjfFEVBBiUE7c69AGUhyy5iD65ukLUIQ8RhI8ssah+uLqC1wm3tCT5RkC+ocniDOhRxrp5rnuKSBLtKhxcoCTcVVLYbCVNnGH2vFpO0I4tR7VjokHEEEH5yHJlaW8vWQOHs5TksoYMXTnN5wwWunKazxkmdOVWvvcw/x+hh0GgPpzlA+qdTvObdFxiWUFoXTRBvR6zhtC5UlbvrKsIncvkyWgds4gXEmCMxU+eiPYxDH8xoae3OtwIHW7sDpNk0NixDXCtYHyD0Ozuk4xzxq+itK6XFs4xJXOSDB2Xl8uJ2snl6HZygnHQiNWUzoXyXFuOa5cF4yJiRaV7gWB8ZFlT6V3EHydZVlV6F/HHS2PWVToXCcZNfUzfT7cjl1fe06e52Tzm5tGRwlzGx3IdJUx13gTZ0sFEsyXkh27E/STwtmHmuP0Og8BeZWQiDr8Uwsz6mGTX4MsDNUC/1jn8+93nK/fgeQO1je6tvs4uZRYlAvQ5bsIr85272Wnvvv8cYeBOYSJ3ajMAp9+8TZEEcWiaK/cC21FTdFOUo1201dVR4NKmgG6sSv0bVqd/K2sjM2FOUpRrmlcB+yQn+cJkhzCo3wReo3wy/20Krz4G9HOOKHCWgTyzoc+LlPtnyUM5zXc/mxsCkB51wxIGApuGYXF6DeP0KHSqGaSTyTiRTQUY4TFLgvkEjzWEAd69OR6vlYQgI7wYHdcQMcLH9TsRhAE61Z01g18rQWpd9hnUWglST6Exm5rFPp1mBA+8gypo5lT+BA12N4NnE8CB43XS4mQlICuI3BwN8TRfLh7vOHUTQlh9nOvlEGD1cK+TAKHv8ni/uP3ObMa6WpzsmjhtJU51To6OFOT+9/PsXpIWHT3twEqTlpqm89KmLQf5soiJCMPuxEorOm4icA0vzSyxE+uLvs2engyD+SgtOcln50lbTzuIHsB6/8w8aMn7/OXjnzqP5st1NSYpDxFaLR4fGElFokb7uiYgARrt6ZysFAl0rTOCmagtNUVnJV2jpci8BDqLe+zl7OHO06LQdxujtXQQ0XU1+CSCWOW3je60UobyvLcofzGOkQnMak4HdZ2YW1iQMycIT1sIMcM9I6W1CGQl/iYOvV2a/fCKRPm70NsUu13oHJzWSoPcd5G+2vngoK4U4lZrPkngHcL8JWWkVg8AeZSxUcxduNMbKcQ9po7HNDcqkKbCIki5FaqthugqDBmJa1QwTZhryp5r5pLCXJMevB3T4qwHHXI/LxhpXen6xFu3kwH09UNCedOuM/KWrk9svwF3jkY5UAP00+tuFrwtHrL/17v8cPWLiWVkDpHy/NefV64OAGLo4z2tVt7TbDn7xpiLAHrawXHsMVDTdNfxx1AO8E3kkeOPrbr0jpn+6aezQx8AeGwix/eyJxHEiqPEHIXqOcZB6WkBcnkCgO4Oju73epaiXOd631YCVM76aEsHEnd+EeesVn8gB/ictdeWDiDuYn/vnlmlCqJxmgekTWgfyOR61BagtzmwCu2AALrkH7xtlnuM3Z+AHnPY+ds8zZj4WoyxORXvJISZOkMYc5auFifrZtrTzRSr0HQBgEekvPTo/1W4F/RGCVCbo8GYbx0QBuXEO2AMRgA+nK4W7l9NbjBb1LMU4NYngpfdb7kbyHuczZ+8w3536WxEsEY5m0HGRMYn1Cjf8oXsFK4VaLzn1VSeVxbPJE1CkZcBEB7VCGOq8gPSRroL83KIcvG9ms4XztHySENB6zgg4C78ltFy8mJ5ifMx1o0KppXPwx3L9vSEA3fs2dMTDuUgKksPnCUeFGPxy9MJ3PLU6pWzTq0DCZBLVeDYhaAjx/nsItCR43xpAYAotBs/+4cMwEkJx/7KOvZXkrG/osf+ijv2V/jYXwnG/ooc+zvveTyJEJZ3VIrXl3fUGD3z33hgLQSZf4cM3t/QyKY4Op9deZYBPMb5U2cZypMOnEEK7sYuDT097sApEWdpj+v8NQHw7YD5E+Mg2LMM4jkfBduoIBrvMNiuFOIyjoNt6YbEq6tfXGFaAnJ4OdIIYSYnV046mMhLwbMSoF7/6oy7/hXkMNPwJISZrDSsdTCRXbo7Ygv7U5xufyiRQ4WAfZjloFEOqR9vnOuSloAcXjlohDCTUw5OOpjIS8Ozcki9vrxyxWkJyOGlYSOEmZw0POlgIrsudcQwm5c/Z2Wfunj6Olt99Vz7jEbW5z3Nfp9febfrP91f0PS0ONl1ubcrhbnN65WD2nPgbT3sYMKVh2ZkxjNoyft8901p4H606o+sYyu60j73z4f5esHYt98WIkzXqtvIEJ5z0TrrIGK5qBsF3uJhPf8yX7qjewDKw1dbPl+LKXYRp44b24ZykM8rE2iJKF+qidK7C6A8eOl9FlNsbnq35SCfU1+Q2sKrK0BNeV7Nl9XZx+7FoafFyY4P3lHiVNck6Er73PXnG5ODbsWqUUG0Y8GhGVWP9ufV9fWlW+ySSgJyzILd0Y8yBu8khbn1Umm5JFsvZnM8AEzf7/rDP//4aDbRmy/Mq3d3zoesYhDcywQXEXt1ILiX6870rpTken4c+UpArwC0Rxw5ft4N6GkHUS6My4HqEk/9ENtoBu7E2W8/lOP84CrisrUU5zr3Fz0tTtYtKhespSTXOSDaUI7zoys2W0txrqisW8p5VT4FqdIAcA/3V+F9sYXt7Y4ivNbjDq/lVquEa1DLYX59aKXu6lS4zV1nfhgE9tKt0SW3iJ60KNl8C5AEfmY2mOdhYmaiimkEoXBfnbxFyHUqxRa2t0nTWGRQEsa4eLxaPoDYvJi1sQOweRTbFz+TuZQI2Kdsc7gdUCOG2edSx2+4+gzYyXQozN65luJcQXvSkhP83Pl7u4Eap8tqXpdgc2FmcQcAe1S7xLhj4bMaptdZxK4GbT3mkHvb/CcPXkpxLntM04gRdlmy+IlylgN8b3b/5XHp/PFSV4pynY/T7kpxblCwuUFBcFmJ3NLiZOcIOT0tTmZnHZlzrmtRXSnOVYJ0UGQ6mGp0CARsrQbp6/Vy8el5PfdW7kueIIF22aZFIjIpARYP9wivIGGMi7d59x4Wd3KzGjTW8/HTf03jqUFjPfOf+TSeGkR78lrAtpzmM1vCjp52KL+zct5OiUFGeKWbf+kBgtitwozwcz6GGoPQXrIWydYa8fqBtpzm63b3UlwKGsgIL3kpaGEgvzIozuz5T2YV6shJPifjW2KSzcr2tpqk82ahPT3osHj4zE33kxTlstK7EqJMXjrXSpC6vGfGHB3KST4rNc5iks1LlZYao3+br79yYj5CAIsH+xnOeszBD4IPXha+pj/CgOfRJhAul2bZh7XCOiAQLuYStoERY+zq+zxVRHm44Rm0CagLZ45bCzFmEMah+fKMmzBnPeoQ7XZMtlbiVOcw2D0tSi6YqYyMdM1P/GaAqv/lsE0P4U2scx69TbC5qDCL/FjmUzFIp9hXOWOzKAYhvRJdbMVeZwjpZT5M8vMik1g1DMKJX5VrsYXNnmQPGSOcWFPrIWOE0zaL8mgrKOB9kM2TufoyQNh8OG9J+gDKw8SOYM6rBgjKpyn8rDfuMAbz4w458dHmwc+3LzxoKcW47MEfMerjTppOUpLL2W/QUWN0s64qCC5FcCjHSKkizNyjWmIQykvaNXYZlJOwTqsxdbp8GSXsgLsMyonzdQAEQD1cP63uKCkq6zViR43SU+640SgxKuPT6J4WIzM+ku5pIXITUJr3brIjJ/nStxQIaKwnayiFgGhP1gyqI6f5vNkUGSO9d0V5YhV7QAhz7I68BnfIsDtxl6YhCu0mqlLWGsUa/VAR5HsXqInKgRpdDtQE5UCNKgdqknKgyHIgWB8m14b5a7fUuu394+Pvz0+miePt8+8DaA/9wz7MmGNtEEP71YNM7jIOAqI9VcEsYAME4bPNM/7zGDHBdo743hdTbFa9aIkJ9ouv9Og7ytj8E4DwcD66tC8m2Ky6fdYSZPVS5EH6lrDxJwDkUW4nnz+sl4s5bzTZA5Ae36UDSow02pU1pMRIo11ZW18wksWVNZTt6i0OvFagB7B48AeXAGSEF3dYAWIsfpHMx1rHWC1RV29xUKHsEVSY2x3k+a/G5b+aJv+VPf/Nt+7Lh9k9vwi0CKhL+eY3ybN3pkejtzvIGvI+ZpwfvwnvY8b58RvvPgb1Y70mPylR6ulFt6AotBG4D/PFdkuMs9m9GdWPVZnCfJ3VJ6Augn6S7CGrfZ1hxmSf5BRfVGgaPelQRuKXtR99zDg/fvvRx5B+ueTNM0QZ5SZ7uJx+/1xeZ6ZZTAsjJbleGgcCtpGjfHaXS/S0/JEWNcZKkzCOEm7TUatROnP55qylya6HugzlVj7rfWyfgLrwx7bIqFZXpvltFQTBfIya66aRsVAHUQi3spE3f2A7NQTahbmTvwcgPKLgp2hdDsQQflmYZ1H4Gk5hCrDGODN3XoAYwq96dckdBgEQyKs8Rp03EmqkKJfV/p6UILU6k/bh8Y7dUA4QoM/zJ0G6nMUEmxNWpaWlyR+q2PUSgxpB+ET8B4io++eVmkZLkJUgzRWZ5kqe5sqS5sunx9WcFYuqLabY3NhHfQDlwfuWuK220Zk7pwYIq4+awEiNcCrfkAUiowoxwkf+TA3F5sbs1wYIm4806ezplmeFEj5JiaB8mE1XI4bYJvyd4H16R07yOT1FS0yyWb1FW43Ryy+A/DzPePhGbuWzVyEgyig31ioERBnlxlqghSiEmyTQFcAY58TbNg5zMMfqKy7uEWw4BvOrV5T55b4FQD2YC9JnLUrmjF5qIcZs8omf3R0E5sNvhKn2V/ql0JBBOF164cGPYrZLrSccBAXzpLbRRc1xDzLGi90Y9yBWL+aAa8ignDpFXfHdupxRjlO4kU7HYsNugM96ykH4RRKIwfy4gzJ8PMYeihGjMOYqTyMluazF8Laapu+OEvoO7ZHURPVMja5nSlj6lbX0myvqJVjmBB6iUG7s73d6ANSD9f3OSUlRed/vtNUYPU+ZLyVaYozN/dbmrIXJfzz+Pr8TRnyAKBY33lfRPQDlIYmjMGSQTrxRcyOm2NxR7VlN0cuRqYkFsvVN9Mw71md/BMzqXW1ZfygOmzATOrdRFl9ZoSC+yu9dIhgKQ5yRjswBMcQZ6cj/IIeAjfFmD8kBzBg/1pf7AITyigQPFJFPwRxfNmKKbTr0qRqSIcvmPE0z0idBrqvFF2abfFJiVE6+VzqMyMrvWggy14/LeXn4HftN1wBB+zBTuqOnHcqugxeuB4CM8SqyLEzMx4ex3PLMcnCuvhabzLzCjfBnvt6FKOPcyqThDPVR1BjfNI62714uLLl91ghnlaeZ3LOkjHDTPaZ558aJQoeRrK6X3vbFjxKhY00Z4TZJTbkcW0MmebiRz3ZuOuRNX4dldw6zLJWmaQUZ6aVnccf8ZRLHCjXC9yfz6x4QM8pP99nV5u0JTBvWGOejbqOivG6r5OYdHO3P+9y1q6cdeCOotpzmH4vsmCpz6MaLHneKHqaHon3LvVJ61KAkjg1khJe471cj+/4yroOwTTsxRjhJW2w1rsVuRcCSutWYMX7CVrOB2L3EfYIa1yeoadpmNbZtNhfuYn8vrWcVxO5VNwJStxpj98ujg9jMMEY48faIARC7V7Va7m03Ur8GRHvWw19zVNz2h8SzA6I9/w6zVGJl9LiDWZ6XtMInvcWBP4Wu5TQ/TtMf/EWOMwF3kaxv0GsbreMq2I1Pm2FxEvXvY+b11bxNFwnJ09QEm4tgXNQASA/RtzcQhXYzDy2pLG2GxancJie1OkHGeJVz60BuV3HGOJ5XpuWuZ5bFWbbe2kLQPlV0PFHu1Qi7j2xxpUuh3apWWNx6dDjjHGUtSRtD+3H3BvQJY1wE46L9uDFRnPqm66wqBjsBuxTcTTDHJ+f35YxVDwIi4+/H8gVTFEjew6Wsbz4TSBdxH6NG9TFqij5Gjetj1ER9jBrdx6gJ+xjl1McoeR+jxvQx7UjeRz9/URK3DsjmKVjLGLGOIZ7nj5jjK3n/rMb0z2qS/lmN7J/VRP2zGt0/q2n6ZzW2f55gXWbUmox4lWTECokSjzXUiLHGJGswI9dfuLHR22qIvl4+r9a8r40bKc5lt9UdOc7nfWV81tJk5gblHoD04H7z2wPQHszdZz0A7cHsVXoA2oPZavQAuAfr29tGSnL5b0UGCMjnjxn3pLCTEqNyXvb9gcZFNL+w5jG1EGTOl4vP372n2XL2rTo0kPuKFyONc839DSfiMwIa43npvaScCgFzrI6mNc64FR0jWV2ZxbqPsPrwupIBYpQPs2OBOeMcj2GYTeV6Yo1x5nY+MGeUI3MSBXNGOU5RJ8g+sHMlexMGRLG6cV8uARCrF69r6BGsLmapSGhjEKN8uB9KI6BxnhP0Cg1nnGN0nMIvOo5183y1ncbRkMa5TtB6NpxxjuXoIwrVFK4n1hjnSVpQNboFVRO1oGp0C2quNIV7KteGNcqZvciCkUa58rbAgJhxfrzJGsyxOpZjZv5yA86CnGXfoNq+PS1/z8Ly22ZuOPwhA3Uq01dm1EYgPrwvGYmvZ8tjkpiD9rMWJ/MGCWctRC43UApPfB8ycCfummFbDdONu/+Ds3B11uLkrc/lbn2cyhyJtcQ4mzfiOmtxMmdkdVJSVN4Iqq0m6Mz3kLa3jxPEyBoVH6u+iNtNd+Q4n9lBtsQgm3OEBXJ6hf5z880Mb/jQJ2AufDpGlURVoKMpcKOa4RHNWHEZkHgMZUPFXDQ7ayGy/mfQOsTP1//ingiIoihf9kbEHgD0YKUXllLlIpkkXFUPgHokaT7b5ZyX3x05xf8U7lhfa3b1qEMVLMjbRLnKuY/RYaBOgth49rh45RX5Rpmr/HjPtDgDEA/2chIdc6/8Nd2qIxNspAi32fxS7pnys9BneQwxo/xYx1hClLFuXpi8TuNoSKNceeeMgpjRfhM95gll8z0N18TZ2QJhnuyvrizfwcq/fh3zzSs7ZhARK0gaI8geG0gaE8geC2iSGEAjY/8IY/5YY/2IYvxYYvs0MTKDMDCzI69Q/j5k2/Q4pGMZm5C5IAtAMK96yMlbzO8BMA9hwlnTixuhkY5NuhfHJ9qPiEs0QfTTUZFP9+I4k/sRMSb3BzP/9PzgXwx+o4XIg6kRb2YPYsb58Q6YgzmEo0la0bOdADYP0fM0hDEuvOPzIAroxuhU4Pf8uiGIAuYa+lmLk3lr6GctRC6/ljl9gMEc/A4ZtJPUhXYQPgbxBKztFMgOCjPH09nCDNPcVkP0o5+p0Ntl6cHbFLsdp/MZIECfKlBVuYbKsGipCXocvobxaQEkCNk+PY7V0VzEHXUiIMKzvKgVdozt2QeN82Ru8URAozz/Kvw42kVhpibwPcMIbxNQjbk22SfYXMqbKrNf5nXmjHLkb3FBUaN8Cz04mdK8w7PdQVXLZDW1DwI9eY013kqzY+lTcfRFx8laTpLlx+enYvPXC87cF0EdOcSvN26Uu6Td8W01RBfFFrJEFFLSGbayz7DNJfwXH201Qee+9ujIMT53/k6friCPLzwmrrD8/IYxZzeIzm2wnNnAO68BO6uBf04DdUbDeXkjKDhT466edmD2Ej0A6NHKZd4Uv0+wuvAm+QPEKB/eNB/EwH7HY5qZMFnN0ibHbQCBvPirWNQa1uk31pChJQbZaXNqCIN9FoPscj8js/ttiSE2d08evhuP+50z/nXz6XNkVmC0ltjCrkPVqly3H3uRUYcEuPq54JTPttjC5r4jAxgjnDjvygDGCCfOyZ4AA3aSnETZlcP8cn5mBqyCNOszUCf2YxCnFrZ+FRQw+4mFvYv4SWUvXcKzCgcEwOX1I3vf+VkKcwV7CztqmM59h3+WklxuERoQrC6cAjQgWF3Y7/NhDO3HK659QM/Dv4q8L/OH+XJ27z3Mvs2d+H0xwF48acxyvlo5gxslRfUebvlgLQbY0dE1IEmj6tM2kZeHekC28QOvSN7MVtA8POgxsZ+5jZlI0gjXtyxN9noMt4+U68KFHYf5b+N0oyfyXnb5gefYAtg9LqUel3aPK6nHld3jo9Tjo93jF6nHL3aPa6nHtdXjRmhxY3X4p9Dhn1YH/6fQwv9p9dgchR6bo91D+hwb+3NspR5bu0cQCT2CyO4hfY7A/hxK+hzK+hw/Dwdhw24II1wuxS6XY1zkD3M56mkmeJxRz3Ml97ka4/NR7vNxjM8vcp9fxvhcy32uR/jIs2dM7sgzZ0zeyLNmTM7IM2ZMvvwqdvl1hMtvYpffRrjciF1uRrj8U+yCjpPKlRY946iCdgVRFm7z0zZrnitFxO6iDCcygfeQgznmmX8wmy2SkOd01mMO9VQuC/MiS3gmHYTFR+W+44I+SLC6pEehSToY64bq8upmvz2o6NX8w/vhtmcH0NsdvDDZej8vpUY1hvILwi3fRYspdrjdlHewiVPHLY84hvTTFx3U3vv5i8CsYYxyupnA6YZy+hHs+BZaPGRfXf8qKs19vd2BWZoRDOXHKM0dMcUWlWYEQ/qxSzPEGOV0M4HTDeXEKM0d8ZDtbfOs7FhddzX1tAD55c3bbrbmybL3Y+4M78oRfp59vDpdUhUJxTICOLCjLuTcp6mlMLcu1lx2S47wBWyKW4WKq9KNU4SGCNznlD8CnxYC8ElSYZntAzAPbilqizG26N4t9y3NbQhCeUlyHIIMveq28aUMHPer+3G/MMLiI7cZ5aJnMO+vjm9XMQjqVf/uvaRZ4vpuDIEMvZLI01dyq01XjdKZFaer7tNVcukFqecHbvHiWjqIaEYLzt+WdJQY1b1ktpUYNdNzRNc92X0xxlb+KxNslCD1p7d1/EC/pUOI0dWWRdQ6iLgPdUXx4+jvMCh3W+aplx/cDUAM7GfOekqjbajb1Djc5o5nKWMQzGsXhXHgHXOmSyOH+FEeHrxtetjoPzOr0QAB+WThrtwzYlqectGsXCpxPhXXwiKdTf+XJqHAryZALmqKMqHGlYki30rKeUfe42/CsPAOaaBbMPPpQei9+plzUDsM0veK0nrpVOk5ButUchgB+OwCT72kRVwuMTrumAH0gIMJJqmLotmlblK2vh/zJz8I3J+KxgH+5gpmCp6lCNd8DKT/Pwtca/vkxPNNlLBio1uOROXuZQwAAB5B4L2lWaCc2SfhkLlNj+886Fk5pAZ65MdOiY54yA5/HnXBcYVWqiFtF+VK12xeEnTEANt89n5Ik3yfHkLXajqQW/meOvhxLHSpIEOvvZ+/hNm1K72WDXk61TI/2Ye8hO+qAboygQfLHojH7+lBhyyM/Tx6DeN387GVezkHEEOff/nbdBO5oivVkBZvD/x62RED7FApL3/xk3ZpWjqbgBTKjZXBPfmQf4jiuNxFpseB7lMnCGDzyPVw3fnMVpQCuSWRrtveWxQ4HiPRFwPstOzJ+WVrAMA9WPndEcNs3UN4G1+P765kjwFxcEdTynkN95AAu5yGraKHGkBoL1Z7OACM8BCmH8ainVW4zcJc/pBtDuwYq5dol1/K8m4AobymsLI5HYpYPGzBOLCjaGQ+AOAe7LapEcPs4vJX2f13AJCHLvnJB3dyKQN4Omf4bXVbDLPN+oz/CwdcKQnqDZt6g1G5+dYWw2yTARys0eFE7mC/r4cdeNX9JISZ7HKGlLFUF7+kjLZhRunp5jVKC6UH6Tqfj6nSgyxXLysQuIekXNTizx8HgKHHMX1j5HOlGtIys6AjmNX19YhD3W2WF7Is2gDAIwyKbahTb+tOP0tJrpm/HmNfZNAwICcV/c3Ng5YWINdDCR66LcbYp8wp/8Fz6CBQH8EjYE+gtn6eM+rTSQcQy3Vz3r22tRA5l80IBwDYg3nr+H3/ld381GU/N4fdOncjXTVIZ44tzkqCesOm3mBU5tiiI4bZrH66EcJMXmk4CUHmT1lx+EmXB+6YnhjPd7pkXioDiKFPIVqQKSyrMYVoSlVY5lNvvEX+N3iVPzUBaJQyIXmP5hzAeFe+Y3WjI5Ce1/Yq8marh0vv02LtrdYG5WQD6DGHxcN6/mW+5OFrMcZ+/PRf89s1D11p++TNppzTmeXuxG2/c1eKcIutuvI2IQtcazFyvvvIR9dinH3D5d4ATLM/wvzkxWHizG2LB+zyYE5e7rWlCJeXex0tRublXleMs2+43EHuvfj6P1dlvNz3y48frr306JqHIMLqo0LHfhNG9H3Mjrm03D63jc1EO0zMnkO3Fh2D9LwC0/Lc3pq4JXfz1e1y8bRePD44OcEIyEfQtgfWtv18xbcnkcFJjvIfH+/nswcmvRJj7PnD87f5crae3/HwZz3mUEfWWfzv/G69cIzMg0EsXpLc6CAwn8XsWuLRyFE+Y7QQ0KOF5ueH5/t7HtgoMSpjDBKQY5Dzr7fruawGtwmYy5P+cT37dM8sn43cypc8SA+Cea3m//08f7ide7OH7zyjNgF3WUsM1hR7/eulJJ0aOcpnN0RU67P+/sSlaiVGfX5Y/DFfrmStWg+Ceq1v+UlTi3H25xvRIzR6zOGPxWohrGEdBOTzvP6qEevvupX9/FiPQtytIArp9vv8++JO4FPqIYciT5+qEx1/d/y2ZygH+J9mq8Wtd/v4oFN0phsv97QaEACX2/lyvfi8uNXDkKfH+8XtYu7uAzAgp+W9d7dYrb2nR9bT9PSAw93Xo5/5B+WMPgkJpue6kbYvhtiLpe68H5ffmdWupwcdVk/3s+/r+Z9rBr3RwuQ6JzjgWkpy3YNRAnrIYTUTVNuO2kbnFZo+werieMAIBEA8ik0cbbnJdBLDbO/p+ZNuWjnkWkpyuUnfktN8XqKf1Qh9tfjC4modTOQ2iSclQJ3fcu+0UYLUJ2MY5q4nXPXFMJtf5dtiC5tV6voAmwej5PX0oAO3QjZKispMGLo2nn9nJQlZF+d3i6fZcv2d1Qm1xRD7z/X84W5+Z4aW3vNq9oXhMEAAPuyozgEd1bn/80oEh0Zyi9XqWWslo4whAvB5mK9Xt7Onubd6+n126+zRlVv4CxF+AdEf1ws99p5/dieflAD1cf11vmQVmUYJUJ9+v105xqM8y1Aeq1k5S3Euo0FplAj1NxbxN4zGfvTfiCe/EXZlAGOEEzOxb2x9WnmRWfn7o2wmzYIBz6jLGOfET78hZ6QjNx0HGNSP/0zUU7DvG7nTU5foPc2Xi8c7BrxHgFzMQsd3XpFqpCj3v59n9wL2SQ7xl49/fi9XbKrMLgcSK85rRJSEulY3xzSqxBCbN2xFx6yCASs5WuUPValxqmBeQ85qpB2BtQ+QNf+2lp+9cEGtWixFK0dLy8rRUrxytByxcrSUrhwt7StHS8nK0ZJeOWr/zE6kNsDmwUyilh528J5WK0/PEmffVhyDlhzj89rFJbW+tpStry1t62tL0fra0rK+tvpTz6icqaUKozHeLNU6gPi80tOncmbmDD1LAa45BMqZaEQIy5vdf3lcsoiVlOSuBOAVSl6vl4tPz+s5E36So/znP5nk5z8xZjm0YoNPapSuB21Mslai1OU9E7q8J5i8uVtHTdE5bVlbTLEZ7VhLi5H5w/au3MpfCQ3QGslaYWqUFNWbP6yX3/nsSo85MLvVlhYju54l3BYSTEHdOakpOrvu1GKKza07lRYn//H4O2PTZluMsTkvxU5CjPnHjNmmaiHGZOcakWPc3BrmlPKrkHeH0PFzvY6yRw233pfPdRQR1/Mde1qCvIn2SXEwHy7twjg8sF16HMIx2MRsF60lyKWz+XqczW8IVhf1VyZ00QSri07OKmGFXg2HcNxnaXH09G+RemHbtSFWL+foTTDC6lPGuywyx5i1BIdwlJQ+utyZ7yxM+CIJvgRYPI7lUoDIpULAPrpk5EcvC7dpEJoPrGM/MyHdFMcQY8HOKjoc49DbHo4cr7PaRvd+ets0zYIo8fNQZtVBkb7S2gtgRvjtJTULJo1w5bYbA8gILzXZE6pRT1iGoJI8XQWgPZTn5/pCk835u8SrA7J5pok4JVsU0q1siXRKlCGWdP1hxRcehyTv45hGSV4GZBU4nyEjvIR14wwZ4WVKtL8z17RaKSV2h7Ej70ePdCYo2CBveAe8QX9bOGQKB+TWcfj5gqrD5BtU+qGDtAu093smOFORh97bw+yzM72lHZKr4TJjutUIMWb4V+HHPGopxbhJuOdRtRBl6kbWxLn3Dr76waS3EZhPFQmHZ1BpUXKxYWKLDcZkT8asczAz+GmXeN0+MGsnTgJcy2FJEr45m5yEQ+bxR/jOahEbIcAsG+M91Ct4m3dGj2MFYvdQBrtj5Utfb3dgzfVAyAgv3pwPwQz9THC3tGwTyiaBl4QgZOhV3wqjCT8rUWrZEnMHkxADdZKEqEcpqFs1rhWadSEjvYSJCcNwb+V+FsxAjdK7YW+ZJl0I6sUPQIkwAKdqLDxNESFYA+dqYefvq+tfPf/151UTMO83R1eUQzmyoreCBMrFfdTWFVNsMzmVP0WbYnMzgeDkbicK5VZ1Oe6NO4QY5VMPESawq0l21yDV3ajYsaJQbqfqcM23ahBjfH6T+5A1V14KsRIYXF1fX/6TO93vqxE6c+jcV/foJkbT/sVXL94vG8eVoa4U5eqmlYnVSpRaxpVickstSlZKhR+Z5FILkbVhzkzhRopyWSl8UqJUZgqftSiZmcJnLUA2K3C8BG6UGJWTvCchxuQl7lmKcXlJe5b2uNGVL43QBiMgH0EMMkCPOXDiafXFGJsR+aqnxciMiBo97YC8FcXEA/SYAy/Ft3SKB/JyGYwpl4EwlQJrKgWSyIFDOcpnRA7sizE2u9YG1lobyCMHYhCLlyQ3qMiBzUW8yIFDOcpn1bvAWu9YkQM7SozKaj8Dsv0MhJEDQQLmwoscOJRb+ZIHoSMHNpexIweCBNxlLTFYU2xe5MChHOWzGyKq9XGOHNhRYlRJ5EAMgnoxIgf2xTibFTkQ0GMO/MiBMALyEUcORCmkm3vkQEAPOMgi+4EEwEUa2Q9hQE6CyH6AHnBgRfZrCwmm8174vhhiCyL7AXrQgRfZr6eFyZyYO10pyXX/9gfQQw7s77MHahudV2gs32cPr3H8pAICIB6s77P7YpjN+USqKyW53KTHvzzuXcBLdPTL49Pvrp8GtXQwkdskIpH9zG+8yH4dJUhlRvbri2E2v8oTkf36P7NKnSWy3+ASRsmjI/tVV3ArJBbZr/MbM2Ho2siO7NcXQ2xuZL++GGLLIvvBCMCHHdmvL7awVyI4NJITRvaDEYCPILLfUG7hL0T4BURnRfbrKAEqL7JfRwlQGZH9zjKUx2pW0Mh+rR8ZDQoW2e/0228s4m8Yjf3ovxFP3gqWt0h2KdsD4Ix0ZCb8EGP3m+Lpxj3ZBE817omSKJjkqWrOSMcJnq7CYH6C6IwIY5wTPy2t0RmxK7lpaYvOeL6Q/0zUU7DvG7lTSXRGkAC58KIzdqUolxWdcSiH+JNEZyRJqCsjOmNfDLF5Uw903iGYdJAzDv50g5prCOam5MxU2tVZezlZB2fr29iLT9TK01K0+re0rP4txat/yxGrf0vp6t/Svvq3lKz+LenVP1F0Rghg82AmER6dsb6CG51xKMf4vHZxSa2RLmVrpEvbGulStEa6tKyRukdnbFQYjfH2Do7OaH5hRmfsSgGuc3TGkwhhMaIzdqUkdyUAr1AyKzrjUI7yHYMotoUYkxWdcaBG6a7RGTtKlLq8Z0KX9wSTN3ejojN2fue0ZUR0xs7PjHYMj87Y/MoftpPRGYcXrIQGaI1krRJi0Rk7vzGiMwJ6zIHZreLRGZtfXaMztoUEU1B3kOiMnd/ZdQeOztj5mVt3wOiMrV/dozP2xRib82ITic7Y/OQanbEtxJjsXCNyjJtbYE5l4bkZzDfuL3V7esLBFBaJQ60nHCR0iJyad7LMCVZHOyAr4e5xZd09PrjC42zPRSiYG2/ftaL3XSvxPmY1Yh9zLtiHnZP7sF+F31G8Wr+jeJW8RX6l3yK/it4iv5JvkX98SrMo2WudnlGu/sry9ZtbawkBRnjch4nYRjP6To/HMDHXhL5Kk1VuJHd+7rtZIRDS6w8/LhxjvUCAER7OKQczek5x+BrG5YfgSRq4fd7dlYJc/W82uNH2yS9eEMahYwSvRgXQUj/Wz5HtnYEn4ZC5y0Ln+zOaISlKlGvoxUY1pLnGVaokAKc4eFEeOm6cawuHzCzUVS58dU63kw4nej8cxxA97ZCs8sx8eu0KrWU93iH4xdvE6faHF+jmxkSdCN3iEEGAgcd1fYmvDnwfGNLzSquzclmjt562Rz7+2KrLK1OAMj+P0kR5/nYbHnPfNTQFBYI9TSSDvWMT3JXC3OMm9MJkm70fGWEyEQbg9Ju3KZKAkUonIcg8+pkKvZfQdy1JQznAvykfLAjLB3PGd9R9eqqL17u39bcvYdXRBK6jBRhB+rj2CQM1RVdhzodrsYXtHfzjUQ+IRB4nCOxVtifcRGrEBNu18+tpYbIZoZTBQZn0tp5w4KZLIybYBz/fvrDhpbpHN1HxvF2a/fCKRPm7ULchu11oBtS6nTJtrFukJDuu788++yIjzr4wv+l/+yYiCKdVAvSEw7F6A+3l+umVfvgD22tAIlzV/1/auWUpCgNh+H12Mm+jjivpBeRgjMKRJhkSbNrVTypchKSiXcUzfN+vAjEXTqq6Nv73/mKHTYKXGQ+1wf9QiJu3T9GKTK0Psfuz/yuuhStVewzbtVH1iCKbAxubbciY8Ky/8Zd+36rzlpCVI5vkT9jDmVuSVo5skpWFcxsvzsqRT/rXbgoZ8chvfX+XPX8Xwzk3e/4ONcQpZbHbNnxBDWkK7IW2NQdzpElHeP19YxLmiJP8MaUMfSf+JYg5ybMjM5WzCeNanhFIxNoZsq4zqQc63lQRMIiJ2sEamdTEmLGZKcRmhdWtU+SvOYOpk9pVHRDUI5qurhmywCFG4j7mA5J6jCbfXx5BPaw7Y+LyRqF6rtSjiLcjTkeNTGqijiQHBPWEgc2layRDOLOIuawu9M8IEOLS9GcVmNR0hyl2qipAqYu8H/TIRCYHd0uYnCBWTFiCkfM+9QmYq2oIjySwV9Vi+I37Y5P8442d+pAjfJxwEAUMWCra/8ETQ3y1I7tql3pOUjeWagpQ6pJG12RXgBBXW8Pe3mdq0Zc1inup/1dPDPe1YbGOoxxI1Hpm+JD7xPfnfEfWH6PqZjB1qt6JW0cVDlRq83+OtlTWcT7kkk3N1dlQhR5BPM1Fk0WewUxldYLtXptv+kdbsKkZ2onOFlfy0zKDqbMpPqGgSWNdW1SNIz/aMY8kWFEVR1FXltyaLVDMK6m9+ZlKbVpaA0tN/mYjX7UlmzE3WpZK3ljmkU3NRlZUoUcQz3x/CKPaSpObpUSAZIwrDvw7LTVkU8bVDG7EhKd+y2kmLN5OWF5vweZ6C7ZvFPlxCFDsMoWyQp7ktHRJk8Y0bnftYT8vjYbpGMuJQTRoHmdVYEWiVv7v8+q3gSHWmEp+PwI1ZFOmH46fsjBEKf2WIgj96xoI42Hf3FBLe6zIrBXqIIXKXqxyQy882USzMzsosGP2zKin4H3GYWvGIZ9xgBPCujL3wiwV2ZyhMhCUAGCmPAU/yKAXV8tafpJmP+H1NQOFqonFp9/r8vnEEogrMmt1ml5yL6FxO29hsX9d/2Q8bCWscnWSddFnOHbDK/Xn6gpjmbAYW9RX3VaupI1U85oXeXffLbt8099jyjiwJNNCHaGwcGutYOzel7VgaXCGdH1ojiwjZ83nEuAzQGPkel7Ck0cSYJIl/Dn4M0pFT4h4PMEfCKVE6U9hyuMJtdY368doNyXOfsAGA0JOEKLB84YRJ7VhXLO/f/0H471n2grTBAA= EOF -======= - # The symbol prefixing mechanism is performed by redefining BoringSSL symbols with "#define - # SOME_BORINGSSL_SYMBOL GRPC_SHADOW_SOME_BORINGSSL_SYMBOL". Unfortunately, some symbols are - # already redefined as macros in BoringSSL headers in the form "#define SOME_BORINGSSL_SYMBOL - # SOME_BORINGSSL_SYMBOL" Such type of redefinition will cause "SOME_BORINGSSL_SYMBOL redefined" - # error when using together with our prefix header. So the workaround in the below lines removes - # all such type of #define directives. - sed -i'.back' '/^#define \\([A-Za-z0-9_]*\\) \\1/d' src/include/openssl/*.h - # Remove lines of the format below for the same reason above - # #define SOME_BORINGSSL_SYMBOL \ - # SOME_BORINGSSL_SYMBOL - sed -i'.back' '/^#define.*\\\\$/{N;/^#define \\([A-Za-z0-9_]*\\) *\\\\\\n *\\1/d;}' src/include/openssl/*.h ->>>>>>> upstream/master # We are renaming openssl to openssl_grpc so that there is no conflict with openssl if it exists find . -type f \\( -path '*.h' -or -path '*.cc' -or -path '*.c' \\) -print0 | xargs -0 -L1 sed -E -i'.grpc_back' 's;#include ;#include ;g' END_OF_COMMAND -======= - # Redefine symbols to avoid conflict when the same app also depends on OpenSSL. The list of - # symbols are src/objective-c/grpc_shadow_boringssl_symbol_list. - # This is the last part of this file. - s.prefix_header_contents = - '#define a2i_GENERAL_NAME GRPC_SHADOW_a2i_GENERAL_NAME', - '#define a2i_ipadd GRPC_SHADOW_a2i_ipadd', - '#define a2i_IPADDRESS GRPC_SHADOW_a2i_IPADDRESS', - '#define a2i_IPADDRESS_NC GRPC_SHADOW_a2i_IPADDRESS_NC', - '#define abi_test_bad_unwind_temporary GRPC_SHADOW_abi_test_bad_unwind_temporary', - '#define abi_test_bad_unwind_wrong_register GRPC_SHADOW_abi_test_bad_unwind_wrong_register', - '#define abi_test_clobber_r10 GRPC_SHADOW_abi_test_clobber_r10', - '#define abi_test_clobber_r11 GRPC_SHADOW_abi_test_clobber_r11', - '#define abi_test_clobber_r12 GRPC_SHADOW_abi_test_clobber_r12', - '#define abi_test_clobber_r13 GRPC_SHADOW_abi_test_clobber_r13', - '#define abi_test_clobber_r14 GRPC_SHADOW_abi_test_clobber_r14', - '#define abi_test_clobber_r15 GRPC_SHADOW_abi_test_clobber_r15', - '#define abi_test_clobber_r8 GRPC_SHADOW_abi_test_clobber_r8', - '#define abi_test_clobber_r9 GRPC_SHADOW_abi_test_clobber_r9', - '#define abi_test_clobber_rax GRPC_SHADOW_abi_test_clobber_rax', - '#define abi_test_clobber_rbp GRPC_SHADOW_abi_test_clobber_rbp', - '#define abi_test_clobber_rbx GRPC_SHADOW_abi_test_clobber_rbx', - '#define abi_test_clobber_rcx GRPC_SHADOW_abi_test_clobber_rcx', - '#define abi_test_clobber_rdi GRPC_SHADOW_abi_test_clobber_rdi', - '#define abi_test_clobber_rdx GRPC_SHADOW_abi_test_clobber_rdx', - '#define abi_test_clobber_rsi GRPC_SHADOW_abi_test_clobber_rsi', - '#define abi_test_clobber_xmm0 GRPC_SHADOW_abi_test_clobber_xmm0', - '#define abi_test_clobber_xmm1 GRPC_SHADOW_abi_test_clobber_xmm1', - '#define abi_test_clobber_xmm10 GRPC_SHADOW_abi_test_clobber_xmm10', - '#define abi_test_clobber_xmm11 GRPC_SHADOW_abi_test_clobber_xmm11', - '#define abi_test_clobber_xmm12 GRPC_SHADOW_abi_test_clobber_xmm12', - '#define abi_test_clobber_xmm13 GRPC_SHADOW_abi_test_clobber_xmm13', - '#define abi_test_clobber_xmm14 GRPC_SHADOW_abi_test_clobber_xmm14', - '#define abi_test_clobber_xmm15 GRPC_SHADOW_abi_test_clobber_xmm15', - '#define abi_test_clobber_xmm2 GRPC_SHADOW_abi_test_clobber_xmm2', - '#define abi_test_clobber_xmm3 GRPC_SHADOW_abi_test_clobber_xmm3', - '#define abi_test_clobber_xmm4 GRPC_SHADOW_abi_test_clobber_xmm4', - '#define abi_test_clobber_xmm5 GRPC_SHADOW_abi_test_clobber_xmm5', - '#define abi_test_clobber_xmm6 GRPC_SHADOW_abi_test_clobber_xmm6', - '#define abi_test_clobber_xmm7 GRPC_SHADOW_abi_test_clobber_xmm7', - '#define abi_test_clobber_xmm8 GRPC_SHADOW_abi_test_clobber_xmm8', - '#define abi_test_clobber_xmm9 GRPC_SHADOW_abi_test_clobber_xmm9', - '#define abi_test_get_and_clear_direction_flag GRPC_SHADOW_abi_test_get_and_clear_direction_flag', - '#define abi_test_set_direction_flag GRPC_SHADOW_abi_test_set_direction_flag', - '#define abi_test_trampoline GRPC_SHADOW_abi_test_trampoline', - '#define abi_test_unwind_return GRPC_SHADOW_abi_test_unwind_return', - '#define abi_test_unwind_start GRPC_SHADOW_abi_test_unwind_start', - '#define abi_test_unwind_stop GRPC_SHADOW_abi_test_unwind_stop', - '#define ACCESS_DESCRIPTION_free GRPC_SHADOW_ACCESS_DESCRIPTION_free', - '#define ACCESS_DESCRIPTION_it GRPC_SHADOW_ACCESS_DESCRIPTION_it', - '#define ACCESS_DESCRIPTION_new GRPC_SHADOW_ACCESS_DESCRIPTION_new', - '#define aes128gcmsiv_aes_ks GRPC_SHADOW_aes128gcmsiv_aes_ks', - '#define aes128gcmsiv_aes_ks_enc_x1 GRPC_SHADOW_aes128gcmsiv_aes_ks_enc_x1', - '#define aes128gcmsiv_dec GRPC_SHADOW_aes128gcmsiv_dec', - '#define aes128gcmsiv_ecb_enc_block GRPC_SHADOW_aes128gcmsiv_ecb_enc_block', - '#define aes128gcmsiv_enc_msg_x4 GRPC_SHADOW_aes128gcmsiv_enc_msg_x4', - '#define aes128gcmsiv_enc_msg_x8 GRPC_SHADOW_aes128gcmsiv_enc_msg_x8', - '#define aes128gcmsiv_kdf GRPC_SHADOW_aes128gcmsiv_kdf', - '#define aes256gcmsiv_aes_ks GRPC_SHADOW_aes256gcmsiv_aes_ks', - '#define aes256gcmsiv_aes_ks_enc_x1 GRPC_SHADOW_aes256gcmsiv_aes_ks_enc_x1', - '#define aes256gcmsiv_dec GRPC_SHADOW_aes256gcmsiv_dec', - '#define aes256gcmsiv_ecb_enc_block GRPC_SHADOW_aes256gcmsiv_ecb_enc_block', - '#define aes256gcmsiv_enc_msg_x4 GRPC_SHADOW_aes256gcmsiv_enc_msg_x4', - '#define aes256gcmsiv_enc_msg_x8 GRPC_SHADOW_aes256gcmsiv_enc_msg_x8', - '#define aes256gcmsiv_kdf GRPC_SHADOW_aes256gcmsiv_kdf', - '#define AES_cbc_encrypt GRPC_SHADOW_AES_cbc_encrypt', - '#define AES_cfb128_encrypt GRPC_SHADOW_AES_cfb128_encrypt', - '#define AES_CMAC GRPC_SHADOW_AES_CMAC', - '#define AES_ctr128_encrypt GRPC_SHADOW_AES_ctr128_encrypt', - '#define aes_ctr_set_key GRPC_SHADOW_aes_ctr_set_key', - '#define AES_decrypt GRPC_SHADOW_AES_decrypt', - '#define AES_ecb_encrypt GRPC_SHADOW_AES_ecb_encrypt', - '#define AES_encrypt GRPC_SHADOW_AES_encrypt', - '#define aesgcmsiv_htable6_init GRPC_SHADOW_aesgcmsiv_htable6_init', - '#define aesgcmsiv_htable_init GRPC_SHADOW_aesgcmsiv_htable_init', - '#define aesgcmsiv_htable_polyval GRPC_SHADOW_aesgcmsiv_htable_polyval', - '#define aesgcmsiv_polyval_horner GRPC_SHADOW_aesgcmsiv_polyval_horner', - '#define aes_hw_cbc_encrypt GRPC_SHADOW_aes_hw_cbc_encrypt', - '#define aes_hw_ctr32_encrypt_blocks GRPC_SHADOW_aes_hw_ctr32_encrypt_blocks', - '#define aes_hw_decrypt GRPC_SHADOW_aes_hw_decrypt', - '#define aes_hw_ecb_encrypt GRPC_SHADOW_aes_hw_ecb_encrypt', - '#define aes_hw_encrypt GRPC_SHADOW_aes_hw_encrypt', - '#define aes_hw_set_decrypt_key GRPC_SHADOW_aes_hw_set_decrypt_key', - '#define aes_hw_set_encrypt_key GRPC_SHADOW_aes_hw_set_encrypt_key', - '#define aesni_gcm_decrypt GRPC_SHADOW_aesni_gcm_decrypt', - '#define aesni_gcm_encrypt GRPC_SHADOW_aesni_gcm_encrypt', - '#define aes_nohw_cbc_encrypt GRPC_SHADOW_aes_nohw_cbc_encrypt', - '#define aes_nohw_ctr32_encrypt_blocks GRPC_SHADOW_aes_nohw_ctr32_encrypt_blocks', - '#define aes_nohw_decrypt GRPC_SHADOW_aes_nohw_decrypt', - '#define aes_nohw_encrypt GRPC_SHADOW_aes_nohw_encrypt', - '#define aes_nohw_set_decrypt_key GRPC_SHADOW_aes_nohw_set_decrypt_key', - '#define aes_nohw_set_encrypt_key GRPC_SHADOW_aes_nohw_set_encrypt_key', - '#define AES_ofb128_encrypt GRPC_SHADOW_AES_ofb128_encrypt', - '#define AES_set_decrypt_key GRPC_SHADOW_AES_set_decrypt_key', - '#define AES_set_encrypt_key GRPC_SHADOW_AES_set_encrypt_key', - '#define AES_unwrap_key GRPC_SHADOW_AES_unwrap_key', - '#define AES_unwrap_key_padded GRPC_SHADOW_AES_unwrap_key_padded', - '#define AES_wrap_key GRPC_SHADOW_AES_wrap_key', - '#define AES_wrap_key_padded GRPC_SHADOW_AES_wrap_key_padded', - '#define ASN1_ANY_it GRPC_SHADOW_ASN1_ANY_it', - '#define ASN1_BIT_STRING_check GRPC_SHADOW_ASN1_BIT_STRING_check', - '#define ASN1_BIT_STRING_free GRPC_SHADOW_ASN1_BIT_STRING_free', - '#define ASN1_BIT_STRING_get_bit GRPC_SHADOW_ASN1_BIT_STRING_get_bit', - '#define ASN1_BIT_STRING_it GRPC_SHADOW_ASN1_BIT_STRING_it', - '#define ASN1_BIT_STRING_new GRPC_SHADOW_ASN1_BIT_STRING_new', - '#define ASN1_BIT_STRING_set GRPC_SHADOW_ASN1_BIT_STRING_set', - '#define ASN1_BIT_STRING_set_bit GRPC_SHADOW_ASN1_BIT_STRING_set_bit', - '#define ASN1_BMPSTRING_free GRPC_SHADOW_ASN1_BMPSTRING_free', - '#define ASN1_BMPSTRING_it GRPC_SHADOW_ASN1_BMPSTRING_it', - '#define ASN1_BMPSTRING_new GRPC_SHADOW_ASN1_BMPSTRING_new', - '#define ASN1_BOOLEAN_it GRPC_SHADOW_ASN1_BOOLEAN_it', - '#define ASN1_digest GRPC_SHADOW_ASN1_digest', - '#define asn1_do_adb GRPC_SHADOW_asn1_do_adb', - '#define asn1_enc_free GRPC_SHADOW_asn1_enc_free', - '#define asn1_enc_init GRPC_SHADOW_asn1_enc_init', - '#define asn1_enc_restore GRPC_SHADOW_asn1_enc_restore', - '#define asn1_enc_save GRPC_SHADOW_asn1_enc_save', - '#define ASN1_ENUMERATED_free GRPC_SHADOW_ASN1_ENUMERATED_free', - '#define ASN1_ENUMERATED_get GRPC_SHADOW_ASN1_ENUMERATED_get', - '#define ASN1_ENUMERATED_it GRPC_SHADOW_ASN1_ENUMERATED_it', - '#define ASN1_ENUMERATED_new GRPC_SHADOW_ASN1_ENUMERATED_new', - '#define ASN1_ENUMERATED_set GRPC_SHADOW_ASN1_ENUMERATED_set', - '#define ASN1_ENUMERATED_to_BN GRPC_SHADOW_ASN1_ENUMERATED_to_BN', - '#define asn1_ex_c2i GRPC_SHADOW_asn1_ex_c2i', - '#define asn1_ex_i2c GRPC_SHADOW_asn1_ex_i2c', - '#define ASN1_FBOOLEAN_it GRPC_SHADOW_ASN1_FBOOLEAN_it', - '#define ASN1_GENERALIZEDTIME_adj GRPC_SHADOW_ASN1_GENERALIZEDTIME_adj', - '#define ASN1_GENERALIZEDTIME_check GRPC_SHADOW_ASN1_GENERALIZEDTIME_check', - '#define ASN1_GENERALIZEDTIME_free GRPC_SHADOW_ASN1_GENERALIZEDTIME_free', - '#define ASN1_GENERALIZEDTIME_it GRPC_SHADOW_ASN1_GENERALIZEDTIME_it', - '#define ASN1_GENERALIZEDTIME_new GRPC_SHADOW_ASN1_GENERALIZEDTIME_new', - '#define ASN1_GENERALIZEDTIME_print GRPC_SHADOW_ASN1_GENERALIZEDTIME_print', - '#define ASN1_GENERALIZEDTIME_set GRPC_SHADOW_ASN1_GENERALIZEDTIME_set', - '#define ASN1_GENERALIZEDTIME_set_string GRPC_SHADOW_ASN1_GENERALIZEDTIME_set_string', - '#define asn1_generalizedtime_to_tm GRPC_SHADOW_asn1_generalizedtime_to_tm', - '#define ASN1_GENERALSTRING_free GRPC_SHADOW_ASN1_GENERALSTRING_free', - '#define ASN1_GENERALSTRING_it GRPC_SHADOW_ASN1_GENERALSTRING_it', - '#define ASN1_GENERALSTRING_new GRPC_SHADOW_ASN1_GENERALSTRING_new', - '#define ASN1_generate_nconf GRPC_SHADOW_ASN1_generate_nconf', - '#define ASN1_generate_v3 GRPC_SHADOW_ASN1_generate_v3', - '#define asn1_get_choice_selector GRPC_SHADOW_asn1_get_choice_selector', - '#define asn1_get_field_ptr GRPC_SHADOW_asn1_get_field_ptr', - '#define ASN1_get_object GRPC_SHADOW_ASN1_get_object', - '#define ASN1_IA5STRING_free GRPC_SHADOW_ASN1_IA5STRING_free', - '#define ASN1_IA5STRING_it GRPC_SHADOW_ASN1_IA5STRING_it', - '#define ASN1_IA5STRING_new GRPC_SHADOW_ASN1_IA5STRING_new', - '#define ASN1_INTEGER_cmp GRPC_SHADOW_ASN1_INTEGER_cmp', - '#define ASN1_INTEGER_dup GRPC_SHADOW_ASN1_INTEGER_dup', - '#define ASN1_INTEGER_free GRPC_SHADOW_ASN1_INTEGER_free', - '#define ASN1_INTEGER_get GRPC_SHADOW_ASN1_INTEGER_get', - '#define ASN1_INTEGER_it GRPC_SHADOW_ASN1_INTEGER_it', - '#define ASN1_INTEGER_new GRPC_SHADOW_ASN1_INTEGER_new', - '#define ASN1_INTEGER_set GRPC_SHADOW_ASN1_INTEGER_set', - '#define ASN1_INTEGER_set_uint64 GRPC_SHADOW_ASN1_INTEGER_set_uint64', - '#define ASN1_INTEGER_to_BN GRPC_SHADOW_ASN1_INTEGER_to_BN', - '#define asn1_item_combine_free GRPC_SHADOW_asn1_item_combine_free', - '#define ASN1_item_d2i GRPC_SHADOW_ASN1_item_d2i', - '#define ASN1_item_d2i_bio GRPC_SHADOW_ASN1_item_d2i_bio', - '#define ASN1_item_d2i_fp GRPC_SHADOW_ASN1_item_d2i_fp', - '#define ASN1_item_digest GRPC_SHADOW_ASN1_item_digest', - '#define ASN1_item_dup GRPC_SHADOW_ASN1_item_dup', - '#define ASN1_item_ex_d2i GRPC_SHADOW_ASN1_item_ex_d2i', - '#define ASN1_item_ex_free GRPC_SHADOW_ASN1_item_ex_free', - '#define ASN1_item_ex_i2d GRPC_SHADOW_ASN1_item_ex_i2d', - '#define ASN1_item_ex_new GRPC_SHADOW_ASN1_item_ex_new', - '#define ASN1_item_free GRPC_SHADOW_ASN1_item_free', - '#define ASN1_item_i2d GRPC_SHADOW_ASN1_item_i2d', - '#define ASN1_item_i2d_bio GRPC_SHADOW_ASN1_item_i2d_bio', - '#define ASN1_item_i2d_fp GRPC_SHADOW_ASN1_item_i2d_fp', - '#define ASN1_item_ndef_i2d GRPC_SHADOW_ASN1_item_ndef_i2d', - '#define ASN1_item_new GRPC_SHADOW_ASN1_item_new', - '#define ASN1_item_pack GRPC_SHADOW_ASN1_item_pack', - '#define ASN1_item_sign GRPC_SHADOW_ASN1_item_sign', - '#define ASN1_item_sign_ctx GRPC_SHADOW_ASN1_item_sign_ctx', - '#define ASN1_item_unpack GRPC_SHADOW_ASN1_item_unpack', - '#define ASN1_item_verify GRPC_SHADOW_ASN1_item_verify', - '#define ASN1_mbstring_copy GRPC_SHADOW_ASN1_mbstring_copy', - '#define ASN1_mbstring_ncopy GRPC_SHADOW_ASN1_mbstring_ncopy', - '#define ASN1_NULL_free GRPC_SHADOW_ASN1_NULL_free', - '#define ASN1_NULL_it GRPC_SHADOW_ASN1_NULL_it', - '#define ASN1_NULL_new GRPC_SHADOW_ASN1_NULL_new', - '#define ASN1_OBJECT_create GRPC_SHADOW_ASN1_OBJECT_create', - '#define ASN1_OBJECT_free GRPC_SHADOW_ASN1_OBJECT_free', - '#define ASN1_OBJECT_it GRPC_SHADOW_ASN1_OBJECT_it', - '#define ASN1_OBJECT_new GRPC_SHADOW_ASN1_OBJECT_new', - '#define ASN1_object_size GRPC_SHADOW_ASN1_object_size', - '#define ASN1_OCTET_STRING_cmp GRPC_SHADOW_ASN1_OCTET_STRING_cmp', - '#define ASN1_OCTET_STRING_dup GRPC_SHADOW_ASN1_OCTET_STRING_dup', - '#define ASN1_OCTET_STRING_free GRPC_SHADOW_ASN1_OCTET_STRING_free', - '#define ASN1_OCTET_STRING_it GRPC_SHADOW_ASN1_OCTET_STRING_it', - '#define ASN1_OCTET_STRING_NDEF_it GRPC_SHADOW_ASN1_OCTET_STRING_NDEF_it', - '#define ASN1_OCTET_STRING_new GRPC_SHADOW_ASN1_OCTET_STRING_new', - '#define ASN1_OCTET_STRING_set GRPC_SHADOW_ASN1_OCTET_STRING_set', - '#define ASN1_primitive_free GRPC_SHADOW_ASN1_primitive_free', - '#define ASN1_primitive_new GRPC_SHADOW_ASN1_primitive_new', - '#define ASN1_PRINTABLE_free GRPC_SHADOW_ASN1_PRINTABLE_free', - '#define ASN1_PRINTABLE_it GRPC_SHADOW_ASN1_PRINTABLE_it', - '#define ASN1_PRINTABLE_new GRPC_SHADOW_ASN1_PRINTABLE_new', - '#define ASN1_PRINTABLESTRING_free GRPC_SHADOW_ASN1_PRINTABLESTRING_free', - '#define ASN1_PRINTABLESTRING_it GRPC_SHADOW_ASN1_PRINTABLESTRING_it', - '#define ASN1_PRINTABLESTRING_new GRPC_SHADOW_ASN1_PRINTABLESTRING_new', - '#define ASN1_PRINTABLE_type GRPC_SHADOW_ASN1_PRINTABLE_type', - '#define ASN1_put_eoc GRPC_SHADOW_ASN1_put_eoc', - '#define ASN1_put_object GRPC_SHADOW_ASN1_put_object', - '#define asn1_refcount_dec_and_test_zero GRPC_SHADOW_asn1_refcount_dec_and_test_zero', - '#define asn1_refcount_set_one GRPC_SHADOW_asn1_refcount_set_one', - '#define ASN1_SEQUENCE_ANY_it GRPC_SHADOW_ASN1_SEQUENCE_ANY_it', - '#define ASN1_SEQUENCE_it GRPC_SHADOW_ASN1_SEQUENCE_it', - '#define ASN1_SET_ANY_it GRPC_SHADOW_ASN1_SET_ANY_it', - '#define asn1_set_choice_selector GRPC_SHADOW_asn1_set_choice_selector', - '#define ASN1_STRING_cmp GRPC_SHADOW_ASN1_STRING_cmp', - '#define ASN1_STRING_copy GRPC_SHADOW_ASN1_STRING_copy', - '#define ASN1_STRING_data GRPC_SHADOW_ASN1_STRING_data', - '#define ASN1_STRING_dup GRPC_SHADOW_ASN1_STRING_dup', - '#define ASN1_STRING_free GRPC_SHADOW_ASN1_STRING_free', - '#define ASN1_STRING_get0_data GRPC_SHADOW_ASN1_STRING_get0_data', - '#define ASN1_STRING_get_default_mask GRPC_SHADOW_ASN1_STRING_get_default_mask', - '#define ASN1_STRING_length GRPC_SHADOW_ASN1_STRING_length', - '#define ASN1_STRING_length_set GRPC_SHADOW_ASN1_STRING_length_set', - '#define ASN1_STRING_new GRPC_SHADOW_ASN1_STRING_new', - '#define ASN1_STRING_print GRPC_SHADOW_ASN1_STRING_print', - '#define ASN1_STRING_print_ex GRPC_SHADOW_ASN1_STRING_print_ex', - '#define ASN1_STRING_print_ex_fp GRPC_SHADOW_ASN1_STRING_print_ex_fp', - '#define ASN1_STRING_set GRPC_SHADOW_ASN1_STRING_set', - '#define ASN1_STRING_set0 GRPC_SHADOW_ASN1_STRING_set0', - '#define ASN1_STRING_set_by_NID GRPC_SHADOW_ASN1_STRING_set_by_NID', - '#define ASN1_STRING_set_default_mask GRPC_SHADOW_ASN1_STRING_set_default_mask', - '#define ASN1_STRING_set_default_mask_asc GRPC_SHADOW_ASN1_STRING_set_default_mask_asc', - '#define ASN1_STRING_TABLE_add GRPC_SHADOW_ASN1_STRING_TABLE_add', - '#define ASN1_STRING_TABLE_cleanup GRPC_SHADOW_ASN1_STRING_TABLE_cleanup', - '#define ASN1_STRING_TABLE_get GRPC_SHADOW_ASN1_STRING_TABLE_get', - '#define ASN1_STRING_to_UTF8 GRPC_SHADOW_ASN1_STRING_to_UTF8', - '#define ASN1_STRING_type GRPC_SHADOW_ASN1_STRING_type', - '#define ASN1_STRING_type_new GRPC_SHADOW_ASN1_STRING_type_new', - '#define ASN1_T61STRING_free GRPC_SHADOW_ASN1_T61STRING_free', - '#define ASN1_T61STRING_it GRPC_SHADOW_ASN1_T61STRING_it', - '#define ASN1_T61STRING_new GRPC_SHADOW_ASN1_T61STRING_new', - '#define ASN1_tag2bit GRPC_SHADOW_ASN1_tag2bit', - '#define ASN1_tag2str GRPC_SHADOW_ASN1_tag2str', - '#define ASN1_TBOOLEAN_it GRPC_SHADOW_ASN1_TBOOLEAN_it', - '#define ASN1_template_free GRPC_SHADOW_ASN1_template_free', - '#define ASN1_template_new GRPC_SHADOW_ASN1_template_new', - '#define ASN1_TIME_adj GRPC_SHADOW_ASN1_TIME_adj', - '#define ASN1_TIME_check GRPC_SHADOW_ASN1_TIME_check', - '#define ASN1_TIME_diff GRPC_SHADOW_ASN1_TIME_diff', - '#define ASN1_TIME_free GRPC_SHADOW_ASN1_TIME_free', - '#define ASN1_TIME_it GRPC_SHADOW_ASN1_TIME_it', - '#define ASN1_TIME_new GRPC_SHADOW_ASN1_TIME_new', - '#define ASN1_TIME_print GRPC_SHADOW_ASN1_TIME_print', - '#define ASN1_TIME_set GRPC_SHADOW_ASN1_TIME_set', - '#define ASN1_TIME_set_string GRPC_SHADOW_ASN1_TIME_set_string', - '#define ASN1_TIME_to_generalizedtime GRPC_SHADOW_ASN1_TIME_to_generalizedtime', - '#define ASN1_TYPE_cmp GRPC_SHADOW_ASN1_TYPE_cmp', - '#define ASN1_TYPE_free GRPC_SHADOW_ASN1_TYPE_free', - '#define ASN1_TYPE_get GRPC_SHADOW_ASN1_TYPE_get', - '#define ASN1_TYPE_new GRPC_SHADOW_ASN1_TYPE_new', - '#define ASN1_TYPE_set GRPC_SHADOW_ASN1_TYPE_set', - '#define ASN1_TYPE_set1 GRPC_SHADOW_ASN1_TYPE_set1', - '#define ASN1_UNIVERSALSTRING_free GRPC_SHADOW_ASN1_UNIVERSALSTRING_free', - '#define ASN1_UNIVERSALSTRING_it GRPC_SHADOW_ASN1_UNIVERSALSTRING_it', - '#define ASN1_UNIVERSALSTRING_new GRPC_SHADOW_ASN1_UNIVERSALSTRING_new', - '#define ASN1_UTCTIME_adj GRPC_SHADOW_ASN1_UTCTIME_adj', - '#define ASN1_UTCTIME_check GRPC_SHADOW_ASN1_UTCTIME_check', - '#define ASN1_UTCTIME_cmp_time_t GRPC_SHADOW_ASN1_UTCTIME_cmp_time_t', - '#define ASN1_UTCTIME_free GRPC_SHADOW_ASN1_UTCTIME_free', - '#define ASN1_UTCTIME_it GRPC_SHADOW_ASN1_UTCTIME_it', - '#define ASN1_UTCTIME_new GRPC_SHADOW_ASN1_UTCTIME_new', - '#define ASN1_UTCTIME_print GRPC_SHADOW_ASN1_UTCTIME_print', - '#define ASN1_UTCTIME_set GRPC_SHADOW_ASN1_UTCTIME_set', - '#define ASN1_UTCTIME_set_string GRPC_SHADOW_ASN1_UTCTIME_set_string', - '#define asn1_utctime_to_tm GRPC_SHADOW_asn1_utctime_to_tm', - '#define ASN1_UTF8STRING_free GRPC_SHADOW_ASN1_UTF8STRING_free', - '#define ASN1_UTF8STRING_it GRPC_SHADOW_ASN1_UTF8STRING_it', - '#define ASN1_UTF8STRING_new GRPC_SHADOW_ASN1_UTF8STRING_new', - '#define ASN1_VISIBLESTRING_free GRPC_SHADOW_ASN1_VISIBLESTRING_free', - '#define ASN1_VISIBLESTRING_it GRPC_SHADOW_ASN1_VISIBLESTRING_it', - '#define ASN1_VISIBLESTRING_new GRPC_SHADOW_ASN1_VISIBLESTRING_new', - '#define AUTHORITY_INFO_ACCESS_free GRPC_SHADOW_AUTHORITY_INFO_ACCESS_free', - '#define AUTHORITY_INFO_ACCESS_it GRPC_SHADOW_AUTHORITY_INFO_ACCESS_it', - '#define AUTHORITY_INFO_ACCESS_new GRPC_SHADOW_AUTHORITY_INFO_ACCESS_new', - '#define AUTHORITY_KEYID_free GRPC_SHADOW_AUTHORITY_KEYID_free', - '#define AUTHORITY_KEYID_it GRPC_SHADOW_AUTHORITY_KEYID_it', - '#define AUTHORITY_KEYID_new GRPC_SHADOW_AUTHORITY_KEYID_new', - '#define BASIC_CONSTRAINTS_free GRPC_SHADOW_BASIC_CONSTRAINTS_free', - '#define BASIC_CONSTRAINTS_it GRPC_SHADOW_BASIC_CONSTRAINTS_it', - '#define BASIC_CONSTRAINTS_new GRPC_SHADOW_BASIC_CONSTRAINTS_new', - '#define beeu_mod_inverse_vartime GRPC_SHADOW_beeu_mod_inverse_vartime', - '#define BIO_append_filename GRPC_SHADOW_BIO_append_filename', - '#define BIO_callback_ctrl GRPC_SHADOW_BIO_callback_ctrl', - '#define BIO_clear_flags GRPC_SHADOW_BIO_clear_flags', - '#define BIO_clear_retry_flags GRPC_SHADOW_BIO_clear_retry_flags', - '#define bio_clear_socket_error GRPC_SHADOW_bio_clear_socket_error', - '#define BIO_copy_next_retry GRPC_SHADOW_BIO_copy_next_retry', - '#define BIO_ctrl GRPC_SHADOW_BIO_ctrl', - '#define BIO_ctrl_get_read_request GRPC_SHADOW_BIO_ctrl_get_read_request', - '#define BIO_ctrl_get_write_guarantee GRPC_SHADOW_BIO_ctrl_get_write_guarantee', - '#define BIO_ctrl_pending GRPC_SHADOW_BIO_ctrl_pending', - '#define BIO_do_connect GRPC_SHADOW_BIO_do_connect', - '#define BIO_eof GRPC_SHADOW_BIO_eof', - '#define bio_fd_should_retry GRPC_SHADOW_bio_fd_should_retry', - '#define BIO_find_type GRPC_SHADOW_BIO_find_type', - '#define BIO_flush GRPC_SHADOW_BIO_flush', - '#define BIO_free GRPC_SHADOW_BIO_free', - '#define BIO_free_all GRPC_SHADOW_BIO_free_all', - '#define BIO_f_ssl GRPC_SHADOW_BIO_f_ssl', - '#define BIO_get_data GRPC_SHADOW_BIO_get_data', - '#define BIO_get_fd GRPC_SHADOW_BIO_get_fd', - '#define BIO_get_fp GRPC_SHADOW_BIO_get_fp', - '#define BIO_get_init GRPC_SHADOW_BIO_get_init', - '#define BIO_get_mem_data GRPC_SHADOW_BIO_get_mem_data', - '#define BIO_get_mem_ptr GRPC_SHADOW_BIO_get_mem_ptr', - '#define BIO_get_new_index GRPC_SHADOW_BIO_get_new_index', - '#define BIO_get_retry_flags GRPC_SHADOW_BIO_get_retry_flags', - '#define BIO_get_retry_reason GRPC_SHADOW_BIO_get_retry_reason', - '#define BIO_gets GRPC_SHADOW_BIO_gets', - '#define BIO_get_shutdown GRPC_SHADOW_BIO_get_shutdown', - '#define BIO_hexdump GRPC_SHADOW_BIO_hexdump', - '#define BIO_indent GRPC_SHADOW_BIO_indent', - '#define BIO_int_ctrl GRPC_SHADOW_BIO_int_ctrl', - '#define bio_ip_and_port_to_socket_and_addr GRPC_SHADOW_bio_ip_and_port_to_socket_and_addr', - '#define BIO_mem_contents GRPC_SHADOW_BIO_mem_contents', - '#define BIO_meth_free GRPC_SHADOW_BIO_meth_free', - '#define BIO_meth_new GRPC_SHADOW_BIO_meth_new', - '#define BIO_method_type GRPC_SHADOW_BIO_method_type', - '#define BIO_meth_set_create GRPC_SHADOW_BIO_meth_set_create', - '#define BIO_meth_set_ctrl GRPC_SHADOW_BIO_meth_set_ctrl', - '#define BIO_meth_set_destroy GRPC_SHADOW_BIO_meth_set_destroy', - '#define BIO_meth_set_gets GRPC_SHADOW_BIO_meth_set_gets', - '#define BIO_meth_set_puts GRPC_SHADOW_BIO_meth_set_puts', - '#define BIO_meth_set_read GRPC_SHADOW_BIO_meth_set_read', - '#define BIO_meth_set_write GRPC_SHADOW_BIO_meth_set_write', - '#define BIO_new GRPC_SHADOW_BIO_new', - '#define BIO_new_bio_pair GRPC_SHADOW_BIO_new_bio_pair', - '#define BIO_new_connect GRPC_SHADOW_BIO_new_connect', - '#define BIO_new_fd GRPC_SHADOW_BIO_new_fd', - '#define BIO_new_file GRPC_SHADOW_BIO_new_file', - '#define BIO_new_fp GRPC_SHADOW_BIO_new_fp', - '#define BIO_new_mem_buf GRPC_SHADOW_BIO_new_mem_buf', - '#define BIO_new_socket GRPC_SHADOW_BIO_new_socket', - '#define BIO_next GRPC_SHADOW_BIO_next', - '#define BIO_number_read GRPC_SHADOW_BIO_number_read', - '#define BIO_number_written GRPC_SHADOW_BIO_number_written', - '#define BIO_pending GRPC_SHADOW_BIO_pending', - '#define BIO_pop GRPC_SHADOW_BIO_pop', - '#define BIO_printf GRPC_SHADOW_BIO_printf', - '#define BIO_ptr_ctrl GRPC_SHADOW_BIO_ptr_ctrl', - '#define BIO_push GRPC_SHADOW_BIO_push', - '#define BIO_puts GRPC_SHADOW_BIO_puts', - '#define BIO_read GRPC_SHADOW_BIO_read', - '#define BIO_read_asn1 GRPC_SHADOW_BIO_read_asn1', - '#define BIO_read_filename GRPC_SHADOW_BIO_read_filename', - '#define BIO_reset GRPC_SHADOW_BIO_reset', - '#define BIO_rw_filename GRPC_SHADOW_BIO_rw_filename', - '#define BIO_s_connect GRPC_SHADOW_BIO_s_connect', - '#define BIO_set_close GRPC_SHADOW_BIO_set_close', - '#define BIO_set_conn_hostname GRPC_SHADOW_BIO_set_conn_hostname', - '#define BIO_set_conn_int_port GRPC_SHADOW_BIO_set_conn_int_port', - '#define BIO_set_conn_port GRPC_SHADOW_BIO_set_conn_port', - '#define BIO_set_data GRPC_SHADOW_BIO_set_data', - '#define BIO_set_fd GRPC_SHADOW_BIO_set_fd', - '#define BIO_set_flags GRPC_SHADOW_BIO_set_flags', - '#define BIO_set_fp GRPC_SHADOW_BIO_set_fp', - '#define BIO_set_init GRPC_SHADOW_BIO_set_init', - '#define BIO_set_mem_buf GRPC_SHADOW_BIO_set_mem_buf', - '#define BIO_set_mem_eof_return GRPC_SHADOW_BIO_set_mem_eof_return', - '#define BIO_set_nbio GRPC_SHADOW_BIO_set_nbio', - '#define BIO_set_retry_read GRPC_SHADOW_BIO_set_retry_read', - '#define BIO_set_retry_special GRPC_SHADOW_BIO_set_retry_special', - '#define BIO_set_retry_write GRPC_SHADOW_BIO_set_retry_write', - '#define BIO_set_shutdown GRPC_SHADOW_BIO_set_shutdown', - '#define BIO_set_ssl GRPC_SHADOW_BIO_set_ssl', - '#define BIO_set_write_buffer_size GRPC_SHADOW_BIO_set_write_buffer_size', - '#define BIO_s_fd GRPC_SHADOW_BIO_s_fd', - '#define BIO_s_file GRPC_SHADOW_BIO_s_file', - '#define BIO_should_io_special GRPC_SHADOW_BIO_should_io_special', - '#define BIO_should_read GRPC_SHADOW_BIO_should_read', - '#define BIO_should_retry GRPC_SHADOW_BIO_should_retry', - '#define BIO_should_write GRPC_SHADOW_BIO_should_write', - '#define BIO_shutdown_wr GRPC_SHADOW_BIO_shutdown_wr', - '#define BIO_s_mem GRPC_SHADOW_BIO_s_mem', - '#define BIO_snprintf GRPC_SHADOW_BIO_snprintf', - '#define bio_sock_error GRPC_SHADOW_bio_sock_error', - '#define bio_socket_nbio GRPC_SHADOW_bio_socket_nbio', - '#define BIO_s_socket GRPC_SHADOW_BIO_s_socket', - '#define BIO_test_flags GRPC_SHADOW_BIO_test_flags', - '#define BIO_up_ref GRPC_SHADOW_BIO_up_ref', - '#define BIO_vfree GRPC_SHADOW_BIO_vfree', - '#define BIO_vsnprintf GRPC_SHADOW_BIO_vsnprintf', - '#define BIO_wpending GRPC_SHADOW_BIO_wpending', - '#define BIO_write GRPC_SHADOW_BIO_write', - '#define BIO_write_all GRPC_SHADOW_BIO_write_all', - '#define BIO_write_filename GRPC_SHADOW_BIO_write_filename', - '#define BN_abs_is_word GRPC_SHADOW_BN_abs_is_word', - '#define bn_abs_sub_consttime GRPC_SHADOW_bn_abs_sub_consttime', - '#define BN_add GRPC_SHADOW_BN_add', - '#define BN_add_word GRPC_SHADOW_BN_add_word', - '#define bn_add_words GRPC_SHADOW_bn_add_words', - '#define BN_asc2bn GRPC_SHADOW_BN_asc2bn', - '#define BN_bin2bn GRPC_SHADOW_BN_bin2bn', - '#define BN_BLINDING_convert GRPC_SHADOW_BN_BLINDING_convert', - '#define BN_BLINDING_free GRPC_SHADOW_BN_BLINDING_free', - '#define BN_BLINDING_invert GRPC_SHADOW_BN_BLINDING_invert', - '#define BN_BLINDING_new GRPC_SHADOW_BN_BLINDING_new', - '#define BN_bn2bin GRPC_SHADOW_BN_bn2bin', - '#define BN_bn2binpad GRPC_SHADOW_BN_bn2binpad', - '#define BN_bn2bin_padded GRPC_SHADOW_BN_bn2bin_padded', - '#define BN_bn2cbb_padded GRPC_SHADOW_BN_bn2cbb_padded', - '#define BN_bn2dec GRPC_SHADOW_BN_bn2dec', - '#define BN_bn2hex GRPC_SHADOW_BN_bn2hex', - '#define BN_bn2le_padded GRPC_SHADOW_BN_bn2le_padded', - '#define BN_bn2mpi GRPC_SHADOW_BN_bn2mpi', - '#define BN_clear GRPC_SHADOW_BN_clear', - '#define BN_clear_bit GRPC_SHADOW_BN_clear_bit', - '#define BN_clear_free GRPC_SHADOW_BN_clear_free', - '#define BN_cmp GRPC_SHADOW_BN_cmp', - '#define BN_cmp_word GRPC_SHADOW_BN_cmp_word', - '#define BN_copy GRPC_SHADOW_BN_copy', - '#define bn_copy_words GRPC_SHADOW_bn_copy_words', - '#define BN_count_low_zero_bits GRPC_SHADOW_BN_count_low_zero_bits', - '#define BN_CTX_end GRPC_SHADOW_BN_CTX_end', - '#define BN_CTX_free GRPC_SHADOW_BN_CTX_free', - '#define BN_CTX_get GRPC_SHADOW_BN_CTX_get', - '#define BN_CTX_new GRPC_SHADOW_BN_CTX_new', - '#define BN_CTX_start GRPC_SHADOW_BN_CTX_start', - '#define BN_dec2bn GRPC_SHADOW_BN_dec2bn', - '#define BN_div GRPC_SHADOW_BN_div', - '#define bn_div_consttime GRPC_SHADOW_bn_div_consttime', - '#define BN_div_word GRPC_SHADOW_BN_div_word', - '#define BN_dup GRPC_SHADOW_BN_dup', - '#define BN_enhanced_miller_rabin_primality_test GRPC_SHADOW_BN_enhanced_miller_rabin_primality_test', - '#define BN_equal_consttime GRPC_SHADOW_BN_equal_consttime', - '#define BN_exp GRPC_SHADOW_BN_exp', - '#define bn_expand GRPC_SHADOW_bn_expand', - '#define bn_fits_in_words GRPC_SHADOW_bn_fits_in_words', - '#define BN_free GRPC_SHADOW_BN_free', - '#define bn_from_montgomery GRPC_SHADOW_bn_from_montgomery', - '#define BN_from_montgomery GRPC_SHADOW_BN_from_montgomery', - '#define bn_from_montgomery_small GRPC_SHADOW_bn_from_montgomery_small', - '#define bn_gather5 GRPC_SHADOW_bn_gather5', - '#define BN_gcd GRPC_SHADOW_BN_gcd', - '#define BN_GENCB_call GRPC_SHADOW_BN_GENCB_call', - '#define BN_GENCB_set GRPC_SHADOW_BN_GENCB_set', - '#define BN_generate_prime_ex GRPC_SHADOW_BN_generate_prime_ex', - '#define BN_get_rfc3526_prime_1536 GRPC_SHADOW_BN_get_rfc3526_prime_1536', - '#define BN_get_u64 GRPC_SHADOW_BN_get_u64', - '#define BN_get_word GRPC_SHADOW_BN_get_word', - '#define BN_hex2bn GRPC_SHADOW_BN_hex2bn', - '#define BN_init GRPC_SHADOW_BN_init', - '#define bn_in_range_words GRPC_SHADOW_bn_in_range_words', - '#define BN_is_bit_set GRPC_SHADOW_BN_is_bit_set', - '#define bn_is_bit_set_words GRPC_SHADOW_bn_is_bit_set_words', - '#define BN_is_negative GRPC_SHADOW_BN_is_negative', - '#define BN_is_odd GRPC_SHADOW_BN_is_odd', - '#define BN_is_one GRPC_SHADOW_BN_is_one', - '#define BN_is_pow2 GRPC_SHADOW_BN_is_pow2', - '#define BN_is_prime_ex GRPC_SHADOW_BN_is_prime_ex', - '#define BN_is_prime_fasttest_ex GRPC_SHADOW_BN_is_prime_fasttest_ex', - '#define bn_is_relatively_prime GRPC_SHADOW_bn_is_relatively_prime', - '#define BN_is_word GRPC_SHADOW_BN_is_word', - '#define BN_is_zero GRPC_SHADOW_BN_is_zero', - '#define bn_jacobi GRPC_SHADOW_bn_jacobi', - '#define bn_lcm_consttime GRPC_SHADOW_bn_lcm_consttime', - '#define BN_le2bn GRPC_SHADOW_BN_le2bn', - '#define bn_less_than_montgomery_R GRPC_SHADOW_bn_less_than_montgomery_R', - '#define bn_less_than_words GRPC_SHADOW_bn_less_than_words', - '#define BN_lshift GRPC_SHADOW_BN_lshift', - '#define BN_lshift1 GRPC_SHADOW_BN_lshift1', - '#define BN_marshal_asn1 GRPC_SHADOW_BN_marshal_asn1', - '#define BN_mask_bits GRPC_SHADOW_BN_mask_bits', - '#define bn_miller_rabin_init GRPC_SHADOW_bn_miller_rabin_init', - '#define bn_miller_rabin_iteration GRPC_SHADOW_bn_miller_rabin_iteration', - '#define bn_minimal_width GRPC_SHADOW_bn_minimal_width', - '#define BN_mod_add GRPC_SHADOW_BN_mod_add', - '#define bn_mod_add_consttime GRPC_SHADOW_bn_mod_add_consttime', - '#define BN_mod_add_quick GRPC_SHADOW_BN_mod_add_quick', - '#define bn_mod_add_words GRPC_SHADOW_bn_mod_add_words', - '#define BN_mod_exp GRPC_SHADOW_BN_mod_exp', - '#define BN_mod_exp2_mont GRPC_SHADOW_BN_mod_exp2_mont', - '#define bn_mod_exp_base_2_consttime GRPC_SHADOW_bn_mod_exp_base_2_consttime', - '#define BN_mod_exp_mont GRPC_SHADOW_BN_mod_exp_mont', - '#define BN_mod_exp_mont_consttime GRPC_SHADOW_BN_mod_exp_mont_consttime', - '#define bn_mod_exp_mont_small GRPC_SHADOW_bn_mod_exp_mont_small', - '#define BN_mod_exp_mont_word GRPC_SHADOW_BN_mod_exp_mont_word', - '#define BN_mod_inverse GRPC_SHADOW_BN_mod_inverse', - '#define BN_mod_inverse_blinded GRPC_SHADOW_BN_mod_inverse_blinded', - '#define bn_mod_inverse_consttime GRPC_SHADOW_bn_mod_inverse_consttime', - '#define BN_mod_inverse_odd GRPC_SHADOW_BN_mod_inverse_odd', - '#define bn_mod_inverse_prime GRPC_SHADOW_bn_mod_inverse_prime', - '#define bn_mod_inverse_prime_mont_small GRPC_SHADOW_bn_mod_inverse_prime_mont_small', - '#define bn_mod_inverse_secret_prime GRPC_SHADOW_bn_mod_inverse_secret_prime', - '#define BN_mod_lshift GRPC_SHADOW_BN_mod_lshift', - '#define BN_mod_lshift1 GRPC_SHADOW_BN_mod_lshift1', - '#define bn_mod_lshift1_consttime GRPC_SHADOW_bn_mod_lshift1_consttime', - '#define BN_mod_lshift1_quick GRPC_SHADOW_BN_mod_lshift1_quick', - '#define bn_mod_lshift_consttime GRPC_SHADOW_bn_mod_lshift_consttime', - '#define BN_mod_lshift_quick GRPC_SHADOW_BN_mod_lshift_quick', - '#define BN_mod_mul GRPC_SHADOW_BN_mod_mul', - '#define BN_mod_mul_montgomery GRPC_SHADOW_BN_mod_mul_montgomery', - '#define bn_mod_mul_montgomery_small GRPC_SHADOW_bn_mod_mul_montgomery_small', - '#define BN_mod_pow2 GRPC_SHADOW_BN_mod_pow2', - '#define BN_mod_sqr GRPC_SHADOW_BN_mod_sqr', - '#define BN_mod_sqrt GRPC_SHADOW_BN_mod_sqrt', - '#define BN_mod_sub GRPC_SHADOW_BN_mod_sub', - '#define bn_mod_sub_consttime GRPC_SHADOW_bn_mod_sub_consttime', - '#define BN_mod_sub_quick GRPC_SHADOW_BN_mod_sub_quick', - '#define bn_mod_sub_words GRPC_SHADOW_bn_mod_sub_words', - '#define bn_mod_u16_consttime GRPC_SHADOW_bn_mod_u16_consttime', - '#define BN_mod_word GRPC_SHADOW_BN_mod_word', - '#define BN_MONT_CTX_copy GRPC_SHADOW_BN_MONT_CTX_copy', - '#define BN_MONT_CTX_free GRPC_SHADOW_BN_MONT_CTX_free', - '#define BN_MONT_CTX_new GRPC_SHADOW_BN_MONT_CTX_new', - '#define BN_MONT_CTX_new_consttime GRPC_SHADOW_BN_MONT_CTX_new_consttime', - '#define BN_MONT_CTX_new_for_modulus GRPC_SHADOW_BN_MONT_CTX_new_for_modulus', - '#define BN_MONT_CTX_set GRPC_SHADOW_BN_MONT_CTX_set', - '#define BN_MONT_CTX_set_locked GRPC_SHADOW_BN_MONT_CTX_set_locked', - '#define bn_mont_n0 GRPC_SHADOW_bn_mont_n0', - '#define BN_mpi2bn GRPC_SHADOW_BN_mpi2bn', - '#define BN_mul GRPC_SHADOW_BN_mul', - '#define bn_mul_add_words GRPC_SHADOW_bn_mul_add_words', - '#define bn_mul_comba4 GRPC_SHADOW_bn_mul_comba4', - '#define bn_mul_comba8 GRPC_SHADOW_bn_mul_comba8', - '#define bn_mul_consttime GRPC_SHADOW_bn_mul_consttime', - '#define bn_mul_mont GRPC_SHADOW_bn_mul_mont', - '#define bn_mul_mont_gather5 GRPC_SHADOW_bn_mul_mont_gather5', - '#define bn_mul_small GRPC_SHADOW_bn_mul_small', - '#define BN_mul_word GRPC_SHADOW_BN_mul_word', - '#define bn_mul_words GRPC_SHADOW_bn_mul_words', - '#define BN_new GRPC_SHADOW_BN_new', - '#define BN_nnmod GRPC_SHADOW_BN_nnmod', - '#define BN_nnmod_pow2 GRPC_SHADOW_BN_nnmod_pow2', - '#define BN_num_bits GRPC_SHADOW_BN_num_bits', - '#define BN_num_bits_word GRPC_SHADOW_BN_num_bits_word', - '#define BN_num_bytes GRPC_SHADOW_BN_num_bytes', - '#define bn_odd_number_is_obviously_composite GRPC_SHADOW_bn_odd_number_is_obviously_composite', - '#define BN_one GRPC_SHADOW_BN_one', - '#define bn_one_to_montgomery GRPC_SHADOW_bn_one_to_montgomery', - '#define BN_parse_asn1_unsigned GRPC_SHADOW_BN_parse_asn1_unsigned', - '#define bn_power5 GRPC_SHADOW_bn_power5', - '#define BN_primality_test GRPC_SHADOW_BN_primality_test', - '#define BN_print GRPC_SHADOW_BN_print', - '#define BN_print_fp GRPC_SHADOW_BN_print_fp', - '#define BN_pseudo_rand GRPC_SHADOW_BN_pseudo_rand', - '#define BN_pseudo_rand_range GRPC_SHADOW_BN_pseudo_rand_range', - '#define BN_rand GRPC_SHADOW_BN_rand', - '#define BN_rand_range GRPC_SHADOW_BN_rand_range', - '#define BN_rand_range_ex GRPC_SHADOW_BN_rand_range_ex', - '#define bn_rand_range_words GRPC_SHADOW_bn_rand_range_words', - '#define bn_rand_secret_range GRPC_SHADOW_bn_rand_secret_range', - '#define bn_reduce_once GRPC_SHADOW_bn_reduce_once', - '#define bn_reduce_once_in_place GRPC_SHADOW_bn_reduce_once_in_place', - '#define bn_resize_words GRPC_SHADOW_bn_resize_words', - '#define BN_rshift GRPC_SHADOW_BN_rshift', - '#define BN_rshift1 GRPC_SHADOW_BN_rshift1', - '#define bn_rshift1_words GRPC_SHADOW_bn_rshift1_words', - '#define bn_rshift_secret_shift GRPC_SHADOW_bn_rshift_secret_shift', - '#define bn_rshift_words GRPC_SHADOW_bn_rshift_words', - '#define bn_scatter5 GRPC_SHADOW_bn_scatter5', - '#define bn_select_words GRPC_SHADOW_bn_select_words', - '#define BN_set_bit GRPC_SHADOW_BN_set_bit', - '#define bn_set_minimal_width GRPC_SHADOW_bn_set_minimal_width', - '#define BN_set_negative GRPC_SHADOW_BN_set_negative', - '#define BN_set_u64 GRPC_SHADOW_BN_set_u64', - '#define BN_set_word GRPC_SHADOW_BN_set_word', - '#define bn_set_words GRPC_SHADOW_bn_set_words', - '#define BN_sqr GRPC_SHADOW_BN_sqr', - '#define bn_sqr8x_internal GRPC_SHADOW_bn_sqr8x_internal', - '#define bn_sqr_comba4 GRPC_SHADOW_bn_sqr_comba4', - '#define bn_sqr_comba8 GRPC_SHADOW_bn_sqr_comba8', - '#define bn_sqr_consttime GRPC_SHADOW_bn_sqr_consttime', - '#define bn_sqr_small GRPC_SHADOW_bn_sqr_small', - '#define BN_sqrt GRPC_SHADOW_BN_sqrt', - '#define bn_sqr_words GRPC_SHADOW_bn_sqr_words', - '#define bn_sqrx8x_internal GRPC_SHADOW_bn_sqrx8x_internal', - '#define BN_sub GRPC_SHADOW_BN_sub', - '#define BN_sub_word GRPC_SHADOW_BN_sub_word', - '#define bn_sub_words GRPC_SHADOW_bn_sub_words', - '#define BN_to_ASN1_ENUMERATED GRPC_SHADOW_BN_to_ASN1_ENUMERATED', - '#define BN_to_ASN1_INTEGER GRPC_SHADOW_BN_to_ASN1_INTEGER', - '#define BN_to_montgomery GRPC_SHADOW_BN_to_montgomery', - '#define bn_to_montgomery_small GRPC_SHADOW_bn_to_montgomery_small', - '#define BN_uadd GRPC_SHADOW_BN_uadd', - '#define bn_uadd_consttime GRPC_SHADOW_bn_uadd_consttime', - '#define BN_ucmp GRPC_SHADOW_BN_ucmp', - '#define BN_usub GRPC_SHADOW_BN_usub', - '#define bn_usub_consttime GRPC_SHADOW_bn_usub_consttime', - '#define BN_value_one GRPC_SHADOW_BN_value_one', - '#define bn_wexpand GRPC_SHADOW_bn_wexpand', - '#define BN_zero GRPC_SHADOW_BN_zero', - '#define boringssl_fips_self_test GRPC_SHADOW_boringssl_fips_self_test', - '#define BORINGSSL_self_test GRPC_SHADOW_BORINGSSL_self_test', - '#define BUF_MEM_append GRPC_SHADOW_BUF_MEM_append', - '#define BUF_memdup GRPC_SHADOW_BUF_memdup', - '#define BUF_MEM_free GRPC_SHADOW_BUF_MEM_free', - '#define BUF_MEM_grow GRPC_SHADOW_BUF_MEM_grow', - '#define BUF_MEM_grow_clean GRPC_SHADOW_BUF_MEM_grow_clean', - '#define BUF_MEM_new GRPC_SHADOW_BUF_MEM_new', - '#define BUF_MEM_reserve GRPC_SHADOW_BUF_MEM_reserve', - '#define BUF_strdup GRPC_SHADOW_BUF_strdup', - '#define BUF_strlcat GRPC_SHADOW_BUF_strlcat', - '#define BUF_strlcpy GRPC_SHADOW_BUF_strlcpy', - '#define BUF_strndup GRPC_SHADOW_BUF_strndup', - '#define BUF_strnlen GRPC_SHADOW_BUF_strnlen', - '#define c2i_ASN1_BIT_STRING GRPC_SHADOW_c2i_ASN1_BIT_STRING', - '#define c2i_ASN1_INTEGER GRPC_SHADOW_c2i_ASN1_INTEGER', - '#define c2i_ASN1_OBJECT GRPC_SHADOW_c2i_ASN1_OBJECT', - '#define CBB_add_asn1 GRPC_SHADOW_CBB_add_asn1', - '#define CBB_add_asn1_bool GRPC_SHADOW_CBB_add_asn1_bool', - '#define CBB_add_asn1_int64 GRPC_SHADOW_CBB_add_asn1_int64', - '#define CBB_add_asn1_octet_string GRPC_SHADOW_CBB_add_asn1_octet_string', - '#define CBB_add_asn1_oid_from_text GRPC_SHADOW_CBB_add_asn1_oid_from_text', - '#define CBB_add_asn1_uint64 GRPC_SHADOW_CBB_add_asn1_uint64', - '#define CBB_add_bytes GRPC_SHADOW_CBB_add_bytes', - '#define cbb_add_latin1 GRPC_SHADOW_cbb_add_latin1', - '#define CBB_add_space GRPC_SHADOW_CBB_add_space', - '#define CBB_add_u16 GRPC_SHADOW_CBB_add_u16', - '#define CBB_add_u16le GRPC_SHADOW_CBB_add_u16le', - '#define CBB_add_u16_length_prefixed GRPC_SHADOW_CBB_add_u16_length_prefixed', - '#define CBB_add_u24 GRPC_SHADOW_CBB_add_u24', - '#define CBB_add_u24_length_prefixed GRPC_SHADOW_CBB_add_u24_length_prefixed', - '#define CBB_add_u32 GRPC_SHADOW_CBB_add_u32', - '#define CBB_add_u32le GRPC_SHADOW_CBB_add_u32le', - '#define CBB_add_u64 GRPC_SHADOW_CBB_add_u64', - '#define CBB_add_u64le GRPC_SHADOW_CBB_add_u64le', - '#define CBB_add_u8 GRPC_SHADOW_CBB_add_u8', - '#define CBB_add_u8_length_prefixed GRPC_SHADOW_CBB_add_u8_length_prefixed', - '#define cbb_add_ucs2_be GRPC_SHADOW_cbb_add_ucs2_be', - '#define cbb_add_utf32_be GRPC_SHADOW_cbb_add_utf32_be', - '#define cbb_add_utf8 GRPC_SHADOW_cbb_add_utf8', - '#define CBB_cleanup GRPC_SHADOW_CBB_cleanup', - '#define CBB_data GRPC_SHADOW_CBB_data', - '#define CBB_did_write GRPC_SHADOW_CBB_did_write', - '#define CBB_discard_child GRPC_SHADOW_CBB_discard_child', - '#define CBB_finish GRPC_SHADOW_CBB_finish', - '#define CBB_finish_i2d GRPC_SHADOW_CBB_finish_i2d', - '#define CBB_flush GRPC_SHADOW_CBB_flush', - '#define CBB_flush_asn1_set_of GRPC_SHADOW_CBB_flush_asn1_set_of', - '#define cbb_get_utf8_len GRPC_SHADOW_cbb_get_utf8_len', - '#define CBB_init GRPC_SHADOW_CBB_init', - '#define CBB_init_fixed GRPC_SHADOW_CBB_init_fixed', - '#define CBB_len GRPC_SHADOW_CBB_len', - '#define CBB_reserve GRPC_SHADOW_CBB_reserve', - '#define CBB_zero GRPC_SHADOW_CBB_zero', - '#define CBS_asn1_ber_to_der GRPC_SHADOW_CBS_asn1_ber_to_der', - '#define CBS_asn1_bitstring_has_bit GRPC_SHADOW_CBS_asn1_bitstring_has_bit', - '#define CBS_asn1_oid_to_text GRPC_SHADOW_CBS_asn1_oid_to_text', - '#define CBS_contains_zero_byte GRPC_SHADOW_CBS_contains_zero_byte', - '#define CBS_copy_bytes GRPC_SHADOW_CBS_copy_bytes', - '#define CBS_data GRPC_SHADOW_CBS_data', - '#define CBS_get_any_asn1 GRPC_SHADOW_CBS_get_any_asn1', - '#define CBS_get_any_asn1_element GRPC_SHADOW_CBS_get_any_asn1_element', - '#define CBS_get_any_ber_asn1_element GRPC_SHADOW_CBS_get_any_ber_asn1_element', - '#define CBS_get_asn1 GRPC_SHADOW_CBS_get_asn1', - '#define CBS_get_asn1_bool GRPC_SHADOW_CBS_get_asn1_bool', - '#define CBS_get_asn1_element GRPC_SHADOW_CBS_get_asn1_element', - '#define CBS_get_asn1_implicit_string GRPC_SHADOW_CBS_get_asn1_implicit_string', - '#define CBS_get_asn1_int64 GRPC_SHADOW_CBS_get_asn1_int64', - '#define CBS_get_asn1_uint64 GRPC_SHADOW_CBS_get_asn1_uint64', - '#define CBS_get_bytes GRPC_SHADOW_CBS_get_bytes', - '#define CBS_get_last_u8 GRPC_SHADOW_CBS_get_last_u8', - '#define cbs_get_latin1 GRPC_SHADOW_cbs_get_latin1', - '#define CBS_get_optional_asn1 GRPC_SHADOW_CBS_get_optional_asn1', - '#define CBS_get_optional_asn1_bool GRPC_SHADOW_CBS_get_optional_asn1_bool', - '#define CBS_get_optional_asn1_octet_string GRPC_SHADOW_CBS_get_optional_asn1_octet_string', - '#define CBS_get_optional_asn1_uint64 GRPC_SHADOW_CBS_get_optional_asn1_uint64', - '#define CBS_get_u16 GRPC_SHADOW_CBS_get_u16', - '#define CBS_get_u16le GRPC_SHADOW_CBS_get_u16le', - '#define CBS_get_u16_length_prefixed GRPC_SHADOW_CBS_get_u16_length_prefixed', - '#define CBS_get_u24 GRPC_SHADOW_CBS_get_u24', - '#define CBS_get_u24_length_prefixed GRPC_SHADOW_CBS_get_u24_length_prefixed', - '#define CBS_get_u32 GRPC_SHADOW_CBS_get_u32', - '#define CBS_get_u32le GRPC_SHADOW_CBS_get_u32le', - '#define CBS_get_u64 GRPC_SHADOW_CBS_get_u64', - '#define CBS_get_u64le GRPC_SHADOW_CBS_get_u64le', - '#define CBS_get_u8 GRPC_SHADOW_CBS_get_u8', - '#define CBS_get_u8_length_prefixed GRPC_SHADOW_CBS_get_u8_length_prefixed', - '#define cbs_get_ucs2_be GRPC_SHADOW_cbs_get_ucs2_be', - '#define cbs_get_utf32_be GRPC_SHADOW_cbs_get_utf32_be', - '#define cbs_get_utf8 GRPC_SHADOW_cbs_get_utf8', - '#define CBS_init GRPC_SHADOW_CBS_init', - '#define CBS_is_valid_asn1_bitstring GRPC_SHADOW_CBS_is_valid_asn1_bitstring', - '#define CBS_len GRPC_SHADOW_CBS_len', - '#define CBS_mem_equal GRPC_SHADOW_CBS_mem_equal', - '#define CBS_peek_asn1_tag GRPC_SHADOW_CBS_peek_asn1_tag', - '#define CBS_skip GRPC_SHADOW_CBS_skip', - '#define CBS_stow GRPC_SHADOW_CBS_stow', - '#define CBS_strdup GRPC_SHADOW_CBS_strdup', - '#define CERTIFICATEPOLICIES_free GRPC_SHADOW_CERTIFICATEPOLICIES_free', - '#define CERTIFICATEPOLICIES_it GRPC_SHADOW_CERTIFICATEPOLICIES_it', - '#define CERTIFICATEPOLICIES_new GRPC_SHADOW_CERTIFICATEPOLICIES_new', - '#define ChaCha20_ctr32 GRPC_SHADOW_ChaCha20_ctr32', - '#define chacha20_poly1305_open GRPC_SHADOW_chacha20_poly1305_open', - '#define chacha20_poly1305_seal GRPC_SHADOW_chacha20_poly1305_seal', - '#define CMAC_CTX_copy GRPC_SHADOW_CMAC_CTX_copy', - '#define CMAC_CTX_free GRPC_SHADOW_CMAC_CTX_free', - '#define CMAC_CTX_new GRPC_SHADOW_CMAC_CTX_new', - '#define CMAC_Final GRPC_SHADOW_CMAC_Final', - '#define CMAC_Init GRPC_SHADOW_CMAC_Init', - '#define CMAC_Reset GRPC_SHADOW_CMAC_Reset', - '#define CMAC_Update GRPC_SHADOW_CMAC_Update', - '#define CONF_modules_free GRPC_SHADOW_CONF_modules_free', - '#define CONF_modules_load_file GRPC_SHADOW_CONF_modules_load_file', - '#define CONF_parse_list GRPC_SHADOW_CONF_parse_list', - '#define CONF_VALUE_new GRPC_SHADOW_CONF_VALUE_new', - '#define CRL_DIST_POINTS_free GRPC_SHADOW_CRL_DIST_POINTS_free', - '#define CRL_DIST_POINTS_it GRPC_SHADOW_CRL_DIST_POINTS_it', - '#define CRL_DIST_POINTS_new GRPC_SHADOW_CRL_DIST_POINTS_new', - '#define CRYPTO_BUFFER_alloc GRPC_SHADOW_CRYPTO_BUFFER_alloc', - '#define CRYPTO_BUFFER_data GRPC_SHADOW_CRYPTO_BUFFER_data', - '#define CRYPTO_BUFFER_free GRPC_SHADOW_CRYPTO_BUFFER_free', - '#define CRYPTO_BUFFER_init_CBS GRPC_SHADOW_CRYPTO_BUFFER_init_CBS', - '#define CRYPTO_BUFFER_len GRPC_SHADOW_CRYPTO_BUFFER_len', - '#define CRYPTO_BUFFER_new GRPC_SHADOW_CRYPTO_BUFFER_new', - '#define CRYPTO_BUFFER_new_from_CBS GRPC_SHADOW_CRYPTO_BUFFER_new_from_CBS', - '#define CRYPTO_BUFFER_POOL_free GRPC_SHADOW_CRYPTO_BUFFER_POOL_free', - '#define CRYPTO_BUFFER_POOL_new GRPC_SHADOW_CRYPTO_BUFFER_POOL_new', - '#define CRYPTO_BUFFER_up_ref GRPC_SHADOW_CRYPTO_BUFFER_up_ref', - '#define CRYPTO_cbc128_decrypt GRPC_SHADOW_CRYPTO_cbc128_decrypt', - '#define CRYPTO_cbc128_encrypt GRPC_SHADOW_CRYPTO_cbc128_encrypt', - '#define CRYPTO_cfb128_1_encrypt GRPC_SHADOW_CRYPTO_cfb128_1_encrypt', - '#define CRYPTO_cfb128_8_encrypt GRPC_SHADOW_CRYPTO_cfb128_8_encrypt', - '#define CRYPTO_cfb128_encrypt GRPC_SHADOW_CRYPTO_cfb128_encrypt', - '#define CRYPTO_chacha_20 GRPC_SHADOW_CRYPTO_chacha_20', - '#define CRYPTO_cleanup_all_ex_data GRPC_SHADOW_CRYPTO_cleanup_all_ex_data', - '#define CRYPTO_ctr128_encrypt GRPC_SHADOW_CRYPTO_ctr128_encrypt', - '#define CRYPTO_ctr128_encrypt_ctr32 GRPC_SHADOW_CRYPTO_ctr128_encrypt_ctr32', - '#define CRYPTO_free_ex_data GRPC_SHADOW_CRYPTO_free_ex_data', - '#define CRYPTO_gcm128_aad GRPC_SHADOW_CRYPTO_gcm128_aad', - '#define CRYPTO_gcm128_decrypt GRPC_SHADOW_CRYPTO_gcm128_decrypt', - '#define CRYPTO_gcm128_decrypt_ctr32 GRPC_SHADOW_CRYPTO_gcm128_decrypt_ctr32', - '#define CRYPTO_gcm128_encrypt GRPC_SHADOW_CRYPTO_gcm128_encrypt', - '#define CRYPTO_gcm128_encrypt_ctr32 GRPC_SHADOW_CRYPTO_gcm128_encrypt_ctr32', - '#define CRYPTO_gcm128_finish GRPC_SHADOW_CRYPTO_gcm128_finish', - '#define CRYPTO_gcm128_init_key GRPC_SHADOW_CRYPTO_gcm128_init_key', - '#define CRYPTO_gcm128_setiv GRPC_SHADOW_CRYPTO_gcm128_setiv', - '#define CRYPTO_gcm128_tag GRPC_SHADOW_CRYPTO_gcm128_tag', - '#define crypto_gcm_clmul_enabled GRPC_SHADOW_crypto_gcm_clmul_enabled', - '#define CRYPTO_get_dynlock_create_callback GRPC_SHADOW_CRYPTO_get_dynlock_create_callback', - '#define CRYPTO_get_dynlock_destroy_callback GRPC_SHADOW_CRYPTO_get_dynlock_destroy_callback', - '#define CRYPTO_get_dynlock_lock_callback GRPC_SHADOW_CRYPTO_get_dynlock_lock_callback', - '#define CRYPTO_get_ex_data GRPC_SHADOW_CRYPTO_get_ex_data', - '#define CRYPTO_get_ex_new_index GRPC_SHADOW_CRYPTO_get_ex_new_index', - '#define CRYPTO_get_locking_callback GRPC_SHADOW_CRYPTO_get_locking_callback', - '#define CRYPTO_get_lock_name GRPC_SHADOW_CRYPTO_get_lock_name', - '#define CRYPTO_get_thread_local GRPC_SHADOW_CRYPTO_get_thread_local', - '#define CRYPTO_ghash_init GRPC_SHADOW_CRYPTO_ghash_init', - '#define CRYPTO_has_asm GRPC_SHADOW_CRYPTO_has_asm', - '#define CRYPTO_hchacha20 GRPC_SHADOW_CRYPTO_hchacha20', - '#define CRYPTO_is_confidential_build GRPC_SHADOW_CRYPTO_is_confidential_build', - '#define CRYPTO_library_init GRPC_SHADOW_CRYPTO_library_init', - '#define CRYPTO_malloc_init GRPC_SHADOW_CRYPTO_malloc_init', - '#define CRYPTO_memcmp GRPC_SHADOW_CRYPTO_memcmp', - '#define CRYPTO_MUTEX_cleanup GRPC_SHADOW_CRYPTO_MUTEX_cleanup', - '#define CRYPTO_MUTEX_init GRPC_SHADOW_CRYPTO_MUTEX_init', - '#define CRYPTO_MUTEX_lock_read GRPC_SHADOW_CRYPTO_MUTEX_lock_read', - '#define CRYPTO_MUTEX_lock_write GRPC_SHADOW_CRYPTO_MUTEX_lock_write', - '#define CRYPTO_MUTEX_unlock_read GRPC_SHADOW_CRYPTO_MUTEX_unlock_read', - '#define CRYPTO_MUTEX_unlock_write GRPC_SHADOW_CRYPTO_MUTEX_unlock_write', - '#define CRYPTO_new_ex_data GRPC_SHADOW_CRYPTO_new_ex_data', - '#define CRYPTO_num_locks GRPC_SHADOW_CRYPTO_num_locks', - '#define CRYPTO_ofb128_encrypt GRPC_SHADOW_CRYPTO_ofb128_encrypt', - '#define CRYPTO_once GRPC_SHADOW_CRYPTO_once', - '#define CRYPTO_poly1305_finish GRPC_SHADOW_CRYPTO_poly1305_finish', - '#define CRYPTO_poly1305_init GRPC_SHADOW_CRYPTO_poly1305_init', - '#define CRYPTO_poly1305_update GRPC_SHADOW_CRYPTO_poly1305_update', - '#define CRYPTO_POLYVAL_finish GRPC_SHADOW_CRYPTO_POLYVAL_finish', - '#define CRYPTO_POLYVAL_init GRPC_SHADOW_CRYPTO_POLYVAL_init', - '#define CRYPTO_POLYVAL_update_blocks GRPC_SHADOW_CRYPTO_POLYVAL_update_blocks', - '#define CRYPTO_rdrand GRPC_SHADOW_CRYPTO_rdrand', - '#define CRYPTO_rdrand_multiple8_buf GRPC_SHADOW_CRYPTO_rdrand_multiple8_buf', - '#define CRYPTO_refcount_dec_and_test_zero GRPC_SHADOW_CRYPTO_refcount_dec_and_test_zero', - '#define CRYPTO_refcount_inc GRPC_SHADOW_CRYPTO_refcount_inc', - '#define CRYPTO_set_add_lock_callback GRPC_SHADOW_CRYPTO_set_add_lock_callback', - '#define CRYPTO_set_dynlock_create_callback GRPC_SHADOW_CRYPTO_set_dynlock_create_callback', - '#define CRYPTO_set_dynlock_destroy_callback GRPC_SHADOW_CRYPTO_set_dynlock_destroy_callback', - '#define CRYPTO_set_dynlock_lock_callback GRPC_SHADOW_CRYPTO_set_dynlock_lock_callback', - '#define CRYPTO_set_ex_data GRPC_SHADOW_CRYPTO_set_ex_data', - '#define CRYPTO_set_id_callback GRPC_SHADOW_CRYPTO_set_id_callback', - '#define CRYPTO_set_locking_callback GRPC_SHADOW_CRYPTO_set_locking_callback', - '#define CRYPTO_set_thread_local GRPC_SHADOW_CRYPTO_set_thread_local', - '#define CRYPTO_STATIC_MUTEX_lock_read GRPC_SHADOW_CRYPTO_STATIC_MUTEX_lock_read', - '#define CRYPTO_STATIC_MUTEX_lock_write GRPC_SHADOW_CRYPTO_STATIC_MUTEX_lock_write', - '#define CRYPTO_STATIC_MUTEX_unlock_read GRPC_SHADOW_CRYPTO_STATIC_MUTEX_unlock_read', - '#define CRYPTO_STATIC_MUTEX_unlock_write GRPC_SHADOW_CRYPTO_STATIC_MUTEX_unlock_write', - '#define CRYPTO_sysrand GRPC_SHADOW_CRYPTO_sysrand', - '#define CRYPTO_THREADID_current GRPC_SHADOW_CRYPTO_THREADID_current', - '#define CRYPTO_THREADID_set_callback GRPC_SHADOW_CRYPTO_THREADID_set_callback', - '#define CRYPTO_THREADID_set_numeric GRPC_SHADOW_CRYPTO_THREADID_set_numeric', - '#define CRYPTO_THREADID_set_pointer GRPC_SHADOW_CRYPTO_THREADID_set_pointer', - '#define CRYPTO_tls1_prf GRPC_SHADOW_CRYPTO_tls1_prf', - '#define CTR_DRBG_clear GRPC_SHADOW_CTR_DRBG_clear', - '#define CTR_DRBG_generate GRPC_SHADOW_CTR_DRBG_generate', - '#define CTR_DRBG_init GRPC_SHADOW_CTR_DRBG_init', - '#define CTR_DRBG_reseed GRPC_SHADOW_CTR_DRBG_reseed', - '#define d2i_ACCESS_DESCRIPTION GRPC_SHADOW_d2i_ACCESS_DESCRIPTION', - '#define d2i_ASN1_BIT_STRING GRPC_SHADOW_d2i_ASN1_BIT_STRING', - '#define d2i_ASN1_BMPSTRING GRPC_SHADOW_d2i_ASN1_BMPSTRING', - '#define d2i_ASN1_BOOLEAN GRPC_SHADOW_d2i_ASN1_BOOLEAN', - '#define d2i_ASN1_ENUMERATED GRPC_SHADOW_d2i_ASN1_ENUMERATED', - '#define d2i_ASN1_GENERALIZEDTIME GRPC_SHADOW_d2i_ASN1_GENERALIZEDTIME', - '#define d2i_ASN1_GENERALSTRING GRPC_SHADOW_d2i_ASN1_GENERALSTRING', - '#define d2i_ASN1_IA5STRING GRPC_SHADOW_d2i_ASN1_IA5STRING', - '#define d2i_ASN1_INTEGER GRPC_SHADOW_d2i_ASN1_INTEGER', - '#define d2i_ASN1_NULL GRPC_SHADOW_d2i_ASN1_NULL', - '#define d2i_ASN1_OBJECT GRPC_SHADOW_d2i_ASN1_OBJECT', - '#define d2i_ASN1_OCTET_STRING GRPC_SHADOW_d2i_ASN1_OCTET_STRING', - '#define d2i_ASN1_PRINTABLE GRPC_SHADOW_d2i_ASN1_PRINTABLE', - '#define d2i_ASN1_PRINTABLESTRING GRPC_SHADOW_d2i_ASN1_PRINTABLESTRING', - '#define d2i_ASN1_SEQUENCE_ANY GRPC_SHADOW_d2i_ASN1_SEQUENCE_ANY', - '#define d2i_ASN1_SET_ANY GRPC_SHADOW_d2i_ASN1_SET_ANY', - '#define d2i_ASN1_T61STRING GRPC_SHADOW_d2i_ASN1_T61STRING', - '#define d2i_ASN1_TIME GRPC_SHADOW_d2i_ASN1_TIME', - '#define d2i_ASN1_TYPE GRPC_SHADOW_d2i_ASN1_TYPE', - '#define d2i_ASN1_UNIVERSALSTRING GRPC_SHADOW_d2i_ASN1_UNIVERSALSTRING', - '#define d2i_ASN1_UTCTIME GRPC_SHADOW_d2i_ASN1_UTCTIME', - '#define d2i_ASN1_UTF8STRING GRPC_SHADOW_d2i_ASN1_UTF8STRING', - '#define d2i_ASN1_VISIBLESTRING GRPC_SHADOW_d2i_ASN1_VISIBLESTRING', - '#define d2i_AUTHORITY_INFO_ACCESS GRPC_SHADOW_d2i_AUTHORITY_INFO_ACCESS', - '#define d2i_AUTHORITY_KEYID GRPC_SHADOW_d2i_AUTHORITY_KEYID', - '#define d2i_AutoPrivateKey GRPC_SHADOW_d2i_AutoPrivateKey', - '#define d2i_BASIC_CONSTRAINTS GRPC_SHADOW_d2i_BASIC_CONSTRAINTS', - '#define d2i_CERTIFICATEPOLICIES GRPC_SHADOW_d2i_CERTIFICATEPOLICIES', - '#define d2i_CRL_DIST_POINTS GRPC_SHADOW_d2i_CRL_DIST_POINTS', - '#define d2i_DHparams GRPC_SHADOW_d2i_DHparams', - '#define d2i_DHparams_bio GRPC_SHADOW_d2i_DHparams_bio', - '#define d2i_DIRECTORYSTRING GRPC_SHADOW_d2i_DIRECTORYSTRING', - '#define d2i_DISPLAYTEXT GRPC_SHADOW_d2i_DISPLAYTEXT', - '#define d2i_DIST_POINT GRPC_SHADOW_d2i_DIST_POINT', - '#define d2i_DIST_POINT_NAME GRPC_SHADOW_d2i_DIST_POINT_NAME', - '#define d2i_DSAparams GRPC_SHADOW_d2i_DSAparams', - '#define d2i_DSAPrivateKey GRPC_SHADOW_d2i_DSAPrivateKey', - '#define d2i_DSAPrivateKey_bio GRPC_SHADOW_d2i_DSAPrivateKey_bio', - '#define d2i_DSAPrivateKey_fp GRPC_SHADOW_d2i_DSAPrivateKey_fp', - '#define d2i_DSA_PUBKEY GRPC_SHADOW_d2i_DSA_PUBKEY', - '#define d2i_DSA_PUBKEY_bio GRPC_SHADOW_d2i_DSA_PUBKEY_bio', - '#define d2i_DSA_PUBKEY_fp GRPC_SHADOW_d2i_DSA_PUBKEY_fp', - '#define d2i_DSAPublicKey GRPC_SHADOW_d2i_DSAPublicKey', - '#define d2i_DSA_SIG GRPC_SHADOW_d2i_DSA_SIG', - '#define d2i_ECDSA_SIG GRPC_SHADOW_d2i_ECDSA_SIG', - '#define d2i_ECParameters GRPC_SHADOW_d2i_ECParameters', - '#define d2i_ECPrivateKey GRPC_SHADOW_d2i_ECPrivateKey', - '#define d2i_ECPrivateKey_bio GRPC_SHADOW_d2i_ECPrivateKey_bio', - '#define d2i_ECPrivateKey_fp GRPC_SHADOW_d2i_ECPrivateKey_fp', - '#define d2i_EC_PUBKEY GRPC_SHADOW_d2i_EC_PUBKEY', - '#define d2i_EC_PUBKEY_bio GRPC_SHADOW_d2i_EC_PUBKEY_bio', - '#define d2i_EC_PUBKEY_fp GRPC_SHADOW_d2i_EC_PUBKEY_fp', - '#define d2i_EDIPARTYNAME GRPC_SHADOW_d2i_EDIPARTYNAME', - '#define d2i_EXTENDED_KEY_USAGE GRPC_SHADOW_d2i_EXTENDED_KEY_USAGE', - '#define d2i_GENERAL_NAME GRPC_SHADOW_d2i_GENERAL_NAME', - '#define d2i_GENERAL_NAMES GRPC_SHADOW_d2i_GENERAL_NAMES', - '#define d2i_ISSUING_DIST_POINT GRPC_SHADOW_d2i_ISSUING_DIST_POINT', - '#define d2i_NETSCAPE_SPKAC GRPC_SHADOW_d2i_NETSCAPE_SPKAC', - '#define d2i_NETSCAPE_SPKI GRPC_SHADOW_d2i_NETSCAPE_SPKI', - '#define d2i_NOTICEREF GRPC_SHADOW_d2i_NOTICEREF', - '#define d2i_OTHERNAME GRPC_SHADOW_d2i_OTHERNAME', - '#define d2i_PKCS12 GRPC_SHADOW_d2i_PKCS12', - '#define d2i_PKCS12_bio GRPC_SHADOW_d2i_PKCS12_bio', - '#define d2i_PKCS12_fp GRPC_SHADOW_d2i_PKCS12_fp', - '#define d2i_PKCS7 GRPC_SHADOW_d2i_PKCS7', - '#define d2i_PKCS7_bio GRPC_SHADOW_d2i_PKCS7_bio', - '#define d2i_PKCS8_bio GRPC_SHADOW_d2i_PKCS8_bio', - '#define d2i_PKCS8_fp GRPC_SHADOW_d2i_PKCS8_fp', - '#define d2i_PKCS8PrivateKey_bio GRPC_SHADOW_d2i_PKCS8PrivateKey_bio', - '#define d2i_PKCS8PrivateKey_fp GRPC_SHADOW_d2i_PKCS8PrivateKey_fp', - '#define d2i_PKCS8_PRIV_KEY_INFO GRPC_SHADOW_d2i_PKCS8_PRIV_KEY_INFO', - '#define d2i_PKCS8_PRIV_KEY_INFO_bio GRPC_SHADOW_d2i_PKCS8_PRIV_KEY_INFO_bio', - '#define d2i_PKCS8_PRIV_KEY_INFO_fp GRPC_SHADOW_d2i_PKCS8_PRIV_KEY_INFO_fp', - '#define d2i_PKEY_USAGE_PERIOD GRPC_SHADOW_d2i_PKEY_USAGE_PERIOD', - '#define d2i_POLICYINFO GRPC_SHADOW_d2i_POLICYINFO', - '#define d2i_POLICYQUALINFO GRPC_SHADOW_d2i_POLICYQUALINFO', - '#define d2i_PrivateKey GRPC_SHADOW_d2i_PrivateKey', - '#define d2i_PrivateKey_bio GRPC_SHADOW_d2i_PrivateKey_bio', - '#define d2i_PrivateKey_fp GRPC_SHADOW_d2i_PrivateKey_fp', - '#define d2i_PROXY_CERT_INFO_EXTENSION GRPC_SHADOW_d2i_PROXY_CERT_INFO_EXTENSION', - '#define d2i_PROXY_POLICY GRPC_SHADOW_d2i_PROXY_POLICY', - '#define d2i_PUBKEY GRPC_SHADOW_d2i_PUBKEY', - '#define d2i_PUBKEY_bio GRPC_SHADOW_d2i_PUBKEY_bio', - '#define d2i_PUBKEY_fp GRPC_SHADOW_d2i_PUBKEY_fp', - '#define d2i_PublicKey GRPC_SHADOW_d2i_PublicKey', - '#define d2i_RSAPrivateKey GRPC_SHADOW_d2i_RSAPrivateKey', - '#define d2i_RSAPrivateKey_bio GRPC_SHADOW_d2i_RSAPrivateKey_bio', - '#define d2i_RSAPrivateKey_fp GRPC_SHADOW_d2i_RSAPrivateKey_fp', - '#define d2i_RSA_PSS_PARAMS GRPC_SHADOW_d2i_RSA_PSS_PARAMS', - '#define d2i_RSA_PUBKEY GRPC_SHADOW_d2i_RSA_PUBKEY', - '#define d2i_RSA_PUBKEY_bio GRPC_SHADOW_d2i_RSA_PUBKEY_bio', - '#define d2i_RSA_PUBKEY_fp GRPC_SHADOW_d2i_RSA_PUBKEY_fp', - '#define d2i_RSAPublicKey GRPC_SHADOW_d2i_RSAPublicKey', - '#define d2i_RSAPublicKey_bio GRPC_SHADOW_d2i_RSAPublicKey_bio', - '#define d2i_RSAPublicKey_fp GRPC_SHADOW_d2i_RSAPublicKey_fp', - '#define d2i_SSL_SESSION GRPC_SHADOW_d2i_SSL_SESSION', - '#define d2i_SSL_SESSION_bio GRPC_SHADOW_d2i_SSL_SESSION_bio', - '#define d2i_SXNET GRPC_SHADOW_d2i_SXNET', - '#define d2i_SXNETID GRPC_SHADOW_d2i_SXNETID', - '#define d2i_USERNOTICE GRPC_SHADOW_d2i_USERNOTICE', - '#define d2i_X509 GRPC_SHADOW_d2i_X509', - '#define d2i_X509_ALGOR GRPC_SHADOW_d2i_X509_ALGOR', - '#define d2i_X509_ALGORS GRPC_SHADOW_d2i_X509_ALGORS', - '#define d2i_X509_ATTRIBUTE GRPC_SHADOW_d2i_X509_ATTRIBUTE', - '#define d2i_X509_AUX GRPC_SHADOW_d2i_X509_AUX', - '#define d2i_X509_bio GRPC_SHADOW_d2i_X509_bio', - '#define d2i_X509_CERT_AUX GRPC_SHADOW_d2i_X509_CERT_AUX', - '#define d2i_X509_CINF GRPC_SHADOW_d2i_X509_CINF', - '#define d2i_X509_CRL GRPC_SHADOW_d2i_X509_CRL', - '#define d2i_X509_CRL_bio GRPC_SHADOW_d2i_X509_CRL_bio', - '#define d2i_X509_CRL_fp GRPC_SHADOW_d2i_X509_CRL_fp', - '#define d2i_X509_CRL_INFO GRPC_SHADOW_d2i_X509_CRL_INFO', - '#define d2i_X509_EXTENSION GRPC_SHADOW_d2i_X509_EXTENSION', - '#define d2i_X509_EXTENSIONS GRPC_SHADOW_d2i_X509_EXTENSIONS', - '#define d2i_X509_fp GRPC_SHADOW_d2i_X509_fp', - '#define d2i_X509_NAME GRPC_SHADOW_d2i_X509_NAME', - '#define d2i_X509_NAME_ENTRY GRPC_SHADOW_d2i_X509_NAME_ENTRY', - '#define d2i_X509_PUBKEY GRPC_SHADOW_d2i_X509_PUBKEY', - '#define d2i_X509_REQ GRPC_SHADOW_d2i_X509_REQ', - '#define d2i_X509_REQ_bio GRPC_SHADOW_d2i_X509_REQ_bio', - '#define d2i_X509_REQ_fp GRPC_SHADOW_d2i_X509_REQ_fp', - '#define d2i_X509_REQ_INFO GRPC_SHADOW_d2i_X509_REQ_INFO', - '#define d2i_X509_REVOKED GRPC_SHADOW_d2i_X509_REVOKED', - '#define d2i_X509_SIG GRPC_SHADOW_d2i_X509_SIG', - '#define d2i_X509_VAL GRPC_SHADOW_d2i_X509_VAL', - '#define DES_decrypt3 GRPC_SHADOW_DES_decrypt3', - '#define DES_ecb3_encrypt GRPC_SHADOW_DES_ecb3_encrypt', - '#define DES_ecb_encrypt GRPC_SHADOW_DES_ecb_encrypt', - '#define DES_ede2_cbc_encrypt GRPC_SHADOW_DES_ede2_cbc_encrypt', - '#define DES_ede3_cbc_encrypt GRPC_SHADOW_DES_ede3_cbc_encrypt', - '#define DES_encrypt3 GRPC_SHADOW_DES_encrypt3', - '#define DES_ncbc_encrypt GRPC_SHADOW_DES_ncbc_encrypt', - '#define DES_set_key GRPC_SHADOW_DES_set_key', - '#define DES_set_key_unchecked GRPC_SHADOW_DES_set_key_unchecked', - '#define DES_set_odd_parity GRPC_SHADOW_DES_set_odd_parity', - '#define DH_check GRPC_SHADOW_DH_check', - '#define DH_check_pub_key GRPC_SHADOW_DH_check_pub_key', - '#define DH_compute_key GRPC_SHADOW_DH_compute_key', - '#define DH_free GRPC_SHADOW_DH_free', - '#define DH_generate_key GRPC_SHADOW_DH_generate_key', - '#define DH_generate_parameters_ex GRPC_SHADOW_DH_generate_parameters_ex', - '#define DH_get0_key GRPC_SHADOW_DH_get0_key', - '#define DH_get0_pqg GRPC_SHADOW_DH_get0_pqg', - '#define DH_get_ex_data GRPC_SHADOW_DH_get_ex_data', - '#define DH_get_ex_new_index GRPC_SHADOW_DH_get_ex_new_index', - '#define DH_marshal_parameters GRPC_SHADOW_DH_marshal_parameters', - '#define DH_new GRPC_SHADOW_DH_new', - '#define DH_num_bits GRPC_SHADOW_DH_num_bits', - '#define DHparams_dup GRPC_SHADOW_DHparams_dup', - '#define DH_parse_parameters GRPC_SHADOW_DH_parse_parameters', - '#define DH_set0_key GRPC_SHADOW_DH_set0_key', - '#define DH_set0_pqg GRPC_SHADOW_DH_set0_pqg', - '#define DH_set_ex_data GRPC_SHADOW_DH_set_ex_data', - '#define DH_size GRPC_SHADOW_DH_size', - '#define DH_up_ref GRPC_SHADOW_DH_up_ref', - '#define DIRECTORYSTRING_free GRPC_SHADOW_DIRECTORYSTRING_free', - '#define DIRECTORYSTRING_it GRPC_SHADOW_DIRECTORYSTRING_it', - '#define DIRECTORYSTRING_new GRPC_SHADOW_DIRECTORYSTRING_new', - '#define DISPLAYTEXT_free GRPC_SHADOW_DISPLAYTEXT_free', - '#define DISPLAYTEXT_it GRPC_SHADOW_DISPLAYTEXT_it', - '#define DISPLAYTEXT_new GRPC_SHADOW_DISPLAYTEXT_new', - '#define DIST_POINT_free GRPC_SHADOW_DIST_POINT_free', - '#define DIST_POINT_it GRPC_SHADOW_DIST_POINT_it', - '#define DIST_POINT_NAME_free GRPC_SHADOW_DIST_POINT_NAME_free', - '#define DIST_POINT_NAME_it GRPC_SHADOW_DIST_POINT_NAME_it', - '#define DIST_POINT_NAME_new GRPC_SHADOW_DIST_POINT_NAME_new', - '#define DIST_POINT_new GRPC_SHADOW_DIST_POINT_new', - '#define DIST_POINT_set_dpname GRPC_SHADOW_DIST_POINT_set_dpname', - '#define dsa_asn1_meth GRPC_SHADOW_dsa_asn1_meth', - '#define DSA_check_signature GRPC_SHADOW_DSA_check_signature', - '#define DSA_do_check_signature GRPC_SHADOW_DSA_do_check_signature', - '#define DSA_do_sign GRPC_SHADOW_DSA_do_sign', - '#define DSA_do_verify GRPC_SHADOW_DSA_do_verify', - '#define DSA_dup_DH GRPC_SHADOW_DSA_dup_DH', - '#define DSA_free GRPC_SHADOW_DSA_free', - '#define DSA_generate_key GRPC_SHADOW_DSA_generate_key', - '#define DSA_generate_parameters_ex GRPC_SHADOW_DSA_generate_parameters_ex', - '#define DSA_get0_key GRPC_SHADOW_DSA_get0_key', - '#define DSA_get0_pqg GRPC_SHADOW_DSA_get0_pqg', - '#define DSA_get_ex_data GRPC_SHADOW_DSA_get_ex_data', - '#define DSA_get_ex_new_index GRPC_SHADOW_DSA_get_ex_new_index', - '#define DSA_marshal_parameters GRPC_SHADOW_DSA_marshal_parameters', - '#define DSA_marshal_private_key GRPC_SHADOW_DSA_marshal_private_key', - '#define DSA_marshal_public_key GRPC_SHADOW_DSA_marshal_public_key', - '#define DSA_new GRPC_SHADOW_DSA_new', - '#define DSAparams_dup GRPC_SHADOW_DSAparams_dup', - '#define DSA_parse_parameters GRPC_SHADOW_DSA_parse_parameters', - '#define DSA_parse_private_key GRPC_SHADOW_DSA_parse_private_key', - '#define DSA_parse_public_key GRPC_SHADOW_DSA_parse_public_key', - '#define DSA_set0_key GRPC_SHADOW_DSA_set0_key', - '#define DSA_set0_pqg GRPC_SHADOW_DSA_set0_pqg', - '#define DSA_set_ex_data GRPC_SHADOW_DSA_set_ex_data', - '#define DSA_SIG_free GRPC_SHADOW_DSA_SIG_free', - '#define DSA_SIG_marshal GRPC_SHADOW_DSA_SIG_marshal', - '#define DSA_sign GRPC_SHADOW_DSA_sign', - '#define DSA_SIG_new GRPC_SHADOW_DSA_SIG_new', - '#define DSA_SIG_parse GRPC_SHADOW_DSA_SIG_parse', - '#define DSA_size GRPC_SHADOW_DSA_size', - '#define DSA_up_ref GRPC_SHADOW_DSA_up_ref', - '#define DSA_verify GRPC_SHADOW_DSA_verify', - '#define DTLS_client_method GRPC_SHADOW_DTLS_client_method', - '#define DTLS_method GRPC_SHADOW_DTLS_method', - '#define DTLS_server_method GRPC_SHADOW_DTLS_server_method', - '#define DTLSv1_2_client_method GRPC_SHADOW_DTLSv1_2_client_method', - '#define DTLSv1_2_method GRPC_SHADOW_DTLSv1_2_method', - '#define DTLSv1_2_server_method GRPC_SHADOW_DTLSv1_2_server_method', - '#define DTLSv1_client_method GRPC_SHADOW_DTLSv1_client_method', - '#define DTLSv1_get_timeout GRPC_SHADOW_DTLSv1_get_timeout', - '#define DTLSv1_handle_timeout GRPC_SHADOW_DTLSv1_handle_timeout', - '#define DTLSv1_method GRPC_SHADOW_DTLSv1_method', - '#define DTLSv1_server_method GRPC_SHADOW_DTLSv1_server_method', - '#define DTLSv1_set_initial_timeout_duration GRPC_SHADOW_DTLSv1_set_initial_timeout_duration', - '#define DTLS_with_buffers_method GRPC_SHADOW_DTLS_with_buffers_method', - '#define ec_asn1_meth GRPC_SHADOW_ec_asn1_meth', - '#define ec_bignum_to_felem GRPC_SHADOW_ec_bignum_to_felem', - '#define ec_bignum_to_scalar GRPC_SHADOW_ec_bignum_to_scalar', - '#define ec_cmp_x_coordinate GRPC_SHADOW_ec_cmp_x_coordinate', - '#define ec_compute_wNAF GRPC_SHADOW_ec_compute_wNAF', - '#define EC_curve_nid2nist GRPC_SHADOW_EC_curve_nid2nist', - '#define EC_curve_nist2nid GRPC_SHADOW_EC_curve_nist2nid', - '#define ECDH_compute_key GRPC_SHADOW_ECDH_compute_key', - '#define ECDH_compute_key_fips GRPC_SHADOW_ECDH_compute_key_fips', - '#define ECDSA_do_sign GRPC_SHADOW_ECDSA_do_sign', - '#define ECDSA_do_verify GRPC_SHADOW_ECDSA_do_verify', - '#define ECDSA_SIG_free GRPC_SHADOW_ECDSA_SIG_free', - '#define ECDSA_SIG_from_bytes GRPC_SHADOW_ECDSA_SIG_from_bytes', - '#define ECDSA_SIG_get0 GRPC_SHADOW_ECDSA_SIG_get0', - '#define ECDSA_SIG_marshal GRPC_SHADOW_ECDSA_SIG_marshal', - '#define ECDSA_SIG_max_len GRPC_SHADOW_ECDSA_SIG_max_len', - '#define ECDSA_sign GRPC_SHADOW_ECDSA_sign', - '#define ECDSA_SIG_new GRPC_SHADOW_ECDSA_SIG_new', - '#define ECDSA_SIG_parse GRPC_SHADOW_ECDSA_SIG_parse', - '#define ECDSA_SIG_set0 GRPC_SHADOW_ECDSA_SIG_set0', - '#define ECDSA_SIG_to_bytes GRPC_SHADOW_ECDSA_SIG_to_bytes', - '#define ECDSA_size GRPC_SHADOW_ECDSA_size', - '#define ECDSA_verify GRPC_SHADOW_ECDSA_verify', - '#define ec_felem_add GRPC_SHADOW_ec_felem_add', - '#define ec_felem_equal GRPC_SHADOW_ec_felem_equal', - '#define ec_felem_neg GRPC_SHADOW_ec_felem_neg', - '#define ec_felem_non_zero_mask GRPC_SHADOW_ec_felem_non_zero_mask', - '#define ec_felem_select GRPC_SHADOW_ec_felem_select', - '#define ec_felem_sub GRPC_SHADOW_ec_felem_sub', - '#define ec_felem_to_bignum GRPC_SHADOW_ec_felem_to_bignum', - '#define EC_get_builtin_curves GRPC_SHADOW_EC_get_builtin_curves', - '#define ec_get_x_coordinate_as_scalar GRPC_SHADOW_ec_get_x_coordinate_as_scalar', - '#define ec_GFp_mont_add GRPC_SHADOW_ec_GFp_mont_add', - '#define ec_GFp_mont_bignum_to_felem GRPC_SHADOW_ec_GFp_mont_bignum_to_felem', - '#define ec_GFp_mont_dbl GRPC_SHADOW_ec_GFp_mont_dbl', - '#define ec_GFp_mont_felem_mul GRPC_SHADOW_ec_GFp_mont_felem_mul', - '#define ec_GFp_mont_felem_sqr GRPC_SHADOW_ec_GFp_mont_felem_sqr', - '#define ec_GFp_mont_felem_to_bignum GRPC_SHADOW_ec_GFp_mont_felem_to_bignum', - '#define ec_GFp_mont_group_finish GRPC_SHADOW_ec_GFp_mont_group_finish', - '#define ec_GFp_mont_group_init GRPC_SHADOW_ec_GFp_mont_group_init', - '#define ec_GFp_mont_group_set_curve GRPC_SHADOW_ec_GFp_mont_group_set_curve', - '#define EC_GFp_mont_method GRPC_SHADOW_EC_GFp_mont_method', - '#define ec_GFp_mont_mul GRPC_SHADOW_ec_GFp_mont_mul', - '#define ec_GFp_mont_mul_base GRPC_SHADOW_ec_GFp_mont_mul_base', - '#define ec_GFp_mont_mul_public GRPC_SHADOW_ec_GFp_mont_mul_public', - '#define EC_GFp_nistp224_method GRPC_SHADOW_EC_GFp_nistp224_method', - '#define EC_GFp_nistp256_method GRPC_SHADOW_EC_GFp_nistp256_method', - '#define ec_GFp_nistp_recode_scalar_bits GRPC_SHADOW_ec_GFp_nistp_recode_scalar_bits', - '#define EC_GFp_nistz256_method GRPC_SHADOW_EC_GFp_nistz256_method', - '#define ec_GFp_simple_cmp GRPC_SHADOW_ec_GFp_simple_cmp', - '#define ec_GFp_simple_cmp_x_coordinate GRPC_SHADOW_ec_GFp_simple_cmp_x_coordinate', - '#define ec_GFp_simple_group_finish GRPC_SHADOW_ec_GFp_simple_group_finish', - '#define ec_GFp_simple_group_get_curve GRPC_SHADOW_ec_GFp_simple_group_get_curve', - '#define ec_GFp_simple_group_init GRPC_SHADOW_ec_GFp_simple_group_init', - '#define ec_GFp_simple_group_set_curve GRPC_SHADOW_ec_GFp_simple_group_set_curve', - '#define ec_GFp_simple_invert GRPC_SHADOW_ec_GFp_simple_invert', - '#define ec_GFp_simple_is_at_infinity GRPC_SHADOW_ec_GFp_simple_is_at_infinity', - '#define ec_GFp_simple_is_on_curve GRPC_SHADOW_ec_GFp_simple_is_on_curve', - '#define ec_GFp_simple_mont_inv_mod_ord_vartime GRPC_SHADOW_ec_GFp_simple_mont_inv_mod_ord_vartime', - '#define ec_GFp_simple_point_copy GRPC_SHADOW_ec_GFp_simple_point_copy', - '#define ec_GFp_simple_point_init GRPC_SHADOW_ec_GFp_simple_point_init', - '#define ec_GFp_simple_point_set_affine_coordinates GRPC_SHADOW_ec_GFp_simple_point_set_affine_coordinates', - '#define ec_GFp_simple_point_set_to_infinity GRPC_SHADOW_ec_GFp_simple_point_set_to_infinity', - '#define EC_GROUP_cmp GRPC_SHADOW_EC_GROUP_cmp', - '#define EC_GROUP_dup GRPC_SHADOW_EC_GROUP_dup', - '#define EC_GROUP_free GRPC_SHADOW_EC_GROUP_free', - '#define EC_GROUP_get0_generator GRPC_SHADOW_EC_GROUP_get0_generator', - '#define EC_GROUP_get0_order GRPC_SHADOW_EC_GROUP_get0_order', - '#define EC_GROUP_get_cofactor GRPC_SHADOW_EC_GROUP_get_cofactor', - '#define EC_GROUP_get_curve_GFp GRPC_SHADOW_EC_GROUP_get_curve_GFp', - '#define EC_GROUP_get_curve_name GRPC_SHADOW_EC_GROUP_get_curve_name', - '#define EC_GROUP_get_degree GRPC_SHADOW_EC_GROUP_get_degree', - '#define EC_GROUP_get_order GRPC_SHADOW_EC_GROUP_get_order', - '#define EC_GROUP_method_of GRPC_SHADOW_EC_GROUP_method_of', - '#define ec_group_new GRPC_SHADOW_ec_group_new', - '#define EC_GROUP_new_by_curve_name GRPC_SHADOW_EC_GROUP_new_by_curve_name', - '#define EC_GROUP_new_curve_GFp GRPC_SHADOW_EC_GROUP_new_curve_GFp', - '#define EC_GROUP_order_bits GRPC_SHADOW_EC_GROUP_order_bits', - '#define EC_GROUP_set_asn1_flag GRPC_SHADOW_EC_GROUP_set_asn1_flag', - '#define EC_GROUP_set_generator GRPC_SHADOW_EC_GROUP_set_generator', - '#define EC_GROUP_set_point_conversion_form GRPC_SHADOW_EC_GROUP_set_point_conversion_form', - '#define EC_KEY_check_fips GRPC_SHADOW_EC_KEY_check_fips', - '#define EC_KEY_check_key GRPC_SHADOW_EC_KEY_check_key', - '#define EC_KEY_derive_from_secret GRPC_SHADOW_EC_KEY_derive_from_secret', - '#define EC_KEY_dup GRPC_SHADOW_EC_KEY_dup', - '#define EC_KEY_free GRPC_SHADOW_EC_KEY_free', - '#define EC_KEY_generate_key GRPC_SHADOW_EC_KEY_generate_key', - '#define EC_KEY_generate_key_fips GRPC_SHADOW_EC_KEY_generate_key_fips', - '#define EC_KEY_get0_group GRPC_SHADOW_EC_KEY_get0_group', - '#define EC_KEY_get0_private_key GRPC_SHADOW_EC_KEY_get0_private_key', - '#define EC_KEY_get0_public_key GRPC_SHADOW_EC_KEY_get0_public_key', - '#define EC_KEY_get_conv_form GRPC_SHADOW_EC_KEY_get_conv_form', - '#define EC_KEY_get_enc_flags GRPC_SHADOW_EC_KEY_get_enc_flags', - '#define EC_KEY_get_ex_data GRPC_SHADOW_EC_KEY_get_ex_data', - '#define EC_KEY_get_ex_new_index GRPC_SHADOW_EC_KEY_get_ex_new_index', - '#define EC_KEY_is_opaque GRPC_SHADOW_EC_KEY_is_opaque', - '#define EC_KEY_key2buf GRPC_SHADOW_EC_KEY_key2buf', - '#define EC_KEY_marshal_curve_name GRPC_SHADOW_EC_KEY_marshal_curve_name', - '#define EC_KEY_marshal_private_key GRPC_SHADOW_EC_KEY_marshal_private_key', - '#define EC_KEY_new GRPC_SHADOW_EC_KEY_new', - '#define EC_KEY_new_by_curve_name GRPC_SHADOW_EC_KEY_new_by_curve_name', - '#define EC_KEY_new_method GRPC_SHADOW_EC_KEY_new_method', - '#define EC_KEY_parse_curve_name GRPC_SHADOW_EC_KEY_parse_curve_name', - '#define EC_KEY_parse_parameters GRPC_SHADOW_EC_KEY_parse_parameters', - '#define EC_KEY_parse_private_key GRPC_SHADOW_EC_KEY_parse_private_key', - '#define EC_KEY_set_asn1_flag GRPC_SHADOW_EC_KEY_set_asn1_flag', - '#define EC_KEY_set_conv_form GRPC_SHADOW_EC_KEY_set_conv_form', - '#define EC_KEY_set_enc_flags GRPC_SHADOW_EC_KEY_set_enc_flags', - '#define EC_KEY_set_ex_data GRPC_SHADOW_EC_KEY_set_ex_data', - '#define EC_KEY_set_group GRPC_SHADOW_EC_KEY_set_group', - '#define EC_KEY_set_private_key GRPC_SHADOW_EC_KEY_set_private_key', - '#define EC_KEY_set_public_key GRPC_SHADOW_EC_KEY_set_public_key', - '#define EC_KEY_set_public_key_affine_coordinates GRPC_SHADOW_EC_KEY_set_public_key_affine_coordinates', - '#define EC_KEY_up_ref GRPC_SHADOW_EC_KEY_up_ref', - '#define EC_METHOD_get_field_type GRPC_SHADOW_EC_METHOD_get_field_type', - '#define ec_pkey_meth GRPC_SHADOW_ec_pkey_meth', - '#define ecp_nistz256_avx2_select_w7 GRPC_SHADOW_ecp_nistz256_avx2_select_w7', - '#define ecp_nistz256_mul_mont GRPC_SHADOW_ecp_nistz256_mul_mont', - '#define ecp_nistz256_neg GRPC_SHADOW_ecp_nistz256_neg', - '#define ecp_nistz256_ord_mul_mont GRPC_SHADOW_ecp_nistz256_ord_mul_mont', - '#define ecp_nistz256_ord_sqr_mont GRPC_SHADOW_ecp_nistz256_ord_sqr_mont', - '#define ecp_nistz256_point_add GRPC_SHADOW_ecp_nistz256_point_add', - '#define ecp_nistz256_point_add_affine GRPC_SHADOW_ecp_nistz256_point_add_affine', - '#define ecp_nistz256_point_double GRPC_SHADOW_ecp_nistz256_point_double', - '#define ecp_nistz256_select_w5 GRPC_SHADOW_ecp_nistz256_select_w5', - '#define ecp_nistz256_select_w7 GRPC_SHADOW_ecp_nistz256_select_w7', - '#define ecp_nistz256_sqr_mont GRPC_SHADOW_ecp_nistz256_sqr_mont', - '#define EC_POINT_add GRPC_SHADOW_EC_POINT_add', - '#define EC_POINT_clear_free GRPC_SHADOW_EC_POINT_clear_free', - '#define EC_POINT_cmp GRPC_SHADOW_EC_POINT_cmp', - '#define EC_POINT_copy GRPC_SHADOW_EC_POINT_copy', - '#define EC_POINT_dbl GRPC_SHADOW_EC_POINT_dbl', - '#define EC_POINT_dup GRPC_SHADOW_EC_POINT_dup', - '#define EC_POINT_free GRPC_SHADOW_EC_POINT_free', - '#define ec_point_get_affine_coordinate_bytes GRPC_SHADOW_ec_point_get_affine_coordinate_bytes', - '#define EC_POINT_get_affine_coordinates_GFp GRPC_SHADOW_EC_POINT_get_affine_coordinates_GFp', - '#define EC_POINT_invert GRPC_SHADOW_EC_POINT_invert', - '#define EC_POINT_is_at_infinity GRPC_SHADOW_EC_POINT_is_at_infinity', - '#define EC_POINT_is_on_curve GRPC_SHADOW_EC_POINT_is_on_curve', - '#define EC_POINT_mul GRPC_SHADOW_EC_POINT_mul', - '#define ec_point_mul_scalar GRPC_SHADOW_ec_point_mul_scalar', - '#define ec_point_mul_scalar_base GRPC_SHADOW_ec_point_mul_scalar_base', - '#define ec_point_mul_scalar_public GRPC_SHADOW_ec_point_mul_scalar_public', - '#define EC_POINT_new GRPC_SHADOW_EC_POINT_new', - '#define EC_POINT_oct2point GRPC_SHADOW_EC_POINT_oct2point', - '#define EC_POINT_point2cbb GRPC_SHADOW_EC_POINT_point2cbb', - '#define EC_POINT_point2oct GRPC_SHADOW_EC_POINT_point2oct', - '#define EC_POINT_set_affine_coordinates_GFp GRPC_SHADOW_EC_POINT_set_affine_coordinates_GFp', - '#define EC_POINT_set_compressed_coordinates_GFp GRPC_SHADOW_EC_POINT_set_compressed_coordinates_GFp', - '#define EC_POINT_set_to_infinity GRPC_SHADOW_EC_POINT_set_to_infinity', - '#define ec_random_nonzero_scalar GRPC_SHADOW_ec_random_nonzero_scalar', - '#define ec_scalar_add GRPC_SHADOW_ec_scalar_add', - '#define ec_scalar_equal_vartime GRPC_SHADOW_ec_scalar_equal_vartime', - '#define ec_scalar_from_montgomery GRPC_SHADOW_ec_scalar_from_montgomery', - '#define ec_scalar_inv_montgomery GRPC_SHADOW_ec_scalar_inv_montgomery', - '#define ec_scalar_inv_montgomery_vartime GRPC_SHADOW_ec_scalar_inv_montgomery_vartime', - '#define ec_scalar_is_zero GRPC_SHADOW_ec_scalar_is_zero', - '#define ec_scalar_mul_montgomery GRPC_SHADOW_ec_scalar_mul_montgomery', - '#define ec_scalar_to_montgomery GRPC_SHADOW_ec_scalar_to_montgomery', - '#define ec_simple_scalar_inv_montgomery GRPC_SHADOW_ec_simple_scalar_inv_montgomery', - '#define ed25519_asn1_meth GRPC_SHADOW_ed25519_asn1_meth', - '#define ED25519_keypair GRPC_SHADOW_ED25519_keypair', - '#define ED25519_keypair_from_seed GRPC_SHADOW_ED25519_keypair_from_seed', - '#define ed25519_pkey_meth GRPC_SHADOW_ed25519_pkey_meth', - '#define ED25519_sign GRPC_SHADOW_ED25519_sign', - '#define ED25519_verify GRPC_SHADOW_ED25519_verify', - '#define EDIPARTYNAME_free GRPC_SHADOW_EDIPARTYNAME_free', - '#define EDIPARTYNAME_it GRPC_SHADOW_EDIPARTYNAME_it', - '#define EDIPARTYNAME_new GRPC_SHADOW_EDIPARTYNAME_new', - '#define ENGINE_free GRPC_SHADOW_ENGINE_free', - '#define ENGINE_get_ECDSA_method GRPC_SHADOW_ENGINE_get_ECDSA_method', - '#define ENGINE_get_RSA_method GRPC_SHADOW_ENGINE_get_RSA_method', - '#define ENGINE_load_builtin_engines GRPC_SHADOW_ENGINE_load_builtin_engines', - '#define ENGINE_new GRPC_SHADOW_ENGINE_new', - '#define ENGINE_register_all_complete GRPC_SHADOW_ENGINE_register_all_complete', - '#define ENGINE_set_ECDSA_method GRPC_SHADOW_ENGINE_set_ECDSA_method', - '#define ENGINE_set_RSA_method GRPC_SHADOW_ENGINE_set_RSA_method', - '#define ERR_add_error_data GRPC_SHADOW_ERR_add_error_data', - '#define ERR_add_error_dataf GRPC_SHADOW_ERR_add_error_dataf', - '#define ERR_clear_error GRPC_SHADOW_ERR_clear_error', - '#define ERR_clear_system_error GRPC_SHADOW_ERR_clear_system_error', - '#define ERR_error_string GRPC_SHADOW_ERR_error_string', - '#define ERR_error_string_n GRPC_SHADOW_ERR_error_string_n', - '#define ERR_free_strings GRPC_SHADOW_ERR_free_strings', - '#define ERR_func_error_string GRPC_SHADOW_ERR_func_error_string', - '#define ERR_get_error GRPC_SHADOW_ERR_get_error', - '#define ERR_get_error_line GRPC_SHADOW_ERR_get_error_line', - '#define ERR_get_error_line_data GRPC_SHADOW_ERR_get_error_line_data', - '#define ERR_get_next_error_library GRPC_SHADOW_ERR_get_next_error_library', - '#define ERR_lib_error_string GRPC_SHADOW_ERR_lib_error_string', - '#define ERR_load_BIO_strings GRPC_SHADOW_ERR_load_BIO_strings', - '#define ERR_load_crypto_strings GRPC_SHADOW_ERR_load_crypto_strings', - '#define ERR_load_ERR_strings GRPC_SHADOW_ERR_load_ERR_strings', - '#define ERR_load_RAND_strings GRPC_SHADOW_ERR_load_RAND_strings', - '#define ERR_load_SSL_strings GRPC_SHADOW_ERR_load_SSL_strings', - '#define ERR_peek_error GRPC_SHADOW_ERR_peek_error', - '#define ERR_peek_error_line GRPC_SHADOW_ERR_peek_error_line', - '#define ERR_peek_error_line_data GRPC_SHADOW_ERR_peek_error_line_data', - '#define ERR_peek_last_error GRPC_SHADOW_ERR_peek_last_error', - '#define ERR_peek_last_error_line GRPC_SHADOW_ERR_peek_last_error_line', - '#define ERR_peek_last_error_line_data GRPC_SHADOW_ERR_peek_last_error_line_data', - '#define ERR_pop_to_mark GRPC_SHADOW_ERR_pop_to_mark', - '#define ERR_print_errors GRPC_SHADOW_ERR_print_errors', - '#define ERR_print_errors_cb GRPC_SHADOW_ERR_print_errors_cb', - '#define ERR_print_errors_fp GRPC_SHADOW_ERR_print_errors_fp', - '#define ERR_put_error GRPC_SHADOW_ERR_put_error', - '#define ERR_reason_error_string GRPC_SHADOW_ERR_reason_error_string', - '#define ERR_remove_state GRPC_SHADOW_ERR_remove_state', - '#define ERR_remove_thread_state GRPC_SHADOW_ERR_remove_thread_state', - '#define ERR_restore_state GRPC_SHADOW_ERR_restore_state', - '#define ERR_save_state GRPC_SHADOW_ERR_save_state', - '#define ERR_SAVE_STATE_free GRPC_SHADOW_ERR_SAVE_STATE_free', - '#define ERR_set_mark GRPC_SHADOW_ERR_set_mark', - '#define EVP_add_cipher_alias GRPC_SHADOW_EVP_add_cipher_alias', - '#define EVP_add_digest GRPC_SHADOW_EVP_add_digest', - '#define EVP_aead_aes_128_cbc_sha1_tls GRPC_SHADOW_EVP_aead_aes_128_cbc_sha1_tls', - '#define EVP_aead_aes_128_cbc_sha1_tls_implicit_iv GRPC_SHADOW_EVP_aead_aes_128_cbc_sha1_tls_implicit_iv', - '#define EVP_aead_aes_128_cbc_sha256_tls GRPC_SHADOW_EVP_aead_aes_128_cbc_sha256_tls', - '#define EVP_aead_aes_128_ccm_bluetooth GRPC_SHADOW_EVP_aead_aes_128_ccm_bluetooth', - '#define EVP_aead_aes_128_ccm_bluetooth_8 GRPC_SHADOW_EVP_aead_aes_128_ccm_bluetooth_8', - '#define EVP_aead_aes_128_ctr_hmac_sha256 GRPC_SHADOW_EVP_aead_aes_128_ctr_hmac_sha256', - '#define EVP_aead_aes_128_gcm GRPC_SHADOW_EVP_aead_aes_128_gcm', - '#define EVP_aead_aes_128_gcm_siv GRPC_SHADOW_EVP_aead_aes_128_gcm_siv', - '#define EVP_aead_aes_128_gcm_tls12 GRPC_SHADOW_EVP_aead_aes_128_gcm_tls12', - '#define EVP_aead_aes_128_gcm_tls13 GRPC_SHADOW_EVP_aead_aes_128_gcm_tls13', - '#define EVP_aead_aes_192_gcm GRPC_SHADOW_EVP_aead_aes_192_gcm', - '#define EVP_aead_aes_256_cbc_sha1_tls GRPC_SHADOW_EVP_aead_aes_256_cbc_sha1_tls', - '#define EVP_aead_aes_256_cbc_sha1_tls_implicit_iv GRPC_SHADOW_EVP_aead_aes_256_cbc_sha1_tls_implicit_iv', - '#define EVP_aead_aes_256_cbc_sha256_tls GRPC_SHADOW_EVP_aead_aes_256_cbc_sha256_tls', - '#define EVP_aead_aes_256_cbc_sha384_tls GRPC_SHADOW_EVP_aead_aes_256_cbc_sha384_tls', - '#define EVP_aead_aes_256_ctr_hmac_sha256 GRPC_SHADOW_EVP_aead_aes_256_ctr_hmac_sha256', - '#define EVP_aead_aes_256_gcm GRPC_SHADOW_EVP_aead_aes_256_gcm', - '#define EVP_aead_aes_256_gcm_siv GRPC_SHADOW_EVP_aead_aes_256_gcm_siv', - '#define EVP_aead_aes_256_gcm_tls12 GRPC_SHADOW_EVP_aead_aes_256_gcm_tls12', - '#define EVP_aead_aes_256_gcm_tls13 GRPC_SHADOW_EVP_aead_aes_256_gcm_tls13', - '#define EVP_aead_chacha20_poly1305 GRPC_SHADOW_EVP_aead_chacha20_poly1305', - '#define EVP_AEAD_CTX_aead GRPC_SHADOW_EVP_AEAD_CTX_aead', - '#define EVP_AEAD_CTX_cleanup GRPC_SHADOW_EVP_AEAD_CTX_cleanup', - '#define EVP_AEAD_CTX_free GRPC_SHADOW_EVP_AEAD_CTX_free', - '#define EVP_AEAD_CTX_get_iv GRPC_SHADOW_EVP_AEAD_CTX_get_iv', - '#define EVP_AEAD_CTX_init GRPC_SHADOW_EVP_AEAD_CTX_init', - '#define EVP_AEAD_CTX_init_with_direction GRPC_SHADOW_EVP_AEAD_CTX_init_with_direction', - '#define EVP_AEAD_CTX_new GRPC_SHADOW_EVP_AEAD_CTX_new', - '#define EVP_AEAD_CTX_open GRPC_SHADOW_EVP_AEAD_CTX_open', - '#define EVP_AEAD_CTX_open_gather GRPC_SHADOW_EVP_AEAD_CTX_open_gather', - '#define EVP_AEAD_CTX_seal GRPC_SHADOW_EVP_AEAD_CTX_seal', - '#define EVP_AEAD_CTX_seal_scatter GRPC_SHADOW_EVP_AEAD_CTX_seal_scatter', - '#define EVP_AEAD_CTX_tag_len GRPC_SHADOW_EVP_AEAD_CTX_tag_len', - '#define EVP_AEAD_CTX_zero GRPC_SHADOW_EVP_AEAD_CTX_zero', - '#define EVP_aead_des_ede3_cbc_sha1_tls GRPC_SHADOW_EVP_aead_des_ede3_cbc_sha1_tls', - '#define EVP_aead_des_ede3_cbc_sha1_tls_implicit_iv GRPC_SHADOW_EVP_aead_des_ede3_cbc_sha1_tls_implicit_iv', - '#define EVP_AEAD_key_length GRPC_SHADOW_EVP_AEAD_key_length', - '#define EVP_AEAD_max_overhead GRPC_SHADOW_EVP_AEAD_max_overhead', - '#define EVP_AEAD_max_tag_len GRPC_SHADOW_EVP_AEAD_max_tag_len', - '#define EVP_AEAD_nonce_length GRPC_SHADOW_EVP_AEAD_nonce_length', - '#define EVP_aead_null_sha1_tls GRPC_SHADOW_EVP_aead_null_sha1_tls', - '#define EVP_aead_xchacha20_poly1305 GRPC_SHADOW_EVP_aead_xchacha20_poly1305', - '#define EVP_aes_128_cbc GRPC_SHADOW_EVP_aes_128_cbc', - '#define EVP_aes_128_ctr GRPC_SHADOW_EVP_aes_128_ctr', - '#define EVP_aes_128_ecb GRPC_SHADOW_EVP_aes_128_ecb', - '#define EVP_aes_128_gcm GRPC_SHADOW_EVP_aes_128_gcm', - '#define EVP_aes_128_ofb GRPC_SHADOW_EVP_aes_128_ofb', - '#define EVP_aes_192_cbc GRPC_SHADOW_EVP_aes_192_cbc', - '#define EVP_aes_192_ctr GRPC_SHADOW_EVP_aes_192_ctr', - '#define EVP_aes_192_ecb GRPC_SHADOW_EVP_aes_192_ecb', - '#define EVP_aes_192_gcm GRPC_SHADOW_EVP_aes_192_gcm', - '#define EVP_aes_192_ofb GRPC_SHADOW_EVP_aes_192_ofb', - '#define EVP_aes_256_cbc GRPC_SHADOW_EVP_aes_256_cbc', - '#define EVP_aes_256_ctr GRPC_SHADOW_EVP_aes_256_ctr', - '#define EVP_aes_256_ecb GRPC_SHADOW_EVP_aes_256_ecb', - '#define EVP_aes_256_gcm GRPC_SHADOW_EVP_aes_256_gcm', - '#define EVP_aes_256_ofb GRPC_SHADOW_EVP_aes_256_ofb', - '#define EVP_BytesToKey GRPC_SHADOW_EVP_BytesToKey', - '#define EVP_Cipher GRPC_SHADOW_EVP_Cipher', - '#define EVP_CIPHER_block_size GRPC_SHADOW_EVP_CIPHER_block_size', - '#define EVP_CIPHER_CTX_block_size GRPC_SHADOW_EVP_CIPHER_CTX_block_size', - '#define EVP_CIPHER_CTX_cipher GRPC_SHADOW_EVP_CIPHER_CTX_cipher', - '#define EVP_CIPHER_CTX_cleanup GRPC_SHADOW_EVP_CIPHER_CTX_cleanup', - '#define EVP_CIPHER_CTX_copy GRPC_SHADOW_EVP_CIPHER_CTX_copy', - '#define EVP_CIPHER_CTX_ctrl GRPC_SHADOW_EVP_CIPHER_CTX_ctrl', - '#define EVP_CIPHER_CTX_encrypting GRPC_SHADOW_EVP_CIPHER_CTX_encrypting', - '#define EVP_CIPHER_CTX_flags GRPC_SHADOW_EVP_CIPHER_CTX_flags', - '#define EVP_CIPHER_CTX_free GRPC_SHADOW_EVP_CIPHER_CTX_free', - '#define EVP_CIPHER_CTX_get_app_data GRPC_SHADOW_EVP_CIPHER_CTX_get_app_data', - '#define EVP_CIPHER_CTX_init GRPC_SHADOW_EVP_CIPHER_CTX_init', - '#define EVP_CIPHER_CTX_iv_length GRPC_SHADOW_EVP_CIPHER_CTX_iv_length', - '#define EVP_CIPHER_CTX_key_length GRPC_SHADOW_EVP_CIPHER_CTX_key_length', - '#define EVP_CIPHER_CTX_mode GRPC_SHADOW_EVP_CIPHER_CTX_mode', - '#define EVP_CIPHER_CTX_new GRPC_SHADOW_EVP_CIPHER_CTX_new', - '#define EVP_CIPHER_CTX_nid GRPC_SHADOW_EVP_CIPHER_CTX_nid', - '#define EVP_CIPHER_CTX_reset GRPC_SHADOW_EVP_CIPHER_CTX_reset', - '#define EVP_CIPHER_CTX_set_app_data GRPC_SHADOW_EVP_CIPHER_CTX_set_app_data', - '#define EVP_CIPHER_CTX_set_flags GRPC_SHADOW_EVP_CIPHER_CTX_set_flags', - '#define EVP_CIPHER_CTX_set_key_length GRPC_SHADOW_EVP_CIPHER_CTX_set_key_length', - '#define EVP_CIPHER_CTX_set_padding GRPC_SHADOW_EVP_CIPHER_CTX_set_padding', - '#define EVP_CipherFinal_ex GRPC_SHADOW_EVP_CipherFinal_ex', - '#define EVP_CIPHER_flags GRPC_SHADOW_EVP_CIPHER_flags', - '#define EVP_CipherInit GRPC_SHADOW_EVP_CipherInit', - '#define EVP_CipherInit_ex GRPC_SHADOW_EVP_CipherInit_ex', - '#define EVP_CIPHER_iv_length GRPC_SHADOW_EVP_CIPHER_iv_length', - '#define EVP_CIPHER_key_length GRPC_SHADOW_EVP_CIPHER_key_length', - '#define EVP_CIPHER_mode GRPC_SHADOW_EVP_CIPHER_mode', - '#define EVP_CIPHER_nid GRPC_SHADOW_EVP_CIPHER_nid', - '#define EVP_CipherUpdate GRPC_SHADOW_EVP_CipherUpdate', - '#define EVP_cleanup GRPC_SHADOW_EVP_cleanup', - '#define EVP_DecodeBase64 GRPC_SHADOW_EVP_DecodeBase64', - '#define EVP_DecodeBlock GRPC_SHADOW_EVP_DecodeBlock', - '#define EVP_DecodedLength GRPC_SHADOW_EVP_DecodedLength', - '#define EVP_DecodeFinal GRPC_SHADOW_EVP_DecodeFinal', - '#define EVP_DecodeInit GRPC_SHADOW_EVP_DecodeInit', - '#define EVP_DecodeUpdate GRPC_SHADOW_EVP_DecodeUpdate', - '#define EVP_DecryptFinal_ex GRPC_SHADOW_EVP_DecryptFinal_ex', - '#define EVP_DecryptInit GRPC_SHADOW_EVP_DecryptInit', - '#define EVP_DecryptInit_ex GRPC_SHADOW_EVP_DecryptInit_ex', - '#define EVP_DecryptUpdate GRPC_SHADOW_EVP_DecryptUpdate', - '#define EVP_des_cbc GRPC_SHADOW_EVP_des_cbc', - '#define EVP_des_ecb GRPC_SHADOW_EVP_des_ecb', - '#define EVP_des_ede GRPC_SHADOW_EVP_des_ede', - '#define EVP_des_ede3 GRPC_SHADOW_EVP_des_ede3', - '#define EVP_des_ede3_cbc GRPC_SHADOW_EVP_des_ede3_cbc', - '#define EVP_des_ede3_ecb GRPC_SHADOW_EVP_des_ede3_ecb', - '#define EVP_des_ede_cbc GRPC_SHADOW_EVP_des_ede_cbc', - '#define EVP_Digest GRPC_SHADOW_EVP_Digest', - '#define EVP_DigestFinal GRPC_SHADOW_EVP_DigestFinal', - '#define EVP_DigestFinal_ex GRPC_SHADOW_EVP_DigestFinal_ex', - '#define EVP_DigestFinalXOF GRPC_SHADOW_EVP_DigestFinalXOF', - '#define EVP_DigestInit GRPC_SHADOW_EVP_DigestInit', - '#define EVP_DigestInit_ex GRPC_SHADOW_EVP_DigestInit_ex', - '#define EVP_DigestSign GRPC_SHADOW_EVP_DigestSign', - '#define EVP_DigestSignFinal GRPC_SHADOW_EVP_DigestSignFinal', - '#define EVP_DigestSignInit GRPC_SHADOW_EVP_DigestSignInit', - '#define EVP_DigestSignUpdate GRPC_SHADOW_EVP_DigestSignUpdate', - '#define EVP_DigestUpdate GRPC_SHADOW_EVP_DigestUpdate', - '#define EVP_DigestVerify GRPC_SHADOW_EVP_DigestVerify', - '#define EVP_DigestVerifyFinal GRPC_SHADOW_EVP_DigestVerifyFinal', - '#define EVP_DigestVerifyInit GRPC_SHADOW_EVP_DigestVerifyInit', - '#define EVP_DigestVerifyUpdate GRPC_SHADOW_EVP_DigestVerifyUpdate', - '#define EVP_enc_null GRPC_SHADOW_EVP_enc_null', - '#define EVP_EncodeBlock GRPC_SHADOW_EVP_EncodeBlock', - '#define EVP_EncodedLength GRPC_SHADOW_EVP_EncodedLength', - '#define EVP_EncodeFinal GRPC_SHADOW_EVP_EncodeFinal', - '#define EVP_EncodeInit GRPC_SHADOW_EVP_EncodeInit', - '#define EVP_EncodeUpdate GRPC_SHADOW_EVP_EncodeUpdate', - '#define EVP_EncryptFinal_ex GRPC_SHADOW_EVP_EncryptFinal_ex', - '#define EVP_EncryptInit GRPC_SHADOW_EVP_EncryptInit', - '#define EVP_EncryptInit_ex GRPC_SHADOW_EVP_EncryptInit_ex', - '#define EVP_EncryptUpdate GRPC_SHADOW_EVP_EncryptUpdate', - '#define EVP_get_cipherbyname GRPC_SHADOW_EVP_get_cipherbyname', - '#define EVP_get_cipherbynid GRPC_SHADOW_EVP_get_cipherbynid', - '#define EVP_get_digestbyname GRPC_SHADOW_EVP_get_digestbyname', - '#define EVP_get_digestbynid GRPC_SHADOW_EVP_get_digestbynid', - '#define EVP_get_digestbyobj GRPC_SHADOW_EVP_get_digestbyobj', - '#define EVP_has_aes_hardware GRPC_SHADOW_EVP_has_aes_hardware', - '#define EVP_marshal_digest_algorithm GRPC_SHADOW_EVP_marshal_digest_algorithm', - '#define EVP_marshal_private_key GRPC_SHADOW_EVP_marshal_private_key', - '#define EVP_marshal_public_key GRPC_SHADOW_EVP_marshal_public_key', - '#define EVP_md4 GRPC_SHADOW_EVP_md4', - '#define EVP_md5 GRPC_SHADOW_EVP_md5', - '#define EVP_md5_sha1 GRPC_SHADOW_EVP_md5_sha1', - '#define EVP_MD_block_size GRPC_SHADOW_EVP_MD_block_size', - '#define EVP_MD_CTX_block_size GRPC_SHADOW_EVP_MD_CTX_block_size', - '#define EVP_MD_CTX_cleanup GRPC_SHADOW_EVP_MD_CTX_cleanup', - '#define EVP_MD_CTX_copy GRPC_SHADOW_EVP_MD_CTX_copy', - '#define EVP_MD_CTX_copy_ex GRPC_SHADOW_EVP_MD_CTX_copy_ex', - '#define EVP_MD_CTX_create GRPC_SHADOW_EVP_MD_CTX_create', - '#define EVP_MD_CTX_destroy GRPC_SHADOW_EVP_MD_CTX_destroy', - '#define EVP_MD_CTX_free GRPC_SHADOW_EVP_MD_CTX_free', - '#define EVP_MD_CTX_init GRPC_SHADOW_EVP_MD_CTX_init', - '#define EVP_MD_CTX_md GRPC_SHADOW_EVP_MD_CTX_md', - '#define EVP_MD_CTX_new GRPC_SHADOW_EVP_MD_CTX_new', - '#define EVP_MD_CTX_reset GRPC_SHADOW_EVP_MD_CTX_reset', - '#define EVP_MD_CTX_size GRPC_SHADOW_EVP_MD_CTX_size', - '#define EVP_MD_CTX_type GRPC_SHADOW_EVP_MD_CTX_type', - '#define EVP_MD_flags GRPC_SHADOW_EVP_MD_flags', - '#define EVP_MD_meth_get_flags GRPC_SHADOW_EVP_MD_meth_get_flags', - '#define EVP_MD_size GRPC_SHADOW_EVP_MD_size', - '#define EVP_MD_type GRPC_SHADOW_EVP_MD_type', - '#define EVP_parse_digest_algorithm GRPC_SHADOW_EVP_parse_digest_algorithm', - '#define EVP_parse_private_key GRPC_SHADOW_EVP_parse_private_key', - '#define EVP_parse_public_key GRPC_SHADOW_EVP_parse_public_key', - '#define EVP_PBE_scrypt GRPC_SHADOW_EVP_PBE_scrypt', - '#define EVP_PKCS82PKEY GRPC_SHADOW_EVP_PKCS82PKEY', - '#define EVP_PKEY2PKCS8 GRPC_SHADOW_EVP_PKEY2PKCS8', - '#define EVP_PKEY_assign GRPC_SHADOW_EVP_PKEY_assign', - '#define EVP_PKEY_assign_DSA GRPC_SHADOW_EVP_PKEY_assign_DSA', - '#define EVP_PKEY_assign_EC_KEY GRPC_SHADOW_EVP_PKEY_assign_EC_KEY', - '#define EVP_PKEY_assign_RSA GRPC_SHADOW_EVP_PKEY_assign_RSA', - '#define EVP_PKEY_base_id GRPC_SHADOW_EVP_PKEY_base_id', - '#define EVP_PKEY_bits GRPC_SHADOW_EVP_PKEY_bits', - '#define EVP_PKEY_cmp GRPC_SHADOW_EVP_PKEY_cmp', - '#define EVP_PKEY_cmp_parameters GRPC_SHADOW_EVP_PKEY_cmp_parameters', - '#define EVP_PKEY_copy_parameters GRPC_SHADOW_EVP_PKEY_copy_parameters', - '#define EVP_PKEY_CTX_ctrl GRPC_SHADOW_EVP_PKEY_CTX_ctrl', - '#define EVP_PKEY_CTX_dup GRPC_SHADOW_EVP_PKEY_CTX_dup', - '#define EVP_PKEY_CTX_free GRPC_SHADOW_EVP_PKEY_CTX_free', - '#define EVP_PKEY_CTX_get0_pkey GRPC_SHADOW_EVP_PKEY_CTX_get0_pkey', - '#define EVP_PKEY_CTX_get0_rsa_oaep_label GRPC_SHADOW_EVP_PKEY_CTX_get0_rsa_oaep_label', - '#define EVP_PKEY_CTX_get_rsa_mgf1_md GRPC_SHADOW_EVP_PKEY_CTX_get_rsa_mgf1_md', - '#define EVP_PKEY_CTX_get_rsa_oaep_md GRPC_SHADOW_EVP_PKEY_CTX_get_rsa_oaep_md', - '#define EVP_PKEY_CTX_get_rsa_padding GRPC_SHADOW_EVP_PKEY_CTX_get_rsa_padding', - '#define EVP_PKEY_CTX_get_rsa_pss_saltlen GRPC_SHADOW_EVP_PKEY_CTX_get_rsa_pss_saltlen', - '#define EVP_PKEY_CTX_get_signature_md GRPC_SHADOW_EVP_PKEY_CTX_get_signature_md', - '#define EVP_PKEY_CTX_new GRPC_SHADOW_EVP_PKEY_CTX_new', - '#define EVP_PKEY_CTX_new_id GRPC_SHADOW_EVP_PKEY_CTX_new_id', - '#define EVP_PKEY_CTX_set0_rsa_oaep_label GRPC_SHADOW_EVP_PKEY_CTX_set0_rsa_oaep_label', - '#define EVP_PKEY_CTX_set_ec_param_enc GRPC_SHADOW_EVP_PKEY_CTX_set_ec_param_enc', - '#define EVP_PKEY_CTX_set_ec_paramgen_curve_nid GRPC_SHADOW_EVP_PKEY_CTX_set_ec_paramgen_curve_nid', - '#define EVP_PKEY_CTX_set_rsa_keygen_bits GRPC_SHADOW_EVP_PKEY_CTX_set_rsa_keygen_bits', - '#define EVP_PKEY_CTX_set_rsa_keygen_pubexp GRPC_SHADOW_EVP_PKEY_CTX_set_rsa_keygen_pubexp', - '#define EVP_PKEY_CTX_set_rsa_mgf1_md GRPC_SHADOW_EVP_PKEY_CTX_set_rsa_mgf1_md', - '#define EVP_PKEY_CTX_set_rsa_oaep_md GRPC_SHADOW_EVP_PKEY_CTX_set_rsa_oaep_md', - '#define EVP_PKEY_CTX_set_rsa_padding GRPC_SHADOW_EVP_PKEY_CTX_set_rsa_padding', - '#define EVP_PKEY_CTX_set_rsa_pss_keygen_md GRPC_SHADOW_EVP_PKEY_CTX_set_rsa_pss_keygen_md', - '#define EVP_PKEY_CTX_set_rsa_pss_keygen_mgf1_md GRPC_SHADOW_EVP_PKEY_CTX_set_rsa_pss_keygen_mgf1_md', - '#define EVP_PKEY_CTX_set_rsa_pss_keygen_saltlen GRPC_SHADOW_EVP_PKEY_CTX_set_rsa_pss_keygen_saltlen', - '#define EVP_PKEY_CTX_set_rsa_pss_saltlen GRPC_SHADOW_EVP_PKEY_CTX_set_rsa_pss_saltlen', - '#define EVP_PKEY_CTX_set_signature_md GRPC_SHADOW_EVP_PKEY_CTX_set_signature_md', - '#define EVP_PKEY_decrypt GRPC_SHADOW_EVP_PKEY_decrypt', - '#define EVP_PKEY_decrypt_init GRPC_SHADOW_EVP_PKEY_decrypt_init', - '#define EVP_PKEY_derive GRPC_SHADOW_EVP_PKEY_derive', - '#define EVP_PKEY_derive_init GRPC_SHADOW_EVP_PKEY_derive_init', - '#define EVP_PKEY_derive_set_peer GRPC_SHADOW_EVP_PKEY_derive_set_peer', - '#define EVP_PKEY_encrypt GRPC_SHADOW_EVP_PKEY_encrypt', - '#define EVP_PKEY_encrypt_init GRPC_SHADOW_EVP_PKEY_encrypt_init', - '#define EVP_PKEY_free GRPC_SHADOW_EVP_PKEY_free', - '#define EVP_PKEY_get0_DH GRPC_SHADOW_EVP_PKEY_get0_DH', - '#define EVP_PKEY_get0_DSA GRPC_SHADOW_EVP_PKEY_get0_DSA', - '#define EVP_PKEY_get0_EC_KEY GRPC_SHADOW_EVP_PKEY_get0_EC_KEY', - '#define EVP_PKEY_get0_RSA GRPC_SHADOW_EVP_PKEY_get0_RSA', - '#define EVP_PKEY_get1_DH GRPC_SHADOW_EVP_PKEY_get1_DH', - '#define EVP_PKEY_get1_DSA GRPC_SHADOW_EVP_PKEY_get1_DSA', - '#define EVP_PKEY_get1_EC_KEY GRPC_SHADOW_EVP_PKEY_get1_EC_KEY', - '#define EVP_PKEY_get1_RSA GRPC_SHADOW_EVP_PKEY_get1_RSA', - '#define EVP_PKEY_get1_tls_encodedpoint GRPC_SHADOW_EVP_PKEY_get1_tls_encodedpoint', - '#define EVP_PKEY_get_raw_private_key GRPC_SHADOW_EVP_PKEY_get_raw_private_key', - '#define EVP_PKEY_get_raw_public_key GRPC_SHADOW_EVP_PKEY_get_raw_public_key', - '#define EVP_PKEY_id GRPC_SHADOW_EVP_PKEY_id', - '#define EVP_PKEY_is_opaque GRPC_SHADOW_EVP_PKEY_is_opaque', - '#define EVP_PKEY_keygen GRPC_SHADOW_EVP_PKEY_keygen', - '#define EVP_PKEY_keygen_init GRPC_SHADOW_EVP_PKEY_keygen_init', - '#define EVP_PKEY_missing_parameters GRPC_SHADOW_EVP_PKEY_missing_parameters', - '#define EVP_PKEY_new GRPC_SHADOW_EVP_PKEY_new', - '#define EVP_PKEY_new_raw_private_key GRPC_SHADOW_EVP_PKEY_new_raw_private_key', - '#define EVP_PKEY_new_raw_public_key GRPC_SHADOW_EVP_PKEY_new_raw_public_key', - '#define EVP_PKEY_paramgen GRPC_SHADOW_EVP_PKEY_paramgen', - '#define EVP_PKEY_paramgen_init GRPC_SHADOW_EVP_PKEY_paramgen_init', - '#define EVP_PKEY_print_params GRPC_SHADOW_EVP_PKEY_print_params', - '#define EVP_PKEY_print_private GRPC_SHADOW_EVP_PKEY_print_private', - '#define EVP_PKEY_print_public GRPC_SHADOW_EVP_PKEY_print_public', - '#define EVP_PKEY_set1_DSA GRPC_SHADOW_EVP_PKEY_set1_DSA', - '#define EVP_PKEY_set1_EC_KEY GRPC_SHADOW_EVP_PKEY_set1_EC_KEY', - '#define EVP_PKEY_set1_RSA GRPC_SHADOW_EVP_PKEY_set1_RSA', - '#define EVP_PKEY_set1_tls_encodedpoint GRPC_SHADOW_EVP_PKEY_set1_tls_encodedpoint', - '#define EVP_PKEY_set_type GRPC_SHADOW_EVP_PKEY_set_type', - '#define EVP_PKEY_sign GRPC_SHADOW_EVP_PKEY_sign', - '#define EVP_PKEY_sign_init GRPC_SHADOW_EVP_PKEY_sign_init', - '#define EVP_PKEY_size GRPC_SHADOW_EVP_PKEY_size', - '#define EVP_PKEY_type GRPC_SHADOW_EVP_PKEY_type', - '#define EVP_PKEY_up_ref GRPC_SHADOW_EVP_PKEY_up_ref', - '#define EVP_PKEY_verify GRPC_SHADOW_EVP_PKEY_verify', - '#define EVP_PKEY_verify_init GRPC_SHADOW_EVP_PKEY_verify_init', - '#define EVP_PKEY_verify_recover GRPC_SHADOW_EVP_PKEY_verify_recover', - '#define EVP_PKEY_verify_recover_init GRPC_SHADOW_EVP_PKEY_verify_recover_init', - '#define EVP_rc2_40_cbc GRPC_SHADOW_EVP_rc2_40_cbc', - '#define EVP_rc2_cbc GRPC_SHADOW_EVP_rc2_cbc', - '#define EVP_rc4 GRPC_SHADOW_EVP_rc4', - '#define EVP_sha1 GRPC_SHADOW_EVP_sha1', - '#define EVP_sha224 GRPC_SHADOW_EVP_sha224', - '#define EVP_sha256 GRPC_SHADOW_EVP_sha256', - '#define EVP_sha384 GRPC_SHADOW_EVP_sha384', - '#define EVP_sha512 GRPC_SHADOW_EVP_sha512', - '#define EVP_SignFinal GRPC_SHADOW_EVP_SignFinal', - '#define EVP_SignInit GRPC_SHADOW_EVP_SignInit', - '#define EVP_SignInit_ex GRPC_SHADOW_EVP_SignInit_ex', - '#define EVP_SignUpdate GRPC_SHADOW_EVP_SignUpdate', - '#define EVP_tls_cbc_copy_mac GRPC_SHADOW_EVP_tls_cbc_copy_mac', - '#define EVP_tls_cbc_digest_record GRPC_SHADOW_EVP_tls_cbc_digest_record', - '#define EVP_tls_cbc_record_digest_supported GRPC_SHADOW_EVP_tls_cbc_record_digest_supported', - '#define EVP_tls_cbc_remove_padding GRPC_SHADOW_EVP_tls_cbc_remove_padding', - '#define EVP_VerifyFinal GRPC_SHADOW_EVP_VerifyFinal', - '#define EVP_VerifyInit GRPC_SHADOW_EVP_VerifyInit', - '#define EVP_VerifyInit_ex GRPC_SHADOW_EVP_VerifyInit_ex', - '#define EVP_VerifyUpdate GRPC_SHADOW_EVP_VerifyUpdate', - '#define EXTENDED_KEY_USAGE_free GRPC_SHADOW_EXTENDED_KEY_USAGE_free', - '#define EXTENDED_KEY_USAGE_it GRPC_SHADOW_EXTENDED_KEY_USAGE_it', - '#define EXTENDED_KEY_USAGE_new GRPC_SHADOW_EXTENDED_KEY_USAGE_new', - '#define FIPS_mode GRPC_SHADOW_FIPS_mode', - '#define FIPS_mode_set GRPC_SHADOW_FIPS_mode_set', - '#define gcm_ghash_avx GRPC_SHADOW_gcm_ghash_avx', - '#define gcm_ghash_clmul GRPC_SHADOW_gcm_ghash_clmul', - '#define gcm_ghash_nohw GRPC_SHADOW_gcm_ghash_nohw', - '#define gcm_ghash_ssse3 GRPC_SHADOW_gcm_ghash_ssse3', - '#define gcm_gmult_avx GRPC_SHADOW_gcm_gmult_avx', - '#define gcm_gmult_clmul GRPC_SHADOW_gcm_gmult_clmul', - '#define gcm_gmult_nohw GRPC_SHADOW_gcm_gmult_nohw', - '#define gcm_gmult_ssse3 GRPC_SHADOW_gcm_gmult_ssse3', - '#define gcm_init_avx GRPC_SHADOW_gcm_init_avx', - '#define gcm_init_clmul GRPC_SHADOW_gcm_init_clmul', - '#define gcm_init_nohw GRPC_SHADOW_gcm_init_nohw', - '#define gcm_init_ssse3 GRPC_SHADOW_gcm_init_ssse3', - '#define GENERAL_NAME_cmp GRPC_SHADOW_GENERAL_NAME_cmp', - '#define GENERAL_NAME_dup GRPC_SHADOW_GENERAL_NAME_dup', - '#define GENERAL_NAME_free GRPC_SHADOW_GENERAL_NAME_free', - '#define GENERAL_NAME_get0_otherName GRPC_SHADOW_GENERAL_NAME_get0_otherName', - '#define GENERAL_NAME_get0_value GRPC_SHADOW_GENERAL_NAME_get0_value', - '#define GENERAL_NAME_it GRPC_SHADOW_GENERAL_NAME_it', - '#define GENERAL_NAME_new GRPC_SHADOW_GENERAL_NAME_new', - '#define GENERAL_NAME_print GRPC_SHADOW_GENERAL_NAME_print', - '#define GENERAL_NAME_set0_othername GRPC_SHADOW_GENERAL_NAME_set0_othername', - '#define GENERAL_NAME_set0_value GRPC_SHADOW_GENERAL_NAME_set0_value', - '#define GENERAL_NAMES_free GRPC_SHADOW_GENERAL_NAMES_free', - '#define GENERAL_NAMES_it GRPC_SHADOW_GENERAL_NAMES_it', - '#define GENERAL_NAMES_new GRPC_SHADOW_GENERAL_NAMES_new', - '#define GENERAL_SUBTREE_free GRPC_SHADOW_GENERAL_SUBTREE_free', - '#define GENERAL_SUBTREE_it GRPC_SHADOW_GENERAL_SUBTREE_it', - '#define GENERAL_SUBTREE_new GRPC_SHADOW_GENERAL_SUBTREE_new', - '#define HKDF GRPC_SHADOW_HKDF', - '#define HKDF_expand GRPC_SHADOW_HKDF_expand', - '#define HKDF_extract GRPC_SHADOW_HKDF_extract', - '#define HMAC GRPC_SHADOW_HMAC', - '#define HMAC_CTX_cleanup GRPC_SHADOW_HMAC_CTX_cleanup', - '#define HMAC_CTX_copy GRPC_SHADOW_HMAC_CTX_copy', - '#define HMAC_CTX_copy_ex GRPC_SHADOW_HMAC_CTX_copy_ex', - '#define HMAC_CTX_free GRPC_SHADOW_HMAC_CTX_free', - '#define HMAC_CTX_init GRPC_SHADOW_HMAC_CTX_init', - '#define HMAC_CTX_new GRPC_SHADOW_HMAC_CTX_new', - '#define HMAC_CTX_reset GRPC_SHADOW_HMAC_CTX_reset', - '#define HMAC_Final GRPC_SHADOW_HMAC_Final', - '#define HMAC_Init GRPC_SHADOW_HMAC_Init', - '#define HMAC_Init_ex GRPC_SHADOW_HMAC_Init_ex', - '#define HMAC_size GRPC_SHADOW_HMAC_size', - '#define HMAC_Update GRPC_SHADOW_HMAC_Update', - '#define HRSS_decap GRPC_SHADOW_HRSS_decap', - '#define HRSS_encap GRPC_SHADOW_HRSS_encap', - '#define HRSS_generate_key GRPC_SHADOW_HRSS_generate_key', - '#define HRSS_marshal_public_key GRPC_SHADOW_HRSS_marshal_public_key', - '#define HRSS_parse_public_key GRPC_SHADOW_HRSS_parse_public_key', - '#define HRSS_poly3_invert GRPC_SHADOW_HRSS_poly3_invert', - '#define HRSS_poly3_mul GRPC_SHADOW_HRSS_poly3_mul', - '#define i2a_ACCESS_DESCRIPTION GRPC_SHADOW_i2a_ACCESS_DESCRIPTION', - '#define i2a_ASN1_ENUMERATED GRPC_SHADOW_i2a_ASN1_ENUMERATED', - '#define i2a_ASN1_INTEGER GRPC_SHADOW_i2a_ASN1_INTEGER', - '#define i2a_ASN1_OBJECT GRPC_SHADOW_i2a_ASN1_OBJECT', - '#define i2a_ASN1_STRING GRPC_SHADOW_i2a_ASN1_STRING', - '#define i2c_ASN1_BIT_STRING GRPC_SHADOW_i2c_ASN1_BIT_STRING', - '#define i2c_ASN1_INTEGER GRPC_SHADOW_i2c_ASN1_INTEGER', - '#define i2d_ACCESS_DESCRIPTION GRPC_SHADOW_i2d_ACCESS_DESCRIPTION', - '#define i2d_ASN1_BIT_STRING GRPC_SHADOW_i2d_ASN1_BIT_STRING', - '#define i2d_ASN1_BMPSTRING GRPC_SHADOW_i2d_ASN1_BMPSTRING', - '#define i2d_ASN1_BOOLEAN GRPC_SHADOW_i2d_ASN1_BOOLEAN', - '#define i2d_ASN1_ENUMERATED GRPC_SHADOW_i2d_ASN1_ENUMERATED', - '#define i2d_ASN1_GENERALIZEDTIME GRPC_SHADOW_i2d_ASN1_GENERALIZEDTIME', - '#define i2d_ASN1_GENERALSTRING GRPC_SHADOW_i2d_ASN1_GENERALSTRING', - '#define i2d_ASN1_IA5STRING GRPC_SHADOW_i2d_ASN1_IA5STRING', - '#define i2d_ASN1_INTEGER GRPC_SHADOW_i2d_ASN1_INTEGER', - '#define i2d_ASN1_NULL GRPC_SHADOW_i2d_ASN1_NULL', - '#define i2d_ASN1_OBJECT GRPC_SHADOW_i2d_ASN1_OBJECT', - '#define i2d_ASN1_OCTET_STRING GRPC_SHADOW_i2d_ASN1_OCTET_STRING', - '#define i2d_ASN1_PRINTABLE GRPC_SHADOW_i2d_ASN1_PRINTABLE', - '#define i2d_ASN1_PRINTABLESTRING GRPC_SHADOW_i2d_ASN1_PRINTABLESTRING', - '#define i2d_ASN1_SEQUENCE_ANY GRPC_SHADOW_i2d_ASN1_SEQUENCE_ANY', - '#define i2d_ASN1_SET_ANY GRPC_SHADOW_i2d_ASN1_SET_ANY', - '#define i2d_ASN1_T61STRING GRPC_SHADOW_i2d_ASN1_T61STRING', - '#define i2d_ASN1_TIME GRPC_SHADOW_i2d_ASN1_TIME', - '#define i2d_ASN1_TYPE GRPC_SHADOW_i2d_ASN1_TYPE', - '#define i2d_ASN1_UNIVERSALSTRING GRPC_SHADOW_i2d_ASN1_UNIVERSALSTRING', - '#define i2d_ASN1_UTCTIME GRPC_SHADOW_i2d_ASN1_UTCTIME', - '#define i2d_ASN1_UTF8STRING GRPC_SHADOW_i2d_ASN1_UTF8STRING', - '#define i2d_ASN1_VISIBLESTRING GRPC_SHADOW_i2d_ASN1_VISIBLESTRING', - '#define i2d_AUTHORITY_INFO_ACCESS GRPC_SHADOW_i2d_AUTHORITY_INFO_ACCESS', - '#define i2d_AUTHORITY_KEYID GRPC_SHADOW_i2d_AUTHORITY_KEYID', - '#define i2d_BASIC_CONSTRAINTS GRPC_SHADOW_i2d_BASIC_CONSTRAINTS', - '#define i2d_CERTIFICATEPOLICIES GRPC_SHADOW_i2d_CERTIFICATEPOLICIES', - '#define i2d_CRL_DIST_POINTS GRPC_SHADOW_i2d_CRL_DIST_POINTS', - '#define i2d_DHparams GRPC_SHADOW_i2d_DHparams', - '#define i2d_DHparams_bio GRPC_SHADOW_i2d_DHparams_bio', - '#define i2d_DIRECTORYSTRING GRPC_SHADOW_i2d_DIRECTORYSTRING', - '#define i2d_DISPLAYTEXT GRPC_SHADOW_i2d_DISPLAYTEXT', - '#define i2d_DIST_POINT GRPC_SHADOW_i2d_DIST_POINT', - '#define i2d_DIST_POINT_NAME GRPC_SHADOW_i2d_DIST_POINT_NAME', - '#define i2d_DSAparams GRPC_SHADOW_i2d_DSAparams', - '#define i2d_DSAPrivateKey GRPC_SHADOW_i2d_DSAPrivateKey', - '#define i2d_DSAPrivateKey_bio GRPC_SHADOW_i2d_DSAPrivateKey_bio', - '#define i2d_DSAPrivateKey_fp GRPC_SHADOW_i2d_DSAPrivateKey_fp', - '#define i2d_DSA_PUBKEY GRPC_SHADOW_i2d_DSA_PUBKEY', - '#define i2d_DSA_PUBKEY_bio GRPC_SHADOW_i2d_DSA_PUBKEY_bio', - '#define i2d_DSA_PUBKEY_fp GRPC_SHADOW_i2d_DSA_PUBKEY_fp', - '#define i2d_DSAPublicKey GRPC_SHADOW_i2d_DSAPublicKey', - '#define i2d_DSA_SIG GRPC_SHADOW_i2d_DSA_SIG', - '#define i2d_ECDSA_SIG GRPC_SHADOW_i2d_ECDSA_SIG', - '#define i2d_ECParameters GRPC_SHADOW_i2d_ECParameters', - '#define i2d_ECPrivateKey GRPC_SHADOW_i2d_ECPrivateKey', - '#define i2d_ECPrivateKey_bio GRPC_SHADOW_i2d_ECPrivateKey_bio', - '#define i2d_ECPrivateKey_fp GRPC_SHADOW_i2d_ECPrivateKey_fp', - '#define i2d_EC_PUBKEY GRPC_SHADOW_i2d_EC_PUBKEY', - '#define i2d_EC_PUBKEY_bio GRPC_SHADOW_i2d_EC_PUBKEY_bio', - '#define i2d_EC_PUBKEY_fp GRPC_SHADOW_i2d_EC_PUBKEY_fp', - '#define i2d_EDIPARTYNAME GRPC_SHADOW_i2d_EDIPARTYNAME', - '#define i2d_EXTENDED_KEY_USAGE GRPC_SHADOW_i2d_EXTENDED_KEY_USAGE', - '#define i2d_GENERAL_NAME GRPC_SHADOW_i2d_GENERAL_NAME', - '#define i2d_GENERAL_NAMES GRPC_SHADOW_i2d_GENERAL_NAMES', - '#define i2d_ISSUING_DIST_POINT GRPC_SHADOW_i2d_ISSUING_DIST_POINT', - '#define i2d_NETSCAPE_SPKAC GRPC_SHADOW_i2d_NETSCAPE_SPKAC', - '#define i2d_NETSCAPE_SPKI GRPC_SHADOW_i2d_NETSCAPE_SPKI', - '#define i2d_NOTICEREF GRPC_SHADOW_i2d_NOTICEREF', - '#define i2d_OTHERNAME GRPC_SHADOW_i2d_OTHERNAME', - '#define i2d_PKCS12 GRPC_SHADOW_i2d_PKCS12', - '#define i2d_PKCS12_bio GRPC_SHADOW_i2d_PKCS12_bio', - '#define i2d_PKCS12_fp GRPC_SHADOW_i2d_PKCS12_fp', - '#define i2d_PKCS7 GRPC_SHADOW_i2d_PKCS7', - '#define i2d_PKCS7_bio GRPC_SHADOW_i2d_PKCS7_bio', - '#define i2d_PKCS8_bio GRPC_SHADOW_i2d_PKCS8_bio', - '#define i2d_PKCS8_fp GRPC_SHADOW_i2d_PKCS8_fp', - '#define i2d_PKCS8PrivateKey_bio GRPC_SHADOW_i2d_PKCS8PrivateKey_bio', - '#define i2d_PKCS8PrivateKey_fp GRPC_SHADOW_i2d_PKCS8PrivateKey_fp', - '#define i2d_PKCS8PrivateKeyInfo_bio GRPC_SHADOW_i2d_PKCS8PrivateKeyInfo_bio', - '#define i2d_PKCS8PrivateKeyInfo_fp GRPC_SHADOW_i2d_PKCS8PrivateKeyInfo_fp', - '#define i2d_PKCS8PrivateKey_nid_bio GRPC_SHADOW_i2d_PKCS8PrivateKey_nid_bio', - '#define i2d_PKCS8PrivateKey_nid_fp GRPC_SHADOW_i2d_PKCS8PrivateKey_nid_fp', - '#define i2d_PKCS8_PRIV_KEY_INFO GRPC_SHADOW_i2d_PKCS8_PRIV_KEY_INFO', - '#define i2d_PKCS8_PRIV_KEY_INFO_bio GRPC_SHADOW_i2d_PKCS8_PRIV_KEY_INFO_bio', - '#define i2d_PKCS8_PRIV_KEY_INFO_fp GRPC_SHADOW_i2d_PKCS8_PRIV_KEY_INFO_fp', - '#define i2d_PKEY_USAGE_PERIOD GRPC_SHADOW_i2d_PKEY_USAGE_PERIOD', - '#define i2d_POLICYINFO GRPC_SHADOW_i2d_POLICYINFO', - '#define i2d_POLICYQUALINFO GRPC_SHADOW_i2d_POLICYQUALINFO', - '#define i2d_PrivateKey GRPC_SHADOW_i2d_PrivateKey', - '#define i2d_PrivateKey_bio GRPC_SHADOW_i2d_PrivateKey_bio', - '#define i2d_PrivateKey_fp GRPC_SHADOW_i2d_PrivateKey_fp', - '#define i2d_PROXY_CERT_INFO_EXTENSION GRPC_SHADOW_i2d_PROXY_CERT_INFO_EXTENSION', - '#define i2d_PROXY_POLICY GRPC_SHADOW_i2d_PROXY_POLICY', - '#define i2d_PUBKEY GRPC_SHADOW_i2d_PUBKEY', - '#define i2d_PUBKEY_bio GRPC_SHADOW_i2d_PUBKEY_bio', - '#define i2d_PUBKEY_fp GRPC_SHADOW_i2d_PUBKEY_fp', - '#define i2d_PublicKey GRPC_SHADOW_i2d_PublicKey', - '#define i2d_re_X509_CRL_tbs GRPC_SHADOW_i2d_re_X509_CRL_tbs', - '#define i2d_re_X509_REQ_tbs GRPC_SHADOW_i2d_re_X509_REQ_tbs', - '#define i2d_re_X509_tbs GRPC_SHADOW_i2d_re_X509_tbs', - '#define i2d_RSAPrivateKey GRPC_SHADOW_i2d_RSAPrivateKey', - '#define i2d_RSAPrivateKey_bio GRPC_SHADOW_i2d_RSAPrivateKey_bio', - '#define i2d_RSAPrivateKey_fp GRPC_SHADOW_i2d_RSAPrivateKey_fp', - '#define i2d_RSA_PSS_PARAMS GRPC_SHADOW_i2d_RSA_PSS_PARAMS', - '#define i2d_RSA_PUBKEY GRPC_SHADOW_i2d_RSA_PUBKEY', - '#define i2d_RSA_PUBKEY_bio GRPC_SHADOW_i2d_RSA_PUBKEY_bio', - '#define i2d_RSA_PUBKEY_fp GRPC_SHADOW_i2d_RSA_PUBKEY_fp', - '#define i2d_RSAPublicKey GRPC_SHADOW_i2d_RSAPublicKey', - '#define i2d_RSAPublicKey_bio GRPC_SHADOW_i2d_RSAPublicKey_bio', - '#define i2d_RSAPublicKey_fp GRPC_SHADOW_i2d_RSAPublicKey_fp', - '#define i2d_SSL_SESSION GRPC_SHADOW_i2d_SSL_SESSION', - '#define i2d_SSL_SESSION_bio GRPC_SHADOW_i2d_SSL_SESSION_bio', - '#define i2d_SXNET GRPC_SHADOW_i2d_SXNET', - '#define i2d_SXNETID GRPC_SHADOW_i2d_SXNETID', - '#define i2d_USERNOTICE GRPC_SHADOW_i2d_USERNOTICE', - '#define i2d_X509 GRPC_SHADOW_i2d_X509', - '#define i2d_X509_ALGOR GRPC_SHADOW_i2d_X509_ALGOR', - '#define i2d_X509_ALGORS GRPC_SHADOW_i2d_X509_ALGORS', - '#define i2d_X509_ATTRIBUTE GRPC_SHADOW_i2d_X509_ATTRIBUTE', - '#define i2d_X509_AUX GRPC_SHADOW_i2d_X509_AUX', - '#define i2d_X509_bio GRPC_SHADOW_i2d_X509_bio', - '#define i2d_X509_CERT_AUX GRPC_SHADOW_i2d_X509_CERT_AUX', - '#define i2d_X509_CINF GRPC_SHADOW_i2d_X509_CINF', - '#define i2d_X509_CRL GRPC_SHADOW_i2d_X509_CRL', - '#define i2d_X509_CRL_bio GRPC_SHADOW_i2d_X509_CRL_bio', - '#define i2d_X509_CRL_fp GRPC_SHADOW_i2d_X509_CRL_fp', - '#define i2d_X509_CRL_INFO GRPC_SHADOW_i2d_X509_CRL_INFO', - '#define i2d_X509_EXTENSION GRPC_SHADOW_i2d_X509_EXTENSION', - '#define i2d_X509_EXTENSIONS GRPC_SHADOW_i2d_X509_EXTENSIONS', - '#define i2d_X509_fp GRPC_SHADOW_i2d_X509_fp', - '#define i2d_X509_NAME GRPC_SHADOW_i2d_X509_NAME', - '#define i2d_X509_NAME_ENTRY GRPC_SHADOW_i2d_X509_NAME_ENTRY', - '#define i2d_X509_PUBKEY GRPC_SHADOW_i2d_X509_PUBKEY', - '#define i2d_X509_REQ GRPC_SHADOW_i2d_X509_REQ', - '#define i2d_X509_REQ_bio GRPC_SHADOW_i2d_X509_REQ_bio', - '#define i2d_X509_REQ_fp GRPC_SHADOW_i2d_X509_REQ_fp', - '#define i2d_X509_REQ_INFO GRPC_SHADOW_i2d_X509_REQ_INFO', - '#define i2d_X509_REVOKED GRPC_SHADOW_i2d_X509_REVOKED', - '#define i2d_X509_SIG GRPC_SHADOW_i2d_X509_SIG', - '#define i2d_X509_VAL GRPC_SHADOW_i2d_X509_VAL', - '#define i2o_ECPublicKey GRPC_SHADOW_i2o_ECPublicKey', - '#define i2s_ASN1_ENUMERATED GRPC_SHADOW_i2s_ASN1_ENUMERATED', - '#define i2s_ASN1_ENUMERATED_TABLE GRPC_SHADOW_i2s_ASN1_ENUMERATED_TABLE', - '#define i2s_ASN1_INTEGER GRPC_SHADOW_i2s_ASN1_INTEGER', - '#define i2s_ASN1_OCTET_STRING GRPC_SHADOW_i2s_ASN1_OCTET_STRING', - '#define i2t_ASN1_OBJECT GRPC_SHADOW_i2t_ASN1_OBJECT', - '#define i2v_ASN1_BIT_STRING GRPC_SHADOW_i2v_ASN1_BIT_STRING', - '#define i2v_GENERAL_NAME GRPC_SHADOW_i2v_GENERAL_NAME', - '#define i2v_GENERAL_NAMES GRPC_SHADOW_i2v_GENERAL_NAMES', - '#define ISSUING_DIST_POINT_free GRPC_SHADOW_ISSUING_DIST_POINT_free', - '#define ISSUING_DIST_POINT_it GRPC_SHADOW_ISSUING_DIST_POINT_it', - '#define ISSUING_DIST_POINT_new GRPC_SHADOW_ISSUING_DIST_POINT_new', - '#define kBoringSSLRSASqrtTwo GRPC_SHADOW_kBoringSSLRSASqrtTwo', - '#define kBoringSSLRSASqrtTwoLen GRPC_SHADOW_kBoringSSLRSASqrtTwoLen', - '#define kOpenSSLReasonStringData GRPC_SHADOW_kOpenSSLReasonStringData', - '#define kOpenSSLReasonValues GRPC_SHADOW_kOpenSSLReasonValues', - '#define kOpenSSLReasonValuesLen GRPC_SHADOW_kOpenSSLReasonValuesLen', - '#define level_add_node GRPC_SHADOW_level_add_node', - '#define level_find_node GRPC_SHADOW_level_find_node', - '#define lh_delete GRPC_SHADOW_lh_delete', - '#define lh_doall_arg GRPC_SHADOW_lh_doall_arg', - '#define lh_free GRPC_SHADOW_lh_free', - '#define lh_insert GRPC_SHADOW_lh_insert', - '#define lh_new GRPC_SHADOW_lh_new', - '#define lh_num_items GRPC_SHADOW_lh_num_items', - '#define lh_retrieve GRPC_SHADOW_lh_retrieve', - '#define lh_retrieve_key GRPC_SHADOW_lh_retrieve_key', - '#define lh_strhash GRPC_SHADOW_lh_strhash', - '#define MD4 GRPC_SHADOW_MD4', - '#define md4_block_data_order GRPC_SHADOW_md4_block_data_order', - '#define MD4_Final GRPC_SHADOW_MD4_Final', - '#define MD4_Init GRPC_SHADOW_MD4_Init', - '#define MD4_Transform GRPC_SHADOW_MD4_Transform', - '#define MD4_Update GRPC_SHADOW_MD4_Update', - '#define MD5 GRPC_SHADOW_MD5', - '#define md5_block_asm_data_order GRPC_SHADOW_md5_block_asm_data_order', - '#define MD5_Final GRPC_SHADOW_MD5_Final', - '#define MD5_Init GRPC_SHADOW_MD5_Init', - '#define MD5_Transform GRPC_SHADOW_MD5_Transform', - '#define MD5_Update GRPC_SHADOW_MD5_Update', - '#define METHOD_ref GRPC_SHADOW_METHOD_ref', - '#define METHOD_unref GRPC_SHADOW_METHOD_unref', - '#define NAME_CONSTRAINTS_check GRPC_SHADOW_NAME_CONSTRAINTS_check', - '#define NAME_CONSTRAINTS_free GRPC_SHADOW_NAME_CONSTRAINTS_free', - '#define NAME_CONSTRAINTS_it GRPC_SHADOW_NAME_CONSTRAINTS_it', - '#define NAME_CONSTRAINTS_new GRPC_SHADOW_NAME_CONSTRAINTS_new', - '#define NCONF_free GRPC_SHADOW_NCONF_free', - '#define NCONF_get_section GRPC_SHADOW_NCONF_get_section', - '#define NCONF_get_string GRPC_SHADOW_NCONF_get_string', - '#define NCONF_load GRPC_SHADOW_NCONF_load', - '#define NCONF_load_bio GRPC_SHADOW_NCONF_load_bio', - '#define NCONF_new GRPC_SHADOW_NCONF_new', - '#define NETSCAPE_SPKAC_free GRPC_SHADOW_NETSCAPE_SPKAC_free', - '#define NETSCAPE_SPKAC_it GRPC_SHADOW_NETSCAPE_SPKAC_it', - '#define NETSCAPE_SPKAC_new GRPC_SHADOW_NETSCAPE_SPKAC_new', - '#define NETSCAPE_SPKI_b64_decode GRPC_SHADOW_NETSCAPE_SPKI_b64_decode', - '#define NETSCAPE_SPKI_b64_encode GRPC_SHADOW_NETSCAPE_SPKI_b64_encode', - '#define NETSCAPE_SPKI_free GRPC_SHADOW_NETSCAPE_SPKI_free', - '#define NETSCAPE_SPKI_get_pubkey GRPC_SHADOW_NETSCAPE_SPKI_get_pubkey', - '#define NETSCAPE_SPKI_it GRPC_SHADOW_NETSCAPE_SPKI_it', - '#define NETSCAPE_SPKI_new GRPC_SHADOW_NETSCAPE_SPKI_new', - '#define NETSCAPE_SPKI_set_pubkey GRPC_SHADOW_NETSCAPE_SPKI_set_pubkey', - '#define NETSCAPE_SPKI_sign GRPC_SHADOW_NETSCAPE_SPKI_sign', - '#define NETSCAPE_SPKI_verify GRPC_SHADOW_NETSCAPE_SPKI_verify', - '#define NOTICEREF_free GRPC_SHADOW_NOTICEREF_free', - '#define NOTICEREF_it GRPC_SHADOW_NOTICEREF_it', - '#define NOTICEREF_new GRPC_SHADOW_NOTICEREF_new', - '#define o2i_ECPublicKey GRPC_SHADOW_o2i_ECPublicKey', - '#define OBJ_cbs2nid GRPC_SHADOW_OBJ_cbs2nid', - '#define OBJ_cleanup GRPC_SHADOW_OBJ_cleanup', - '#define OBJ_cmp GRPC_SHADOW_OBJ_cmp', - '#define OBJ_create GRPC_SHADOW_OBJ_create', - '#define OBJ_dup GRPC_SHADOW_OBJ_dup', - '#define OBJ_find_sigid_algs GRPC_SHADOW_OBJ_find_sigid_algs', - '#define OBJ_find_sigid_by_algs GRPC_SHADOW_OBJ_find_sigid_by_algs', - '#define OBJ_get0_data GRPC_SHADOW_OBJ_get0_data', - '#define OBJ_length GRPC_SHADOW_OBJ_length', - '#define OBJ_ln2nid GRPC_SHADOW_OBJ_ln2nid', - '#define OBJ_nid2cbb GRPC_SHADOW_OBJ_nid2cbb', - '#define OBJ_nid2ln GRPC_SHADOW_OBJ_nid2ln', - '#define OBJ_nid2obj GRPC_SHADOW_OBJ_nid2obj', - '#define OBJ_nid2sn GRPC_SHADOW_OBJ_nid2sn', - '#define OBJ_obj2nid GRPC_SHADOW_OBJ_obj2nid', - '#define OBJ_obj2txt GRPC_SHADOW_OBJ_obj2txt', - '#define OBJ_sn2nid GRPC_SHADOW_OBJ_sn2nid', - '#define OBJ_txt2nid GRPC_SHADOW_OBJ_txt2nid', - '#define OBJ_txt2obj GRPC_SHADOW_OBJ_txt2obj', - '#define OpenSSL_add_all_algorithms GRPC_SHADOW_OpenSSL_add_all_algorithms', - '#define OPENSSL_add_all_algorithms_conf GRPC_SHADOW_OPENSSL_add_all_algorithms_conf', - '#define OpenSSL_add_all_ciphers GRPC_SHADOW_OpenSSL_add_all_ciphers', - '#define OpenSSL_add_all_digests GRPC_SHADOW_OpenSSL_add_all_digests', - '#define OPENSSL_built_in_curves GRPC_SHADOW_OPENSSL_built_in_curves', - '#define OPENSSL_cleanse GRPC_SHADOW_OPENSSL_cleanse', - '#define OPENSSL_cleanup GRPC_SHADOW_OPENSSL_cleanup', - '#define OPENSSL_clear_free GRPC_SHADOW_OPENSSL_clear_free', - '#define OPENSSL_config GRPC_SHADOW_OPENSSL_config', - '#define OPENSSL_cpuid_setup GRPC_SHADOW_OPENSSL_cpuid_setup', - '#define OPENSSL_free GRPC_SHADOW_OPENSSL_free', - '#define OPENSSL_gmtime GRPC_SHADOW_OPENSSL_gmtime', - '#define OPENSSL_gmtime_adj GRPC_SHADOW_OPENSSL_gmtime_adj', - '#define OPENSSL_gmtime_diff GRPC_SHADOW_OPENSSL_gmtime_diff', - '#define OPENSSL_hash32 GRPC_SHADOW_OPENSSL_hash32', - '#define OPENSSL_ia32cap_P GRPC_SHADOW_OPENSSL_ia32cap_P', - '#define OPENSSL_init_crypto GRPC_SHADOW_OPENSSL_init_crypto', - '#define OPENSSL_init_ssl GRPC_SHADOW_OPENSSL_init_ssl', - '#define OPENSSL_load_builtin_modules GRPC_SHADOW_OPENSSL_load_builtin_modules', - '#define OPENSSL_malloc GRPC_SHADOW_OPENSSL_malloc', - '#define OPENSSL_malloc_init GRPC_SHADOW_OPENSSL_malloc_init', - '#define OPENSSL_memdup GRPC_SHADOW_OPENSSL_memdup', - '#define OPENSSL_no_config GRPC_SHADOW_OPENSSL_no_config', - '#define OPENSSL_realloc GRPC_SHADOW_OPENSSL_realloc', - '#define OPENSSL_strcasecmp GRPC_SHADOW_OPENSSL_strcasecmp', - '#define OPENSSL_strdup GRPC_SHADOW_OPENSSL_strdup', - '#define OPENSSL_strlcat GRPC_SHADOW_OPENSSL_strlcat', - '#define OPENSSL_strlcpy GRPC_SHADOW_OPENSSL_strlcpy', - '#define OPENSSL_strncasecmp GRPC_SHADOW_OPENSSL_strncasecmp', - '#define OPENSSL_strndup GRPC_SHADOW_OPENSSL_strndup', - '#define OPENSSL_strnlen GRPC_SHADOW_OPENSSL_strnlen', - '#define OPENSSL_tolower GRPC_SHADOW_OPENSSL_tolower', - '#define OpenSSL_version GRPC_SHADOW_OpenSSL_version', - '#define OpenSSL_version_num GRPC_SHADOW_OpenSSL_version_num', - '#define OTHERNAME_cmp GRPC_SHADOW_OTHERNAME_cmp', - '#define OTHERNAME_free GRPC_SHADOW_OTHERNAME_free', - '#define OTHERNAME_it GRPC_SHADOW_OTHERNAME_it', - '#define OTHERNAME_new GRPC_SHADOW_OTHERNAME_new', - '#define PEM_ASN1_read GRPC_SHADOW_PEM_ASN1_read', - '#define PEM_ASN1_read_bio GRPC_SHADOW_PEM_ASN1_read_bio', - '#define PEM_ASN1_write GRPC_SHADOW_PEM_ASN1_write', - '#define PEM_ASN1_write_bio GRPC_SHADOW_PEM_ASN1_write_bio', - '#define PEM_bytes_read_bio GRPC_SHADOW_PEM_bytes_read_bio', - '#define PEM_def_callback GRPC_SHADOW_PEM_def_callback', - '#define PEM_dek_info GRPC_SHADOW_PEM_dek_info', - '#define PEM_do_header GRPC_SHADOW_PEM_do_header', - '#define PEM_get_EVP_CIPHER_INFO GRPC_SHADOW_PEM_get_EVP_CIPHER_INFO', - '#define PEM_proc_type GRPC_SHADOW_PEM_proc_type', - '#define PEM_read GRPC_SHADOW_PEM_read', - '#define PEM_read_bio GRPC_SHADOW_PEM_read_bio', - '#define PEM_read_bio_DHparams GRPC_SHADOW_PEM_read_bio_DHparams', - '#define PEM_read_bio_DSAparams GRPC_SHADOW_PEM_read_bio_DSAparams', - '#define PEM_read_bio_DSAPrivateKey GRPC_SHADOW_PEM_read_bio_DSAPrivateKey', - '#define PEM_read_bio_DSA_PUBKEY GRPC_SHADOW_PEM_read_bio_DSA_PUBKEY', - '#define PEM_read_bio_ECPrivateKey GRPC_SHADOW_PEM_read_bio_ECPrivateKey', - '#define PEM_read_bio_EC_PUBKEY GRPC_SHADOW_PEM_read_bio_EC_PUBKEY', - '#define PEM_read_bio_PKCS7 GRPC_SHADOW_PEM_read_bio_PKCS7', - '#define PEM_read_bio_PKCS8 GRPC_SHADOW_PEM_read_bio_PKCS8', - '#define PEM_read_bio_PKCS8_PRIV_KEY_INFO GRPC_SHADOW_PEM_read_bio_PKCS8_PRIV_KEY_INFO', - '#define PEM_read_bio_PrivateKey GRPC_SHADOW_PEM_read_bio_PrivateKey', - '#define PEM_read_bio_PUBKEY GRPC_SHADOW_PEM_read_bio_PUBKEY', - '#define PEM_read_bio_RSAPrivateKey GRPC_SHADOW_PEM_read_bio_RSAPrivateKey', - '#define PEM_read_bio_RSA_PUBKEY GRPC_SHADOW_PEM_read_bio_RSA_PUBKEY', - '#define PEM_read_bio_RSAPublicKey GRPC_SHADOW_PEM_read_bio_RSAPublicKey', - '#define PEM_read_bio_SSL_SESSION GRPC_SHADOW_PEM_read_bio_SSL_SESSION', - '#define PEM_read_bio_X509 GRPC_SHADOW_PEM_read_bio_X509', - '#define PEM_read_bio_X509_AUX GRPC_SHADOW_PEM_read_bio_X509_AUX', - '#define PEM_read_bio_X509_CRL GRPC_SHADOW_PEM_read_bio_X509_CRL', - '#define PEM_read_bio_X509_REQ GRPC_SHADOW_PEM_read_bio_X509_REQ', - '#define PEM_read_DHparams GRPC_SHADOW_PEM_read_DHparams', - '#define PEM_read_DSAparams GRPC_SHADOW_PEM_read_DSAparams', - '#define PEM_read_DSAPrivateKey GRPC_SHADOW_PEM_read_DSAPrivateKey', - '#define PEM_read_DSA_PUBKEY GRPC_SHADOW_PEM_read_DSA_PUBKEY', - '#define PEM_read_ECPrivateKey GRPC_SHADOW_PEM_read_ECPrivateKey', - '#define PEM_read_EC_PUBKEY GRPC_SHADOW_PEM_read_EC_PUBKEY', - '#define PEM_read_PKCS7 GRPC_SHADOW_PEM_read_PKCS7', - '#define PEM_read_PKCS8 GRPC_SHADOW_PEM_read_PKCS8', - '#define PEM_read_PKCS8_PRIV_KEY_INFO GRPC_SHADOW_PEM_read_PKCS8_PRIV_KEY_INFO', - '#define PEM_read_PrivateKey GRPC_SHADOW_PEM_read_PrivateKey', - '#define PEM_read_PUBKEY GRPC_SHADOW_PEM_read_PUBKEY', - '#define PEM_read_RSAPrivateKey GRPC_SHADOW_PEM_read_RSAPrivateKey', - '#define PEM_read_RSA_PUBKEY GRPC_SHADOW_PEM_read_RSA_PUBKEY', - '#define PEM_read_RSAPublicKey GRPC_SHADOW_PEM_read_RSAPublicKey', - '#define PEM_read_SSL_SESSION GRPC_SHADOW_PEM_read_SSL_SESSION', - '#define PEM_read_X509 GRPC_SHADOW_PEM_read_X509', - '#define PEM_read_X509_AUX GRPC_SHADOW_PEM_read_X509_AUX', - '#define PEM_read_X509_CRL GRPC_SHADOW_PEM_read_X509_CRL', - '#define PEM_read_X509_REQ GRPC_SHADOW_PEM_read_X509_REQ', - '#define PEM_write GRPC_SHADOW_PEM_write', - '#define PEM_write_bio GRPC_SHADOW_PEM_write_bio', - '#define PEM_write_bio_DHparams GRPC_SHADOW_PEM_write_bio_DHparams', - '#define PEM_write_bio_DSAparams GRPC_SHADOW_PEM_write_bio_DSAparams', - '#define PEM_write_bio_DSAPrivateKey GRPC_SHADOW_PEM_write_bio_DSAPrivateKey', - '#define PEM_write_bio_DSA_PUBKEY GRPC_SHADOW_PEM_write_bio_DSA_PUBKEY', - '#define PEM_write_bio_ECPrivateKey GRPC_SHADOW_PEM_write_bio_ECPrivateKey', - '#define PEM_write_bio_EC_PUBKEY GRPC_SHADOW_PEM_write_bio_EC_PUBKEY', - '#define PEM_write_bio_PKCS7 GRPC_SHADOW_PEM_write_bio_PKCS7', - '#define PEM_write_bio_PKCS8 GRPC_SHADOW_PEM_write_bio_PKCS8', - '#define PEM_write_bio_PKCS8PrivateKey GRPC_SHADOW_PEM_write_bio_PKCS8PrivateKey', - '#define PEM_write_bio_PKCS8PrivateKey_nid GRPC_SHADOW_PEM_write_bio_PKCS8PrivateKey_nid', - '#define PEM_write_bio_PKCS8_PRIV_KEY_INFO GRPC_SHADOW_PEM_write_bio_PKCS8_PRIV_KEY_INFO', - '#define PEM_write_bio_PrivateKey GRPC_SHADOW_PEM_write_bio_PrivateKey', - '#define PEM_write_bio_PUBKEY GRPC_SHADOW_PEM_write_bio_PUBKEY', - '#define PEM_write_bio_RSAPrivateKey GRPC_SHADOW_PEM_write_bio_RSAPrivateKey', - '#define PEM_write_bio_RSA_PUBKEY GRPC_SHADOW_PEM_write_bio_RSA_PUBKEY', - '#define PEM_write_bio_RSAPublicKey GRPC_SHADOW_PEM_write_bio_RSAPublicKey', - '#define PEM_write_bio_SSL_SESSION GRPC_SHADOW_PEM_write_bio_SSL_SESSION', - '#define PEM_write_bio_X509 GRPC_SHADOW_PEM_write_bio_X509', - '#define PEM_write_bio_X509_AUX GRPC_SHADOW_PEM_write_bio_X509_AUX', - '#define PEM_write_bio_X509_CRL GRPC_SHADOW_PEM_write_bio_X509_CRL', - '#define PEM_write_bio_X509_REQ GRPC_SHADOW_PEM_write_bio_X509_REQ', - '#define PEM_write_bio_X509_REQ_NEW GRPC_SHADOW_PEM_write_bio_X509_REQ_NEW', - '#define PEM_write_DHparams GRPC_SHADOW_PEM_write_DHparams', - '#define PEM_write_DSAparams GRPC_SHADOW_PEM_write_DSAparams', - '#define PEM_write_DSAPrivateKey GRPC_SHADOW_PEM_write_DSAPrivateKey', - '#define PEM_write_DSA_PUBKEY GRPC_SHADOW_PEM_write_DSA_PUBKEY', - '#define PEM_write_ECPrivateKey GRPC_SHADOW_PEM_write_ECPrivateKey', - '#define PEM_write_EC_PUBKEY GRPC_SHADOW_PEM_write_EC_PUBKEY', - '#define PEM_write_PKCS7 GRPC_SHADOW_PEM_write_PKCS7', - '#define PEM_write_PKCS8 GRPC_SHADOW_PEM_write_PKCS8', - '#define PEM_write_PKCS8PrivateKey GRPC_SHADOW_PEM_write_PKCS8PrivateKey', - '#define PEM_write_PKCS8PrivateKey_nid GRPC_SHADOW_PEM_write_PKCS8PrivateKey_nid', - '#define PEM_write_PKCS8_PRIV_KEY_INFO GRPC_SHADOW_PEM_write_PKCS8_PRIV_KEY_INFO', - '#define PEM_write_PrivateKey GRPC_SHADOW_PEM_write_PrivateKey', - '#define PEM_write_PUBKEY GRPC_SHADOW_PEM_write_PUBKEY', - '#define PEM_write_RSAPrivateKey GRPC_SHADOW_PEM_write_RSAPrivateKey', - '#define PEM_write_RSA_PUBKEY GRPC_SHADOW_PEM_write_RSA_PUBKEY', - '#define PEM_write_RSAPublicKey GRPC_SHADOW_PEM_write_RSAPublicKey', - '#define PEM_write_SSL_SESSION GRPC_SHADOW_PEM_write_SSL_SESSION', - '#define PEM_write_X509 GRPC_SHADOW_PEM_write_X509', - '#define PEM_write_X509_AUX GRPC_SHADOW_PEM_write_X509_AUX', - '#define PEM_write_X509_CRL GRPC_SHADOW_PEM_write_X509_CRL', - '#define PEM_write_X509_REQ GRPC_SHADOW_PEM_write_X509_REQ', - '#define PEM_write_X509_REQ_NEW GRPC_SHADOW_PEM_write_X509_REQ_NEW', - '#define PEM_X509_INFO_read GRPC_SHADOW_PEM_X509_INFO_read', - '#define PEM_X509_INFO_read_bio GRPC_SHADOW_PEM_X509_INFO_read_bio', - '#define PEM_X509_INFO_write_bio GRPC_SHADOW_PEM_X509_INFO_write_bio', - '#define PKCS12_create GRPC_SHADOW_PKCS12_create', - '#define PKCS12_free GRPC_SHADOW_PKCS12_free', - '#define PKCS12_get_key_and_certs GRPC_SHADOW_PKCS12_get_key_and_certs', - '#define pkcs12_iterations_acceptable GRPC_SHADOW_pkcs12_iterations_acceptable', - '#define pkcs12_key_gen GRPC_SHADOW_pkcs12_key_gen', - '#define PKCS12_parse GRPC_SHADOW_PKCS12_parse', - '#define PKCS12_PBE_add GRPC_SHADOW_PKCS12_PBE_add', - '#define pkcs12_pbe_encrypt_init GRPC_SHADOW_pkcs12_pbe_encrypt_init', - '#define PKCS12_verify_mac GRPC_SHADOW_PKCS12_verify_mac', - '#define PKCS5_pbe2_decrypt_init GRPC_SHADOW_PKCS5_pbe2_decrypt_init', - '#define PKCS5_pbe2_encrypt_init GRPC_SHADOW_PKCS5_pbe2_encrypt_init', - '#define PKCS5_PBKDF2_HMAC GRPC_SHADOW_PKCS5_PBKDF2_HMAC', - '#define PKCS5_PBKDF2_HMAC_SHA1 GRPC_SHADOW_PKCS5_PBKDF2_HMAC_SHA1', - '#define pkcs7_bundle GRPC_SHADOW_pkcs7_bundle', - '#define PKCS7_bundle_certificates GRPC_SHADOW_PKCS7_bundle_certificates', - '#define PKCS7_bundle_CRLs GRPC_SHADOW_PKCS7_bundle_CRLs', - '#define PKCS7_free GRPC_SHADOW_PKCS7_free', - '#define PKCS7_get_certificates GRPC_SHADOW_PKCS7_get_certificates', - '#define PKCS7_get_CRLs GRPC_SHADOW_PKCS7_get_CRLs', - '#define PKCS7_get_PEM_certificates GRPC_SHADOW_PKCS7_get_PEM_certificates', - '#define PKCS7_get_PEM_CRLs GRPC_SHADOW_PKCS7_get_PEM_CRLs', - '#define PKCS7_get_raw_certificates GRPC_SHADOW_PKCS7_get_raw_certificates', - '#define pkcs7_parse_header GRPC_SHADOW_pkcs7_parse_header', - '#define PKCS7_sign GRPC_SHADOW_PKCS7_sign', - '#define PKCS7_type_is_data GRPC_SHADOW_PKCS7_type_is_data', - '#define PKCS7_type_is_digest GRPC_SHADOW_PKCS7_type_is_digest', - '#define PKCS7_type_is_encrypted GRPC_SHADOW_PKCS7_type_is_encrypted', - '#define PKCS7_type_is_enveloped GRPC_SHADOW_PKCS7_type_is_enveloped', - '#define PKCS7_type_is_signed GRPC_SHADOW_PKCS7_type_is_signed', - '#define PKCS7_type_is_signedAndEnveloped GRPC_SHADOW_PKCS7_type_is_signedAndEnveloped', - '#define PKCS8_decrypt GRPC_SHADOW_PKCS8_decrypt', - '#define PKCS8_encrypt GRPC_SHADOW_PKCS8_encrypt', - '#define PKCS8_marshal_encrypted_private_key GRPC_SHADOW_PKCS8_marshal_encrypted_private_key', - '#define PKCS8_parse_encrypted_private_key GRPC_SHADOW_PKCS8_parse_encrypted_private_key', - '#define pkcs8_pbe_decrypt GRPC_SHADOW_pkcs8_pbe_decrypt', - '#define PKCS8_pkey_get0 GRPC_SHADOW_PKCS8_pkey_get0', - '#define PKCS8_pkey_set0 GRPC_SHADOW_PKCS8_pkey_set0', - '#define PKCS8_PRIV_KEY_INFO_free GRPC_SHADOW_PKCS8_PRIV_KEY_INFO_free', - '#define PKCS8_PRIV_KEY_INFO_it GRPC_SHADOW_PKCS8_PRIV_KEY_INFO_it', - '#define PKCS8_PRIV_KEY_INFO_new GRPC_SHADOW_PKCS8_PRIV_KEY_INFO_new', - '#define PKEY_USAGE_PERIOD_free GRPC_SHADOW_PKEY_USAGE_PERIOD_free', - '#define PKEY_USAGE_PERIOD_it GRPC_SHADOW_PKEY_USAGE_PERIOD_it', - '#define PKEY_USAGE_PERIOD_new GRPC_SHADOW_PKEY_USAGE_PERIOD_new', - '#define policy_cache_find_data GRPC_SHADOW_policy_cache_find_data', - '#define policy_cache_free GRPC_SHADOW_policy_cache_free', - '#define policy_cache_set GRPC_SHADOW_policy_cache_set', - '#define policy_cache_set_mapping GRPC_SHADOW_policy_cache_set_mapping', - '#define POLICY_CONSTRAINTS_free GRPC_SHADOW_POLICY_CONSTRAINTS_free', - '#define POLICY_CONSTRAINTS_it GRPC_SHADOW_POLICY_CONSTRAINTS_it', - '#define POLICY_CONSTRAINTS_new GRPC_SHADOW_POLICY_CONSTRAINTS_new', - '#define policy_data_free GRPC_SHADOW_policy_data_free', - '#define policy_data_new GRPC_SHADOW_policy_data_new', - '#define POLICYINFO_free GRPC_SHADOW_POLICYINFO_free', - '#define POLICYINFO_it GRPC_SHADOW_POLICYINFO_it', - '#define POLICYINFO_new GRPC_SHADOW_POLICYINFO_new', - '#define POLICY_MAPPING_free GRPC_SHADOW_POLICY_MAPPING_free', - '#define POLICY_MAPPING_it GRPC_SHADOW_POLICY_MAPPING_it', - '#define POLICY_MAPPING_new GRPC_SHADOW_POLICY_MAPPING_new', - '#define POLICY_MAPPINGS_it GRPC_SHADOW_POLICY_MAPPINGS_it', - '#define policy_node_cmp_new GRPC_SHADOW_policy_node_cmp_new', - '#define policy_node_free GRPC_SHADOW_policy_node_free', - '#define policy_node_match GRPC_SHADOW_policy_node_match', - '#define POLICYQUALINFO_free GRPC_SHADOW_POLICYQUALINFO_free', - '#define POLICYQUALINFO_it GRPC_SHADOW_POLICYQUALINFO_it', - '#define POLICYQUALINFO_new GRPC_SHADOW_POLICYQUALINFO_new', - '#define poly_Rq_mul GRPC_SHADOW_poly_Rq_mul', - '#define PROXY_CERT_INFO_EXTENSION_free GRPC_SHADOW_PROXY_CERT_INFO_EXTENSION_free', - '#define PROXY_CERT_INFO_EXTENSION_it GRPC_SHADOW_PROXY_CERT_INFO_EXTENSION_it', - '#define PROXY_CERT_INFO_EXTENSION_new GRPC_SHADOW_PROXY_CERT_INFO_EXTENSION_new', - '#define PROXY_POLICY_free GRPC_SHADOW_PROXY_POLICY_free', - '#define PROXY_POLICY_it GRPC_SHADOW_PROXY_POLICY_it', - '#define PROXY_POLICY_new GRPC_SHADOW_PROXY_POLICY_new', - '#define RAND_add GRPC_SHADOW_RAND_add', - '#define RAND_bytes GRPC_SHADOW_RAND_bytes', - '#define RAND_bytes_with_additional_data GRPC_SHADOW_RAND_bytes_with_additional_data', - '#define RAND_cleanup GRPC_SHADOW_RAND_cleanup', - '#define RAND_egd GRPC_SHADOW_RAND_egd', - '#define RAND_enable_fork_unsafe_buffering GRPC_SHADOW_RAND_enable_fork_unsafe_buffering', - '#define RAND_file_name GRPC_SHADOW_RAND_file_name', - '#define rand_fork_unsafe_buffering_enabled GRPC_SHADOW_rand_fork_unsafe_buffering_enabled', - '#define RAND_get_rand_method GRPC_SHADOW_RAND_get_rand_method', - '#define RAND_load_file GRPC_SHADOW_RAND_load_file', - '#define RAND_poll GRPC_SHADOW_RAND_poll', - '#define RAND_pseudo_bytes GRPC_SHADOW_RAND_pseudo_bytes', - '#define RAND_seed GRPC_SHADOW_RAND_seed', - '#define RAND_set_rand_method GRPC_SHADOW_RAND_set_rand_method', - '#define RAND_set_urandom_fd GRPC_SHADOW_RAND_set_urandom_fd', - '#define RAND_SSLeay GRPC_SHADOW_RAND_SSLeay', - '#define RAND_status GRPC_SHADOW_RAND_status', - '#define RC4 GRPC_SHADOW_RC4', - '#define RC4_set_key GRPC_SHADOW_RC4_set_key', - '#define RSA_add_pkcs1_prefix GRPC_SHADOW_RSA_add_pkcs1_prefix', - '#define rsa_asn1_meth GRPC_SHADOW_rsa_asn1_meth', - '#define RSA_bits GRPC_SHADOW_RSA_bits', - '#define RSA_blinding_on GRPC_SHADOW_RSA_blinding_on', - '#define RSA_check_fips GRPC_SHADOW_RSA_check_fips', - '#define RSA_check_key GRPC_SHADOW_RSA_check_key', - '#define RSA_decrypt GRPC_SHADOW_RSA_decrypt', - '#define rsa_default_decrypt GRPC_SHADOW_rsa_default_decrypt', - '#define RSA_default_method GRPC_SHADOW_RSA_default_method', - '#define rsa_default_private_transform GRPC_SHADOW_rsa_default_private_transform', - '#define rsa_default_sign_raw GRPC_SHADOW_rsa_default_sign_raw', - '#define rsa_default_size GRPC_SHADOW_rsa_default_size', - '#define RSA_encrypt GRPC_SHADOW_RSA_encrypt', - '#define RSA_flags GRPC_SHADOW_RSA_flags', - '#define RSA_free GRPC_SHADOW_RSA_free', - '#define RSA_generate_key_ex GRPC_SHADOW_RSA_generate_key_ex', - '#define RSA_generate_key_fips GRPC_SHADOW_RSA_generate_key_fips', - '#define RSA_get0_crt_params GRPC_SHADOW_RSA_get0_crt_params', - '#define RSA_get0_factors GRPC_SHADOW_RSA_get0_factors', - '#define RSA_get0_key GRPC_SHADOW_RSA_get0_key', - '#define RSA_get_ex_data GRPC_SHADOW_RSA_get_ex_data', - '#define RSA_get_ex_new_index GRPC_SHADOW_RSA_get_ex_new_index', - '#define RSA_is_opaque GRPC_SHADOW_RSA_is_opaque', - '#define RSA_marshal_private_key GRPC_SHADOW_RSA_marshal_private_key', - '#define RSA_marshal_public_key GRPC_SHADOW_RSA_marshal_public_key', - '#define RSA_new GRPC_SHADOW_RSA_new', - '#define RSA_new_method GRPC_SHADOW_RSA_new_method', - '#define RSA_padding_add_none GRPC_SHADOW_RSA_padding_add_none', - '#define RSA_padding_add_PKCS1_OAEP_mgf1 GRPC_SHADOW_RSA_padding_add_PKCS1_OAEP_mgf1', - '#define RSA_padding_add_PKCS1_PSS_mgf1 GRPC_SHADOW_RSA_padding_add_PKCS1_PSS_mgf1', - '#define RSA_padding_add_PKCS1_type_1 GRPC_SHADOW_RSA_padding_add_PKCS1_type_1', - '#define RSA_padding_add_PKCS1_type_2 GRPC_SHADOW_RSA_padding_add_PKCS1_type_2', - '#define RSA_padding_check_PKCS1_OAEP_mgf1 GRPC_SHADOW_RSA_padding_check_PKCS1_OAEP_mgf1', - '#define RSA_padding_check_PKCS1_type_1 GRPC_SHADOW_RSA_padding_check_PKCS1_type_1', - '#define RSA_padding_check_PKCS1_type_2 GRPC_SHADOW_RSA_padding_check_PKCS1_type_2', - '#define RSA_parse_private_key GRPC_SHADOW_RSA_parse_private_key', - '#define RSA_parse_public_key GRPC_SHADOW_RSA_parse_public_key', - '#define rsa_pkey_meth GRPC_SHADOW_rsa_pkey_meth', - '#define RSA_print GRPC_SHADOW_RSA_print', - '#define RSA_private_decrypt GRPC_SHADOW_RSA_private_decrypt', - '#define RSA_private_encrypt GRPC_SHADOW_RSA_private_encrypt', - '#define RSAPrivateKey_dup GRPC_SHADOW_RSAPrivateKey_dup', - '#define RSA_private_key_from_bytes GRPC_SHADOW_RSA_private_key_from_bytes', - '#define RSA_private_key_to_bytes GRPC_SHADOW_RSA_private_key_to_bytes', - '#define RSA_private_transform GRPC_SHADOW_RSA_private_transform', - '#define RSA_PSS_PARAMS_free GRPC_SHADOW_RSA_PSS_PARAMS_free', - '#define RSA_PSS_PARAMS_it GRPC_SHADOW_RSA_PSS_PARAMS_it', - '#define RSA_PSS_PARAMS_new GRPC_SHADOW_RSA_PSS_PARAMS_new', - '#define RSA_public_decrypt GRPC_SHADOW_RSA_public_decrypt', - '#define RSA_public_encrypt GRPC_SHADOW_RSA_public_encrypt', - '#define RSAPublicKey_dup GRPC_SHADOW_RSAPublicKey_dup', - '#define RSA_public_key_from_bytes GRPC_SHADOW_RSA_public_key_from_bytes', - '#define RSA_public_key_to_bytes GRPC_SHADOW_RSA_public_key_to_bytes', - '#define RSA_set0_crt_params GRPC_SHADOW_RSA_set0_crt_params', - '#define RSA_set0_factors GRPC_SHADOW_RSA_set0_factors', - '#define RSA_set0_key GRPC_SHADOW_RSA_set0_key', - '#define RSA_set_ex_data GRPC_SHADOW_RSA_set_ex_data', - '#define RSA_sign GRPC_SHADOW_RSA_sign', - '#define RSA_sign_pss_mgf1 GRPC_SHADOW_RSA_sign_pss_mgf1', - '#define RSA_sign_raw GRPC_SHADOW_RSA_sign_raw', - '#define RSA_size GRPC_SHADOW_RSA_size', - '#define RSA_up_ref GRPC_SHADOW_RSA_up_ref', - '#define RSA_verify GRPC_SHADOW_RSA_verify', - '#define RSA_verify_PKCS1_PSS_mgf1 GRPC_SHADOW_RSA_verify_PKCS1_PSS_mgf1', - '#define RSA_verify_pss_mgf1 GRPC_SHADOW_RSA_verify_pss_mgf1', - '#define RSA_verify_raw GRPC_SHADOW_RSA_verify_raw', - '#define rsaz_1024_gather5_avx2 GRPC_SHADOW_rsaz_1024_gather5_avx2', - '#define RSAZ_1024_mod_exp_avx2 GRPC_SHADOW_RSAZ_1024_mod_exp_avx2', - '#define rsaz_1024_mul_avx2 GRPC_SHADOW_rsaz_1024_mul_avx2', - '#define rsaz_1024_norm2red_avx2 GRPC_SHADOW_rsaz_1024_norm2red_avx2', - '#define rsaz_1024_red2norm_avx2 GRPC_SHADOW_rsaz_1024_red2norm_avx2', - '#define rsaz_1024_scatter5_avx2 GRPC_SHADOW_rsaz_1024_scatter5_avx2', - '#define rsaz_1024_sqr_avx2 GRPC_SHADOW_rsaz_1024_sqr_avx2', - '#define s2i_ASN1_INTEGER GRPC_SHADOW_s2i_ASN1_INTEGER', - '#define s2i_ASN1_OCTET_STRING GRPC_SHADOW_s2i_ASN1_OCTET_STRING', - '#define sdallocx GRPC_SHADOW_sdallocx', - '#define SHA1 GRPC_SHADOW_SHA1', - '#define sha1_block_data_order GRPC_SHADOW_sha1_block_data_order', - '#define SHA1_Final GRPC_SHADOW_SHA1_Final', - '#define SHA1_Init GRPC_SHADOW_SHA1_Init', - '#define SHA1_Transform GRPC_SHADOW_SHA1_Transform', - '#define SHA1_Update GRPC_SHADOW_SHA1_Update', - '#define SHA224 GRPC_SHADOW_SHA224', - '#define SHA224_Final GRPC_SHADOW_SHA224_Final', - '#define SHA224_Init GRPC_SHADOW_SHA224_Init', - '#define SHA224_Update GRPC_SHADOW_SHA224_Update', - '#define SHA256 GRPC_SHADOW_SHA256', - '#define sha256_block_data_order GRPC_SHADOW_sha256_block_data_order', - '#define SHA256_Final GRPC_SHADOW_SHA256_Final', - '#define SHA256_Init GRPC_SHADOW_SHA256_Init', - '#define SHA256_Transform GRPC_SHADOW_SHA256_Transform', - '#define SHA256_TransformBlocks GRPC_SHADOW_SHA256_TransformBlocks', - '#define SHA256_Update GRPC_SHADOW_SHA256_Update', - '#define SHA384 GRPC_SHADOW_SHA384', - '#define SHA384_Final GRPC_SHADOW_SHA384_Final', - '#define SHA384_Init GRPC_SHADOW_SHA384_Init', - '#define SHA384_Update GRPC_SHADOW_SHA384_Update', - '#define SHA512 GRPC_SHADOW_SHA512', - '#define sha512_block_data_order GRPC_SHADOW_sha512_block_data_order', - '#define SHA512_Final GRPC_SHADOW_SHA512_Final', - '#define SHA512_Init GRPC_SHADOW_SHA512_Init', - '#define SHA512_Transform GRPC_SHADOW_SHA512_Transform', - '#define SHA512_Update GRPC_SHADOW_SHA512_Update', - '#define SIPHASH_24 GRPC_SHADOW_SIPHASH_24', - '#define sk_CRYPTO_BUFFER_call_copy_func GRPC_SHADOW_sk_CRYPTO_BUFFER_call_copy_func', - '#define sk_CRYPTO_BUFFER_call_copy_func GRPC_SHADOW_sk_CRYPTO_BUFFER_call_copy_func', - '#define sk_CRYPTO_BUFFER_call_free_func GRPC_SHADOW_sk_CRYPTO_BUFFER_call_free_func', - '#define sk_CRYPTO_BUFFER_call_free_func GRPC_SHADOW_sk_CRYPTO_BUFFER_call_free_func', - '#define sk_CRYPTO_BUFFER_deep_copy GRPC_SHADOW_sk_CRYPTO_BUFFER_deep_copy', - '#define sk_CRYPTO_BUFFER_deep_copy GRPC_SHADOW_sk_CRYPTO_BUFFER_deep_copy', - '#define sk_CRYPTO_BUFFER_new_null GRPC_SHADOW_sk_CRYPTO_BUFFER_new_null', - '#define sk_CRYPTO_BUFFER_new_null GRPC_SHADOW_sk_CRYPTO_BUFFER_new_null', - '#define sk_CRYPTO_BUFFER_new_null GRPC_SHADOW_sk_CRYPTO_BUFFER_new_null', - '#define sk_CRYPTO_BUFFER_new_null GRPC_SHADOW_sk_CRYPTO_BUFFER_new_null', - '#define sk_CRYPTO_BUFFER_new_null GRPC_SHADOW_sk_CRYPTO_BUFFER_new_null', - '#define sk_CRYPTO_BUFFER_new_null GRPC_SHADOW_sk_CRYPTO_BUFFER_new_null', - '#define sk_CRYPTO_BUFFER_num GRPC_SHADOW_sk_CRYPTO_BUFFER_num', - '#define sk_CRYPTO_BUFFER_num GRPC_SHADOW_sk_CRYPTO_BUFFER_num', - '#define sk_CRYPTO_BUFFER_num GRPC_SHADOW_sk_CRYPTO_BUFFER_num', - '#define sk_CRYPTO_BUFFER_num GRPC_SHADOW_sk_CRYPTO_BUFFER_num', - '#define sk_CRYPTO_BUFFER_num GRPC_SHADOW_sk_CRYPTO_BUFFER_num', - '#define sk_CRYPTO_BUFFER_num GRPC_SHADOW_sk_CRYPTO_BUFFER_num', - '#define sk_CRYPTO_BUFFER_num GRPC_SHADOW_sk_CRYPTO_BUFFER_num', - '#define sk_CRYPTO_BUFFER_num GRPC_SHADOW_sk_CRYPTO_BUFFER_num', - '#define sk_CRYPTO_BUFFER_num GRPC_SHADOW_sk_CRYPTO_BUFFER_num', - '#define sk_CRYPTO_BUFFER_push GRPC_SHADOW_sk_CRYPTO_BUFFER_push', - '#define sk_CRYPTO_BUFFER_set GRPC_SHADOW_sk_CRYPTO_BUFFER_set', - '#define sk_CRYPTO_BUFFER_value GRPC_SHADOW_sk_CRYPTO_BUFFER_value', - '#define sk_CRYPTO_BUFFER_value GRPC_SHADOW_sk_CRYPTO_BUFFER_value', - '#define sk_CRYPTO_BUFFER_value GRPC_SHADOW_sk_CRYPTO_BUFFER_value', - '#define sk_CRYPTO_BUFFER_value GRPC_SHADOW_sk_CRYPTO_BUFFER_value', - '#define sk_CRYPTO_BUFFER_value GRPC_SHADOW_sk_CRYPTO_BUFFER_value', - '#define sk_CRYPTO_BUFFER_value GRPC_SHADOW_sk_CRYPTO_BUFFER_value', - '#define sk_CRYPTO_BUFFER_value GRPC_SHADOW_sk_CRYPTO_BUFFER_value', - '#define sk_deep_copy GRPC_SHADOW_sk_deep_copy', - '#define sk_delete GRPC_SHADOW_sk_delete', - '#define sk_delete_ptr GRPC_SHADOW_sk_delete_ptr', - '#define sk_dup GRPC_SHADOW_sk_dup', - '#define sk_find GRPC_SHADOW_sk_find', - '#define sk_free GRPC_SHADOW_sk_free', - '#define sk_insert GRPC_SHADOW_sk_insert', - '#define sk_is_sorted GRPC_SHADOW_sk_is_sorted', - '#define sk_new GRPC_SHADOW_sk_new', - '#define sk_new_null GRPC_SHADOW_sk_new_null', - '#define sk_num GRPC_SHADOW_sk_num', - '#define sk_pop GRPC_SHADOW_sk_pop', - '#define sk_pop_free GRPC_SHADOW_sk_pop_free', - '#define sk_pop_free_ex GRPC_SHADOW_sk_pop_free_ex', - '#define sk_push GRPC_SHADOW_sk_push', - '#define sk_set GRPC_SHADOW_sk_set', - '#define sk_set_cmp_func GRPC_SHADOW_sk_set_cmp_func', - '#define sk_shift GRPC_SHADOW_sk_shift', - '#define sk_sort GRPC_SHADOW_sk_sort', - '#define sk_SRTP_PROTECTION_PROFILE_new_null GRPC_SHADOW_sk_SRTP_PROTECTION_PROFILE_new_null', - '#define sk_SRTP_PROTECTION_PROFILE_num GRPC_SHADOW_sk_SRTP_PROTECTION_PROFILE_num', - '#define sk_SRTP_PROTECTION_PROFILE_push GRPC_SHADOW_sk_SRTP_PROTECTION_PROFILE_push', - '#define sk_SSL_CIPHER_call_cmp_func GRPC_SHADOW_sk_SSL_CIPHER_call_cmp_func', - '#define sk_SSL_CIPHER_call_cmp_func GRPC_SHADOW_sk_SSL_CIPHER_call_cmp_func', - '#define sk_SSL_CIPHER_call_cmp_func GRPC_SHADOW_sk_SSL_CIPHER_call_cmp_func', - '#define sk_SSL_CIPHER_call_cmp_func GRPC_SHADOW_sk_SSL_CIPHER_call_cmp_func', - '#define sk_SSL_CIPHER_delete GRPC_SHADOW_sk_SSL_CIPHER_delete', - '#define sk_SSL_CIPHER_dup GRPC_SHADOW_sk_SSL_CIPHER_dup', - '#define sk_SSL_CIPHER_find GRPC_SHADOW_sk_SSL_CIPHER_find', - '#define sk_SSL_CIPHER_find GRPC_SHADOW_sk_SSL_CIPHER_find', - '#define sk_SSL_CIPHER_find GRPC_SHADOW_sk_SSL_CIPHER_find', - '#define sk_SSL_CIPHER_find GRPC_SHADOW_sk_SSL_CIPHER_find', - '#define sk_SSL_CIPHER_new_null GRPC_SHADOW_sk_SSL_CIPHER_new_null', - '#define sk_SSL_CIPHER_new_null GRPC_SHADOW_sk_SSL_CIPHER_new_null', - '#define sk_SSL_CIPHER_new_null GRPC_SHADOW_sk_SSL_CIPHER_new_null', - '#define sk_SSL_CIPHER_num GRPC_SHADOW_sk_SSL_CIPHER_num', - '#define sk_SSL_CIPHER_num GRPC_SHADOW_sk_SSL_CIPHER_num', - '#define sk_SSL_CIPHER_num GRPC_SHADOW_sk_SSL_CIPHER_num', - '#define sk_SSL_CIPHER_num GRPC_SHADOW_sk_SSL_CIPHER_num', - '#define sk_SSL_CIPHER_push GRPC_SHADOW_sk_SSL_CIPHER_push', - '#define sk_SSL_CIPHER_push GRPC_SHADOW_sk_SSL_CIPHER_push', - '#define sk_SSL_CIPHER_push GRPC_SHADOW_sk_SSL_CIPHER_push', - '#define sk_SSL_CIPHER_value GRPC_SHADOW_sk_SSL_CIPHER_value', - '#define sk_SSL_CIPHER_value GRPC_SHADOW_sk_SSL_CIPHER_value', - '#define sk_value GRPC_SHADOW_sk_value', - '#define sk_X509_call_free_func GRPC_SHADOW_sk_X509_call_free_func', - '#define sk_X509_NAME_call_cmp_func GRPC_SHADOW_sk_X509_NAME_call_cmp_func', - '#define sk_X509_NAME_call_copy_func GRPC_SHADOW_sk_X509_NAME_call_copy_func', - '#define sk_X509_NAME_call_free_func GRPC_SHADOW_sk_X509_NAME_call_free_func', - '#define sk_X509_NAME_call_free_func GRPC_SHADOW_sk_X509_NAME_call_free_func', - '#define sk_X509_NAME_deep_copy GRPC_SHADOW_sk_X509_NAME_deep_copy', - '#define sk_X509_NAME_find GRPC_SHADOW_sk_X509_NAME_find', - '#define sk_X509_NAME_free GRPC_SHADOW_sk_X509_NAME_free', - '#define sk_X509_NAME_new GRPC_SHADOW_sk_X509_NAME_new', - '#define sk_X509_NAME_new_null GRPC_SHADOW_sk_X509_NAME_new_null', - '#define sk_X509_NAME_new_null GRPC_SHADOW_sk_X509_NAME_new_null', - '#define sk_X509_NAME_pop_free GRPC_SHADOW_sk_X509_NAME_pop_free', - '#define sk_X509_NAME_pop_free GRPC_SHADOW_sk_X509_NAME_pop_free', - '#define sk_X509_NAME_push GRPC_SHADOW_sk_X509_NAME_push', - '#define sk_X509_NAME_set_cmp_func GRPC_SHADOW_sk_X509_NAME_set_cmp_func', - '#define sk_X509_NAME_sort GRPC_SHADOW_sk_X509_NAME_sort', - '#define sk_X509_new_null GRPC_SHADOW_sk_X509_new_null', - '#define sk_X509_num GRPC_SHADOW_sk_X509_num', - '#define sk_X509_pop_free GRPC_SHADOW_sk_X509_pop_free', - '#define sk_X509_shift GRPC_SHADOW_sk_X509_shift', - '#define sk_X509_value GRPC_SHADOW_sk_X509_value', - '#define sk_zero GRPC_SHADOW_sk_zero', - '#define SPAKE2_CTX_free GRPC_SHADOW_SPAKE2_CTX_free', - '#define SPAKE2_CTX_new GRPC_SHADOW_SPAKE2_CTX_new', - '#define SPAKE2_generate_msg GRPC_SHADOW_SPAKE2_generate_msg', - '#define SPAKE2_process_msg GRPC_SHADOW_SPAKE2_process_msg', - '#define SSL_accept GRPC_SHADOW_SSL_accept', - '#define SSL_add0_chain_cert GRPC_SHADOW_SSL_add0_chain_cert', - '#define SSL_add1_chain_cert GRPC_SHADOW_SSL_add1_chain_cert', - '#define SSL_add_client_CA GRPC_SHADOW_SSL_add_client_CA', - '#define SSL_add_file_cert_subjects_to_stack GRPC_SHADOW_SSL_add_file_cert_subjects_to_stack', - '#define SSL_alert_desc_string GRPC_SHADOW_SSL_alert_desc_string', - '#define SSL_alert_desc_string_long GRPC_SHADOW_SSL_alert_desc_string_long', - '#define SSL_alert_from_verify_result GRPC_SHADOW_SSL_alert_from_verify_result', - '#define SSL_alert_type_string GRPC_SHADOW_SSL_alert_type_string', - '#define SSL_alert_type_string_long GRPC_SHADOW_SSL_alert_type_string_long', - '#define SSL_cache_hit GRPC_SHADOW_SSL_cache_hit', - '#define SSL_certs_clear GRPC_SHADOW_SSL_certs_clear', - '#define SSL_check_private_key GRPC_SHADOW_SSL_check_private_key', - '#define SSL_CIPHER_description GRPC_SHADOW_SSL_CIPHER_description', - '#define SSL_CIPHER_get_auth_nid GRPC_SHADOW_SSL_CIPHER_get_auth_nid', - '#define SSL_CIPHER_get_bits GRPC_SHADOW_SSL_CIPHER_get_bits', - '#define SSL_CIPHER_get_cipher_nid GRPC_SHADOW_SSL_CIPHER_get_cipher_nid', - '#define SSL_CIPHER_get_digest_nid GRPC_SHADOW_SSL_CIPHER_get_digest_nid', - '#define SSL_CIPHER_get_id GRPC_SHADOW_SSL_CIPHER_get_id', - '#define SSL_CIPHER_get_kx_name GRPC_SHADOW_SSL_CIPHER_get_kx_name', - '#define SSL_CIPHER_get_kx_nid GRPC_SHADOW_SSL_CIPHER_get_kx_nid', - '#define SSL_CIPHER_get_max_version GRPC_SHADOW_SSL_CIPHER_get_max_version', - '#define SSL_CIPHER_get_min_version GRPC_SHADOW_SSL_CIPHER_get_min_version', - '#define SSL_CIPHER_get_name GRPC_SHADOW_SSL_CIPHER_get_name', - '#define SSL_CIPHER_get_prf_nid GRPC_SHADOW_SSL_CIPHER_get_prf_nid', - '#define SSL_CIPHER_get_rfc_name GRPC_SHADOW_SSL_CIPHER_get_rfc_name', - '#define SSL_CIPHER_get_value GRPC_SHADOW_SSL_CIPHER_get_value', - '#define SSL_CIPHER_get_version GRPC_SHADOW_SSL_CIPHER_get_version', - '#define SSL_CIPHER_is_aead GRPC_SHADOW_SSL_CIPHER_is_aead', - '#define SSL_CIPHER_is_block_cipher GRPC_SHADOW_SSL_CIPHER_is_block_cipher', - '#define SSL_CIPHER_standard_name GRPC_SHADOW_SSL_CIPHER_standard_name', - '#define SSL_clear GRPC_SHADOW_SSL_clear', - '#define SSL_clear_chain_certs GRPC_SHADOW_SSL_clear_chain_certs', - '#define SSL_clear_mode GRPC_SHADOW_SSL_clear_mode', - '#define SSL_clear_options GRPC_SHADOW_SSL_clear_options', - '#define SSL_COMP_add_compression_method GRPC_SHADOW_SSL_COMP_add_compression_method', - '#define SSL_COMP_free_compression_methods GRPC_SHADOW_SSL_COMP_free_compression_methods', - '#define SSL_COMP_get0_name GRPC_SHADOW_SSL_COMP_get0_name', - '#define SSL_COMP_get_compression_methods GRPC_SHADOW_SSL_COMP_get_compression_methods', - '#define SSL_COMP_get_id GRPC_SHADOW_SSL_COMP_get_id', - '#define SSL_COMP_get_name GRPC_SHADOW_SSL_COMP_get_name', - '#define SSL_connect GRPC_SHADOW_SSL_connect', - '#define SSL_CTX_add0_chain_cert GRPC_SHADOW_SSL_CTX_add0_chain_cert', - '#define SSL_CTX_add1_chain_cert GRPC_SHADOW_SSL_CTX_add1_chain_cert', - '#define SSL_CTX_add_cert_compression_alg GRPC_SHADOW_SSL_CTX_add_cert_compression_alg', - '#define SSL_CTX_add_client_CA GRPC_SHADOW_SSL_CTX_add_client_CA', - '#define SSL_CTX_add_extra_chain_cert GRPC_SHADOW_SSL_CTX_add_extra_chain_cert', - '#define SSL_CTX_add_session GRPC_SHADOW_SSL_CTX_add_session', - '#define SSL_CTX_check_private_key GRPC_SHADOW_SSL_CTX_check_private_key', - '#define SSL_CTX_cipher_in_group GRPC_SHADOW_SSL_CTX_cipher_in_group', - '#define SSL_CTX_clear_chain_certs GRPC_SHADOW_SSL_CTX_clear_chain_certs', - '#define SSL_CTX_clear_extra_chain_certs GRPC_SHADOW_SSL_CTX_clear_extra_chain_certs', - '#define SSL_CTX_clear_mode GRPC_SHADOW_SSL_CTX_clear_mode', - '#define SSL_CTX_clear_options GRPC_SHADOW_SSL_CTX_clear_options', - '#define SSL_CTX_enable_ocsp_stapling GRPC_SHADOW_SSL_CTX_enable_ocsp_stapling', - '#define SSL_CTX_enable_signed_cert_timestamps GRPC_SHADOW_SSL_CTX_enable_signed_cert_timestamps', - '#define SSL_CTX_enable_tls_channel_id GRPC_SHADOW_SSL_CTX_enable_tls_channel_id', - '#define SSL_CTX_flush_sessions GRPC_SHADOW_SSL_CTX_flush_sessions', - '#define SSL_CTX_free GRPC_SHADOW_SSL_CTX_free', - '#define SSL_CTX_get0_certificate GRPC_SHADOW_SSL_CTX_get0_certificate', - '#define SSL_CTX_get0_chain_certs GRPC_SHADOW_SSL_CTX_get0_chain_certs', - '#define SSL_CTX_get0_param GRPC_SHADOW_SSL_CTX_get0_param', - '#define SSL_CTX_get0_privatekey GRPC_SHADOW_SSL_CTX_get0_privatekey', - '#define SSL_CTX_get_cert_store GRPC_SHADOW_SSL_CTX_get_cert_store', - '#define SSL_CTX_get_channel_id_cb GRPC_SHADOW_SSL_CTX_get_channel_id_cb', - '#define SSL_CTX_get_ciphers GRPC_SHADOW_SSL_CTX_get_ciphers', - '#define SSL_CTX_get_client_CA_list GRPC_SHADOW_SSL_CTX_get_client_CA_list', - '#define SSL_CTX_get_default_passwd_cb GRPC_SHADOW_SSL_CTX_get_default_passwd_cb', - '#define SSL_CTX_get_default_passwd_cb_userdata GRPC_SHADOW_SSL_CTX_get_default_passwd_cb_userdata', - '#define SSL_CTX_get_ex_data GRPC_SHADOW_SSL_CTX_get_ex_data', - '#define SSL_CTX_get_ex_new_index GRPC_SHADOW_SSL_CTX_get_ex_new_index', - '#define SSL_CTX_get_extra_chain_certs GRPC_SHADOW_SSL_CTX_get_extra_chain_certs', - '#define SSL_CTX_get_info_callback GRPC_SHADOW_SSL_CTX_get_info_callback', - '#define SSL_CTX_get_keylog_callback GRPC_SHADOW_SSL_CTX_get_keylog_callback', - '#define SSL_CTX_get_max_cert_list GRPC_SHADOW_SSL_CTX_get_max_cert_list', - '#define SSL_CTX_get_max_proto_version GRPC_SHADOW_SSL_CTX_get_max_proto_version', - '#define SSL_CTX_get_min_proto_version GRPC_SHADOW_SSL_CTX_get_min_proto_version', - '#define SSL_CTX_get_mode GRPC_SHADOW_SSL_CTX_get_mode', - '#define SSL_CTX_get_options GRPC_SHADOW_SSL_CTX_get_options', - '#define SSL_CTX_get_quiet_shutdown GRPC_SHADOW_SSL_CTX_get_quiet_shutdown', - '#define SSL_CTX_get_read_ahead GRPC_SHADOW_SSL_CTX_get_read_ahead', - '#define SSL_CTX_get_session_cache_mode GRPC_SHADOW_SSL_CTX_get_session_cache_mode', - '#define SSL_CTX_get_timeout GRPC_SHADOW_SSL_CTX_get_timeout', - '#define SSL_CTX_get_tlsext_ticket_keys GRPC_SHADOW_SSL_CTX_get_tlsext_ticket_keys', - '#define SSL_CTX_get_verify_callback GRPC_SHADOW_SSL_CTX_get_verify_callback', - '#define SSL_CTX_get_verify_depth GRPC_SHADOW_SSL_CTX_get_verify_depth', - '#define SSL_CTX_get_verify_mode GRPC_SHADOW_SSL_CTX_get_verify_mode', - '#define SSL_CTX_load_verify_locations GRPC_SHADOW_SSL_CTX_load_verify_locations', - '#define SSL_CTX_need_tmp_RSA GRPC_SHADOW_SSL_CTX_need_tmp_RSA', - '#define SSL_CTX_new GRPC_SHADOW_SSL_CTX_new', - '#define SSL_CTX_remove_session GRPC_SHADOW_SSL_CTX_remove_session', - '#define SSL_CTX_sess_accept GRPC_SHADOW_SSL_CTX_sess_accept', - '#define SSL_CTX_sess_accept_good GRPC_SHADOW_SSL_CTX_sess_accept_good', - '#define SSL_CTX_sess_accept_renegotiate GRPC_SHADOW_SSL_CTX_sess_accept_renegotiate', - '#define SSL_CTX_sess_cache_full GRPC_SHADOW_SSL_CTX_sess_cache_full', - '#define SSL_CTX_sess_cb_hits GRPC_SHADOW_SSL_CTX_sess_cb_hits', - '#define SSL_CTX_sess_connect GRPC_SHADOW_SSL_CTX_sess_connect', - '#define SSL_CTX_sess_connect_good GRPC_SHADOW_SSL_CTX_sess_connect_good', - '#define SSL_CTX_sess_connect_renegotiate GRPC_SHADOW_SSL_CTX_sess_connect_renegotiate', - '#define SSL_CTX_sess_get_cache_size GRPC_SHADOW_SSL_CTX_sess_get_cache_size', - '#define SSL_CTX_sess_get_get_cb GRPC_SHADOW_SSL_CTX_sess_get_get_cb', - '#define SSL_CTX_sess_get_new_cb GRPC_SHADOW_SSL_CTX_sess_get_new_cb', - '#define SSL_CTX_sess_get_remove_cb GRPC_SHADOW_SSL_CTX_sess_get_remove_cb', - '#define SSL_CTX_sess_hits GRPC_SHADOW_SSL_CTX_sess_hits', - '#define SSL_CTX_sess_misses GRPC_SHADOW_SSL_CTX_sess_misses', - '#define SSL_CTX_sess_number GRPC_SHADOW_SSL_CTX_sess_number', - '#define SSL_CTX_sess_set_cache_size GRPC_SHADOW_SSL_CTX_sess_set_cache_size', - '#define SSL_CTX_sess_set_get_cb GRPC_SHADOW_SSL_CTX_sess_set_get_cb', - '#define SSL_CTX_sess_set_new_cb GRPC_SHADOW_SSL_CTX_sess_set_new_cb', - '#define SSL_CTX_sess_set_remove_cb GRPC_SHADOW_SSL_CTX_sess_set_remove_cb', - '#define SSL_CTX_sess_timeouts GRPC_SHADOW_SSL_CTX_sess_timeouts', - '#define SSL_CTX_set0_buffer_pool GRPC_SHADOW_SSL_CTX_set0_buffer_pool', - '#define SSL_CTX_set0_chain GRPC_SHADOW_SSL_CTX_set0_chain', - '#define SSL_CTX_set0_client_CAs GRPC_SHADOW_SSL_CTX_set0_client_CAs', - '#define SSL_CTX_set0_verify_cert_store GRPC_SHADOW_SSL_CTX_set0_verify_cert_store', - '#define SSL_CTX_set1_chain GRPC_SHADOW_SSL_CTX_set1_chain', - '#define SSL_CTX_set1_curves GRPC_SHADOW_SSL_CTX_set1_curves', - '#define SSL_CTX_set1_curves_list GRPC_SHADOW_SSL_CTX_set1_curves_list', - '#define SSL_CTX_set1_param GRPC_SHADOW_SSL_CTX_set1_param', - '#define SSL_CTX_set1_sigalgs GRPC_SHADOW_SSL_CTX_set1_sigalgs', - '#define SSL_CTX_set1_sigalgs_list GRPC_SHADOW_SSL_CTX_set1_sigalgs_list', - '#define SSL_CTX_set1_tls_channel_id GRPC_SHADOW_SSL_CTX_set1_tls_channel_id', - '#define SSL_CTX_set1_verify_cert_store GRPC_SHADOW_SSL_CTX_set1_verify_cert_store', - '#define SSL_CTX_set_allow_unknown_alpn_protos GRPC_SHADOW_SSL_CTX_set_allow_unknown_alpn_protos', - '#define SSL_CTX_set_alpn_protos GRPC_SHADOW_SSL_CTX_set_alpn_protos', - '#define SSL_CTX_set_alpn_select_cb GRPC_SHADOW_SSL_CTX_set_alpn_select_cb', - '#define SSL_CTX_set_cert_cb GRPC_SHADOW_SSL_CTX_set_cert_cb', - '#define SSL_CTX_set_cert_store GRPC_SHADOW_SSL_CTX_set_cert_store', - '#define SSL_CTX_set_cert_verify_callback GRPC_SHADOW_SSL_CTX_set_cert_verify_callback', - '#define SSL_CTX_set_chain_and_key GRPC_SHADOW_SSL_CTX_set_chain_and_key', - '#define SSL_CTX_set_channel_id_cb GRPC_SHADOW_SSL_CTX_set_channel_id_cb', - '#define SSL_CTX_set_cipher_list GRPC_SHADOW_SSL_CTX_set_cipher_list', - '#define SSL_CTX_set_client_CA_list GRPC_SHADOW_SSL_CTX_set_client_CA_list', - '#define SSL_CTX_set_client_cert_cb GRPC_SHADOW_SSL_CTX_set_client_cert_cb', - '#define SSL_CTX_set_current_time_cb GRPC_SHADOW_SSL_CTX_set_current_time_cb', - '#define SSL_CTX_set_custom_verify GRPC_SHADOW_SSL_CTX_set_custom_verify', - '#define SSL_CTX_set_default_passwd_cb GRPC_SHADOW_SSL_CTX_set_default_passwd_cb', - '#define SSL_CTX_set_default_passwd_cb_userdata GRPC_SHADOW_SSL_CTX_set_default_passwd_cb_userdata', - '#define SSL_CTX_set_default_verify_paths GRPC_SHADOW_SSL_CTX_set_default_verify_paths', - '#define SSL_CTX_set_dos_protection_cb GRPC_SHADOW_SSL_CTX_set_dos_protection_cb', - '#define SSL_CTX_set_early_data_enabled GRPC_SHADOW_SSL_CTX_set_early_data_enabled', - '#define SSL_CTX_set_ed25519_enabled GRPC_SHADOW_SSL_CTX_set_ed25519_enabled', - '#define SSL_CTX_set_ex_data GRPC_SHADOW_SSL_CTX_set_ex_data', - '#define SSL_CTX_set_false_start_allowed_without_alpn GRPC_SHADOW_SSL_CTX_set_false_start_allowed_without_alpn', - '#define SSL_CTX_set_grease_enabled GRPC_SHADOW_SSL_CTX_set_grease_enabled', - '#define SSL_CTX_set_ignore_tls13_downgrade GRPC_SHADOW_SSL_CTX_set_ignore_tls13_downgrade', - '#define SSL_CTX_set_info_callback GRPC_SHADOW_SSL_CTX_set_info_callback', - '#define SSL_CTX_set_keylog_callback GRPC_SHADOW_SSL_CTX_set_keylog_callback', - '#define SSL_CTX_set_max_cert_list GRPC_SHADOW_SSL_CTX_set_max_cert_list', - '#define SSL_CTX_set_max_proto_version GRPC_SHADOW_SSL_CTX_set_max_proto_version', - '#define SSL_CTX_set_max_send_fragment GRPC_SHADOW_SSL_CTX_set_max_send_fragment', - '#define SSL_CTX_set_min_proto_version GRPC_SHADOW_SSL_CTX_set_min_proto_version', - '#define SSL_CTX_set_mode GRPC_SHADOW_SSL_CTX_set_mode', - '#define SSL_CTX_set_msg_callback GRPC_SHADOW_SSL_CTX_set_msg_callback', - '#define SSL_CTX_set_msg_callback_arg GRPC_SHADOW_SSL_CTX_set_msg_callback_arg', - '#define SSL_CTX_set_next_protos_advertised_cb GRPC_SHADOW_SSL_CTX_set_next_protos_advertised_cb', - '#define SSL_CTX_set_next_proto_select_cb GRPC_SHADOW_SSL_CTX_set_next_proto_select_cb', - '#define SSL_CTX_set_ocsp_response GRPC_SHADOW_SSL_CTX_set_ocsp_response', - '#define SSL_CTX_set_options GRPC_SHADOW_SSL_CTX_set_options', - '#define SSL_CTX_set_private_key_method GRPC_SHADOW_SSL_CTX_set_private_key_method', - '#define SSL_CTX_set_psk_client_callback GRPC_SHADOW_SSL_CTX_set_psk_client_callback', - '#define SSL_CTX_set_psk_server_callback GRPC_SHADOW_SSL_CTX_set_psk_server_callback', - '#define SSL_CTX_set_purpose GRPC_SHADOW_SSL_CTX_set_purpose', - '#define SSL_CTX_set_quic_method GRPC_SHADOW_SSL_CTX_set_quic_method', - '#define SSL_CTX_set_quiet_shutdown GRPC_SHADOW_SSL_CTX_set_quiet_shutdown', - '#define SSL_CTX_set_read_ahead GRPC_SHADOW_SSL_CTX_set_read_ahead', - '#define SSL_CTX_set_retain_only_sha256_of_client_certs GRPC_SHADOW_SSL_CTX_set_retain_only_sha256_of_client_certs', - '#define SSL_CTX_set_reverify_on_resume GRPC_SHADOW_SSL_CTX_set_reverify_on_resume', - '#define SSL_CTX_set_select_certificate_cb GRPC_SHADOW_SSL_CTX_set_select_certificate_cb', - '#define SSL_CTX_set_session_cache_mode GRPC_SHADOW_SSL_CTX_set_session_cache_mode', - '#define SSL_CTX_set_session_id_context GRPC_SHADOW_SSL_CTX_set_session_id_context', - '#define SSL_CTX_set_session_psk_dhe_timeout GRPC_SHADOW_SSL_CTX_set_session_psk_dhe_timeout', - '#define SSL_CTX_set_signed_cert_timestamp_list GRPC_SHADOW_SSL_CTX_set_signed_cert_timestamp_list', - '#define SSL_CTX_set_signing_algorithm_prefs GRPC_SHADOW_SSL_CTX_set_signing_algorithm_prefs', - '#define SSL_CTX_set_srtp_profiles GRPC_SHADOW_SSL_CTX_set_srtp_profiles', - '#define SSL_CTX_set_strict_cipher_list GRPC_SHADOW_SSL_CTX_set_strict_cipher_list', - '#define SSL_CTX_set_ticket_aead_method GRPC_SHADOW_SSL_CTX_set_ticket_aead_method', - '#define SSL_CTX_set_timeout GRPC_SHADOW_SSL_CTX_set_timeout', - '#define SSL_CTX_set_tls_channel_id_enabled GRPC_SHADOW_SSL_CTX_set_tls_channel_id_enabled', - '#define SSL_CTX_set_tlsext_servername_arg GRPC_SHADOW_SSL_CTX_set_tlsext_servername_arg', - '#define SSL_CTX_set_tlsext_servername_callback GRPC_SHADOW_SSL_CTX_set_tlsext_servername_callback', - '#define SSL_CTX_set_tlsext_status_arg GRPC_SHADOW_SSL_CTX_set_tlsext_status_arg', - '#define SSL_CTX_set_tlsext_status_cb GRPC_SHADOW_SSL_CTX_set_tlsext_status_cb', - '#define SSL_CTX_set_tlsext_ticket_key_cb GRPC_SHADOW_SSL_CTX_set_tlsext_ticket_key_cb', - '#define SSL_CTX_set_tlsext_ticket_keys GRPC_SHADOW_SSL_CTX_set_tlsext_ticket_keys', - '#define SSL_CTX_set_tlsext_use_srtp GRPC_SHADOW_SSL_CTX_set_tlsext_use_srtp', - '#define SSL_CTX_set_tmp_dh GRPC_SHADOW_SSL_CTX_set_tmp_dh', - '#define SSL_CTX_set_tmp_dh_callback GRPC_SHADOW_SSL_CTX_set_tmp_dh_callback', - '#define SSL_CTX_set_tmp_ecdh GRPC_SHADOW_SSL_CTX_set_tmp_ecdh', - '#define SSL_CTX_set_tmp_rsa GRPC_SHADOW_SSL_CTX_set_tmp_rsa', - '#define SSL_CTX_set_tmp_rsa_callback GRPC_SHADOW_SSL_CTX_set_tmp_rsa_callback', - '#define SSL_CTX_set_trust GRPC_SHADOW_SSL_CTX_set_trust', - '#define SSL_CTX_set_verify GRPC_SHADOW_SSL_CTX_set_verify', - '#define SSL_CTX_set_verify_algorithm_prefs GRPC_SHADOW_SSL_CTX_set_verify_algorithm_prefs', - '#define SSL_CTX_set_verify_depth GRPC_SHADOW_SSL_CTX_set_verify_depth', - '#define SSL_CTX_up_ref GRPC_SHADOW_SSL_CTX_up_ref', - '#define SSL_CTX_use_certificate GRPC_SHADOW_SSL_CTX_use_certificate', - '#define SSL_CTX_use_certificate_ASN1 GRPC_SHADOW_SSL_CTX_use_certificate_ASN1', - '#define SSL_CTX_use_certificate_chain_file GRPC_SHADOW_SSL_CTX_use_certificate_chain_file', - '#define SSL_CTX_use_certificate_file GRPC_SHADOW_SSL_CTX_use_certificate_file', - '#define SSL_CTX_use_PrivateKey GRPC_SHADOW_SSL_CTX_use_PrivateKey', - '#define SSL_CTX_use_PrivateKey_ASN1 GRPC_SHADOW_SSL_CTX_use_PrivateKey_ASN1', - '#define SSL_CTX_use_PrivateKey_file GRPC_SHADOW_SSL_CTX_use_PrivateKey_file', - '#define SSL_CTX_use_psk_identity_hint GRPC_SHADOW_SSL_CTX_use_psk_identity_hint', - '#define SSL_CTX_use_RSAPrivateKey GRPC_SHADOW_SSL_CTX_use_RSAPrivateKey', - '#define SSL_CTX_use_RSAPrivateKey_ASN1 GRPC_SHADOW_SSL_CTX_use_RSAPrivateKey_ASN1', - '#define SSL_CTX_use_RSAPrivateKey_file GRPC_SHADOW_SSL_CTX_use_RSAPrivateKey_file', - '#define SSL_cutthrough_complete GRPC_SHADOW_SSL_cutthrough_complete', - '#define SSL_delegated_credential_used GRPC_SHADOW_SSL_delegated_credential_used', - '#define SSL_do_handshake GRPC_SHADOW_SSL_do_handshake', - '#define SSL_dup_CA_list GRPC_SHADOW_SSL_dup_CA_list', - '#define SSL_early_callback_ctx_extension_get GRPC_SHADOW_SSL_early_callback_ctx_extension_get', - '#define SSL_early_data_accepted GRPC_SHADOW_SSL_early_data_accepted', - '#define SSLeay GRPC_SHADOW_SSLeay', - '#define SSLeay_version GRPC_SHADOW_SSLeay_version', - '#define SSL_enable_ocsp_stapling GRPC_SHADOW_SSL_enable_ocsp_stapling', - '#define SSL_enable_signed_cert_timestamps GRPC_SHADOW_SSL_enable_signed_cert_timestamps', - '#define SSL_enable_tls_channel_id GRPC_SHADOW_SSL_enable_tls_channel_id', - '#define SSL_error_description GRPC_SHADOW_SSL_error_description', - '#define SSL_export_keying_material GRPC_SHADOW_SSL_export_keying_material', - '#define SSL_free GRPC_SHADOW_SSL_free', - '#define SSL_generate_key_block GRPC_SHADOW_SSL_generate_key_block', - '#define SSL_get0_alpn_selected GRPC_SHADOW_SSL_get0_alpn_selected', - '#define SSL_get0_certificate_types GRPC_SHADOW_SSL_get0_certificate_types', - '#define SSL_get0_chain_certs GRPC_SHADOW_SSL_get0_chain_certs', - '#define SSL_get0_next_proto_negotiated GRPC_SHADOW_SSL_get0_next_proto_negotiated', - '#define SSL_get0_ocsp_response GRPC_SHADOW_SSL_get0_ocsp_response', - '#define SSL_get0_param GRPC_SHADOW_SSL_get0_param', - '#define SSL_get0_peer_certificates GRPC_SHADOW_SSL_get0_peer_certificates', - '#define SSL_get0_peer_verify_algorithms GRPC_SHADOW_SSL_get0_peer_verify_algorithms', - '#define SSL_get0_server_requested_CAs GRPC_SHADOW_SSL_get0_server_requested_CAs', - '#define SSL_get0_session_id_context GRPC_SHADOW_SSL_get0_session_id_context', - '#define SSL_get0_signed_cert_timestamp_list GRPC_SHADOW_SSL_get0_signed_cert_timestamp_list', - '#define SSL_get1_session GRPC_SHADOW_SSL_get1_session', - '#define SSL_get_certificate GRPC_SHADOW_SSL_get_certificate', - '#define SSL_get_cipher_by_value GRPC_SHADOW_SSL_get_cipher_by_value', - '#define SSL_get_cipher_list GRPC_SHADOW_SSL_get_cipher_list', - '#define SSL_get_ciphers GRPC_SHADOW_SSL_get_ciphers', - '#define SSL_get_client_CA_list GRPC_SHADOW_SSL_get_client_CA_list', - '#define SSL_get_client_random GRPC_SHADOW_SSL_get_client_random', - '#define SSL_get_current_cipher GRPC_SHADOW_SSL_get_current_cipher', - '#define SSL_get_current_compression GRPC_SHADOW_SSL_get_current_compression', - '#define SSL_get_current_expansion GRPC_SHADOW_SSL_get_current_expansion', - '#define SSL_get_curve_id GRPC_SHADOW_SSL_get_curve_id', - '#define SSL_get_curve_name GRPC_SHADOW_SSL_get_curve_name', - '#define SSL_get_default_timeout GRPC_SHADOW_SSL_get_default_timeout', - '#define SSL_get_early_data_reason GRPC_SHADOW_SSL_get_early_data_reason', - '#define SSL_get_error GRPC_SHADOW_SSL_get_error', - '#define SSL_get_ex_data GRPC_SHADOW_SSL_get_ex_data', - '#define SSL_get_ex_data_X509_STORE_CTX_idx GRPC_SHADOW_SSL_get_ex_data_X509_STORE_CTX_idx', - '#define SSL_get_ex_new_index GRPC_SHADOW_SSL_get_ex_new_index', - '#define SSL_get_extms_support GRPC_SHADOW_SSL_get_extms_support', - '#define SSL_get_fd GRPC_SHADOW_SSL_get_fd', - '#define SSL_get_finished GRPC_SHADOW_SSL_get_finished', - '#define SSL_get_info_callback GRPC_SHADOW_SSL_get_info_callback', - '#define SSL_get_ivs GRPC_SHADOW_SSL_get_ivs', - '#define SSL_get_key_block_len GRPC_SHADOW_SSL_get_key_block_len', - '#define SSL_get_max_cert_list GRPC_SHADOW_SSL_get_max_cert_list', - '#define SSL_get_max_proto_version GRPC_SHADOW_SSL_get_max_proto_version', - '#define SSL_get_min_proto_version GRPC_SHADOW_SSL_get_min_proto_version', - '#define SSL_get_mode GRPC_SHADOW_SSL_get_mode', - '#define SSL_get_negotiated_token_binding_param GRPC_SHADOW_SSL_get_negotiated_token_binding_param', - '#define SSL_get_options GRPC_SHADOW_SSL_get_options', - '#define SSL_get_peer_cert_chain GRPC_SHADOW_SSL_get_peer_cert_chain', - '#define SSL_get_peer_certificate GRPC_SHADOW_SSL_get_peer_certificate', - '#define SSL_get_peer_finished GRPC_SHADOW_SSL_get_peer_finished', - '#define SSL_get_peer_full_cert_chain GRPC_SHADOW_SSL_get_peer_full_cert_chain', - '#define SSL_get_peer_quic_transport_params GRPC_SHADOW_SSL_get_peer_quic_transport_params', - '#define SSL_get_peer_signature_algorithm GRPC_SHADOW_SSL_get_peer_signature_algorithm', - '#define SSL_get_pending_cipher GRPC_SHADOW_SSL_get_pending_cipher', - '#define SSL_get_privatekey GRPC_SHADOW_SSL_get_privatekey', - '#define SSL_get_psk_identity GRPC_SHADOW_SSL_get_psk_identity', - '#define SSL_get_psk_identity_hint GRPC_SHADOW_SSL_get_psk_identity_hint', - '#define SSL_get_quiet_shutdown GRPC_SHADOW_SSL_get_quiet_shutdown', - '#define SSL_get_rbio GRPC_SHADOW_SSL_get_rbio', - '#define SSL_get_read_ahead GRPC_SHADOW_SSL_get_read_ahead', - '#define SSL_get_read_sequence GRPC_SHADOW_SSL_get_read_sequence', - '#define SSL_get_rfd GRPC_SHADOW_SSL_get_rfd', - '#define SSL_get_secure_renegotiation_support GRPC_SHADOW_SSL_get_secure_renegotiation_support', - '#define SSL_get_selected_srtp_profile GRPC_SHADOW_SSL_get_selected_srtp_profile', - '#define SSL_get_servername GRPC_SHADOW_SSL_get_servername', - '#define SSL_get_servername_type GRPC_SHADOW_SSL_get_servername_type', - '#define SSL_get_server_random GRPC_SHADOW_SSL_get_server_random', - '#define SSL_get_server_tmp_key GRPC_SHADOW_SSL_get_server_tmp_key', - '#define SSL_get_session GRPC_SHADOW_SSL_get_session', - '#define SSL_get_shared_ciphers GRPC_SHADOW_SSL_get_shared_ciphers', - '#define SSL_get_shared_sigalgs GRPC_SHADOW_SSL_get_shared_sigalgs', - '#define SSL_get_shutdown GRPC_SHADOW_SSL_get_shutdown', - '#define SSL_get_signature_algorithm_digest GRPC_SHADOW_SSL_get_signature_algorithm_digest', - '#define SSL_get_signature_algorithm_key_type GRPC_SHADOW_SSL_get_signature_algorithm_key_type', - '#define SSL_get_signature_algorithm_name GRPC_SHADOW_SSL_get_signature_algorithm_name', - '#define SSL_get_srtp_profiles GRPC_SHADOW_SSL_get_srtp_profiles', - '#define SSL_get_SSL_CTX GRPC_SHADOW_SSL_get_SSL_CTX', - '#define SSL_get_ticket_age_skew GRPC_SHADOW_SSL_get_ticket_age_skew', - '#define SSL_get_tls_channel_id GRPC_SHADOW_SSL_get_tls_channel_id', - '#define SSL_get_tlsext_status_ocsp_resp GRPC_SHADOW_SSL_get_tlsext_status_ocsp_resp', - '#define SSL_get_tlsext_status_type GRPC_SHADOW_SSL_get_tlsext_status_type', - '#define SSL_get_tls_unique GRPC_SHADOW_SSL_get_tls_unique', - '#define SSL_get_verify_callback GRPC_SHADOW_SSL_get_verify_callback', - '#define SSL_get_verify_depth GRPC_SHADOW_SSL_get_verify_depth', - '#define SSL_get_verify_mode GRPC_SHADOW_SSL_get_verify_mode', - '#define SSL_get_verify_result GRPC_SHADOW_SSL_get_verify_result', - '#define SSL_get_version GRPC_SHADOW_SSL_get_version', - '#define SSL_get_wbio GRPC_SHADOW_SSL_get_wbio', - '#define SSL_get_wfd GRPC_SHADOW_SSL_get_wfd', - '#define SSL_get_write_sequence GRPC_SHADOW_SSL_get_write_sequence', - '#define SSL_in_early_data GRPC_SHADOW_SSL_in_early_data', - '#define SSL_in_false_start GRPC_SHADOW_SSL_in_false_start', - '#define SSL_in_init GRPC_SHADOW_SSL_in_init', - '#define SSL_is_dtls GRPC_SHADOW_SSL_is_dtls', - '#define SSL_is_init_finished GRPC_SHADOW_SSL_is_init_finished', - '#define SSL_is_server GRPC_SHADOW_SSL_is_server', - '#define SSL_is_signature_algorithm_rsa_pss GRPC_SHADOW_SSL_is_signature_algorithm_rsa_pss', - '#define SSL_is_tls13_downgrade GRPC_SHADOW_SSL_is_tls13_downgrade', - '#define SSL_is_token_binding_negotiated GRPC_SHADOW_SSL_is_token_binding_negotiated', - '#define SSL_key_update GRPC_SHADOW_SSL_key_update', - '#define SSL_library_init GRPC_SHADOW_SSL_library_init', - '#define SSL_load_client_CA_file GRPC_SHADOW_SSL_load_client_CA_file', - '#define SSL_load_error_strings GRPC_SHADOW_SSL_load_error_strings', - '#define SSL_magic_pending_session_ptr GRPC_SHADOW_SSL_magic_pending_session_ptr', - '#define SSL_max_seal_overhead GRPC_SHADOW_SSL_max_seal_overhead', - '#define SSL_need_tmp_RSA GRPC_SHADOW_SSL_need_tmp_RSA', - '#define SSL_new GRPC_SHADOW_SSL_new', - '#define SSL_num_renegotiations GRPC_SHADOW_SSL_num_renegotiations', - '#define SSL_peek GRPC_SHADOW_SSL_peek', - '#define SSL_pending GRPC_SHADOW_SSL_pending', - '#define SSL_process_quic_post_handshake GRPC_SHADOW_SSL_process_quic_post_handshake', - '#define SSL_provide_quic_data GRPC_SHADOW_SSL_provide_quic_data', - '#define SSL_quic_max_handshake_flight_len GRPC_SHADOW_SSL_quic_max_handshake_flight_len', - '#define SSL_quic_read_level GRPC_SHADOW_SSL_quic_read_level', - '#define SSL_quic_write_level GRPC_SHADOW_SSL_quic_write_level', - '#define SSL_read GRPC_SHADOW_SSL_read', - '#define SSL_renegotiate GRPC_SHADOW_SSL_renegotiate', - '#define SSL_renegotiate_pending GRPC_SHADOW_SSL_renegotiate_pending', - '#define SSL_reset_early_data_reject GRPC_SHADOW_SSL_reset_early_data_reject', - '#define SSL_select_next_proto GRPC_SHADOW_SSL_select_next_proto', - '#define SSL_send_fatal_alert GRPC_SHADOW_SSL_send_fatal_alert', - '#define SSL_SESSION_early_data_capable GRPC_SHADOW_SSL_SESSION_early_data_capable', - '#define SSL_SESSION_free GRPC_SHADOW_SSL_SESSION_free', - '#define SSL_SESSION_from_bytes GRPC_SHADOW_SSL_SESSION_from_bytes', - '#define SSL_SESSION_get0_cipher GRPC_SHADOW_SSL_SESSION_get0_cipher', - '#define SSL_SESSION_get0_id_context GRPC_SHADOW_SSL_SESSION_get0_id_context', - '#define SSL_SESSION_get0_ocsp_response GRPC_SHADOW_SSL_SESSION_get0_ocsp_response', - '#define SSL_SESSION_get0_peer GRPC_SHADOW_SSL_SESSION_get0_peer', - '#define SSL_SESSION_get0_peer_certificates GRPC_SHADOW_SSL_SESSION_get0_peer_certificates', - '#define SSL_SESSION_get0_peer_sha256 GRPC_SHADOW_SSL_SESSION_get0_peer_sha256', - '#define SSL_SESSION_get0_signed_cert_timestamp_list GRPC_SHADOW_SSL_SESSION_get0_signed_cert_timestamp_list', - '#define SSL_SESSION_get0_ticket GRPC_SHADOW_SSL_SESSION_get0_ticket', - '#define SSL_SESSION_get_ex_data GRPC_SHADOW_SSL_SESSION_get_ex_data', - '#define SSL_SESSION_get_ex_new_index GRPC_SHADOW_SSL_SESSION_get_ex_new_index', - '#define SSL_SESSION_get_id GRPC_SHADOW_SSL_SESSION_get_id', - '#define SSL_SESSION_get_master_key GRPC_SHADOW_SSL_SESSION_get_master_key', - '#define SSL_SESSION_get_protocol_version GRPC_SHADOW_SSL_SESSION_get_protocol_version', - '#define SSL_SESSION_get_ticket_lifetime_hint GRPC_SHADOW_SSL_SESSION_get_ticket_lifetime_hint', - '#define SSL_SESSION_get_time GRPC_SHADOW_SSL_SESSION_get_time', - '#define SSL_SESSION_get_timeout GRPC_SHADOW_SSL_SESSION_get_timeout', - '#define SSL_SESSION_get_version GRPC_SHADOW_SSL_SESSION_get_version', - '#define SSL_SESSION_has_peer_sha256 GRPC_SHADOW_SSL_SESSION_has_peer_sha256', - '#define SSL_SESSION_has_ticket GRPC_SHADOW_SSL_SESSION_has_ticket', - '#define SSL_SESSION_is_resumable GRPC_SHADOW_SSL_SESSION_is_resumable', - '#define SSL_SESSION_new GRPC_SHADOW_SSL_SESSION_new', - '#define SSL_session_reused GRPC_SHADOW_SSL_session_reused', - '#define SSL_SESSION_set1_id GRPC_SHADOW_SSL_SESSION_set1_id', - '#define SSL_SESSION_set1_id_context GRPC_SHADOW_SSL_SESSION_set1_id_context', - '#define SSL_SESSION_set_ex_data GRPC_SHADOW_SSL_SESSION_set_ex_data', - '#define SSL_SESSION_set_protocol_version GRPC_SHADOW_SSL_SESSION_set_protocol_version', - '#define SSL_SESSION_set_ticket GRPC_SHADOW_SSL_SESSION_set_ticket', - '#define SSL_SESSION_set_time GRPC_SHADOW_SSL_SESSION_set_time', - '#define SSL_SESSION_set_timeout GRPC_SHADOW_SSL_SESSION_set_timeout', - '#define SSL_SESSION_should_be_single_use GRPC_SHADOW_SSL_SESSION_should_be_single_use', - '#define SSL_SESSION_to_bytes GRPC_SHADOW_SSL_SESSION_to_bytes', - '#define SSL_SESSION_to_bytes_for_ticket GRPC_SHADOW_SSL_SESSION_to_bytes_for_ticket', - '#define SSL_SESSION_up_ref GRPC_SHADOW_SSL_SESSION_up_ref', - '#define SSL_set0_chain GRPC_SHADOW_SSL_set0_chain', - '#define SSL_set0_client_CAs GRPC_SHADOW_SSL_set0_client_CAs', - '#define SSL_set0_rbio GRPC_SHADOW_SSL_set0_rbio', - '#define SSL_set0_verify_cert_store GRPC_SHADOW_SSL_set0_verify_cert_store', - '#define SSL_set0_wbio GRPC_SHADOW_SSL_set0_wbio', - '#define SSL_set1_chain GRPC_SHADOW_SSL_set1_chain', - '#define SSL_set1_curves GRPC_SHADOW_SSL_set1_curves', - '#define SSL_set1_curves_list GRPC_SHADOW_SSL_set1_curves_list', - '#define SSL_set1_delegated_credential GRPC_SHADOW_SSL_set1_delegated_credential', - '#define SSL_set1_param GRPC_SHADOW_SSL_set1_param', - '#define SSL_set1_sigalgs GRPC_SHADOW_SSL_set1_sigalgs', - '#define SSL_set1_sigalgs_list GRPC_SHADOW_SSL_set1_sigalgs_list', - '#define SSL_set1_tls_channel_id GRPC_SHADOW_SSL_set1_tls_channel_id', - '#define SSL_set1_verify_cert_store GRPC_SHADOW_SSL_set1_verify_cert_store', - '#define SSL_set_accept_state GRPC_SHADOW_SSL_set_accept_state', - '#define SSL_set_alpn_protos GRPC_SHADOW_SSL_set_alpn_protos', - '#define SSL_set_bio GRPC_SHADOW_SSL_set_bio', - '#define SSL_set_cert_cb GRPC_SHADOW_SSL_set_cert_cb', - '#define SSL_set_chain_and_key GRPC_SHADOW_SSL_set_chain_and_key', - '#define SSL_set_cipher_list GRPC_SHADOW_SSL_set_cipher_list', - '#define SSL_set_client_CA_list GRPC_SHADOW_SSL_set_client_CA_list', - '#define SSL_set_connect_state GRPC_SHADOW_SSL_set_connect_state', - '#define SSL_set_custom_verify GRPC_SHADOW_SSL_set_custom_verify', - '#define SSL_set_early_data_enabled GRPC_SHADOW_SSL_set_early_data_enabled', - '#define SSL_set_enforce_rsa_key_usage GRPC_SHADOW_SSL_set_enforce_rsa_key_usage', - '#define SSL_set_ex_data GRPC_SHADOW_SSL_set_ex_data', - '#define SSL_set_fd GRPC_SHADOW_SSL_set_fd', - '#define SSL_set_ignore_tls13_downgrade GRPC_SHADOW_SSL_set_ignore_tls13_downgrade', - '#define SSL_set_info_callback GRPC_SHADOW_SSL_set_info_callback', - '#define SSL_set_jdk11_workaround GRPC_SHADOW_SSL_set_jdk11_workaround', - '#define SSL_set_max_cert_list GRPC_SHADOW_SSL_set_max_cert_list', - '#define SSL_set_max_proto_version GRPC_SHADOW_SSL_set_max_proto_version', - '#define SSL_set_max_send_fragment GRPC_SHADOW_SSL_set_max_send_fragment', - '#define SSL_set_min_proto_version GRPC_SHADOW_SSL_set_min_proto_version', - '#define SSL_set_mode GRPC_SHADOW_SSL_set_mode', - '#define SSL_set_msg_callback GRPC_SHADOW_SSL_set_msg_callback', - '#define SSL_set_msg_callback_arg GRPC_SHADOW_SSL_set_msg_callback_arg', - '#define SSL_set_mtu GRPC_SHADOW_SSL_set_mtu', - '#define SSL_set_ocsp_response GRPC_SHADOW_SSL_set_ocsp_response', - '#define SSL_set_options GRPC_SHADOW_SSL_set_options', - '#define SSL_set_private_key_method GRPC_SHADOW_SSL_set_private_key_method', - '#define SSL_set_psk_client_callback GRPC_SHADOW_SSL_set_psk_client_callback', - '#define SSL_set_psk_server_callback GRPC_SHADOW_SSL_set_psk_server_callback', - '#define SSL_set_purpose GRPC_SHADOW_SSL_set_purpose', - '#define SSL_set_quic_method GRPC_SHADOW_SSL_set_quic_method', - '#define SSL_set_quic_transport_params GRPC_SHADOW_SSL_set_quic_transport_params', - '#define SSL_set_quiet_shutdown GRPC_SHADOW_SSL_set_quiet_shutdown', - '#define SSL_set_read_ahead GRPC_SHADOW_SSL_set_read_ahead', - '#define SSL_set_renegotiate_mode GRPC_SHADOW_SSL_set_renegotiate_mode', - '#define SSL_set_retain_only_sha256_of_client_certs GRPC_SHADOW_SSL_set_retain_only_sha256_of_client_certs', - '#define SSL_set_rfd GRPC_SHADOW_SSL_set_rfd', - '#define SSL_set_session GRPC_SHADOW_SSL_set_session', - '#define SSL_set_session_id_context GRPC_SHADOW_SSL_set_session_id_context', - '#define SSL_set_shed_handshake_config GRPC_SHADOW_SSL_set_shed_handshake_config', - '#define SSL_set_shutdown GRPC_SHADOW_SSL_set_shutdown', - '#define SSL_set_signed_cert_timestamp_list GRPC_SHADOW_SSL_set_signed_cert_timestamp_list', - '#define SSL_set_signing_algorithm_prefs GRPC_SHADOW_SSL_set_signing_algorithm_prefs', - '#define SSL_set_srtp_profiles GRPC_SHADOW_SSL_set_srtp_profiles', - '#define SSL_set_SSL_CTX GRPC_SHADOW_SSL_set_SSL_CTX', - '#define SSL_set_state GRPC_SHADOW_SSL_set_state', - '#define SSL_set_strict_cipher_list GRPC_SHADOW_SSL_set_strict_cipher_list', - '#define SSL_set_tls_channel_id_enabled GRPC_SHADOW_SSL_set_tls_channel_id_enabled', - '#define SSL_set_tlsext_host_name GRPC_SHADOW_SSL_set_tlsext_host_name', - '#define SSL_set_tlsext_status_ocsp_resp GRPC_SHADOW_SSL_set_tlsext_status_ocsp_resp', - '#define SSL_set_tlsext_status_type GRPC_SHADOW_SSL_set_tlsext_status_type', - '#define SSL_set_tlsext_use_srtp GRPC_SHADOW_SSL_set_tlsext_use_srtp', - '#define SSL_set_tmp_dh GRPC_SHADOW_SSL_set_tmp_dh', - '#define SSL_set_tmp_dh_callback GRPC_SHADOW_SSL_set_tmp_dh_callback', - '#define SSL_set_tmp_ecdh GRPC_SHADOW_SSL_set_tmp_ecdh', - '#define SSL_set_tmp_rsa GRPC_SHADOW_SSL_set_tmp_rsa', - '#define SSL_set_tmp_rsa_callback GRPC_SHADOW_SSL_set_tmp_rsa_callback', - '#define SSL_set_token_binding_params GRPC_SHADOW_SSL_set_token_binding_params', - '#define SSL_set_trust GRPC_SHADOW_SSL_set_trust', - '#define SSL_set_verify GRPC_SHADOW_SSL_set_verify', - '#define SSL_set_verify_depth GRPC_SHADOW_SSL_set_verify_depth', - '#define SSL_set_verify_result GRPC_SHADOW_SSL_set_verify_result', - '#define SSL_set_wfd GRPC_SHADOW_SSL_set_wfd', - '#define SSL_shutdown GRPC_SHADOW_SSL_shutdown', - '#define SSL_state GRPC_SHADOW_SSL_state', - '#define SSL_state_string GRPC_SHADOW_SSL_state_string', - '#define SSL_state_string_long GRPC_SHADOW_SSL_state_string_long', - '#define SSL_total_renegotiations GRPC_SHADOW_SSL_total_renegotiations', - '#define SSL_use_certificate GRPC_SHADOW_SSL_use_certificate', - '#define SSL_use_certificate_ASN1 GRPC_SHADOW_SSL_use_certificate_ASN1', - '#define SSL_use_certificate_file GRPC_SHADOW_SSL_use_certificate_file', - '#define SSL_used_hello_retry_request GRPC_SHADOW_SSL_used_hello_retry_request', - '#define SSL_use_PrivateKey GRPC_SHADOW_SSL_use_PrivateKey', - '#define SSL_use_PrivateKey_ASN1 GRPC_SHADOW_SSL_use_PrivateKey_ASN1', - '#define SSL_use_PrivateKey_file GRPC_SHADOW_SSL_use_PrivateKey_file', - '#define SSL_use_psk_identity_hint GRPC_SHADOW_SSL_use_psk_identity_hint', - '#define SSL_use_RSAPrivateKey GRPC_SHADOW_SSL_use_RSAPrivateKey', - '#define SSL_use_RSAPrivateKey_ASN1 GRPC_SHADOW_SSL_use_RSAPrivateKey_ASN1', - '#define SSL_use_RSAPrivateKey_file GRPC_SHADOW_SSL_use_RSAPrivateKey_file', - '#define SSLv23_client_method GRPC_SHADOW_SSLv23_client_method', - '#define SSLv23_method GRPC_SHADOW_SSLv23_method', - '#define SSLv23_server_method GRPC_SHADOW_SSLv23_server_method', - '#define SSL_version GRPC_SHADOW_SSL_version', - '#define SSL_want GRPC_SHADOW_SSL_want', - '#define SSL_write GRPC_SHADOW_SSL_write', - '#define SXNET_add_id_asc GRPC_SHADOW_SXNET_add_id_asc', - '#define SXNET_add_id_INTEGER GRPC_SHADOW_SXNET_add_id_INTEGER', - '#define SXNET_add_id_ulong GRPC_SHADOW_SXNET_add_id_ulong', - '#define SXNET_free GRPC_SHADOW_SXNET_free', - '#define SXNET_get_id_asc GRPC_SHADOW_SXNET_get_id_asc', - '#define SXNET_get_id_INTEGER GRPC_SHADOW_SXNET_get_id_INTEGER', - '#define SXNET_get_id_ulong GRPC_SHADOW_SXNET_get_id_ulong', - '#define SXNETID_free GRPC_SHADOW_SXNETID_free', - '#define SXNETID_it GRPC_SHADOW_SXNETID_it', - '#define SXNETID_new GRPC_SHADOW_SXNETID_new', - '#define SXNET_it GRPC_SHADOW_SXNET_it', - '#define SXNET_new GRPC_SHADOW_SXNET_new', - '#define TLS_client_method GRPC_SHADOW_TLS_client_method', - '#define TLS_method GRPC_SHADOW_TLS_method', - '#define TLS_server_method GRPC_SHADOW_TLS_server_method', - '#define TLSv1_1_client_method GRPC_SHADOW_TLSv1_1_client_method', - '#define TLSv1_1_method GRPC_SHADOW_TLSv1_1_method', - '#define TLSv1_1_server_method GRPC_SHADOW_TLSv1_1_server_method', - '#define TLSv1_2_client_method GRPC_SHADOW_TLSv1_2_client_method', - '#define TLSv1_2_method GRPC_SHADOW_TLSv1_2_method', - '#define TLSv1_2_server_method GRPC_SHADOW_TLSv1_2_server_method', - '#define TLSv1_client_method GRPC_SHADOW_TLSv1_client_method', - '#define TLSv1_method GRPC_SHADOW_TLSv1_method', - '#define TLSv1_server_method GRPC_SHADOW_TLSv1_server_method', - '#define TLS_with_buffers_method GRPC_SHADOW_TLS_with_buffers_method', - '#define tree_find_sk GRPC_SHADOW_tree_find_sk', - '#define USERNOTICE_free GRPC_SHADOW_USERNOTICE_free', - '#define USERNOTICE_it GRPC_SHADOW_USERNOTICE_it', - '#define USERNOTICE_new GRPC_SHADOW_USERNOTICE_new', - '#define UTF8_getc GRPC_SHADOW_UTF8_getc', - '#define UTF8_putc GRPC_SHADOW_UTF8_putc', - '#define v2i_ASN1_BIT_STRING GRPC_SHADOW_v2i_ASN1_BIT_STRING', - '#define v2i_GENERAL_NAME GRPC_SHADOW_v2i_GENERAL_NAME', - '#define v2i_GENERAL_NAME_ex GRPC_SHADOW_v2i_GENERAL_NAME_ex', - '#define v2i_GENERAL_NAMES GRPC_SHADOW_v2i_GENERAL_NAMES', - '#define v3_akey_id GRPC_SHADOW_v3_akey_id', - '#define v3_alt GRPC_SHADOW_v3_alt', - '#define v3_bcons GRPC_SHADOW_v3_bcons', - '#define v3_cpols GRPC_SHADOW_v3_cpols', - '#define v3_crld GRPC_SHADOW_v3_crld', - '#define v3_crl_invdate GRPC_SHADOW_v3_crl_invdate', - '#define v3_crl_num GRPC_SHADOW_v3_crl_num', - '#define v3_crl_reason GRPC_SHADOW_v3_crl_reason', - '#define v3_delta_crl GRPC_SHADOW_v3_delta_crl', - '#define v3_ext_ku GRPC_SHADOW_v3_ext_ku', - '#define v3_freshest_crl GRPC_SHADOW_v3_freshest_crl', - '#define v3_idp GRPC_SHADOW_v3_idp', - '#define v3_info GRPC_SHADOW_v3_info', - '#define v3_inhibit_anyp GRPC_SHADOW_v3_inhibit_anyp', - '#define v3_key_usage GRPC_SHADOW_v3_key_usage', - '#define v3_name_constraints GRPC_SHADOW_v3_name_constraints', - '#define v3_nscert GRPC_SHADOW_v3_nscert', - '#define v3_ns_ia5_list GRPC_SHADOW_v3_ns_ia5_list', - '#define v3_ocsp_accresp GRPC_SHADOW_v3_ocsp_accresp', - '#define v3_ocsp_nocheck GRPC_SHADOW_v3_ocsp_nocheck', - '#define v3_pci GRPC_SHADOW_v3_pci', - '#define v3_pkey_usage_period GRPC_SHADOW_v3_pkey_usage_period', - '#define v3_policy_constraints GRPC_SHADOW_v3_policy_constraints', - '#define v3_policy_mappings GRPC_SHADOW_v3_policy_mappings', - '#define v3_sinfo GRPC_SHADOW_v3_sinfo', - '#define v3_skey_id GRPC_SHADOW_v3_skey_id', - '#define v3_sxnet GRPC_SHADOW_v3_sxnet', - '#define vpaes_cbc_encrypt GRPC_SHADOW_vpaes_cbc_encrypt', - '#define vpaes_ctr32_encrypt_blocks GRPC_SHADOW_vpaes_ctr32_encrypt_blocks', - '#define vpaes_decrypt GRPC_SHADOW_vpaes_decrypt', - '#define vpaes_encrypt GRPC_SHADOW_vpaes_encrypt', - '#define vpaes_set_decrypt_key GRPC_SHADOW_vpaes_set_decrypt_key', - '#define vpaes_set_encrypt_key GRPC_SHADOW_vpaes_set_encrypt_key', - '#define X25519 GRPC_SHADOW_X25519', - '#define x25519_asn1_meth GRPC_SHADOW_x25519_asn1_meth', - '#define x25519_ge_add GRPC_SHADOW_x25519_ge_add', - '#define x25519_ge_frombytes_vartime GRPC_SHADOW_x25519_ge_frombytes_vartime', - '#define x25519_ge_p1p1_to_p2 GRPC_SHADOW_x25519_ge_p1p1_to_p2', - '#define x25519_ge_p1p1_to_p3 GRPC_SHADOW_x25519_ge_p1p1_to_p3', - '#define x25519_ge_p3_to_cached GRPC_SHADOW_x25519_ge_p3_to_cached', - '#define x25519_ge_scalarmult GRPC_SHADOW_x25519_ge_scalarmult', - '#define x25519_ge_scalarmult_base GRPC_SHADOW_x25519_ge_scalarmult_base', - '#define x25519_ge_scalarmult_small_precomp GRPC_SHADOW_x25519_ge_scalarmult_small_precomp', - '#define x25519_ge_sub GRPC_SHADOW_x25519_ge_sub', - '#define x25519_ge_tobytes GRPC_SHADOW_x25519_ge_tobytes', - '#define X25519_keypair GRPC_SHADOW_X25519_keypair', - '#define x25519_pkey_meth GRPC_SHADOW_x25519_pkey_meth', - '#define X25519_public_from_private GRPC_SHADOW_X25519_public_from_private', - '#define x25519_sc_reduce GRPC_SHADOW_x25519_sc_reduce', - '#define X509_add1_ext_i2d GRPC_SHADOW_X509_add1_ext_i2d', - '#define X509_add1_reject_object GRPC_SHADOW_X509_add1_reject_object', - '#define X509_add1_trust_object GRPC_SHADOW_X509_add1_trust_object', - '#define X509_add_ext GRPC_SHADOW_X509_add_ext', - '#define X509_ALGOR_cmp GRPC_SHADOW_X509_ALGOR_cmp', - '#define X509_ALGOR_dup GRPC_SHADOW_X509_ALGOR_dup', - '#define X509_ALGOR_free GRPC_SHADOW_X509_ALGOR_free', - '#define X509_ALGOR_get0 GRPC_SHADOW_X509_ALGOR_get0', - '#define X509_ALGOR_it GRPC_SHADOW_X509_ALGOR_it', - '#define X509_ALGOR_new GRPC_SHADOW_X509_ALGOR_new', - '#define X509_ALGOR_set0 GRPC_SHADOW_X509_ALGOR_set0', - '#define X509_ALGOR_set_md GRPC_SHADOW_X509_ALGOR_set_md', - '#define X509_ALGORS_it GRPC_SHADOW_X509_ALGORS_it', - '#define X509_alias_get0 GRPC_SHADOW_X509_alias_get0', - '#define X509_alias_set1 GRPC_SHADOW_X509_alias_set1', - '#define X509at_add1_attr GRPC_SHADOW_X509at_add1_attr', - '#define X509at_add1_attr_by_NID GRPC_SHADOW_X509at_add1_attr_by_NID', - '#define X509at_add1_attr_by_OBJ GRPC_SHADOW_X509at_add1_attr_by_OBJ', - '#define X509at_add1_attr_by_txt GRPC_SHADOW_X509at_add1_attr_by_txt', - '#define X509at_delete_attr GRPC_SHADOW_X509at_delete_attr', - '#define X509at_get0_data_by_OBJ GRPC_SHADOW_X509at_get0_data_by_OBJ', - '#define X509at_get_attr GRPC_SHADOW_X509at_get_attr', - '#define X509at_get_attr_by_NID GRPC_SHADOW_X509at_get_attr_by_NID', - '#define X509at_get_attr_by_OBJ GRPC_SHADOW_X509at_get_attr_by_OBJ', - '#define X509at_get_attr_count GRPC_SHADOW_X509at_get_attr_count', - '#define X509_ATTRIBUTE_count GRPC_SHADOW_X509_ATTRIBUTE_count', - '#define X509_ATTRIBUTE_create GRPC_SHADOW_X509_ATTRIBUTE_create', - '#define X509_ATTRIBUTE_create_by_NID GRPC_SHADOW_X509_ATTRIBUTE_create_by_NID', - '#define X509_ATTRIBUTE_create_by_OBJ GRPC_SHADOW_X509_ATTRIBUTE_create_by_OBJ', - '#define X509_ATTRIBUTE_create_by_txt GRPC_SHADOW_X509_ATTRIBUTE_create_by_txt', - '#define X509_ATTRIBUTE_dup GRPC_SHADOW_X509_ATTRIBUTE_dup', - '#define X509_ATTRIBUTE_free GRPC_SHADOW_X509_ATTRIBUTE_free', - '#define X509_ATTRIBUTE_get0_data GRPC_SHADOW_X509_ATTRIBUTE_get0_data', - '#define X509_ATTRIBUTE_get0_object GRPC_SHADOW_X509_ATTRIBUTE_get0_object', - '#define X509_ATTRIBUTE_get0_type GRPC_SHADOW_X509_ATTRIBUTE_get0_type', - '#define X509_ATTRIBUTE_it GRPC_SHADOW_X509_ATTRIBUTE_it', - '#define X509_ATTRIBUTE_new GRPC_SHADOW_X509_ATTRIBUTE_new', - '#define X509_ATTRIBUTE_set1_data GRPC_SHADOW_X509_ATTRIBUTE_set1_data', - '#define X509_ATTRIBUTE_set1_object GRPC_SHADOW_X509_ATTRIBUTE_set1_object', - '#define X509_ATTRIBUTE_SET_it GRPC_SHADOW_X509_ATTRIBUTE_SET_it', - '#define X509_CERT_AUX_free GRPC_SHADOW_X509_CERT_AUX_free', - '#define X509_CERT_AUX_it GRPC_SHADOW_X509_CERT_AUX_it', - '#define X509_CERT_AUX_new GRPC_SHADOW_X509_CERT_AUX_new', - '#define X509_CERT_AUX_print GRPC_SHADOW_X509_CERT_AUX_print', - '#define X509_chain_check_suiteb GRPC_SHADOW_X509_chain_check_suiteb', - '#define X509_chain_up_ref GRPC_SHADOW_X509_chain_up_ref', - '#define X509_check_akid GRPC_SHADOW_X509_check_akid', - '#define X509_check_ca GRPC_SHADOW_X509_check_ca', - '#define X509_check_email GRPC_SHADOW_X509_check_email', - '#define X509_check_host GRPC_SHADOW_X509_check_host', - '#define X509_check_ip GRPC_SHADOW_X509_check_ip', - '#define X509_check_ip_asc GRPC_SHADOW_X509_check_ip_asc', - '#define X509_check_issued GRPC_SHADOW_X509_check_issued', - '#define X509_check_private_key GRPC_SHADOW_X509_check_private_key', - '#define X509_check_purpose GRPC_SHADOW_X509_check_purpose', - '#define X509_check_trust GRPC_SHADOW_X509_check_trust', - '#define X509_CINF_free GRPC_SHADOW_X509_CINF_free', - '#define X509_CINF_it GRPC_SHADOW_X509_CINF_it', - '#define X509_CINF_new GRPC_SHADOW_X509_CINF_new', - '#define X509_cmp GRPC_SHADOW_X509_cmp', - '#define X509_cmp_current_time GRPC_SHADOW_X509_cmp_current_time', - '#define X509_cmp_time GRPC_SHADOW_X509_cmp_time', - '#define X509_CRL_add0_revoked GRPC_SHADOW_X509_CRL_add0_revoked', - '#define X509_CRL_add1_ext_i2d GRPC_SHADOW_X509_CRL_add1_ext_i2d', - '#define X509_CRL_add_ext GRPC_SHADOW_X509_CRL_add_ext', - '#define X509_CRL_check_suiteb GRPC_SHADOW_X509_CRL_check_suiteb', - '#define X509_CRL_cmp GRPC_SHADOW_X509_CRL_cmp', - '#define X509_CRL_delete_ext GRPC_SHADOW_X509_CRL_delete_ext', - '#define X509_CRL_diff GRPC_SHADOW_X509_CRL_diff', - '#define X509_CRL_digest GRPC_SHADOW_X509_CRL_digest', - '#define X509_CRL_dup GRPC_SHADOW_X509_CRL_dup', - '#define X509_CRL_free GRPC_SHADOW_X509_CRL_free', - '#define X509_CRL_get0_by_cert GRPC_SHADOW_X509_CRL_get0_by_cert', - '#define X509_CRL_get0_by_serial GRPC_SHADOW_X509_CRL_get0_by_serial', - '#define X509_CRL_get0_lastUpdate GRPC_SHADOW_X509_CRL_get0_lastUpdate', - '#define X509_CRL_get0_nextUpdate GRPC_SHADOW_X509_CRL_get0_nextUpdate', - '#define X509_CRL_get0_signature GRPC_SHADOW_X509_CRL_get0_signature', - '#define X509_CRL_get_ext GRPC_SHADOW_X509_CRL_get_ext', - '#define X509_CRL_get_ext_by_critical GRPC_SHADOW_X509_CRL_get_ext_by_critical', - '#define X509_CRL_get_ext_by_NID GRPC_SHADOW_X509_CRL_get_ext_by_NID', - '#define X509_CRL_get_ext_by_OBJ GRPC_SHADOW_X509_CRL_get_ext_by_OBJ', - '#define X509_CRL_get_ext_count GRPC_SHADOW_X509_CRL_get_ext_count', - '#define X509_CRL_get_ext_d2i GRPC_SHADOW_X509_CRL_get_ext_d2i', - '#define X509_CRL_get_meth_data GRPC_SHADOW_X509_CRL_get_meth_data', - '#define X509_CRL_get_signature_nid GRPC_SHADOW_X509_CRL_get_signature_nid', - '#define X509_CRL_INFO_free GRPC_SHADOW_X509_CRL_INFO_free', - '#define X509_CRL_INFO_it GRPC_SHADOW_X509_CRL_INFO_it', - '#define X509_CRL_INFO_new GRPC_SHADOW_X509_CRL_INFO_new', - '#define X509_CRL_it GRPC_SHADOW_X509_CRL_it', - '#define X509_CRL_match GRPC_SHADOW_X509_CRL_match', - '#define X509_CRL_METHOD_free GRPC_SHADOW_X509_CRL_METHOD_free', - '#define X509_CRL_METHOD_new GRPC_SHADOW_X509_CRL_METHOD_new', - '#define X509_CRL_new GRPC_SHADOW_X509_CRL_new', - '#define X509_CRL_print GRPC_SHADOW_X509_CRL_print', - '#define X509_CRL_print_fp GRPC_SHADOW_X509_CRL_print_fp', - '#define X509_CRL_set_default_method GRPC_SHADOW_X509_CRL_set_default_method', - '#define X509_CRL_set_issuer_name GRPC_SHADOW_X509_CRL_set_issuer_name', - '#define X509_CRL_set_lastUpdate GRPC_SHADOW_X509_CRL_set_lastUpdate', - '#define X509_CRL_set_meth_data GRPC_SHADOW_X509_CRL_set_meth_data', - '#define X509_CRL_set_nextUpdate GRPC_SHADOW_X509_CRL_set_nextUpdate', - '#define X509_CRL_set_version GRPC_SHADOW_X509_CRL_set_version', - '#define X509_CRL_sign GRPC_SHADOW_X509_CRL_sign', - '#define X509_CRL_sign_ctx GRPC_SHADOW_X509_CRL_sign_ctx', - '#define X509_CRL_sort GRPC_SHADOW_X509_CRL_sort', - '#define X509_CRL_up_ref GRPC_SHADOW_X509_CRL_up_ref', - '#define X509_CRL_verify GRPC_SHADOW_X509_CRL_verify', - '#define X509_delete_ext GRPC_SHADOW_X509_delete_ext', - '#define X509_digest GRPC_SHADOW_X509_digest', - '#define x509_digest_sign_algorithm GRPC_SHADOW_x509_digest_sign_algorithm', - '#define x509_digest_verify_init GRPC_SHADOW_x509_digest_verify_init', - '#define X509_dup GRPC_SHADOW_X509_dup', - '#define X509_email_free GRPC_SHADOW_X509_email_free', - '#define X509_EXTENSION_create_by_NID GRPC_SHADOW_X509_EXTENSION_create_by_NID', - '#define X509_EXTENSION_create_by_OBJ GRPC_SHADOW_X509_EXTENSION_create_by_OBJ', - '#define X509_EXTENSION_dup GRPC_SHADOW_X509_EXTENSION_dup', - '#define X509_EXTENSION_free GRPC_SHADOW_X509_EXTENSION_free', - '#define X509_EXTENSION_get_critical GRPC_SHADOW_X509_EXTENSION_get_critical', - '#define X509_EXTENSION_get_data GRPC_SHADOW_X509_EXTENSION_get_data', - '#define X509_EXTENSION_get_object GRPC_SHADOW_X509_EXTENSION_get_object', - '#define X509_EXTENSION_it GRPC_SHADOW_X509_EXTENSION_it', - '#define X509_EXTENSION_new GRPC_SHADOW_X509_EXTENSION_new', - '#define X509_EXTENSION_set_critical GRPC_SHADOW_X509_EXTENSION_set_critical', - '#define X509_EXTENSION_set_data GRPC_SHADOW_X509_EXTENSION_set_data', - '#define X509_EXTENSION_set_object GRPC_SHADOW_X509_EXTENSION_set_object', - '#define X509_EXTENSIONS_it GRPC_SHADOW_X509_EXTENSIONS_it', - '#define X509_find_by_issuer_and_serial GRPC_SHADOW_X509_find_by_issuer_and_serial', - '#define X509_find_by_subject GRPC_SHADOW_X509_find_by_subject', - '#define X509_free GRPC_SHADOW_X509_free', - '#define X509_get0_extensions GRPC_SHADOW_X509_get0_extensions', - '#define X509_get0_notAfter GRPC_SHADOW_X509_get0_notAfter', - '#define X509_get0_notBefore GRPC_SHADOW_X509_get0_notBefore', - '#define X509_get0_pubkey_bitstr GRPC_SHADOW_X509_get0_pubkey_bitstr', - '#define X509_get0_signature GRPC_SHADOW_X509_get0_signature', - '#define X509_get0_tbs_sigalg GRPC_SHADOW_X509_get0_tbs_sigalg', - '#define X509_get1_email GRPC_SHADOW_X509_get1_email', - '#define X509_get1_ocsp GRPC_SHADOW_X509_get1_ocsp', - '#define X509_get_default_cert_area GRPC_SHADOW_X509_get_default_cert_area', - '#define X509_get_default_cert_dir GRPC_SHADOW_X509_get_default_cert_dir', - '#define X509_get_default_cert_dir_env GRPC_SHADOW_X509_get_default_cert_dir_env', - '#define X509_get_default_cert_file GRPC_SHADOW_X509_get_default_cert_file', - '#define X509_get_default_cert_file_env GRPC_SHADOW_X509_get_default_cert_file_env', - '#define X509_get_default_private_dir GRPC_SHADOW_X509_get_default_private_dir', - '#define X509_get_ex_data GRPC_SHADOW_X509_get_ex_data', - '#define X509_get_ex_new_index GRPC_SHADOW_X509_get_ex_new_index', - '#define X509_get_ext GRPC_SHADOW_X509_get_ext', - '#define X509_get_ext_by_critical GRPC_SHADOW_X509_get_ext_by_critical', - '#define X509_get_ext_by_NID GRPC_SHADOW_X509_get_ext_by_NID', - '#define X509_get_ext_by_OBJ GRPC_SHADOW_X509_get_ext_by_OBJ', - '#define X509_get_ext_count GRPC_SHADOW_X509_get_ext_count', - '#define X509_get_ext_d2i GRPC_SHADOW_X509_get_ext_d2i', - '#define X509_get_extended_key_usage GRPC_SHADOW_X509_get_extended_key_usage', - '#define X509_get_extension_flags GRPC_SHADOW_X509_get_extension_flags', - '#define X509_get_issuer_name GRPC_SHADOW_X509_get_issuer_name', - '#define X509_get_key_usage GRPC_SHADOW_X509_get_key_usage', - '#define X509_get_pubkey GRPC_SHADOW_X509_get_pubkey', - '#define X509_get_serialNumber GRPC_SHADOW_X509_get_serialNumber', - '#define X509_get_signature_nid GRPC_SHADOW_X509_get_signature_nid', - '#define X509_get_subject_name GRPC_SHADOW_X509_get_subject_name', - '#define X509_gmtime_adj GRPC_SHADOW_X509_gmtime_adj', - '#define X509_INFO_free GRPC_SHADOW_X509_INFO_free', - '#define X509_INFO_new GRPC_SHADOW_X509_INFO_new', - '#define X509_issuer_and_serial_cmp GRPC_SHADOW_X509_issuer_and_serial_cmp', - '#define X509_issuer_and_serial_hash GRPC_SHADOW_X509_issuer_and_serial_hash', - '#define X509_issuer_name_cmp GRPC_SHADOW_X509_issuer_name_cmp', - '#define X509_issuer_name_hash GRPC_SHADOW_X509_issuer_name_hash', - '#define X509_issuer_name_hash_old GRPC_SHADOW_X509_issuer_name_hash_old', - '#define X509_it GRPC_SHADOW_X509_it', - '#define X509_keyid_get0 GRPC_SHADOW_X509_keyid_get0', - '#define X509_keyid_set1 GRPC_SHADOW_X509_keyid_set1', - '#define X509_load_cert_crl_file GRPC_SHADOW_X509_load_cert_crl_file', - '#define X509_load_cert_file GRPC_SHADOW_X509_load_cert_file', - '#define X509_load_crl_file GRPC_SHADOW_X509_load_crl_file', - '#define X509_LOOKUP_by_alias GRPC_SHADOW_X509_LOOKUP_by_alias', - '#define X509_LOOKUP_by_fingerprint GRPC_SHADOW_X509_LOOKUP_by_fingerprint', - '#define X509_LOOKUP_by_issuer_serial GRPC_SHADOW_X509_LOOKUP_by_issuer_serial', - '#define X509_LOOKUP_by_subject GRPC_SHADOW_X509_LOOKUP_by_subject', - '#define X509_LOOKUP_ctrl GRPC_SHADOW_X509_LOOKUP_ctrl', - '#define X509_LOOKUP_file GRPC_SHADOW_X509_LOOKUP_file', - '#define X509_LOOKUP_free GRPC_SHADOW_X509_LOOKUP_free', - '#define X509_LOOKUP_hash_dir GRPC_SHADOW_X509_LOOKUP_hash_dir', - '#define X509_LOOKUP_init GRPC_SHADOW_X509_LOOKUP_init', - '#define X509_LOOKUP_new GRPC_SHADOW_X509_LOOKUP_new', - '#define X509_LOOKUP_shutdown GRPC_SHADOW_X509_LOOKUP_shutdown', - '#define X509_NAME_add_entry GRPC_SHADOW_X509_NAME_add_entry', - '#define X509_NAME_add_entry_by_NID GRPC_SHADOW_X509_NAME_add_entry_by_NID', - '#define X509_NAME_add_entry_by_OBJ GRPC_SHADOW_X509_NAME_add_entry_by_OBJ', - '#define X509_NAME_add_entry_by_txt GRPC_SHADOW_X509_NAME_add_entry_by_txt', - '#define X509_NAME_cmp GRPC_SHADOW_X509_NAME_cmp', - '#define X509_NAME_delete_entry GRPC_SHADOW_X509_NAME_delete_entry', - '#define X509_NAME_digest GRPC_SHADOW_X509_NAME_digest', - '#define X509_NAME_dup GRPC_SHADOW_X509_NAME_dup', - '#define X509_NAME_ENTRIES_it GRPC_SHADOW_X509_NAME_ENTRIES_it', - '#define X509_NAME_entry_count GRPC_SHADOW_X509_NAME_entry_count', - '#define X509_NAME_ENTRY_create_by_NID GRPC_SHADOW_X509_NAME_ENTRY_create_by_NID', - '#define X509_NAME_ENTRY_create_by_OBJ GRPC_SHADOW_X509_NAME_ENTRY_create_by_OBJ', - '#define X509_NAME_ENTRY_create_by_txt GRPC_SHADOW_X509_NAME_ENTRY_create_by_txt', - '#define X509_NAME_ENTRY_dup GRPC_SHADOW_X509_NAME_ENTRY_dup', - '#define X509_NAME_ENTRY_free GRPC_SHADOW_X509_NAME_ENTRY_free', - '#define X509_NAME_ENTRY_get_data GRPC_SHADOW_X509_NAME_ENTRY_get_data', - '#define X509_NAME_ENTRY_get_object GRPC_SHADOW_X509_NAME_ENTRY_get_object', - '#define X509_NAME_ENTRY_it GRPC_SHADOW_X509_NAME_ENTRY_it', - '#define X509_NAME_ENTRY_new GRPC_SHADOW_X509_NAME_ENTRY_new', - '#define X509_NAME_ENTRY_set GRPC_SHADOW_X509_NAME_ENTRY_set', - '#define X509_NAME_ENTRY_set_data GRPC_SHADOW_X509_NAME_ENTRY_set_data', - '#define X509_NAME_ENTRY_set_object GRPC_SHADOW_X509_NAME_ENTRY_set_object', - '#define X509_NAME_free GRPC_SHADOW_X509_NAME_free', - '#define X509_NAME_get0_der GRPC_SHADOW_X509_NAME_get0_der', - '#define X509_NAME_get_entry GRPC_SHADOW_X509_NAME_get_entry', - '#define X509_NAME_get_index_by_NID GRPC_SHADOW_X509_NAME_get_index_by_NID', - '#define X509_NAME_get_index_by_OBJ GRPC_SHADOW_X509_NAME_get_index_by_OBJ', - '#define X509_NAME_get_text_by_NID GRPC_SHADOW_X509_NAME_get_text_by_NID', - '#define X509_NAME_get_text_by_OBJ GRPC_SHADOW_X509_NAME_get_text_by_OBJ', - '#define X509_NAME_hash GRPC_SHADOW_X509_NAME_hash', - '#define X509_NAME_hash_old GRPC_SHADOW_X509_NAME_hash_old', - '#define X509_NAME_INTERNAL_it GRPC_SHADOW_X509_NAME_INTERNAL_it', - '#define X509_NAME_it GRPC_SHADOW_X509_NAME_it', - '#define X509_NAME_new GRPC_SHADOW_X509_NAME_new', - '#define X509_NAME_oneline GRPC_SHADOW_X509_NAME_oneline', - '#define X509_NAME_print GRPC_SHADOW_X509_NAME_print', - '#define X509_NAME_print_ex GRPC_SHADOW_X509_NAME_print_ex', - '#define X509_NAME_print_ex_fp GRPC_SHADOW_X509_NAME_print_ex_fp', - '#define X509_NAME_set GRPC_SHADOW_X509_NAME_set', - '#define X509_new GRPC_SHADOW_X509_new', - '#define X509_OBJECT_free_contents GRPC_SHADOW_X509_OBJECT_free_contents', - '#define X509_OBJECT_get0_X509 GRPC_SHADOW_X509_OBJECT_get0_X509', - '#define X509_OBJECT_get_type GRPC_SHADOW_X509_OBJECT_get_type', - '#define X509_OBJECT_idx_by_subject GRPC_SHADOW_X509_OBJECT_idx_by_subject', - '#define X509_OBJECT_retrieve_by_subject GRPC_SHADOW_X509_OBJECT_retrieve_by_subject', - '#define X509_OBJECT_retrieve_match GRPC_SHADOW_X509_OBJECT_retrieve_match', - '#define X509_OBJECT_up_ref_count GRPC_SHADOW_X509_OBJECT_up_ref_count', - '#define X509_ocspid_print GRPC_SHADOW_X509_ocspid_print', - '#define X509_parse_from_buffer GRPC_SHADOW_X509_parse_from_buffer', - '#define X509_PKEY_free GRPC_SHADOW_X509_PKEY_free', - '#define X509_PKEY_new GRPC_SHADOW_X509_PKEY_new', - '#define X509_policy_check GRPC_SHADOW_X509_policy_check', - '#define X509_policy_level_get0_node GRPC_SHADOW_X509_policy_level_get0_node', - '#define X509_policy_level_node_count GRPC_SHADOW_X509_policy_level_node_count', - '#define X509_policy_node_get0_parent GRPC_SHADOW_X509_policy_node_get0_parent', - '#define X509_policy_node_get0_policy GRPC_SHADOW_X509_policy_node_get0_policy', - '#define X509_policy_node_get0_qualifiers GRPC_SHADOW_X509_policy_node_get0_qualifiers', - '#define X509_POLICY_NODE_print GRPC_SHADOW_X509_POLICY_NODE_print', - '#define X509_policy_tree_free GRPC_SHADOW_X509_policy_tree_free', - '#define X509_policy_tree_get0_level GRPC_SHADOW_X509_policy_tree_get0_level', - '#define X509_policy_tree_get0_policies GRPC_SHADOW_X509_policy_tree_get0_policies', - '#define X509_policy_tree_get0_user_policies GRPC_SHADOW_X509_policy_tree_get0_user_policies', - '#define X509_policy_tree_level_count GRPC_SHADOW_X509_policy_tree_level_count', - '#define X509_print GRPC_SHADOW_X509_print', - '#define X509_print_ex GRPC_SHADOW_X509_print_ex', - '#define X509_print_ex_fp GRPC_SHADOW_X509_print_ex_fp', - '#define X509_print_fp GRPC_SHADOW_X509_print_fp', - '#define x509_print_rsa_pss_params GRPC_SHADOW_x509_print_rsa_pss_params', - '#define X509_pubkey_digest GRPC_SHADOW_X509_pubkey_digest', - '#define X509_PUBKEY_free GRPC_SHADOW_X509_PUBKEY_free', - '#define X509_PUBKEY_get GRPC_SHADOW_X509_PUBKEY_get', - '#define X509_PUBKEY_get0_param GRPC_SHADOW_X509_PUBKEY_get0_param', - '#define X509_PUBKEY_it GRPC_SHADOW_X509_PUBKEY_it', - '#define X509_PUBKEY_new GRPC_SHADOW_X509_PUBKEY_new', - '#define X509_PUBKEY_set GRPC_SHADOW_X509_PUBKEY_set', - '#define X509_PUBKEY_set0_param GRPC_SHADOW_X509_PUBKEY_set0_param', - '#define X509_PURPOSE_add GRPC_SHADOW_X509_PURPOSE_add', - '#define X509_PURPOSE_cleanup GRPC_SHADOW_X509_PURPOSE_cleanup', - '#define X509_PURPOSE_get0 GRPC_SHADOW_X509_PURPOSE_get0', - '#define X509_PURPOSE_get0_name GRPC_SHADOW_X509_PURPOSE_get0_name', - '#define X509_PURPOSE_get0_sname GRPC_SHADOW_X509_PURPOSE_get0_sname', - '#define X509_PURPOSE_get_by_id GRPC_SHADOW_X509_PURPOSE_get_by_id', - '#define X509_PURPOSE_get_by_sname GRPC_SHADOW_X509_PURPOSE_get_by_sname', - '#define X509_PURPOSE_get_count GRPC_SHADOW_X509_PURPOSE_get_count', - '#define X509_PURPOSE_get_id GRPC_SHADOW_X509_PURPOSE_get_id', - '#define X509_PURPOSE_get_trust GRPC_SHADOW_X509_PURPOSE_get_trust', - '#define X509_PURPOSE_set GRPC_SHADOW_X509_PURPOSE_set', - '#define X509_reject_clear GRPC_SHADOW_X509_reject_clear', - '#define X509_REQ_add1_attr GRPC_SHADOW_X509_REQ_add1_attr', - '#define X509_REQ_add1_attr_by_NID GRPC_SHADOW_X509_REQ_add1_attr_by_NID', - '#define X509_REQ_add1_attr_by_OBJ GRPC_SHADOW_X509_REQ_add1_attr_by_OBJ', - '#define X509_REQ_add1_attr_by_txt GRPC_SHADOW_X509_REQ_add1_attr_by_txt', - '#define X509_REQ_add_extensions GRPC_SHADOW_X509_REQ_add_extensions', - '#define X509_REQ_add_extensions_nid GRPC_SHADOW_X509_REQ_add_extensions_nid', - '#define X509_REQ_check_private_key GRPC_SHADOW_X509_REQ_check_private_key', - '#define X509_REQ_delete_attr GRPC_SHADOW_X509_REQ_delete_attr', - '#define X509_REQ_digest GRPC_SHADOW_X509_REQ_digest', - '#define X509_REQ_dup GRPC_SHADOW_X509_REQ_dup', - '#define X509_REQ_extension_nid GRPC_SHADOW_X509_REQ_extension_nid', - '#define X509_REQ_free GRPC_SHADOW_X509_REQ_free', - '#define X509_REQ_get0_signature GRPC_SHADOW_X509_REQ_get0_signature', - '#define X509_REQ_get1_email GRPC_SHADOW_X509_REQ_get1_email', - '#define X509_REQ_get_attr GRPC_SHADOW_X509_REQ_get_attr', - '#define X509_REQ_get_attr_by_NID GRPC_SHADOW_X509_REQ_get_attr_by_NID', - '#define X509_REQ_get_attr_by_OBJ GRPC_SHADOW_X509_REQ_get_attr_by_OBJ', - '#define X509_REQ_get_attr_count GRPC_SHADOW_X509_REQ_get_attr_count', - '#define X509_REQ_get_extension_nids GRPC_SHADOW_X509_REQ_get_extension_nids', - '#define X509_REQ_get_extensions GRPC_SHADOW_X509_REQ_get_extensions', - '#define X509_REQ_get_pubkey GRPC_SHADOW_X509_REQ_get_pubkey', - '#define X509_REQ_get_signature_nid GRPC_SHADOW_X509_REQ_get_signature_nid', - '#define X509_REQ_INFO_free GRPC_SHADOW_X509_REQ_INFO_free', - '#define X509_REQ_INFO_it GRPC_SHADOW_X509_REQ_INFO_it', - '#define X509_REQ_INFO_new GRPC_SHADOW_X509_REQ_INFO_new', - '#define X509_REQ_it GRPC_SHADOW_X509_REQ_it', - '#define X509_REQ_new GRPC_SHADOW_X509_REQ_new', - '#define X509_REQ_print GRPC_SHADOW_X509_REQ_print', - '#define X509_REQ_print_ex GRPC_SHADOW_X509_REQ_print_ex', - '#define X509_REQ_print_fp GRPC_SHADOW_X509_REQ_print_fp', - '#define X509_REQ_set_extension_nids GRPC_SHADOW_X509_REQ_set_extension_nids', - '#define X509_REQ_set_pubkey GRPC_SHADOW_X509_REQ_set_pubkey', - '#define X509_REQ_set_subject_name GRPC_SHADOW_X509_REQ_set_subject_name', - '#define X509_REQ_set_version GRPC_SHADOW_X509_REQ_set_version', - '#define X509_REQ_sign GRPC_SHADOW_X509_REQ_sign', - '#define X509_REQ_sign_ctx GRPC_SHADOW_X509_REQ_sign_ctx', - '#define X509_REQ_to_X509 GRPC_SHADOW_X509_REQ_to_X509', - '#define X509_REQ_verify GRPC_SHADOW_X509_REQ_verify', - '#define X509_REVOKED_add1_ext_i2d GRPC_SHADOW_X509_REVOKED_add1_ext_i2d', - '#define X509_REVOKED_add_ext GRPC_SHADOW_X509_REVOKED_add_ext', - '#define X509_REVOKED_delete_ext GRPC_SHADOW_X509_REVOKED_delete_ext', - '#define X509_REVOKED_dup GRPC_SHADOW_X509_REVOKED_dup', - '#define X509_REVOKED_free GRPC_SHADOW_X509_REVOKED_free', - '#define X509_REVOKED_get0_revocationDate GRPC_SHADOW_X509_REVOKED_get0_revocationDate', - '#define X509_REVOKED_get0_serialNumber GRPC_SHADOW_X509_REVOKED_get0_serialNumber', - '#define X509_REVOKED_get_ext GRPC_SHADOW_X509_REVOKED_get_ext', - '#define X509_REVOKED_get_ext_by_critical GRPC_SHADOW_X509_REVOKED_get_ext_by_critical', - '#define X509_REVOKED_get_ext_by_NID GRPC_SHADOW_X509_REVOKED_get_ext_by_NID', - '#define X509_REVOKED_get_ext_by_OBJ GRPC_SHADOW_X509_REVOKED_get_ext_by_OBJ', - '#define X509_REVOKED_get_ext_count GRPC_SHADOW_X509_REVOKED_get_ext_count', - '#define X509_REVOKED_get_ext_d2i GRPC_SHADOW_X509_REVOKED_get_ext_d2i', - '#define X509_REVOKED_it GRPC_SHADOW_X509_REVOKED_it', - '#define X509_REVOKED_new GRPC_SHADOW_X509_REVOKED_new', - '#define X509_REVOKED_set_revocationDate GRPC_SHADOW_X509_REVOKED_set_revocationDate', - '#define X509_REVOKED_set_serialNumber GRPC_SHADOW_X509_REVOKED_set_serialNumber', - '#define x509_rsa_ctx_to_pss GRPC_SHADOW_x509_rsa_ctx_to_pss', - '#define x509_rsa_pss_to_ctx GRPC_SHADOW_x509_rsa_pss_to_ctx', - '#define X509_set_ex_data GRPC_SHADOW_X509_set_ex_data', - '#define X509_set_issuer_name GRPC_SHADOW_X509_set_issuer_name', - '#define X509_set_notAfter GRPC_SHADOW_X509_set_notAfter', - '#define X509_set_notBefore GRPC_SHADOW_X509_set_notBefore', - '#define X509_set_pubkey GRPC_SHADOW_X509_set_pubkey', - '#define X509_set_serialNumber GRPC_SHADOW_X509_set_serialNumber', - '#define X509_set_subject_name GRPC_SHADOW_X509_set_subject_name', - '#define X509_set_version GRPC_SHADOW_X509_set_version', - '#define X509_SIG_free GRPC_SHADOW_X509_SIG_free', - '#define X509_SIG_it GRPC_SHADOW_X509_SIG_it', - '#define X509_sign GRPC_SHADOW_X509_sign', - '#define X509_signature_dump GRPC_SHADOW_X509_signature_dump', - '#define X509_signature_print GRPC_SHADOW_X509_signature_print', - '#define X509_sign_ctx GRPC_SHADOW_X509_sign_ctx', - '#define X509_SIG_new GRPC_SHADOW_X509_SIG_new', - '#define X509_STORE_add_cert GRPC_SHADOW_X509_STORE_add_cert', - '#define X509_STORE_add_crl GRPC_SHADOW_X509_STORE_add_crl', - '#define X509_STORE_add_lookup GRPC_SHADOW_X509_STORE_add_lookup', - '#define X509_STORE_CTX_cleanup GRPC_SHADOW_X509_STORE_CTX_cleanup', - '#define X509_STORE_CTX_free GRPC_SHADOW_X509_STORE_CTX_free', - '#define X509_STORE_CTX_get0_cert GRPC_SHADOW_X509_STORE_CTX_get0_cert', - '#define X509_STORE_CTX_get0_current_crl GRPC_SHADOW_X509_STORE_CTX_get0_current_crl', - '#define X509_STORE_CTX_get0_current_issuer GRPC_SHADOW_X509_STORE_CTX_get0_current_issuer', - '#define X509_STORE_CTX_get0_param GRPC_SHADOW_X509_STORE_CTX_get0_param', - '#define X509_STORE_CTX_get0_parent_ctx GRPC_SHADOW_X509_STORE_CTX_get0_parent_ctx', - '#define X509_STORE_CTX_get0_policy_tree GRPC_SHADOW_X509_STORE_CTX_get0_policy_tree', - '#define X509_STORE_CTX_get0_store GRPC_SHADOW_X509_STORE_CTX_get0_store', - '#define X509_STORE_CTX_get0_untrusted GRPC_SHADOW_X509_STORE_CTX_get0_untrusted', - '#define X509_STORE_CTX_get1_chain GRPC_SHADOW_X509_STORE_CTX_get1_chain', - '#define X509_STORE_CTX_get1_issuer GRPC_SHADOW_X509_STORE_CTX_get1_issuer', - '#define X509_STORE_CTX_get_chain GRPC_SHADOW_X509_STORE_CTX_get_chain', - '#define X509_STORE_CTX_get_current_cert GRPC_SHADOW_X509_STORE_CTX_get_current_cert', - '#define X509_STORE_CTX_get_error GRPC_SHADOW_X509_STORE_CTX_get_error', - '#define X509_STORE_CTX_get_error_depth GRPC_SHADOW_X509_STORE_CTX_get_error_depth', - '#define X509_STORE_CTX_get_ex_data GRPC_SHADOW_X509_STORE_CTX_get_ex_data', - '#define X509_STORE_CTX_get_ex_new_index GRPC_SHADOW_X509_STORE_CTX_get_ex_new_index', - '#define X509_STORE_CTX_get_explicit_policy GRPC_SHADOW_X509_STORE_CTX_get_explicit_policy', - '#define X509_STORE_CTX_init GRPC_SHADOW_X509_STORE_CTX_init', - '#define X509_STORE_CTX_new GRPC_SHADOW_X509_STORE_CTX_new', - '#define X509_STORE_CTX_purpose_inherit GRPC_SHADOW_X509_STORE_CTX_purpose_inherit', - '#define X509_STORE_CTX_set0_crls GRPC_SHADOW_X509_STORE_CTX_set0_crls', - '#define X509_STORE_CTX_set0_param GRPC_SHADOW_X509_STORE_CTX_set0_param', - '#define X509_STORE_CTX_set_cert GRPC_SHADOW_X509_STORE_CTX_set_cert', - '#define X509_STORE_CTX_set_chain GRPC_SHADOW_X509_STORE_CTX_set_chain', - '#define X509_STORE_CTX_set_default GRPC_SHADOW_X509_STORE_CTX_set_default', - '#define X509_STORE_CTX_set_depth GRPC_SHADOW_X509_STORE_CTX_set_depth', - '#define X509_STORE_CTX_set_error GRPC_SHADOW_X509_STORE_CTX_set_error', - '#define X509_STORE_CTX_set_ex_data GRPC_SHADOW_X509_STORE_CTX_set_ex_data', - '#define X509_STORE_CTX_set_flags GRPC_SHADOW_X509_STORE_CTX_set_flags', - '#define X509_STORE_CTX_set_purpose GRPC_SHADOW_X509_STORE_CTX_set_purpose', - '#define X509_STORE_CTX_set_time GRPC_SHADOW_X509_STORE_CTX_set_time', - '#define X509_STORE_CTX_set_trust GRPC_SHADOW_X509_STORE_CTX_set_trust', - '#define X509_STORE_CTX_set_verify_cb GRPC_SHADOW_X509_STORE_CTX_set_verify_cb', - '#define X509_STORE_CTX_trusted_stack GRPC_SHADOW_X509_STORE_CTX_trusted_stack', - '#define X509_STORE_CTX_zero GRPC_SHADOW_X509_STORE_CTX_zero', - '#define X509_STORE_free GRPC_SHADOW_X509_STORE_free', - '#define X509_STORE_get0_objects GRPC_SHADOW_X509_STORE_get0_objects', - '#define X509_STORE_get0_param GRPC_SHADOW_X509_STORE_get0_param', - '#define X509_STORE_get1_certs GRPC_SHADOW_X509_STORE_get1_certs', - '#define X509_STORE_get1_crls GRPC_SHADOW_X509_STORE_get1_crls', - '#define X509_STORE_get_by_subject GRPC_SHADOW_X509_STORE_get_by_subject', - '#define X509_STORE_get_cert_crl GRPC_SHADOW_X509_STORE_get_cert_crl', - '#define X509_STORE_get_check_crl GRPC_SHADOW_X509_STORE_get_check_crl', - '#define X509_STORE_get_check_issued GRPC_SHADOW_X509_STORE_get_check_issued', - '#define X509_STORE_get_check_revocation GRPC_SHADOW_X509_STORE_get_check_revocation', - '#define X509_STORE_get_cleanup GRPC_SHADOW_X509_STORE_get_cleanup', - '#define X509_STORE_get_get_crl GRPC_SHADOW_X509_STORE_get_get_crl', - '#define X509_STORE_get_get_issuer GRPC_SHADOW_X509_STORE_get_get_issuer', - '#define X509_STORE_get_lookup_certs GRPC_SHADOW_X509_STORE_get_lookup_certs', - '#define X509_STORE_get_lookup_crls GRPC_SHADOW_X509_STORE_get_lookup_crls', - '#define X509_STORE_get_verify GRPC_SHADOW_X509_STORE_get_verify', - '#define X509_STORE_get_verify_cb GRPC_SHADOW_X509_STORE_get_verify_cb', - '#define X509_STORE_load_locations GRPC_SHADOW_X509_STORE_load_locations', - '#define X509_STORE_new GRPC_SHADOW_X509_STORE_new', - '#define X509_STORE_set0_additional_untrusted GRPC_SHADOW_X509_STORE_set0_additional_untrusted', - '#define X509_STORE_set1_param GRPC_SHADOW_X509_STORE_set1_param', - '#define X509_STORE_set_cert_crl GRPC_SHADOW_X509_STORE_set_cert_crl', - '#define X509_STORE_set_check_crl GRPC_SHADOW_X509_STORE_set_check_crl', - '#define X509_STORE_set_check_issued GRPC_SHADOW_X509_STORE_set_check_issued', - '#define X509_STORE_set_check_revocation GRPC_SHADOW_X509_STORE_set_check_revocation', - '#define X509_STORE_set_cleanup GRPC_SHADOW_X509_STORE_set_cleanup', - '#define X509_STORE_set_default_paths GRPC_SHADOW_X509_STORE_set_default_paths', - '#define X509_STORE_set_depth GRPC_SHADOW_X509_STORE_set_depth', - '#define X509_STORE_set_flags GRPC_SHADOW_X509_STORE_set_flags', - '#define X509_STORE_set_get_crl GRPC_SHADOW_X509_STORE_set_get_crl', - '#define X509_STORE_set_get_issuer GRPC_SHADOW_X509_STORE_set_get_issuer', - '#define X509_STORE_set_lookup_certs GRPC_SHADOW_X509_STORE_set_lookup_certs', - '#define X509_STORE_set_lookup_crls GRPC_SHADOW_X509_STORE_set_lookup_crls', - '#define X509_STORE_set_purpose GRPC_SHADOW_X509_STORE_set_purpose', - '#define X509_STORE_set_trust GRPC_SHADOW_X509_STORE_set_trust', - '#define X509_STORE_set_verify GRPC_SHADOW_X509_STORE_set_verify', - '#define X509_STORE_set_verify_cb GRPC_SHADOW_X509_STORE_set_verify_cb', - '#define X509_STORE_up_ref GRPC_SHADOW_X509_STORE_up_ref', - '#define X509_subject_name_cmp GRPC_SHADOW_X509_subject_name_cmp', - '#define X509_subject_name_hash GRPC_SHADOW_X509_subject_name_hash', - '#define X509_subject_name_hash_old GRPC_SHADOW_X509_subject_name_hash_old', - '#define X509_supported_extension GRPC_SHADOW_X509_supported_extension', - '#define X509_time_adj GRPC_SHADOW_X509_time_adj', - '#define X509_time_adj_ex GRPC_SHADOW_X509_time_adj_ex', - '#define X509_to_X509_REQ GRPC_SHADOW_X509_to_X509_REQ', - '#define X509_TRUST_add GRPC_SHADOW_X509_TRUST_add', - '#define X509_TRUST_cleanup GRPC_SHADOW_X509_TRUST_cleanup', - '#define X509_trust_clear GRPC_SHADOW_X509_trust_clear', - '#define X509_TRUST_get0 GRPC_SHADOW_X509_TRUST_get0', - '#define X509_TRUST_get0_name GRPC_SHADOW_X509_TRUST_get0_name', - '#define X509_TRUST_get_by_id GRPC_SHADOW_X509_TRUST_get_by_id', - '#define X509_TRUST_get_count GRPC_SHADOW_X509_TRUST_get_count', - '#define X509_TRUST_get_flags GRPC_SHADOW_X509_TRUST_get_flags', - '#define X509_TRUST_get_trust GRPC_SHADOW_X509_TRUST_get_trust', - '#define X509_TRUST_set GRPC_SHADOW_X509_TRUST_set', - '#define X509_TRUST_set_default GRPC_SHADOW_X509_TRUST_set_default', - '#define X509_up_ref GRPC_SHADOW_X509_up_ref', - '#define X509V3_add1_i2d GRPC_SHADOW_X509V3_add1_i2d', - '#define X509v3_add_ext GRPC_SHADOW_X509v3_add_ext', - '#define X509V3_add_standard_extensions GRPC_SHADOW_X509V3_add_standard_extensions', - '#define X509V3_add_value GRPC_SHADOW_X509V3_add_value', - '#define X509V3_add_value_bool GRPC_SHADOW_X509V3_add_value_bool', - '#define X509V3_add_value_bool_nf GRPC_SHADOW_X509V3_add_value_bool_nf', - '#define X509V3_add_value_int GRPC_SHADOW_X509V3_add_value_int', - '#define X509V3_add_value_uchar GRPC_SHADOW_X509V3_add_value_uchar', - '#define x509v3_bytes_to_hex GRPC_SHADOW_x509v3_bytes_to_hex', - '#define X509V3_conf_free GRPC_SHADOW_X509V3_conf_free', - '#define X509v3_delete_ext GRPC_SHADOW_X509v3_delete_ext', - '#define X509V3_EXT_add GRPC_SHADOW_X509V3_EXT_add', - '#define X509V3_EXT_add_alias GRPC_SHADOW_X509V3_EXT_add_alias', - '#define X509V3_EXT_add_list GRPC_SHADOW_X509V3_EXT_add_list', - '#define X509V3_EXT_add_nconf GRPC_SHADOW_X509V3_EXT_add_nconf', - '#define X509V3_EXT_add_nconf_sk GRPC_SHADOW_X509V3_EXT_add_nconf_sk', - '#define X509V3_EXT_cleanup GRPC_SHADOW_X509V3_EXT_cleanup', - '#define X509V3_EXT_CRL_add_nconf GRPC_SHADOW_X509V3_EXT_CRL_add_nconf', - '#define X509V3_EXT_d2i GRPC_SHADOW_X509V3_EXT_d2i', - '#define X509V3_extensions_print GRPC_SHADOW_X509V3_extensions_print', - '#define X509V3_EXT_free GRPC_SHADOW_X509V3_EXT_free', - '#define X509V3_EXT_get GRPC_SHADOW_X509V3_EXT_get', - '#define X509V3_EXT_get_nid GRPC_SHADOW_X509V3_EXT_get_nid', - '#define X509V3_EXT_i2d GRPC_SHADOW_X509V3_EXT_i2d', - '#define X509V3_EXT_nconf GRPC_SHADOW_X509V3_EXT_nconf', - '#define X509V3_EXT_nconf_nid GRPC_SHADOW_X509V3_EXT_nconf_nid', - '#define X509V3_EXT_print GRPC_SHADOW_X509V3_EXT_print', - '#define X509V3_EXT_print_fp GRPC_SHADOW_X509V3_EXT_print_fp', - '#define X509V3_EXT_REQ_add_nconf GRPC_SHADOW_X509V3_EXT_REQ_add_nconf', - '#define X509V3_EXT_val_prn GRPC_SHADOW_X509V3_EXT_val_prn', - '#define X509V3_get_d2i GRPC_SHADOW_X509V3_get_d2i', - '#define X509v3_get_ext GRPC_SHADOW_X509v3_get_ext', - '#define X509v3_get_ext_by_critical GRPC_SHADOW_X509v3_get_ext_by_critical', - '#define X509v3_get_ext_by_NID GRPC_SHADOW_X509v3_get_ext_by_NID', - '#define X509v3_get_ext_by_OBJ GRPC_SHADOW_X509v3_get_ext_by_OBJ', - '#define X509v3_get_ext_count GRPC_SHADOW_X509v3_get_ext_count', - '#define X509V3_get_section GRPC_SHADOW_X509V3_get_section', - '#define X509V3_get_string GRPC_SHADOW_X509V3_get_string', - '#define X509V3_get_value_bool GRPC_SHADOW_X509V3_get_value_bool', - '#define X509V3_get_value_int GRPC_SHADOW_X509V3_get_value_int', - '#define x509v3_hex_to_bytes GRPC_SHADOW_x509v3_hex_to_bytes', - '#define x509v3_looks_like_dns_name GRPC_SHADOW_x509v3_looks_like_dns_name', - '#define x509v3_name_cmp GRPC_SHADOW_x509v3_name_cmp', - '#define X509V3_NAME_from_section GRPC_SHADOW_X509V3_NAME_from_section', - '#define X509V3_parse_list GRPC_SHADOW_X509V3_parse_list', - '#define X509V3_section_free GRPC_SHADOW_X509V3_section_free', - '#define X509V3_set_ctx GRPC_SHADOW_X509V3_set_ctx', - '#define X509V3_set_nconf GRPC_SHADOW_X509V3_set_nconf', - '#define X509V3_string_free GRPC_SHADOW_X509V3_string_free', - '#define X509_VAL_free GRPC_SHADOW_X509_VAL_free', - '#define X509_VAL_it GRPC_SHADOW_X509_VAL_it', - '#define X509_VAL_new GRPC_SHADOW_X509_VAL_new', - '#define X509_verify GRPC_SHADOW_X509_verify', - '#define X509_verify_cert GRPC_SHADOW_X509_verify_cert', - '#define X509_verify_cert_error_string GRPC_SHADOW_X509_verify_cert_error_string', - '#define X509_VERIFY_PARAM_add0_policy GRPC_SHADOW_X509_VERIFY_PARAM_add0_policy', - '#define X509_VERIFY_PARAM_add0_table GRPC_SHADOW_X509_VERIFY_PARAM_add0_table', - '#define X509_VERIFY_PARAM_add1_host GRPC_SHADOW_X509_VERIFY_PARAM_add1_host', - '#define X509_VERIFY_PARAM_clear_flags GRPC_SHADOW_X509_VERIFY_PARAM_clear_flags', - '#define X509_VERIFY_PARAM_free GRPC_SHADOW_X509_VERIFY_PARAM_free', - '#define X509_VERIFY_PARAM_get0 GRPC_SHADOW_X509_VERIFY_PARAM_get0', - '#define X509_VERIFY_PARAM_get0_name GRPC_SHADOW_X509_VERIFY_PARAM_get0_name', - '#define X509_VERIFY_PARAM_get0_peername GRPC_SHADOW_X509_VERIFY_PARAM_get0_peername', - '#define X509_VERIFY_PARAM_get_count GRPC_SHADOW_X509_VERIFY_PARAM_get_count', - '#define X509_VERIFY_PARAM_get_depth GRPC_SHADOW_X509_VERIFY_PARAM_get_depth', - '#define X509_VERIFY_PARAM_get_flags GRPC_SHADOW_X509_VERIFY_PARAM_get_flags', - '#define X509_VERIFY_PARAM_inherit GRPC_SHADOW_X509_VERIFY_PARAM_inherit', - '#define X509_VERIFY_PARAM_lookup GRPC_SHADOW_X509_VERIFY_PARAM_lookup', - '#define X509_VERIFY_PARAM_new GRPC_SHADOW_X509_VERIFY_PARAM_new', - '#define X509_VERIFY_PARAM_set1 GRPC_SHADOW_X509_VERIFY_PARAM_set1', - '#define X509_VERIFY_PARAM_set1_email GRPC_SHADOW_X509_VERIFY_PARAM_set1_email', - '#define X509_VERIFY_PARAM_set1_host GRPC_SHADOW_X509_VERIFY_PARAM_set1_host', - '#define X509_VERIFY_PARAM_set1_ip GRPC_SHADOW_X509_VERIFY_PARAM_set1_ip', - '#define X509_VERIFY_PARAM_set1_ip_asc GRPC_SHADOW_X509_VERIFY_PARAM_set1_ip_asc', - '#define X509_VERIFY_PARAM_set1_name GRPC_SHADOW_X509_VERIFY_PARAM_set1_name', - '#define X509_VERIFY_PARAM_set1_policies GRPC_SHADOW_X509_VERIFY_PARAM_set1_policies', - '#define X509_VERIFY_PARAM_set_depth GRPC_SHADOW_X509_VERIFY_PARAM_set_depth', - '#define X509_VERIFY_PARAM_set_flags GRPC_SHADOW_X509_VERIFY_PARAM_set_flags', - '#define X509_VERIFY_PARAM_set_hostflags GRPC_SHADOW_X509_VERIFY_PARAM_set_hostflags', - '#define X509_VERIFY_PARAM_set_purpose GRPC_SHADOW_X509_VERIFY_PARAM_set_purpose', - '#define X509_VERIFY_PARAM_set_time GRPC_SHADOW_X509_VERIFY_PARAM_set_time', - '#define X509_VERIFY_PARAM_set_trust GRPC_SHADOW_X509_VERIFY_PARAM_set_trust', - '#define X509_VERIFY_PARAM_table_cleanup GRPC_SHADOW_X509_VERIFY_PARAM_table_cleanup' ->>>>>>> upstream/master end diff --git a/tools/dockerfile/test/sanity/Dockerfile b/tools/dockerfile/test/sanity/Dockerfile index 9d04e2a0ef4..3666b26ef72 100644 --- a/tools/dockerfile/test/sanity/Dockerfile +++ b/tools/dockerfile/test/sanity/Dockerfile @@ -21,7 +21,6 @@ RUN apt-get update && apt-get install -y \ build-essential \ bzip2 \ ccache \ - cmake \ curl \ dnsutils \ gcc \ diff --git a/tools/doxygen/Doxyfile.c++.internal b/tools/doxygen/Doxyfile.c++.internal index edbe236dc17..32eb50ebcc4 100644 --- a/tools/doxygen/Doxyfile.c++.internal +++ b/tools/doxygen/Doxyfile.c++.internal @@ -1876,7 +1876,6 @@ src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc \ src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.h \ src/core/tsi/fake_transport_security.cc \ src/core/tsi/fake_transport_security.h \ -src/core/tsi/grpc_shadow_boringssl.h \ src/core/tsi/local_transport_security.cc \ src/core/tsi/local_transport_security.h \ src/core/tsi/ssl/session_cache/ssl_session.h \ From 962a8f28f9c448dbb84769109d69be21103f42f9 Mon Sep 17 00:00:00 2001 From: Alexander Polcyn Date: Wed, 1 Apr 2020 13:00:12 -0700 Subject: [PATCH 359/758] Add a flag to set a grpclb+pick_first service config in CreateTestChannel; use CreateTestChannel in qps_json_driver --- test/cpp/qps/driver.cc | 26 ++++++++++-------------- test/cpp/util/create_test_channel.cc | 30 ++++++++++++++++++++++++---- 2 files changed, 37 insertions(+), 19 deletions(-) diff --git a/test/cpp/qps/driver.cc b/test/cpp/qps/driver.cc index 94c2feffc19..03a4477b4d8 100644 --- a/test/cpp/qps/driver.cc +++ b/test/cpp/qps/driver.cc @@ -313,11 +313,10 @@ std::unique_ptr RunScenario( gpr_log(GPR_INFO, "Starting server on %s (worker #%" PRIuPTR ")", workers[i].c_str(), i); if (!run_inproc) { - servers[i].stub = WorkerService::NewStub(grpc::CreateChannel( - workers[i], GetCredentialsProvider()->GetChannelCredentials( - GetCredType(workers[i], per_worker_credential_types, - credential_type), - &channel_args))); + servers[i].stub = WorkerService::NewStub(grpc::CreateTestChannel( + workers[i], + GetCredType(workers[i], per_worker_credential_types, credential_type), + nullptr /* call creds */, {} /* interceptor creators */)); } else { servers[i].stub = WorkerService::NewStub( local_workers[i]->InProcessChannel(channel_args)); @@ -373,11 +372,10 @@ std::unique_ptr RunScenario( gpr_log(GPR_INFO, "Starting client on %s (worker #%" PRIuPTR ")", worker.c_str(), i + num_servers); if (!run_inproc) { - clients[i].stub = WorkerService::NewStub(grpc::CreateChannel( + clients[i].stub = WorkerService::NewStub(grpc::CreateTestChannel( worker, - GetCredentialsProvider()->GetChannelCredentials( - GetCredType(worker, per_worker_credential_types, credential_type), - &channel_args))); + GetCredType(worker, per_worker_credential_types, credential_type), + nullptr /* call creds */, {} /* interceptor creators */)); } else { clients[i].stub = WorkerService::NewStub( local_workers[i + num_servers]->InProcessChannel(channel_args)); @@ -588,13 +586,11 @@ bool RunQuit( return false; } - ChannelArguments channel_args; for (size_t i = 0; i < workers.size(); i++) { - auto stub = WorkerService::NewStub(grpc::CreateChannel( - workers[i], GetCredentialsProvider()->GetChannelCredentials( - GetCredType(workers[i], per_worker_credential_types, - credential_type), - &channel_args))); + auto stub = WorkerService::NewStub(grpc::CreateTestChannel( + workers[i], + GetCredType(workers[i], per_worker_credential_types, credential_type), + nullptr /* call creds */, {} /* interceptor creators */)); Void dummy; grpc::ClientContext ctx; ctx.set_wait_for_ready(true); diff --git a/test/cpp/util/create_test_channel.cc b/test/cpp/util/create_test_channel.cc index a46a39c87c1..c4ba24749a6 100644 --- a/test/cpp/util/create_test_channel.cc +++ b/test/cpp/util/create_test_channel.cc @@ -18,12 +18,21 @@ #include "test/cpp/util/create_test_channel.h" +#include + #include #include #include #include "test/cpp/util/test_credentials_provider.h" +DEFINE_string( + grpc_test_use_grpclb_with_child_policy, "", + "If non-empty, set a static service config on channels created by " + "grpc::CreateTestChannel, that configures the grpclb LB policy " + "with a child policy being the value of this flag (e.g. round_robin " + "or pick_first)."); + namespace grpc { namespace { @@ -49,6 +58,16 @@ void AddProdSslType() { new SslCredentialProvider)); } +void MaybeSetCustomChannelArgs(grpc::ChannelArguments* args) { + if (FLAGS_grpc_test_use_grpclb_with_child_policy.size() > 0) { + args->SetString("grpc.service_config", + "{\"loadBalancingConfig\":[{\"grpclb\":{\"childPolicy\":[{" + "\"" + + FLAGS_grpc_test_use_grpclb_with_child_policy + + "\":{}}]}}]}"); + } +} + } // namespace // When cred_type is 'ssl', if server is empty, override_hostname is used to @@ -111,6 +130,7 @@ std::shared_ptr CreateTestChannel( const grpc::string& server, const grpc::string& credential_type, const std::shared_ptr& creds) { ChannelArguments channel_args; + MaybeSetCustomChannelArgs(&channel_args); std::shared_ptr channel_creds = testing::GetCredentialsProvider()->GetChannelCredentials(credential_type, &channel_args); @@ -129,14 +149,15 @@ std::shared_ptr CreateTestChannel( std::unique_ptr> interceptor_creators) { ChannelArguments channel_args(args); + MaybeSetCustomChannelArgs(&channel_args); std::shared_ptr channel_creds; if (cred_type.empty()) { if (interceptor_creators.empty()) { return ::grpc::CreateCustomChannel(server, InsecureChannelCredentials(), - args); + channel_args); } else { return experimental::CreateCustomChannelWithInterceptors( - server, InsecureChannelCredentials(), args, + server, InsecureChannelCredentials(), channel_args, std::move(interceptor_creators)); } } else if (cred_type == testing::kTlsCredentialsType) { // cred_type == "ssl" @@ -173,10 +194,10 @@ std::shared_ptr CreateTestChannel( GPR_ASSERT(channel_creds != nullptr); if (interceptor_creators.empty()) { - return ::grpc::CreateCustomChannel(server, channel_creds, args); + return ::grpc::CreateCustomChannel(server, channel_creds, channel_args); } else { return experimental::CreateCustomChannelWithInterceptors( - server, channel_creds, args, std::move(interceptor_creators)); + server, channel_creds, channel_args, std::move(interceptor_creators)); } } } @@ -217,6 +238,7 @@ std::shared_ptr CreateTestChannel( std::unique_ptr> interceptor_creators) { ChannelArguments channel_args; + MaybeSetCustomChannelArgs(&channel_args); std::shared_ptr channel_creds = testing::GetCredentialsProvider()->GetChannelCredentials(credential_type, &channel_args); From a39d5407ae25461855c7a6beb04a36fb5f0db18f Mon Sep 17 00:00:00 2001 From: Muxi Yan Date: Fri, 3 Apr 2020 12:56:14 -0700 Subject: [PATCH 360/758] upgrade BoringSSL --- src/objective-c/BoringSSL-GRPC.podspec | 2 +- templates/src/objective-c/BoringSSL-GRPC.podspec.template | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/objective-c/BoringSSL-GRPC.podspec b/src/objective-c/BoringSSL-GRPC.podspec index 1b86cb2d2a2..05e03a5b5ee 100644 --- a/src/objective-c/BoringSSL-GRPC.podspec +++ b/src/objective-c/BoringSSL-GRPC.podspec @@ -39,7 +39,7 @@ Pod::Spec.new do |s| s.name = 'BoringSSL-GRPC' - version = '0.0.7' + version = '0.0.8' s.version = version s.summary = 'BoringSSL is a fork of OpenSSL that is designed to meet Google\'s needs.' # Adapted from the homepage: diff --git a/templates/src/objective-c/BoringSSL-GRPC.podspec.template b/templates/src/objective-c/BoringSSL-GRPC.podspec.template index 1d9f2967be5..b15e07799ae 100644 --- a/templates/src/objective-c/BoringSSL-GRPC.podspec.template +++ b/templates/src/objective-c/BoringSSL-GRPC.podspec.template @@ -56,7 +56,7 @@ Pod::Spec.new do |s| s.name = 'BoringSSL-GRPC' - version = '0.0.7' + version = '0.0.8' s.version = version s.summary = 'BoringSSL is a fork of OpenSSL that is designed to meet Google\'s needs.' # Adapted from the homepage: From 6f00de087f1db5b6cb40d750e8f76401f0389f2b Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Fri, 3 Apr 2020 15:13:26 -0700 Subject: [PATCH 361/758] Aggregate common statement in both branches --- src/python/grpcio/grpc/experimental/aio/_call.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/python/grpcio/grpc/experimental/aio/_call.py b/src/python/grpcio/grpc/experimental/aio/_call.py index 8fafcde2a1b..be4887d239c 100644 --- a/src/python/grpcio/grpc/experimental/aio/_call.py +++ b/src/python/grpcio/grpc/experimental/aio/_call.py @@ -400,11 +400,11 @@ class _StreamRequestMixin(Call): if inspect.isasyncgen(request_iterator): async for request in request_iterator: await self._write(request) - await self._done_writing() else: for request in request_iterator: await self._write(request) - await self._done_writing() + + await self._done_writing() except AioRpcError as rpc_error: # Rpc status should be exposed through other API. Exceptions raised # within this Task won't be retrieved by another coroutine. It's From 0325842b1dbd5b54427559eaa4cdeaa558ab4a9b Mon Sep 17 00:00:00 2001 From: Eric Gribkoff Date: Sat, 4 Apr 2020 10:17:13 -0700 Subject: [PATCH 362/758] Disable flaky verification of no RPC failure --- tools/run_tests/run_xds_tests.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/run_tests/run_xds_tests.py b/tools/run_tests/run_xds_tests.py index 43ad64179d4..3e165da4f1d 100755 --- a/tools/run_tests/run_xds_tests.py +++ b/tools/run_tests/run_xds_tests.py @@ -338,9 +338,9 @@ def test_change_backend_service(gcp, original_backend_service, instance_group, _WAIT_FOR_STATS_SEC) try: patch_url_map_backend_service(gcp, alternate_backend_service) - stats = get_client_stats(_NUM_TEST_RPCS, _WAIT_FOR_STATS_SEC) - if stats.num_failures > 0: - raise Exception('Unexpected failure: %s', stats) + # TODO(ericgribkoff) Verify no RPCs fail during backend switch. + # Currently TD may briefly send an update with no localities if adding + # the MIG to the backend service above races with the URL map patch. wait_until_all_rpcs_go_to_given_backends(alternate_backend_instances, _WAIT_FOR_URL_MAP_PATCH_SEC) finally: From fc70267f0e9c728d50911e75403397eac4c96c44 Mon Sep 17 00:00:00 2001 From: Oshiumi Date: Tue, 7 Apr 2020 01:17:09 +0900 Subject: [PATCH 363/758] Fix generating output with nested resource --- src/compiler/ruby_generator_string-inl.h | 8 +++++--- .../codegen/grpc/testing/package_options_ruby_style.proto | 5 +++++ src/ruby/spec/pb/codegen/package_option_spec.rb | 2 ++ 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/compiler/ruby_generator_string-inl.h b/src/compiler/ruby_generator_string-inl.h index 005e9f09c75..bece54ac4dd 100644 --- a/src/compiler/ruby_generator_string-inl.h +++ b/src/compiler/ruby_generator_string-inl.h @@ -119,12 +119,14 @@ inline grpc::string RubyPackage(const grpc::protobuf::FileDescriptor* file) { inline grpc::string RubyTypeOf(const grpc::protobuf::Descriptor* descriptor, const grpc::string& package) { std::string proto_type = descriptor->full_name(); + ReplacePrefix(&proto_type, package, ""); // remove the leading package if present + ReplacePrefix(&proto_type, ".", ""); // remove the leading . (no package) + if (descriptor->file()->options().has_ruby_package()) { - proto_type = RubyPackage(descriptor->file()) + "." + descriptor->name(); + proto_type = RubyPackage(descriptor->file()) + "." + proto_type; } grpc::string res(proto_type); - ReplacePrefix(&res, package, ""); // remove the leading package if present - ReplacePrefix(&res, ".", ""); // remove the leading . (no package) + if (res.find('.') == grpc::string::npos) { return res; } else { diff --git a/src/ruby/spec/pb/codegen/grpc/testing/package_options_ruby_style.proto b/src/ruby/spec/pb/codegen/grpc/testing/package_options_ruby_style.proto index 4bfe61e2f63..40400b67d2f 100644 --- a/src/ruby/spec/pb/codegen/grpc/testing/package_options_ruby_style.proto +++ b/src/ruby/spec/pb/codegen/grpc/testing/package_options_ruby_style.proto @@ -27,8 +27,13 @@ message AnotherTestResponse { } message Foo { } +message Bar { + message Baz { } +} + service AnotherTestService { rpc GetTest(AnotherTestRequest) returns (AnotherTestResponse) { } rpc OtherTest(Thing) returns (Thing) { } rpc FooTest(Foo) returns (Foo) { } + rpc NestedMessageTest(Foo) returns (Bar.Baz) { } } diff --git a/src/ruby/spec/pb/codegen/package_option_spec.rb b/src/ruby/spec/pb/codegen/package_option_spec.rb index 870f53ef297..cc6649c5afa 100644 --- a/src/ruby/spec/pb/codegen/package_option_spec.rb +++ b/src/ruby/spec/pb/codegen/package_option_spec.rb @@ -40,6 +40,8 @@ describe 'Code Generation Options' do expect(services[:OtherTest].output).to eq(A::Other::Thing) expect(services[:FooTest].input).to eq(RPC::Test::New::Package::Options::Foo) expect(services[:FooTest].output).to eq(RPC::Test::New::Package::Options::Foo) + expect(services[:NestedMessageTest].input).to eq(RPC::Test::New::Package::Options::Foo) + expect(services[:NestedMessageTest].output).to eq(RPC::Test::New::Package::Options::Bar::Baz) end end end From 9344a259b5d1216a1ba2184dd494a35299969c30 Mon Sep 17 00:00:00 2001 From: Richard Belleville Date: Mon, 6 Apr 2020 13:06:35 -0700 Subject: [PATCH 364/758] Fix MacOS Python 3.5 gevent build --- .../run_tests/helper_scripts/build_python.sh | 25 +++++++++++++------ 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/tools/run_tests/helper_scripts/build_python.sh b/tools/run_tests/helper_scripts/build_python.sh index 670b5fc69d8..48b4d13a262 100755 --- a/tools/run_tests/helper_scripts/build_python.sh +++ b/tools/run_tests/helper_scripts/build_python.sh @@ -165,24 +165,33 @@ pip_install_dir() { cd "$PWD" } +# On library/version/platforms combos that do not have a binary +# published, we may end up building a dependency from source. In that +# case, several of our build environment variables may disrupt the +# third-party build process. This function pipes through only the +# minimal environment necessary. +pip_install() { + /usr/bin/env -i PATH="$PATH" $VENV_PYTHON -m pip install $@ +} + case "$VENV" in *py36_gevent*) # TODO(https://github.com/grpc/grpc/issues/15411) unpin this - $VENV_PYTHON -m pip install gevent==1.3.b1 + pip_install gevent==1.3.b1 ;; *gevent*) - $VENV_PYTHON -m pip install -U gevent + pip_install -U gevent ;; esac -$VENV_PYTHON -m pip install --upgrade pip==19.3.1 -$VENV_PYTHON -m pip install --upgrade setuptools -$VENV_PYTHON -m pip install --upgrade cython -$VENV_PYTHON -m pip install --upgrade six enum34 protobuf +pip_install --upgrade pip==19.3.1 +pip_install --upgrade setuptools +pip_install --upgrade cython +pip_install --upgrade six enum34 protobuf if [ "$("$VENV_PYTHON" -c "import sys; print(sys.version_info[0])")" == "2" ] then - $VENV_PYTHON -m pip install futures + pip_install futures fi pip_install_dir "$ROOT" @@ -214,7 +223,7 @@ pip_install_dir "$ROOT/src/python/grpcio_status" pip_install_dir "$ROOT/src/python/grpcio_testing" # Build/install tests -$VENV_PYTHON -m pip install coverage==4.4 oauth2client==4.1.0 \ +pip_install coverage==4.4 oauth2client==4.1.0 \ google-auth==1.0.0 requests==2.14.2 \ googleapis-common-protos==1.5.5 $VENV_PYTHON "$ROOT/src/python/grpcio_tests/setup.py" preprocess From 4c79018a96a0e59de1a039f6f7af7c410509bdd8 Mon Sep 17 00:00:00 2001 From: Richard Belleville Date: Mon, 6 Apr 2020 13:08:28 -0700 Subject: [PATCH 365/758] Revert changes to abseil-cpp --- third_party/abseil-cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/third_party/abseil-cpp b/third_party/abseil-cpp index b832dce8489..df3ea785d8c 160000 --- a/third_party/abseil-cpp +++ b/third_party/abseil-cpp @@ -1 +1 @@ -Subproject commit b832dce8489ef7b6231384909fd9b68d5a5ff2b7 +Subproject commit df3ea785d8c30a9503321a3d35ee7d35808f190d From fb2b2122acdfcb854136fec9bf3916edb56ff102 Mon Sep 17 00:00:00 2001 From: Richard Belleville Date: Mon, 6 Apr 2020 14:21:00 -0700 Subject: [PATCH 366/758] Add quotes --- tools/run_tests/helper_scripts/build_python.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/run_tests/helper_scripts/build_python.sh b/tools/run_tests/helper_scripts/build_python.sh index 48b4d13a262..a633049510b 100755 --- a/tools/run_tests/helper_scripts/build_python.sh +++ b/tools/run_tests/helper_scripts/build_python.sh @@ -165,13 +165,13 @@ pip_install_dir() { cd "$PWD" } -# On library/version/platforms combos that do not have a binary +# On library/version/platforms combo that do not have a binary # published, we may end up building a dependency from source. In that # case, several of our build environment variables may disrupt the # third-party build process. This function pipes through only the # minimal environment necessary. pip_install() { - /usr/bin/env -i PATH="$PATH" $VENV_PYTHON -m pip install $@ + /usr/bin/env -i PATH="$PATH" "$VENV_PYTHON" -m pip install $@ } case "$VENV" in From c0c7f1dae370d57cafed4d8950a7a671025709bc Mon Sep 17 00:00:00 2001 From: Donna Dionne Date: Mon, 6 Apr 2020 16:05:04 -0700 Subject: [PATCH 367/758] Fix build and test failures Including the following All all needed BUILD changes to include new xdsRouting Fixed TSAN errors AllServerUnavailableFailFast may return UNKNOWN as oppose UNAVAILABLE ChooseLastRoute modified into 2 tests --- BUILD | 1 + BUILD.gn | 1 + CMakeLists.txt | 2 + Makefile | 2 + build_autogenerated.yaml | 2 + config.m4 | 1 + config.w32 | 1 + gRPC-Core.podspec | 1 + grpc.gemspec | 1 + grpc.gyp | 2 + package.xml | 1 + .../lb_policy/xds/xds_routing.cc | 11 +- src/python/grpcio/grpc_core_dependencies.py | 1 + test/cpp/end2end/xds_end2end_test.cc | 218 ++++++++++++++---- tools/doxygen/Doxyfile.c++.internal | 1 + tools/doxygen/Doxyfile.core.internal | 1 + 16 files changed, 191 insertions(+), 56 deletions(-) diff --git a/BUILD b/BUILD index 58148f58dab..30696bb45b9 100644 --- a/BUILD +++ b/BUILD @@ -321,6 +321,7 @@ grpc_cc_library( "grpc_lb_policy_cds", "grpc_lb_policy_grpclb", "grpc_lb_policy_xds", + "grpc_lb_policy_xds_routing", "grpc_resolver_xds", ], ) diff --git a/BUILD.gn b/BUILD.gn index 306f2bfa6d8..ba1da8dd097 100644 --- a/BUILD.gn +++ b/BUILD.gn @@ -243,6 +243,7 @@ config("grpc_config") { "src/core/ext/filters/client_channel/lb_policy/xds/cds.cc", "src/core/ext/filters/client_channel/lb_policy/xds/xds.cc", "src/core/ext/filters/client_channel/lb_policy/xds/xds.h", + "src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc", "src/core/ext/filters/client_channel/lb_policy_factory.h", "src/core/ext/filters/client_channel/lb_policy_registry.cc", "src/core/ext/filters/client_channel/lb_policy_registry.h", diff --git a/CMakeLists.txt b/CMakeLists.txt index 5a52205e480..07f1c8707de 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1327,6 +1327,7 @@ add_library(grpc src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc src/core/ext/filters/client_channel/lb_policy/xds/cds.cc src/core/ext/filters/client_channel/lb_policy/xds/xds.cc + src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc src/core/ext/filters/client_channel/lb_policy_registry.cc src/core/ext/filters/client_channel/local_subchannel_pool.cc src/core/ext/filters/client_channel/parse_address.cc @@ -1981,6 +1982,7 @@ add_library(grpc_unsecure src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc src/core/ext/filters/client_channel/lb_policy/xds/cds.cc src/core/ext/filters/client_channel/lb_policy/xds/xds.cc + src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc src/core/ext/filters/client_channel/lb_policy_registry.cc src/core/ext/filters/client_channel/local_subchannel_pool.cc src/core/ext/filters/client_channel/parse_address.cc diff --git a/Makefile b/Makefile index 08ee1cbe217..f5e81897927 100644 --- a/Makefile +++ b/Makefile @@ -3657,6 +3657,7 @@ LIBGRPC_SRC = \ src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc \ src/core/ext/filters/client_channel/lb_policy/xds/cds.cc \ src/core/ext/filters/client_channel/lb_policy/xds/xds.cc \ + src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc \ src/core/ext/filters/client_channel/lb_policy_registry.cc \ src/core/ext/filters/client_channel/local_subchannel_pool.cc \ src/core/ext/filters/client_channel/parse_address.cc \ @@ -4286,6 +4287,7 @@ LIBGRPC_UNSECURE_SRC = \ src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc \ src/core/ext/filters/client_channel/lb_policy/xds/cds.cc \ src/core/ext/filters/client_channel/lb_policy/xds/xds.cc \ + src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc \ src/core/ext/filters/client_channel/lb_policy_registry.cc \ src/core/ext/filters/client_channel/local_subchannel_pool.cc \ src/core/ext/filters/client_channel/parse_address.cc \ diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml index 14daa48e2b7..8b76ea81666 100644 --- a/build_autogenerated.yaml +++ b/build_autogenerated.yaml @@ -751,6 +751,7 @@ libs: - src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc - src/core/ext/filters/client_channel/lb_policy/xds/cds.cc - src/core/ext/filters/client_channel/lb_policy/xds/xds.cc + - src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc - src/core/ext/filters/client_channel/lb_policy_registry.cc - src/core/ext/filters/client_channel/local_subchannel_pool.cc - src/core/ext/filters/client_channel/parse_address.cc @@ -1582,6 +1583,7 @@ libs: - src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc - src/core/ext/filters/client_channel/lb_policy/xds/cds.cc - src/core/ext/filters/client_channel/lb_policy/xds/xds.cc + - src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc - src/core/ext/filters/client_channel/lb_policy_registry.cc - src/core/ext/filters/client_channel/local_subchannel_pool.cc - src/core/ext/filters/client_channel/parse_address.cc diff --git a/config.m4 b/config.m4 index 66922ad5527..8dc2fc8920a 100644 --- a/config.m4 +++ b/config.m4 @@ -61,6 +61,7 @@ if test "$PHP_GRPC" != "no"; then src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc \ src/core/ext/filters/client_channel/lb_policy/xds/cds.cc \ src/core/ext/filters/client_channel/lb_policy/xds/xds.cc \ + src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc \ src/core/ext/filters/client_channel/lb_policy_registry.cc \ src/core/ext/filters/client_channel/local_subchannel_pool.cc \ src/core/ext/filters/client_channel/parse_address.cc \ diff --git a/config.w32 b/config.w32 index 541cc74b602..eb32d08f6fb 100644 --- a/config.w32 +++ b/config.w32 @@ -30,6 +30,7 @@ if (PHP_GRPC != "no") { "src\\core\\ext\\filters\\client_channel\\lb_policy\\round_robin\\round_robin.cc " + "src\\core\\ext\\filters\\client_channel\\lb_policy\\xds\\cds.cc " + "src\\core\\ext\\filters\\client_channel\\lb_policy\\xds\\xds.cc " + + "src\\core\\ext\\filters\\client_channel\\lb_policy\\xds\\xds_routing.cc " + "src\\core\\ext\\filters\\client_channel\\lb_policy_registry.cc " + "src\\core\\ext\\filters\\client_channel\\local_subchannel_pool.cc " + "src\\core\\ext\\filters\\client_channel\\parse_address.cc " + diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec index d140b005d7f..183efc4f74c 100644 --- a/gRPC-Core.podspec +++ b/gRPC-Core.podspec @@ -226,6 +226,7 @@ Pod::Spec.new do |s| 'src/core/ext/filters/client_channel/lb_policy/xds/cds.cc', 'src/core/ext/filters/client_channel/lb_policy/xds/xds.cc', 'src/core/ext/filters/client_channel/lb_policy/xds/xds.h', + 'src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc', 'src/core/ext/filters/client_channel/lb_policy_factory.h', 'src/core/ext/filters/client_channel/lb_policy_registry.cc', 'src/core/ext/filters/client_channel/lb_policy_registry.h', diff --git a/grpc.gemspec b/grpc.gemspec index c9a1a8835fd..8c6b8413c1f 100644 --- a/grpc.gemspec +++ b/grpc.gemspec @@ -148,6 +148,7 @@ Gem::Specification.new do |s| s.files += %w( src/core/ext/filters/client_channel/lb_policy/xds/cds.cc ) s.files += %w( src/core/ext/filters/client_channel/lb_policy/xds/xds.cc ) s.files += %w( src/core/ext/filters/client_channel/lb_policy/xds/xds.h ) + s.files += %w( src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc ) s.files += %w( src/core/ext/filters/client_channel/lb_policy_factory.h ) s.files += %w( src/core/ext/filters/client_channel/lb_policy_registry.cc ) s.files += %w( src/core/ext/filters/client_channel/lb_policy_registry.h ) diff --git a/grpc.gyp b/grpc.gyp index b065ee6f2af..e5168e57df4 100644 --- a/grpc.gyp +++ b/grpc.gyp @@ -453,6 +453,7 @@ 'src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc', 'src/core/ext/filters/client_channel/lb_policy/xds/cds.cc', 'src/core/ext/filters/client_channel/lb_policy/xds/xds.cc', + 'src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc', 'src/core/ext/filters/client_channel/lb_policy_registry.cc', 'src/core/ext/filters/client_channel/local_subchannel_pool.cc', 'src/core/ext/filters/client_channel/parse_address.cc', @@ -943,6 +944,7 @@ 'src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc', 'src/core/ext/filters/client_channel/lb_policy/xds/cds.cc', 'src/core/ext/filters/client_channel/lb_policy/xds/xds.cc', + 'src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc', 'src/core/ext/filters/client_channel/lb_policy_registry.cc', 'src/core/ext/filters/client_channel/local_subchannel_pool.cc', 'src/core/ext/filters/client_channel/parse_address.cc', diff --git a/package.xml b/package.xml index 32930b6f65c..f0ace0d092d 100644 --- a/package.xml +++ b/package.xml @@ -128,6 +128,7 @@ + diff --git a/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc b/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc index 703f670186f..53e6b26767a 100644 --- a/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc +++ b/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc @@ -95,7 +95,7 @@ class XdsRoutingLb : public LoadBalancingPolicy { ChildPickerWrapper(std::string name, std::unique_ptr picker) : name_(std::move(name)), picker_(std::move(picker)) {} - PickResult Pick(PickArgs args) { return picker_->Pick(std::move(args)); } + PickResult Pick(PickArgs args) { return picker_->Pick(args); } const std::string& name() const { return name_; } @@ -239,7 +239,7 @@ XdsRoutingLb::PickResult XdsRoutingLb::RoutePicker::Pick(PickArgs args) { grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING( "xds routing picker not given any picker; default " "route not configured"), - GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_INTERNAL); + GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE); return result; } @@ -417,8 +417,8 @@ XdsRoutingLb::XdsRoutingChild::XdsRoutingChild( XdsRoutingLb::XdsRoutingChild::~XdsRoutingChild() { if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_routing_lb_trace)) { gpr_log(GPR_INFO, - "[xds_routing_lb %p] XdsRoutingChild %p %s: destroying child", - xds_routing_policy_.get(), this, name_.c_str()); + "[xds_routing_lb %p] XdsRoutingChild %p: destroying child", + xds_routing_policy_.get(), this); } xds_routing_policy_.reset(DEBUG_LOCATION, "XdsRoutingChild"); } @@ -485,7 +485,7 @@ void XdsRoutingLb::XdsRoutingChild::UpdateLocked( } // Construct update args. UpdateArgs update_args; - update_args.config = config; + update_args.config = std::move(config); update_args.addresses = addresses; update_args.args = grpc_channel_args_copy(args); // Update the policy. @@ -509,6 +509,7 @@ void XdsRoutingLb::XdsRoutingChild::ResetBackoffLocked() { void XdsRoutingLb::XdsRoutingChild::DeactivateLocked() { // If already deactivated, don't do that again. + if (delayed_removal_timer_callback_pending_ == true) return; // Set the child weight to 0 so that future picker won't contain this child. // Start a timer to delete the child. Ref(DEBUG_LOCATION, "XdsRoutingChild+timer").release(); diff --git a/src/python/grpcio/grpc_core_dependencies.py b/src/python/grpcio/grpc_core_dependencies.py index 46cce67f77e..1d4b07668bf 100644 --- a/src/python/grpcio/grpc_core_dependencies.py +++ b/src/python/grpcio/grpc_core_dependencies.py @@ -39,6 +39,7 @@ CORE_SOURCE_FILES = [ 'src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc', 'src/core/ext/filters/client_channel/lb_policy/xds/cds.cc', 'src/core/ext/filters/client_channel/lb_policy/xds/xds.cc', + 'src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc', 'src/core/ext/filters/client_channel/lb_policy_registry.cc', 'src/core/ext/filters/client_channel/local_subchannel_pool.cc', 'src/core/ext/filters/client_channel/parse_address.cc', diff --git a/test/cpp/end2end/xds_end2end_test.cc b/test/cpp/end2end/xds_end2end_test.cc index 803af0dd346..c2b998bdf58 100644 --- a/test/cpp/end2end/xds_end2end_test.cc +++ b/test/cpp/end2end/xds_end2end_test.cc @@ -1662,7 +1662,9 @@ TEST_P(BasicTest, AllServersUnreachableFailFast) { AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); const Status status = SendRpc(); // The error shouldn't be DEADLINE_EXCEEDED. - EXPECT_EQ(StatusCode::UNAVAILABLE, status.error_code()); + gpr_log(GPR_INFO, "error code %d message received %s", status.error_code(), + status.error_message().c_str()); + EXPECT_NE(StatusCode::DEADLINE_EXCEEDED, status.error_code()); } // Tests that RPCs fail when the backends are down, and will succeed again after @@ -2049,13 +2051,11 @@ TEST_P(LdsTest, ChooseMatchedDomain) { AdsServiceImpl::ACKED); } -// Tests that LDS client should choose the last route in the virtual host if -// multiple routes exist in the LDS response. -TEST_P(LdsTest, ChooseLastRoute) { +// Tests that the LDS client should NACK when the last route is not a default +// route. +TEST_P(LdsTest, DefaultRouteInvalid) { RouteConfiguration route_config = balancers_[0]->ads_service()->default_route_config(); - *(route_config.mutable_virtual_hosts(0)->add_routes()) = - route_config.virtual_hosts(0).routes(0); route_config.mutable_virtual_hosts(0) ->mutable_routes(0) ->mutable_route() @@ -2066,10 +2066,10 @@ TEST_P(LdsTest, ChooseLastRoute) { SetNextResolutionForLbChannelAllBalancers(); (void)SendRpc(); EXPECT_EQ(balancers_[0]->ads_service()->lds_response_state(), - AdsServiceImpl::ACKED); + AdsServiceImpl::NACKED); } -// Tests that LDS client should send a NACK if route match has non-empty prefix +// Tests that LDS client should send a ACK if route match has non-empty prefix // in the LDS response. TEST_P(LdsTest, RouteMatchHasNonemptyPrefix) { RouteConfiguration route_config = @@ -2084,7 +2084,7 @@ TEST_P(LdsTest, RouteMatchHasNonemptyPrefix) { SetNextResolutionForLbChannelAllBalancers(); CheckRpcSendFailure(); EXPECT_EQ(balancers_[0]->ads_service()->lds_response_state(), - AdsServiceImpl::NACKED); + AdsServiceImpl::ACKED); } // Tests that LDS client should send a NACK if route has an action other than @@ -2130,7 +2130,9 @@ TEST_P(LdsTest, Timeout) { } TEST_P(LdsTest, XdsRoutingPathMatching) { - const char* kNewClusterName = "new_cluster_name"; + const char* kNewCluster1Name = "new_cluster_1"; + const char* kNewCluster2Name = "new_cluster_2"; + const size_t kNumRpcs = 10; SetNextResolution({}); SetNextResolutionForLbChannelAllBalancers(); AdsServiceImpl::EdsResourceArgs args({ @@ -2140,34 +2142,59 @@ TEST_P(LdsTest, XdsRoutingPathMatching) { AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); // We need to wait for all backends to come online. WaitForAllBackends(0, 2); - // Populate new EDS resource. + // Populate new EDS resources. + AdsServiceImpl::EdsResourceArgs args1({ + {"locality0", GetBackendPorts(2, 3)}, + }); AdsServiceImpl::EdsResourceArgs args2({ - {"locality0", GetBackendPorts(2, 4)}, + {"locality0", GetBackendPorts(3, 4)}, }); balancers_[0]->ads_service()->SetEdsResource( - AdsServiceImpl::BuildEdsResource(args2, kNewClusterName), - kNewClusterName); - // Populate new CDS resource. - Cluster new_cluster = balancers_[0]->ads_service()->default_cluster(); - new_cluster.set_name(kNewClusterName); - balancers_[0]->ads_service()->SetCdsResource(new_cluster, kNewClusterName); - // Change RDS resource to point to new cluster. + AdsServiceImpl::BuildEdsResource(args1, kNewCluster1Name), + kNewCluster1Name); + balancers_[0]->ads_service()->SetEdsResource( + AdsServiceImpl::BuildEdsResource(args2, kNewCluster2Name), + kNewCluster2Name); + // Populate new CDS resources. + Cluster new_cluster1 = balancers_[0]->ads_service()->default_cluster(); + new_cluster1.set_name(kNewCluster1Name); + balancers_[0]->ads_service()->SetCdsResource(new_cluster1, kNewCluster1Name); + Cluster new_cluster2 = balancers_[0]->ads_service()->default_cluster(); + new_cluster2.set_name(kNewCluster2Name); + balancers_[0]->ads_service()->SetCdsResource(new_cluster2, kNewCluster2Name); + // Change RDS resource to set up prefix matching to direct traffic to the + // first new cluster. RouteConfiguration new_route_config = balancers_[0]->ads_service()->default_route_config(); - auto* route = new_route_config.mutable_virtual_hosts(0)->mutable_routes(0); - route->mutable_match()->set_path("/grpc.testing.EchoTestService/Echo"); - route->mutable_route()->set_cluster(kNewClusterName); + auto* mismatched_route = + new_route_config.mutable_virtual_hosts(0)->mutable_routes(0); + mismatched_route->mutable_match()->set_path( + "/grpc.testing.EchoTestService/Echo"); + mismatched_route->mutable_route()->set_cluster(kNewCluster1Name); + auto* matched_route = new_route_config.mutable_virtual_hosts(0)->add_routes(); + matched_route->mutable_match()->set_path( + "/grpc.testing.EchoTestService/NewMethod"); + matched_route->mutable_route()->set_cluster(kNewCluster2Name); Listener listener = balancers_[0]->ads_service()->BuildListener(new_route_config); balancers_[0]->ads_service()->SetLdsResource(listener, kDefaultResourceName); - // Wait for all new backends to be used. - std::tuple counts = WaitForAllBackends(2, 4); - // Make sure no RPCs failed in the transition. - EXPECT_EQ(0, std::get<1>(counts)); + // Wait for the new backend to come up. + WaitForAllBackends(2, 3); + CheckRpcSendOk(kNumRpcs); + // Make sure RPCs all go to the correct backend. + for (size_t i = 0; i < 4; ++i) { + if (i == 2) { + EXPECT_EQ(kNumRpcs, backends_[i]->backend_service()->request_count()); + } else { + EXPECT_EQ(0, backends_[i]->backend_service()->request_count()); + } + } } TEST_P(LdsTest, XdsRoutingPrefixMatching) { - const char* kNewClusterName = "new_cluster_name"; + const char* kNewCluster1Name = "new_cluster_1"; + const char* kNewCluster2Name = "new_cluster_2"; + const size_t kNumRpcs = 10; SetNextResolution({}); SetNextResolutionForLbChannelAllBalancers(); AdsServiceImpl::EdsResourceArgs args({ @@ -2177,30 +2204,121 @@ TEST_P(LdsTest, XdsRoutingPrefixMatching) { AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); // We need to wait for all backends to come online. WaitForAllBackends(0, 2); - // Populate new EDS resource. + // Populate new EDS resources. + AdsServiceImpl::EdsResourceArgs args1({ + {"locality0", GetBackendPorts(2, 3)}, + }); AdsServiceImpl::EdsResourceArgs args2({ - {"locality0", GetBackendPorts(2, 4)}, + {"locality0", GetBackendPorts(3, 4)}, }); balancers_[0]->ads_service()->SetEdsResource( - AdsServiceImpl::BuildEdsResource(args2, kNewClusterName), - kNewClusterName); - // Populate new CDS resource. - Cluster new_cluster = balancers_[0]->ads_service()->default_cluster(); - new_cluster.set_name(kNewClusterName); - balancers_[0]->ads_service()->SetCdsResource(new_cluster, kNewClusterName); - // Change RDS resource to point to new cluster. + AdsServiceImpl::BuildEdsResource(args1, kNewCluster1Name), + kNewCluster1Name); + balancers_[0]->ads_service()->SetEdsResource( + AdsServiceImpl::BuildEdsResource(args2, kNewCluster2Name), + kNewCluster2Name); + // Populate new CDS resources. + Cluster new_cluster1 = balancers_[0]->ads_service()->default_cluster(); + new_cluster1.set_name(kNewCluster1Name); + balancers_[0]->ads_service()->SetCdsResource(new_cluster1, kNewCluster1Name); + Cluster new_cluster2 = balancers_[0]->ads_service()->default_cluster(); + new_cluster2.set_name(kNewCluster2Name); + balancers_[0]->ads_service()->SetCdsResource(new_cluster2, kNewCluster2Name); + // Change RDS resource to set up prefix matching to direct traffic to the + // second new cluster. RouteConfiguration new_route_config = balancers_[0]->ads_service()->default_route_config(); - auto* route = new_route_config.mutable_virtual_hosts(0)->mutable_routes(0); - route->mutable_match()->set_prefix("/grpc.testing.EchoTestService"); - route->mutable_route()->set_cluster(kNewClusterName); + auto* mismatched_route = + new_route_config.mutable_virtual_hosts(0)->mutable_routes(0); + mismatched_route->mutable_match()->set_prefix( + "/grpc.testing.EchoTestService0"); + mismatched_route->mutable_route()->set_cluster(kNewCluster1Name); + auto* matched_route = new_route_config.mutable_virtual_hosts(0)->add_routes(); + matched_route->mutable_match()->set_prefix("/grpc.testing.EchoTestService"); + matched_route->mutable_route()->set_cluster(kNewCluster2Name); Listener listener = balancers_[0]->ads_service()->BuildListener(new_route_config); balancers_[0]->ads_service()->SetLdsResource(listener, kDefaultResourceName); - // Wait for all new backends to be used. - std::tuple counts = WaitForAllBackends(2, 4); - // Make sure no RPCs failed in the transition. - EXPECT_EQ(0, std::get<1>(counts)); + // Wait for the new backend to come up. + WaitForAllBackends(3, 4); + CheckRpcSendOk(kNumRpcs); + // Make sure RPCs all go to the correct backend. + for (size_t i = 0; i < 4; ++i) { + if (i == 3) { + EXPECT_EQ(kNumRpcs, backends_[i]->backend_service()->request_count()); + } else { + EXPECT_EQ(0, backends_[i]->backend_service()->request_count()); + } + } +} + +// Tests that LDS client should choose the default route (with no matching +// specified) after unable to find a match with previous routes. +TEST_P(LdsTest, XdsRoutingDefaultRoute) { + const char* kNewCluster1Name = "new_cluster_1"; + const char* kNewCluster2Name = "new_cluster_2"; + const size_t kNumRpcs = 10; + SetNextResolution({}); + SetNextResolutionForLbChannelAllBalancers(); + AdsServiceImpl::EdsResourceArgs args({ + {"locality0", GetBackendPorts(0, 2)}, + }); + balancers_[0]->ads_service()->SetEdsResource( + AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); + // We need to wait for all backends to come online. + WaitForAllBackends(0, 2); + // Populate new EDS resources. + AdsServiceImpl::EdsResourceArgs args1({ + {"locality0", GetBackendPorts(2, 3)}, + }); + AdsServiceImpl::EdsResourceArgs args2({ + {"locality0", GetBackendPorts(3, 4)}, + }); + balancers_[0]->ads_service()->SetEdsResource( + AdsServiceImpl::BuildEdsResource(args1, kNewCluster1Name), + kNewCluster1Name); + balancers_[0]->ads_service()->SetEdsResource( + AdsServiceImpl::BuildEdsResource(args2, kNewCluster2Name), + kNewCluster2Name); + // Populate new CDS resources. + Cluster new_cluster1 = balancers_[0]->ads_service()->default_cluster(); + new_cluster1.set_name(kNewCluster1Name); + balancers_[0]->ads_service()->SetCdsResource(new_cluster1, kNewCluster1Name); + Cluster new_cluster2 = balancers_[0]->ads_service()->default_cluster(); + new_cluster2.set_name(kNewCluster2Name); + balancers_[0]->ads_service()->SetCdsResource(new_cluster2, kNewCluster2Name); + // Change RDS resource to set up prefix matching to direct traffic to the + // second new cluster. + RouteConfiguration new_route_config = + balancers_[0]->ads_service()->default_route_config(); + auto* mismatched_route1 = + new_route_config.mutable_virtual_hosts(0)->mutable_routes(0); + mismatched_route1->mutable_match()->set_prefix( + "/grpc.testing.EchoTestService0"); + mismatched_route1->mutable_route()->set_cluster(kNewCluster1Name); + auto* mismatched_route2 = + new_route_config.mutable_virtual_hosts(0)->add_routes(); + mismatched_route2->mutable_match()->set_path( + "/grpc.testing.EchoTestService/EchoMismatch"); + mismatched_route2->mutable_route()->set_cluster(kNewCluster2Name); + auto* default_route = new_route_config.mutable_virtual_hosts(0)->add_routes(); + default_route->mutable_match()->set_prefix(""); + default_route->mutable_match()->set_path(""); + default_route->mutable_route()->set_cluster(kDefaultResourceName); + Listener listener = + balancers_[0]->ads_service()->BuildListener(new_route_config); + balancers_[0]->ads_service()->SetLdsResource(listener, kDefaultResourceName); + // Wait for the new backend to come up. + WaitForAllBackends(0, 2); + CheckRpcSendOk(kNumRpcs); + // Make sure RPCs all go to the correct backend. + for (size_t i = 0; i < 4; ++i) { + if (i < 2) { + EXPECT_EQ(kNumRpcs / 2, backends_[i]->backend_service()->request_count()); + } else { + EXPECT_EQ(0, backends_[i]->backend_service()->request_count()); + } + } } using RdsTest = BasicTest; @@ -2254,14 +2372,12 @@ TEST_P(RdsTest, ChooseMatchedDomain) { AdsServiceImpl::ACKED); } -// Tests that RDS client should choose the last route in the virtual host if -// multiple routes exist in the RDS response. -TEST_P(RdsTest, ChooseLastRoute) { +// Tests that the RDS client should NACK when the last route is not a default +// route. +TEST_P(RdsTest, DefaultRouteInvalid) { balancers_[0]->ads_service()->SetLdsToUseDynamicRds(); RouteConfiguration route_config = balancers_[0]->ads_service()->default_route_config(); - *(route_config.mutable_virtual_hosts(0)->add_routes()) = - route_config.virtual_hosts(0).routes(0); route_config.mutable_virtual_hosts(0) ->mutable_routes(0) ->mutable_route() @@ -2272,10 +2388,10 @@ TEST_P(RdsTest, ChooseLastRoute) { SetNextResolutionForLbChannelAllBalancers(); (void)SendRpc(); EXPECT_EQ(balancers_[0]->ads_service()->rds_response_state(), - AdsServiceImpl::ACKED); + AdsServiceImpl::NACKED); } -// Tests that RDS client should send a NACK if route match has non-empty prefix +// Tests that RDS client should send a ACK if route match has non-empty prefix // in the RDS response. TEST_P(RdsTest, RouteMatchHasNonemptyPrefix) { balancers_[0]->ads_service()->SetLdsToUseDynamicRds(); @@ -2291,7 +2407,7 @@ TEST_P(RdsTest, RouteMatchHasNonemptyPrefix) { SetNextResolutionForLbChannelAllBalancers(); CheckRpcSendFailure(); EXPECT_EQ(balancers_[0]->ads_service()->rds_response_state(), - AdsServiceImpl::NACKED); + AdsServiceImpl::ACKED); } // Tests that RDS client should send a NACK if route has an action other than diff --git a/tools/doxygen/Doxyfile.c++.internal b/tools/doxygen/Doxyfile.c++.internal index edbe236dc17..31d46c7f4fc 100644 --- a/tools/doxygen/Doxyfile.c++.internal +++ b/tools/doxygen/Doxyfile.c++.internal @@ -1111,6 +1111,7 @@ src/core/ext/filters/client_channel/lb_policy/subchannel_list.h \ src/core/ext/filters/client_channel/lb_policy/xds/cds.cc \ src/core/ext/filters/client_channel/lb_policy/xds/xds.cc \ src/core/ext/filters/client_channel/lb_policy/xds/xds.h \ +src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc \ src/core/ext/filters/client_channel/lb_policy_factory.h \ src/core/ext/filters/client_channel/lb_policy_registry.cc \ src/core/ext/filters/client_channel/lb_policy_registry.h \ diff --git a/tools/doxygen/Doxyfile.core.internal b/tools/doxygen/Doxyfile.core.internal index 5c03ac61231..e58f2c53ebe 100644 --- a/tools/doxygen/Doxyfile.core.internal +++ b/tools/doxygen/Doxyfile.core.internal @@ -908,6 +908,7 @@ src/core/ext/filters/client_channel/lb_policy/subchannel_list.h \ src/core/ext/filters/client_channel/lb_policy/xds/cds.cc \ src/core/ext/filters/client_channel/lb_policy/xds/xds.cc \ src/core/ext/filters/client_channel/lb_policy/xds/xds.h \ +src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc \ src/core/ext/filters/client_channel/lb_policy_factory.h \ src/core/ext/filters/client_channel/lb_policy_registry.cc \ src/core/ext/filters/client_channel/lb_policy_registry.h \ From 41866c125023109eac0c700fa4576cdec99f1c62 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Thu, 2 Apr 2020 17:19:36 -0700 Subject: [PATCH 368/758] Add try_connect API for UnaryStreamCall and StreamStreamCall --- .../grpc/experimental/aio/_base_call.py | 30 +++++ .../grpcio/grpc/experimental/aio/_call.py | 10 ++ src/python/grpcio_tests/tests_aio/tests.json | 1 + .../grpcio_tests/tests_aio/unit/call_test.py | 55 ++++++--- .../tests_aio/unit/try_connect_test.py | 114 ++++++++++++++++++ 5 files changed, 196 insertions(+), 14 deletions(-) create mode 100644 src/python/grpcio_tests/tests_aio/unit/try_connect_test.py diff --git a/src/python/grpcio/grpc/experimental/aio/_base_call.py b/src/python/grpcio/grpc/experimental/aio/_base_call.py index d116982aa79..e5c93e0f607 100644 --- a/src/python/grpcio/grpc/experimental/aio/_base_call.py +++ b/src/python/grpcio/grpc/experimental/aio/_base_call.py @@ -158,6 +158,21 @@ class UnaryStreamCall(Generic[RequestType, ResponseType], stream. """ + @abstractmethod + async def try_connect(self) -> None: + """Tries to connect to peer and raise aio.AioRpcError if failed. + + This method is available for RPCs with streaming responses. This method + enables the application to ensure if the RPC has been successfully + connected. Otherwise, an AioRpcError will be raised to explain the + reason of the connection failure. + + For RPCs with unary response, the connectivity issue will be raised + once the application awaits the call. + + This method is recommended for building retry mechanisms. + """ + class StreamUnaryCall(Generic[RequestType, ResponseType], Call, @@ -229,3 +244,18 @@ class StreamStreamCall(Generic[RequestType, ResponseType], After done_writing is called, any additional invocation to the write function will fail. This function is idempotent. """ + + @abstractmethod + async def try_connect(self) -> None: + """Tries to connect to peer and raise aio.AioRpcError if failed. + + This method is available for RPCs with streaming responses. This method + enables the application to ensure if the RPC has been successfully + connected. Otherwise, an AioRpcError will be raised to explain the + reason of the connection failure. + + For RPCs with unary response, the connectivity issue will be raised + once the application awaits the call. + + This method is recommended for building retry mechanisms. + """ diff --git a/src/python/grpcio/grpc/experimental/aio/_call.py b/src/python/grpcio/grpc/experimental/aio/_call.py index be4887d239c..07c0d302141 100644 --- a/src/python/grpcio/grpc/experimental/aio/_call.py +++ b/src/python/grpcio/grpc/experimental/aio/_call.py @@ -536,6 +536,11 @@ class UnaryStreamCall(_StreamResponseMixin, Call, _base_call.UnaryStreamCall): self.cancel() raise + async def try_connect(self) -> None: + await self._send_unary_request_task + if self.done(): + await self._raise_for_status() + class StreamUnaryCall(_StreamRequestMixin, _UnaryResponseMixin, Call, _base_call.StreamUnaryCall): @@ -610,3 +615,8 @@ class StreamStreamCall(_StreamRequestMixin, _StreamResponseMixin, Call, if not self.cancelled(): self.cancel() # No need to raise RpcError here, because no one will `await` this task. + + async def try_connect(self) -> None: + await self._metadata_sent.wait() + if self.done(): + await self._raise_for_status() diff --git a/src/python/grpcio_tests/tests_aio/tests.json b/src/python/grpcio_tests/tests_aio/tests.json index 84dbf02b937..b76b5b893b4 100644 --- a/src/python/grpcio_tests/tests_aio/tests.json +++ b/src/python/grpcio_tests/tests_aio/tests.json @@ -28,5 +28,6 @@ "unit.server_interceptor_test.TestServerInterceptor", "unit.server_test.TestServer", "unit.timeout_test.TestTimeout", + "unit.try_connect_test.TestTryConnect", "unit.wait_for_ready_test.TestWaitForReady" ] diff --git a/src/python/grpcio_tests/tests_aio/unit/call_test.py b/src/python/grpcio_tests/tests_aio/unit/call_test.py index 5b52f0e1724..b0c126640a9 100644 --- a/src/python/grpcio_tests/tests_aio/unit/call_test.py +++ b/src/python/grpcio_tests/tests_aio/unit/call_test.py @@ -16,22 +16,22 @@ import asyncio import logging import unittest +import datetime import grpc from grpc.experimental import aio from src.proto.grpc.testing import messages_pb2, test_pb2_grpc -from tests.unit.framework.common import test_constants from tests_aio.unit._test_base import AioTestBase -from tests.unit import resources - from tests_aio.unit._test_server import start_test_server +_SHORT_TIMEOUT_S = datetime.timedelta(seconds=1).total_seconds() + _NUM_STREAM_RESPONSES = 5 _RESPONSE_PAYLOAD_SIZE = 42 _REQUEST_PAYLOAD_SIZE = 7 _LOCAL_CANCEL_DETAILS_EXPECTATION = 'Locally cancelled by application!' -_RESPONSE_INTERVAL_US = test_constants.SHORT_TIMEOUT * 1000 * 1000 +_RESPONSE_INTERVAL_US = int(_SHORT_TIMEOUT_S * 1000 * 1000) _UNREACHABLE_TARGET = '0.1:1111' _INFINITE_INTERVAL_US = 2**31 - 1 @@ -434,24 +434,24 @@ class TestUnaryStreamCall(_MulticallableTestMixin, AioTestBase): interval_us=_RESPONSE_INTERVAL_US, )) - call = self._stub.StreamingOutputCall( - request, timeout=test_constants.SHORT_TIMEOUT * 2) + call = self._stub.StreamingOutputCall(request, + timeout=_SHORT_TIMEOUT_S * 2) response = await call.read() self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) # Should be around the same as the timeout remained_time = call.time_remaining() - self.assertGreater(remained_time, test_constants.SHORT_TIMEOUT * 3 / 2) - self.assertLess(remained_time, test_constants.SHORT_TIMEOUT * 5 / 2) + self.assertGreater(remained_time, _SHORT_TIMEOUT_S * 3 / 2) + self.assertLess(remained_time, _SHORT_TIMEOUT_S * 5 / 2) response = await call.read() self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) # Should be around the timeout minus a unit of wait time remained_time = call.time_remaining() - self.assertGreater(remained_time, test_constants.SHORT_TIMEOUT / 2) - self.assertLess(remained_time, test_constants.SHORT_TIMEOUT * 3 / 2) + self.assertGreater(remained_time, _SHORT_TIMEOUT_S / 2) + self.assertLess(remained_time, _SHORT_TIMEOUT_S * 3 / 2) self.assertEqual(grpc.StatusCode.OK, await call.code()) @@ -538,14 +538,14 @@ class TestStreamUnaryCall(_MulticallableTestMixin, AioTestBase): with self.assertRaises(asyncio.CancelledError): for _ in range(_NUM_STREAM_RESPONSES): yield request - await asyncio.sleep(test_constants.SHORT_TIMEOUT) + await asyncio.sleep(_SHORT_TIMEOUT_S) request_iterator_received_the_exception.set() call = self._stub.StreamingInputCall(request_iterator()) # Cancel the RPC after at least one response async def cancel_later(): - await asyncio.sleep(test_constants.SHORT_TIMEOUT * 2) + await asyncio.sleep(_SHORT_TIMEOUT_S * 2) call.cancel() cancel_later_task = self.loop.create_task(cancel_later()) @@ -576,6 +576,33 @@ class TestStreamUnaryCall(_MulticallableTestMixin, AioTestBase): self.assertEqual(await call.code(), grpc.StatusCode.OK) + async def test_call_rpc_error(self): + async with aio.insecure_channel(_UNREACHABLE_TARGET) as channel: + stub = test_pb2_grpc.TestServiceStub(channel) + + # The error should be raised automatically without any traffic. + call = stub.StreamingInputCall() + with self.assertRaises(aio.AioRpcError) as exception_context: + await call + + self.assertEqual(grpc.StatusCode.UNAVAILABLE, + exception_context.exception.code()) + + self.assertTrue(call.done()) + self.assertEqual(grpc.StatusCode.UNAVAILABLE, await call.code()) + + async def test_timeout(self): + call = self._stub.StreamingInputCall(timeout=_SHORT_TIMEOUT_S) + + # The error should be raised automatically without any traffic. + with self.assertRaises(aio.AioRpcError) as exception_context: + await call + + rpc_error = exception_context.exception + self.assertEqual(grpc.StatusCode.DEADLINE_EXCEEDED, rpc_error.code()) + self.assertTrue(call.done()) + self.assertEqual(grpc.StatusCode.DEADLINE_EXCEEDED, await call.code()) + # Prepares the request that stream in a ping-pong manner. _STREAM_OUTPUT_REQUEST_ONE_RESPONSE = messages_pb2.StreamingOutputCallRequest() @@ -733,14 +760,14 @@ class TestStreamStreamCall(_MulticallableTestMixin, AioTestBase): with self.assertRaises(asyncio.CancelledError): for _ in range(_NUM_STREAM_RESPONSES): yield request - await asyncio.sleep(test_constants.SHORT_TIMEOUT) + await asyncio.sleep(_SHORT_TIMEOUT_S) request_iterator_received_the_exception.set() call = self._stub.FullDuplexCall(request_iterator()) # Cancel the RPC after at least one response async def cancel_later(): - await asyncio.sleep(test_constants.SHORT_TIMEOUT * 2) + await asyncio.sleep(_SHORT_TIMEOUT_S * 2) call.cancel() cancel_later_task = self.loop.create_task(cancel_later()) diff --git a/src/python/grpcio_tests/tests_aio/unit/try_connect_test.py b/src/python/grpcio_tests/tests_aio/unit/try_connect_test.py new file mode 100644 index 00000000000..61d740e93b7 --- /dev/null +++ b/src/python/grpcio_tests/tests_aio/unit/try_connect_test.py @@ -0,0 +1,114 @@ +# Copyright 2020 The gRPC Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Tests behavior of the try connect API on client side.""" + +import asyncio +import logging +import unittest +import datetime +from typing import Callable, Tuple + +import grpc +from grpc.experimental import aio + +from tests_aio.unit._test_base import AioTestBase +from tests_aio.unit._test_server import start_test_server +from tests_aio.unit import _common +from src.proto.grpc.testing import messages_pb2, test_pb2_grpc + +_REQUEST = b'\x01\x02\x03' +_UNREACHABLE_TARGET = '0.1:1111' +_TEST_METHOD = '/test/Test' + +_NUM_STREAM_RESPONSES = 5 +_REQUEST_PAYLOAD_SIZE = 7 +_RESPONSE_PAYLOAD_SIZE = 42 + + +class TestTryConnect(AioTestBase): + """Tests if try connect raises connectivity issue.""" + + async def setUp(self): + address, self._server = await start_test_server() + self._channel = aio.insecure_channel(address) + self._dummy_channel = aio.insecure_channel(_UNREACHABLE_TARGET) + self._stub = test_pb2_grpc.TestServiceStub(self._channel) + + async def tearDown(self): + await self._dummy_channel.close() + await self._channel.close() + await self._server.stop(None) + + async def test_unary_stream_ok(self): + request = messages_pb2.StreamingOutputCallRequest() + for _ in range(_NUM_STREAM_RESPONSES): + request.response_parameters.append( + messages_pb2.ResponseParameters(size=_RESPONSE_PAYLOAD_SIZE)) + + call = self._stub.StreamingOutputCall(request) + + # No exception raised and no message swallowed. + await call.try_connect() + + response_cnt = 0 + async for response in call: + response_cnt += 1 + self.assertIs(type(response), + messages_pb2.StreamingOutputCallResponse) + self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) + + self.assertEqual(_NUM_STREAM_RESPONSES, response_cnt) + self.assertEqual(await call.code(), grpc.StatusCode.OK) + + async def test_stream_stream_ok(self): + call = self._stub.FullDuplexCall() + + # No exception raised and no message swallowed. + await call.try_connect() + + request = messages_pb2.StreamingOutputCallRequest() + request.response_parameters.append( + messages_pb2.ResponseParameters(size=_RESPONSE_PAYLOAD_SIZE)) + + for _ in range(_NUM_STREAM_RESPONSES): + await call.write(request) + response = await call.read() + self.assertIsInstance(response, + messages_pb2.StreamingOutputCallResponse) + self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) + + await call.done_writing() + + self.assertEqual(grpc.StatusCode.OK, await call.code()) + + async def test_unary_stream_error(self): + call = self._dummy_channel.unary_stream(_TEST_METHOD)(_REQUEST) + + with self.assertRaises(aio.AioRpcError) as exception_context: + await call.try_connect() + rpc_error = exception_context.exception + self.assertEqual(grpc.StatusCode.UNAVAILABLE, rpc_error.code()) + + async def test_stream_stream_error(self): + call = self._dummy_channel.stream_stream(_TEST_METHOD)() + + with self.assertRaises(aio.AioRpcError) as exception_context: + await call.try_connect() + rpc_error = exception_context.exception + self.assertEqual(grpc.StatusCode.UNAVAILABLE, rpc_error.code()) + + +if __name__ == '__main__': + logging.basicConfig(level=logging.DEBUG) + unittest.main(verbosity=2) From c07520a3507ae491b6a4942b04be35d1724057b1 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Thu, 2 Apr 2020 17:20:58 -0700 Subject: [PATCH 369/758] Mark it as experimental --- src/python/grpcio/grpc/experimental/aio/_base_call.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/python/grpcio/grpc/experimental/aio/_base_call.py b/src/python/grpcio/grpc/experimental/aio/_base_call.py index e5c93e0f607..703e4ca621d 100644 --- a/src/python/grpcio/grpc/experimental/aio/_base_call.py +++ b/src/python/grpcio/grpc/experimental/aio/_base_call.py @@ -162,6 +162,8 @@ class UnaryStreamCall(Generic[RequestType, ResponseType], async def try_connect(self) -> None: """Tries to connect to peer and raise aio.AioRpcError if failed. + This is an EXPERIMENTAL method. + This method is available for RPCs with streaming responses. This method enables the application to ensure if the RPC has been successfully connected. Otherwise, an AioRpcError will be raised to explain the @@ -249,6 +251,8 @@ class StreamStreamCall(Generic[RequestType, ResponseType], async def try_connect(self) -> None: """Tries to connect to peer and raise aio.AioRpcError if failed. + This is an EXPERIMENTAL method. + This method is available for RPCs with streaming responses. This method enables the application to ensure if the RPC has been successfully connected. Otherwise, an AioRpcError will be raised to explain the From 58beda2f73801c920d0b274348bf5fe106fdab3f Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Fri, 3 Apr 2020 12:08:17 -0700 Subject: [PATCH 370/758] Add try_connect API to StreamUnaryCall --- .../grpc/experimental/aio/_base_call.py | 41 +++++++++++++------ .../grpcio/grpc/experimental/aio/_call.py | 10 ++--- .../tests_aio/unit/try_connect_test.py | 28 +++++++++++++ 3 files changed, 62 insertions(+), 17 deletions(-) diff --git a/src/python/grpcio/grpc/experimental/aio/_base_call.py b/src/python/grpcio/grpc/experimental/aio/_base_call.py index 703e4ca621d..e71076fe3d5 100644 --- a/src/python/grpcio/grpc/experimental/aio/_base_call.py +++ b/src/python/grpcio/grpc/experimental/aio/_base_call.py @@ -164,13 +164,13 @@ class UnaryStreamCall(Generic[RequestType, ResponseType], This is an EXPERIMENTAL method. - This method is available for RPCs with streaming responses. This method - enables the application to ensure if the RPC has been successfully - connected. Otherwise, an AioRpcError will be raised to explain the - reason of the connection failure. + This method is available for streaming RPCs. This method enables the + application to ensure if the RPC has been successfully connected. + Otherwise, an AioRpcError will be raised to explain the reason of the + connection failure. - For RPCs with unary response, the connectivity issue will be raised - once the application awaits the call. + For unary-unary RPCs, the connectivity issue will be raised once the + application awaits the call. This method is recommended for building retry mechanisms. """ @@ -204,6 +204,23 @@ class StreamUnaryCall(Generic[RequestType, ResponseType], The response message of the stream. """ + @abstractmethod + async def try_connect(self) -> None: + """Tries to connect to peer and raise aio.AioRpcError if failed. + + This is an EXPERIMENTAL method. + + This method is available for streaming RPCs. This method enables the + application to ensure if the RPC has been successfully connected. + Otherwise, an AioRpcError will be raised to explain the reason of the + connection failure. + + For unary-unary RPCs, the connectivity issue will be raised once the + application awaits the call. + + This method is recommended for building retry mechanisms. + """ + class StreamStreamCall(Generic[RequestType, ResponseType], Call, @@ -253,13 +270,13 @@ class StreamStreamCall(Generic[RequestType, ResponseType], This is an EXPERIMENTAL method. - This method is available for RPCs with streaming responses. This method - enables the application to ensure if the RPC has been successfully - connected. Otherwise, an AioRpcError will be raised to explain the - reason of the connection failure. + This method is available for streaming RPCs. This method enables the + application to ensure if the RPC has been successfully connected. + Otherwise, an AioRpcError will be raised to explain the reason of the + connection failure. - For RPCs with unary response, the connectivity issue will be raised - once the application awaits the call. + For unary-unary RPCs, the connectivity issue will be raised once the + application awaits the call. This method is recommended for building retry mechanisms. """ diff --git a/src/python/grpcio/grpc/experimental/aio/_call.py b/src/python/grpcio/grpc/experimental/aio/_call.py index 07c0d302141..dc9dbfe481b 100644 --- a/src/python/grpcio/grpc/experimental/aio/_call.py +++ b/src/python/grpcio/grpc/experimental/aio/_call.py @@ -458,6 +458,11 @@ class _StreamRequestMixin(Call): self._raise_for_different_style(_APIStyle.READER_WRITER) await self._done_writing() + async def try_connect(self) -> None: + await self._metadata_sent.wait() + if self.done(): + await self._raise_for_status() + class UnaryUnaryCall(_UnaryResponseMixin, Call, _base_call.UnaryUnaryCall): """Object for managing unary-unary RPC calls. @@ -615,8 +620,3 @@ class StreamStreamCall(_StreamRequestMixin, _StreamResponseMixin, Call, if not self.cancelled(): self.cancel() # No need to raise RpcError here, because no one will `await` this task. - - async def try_connect(self) -> None: - await self._metadata_sent.wait() - if self.done(): - await self._raise_for_status() diff --git a/src/python/grpcio_tests/tests_aio/unit/try_connect_test.py b/src/python/grpcio_tests/tests_aio/unit/try_connect_test.py index 61d740e93b7..af4cfa303ff 100644 --- a/src/python/grpcio_tests/tests_aio/unit/try_connect_test.py +++ b/src/python/grpcio_tests/tests_aio/unit/try_connect_test.py @@ -71,6 +71,26 @@ class TestTryConnect(AioTestBase): self.assertEqual(_NUM_STREAM_RESPONSES, response_cnt) self.assertEqual(await call.code(), grpc.StatusCode.OK) + async def test_stream_unary_ok(self): + call = self._stub.StreamingInputCall() + + # No exception raised and no message swallowed. + await call.try_connect() + + payload = messages_pb2.Payload(body=b'\0' * _REQUEST_PAYLOAD_SIZE) + request = messages_pb2.StreamingInputCallRequest(payload=payload) + + for _ in range(_NUM_STREAM_RESPONSES): + await call.write(request) + await call.done_writing() + + response = await call + self.assertIsInstance(response, messages_pb2.StreamingInputCallResponse) + self.assertEqual(_NUM_STREAM_RESPONSES * _REQUEST_PAYLOAD_SIZE, + response.aggregated_payload_size) + + self.assertEqual(await call.code(), grpc.StatusCode.OK) + async def test_stream_stream_ok(self): call = self._stub.FullDuplexCall() @@ -100,6 +120,14 @@ class TestTryConnect(AioTestBase): rpc_error = exception_context.exception self.assertEqual(grpc.StatusCode.UNAVAILABLE, rpc_error.code()) + async def test_stream_unary_error(self): + call = self._dummy_channel.stream_unary(_TEST_METHOD)(_REQUEST) + + with self.assertRaises(aio.AioRpcError) as exception_context: + await call.try_connect() + rpc_error = exception_context.exception + self.assertEqual(grpc.StatusCode.UNAVAILABLE, rpc_error.code()) + async def test_stream_stream_error(self): call = self._dummy_channel.stream_stream(_TEST_METHOD)() From 2bbf0a79f66e975c8be8dafa7fed32c199dbc495 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Fri, 3 Apr 2020 14:08:56 -0700 Subject: [PATCH 371/758] Make pytype happy --- src/python/grpcio_tests/tests_aio/unit/try_connect_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/python/grpcio_tests/tests_aio/unit/try_connect_test.py b/src/python/grpcio_tests/tests_aio/unit/try_connect_test.py index af4cfa303ff..7fc292ea3a1 100644 --- a/src/python/grpcio_tests/tests_aio/unit/try_connect_test.py +++ b/src/python/grpcio_tests/tests_aio/unit/try_connect_test.py @@ -121,7 +121,7 @@ class TestTryConnect(AioTestBase): self.assertEqual(grpc.StatusCode.UNAVAILABLE, rpc_error.code()) async def test_stream_unary_error(self): - call = self._dummy_channel.stream_unary(_TEST_METHOD)(_REQUEST) + call = self._dummy_channel.stream_unary(_TEST_METHOD)() with self.assertRaises(aio.AioRpcError) as exception_context: await call.try_connect() From 2b6037f113f8bbce209225251efb13d886947f92 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Mon, 6 Apr 2020 16:06:11 -0700 Subject: [PATCH 372/758] Rename to wait_for_conneciton && Add to unary-unary RPC --- .../grpc/experimental/aio/_base_call.py | 64 ++++--------------- .../grpcio/grpc/experimental/aio/_call.py | 25 ++++++-- .../grpc/experimental/aio/_interceptor.py | 7 ++ src/python/grpcio_tests/tests_aio/tests.json | 2 +- .../grpcio_tests/tests_aio/unit/call_test.py | 6 +- ...ct_test.py => wait_for_connection_test.py} | 39 +++++++---- 6 files changed, 70 insertions(+), 73 deletions(-) rename src/python/grpcio_tests/tests_aio/unit/{try_connect_test.py => wait_for_connection_test.py} (79%) diff --git a/src/python/grpcio/grpc/experimental/aio/_base_call.py b/src/python/grpcio/grpc/experimental/aio/_base_call.py index e71076fe3d5..8ea8e90c8b1 100644 --- a/src/python/grpcio/grpc/experimental/aio/_base_call.py +++ b/src/python/grpcio/grpc/experimental/aio/_base_call.py @@ -117,6 +117,19 @@ class Call(RpcContext, metaclass=ABCMeta): The details string of the RPC. """ + @abstractmethod + async def wait_for_connection(self) -> None: + """Waits until connected to peer and raises aio.AioRpcError if failed. + + This is an EXPERIMENTAL method. + + This method makes ensure if the RPC has been successfully connected. + Otherwise, an AioRpcError will be raised to explain the reason of the + connection failure. + + This method is recommended for building retry mechanisms. + """ + class UnaryUnaryCall(Generic[RequestType, ResponseType], Call, @@ -158,23 +171,6 @@ class UnaryStreamCall(Generic[RequestType, ResponseType], stream. """ - @abstractmethod - async def try_connect(self) -> None: - """Tries to connect to peer and raise aio.AioRpcError if failed. - - This is an EXPERIMENTAL method. - - This method is available for streaming RPCs. This method enables the - application to ensure if the RPC has been successfully connected. - Otherwise, an AioRpcError will be raised to explain the reason of the - connection failure. - - For unary-unary RPCs, the connectivity issue will be raised once the - application awaits the call. - - This method is recommended for building retry mechanisms. - """ - class StreamUnaryCall(Generic[RequestType, ResponseType], Call, @@ -204,23 +200,6 @@ class StreamUnaryCall(Generic[RequestType, ResponseType], The response message of the stream. """ - @abstractmethod - async def try_connect(self) -> None: - """Tries to connect to peer and raise aio.AioRpcError if failed. - - This is an EXPERIMENTAL method. - - This method is available for streaming RPCs. This method enables the - application to ensure if the RPC has been successfully connected. - Otherwise, an AioRpcError will be raised to explain the reason of the - connection failure. - - For unary-unary RPCs, the connectivity issue will be raised once the - application awaits the call. - - This method is recommended for building retry mechanisms. - """ - class StreamStreamCall(Generic[RequestType, ResponseType], Call, @@ -263,20 +242,3 @@ class StreamStreamCall(Generic[RequestType, ResponseType], After done_writing is called, any additional invocation to the write function will fail. This function is idempotent. """ - - @abstractmethod - async def try_connect(self) -> None: - """Tries to connect to peer and raise aio.AioRpcError if failed. - - This is an EXPERIMENTAL method. - - This method is available for streaming RPCs. This method enables the - application to ensure if the RPC has been successfully connected. - Otherwise, an AioRpcError will be raised to explain the reason of the - connection failure. - - For unary-unary RPCs, the connectivity issue will be raised once the - application awaits the call. - - This method is recommended for building retry mechanisms. - """ diff --git a/src/python/grpcio/grpc/experimental/aio/_call.py b/src/python/grpcio/grpc/experimental/aio/_call.py index dc9dbfe481b..ab8056e7339 100644 --- a/src/python/grpcio/grpc/experimental/aio/_call.py +++ b/src/python/grpcio/grpc/experimental/aio/_call.py @@ -18,7 +18,7 @@ import enum import inspect import logging from functools import partial -from typing import AsyncIterable, Awaitable, Optional, Tuple +from typing import AsyncIterable, Optional, Tuple import grpc from grpc import _common @@ -250,9 +250,8 @@ class _APIStyle(enum.IntEnum): class _UnaryResponseMixin(Call): _call_response: asyncio.Task - def _init_unary_response_mixin(self, - response_coro: Awaitable[ResponseType]): - self._call_response = self._loop.create_task(response_coro) + def _init_unary_response_mixin(self, response_task: asyncio.Task): + self._call_response = response_task def cancel(self) -> bool: if super().cancel(): @@ -458,7 +457,7 @@ class _StreamRequestMixin(Call): self._raise_for_different_style(_APIStyle.READER_WRITER) await self._done_writing() - async def try_connect(self) -> None: + async def wait_for_connection(self) -> None: await self._metadata_sent.wait() if self.done(): await self._raise_for_status() @@ -470,6 +469,7 @@ class UnaryUnaryCall(_UnaryResponseMixin, Call, _base_call.UnaryUnaryCall): Returned when an instance of `UnaryUnaryMultiCallable` object is called. """ _request: RequestType + _invocation_task: asyncio.Task # pylint: disable=too-many-arguments def __init__(self, request: RequestType, deadline: Optional[float], @@ -483,7 +483,8 @@ class UnaryUnaryCall(_UnaryResponseMixin, Call, _base_call.UnaryUnaryCall): channel.call(method, deadline, credentials, wait_for_ready), metadata, request_serializer, response_deserializer, loop) self._request = request - self._init_unary_response_mixin(self._invoke()) + self._invocation_task = loop.create_task(self._invoke()) + self._init_unary_response_mixin(self._invocation_task) async def _invoke(self) -> ResponseType: serialized_request = _common.serialize(self._request, @@ -505,6 +506,11 @@ class UnaryUnaryCall(_UnaryResponseMixin, Call, _base_call.UnaryUnaryCall): else: return cygrpc.EOF + async def wait_for_connection(self) -> None: + await self._invocation_task + if self.done(): + await self._raise_for_status() + class UnaryStreamCall(_StreamResponseMixin, Call, _base_call.UnaryStreamCall): """Object for managing unary-stream RPC calls. @@ -541,7 +547,7 @@ class UnaryStreamCall(_StreamResponseMixin, Call, _base_call.UnaryStreamCall): self.cancel() raise - async def try_connect(self) -> None: + async def wait_for_connection(self) -> None: await self._send_unary_request_task if self.done(): await self._raise_for_status() @@ -566,8 +572,13 @@ class StreamUnaryCall(_StreamRequestMixin, _UnaryResponseMixin, Call, channel.call(method, deadline, credentials, wait_for_ready), metadata, request_serializer, response_deserializer, loop) +<<<<<<< HEAD self._init_stream_request_mixin(request_iterator) self._init_unary_response_mixin(self._conduct_rpc()) +======= + self._init_stream_request_mixin(request_async_iterator) + self._init_unary_response_mixin(loop.create_task(self._conduct_rpc())) +>>>>>>> Rename to wait_for_conneciton && Add to unary-unary RPC async def _conduct_rpc(self) -> ResponseType: try: diff --git a/src/python/grpcio/grpc/experimental/aio/_interceptor.py b/src/python/grpcio/grpc/experimental/aio/_interceptor.py index 9e99a1b125d..d4aca3ae0fc 100644 --- a/src/python/grpcio/grpc/experimental/aio/_interceptor.py +++ b/src/python/grpcio/grpc/experimental/aio/_interceptor.py @@ -330,6 +330,10 @@ class InterceptedUnaryUnaryCall(_base_call.UnaryUnaryCall): response = yield from call.__await__() return response + async def wait_for_connection(self) -> None: + call = await self._interceptors_task + return await call.wait_for_connection() + class UnaryUnaryCallResponse(_base_call.UnaryUnaryCall): """Final UnaryUnaryCall class finished with a response.""" @@ -374,3 +378,6 @@ class UnaryUnaryCallResponse(_base_call.UnaryUnaryCall): # for telling the interpreter that __await__ is a generator. yield None return self._response + + async def wait_for_connection(self) -> None: + pass diff --git a/src/python/grpcio_tests/tests_aio/tests.json b/src/python/grpcio_tests/tests_aio/tests.json index b76b5b893b4..71f8733f5f9 100644 --- a/src/python/grpcio_tests/tests_aio/tests.json +++ b/src/python/grpcio_tests/tests_aio/tests.json @@ -28,6 +28,6 @@ "unit.server_interceptor_test.TestServerInterceptor", "unit.server_test.TestServer", "unit.timeout_test.TestTimeout", - "unit.try_connect_test.TestTryConnect", + "unit.wait_for_connection_test.TestWaitForConnection", "unit.wait_for_ready_test.TestWaitForReady" ] diff --git a/src/python/grpcio_tests/tests_aio/unit/call_test.py b/src/python/grpcio_tests/tests_aio/unit/call_test.py index b0c126640a9..2548e777783 100644 --- a/src/python/grpcio_tests/tests_aio/unit/call_test.py +++ b/src/python/grpcio_tests/tests_aio/unit/call_test.py @@ -24,6 +24,7 @@ from grpc.experimental import aio from src.proto.grpc.testing import messages_pb2, test_pb2_grpc from tests_aio.unit._test_base import AioTestBase from tests_aio.unit._test_server import start_test_server +from tests_aio.unit._constants import UNREACHABLE_TARGET _SHORT_TIMEOUT_S = datetime.timedelta(seconds=1).total_seconds() @@ -32,7 +33,6 @@ _RESPONSE_PAYLOAD_SIZE = 42 _REQUEST_PAYLOAD_SIZE = 7 _LOCAL_CANCEL_DETAILS_EXPECTATION = 'Locally cancelled by application!' _RESPONSE_INTERVAL_US = int(_SHORT_TIMEOUT_S * 1000 * 1000) -_UNREACHABLE_TARGET = '0.1:1111' _INFINITE_INTERVAL_US = 2**31 - 1 @@ -78,7 +78,7 @@ class TestUnaryUnaryCall(_MulticallableTestMixin, AioTestBase): self.assertIs(response, response_retry) async def test_call_rpc_error(self): - async with aio.insecure_channel(_UNREACHABLE_TARGET) as channel: + async with aio.insecure_channel(UNREACHABLE_TARGET) as channel: stub = test_pb2_grpc.TestServiceStub(channel) call = stub.UnaryCall(messages_pb2.SimpleRequest()) @@ -577,7 +577,7 @@ class TestStreamUnaryCall(_MulticallableTestMixin, AioTestBase): self.assertEqual(await call.code(), grpc.StatusCode.OK) async def test_call_rpc_error(self): - async with aio.insecure_channel(_UNREACHABLE_TARGET) as channel: + async with aio.insecure_channel(UNREACHABLE_TARGET) as channel: stub = test_pb2_grpc.TestServiceStub(channel) # The error should be raised automatically without any traffic. diff --git a/src/python/grpcio_tests/tests_aio/unit/try_connect_test.py b/src/python/grpcio_tests/tests_aio/unit/wait_for_connection_test.py similarity index 79% rename from src/python/grpcio_tests/tests_aio/unit/try_connect_test.py rename to src/python/grpcio_tests/tests_aio/unit/wait_for_connection_test.py index 7fc292ea3a1..cb6f7985290 100644 --- a/src/python/grpcio_tests/tests_aio/unit/try_connect_test.py +++ b/src/python/grpcio_tests/tests_aio/unit/wait_for_connection_test.py @@ -11,7 +11,7 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -"""Tests behavior of the try connect API on client side.""" +"""Tests behavior of the wait for connection API on client side.""" import asyncio import logging @@ -26,9 +26,9 @@ from tests_aio.unit._test_base import AioTestBase from tests_aio.unit._test_server import start_test_server from tests_aio.unit import _common from src.proto.grpc.testing import messages_pb2, test_pb2_grpc +from tests_aio.unit._constants import UNREACHABLE_TARGET _REQUEST = b'\x01\x02\x03' -_UNREACHABLE_TARGET = '0.1:1111' _TEST_METHOD = '/test/Test' _NUM_STREAM_RESPONSES = 5 @@ -36,13 +36,13 @@ _REQUEST_PAYLOAD_SIZE = 7 _RESPONSE_PAYLOAD_SIZE = 42 -class TestTryConnect(AioTestBase): - """Tests if try connect raises connectivity issue.""" +class TestWaitForConnection(AioTestBase): + """Tests if wait_for_connection raises connectivity issue.""" async def setUp(self): address, self._server = await start_test_server() self._channel = aio.insecure_channel(address) - self._dummy_channel = aio.insecure_channel(_UNREACHABLE_TARGET) + self._dummy_channel = aio.insecure_channel(UNREACHABLE_TARGET) self._stub = test_pb2_grpc.TestServiceStub(self._channel) async def tearDown(self): @@ -50,6 +50,15 @@ class TestTryConnect(AioTestBase): await self._channel.close() await self._server.stop(None) + async def test_unary_unary_ok(self): + call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) + + # No exception raised and no message swallowed. + await call.wait_for_connection() + + response = await call + self.assertIsInstance(response, messages_pb2.SimpleResponse) + async def test_unary_stream_ok(self): request = messages_pb2.StreamingOutputCallRequest() for _ in range(_NUM_STREAM_RESPONSES): @@ -59,7 +68,7 @@ class TestTryConnect(AioTestBase): call = self._stub.StreamingOutputCall(request) # No exception raised and no message swallowed. - await call.try_connect() + await call.wait_for_connection() response_cnt = 0 async for response in call: @@ -75,7 +84,7 @@ class TestTryConnect(AioTestBase): call = self._stub.StreamingInputCall() # No exception raised and no message swallowed. - await call.try_connect() + await call.wait_for_connection() payload = messages_pb2.Payload(body=b'\0' * _REQUEST_PAYLOAD_SIZE) request = messages_pb2.StreamingInputCallRequest(payload=payload) @@ -95,7 +104,7 @@ class TestTryConnect(AioTestBase): call = self._stub.FullDuplexCall() # No exception raised and no message swallowed. - await call.try_connect() + await call.wait_for_connection() request = messages_pb2.StreamingOutputCallRequest() request.response_parameters.append( @@ -112,11 +121,19 @@ class TestTryConnect(AioTestBase): self.assertEqual(grpc.StatusCode.OK, await call.code()) + async def test_unary_unary_error(self): + call = self._dummy_channel.unary_unary(_TEST_METHOD)(_REQUEST) + + with self.assertRaises(aio.AioRpcError) as exception_context: + await call.wait_for_connection() + rpc_error = exception_context.exception + self.assertEqual(grpc.StatusCode.UNAVAILABLE, rpc_error.code()) + async def test_unary_stream_error(self): call = self._dummy_channel.unary_stream(_TEST_METHOD)(_REQUEST) with self.assertRaises(aio.AioRpcError) as exception_context: - await call.try_connect() + await call.wait_for_connection() rpc_error = exception_context.exception self.assertEqual(grpc.StatusCode.UNAVAILABLE, rpc_error.code()) @@ -124,7 +141,7 @@ class TestTryConnect(AioTestBase): call = self._dummy_channel.stream_unary(_TEST_METHOD)() with self.assertRaises(aio.AioRpcError) as exception_context: - await call.try_connect() + await call.wait_for_connection() rpc_error = exception_context.exception self.assertEqual(grpc.StatusCode.UNAVAILABLE, rpc_error.code()) @@ -132,7 +149,7 @@ class TestTryConnect(AioTestBase): call = self._dummy_channel.stream_stream(_TEST_METHOD)() with self.assertRaises(aio.AioRpcError) as exception_context: - await call.try_connect() + await call.wait_for_connection() rpc_error = exception_context.exception self.assertEqual(grpc.StatusCode.UNAVAILABLE, rpc_error.code()) From 4eb596446d6070780bb6b59d6f64ec88a7413f37 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Mon, 6 Apr 2020 16:11:13 -0700 Subject: [PATCH 373/758] Resolve conflict with master --- src/python/grpcio/grpc/experimental/aio/_call.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/python/grpcio/grpc/experimental/aio/_call.py b/src/python/grpcio/grpc/experimental/aio/_call.py index ab8056e7339..3d1d19fd3fa 100644 --- a/src/python/grpcio/grpc/experimental/aio/_call.py +++ b/src/python/grpcio/grpc/experimental/aio/_call.py @@ -572,13 +572,8 @@ class StreamUnaryCall(_StreamRequestMixin, _UnaryResponseMixin, Call, channel.call(method, deadline, credentials, wait_for_ready), metadata, request_serializer, response_deserializer, loop) -<<<<<<< HEAD self._init_stream_request_mixin(request_iterator) - self._init_unary_response_mixin(self._conduct_rpc()) -======= - self._init_stream_request_mixin(request_async_iterator) self._init_unary_response_mixin(loop.create_task(self._conduct_rpc())) ->>>>>>> Rename to wait_for_conneciton && Add to unary-unary RPC async def _conduct_rpc(self) -> ResponseType: try: From 0aa77e410f90d5bf5b6111e79553a4ebff45594e Mon Sep 17 00:00:00 2001 From: Richard Belleville Date: Mon, 6 Apr 2020 16:40:06 -0700 Subject: [PATCH 374/758] Restrict set of interpreters on MacOS --- tools/run_tests/run_tests.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tools/run_tests/run_tests.py b/tools/run_tests/run_tests.py index 8ed4c88f683..9008004cdad 100755 --- a/tools/run_tests/run_tests.py +++ b/tools/run_tests/run_tests.py @@ -866,6 +866,15 @@ class PythonLanguage(object): else: if args.iomgr_platform == 'asyncio': return (python36_config,) + else if os.uname()[0] == 'Darwin': + # NOTE(rbellevi): Testing takes significantly longer on + # MacOS, so we restrict the number of interpreter versions + # tested. + return ( + python27_config, + python36_config, + python37_config, + ) else: return ( python27_config, From 828ee320a4b67c9e1a4b7bf027d0ac7e84082248 Mon Sep 17 00:00:00 2001 From: Taras Galkovskyi Date: Tue, 7 Apr 2020 00:14:41 +0000 Subject: [PATCH 375/758] Expose ALTS client/server credentials on Python layer --- examples/BUILD | 30 +++++ .../python/data_transmission/alts_client.py | 118 ++++++++++++++++++ .../python/data_transmission/alts_server.py | 114 +++++++++++++++++ src/python/grpcio/grpc/__init__.py | 24 ++++ .../grpc/_cython/_cygrpc/credentials.pxd.pxi | 7 +- .../grpc/_cython/_cygrpc/credentials.pyx.pxi | 27 +++- .../grpcio/grpc/_cython/_cygrpc/grpc.pxi | 14 +++ src/python/grpcio_tests/commands.py | 1 + src/python/grpcio_tests/tests/tests.json | 1 + .../grpcio_tests/tests/unit/BUILD.bazel | 1 + .../tests/unit/_alts_credentials_test.py | 56 +++++++++ .../grpcio_tests/tests/unit/_api_test.py | 2 + 12 files changed, 393 insertions(+), 2 deletions(-) create mode 100644 examples/python/data_transmission/alts_client.py create mode 100644 examples/python/data_transmission/alts_server.py create mode 100644 src/python/grpcio_tests/tests/unit/_alts_credentials_test.py diff --git a/examples/BUILD b/examples/BUILD index 5dbde0febe4..a214e4ec977 100644 --- a/examples/BUILD +++ b/examples/BUILD @@ -245,3 +245,33 @@ proto_library( name = "route_guide_proto", srcs = ["protos/route_guide.proto"], ) + +py_binary( + name = "data_transmission_server", + python_version = "PY3", + srcs_version = "PY2AND3", + main = "alts_server.py", + srcs = [ + "python/data_transmission/alts_server.py", + "python/data_transmission/demo_pb2.py", + "python/data_transmission/demo_pb2_grpc.py", + ], + deps = [ + "//src/python/grpcio/grpc:grpcio", + ], +) + +py_binary( + name = "data_transmission_client", + python_version = "PY3", + srcs_version = "PY2AND3", + main = "alts_client.py", + srcs = [ + "python/data_transmission/alts_client.py", + "python/data_transmission/demo_pb2.py", + "python/data_transmission/demo_pb2_grpc.py", + ], + deps = [ + "//src/python/grpcio/grpc:grpcio", + ], +) diff --git a/examples/python/data_transmission/alts_client.py b/examples/python/data_transmission/alts_client.py new file mode 100644 index 00000000000..4595e249b38 --- /dev/null +++ b/examples/python/data_transmission/alts_client.py @@ -0,0 +1,118 @@ +# Copyright 2019 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""The example of four ways of data transmission using gRPC in Python.""" + +import time +import grpc + +import demo_pb2_grpc +import demo_pb2 + +SERVER_ADDRESS = "localhost:23333" +CLIENT_ID = 1 + +# 中文注释和英文翻译 +# Note that this example was contributed by an external user using Chinese comments. +# In all cases, the Chinese comment text is translated to English just below it. + + +# 一元模式(在一次调用中, 客户端只能向服务器传输一次请求数据, 服务器也只能返回一次响应) +# unary-unary(In a single call, the client can only send request once, and the server can +# only respond once.) +def simple_method(stub): + print("--------------Call SimpleMethod Begin--------------") + request = demo_pb2.Request(client_id=CLIENT_ID, + request_data="called by Python client") + response = stub.SimpleMethod(request) + print("resp from server(%d), the message=%s" % + (response.server_id, response.response_data)) + print("--------------Call SimpleMethod Over---------------") + + +# 客户端流模式(在一次调用中, 客户端可以多次向服务器传输数据, 但是服务器只能返回一次响应) +# stream-unary (In a single call, the client can transfer data to the server several times, +# but the server can only return a response once.) +def client_streaming_method(stub): + print("--------------Call ClientStreamingMethod Begin--------------") + + # 创建一个生成器 + # create a generator + def request_messages(): + for i in range(5): + request = demo_pb2.Request( + client_id=CLIENT_ID, + request_data=("called by Python client, message:%d" % i)) + yield request + + response = stub.ClientStreamingMethod(request_messages()) + print("resp from server(%d), the message=%s" % + (response.server_id, response.response_data)) + print("--------------Call ClientStreamingMethod Over---------------") + + +# 服务端流模式(在一次调用中, 客户端只能一次向服务器传输数据, 但是服务器可以多次返回响应) +# unary-stream (In a single call, the client can only transmit data to the server at one time, +# but the server can return the response many times.) +def server_streaming_method(stub): + print("--------------Call ServerStreamingMethod Begin--------------") + request = demo_pb2.Request(client_id=CLIENT_ID, + request_data="called by Python client") + response_iterator = stub.ServerStreamingMethod(request) + for response in response_iterator: + print("recv from server(%d), message=%s" % + (response.server_id, response.response_data)) + + print("--------------Call ServerStreamingMethod Over---------------") + + +# 双向流模式 (在一次调用中, 客户端和服务器都可以向对方多次收发数据) +# stream-stream (In a single call, both client and server can send and receive data +# to each other multiple times.) +def bidirectional_streaming_method(stub): + print( + "--------------Call BidirectionalStreamingMethod Begin---------------") + + # 创建一个生成器 + # create a generator + def request_messages(): + for i in range(5): + request = demo_pb2.Request( + client_id=CLIENT_ID, + request_data=("called by Python client, message: %d" % i)) + yield request + time.sleep(1) + + response_iterator = stub.BidirectionalStreamingMethod(request_messages()) + for response in response_iterator: + print("recv from server(%d), message=%s" % + (response.server_id, response.response_data)) + + print("--------------Call BidirectionalStreamingMethod Over---------------") + + +def main(): + with grpc.secure_channel(SERVER_ADDRESS, credentials=grpc.alts_channel_credentials()) as channel: + stub = demo_pb2_grpc.GRPCDemoStub(channel) + + simple_method(stub) + + client_streaming_method(stub) + + server_streaming_method(stub) + + bidirectional_streaming_method(stub) + + +if __name__ == '__main__': + main() diff --git a/examples/python/data_transmission/alts_server.py b/examples/python/data_transmission/alts_server.py new file mode 100644 index 00000000000..05c2dc34ac1 --- /dev/null +++ b/examples/python/data_transmission/alts_server.py @@ -0,0 +1,114 @@ +# Copyright 2019 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""The example of four ways of data transmission using gRPC in Python.""" + +from threading import Thread +from concurrent import futures + +import grpc +import demo_pb2_grpc +import demo_pb2 + +SERVER_ADDRESS = 'localhost:23333' +SERVER_ID = 1 + + +class DemoServer(demo_pb2_grpc.GRPCDemoServicer): + + # 一元模式(在一次调用中, 客户端只能向服务器传输一次请求数据, 服务器也只能返回一次响应) + # unary-unary(In a single call, the client can only send request once, and the server can + # only respond once.) + def SimpleMethod(self, request, context): + print("SimpleMethod called by client(%d) the message: %s" % + (request.client_id, request.request_data)) + response = demo_pb2.Response( + server_id=SERVER_ID, + response_data="Python server SimpleMethod Ok!!!!") + return response + + # 客户端流模式(在一次调用中, 客户端可以多次向服务器传输数据, 但是服务器只能返回一次响应) + # stream-unary (In a single call, the client can transfer data to the server several times, + # but the server can only return a response once.) + def ClientStreamingMethod(self, request_iterator, context): + print("ClientStreamingMethod called by client...") + for request in request_iterator: + print("recv from client(%d), message= %s" % + (request.client_id, request.request_data)) + response = demo_pb2.Response( + server_id=SERVER_ID, + response_data="Python server ClientStreamingMethod ok") + return response + + # 服务端流模式(在一次调用中, 客户端只能一次向服务器传输数据, 但是服务器可以多次返回响应) + # unary-stream (In a single call, the client can only transmit data to the server at one time, + # but the server can return the response many times.) + def ServerStreamingMethod(self, request, context): + print("ServerStreamingMethod called by client(%d), message= %s" % + (request.client_id, request.request_data)) + + # 创建一个生成器 + # create a generator + def response_messages(): + for i in range(5): + response = demo_pb2.Response( + server_id=SERVER_ID, + response_data=("send by Python server, message=%d" % i)) + yield response + + return response_messages() + + # 双向流模式 (在一次调用中, 客户端和服务器都可以向对方多次收发数据) + # stream-stream (In a single call, both client and server can send and receive data + # to each other multiple times.) + def BidirectionalStreamingMethod(self, request_iterator, context): + print("BidirectionalStreamingMethod called by client...") + + # 开启一个子线程去接收数据 + # Open a sub thread to receive data + def parse_request(): + for request in request_iterator: + print("recv from client(%d), message= %s" % + (request.client_id, request.request_data)) + + t = Thread(target=parse_request) + t.start() + + for i in range(5): + yield demo_pb2.Response( + server_id=SERVER_ID, + response_data=("send by Python server, message= %d" % i)) + + t.join() + + +def main(): + server = grpc.server(futures.ThreadPoolExecutor()) + + demo_pb2_grpc.add_GRPCDemoServicer_to_server(DemoServer(), server) + + server.add_secure_port(SERVER_ADDRESS, server_credentials=grpc.alts_server_credentials()) + print("------------------start Python GRPC server with ALTS encryption") + server.start() + server.wait_for_termination() + + # If raise Error: + # AttributeError: '_Server' object has no attribute 'wait_for_termination' + # You can use the following code instead: + # import time + # while 1: + # time.sleep(10) + + +if __name__ == '__main__': + main() diff --git a/src/python/grpcio/grpc/__init__.py b/src/python/grpcio/grpc/__init__.py index 9e349c5b023..f3844f39bd3 100644 --- a/src/python/grpcio/grpc/__init__.py +++ b/src/python/grpcio/grpc/__init__.py @@ -1832,6 +1832,28 @@ def local_server_credentials(local_connect_type=LocalConnectionType.LOCAL_TCP): return ServerCredentials( _cygrpc.server_credentials_local(local_connect_type.value)) + +def alts_channel_credentials(): + """Creates a ChannelCredentials for use with an ALTS-enabled Channel. + + This is an EXPERIMENTAL API. + + Returns: + A ChannelCredentials for use with a ALTS-enabled Channel + """ + return ChannelCredentials(_cygrpc.channel_credentials_alts()) + + +def alts_server_credentials(): + """Creates a ServerCredentials for use with an ALTS-enabled connections. + + This is an EXPERIMENTAL API. + + Returns: + A ServerCredentials for use with a local Server + """ + return ServerCredentials(_cygrpc.server_credentials_alts()) + def channel_ready_future(channel): """Creates a Future that tracks when a Channel is ready. @@ -2036,6 +2058,8 @@ __all__ = ( 'composite_channel_credentials', 'local_channel_credentials', 'local_server_credentials', + 'alts_channel_credentials', + 'alts_server_credentials', 'ssl_server_credentials', 'ssl_server_certificate_configuration', 'dynamic_ssl_server_credentials', diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/credentials.pxd.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/credentials.pxd.pxi index 0631e1cf63c..2b68117eaa6 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/credentials.pxd.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/credentials.pxd.pxi @@ -12,7 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. - cdef class CallCredentials: cdef grpc_call_credentials *c(self) except * @@ -102,3 +101,9 @@ cdef class ServerCredentials: cdef class LocalChannelCredentials(ChannelCredentials): cdef grpc_local_connect_type _local_connect_type + + +cdef class ALTSChannelCredentials(ChannelCredentials): + cdef grpc_alts_credentials_options *c_options + + cdef grpc_channel_credentials *c(self) except * diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi index 24d1e2a3b77..a45766abc67 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi @@ -12,7 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. - def _spawn_callback_in_thread(cb_func, args): t = ForkManagedThread(target=cb_func, args=args) t.setDaemon(True) @@ -351,3 +350,29 @@ def server_credentials_local(grpc_local_connect_type local_connect_type): cdef ServerCredentials credentials = ServerCredentials() credentials.c_credentials = grpc_local_server_credentials_create(local_connect_type) return credentials + + +cdef class ALTSChannelCredentials(ChannelCredentials): + + def __cinit__(self): + self.c_options = grpc_alts_credentials_client_options_create() + + def __dealloc__(self): + if self.c_options != NULL: + grpc_alts_credentials_options_destroy(self.c_options) + + cdef grpc_channel_credentials *c(self) except *: + return grpc_alts_credentials_create(self.c_options) + + +def channel_credentials_alts(): + return ALTSChannelCredentials() + + +def server_credentials_alts(): + cdef ServerCredentials credentials = ServerCredentials() + cdef grpc_alts_credentials_options* c_options = grpc_alts_credentials_server_options_create() + credentials.c_credentials = grpc_alts_server_credentials_create(c_options) + # Options can be destroyed as deep copy was performed. + grpc_alts_credentials_options_destroy(c_options) + return credentials diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/grpc.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/grpc.pxi index 4a26fdc91d9..e8b164a7004 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/grpc.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/grpc.pxi @@ -606,6 +606,20 @@ cdef extern from "grpc/grpc_security.h": grpc_server_credentials *grpc_local_server_credentials_create( grpc_local_connect_type type) + ctypedef struct grpc_alts_credentials_options: + # We don't care about the internals (and in fact don't know them) + pass + + grpc_channel_credentials *grpc_alts_credentials_create( + const grpc_alts_credentials_options *options) + grpc_server_credentials *grpc_alts_server_credentials_create( + const grpc_alts_credentials_options *options) + + grpc_alts_credentials_options* grpc_alts_credentials_client_options_create() + grpc_alts_credentials_options* grpc_alts_credentials_server_options_create() + void grpc_alts_credentials_options_destroy(grpc_alts_credentials_options *options) + + cdef extern from "grpc/compression.h": diff --git a/src/python/grpcio_tests/commands.py b/src/python/grpcio_tests/commands.py index f7cd7c6b8a1..4a7af822b69 100644 --- a/src/python/grpcio_tests/commands.py +++ b/src/python/grpcio_tests/commands.py @@ -220,6 +220,7 @@ class TestGevent(setuptools.Command): 'unit._cython._channel_test.ChannelTest.test_negative_deadline_connectivity', # TODO(https://github.com/grpc/grpc/issues/15411) enable this test 'unit._local_credentials_test.LocalCredentialsTest', + 'unit._alts_credentials_test.ALTSCredentialsTest', 'testing._time_test.StrictRealTimeTest', ) BANNED_WINDOWS_TESTS = ( diff --git a/src/python/grpcio_tests/tests/tests.json b/src/python/grpcio_tests/tests/tests.json index 196e9f08b0a..95fc8c77cf0 100644 --- a/src/python/grpcio_tests/tests/tests.json +++ b/src/python/grpcio_tests/tests/tests.json @@ -24,6 +24,7 @@ "testing._time_test.StrictFakeTimeTest", "testing._time_test.StrictRealTimeTest", "unit._abort_test.AbortTest", + "unit._alts_credentials_test.ALTSCredentialsTest", "unit._api_test.AllTest", "unit._api_test.ChannelConnectivityTest", "unit._api_test.ChannelTest", diff --git a/src/python/grpcio_tests/tests/unit/BUILD.bazel b/src/python/grpcio_tests/tests/unit/BUILD.bazel index 42b99023463..ec2e93538e2 100644 --- a/src/python/grpcio_tests/tests/unit/BUILD.bazel +++ b/src/python/grpcio_tests/tests/unit/BUILD.bazel @@ -4,6 +4,7 @@ package(default_visibility = ["//visibility:public"]) GRPCIO_TESTS_UNIT = [ "_abort_test.py", + "_alts_credentials_test.py", "_api_test.py", "_auth_context_test.py", "_auth_test.py", diff --git a/src/python/grpcio_tests/tests/unit/_alts_credentials_test.py b/src/python/grpcio_tests/tests/unit/_alts_credentials_test.py new file mode 100644 index 00000000000..4a608b80cfa --- /dev/null +++ b/src/python/grpcio_tests/tests/unit/_alts_credentials_test.py @@ -0,0 +1,56 @@ +# Copyright 2020 The gRPC Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Test of RPCs made using ALTS credentials.""" + +import unittest +import os +from concurrent.futures import ThreadPoolExecutor +import grpc + + +class _GenericHandler(grpc.GenericRpcHandler): + + def service(self, handler_call_details): + return grpc.unary_unary_rpc_method_handler( + lambda request, unused_context: request) + + +class ALTSCredentialsTest(unittest.TestCase): + + def _create_server(self): + server = grpc.server(ThreadPoolExecutor()) + server.add_generic_rpc_handlers((_GenericHandler(),)) + return server + + @unittest.skipIf(os.name == 'nt', + 'TODO(https://github.com/grpc/grpc/issues/20078)') + def test_alts(self): + server_addr = 'localhost:{}' + channel_creds = grpc.alts_channel_credentials() + server_creds = grpc.alts_server_credentials() + + server = self._create_server() + port = server.add_secure_port(server_addr.format(0), server_creds) + server.start() + with grpc.secure_channel(server_addr.format(port), + channel_creds) as channel: + self.assertEqual( + b'abc', + channel.unary_unary('/test/method')(b'abc', + wait_for_ready=True)) + server.stop(None) + + +if __name__ == '__main__': + unittest.main() diff --git a/src/python/grpcio_tests/tests/unit/_api_test.py b/src/python/grpcio_tests/tests/unit/_api_test.py index cc0daba2098..a37ac3ef319 100644 --- a/src/python/grpcio_tests/tests/unit/_api_test.py +++ b/src/python/grpcio_tests/tests/unit/_api_test.py @@ -63,6 +63,8 @@ class AllTest(unittest.TestCase): 'LocalConnectionType', 'local_channel_credentials', 'local_server_credentials', + 'alts_channel_credentials', + 'alts_server_credentials', 'unary_unary_rpc_method_handler', 'unary_stream_rpc_method_handler', 'stream_unary_rpc_method_handler', From d84d53f90150c4d783275c691cf0add7d2b12ad1 Mon Sep 17 00:00:00 2001 From: Taras Galkovskyi Date: Tue, 7 Apr 2020 00:26:23 +0000 Subject: [PATCH 376/758] fix comment --- src/python/grpcio/grpc/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/python/grpcio/grpc/__init__.py b/src/python/grpcio/grpc/__init__.py index f3844f39bd3..04c3f69a475 100644 --- a/src/python/grpcio/grpc/__init__.py +++ b/src/python/grpcio/grpc/__init__.py @@ -1839,7 +1839,7 @@ def alts_channel_credentials(): This is an EXPERIMENTAL API. Returns: - A ChannelCredentials for use with a ALTS-enabled Channel + A ChannelCredentials for use with an ALTS-enabled Channel """ return ChannelCredentials(_cygrpc.channel_credentials_alts()) @@ -1850,7 +1850,7 @@ def alts_server_credentials(): This is an EXPERIMENTAL API. Returns: - A ServerCredentials for use with a local Server + A ServerCredentials for use with an ALTS-enabled Server """ return ServerCredentials(_cygrpc.server_credentials_alts()) From 0a56dcabb910b331cad0ab424c9c5ed8c550f39d Mon Sep 17 00:00:00 2001 From: Stanley Cheung Date: Mon, 6 Apr 2020 21:14:21 -0700 Subject: [PATCH 377/758] Fix cronet transport crash --- .../cronet/transport/cronet_transport.cc | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/core/ext/transport/cronet/transport/cronet_transport.cc b/src/core/ext/transport/cronet/transport/cronet_transport.cc index acdc3fc1ff1..f2c4639b3d1 100644 --- a/src/core/ext/transport/cronet/transport/cronet_transport.cc +++ b/src/core/ext/transport/cronet/transport/cronet_transport.cc @@ -1072,9 +1072,15 @@ static enum e_op_result execute_stream_op(struct op_and_state* oas) { op_can_be_run(stream_op, s, &oas->state, OP_SEND_MESSAGE)) { CRONET_LOG(GPR_DEBUG, "running: %p OP_SEND_MESSAGE", oas); stream_state->pending_send_message = false; - if (stream_state->state_callback_received[OP_FAILED]) { + if (stream_state->state_op_done[OP_CANCEL_ERROR]) { + result = NO_ACTION_POSSIBLE; + CRONET_LOG(GPR_DEBUG, "Stream is cancelled."); + } else if (stream_state->state_callback_received[OP_FAILED]) { + result = NO_ACTION_POSSIBLE; + CRONET_LOG(GPR_DEBUG, "Stream failed."); + } else if (stream_state->state_callback_received[OP_SUCCEEDED]) { result = NO_ACTION_POSSIBLE; - CRONET_LOG(GPR_DEBUG, "Stream is either cancelled or failed."); + CRONET_LOG(GPR_DEBUG, "Stream is already finished."); } else { grpc_slice_buffer write_slice_buffer; grpc_slice slice; @@ -1131,9 +1137,15 @@ static enum e_op_result execute_stream_op(struct op_and_state* oas) { op_can_be_run(stream_op, s, &oas->state, OP_SEND_TRAILING_METADATA)) { CRONET_LOG(GPR_DEBUG, "running: %p OP_SEND_TRAILING_METADATA", oas); - if (stream_state->state_callback_received[OP_FAILED]) { + if (stream_state->state_op_done[OP_CANCEL_ERROR]) { + result = NO_ACTION_POSSIBLE; + CRONET_LOG(GPR_DEBUG, "Stream is cancelled."); + } else if (stream_state->state_callback_received[OP_FAILED]) { + result = NO_ACTION_POSSIBLE; + CRONET_LOG(GPR_DEBUG, "Stream failed."); + } else if (stream_state->state_callback_received[OP_SUCCEEDED]) { result = NO_ACTION_POSSIBLE; - CRONET_LOG(GPR_DEBUG, "Stream is either cancelled or failed."); + CRONET_LOG(GPR_DEBUG, "Stream is already done."); } else { CRONET_LOG(GPR_DEBUG, "bidirectional_stream_write (%p, 0)", s->cbs); stream_state->state_callback_received[OP_SEND_MESSAGE] = false; From d94f41c40ed63360f37948e1509dfd127301c88f Mon Sep 17 00:00:00 2001 From: Stanley Cheung Date: Mon, 6 Apr 2020 22:19:33 -0700 Subject: [PATCH 378/758] Fix clang error --- .../cronet/transport/cronet_transport.cc | 24 +++++++------------ 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/src/core/ext/transport/cronet/transport/cronet_transport.cc b/src/core/ext/transport/cronet/transport/cronet_transport.cc index f2c4639b3d1..b3a0c401dbc 100644 --- a/src/core/ext/transport/cronet/transport/cronet_transport.cc +++ b/src/core/ext/transport/cronet/transport/cronet_transport.cc @@ -1072,15 +1072,11 @@ static enum e_op_result execute_stream_op(struct op_and_state* oas) { op_can_be_run(stream_op, s, &oas->state, OP_SEND_MESSAGE)) { CRONET_LOG(GPR_DEBUG, "running: %p OP_SEND_MESSAGE", oas); stream_state->pending_send_message = false; - if (stream_state->state_op_done[OP_CANCEL_ERROR]) { - result = NO_ACTION_POSSIBLE; - CRONET_LOG(GPR_DEBUG, "Stream is cancelled."); - } else if (stream_state->state_callback_received[OP_FAILED]) { - result = NO_ACTION_POSSIBLE; - CRONET_LOG(GPR_DEBUG, "Stream failed."); - } else if (stream_state->state_callback_received[OP_SUCCEEDED]) { + if (stream_state->state_op_done[OP_CANCEL_ERROR] || + stream_state->state_callback_received[OP_FAILED] || + stream_state->state_callback_received[OP_SUCCEEDED]) { result = NO_ACTION_POSSIBLE; - CRONET_LOG(GPR_DEBUG, "Stream is already finished."); + CRONET_LOG(GPR_DEBUG, "Stream is either cancelled, failed or finished"); } else { grpc_slice_buffer write_slice_buffer; grpc_slice slice; @@ -1137,15 +1133,11 @@ static enum e_op_result execute_stream_op(struct op_and_state* oas) { op_can_be_run(stream_op, s, &oas->state, OP_SEND_TRAILING_METADATA)) { CRONET_LOG(GPR_DEBUG, "running: %p OP_SEND_TRAILING_METADATA", oas); - if (stream_state->state_op_done[OP_CANCEL_ERROR]) { - result = NO_ACTION_POSSIBLE; - CRONET_LOG(GPR_DEBUG, "Stream is cancelled."); - } else if (stream_state->state_callback_received[OP_FAILED]) { - result = NO_ACTION_POSSIBLE; - CRONET_LOG(GPR_DEBUG, "Stream failed."); - } else if (stream_state->state_callback_received[OP_SUCCEEDED]) { + if (stream_state->state_op_done[OP_CANCEL_ERROR] || + stream_state->state_callback_received[OP_FAILED] || + stream_state->state_callback_received[OP_SUCCEEDED]) { result = NO_ACTION_POSSIBLE; - CRONET_LOG(GPR_DEBUG, "Stream is already done."); + CRONET_LOG(GPR_DEBUG, "Stream is either cancelled, failed or finished"); } else { CRONET_LOG(GPR_DEBUG, "bidirectional_stream_write (%p, 0)", s->cbs); stream_state->state_callback_received[OP_SEND_MESSAGE] = false; From f3f11cc21cd3145f45acc037d36721def3cc4770 Mon Sep 17 00:00:00 2001 From: Donna Dionne Date: Mon, 6 Apr 2020 23:21:02 -0700 Subject: [PATCH 379/758] Added new RPC methods to test routing different RPCs to different backends. --- src/proto/grpc/testing/echo.proto | 2 + test/cpp/end2end/test_service_impl.cc | 12 ++ test/cpp/end2end/test_service_impl.h | 6 + test/cpp/end2end/xds_end2end_test.cc | 158 +++++++++++++++++++------- 4 files changed, 139 insertions(+), 39 deletions(-) diff --git a/src/proto/grpc/testing/echo.proto b/src/proto/grpc/testing/echo.proto index 977858f6bc5..6ea9873928e 100644 --- a/src/proto/grpc/testing/echo.proto +++ b/src/proto/grpc/testing/echo.proto @@ -22,6 +22,8 @@ package grpc.testing; service EchoTestService { rpc Echo(EchoRequest) returns (EchoResponse); + rpc Echo1(EchoRequest) returns (EchoResponse); + rpc Echo2(EchoRequest) returns (EchoResponse); // A service which checks that the initial metadata sent over contains some // expected key value pair rpc CheckClientInitialMetadata(SimpleRequest) returns (SimpleResponse); diff --git a/test/cpp/end2end/test_service_impl.cc b/test/cpp/end2end/test_service_impl.cc index 94628195b06..ad1592bf7d8 100644 --- a/test/cpp/end2end/test_service_impl.cc +++ b/test/cpp/end2end/test_service_impl.cc @@ -234,6 +234,18 @@ Status TestServiceImpl::Echo(ServerContext* context, const EchoRequest* request, return Status::OK; } +Status TestServiceImpl::Echo1(ServerContext* context, + const EchoRequest* request, + EchoResponse* response) { + return Echo(context, request, response); +} + +Status TestServiceImpl::Echo2(ServerContext* context, + const EchoRequest* request, + EchoResponse* response) { + return Echo(context, request, response); +} + Status TestServiceImpl::CheckClientInitialMetadata( ServerContext* context, const SimpleRequest* /*request*/, SimpleResponse* /*response*/) { diff --git a/test/cpp/end2end/test_service_impl.h b/test/cpp/end2end/test_service_impl.h index 0978d5f19b7..e41359f9655 100644 --- a/test/cpp/end2end/test_service_impl.h +++ b/test/cpp/end2end/test_service_impl.h @@ -84,6 +84,12 @@ class TestServiceImpl : public ::grpc::testing::EchoTestService::Service { Status Echo(ServerContext* context, const EchoRequest* request, EchoResponse* response) override; + Status Echo1(ServerContext* context, const EchoRequest* request, + EchoResponse* response) override; + + Status Echo2(ServerContext* context, const EchoRequest* request, + EchoResponse* response) override; + Status CheckClientInitialMetadata(ServerContext* context, const SimpleRequest* request, SimpleResponse* response) override; diff --git a/test/cpp/end2end/xds_end2end_test.cc b/test/cpp/end2end/xds_end2end_test.cc index c2b998bdf58..f7772ba0376 100644 --- a/test/cpp/end2end/xds_end2end_test.cc +++ b/test/cpp/end2end/xds_end2end_test.cc @@ -259,6 +259,36 @@ class BackendServiceImpl : public BackendService { return status; } + Status Echo1(ServerContext* context, const EchoRequest* request, + EchoResponse* response) override { + // Backend should receive the call credentials metadata. + auto call_credentials_entry = + context->client_metadata().find(g_kCallCredsMdKey); + EXPECT_NE(call_credentials_entry, context->client_metadata().end()); + if (call_credentials_entry != context->client_metadata().end()) { + EXPECT_EQ(call_credentials_entry->second, g_kCallCredsMdValue); + } + echo1_request_count_++; + const auto status = TestServiceImpl::Echo1(context, request, response); + AddClient(context->peer()); + return status; + } + + Status Echo2(ServerContext* context, const EchoRequest* request, + EchoResponse* response) override { + // Backend should receive the call credentials metadata. + auto call_credentials_entry = + context->client_metadata().find(g_kCallCredsMdKey); + EXPECT_NE(call_credentials_entry, context->client_metadata().end()); + if (call_credentials_entry != context->client_metadata().end()) { + EXPECT_EQ(call_credentials_entry->second, g_kCallCredsMdValue); + } + echo2_request_count_++; + const auto status = TestServiceImpl::Echo2(context, request, response); + AddClient(context->peer()); + return status; + } + void Start() {} void Shutdown() {} @@ -267,6 +297,10 @@ class BackendServiceImpl : public BackendService { return clients_; } + size_t Echo1RequestCount() { return echo1_request_count_; } + + size_t Echo2RequestCount() { return echo2_request_count_; } + private: void AddClient(const grpc::string& client) { grpc_core::MutexLock lock(&clients_mu_); @@ -276,6 +310,8 @@ class BackendServiceImpl : public BackendService { grpc_core::Mutex mu_; grpc_core::Mutex clients_mu_; std::set clients_; + size_t echo1_request_count_ = 0; + size_t echo2_request_count_ = 0; }; class ClientStats { @@ -1356,6 +1392,34 @@ class XdsEnd2endTest : public ::testing::TestWithParam { return status; } + Status SendEcho1Rpc(EchoResponse* response = nullptr, int timeout_ms = 1000, + bool wait_for_ready = false) { + const bool local_response = (response == nullptr); + if (local_response) response = new EchoResponse; + EchoRequest request; + request.set_message(kRequestMessage_); + ClientContext context; + context.set_deadline(grpc_timeout_milliseconds_to_deadline(timeout_ms)); + if (wait_for_ready) context.set_wait_for_ready(true); + Status status = stub_->Echo1(&context, request, response); + if (local_response) delete response; + return status; + } + + Status SendEcho2Rpc(EchoResponse* response = nullptr, int timeout_ms = 1000, + bool wait_for_ready = false) { + const bool local_response = (response == nullptr); + if (local_response) response = new EchoResponse; + EchoRequest request; + request.set_message(kRequestMessage_); + ClientContext context; + context.set_deadline(grpc_timeout_milliseconds_to_deadline(timeout_ms)); + if (wait_for_ready) context.set_wait_for_ready(true); + Status status = stub_->Echo2(&context, request, response); + if (local_response) delete response; + return status; + } + void CheckRpcSendOk(const size_t times = 1, const int timeout_ms = 1000, bool wait_for_ready = false) { for (size_t i = 0; i < times; ++i) { @@ -1372,6 +1436,28 @@ class XdsEnd2endTest : public ::testing::TestWithParam { EXPECT_FALSE(status.ok()); } + void CheckEcho1RpcSendOk(const size_t times = 1, const int timeout_ms = 1000, + bool wait_for_ready = false) { + for (size_t i = 0; i < times; ++i) { + EchoResponse response; + const Status status = SendEcho1Rpc(&response, timeout_ms, wait_for_ready); + EXPECT_TRUE(status.ok()) << "code=" << status.error_code() + << " message=" << status.error_message(); + EXPECT_EQ(response.message(), kRequestMessage_); + } + } + + void CheckEcho2RpcSendOk(const size_t times = 1, const int timeout_ms = 1000, + bool wait_for_ready = false) { + for (size_t i = 0; i < times; ++i) { + EchoResponse response; + const Status status = SendEcho2Rpc(&response, timeout_ms, wait_for_ready); + EXPECT_TRUE(status.ok()) << "code=" << status.error_code() + << " message=" << status.error_message(); + EXPECT_EQ(response.message(), kRequestMessage_); + } + } + public: // This method could benefit test subclasses; to make it accessible // via bind with a qualified name, it needs to be public. @@ -2129,26 +2215,26 @@ TEST_P(LdsTest, Timeout) { CheckRpcSendFailure(); } +// Tests that LDS client should choose the default route (with no matching +// specified) after unable to find a match with previous routes. TEST_P(LdsTest, XdsRoutingPathMatching) { const char* kNewCluster1Name = "new_cluster_1"; const char* kNewCluster2Name = "new_cluster_2"; const size_t kNumRpcs = 10; SetNextResolution({}); SetNextResolutionForLbChannelAllBalancers(); + // Populate new EDS resources. AdsServiceImpl::EdsResourceArgs args({ {"locality0", GetBackendPorts(0, 2)}, }); - balancers_[0]->ads_service()->SetEdsResource( - AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); - // We need to wait for all backends to come online. - WaitForAllBackends(0, 2); - // Populate new EDS resources. AdsServiceImpl::EdsResourceArgs args1({ {"locality0", GetBackendPorts(2, 3)}, }); AdsServiceImpl::EdsResourceArgs args2({ {"locality0", GetBackendPorts(3, 4)}, }); + balancers_[0]->ads_service()->SetEdsResource( + AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); balancers_[0]->ads_service()->SetEdsResource( AdsServiceImpl::BuildEdsResource(args1, kNewCluster1Name), kNewCluster1Name); @@ -2163,28 +2249,34 @@ TEST_P(LdsTest, XdsRoutingPathMatching) { new_cluster2.set_name(kNewCluster2Name); balancers_[0]->ads_service()->SetCdsResource(new_cluster2, kNewCluster2Name); // Change RDS resource to set up prefix matching to direct traffic to the - // first new cluster. + // second new cluster. RouteConfiguration new_route_config = balancers_[0]->ads_service()->default_route_config(); - auto* mismatched_route = + auto* mismatched_route1 = new_route_config.mutable_virtual_hosts(0)->mutable_routes(0); - mismatched_route->mutable_match()->set_path( - "/grpc.testing.EchoTestService/Echo"); - mismatched_route->mutable_route()->set_cluster(kNewCluster1Name); - auto* matched_route = new_route_config.mutable_virtual_hosts(0)->add_routes(); - matched_route->mutable_match()->set_path( - "/grpc.testing.EchoTestService/NewMethod"); - matched_route->mutable_route()->set_cluster(kNewCluster2Name); + mismatched_route1->mutable_match()->set_path( + "/grpc.testing.EchoTestService/Echo1"); + mismatched_route1->mutable_route()->set_cluster(kNewCluster1Name); + auto* mismatched_route2 = + new_route_config.mutable_virtual_hosts(0)->add_routes(); + mismatched_route2->mutable_match()->set_path( + "/grpc.testing.EchoTestService/Echo2"); + mismatched_route2->mutable_route()->set_cluster(kNewCluster2Name); + auto* default_route = new_route_config.mutable_virtual_hosts(0)->add_routes(); + default_route->mutable_match()->set_prefix(""); + default_route->mutable_match()->set_path(""); + default_route->mutable_route()->set_cluster(kDefaultResourceName); Listener listener = balancers_[0]->ads_service()->BuildListener(new_route_config); balancers_[0]->ads_service()->SetLdsResource(listener, kDefaultResourceName); - // Wait for the new backend to come up. - WaitForAllBackends(2, 3); - CheckRpcSendOk(kNumRpcs); + CheckEcho1RpcSendOk(kNumRpcs, 1000, true); + CheckEcho2RpcSendOk(kNumRpcs, 1000, true); // Make sure RPCs all go to the correct backend. for (size_t i = 0; i < 4; ++i) { if (i == 2) { - EXPECT_EQ(kNumRpcs, backends_[i]->backend_service()->request_count()); + EXPECT_EQ(kNumRpcs, backends_[i]->backend_service()->Echo1RequestCount()); + } else if (i == 3) { + EXPECT_EQ(kNumRpcs, backends_[i]->backend_service()->Echo2RequestCount()); } else { EXPECT_EQ(0, backends_[i]->backend_service()->request_count()); } @@ -2197,13 +2289,6 @@ TEST_P(LdsTest, XdsRoutingPrefixMatching) { const size_t kNumRpcs = 10; SetNextResolution({}); SetNextResolutionForLbChannelAllBalancers(); - AdsServiceImpl::EdsResourceArgs args({ - {"locality0", GetBackendPorts(0, 2)}, - }); - balancers_[0]->ads_service()->SetEdsResource( - AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); - // We need to wait for all backends to come online. - WaitForAllBackends(0, 2); // Populate new EDS resources. AdsServiceImpl::EdsResourceArgs args1({ {"locality0", GetBackendPorts(2, 3)}, @@ -2239,15 +2324,13 @@ TEST_P(LdsTest, XdsRoutingPrefixMatching) { Listener listener = balancers_[0]->ads_service()->BuildListener(new_route_config); balancers_[0]->ads_service()->SetLdsResource(listener, kDefaultResourceName); - // Wait for the new backend to come up. - WaitForAllBackends(3, 4); - CheckRpcSendOk(kNumRpcs); + CheckEcho1RpcSendOk(kNumRpcs, 1000, true); // Make sure RPCs all go to the correct backend. for (size_t i = 0; i < 4; ++i) { if (i == 3) { - EXPECT_EQ(kNumRpcs, backends_[i]->backend_service()->request_count()); + EXPECT_EQ(kNumRpcs, backends_[i]->backend_service()->Echo1RequestCount()); } else { - EXPECT_EQ(0, backends_[i]->backend_service()->request_count()); + EXPECT_EQ(0, backends_[i]->backend_service()->Echo1RequestCount()); } } } @@ -2260,20 +2343,18 @@ TEST_P(LdsTest, XdsRoutingDefaultRoute) { const size_t kNumRpcs = 10; SetNextResolution({}); SetNextResolutionForLbChannelAllBalancers(); + // Populate new EDS resources. AdsServiceImpl::EdsResourceArgs args({ {"locality0", GetBackendPorts(0, 2)}, }); - balancers_[0]->ads_service()->SetEdsResource( - AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); - // We need to wait for all backends to come online. - WaitForAllBackends(0, 2); - // Populate new EDS resources. AdsServiceImpl::EdsResourceArgs args1({ {"locality0", GetBackendPorts(2, 3)}, }); AdsServiceImpl::EdsResourceArgs args2({ {"locality0", GetBackendPorts(3, 4)}, }); + balancers_[0]->ads_service()->SetEdsResource( + AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); balancers_[0]->ads_service()->SetEdsResource( AdsServiceImpl::BuildEdsResource(args1, kNewCluster1Name), kNewCluster1Name); @@ -2287,8 +2368,8 @@ TEST_P(LdsTest, XdsRoutingDefaultRoute) { Cluster new_cluster2 = balancers_[0]->ads_service()->default_cluster(); new_cluster2.set_name(kNewCluster2Name); balancers_[0]->ads_service()->SetCdsResource(new_cluster2, kNewCluster2Name); - // Change RDS resource to set up prefix matching to direct traffic to the - // second new cluster. + // Change RDS resource to set up prefix matching and path matching that do + // match the traffic, so traffic goes to the default cluster. RouteConfiguration new_route_config = balancers_[0]->ads_service()->default_route_config(); auto* mismatched_route1 = @@ -2299,7 +2380,7 @@ TEST_P(LdsTest, XdsRoutingDefaultRoute) { auto* mismatched_route2 = new_route_config.mutable_virtual_hosts(0)->add_routes(); mismatched_route2->mutable_match()->set_path( - "/grpc.testing.EchoTestService/EchoMismatch"); + "/grpc.testing.EchoTestService/Echo1"); mismatched_route2->mutable_route()->set_cluster(kNewCluster2Name); auto* default_route = new_route_config.mutable_virtual_hosts(0)->add_routes(); default_route->mutable_match()->set_prefix(""); @@ -2308,7 +2389,6 @@ TEST_P(LdsTest, XdsRoutingDefaultRoute) { Listener listener = balancers_[0]->ads_service()->BuildListener(new_route_config); balancers_[0]->ads_service()->SetLdsResource(listener, kDefaultResourceName); - // Wait for the new backend to come up. WaitForAllBackends(0, 2); CheckRpcSendOk(kNumRpcs); // Make sure RPCs all go to the correct backend. From 14f55eb202ec7b9a19abec09639ea4b29c61cad3 Mon Sep 17 00:00:00 2001 From: "Mark D. Roth" Date: Tue, 7 Apr 2020 07:38:21 -0700 Subject: [PATCH 380/758] Temporarily disable client_channel_stress_test for msan and tsan. --- test/cpp/client/BUILD | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/test/cpp/client/BUILD b/test/cpp/client/BUILD index 011d937bcb8..8f594edfde9 100644 --- a/test/cpp/client/BUILD +++ b/test/cpp/client/BUILD @@ -38,9 +38,15 @@ grpc_cc_test( srcs = ["client_channel_stress_test.cc"], # TODO(jtattermusch): test fails frequently on Win RBE, but passes locally # reenable the tests once it works reliably on Win RBE. + # TODO(roth): Test disabled on msan and tsan due to variable + # duration problem triggered by https://github.com/grpc/grpc/pull/22481. + # Re-enable once the problem is diagnosed and fixed. Tracked + # internally in b/153136407. tags = [ "no_test_android", # fails on android due to "Too many open files". "no_windows", + "nomsan", + "notsan", ], deps = [ "//:gpr", From b518ee3cc83f75220a63f5c1863d170b1cce9ae1 Mon Sep 17 00:00:00 2001 From: "Mark D. Roth" Date: Tue, 7 Apr 2020 07:57:04 -0700 Subject: [PATCH 381/758] Remove size=large, since it didn't help. --- test/cpp/client/BUILD | 1 - 1 file changed, 1 deletion(-) diff --git a/test/cpp/client/BUILD b/test/cpp/client/BUILD index 8f594edfde9..73b0aa37457 100644 --- a/test/cpp/client/BUILD +++ b/test/cpp/client/BUILD @@ -34,7 +34,6 @@ grpc_cc_test( grpc_cc_test( name = "client_channel_stress_test", - size = "large", srcs = ["client_channel_stress_test.cc"], # TODO(jtattermusch): test fails frequently on Win RBE, but passes locally # reenable the tests once it works reliably on Win RBE. From cdc1c1afaf20c623719d20002304050ee108fc6f Mon Sep 17 00:00:00 2001 From: Dan Halperin Date: Tue, 7 Apr 2020 08:23:33 -0700 Subject: [PATCH 382/758] gRPC docs: remove mention of Python 2.7 It's April now, docs looking forward to January seem outdated. --- src/python/grpcio/README.rst | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/python/grpcio/README.rst b/src/python/grpcio/README.rst index 9fde3878488..fe34ad5adfe 100644 --- a/src/python/grpcio/README.rst +++ b/src/python/grpcio/README.rst @@ -12,10 +12,6 @@ Supported Python Versions ------------------------- Python >= 3.5 -Deprecated Python Versions --------------------------- -Python == 2.7. Python 2.7 support will be removed on January 1, 2020. - Installation ------------ From 8079de2466a3077ff8facfd11cb6401d4b054dbb Mon Sep 17 00:00:00 2001 From: Richard Belleville Date: Tue, 7 Apr 2020 10:07:15 -0700 Subject: [PATCH 383/758] Accidentally a word --- tools/run_tests/run_tests.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/run_tests/run_tests.py b/tools/run_tests/run_tests.py index 9008004cdad..b1c56762bd1 100755 --- a/tools/run_tests/run_tests.py +++ b/tools/run_tests/run_tests.py @@ -866,7 +866,7 @@ class PythonLanguage(object): else: if args.iomgr_platform == 'asyncio': return (python36_config,) - else if os.uname()[0] == 'Darwin': + elif os.uname()[0] == 'Darwin': # NOTE(rbellevi): Testing takes significantly longer on # MacOS, so we restrict the number of interpreter versions # tested. From b5ec5e0b8b78987a004f9cd36690d037f2e05b20 Mon Sep 17 00:00:00 2001 From: Muxi Yan Date: Tue, 7 Apr 2020 10:52:13 -0700 Subject: [PATCH 384/758] Fix podspec bug --- src/objective-c/BoringSSL-GRPC.podspec | 2 +- templates/src/objective-c/BoringSSL-GRPC.podspec.template | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/objective-c/BoringSSL-GRPC.podspec b/src/objective-c/BoringSSL-GRPC.podspec index 05e03a5b5ee..425e71f5daf 100644 --- a/src/objective-c/BoringSSL-GRPC.podspec +++ b/src/objective-c/BoringSSL-GRPC.podspec @@ -212,7 +212,7 @@ Pod::Spec.new do |s| # limit on the 'prepare_command' field length. The encoded header is generated from # /src/boringssl/boringssl_prefix_symbols.h. Here we decode the content and inject the header to # the correct location in BoringSSL. - base64 -D < include/openssl/boringssl_prefix_symbols.h + base64 -D < src/include/openssl/boringssl_prefix_symbols.h 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 EOF diff --git a/templates/src/objective-c/BoringSSL-GRPC.podspec.template b/templates/src/objective-c/BoringSSL-GRPC.podspec.template index b15e07799ae..9401d9b3efc 100644 --- a/templates/src/objective-c/BoringSSL-GRPC.podspec.template +++ b/templates/src/objective-c/BoringSSL-GRPC.podspec.template @@ -229,7 +229,7 @@ # limit on the 'prepare_command' field length. The encoded header is generated from # /src/boringssl/boringssl_prefix_symbols.h. Here we decode the content and inject the header to # the correct location in BoringSSL. - base64 -D < include/openssl/boringssl_prefix_symbols.h + base64 -D < src/include/openssl/boringssl_prefix_symbols.h ${prefix_gz_b64} EOF From dbf3bb31cdc3360c73f7c34c3d1c6a1261236db9 Mon Sep 17 00:00:00 2001 From: Richard Belleville Date: Tue, 7 Apr 2020 11:09:27 -0700 Subject: [PATCH 385/758] Shellcheck --- tools/run_tests/helper_scripts/build_python.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/run_tests/helper_scripts/build_python.sh b/tools/run_tests/helper_scripts/build_python.sh index a633049510b..cfcb151bcce 100755 --- a/tools/run_tests/helper_scripts/build_python.sh +++ b/tools/run_tests/helper_scripts/build_python.sh @@ -171,7 +171,7 @@ pip_install_dir() { # third-party build process. This function pipes through only the # minimal environment necessary. pip_install() { - /usr/bin/env -i PATH="$PATH" "$VENV_PYTHON" -m pip install $@ + /usr/bin/env -i PATH="$PATH" "$VENV_PYTHON" -m pip install "$@" } case "$VENV" in From d8348a9b97d624e22588746eb9d261e3994628c7 Mon Sep 17 00:00:00 2001 From: Muxi Yan Date: Tue, 7 Apr 2020 11:15:10 -0700 Subject: [PATCH 386/758] update scripts --- tools/distrib/check_copyright.py | 4 ++++ tools/distrib/generate_boringssl_prefix_header.sh | 8 ++++---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/tools/distrib/check_copyright.py b/tools/distrib/check_copyright.py index 82a43fde5c4..831d62ef52e 100755 --- a/tools/distrib/check_copyright.py +++ b/tools/distrib/check_copyright.py @@ -92,6 +92,10 @@ _EXEMPT = frozenset(( # Designer-generated source 'examples/csharp/HelloworldXamarin/Droid/Resources/Resource.designer.cs', 'examples/csharp/HelloworldXamarin/iOS/ViewController.designer.cs', + + # BoringSSL generated header. It has commit version information at the head + # of the file so we cannot check the license info. + 'src/boringssl/boringssl_prefix_symbols.h', )) RE_YEAR = r'Copyright (?P[0-9]+\-)?(?P[0-9]+) ([Tt]he )?gRPC [Aa]uthors(\.|)' diff --git a/tools/distrib/generate_boringssl_prefix_header.sh b/tools/distrib/generate_boringssl_prefix_header.sh index e2b1ae67995..f06f3c6128c 100755 --- a/tools/distrib/generate_boringssl_prefix_header.sh +++ b/tools/distrib/generate_boringssl_prefix_header.sh @@ -15,8 +15,8 @@ # Generate the list of boringssl symbols that need to be renamed based on the # current boringssl submodule. The script should be run after a boringssl -# upgrade in third_party/boringssl. Note that after the script is run, you will -# typically need to manually upgrade the BoringSSL-GRPC podspec +# upgrade in third_party/boringssl-with-bazel. Note that after the script is +# run, you will typically need to manually upgrade the BoringSSL-GRPC podspec # (templates/src/objective-c/BoringSSL-GRPC.podspec.template) version and the # corresponding version number in gRPC-Core podspec # (templates/gRPC-Core.podspec.template). @@ -24,7 +24,7 @@ set -ev cd "$(dirname $0)" -cd ../../third_party/boringssl +cd ../../third_party/boringssl-with-bazel BORINGSSL_COMMIT=$(git rev-parse HEAD) BORINGSSL_PREFIX_HEADERS_DIR=src/boringssl @@ -52,7 +52,7 @@ cd ../../.. mkdir -p $BORINGSSL_PREFIX_HEADERS_DIR echo "// generated by generate_boringssl_prefix_header.sh on BoringSSL commit: $BORINGSSL_COMMIT" > $BORINGSSL_PREFIX_HEADERS_DIR/boringssl_prefix_symbols.h echo "" >> $BORINGSSL_PREFIX_HEADERS_DIR/boringssl_prefix_symbols.h -cat third_party/boringssl/build/symbol_prefix_include/boringssl_prefix_symbols.h >> $BORINGSSL_PREFIX_HEADERS_DIR/boringssl_prefix_symbols.h +cat third_party/boringssl-with-bazel/build/symbol_prefix_include/boringssl_prefix_symbols.h >> $BORINGSSL_PREFIX_HEADERS_DIR/boringssl_prefix_symbols.h # Regenerated the project tools/buildgen/generate_projects.sh From df44248116d31039fa67c14f706a13cf94835372 Mon Sep 17 00:00:00 2001 From: Muxi Yan Date: Tue, 7 Apr 2020 11:21:31 -0700 Subject: [PATCH 387/758] build_projects --- src/objective-c/BoringSSL-GRPC.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/objective-c/BoringSSL-GRPC.podspec b/src/objective-c/BoringSSL-GRPC.podspec index 425e71f5daf..9aef9d2cc57 100644 --- a/src/objective-c/BoringSSL-GRPC.podspec +++ b/src/objective-c/BoringSSL-GRPC.podspec @@ -213,7 +213,7 @@ Pod::Spec.new do |s| # /src/boringssl/boringssl_prefix_symbols.h. Here we decode the content and inject the header to # the correct location in BoringSSL. base64 -D < src/include/openssl/boringssl_prefix_symbols.h - H4sICPaDh14C/2JvcmluZ3NzbF9wcmVmaXhfc3ltYm9scy5oAKy9XXPbSJK2fb6/QvHsyfNETOxacqtb857REm1zW5a0JNXb3hMESIAUxiDARgGS1b/+rQJAEB+ZWahMREzMjEXc1w3UdxUKWf/5nxf7MAkzPw+Di8178w9vk2ZRslcq9o5ZuIt+ei+hH4TZf6iXizS5+FT+ulrdX2zTwyHK/7+L33Yfrm5uLsN//hpeX+4ub3776O+2u483vwQfrna/3Vxtfrn556+/bf1/+8//vLhNj+9ZtH/JL/7v9v9dXH24vPnHxZc03cfhxSLZ/oe+xFz1FGaHSKlI2+XpRaHCf2iz4/s/Lg5pEO30//pJ8J9pdhFEKs+iTZGHF/lLpC5Uusvf/Cy82Okf/eTdsI5FdkxVePEW5fr+s/J/0yK/2IXhhZa8hFloHj7zE50O/7g4ZulrFOgUyV/8XP9XeOFv0tfQkLbNvSdpHm1DcxeV7/F8v6efjsfQzy6i5MKPY6OMQnV6uvXX+cXq8fP6f2bL+cVidfG0fPxjcTe/u/g/s5X+9/+5mD3clRfNntdfH5cXd4vV7f1s8W11Mbu/v9Cq5exhvZivDOt/FuuvF8v5l9lSSx61SvPO7Ifb++e7xcOXUrj49nS/0C5nwMXjZ8P4Nl/eftV/mX1a3C/W30v7z4v1w3y1+g/NuHh4vJj/MX9YX6y+Gk7rzj7NL+4Xs0/384vP+l+zh+8Gt3qa3y5m9//Q972c367/oRGn/6cvun18WM3/+1nj9DUXd7Nvsy/mRkr16Z/lg32drVeP2nepH2/1fL82j/F5+fjt4v5xZe784nk11x6z9cyodRrqW179Q+vm+gaX5r5n+j+368Xjg+FpgbZeL2fmPh7mX+4XX+YPt3OjfSwF68elvvZ5VWv+cTFbLlbG9PF5bdSPhlkW4ceHh3l5TZX6Jj30vZR3MV/qhPg2K8Gfu7nxH/9mxJ8el5qpa483u7vznpbzz4s/L46+ykN1kb+lF7roJXm0i8JM6cKjC3+ahDoTclPEdKE+KPMHA4pyU1lNiUt3Fwd/m6UX4c+jn5SFUP8nytWFn+2Lg+api02oxWFppCvvf/zbvwe6YicheDv/1//Hxeb/gT95C/3oy+oCktG+8MK/+Pd/v/DMf23+rVF9WT7dep8Wj97O0y0NfCPnP1Z/+EdP9f+GNBXmLF6t6xHv1vcrbxtHOg29Q6jbjcAJPJRDfC4YJ6owew0zNrgjh/imCfU2xW6nSynbBYAAXq+X3pUwB4YIzEdiQJNlOTJEwD7idBqRSntdUfLoEJoulOHQksP8F92pxqHEokuAXfhJRKWNOJdH5LFpqKIkyiM/Pj2iFxR1V8CyxHm9O5gvl16c+oFnWGbgpQeJTpYQoOfx+DR/ML+aW3JuyPviHvtp/s3Lwtp+pUc3pgt34UMAzGMTpXKfHgTwesv0QEBkNCCgLtJHAik9N/PL7eJJD8i8IFTbLDo6F2wYgfuYJskvdGeURAHXqM2gnTZmYCZwMXraYRsd9aRG+jRnCu0WRPtQ5VK3M4V2k7nY6D9+eol/CCUWNcLuI3uSikC7HPyfnu5NlKD+9DAWvyiZxO+Mof2kWWXPp2O2k2ZUjaB9st1W/DQnBu306seFyKYEWDzkZcCa/5HyfN1Bcj1qOcnfxOn2R90MCnzaGNxP5XrQ6meBqBh0IJDX47cnzw8Cb5sejllYrldxBqsWFua8y8IQuFzxvDEa5q6L1Qdm6nbkBH+6h0NglHcU8K2igCKLEg1Ns/Wfpvh88LYvvm7wt2GWu3sMGbjT5QROl6Ocyp872efHe64lCKO8qxn87YxveCIQLuHPPPMnSNABiPBU1fOzrWo94rB9CXUzfcyiV/MG5Ef4zvIZUDC3anCtH3qfpcWR59VlYE5x6GetBFY8rz6FdOtnqsRzwCKdD2kQCsyMnOSn5VRS8jw1AXEJE38Th166VUfTmx/jKOG1HBCI9jz+pdP6GGaReWHgqWif+LHEGuLRd2CuCesGz6xE6fs+HJXkHmAifRd5rExxS5IwZvWpGAlx3cWFejm1TbyH7SIwHz1c4tG1EGGWYyKTuNEu2uoGj8XvQ0gvYZPSh1BeRz/zD3yXUk7yq06C29P0GLhTVfpVbl7/MY1aCMqnKeredsO3alMot7L3U3yfSk85nMZBXhypnG/UwRB++u9+Eee65Cj1JkrDAcnF1StUmAV+7k9n3yCJ+wh/eiLTWk87JOGbHi8F4U+JTQMhvaYYAYEkwjVKdqm39eN4429/sB07FMJNtzpxupf79TiEo1mJLJsiUYXsUCxuxyzNU/6CFkaiXHU+T+TaJ1Gu3HHzSUywJWPmlp5w+KuIzO6NlyIP0jd+gnUxhF/5as5/Ya0/DhCETz2k01VDzytleTREEb6cd++AnnKIlW7Y9IXbH1ULwC8eQxThq2tCtHuXt1k9jt0xCI/5i9SuhNi9RAWlxUCcyhf49WVxuvX5tRskIa5JqCdy+eHoLVe8pa02APV4Y6LfEGIWHtLXULR01UUgPuZXz99udQFhmbT0dgdvn6aB1KaEjPDKwiTcp3nEnV4iLMq5aiN3RRzzHc8M0mnjvUTMwWEbQHqkej61FRSLGjDCQ1gw2pQxbpMUDQBGeZczujJvVfS3wLbLsTmWV29kbhXD5mQmN1KnimFzqts1qVmDofxklcxWw8zO/1DAr/SUQ1IcNpyX0F095aAmKtdqdLlWE5RrNapcqwnKtRpVrtU05VqNLdf1QFtQ9k4E1CX/UO/R9o5pyu0QuxDKq1zo4LuUcpJ/Wo1TApOGQTmdpgiy1VcYhfteylLw0paC+oIie2W3do3e7sBf5OlDKC/+Kv9ZTvFVtPfjvSC5asAID2GCtSmU2wTvxwAO5ThZTbp0qUmentunb16R/EjSN7Pr4lgvp7EzEyeSdzGF72gnFcZmNMzuvfoYwq/a2MI3qvU2B1GJGVdSyoumWFrCYJR3+WbATwL2npUBhXYTvuNTI9/xqfMWdEm71mZQTvJ3fWrsu77WheIq0MFQfkWWmSvNcE9k2OWQjrrWHOqCLPBrUQi3ad6dKod3p2r6d6eK8+60LapbjaOfvyjxHbRhlHeqyq5FN/fl+wVByvdJhGvoZ/F7+cK33mzDHogAKMo3uLq+vvyn3LTLoRwF78WV9b24uWLnxyo0m8SyeoQSBl4dI6HszNnWNjBxT/ss9LVWmsxdDOEX7RPdxZsx6eVHz7z922d+wB81wDjKX/zmXo18c68menOvRr+5V5O8uVcj39yryd7cK4c396drVaiHULvM35tNjyLXDolynWS/gHLYL6Ak+wUUvV+g/FlNUDTbkJFenp/tJ/EzIMIzMa+rq4SWz7Yg2Chv5fnBq9l1qcJgmhvoEYm7KHclZ6E6poniF6MOhXIT7D9R1v0nqvzGr9nvz/6cCkVRvupHMwWQVhiAZXGuYxVM4txjUc51NCe2W6UnHP4qoq00G1sM2km6b0mN3bek5PuW1Jh9S9VFuVlOSBM9sFYv/tX1r166a09WlcDfhibvq57U6OmFbjiKQyi4jz6K8lW+LuXK/G9Y3aR4ZIsjifs49RDnzfaSlh+kke6T7GZTLrvZ2heb1aY0yXV/JfY9o0b4mvYteAlFu+oIHnUH0OcvsiE4jrTcR5TszZeLaaYngIcyrqAS3QTAo+4gy49mlLKL4lDg26ZQbnkWbadZvhyiCN96D6T5sl3agQ1RpK+sZNtLcvdlkbj1hHG0vxnnVsMU80WzaLIA0pzcxYMuHDniPnI/L9QkKdCQRrsKOqw+yO553lQ8gW8H5uKtpnNWdt/CrNnphk5qeuJQjrrrCF74RqXcyp+gsnQ5FsdwK3wmA7B46GGfyELr7Q7TJFwbRHlmhaCbLNUEXfgayvr+qZ4MTDXAgXF2f/5XBmrcVwaFWXHZsRwqKcbVjcVTtfTxO/M1dhcxysebrR4uJzArOeMczdBxCkfDIRyXq9kEydmhjHWTJeoQNdpXlLRDFOEr/eS9xxjnJEvXPmikZ7UvRJSyMG6k/2TOFk8zp64ib+fv3kvEfHcDkgDXOvJl+9Xz1j+aOYizLY4ifFmxINpikp0evM17zphmDxGETxXKgRecDWDYnASLRwjH5ih7SYKjbL7HUJqihjDGpV1BldyygxvlXy0gT+BcgWyeEy7HjeTa7qiaGMrcKwbtxN7FAjDsTvwoDxjI4snYBt2VW/gHczxExtrgCWMsfuXr3G0as7cUUDCLd71WEUe7sNxkyOqMbUDrPRxCoechHOHBWTMFGBanKTLRnncvvpqkUe1xLI7CBuyMIHwiVb3hE43P2hDCi/MFektLkMvPHwQNVa23O4jHST0O7SjuWdSonkVN2Soqt1bx/DpG5Ggt50ra8il7y6cmaPnUqJZPvaRFHHgb8yFqso9DMznjWwIwwjtPhTOgE2CEh7dLM2nxAFiEM3MNsCsH+MzwFWjUCml0YXtkYWlUYXtEYVlEX1s0X/O7WRipv3IqNv8Kt7kyxUFPIRjL/hYedAexudKc0lEfB+Pu2SeMcfHidAqrEoP6lcsY9Zq66fvjnOk4BKGe+fsxlKVkizDGRZKSfQzgV23weYnck65RQtRyv1QZj9ede9ZCZHEU6TERpJl3jt2zOEL0mOjQgvjMZGxmWVxmW0xmbvAcPGbOtsjzlywt9i9lUPc4ZLxDABiAUxDG4d6c7epts7BckfZjM3BxnwOgJMg1Lc9f07O3H+4P1hZDbD124H6i2dIC5Gr5vNnAv81/msCbYXmYppkAO9vZgOg9lEv41ZiGkVMAA3KaIsr4yAjj08b2do3rPU1M77HxvMMs0wNoybFlAwLk8vOYZuVuHtNxHnS9zCJGqHYYA/ix3hYhb4maI6bNLqjyZBxn8hAB+uQf2pEIGFVpiMB82u8ZzZhG8bwGGNRP0FWPiIBenXRz/q6oiYvGTEMQhfnK3nqNetsliO5ORnaf6L3W6PdZ5wv724UkpgMW5lx/spOFfxW6/dWtMSemEkrCXcWb+REO6jjdWzv3t3X7MjIPM3poWwyzTzsXOOiTFiFL9sj09JhDtSd+88481A5g0E7cPLfs3pecZkCfZDDBKQajTjBoXZTp4Xt6kNhUBMyljj/C3PgxRNh8zuduyczOHIujHpb5idivoeBuryFnKNwWk2zWoXFdOcI/BSjhvkcAGIhTazZlAkkw82RAwdzM2J/nYJQYlfl+jN5x0frV+/P6wz+91fpxOS83wUXBT4kZgMP9+Ts9RuzwqE/fOChPFUczV2KatAiIy45XD3dYDdR/idRLyKTWYoQti1Qy5nyR8ppXXl+odQixmS16ccirxx0C4iKLczLmdJJpTiYZeyrJNCeSjD2NhH0SCXEKSRWQ+jTt9PL0R5h4G13nzaoHexZoQSL3wV2lpk9BKTdZneaLzPCvAMPmJBnc9yGUl6gx6xBIlyKOJ0nAHojyLINE5Hq8q8qVuLLkKL4ziKP8yzMZ8yILz7N9vjsAQ72rmiIYw3cRmA//gL2uHOO3dvrzHFqAER68rZAgBXETxiMZdYZSGbN/E6UsuhFiTH5sE+t5TM0FyixRJduQb3EiYC7MoWCGjgVVuDWV8ny8hVn1kgxoKSB6D9UCeieAAtMcIKGu1bIif0WiQ6BdzJeu3JamiyB92LPqs9zKL18+CE1KBurEX0+hVzPVi5+ZpVXBYloXgfoIWkhL2wj0o14Q7UPmdALHOfibmQ+/UBBAh3vgl3wEhnmLIsXsR0SJaX2U4O9DT/1g7PkGGJiT7NX3EEH4FEn0F3Mh/izH+a3gHc07Pq4ZxBrlzK4HQwziJw0kP+58QvHZhCPOJZSeSWg/j7B1BXOL5YCAu7B7LXrF4407Gn7DR8NvzHHkGzqOfNMtZygbAHcRgE+UtBbLnS06apjeikjNwbfkMD9KIhbY6CCi8gLdbLgTKx1MNF78RZU+APaoBoIceKVEqEBPXsdBZFnhONhfGh18iEB8OguKgu03BAtwNoOy4hhw1vTOUoAbR5vMz955laMthtjmBNnz+2nWvBJgYE7V9rxqy7riGXUQgM/B30fbZoGrifmYu9cmlAS6mojjfuyluvaxFlEGBMBFdIav5fxezpeT8BeTSXHorm645/QQAfgcw9B9cGdEIKvMZQau1EHEv8wmAj0wMvHnq7Yy1hnMeHeGkiDXLN2aYwnLtexjqnLBZnKCBTu/RkFYXc0afwwIgEsVF1pXleZWvF0c7V9y1ltJkoa5l8uQcfgaxjy/sx5zqMZ5AosWAPDIOM1TBrdIkiOE6RODW7+yayfAAJ1Uf5fJvzjfrCAcwLGO/Hze2OvsNSCALuYEDH0jcfW9GMOkCwA9ql4xC1kfxnTlIJ99pil5nqn0LFP7OablFawXNY0So8rPcxx9Kmp54Rv7Kd7Qp7jk5+ollavs81Xps1XF56qOOFO1vAT6VIxnBpEwV94+DvIEV9HprZaTW+Wnto45sXWK01rHndQ60Smto09oVYKd64rcuV4eYFp+OFcu1LKeoQPAPASnutpPdDVXMNs8D23x2IdV0me1ys8wHXN+qfQ0UftJohOcIjrqBNHyourrYkER7RAwF9EJnmNO75zoJMfRpziWFya7NNuG5UpfuWyl/D0vDUES5srchU1HJ1K8vcMK2zs84UmITqcgyk9AHHP6obnmX8GPy0vvLc1++FlaJLy060MQL9le4DHnHU5z1uHYcw6nOeNw7PmG05xtOPZcQ/aZhsR5huKzDEecYzjJGYYjzy8sL8sLHj4vEKLsg98x5wBKzgCkz/+b6Oy/0ef+TXXm3/jz/qY662/8OX+SM/7o8/2kZ/vZz/VrrhBv6kZJuKtkX9qoUwSFJwhaTw+sLjiveLLb4z4E9Zr8lEL2CYWKufdXoXt/lWCnpSJ3Wk50pt7o8/TKC1/CoPWWQ1+8i3gdHUhCXQX1yVKTJgwr4Hwu35Rn8rmdxyc/i2/MOXzVwXncuTE1J57gZL/Rp/pNeO6d05l3rTO8XsxbU9bOWwhCe4l3diqnnZ1qmp2dauzOzilOWBt3uprgZDXyVLUpTlQbd5qa6CQ1yylqkhPU6NPTJjk5beSpaeVlw+9Oec0pBMI8Wae0USe0CU5nI09mE5+KNuJENCXefaxG7D5WzP28Ct3Pyx/XEGMaXn+L9bXm79xAtm2xhc0LXzsgAC55avYdCPeRQRDAS3h6nvXkvClOzRt3Yt4Up+WNOylPfkremBPyJjodb/TJeBOdijf6RDzpaXj2k/AmOQVv5Al4k5w+N/LkuWlOnRt74hx3/RxfMX/zGbdrRBDL7PdzhxnVkPZ69fG02sJb6BsAYA8+nKLWC6R8eAfQ81jfrwRJM1ADdCYW5fGTY6AG6G9R/uJtit1Ol3KuB8AYOr1eepeylB8SEBcBnuSKcmJIAF2uxGl0NSKNriR4kitNo6sRaSRNIXv6sNEEU5oyVLoEV1H7gBknek9Lk533VAH6nkN0FbDvvaelyc73Duh7DnrYcbv8/rR+9D49f/48X5brFd42PerRYpFsndwsrFHOJuT4VM4Ny+YchOGxvE+ZaYOx+ZmAhUkRxzK7E8XqVhyERsXB5nEs1IvMxBBsLsrxDAcIYPNwD0MMI4Y+q+X6SSsf1/PbtamM+v9+XtzP2aXBxnO4A/cSQqDG+3JKDcUCnM0m4cXT16YxOhxZrQvGIR3N5vc8FFhVANqjOEoMiiNJ138PBHgjJ/nsoj9E0D6MAt5Rk3RWMe7KST6rSerrhw5ljN6H2be5rGogGLsfd4yBcayO7LEFxqEc2WMKAEH5cKpoV03SXY+NGagpuuvn3n2xhc1qWoYEyuWYHoVpdCKQLowGpqum6OUmf3Hlb1NIN9eQhQM1Qp+gio+q3aKCZSlTjH7qpEOIogJqKZvqJdrx8rJUIlRWb3dW9qiz21s99/Xu5qvb5eKpHDE6JwfCsDs5hkoBCXYX11YURvR95ivv9tvs1o1ciwDWdrP1wmSbvTseDtzTQuTd5vLqhg/vyCF+non4HTnAD0IeuNYBxHC7Yd9uSwuRuVSUmMpyL7XlnirPCSl/df4uEdAjDrU/26GlBxyK5C3zjyz4WUpyvaMfBI5bEkEC4MK+d+LOpfdtuevVw6U3e/ju3H6fdRDx02LtrdZGWZ0P7M7uEywu7h0dALB47MuvjXORTc2wOAlNrHznbnSotzi4Ll8CeruDODcUkRvfnmRFq6OnHVhP0VLTdF5mt+Ug//Hxfj574N17o4XI84fnb/PlbD2/YyZ9D2Dx2HNKaldvcYhkBtZUYmVwV29xUMI0UtY0ylPv04PIoyRALp8lRfUzXVa/zB+0/f3if+d364Wes/vBv9w9AMgYL2bHCmLG+PEqI0QZ48bJrCFjjBOr+gCQMV7HzHXTHI4Z48equABkpBdnA7SFRTiL+uchw+4kKJNkX929RlIe6T57MbsWpVlXTztw0qqtpumsNOrIQf7Dev7FvPY8HBn0s5hiu77E7IspNjNXW2qKzhootcQUOxKgI5LMKylnMcVWkhRRdIqYFrDQrfyvv4gsagblxBx6deQQ/+H5/p5ZJBspyuUUmFqIMllF5aSEqI+f/mt+uzbhAF0/NRjKCT4vjVtigs1J50ZKcFlpfdaC5Nv1vJnZP9zNP/NuHqBY3VgdRp9gdWF1HX2C1YVZmvoIq484c0bkC6+U9QhWF1Y30CdALk/6x/Xs0/1clDUQZYwbJ4OGjDFOrGwCIKSXNPXs6SZLMVtaCVPJnj7O4QQAPeSwmv/38/zhds5+zdADkB4iPsZeC259Td11VXKr5PODgMHvEawu2zj0E04/AlGsbqwpQ59AuLD6XbrHPf3quputLybYzoE1+2KKLcjbgMxRXvNp6XPOb8U+yJKlIdAunv7NL2IT0VH9kJh1QIRnHCZ7x1gOQ7mVzxuCDBCED6vzoXvm+lfmkmhbbaN74U+ZgQaM8PB2R7GNZhBOkmym89ecHiBBf6DZ3ubde1jcSRxqhMVnkvqtxtfv/qWer7aT+RoY4Z2n3vP68w3brtZTDqwhYUtsYYualRMA8lj/einqtrp62oEzLmyraTorhTpykC95J7qm34nyX4RSbz8lrzzp95zlr0G02zHBRopymcWPelPKfj1KvBPlvwil3n5KXnnS7zn5LzepN5ri15gj3l2Wl+iWdx8mYebH0d9hYMJfMr2GINDz+9OcN1c6KVEqs3yfpCiXNXM8KVEqr4TXSpSq2PeqiHs1h8vwsZcQ9/lh8cd8uRK+OYcoY9w4TdaQMcaJlc0ABPRa3/I7uJaYYjO7uY6c5B+OZcxdLxeYNAzKiVnCWmqKHgnuPyLvm1eCzmKKzewQO3KKz2qOWmILm905Dhmw0+cbWfPUBVg8eEWoJbfwmQWprYcc/lisFtL3QkOG3YmTXH2C3YWVaAME5BNE+1AxnqHSQcRq+JXrmaiJzO5O7upJh9ePAvzrR5ide+nG+fTVnhYiR3l4MPGE3LknJUV1jg40UJN0zkJeS4yzmcWvJcbZBfumC/yOzVle7EysxBSb13K11RQ9ugr4cC2m2Kw2qiVG2YIkIdODnxhUSpioW/y6WKtJOrsuVmKUneg/CxLlJMf57AJClY6jz5kZNFKUa07EYHKNlOR62/yngG3kKL9IBClSiVE2I8p7XwyxD5s6EDfvHXNHTvIToUGCOVS9vs6cvxktVUsMsfX05hDl0WvIbAi7etqBVUU7cpBf5F6YMt4C1UKMyR2nnbUQOff3V6zPKGshxtRliMfUQpAZHo5xGZ6aVSw6cpLPKhRtdZ/+vP6qlevv3uLh8+MpIoX7U6CYUX6uOYxARnk5pyBGQd1+n39f3EnS8AyweLDT7SS38Plp1eh7Dp9mq8Wtd/v4oGfCs8XDmlHWYITVxzGtIIDVwzW9QELfZfHo+cdjeb5rFIfOx0cBesChOax0m2exM7+jhuhx6GfeLvb3yp191qLkLMyzdxG/RYBcTGS7xBwUVV7n7tHVQw6sZEdSW/+5XP8oz4fMwr8K12k9SqHcygMEvH3hZ36ShyHfsAfCPE2Rdl3q7YsBdpCejnN3Jp+lADdMd85ArQFIJlSg++aXjhKixq6x7RoVRMsYJQBqx+s/e34cs3hGCDDLTZKuWzrbQoTpeLDUWYbxjjzeEeFFSZSziEaIMA9mlY6blicxwT46DtZ7WoRsAgDq6uC4+XKgRuiSHqmnJx1046wcD6KBAIgH62Szvhhms5IFSouX8GdQHNyrSa0DiCZfE/daUslAXs7r309CgGnKdnnGb8JIybYYZOcvvAa8UWJU5wFyS4gxy3in7h+xAnrSgZOBHTVFD/TYKkvf+QY1gPJgVbqOmqIfCwndqCl65npE+kBN0d0PzBrKEX7KHKm1tACZU43gGmT6sU2Uekc/yjjIRoywuUPplhYhM0ZalQzjuZ5O1xZizCOPeER4puHeFDsWtNYiZJVuf4S8bKqkIPcnh/gTZBWHTZjx2oGWFiebSqw7RC68lgN87jQVn6EeU/dipTUQyezWci9OlQzi5RmvozwJISZnWnqEZ6WsTgrpm1hFESmD5RKLr5JLFrBUYlT2mmFHDdIVo8EoVRDtTXCnb9R9KnYfpIgeSHH6HwX3PorX9yis5zEHJx4YOK0Cacy+QeE9QzkkjlPFeOiTEqPqHPNeUpWzStKAQLmY2dnR9QwFkEC5yBwIOmvFRuGrX4q3+qWw1a/yB9b6SaPEqEce8ojwWGtqCl9TU/XaFWek19IS5DDdmeWfIkvYBmcE4pO4brxqCxFms2TFK2dnOclXx3Ab+bHAoiaQLrxJZ0+POLDX7RS9btfMdusjet032aAUyO0lLeLA0xNMdo70CbgLr1CdtRSZ88qwLcbZzELUEoPsqgDoCxjoRguRE+aM4yQEmHmouB3FWQpwi6NOfPc7rWQA75W1ovqKrKa+spPylUjLN+5k9Q2frfKKKFY2q3aD8zKwUaJU9gSkK+/zH7xP94uHuyr0TvIauo7nhnrCwb2Q9cQEO5LdfGS7d+dVza52SL5d/+mFjofynWUwj5PAJx1MdP2Y+CyDeYxkrGUwT+V+xrrDUjhkfpk/3H4qtwy5Qs9KjKrc07IRDpnfHh/W5ZM4b1Xuiwk2p0B1xASbURTaWppsWiOVO4cHQCkWt12aeYc0KOJCifxaHMKRUZDaWprsxWZhJJAY1Iihj79RXqS8tzRz5rekADdw5wUwh3dztQ4gqu3VJnHmlaohbRMlDFqlAmj6z5E7rVRhNM5RW30xxj76TO7Rh5nbzYZ/v2cxyA7CLQOqVSDtxXUn0EkF0uKQ/9iNFiQfjhGDqVVDWrn11RVWihCW85FXbSHG5HSQZyVAdd0s9ADEmKn+yGrJTjqAyBhmwKOLbVokpo948/4Os9SkrnIHDxBDH12ZGK1lpQJo0aszKnoFOaycOekAYuFcZobfLes/hsmLn2zDwDtEcWzeSftlm5xFBz+O8vdyRcLVaAwTuJO/Cj/mD+F6coD/0znFtGTI4dR+uN7vsvSgR35Jvk8PYfbuDu3Ih/z91rnAaQnAOQVFMFkYeu7d0gAAeeRettt+vL76tb7q8vrjr+5GEAV2KxyPCjnLYB6nfp90Q6LuxhntWKUa0txfCD2A74IezHBcN7yc2chZCVKTcO+bz0QZ2JMU5Kbu04RKBdMSzg1qFUg7pm9XDJyRwTxm/WxJCe7O102rWaAWGLQYoBOnEqEzRP2DGSkweEY25MUho0qWIoBVnnPvDCtVGO2Sh7sc8g5+pl50d+q+A6irhcjqB2v01wgBZhpwVgNqGcrz/ioix1gJfTHMZoxEahnKuyoHAkxqJUbZEvQIMn/IB1MsbpwWZgCAPcr3CYr1GLWU5Hqb2HzREQj4JwTtkwYijxSrU7w276ykqJd87CXJ5bcCHQDlIbWgHA5FzAFrGcoTTFmGBNiFMzA66WCi+ivjALUM5eVMIFKOVbFhAYsNyuMXrEYMs7mNKNJ2HiPGwKpSATRGiQdLuy6nrOesdUMi4+UX+M4rSXRaOpOMCGGx6ttZCVCLA2uQd9LhRFaWdMQI+11PS1hcIxwyGRNFcJZ49E2XasbSXpGY8F7u/T+AAHxEK362tT33GL4nEcJy3jJ71gFEFRZB6mW++86MlpTkmv/ahwJ6BRh6cG4avlv+bdrur/qNsWzQEQNs1ngyQ8aSGW8cmWFjyPIMHvdlt1oG87iLZG0tTGashipsNVQxV0MVuhrKGL2BIzfOqA0esTFGa+BIzQy0WGlV64bEPK1irM0fnr/Nl7P1/M6VPSTgLvWx1lyLWg7y+dOMjnjILhiLRQW4UlQwXt0W4LvbglGgCrBEvfpxEXLGH41wyOQso0JrqM3FuyLZ5lGaeC+uLSSIQH1UGO8YI5qhvu/w/Nn7Nv9WxzFzg3ekCNf9JWNLiDD3WfrGYhohwayON2WTKznCd54ynXUI0Xzvmb3yErfWAuRDeHB+I9/IAJ7KMw6vksG8eOvnHKDRYUTX3SFnHUxMmA+doE+dxGHCIsaDb+dvP30qV/adX4q0hQTT26RpzAaXaoqebnPeaSQohXSLgmqDQu4acwHHUH6Fntw5DmEBPeLgvjjQUSJUdfS3IYtaKhFqcfkri6l1OPF06O0x07//dFyCIDiY4xUvJ7UOJ07zDEMO5vjxiufw8QojMst3gZbr4oYHvEF50yTyzYg05pzM3tIBROfvz08iiBVxPoXsKEGq2vpZ4G1fojhgkFtqgK7/FTlGNjnLUJ7zmRFdKcR1jgvaqDBa1QeY9QfHmKggAXBx3oB1EiEsj1e7zlKA6zpSqjUAiTPGbukAovME9CQasFb1aCnMzDJBEGaO2IEedYjy+mCIF185rwTiGMzPDJX0HTHGW0MA4GHCM/pRourN1+/OTRuEAH2O76wBV1sKcBmt+wpu3Vfltk0/eefMBLpiC9sL4/DgGvkTgxBepjBP4tcHYZ7sdCPSjDmD6qkpuih1xqWKFx2OcbSNmBM1HER5suZOAz3iwKvKjRKhxr7K3YevHS1CTo9mUZGz9xEkjHHhF9shZpSfYCnAhhvlLyhwEAjxdJ8JNzqcKJzgoBzM8YqXTNBMuPllmmcYMROur3SeCTc6jMgsPAVeVnhNCdqKiGfCGAbwY8wtVvDcYmX2vr/6cRT0xp7ueJgDOLrPOlbgrGNVBQEzX4E58xolQD2G4Y/qKXLfPR06aoCufkRHZ6gRQazc8f3OSQSynN8/nGV93ny5Xnxe3M7W86fH+8XtYs44YwmDjPByrR0gYoSP67sqhNF3+ja75YX86CgxqntGtJUY1TkpWkKI+TlKXKt1I4N4C+cm86SCaEvnwLNnGcR7PgauZwe0dH3i48Nn74/Z/fPcPVc6Uohbhi0JFaMU9dUUPU7rwL98iwYB+VQbJOPIcZdAT9snL++9u8Vq7T098k6VgwAWD9dCPZBb+M4FaKgfOHx/Wj+al66f50t92eM9J6FAht3J/XEgBOnjx7Hj0aaAnnRwX9cayEm+MDusOVEuSeuxg8DjhCB9nMeZfTVJlxUlWykqo0SZt+CydGpjSD9GpEkIAHt8e17P/+S9vgMAlIf7xKivpugm3pV7kFYYYfVhvEuEGZRTkUzwTC3ICC/hc7UpsJseWX/XQxjWy02IQLtwS1xbTzsU5RjP25jnVhKrDgj2XK1n68XtFMUdJo11ZRcSBDXCV1gVMNZ452me2V4/1l+X89nd4s7bFlnm/HIDZlicyrMA6vN5RXZt0AjPpDiEWbQVW9acEY7HNEpy1zfMOAd23G62l1c3JoRV9n5k5V+XQLqEidSlJiAuu4255lLk02OQTjcTOI17JrkP7fLi6/94Vx9YBicxwq6GWmYy4oU/2TMOAIP45Zk0xTqEMS7mn67vKXAO7Fie/itIwLYedthvD+ZefF6vdVaTdEFL0yWMceHnC8QhHQXlrUsY4yJ+rhHlrb6SP/TtAEiPcgr+I3wXuJwQpI/uDR1DMgJ60sH5LU9fjdDNOUXv1XCsOttVNAYicHb/+mjWyW6gz7PfQXXfE9l3YLi3oOFtyUk+7wRvhIE7lQ/sfC4EBKA9zKZDaSb1Obhj/lIe8KcFrq96YAbi9OKbjcXMefpZDdPNFk1fHTjoWopwqxEab3TXiGF2VJ4quIvMWeGRH3ubwnlzOQGCPeNok/nZOzsf2nrY4VCunLMNWnKEHx5cv/3tKGGqqfyCdqolR/jFwWOvHDVimJ2K5znpiHlOmmxZzZ7RwcRjGr9ffvxwLRgn9RAWH26Z7AAsHgXjFTKIgH2ywDnuSEdJUU0ApTw6xuGN83mDBAdxDHdVVHE9S/CMpoxN6v6xgY1mcY+SrchP62EHs3hkvqgSj7dAEO454UhXuY501cQjXeU80lVTjnSV20hXyUa6yjbSLU8JDcRP1ELgPlOMQdXoMaiaYAyqRo1B1bviNp+1FObmsbr0jhmrzTxp++T10rtbfvrCOJmjK8W4p9DwPPRJjdHdu9q2EqOaz9RcN/R2tX3yi39rBuicRaGOtMe9m69O618fnahtIcAMt5uPrIFeXwyzJWiKHIRX5i0EH98DwB4fpR4fbR4JM0dPQoCZSO45oe/XNIquS4MtHU70imT7EjofXAYSEJdUj3mOfhblvNs/y/v8r15p7EatRQjLOxYb94TuiQF2ejgWetTFIZ+lQ67zxrJaMyQ1x4swbrGtJcg6E/1DmIeZcg1jiFIgt/wD7xkqHUI8/rVnEbUOJLLGl10pyuWtoAL6ocPpXIJzJrh6DAlDF9eNgJUE4HAi6LZ0Q2K1U5n/9H390EExy69Cy69ill+Fll/FL7+KKr/O587XmiGJsfmyUQ1oZXYp59PC2sI+c7Gc364fl99X6yXrfGcIYPFwHMQP5Ra+c6Ud6gcOq6f72ff1/M81J4W6YoLtnDJtKcF1T5GOdkiuvwHwHmbf5qwUGQAsHu4p05Nb+IwU6utxB0kC0WnDTxYqRQSJQaZDufh1dH7VCRL6LquZt1pw2q+WEGHWAwUWttYiZOeEPusQYtmts5ilEqBW8wkTaN7Pi8yd3dMDDkEqNhkiYB/zMwdudDDxNcyi3TuHWSkhqu797766I0sZwGPVCaQ+8CdnPTHFFkzPUAzoxxngtoQY03mI2xLCTN4gt6vFycxpGgAAPKQTNRBB+WTRK7eAAgzKqdjE0VZm1CAAH07vAPcMsskiAMA9BKk/IOAu/JTvAwAPxW0XFN4uKG67oPB2QQnaBUW2C6xuEukj3afStQhgcSbTjQzgMTtvrOfmTs/byh51fitYs+2LLWxvFx2VyKAkDF24Y/OulOCmnBOfIADqYbpnJt1IUS5nbjFQE/Sfzl9KD9Qo3bV/6ihRqvsMpqdFyYqfh4rKwzwVlb6THORz5iwdJUZlNH09LUhm3ix6p869x1kG8tiPjTyz9+VzfZCsHhi9OJ7jN5TD/CRS+fHq6heBRw9B+Vz/KvZpELjP33Kfv0mf5ePzk+e6qbctxJiu3XtbiDEZXWNLiVHLOWU9HU4zHr/LIJ3SzDX+MqAnHPRIY+dvJU/SEEiXInsNTSET2JwQdh/n1VCEQTkF4Z5dvs56ykGW9XTOVzXcNZT7UI7xzeLF5l2cHQMM5ScsYx0E5lMmqvtbZ0CPOahTyOBd7PiZHYygfITNWAdB+ZQf55svX8zp5+Y8sl2aHfieIG7o//v8e72AzZiD9dQU3X0G2RXDbF1OIl0Wy2mUCreZY/g8lIK4ufe/tQzmcfrekw4mshfJAb3dgV1kBhDMy4wAspSX7Gc1QeeuGiIMyom3cggjUJ+ywrNajgEA9wiTbdlqKq5HAyA8GMuLQznJ5718QBiwU6S89Oj/VbCqeSOG2boYXLl+2NSVwtzTGwL+sASm0G7Cimh/f1Jf6L50dJKhPNkYDoTgXryJa1cN06v3E7IH6TMoJ+ZLIYRBOsnKlu3tUH2ZaEw6AOAeohZe2Vt4JW3hlb2FV7IWXtla+HLQzR04NGKcLSxRPQThIxo0dAljXDx/Z67QRUTPwaLEd19bHgeF74Xxkq2jHFK/zddfH+/KznoXhXHg5e9H54YNhAy9qn1irkeCt4UYs/zwjTVb6OtRB/fVykaIMl3jzHeUGDXYxDyoFqLMgvn04MyOufOyo8So5VFJg9rEWc6x8bA7iMx6Qs5zq7QoWXm++QTdxD7ImSWnyyCc0qQapbBtTgDM41Awy6kWYkzG2BXbG9v8lG7zq3KpiEdu5Bi//PFqu9nw+I2c5uvbkPC1HOOriWuccq5x1ZDtcMxCpcJgurvAmdSd5KmwivYgQ6969hAFV4nrSQoDNU5Xub4g4NIr9ZBeHjdXRHEe1c2D8/BpSOi73F1dX1/+0wysjn7kuCjd1dLk03qo41exKAVxc39v3xIiTM679o50wF08zZbr77yPTgZqiu74XUVPS5Gde4+euM9++LJ44KTGWQcTTQ2odj5w1jpgBu60FPssLS7lkTGnKh0me/274nhBHNjROacbGczLwr1u8cyRrHFcdhtxmLMyHQTBnmqCUqBGlQIlLgWKLAXLpbea/TEvA6pz6stQDziYmEphlqUZY01lILfyd0KDHeBQTVLLa5zpLS1KVu+65B1EBm0E4FM9H+Ogw77YwvYSEd1LAH4ZErr6XTnT22KIXSRbWeIMCIBL+UKGlbmNkqJ6sfk7G13KrXxe5QUYiFMS/jxfWka+ZJkNMYCf/kWW6X0A5GG6xE+LR3bJ7QMwD/N/RB4tAOaxnD3cyUzaBMylDK6Tyny6DMCpPK2UVxnPUpLLq449vd2BVyEhCOZVHiIuSKqz3u4gSLQeZKSXIPkgEuSaHs1qwsHPfrj7nLUQOTP7p8o7cK8mbbGF7W03IrzW2xx2R5nD7gg5FOxyW+AlNgt9lSayjgNggE6H9NUMW1yDBvbFOLuO4CiyaDNAJ5WnGf8xWmqArnx2Cp2lEFcPIlhV9iTsM/948mbz2V159K/vetbWQE3ROecNQgDKw32O2FdTdDOCczz7AtBTDs7RMgdqG917i/IXL4iycJtHaSIz68Eob+eVlZ6YYqfHUPAgRm2je3s/f3HdLY9AKC8Vun5X2Ffb6J7a+nkueZQ2hXLL/b37h4wAgPJwjhM+UGN0s/tCm+/zFx7/rMcczKeaup/KXtitbptAuYhyogXAPBIT2l+UWm0C4PLJfGu5Tn933czTkQLc28XT1/myLAvlKZyMTxcxCu22jY6c5mRAsLgwe9whwuLjvF9lqLc45FksctB62qEOnus8asYotBtjhyAAsHhwxkI9Pe1Q7oE5HhlzVZxDO7LGRz29xeGV25BBENpL0MeAFNrtkAai8mD0tANnjNeVW/hRIOJHAc03keFFxasE0B5qojqjRtcZc6W4vWkgdq9pSnWXZHc9+kEgbLxbGNxPPk4YM0YQ5Zcln8Qt3IjWTV4GxuS9pEWjWzNBS4O0MswBHzrKK3/4HCV+7BpvbyhH+QtWd9tISS7/tms1Sn92P3mrLwbYd+FWF5lPvgp//cWZ3RbjbNMwcNFGi5LLjGaSSy1KZpWQsxTlMvOwLUbZwT2vZeqoYboZ/LMrZU+PO3AT/aSlyYJbx2tmfQE/W89qiB7tQ8VIklKG8pi15qylyX8+fpbAtZzms/KxI0f5vALYSEku/7aJ0lf+vnLeL9uRklxJWWn0pIMgzU9yks+tmj0A6iHiW9h/MHYt98QWtiR/WwSLiyCPzwCLhygf2gjAZ57wxzEtLUrm5UJLi5JZKX+WolxmarfFKJs7jumoYbpoHNPT4w7cRCfGMa1fBbeO9yT1BfxsJccx3+6k7yIGBNyF+3bgm+1t/OkCzluBlpYmc3K3Kyf45SG3bHypxun1CbZcfC3H+ax1/2/kDohvgt0J38i9CfWvh4DLPQQ4lbMe/Y3acVD/yFsnbotxtqTW0/Xd/QP+rhYmy9oqWzvFWwc9CWGm+dakCknAhXcJsAs3RfC04OYfkndPn+aecj9ttCuFuL/frm6unn6ff3fnNlKQO/9+VV7B4J6kCJf/jrmjpugBo6dtiyk2q8XvqCl6FUDtB2PvxRBh9cmU76V+ePRifxPGQscuzOJdXn3Y7y45nREGGuNZ3uEUnjVojCf3bRkGGuWplKf8OOfsRKJgNu/meClxIrdJlCtn3NEWW9heFIjwXkTevZqyHiq3eliGp9pWwcnMZhqRcYc01nUfJudICNPYd5C2+zBppRtKo3EPA2yBOXgfi0348ziZe4Ub4y9ugdX4FlhN1QKr8S2wmqoFVuNbYDVlC6zcWmA1WQusRrbAvlKchf6Wliabs38kdKO3OFSx2UQmFcLisxQ+yRJ/ko2vQnZHVYtRNrthpFpB50huLSHBZEfrhBmok1nUElt1IZhXEDLnjS2xhc1baxoQcBcTt5zLN1qaLLr9BmDxKPerhYxdRRAE86p3NPM8arGFLUisNgFz4c+OqZlxOcF0PPG1L6bZ3Lb5pCbpkh6mBSA9lqInWJJPcClJ+0s67S9FaX9pSftLadpf2tP+UpT2l9a0z2Nlqp55i8iIgEiiCF8v89/48YMJkNWTGUsY52CO3AETPlZixtEfyDF+NcHjwSstTRZ0Di0A5nGI9EA22YsHTkMO5sheGyLWhcyaziR1AwBZPYV1Y8jBHE9rKTyfk9pGF5S3DgL1KcNDVGfHMm1aBItLlY0imwph8SnzTmRTEjAXJeqTlaVPVtI+Wdn7ZCXqk5WlT1bT9cnKpU8uA9Jy3kp21CidvYpDreGU6xb8Ot7Icf7f3PSA3/yWv/FTmUphzqkBXS1GfuVtyGxpabIgB1sAi0cWbs3X9SKbmjHOSf5UbRDgyd+pTO1RZu9OJvYln37ibPNqaREyc/seuctZsk+Y3iEs2BtM7go+/8hJ5Y4apTNT2rLP2MRErQIgeH4c+e4DqT4A8Qh435WcpRDXBKXyQ+VdXt14283WUy9+2eW622AkF1cvOhz10CtiRTYaRR15N+Zg6KlSoWZZnbcHbxMXYZ6mjG3UOMrJ17uZ0Nm7sXrnmfdy8E/JJPTuwmze++1B5qcBIzz0SOpV7GMgY7x0Mbu8kruVmLF+H6fx+0j6/fNKmF8VgPIw1XSaFrBPcnGdpgWkqCPvRtwCDlkjnT/e/DKZc82yOk/VDgEwm7eoXNeAER6ydqgFGeMlbIc6mLF+H6fxQ9uh7Yuv/3P1wTum8fvlxw/XPL8BBvML9I2FQfhxgkYJRDn5ypslKxa7n6SIY+HzdxCYz8+JMvjnuBxuhogMl0ZLkfOMT84zghy6RjruagkyrymkR2PVr+mOf89ai5H1qIKdg5WWInNzsNISZHYOVlqCzM5BYnxW/crOwUqLkOuhAotcaykyMwdrLUHm5mCtJcjcHKRGItWv3BystQCZ+9Eo/rWo6aU45aHWIURObtU6jMiINVXrcOJHLvIjwWQn50lMsdkJW4txtuS2kbs2Z2mbkYgz9iQEmGYzR7V0uHl3P+wdANg8GHtCenrEoVqiFDxFG2DzYD5FS29xSDf/EjloPeDw4quyRXzxs+DNz9zTqQ8APA5+pkfKcX0nnh/v0yzKX9w7BQxEeEq2jAAMyom/UWSIgHwC97BsWgOSrhmka5hUToI4uFIIMI86MUJ5WYExqJ+knAwIuAu/jPQBgEe2vfJ++cDqZs5ShMuFYsRfGDSoLLNKH1LyzOLa1S8cmpYhPMbKH7rGVy0+cnhaBvOuGWtqlQzgmdUXsxRTfmVx8N0LTB9AeNQV2+wHyAK2UYdCuFUXnC5XxfGYZnnI90V45B2UZ/5wv6qDMX2/P9fzh7v5ndno5T2vZl84Z5LCDLuT68t/iGB3cd6dCiJ6Pp8XTyv3WL2NCqN5rkFYOsoe9cv8Yb6c3XvmyOaVe7YO5STfMTP7YpLtmoUDNUF3/kauL6bYrhEy+mKKLcpQW35W36uk5myfB9epFMGxOr76cSF1KxmUk6Co0iVVVFBt5bTcVcynl3KKr5qcSkQ53uVYHYU5rmw5vnr+tF7OBdWlDbB4MAvWWW7hc4tXS99z+Pr7nVvEXiMAGF748+gngTOq1sHEPPO3OQdZCvvMb7NbN5YWAAx2nMG+GGW7xhjsKCmq65bIvhhjO1etjhKjOm8c7igxqmsVagsxpnvsvK4U4rpvuj3LIN6ClZoLJCU5G2zbQojJ2Fbb0kFE5+8WGlWftlytzDf4vmONb2QQL0xYvFIG8fZhEmac9ayBGqILlzwRBuQkWjYDCaBLGr9feVmaZ7p1S1SeR45jHpSCuX3U7dJrmOU8l5Mapx+KmIvW0h53sVo9a5F3t1itvafHxcPavZVHGHYnx5YKJNhdXHsCGNHz+Xbntlinrx8SGI1/owJozk3/SQSw1pmfqF2aHZyBjRKgMpr+s2zAu3YEXQ8JrBy4RnLgmpMD13AOXLNz4JrIgWteDlwjOTBff328c/4M7yyDeUXCJJbCHrOcO94+PqzWy5muyStv+xI6BviHETYf51YUJNhcHIsboLc5uLaeEKDvoX/+zEigRgbyyiCXjIPBB2qcnmeu6/N9MciOU8dDlM8ylOdtopTJNFKQ61wUTqo+bb5e3c6e5t7q6Xc9DncvCEM97eBaS/pqmu6cLAM5wV94m19/MXML11cQGMTqVX08L/SqIKSXKNsXtlxflJVOTw1cJxYYhPQSFLAFXb4WouK1sJYuNUUqqXGp5BwUYSgn+YwP9yFA3+NxvbidaxGjxHakKNe19LSEKNO51LSVPerjp//ytht15boPrqWDiIyl1ZYOIh4YtANIcj9E5SwDeAHjOQPwGfW/AlMTosBsfFLO1J6edti8i01qBOBTvsJzPkm6owSojIN7zzKIl7CKfSUDePqvV9vNxhlY6xBinLCAcYLwXPejtnQIUfHuUEF3qF1YmVLrEGL+M2cRtQ4gKl65UVi50S4sYK1DiJx8rnV94tP8wVxuwkf4cXzelanMgqnbdN7CQpw3RRSbYKpVuHrFcuwxEKeyB1Ihy6HWUmTXvqKrJciZ+whmKMf4OmOiPY9dSjHusdC9iB5gclPlrEcc2GlCpMb+4PyaoSslubpi/EvANnKaH0S7ncTA6BGHF1+9fLxiwSspwo38j1db/+g9sdCNGqObt5lltOaUxz/rEYdq4cU0P7r1OaRBETObMAiEeB5045puWS6VlOS6v9cH9IhDkkoanEaN0PUonp0wtRYhqzzb+ip0nqgM5Dg/KNjsoCC4ifDGE+udJ65He/S0CDlP4/TNMRJeT9snr7/Ol6wtpR0lSnXvkTpSlOtaHVtClOm6ztBR9qnHMIHHfW4WKMbiV311KDOrGRan6uMAmVPNQJxe9U24vgnpaWmylxQHCd3oew5P82/ebPVwaRpRt5lOR0lRnV+LDNQY/U0XsZCHLqUkl3/bjRzg/3n94Z/e4uHzIy/Bu3Irn/UMQwTpw08sgAE4bd7zUPGfpisH+Prf3lZX7o3v+I66LwbZP/SQapcyuJUQYqbei34ax961owSo5qWL+bDpdvGkO4syV5z5AANwOmZ6nOkcn7ijBKis2oTUobKw3H1lxFwfqFH6avZUfd/6u+NbIBhB+HhPz59cQ5UDesJBlFAnOcaf30oTqk3AXUTJ1MgxvjlM+Dceu5RS3Bs+94bkauHij/JLPVZzgIFQT0EGWFJfWILs5Wcpr8/LMfXZXFRuvRXZnAiEiyg3ltZWw3T9PLZRUlRv9vwnn2zUJP12eS+gazVJX87/W0DXaozOGTkRY6bTT8Jesk0gXeS1a4Cx+InKf5dhcRInoK0HNRfJe9E+hXYTJ5+1RzUXCXrVRm7j38j4N1b+FL0sAiO9hRk0IncmKHHjyttymvZhObZ9kPfCfYrFTZxby1GtEb9XPqltdH7v3CZYXdi9dJtgdWH31m0C4MJb1sJWtKq1FXZH3ZXjfFEVBBiUE7c69AGUhyy5iD65ukLUIQ8RhI8ssah+uLqC1wm3tCT5RkC+ocniDOhRxrp5rnuKSBLtKhxcoCTcVVLYbCVNnGH2vFpO0I4tR7VjokHEEEH5yHJlaW8vWQOHs5TksoYMXTnN5wwWunKazxkmdOVWvvcw/x+hh0GgPpzlA+qdTvObdFxiWUFoXTRBvR6zhtC5UlbvrKsIncvkyWgds4gXEmCMxU+eiPYxDH8xoae3OtwIHW7sDpNk0NixDXCtYHyD0Ozuk4xzxq+itK6XFs4xJXOSDB2Xl8uJ2snl6HZygnHQiNWUzoXyXFuOa5cF4yJiRaV7gWB8ZFlT6V3EHydZVlV6F/HHS2PWVToXCcZNfUzfT7cjl1fe06e52Tzm5tGRwlzGx3IdJUx13gTZ0sFEsyXkh27E/STwtmHmuP0Og8BeZWQiDr8Uwsz6mGTX4MsDNUC/1jn8+93nK/fgeQO1je6tvs4uZRYlAvQ5bsIr85272Wnvvv8cYeBOYSJ3ajMAp9+8TZEEcWiaK/cC21FTdFOUo1201dVR4NKmgG6sSv0bVqd/K2sjM2FOUpRrmlcB+yQn+cJkhzCo3wReo3wy/20Krz4G9HOOKHCWgTyzoc+LlPtnyUM5zXc/mxsCkB51wxIGApuGYXF6DeP0KHSqGaSTyTiRTQUY4TFLgvkEjzWEAd69OR6vlYQgI7wYHdcQMcLH9TsRhAE61Z01g18rQWpd9hnUWglST6Exm5rFPp1mBA+8gypo5lT+BA12N4NnE8CB43XS4mQlICuI3BwN8TRfLh7vOHUTQlh9nOvlEGD1cK+TAKHv8ni/uP3ObMa6WpzsmjhtJU51To6OFOT+9/PsXpIWHT3twEqTlpqm89KmLQf5soiJCMPuxEorOm4icA0vzSyxE+uLvs2engyD+SgtOcln50lbTzuIHsB6/8w8aMn7/OXjnzqP5st1NSYpDxFaLR4fGElFokb7uiYgARrt6ZysFAl0rTOCmagtNUVnJV2jpci8BDqLe+zl7OHO06LQdxujtXQQ0XU1+CSCWOW3je60UobyvLcofzGOkQnMak4HdZ2YW1iQMycIT1sIMcM9I6W1CGQl/iYOvV2a/fCKRPm70NsUu13oHJzWSoPcd5G+2vngoK4U4lZrPkngHcL8JWWkVg8AeZSxUcxduNMbKcQ9po7HNDcqkKbCIki5FaqthugqDBmJa1QwTZhryp5r5pLCXJMevB3T4qwHHXI/LxhpXen6xFu3kwH09UNCedOuM/KWrk9svwF3jkY5UAP00+tuFrwtHrL/17v8cPWLiWVkDpHy/NefV64OAGLo4z2tVt7TbDn7xpiLAHrawXHsMVDTdNfxx1AO8E3kkeOPrbr0jpn+6aezQx8AeGwix/eyJxHEiqPEHIXqOcZB6WkBcnkCgO4Oju73epaiXOd631YCVM76aEsHEnd+EeesVn8gB/ictdeWDiDuYn/vnlmlCqJxmgekTWgfyOR61BagtzmwCu2AALrkH7xtlnuM3Z+AHnPY+ds8zZj4WoyxORXvJISZOkMYc5auFifrZtrTzRSr0HQBgEekvPTo/1W4F/RGCVCbo8GYbx0QBuXEO2AMRgA+nK4W7l9NbjBb1LMU4NYngpfdb7kbyHuczZ+8w3536WxEsEY5m0HGRMYn1Cjf8oXsFK4VaLzn1VSeVxbPJE1CkZcBEB7VCGOq8gPSRroL83KIcvG9ms4XztHySENB6zgg4C78ltFy8mJ5ifMx1o0KppXPwx3L9vSEA3fs2dMTDuUgKksPnCUeFGPxy9MJ3PLU6pWzTq0DCZBLVeDYhaAjx/nsItCR43xpAYAotBs/+4cMwEkJx/7KOvZXkrG/osf+ijv2V/jYXwnG/ooc+zvveTyJEJZ3VIrXl3fUGD3z33hgLQSZf4cM3t/QyKY4Op9deZYBPMb5U2cZypMOnEEK7sYuDT097sApEWdpj+v8NQHw7YD5E+Mg2LMM4jkfBduoIBrvMNiuFOIyjoNt6YbEq6tfXGFaAnJ4OdIIYSYnV046mMhLwbMSoF7/6oy7/hXkMNPwJISZrDSsdTCRXbo7Ygv7U5xufyiRQ4WAfZjloFEOqR9vnOuSloAcXjlohDCTUw5OOpjIS8Ozcki9vrxyxWkJyOGlYSOEmZw0POlgIrsudcQwm5c/Z2Wfunj6Olt99Vz7jEbW5z3Nfp9febfrP91f0PS0ONl1ubcrhbnN65WD2nPgbT3sYMKVh2ZkxjNoyft8901p4H606o+sYyu60j73z4f5esHYt98WIkzXqtvIEJ5z0TrrIGK5qBsF3uJhPf8yX7qjewDKw1dbPl+LKXYRp44b24ZykM8rE2iJKF+qidK7C6A8eOl9FlNsbnq35SCfU1+Q2sKrK0BNeV7Nl9XZx+7FoafFyY4P3lHiVNck6Er73PXnG5ODbsWqUUG0Y8GhGVWP9ufV9fWlW+ySSgJyzILd0Y8yBu8khbn1Umm5JFsvZnM8AEzf7/rDP//4aDbRmy/Mq3d3zoesYhDcywQXEXt1ILiX6870rpTken4c+UpArwC0Rxw5ft4N6GkHUS6My4HqEk/9ENtoBu7E2W8/lOP84CrisrUU5zr3Fz0tTtYtKhespSTXOSDaUI7zoys2W0txrqisW8p5VT4FqdIAcA/3V+F9sYXt7Y4ivNbjDq/lVquEa1DLYX59aKXu6lS4zV1nfhgE9tKt0SW3iJ60KNl8C5AEfmY2mOdhYmaiimkEoXBfnbxFyHUqxRa2t0nTWGRQEsa4eLxaPoDYvJi1sQOweRTbFz+TuZQI2Kdsc7gdUCOG2edSx2+4+gzYyXQozN65luJcQXvSkhP83Pl7u4Eap8tqXpdgc2FmcQcAe1S7xLhj4bMaptdZxK4GbT3mkHvb/CcPXkpxLntM04gRdlmy+IlylgN8b3b/5XHp/PFSV4pynY/T7kpxblCwuUFBcFmJ3NLiZOcIOT0tTmZnHZlzrmtRXSnOVYJ0UGQ6mGp0CARsrQbp6/Vy8el5PfdW7kueIIF22aZFIjIpARYP9wivIGGMi7d59x4Wd3KzGjTW8/HTf03jqUFjPfOf+TSeGkR78lrAtpzmM1vCjp52KL+zct5OiUFGeKWbf+kBgtitwozwcz6GGoPQXrIWydYa8fqBtpzm63b3UlwKGsgIL3kpaGEgvzIozuz5T2YV6shJPifjW2KSzcr2tpqk82ahPT3osHj4zE33kxTlstK7EqJMXjrXSpC6vGfGHB3KST4rNc5iks1LlZYao3+br79yYj5CAIsH+xnOeszBD4IPXha+pj/CgOfRJhAul2bZh7XCOiAQLuYStoERY+zq+zxVRHm44Rm0CagLZ45bCzFmEMah+fKMmzBnPeoQ7XZMtlbiVOcw2D0tSi6YqYyMdM1P/GaAqv/lsE0P4U2scx69TbC5qDCL/FjmUzFIp9hXOWOzKAYhvRJdbMVeZwjpZT5M8vMik1g1DMKJX5VrsYXNnmQPGSOcWFPrIWOE0zaL8mgrKOB9kM2TufoyQNh8OG9J+gDKw8SOYM6rBgjKpyn8rDfuMAbz4w458dHmwc+3LzxoKcW47MEfMerjTppOUpLL2W/QUWN0s64qCC5FcCjHSKkizNyjWmIQykvaNXYZlJOwTqsxdbp8GSXsgLsMyonzdQAEQD1cP63uKCkq6zViR43SU+640SgxKuPT6J4WIzM+ku5pIXITUJr3brIjJ/nStxQIaKwnayiFgGhP1gyqI6f5vNkUGSO9d0V5YhV7QAhz7I68BnfIsDtxl6YhCu0mqlLWGsUa/VAR5HsXqInKgRpdDtQE5UCNKgdqknKgyHIgWB8m14b5a7fUuu394+Pvz0+miePt8+8DaA/9wz7MmGNtEEP71YNM7jIOAqI9VcEsYAME4bPNM/7zGDHBdo743hdTbFa9aIkJ9ouv9Og7ytj8E4DwcD66tC8m2Ky6fdYSZPVS5EH6lrDxJwDkUW4nnz+sl4s5bzTZA5Ae36UDSow02pU1pMRIo11ZW18wksWVNZTt6i0OvFagB7B48AeXAGSEF3dYAWIsfpHMx1rHWC1RV29xUKHsEVSY2x3k+a/G5b+aJv+VPf/Nt+7Lh9k9vwi0CKhL+eY3ybN3pkejtzvIGvI+ZpwfvwnvY8b58RvvPgb1Y70mPylR6ulFt6AotBG4D/PFdkuMs9m9GdWPVZnCfJ3VJ6Augn6S7CGrfZ1hxmSf5BRfVGgaPelQRuKXtR99zDg/fvvRx5B+ueTNM0QZ5SZ7uJx+/1xeZ6ZZTAsjJbleGgcCtpGjfHaXS/S0/JEWNcZKkzCOEm7TUatROnP55qylya6HugzlVj7rfWyfgLrwx7bIqFZXpvltFQTBfIya66aRsVAHUQi3spE3f2A7NQTahbmTvwcgPKLgp2hdDsQQflmYZ1H4Gk5hCrDGODN3XoAYwq96dckdBgEQyKs8Rp03EmqkKJfV/p6UILU6k/bh8Y7dUA4QoM/zJ0G6nMUEmxNWpaWlyR+q2PUSgxpB+ET8B4io++eVmkZLkJUgzRWZ5kqe5sqS5sunx9WcFYuqLabY3NhHfQDlwfuWuK220Zk7pwYIq4+awEiNcCrfkAUiowoxwkf+TA3F5sbs1wYIm4806ezplmeFEj5JiaB8mE1XI4bYJvyd4H16R07yOT1FS0yyWb1FW43Ryy+A/DzPePhGbuWzVyEgyig31ioERBnlxlqghSiEmyTQFcAY58TbNg5zMMfqKy7uEWw4BvOrV5T55b4FQD2YC9JnLUrmjF5qIcZs8omf3R0E5sNvhKn2V/ql0JBBOF164cGPYrZLrSccBAXzpLbRRc1xDzLGi90Y9yBWL+aAa8ignDpFXfHdupxRjlO4kU7HYsNugM96ykH4RRKIwfy4gzJ8PMYeihGjMOYqTyMluazF8Laapu+OEvoO7ZHURPVMja5nSlj6lbX0myvqJVjmBB6iUG7s73d6ANSD9f3OSUlRed/vtNUYPU+ZLyVaYozN/dbmrIXJfzz+Pr8TRnyAKBY33lfRPQDlIYmjMGSQTrxRcyOm2NxR7VlN0cuRqYkFsvVN9Mw71md/BMzqXW1ZfygOmzATOrdRFl9ZoSC+yu9dIhgKQ5yRjswBMcQZ6cj/IIeAjfFmD8kBzBg/1pf7AITyigQPFJFPwRxfNmKKbTr0qRqSIcvmPE0z0idBrqvFF2abfFJiVE6+VzqMyMrvWggy14/LeXn4HftN1wBB+zBTuqOnHcqugxeuB4CM8SqyLEzMx4ex3PLMcnCuvhabzLzCjfBnvt6FKOPcyqThDPVR1BjfNI62714uLLl91ghnlaeZ3LOkjHDTPaZ558aJQoeRrK6X3vbFjxKhY00Z4TZJTbkcW0MmebiRz3ZuOuRNX4dldw6zLJWmaQUZ6aVnccf8ZRLHCjXC9yfz6x4QM8pP99nV5u0JTBvWGOejbqOivG6r5OYdHO3P+9y1q6cdeCOotpzmH4vsmCpz6MaLHneKHqaHon3LvVJ61KAkjg1khJe471cj+/4yroOwTTsxRjhJW2w1rsVuRcCSutWYMX7CVrOB2L3EfYIa1yeoadpmNbZtNhfuYn8vrWcVxO5VNwJStxpj98ujg9jMMEY48faIARC7V7Va7m03Ur8GRHvWw19zVNz2h8SzA6I9/w6zVGJl9LiDWZ6XtMInvcWBP4Wu5TQ/TtMf/EWOMwF3kaxv0GsbreMq2I1Pm2FxEvXvY+b11bxNFwnJ09QEm4tgXNQASA/RtzcQhXYzDy2pLG2GxancJie1OkHGeJVz60BuV3HGOJ5XpuWuZ5bFWbbe2kLQPlV0PFHu1Qi7j2xxpUuh3apWWNx6dDjjHGUtSRtD+3H3BvQJY1wE46L9uDFRnPqm66wqBjsBuxTcTTDHJ+f35YxVDwIi4+/H8gVTFEjew6Wsbz4TSBdxH6NG9TFqij5Gjetj1ER9jBrdx6gJ+xjl1McoeR+jxvQx7UjeRz9/URK3DsjmKVjLGLGOIZ7nj5jjK3n/rMb0z2qS/lmN7J/VRP2zGt0/q2n6ZzW2f55gXWbUmox4lWTECokSjzXUiLHGJGswI9dfuLHR22qIvl4+r9a8r40bKc5lt9UdOc7nfWV81tJk5gblHoD04H7z2wPQHszdZz0A7cHsVXoA2oPZavQAuAfr29tGSnL5b0UGCMjnjxn3pLCTEqNyXvb9gcZFNL+w5jG1EGTOl4vP372n2XL2rTo0kPuKFyONc839DSfiMwIa43npvaScCgFzrI6mNc64FR0jWV2ZxbqPsPrwupIBYpQPs2OBOeMcj2GYTeV6Yo1x5nY+MGeUI3MSBXNGOU5RJ8g+sHMlexMGRLG6cV8uARCrF69r6BGsLmapSGhjEKN8uB9KI6BxnhP0Cg1nnGN0nMIvOo5183y1ncbRkMa5TtB6NpxxjuXoIwrVFK4n1hjnSVpQNboFVRO1oGp0C2quNIV7KteGNcqZvciCkUa58rbAgJhxfrzJGsyxOpZjZv5yA86CnGXfoNq+PS1/z8Ly22ZuOPwhA3Uq01dm1EYgPrwvGYmvZ8tjkpiD9rMWJ/MGCWctRC43UApPfB8ycCfummFbDdONu/+Ds3B11uLkrc/lbn2cyhyJtcQ4mzfiOmtxMmdkdVJSVN4Iqq0m6Mz3kLa3jxPEyBoVH6u+iNtNd+Q4n9lBtsQgm3OEBXJ6hf5z880Mb/jQJ2AufDpGlURVoKMpcKOa4RHNWHEZkHgMZUPFXDQ7ayGy/mfQOsTP1//ingiIoihf9kbEHgD0YKUXllLlIpkkXFUPgHokaT7b5ZyX3x05xf8U7lhfa3b1qEMVLMjbRLnKuY/RYaBOgth49rh45RX5Rpmr/HjPtDgDEA/2chIdc6/8Nd2qIxNspAi32fxS7pnys9BneQwxo/xYx1hClLFuXpi8TuNoSKNceeeMgpjRfhM95gll8z0N18TZ2QJhnuyvrizfwcq/fh3zzSs7ZhARK0gaI8geG0gaE8geC2iSGEAjY/8IY/5YY/2IYvxYYvs0MTKDMDCzI69Q/j5k2/Q4pGMZm5C5IAtAMK96yMlbzO8BMA9hwlnTixuhkY5NuhfHJ9qPiEs0QfTTUZFP9+I4k/sRMSb3BzP/9PzgXwx+o4XIg6kRb2YPYsb58Q6YgzmEo0la0bOdADYP0fM0hDEuvOPzIAroxuhU4Pf8uiGIAuYa+lmLk3lr6GctRC6/ljl9gMEc/A4ZtJPUhXYQPgbxBKztFMgOCjPH09nCDNPcVkP0o5+p0Ntl6cHbFLsdp/MZIECfKlBVuYbKsGipCXocvobxaQEkCNk+PY7V0VzEHXUiIMKzvKgVdozt2QeN82Ru8URAozz/Kvw42kVhpibwPcMIbxNQjbk22SfYXMqbKrNf5nXmjHLkb3FBUaN8Cz04mdK8w7PdQVXLZDW1DwI9eY013kqzY+lTcfRFx8laTpLlx+enYvPXC87cF0EdOcSvN26Uu6Td8W01RBfFFrJEFFLSGbayz7DNJfwXH201Qee+9ujIMT53/k6friCPLzwmrrD8/IYxZzeIzm2wnNnAO68BO6uBf04DdUbDeXkjKDhT466edmD2Ej0A6NHKZd4Uv0+wuvAm+QPEKB/eNB/EwH7HY5qZMFnN0ibHbQCBvPirWNQa1uk31pChJQbZaXNqCIN9FoPscj8js/ttiSE2d08evhuP+50z/nXz6XNkVmC0ltjCrkPVqly3H3uRUYcEuPq54JTPttjC5r4jAxgjnDjvygDGCCfOyZ4AA3aSnETZlcP8cn5mBqyCNOszUCf2YxCnFrZ+FRQw+4mFvYv4SWUvXcKzCgcEwOX1I3vf+VkKcwV7CztqmM59h3+WklxuERoQrC6cAjQgWF3Y7/NhDO3HK659QM/Dv4q8L/OH+XJ27z3Mvs2d+H0xwF48acxyvlo5gxslRfUebvlgLQbY0dE1IEmj6tM2kZeHekC28QOvSN7MVtA8POgxsZ+5jZlI0gjXtyxN9noMt4+U68KFHYf5b+N0oyfyXnb5gefYAtg9LqUel3aPK6nHld3jo9Tjo93jF6nHL3aPa6nHtdXjRmhxY3X4p9Dhn1YH/6fQwv9p9dgchR6bo91D+hwb+3NspR5bu0cQCT2CyO4hfY7A/hxK+hzK+hw/Dwdhw24II1wuxS6XY1zkD3M56mkmeJxRz3Ml97ka4/NR7vNxjM8vcp9fxvhcy32uR/jIs2dM7sgzZ0zeyLNmTM7IM2ZMvvwqdvl1hMtvYpffRrjciF1uRrj8U+yCjpPKlRY946iCdgVRFm7z0zZrnitFxO6iDCcygfeQgznmmX8wmy2SkOd01mMO9VQuC/MiS3gmHYTFR+W+44I+SLC6pEehSToY64bq8upmvz2o6NX8w/vhtmcH0NsdvDDZej8vpUY1hvILwi3fRYspdrjdlHewiVPHLY84hvTTFx3U3vv5i8CsYYxyupnA6YZy+hHs+BZaPGRfXf8qKs19vd2BWZoRDOXHKM0dMcUWlWYEQ/qxSzPEGOV0M4HTDeXEKM0d8ZDtbfOs7FhddzX1tAD55c3bbrbmybL3Y+4M78oRfp59vDpdUhUJxTICOLCjLuTcp6mlMLcu1lx2S47wBWyKW4WKq9KNU4SGCNznlD8CnxYC8ElSYZntAzAPbilqizG26N4t9y3NbQhCeUlyHIIMveq28aUMHPer+3G/MMLiI7cZ5aJnMO+vjm9XMQjqVf/uvaRZ4vpuDIEMvZLI01dyq01XjdKZFaer7tNVcukFqecHbvHiWjqIaEYLzt+WdJQY1b1ktpUYNdNzRNc92X0xxlb+KxNslCD1p7d1/EC/pUOI0dWWRdQ6iLgPdUXx4+jvMCh3W+aplx/cDUAM7GfOekqjbajb1Djc5o5nKWMQzGsXhXHgHXOmSyOH+FEeHrxtetjoPzOr0QAB+WThrtwzYlqectGsXCpxPhXXwiKdTf+XJqHAryZALmqKMqHGlYki30rKeUfe42/CsPAOaaBbMPPpQei9+plzUDsM0veK0nrpVOk5ButUchgB+OwCT72kRVwuMTrumAH0gIMJJqmLotmlblK2vh/zJz8I3J+KxgH+5gpmCp6lCNd8DKT/Pwtca/vkxPNNlLBio1uOROXuZQwAAB5B4L2lWaCc2SfhkLlNj+886Fk5pAZ65MdOiY54yA5/HnXBcYVWqiFtF+VK12xeEnTEANt89n5Ik3yfHkLXajqQW/meOvhxLHSpIEOvvZ+/hNm1K72WDXk61TI/2Ye8hO+qAboygQfLHojH7+lBhyyM/Tx6DeN387GVezkHEEOff/nbdBO5oivVkBZvD/x62RED7FApL3/xk3ZpWjqbgBTKjZXBPfmQf4jiuNxFpseB7lMnCGDzyPVw3fnMVpQCuSWRrtveWxQ4HiPRFwPstOzJ+WVrAMA9WPndEcNs3UN4G1+P765kjwFxcEdTynkN95AAu5yGraKHGkBoL1Z7OACM8BCmH8ainVW4zcJc/pBtDuwYq5dol1/K8m4AobymsLI5HYpYPGzBOLCjaGQ+AOAe7LapEcPs4vJX2f13AJCHLvnJB3dyKQN4Omf4bXVbDLPN+oz/CwdcKQnqDZt6g1G5+dYWw2yTARys0eFE7mC/r4cdeNX9JISZ7HKGlLFUF7+kjLZhRunp5jVKC6UH6Tqfj6nSgyxXLysQuIekXNTizx8HgKHHMX1j5HOlGtIys6AjmNX19YhD3W2WF7Is2gDAIwyKbahTb+tOP0tJrpm/HmNfZNAwICcV/c3Ng5YWINdDCR66LcbYp8wp/8Fz6CBQH8EjYE+gtn6eM+rTSQcQy3Vz3r22tRA5l80IBwDYg3nr+H3/ld381GU/N4fdOncjXTVIZ44tzkqCesOm3mBU5tiiI4bZrH66EcJMXmk4CUHmT1lx+EmXB+6YnhjPd7pkXioDiKFPIVqQKSyrMYVoSlVY5lNvvEX+N3iVPzUBaJQyIXmP5hzAeFe+Y3WjI5Ce1/Yq8marh0vv02LtrdYG5WQD6DGHxcN6/mW+5OFrMcZ+/PRf89s1D11p++TNppzTmeXuxG2/c1eKcIutuvI2IQtcazFyvvvIR9dinH3D5d4ATLM/wvzkxWHizG2LB+zyYE5e7rWlCJeXex0tRublXleMs2+43EHuvfj6P1dlvNz3y48frr306JqHIMLqo0LHfhNG9H3Mjrm03D63jc1EO0zMnkO3Fh2D9LwC0/Lc3pq4JXfz1e1y8bRePD44OcEIyEfQtgfWtv18xbcnkcFJjvIfH+/nswcmvRJj7PnD87f5crae3/HwZz3mUEfWWfzv/G69cIzMg0EsXpLc6CAwn8XsWuLRyFE+Y7QQ0KOF5ueH5/t7HtgoMSpjDBKQY5Dzr7fruawGtwmYy5P+cT37dM8sn43cypc8SA+Cea3m//08f7ide7OH7zyjNgF3WUsM1hR7/eulJJ0aOcpnN0RU67P+/sSlaiVGfX5Y/DFfrmStWg+Ceq1v+UlTi3H25xvRIzR6zOGPxWohrGEdBOTzvP6qEevvupX9/FiPQtytIArp9vv8++JO4FPqIYciT5+qEx1/d/y2ZygH+J9mq8Wtd/v4oFN0phsv97QaEACX2/lyvfi8uNXDkKfH+8XtYu7uAzAgp+W9d7dYrb2nR9bT9PSAw93Xo5/5B+WMPgkJpue6kbYvhtiLpe68H5ffmdWupwcdVk/3s+/r+Z9rBr3RwuQ6JzjgWkpy3YNRAnrIYTUTVNuO2kbnFZo+werieMAIBEA8ik0cbbnJdBLDbO/p+ZNuWjnkWkpyuUnfktN8XqKf1Qh9tfjC4modTOQ2iSclQJ3fcu+0UYLUJ2MY5q4nXPXFMJtf5dtiC5tV6voAmwej5PX0oAO3QjZKispMGLo2nn9nJQlZF+d3i6fZcv2d1Qm1xRD7z/X84W5+Z4aW3vNq9oXhMEAAPuyozgEd1bn/80oEh0Zyi9XqWWslo4whAvB5mK9Xt7Onubd6+n126+zRlVv4CxF+AdEf1ws99p5/dieflAD1cf11vmQVmUYJUJ9+v105xqM8y1Aeq1k5S3Euo0FplAj1NxbxN4zGfvTfiCe/EXZlAGOEEzOxb2x9WnmRWfn7o2wmzYIBz6jLGOfET78hZ6QjNx0HGNSP/0zUU7DvG7nTU5foPc2Xi8c7BrxHgFzMQsd3XpFqpCj3v59n9wL2SQ7xl49/fi9XbKrMLgcSK85rRJSEulY3xzSqxBCbN2xFx6yCASs5WuUPValxqmBeQ85qpB2BtQ+QNf+2lp+9cEGtWixFK0dLy8rRUrxytByxcrSUrhwt7StHS8nK0ZJeOWr/zE6kNsDmwUyilh528J5WK0/PEmffVhyDlhzj89rFJbW+tpStry1t62tL0fra0rK+tvpTz6icqaUKozHeLNU6gPi80tOncmbmDD1LAa45BMqZaEQIy5vdf3lcsoiVlOSuBOAVSl6vl4tPz+s5E36So/znP5nk5z8xZjm0YoNPapSuB21Mslai1OU9E7q8J5i8uVtHTdE5bVlbTLEZ7VhLi5H5w/au3MpfCQ3QGslaYWqUFNWbP6yX3/nsSo85MLvVlhYju54l3BYSTEHdOakpOrvu1GKKza07lRYn//H4O2PTZluMsTkvxU5CjPnHjNmmaiHGZOcakWPc3BrmlPKrkHeH0PFzvY6yRw233pfPdRQR1/Mde1qCvIn2SXEwHy7twjg8sF16HMIx2MRsF60lyKWz+XqczW8IVhf1VyZ00QSri07OKmGFXg2HcNxnaXH09G+RemHbtSFWL+foTTDC6lPGuywyx5i1BIdwlJQ+utyZ7yxM+CIJvgRYPI7lUoDIpULAPrpk5EcvC7dpEJoPrGM/MyHdFMcQY8HOKjoc49DbHo4cr7PaRvd+ets0zYIo8fNQZtVBkb7S2gtgRvjtJTULJo1w5bYbA8gILzXZE6pRT1iGoJI8XQWgPZTn5/pCk835u8SrA7J5pok4JVsU0q1siXRKlCGWdP1hxRcehyTv45hGSV4GZBU4nyEjvIR14wwZ4WVKtL8z17RaKSV2h7Ej70ePdCYo2CBveAe8QX9bOGQKB+TWcfj5gqrD5BtU+qGDtAu093smOFORh97bw+yzM72lHZKr4TJjutUIMWb4V+HHPGopxbhJuOdRtRBl6kbWxLn3Dr76waS3EZhPFQmHZ1BpUXKxYWKLDcZkT8asczAz+GmXeN0+MGsnTgJcy2FJEr45m5yEQ+bxR/jOahEbIcAsG+M91Ct4m3dGj2MFYvdQBrtj5Utfb3dgzfVAyAgv3pwPwQz9THC3tGwTyiaBl4QgZOhV3wqjCT8rUWrZEnMHkxADdZKEqEcpqFs1rhWadSEjvYSJCcNwb+V+FsxAjdK7YW+ZJl0I6sUPQIkwAKdqLDxNESFYA+dqYefvq+tfPf/151UTMO83R1eUQzmyoreCBMrFfdTWFVNsMzmVP0WbYnMzgeDkbicK5VZ1Oe6NO4QY5VMPESawq0l21yDV3ajYsaJQbqfqcM23ahBjfH6T+5A1V14KsRIYXF1fX/6TO93vqxE6c+jcV/foJkbT/sVXL94vG8eVoa4U5eqmlYnVSpRaxpVickstSlZKhR+Z5FILkbVhzkzhRopyWSl8UqJUZgqftSiZmcJnLUA2K3C8BG6UGJWTvCchxuQl7lmKcXlJe5b2uNGVL43QBiMgH0EMMkCPOXDiafXFGJsR+aqnxciMiBo97YC8FcXEA/SYAy/Ft3SKB/JyGYwpl4EwlQJrKgWSyIFDOcpnRA7sizE2u9YG1lobyCMHYhCLlyQ3qMiBzUW8yIFDOcpn1bvAWu9YkQM7SozKaj8Dsv0MhJEDQQLmwoscOJRb+ZIHoSMHNpexIweCBNxlLTFYU2xe5MChHOWzGyKq9XGOHNhRYlRJ5EAMgnoxIgf2xTibFTkQ0GMO/MiBMALyEUcORCmkm3vkQEAPOMgi+4EEwEUa2Q9hQE6CyH6AHnBgRfZrCwmm8174vhhiCyL7AXrQgRfZr6eFyZyYO10pyXX/9gfQQw7s77MHahudV2gs32cPr3H8pAICIB6s77P7YpjN+USqKyW53KTHvzzuXcBLdPTL49Pvrp8GtXQwkdskIpH9zG+8yH4dJUhlRvbri2E2v8oTkf36P7NKnSWy3+ASRsmjI/tVV3ArJBbZr/MbM2Ho2siO7NcXQ2xuZL++GGLLIvvBCMCHHdmvL7awVyI4NJITRvaDEYCPILLfUG7hL0T4BURnRfbrKAEqL7JfRwlQGZH9zjKUx2pW0Mh+rR8ZDQoW2e/0228s4m8Yjf3ovxFP3gqWt0h2KdsD4Ix0ZCb8EGP3m+Lpxj3ZBE817omSKJjkqWrOSMcJnq7CYH6C6IwIY5wTPy2t0RmxK7lpaYvOeL6Q/0zUU7DvG7lTSXRGkAC58KIzdqUolxWdcSiH+JNEZyRJqCsjOmNfDLF5Uw903iGYdJAzDv50g5prCOam5MxU2tVZezlZB2fr29iLT9TK01K0+re0rP4txat/yxGrf0vp6t/Svvq3lKz+LenVP1F0Rghg82AmER6dsb6CG51xKMf4vHZxSa2RLmVrpEvbGulStEa6tKyRukdnbFQYjfH2Do7OaH5hRmfsSgGuc3TGkwhhMaIzdqUkdyUAr1AyKzrjUI7yHYMotoUYkxWdcaBG6a7RGTtKlLq8Z0KX9wSTN3ejojN2fue0ZUR0xs7PjHYMj87Y/MoftpPRGYcXrIQGaI1krRJi0Rk7vzGiMwJ6zIHZreLRGZtfXaMztoUEU1B3kOiMnd/ZdQeOztj5mVt3wOiMrV/dozP2xRib82ITic7Y/OQanbEtxJjsXCNyjJtbYE5l4bkZzDfuL3V7esLBFBaJQ60nHCR0iJyad7LMCVZHOyAr4e5xZd09PrjC42zPRSiYG2/ftaL3XSvxPmY1Yh9zLtiHnZP7sF+F31G8Wr+jeJW8RX6l3yK/it4iv5JvkX98SrMo2WudnlGu/sry9ZtbawkBRnjch4nYRjP6To/HMDHXhL5Kk1VuJHd+7rtZIRDS6w8/LhxjvUCAER7OKQczek5x+BrG5YfgSRq4fd7dlYJc/W82uNH2yS9eEMahYwSvRgXQUj/Wz5HtnYEn4ZC5y0Ln+zOaISlKlGvoxUY1pLnGVaokAKc4eFEeOm6cawuHzCzUVS58dU63kw4nej8cxxA97ZCs8sx8eu0KrWU93iH4xdvE6faHF+jmxkSdCN3iEEGAgcd1fYmvDnwfGNLzSquzclmjt562Rz7+2KrLK1OAMj+P0kR5/nYbHnPfNTQFBYI9TSSDvWMT3JXC3OMm9MJkm70fGWEyEQbg9Ju3KZKAkUonIcg8+pkKvZfQdy1JQznAvykfLAjLB3PGd9R9eqqL17u39bcvYdXRBK6jBRhB+rj2CQM1RVdhzodrsYXtHfzjUQ+IRB4nCOxVtifcRGrEBNu18+tpYbIZoZTBQZn0tp5w4KZLIybYBz/fvrDhpbpHN1HxvF2a/fCKRPm7ULchu11oBtS6nTJtrFukJDuu788++yIjzr4wv+l/+yYiCKdVAvSEw7F6A+3l+umVfvgD22tAIlzV/1/auWUpCgNh+H12Mm+jjivpBeRgjMKRJhkSbNrVTypchKSiXcUzfN+vAjEXTqq6Nv73/mKHTYKXGQ+1wf9QiJu3T9GKTK0Psfuz/yuuhStVewzbtVH1iCKbAxubbciY8Ky/8Zd+36rzlpCVI5vkT9jDmVuSVo5skpWFcxsvzsqRT/rXbgoZ8chvfX+XPX8Xwzk3e/4ONcQpZbHbNnxBDWkK7IW2NQdzpElHeP19YxLmiJP8MaUMfSf+JYg5ybMjM5WzCeNanhFIxNoZsq4zqQc63lQRMIiJ2sEamdTEmLGZKcRmhdWtU+SvOYOpk9pVHRDUI5qurhmywCFG4j7mA5J6jCbfXx5BPaw7Y+LyRqF6rtSjiLcjTkeNTGqijiQHBPWEgc2layRDOLOIuawu9M8IEOLS9GcVmNR0hyl2qipAqYu8H/TIRCYHd0uYnCBWTFiCkfM+9QmYq2oIjySwV9Vi+I37Y5P8442d+pAjfJxwEAUMWCra/8ETQ3y1I7tql3pOUjeWagpQ6pJG12RXgBBXW8Pe3mdq0Zc1inup/1dPDPe1YbGOoxxI1Hpm+JD7xPfnfEfWH6PqZjB1qt6JW0cVDlRq83+OtlTWcT7kkk3N1dlQhR5BPM1Fk0WewUxldYLtXptv+kdbsKkZ2onOFlfy0zKDqbMpPqGgSWNdW1SNIz/aMY8kWFEVR1FXltyaLVDMK6m9+ZlKbVpaA0tN/mYjX7UlmzE3WpZK3ljmkU3NRlZUoUcQz3x/CKPaSpObpUSAZIwrDvw7LTVkU8bVDG7EhKd+y2kmLN5OWF5vweZ6C7ZvFPlxCFDsMoWyQp7ktHRJk8Y0bnftYT8vjYbpGMuJQTRoHmdVYEWiVv7v8+q3gSHWmEp+PwI1ZFOmH46fsjBEKf2WIgj96xoI42Hf3FBLe6zIrBXqIIXKXqxyQy882USzMzsosGP2zKin4H3GYWvGIZ9xgBPCujL3wiwV2ZyhMhCUAGCmPAU/yKAXV8tafpJmP+H1NQOFqonFp9/r8vnEEogrMmt1ml5yL6FxO29hsX9d/2Q8bCWscnWSddFnOHbDK/Xn6gpjmbAYW9RX3VaupI1U85oXeXffLbt8099jyjiwJNNCHaGwcGutYOzel7VgaXCGdH1ojiwjZ83nEuAzQGPkel7Ck0cSYJIl/Dn4M0pFT4h4PMEfCKVE6U9hyuMJtdY368doNyXOfsAGA0JOEKLB84YRJ7VhXLO/f/0H471n2grTBAA= + H4sICFTEjF4C/2JvcmluZ3NzbF9wcmVmaXhfc3ltYm9scy5oAKy9XXPbSJK2fb6/QvHsyfNETOxacqtb857REm1zW5a0JNXb3hMESIAUxiDARgGS1b/+rQJAEB+ZWahMREzMjEXc1w3UdxUKWf/5nxf7MAkzPw+Di8178w9vk2ZRslcq9o5ZuIt+ei+hH4TZf6iXizS5+FT+ulrdX2zTwyHK/7+L33Yfrm5uLsN//hpeX+4ub3776O+2u483vwQfrna/3Vxtfrn556+/bf1/+8//vLhNj+9ZtH/JL/7v9v9dXH24vPnHxZc03cfhxSLZ/oe+xFz1FGaHSKlI2+XpRaHCf2iz4/s/Lg5pEO30//pJ8J9pdhFEKs+iTZGHF/lLpC5Uusvf/Cy82Okf/eTdsI5FdkxVePEW5fr+s/J/0yK/2IXhhZa8hFloHj7zE50O/7g4ZulrFOgUyV/8XP9XeOFv0tfQkLbNvSdpHm1DcxeV7/F8v6efjsfQzy6i5MKPY6OMQnV6uvXX+cXq8fP6f2bL+cVidfG0fPxjcTe/u/g/s5X+9/+5mD3clRfNntdfH5cXd4vV7f1s8W11Mbu/v9Cq5exhvZivDOt/FuuvF8v5l9lSSx61SvPO7Ifb++e7xcOXUrj49nS/0C5nwMXjZ8P4Nl/eftV/mX1a3C/W30v7z4v1w3y1+g/NuHh4vJj/MX9YX6y+Gk7rzj7NL+4Xs0/384vP+l+zh+8Gt3qa3y5m9//Q972c367/oRGn/6cvun18WM3/+1nj9DUXd7Nvsy/mRkr16Z/lg32drVeP2nepH2/1fL82j/F5+fjt4v5xZe784nk11x6z9cyodRrqW179Q+vm+gaX5r5n+j+368Xjg+FpgbZeL2fmPh7mX+4XX+YPt3OjfSwF68elvvZ5VWv+cTFbLlbG9PF5bdSPhlkW4ceHh3l5TZX6Jj30vZR3MV/qhPg2K8Gfu7nxH/9mxJ8el5qpa483u7vznpbzz4s/L46+ykN1kb+lF7roJXm0i8JM6cKjC3+ahDoTclPEdKE+KPMHA4pyU1lNiUt3Fwd/m6UX4c+jn5SFUP8nytWFn+2Lg+api02oxWFppCvvf/zbvwe6YicheDv/1//Hxeb/gT95C/3oy+oCktG+8MK/+Pd/v/DMf23+rVF9WT7dep8Wj97O0y0NfCPnP1Z/+EdP9f+GNBXmLF6t6xHv1vcrbxtHOg29Q6jbjcAJPJRDfC4YJ6owew0zNrgjh/imCfU2xW6nSynbBYAAXq+X3pUwB4YIzEdiQJNlOTJEwD7idBqRSntdUfLoEJoulOHQksP8F92pxqHEokuAXfhJRKWNOJdH5LFpqKIkyiM/Pj2iFxR1V8CyxHm9O5gvl16c+oFnWGbgpQeJTpYQoOfx+DR/ML+aW3JuyPviHvtp/s3Lwtp+pUc3pgt34UMAzGMTpXKfHgTwesv0QEBkNCCgLtJHAik9N/PL7eJJD8i8IFTbLDo6F2wYgfuYJskvdGeURAHXqM2gnTZmYCZwMXraYRsd9aRG+jRnCu0WRPtQ5VK3M4V2k7nY6D9+eol/CCUWNcLuI3uSikC7HPyfnu5NlKD+9DAWvyiZxO+Mof2kWWXPp2O2k2ZUjaB9st1W/DQnBu306seFyKYEWDzkZcCa/5HyfN1Bcj1qOcnfxOn2R90MCnzaGNxP5XrQ6meBqBh0IJDX47cnzw8Cb5sejllYrldxBqsWFua8y8IQuFzxvDEa5q6L1Qdm6nbkBH+6h0NglHcU8K2igCKLEg1Ns/Wfpvh88LYvvm7wt2GWu3sMGbjT5QROl6Ocyp872efHe64lCKO8qxn87YxveCIQLuHPPPMnSNABiPBU1fOzrWo94rB9CXUzfcyiV/MG5Ef4zvIZUDC3anCtH3qfpcWR59VlYE5x6GetBFY8rz6FdOtnqsRzwCKdD2kQCsyMnOSn5VRS8jw1AXEJE38Th166VUfTmx/jKOG1HBCI9jz+pdP6GGaReWHgqWif+LHEGuLRd2CuCesGz6xE6fs+HJXkHmAifRd5rExxS5IwZvWpGAlx3cWFejm1TbyH7SIwHz1c4tG1EGGWYyKTuNEu2uoGj8XvQ0gvYZPSh1BeRz/zD3yXUk7yq06C29P0GLhTVfpVbl7/MY1aCMqnKeredsO3alMot7L3U3yfSk85nMZBXhypnG/UwRB++u9+Eee65Cj1JkrDAcnF1StUmAV+7k9n3yCJ+wh/eiLTWk87JOGbHi8F4U+JTQMhvaYYAYEkwjVKdqm39eN4429/sB07FMJNtzpxupf79TiEo1mJLJsiUYXsUCxuxyzNU/6CFkaiXHU+T+TaJ1Gu3HHzSUywJWPmlp5w+KuIzO6NlyIP0jd+gnUxhF/5as5/Ya0/DhCETz2k01VDzytleTREEb6cd++AnnKIlW7Y9IXbH1ULwC8eQxThq2tCtHuXt1k9jt0xCI/5i9SuhNi9RAWlxUCcyhf49WVxuvX5tRskIa5JqCdy+eHoLVe8pa02APV4Y6LfEGIWHtLXULR01UUgPuZXz99udQFhmbT0dgdvn6aB1KaEjPDKwiTcp3nEnV4iLMq5aiN3RRzzHc8M0mnjvUTMwWEbQHqkej61FRSLGjDCQ1gw2pQxbpMUDQBGeZczujJvVfS3wLbLsTmWV29kbhXD5mQmN1KnimFzqts1qVmDofxklcxWw8zO/1DAr/SUQ1IcNpyX0F095aAmKtdqdLlWE5RrNapcqwnKtRpVrtU05VqNLdf1QFtQ9k4E1CX/UO/R9o5pyu0QuxDKq1zo4LuUcpJ/Wo1TApOGQTmdpgiy1VcYhfteylLw0paC+oIie2W3do3e7sBf5OlDKC/+Kv9ZTvFVtPfjvSC5asAID2GCtSmU2wTvxwAO5ThZTbp0qUmentunb16R/EjSN7Pr4lgvp7EzEyeSdzGF72gnFcZmNMzuvfoYwq/a2MI3qvU2B1GJGVdSyoumWFrCYJR3+WbATwL2npUBhXYTvuNTI9/xqfMWdEm71mZQTvJ3fWrsu77WheIq0MFQfkWWmSvNcE9k2OWQjrrWHOqCLPBrUQi3ad6dKod3p2r6d6eK8+60LapbjaOfvyjxHbRhlHeqyq5FN/fl+wVByvdJhGvoZ/F7+cK33mzDHogAKMo3uLq+vvyn3LTLoRwF78WV9b24uWLnxyo0m8SyeoQSBl4dI6HszNnWNjBxT/ss9LVWmsxdDOEX7RPdxZsx6eVHz7z922d+wB81wDjKX/zmXo18c68menOvRr+5V5O8uVcj39yryd7cK4c396drVaiHULvM35tNjyLXDolynWS/gHLYL6Ak+wUUvV+g/FlNUDTbkJFenp/tJ/EzIMIzMa+rq4SWz7Yg2Chv5fnBq9l1qcJgmhvoEYm7KHclZ6E6poniF6MOhXIT7D9R1v0nqvzGr9nvz/6cCkVRvupHMwWQVhiAZXGuYxVM4txjUc51NCe2W6UnHP4qoq00G1sM2km6b0mN3bek5PuW1Jh9S9VFuVlOSBM9sFYv/tX1r166a09WlcDfhibvq57U6OmFbjiKQyi4jz6K8lW+LuXK/G9Y3aR4ZIsjifs49RDnzfaSlh+kke6T7GZTLrvZ2heb1aY0yXV/JfY9o0b4mvYteAlFu+oIHnUH0OcvsiE4jrTcR5TszZeLaaYngIcyrqAS3QTAo+4gy49mlLKL4lDg26ZQbnkWbadZvhyiCN96D6T5sl3agQ1RpK+sZNtLcvdlkbj1hHG0vxnnVsMU80WzaLIA0pzcxYMuHDniPnI/L9QkKdCQRrsKOqw+yO553lQ8gW8H5uKtpnNWdt/CrNnphk5qeuJQjrrrCF74RqXcyp+gsnQ5FsdwK3wmA7B46GGfyELr7Q7TJFwbRHlmhaCbLNUEXfgayvr+qZ4MTDXAgXF2f/5XBmrcVwaFWXHZsRwqKcbVjcVTtfTxO/M1dhcxysebrR4uJzArOeMczdBxCkfDIRyXq9kEydmhjHWTJeoQNdpXlLRDFOEr/eS9xxjnJEvXPmikZ7UvRJSyMG6k/2TOFk8zp64ib+fv3kvEfHcDkgDXOvJl+9Xz1j+aOYizLY4ifFmxINpikp0evM17zphmDxGETxXKgRecDWDYnASLRwjH5ih7SYKjbL7HUJqihjDGpV1BldyygxvlXy0gT+BcgWyeEy7HjeTa7qiaGMrcKwbtxN7FAjDsTvwoDxjI4snYBt2VW/gHczxExtrgCWMsfuXr3G0as7cUUDCLd71WEUe7sNxkyOqMbUDrPRxCoechHOHBWTMFGBanKTLRnncvvpqkUe1xLI7CBuyMIHwiVb3hE43P2hDCi/MFektLkMvPHwQNVa23O4jHST0O7SjuWdSonkVN2Soqt1bx/DpG5Ggt50ra8il7y6cmaPnUqJZPvaRFHHgb8yFqso9DMznjWwIwwjtPhTOgE2CEh7dLM2nxAFiEM3MNsCsH+MzwFWjUCml0YXtkYWlUYXtEYVlEX1s0X/O7WRipv3IqNv8Kt7kyxUFPIRjL/hYedAexudKc0lEfB+Pu2SeMcfHidAqrEoP6lcsY9Zq66fvjnOk4BKGe+fsxlKVkizDGRZKSfQzgV23weYnck65RQtRyv1QZj9ede9ZCZHEU6TERpJl3jt2zOEL0mOjQgvjMZGxmWVxmW0xmbvAcPGbOtsjzlywt9i9lUPc4ZLxDABiAUxDG4d6c7epts7BckfZjM3BxnwOgJMg1Lc9f07O3H+4P1hZDbD124H6i2dIC5Gr5vNnAv81/msCbYXmYppkAO9vZgOg9lEv41ZiGkVMAA3KaIsr4yAjj08b2do3rPU1M77HxvMMs0wNoybFlAwLk8vOYZuVuHtNxHnS9zCJGqHYYA/ix3hYhb4maI6bNLqjyZBxn8hAB+uQf2pEIGFVpiMB82u8ZzZhG8bwGGNRP0FWPiIBenXRz/q6oiYvGTEMQhfnK3nqNetsliO5ORnaf6L3W6PdZ5wv724UkpgMW5lx/spOFfxW6/dWtMSemEkrCXcWb+REO6jjdWzv3t3X7MjIPM3poWwyzTzsXOOiTFiFL9sj09JhDtSd+88481A5g0E7cPLfs3pecZkCfZDDBKQajTjBoXZTp4Xt6kNhUBMyljj/C3PgxRNh8zuduyczOHIujHpb5idivoeBuryFnKNwWk2zWoXFdOcI/BSjhvkcAGIhTazZlAkkw82RAwdzM2J/nYJQYlfl+jN5x0frV+/P6wz+91fpxOS83wUXBT4kZgMP9+Ts9RuzwqE/fOChPFUczV2KatAiIy45XD3dYDdR/idRLyKTWYoQti1Qy5nyR8ppXXl+odQixmS16ccirxx0C4iKLczLmdJJpTiYZeyrJNCeSjD2NhH0SCXEKSRWQ+jTt9PL0R5h4G13nzaoHexZoQSL3wV2lpk9BKTdZneaLzPCvAMPmJBnc9yGUl6gx6xBIlyKOJ0nAHojyLINE5Hq8q8qVuLLkKL4ziKP8yzMZ8yILz7N9vjsAQ72rmiIYw3cRmA//gL2uHOO3dvrzHFqAER68rZAgBXETxiMZdYZSGbN/E6UsuhFiTH5sE+t5TM0FyixRJduQb3EiYC7MoWCGjgVVuDWV8ny8hVn1kgxoKSB6D9UCeieAAtMcIKGu1bIif0WiQ6BdzJeu3JamiyB92LPqs9zKL18+CE1KBurEX0+hVzPVi5+ZpVXBYloXgfoIWkhL2wj0o14Q7UPmdALHOfibmQ+/UBBAh3vgl3wEhnmLIsXsR0SJaX2U4O9DT/1g7PkGGJiT7NX3EEH4FEn0F3Mh/izH+a3gHc07Pq4ZxBrlzK4HQwziJw0kP+58QvHZhCPOJZSeSWg/j7B1BXOL5YCAu7B7LXrF4407Gn7DR8NvzHHkGzqOfNMtZygbAHcRgE+UtBbLnS06apjeikjNwbfkMD9KIhbY6CCi8gLdbLgTKx1MNF78RZU+APaoBoIceKVEqEBPXsdBZFnhONhfGh18iEB8OguKgu03BAtwNoOy4hhw1vTOUoAbR5vMz955laMthtjmBNnz+2nWvBJgYE7V9rxqy7riGXUQgM/B30fbZoGrifmYu9cmlAS6mojjfuyluvaxFlEGBMBFdIav5fxezpeT8BeTSXHorm645/QQAfgcw9B9cGdEIKvMZQau1EHEv8wmAj0wMvHnq7Yy1hnMeHeGkiDXLN2aYwnLtexjqnLBZnKCBTu/RkFYXc0afwwIgEsVF1pXleZWvF0c7V9y1ltJkoa5l8uQcfgaxjy/sx5zqMZ5AosWAPDIOM1TBrdIkiOE6RODW7+yayfAAJ1Uf5fJvzjfrCAcwLGO/Hze2OvsNSCALuYEDH0jcfW9GMOkCwA9ql4xC1kfxnTlIJ99pil5nqn0LFP7OablFawXNY0So8rPcxx9Kmp54Rv7Kd7Qp7jk5+ollavs81Xps1XF56qOOFO1vAT6VIxnBpEwV94+DvIEV9HprZaTW+Wnto45sXWK01rHndQ60Smto09oVYKd64rcuV4eYFp+OFcu1LKeoQPAPASnutpPdDVXMNs8D23x2IdV0me1ys8wHXN+qfQ0UftJohOcIjrqBNHyourrYkER7RAwF9EJnmNO75zoJMfRpziWFya7NNuG5UpfuWyl/D0vDUES5srchU1HJ1K8vcMK2zs84UmITqcgyk9AHHP6obnmX8GPy0vvLc1++FlaJLy060MQL9le4DHnHU5z1uHYcw6nOeNw7PmG05xtOPZcQ/aZhsR5huKzDEecYzjJGYYjzy8sL8sLHj4vEKLsg98x5wBKzgCkz/+b6Oy/0ef+TXXm3/jz/qY662/8OX+SM/7o8/2kZ/vZz/VrrhBv6kZJuKtkX9qoUwSFJwhaTw+sLjiveLLb4z4E9Zr8lEL2CYWKufdXoXt/lWCnpSJ3Wk50pt7o8/TKC1/CoPWWQ1+8i3gdHUhCXQX1yVKTJgwr4Hwu35Rn8rmdxyc/i2/MOXzVwXncuTE1J57gZL/Rp/pNeO6d05l3rTO8XsxbU9bOWwhCe4l3diqnnZ1qmp2dauzOzilOWBt3uprgZDXyVLUpTlQbd5qa6CQ1yylqkhPU6NPTJjk5beSpaeVlw+9Oec0pBMI8Wae0USe0CU5nI09mE5+KNuJENCXefaxG7D5WzP28Ct3Pyx/XEGMaXn+L9bXm79xAtm2xhc0LXzsgAC55avYdCPeRQRDAS3h6nvXkvClOzRt3Yt4Up+WNOylPfkremBPyJjodb/TJeBOdijf6RDzpaXj2k/AmOQVv5Al4k5w+N/LkuWlOnRt74hx3/RxfMX/zGbdrRBDL7PdzhxnVkPZ69fG02sJb6BsAYA8+nKLWC6R8eAfQ81jfrwRJM1ADdCYW5fGTY6AG6G9R/uJtit1Ol3KuB8AYOr1eepeylB8SEBcBnuSKcmJIAF2uxGl0NSKNriR4kitNo6sRaSRNIXv6sNEEU5oyVLoEV1H7gBknek9Lk533VAH6nkN0FbDvvaelyc73Duh7DnrYcbv8/rR+9D49f/48X5brFd42PerRYpFsndwsrFHOJuT4VM4Ny+YchOGxvE+ZaYOx+ZmAhUkRxzK7E8XqVhyERsXB5nEs1IvMxBBsLsrxDAcIYPNwD0MMI4Y+q+X6SSsf1/PbtamM+v9+XtzP2aXBxnO4A/cSQqDG+3JKDcUCnM0m4cXT16YxOhxZrQvGIR3N5vc8FFhVANqjOEoMiiNJ138PBHgjJ/nsoj9E0D6MAt5Rk3RWMe7KST6rSerrhw5ljN6H2be5rGogGLsfd4yBcayO7LEFxqEc2WMKAEH5cKpoV03SXY+NGagpuuvn3n2xhc1qWoYEyuWYHoVpdCKQLowGpqum6OUmf3Hlb1NIN9eQhQM1Qp+gio+q3aKCZSlTjH7qpEOIogJqKZvqJdrx8rJUIlRWb3dW9qiz21s99/Xu5qvb5eKpHDE6JwfCsDs5hkoBCXYX11YURvR95ivv9tvs1o1ciwDWdrP1wmSbvTseDtzTQuTd5vLqhg/vyCF+non4HTnAD0IeuNYBxHC7Yd9uSwuRuVSUmMpyL7XlnirPCSl/df4uEdAjDrU/26GlBxyK5C3zjyz4WUpyvaMfBI5bEkEC4MK+d+LOpfdtuevVw6U3e/ju3H6fdRDx02LtrdZGWZ0P7M7uEywu7h0dALB47MuvjXORTc2wOAlNrHznbnSotzi4Ll8CeruDODcUkRvfnmRFq6OnHVhP0VLTdF5mt+Ug//Hxfj574N17o4XI84fnb/PlbD2/YyZ9D2Dx2HNKaldvcYhkBtZUYmVwV29xUMI0UtY0ylPv04PIoyRALp8lRfUzXVa/zB+0/f3if+d364Wes/vBv9w9AMgYL2bHCmLG+PEqI0QZ48bJrCFjjBOr+gCQMV7HzHXTHI4Z48equABkpBdnA7SFRTiL+uchw+4kKJNkX929RlIe6T57MbsWpVlXTztw0qqtpumsNOrIQf7Dev7FvPY8HBn0s5hiu77E7IspNjNXW2qKzhootcQUOxKgI5LMKylnMcVWkhRRdIqYFrDQrfyvv4gsagblxBx6deQQ/+H5/p5ZJBspyuUUmFqIMllF5aSEqI+f/mt+uzbhAF0/NRjKCT4vjVtigs1J50ZKcFlpfdaC5Nv1vJnZP9zNP/NuHqBY3VgdRp9gdWF1HX2C1YVZmvoIq484c0bkC6+U9QhWF1Y30CdALk/6x/Xs0/1clDUQZYwbJ4OGjDFOrGwCIKSXNPXs6SZLMVtaCVPJnj7O4QQAPeSwmv/38/zhds5+zdADkB4iPsZeC259Td11VXKr5PODgMHvEawu2zj0E04/AlGsbqwpQ59AuLD6XbrHPf3quputLybYzoE1+2KKLcjbgMxRXvNp6XPOb8U+yJKlIdAunv7NL2IT0VH9kJh1QIRnHCZ7x1gOQ7mVzxuCDBCED6vzoXvm+lfmkmhbbaN74U+ZgQaM8PB2R7GNZhBOkmym89ecHiBBf6DZ3ubde1jcSRxqhMVnkvqtxtfv/qWer7aT+RoY4Z2n3vP68w3brtZTDqwhYUtsYYualRMA8lj/einqtrp62oEzLmyraTorhTpykC95J7qm34nyX4RSbz8lrzzp95zlr0G02zHBRopymcWPelPKfj1KvBPlvwil3n5KXnnS7zn5LzepN5ri15gj3l2Wl+iWdx8mYebH0d9hYMJfMr2GINDz+9OcN1c6KVEqs3yfpCiXNXM8KVEqr4TXSpSq2PeqiHs1h8vwsZcQ9/lh8cd8uRK+OYcoY9w4TdaQMcaJlc0ABPRa3/I7uJaYYjO7uY6c5B+OZcxdLxeYNAzKiVnCWmqKHgnuPyLvm1eCzmKKzewQO3KKz2qOWmILm905Dhmw0+cbWfPUBVg8eEWoJbfwmQWprYcc/lisFtL3QkOG3YmTXH2C3YWVaAME5BNE+1AxnqHSQcRq+JXrmaiJzO5O7upJh9ePAvzrR5ide+nG+fTVnhYiR3l4MPGE3LknJUV1jg40UJN0zkJeS4yzmcWvJcbZBfumC/yOzVle7EysxBSb13K11RQ9ugr4cC2m2Kw2qiVG2YIkIdODnxhUSpioW/y6WKtJOrsuVmKUneg/CxLlJMf57AJClY6jz5kZNFKUa07EYHKNlOR62/yngG3kKL9IBClSiVE2I8p7XwyxD5s6EDfvHXNHTvIToUGCOVS9vs6cvxktVUsMsfX05hDl0WvIbAi7etqBVUU7cpBf5F6YMt4C1UKMyR2nnbUQOff3V6zPKGshxtRliMfUQpAZHo5xGZ6aVSw6cpLPKhRtdZ/+vP6qlevv3uLh8+MpIoX7U6CYUX6uOYxARnk5pyBGQd1+n39f3EnS8AyweLDT7SS38Plp1eh7Dp9mq8Wtd/v4oGfCs8XDmlHWYITVxzGtIIDVwzW9QELfZfHo+cdjeb5rFIfOx0cBesChOax0m2exM7+jhuhx6GfeLvb3yp191qLkLMyzdxG/RYBcTGS7xBwUVV7n7tHVQw6sZEdSW/+5XP8oz4fMwr8K12k9SqHcygMEvH3hZ36ShyHfsAfCPE2Rdl3q7YsBdpCejnN3Jp+lADdMd85ArQFIJlSg++aXjhKixq6x7RoVRMsYJQBqx+s/e34cs3hGCDDLTZKuWzrbQoTpeLDUWYbxjjzeEeFFSZSziEaIMA9mlY6blicxwT46DtZ7WoRsAgDq6uC4+XKgRuiSHqmnJx1046wcD6KBAIgH62Szvhhms5IFSouX8GdQHNyrSa0DiCZfE/daUslAXs7r309CgGnKdnnGb8JIybYYZOcvvAa8UWJU5wFyS4gxy3in7h+xAnrSgZOBHTVFD/TYKkvf+QY1gPJgVbqOmqIfCwndqCl65npE+kBN0d0PzBrKEX7KHKm1tACZU43gGmT6sU2Uekc/yjjIRoywuUPplhYhM0ZalQzjuZ5O1xZizCOPeER4puHeFDsWtNYiZJVuf4S8bKqkIPcnh/gTZBWHTZjx2oGWFiebSqw7RC68lgN87jQVn6EeU/dipTUQyezWci9OlQzi5RmvozwJISZnWnqEZ6WsTgrpm1hFESmD5RKLr5JLFrBUYlT2mmFHDdIVo8EoVRDtTXCnb9R9KnYfpIgeSHH6HwX3PorX9yis5zEHJx4YOK0Cacy+QeE9QzkkjlPFeOiTEqPqHPNeUpWzStKAQLmY2dnR9QwFkEC5yBwIOmvFRuGrX4q3+qWw1a/yB9b6SaPEqEce8ojwWGtqCl9TU/XaFWek19IS5DDdmeWfIkvYBmcE4pO4brxqCxFms2TFK2dnOclXx3Ab+bHAoiaQLrxJZ0+POLDX7RS9btfMdusjet032aAUyO0lLeLA0xNMdo70CbgLr1CdtRSZ88qwLcbZzELUEoPsqgDoCxjoRguRE+aM4yQEmHmouB3FWQpwi6NOfPc7rWQA75W1ovqKrKa+spPylUjLN+5k9Q2frfKKKFY2q3aD8zKwUaJU9gSkK+/zH7xP94uHuyr0TvIauo7nhnrCwb2Q9cQEO5LdfGS7d+dVza52SL5d/+mFjofynWUwj5PAJx1MdP2Y+CyDeYxkrGUwT+V+xrrDUjhkfpk/3H4qtwy5Qs9KjKrc07IRDpnfHh/W5ZM4b1Xuiwk2p0B1xASbURTaWppsWiOVO4cHQCkWt12aeYc0KOJCifxaHMKRUZDaWprsxWZhJJAY1Iihj79RXqS8tzRz5rekADdw5wUwh3dztQ4gqu3VJnHmlaohbRMlDFqlAmj6z5E7rVRhNM5RW30xxj76TO7Rh5nbzYZ/v2cxyA7CLQOqVSDtxXUn0EkF0uKQ/9iNFiQfjhGDqVVDWrn11RVWihCW85FXbSHG5HSQZyVAdd0s9ADEmKn+yGrJTjqAyBhmwKOLbVokpo948/4Os9SkrnIHDxBDH12ZGK1lpQJo0aszKnoFOaycOekAYuFcZobfLes/hsmLn2zDwDtEcWzeSftlm5xFBz+O8vdyRcLVaAwTuJO/Cj/mD+F6coD/0znFtGTI4dR+uN7vsvSgR35Jvk8PYfbuDu3Ih/z91rnAaQnAOQVFMFkYeu7d0gAAeeRettt+vL76tb7q8vrjr+5GEAV2KxyPCjnLYB6nfp90Q6LuxhntWKUa0txfCD2A74IezHBcN7yc2chZCVKTcO+bz0QZ2JMU5Kbu04RKBdMSzg1qFUg7pm9XDJyRwTxm/WxJCe7O102rWaAWGLQYoBOnEqEzRP2DGSkweEY25MUho0qWIoBVnnPvDCtVGO2Sh7sc8g5+pl50d+q+A6irhcjqB2v01wgBZhpwVgNqGcrz/ioix1gJfTHMZoxEahnKuyoHAkxqJUbZEvQIMn/IB1MsbpwWZgCAPcr3CYr1GLWU5Hqb2HzREQj4JwTtkwYijxSrU7w276ykqJd87CXJ5bcCHQDlIbWgHA5FzAFrGcoTTFmGBNiFMzA66WCi+ivjALUM5eVMIFKOVbFhAYsNyuMXrEYMs7mNKNJ2HiPGwKpSATRGiQdLuy6nrOesdUMi4+UX+M4rSXRaOpOMCGGx6ttZCVCLA2uQd9LhRFaWdMQI+11PS1hcIxwyGRNFcJZ49E2XasbSXpGY8F7u/T+AAHxEK362tT33GL4nEcJy3jJ71gFEFRZB6mW++86MlpTkmv/ahwJ6BRh6cG4avlv+bdrur/qNsWzQEQNs1ngyQ8aSGW8cmWFjyPIMHvdlt1oG87iLZG0tTGashipsNVQxV0MVuhrKGL2BIzfOqA0esTFGa+BIzQy0WGlV64bEPK1irM0fnr/Nl7P1/M6VPSTgLvWx1lyLWg7y+dOMjnjILhiLRQW4UlQwXt0W4LvbglGgCrBEvfpxEXLGH41wyOQso0JrqM3FuyLZ5lGaeC+uLSSIQH1UGO8YI5qhvu/w/Nn7Nv9WxzFzg3ekCNf9JWNLiDD3WfrGYhohwayON2WTKznCd54ynXUI0Xzvmb3yErfWAuRDeHB+I9/IAJ7KMw6vksG8eOvnHKDRYUTX3SFnHUxMmA+doE+dxGHCIsaDb+dvP30qV/adX4q0hQTT26RpzAaXaoqebnPeaSQohXSLgmqDQu4acwHHUH6Fntw5DmEBPeLgvjjQUSJUdfS3IYtaKhFqcfkri6l1OPF06O0x07//dFyCIDiY4xUvJ7UOJ07zDEMO5vjxiufw8QojMst3gZbr4oYHvEF50yTyzYg05pzM3tIBROfvz08iiBVxPoXsKEGq2vpZ4G1fojhgkFtqgK7/FTlGNjnLUJ7zmRFdKcR1jgvaqDBa1QeY9QfHmKggAXBx3oB1EiEsj1e7zlKA6zpSqjUAiTPGbukAovME9CQasFb1aCnMzDJBEGaO2IEedYjy+mCIF185rwTiGMzPDJX0HTHGW0MA4GHCM/pRourN1+/OTRuEAH2O76wBV1sKcBmt+wpu3Vfltk0/eefMBLpiC9sL4/DgGvkTgxBepjBP4tcHYZ7sdCPSjDmD6qkpuih1xqWKFx2OcbSNmBM1HER5suZOAz3iwKvKjRKhxr7K3YevHS1CTo9mUZGz9xEkjHHhF9shZpSfYCnAhhvlLyhwEAjxdJ8JNzqcKJzgoBzM8YqXTNBMuPllmmcYMROur3SeCTc6jMgsPAVeVnhNCdqKiGfCGAbwY8wtVvDcYmX2vr/6cRT0xp7ueJgDOLrPOlbgrGNVBQEzX4E58xolQD2G4Y/qKXLfPR06aoCufkRHZ6gRQazc8f3OSQSynN8/nGV93ny5Xnxe3M7W86fH+8XtYs44YwmDjPByrR0gYoSP67sqhNF3+ja75YX86CgxqntGtJUY1TkpWkKI+TlKXKt1I4N4C+cm86SCaEvnwLNnGcR7PgauZwe0dH3i48Nn74/Z/fPcPVc6Uohbhi0JFaMU9dUUPU7rwL98iwYB+VQbJOPIcZdAT9snL++9u8Vq7T098k6VgwAWD9dCPZBb+M4FaKgfOHx/Wj+al66f50t92eM9J6FAht3J/XEgBOnjx7Hj0aaAnnRwX9cayEm+MDusOVEuSeuxg8DjhCB9nMeZfTVJlxUlWykqo0SZt+CydGpjSD9GpEkIAHt8e17P/+S9vgMAlIf7xKivpugm3pV7kFYYYfVhvEuEGZRTkUzwTC3ICC/hc7UpsJseWX/XQxjWy02IQLtwS1xbTzsU5RjP25jnVhKrDgj2XK1n68XtFMUdJo11ZRcSBDXCV1gVMNZ452me2V4/1l+X89nd4s7bFlnm/HIDZlicyrMA6vN5RXZt0AjPpDiEWbQVW9acEY7HNEpy1zfMOAd23G62l1c3JoRV9n5k5V+XQLqEidSlJiAuu4255lLk02OQTjcTOI17JrkP7fLi6/94Vx9YBicxwq6GWmYy4oU/2TMOAIP45Zk0xTqEMS7mn67vKXAO7Fie/itIwLYedthvD+ZefF6vdVaTdEFL0yWMceHnC8QhHQXlrUsY4yJ+rhHlrb6SP/TtAEiPcgr+I3wXuJwQpI/uDR1DMgJ60sH5LU9fjdDNOUXv1XCsOttVNAYicHb/+mjWyW6gz7PfQXXfE9l3YLi3oOFtyUk+7wRvhIE7lQ/sfC4EBKA9zKZDaSb1Obhj/lIe8KcFrq96YAbi9OKbjcXMefpZDdPNFk1fHTjoWopwqxEab3TXiGF2VJ4quIvMWeGRH3ubwnlzOQGCPeNok/nZOzsf2nrY4VCunLMNWnKEHx5cv/3tKGGqqfyCdqolR/jFwWOvHDVimJ2K5znpiHlOmmxZzZ7RwcRjGr9ffvxwLRgn9RAWH26Z7AAsHgXjFTKIgH2ywDnuSEdJUU0ApTw6xuGN83mDBAdxDHdVVHE9S/CMpoxN6v6xgY1mcY+SrchP62EHs3hkvqgSj7dAEO454UhXuY501cQjXeU80lVTjnSV20hXyUa6yjbSLU8JDcRP1ELgPlOMQdXoMaiaYAyqRo1B1bviNp+1FObmsbr0jhmrzTxp++T10rtbfvrCOJmjK8W4p9DwPPRJjdHdu9q2EqOaz9RcN/R2tX3yi39rBuicRaGOtMe9m69O618fnahtIcAMt5uPrIFeXwyzJWiKHIRX5i0EH98DwB4fpR4fbR4JM0dPQoCZSO45oe/XNIquS4MtHU70imT7EjofXAYSEJdUj3mOfhblvNs/y/v8r15p7EatRQjLOxYb94TuiQF2ejgWetTFIZ+lQ67zxrJaMyQ1x4swbrGtJcg6E/1DmIeZcg1jiFIgt/wD7xkqHUI8/rVnEbUOJLLGl10pyuWtoAL6ocPpXIJzJrh6DAlDF9eNgJUE4HAi6LZ0Q2K1U5n/9H390EExy69Cy69ill+Fll/FL7+KKr/O587XmiGJsfmyUQ1oZXYp59PC2sI+c7Gc364fl99X6yXrfGcIYPFwHMQP5Ra+c6Ud6gcOq6f72ff1/M81J4W6YoLtnDJtKcF1T5GOdkiuvwHwHmbf5qwUGQAsHu4p05Nb+IwU6utxB0kC0WnDTxYqRQSJQaZDufh1dH7VCRL6LquZt1pw2q+WEGHWAwUWttYiZOeEPusQYtmts5ilEqBW8wkTaN7Pi8yd3dMDDkEqNhkiYB/zMwdudDDxNcyi3TuHWSkhqu797766I0sZwGPVCaQ+8CdnPTHFFkzPUAzoxxngtoQY03mI2xLCTN4gt6vFycxpGgAAPKQTNRBB+WTRK7eAAgzKqdjE0VZm1CAAH07vAPcMsskiAMA9BKk/IOAu/JTvAwAPxW0XFN4uKG67oPB2QQnaBUW2C6xuEukj3afStQhgcSbTjQzgMTtvrOfmTs/byh51fitYs+2LLWxvFx2VyKAkDF24Y/OulOCmnBOfIADqYbpnJt1IUS5nbjFQE/Sfzl9KD9Qo3bV/6ihRqvsMpqdFyYqfh4rKwzwVlb6THORz5iwdJUZlNH09LUhm3ix6p869x1kG8tiPjTyz9+VzfZCsHhi9OJ7jN5TD/CRS+fHq6heBRw9B+Vz/KvZpELjP33Kfv0mf5ePzk+e6qbctxJiu3XtbiDEZXWNLiVHLOWU9HU4zHr/LIJ3SzDX+MqAnHPRIY+dvJU/SEEiXInsNTSET2JwQdh/n1VCEQTkF4Z5dvs56ykGW9XTOVzXcNZT7UI7xzeLF5l2cHQMM5ScsYx0E5lMmqvtbZ0CPOahTyOBd7PiZHYygfITNWAdB+ZQf55svX8zp5+Y8sl2aHfieIG7o//v8e72AzZiD9dQU3X0G2RXDbF1OIl0Wy2mUCreZY/g8lIK4ufe/tQzmcfrekw4mshfJAb3dgV1kBhDMy4wAspSX7Gc1QeeuGiIMyom3cggjUJ+ywrNajgEA9wiTbdlqKq5HAyA8GMuLQznJ5718QBiwU6S89Oj/VbCqeSOG2boYXLl+2NSVwtzTGwL+sASm0G7Cimh/f1Jf6L50dJKhPNkYDoTgXryJa1cN06v3E7IH6TMoJ+ZLIYRBOsnKlu3tUH2ZaEw6AOAeohZe2Vt4JW3hlb2FV7IWXtla+HLQzR04NGKcLSxRPQThIxo0dAljXDx/Z67QRUTPwaLEd19bHgeF74Xxkq2jHFK/zddfH+/KznoXhXHg5e9H54YNhAy9qn1irkeCt4UYs/zwjTVb6OtRB/fVykaIMl3jzHeUGDXYxDyoFqLMgvn04MyOufOyo8So5VFJg9rEWc6x8bA7iMx6Qs5zq7QoWXm++QTdxD7ImSWnyyCc0qQapbBtTgDM41Awy6kWYkzG2BXbG9v8lG7zq3KpiEdu5Bi//PFqu9nw+I2c5uvbkPC1HOOriWuccq5x1ZDtcMxCpcJgurvAmdSd5KmwivYgQ6969hAFV4nrSQoDNU5Xub4g4NIr9ZBeHjdXRHEe1c2D8/BpSOi73F1dX1/+0wysjn7kuCjd1dLk03qo41exKAVxc39v3xIiTM679o50wF08zZbr77yPTgZqiu74XUVPS5Gde4+euM9++LJ44KTGWQcTTQ2odj5w1jpgBu60FPssLS7lkTGnKh0me/274nhBHNjROacbGczLwr1u8cyRrHFcdhtxmLMyHQTBnmqCUqBGlQIlLgWKLAXLpbea/TEvA6pz6stQDziYmEphlqUZY01lILfyd0KDHeBQTVLLa5zpLS1KVu+65B1EBm0E4FM9H+Ogw77YwvYSEd1LAH4ZErr6XTnT22KIXSRbWeIMCIBL+UKGlbmNkqJ6sfk7G13KrXxe5QUYiFMS/jxfWka+ZJkNMYCf/kWW6X0A5GG6xE+LR3bJ7QMwD/N/RB4tAOaxnD3cyUzaBMylDK6Tyny6DMCpPK2UVxnPUpLLq449vd2BVyEhCOZVHiIuSKqz3u4gSLQeZKSXIPkgEuSaHs1qwsHPfrj7nLUQOTP7p8o7cK8mbbGF7W03IrzW2xx2R5nD7gg5FOxyW+AlNgt9lSayjgNggE6H9NUMW1yDBvbFOLuO4CiyaDNAJ5WnGf8xWmqArnx2Cp2lEFcPIlhV9iTsM/948mbz2V159K/vetbWQE3ROecNQgDKw32O2FdTdDOCczz7AtBTDs7RMgdqG917i/IXL4iycJtHaSIz68Eob+eVlZ6YYqfHUPAgRm2je3s/f3HdLY9AKC8Vun5X2Ffb6J7a+nkueZQ2hXLL/b37h4wAgPJwjhM+UGN0s/tCm+/zFx7/rMcczKeaup/KXtitbptAuYhyogXAPBIT2l+UWm0C4PLJfGu5Tn933czTkQLc28XT1/myLAvlKZyMTxcxCu22jY6c5mRAsLgwe9whwuLjvF9lqLc45FksctB62qEOnus8asYotBtjhyAAsHhwxkI9Pe1Q7oE5HhlzVZxDO7LGRz29xeGV25BBENpL0MeAFNrtkAai8mD0tANnjNeVW/hRIOJHAc03keFFxasE0B5qojqjRtcZc6W4vWkgdq9pSnWXZHc9+kEgbLxbGNxPPk4YM0YQ5Zcln8Qt3IjWTV4GxuS9pEWjWzNBS4O0MswBHzrKK3/4HCV+7BpvbyhH+QtWd9tISS7/tms1Sn92P3mrLwbYd+FWF5lPvgp//cWZ3RbjbNMwcNFGi5LLjGaSSy1KZpWQsxTlMvOwLUbZwT2vZeqoYboZ/LMrZU+PO3AT/aSlyYJbx2tmfQE/W89qiB7tQ8VIklKG8pi15qylyX8+fpbAtZzms/KxI0f5vALYSEku/7aJ0lf+vnLeL9uRklxJWWn0pIMgzU9yks+tmj0A6iHiW9h/MHYt98QWtiR/WwSLiyCPzwCLhygf2gjAZ57wxzEtLUrm5UJLi5JZKX+WolxmarfFKJs7jumoYbpoHNPT4w7cRCfGMa1fBbeO9yT1BfxsJccx3+6k7yIGBNyF+3bgm+1t/OkCzluBlpYmc3K3Kyf45SG3bHypxun1CbZcfC3H+ax1/2/kDohvgt0J38i9CfWvh4DLPQQ4lbMe/Y3acVD/yFsnbotxtqTW0/Xd/QP+rhYmy9oqWzvFWwc9CWGm+dakCknAhXcJsAs3RfC04OYfkndPn+aecj9ttCuFuL/frm6unn6ff3fnNlKQO/9+VV7B4J6kCJf/jrmjpugBo6dtiyk2q8XvqCl6FUDtB2PvxRBh9cmU76V+ePRifxPGQscuzOJdXn3Y7y45nREGGuNZ3uEUnjVojCf3bRkGGuWplKf8OOfsRKJgNu/meClxIrdJlCtn3NEWW9heFIjwXkTevZqyHiq3eliGp9pWwcnMZhqRcYc01nUfJudICNPYd5C2+zBppRtKo3EPA2yBOXgfi0348ziZe4Ub4y9ugdX4FlhN1QKr8S2wmqoFVuNbYDVlC6zcWmA1WQusRrbAvlKchf6Wliabs38kdKO3OFSx2UQmFcLisxQ+yRJ/ko2vQnZHVYtRNrthpFpB50huLSHBZEfrhBmok1nUElt1IZhXEDLnjS2xhc1baxoQcBcTt5zLN1qaLLr9BmDxKPerhYxdRRAE86p3NPM8arGFLUisNgFz4c+OqZlxOcF0PPG1L6bZ3Lb5pCbpkh6mBSA9lqInWJJPcClJ+0s67S9FaX9pSftLadpf2tP+UpT2l9a0z2Nlqp55i8iIgEiiCF8v89/48YMJkNWTGUsY52CO3AETPlZixtEfyDF+NcHjwSstTRZ0Di0A5nGI9EA22YsHTkMO5sheGyLWhcyaziR1AwBZPYV1Y8jBHE9rKTyfk9pGF5S3DgL1KcNDVGfHMm1aBItLlY0imwph8SnzTmRTEjAXJeqTlaVPVtI+Wdn7ZCXqk5WlT1bT9cnKpU8uA9Jy3kp21CidvYpDreGU6xb8Ot7Icf7f3PSA3/yWv/FTmUphzqkBXS1GfuVtyGxpabIgB1sAi0cWbs3X9SKbmjHOSf5UbRDgyd+pTO1RZu9OJvYln37ibPNqaREyc/seuctZsk+Y3iEs2BtM7go+/8hJ5Y4apTNT2rLP2MRErQIgeH4c+e4DqT4A8Qh435WcpRDXBKXyQ+VdXt14283WUy9+2eW622AkF1cvOhz10CtiRTYaRR15N+Zg6KlSoWZZnbcHbxMXYZ6mjG3UOMrJ17uZ0Nm7sXrnmfdy8E/JJPTuwmze++1B5qcBIzz0SOpV7GMgY7x0Mbu8kruVmLF+H6fx+0j6/fNKmF8VgPIw1XSaFrBPcnGdpgWkqCPvRtwCDlkjnT/e/DKZc82yOk/VDgEwm7eoXNeAER6ydqgFGeMlbIc6mLF+H6fxQ9uh7Yuv/3P1wTum8fvlxw/XPL8BBvML9I2FQfhxgkYJRDn5ypslKxa7n6SIY+HzdxCYz8+JMvjnuBxuhogMl0ZLkfOMT84zghy6RjruagkyrymkR2PVr+mOf89ai5H1qIKdg5WWInNzsNISZHYOVlqCzM5BYnxW/crOwUqLkOuhAotcaykyMwdrLUHm5mCtJcjcHKRGItWv3BystQCZ+9Eo/rWo6aU45aHWIURObtU6jMiINVXrcOJHLvIjwWQn50lMsdkJW4txtuS2kbs2Z2mbkYgz9iQEmGYzR7V0uHl3P+wdANg8GHtCenrEoVqiFDxFG2DzYD5FS29xSDf/EjloPeDw4quyRXzxs+DNz9zTqQ8APA5+pkfKcX0nnh/v0yzKX9w7BQxEeEq2jAAMyom/UWSIgHwC97BsWgOSrhmka5hUToI4uFIIMI86MUJ5WYExqJ+knAwIuAu/jPQBgEe2vfJ++cDqZs5ShMuFYsRfGDSoLLNKH1LyzOLa1S8cmpYhPMbKH7rGVy0+cnhaBvOuGWtqlQzgmdUXsxRTfmVx8N0LTB9AeNQV2+wHyAK2UYdCuFUXnC5XxfGYZnnI90V45B2UZ/5wv6qDMX2/P9fzh7v5ndno5T2vZl84Z5LCDLuT68t/iGB3cd6dCiJ6Pp8XTyv3WL2NCqN5rkFYOsoe9cv8Yb6c3XvmyOaVe7YO5STfMTP7YpLtmoUDNUF3/kauL6bYrhEy+mKKLcpQW35W36uk5myfB9epFMGxOr76cSF1KxmUk6Co0iVVVFBt5bTcVcynl3KKr5qcSkQ53uVYHYU5rmw5vnr+tF7OBdWlDbB4MAvWWW7hc4tXS99z+Pr7nVvEXiMAGF748+gngTOq1sHEPPO3OQdZCvvMb7NbN5YWAAx2nMG+GGW7xhjsKCmq65bIvhhjO1etjhKjOm8c7igxqmsVagsxpnvsvK4U4rpvuj3LIN6ClZoLJCU5G2zbQojJ2Fbb0kFE5+8WGlWftlytzDf4vmONb2QQL0xYvFIG8fZhEmac9ayBGqILlzwRBuQkWjYDCaBLGr9feVmaZ7p1S1SeR45jHpSCuX3U7dJrmOU8l5Mapx+KmIvW0h53sVo9a5F3t1itvafHxcPavZVHGHYnx5YKJNhdXHsCGNHz+Xbntlinrx8SGI1/owJozk3/SQSw1pmfqF2aHZyBjRKgMpr+s2zAu3YEXQ8JrBy4RnLgmpMD13AOXLNz4JrIgWteDlwjOTBff328c/4M7yyDeUXCJJbCHrOcO94+PqzWy5muyStv+xI6BviHETYf51YUJNhcHIsboLc5uLaeEKDvoX/+zEigRgbyyiCXjIPBB2qcnmeu6/N9MciOU8dDlM8ylOdtopTJNFKQ61wUTqo+bb5e3c6e5t7q6Xc9DncvCEM97eBaS/pqmu6cLAM5wV94m19/MXML11cQGMTqVX08L/SqIKSXKNsXtlxflJVOTw1cJxYYhPQSFLAFXb4WouK1sJYuNUUqqXGp5BwUYSgn+YwP9yFA3+NxvbidaxGjxHakKNe19LSEKNO51LSVPerjp//ytht15boPrqWDiIyl1ZYOIh4YtANIcj9E5SwDeAHjOQPwGfW/AlMTosBsfFLO1J6edti8i01qBOBTvsJzPkm6owSojIN7zzKIl7CKfSUDePqvV9vNxhlY6xBinLCAcYLwXPejtnQIUfHuUEF3qF1YmVLrEGL+M2cRtQ4gKl65UVi50S4sYK1DiJx8rnV94tP8wVxuwkf4cXzelanMgqnbdN7CQpw3RRSbYKpVuHrFcuwxEKeyB1Ihy6HWUmTXvqKrJciZ+whmKMf4OmOiPY9dSjHusdC9iB5gclPlrEcc2GlCpMb+4PyaoSslubpi/EvANnKaH0S7ncTA6BGHF1+9fLxiwSspwo38j1db/+g9sdCNGqObt5lltOaUxz/rEYdq4cU0P7r1OaRBETObMAiEeB5045puWS6VlOS6v9cH9IhDkkoanEaN0PUonp0wtRYhqzzb+ip0nqgM5Dg/KNjsoCC4ifDGE+udJ65He/S0CDlP4/TNMRJeT9snr7/Ol6wtpR0lSnXvkTpSlOtaHVtClOm6ztBR9qnHMIHHfW4WKMbiV311KDOrGRan6uMAmVPNQJxe9U24vgnpaWmylxQHCd3oew5P82/ebPVwaRpRt5lOR0lRnV+LDNQY/U0XsZCHLqUkl3/bjRzg/3n94Z/e4uHzIy/Bu3Irn/UMQwTpw08sgAE4bd7zUPGfpisH+Prf3lZX7o3v+I66LwbZP/SQapcyuJUQYqbei34ax961owSo5qWL+bDpdvGkO4syV5z5AANwOmZ6nOkcn7ijBKis2oTUobKw3H1lxFwfqFH6avZUfd/6u+NbIBhB+HhPz59cQ5UDesJBlFAnOcaf30oTqk3AXUTJ1MgxvjlM+Dceu5RS3Bs+94bkauHij/JLPVZzgIFQT0EGWFJfWILs5Wcpr8/LMfXZXFRuvRXZnAiEiyg3ltZWw3T9PLZRUlRv9vwnn2zUJP12eS+gazVJX87/W0DXaozOGTkRY6bTT8Jesk0gXeS1a4Cx+InKf5dhcRInoK0HNRfJe9E+hXYTJ5+1RzUXCXrVRm7j38j4N1b+FL0sAiO9hRk0IncmKHHjyttymvZhObZ9kPfCfYrFTZxby1GtEb9XPqltdH7v3CZYXdi9dJtgdWH31m0C4MJb1sJWtKq1FXZH3ZXjfFEVBBiUE7c69AGUhyy5iD65ukLUIQ8RhI8ssah+uLqC1wm3tCT5RkC+ocniDOhRxrp5rnuKSBLtKhxcoCTcVVLYbCVNnGH2vFpO0I4tR7VjokHEEEH5yHJlaW8vWQOHs5TksoYMXTnN5wwWunKazxkmdOVWvvcw/x+hh0GgPpzlA+qdTvObdFxiWUFoXTRBvR6zhtC5UlbvrKsIncvkyWgds4gXEmCMxU+eiPYxDH8xoae3OtwIHW7sDpNk0NixDXCtYHyD0Ozuk4xzxq+itK6XFs4xJXOSDB2Xl8uJ2snl6HZygnHQiNWUzoXyXFuOa5cF4yJiRaV7gWB8ZFlT6V3EHydZVlV6F/HHS2PWVToXCcZNfUzfT7cjl1fe06e52Tzm5tGRwlzGx3IdJUx13gTZ0sFEsyXkh27E/STwtmHmuP0Og8BeZWQiDr8Uwsz6mGTX4MsDNUC/1jn8+93nK/fgeQO1je6tvs4uZRYlAvQ5bsIr85272Wnvvv8cYeBOYSJ3ajMAp9+8TZEEcWiaK/cC21FTdFOUo1201dVR4NKmgG6sSv0bVqd/K2sjM2FOUpRrmlcB+yQn+cJkhzCo3wReo3wy/20Krz4G9HOOKHCWgTyzoc+LlPtnyUM5zXc/mxsCkB51wxIGApuGYXF6DeP0KHSqGaSTyTiRTQUY4TFLgvkEjzWEAd69OR6vlYQgI7wYHdcQMcLH9TsRhAE61Z01g18rQWpd9hnUWglST6Exm5rFPp1mBA+8gypo5lT+BA12N4NnE8CB43XS4mQlICuI3BwN8TRfLh7vOHUTQlh9nOvlEGD1cK+TAKHv8ni/uP3ObMa6WpzsmjhtJU51To6OFOT+9/PsXpIWHT3twEqTlpqm89KmLQf5soiJCMPuxEorOm4icA0vzSyxE+uLvs2engyD+SgtOcln50lbTzuIHsB6/8w8aMn7/OXjnzqP5st1NSYpDxFaLR4fGElFokb7uiYgARrt6ZysFAl0rTOCmagtNUVnJV2jpci8BDqLe+zl7OHO06LQdxujtXQQ0XU1+CSCWOW3je60UobyvLcofzGOkQnMak4HdZ2YW1iQMycIT1sIMcM9I6W1CGQl/iYOvV2a/fCKRPm70NsUu13oHJzWSoPcd5G+2vngoK4U4lZrPkngHcL8JWWkVg8AeZSxUcxduNMbKcQ9po7HNDcqkKbCIki5FaqthugqDBmJa1QwTZhryp5r5pLCXJMevB3T4qwHHXI/LxhpXen6xFu3kwH09UNCedOuM/KWrk9svwF3jkY5UAP00+tuFrwtHrL/17v8cPWLiWVkDpHy/NefV64OAGLo4z2tVt7TbDn7xpiLAHrawXHsMVDTdNfxx1AO8E3kkeOPrbr0jpn+6aezQx8AeGwix/eyJxHEiqPEHIXqOcZB6WkBcnkCgO4Oju73epaiXOd631YCVM76aEsHEnd+EeesVn8gB/ictdeWDiDuYn/vnlmlCqJxmgekTWgfyOR61BagtzmwCu2AALrkH7xtlnuM3Z+AHnPY+ds8zZj4WoyxORXvJISZOkMYc5auFifrZtrTzRSr0HQBgEekvPTo/1W4F/RGCVCbo8GYbx0QBuXEO2AMRgA+nK4W7l9NbjBb1LMU4NYngpfdb7kbyHuczZ+8w3536WxEsEY5m0HGRMYn1Cjf8oXsFK4VaLzn1VSeVxbPJE1CkZcBEB7VCGOq8gPSRroL83KIcvG9ms4XztHySENB6zgg4C78ltFy8mJ5ifMx1o0KppXPwx3L9vSEA3fs2dMTDuUgKksPnCUeFGPxy9MJ3PLU6pWzTq0DCZBLVeDYhaAjx/nsItCR43xpAYAotBs/+4cMwEkJx/7KOvZXkrG/osf+ijv2V/jYXwnG/ooc+zvveTyJEJZ3VIrXl3fUGD3z33hgLQSZf4cM3t/QyKY4Op9deZYBPMb5U2cZypMOnEEK7sYuDT097sApEWdpj+v8NQHw7YD5E+Mg2LMM4jkfBduoIBrvMNiuFOIyjoNt6YbEq6tfXGFaAnJ4OdIIYSYnV046mMhLwbMSoF7/6oy7/hXkMNPwJISZrDSsdTCRXbo7Ygv7U5xufyiRQ4WAfZjloFEOqR9vnOuSloAcXjlohDCTUw5OOpjIS8Ozcki9vrxyxWkJyOGlYSOEmZw0POlgIrsudcQwm5c/Z2Wfunj6Olt99Vz7jEbW5z3Nfp9febfrP91f0PS0ONl1ubcrhbnN65WD2nPgbT3sYMKVh2ZkxjNoyft8901p4H606o+sYyu60j73z4f5esHYt98WIkzXqtvIEJ5z0TrrIGK5qBsF3uJhPf8yX7qjewDKw1dbPl+LKXYRp44b24ZykM8rE2iJKF+qidK7C6A8eOl9FlNsbnq35SCfU1+Q2sKrK0BNeV7Nl9XZx+7FoafFyY4P3lHiVNck6Er73PXnG5ODbsWqUUG0Y8GhGVWP9ufV9fWlW+ySSgJyzILd0Y8yBu8khbn1Umm5JFsvZnM8AEzf7/rDP//4aDbRmy/Mq3d3zoesYhDcywQXEXt1ILiX6870rpTken4c+UpArwC0Rxw5ft4N6GkHUS6My4HqEk/9ENtoBu7E2W8/lOP84CrisrUU5zr3Fz0tTtYtKhespSTXOSDaUI7zoys2W0txrqisW8p5VT4FqdIAcA/3V+F9sYXt7Y4ivNbjDq/lVquEa1DLYX59aKXu6lS4zV1nfhgE9tKt0SW3iJ60KNl8C5AEfmY2mOdhYmaiimkEoXBfnbxFyHUqxRa2t0nTWGRQEsa4eLxaPoDYvJi1sQOweRTbFz+TuZQI2Kdsc7gdUCOG2edSx2+4+gzYyXQozN65luJcQXvSkhP83Pl7u4Eap8tqXpdgc2FmcQcAe1S7xLhj4bMaptdZxK4GbT3mkHvb/CcPXkpxLntM04gRdlmy+IlylgN8b3b/5XHp/PFSV4pynY/T7kpxblCwuUFBcFmJ3NLiZOcIOT0tTmZnHZlzrmtRXSnOVYJ0UGQ6mGp0CARsrQbp6/Vy8el5PfdW7kueIIF22aZFIjIpARYP9wivIGGMi7d59x4Wd3KzGjTW8/HTf03jqUFjPfOf+TSeGkR78lrAtpzmM1vCjp52KL+zct5OiUFGeKWbf+kBgtitwozwcz6GGoPQXrIWydYa8fqBtpzm63b3UlwKGsgIL3kpaGEgvzIozuz5T2YV6shJPifjW2KSzcr2tpqk82ahPT3osHj4zE33kxTlstK7EqJMXjrXSpC6vGfGHB3KST4rNc5iks1LlZYao3+br79yYj5CAIsH+xnOeszBD4IPXha+pj/CgOfRJhAul2bZh7XCOiAQLuYStoERY+zq+zxVRHm44Rm0CagLZ45bCzFmEMah+fKMmzBnPeoQ7XZMtlbiVOcw2D0tSi6YqYyMdM1P/GaAqv/lsE0P4U2scx69TbC5qDCL/FjmUzFIp9hXOWOzKAYhvRJdbMVeZwjpZT5M8vMik1g1DMKJX5VrsYXNnmQPGSOcWFPrIWOE0zaL8mgrKOB9kM2TufoyQNh8OG9J+gDKw8SOYM6rBgjKpyn8rDfuMAbz4w458dHmwc+3LzxoKcW47MEfMerjTppOUpLL2W/QUWN0s64qCC5FcCjHSKkizNyjWmIQykvaNXYZlJOwTqsxdbp8GSXsgLsMyonzdQAEQD1cP63uKCkq6zViR43SU+640SgxKuPT6J4WIzM+ku5pIXITUJr3brIjJ/nStxQIaKwnayiFgGhP1gyqI6f5vNkUGSO9d0V5YhV7QAhz7I68BnfIsDtxl6YhCu0mqlLWGsUa/VAR5HsXqInKgRpdDtQE5UCNKgdqknKgyHIgWB8m14b5a7fUuu394+Pvz0+miePt8+8DaA/9wz7MmGNtEEP71YNM7jIOAqI9VcEsYAME4bPNM/7zGDHBdo743hdTbFa9aIkJ9ouv9Og7ytj8E4DwcD66tC8m2Ky6fdYSZPVS5EH6lrDxJwDkUW4nnz+sl4s5bzTZA5Ae36UDSow02pU1pMRIo11ZW18wksWVNZTt6i0OvFagB7B48AeXAGSEF3dYAWIsfpHMx1rHWC1RV29xUKHsEVSY2x3k+a/G5b+aJv+VPf/Nt+7Lh9k9vwi0CKhL+eY3ybN3pkejtzvIGvI+ZpwfvwnvY8b58RvvPgb1Y70mPylR6ulFt6AotBG4D/PFdkuMs9m9GdWPVZnCfJ3VJ6Augn6S7CGrfZ1hxmSf5BRfVGgaPelQRuKXtR99zDg/fvvRx5B+ueTNM0QZ5SZ7uJx+/1xeZ6ZZTAsjJbleGgcCtpGjfHaXS/S0/JEWNcZKkzCOEm7TUatROnP55qylya6HugzlVj7rfWyfgLrwx7bIqFZXpvltFQTBfIya66aRsVAHUQi3spE3f2A7NQTahbmTvwcgPKLgp2hdDsQQflmYZ1H4Gk5hCrDGODN3XoAYwq96dckdBgEQyKs8Rp03EmqkKJfV/p6UILU6k/bh8Y7dUA4QoM/zJ0G6nMUEmxNWpaWlyR+q2PUSgxpB+ET8B4io++eVmkZLkJUgzRWZ5kqe5sqS5sunx9WcFYuqLabY3NhHfQDlwfuWuK220Zk7pwYIq4+awEiNcCrfkAUiowoxwkf+TA3F5sbs1wYIm4806ezplmeFEj5JiaB8mE1XI4bYJvyd4H16R07yOT1FS0yyWb1FW43Ryy+A/DzPePhGbuWzVyEgyig31ioERBnlxlqghSiEmyTQFcAY58TbNg5zMMfqKy7uEWw4BvOrV5T55b4FQD2YC9JnLUrmjF5qIcZs8omf3R0E5sNvhKn2V/ql0JBBOF164cGPYrZLrSccBAXzpLbRRc1xDzLGi90Y9yBWL+aAa8ignDpFXfHdupxRjlO4kU7HYsNugM96ykH4RRKIwfy4gzJ8PMYeihGjMOYqTyMluazF8Laapu+OEvoO7ZHURPVMja5nSlj6lbX0myvqJVjmBB6iUG7s73d6ANSD9f3OSUlRed/vtNUYPU+ZLyVaYozN/dbmrIXJfzz+Pr8TRnyAKBY33lfRPQDlIYmjMGSQTrxRcyOm2NxR7VlN0cuRqYkFsvVN9Mw71md/BMzqXW1ZfygOmzATOrdRFl9ZoSC+yu9dIhgKQ5yRjswBMcQZ6cj/IIeAjfFmD8kBzBg/1pf7AITyigQPFJFPwRxfNmKKbTr0qRqSIcvmPE0z0idBrqvFF2abfFJiVE6+VzqMyMrvWggy14/LeXn4HftN1wBB+zBTuqOnHcqugxeuB4CM8SqyLEzMx4ex3PLMcnCuvhabzLzCjfBnvt6FKOPcyqThDPVR1BjfNI62714uLLl91ghnlaeZ3LOkjHDTPaZ558aJQoeRrK6X3vbFjxKhY00Z4TZJTbkcW0MmebiRz3ZuOuRNX4dldw6zLJWmaQUZ6aVnccf8ZRLHCjXC9yfz6x4QM8pP99nV5u0JTBvWGOejbqOivG6r5OYdHO3P+9y1q6cdeCOotpzmH4vsmCpz6MaLHneKHqaHon3LvVJ61KAkjg1khJe471cj+/4yroOwTTsxRjhJW2w1rsVuRcCSutWYMX7CVrOB2L3EfYIa1yeoadpmNbZtNhfuYn8vrWcVxO5VNwJStxpj98ujg9jMMEY48faIARC7V7Va7m03Ur8GRHvWw19zVNz2h8SzA6I9/w6zVGJl9LiDWZ6XtMInvcWBP4Wu5TQ/TtMf/EWOMwF3kaxv0GsbreMq2I1Pm2FxEvXvY+b11bxNFwnJ09QEm4tgXNQASA/RtzcQhXYzDy2pLG2GxancJie1OkHGeJVz60BuV3HGOJ5XpuWuZ5bFWbbe2kLQPlV0PFHu1Qi7j2xxpUuh3apWWNx6dDjjHGUtSRtD+3H3BvQJY1wE46L9uDFRnPqm66wqBjsBuxTcTTDHJ+f35YxVDwIi4+/H8gVTFEjew6Wsbz4TSBdxH6NG9TFqij5Gjetj1ER9jBrdx6gJ+xjl1McoeR+jxvQx7UjeRz9/URK3DsjmKVjLGLGOIZ7nj5jjK3n/rMb0z2qS/lmN7J/VRP2zGt0/q2n6ZzW2f55gXWbUmox4lWTECokSjzXUiLHGJGswI9dfuLHR22qIvl4+r9a8r40bKc5lt9UdOc7nfWV81tJk5gblHoD04H7z2wPQHszdZz0A7cHsVXoA2oPZavQAuAfr29tGSnL5b0UGCMjnjxn3pLCTEqNyXvb9gcZFNL+w5jG1EGTOl4vP372n2XL2rTo0kPuKFyONc839DSfiMwIa43npvaScCgFzrI6mNc64FR0jWV2ZxbqPsPrwupIBYpQPs2OBOeMcj2GYTeV6Yo1x5nY+MGeUI3MSBXNGOU5RJ8g+sHMlexMGRLG6cV8uARCrF69r6BGsLmapSGhjEKN8uB9KI6BxnhP0Cg1nnGN0nMIvOo5183y1ncbRkMa5TtB6NpxxjuXoIwrVFK4n1hjnSVpQNboFVRO1oGp0C2quNIV7KteGNcqZvciCkUa58rbAgJhxfrzJGsyxOpZjZv5yA86CnGXfoNq+PS1/z8Ly22ZuOPwhA3Uq01dm1EYgPrwvGYmvZ8tjkpiD9rMWJ/MGCWctRC43UApPfB8ycCfummFbDdONu/+Ds3B11uLkrc/lbn2cyhyJtcQ4mzfiOmtxMmdkdVJSVN4Iqq0m6Mz3kLa3jxPEyBoVH6u+iNtNd+Q4n9lBtsQgm3OEBXJ6hf5z880Mb/jQJ2AufDpGlURVoKMpcKOa4RHNWHEZkHgMZUPFXDQ7ayGy/mfQOsTP1//ingiIoihf9kbEHgD0YKUXllLlIpkkXFUPgHokaT7b5ZyX3x05xf8U7lhfa3b1qEMVLMjbRLnKuY/RYaBOgth49rh45RX5Rpmr/HjPtDgDEA/2chIdc6/8Nd2qIxNspAi32fxS7pnys9BneQwxo/xYx1hClLFuXpi8TuNoSKNceeeMgpjRfhM95gll8z0N18TZ2QJhnuyvrizfwcq/fh3zzSs7ZhARK0gaI8geG0gaE8geC2iSGEAjY/8IY/5YY/2IYvxYYvs0MTKDMDCzI69Q/j5k2/Q4pGMZm5C5IAtAMK96yMlbzO8BMA9hwlnTixuhkY5NuhfHJ9qPiEs0QfTTUZFP9+I4k/sRMSb3BzP/9PzgXwx+o4XIg6kRb2YPYsb58Q6YgzmEo0la0bOdADYP0fM0hDEuvOPzIAroxuhU4Pf8uiGIAuYa+lmLk3lr6GctRC6/ljl9gMEc/A4ZtJPUhXYQPgbxBKztFMgOCjPH09nCDNPcVkP0o5+p0Ntl6cHbFLsdp/MZIECfKlBVuYbKsGipCXocvobxaQEkCNk+PY7V0VzEHXUiIMKzvKgVdozt2QeN82Ru8URAozz/Kvw42kVhpibwPcMIbxNQjbk22SfYXMqbKrNf5nXmjHLkb3FBUaN8Cz04mdK8w7PdQVXLZDW1DwI9eY013kqzY+lTcfRFx8laTpLlx+enYvPXC87cF0EdOcSvN26Uu6Td8W01RBfFFrJEFFLSGbayz7DNJfwXH201Qee+9ujIMT53/k6friCPLzwmrrD8/IYxZzeIzm2wnNnAO68BO6uBf04DdUbDeXkjKDhT466edmD2Ej0A6NHKZd4Uv0+wuvAm+QPEKB/eNB/EwH7HY5qZMFnN0ibHbQCBvPirWNQa1uk31pChJQbZaXNqCIN9FoPscj8js/ttiSE2d08evhuP+50z/nXz6XNkVmC0ltjCrkPVqly3H3uRUYcEuPq54JTPttjC5r4jAxgjnDjvygDGCCfOyZ4AA3aSnETZlcP8cn5mBqyCNOszUCf2YxCnFrZ+FRQw+4mFvYv4SWUvXcKzCgcEwOX1I3vf+VkKcwV7CztqmM59h3+WklxuERoQrC6cAjQgWF3Y7/NhDO3HK659QM/Dv4q8L/OH+XJ27z3Mvs2d+H0xwF48acxyvlo5gxslRfUebvlgLQbY0dE1IEmj6tM2kZeHekC28QOvSN7MVtA8POgxsZ+5jZlI0gjXtyxN9noMt4+U68KFHYf5b+N0oyfyXnb5gefYAtg9LqUel3aPK6nHld3jo9Tjo93jF6nHL3aPa6nHtdXjRmhxY3X4p9Dhn1YH/6fQwv9p9dgchR6bo91D+hwb+3NspR5bu0cQCT2CyO4hfY7A/hxK+hzK+hw/Dwdhw24II1wuxS6XY1zkD3M56mkmeJxRz3Ml97ka4/NR7vNxjM8vcp9fxvhcy32uR/jIs2dM7sgzZ0zeyLNmTM7IM2ZMvvwqdvl1hMtvYpffRrjciF1uRrj8U+yCjpPKlRY946iCdgVRFm7z0zZrnitFxO6iDCcygfeQgznmmX8wmy2SkOd01mMO9VQuC/MiS3gmHYTFR+W+44I+SLC6pEehSToY64bq8upmvz2o6NX8w/vhtmcH0NsdvDDZej8vpUY1hvILwi3fRYspdrjdlHewiVPHLY84hvTTFx3U3vv5i8CsYYxyupnA6YZy+hHs+BZaPGRfXf8qKs19vd2BWZoRDOXHKM0dMcUWlWYEQ/qxSzPEGOV0M4HTDeXEKM0d8ZDtbfOs7FhddzX1tAD55c3bbrbmybL3Y+4M78oRfp59vDpdUhUJxTICOLCjLuTcp6mlMLcu1lx2S47wBWyKW4WKq9KNU4SGCNznlD8CnxYC8ElSYZntAzAPbilqizG26N4t9y3NbQhCeUlyHIIMveq28aUMHPer+3G/MMLiI7cZ5aJnMO+vjm9XMQjqVf/uvaRZ4vpuDIEMvZLI01dyq01XjdKZFaer7tNVcukFqecHbvHiWjqIaEYLzt+WdJQY1b1ktpUYNdNzRNc92X0xxlb+KxNslCD1p7d1/EC/pUOI0dWWRdQ6iLgPdUXx4+jvMCh3W+aplx/cDUAM7GfOekqjbajb1Djc5o5nKWMQzGsXhXHgHXOmSyOH+FEeHrxtetjoPzOr0QAB+WThrtwzYlqectGsXCpxPhXXwiKdTf+XJqHAryZALmqKMqHGlYki30rKeUfe42/CsPAOaaBbMPPpQei9+plzUDsM0veK0nrpVOk5ButUchgB+OwCT72kRVwuMTrumAH0gIMJJqmLotmlblK2vh/zJz8I3J+KxgH+5gpmCp6lCNd8DKT/Pwtca/vkxPNNlLBio1uOROXuZQwAAB5B4L2lWaCc2SfhkLlNj+886Fk5pAZ65MdOiY54yA5/HnXBcYVWqiFtF+VK12xeEnTEANt89n5Ik3yfHkLXajqQW/meOvhxLHSpIEOvvZ+/hNm1K72WDXk61TI/2Ye8hO+qAboygQfLHojH7+lBhyyM/Tx6DeN387GVezkHEEOff/nbdBO5oivVkBZvD/x62RED7FApL3/xk3ZpWjqbgBTKjZXBPfmQf4jiuNxFpseB7lMnCGDzyPVw3fnMVpQCuSWRrtveWxQ4HiPRFwPstOzJ+WVrAMA9WPndEcNs3UN4G1+P765kjwFxcEdTynkN95AAu5yGraKHGkBoL1Z7OACM8BCmH8ainVW4zcJc/pBtDuwYq5dol1/K8m4AobymsLI5HYpYPGzBOLCjaGQ+AOAe7LapEcPs4vJX2f13AJCHLvnJB3dyKQN4Omf4bXVbDLPN+oz/CwdcKQnqDZt6g1G5+dYWw2yTARys0eFE7mC/r4cdeNX9JISZ7HKGlLFUF7+kjLZhRunp5jVKC6UH6Tqfj6nSgyxXLysQuIekXNTizx8HgKHHMX1j5HOlGtIys6AjmNX19YhD3W2WF7Is2gDAIwyKbahTb+tOP0tJrpm/HmNfZNAwICcV/c3Ng5YWINdDCR66LcbYp8wp/8Fz6CBQH8EjYE+gtn6eM+rTSQcQy3Vz3r22tRA5l80IBwDYg3nr+H3/ld381GU/N4fdOncjXTVIZ44tzkqCesOm3mBU5tiiI4bZrH66EcJMXmk4CUHmT1lx+EmXB+6YnhjPd7pkXioDiKFPIVqQKSyrMYVoSlVY5lNvvEX+N3iVPzUBaJQyIXmP5hzAeFe+Y3WjI5Ce1/Yq8marh0vv02LtrdYG5WQD6DGHxcN6/mW+5OFrMcZ+/PRf89s1D11p++TNppzTmeXuxG2/c1eKcIutuvI2IQtcazFyvvvIR9dinH3D5d4ATLM/wvzkxWHizG2LB+zyYE5e7rWlCJeXex0tRublXleMs2+43EHuvfj6P1dlvNz3y48frr306JqHIMLqo0LHfhNG9H3Mjrm03D63jc1EO0zMnkO3Fh2D9LwC0/Lc3pq4JXfz1e1y8bRePD44OcEIyEfQtgfWtv18xbcnkcFJjvIfH+/nswcmvRJj7PnD87f5crae3/HwZz3mUEfWWfzv/G69cIzMg0EsXpLc6CAwn8XsWuLRyFE+Y7QQ0KOF5ueH5/t7HtgoMSpjDBKQY5Dzr7fruawGtwmYy5P+cT37dM8sn43cypc8SA+Cea3m//08f7ide7OH7zyjNgF3WUsM1hR7/eulJJ0aOcpnN0RU67P+/sSlaiVGfX5Y/DFfrmStWg+Ceq1v+UlTi3H25xvRIzR6zOGPxWohrGEdBOTzvP6qEevvupX9/FiPQtytIArp9vv8++JO4FPqIYciT5+qEx1/d/y2ZygH+J9mq8Wtd/v4oFN0phsv97QaEACX2/lyvfi8uNXDkKfH+8XtYu7uAzAgp+W9d7dYrb2nR9bT9PSAw93Xo5/5B+WMPgkJpue6kbYvhtiLpe68H5ffmdWupwcdVk/3s+/r+Z9rBr3RwuQ6JzjgWkpy3YNRAnrIYTUTVNuO2kbnFZo+werieMAIBEA8ik0cbbnJdBLDbO/p+ZNuWjnkWkpyuUnfktN8XqKf1Qh9tfjC4modTOQ2iSclQJ3fcu+0UYLUJ2MY5q4nXPXFMJtf5dtiC5tV6voAmwej5PX0oAO3QjZKispMGLo2nn9nJQlZF+d3i6fZcv2d1Qm1xRD7z/X84W5+Z4aW3vNq9oXhMEAAPuyozgEd1bn/80oEh0Zyi9XqWWslo4whAvB5mK9Xt7Onubd6+n126+zRlVv4CxF+AdEf1ws99p5/dieflAD1cf11vmQVmUYJUJ9+v105xqM8y1Aeq1k5S3Euo0FplAj1NxbxN4zGfvTfiCe/EXZlAGOEEzOxb2x9WnmRWfn7o2wmzYIBz6jLGOfET78hZ6QjNx0HGNSP/0zUU7DvG7nTU5foPc2Xi8c7BrxHgFzMQsd3XpFqpCj3v59n9wL2SQ7xl49/fi9XbKrMLgcSK85rRJSEulY3xzSqxBCbN2xFx6yCASs5WuUPValxqmBeQ85qpB2BtQ+QNf+2lp+9cEGtWixFK0dLy8rRUrxytByxcrSUrhwt7StHS8nK0ZJeOWr/zE6kNsDmwUyilh528J5WK0/PEmffVhyDlhzj89rFJbW+tpStry1t62tL0fra0rK+tvpTz6icqaUKozHeLNU6gPi80tOncmbmDD1LAa45BMqZaEQIy5vdf3lcsoiVlOSuBOAVSl6vl4tPz+s5E36So/znP5nk5z8xZjm0YoNPapSuB21Mslai1OU9E7q8J5i8uVtHTdE5bVlbTLEZ7VhLi5H5w/au3MpfCQ3QGslaYWqUFNWbP6yX3/nsSo85MLvVlhYju54l3BYSTEHdOakpOrvu1GKKza07lRYn//H4O2PTZluMsTkvxU5CjPnHjNmmaiHGZOcakWPc3BrmlPKrkHeH0PFzvY6yRw233pfPdRQR1/Mde1qCvIn2SXEwHy7twjg8sF16HMIx2MRsF60lyKWz+XqczW8IVhf1VyZ00QSri07OKmGFXg2HcNxnaXH09G+RemHbtSFWL+foTTDC6lPGuywyx5i1BIdwlJQ+utyZ7yxM+CIJvgRYPI7lUoDIpULAPrpk5EcvC7dpEJoPrGM/MyHdFMcQY8HOKjoc49DbHo4cr7PaRvd+ets0zYIo8fNQZtVBkb7S2gtgRvjtJTULJo1w5bYbA8gILzXZE6pRT1iGoJI8XQWgPZTn5/pCk835u8SrA7J5pok4JVsU0q1siXRKlCGWdP1hxRcehyTv45hGSV4GZBU4nyEjvIR14wwZ4WVKtL8z17RaKSV2h7Ej70ePdCYo2CBveAe8QX9bOGQKB+TWcfj5gqrD5BtU+qGDtAu093smOFORh97bw+yzM72lHZKr4TJjutUIMWb4V+HHPGopxbhJuOdRtRBl6kbWxLn3Dr76waS3EZhPFQmHZ1BpUXKxYWKLDcZkT8asczAz+GmXeN0+MGsnTgJcy2FJEr45m5yEQ+bxR/jOahEbIcAsG+M91Ct4m3dGj2MFYvdQBrtj5Utfb3dgzfVAyAgv3pwPwQz9THC3tGwTyiaBl4QgZOhV3wqjCT8rUWrZEnMHkxADdZKEqEcpqFs1rhWadSEjvYSJCcNwb+V+FsxAjdK7YW+ZJl0I6sUPQIkwAKdqLDxNESFYA+dqYefvq+tfPf/151UTMO83R1eUQzmyoreCBMrFfdTWFVNsMzmVP0WbYnMzgeDkbicK5VZ1Oe6NO4QY5VMPESawq0l21yDV3ajYsaJQbqfqcM23ahBjfH6T+5A1V14KsRIYXF1fX/6TO93vqxE6c+jcV/foJkbT/sVXL94vG8eVoa4U5eqmlYnVSpRaxpVickstSlZKhR+Z5FILkbVhzkzhRopyWSl8UqJUZgqftSiZmcJnLUA2K3C8BG6UGJWTvCchxuQl7lmKcXlJe5b2uNGVL43QBiMgH0EMMkCPOXDiafXFGJsR+aqnxciMiBo97YC8FcXEA/SYAy/Ft3SKB/JyGYwpl4EwlQJrKgWSyIFDOcpnRA7sizE2u9YG1lobyCMHYhCLlyQ3qMiBzUW8yIFDOcpn1bvAWu9YkQM7SozKaj8Dsv0MhJEDQQLmwoscOJRb+ZIHoSMHNpexIweCBNxlLTFYU2xe5MChHOWzGyKq9XGOHNhRYlRJ5EAMgnoxIgf2xTibFTkQ0GMO/MiBMALyEUcORCmkm3vkQEAPOMgi+4EEwEUa2Q9hQE6CyH6AHnBgRfZrCwmm8174vhhiCyL7AXrQgRfZr6eFyZyYO10pyXX/9gfQQw7s77MHahudV2gs32cPr3H8pAICIB6s77P7YpjN+USqKyW53KTHvzzuXcBLdPTL49Pvrp8GtXQwkdskIpH9zG+8yH4dJUhlRvbri2E2v8oTkf36P7NKnSWy3+ASRsmjI/tVV3ArJBbZr/MbM2Ho2siO7NcXQ2xuZL++GGLLIvvBCMCHHdmvL7awVyI4NJITRvaDEYCPILLfUG7hL0T4BURnRfbrKAEqL7JfRwlQGZH9zjKUx2pW0Mh+rR8ZDQoW2e/0228s4m8Yjf3ovxFP3gqWt0h2KdsD4Ix0ZCb8EGP3m+Lpxj3ZBE817omSKJjkqWrOSMcJnq7CYH6C6IwIY5wTPy2t0RmxK7lpaYvOeL6Q/0zUU7DvG7lTSXRGkAC58KIzdqUolxWdcSiH+JNEZyRJqCsjOmNfDLF5Uw903iGYdJAzDv50g5prCOam5MxU2tVZezlZB2fr29iLT9TK01K0+re0rP4txat/yxGrf0vp6t/Svvq3lKz+LenVP1F0Rghg82AmER6dsb6CG51xKMf4vHZxSa2RLmVrpEvbGulStEa6tKyRukdnbFQYjfH2Do7OaH5hRmfsSgGuc3TGkwhhMaIzdqUkdyUAr1AyKzrjUI7yHYMotoUYkxWdcaBG6a7RGTtKlLq8Z0KX9wSTN3ejojN2fue0ZUR0xs7PjHYMj87Y/MoftpPRGYcXrIQGaI1krRJi0Rk7vzGiMwJ6zIHZreLRGZtfXaMztoUEU1B3kOiMnd/ZdQeOztj5mVt3wOiMrV/dozP2xRib82ITic7Y/OQanbEtxJjsXCNyjJtbYE5l4bkZzDfuL3V7esLBFBaJQ60nHCR0iJyad7LMCVZHOyAr4e5xZd09PrjC42zPRSiYG2/ftaL3XSvxPmY1Yh9zLtiHnZP7sF+F31G8Wr+jeJW8RX6l3yK/it4iv5JvkX98SrMo2WudnlGu/sry9ZtbawkBRnjch4nYRjP6To/HMDHXhL5Kk1VuJHd+7rtZIRDS6w8/LhxjvUCAER7OKQczek5x+BrG5YfgSRq4fd7dlYJc/W82uNH2yS9eEMahYwSvRgXQUj/Wz5HtnYEn4ZC5y0Ln+zOaISlKlGvoxUY1pLnGVaokAKc4eFEeOm6cawuHzCzUVS58dU63kw4nej8cxxA97ZCs8sx8eu0KrWU93iH4xdvE6faHF+jmxkSdCN3iEEGAgcd1fYmvDnwfGNLzSquzclmjt562Rz7+2KrLK1OAMj+P0kR5/nYbHnPfNTQFBYI9TSSDvWMT3JXC3OMm9MJkm70fGWEyEQbg9Ju3KZKAkUonIcg8+pkKvZfQdy1JQznAvykfLAjLB3PGd9R9eqqL17u39bcvYdXRBK6jBRhB+rj2CQM1RVdhzodrsYXtHfzjUQ+IRB4nCOxVtifcRGrEBNu18+tpYbIZoZTBQZn0tp5w4KZLIybYBz/fvrDhpbpHN1HxvF2a/fCKRPm7ULchu11oBtS6nTJtrFukJDuu788++yIjzr4wv+l/+yYiCKdVAvSEw7F6A+3l+umVfvgD22tAIlzV/1/auWUpCgNh+H12Mm+jjivpBeRgjMKRJhkSbNrVTypchKSiXcUzfN+vAjEXTqq6Nv73/mKHTYKXGQ+1wf9QiJu3T9GKTK0Psfuz/yuuhStVewzbtVH1iCKbAxubbciY8Ky/8Zd+36rzlpCVI5vkT9jDmVuSVo5skpWFcxsvzsqRT/rXbgoZ8chvfX+XPX8Xwzk3e/4ONcQpZbHbNnxBDWkK7IW2NQdzpElHeP19YxLmiJP8MaUMfSf+JYg5ybMjM5WzCeNanhFIxNoZsq4zqQc63lQRMIiJ2sEamdTEmLGZKcRmhdWtU+SvOYOpk9pVHRDUI5qurhmywCFG4j7mA5J6jCbfXx5BPaw7Y+LyRqF6rtSjiLcjTkeNTGqijiQHBPWEgc2layRDOLOIuawu9M8IEOLS9GcVmNR0hyl2qipAqYu8H/TIRCYHd0uYnCBWTFiCkfM+9QmYq2oIjySwV9Vi+I37Y5P8442d+pAjfJxwEAUMWCra/8ETQ3y1I7tql3pOUjeWagpQ6pJG12RXgBBXW8Pe3mdq0Zc1inup/1dPDPe1YbGOoxxI1Hpm+JD7xPfnfEfWH6PqZjB1qt6JW0cVDlRq83+OtlTWcT7kkk3N1dlQhR5BPM1Fk0WewUxldYLtXptv+kdbsKkZ2onOFlfy0zKDqbMpPqGgSWNdW1SNIz/aMY8kWFEVR1FXltyaLVDMK6m9+ZlKbVpaA0tN/mYjX7UlmzE3WpZK3ljmkU3NRlZUoUcQz3x/CKPaSpObpUSAZIwrDvw7LTVkU8bVDG7EhKd+y2kmLN5OWF5vweZ6C7ZvFPlxCFDsMoWyQp7ktHRJk8Y0bnftYT8vjYbpGMuJQTRoHmdVYEWiVv7v8+q3gSHWmEp+PwI1ZFOmH46fsjBEKf2WIgj96xoI42Hf3FBLe6zIrBXqIIXKXqxyQy882USzMzsosGP2zKin4H3GYWvGIZ9xgBPCujL3wiwV2ZyhMhCUAGCmPAU/yKAXV8tafpJmP+H1NQOFqonFp9/r8vnEEogrMmt1ml5yL6FxO29hsX9d/2Q8bCWscnWSddFnOHbDK/Xn6gpjmbAYW9RX3VaupI1U85oXeXffLbt8099jyjiwJNNCHaGwcGutYOzel7VgaXCGdH1ojiwjZ83nEuAzQGPkel7Ck0cSYJIl/Dn4M0pFT4h4PMEfCKVE6U9hyuMJtdY368doNyXOfsAGA0JOEKLB84YRJ7VhXLO/f/0H471n2grTBAA= EOF # We are renaming openssl to openssl_grpc so that there is no conflict with openssl if it exists From 389c076bdb390458cce6d950ba3e3379b0e57f1c Mon Sep 17 00:00:00 2001 From: Muxi Yan Date: Tue, 7 Apr 2020 11:44:51 -0700 Subject: [PATCH 388/758] fix regeneration script with boringssl-with-bazel --- src/boringssl/boringssl_prefix_symbols.h | 31 ++++++++++++++----- src/objective-c/BoringSSL-GRPC.podspec | 2 +- .../generate_boringssl_prefix_header.sh | 8 +++-- 3 files changed, 29 insertions(+), 12 deletions(-) diff --git a/src/boringssl/boringssl_prefix_symbols.h b/src/boringssl/boringssl_prefix_symbols.h index e5805fa5abc..72b63f318a7 100644 --- a/src/boringssl/boringssl_prefix_symbols.h +++ b/src/boringssl/boringssl_prefix_symbols.h @@ -1,4 +1,5 @@ -// generated by generate_boringssl_prefix_header.sh on BoringSSL commit: 7f02881e96e51f1873afcf384d02f782b48967ca +// generated by generate_boringssl_prefix_header.sh on BoringSSL commit: 1c2769383f027befac5b75b6cedd25daf3bf4dcf + // Copyright (c) 2018, Google Inc. // // Permission to use, copy, modify, and/or distribute this software for any @@ -76,7 +77,6 @@ #define GRPC_SSL_CTX_clear_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_clear_mode) #define GRPC_SSL_CTX_clear_options BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_clear_options) #define GRPC_SSL_CTX_enable_ocsp_stapling BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_enable_ocsp_stapling) -#define GRPC_SSL_CTX_enable_pq_experiment_signal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_enable_pq_experiment_signal) #define GRPC_SSL_CTX_enable_signed_cert_timestamps BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_enable_signed_cert_timestamps) #define GRPC_SSL_CTX_enable_tls_channel_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_enable_tls_channel_id) #define GRPC_SSL_CTX_flush_sessions BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_flush_sessions) @@ -190,7 +190,6 @@ #define GRPC_SSL_CTX_set_read_ahead BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_read_ahead) #define GRPC_SSL_CTX_set_retain_only_sha256_of_client_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_retain_only_sha256_of_client_certs) #define GRPC_SSL_CTX_set_reverify_on_resume BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_reverify_on_resume) -#define GRPC_SSL_CTX_set_rsa_pss_rsae_certs_enabled BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_rsa_pss_rsae_certs_enabled) #define GRPC_SSL_CTX_set_select_certificate_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_select_certificate_cb) #define GRPC_SSL_CTX_set_session_cache_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_session_cache_mode) #define GRPC_SSL_CTX_set_session_id_context BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_session_id_context) @@ -361,6 +360,7 @@ #define GRPC_SSL_get_servername_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_servername_type) #define GRPC_SSL_get_session BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_session) #define GRPC_SSL_get_shared_ciphers BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_shared_ciphers) +#define GRPC_SSL_get_shared_sigalgs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_shared_sigalgs) #define GRPC_SSL_get_shutdown BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_shutdown) #define GRPC_SSL_get_signature_algorithm_digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_signature_algorithm_digest) #define GRPC_SSL_get_signature_algorithm_key_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_signature_algorithm_key_type) @@ -399,7 +399,6 @@ #define GRPC_SSL_num_renegotiations BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_num_renegotiations) #define GRPC_SSL_peek BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_peek) #define GRPC_SSL_pending BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_pending) -#define GRPC_SSL_pq_experiment_signal_seen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_pq_experiment_signal_seen) #define GRPC_SSL_process_quic_post_handshake BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_process_quic_post_handshake) #define GRPC_SSL_provide_quic_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_provide_quic_data) #define GRPC_SSL_quic_max_handshake_flight_len BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_quic_max_handshake_flight_len) @@ -504,6 +503,7 @@ #define GRPC_SSL_use_certificate_ASN1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_use_certificate_ASN1) #define GRPC_SSL_use_certificate_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_use_certificate_file) #define GRPC_SSL_use_psk_identity_hint BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_use_psk_identity_hint) +#define GRPC_SSL_used_hello_retry_request BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_used_hello_retry_request) #define GRPC_SSL_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_version) #define GRPC_SSL_want BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_want) #define GRPC_SSL_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_write) @@ -994,6 +994,7 @@ #define GRPC_BUF_strnlen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BUF_strnlen) #define GRPC_CBB_add_asn1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_add_asn1) #define GRPC_CBB_add_asn1_bool BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_add_asn1_bool) +#define GRPC_CBB_add_asn1_int64 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_add_asn1_int64) #define GRPC_CBB_add_asn1_octet_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_add_asn1_octet_string) #define GRPC_CBB_add_asn1_oid_from_text BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_add_asn1_oid_from_text) #define GRPC_CBB_add_asn1_uint64 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_add_asn1_uint64) @@ -1001,10 +1002,13 @@ #define GRPC_CBB_add_space BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_add_space) #define GRPC_CBB_add_u16 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_add_u16) #define GRPC_CBB_add_u16_length_prefixed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_add_u16_length_prefixed) +#define GRPC_CBB_add_u16le BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_add_u16le) #define GRPC_CBB_add_u24 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_add_u24) #define GRPC_CBB_add_u24_length_prefixed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_add_u24_length_prefixed) #define GRPC_CBB_add_u32 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_add_u32) +#define GRPC_CBB_add_u32le BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_add_u32le) #define GRPC_CBB_add_u64 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_add_u64) +#define GRPC_CBB_add_u64le BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_add_u64le) #define GRPC_CBB_add_u8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_add_u8) #define GRPC_CBB_add_u8_length_prefixed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_add_u8_length_prefixed) #define GRPC_CBB_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_cleanup) @@ -1033,6 +1037,7 @@ #define GRPC_CBS_get_asn1_bool BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_get_asn1_bool) #define GRPC_CBS_get_asn1_element BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_get_asn1_element) #define GRPC_CBS_get_asn1_implicit_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_get_asn1_implicit_string) +#define GRPC_CBS_get_asn1_int64 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_get_asn1_int64) #define GRPC_CBS_get_asn1_uint64 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_get_asn1_uint64) #define GRPC_CBS_get_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_get_bytes) #define GRPC_CBS_get_last_u8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_get_last_u8) @@ -1042,10 +1047,13 @@ #define GRPC_CBS_get_optional_asn1_uint64 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_get_optional_asn1_uint64) #define GRPC_CBS_get_u16 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_get_u16) #define GRPC_CBS_get_u16_length_prefixed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_get_u16_length_prefixed) +#define GRPC_CBS_get_u16le BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_get_u16le) #define GRPC_CBS_get_u24 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_get_u24) #define GRPC_CBS_get_u24_length_prefixed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_get_u24_length_prefixed) #define GRPC_CBS_get_u32 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_get_u32) +#define GRPC_CBS_get_u32le BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_get_u32le) #define GRPC_CBS_get_u64 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_get_u64) +#define GRPC_CBS_get_u64le BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_get_u64le) #define GRPC_CBS_get_u8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_get_u8) #define GRPC_CBS_get_u8_length_prefixed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_get_u8_length_prefixed) #define GRPC_CBS_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_init) @@ -1501,6 +1509,9 @@ #define GRPC_EVP_PKEY_CTX_set_rsa_mgf1_md BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_CTX_set_rsa_mgf1_md) #define GRPC_EVP_PKEY_CTX_set_rsa_oaep_md BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_CTX_set_rsa_oaep_md) #define GRPC_EVP_PKEY_CTX_set_rsa_padding BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_CTX_set_rsa_padding) +#define GRPC_EVP_PKEY_CTX_set_rsa_pss_keygen_md BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_CTX_set_rsa_pss_keygen_md) +#define GRPC_EVP_PKEY_CTX_set_rsa_pss_keygen_mgf1_md BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_CTX_set_rsa_pss_keygen_mgf1_md) +#define GRPC_EVP_PKEY_CTX_set_rsa_pss_keygen_saltlen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_CTX_set_rsa_pss_keygen_saltlen) #define GRPC_EVP_PKEY_CTX_set_rsa_pss_saltlen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_CTX_set_rsa_pss_saltlen) #define GRPC_EVP_PKEY_CTX_set_signature_md BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_CTX_set_signature_md) #define GRPC_EVP_PKEY_assign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_assign) @@ -1686,7 +1697,6 @@ #define GRPC_HRSS_generate_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_HRSS_generate_key) #define GRPC_HRSS_marshal_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_HRSS_marshal_public_key) #define GRPC_HRSS_parse_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_HRSS_parse_public_key) -#define GRPC_HRSS_poly2_rotr_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_HRSS_poly2_rotr_consttime) #define GRPC_HRSS_poly3_invert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_HRSS_poly3_invert) #define GRPC_HRSS_poly3_mul BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_HRSS_poly3_mul) #define GRPC_ISSUING_DIST_POINT_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ISSUING_DIST_POINT_free) @@ -1765,11 +1775,15 @@ #define GRPC_OPENSSL_load_builtin_modules BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OPENSSL_load_builtin_modules) #define GRPC_OPENSSL_malloc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OPENSSL_malloc) #define GRPC_OPENSSL_malloc_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OPENSSL_malloc_init) +#define GRPC_OPENSSL_memdup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OPENSSL_memdup) #define GRPC_OPENSSL_no_config BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OPENSSL_no_config) #define GRPC_OPENSSL_realloc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OPENSSL_realloc) #define GRPC_OPENSSL_strcasecmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OPENSSL_strcasecmp) #define GRPC_OPENSSL_strdup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OPENSSL_strdup) +#define GRPC_OPENSSL_strlcat BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OPENSSL_strlcat) +#define GRPC_OPENSSL_strlcpy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OPENSSL_strlcpy) #define GRPC_OPENSSL_strncasecmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OPENSSL_strncasecmp) +#define GRPC_OPENSSL_strndup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OPENSSL_strndup) #define GRPC_OPENSSL_strnlen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OPENSSL_strnlen) #define GRPC_OPENSSL_tolower BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OPENSSL_tolower) #define GRPC_OTHERNAME_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OTHERNAME_cmp) @@ -2642,6 +2656,7 @@ #define GRPC_aes_hw_set_decrypt_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_aes_hw_set_decrypt_key) #define GRPC_aes_hw_set_encrypt_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_aes_hw_set_encrypt_key) #define GRPC_aes_nohw_cbc_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_aes_nohw_cbc_encrypt) +#define GRPC_aes_nohw_ctr32_encrypt_blocks BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_aes_nohw_ctr32_encrypt_blocks) #define GRPC_aes_nohw_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_aes_nohw_decrypt) #define GRPC_aes_nohw_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_aes_nohw_encrypt) #define GRPC_aes_nohw_set_decrypt_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_aes_nohw_set_decrypt_key) @@ -2951,17 +2966,17 @@ #define GRPC_ecp_nistz256_sqr_mont BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ecp_nistz256_sqr_mont) #define GRPC_ed25519_asn1_meth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ed25519_asn1_meth) #define GRPC_ed25519_pkey_meth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ed25519_pkey_meth) -#define GRPC_gcm_ghash_4bit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_gcm_ghash_4bit) #define GRPC_gcm_ghash_avx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_gcm_ghash_avx) #define GRPC_gcm_ghash_clmul BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_gcm_ghash_clmul) +#define GRPC_gcm_ghash_nohw BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_gcm_ghash_nohw) #define GRPC_gcm_ghash_ssse3 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_gcm_ghash_ssse3) -#define GRPC_gcm_gmult_4bit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_gcm_gmult_4bit) #define GRPC_gcm_gmult_avx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_gcm_gmult_avx) #define GRPC_gcm_gmult_clmul BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_gcm_gmult_clmul) +#define GRPC_gcm_gmult_nohw BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_gcm_gmult_nohw) #define GRPC_gcm_gmult_ssse3 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_gcm_gmult_ssse3) -#define GRPC_gcm_init_4bit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_gcm_init_4bit) #define GRPC_gcm_init_avx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_gcm_init_avx) #define GRPC_gcm_init_clmul BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_gcm_init_clmul) +#define GRPC_gcm_init_nohw BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_gcm_init_nohw) #define GRPC_gcm_init_ssse3 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_gcm_init_ssse3) #define GRPC_i2a_ACCESS_DESCRIPTION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2a_ACCESS_DESCRIPTION) #define GRPC_i2a_ASN1_ENUMERATED BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2a_ASN1_ENUMERATED) diff --git a/src/objective-c/BoringSSL-GRPC.podspec b/src/objective-c/BoringSSL-GRPC.podspec index 9aef9d2cc57..eff218d8570 100644 --- a/src/objective-c/BoringSSL-GRPC.podspec +++ b/src/objective-c/BoringSSL-GRPC.podspec @@ -213,7 +213,7 @@ Pod::Spec.new do |s| # /src/boringssl/boringssl_prefix_symbols.h. Here we decode the content and inject the header to # the correct location in BoringSSL. base64 -D < src/include/openssl/boringssl_prefix_symbols.h - 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 EOF # We are renaming openssl to openssl_grpc so that there is no conflict with openssl if it exists diff --git a/tools/distrib/generate_boringssl_prefix_header.sh b/tools/distrib/generate_boringssl_prefix_header.sh index f06f3c6128c..740c58b26ac 100755 --- a/tools/distrib/generate_boringssl_prefix_header.sh +++ b/tools/distrib/generate_boringssl_prefix_header.sh @@ -23,8 +23,10 @@ set -ev +BORINGSSL_ROOT=third_party/boringssl-with-bazel/src + cd "$(dirname $0)" -cd ../../third_party/boringssl-with-bazel +cd ../../$BORINGSSL_ROOT BORINGSSL_COMMIT=$(git rev-parse HEAD) BORINGSSL_PREFIX_HEADERS_DIR=src/boringssl @@ -48,11 +50,11 @@ make boringssl_prefix_symbols [ -f symbol_prefix_include/boringssl_prefix_symbols.h ] || { echo "Failed to build boringssl_prefix_symbols.sh" ; exit 1 ; } -cd ../../.. +cd ../../../.. mkdir -p $BORINGSSL_PREFIX_HEADERS_DIR echo "// generated by generate_boringssl_prefix_header.sh on BoringSSL commit: $BORINGSSL_COMMIT" > $BORINGSSL_PREFIX_HEADERS_DIR/boringssl_prefix_symbols.h echo "" >> $BORINGSSL_PREFIX_HEADERS_DIR/boringssl_prefix_symbols.h -cat third_party/boringssl-with-bazel/build/symbol_prefix_include/boringssl_prefix_symbols.h >> $BORINGSSL_PREFIX_HEADERS_DIR/boringssl_prefix_symbols.h +cat "$BORINGSSL_ROOT/build/symbol_prefix_include/boringssl_prefix_symbols.h" >> $BORINGSSL_PREFIX_HEADERS_DIR/boringssl_prefix_symbols.h # Regenerated the project tools/buildgen/generate_projects.sh From ee7326904f857e2d739e2c491fed8619de913ecb Mon Sep 17 00:00:00 2001 From: Muxi Yan Date: Tue, 7 Apr 2020 12:54:02 -0700 Subject: [PATCH 389/758] fix sanity checker --- tools/distrib/check_boringssl_prefix_symbol.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/distrib/check_boringssl_prefix_symbol.sh b/tools/distrib/check_boringssl_prefix_symbol.sh index ecf48660e8c..52a0460cdd4 100755 --- a/tools/distrib/check_boringssl_prefix_symbol.sh +++ b/tools/distrib/check_boringssl_prefix_symbol.sh @@ -17,7 +17,7 @@ set -e cd "$(dirname $0)" -cd ../../third_party/boringssl +cd ../../third_party/boringssl-with-bazel BORINGSSL_COMMIT=$(git rev-parse HEAD) PREFIX_SYMBOLS_COMMIT=$(cat ../../src/boringssl/boringssl_prefix_symbols.h | head -n1 | awk '{print $NF}') From 9d298ccb19eb720234d1aa2419c49393def7f9ba Mon Sep 17 00:00:00 2001 From: Muxi Yan Date: Tue, 7 Apr 2020 12:57:10 -0700 Subject: [PATCH 390/758] build_projects --- src/objective-c/BoringSSL-GRPC.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/objective-c/BoringSSL-GRPC.podspec b/src/objective-c/BoringSSL-GRPC.podspec index eff218d8570..cf93c7ed58d 100644 --- a/src/objective-c/BoringSSL-GRPC.podspec +++ b/src/objective-c/BoringSSL-GRPC.podspec @@ -213,7 +213,7 @@ Pod::Spec.new do |s| # /src/boringssl/boringssl_prefix_symbols.h. Here we decode the content and inject the header to # the correct location in BoringSSL. base64 -D < src/include/openssl/boringssl_prefix_symbols.h - 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 EOF # We are renaming openssl to openssl_grpc so that there is no conflict with openssl if it exists From e50c9a8e2e2a09be8ade94f5e5ed873da11d1379 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Tue, 7 Apr 2020 13:54:21 -0700 Subject: [PATCH 391/758] Fix typo in the comment --- src/python/grpcio/grpc/experimental/aio/_base_call.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/python/grpcio/grpc/experimental/aio/_base_call.py b/src/python/grpcio/grpc/experimental/aio/_base_call.py index 8ea8e90c8b1..214e208c005 100644 --- a/src/python/grpcio/grpc/experimental/aio/_base_call.py +++ b/src/python/grpcio/grpc/experimental/aio/_base_call.py @@ -123,9 +123,9 @@ class Call(RpcContext, metaclass=ABCMeta): This is an EXPERIMENTAL method. - This method makes ensure if the RPC has been successfully connected. - Otherwise, an AioRpcError will be raised to explain the reason of the - connection failure. + This method ensures the RPC has been successfully connected. Otherwise, + an AioRpcError will be raised to explain the reason of the connection + failure. This method is recommended for building retry mechanisms. """ From 3de85634f3525086d13898afddfd6d88390aa1f0 Mon Sep 17 00:00:00 2001 From: Hannah Shi Date: Tue, 7 Apr 2020 20:54:48 +0000 Subject: [PATCH 392/758] add an instruction of setting a flag before c-core make, after #22416 merged --- src/php/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/php/README.md b/src/php/README.md index f064ff0d698..e589408b0c3 100644 --- a/src/php/README.md +++ b/src/php/README.md @@ -58,7 +58,7 @@ $ git clone -b RELEASE_TAG_HERE https://github.com/grpc/grpc ```sh $ cd grpc $ git submodule update --init -$ make +$ EXTRA_DEFINES=GRPC_POSIX_FORK_ALLOW_PTHREAD_ATFORK make $ [sudo] make install ``` From f8f6034d1a0d3ab1fe2471096546bf699878d49c Mon Sep 17 00:00:00 2001 From: "Mark D. Roth" Date: Tue, 7 Apr 2020 10:03:05 -0700 Subject: [PATCH 393/758] Refactor xds LB policy --- BUILD | 105 +- BUILD.gn | 8 +- CMakeLists.txt | 14 +- Makefile | 12 +- build_autogenerated.yaml | 16 +- config.m4 | 8 +- config.w32 | 8 +- doc/environment_variables.md | 5 +- gRPC-C++.podspec | 2 + gRPC-Core.podspec | 8 +- grpc.gemspec | 7 +- grpc.gyp | 14 +- include/grpc/impl/codegen/grpc_types.h | 17 +- package.xml | 7 +- .../lb_policy/address_filtering.cc | 83 + .../lb_policy/address_filtering.h | 99 + .../lb_policy/priority/priority.cc | 875 ++++++++ .../weighted_target/weighted_target.cc | 722 +++++++ .../client_channel/lb_policy/xds/cds.cc | 65 +- .../client_channel/lb_policy/xds/eds.cc | 1172 +++++++++++ .../client_channel/lb_policy/xds/lrs.cc | 524 +++++ .../client_channel/lb_policy/xds/xds.cc | 1754 ----------------- .../client_channel/lb_policy/xds/xds.h | 3 +- .../client_channel/lb_policy_registry.cc | 2 + .../client_channel/xds/xds_client_stats.h | 18 +- .../plugin_registry/grpc_plugin_registry.cc | 20 +- .../grpc_unsecure_plugin_registry.cc | 20 +- src/python/grpcio/grpc_core_dependencies.py | 6 +- .../client_channel/service_config_test.cc | 8 +- test/cpp/end2end/xds_end2end_test.cc | 8 +- tools/doxygen/Doxyfile.c++.internal | 7 +- tools/doxygen/Doxyfile.core.internal | 7 +- .../grpc_xds_bazel_python_test_in_docker.sh | 2 +- .../linux/grpc_xds_bazel_test_in_docker.sh | 2 +- 34 files changed, 3789 insertions(+), 1839 deletions(-) create mode 100644 src/core/ext/filters/client_channel/lb_policy/address_filtering.cc create mode 100644 src/core/ext/filters/client_channel/lb_policy/address_filtering.h create mode 100644 src/core/ext/filters/client_channel/lb_policy/priority/priority.cc create mode 100644 src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc create mode 100644 src/core/ext/filters/client_channel/lb_policy/xds/eds.cc create mode 100644 src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc delete mode 100644 src/core/ext/filters/client_channel/lb_policy/xds/xds.cc diff --git a/BUILD b/BUILD index 992d1d403cc..81de8203a03 100644 --- a/BUILD +++ b/BUILD @@ -319,8 +319,9 @@ grpc_cc_library( deps = [ "grpc_common", "grpc_lb_policy_cds", + "grpc_lb_policy_eds", "grpc_lb_policy_grpclb", - "grpc_lb_policy_xds", + "grpc_lb_policy_lrs", "grpc_resolver_xds", ], ) @@ -337,8 +338,9 @@ grpc_cc_library( deps = [ "grpc_common", "grpc_lb_policy_cds_secure", + "grpc_lb_policy_eds_secure", "grpc_lb_policy_grpclb_secure", - "grpc_lb_policy_xds_secure", + "grpc_lb_policy_lrs_secure", "grpc_resolver_xds_secure", "grpc_secure", "grpc_transport_chttp2_client_secure", @@ -1023,7 +1025,9 @@ grpc_cc_library( "grpc_deadline_filter", "grpc_client_authority_filter", "grpc_lb_policy_pick_first", + "grpc_lb_policy_priority", "grpc_lb_policy_round_robin", + "grpc_lb_policy_weighted_target", "grpc_client_idle_filter", "grpc_max_age_filter", "grpc_message_size_filter", @@ -1357,41 +1361,75 @@ grpc_cc_library( ) grpc_cc_library( - name = "grpc_lb_policy_xds", + name = "grpc_lb_policy_cds", srcs = [ - "src/core/ext/filters/client_channel/lb_policy/xds/xds.cc", + "src/core/ext/filters/client_channel/lb_policy/xds/cds.cc", + ], + language = "c++", + deps = [ + "grpc_base", + "grpc_client_channel", + "grpc_xds_client", + ], +) + +grpc_cc_library( + name = "grpc_lb_policy_cds_secure", + srcs = [ + "src/core/ext/filters/client_channel/lb_policy/xds/cds.cc", + ], + language = "c++", + deps = [ + "grpc_base", + "grpc_client_channel", + "grpc_xds_client_secure", + ], +) + +grpc_cc_library( + name = "grpc_lb_policy_eds", + srcs = [ + "src/core/ext/filters/client_channel/lb_policy/xds/eds.cc", ], hdrs = [ "src/core/ext/filters/client_channel/lb_policy/xds/xds.h", ], + external_deps = [ + "absl/strings", + ], language = "c++", deps = [ "grpc_base", "grpc_client_channel", + "grpc_lb_address_filtering", "grpc_xds_client", ], ) grpc_cc_library( - name = "grpc_lb_policy_xds_secure", + name = "grpc_lb_policy_eds_secure", srcs = [ - "src/core/ext/filters/client_channel/lb_policy/xds/xds.cc", + "src/core/ext/filters/client_channel/lb_policy/xds/eds.cc", ], hdrs = [ "src/core/ext/filters/client_channel/lb_policy/xds/xds.h", ], + external_deps = [ + "absl/strings", + ], language = "c++", deps = [ "grpc_base", "grpc_client_channel", + "grpc_lb_address_filtering", "grpc_xds_client_secure", ], ) grpc_cc_library( - name = "grpc_lb_policy_cds", + name = "grpc_lb_policy_lrs", srcs = [ - "src/core/ext/filters/client_channel/lb_policy/xds/cds.cc", + "src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc", ], language = "c++", deps = [ @@ -1402,9 +1440,9 @@ grpc_cc_library( ) grpc_cc_library( - name = "grpc_lb_policy_cds_secure", + name = "grpc_lb_policy_lrs_secure", srcs = [ - "src/core/ext/filters/client_channel/lb_policy/xds/cds.cc", + "src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc", ], language = "c++", deps = [ @@ -1414,6 +1452,24 @@ grpc_cc_library( ], ) +grpc_cc_library( + name = "grpc_lb_address_filtering", + srcs = [ + "src/core/ext/filters/client_channel/lb_policy/address_filtering.cc", + ], + hdrs = [ + "src/core/ext/filters/client_channel/lb_policy/address_filtering.h", + ], + external_deps = [ + "absl/strings", + ], + language = "c++", + deps = [ + "grpc_base", + "grpc_client_channel", + ], +) + grpc_cc_library( name = "grpc_lb_subchannel_list", hdrs = [ @@ -1452,6 +1508,35 @@ grpc_cc_library( ], ) +grpc_cc_library( + name = "grpc_lb_policy_priority", + srcs = [ + "src/core/ext/filters/client_channel/lb_policy/priority/priority.cc", + ], + external_deps = [ + "absl/strings", + ], + language = "c++", + deps = [ + "grpc_base", + "grpc_client_channel", + "grpc_lb_address_filtering", + ], +) + +grpc_cc_library( + name = "grpc_lb_policy_weighted_target", + srcs = [ + "src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc", + ], + language = "c++", + deps = [ + "grpc_base", + "grpc_client_channel", + "grpc_lb_address_filtering", + ], +) + grpc_cc_library( name = "lb_server_load_reporting_filter", srcs = [ diff --git a/BUILD.gn b/BUILD.gn index 306f2bfa6d8..129ad2b2639 100644 --- a/BUILD.gn +++ b/BUILD.gn @@ -223,6 +223,8 @@ config("grpc_config") { "src/core/ext/filters/client_channel/http_proxy.h", "src/core/ext/filters/client_channel/lb_policy.cc", "src/core/ext/filters/client_channel/lb_policy.h", + "src/core/ext/filters/client_channel/lb_policy/address_filtering.cc", + "src/core/ext/filters/client_channel/lb_policy/address_filtering.h", "src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc", "src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h", "src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc", @@ -238,10 +240,13 @@ config("grpc_config") { "src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc", "src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h", "src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc", + "src/core/ext/filters/client_channel/lb_policy/priority/priority.cc", "src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc", "src/core/ext/filters/client_channel/lb_policy/subchannel_list.h", + "src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc", "src/core/ext/filters/client_channel/lb_policy/xds/cds.cc", - "src/core/ext/filters/client_channel/lb_policy/xds/xds.cc", + "src/core/ext/filters/client_channel/lb_policy/xds/eds.cc", + "src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc", "src/core/ext/filters/client_channel/lb_policy/xds/xds.h", "src/core/ext/filters/client_channel/lb_policy_factory.h", "src/core/ext/filters/client_channel/lb_policy_registry.cc", @@ -962,6 +967,7 @@ config("grpc_config") { ":address_sorting", ":upb", ":absl/types:optional", + ":absl/strings:strings", ":absl/container:inlined_vector", "//third_party/cares", ":address_sorting", diff --git a/CMakeLists.txt b/CMakeLists.txt index 4496b174ba6..27bf340b65a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1315,6 +1315,7 @@ add_library(grpc src/core/ext/filters/client_channel/http_connect_handshaker.cc src/core/ext/filters/client_channel/http_proxy.cc src/core/ext/filters/client_channel/lb_policy.cc + src/core/ext/filters/client_channel/lb_policy/address_filtering.cc src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc @@ -1323,9 +1324,12 @@ add_library(grpc src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc + src/core/ext/filters/client_channel/lb_policy/priority/priority.cc src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc + src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc src/core/ext/filters/client_channel/lb_policy/xds/cds.cc - src/core/ext/filters/client_channel/lb_policy/xds/xds.cc + src/core/ext/filters/client_channel/lb_policy/xds/eds.cc + src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc src/core/ext/filters/client_channel/lb_policy_registry.cc src/core/ext/filters/client_channel/local_subchannel_pool.cc src/core/ext/filters/client_channel/parse_address.cc @@ -1743,6 +1747,7 @@ target_link_libraries(grpc address_sorting upb absl::optional + absl::strings absl::inlined_vector ) if(_gRPC_PLATFORM_IOS OR _gRPC_PLATFORM_MAC) @@ -1969,6 +1974,7 @@ add_library(grpc_unsecure src/core/ext/filters/client_channel/http_connect_handshaker.cc src/core/ext/filters/client_channel/http_proxy.cc src/core/ext/filters/client_channel/lb_policy.cc + src/core/ext/filters/client_channel/lb_policy/address_filtering.cc src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc @@ -1977,9 +1983,12 @@ add_library(grpc_unsecure src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc + src/core/ext/filters/client_channel/lb_policy/priority/priority.cc src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc + src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc src/core/ext/filters/client_channel/lb_policy/xds/cds.cc - src/core/ext/filters/client_channel/lb_policy/xds/xds.cc + src/core/ext/filters/client_channel/lb_policy/xds/eds.cc + src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc src/core/ext/filters/client_channel/lb_policy_registry.cc src/core/ext/filters/client_channel/local_subchannel_pool.cc src/core/ext/filters/client_channel/parse_address.cc @@ -2321,6 +2330,7 @@ target_link_libraries(grpc_unsecure address_sorting upb absl::optional + absl::strings absl::inlined_vector ) if(_gRPC_PLATFORM_IOS OR _gRPC_PLATFORM_MAC) diff --git a/Makefile b/Makefile index 465c2e3a284..d1a58c87a8b 100644 --- a/Makefile +++ b/Makefile @@ -3640,6 +3640,7 @@ LIBGRPC_SRC = \ src/core/ext/filters/client_channel/http_connect_handshaker.cc \ src/core/ext/filters/client_channel/http_proxy.cc \ src/core/ext/filters/client_channel/lb_policy.cc \ + src/core/ext/filters/client_channel/lb_policy/address_filtering.cc \ src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc \ src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc \ src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc \ @@ -3648,9 +3649,12 @@ LIBGRPC_SRC = \ src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc \ src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc \ src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc \ + src/core/ext/filters/client_channel/lb_policy/priority/priority.cc \ src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc \ + src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc \ src/core/ext/filters/client_channel/lb_policy/xds/cds.cc \ - src/core/ext/filters/client_channel/lb_policy/xds/xds.cc \ + src/core/ext/filters/client_channel/lb_policy/xds/eds.cc \ + src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc \ src/core/ext/filters/client_channel/lb_policy_registry.cc \ src/core/ext/filters/client_channel/local_subchannel_pool.cc \ src/core/ext/filters/client_channel/parse_address.cc \ @@ -4269,6 +4273,7 @@ LIBGRPC_UNSECURE_SRC = \ src/core/ext/filters/client_channel/http_connect_handshaker.cc \ src/core/ext/filters/client_channel/http_proxy.cc \ src/core/ext/filters/client_channel/lb_policy.cc \ + src/core/ext/filters/client_channel/lb_policy/address_filtering.cc \ src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc \ src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc \ src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc \ @@ -4277,9 +4282,12 @@ LIBGRPC_UNSECURE_SRC = \ src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc \ src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc \ src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc \ + src/core/ext/filters/client_channel/lb_policy/priority/priority.cc \ src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc \ + src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc \ src/core/ext/filters/client_channel/lb_policy/xds/cds.cc \ - src/core/ext/filters/client_channel/lb_policy/xds/xds.cc \ + src/core/ext/filters/client_channel/lb_policy/xds/eds.cc \ + src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc \ src/core/ext/filters/client_channel/lb_policy_registry.cc \ src/core/ext/filters/client_channel/local_subchannel_pool.cc \ src/core/ext/filters/client_channel/parse_address.cc \ diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml index 9a188b41121..69e0b124799 100644 --- a/build_autogenerated.yaml +++ b/build_autogenerated.yaml @@ -382,6 +382,7 @@ libs: - src/core/ext/filters/client_channel/http_connect_handshaker.h - src/core/ext/filters/client_channel/http_proxy.h - src/core/ext/filters/client_channel/lb_policy.h + - src/core/ext/filters/client_channel/lb_policy/address_filtering.h - src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h - src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h - src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h @@ -740,6 +741,7 @@ libs: - src/core/ext/filters/client_channel/http_connect_handshaker.cc - src/core/ext/filters/client_channel/http_proxy.cc - src/core/ext/filters/client_channel/lb_policy.cc + - src/core/ext/filters/client_channel/lb_policy/address_filtering.cc - src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc - src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc - src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc @@ -748,9 +750,12 @@ libs: - src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc - src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc - src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc + - src/core/ext/filters/client_channel/lb_policy/priority/priority.cc - src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc + - src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc - src/core/ext/filters/client_channel/lb_policy/xds/cds.cc - - src/core/ext/filters/client_channel/lb_policy/xds/xds.cc + - src/core/ext/filters/client_channel/lb_policy/xds/eds.cc + - src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc - src/core/ext/filters/client_channel/lb_policy_registry.cc - src/core/ext/filters/client_channel/local_subchannel_pool.cc - src/core/ext/filters/client_channel/parse_address.cc @@ -1132,6 +1137,7 @@ libs: - address_sorting - upb - absl/types:optional + - absl/strings:strings - absl/container:inlined_vector baselib: true dll: true @@ -1278,6 +1284,7 @@ libs: - src/core/ext/filters/client_channel/http_connect_handshaker.h - src/core/ext/filters/client_channel/http_proxy.h - src/core/ext/filters/client_channel/lb_policy.h + - src/core/ext/filters/client_channel/lb_policy/address_filtering.h - src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h - src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h - src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h @@ -1571,6 +1578,7 @@ libs: - src/core/ext/filters/client_channel/http_connect_handshaker.cc - src/core/ext/filters/client_channel/http_proxy.cc - src/core/ext/filters/client_channel/lb_policy.cc + - src/core/ext/filters/client_channel/lb_policy/address_filtering.cc - src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc - src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc - src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc @@ -1579,9 +1587,12 @@ libs: - src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc - src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc - src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc + - src/core/ext/filters/client_channel/lb_policy/priority/priority.cc - src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc + - src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc - src/core/ext/filters/client_channel/lb_policy/xds/cds.cc - - src/core/ext/filters/client_channel/lb_policy/xds/xds.cc + - src/core/ext/filters/client_channel/lb_policy/xds/eds.cc + - src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc - src/core/ext/filters/client_channel/lb_policy_registry.cc - src/core/ext/filters/client_channel/local_subchannel_pool.cc - src/core/ext/filters/client_channel/parse_address.cc @@ -1888,6 +1899,7 @@ libs: - address_sorting - upb - absl/types:optional + - absl/strings:strings - absl/container:inlined_vector baselib: true dll: true diff --git a/config.m4 b/config.m4 index 66922ad5527..6b450315f4f 100644 --- a/config.m4 +++ b/config.m4 @@ -50,6 +50,7 @@ if test "$PHP_GRPC" != "no"; then src/core/ext/filters/client_channel/http_connect_handshaker.cc \ src/core/ext/filters/client_channel/http_proxy.cc \ src/core/ext/filters/client_channel/lb_policy.cc \ + src/core/ext/filters/client_channel/lb_policy/address_filtering.cc \ src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc \ src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc \ src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc \ @@ -58,9 +59,12 @@ if test "$PHP_GRPC" != "no"; then src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc \ src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc \ src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc \ + src/core/ext/filters/client_channel/lb_policy/priority/priority.cc \ src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc \ + src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc \ src/core/ext/filters/client_channel/lb_policy/xds/cds.cc \ - src/core/ext/filters/client_channel/lb_policy/xds/xds.cc \ + src/core/ext/filters/client_channel/lb_policy/xds/eds.cc \ + src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc \ src/core/ext/filters/client_channel/lb_policy_registry.cc \ src/core/ext/filters/client_channel/local_subchannel_pool.cc \ src/core/ext/filters/client_channel/parse_address.cc \ @@ -821,7 +825,9 @@ if test "$PHP_GRPC" != "no"; then PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel/lb_policy) PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel/lb_policy/grpclb) PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel/lb_policy/pick_first) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel/lb_policy/priority) PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel/lb_policy/round_robin) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel/lb_policy/weighted_target) PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel/lb_policy/xds) PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel/resolver/dns) PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel/resolver/dns/c_ares) diff --git a/config.w32 b/config.w32 index 541cc74b602..59cdbdb1ce4 100644 --- a/config.w32 +++ b/config.w32 @@ -19,6 +19,7 @@ if (PHP_GRPC != "no") { "src\\core\\ext\\filters\\client_channel\\http_connect_handshaker.cc " + "src\\core\\ext\\filters\\client_channel\\http_proxy.cc " + "src\\core\\ext\\filters\\client_channel\\lb_policy.cc " + + "src\\core\\ext\\filters\\client_channel\\lb_policy\\address_filtering.cc " + "src\\core\\ext\\filters\\client_channel\\lb_policy\\child_policy_handler.cc " + "src\\core\\ext\\filters\\client_channel\\lb_policy\\grpclb\\client_load_reporting_filter.cc " + "src\\core\\ext\\filters\\client_channel\\lb_policy\\grpclb\\grpclb.cc " + @@ -27,9 +28,12 @@ if (PHP_GRPC != "no") { "src\\core\\ext\\filters\\client_channel\\lb_policy\\grpclb\\grpclb_client_stats.cc " + "src\\core\\ext\\filters\\client_channel\\lb_policy\\grpclb\\load_balancer_api.cc " + "src\\core\\ext\\filters\\client_channel\\lb_policy\\pick_first\\pick_first.cc " + + "src\\core\\ext\\filters\\client_channel\\lb_policy\\priority\\priority.cc " + "src\\core\\ext\\filters\\client_channel\\lb_policy\\round_robin\\round_robin.cc " + + "src\\core\\ext\\filters\\client_channel\\lb_policy\\weighted_target\\weighted_target.cc " + "src\\core\\ext\\filters\\client_channel\\lb_policy\\xds\\cds.cc " + - "src\\core\\ext\\filters\\client_channel\\lb_policy\\xds\\xds.cc " + + "src\\core\\ext\\filters\\client_channel\\lb_policy\\xds\\eds.cc " + + "src\\core\\ext\\filters\\client_channel\\lb_policy\\xds\\lrs.cc " + "src\\core\\ext\\filters\\client_channel\\lb_policy_registry.cc " + "src\\core\\ext\\filters\\client_channel\\local_subchannel_pool.cc " + "src\\core\\ext\\filters\\client_channel\\parse_address.cc " + @@ -821,7 +825,9 @@ if (PHP_GRPC != "no") { FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_channel\\lb_policy"); FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_channel\\lb_policy\\grpclb"); FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_channel\\lb_policy\\pick_first"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_channel\\lb_policy\\priority"); FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_channel\\lb_policy\\round_robin"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_channel\\lb_policy\\weighted_target"); FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_channel\\lb_policy\\xds"); FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_channel\\resolver"); FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_channel\\resolver\\dns"); diff --git a/doc/environment_variables.md b/doc/environment_variables.md index e79c390c9a3..ab45f937bff 100644 --- a/doc/environment_variables.md +++ b/doc/environment_variables.md @@ -57,6 +57,7 @@ some configuration as environment variables that can be set. - compression - traces compression operations - connectivity_state - traces connectivity state changes to channels - cronet - traces state in the cronet transport engine + - eds_lb - traces eds LB policy - executor - traces grpc's internal thread pool ('the executor') - glb - traces the grpclb load balancer - handshaker - traces handshaking state @@ -66,12 +67,14 @@ some configuration as environment variables that can be set. - http1 - traces HTTP/1.x operations performed by gRPC - inproc - traces the in-process transport - flowctl - traces http2 flow control + - lrs_lb - traces lrs LB policy - op_failure - traces error information when failure is pushed onto a completion queue - pick_first - traces the pick first load balancing policy - plugin_credentials - traces plugin credentials - pollable_refcount - traces reference counting of 'pollable' objects (only in DEBUG) + - priority_lb - traces priority LB policy - resource_quota - trace resource quota objects internals - round_robin - traces the round_robin load balancing policy - queue_pluck @@ -84,8 +87,8 @@ some configuration as environment variables that can be set. - transport_security - traces metadata about secure channel establishment - tcp - traces bytes in and out of a channel - tsi - traces tsi transport security + - weighted_target_lb - traces weighted_target LB policy - xds_client - traces xds client - - xds_lb - traces xds LB policy - xds_resolver - traces xds resolver The following tracers will only run in binaries built in DEBUG mode. This is diff --git a/gRPC-C++.podspec b/gRPC-C++.podspec index c8b176b23ea..77980999b59 100644 --- a/gRPC-C++.podspec +++ b/gRPC-C++.podspec @@ -233,6 +233,7 @@ Pod::Spec.new do |s| 'src/core/ext/filters/client_channel/http_connect_handshaker.h', 'src/core/ext/filters/client_channel/http_proxy.h', 'src/core/ext/filters/client_channel/lb_policy.h', + 'src/core/ext/filters/client_channel/lb_policy/address_filtering.h', 'src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h', 'src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h', 'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h', @@ -683,6 +684,7 @@ Pod::Spec.new do |s| 'src/core/ext/filters/client_channel/http_connect_handshaker.h', 'src/core/ext/filters/client_channel/http_proxy.h', 'src/core/ext/filters/client_channel/lb_policy.h', + 'src/core/ext/filters/client_channel/lb_policy/address_filtering.h', 'src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h', 'src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h', 'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h', diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec index d140b005d7f..749e77b3fa7 100644 --- a/gRPC-Core.podspec +++ b/gRPC-Core.podspec @@ -206,6 +206,8 @@ Pod::Spec.new do |s| 'src/core/ext/filters/client_channel/http_proxy.h', 'src/core/ext/filters/client_channel/lb_policy.cc', 'src/core/ext/filters/client_channel/lb_policy.h', + 'src/core/ext/filters/client_channel/lb_policy/address_filtering.cc', + 'src/core/ext/filters/client_channel/lb_policy/address_filtering.h', 'src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc', 'src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h', 'src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc', @@ -221,10 +223,13 @@ Pod::Spec.new do |s| 'src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc', 'src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h', 'src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc', + 'src/core/ext/filters/client_channel/lb_policy/priority/priority.cc', 'src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc', 'src/core/ext/filters/client_channel/lb_policy/subchannel_list.h', + 'src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc', 'src/core/ext/filters/client_channel/lb_policy/xds/cds.cc', - 'src/core/ext/filters/client_channel/lb_policy/xds/xds.cc', + 'src/core/ext/filters/client_channel/lb_policy/xds/eds.cc', + 'src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc', 'src/core/ext/filters/client_channel/lb_policy/xds/xds.h', 'src/core/ext/filters/client_channel/lb_policy_factory.h', 'src/core/ext/filters/client_channel/lb_policy_registry.cc', @@ -1032,6 +1037,7 @@ Pod::Spec.new do |s| 'src/core/ext/filters/client_channel/http_connect_handshaker.h', 'src/core/ext/filters/client_channel/http_proxy.h', 'src/core/ext/filters/client_channel/lb_policy.h', + 'src/core/ext/filters/client_channel/lb_policy/address_filtering.h', 'src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h', 'src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h', 'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h', diff --git a/grpc.gemspec b/grpc.gemspec index c9a1a8835fd..29e5d3d436b 100644 --- a/grpc.gemspec +++ b/grpc.gemspec @@ -128,6 +128,8 @@ Gem::Specification.new do |s| s.files += %w( src/core/ext/filters/client_channel/http_proxy.h ) s.files += %w( src/core/ext/filters/client_channel/lb_policy.cc ) s.files += %w( src/core/ext/filters/client_channel/lb_policy.h ) + s.files += %w( src/core/ext/filters/client_channel/lb_policy/address_filtering.cc ) + s.files += %w( src/core/ext/filters/client_channel/lb_policy/address_filtering.h ) s.files += %w( src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc ) s.files += %w( src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h ) s.files += %w( src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc ) @@ -143,10 +145,13 @@ Gem::Specification.new do |s| s.files += %w( src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc ) s.files += %w( src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h ) s.files += %w( src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc ) + s.files += %w( src/core/ext/filters/client_channel/lb_policy/priority/priority.cc ) s.files += %w( src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc ) s.files += %w( src/core/ext/filters/client_channel/lb_policy/subchannel_list.h ) + s.files += %w( src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc ) s.files += %w( src/core/ext/filters/client_channel/lb_policy/xds/cds.cc ) - s.files += %w( src/core/ext/filters/client_channel/lb_policy/xds/xds.cc ) + s.files += %w( src/core/ext/filters/client_channel/lb_policy/xds/eds.cc ) + s.files += %w( src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc ) s.files += %w( src/core/ext/filters/client_channel/lb_policy/xds/xds.h ) s.files += %w( src/core/ext/filters/client_channel/lb_policy_factory.h ) s.files += %w( src/core/ext/filters/client_channel/lb_policy_registry.cc ) diff --git a/grpc.gyp b/grpc.gyp index b065ee6f2af..a62c034d65a 100644 --- a/grpc.gyp +++ b/grpc.gyp @@ -426,6 +426,7 @@ 'address_sorting', 'upb', 'absl/types:optional', + 'absl/strings:strings', 'absl/container:inlined_vector', ], 'sources': [ @@ -442,6 +443,7 @@ 'src/core/ext/filters/client_channel/http_connect_handshaker.cc', 'src/core/ext/filters/client_channel/http_proxy.cc', 'src/core/ext/filters/client_channel/lb_policy.cc', + 'src/core/ext/filters/client_channel/lb_policy/address_filtering.cc', 'src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc', 'src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc', 'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc', @@ -450,9 +452,12 @@ 'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc', 'src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc', 'src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc', + 'src/core/ext/filters/client_channel/lb_policy/priority/priority.cc', 'src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc', + 'src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc', 'src/core/ext/filters/client_channel/lb_policy/xds/cds.cc', - 'src/core/ext/filters/client_channel/lb_policy/xds/xds.cc', + 'src/core/ext/filters/client_channel/lb_policy/xds/eds.cc', + 'src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc', 'src/core/ext/filters/client_channel/lb_policy_registry.cc', 'src/core/ext/filters/client_channel/local_subchannel_pool.cc', 'src/core/ext/filters/client_channel/parse_address.cc', @@ -916,6 +921,7 @@ 'address_sorting', 'upb', 'absl/types:optional', + 'absl/strings:strings', 'absl/container:inlined_vector', ], 'sources': [ @@ -932,6 +938,7 @@ 'src/core/ext/filters/client_channel/http_connect_handshaker.cc', 'src/core/ext/filters/client_channel/http_proxy.cc', 'src/core/ext/filters/client_channel/lb_policy.cc', + 'src/core/ext/filters/client_channel/lb_policy/address_filtering.cc', 'src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc', 'src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc', 'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc', @@ -940,9 +947,12 @@ 'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc', 'src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc', 'src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc', + 'src/core/ext/filters/client_channel/lb_policy/priority/priority.cc', 'src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc', + 'src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc', 'src/core/ext/filters/client_channel/lb_policy/xds/cds.cc', - 'src/core/ext/filters/client_channel/lb_policy/xds/xds.cc', + 'src/core/ext/filters/client_channel/lb_policy/xds/eds.cc', + 'src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc', 'src/core/ext/filters/client_channel/lb_policy_registry.cc', 'src/core/ext/filters/client_channel/local_subchannel_pool.cc', 'src/core/ext/filters/client_channel/parse_address.cc', diff --git a/include/grpc/impl/codegen/grpc_types.h b/include/grpc/impl/codegen/grpc_types.h index ab4c39f9310..ff45450f3a3 100644 --- a/include/grpc/impl/codegen/grpc_types.h +++ b/include/grpc/impl/codegen/grpc_types.h @@ -348,18 +348,11 @@ typedef struct { balancer before using fallback backend addresses from the resolver. If 0, enter fallback mode immediately. Default value is 10000. */ #define GRPC_ARG_XDS_FALLBACK_TIMEOUT_MS "grpc.xds_fallback_timeout_ms" -/* Time in milliseconds to wait before a locality is deleted after it's removed - from the received EDS update. If 0, delete the locality immediately. Default - value is 15 minutes. */ -#define GRPC_ARG_LOCALITY_RETENTION_INTERVAL_MS \ - "grpc.xds_locality_retention_interval_ms" -/* Timeout in milliseconds to wait for the localities of a specific priority to - complete their initial connection attempt before xDS fails over to the next - priority. Specifically, the connection attempt of a priority is considered - completed when any locality of that priority is ready or all the localities - of that priority fail to connect. If 0, failover happens immediately. Default - value is 10 seconds. */ -#define GRPC_ARG_XDS_FAILOVER_TIMEOUT_MS "grpc.xds_failover_timeout_ms" +/* Timeout in milliseconds to wait for the child of a specific priority to + complete its initial connection attempt before the priority LB policy fails + over to the next priority. Default value is 10 seconds. */ +#define GRPC_ARG_PRIORITY_FAILOVER_TIMEOUT_MS \ + "grpc.priority_failover_timeout_ms" /* Timeout in milliseconds to wait for a resource to be returned from * the xds server before assuming that it does not exist. * The default is 15 seconds. */ diff --git a/package.xml b/package.xml index 32930b6f65c..06d1669ec48 100644 --- a/package.xml +++ b/package.xml @@ -108,6 +108,8 @@ + + @@ -123,10 +125,13 @@ + + - + + diff --git a/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc b/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc new file mode 100644 index 00000000000..67843df78e5 --- /dev/null +++ b/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc @@ -0,0 +1,83 @@ +// +// Copyright 2020 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#include + +#include "src/core/ext/filters/client_channel/lb_policy/address_filtering.h" + +#include "src/core/lib/channel/channel_args.h" + +#define GRPC_ARG_HIERARCHICAL_PATH "grpc.internal.address.hierarchical_path" + +namespace grpc_core { + +namespace { + +void* HierarchicalPathCopy(void* p) { + std::vector* path = static_cast*>(p); + return static_cast(new std::vector(*path)); +} + +void HierarchicalPathDestroy(void* p) { + std::vector* path = static_cast*>(p); + delete path; +} + +int HierarchicalPathCompare(void* p1, void* p2) { + std::vector* path1 = static_cast*>(p1); + std::vector* path2 = static_cast*>(p2); + for (size_t i = 0; i < path1->size(); ++i) { + if (path2->size() == i) return 1; + int r = (*path1)[i].compare((*path2)[i]); + if (r != 0) return r; + } + if (path2->size() > path1->size()) return -1; + return 0; +} + +const grpc_arg_pointer_vtable hierarchical_path_arg_vtable = { + HierarchicalPathCopy, HierarchicalPathDestroy, HierarchicalPathCompare}; + +} // namespace + +grpc_arg MakeHierarchicalPathArg(const std::vector& path) { + return grpc_channel_arg_pointer_create( + const_cast(GRPC_ARG_HIERARCHICAL_PATH), + const_cast*>(&path), + &hierarchical_path_arg_vtable); +} + +HierarchicalAddressMap MakeHierarchicalAddressMap( + const ServerAddressList& addresses) { + HierarchicalAddressMap result; + for (const ServerAddress& address : addresses) { + auto* path = grpc_channel_args_find_pointer>( + address.args(), GRPC_ARG_HIERARCHICAL_PATH); + if (path == nullptr || path->empty()) continue; + auto it = path->begin(); + ServerAddressList& target_list = result[*it]; + ++it; + std::vector remaining_path(it, path->end()); + const char* name_to_remove = GRPC_ARG_HIERARCHICAL_PATH; + grpc_arg new_arg = MakeHierarchicalPathArg(remaining_path); + grpc_channel_args* new_args = grpc_channel_args_copy_and_add_and_remove( + address.args(), &name_to_remove, 1, &new_arg, 1); + target_list.emplace_back(address.address(), new_args); + } + return result; +} + +} // namespace grpc_core diff --git a/src/core/ext/filters/client_channel/lb_policy/address_filtering.h b/src/core/ext/filters/client_channel/lb_policy/address_filtering.h new file mode 100644 index 00000000000..03a1c228e7a --- /dev/null +++ b/src/core/ext/filters/client_channel/lb_policy/address_filtering.h @@ -0,0 +1,99 @@ +// +// Copyright 2020 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#ifndef GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_ADDRESS_FILTERING_H +#define GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_ADDRESS_FILTERING_H + +#include + +#include +#include +#include + +#include "absl/strings/string_view.h" + +#include "src/core/ext/filters/client_channel/server_address.h" + +// The resolver returns a flat list of addresses. When a hierarchy of +// LB policies is in use, each leaf of the hierarchy will need a +// different subset of those addresses. This library provides a +// mechanism for determining which address is passed to which leaf +// policy. +// +// Each address will have an associated path that indicates which child +// it should be sent to at each level of the hierarchy to wind up at the +// right leaf policy. Each LB policy will look at the first element of +// the path of each address to determine which child to send the address +// to. It will then remove that first element when passing the address +// down to its child. +// +// For example, consider the following LB policy hierarchy: +// +// - priority +// - child0 (weighted_target) +// - localityA (round_robin) +// - localityB (round_robin) +// - child1 (weighted_target) +// - localityC (round_robin) +// - localityD (round_robin) +// +// Now consider the following addresses: +// - 10.0.0.1:80 path=["child0", "localityA"] +// - 10.0.0.2:80 path=["child0", "localityB"] +// - 10.0.0.3:80 path=["child1", "localityC"] +// - 10.0.0.4:80 path=["child1", "localityD"] +// +// The priority policy will split this up into two lists, one for each +// of its children: +// - child0: +// - 10.0.0.1:80 path=["localityA"] +// - 10.0.0.2:80 path=["localityB"] +// - child1: +// - 10.0.0.3:80 path=["localityC"] +// - 10.0.0.4:80 path=["localityD"] +// +// The weighted_target policy for child0 will split its list up into two +// lists, one for each of its children: +// - localityA: +// - 10.0.0.1:80 path=[] +// - localityB: +// - 10.0.0.2:80 path=[] +// +// Similarly, the weighted_target policy for child1 will split its list +// up into two lists, one for each of its children: +// - localityC: +// - 10.0.0.3:80 path=[] +// - localityD: +// - 10.0.0.4:80 path=[] + +namespace grpc_core { + +// Constructs a channel arg containing the hierarchical path +// to be associated with an address. +grpc_arg MakeHierarchicalPathArg(const std::vector& path); + +// A map from the next path element to the addresses that fall under +// that path element. +using HierarchicalAddressMap = std::map; + +// Splits up the addresses into a separate list for each child. +HierarchicalAddressMap MakeHierarchicalAddressMap( + const ServerAddressList& addresses); + +} // namespace grpc_core + +#endif /* GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_ADDRESS_FILTERING_H \ + */ diff --git a/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc b/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc new file mode 100644 index 00000000000..ff69112387c --- /dev/null +++ b/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc @@ -0,0 +1,875 @@ +// +// Copyright 2018 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#include + +#include +#include + +#include "absl/strings/str_cat.h" + +#include + +#include "src/core/ext/filters/client_channel/lb_policy.h" +#include "src/core/ext/filters/client_channel/lb_policy/address_filtering.h" +#include "src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h" +#include "src/core/ext/filters/client_channel/lb_policy_factory.h" +#include "src/core/ext/filters/client_channel/lb_policy_registry.h" +#include "src/core/lib/channel/channel_args.h" +#include "src/core/lib/gprpp/orphanable.h" +#include "src/core/lib/gprpp/ref_counted_ptr.h" +#include "src/core/lib/iomgr/combiner.h" +#include "src/core/lib/iomgr/timer.h" + +namespace grpc_core { + +TraceFlag grpc_lb_priority_trace(false, "priority_lb"); + +namespace { + +constexpr char kPriority[] = "priority_experimental"; + +// How long we keep a child around for after it is no longer being used +// (either because it has been removed from the config or because we +// have switched to a higher-priority child). +constexpr int kChildRetentionIntervalMs = 15 * 60 * 1000; + +// Default for how long we wait for a newly created child to get connected +// before starting to attempt the next priority. Overridable via channel arg. +constexpr int kDefaultChildFailoverTimeoutMs = 10000; + +// Config for priority LB policy. +class PriorityLbConfig : public LoadBalancingPolicy::Config { + public: + PriorityLbConfig( + std::map> + children, + std::vector priorities) + : children_(std::move(children)), priorities_(std::move(priorities)) {} + + const char* name() const override { return kPriority; } + + const std::map>& + children() const { + return children_; + } + const std::vector& priorities() const { return priorities_; } + + private: + const std::map> + children_; + const std::vector priorities_; +}; + +// priority LB policy. +class PriorityLb : public LoadBalancingPolicy { + public: + explicit PriorityLb(Args args); + + const char* name() const override { return kPriority; } + + void UpdateLocked(UpdateArgs args) override; + void ExitIdleLocked() override; + void ResetBackoffLocked() override; + + private: + // Each ChildPriority holds a ref to the PriorityLb. + class ChildPriority : public InternallyRefCounted { + public: + ChildPriority(RefCountedPtr priority_policy, std::string name); + + ~ChildPriority() { + priority_policy_.reset(DEBUG_LOCATION, "ChildPriority"); + } + + const std::string& name() const { return name_; } + + void UpdateLocked(RefCountedPtr config); + void ExitIdleLocked(); + void ResetBackoffLocked(); + void DeactivateLocked(); + void MaybeReactivateLocked(); + void MaybeCancelFailoverTimerLocked(); + + void Orphan() override; + + std::unique_ptr GetPicker() { + return absl::make_unique(picker_wrapper_); + } + + grpc_connectivity_state connectivity_state() const { + return connectivity_state_; + } + bool failover_timer_callback_pending() const { + return failover_timer_callback_pending_; + } + + private: + // A simple wrapper for ref-counting a picker from the child policy. + class RefCountedPicker : public RefCounted { + public: + explicit RefCountedPicker(std::unique_ptr picker) + : picker_(std::move(picker)) {} + PickResult Pick(PickArgs args) { return picker_->Pick(args); } + + private: + std::unique_ptr picker_; + }; + + // A non-ref-counted wrapper for RefCountedPicker. + class RefCountedPickerWrapper : public SubchannelPicker { + public: + explicit RefCountedPickerWrapper(RefCountedPtr picker) + : picker_(std::move(picker)) {} + PickResult Pick(PickArgs args) override { return picker_->Pick(args); } + + private: + RefCountedPtr picker_; + }; + + class Helper : public ChannelControlHelper { + public: + explicit Helper(RefCountedPtr priority) + : priority_(std::move(priority)) {} + + ~Helper() { priority_.reset(DEBUG_LOCATION, "Helper"); } + + RefCountedPtr CreateSubchannel( + const grpc_channel_args& args) override; + void UpdateState(grpc_connectivity_state state, + std::unique_ptr picker) override; + void RequestReresolution() override; + void AddTraceEvent(TraceSeverity severity, StringView message) override; + + private: + RefCountedPtr priority_; + }; + + // Methods for dealing with the child policy. + OrphanablePtr CreateChildPolicyLocked( + const grpc_channel_args* args); + + void OnConnectivityStateUpdateLocked( + grpc_connectivity_state state, + std::unique_ptr picker); + + void StartFailoverTimerLocked(); + + static void OnFailoverTimer(void* arg, grpc_error* error); + static void OnFailoverTimerLocked(void* arg, grpc_error* error); + static void OnDeactivationTimer(void* arg, grpc_error* error); + static void OnDeactivationTimerLocked(void* arg, grpc_error* error); + + RefCountedPtr priority_policy_; + const std::string name_; + + OrphanablePtr child_policy_; + + grpc_connectivity_state connectivity_state_ = GRPC_CHANNEL_CONNECTING; + RefCountedPtr picker_wrapper_; + + // States for delayed removal. + grpc_timer deactivation_timer_; + grpc_closure on_deactivation_timer_; + bool deactivation_timer_callback_pending_ = false; + + // States of failover. + grpc_timer failover_timer_; + grpc_closure on_failover_timer_; + grpc_closure on_failover_timer_locked_; + bool failover_timer_callback_pending_ = false; + }; + + ~PriorityLb(); + + void ShutdownLocked() override; + + // Returns UINT32_MAX if child is not in current priority list. + uint32_t GetChildPriorityLocked(const std::string& child_name) const; + + void HandleChildConnectivityStateChangeLocked(ChildPriority* child); + void DeleteChild(ChildPriority* child); + + void TryNextPriorityLocked(bool report_connecting); + void SelectPriorityLocked(uint32_t priority); + + const int child_failover_timeout_ms_; + + // Current channel args and config from the resolver. + const grpc_channel_args* args_ = nullptr; + RefCountedPtr config_; + HierarchicalAddressMap addresses_; + + // Internal state. + bool shutting_down_ = false; + + std::map> children_; + // The priority that is being used. + uint32_t current_priority_ = UINT32_MAX; + // Points to the current child from before the most recent update. + // We will continue to use this child until we decide which of the new + // children to use. + ChildPriority* current_child_from_before_update_ = nullptr; +}; + +// +// PriorityLb +// + +PriorityLb::PriorityLb(Args args) + : LoadBalancingPolicy(std::move(args)), + child_failover_timeout_ms_(grpc_channel_args_find_integer( + args.args, GRPC_ARG_PRIORITY_FAILOVER_TIMEOUT_MS, + {kDefaultChildFailoverTimeoutMs, 0, INT_MAX})) { + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_priority_trace)) { + gpr_log(GPR_INFO, "[priority_lb %p] created", this); + } +} + +PriorityLb::~PriorityLb() { + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_priority_trace)) { + gpr_log(GPR_INFO, "[priority_lb %p] destroying priority LB policy", this); + } + grpc_channel_args_destroy(args_); +} + +void PriorityLb::ShutdownLocked() { + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_priority_trace)) { + gpr_log(GPR_INFO, "[priority_lb %p] shutting down", this); + } + shutting_down_ = true; + children_.clear(); +} + +void PriorityLb::ExitIdleLocked() { + if (current_priority_ != UINT32_MAX) { + const std::string& child_name = config_->priorities()[current_priority_]; + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_priority_trace)) { + gpr_log(GPR_INFO, + "[priority_lb %p] exiting IDLE for current priority %d child %s", + this, current_priority_, child_name.c_str()); + } + children_[child_name]->ExitIdleLocked(); + } +} + +void PriorityLb::ResetBackoffLocked() { + for (const auto& p : children_) p.second->ResetBackoffLocked(); +} + +void PriorityLb::UpdateLocked(UpdateArgs args) { + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_priority_trace)) { + gpr_log(GPR_INFO, "[priority_lb %p] received update", this); + } + // Save current child. + if (current_priority_ != UINT32_MAX) { + const std::string& child_name = config_->priorities()[current_priority_]; + current_child_from_before_update_ = children_[child_name].get(); + // Unset current_priority_, since it was an index into the old + // config's priority list and may no longer be valid. It will be + // reset later by TryNextPriorityLocked(), but we unset it here in + // case updating any of our children triggers a state update. + current_priority_ = UINT32_MAX; + } + // Update config. + config_ = std::move(args.config); + // Update args. + grpc_channel_args_destroy(args_); + args_ = args.args; + args.args = nullptr; + // Update addresses. + addresses_ = MakeHierarchicalAddressMap(args.addresses); + // Check all existing children against the new config. + for (const auto& p : children_) { + const std::string& child_name = p.first; + auto& child = p.second; + auto config_it = config_->children().find(child_name); + if (config_it == config_->children().end()) { + // Existing child not found in new config. Deactivate it. + child->DeactivateLocked(); + } else { + // Existing child found in new config. Update it. + child->UpdateLocked(config_it->second); + } + } + // Try to get connected. + TryNextPriorityLocked(/*report_connecting=*/children_.empty()); +} + +uint32_t PriorityLb::GetChildPriorityLocked( + const std::string& child_name) const { + for (uint32_t priority = 0; priority < config_->priorities().size(); + ++priority) { + if (config_->priorities()[priority] == child_name) return priority; + } + return UINT32_MAX; +} + +void PriorityLb::HandleChildConnectivityStateChangeLocked( + ChildPriority* child) { + // Special case for the child that was the current child before the + // most recent update. + if (child == current_child_from_before_update_) { + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_priority_trace)) { + gpr_log(GPR_INFO, + "[priority_lb %p] state update for current child from before " + "config update", + this); + } + if (child->connectivity_state() == GRPC_CHANNEL_READY || + child->connectivity_state() == GRPC_CHANNEL_IDLE) { + // If it's still READY or IDLE, we stick with this child, so pass + // the new picker up to our parent. + channel_control_helper()->UpdateState(child->connectivity_state(), + child->GetPicker()); + } else { + // If it's no longer READY or IDLE, we should stop using it. + // We already started trying other priorities as a result of the + // update, but calling TryNextPriorityLocked() ensures that we will + // properly select between CONNECTING and TRANSIENT_FAILURE as the + // new state to report to our parent. + current_child_from_before_update_ = nullptr; + TryNextPriorityLocked(/*report_connecting=*/true); + } + return; + } + // Otherwise, find the child's priority. + uint32_t child_priority = GetChildPriorityLocked(child->name()); + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_priority_trace)) { + gpr_log(GPR_INFO, "[priority_lb %p] state update for priority %d, child %s", + this, child_priority, child->name().c_str()); + } + // Ignore priorities not in the current config. + if (child_priority == UINT32_MAX) return; + // Ignore lower-than-current priorities. + if (child_priority > current_priority_) return; + // If a child reports TRANSIENT_FAILURE, start trying the next priority. + // Note that even if this is for a higher-than-current priority, we + // may still need to create some children between this priority and + // the current one (e.g., if we got an update that inserted new + // priorities ahead of the current one). + if (child->connectivity_state() == GRPC_CHANNEL_TRANSIENT_FAILURE) { + TryNextPriorityLocked( + /*report_connecting=*/child_priority == current_priority_); + return; + } + // The update is for a higher-than-current priority (or for any + // priority if we don't have any current priority). + if (child_priority < current_priority_) { + // If the child reports READY or IDLE, switch to that priority. + // Otherwise, ignore the update. + if (child->connectivity_state() == GRPC_CHANNEL_READY || + child->connectivity_state() == GRPC_CHANNEL_IDLE) { + SelectPriorityLocked(child_priority); + } + return; + } + // The current priority has returned a new picker, so pass it up to + // our parent. + channel_control_helper()->UpdateState(child->connectivity_state(), + child->GetPicker()); +} + +void PriorityLb::DeleteChild(ChildPriority* child) { + // If this was the current child from before the most recent update, + // stop using it. We already started trying other priorities as a + // result of the update, but calling TryNextPriorityLocked() ensures that + // we will properly select between CONNECTING and TRANSIENT_FAILURE as the + // new state to report to our parent. + if (current_child_from_before_update_ == child) { + current_child_from_before_update_ = nullptr; + TryNextPriorityLocked(/*report_connecting=*/true); + } + children_.erase(child->name()); +} + +void PriorityLb::TryNextPriorityLocked(bool report_connecting) { + for (uint32_t priority = 0; priority < config_->priorities().size(); + ++priority) { + // If the child for the priority does not exist yet, create it. + const std::string& child_name = config_->priorities()[priority]; + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_priority_trace)) { + gpr_log(GPR_INFO, "[priority_lb %p] trying priority %d, child %s", this, + priority, child_name.c_str()); + } + auto& child = children_[child_name]; + if (child == nullptr) { + if (report_connecting) { + channel_control_helper()->UpdateState( + GRPC_CHANNEL_CONNECTING, + absl::make_unique(Ref(DEBUG_LOCATION, "QueuePicker"))); + } + child = MakeOrphanable( + Ref(DEBUG_LOCATION, "ChildPriority"), child_name); + child->UpdateLocked(config_->children().find(child_name)->second); + return; + } + // The child already exists. + child->MaybeReactivateLocked(); + // If the child is in state READY or IDLE, switch to it. + if (child->connectivity_state() == GRPC_CHANNEL_READY || + child->connectivity_state() == GRPC_CHANNEL_IDLE) { + SelectPriorityLocked(priority); + return; + } + // Child is not READY or IDLE. + // If its failover timer is still pending, give it time to fire. + if (child->failover_timer_callback_pending()) { + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_priority_trace)) { + gpr_log(GPR_INFO, + "[priority_lb %p] priority %d, child %s: child still " + "attempting to connect, will wait", + this, priority, child_name.c_str()); + } + if (report_connecting) { + channel_control_helper()->UpdateState( + GRPC_CHANNEL_CONNECTING, + absl::make_unique(Ref(DEBUG_LOCATION, "QueuePicker"))); + } + return; + } + // Child has been failing for a while. Move on to the next priority. + } + // If there are no more priorities to try, report TRANSIENT_FAILURE. + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_priority_trace)) { + gpr_log(GPR_INFO, + "[priority_lb %p] no priority reachable, putting channel in " + "TRANSIENT_FAILURE", + this); + } + current_priority_ = UINT32_MAX; + current_child_from_before_update_ = nullptr; + grpc_error* error = grpc_error_set_int( + GRPC_ERROR_CREATE_FROM_STATIC_STRING("no ready priority"), + GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE); + channel_control_helper()->UpdateState( + GRPC_CHANNEL_TRANSIENT_FAILURE, + absl::make_unique(error)); +} + +void PriorityLb::SelectPriorityLocked(uint32_t priority) { + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_priority_trace)) { + gpr_log(GPR_INFO, "[priority_lb %p] selected priority %d, child %s", this, + priority, config_->priorities()[priority].c_str()); + } + current_priority_ = priority; + current_child_from_before_update_ = nullptr; + // Deactivate lower priorities. + for (uint32_t p = priority + 1; p < config_->priorities().size(); ++p) { + const std::string& child_name = config_->priorities()[p]; + auto it = children_.find(child_name); + if (it != children_.end()) it->second->DeactivateLocked(); + } + // Update picker. + auto& child = children_[config_->priorities()[priority]]; + channel_control_helper()->UpdateState(child->connectivity_state(), + child->GetPicker()); +} + +// +// PriorityLb::ChildPriority +// + +PriorityLb::ChildPriority::ChildPriority( + RefCountedPtr priority_policy, std::string name) + : priority_policy_(std::move(priority_policy)), name_(std::move(name)) { + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_priority_trace)) { + gpr_log(GPR_INFO, "[priority_lb %p] creating child %s (%p)", + priority_policy_.get(), name_.c_str(), this); + } + GRPC_CLOSURE_INIT(&on_failover_timer_, OnFailoverTimer, this, + grpc_schedule_on_exec_ctx); + GRPC_CLOSURE_INIT(&on_failover_timer_locked_, OnFailoverTimerLocked, this, + nullptr); + // Start the failover timer. + StartFailoverTimerLocked(); +} + +void PriorityLb::ChildPriority::Orphan() { + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_priority_trace)) { + gpr_log(GPR_INFO, "[priority_lb %p] child %s (%p): orphaned", + priority_policy_.get(), name_.c_str(), this); + } + MaybeCancelFailoverTimerLocked(); + if (deactivation_timer_callback_pending_) { + grpc_timer_cancel(&deactivation_timer_); + } + // Remove the child policy's interested_parties pollset_set from the + // xDS policy. + grpc_pollset_set_del_pollset_set(child_policy_->interested_parties(), + priority_policy_->interested_parties()); + child_policy_.reset(); + // Drop our ref to the child's picker, in case it's holding a ref to + // the child. + picker_wrapper_.reset(); + if (deactivation_timer_callback_pending_) { + grpc_timer_cancel(&deactivation_timer_); + } + Unref(DEBUG_LOCATION, "ChildPriority+Orphan"); +} + +void PriorityLb::ChildPriority::UpdateLocked( + RefCountedPtr config) { + if (priority_policy_->shutting_down_) return; + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_priority_trace)) { + gpr_log(GPR_INFO, "[priority_lb %p] child %s (%p): start update", + priority_policy_.get(), name_.c_str(), this); + } + // Create policy if needed. + if (child_policy_ == nullptr) { + child_policy_ = CreateChildPolicyLocked(priority_policy_->args_); + } + // Construct update args. + UpdateArgs update_args; + update_args.config = std::move(config); + update_args.addresses = priority_policy_->addresses_[name_]; + update_args.args = grpc_channel_args_copy(priority_policy_->args_); + // Update the policy. + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_priority_trace)) { + gpr_log(GPR_INFO, + "[priority_lb %p] child %s (%p): updating child policy handler %p", + priority_policy_.get(), name_.c_str(), this, child_policy_.get()); + } + child_policy_->UpdateLocked(std::move(update_args)); +} + +OrphanablePtr +PriorityLb::ChildPriority::CreateChildPolicyLocked( + const grpc_channel_args* args) { + LoadBalancingPolicy::Args lb_policy_args; + lb_policy_args.combiner = priority_policy_->combiner(); + lb_policy_args.args = args; + lb_policy_args.channel_control_helper = + absl::make_unique(this->Ref(DEBUG_LOCATION, "Helper")); + OrphanablePtr lb_policy = + MakeOrphanable(std::move(lb_policy_args), + &grpc_lb_priority_trace); + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_priority_trace)) { + gpr_log(GPR_INFO, + "[priority_lb %p] child %s (%p): created new child policy " + "handler %p", + priority_policy_.get(), name_.c_str(), this, lb_policy.get()); + } + // Add the parent's interested_parties pollset_set to that of the newly + // created child policy. This will make the child policy progress upon + // activity on the parent LB, which in turn is tied to the application's call. + grpc_pollset_set_add_pollset_set(lb_policy->interested_parties(), + priority_policy_->interested_parties()); + return lb_policy; +} + +void PriorityLb::ChildPriority::ExitIdleLocked() { + if (connectivity_state_ == GRPC_CHANNEL_IDLE && + !failover_timer_callback_pending_) { + StartFailoverTimerLocked(); + } + child_policy_->ExitIdleLocked(); +} + +void PriorityLb::ChildPriority::ResetBackoffLocked() { + child_policy_->ResetBackoffLocked(); +} + +void PriorityLb::ChildPriority::OnConnectivityStateUpdateLocked( + grpc_connectivity_state state, std::unique_ptr picker) { + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_priority_trace)) { + gpr_log(GPR_INFO, + "[priority_lb %p] child %s (%p): state update: %s, picker %p", + priority_policy_.get(), name_.c_str(), this, + ConnectivityStateName(state), picker.get()); + } + // Store the state and picker. + connectivity_state_ = state; + picker_wrapper_ = MakeRefCounted(std::move(picker)); + // If READY or TRANSIENT_FAILURE, cancel failover timer. + if (state == GRPC_CHANNEL_READY || state == GRPC_CHANNEL_TRANSIENT_FAILURE) { + MaybeCancelFailoverTimerLocked(); + } + // Notify the parent policy. + priority_policy_->HandleChildConnectivityStateChangeLocked(this); +} + +void PriorityLb::ChildPriority::StartFailoverTimerLocked() { + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_priority_trace)) { + gpr_log(GPR_INFO, + "[priority_lb %p] child %s (%p): starting failover timer for %d ms", + priority_policy_.get(), name_.c_str(), this, + priority_policy_->child_failover_timeout_ms_); + } + Ref(DEBUG_LOCATION, "ChildPriority+OnFailoverTimerLocked").release(); + grpc_timer_init( + &failover_timer_, + ExecCtx::Get()->Now() + priority_policy_->child_failover_timeout_ms_, + &on_failover_timer_); + failover_timer_callback_pending_ = true; +} + +void PriorityLb::ChildPriority::MaybeCancelFailoverTimerLocked() { + if (failover_timer_callback_pending_) { + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_priority_trace)) { + gpr_log(GPR_INFO, + "[priority_lb %p] child %s (%p): cancelling failover timer", + priority_policy_.get(), name_.c_str(), this); + } + grpc_timer_cancel(&failover_timer_); + failover_timer_callback_pending_ = false; + } +} + +void PriorityLb::ChildPriority::OnFailoverTimer(void* arg, grpc_error* error) { + ChildPriority* self = static_cast(arg); + self->priority_policy_->combiner()->Run(&self->on_failover_timer_locked_, + GRPC_ERROR_REF(error)); +} + +void PriorityLb::ChildPriority::OnFailoverTimerLocked(void* arg, + grpc_error* error) { + ChildPriority* self = static_cast(arg); + if (error == GRPC_ERROR_NONE && self->failover_timer_callback_pending_ && + !self->priority_policy_->shutting_down_) { + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_priority_trace)) { + gpr_log(GPR_INFO, + "[priority_lb %p] child %s (%p): failover timer fired, " + "reporting TRANSIENT_FAILURE", + self->priority_policy_.get(), self->name_.c_str(), self); + } + self->failover_timer_callback_pending_ = false; + self->OnConnectivityStateUpdateLocked(GRPC_CHANNEL_TRANSIENT_FAILURE, + nullptr); + } + self->Unref(DEBUG_LOCATION, "ChildPriority+OnFailoverTimerLocked"); +} + +void PriorityLb::ChildPriority::DeactivateLocked() { + // If already deactivated, don't do it again. + if (deactivation_timer_callback_pending_) return; + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_priority_trace)) { + gpr_log(GPR_INFO, + "[priority_lb %p] child %s (%p): deactivating -- will remove in %d " + "ms.", + priority_policy_.get(), name_.c_str(), this, + kChildRetentionIntervalMs); + } + MaybeCancelFailoverTimerLocked(); + // Start a timer to delete the child. + Ref(DEBUG_LOCATION, "ChildPriority+timer").release(); + GRPC_CLOSURE_INIT(&on_deactivation_timer_, OnDeactivationTimer, this, + grpc_schedule_on_exec_ctx); + grpc_timer_init(&deactivation_timer_, + ExecCtx::Get()->Now() + kChildRetentionIntervalMs, + &on_deactivation_timer_); + deactivation_timer_callback_pending_ = true; +} + +void PriorityLb::ChildPriority::MaybeReactivateLocked() { + if (deactivation_timer_callback_pending_) { + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_priority_trace)) { + gpr_log(GPR_INFO, "[priority_lb %p] child %s (%p): reactivating", + priority_policy_.get(), name_.c_str(), this); + } + deactivation_timer_callback_pending_ = false; + grpc_timer_cancel(&deactivation_timer_); + } +} + +void PriorityLb::ChildPriority::OnDeactivationTimer(void* arg, + grpc_error* error) { + ChildPriority* self = static_cast(arg); + self->priority_policy_->combiner()->Run( + GRPC_CLOSURE_INIT(&self->on_deactivation_timer_, + OnDeactivationTimerLocked, self, nullptr), + GRPC_ERROR_REF(error)); +} + +void PriorityLb::ChildPriority::OnDeactivationTimerLocked(void* arg, + grpc_error* error) { + ChildPriority* self = static_cast(arg); + if (error == GRPC_ERROR_NONE && self->deactivation_timer_callback_pending_ && + !self->priority_policy_->shutting_down_) { + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_priority_trace)) { + gpr_log(GPR_INFO, + "[priority_lb %p] child %s (%p): deactivation timer fired, " + "deleting child", + self->priority_policy_.get(), self->name_.c_str(), self); + } + self->deactivation_timer_callback_pending_ = false; + self->priority_policy_->DeleteChild(self); + } + self->Unref(DEBUG_LOCATION, "ChildPriority+timer"); +} + +// +// PriorityLb::ChildPriority::Helper +// + +void PriorityLb::ChildPriority::Helper::RequestReresolution() { + if (priority_->priority_policy_->shutting_down_) return; + priority_->priority_policy_->channel_control_helper()->RequestReresolution(); +} + +RefCountedPtr +PriorityLb::ChildPriority::Helper::CreateSubchannel( + const grpc_channel_args& args) { + if (priority_->priority_policy_->shutting_down_) return nullptr; + return priority_->priority_policy_->channel_control_helper() + ->CreateSubchannel(args); +} + +void PriorityLb::ChildPriority::Helper::UpdateState( + grpc_connectivity_state state, std::unique_ptr picker) { + if (priority_->priority_policy_->shutting_down_) return; + // Notify the priority. + priority_->OnConnectivityStateUpdateLocked(state, std::move(picker)); +} + +void PriorityLb::ChildPriority::Helper::AddTraceEvent(TraceSeverity severity, + StringView message) { + if (priority_->priority_policy_->shutting_down_) return; + priority_->priority_policy_->channel_control_helper()->AddTraceEvent(severity, + message); +} + +// +// factory +// + +class PriorityLbFactory : public LoadBalancingPolicyFactory { + public: + OrphanablePtr CreateLoadBalancingPolicy( + LoadBalancingPolicy::Args args) const override { + return MakeOrphanable(std::move(args)); + } + + const char* name() const override { return kPriority; } + + RefCountedPtr ParseLoadBalancingConfig( + const Json& json, grpc_error** error) const override { + GPR_DEBUG_ASSERT(error != nullptr && *error == GRPC_ERROR_NONE); + if (json.type() == Json::Type::JSON_NULL) { + // priority was mentioned as a policy in the deprecated + // loadBalancingPolicy field or in the client API. + *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "field:loadBalancingPolicy error:priority policy requires " + "configuration. Please use loadBalancingConfig field of service " + "config instead."); + return nullptr; + } + std::vector error_list; + // Children. + std::map> children; + auto it = json.object_value().find("children"); + if (it == json.object_value().end()) { + error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "field:children error:required field missing")); + } else if (it->second.type() != Json::Type::OBJECT) { + error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "field:children error:type should be object")); + } else { + const Json::Object& object = it->second.object_value(); + for (const auto& p : object) { + const std::string& child_name = p.first; + const Json& element = p.second; + if (element.type() != Json::Type::OBJECT) { + error_list.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING( + absl::StrCat("field:children key:", child_name, + " error:should be type object") + .c_str())); + } else { + auto it2 = element.object_value().find("config"); + if (it2 == element.object_value().end()) { + error_list.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING( + absl::StrCat("field:children key:", child_name, + " error:missing 'config' field") + .c_str())); + } else { + grpc_error* parse_error = GRPC_ERROR_NONE; + auto config = LoadBalancingPolicyRegistry::ParseLoadBalancingConfig( + it2->second, &parse_error); + if (config == nullptr) { + GPR_DEBUG_ASSERT(parse_error != GRPC_ERROR_NONE); + error_list.push_back( + GRPC_ERROR_CREATE_REFERENCING_FROM_COPIED_STRING( + absl::StrCat("field:children key:", child_name).c_str(), + &parse_error, 1)); + GRPC_ERROR_UNREF(parse_error); + } + children[child_name] = std::move(config); + } + } + } + } + // Priorities. + std::vector priorities; + it = json.object_value().find("priorities"); + if (it == json.object_value().end()) { + error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "field:priorities error:required field missing")); + } else if (it->second.type() != Json::Type::ARRAY) { + error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "field:priorities error:type should be array")); + } else { + const Json::Array& array = it->second.array_value(); + for (size_t i = 0; i < array.size(); ++i) { + const Json& element = array[i]; + if (element.type() != Json::Type::STRING) { + error_list.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING( + absl::StrCat("field:priorities element:", i, + " error:should be type string") + .c_str())); + } else if (children.find(element.string_value()) == children.end()) { + error_list.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING( + absl::StrCat("field:priorities element:", i, + " error:unknown child '", element.string_value(), + "'") + .c_str())); + } else { + priorities.emplace_back(element.string_value()); + } + } + if (priorities.size() != children.size()) { + error_list.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING( + absl::StrCat("field:priorities error:priorities size (", + priorities.size(), ") != children size (", + children.size(), ")") + .c_str())); + } + } + if (error_list.empty()) { + return MakeRefCounted(std::move(children), + std::move(priorities)); + } else { + *error = GRPC_ERROR_CREATE_FROM_VECTOR( + "priority_experimental LB policy config", &error_list); + return nullptr; + } + } +}; + +} // namespace + +} // namespace grpc_core + +// +// Plugin registration +// + +void grpc_lb_policy_priority_init() { + grpc_core::LoadBalancingPolicyRegistry::Builder:: + RegisterLoadBalancingPolicyFactory( + absl::make_unique()); +} + +void grpc_lb_policy_priority_shutdown() {} diff --git a/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc b/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc new file mode 100644 index 00000000000..a319c40cd31 --- /dev/null +++ b/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc @@ -0,0 +1,722 @@ +// +// Copyright 2018 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#include + +#include +#include +#include + +#include "absl/strings/str_cat.h" + +#include + +#include "src/core/ext/filters/client_channel/lb_policy.h" +#include "src/core/ext/filters/client_channel/lb_policy/address_filtering.h" +#include "src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h" +#include "src/core/ext/filters/client_channel/lb_policy_factory.h" +#include "src/core/ext/filters/client_channel/lb_policy_registry.h" +#include "src/core/lib/channel/channel_args.h" +#include "src/core/lib/gpr/string.h" +#include "src/core/lib/gprpp/orphanable.h" +#include "src/core/lib/gprpp/ref_counted_ptr.h" +#include "src/core/lib/iomgr/combiner.h" +#include "src/core/lib/iomgr/timer.h" + +namespace grpc_core { + +TraceFlag grpc_lb_weighted_target_trace(false, "weighted_target_lb"); + +namespace { + +constexpr char kWeightedTarget[] = "weighted_target_experimental"; + +// How long we keep a child around for after it has been removed from +// the config. +constexpr int kChildRetentionIntervalMs = 15 * 60 * 1000; + +// Config for weighted_target LB policy. +class WeightedTargetLbConfig : public LoadBalancingPolicy::Config { + public: + struct ChildConfig { + uint32_t weight; + RefCountedPtr config; + }; + + using TargetMap = std::map; + + explicit WeightedTargetLbConfig(TargetMap target_map) + : target_map_(std::move(target_map)) {} + + const char* name() const override { return kWeightedTarget; } + + const TargetMap& target_map() const { return target_map_; } + + private: + TargetMap target_map_; +}; + +// weighted_target LB policy. +class WeightedTargetLb : public LoadBalancingPolicy { + public: + explicit WeightedTargetLb(Args args); + + const char* name() const override { return kWeightedTarget; } + + void UpdateLocked(UpdateArgs args) override; + void ResetBackoffLocked() override; + + private: + // A simple wrapper for ref-counting a picker from the child policy. + class ChildPickerWrapper : public RefCounted { + public: + explicit ChildPickerWrapper(std::unique_ptr picker) + : picker_(std::move(picker)) {} + PickResult Pick(PickArgs args) { return picker_->Pick(args); } + + private: + std::unique_ptr picker_; + }; + + // Picks a child using stateless WRR and then delegates to that + // child's picker. + class WeightedPicker : public SubchannelPicker { + public: + // Maintains a weighted list of pickers from each child that is in + // ready state. The first element in the pair represents the end of a + // range proportional to the child's weight. The start of the range + // is the previous value in the vector and is 0 for the first element. + using PickerList = + InlinedVector>, + 1>; + + explicit WeightedPicker(PickerList pickers) + : pickers_(std::move(pickers)) {} + + PickResult Pick(PickArgs args) override; + + private: + PickerList pickers_; + }; + + // Each WeightedChild holds a ref to its parent WeightedTargetLb. + class WeightedChild : public InternallyRefCounted { + public: + WeightedChild(RefCountedPtr weighted_target_policy, + const std::string& name); + ~WeightedChild(); + + void Orphan() override; + + void UpdateLocked(const WeightedTargetLbConfig::ChildConfig& config, + ServerAddressList addresses, + const grpc_channel_args* args); + void ResetBackoffLocked(); + void DeactivateLocked(); + + uint32_t weight() const { return weight_; } + grpc_connectivity_state connectivity_state() const { + return connectivity_state_; + } + RefCountedPtr picker_wrapper() const { + return picker_wrapper_; + } + + private: + class Helper : public ChannelControlHelper { + public: + explicit Helper(RefCountedPtr weighted_child) + : weighted_child_(std::move(weighted_child)) {} + + ~Helper() { weighted_child_.reset(DEBUG_LOCATION, "Helper"); } + + RefCountedPtr CreateSubchannel( + const grpc_channel_args& args) override; + void UpdateState(grpc_connectivity_state state, + std::unique_ptr picker) override; + void RequestReresolution() override; + void AddTraceEvent(TraceSeverity severity, StringView message) override; + + private: + RefCountedPtr weighted_child_; + }; + + // Methods for dealing with the child policy. + OrphanablePtr CreateChildPolicyLocked( + const grpc_channel_args* args); + + void OnConnectivityStateUpdateLocked( + grpc_connectivity_state state, + std::unique_ptr picker); + + static void OnDelayedRemovalTimer(void* arg, grpc_error* error); + static void OnDelayedRemovalTimerLocked(void* arg, grpc_error* error); + + // The owning LB policy. + RefCountedPtr weighted_target_policy_; + + const std::string& name_; + + uint32_t weight_; + + OrphanablePtr child_policy_; + + RefCountedPtr picker_wrapper_; + grpc_connectivity_state connectivity_state_ = GRPC_CHANNEL_CONNECTING; + bool seen_failure_since_ready_ = false; + + // States for delayed removal. + grpc_timer delayed_removal_timer_; + grpc_closure on_delayed_removal_timer_; + bool delayed_removal_timer_callback_pending_ = false; + bool shutdown_ = false; + }; + + ~WeightedTargetLb(); + + void ShutdownLocked() override; + + void UpdateStateLocked(); + + // Current config from the resolver. + RefCountedPtr config_; + + // Internal state. + bool shutting_down_ = false; + + // Children. + std::map> targets_; +}; + +// +// WeightedTargetLb::WeightedPicker +// + +WeightedTargetLb::PickResult WeightedTargetLb::WeightedPicker::Pick( + PickArgs args) { + // Generate a random number in [0, total weight). + const uint32_t key = rand() % pickers_[pickers_.size() - 1].first; + // Find the index in pickers_ corresponding to key. + size_t mid = 0; + size_t start_index = 0; + size_t end_index = pickers_.size() - 1; + size_t index = 0; + while (end_index > start_index) { + mid = (start_index + end_index) / 2; + if (pickers_[mid].first > key) { + end_index = mid; + } else if (pickers_[mid].first < key) { + start_index = mid + 1; + } else { + index = mid + 1; + break; + } + } + if (index == 0) index = start_index; + GPR_ASSERT(pickers_[index].first > key); + // Delegate to the child picker. + return pickers_[index].second->Pick(args); +} + +// +// WeightedTargetLb +// + +WeightedTargetLb::WeightedTargetLb(Args args) + : LoadBalancingPolicy(std::move(args)) { + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_weighted_target_trace)) { + gpr_log(GPR_INFO, "[weighted_target_lb %p] created", this); + } +} + +WeightedTargetLb::~WeightedTargetLb() { + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_weighted_target_trace)) { + gpr_log(GPR_INFO, + "[weighted_target_lb %p] destroying weighted_target LB policy", + this); + } +} + +void WeightedTargetLb::ShutdownLocked() { + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_weighted_target_trace)) { + gpr_log(GPR_INFO, "[weighted_target_lb %p] shutting down", this); + } + shutting_down_ = true; + targets_.clear(); +} + +void WeightedTargetLb::ResetBackoffLocked() { + for (auto& p : targets_) p.second->ResetBackoffLocked(); +} + +void WeightedTargetLb::UpdateLocked(UpdateArgs args) { + if (shutting_down_) return; + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_weighted_target_trace)) { + gpr_log(GPR_INFO, "[weighted_target_lb %p] Received update", this); + } + // Update config. + config_ = std::move(args.config); + // Deactivate the targets not in the new config. + for (const auto& p : targets_) { + const std::string& name = p.first; + WeightedChild* child = p.second.get(); + if (config_->target_map().find(name) == config_->target_map().end()) { + child->DeactivateLocked(); + } + } + // Add or update the targets in the new config. + HierarchicalAddressMap address_map = + MakeHierarchicalAddressMap(args.addresses); + for (const auto& p : config_->target_map()) { + const std::string& name = p.first; + const WeightedTargetLbConfig::ChildConfig& config = p.second; + auto it = targets_.find(name); + if (it == targets_.end()) { + it = targets_.emplace(std::make_pair(name, nullptr)).first; + it->second = MakeOrphanable( + Ref(DEBUG_LOCATION, "WeightedChild"), it->first); + } + it->second->UpdateLocked(config, std::move(address_map[name]), args.args); + } +} + +void WeightedTargetLb::UpdateStateLocked() { + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_weighted_target_trace)) { + gpr_log(GPR_INFO, + "[weighted_target_lb %p] scanning children to determine " + "connectivity state", + this); + } + // Construct a new picker which maintains a map of all child pickers + // that are ready. Each child is represented by a portion of the range + // proportional to its weight, such that the total range is the sum of the + // weights of all children. + WeightedPicker::PickerList picker_list; + uint32_t end = 0; + // Also count the number of children in each state, to determine the + // overall state. + size_t num_connecting = 0; + size_t num_idle = 0; + size_t num_transient_failures = 0; + for (const auto& p : targets_) { + const std::string& child_name = p.first; + const WeightedChild* child = p.second.get(); + // Skip the targets that are not in the latest update. + if (config_->target_map().find(child_name) == config_->target_map().end()) { + continue; + } + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_weighted_target_trace)) { + gpr_log(GPR_INFO, + "[weighted_target_lb %p] child=%s state=%s weight=%d picker=%p", + this, child_name.c_str(), + ConnectivityStateName(child->connectivity_state()), + child->weight(), child->picker_wrapper().get()); + } + switch (child->connectivity_state()) { + case GRPC_CHANNEL_READY: { + end += child->weight(); + picker_list.push_back(std::make_pair(end, child->picker_wrapper())); + break; + } + case GRPC_CHANNEL_CONNECTING: { + ++num_connecting; + break; + } + case GRPC_CHANNEL_IDLE: { + ++num_idle; + break; + } + case GRPC_CHANNEL_TRANSIENT_FAILURE: { + ++num_transient_failures; + break; + } + default: + GPR_UNREACHABLE_CODE(return ); + } + } + // Determine aggregated connectivity state. + grpc_connectivity_state connectivity_state; + if (!picker_list.empty()) { + connectivity_state = GRPC_CHANNEL_READY; + } else if (num_connecting > 0) { + connectivity_state = GRPC_CHANNEL_CONNECTING; + } else if (num_idle > 0) { + connectivity_state = GRPC_CHANNEL_IDLE; + } else { + connectivity_state = GRPC_CHANNEL_TRANSIENT_FAILURE; + } + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_weighted_target_trace)) { + gpr_log(GPR_INFO, "[weighted_target_lb %p] connectivity changed to %s", + this, ConnectivityStateName(connectivity_state)); + } + std::unique_ptr picker; + switch (connectivity_state) { + case GRPC_CHANNEL_READY: + picker = absl::make_unique(std::move(picker_list)); + break; + case GRPC_CHANNEL_CONNECTING: + case GRPC_CHANNEL_IDLE: + picker = + absl::make_unique(Ref(DEBUG_LOCATION, "QueuePicker")); + break; + default: + picker = absl::make_unique( + GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "weighted_target: all children report state TRANSIENT_FAILURE")); + } + channel_control_helper()->UpdateState(connectivity_state, std::move(picker)); +} + +// +// WeightedTargetLb::WeightedChild +// + +WeightedTargetLb::WeightedChild::WeightedChild( + RefCountedPtr weighted_target_policy, + const std::string& name) + : weighted_target_policy_(std::move(weighted_target_policy)), name_(name) { + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_weighted_target_trace)) { + gpr_log(GPR_INFO, "[weighted_target_lb %p] created WeightedChild %p for %s", + weighted_target_policy_.get(), this, name_.c_str()); + } +} + +WeightedTargetLb::WeightedChild::~WeightedChild() { + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_weighted_target_trace)) { + gpr_log(GPR_INFO, + "[weighted_target_lb %p] WeightedChild %p %s: destroying child", + weighted_target_policy_.get(), this, name_.c_str()); + } + weighted_target_policy_.reset(DEBUG_LOCATION, "WeightedChild"); +} + +void WeightedTargetLb::WeightedChild::Orphan() { + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_weighted_target_trace)) { + gpr_log(GPR_INFO, + "[weighted_target_lb %p] WeightedChild %p %s: shutting down child", + weighted_target_policy_.get(), this, name_.c_str()); + } + // Remove the child policy's interested_parties pollset_set from the + // xDS policy. + grpc_pollset_set_del_pollset_set( + child_policy_->interested_parties(), + weighted_target_policy_->interested_parties()); + child_policy_.reset(); + // Drop our ref to the child's picker, in case it's holding a ref to + // the child. + picker_wrapper_.reset(); + if (delayed_removal_timer_callback_pending_) { + delayed_removal_timer_callback_pending_ = false; + grpc_timer_cancel(&delayed_removal_timer_); + } + shutdown_ = true; + Unref(); +} + +OrphanablePtr +WeightedTargetLb::WeightedChild::CreateChildPolicyLocked( + const grpc_channel_args* args) { + LoadBalancingPolicy::Args lb_policy_args; + lb_policy_args.combiner = weighted_target_policy_->combiner(); + lb_policy_args.args = args; + lb_policy_args.channel_control_helper = + absl::make_unique(this->Ref(DEBUG_LOCATION, "Helper")); + OrphanablePtr lb_policy = + MakeOrphanable(std::move(lb_policy_args), + &grpc_lb_weighted_target_trace); + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_weighted_target_trace)) { + gpr_log(GPR_INFO, + "[weighted_target_lb %p] WeightedChild %p %s: Created new child " + "policy handler %p", + weighted_target_policy_.get(), this, name_.c_str(), + lb_policy.get()); + } + // Add the xDS's interested_parties pollset_set to that of the newly created + // child policy. This will make the child policy progress upon activity on + // xDS LB, which in turn is tied to the application's call. + grpc_pollset_set_add_pollset_set( + lb_policy->interested_parties(), + weighted_target_policy_->interested_parties()); + return lb_policy; +} + +void WeightedTargetLb::WeightedChild::UpdateLocked( + const WeightedTargetLbConfig::ChildConfig& config, + ServerAddressList addresses, const grpc_channel_args* args) { + if (weighted_target_policy_->shutting_down_) return; + // Update child weight. + weight_ = config.weight; + // Reactivate if needed. + if (delayed_removal_timer_callback_pending_) { + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_weighted_target_trace)) { + gpr_log(GPR_INFO, + "[weighted_target_lb %p] WeightedChild %p %s: reactivating", + weighted_target_policy_.get(), this, name_.c_str()); + } + delayed_removal_timer_callback_pending_ = false; + grpc_timer_cancel(&delayed_removal_timer_); + } + // Create child policy if needed. + if (child_policy_ == nullptr) { + child_policy_ = CreateChildPolicyLocked(args); + } + // Construct update args. + UpdateArgs update_args; + update_args.config = config.config; + update_args.addresses = std::move(addresses); + update_args.args = grpc_channel_args_copy(args); + // Update the policy. + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_weighted_target_trace)) { + gpr_log(GPR_INFO, + "[weighted_target_lb %p] WeightedChild %p %s: Updating child " + "policy handler %p", + weighted_target_policy_.get(), this, name_.c_str(), + child_policy_.get()); + } + child_policy_->UpdateLocked(std::move(update_args)); +} + +void WeightedTargetLb::WeightedChild::ResetBackoffLocked() { + child_policy_->ResetBackoffLocked(); +} + +void WeightedTargetLb::WeightedChild::OnConnectivityStateUpdateLocked( + grpc_connectivity_state state, std::unique_ptr picker) { + // Cache the picker in the WeightedChild. + picker_wrapper_ = MakeRefCounted(std::move(picker)); + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_weighted_target_trace)) { + gpr_log(GPR_INFO, + "[weighted_target_lb %p] WeightedChild %p %s: connectivity " + "state update: state=%s picker_wrapper=%p", + weighted_target_policy_.get(), this, name_.c_str(), + ConnectivityStateName(state), picker_wrapper_.get()); + } + // If the child reports IDLE, immediately tell it to exit idle. + if (state == GRPC_CHANNEL_IDLE) child_policy_->ExitIdleLocked(); + // Decide what state to report for aggregation purposes. + // If we haven't seen a failure since the last time we were in state + // READY, then we report the state change as-is. However, once we do see + // a failure, we report TRANSIENT_FAILURE and ignore any subsequent state + // changes until we go back into state READY. + if (!seen_failure_since_ready_) { + if (state == GRPC_CHANNEL_TRANSIENT_FAILURE) { + seen_failure_since_ready_ = true; + } + } else { + if (state != GRPC_CHANNEL_READY) return; + seen_failure_since_ready_ = false; + } + connectivity_state_ = state; + // Notify the LB policy. + weighted_target_policy_->UpdateStateLocked(); +} + +void WeightedTargetLb::WeightedChild::DeactivateLocked() { + // If already deactivated, don't do that again. + if (weight_ == 0) return; + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_weighted_target_trace)) { + gpr_log(GPR_INFO, + "[weighted_target_lb %p] WeightedChild %p %s: deactivating", + weighted_target_policy_.get(), this, name_.c_str()); + } + // Set the child weight to 0 so that future picker won't contain this child. + weight_ = 0; + // Start a timer to delete the child. + Ref(DEBUG_LOCATION, "WeightedChild+timer").release(); + GRPC_CLOSURE_INIT(&on_delayed_removal_timer_, OnDelayedRemovalTimer, this, + grpc_schedule_on_exec_ctx); + delayed_removal_timer_callback_pending_ = true; + grpc_timer_init(&delayed_removal_timer_, + ExecCtx::Get()->Now() + kChildRetentionIntervalMs, + &on_delayed_removal_timer_); +} + +void WeightedTargetLb::WeightedChild::OnDelayedRemovalTimer(void* arg, + grpc_error* error) { + WeightedChild* self = static_cast(arg); + self->weighted_target_policy_->combiner()->Run( + GRPC_CLOSURE_INIT(&self->on_delayed_removal_timer_, + OnDelayedRemovalTimerLocked, self, nullptr), + GRPC_ERROR_REF(error)); +} + +void WeightedTargetLb::WeightedChild::OnDelayedRemovalTimerLocked( + void* arg, grpc_error* error) { + WeightedChild* self = static_cast(arg); + if (error == GRPC_ERROR_NONE && + self->delayed_removal_timer_callback_pending_ && !self->shutdown_ && + self->weight_ == 0) { + self->delayed_removal_timer_callback_pending_ = false; + self->weighted_target_policy_->targets_.erase(self->name_); + } + self->Unref(DEBUG_LOCATION, "WeightedChild+timer"); +} + +// +// WeightedTargetLb::WeightedChild::Helper +// + +RefCountedPtr +WeightedTargetLb::WeightedChild::Helper::CreateSubchannel( + const grpc_channel_args& args) { + if (weighted_child_->weighted_target_policy_->shutting_down_) return nullptr; + return weighted_child_->weighted_target_policy_->channel_control_helper() + ->CreateSubchannel(args); +} + +void WeightedTargetLb::WeightedChild::Helper::UpdateState( + grpc_connectivity_state state, std::unique_ptr picker) { + if (weighted_child_->weighted_target_policy_->shutting_down_) return; + weighted_child_->OnConnectivityStateUpdateLocked(state, std::move(picker)); +} + +void WeightedTargetLb::WeightedChild::Helper::RequestReresolution() { + if (weighted_child_->weighted_target_policy_->shutting_down_) return; + weighted_child_->weighted_target_policy_->channel_control_helper() + ->RequestReresolution(); +} + +void WeightedTargetLb::WeightedChild::Helper::AddTraceEvent( + TraceSeverity severity, StringView message) { + if (weighted_child_->weighted_target_policy_->shutting_down_) return; + weighted_child_->weighted_target_policy_->channel_control_helper() + ->AddTraceEvent(severity, message); +} + +// +// factory +// + +class WeightedTargetLbFactory : public LoadBalancingPolicyFactory { + public: + OrphanablePtr CreateLoadBalancingPolicy( + LoadBalancingPolicy::Args args) const override { + return MakeOrphanable(std::move(args)); + } + + const char* name() const override { return kWeightedTarget; } + + RefCountedPtr ParseLoadBalancingConfig( + const Json& json, grpc_error** error) const override { + GPR_DEBUG_ASSERT(error != nullptr && *error == GRPC_ERROR_NONE); + if (json.type() == Json::Type::JSON_NULL) { + // weighted_target was mentioned as a policy in the deprecated + // loadBalancingPolicy field or in the client API. + *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "field:loadBalancingPolicy error:weighted_target policy requires " + "configuration. Please use loadBalancingConfig field of service " + "config instead."); + return nullptr; + } + std::vector error_list; + // Weight map. + WeightedTargetLbConfig::TargetMap target_map; + auto it = json.object_value().find("targets"); + if (it == json.object_value().end()) { + error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "field:targets error:required field not present")); + } else if (it->second.type() != Json::Type::OBJECT) { + error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "field:targets error:type should be object")); + } else { + for (const auto& p : it->second.object_value()) { + WeightedTargetLbConfig::ChildConfig child_config; + std::vector child_errors = + ParseChildConfig(p.second, &child_config); + if (!child_errors.empty()) { + // Can't use GRPC_ERROR_CREATE_FROM_VECTOR() here, because the error + // string is not static in this case. + grpc_error* error = GRPC_ERROR_CREATE_FROM_COPIED_STRING( + absl::StrCat("field:targets key:", p.first).c_str()); + for (grpc_error* child_error : child_errors) { + error = grpc_error_add_child(error, child_error); + } + error_list.push_back(error); + } else { + target_map[p.first] = std::move(child_config); + } + } + } + if (!error_list.empty()) { + *error = GRPC_ERROR_CREATE_FROM_VECTOR( + "weighted_target_experimental LB policy config", &error_list); + return nullptr; + } + return MakeRefCounted(std::move(target_map)); + } + + private: + static std::vector ParseChildConfig( + const Json& json, WeightedTargetLbConfig::ChildConfig* child_config) { + std::vector error_list; + if (json.type() != Json::Type::OBJECT) { + error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "value should be of type object")); + return error_list; + } + // Weight. + auto it = json.object_value().find("weight"); + if (it == json.object_value().end()) { + error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "required field \"weight\" not specified")); + } else if (it->second.type() != Json::Type::NUMBER) { + error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "field:weight error:must be of type number")); + } else { + child_config->weight = + gpr_parse_nonnegative_int(it->second.string_value().c_str()); + if (child_config->weight == -1) { + error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "field:weight error:unparseable value")); + } else if (child_config->weight == 0) { + error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "field:weight error:value must be greater than zero")); + } + } + // Child policy. + it = json.object_value().find("childPolicy"); + if (it != json.object_value().end()) { + grpc_error* parse_error = GRPC_ERROR_NONE; + child_config->config = + LoadBalancingPolicyRegistry::ParseLoadBalancingConfig(it->second, + &parse_error); + if (child_config->config == nullptr) { + GPR_DEBUG_ASSERT(parse_error != GRPC_ERROR_NONE); + std::vector child_errors; + child_errors.push_back(parse_error); + error_list.push_back( + GRPC_ERROR_CREATE_FROM_VECTOR("field:childPolicy", &child_errors)); + } + } + return error_list; + } +}; + +} // namespace + +} // namespace grpc_core + +// +// Plugin registration +// + +void grpc_lb_policy_weighted_target_init() { + grpc_core::LoadBalancingPolicyRegistry::Builder:: + RegisterLoadBalancingPolicyFactory( + absl::make_unique()); +} + +void grpc_lb_policy_weighted_target_shutdown() {} diff --git a/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc b/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc index 51e250a3cad..29f571de414 100644 --- a/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +++ b/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc @@ -37,9 +37,9 @@ namespace { constexpr char kCds[] = "cds_experimental"; // Config for this LB policy. -class CdsConfig : public LoadBalancingPolicy::Config { +class CdsLbConfig : public LoadBalancingPolicy::Config { public: - explicit CdsConfig(std::string cluster) : cluster_(std::move(cluster)) {} + explicit CdsLbConfig(std::string cluster) : cluster_(std::move(cluster)) {} const std::string& cluster() const { return cluster_; } const char* name() const override { return kCds; } @@ -50,7 +50,7 @@ class CdsConfig : public LoadBalancingPolicy::Config { // CDS LB policy. class CdsLb : public LoadBalancingPolicy { public: - explicit CdsLb(Args args); + CdsLb(RefCountedPtr xds_client, Args args); const char* name() const override { return kCds; } @@ -89,7 +89,7 @@ class CdsLb : public LoadBalancingPolicy { void ShutdownLocked() override; - RefCountedPtr config_; + RefCountedPtr config_; // Current channel args from the resolver. const grpc_channel_args* args_ = nullptr; @@ -124,21 +124,37 @@ void CdsLb::ClusterWatcher::OnClusterChanged(XdsApi::CdsUpdate cluster_data) { } // Construct config for child policy. Json::Object child_config = { - {"edsServiceName", - (cluster_data.eds_service_name.empty() ? parent_->config_->cluster() - : cluster_data.eds_service_name)}, + {"clusterName", parent_->config_->cluster()}, + {"localityPickingPolicy", + Json::Array{ + Json::Object{ + {"weighted_target_experimental", + Json::Object{ + {"targets", Json::Object()}, + }}, + }, + }}, + {"endpointPickingPolicy", + Json::Array{ + Json::Object{ + {"round_robin", Json::Object()}, + }, + }}, }; + if (!cluster_data.eds_service_name.empty()) { + child_config["edsServiceName"] = cluster_data.eds_service_name; + } if (cluster_data.lrs_load_reporting_server_name.has_value()) { child_config["lrsLoadReportingServerName"] = cluster_data.lrs_load_reporting_server_name.value(); } Json json = Json::Array{ Json::Object{ - {"xds_experimental", std::move(child_config)}, + {"eds_experimental", std::move(child_config)}, }, }; if (GRPC_TRACE_FLAG_ENABLED(grpc_cds_lb_trace)) { - std::string json_str = json.Dump(); + std::string json_str = json.Dump(/*indent=*/1); gpr_log(GPR_INFO, "[cdslb %p] generated config for child policy: %s", parent_.get(), json_str.c_str()); } @@ -156,19 +172,19 @@ void CdsLb::ClusterWatcher::OnClusterChanged(XdsApi::CdsUpdate cluster_data) { args.args = parent_->args_; args.channel_control_helper = absl::make_unique(parent_->Ref()); parent_->child_policy_ = - LoadBalancingPolicyRegistry::CreateLoadBalancingPolicy( - "xds_experimental", std::move(args)); + LoadBalancingPolicyRegistry::CreateLoadBalancingPolicy(config->name(), + std::move(args)); if (parent_->child_policy_ == nullptr) { OnError(GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "failed to create xds_experimental child policy")); + "failed to create child policy")); return; } grpc_pollset_set_add_pollset_set( parent_->child_policy_->interested_parties(), parent_->interested_parties()); if (GRPC_TRACE_FLAG_ENABLED(grpc_cds_lb_trace)) { - gpr_log(GPR_INFO, "[cdslb %p] created child policy xds_experimental (%p)", - parent_.get(), parent_->child_policy_.get()); + gpr_log(GPR_INFO, "[cdslb %p] created child policy %s (%p)", + parent_.get(), config->name(), parent_->child_policy_.get()); } } // Update child policy. @@ -232,9 +248,8 @@ void CdsLb::Helper::AddTraceEvent(TraceSeverity severity, StringView message) { // CdsLb // -CdsLb::CdsLb(Args args) - : LoadBalancingPolicy(std::move(args)), - xds_client_(XdsClient::GetFromChannelArgs(*args.args)) { +CdsLb::CdsLb(RefCountedPtr xds_client, Args args) + : LoadBalancingPolicy(std::move(args)), xds_client_(std::move(xds_client)) { if (GRPC_TRACE_FLAG_ENABLED(grpc_cds_lb_trace)) { gpr_log(GPR_INFO, "[cdslb %p] created -- using xds client %p from channel", this, xds_client_.get()); @@ -313,11 +328,19 @@ void CdsLb::UpdateLocked(UpdateArgs args) { // factory // -class CdsFactory : public LoadBalancingPolicyFactory { +class CdsLbFactory : public LoadBalancingPolicyFactory { public: OrphanablePtr CreateLoadBalancingPolicy( LoadBalancingPolicy::Args args) const override { - return MakeOrphanable(std::move(args)); + RefCountedPtr xds_client = + XdsClient::GetFromChannelArgs(*args.args); + if (xds_client == nullptr) { + gpr_log(GPR_ERROR, + "XdsClient not present in channel args -- cannot instantiate " + "cds LB policy"); + return nullptr; + } + return MakeOrphanable(std::move(xds_client), std::move(args)); } const char* name() const override { return kCds; } @@ -349,7 +372,7 @@ class CdsFactory : public LoadBalancingPolicyFactory { *error = GRPC_ERROR_CREATE_FROM_VECTOR("Cds Parser", &error_list); return nullptr; } - return MakeRefCounted(std::move(cluster)); + return MakeRefCounted(std::move(cluster)); } }; @@ -364,7 +387,7 @@ class CdsFactory : public LoadBalancingPolicyFactory { void grpc_lb_policy_cds_init() { grpc_core::LoadBalancingPolicyRegistry::Builder:: RegisterLoadBalancingPolicyFactory( - absl::make_unique()); + absl::make_unique()); } void grpc_lb_policy_cds_shutdown() {} diff --git a/src/core/ext/filters/client_channel/lb_policy/xds/eds.cc b/src/core/ext/filters/client_channel/lb_policy/xds/eds.cc new file mode 100644 index 00000000000..2f1acdb9f80 --- /dev/null +++ b/src/core/ext/filters/client_channel/lb_policy/xds/eds.cc @@ -0,0 +1,1172 @@ +// +// Copyright 2018 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#include + +#include +#include + +#include "absl/strings/str_cat.h" +#include "absl/types/optional.h" + +#include + +#include "src/core/ext/filters/client_channel/client_channel.h" +#include "src/core/ext/filters/client_channel/lb_policy.h" +#include "src/core/ext/filters/client_channel/lb_policy/address_filtering.h" +#include "src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h" +#include "src/core/ext/filters/client_channel/lb_policy/xds/xds.h" +#include "src/core/ext/filters/client_channel/lb_policy_factory.h" +#include "src/core/ext/filters/client_channel/lb_policy_registry.h" +#include "src/core/ext/filters/client_channel/server_address.h" +#include "src/core/ext/filters/client_channel/xds/xds_client.h" +#include "src/core/ext/filters/client_channel/xds/xds_client_stats.h" +#include "src/core/lib/channel/channel_args.h" +#include "src/core/lib/gprpp/orphanable.h" +#include "src/core/lib/gprpp/ref_counted_ptr.h" +#include "src/core/lib/iomgr/combiner.h" +#include "src/core/lib/iomgr/timer.h" +#include "src/core/lib/uri/uri_parser.h" + +#define GRPC_EDS_DEFAULT_FALLBACK_TIMEOUT 10000 + +namespace grpc_core { + +TraceFlag grpc_lb_eds_trace(false, "eds_lb"); + +namespace { + +constexpr char kXds[] = "xds_experimental"; +constexpr char kEds[] = "eds_experimental"; + +// Config for EDS LB policy. +class EdsLbConfig : public LoadBalancingPolicy::Config { + public: + EdsLbConfig(const char* name, std::string cluster_name, + std::string eds_service_name, + absl::optional lrs_load_reporting_server_name, + Json locality_picking_policy, Json endpoint_picking_policy, + RefCountedPtr fallback_policy) + : name_(name), + cluster_name_(std::move(cluster_name)), + eds_service_name_(std::move(eds_service_name)), + lrs_load_reporting_server_name_( + std::move(lrs_load_reporting_server_name)), + locality_picking_policy_(std::move(locality_picking_policy)), + endpoint_picking_policy_(std::move(endpoint_picking_policy)), + fallback_policy_(std::move(fallback_policy)) {} + + const char* name() const override { return name_; } + + const std::string& cluster_name() const { return cluster_name_; } + const std::string& eds_service_name() const { return eds_service_name_; } + const absl::optional& lrs_load_reporting_server_name() const { + return lrs_load_reporting_server_name_; + }; + const Json& locality_picking_policy() const { + return locality_picking_policy_; + } + const Json& endpoint_picking_policy() const { + return endpoint_picking_policy_; + } + RefCountedPtr fallback_policy() const { + return fallback_policy_; + } + + private: + const char* name_; + std::string cluster_name_; + std::string eds_service_name_; + absl::optional lrs_load_reporting_server_name_; + Json locality_picking_policy_; + Json endpoint_picking_policy_; + RefCountedPtr fallback_policy_; +}; + +// EDS LB policy. +class EdsLb : public LoadBalancingPolicy { + public: + EdsLb(const char* name, Args args); + + const char* name() const override { return name_; } + + void UpdateLocked(UpdateArgs args) override; + void ResetBackoffLocked() override; + + private: + class EndpointWatcher; + + // A simple wrapper for ref-counting a picker from the child policy. + class ChildPickerWrapper : public RefCounted { + public: + explicit ChildPickerWrapper(std::unique_ptr picker) + : picker_(std::move(picker)) {} + PickResult Pick(PickArgs args) { return picker_->Pick(args); } + + private: + std::unique_ptr picker_; + }; + + // A picker that handles drops. + class DropPicker : public SubchannelPicker { + public: + explicit DropPicker(EdsLb* eds_policy); + + PickResult Pick(PickArgs args) override; + + private: + RefCountedPtr drop_config_; + RefCountedPtr drop_stats_; + RefCountedPtr child_picker_; + }; + + class Helper : public ChannelControlHelper { + public: + explicit Helper(RefCountedPtr eds_policy) + : eds_policy_(std::move(eds_policy)) {} + + ~Helper() { eds_policy_.reset(DEBUG_LOCATION, "Helper"); } + + RefCountedPtr CreateSubchannel( + const grpc_channel_args& args) override; + void UpdateState(grpc_connectivity_state state, + std::unique_ptr picker) override; + // This is a no-op, because we get the addresses from the xds + // client, which is a watch-based API. + void RequestReresolution() override {} + void AddTraceEvent(TraceSeverity severity, StringView message) override; + + private: + RefCountedPtr eds_policy_; + }; + + class FallbackHelper : public ChannelControlHelper { + public: + explicit FallbackHelper(RefCountedPtr parent) + : parent_(std::move(parent)) {} + + ~FallbackHelper() { parent_.reset(DEBUG_LOCATION, "FallbackHelper"); } + + RefCountedPtr CreateSubchannel( + const grpc_channel_args& args) override; + void UpdateState(grpc_connectivity_state state, + std::unique_ptr picker) override; + void RequestReresolution() override; + void AddTraceEvent(TraceSeverity severity, StringView message) override; + + private: + RefCountedPtr parent_; + }; + + ~EdsLb(); + + void ShutdownLocked() override; + + void UpdatePriorityList(XdsApi::PriorityListUpdate priority_list_update); + void UpdateChildPolicyLocked(); + OrphanablePtr CreateChildPolicyLocked( + const grpc_channel_args* args); + ServerAddressList CreateChildPolicyAddressesLocked(); + RefCountedPtr CreateChildPolicyConfigLocked(); + grpc_channel_args* CreateChildPolicyArgsLocked( + const grpc_channel_args* args_in); + void MaybeUpdateDropPickerLocked(); + + // Methods for dealing with fallback state. + void MaybeCancelFallbackAtStartupChecks(); + static void OnFallbackTimer(void* arg, grpc_error* error); + static void OnFallbackTimerLocked(void* arg, grpc_error* error); + void UpdateFallbackPolicyLocked(); + OrphanablePtr CreateFallbackPolicyLocked( + const grpc_channel_args* args); + void MaybeExitFallbackMode(); + + // Caller must ensure that config_ is set before calling. + const StringView GetEdsResourceName() const { + if (xds_client_from_channel_ == nullptr) return server_name_; + if (!config_->eds_service_name().empty()) { + return config_->eds_service_name(); + } + return config_->cluster_name(); + } + + // Returns a pair containing the cluster and eds_service_name to use + // for LRS load reporting. + // Caller must ensure that config_ is set before calling. + std::pair GetLrsClusterKey() const { + if (xds_client_from_channel_ == nullptr) return {server_name_, nullptr}; + return {config_->cluster_name(), config_->eds_service_name()}; + } + + XdsClient* xds_client() const { + return xds_client_from_channel_ != nullptr ? xds_client_from_channel_.get() + : xds_client_.get(); + } + + // Policy name (kXds or kEds). + const char* name_; + + // Server name from target URI. + std::string server_name_; + + // Current channel args and config from the resolver. + const grpc_channel_args* args_ = nullptr; + RefCountedPtr config_; + + // Internal state. + bool shutting_down_ = false; + + // The xds client and endpoint watcher. + // If we get the XdsClient from the channel, we store it in + // xds_client_from_channel_; if we create it ourselves, we store it in + // xds_client_. + RefCountedPtr xds_client_from_channel_; + OrphanablePtr xds_client_; + // A pointer to the endpoint watcher, to be used when cancelling the watch. + // Note that this is not owned, so this pointer must never be derefernced. + EndpointWatcher* endpoint_watcher_ = nullptr; + // The latest data from the endpoint watcher. + XdsApi::PriorityListUpdate priority_list_update_; + // State used to retain child policy names for priority policy. + std::vector priority_child_numbers_; + + RefCountedPtr drop_config_; + RefCountedPtr drop_stats_; + + OrphanablePtr child_policy_; + + // The latest state and picker returned from the child policy. + grpc_connectivity_state child_state_; + RefCountedPtr child_picker_; + + // Non-null iff we are in fallback mode. + OrphanablePtr fallback_policy_; + + // Whether the checks for fallback at startup are ALL pending. There are + // several cases where this can be reset: + // 1. The fallback timer fires, we enter fallback mode. + // 2. Before the fallback timer fires, the endpoint watcher reports an + // error, we enter fallback mode. + // 3. Before the fallback timer fires, if any child policy in the locality map + // becomes READY, we cancel the fallback timer. + bool fallback_at_startup_checks_pending_ = false; + // Timeout in milliseconds for before using fallback backend addresses. + // 0 means not using fallback. + const grpc_millis lb_fallback_timeout_ms_; + // The backend addresses from the resolver. + ServerAddressList fallback_backend_addresses_; + // Fallback timer. + grpc_timer lb_fallback_timer_; + grpc_closure lb_on_fallback_; +}; + +// +// EdsLb::DropPicker +// + +EdsLb::DropPicker::DropPicker(EdsLb* eds_policy) + : drop_config_(eds_policy->drop_config_), + drop_stats_(eds_policy->drop_stats_), + child_picker_(eds_policy->child_picker_) { + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_eds_trace)) { + gpr_log(GPR_INFO, "[edslb %p] constructed new drop picker %p", eds_policy, + this); + } +} + +EdsLb::PickResult EdsLb::DropPicker::Pick(PickArgs args) { + // Handle drop. + const std::string* drop_category; + if (drop_config_->ShouldDrop(&drop_category)) { + if (drop_stats_ != nullptr) drop_stats_->AddCallDropped(*drop_category); + PickResult result; + result.type = PickResult::PICK_COMPLETE; + return result; + } + // If we're not dropping all calls, we should always have a child picker. + if (child_picker_ == nullptr) { // Should never happen. + PickResult result; + result.type = PickResult::PICK_FAILED; + result.error = + grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "eds drop picker not given any child picker"), + GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_INTERNAL); + return result; + } + // Not dropping, so delegate to child's picker. + return child_picker_->Pick(args); +} + +// +// EdsLb::Helper +// + +RefCountedPtr EdsLb::Helper::CreateSubchannel( + const grpc_channel_args& args) { + if (eds_policy_->shutting_down_) return nullptr; + return eds_policy_->channel_control_helper()->CreateSubchannel(args); +} + +void EdsLb::Helper::UpdateState(grpc_connectivity_state state, + std::unique_ptr picker) { + if (eds_policy_->shutting_down_) return; + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_eds_trace)) { + gpr_log(GPR_INFO, "[edslb %p] child policy updated state=%s picker=%p", + eds_policy_.get(), ConnectivityStateName(state), picker.get()); + } + // Save the state and picker. + eds_policy_->child_state_ = state; + eds_policy_->child_picker_ = + MakeRefCounted(std::move(picker)); + // If the new state is READY, cancel the fallback-at-startup checks. + if (state == GRPC_CHANNEL_READY) { + eds_policy_->MaybeCancelFallbackAtStartupChecks(); + eds_policy_->MaybeExitFallbackMode(); + } + // TODO(roth): If the child reports TRANSIENT_FAILURE and the + // fallback-at-startup checks are pending, we should probably go into + // fallback mode immediately (cancelling the fallback-at-startup timer + // if needed). + // Wrap the picker in a DropPicker and pass it up. + eds_policy_->MaybeUpdateDropPickerLocked(); +} + +void EdsLb::Helper::AddTraceEvent(TraceSeverity severity, StringView message) { + if (eds_policy_->shutting_down_) return; + eds_policy_->channel_control_helper()->AddTraceEvent(severity, message); +} + +// +// EdsLb::FallbackHelper +// + +RefCountedPtr EdsLb::FallbackHelper::CreateSubchannel( + const grpc_channel_args& args) { + if (parent_->shutting_down_) return nullptr; + return parent_->channel_control_helper()->CreateSubchannel(args); +} + +void EdsLb::FallbackHelper::UpdateState( + grpc_connectivity_state state, std::unique_ptr picker) { + if (parent_->shutting_down_) return; + parent_->channel_control_helper()->UpdateState(state, std::move(picker)); +} + +void EdsLb::FallbackHelper::RequestReresolution() { + if (parent_->shutting_down_) return; + parent_->channel_control_helper()->RequestReresolution(); +} + +void EdsLb::FallbackHelper::AddTraceEvent(TraceSeverity severity, + StringView message) { + if (parent_->shutting_down_) return; + parent_->channel_control_helper()->AddTraceEvent(severity, message); +} + +// +// EdsLb::EndpointWatcher +// + +class EdsLb::EndpointWatcher : public XdsClient::EndpointWatcherInterface { + public: + explicit EndpointWatcher(RefCountedPtr eds_policy) + : eds_policy_(std::move(eds_policy)) {} + + ~EndpointWatcher() { eds_policy_.reset(DEBUG_LOCATION, "EndpointWatcher"); } + + void OnEndpointChanged(XdsApi::EdsUpdate update) override { + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_eds_trace)) { + gpr_log(GPR_INFO, "[edslb %p] Received EDS update from xds client", + eds_policy_.get()); + } + // If the balancer tells us to drop all the calls, we should exit fallback + // mode immediately. + if (update.drop_config->drop_all()) eds_policy_->MaybeExitFallbackMode(); + // Update the drop config. + const bool drop_config_changed = + eds_policy_->drop_config_ == nullptr || + *eds_policy_->drop_config_ != *update.drop_config; + if (drop_config_changed) { + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_eds_trace)) { + gpr_log(GPR_INFO, "[edslb %p] Updating drop config", eds_policy_.get()); + } + eds_policy_->drop_config_ = std::move(update.drop_config); + eds_policy_->MaybeUpdateDropPickerLocked(); + } + // Update priority and locality info. + if (eds_policy_->priority_list_update_ == update.priority_list_update) { + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_eds_trace)) { + gpr_log(GPR_INFO, + "[edslb %p] Incoming locality update identical to current, " + "ignoring. (drop_config_changed=%d)", + eds_policy_.get(), drop_config_changed); + } + return; + } + // Update the child policy with the new priority and endpoint data. + eds_policy_->UpdatePriorityList(std::move(update.priority_list_update)); + } + + void OnError(grpc_error* error) override { + // If the fallback-at-startup checks are pending, go into fallback mode + // immediately. This short-circuits the timeout for the + // fallback-at-startup case. + if (eds_policy_->fallback_at_startup_checks_pending_) { + gpr_log(GPR_ERROR, + "[edslb %p] xds watcher reported error; entering fallback " + "mode: %s", + eds_policy_.get(), grpc_error_string(error)); + eds_policy_->fallback_at_startup_checks_pending_ = false; + grpc_timer_cancel(&eds_policy_->lb_fallback_timer_); + eds_policy_->UpdateFallbackPolicyLocked(); + // If the xds call failed, request re-resolution. + // TODO(roth): We check the error string contents here to + // differentiate between the xds call failing and the xds channel + // going into TRANSIENT_FAILURE. This is a pretty ugly hack, + // but it's okay for now, since we're not yet sure whether we will + // continue to support the current fallback functionality. If we + // decide to keep the fallback approach, then we should either + // find a cleaner way to expose the difference between these two + // cases or decide that we're okay re-resolving in both cases. + // Note that even if we do keep the current fallback functionality, + // this re-resolution will only be necessary if we are going to be + // using this LB policy with resolvers other than the xds resolver. + if (strstr(grpc_error_string(error), "xds call failed")) { + eds_policy_->channel_control_helper()->RequestReresolution(); + } + } + GRPC_ERROR_UNREF(error); + } + + private: + RefCountedPtr eds_policy_; +}; + +// +// EdsLb public methods +// + +EdsLb::EdsLb(const char* name, Args args) + : LoadBalancingPolicy(std::move(args)), + name_(name), + xds_client_from_channel_(XdsClient::GetFromChannelArgs(*args.args)), + lb_fallback_timeout_ms_(grpc_channel_args_find_integer( + args.args, GRPC_ARG_XDS_FALLBACK_TIMEOUT_MS, + {GRPC_EDS_DEFAULT_FALLBACK_TIMEOUT, 0, INT_MAX})) { + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_eds_trace)) { + gpr_log(GPR_INFO, "[edslb %p] created -- xds client from channel: %p", this, + xds_client_from_channel_.get()); + } + // Record server name. + const grpc_arg* arg = grpc_channel_args_find(args.args, GRPC_ARG_SERVER_URI); + const char* server_uri = grpc_channel_arg_get_string(arg); + GPR_ASSERT(server_uri != nullptr); + grpc_uri* uri = grpc_uri_parse(server_uri, true); + GPR_ASSERT(uri->path[0] != '\0'); + server_name_ = uri->path[0] == '/' ? uri->path + 1 : uri->path; + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_eds_trace)) { + gpr_log(GPR_INFO, "[edslb %p] server name from channel: %s", this, + server_name_.c_str()); + } + grpc_uri_destroy(uri); +} + +EdsLb::~EdsLb() { + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_eds_trace)) { + gpr_log(GPR_INFO, "[edslb %p] destroying xds LB policy", this); + } + grpc_channel_args_destroy(args_); +} + +void EdsLb::ShutdownLocked() { + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_eds_trace)) { + gpr_log(GPR_INFO, "[edslb %p] shutting down", this); + } + shutting_down_ = true; + MaybeCancelFallbackAtStartupChecks(); + // Drop our ref to the child's picker, in case it's holding a ref to + // the child. + child_picker_.reset(); + if (child_policy_ != nullptr) { + grpc_pollset_set_del_pollset_set(child_policy_->interested_parties(), + interested_parties()); + child_policy_.reset(); + } + if (fallback_policy_ != nullptr) { + grpc_pollset_set_del_pollset_set(fallback_policy_->interested_parties(), + interested_parties()); + fallback_policy_.reset(); + } + drop_stats_.reset(); + // Cancel the endpoint watch here instead of in our dtor if we are using the + // xds resolver, because the watcher holds a ref to us and we might not be + // destroying the XdsClient, leading to a situation where this LB policy is + // never destroyed. + if (xds_client_from_channel_ != nullptr) { + if (config_ != nullptr) { + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_eds_trace)) { + gpr_log(GPR_INFO, "[edslb %p] cancelling xds watch for %s", this, + std::string(GetEdsResourceName()).c_str()); + } + xds_client()->CancelEndpointDataWatch(GetEdsResourceName(), + endpoint_watcher_); + } + xds_client_from_channel_.reset(); + } + xds_client_.reset(); +} + +void EdsLb::UpdateLocked(UpdateArgs args) { + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_eds_trace)) { + gpr_log(GPR_INFO, "[edslb %p] Received update", this); + } + const bool is_initial_update = args_ == nullptr; + // Update config. + auto old_config = std::move(config_); + config_ = std::move(args.config); + // Update fallback address list. + fallback_backend_addresses_ = std::move(args.addresses); + // Update args. + grpc_channel_args_destroy(args_); + args_ = args.args; + args.args = nullptr; + // Update the existing fallback policy. The fallback policy config and/or the + // fallback addresses may be new. + if (fallback_policy_ != nullptr) UpdateFallbackPolicyLocked(); + if (is_initial_update) { + // Initialize XdsClient. + if (xds_client_from_channel_ == nullptr) { + grpc_error* error = GRPC_ERROR_NONE; + xds_client_ = MakeOrphanable( + combiner(), interested_parties(), GetEdsResourceName(), + nullptr /* service config watcher */, *args_, &error); + // TODO(roth): If we decide that we care about fallback mode, add + // proper error handling here. + GPR_ASSERT(error == GRPC_ERROR_NONE); + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_eds_trace)) { + gpr_log(GPR_INFO, "[edslb %p] Created xds client %p", this, + xds_client_.get()); + } + } + // Start fallback-at-startup checks. + grpc_millis deadline = ExecCtx::Get()->Now() + lb_fallback_timeout_ms_; + Ref(DEBUG_LOCATION, "on_fallback_timer").release(); // Held by closure + GRPC_CLOSURE_INIT(&lb_on_fallback_, &EdsLb::OnFallbackTimer, this, + grpc_schedule_on_exec_ctx); + fallback_at_startup_checks_pending_ = true; + grpc_timer_init(&lb_fallback_timer_, deadline, &lb_on_fallback_); + } + // Update drop stats for load reporting if needed. + if (is_initial_update || config_->lrs_load_reporting_server_name() != + old_config->lrs_load_reporting_server_name()) { + drop_stats_.reset(); + if (config_->lrs_load_reporting_server_name().has_value()) { + const auto key = GetLrsClusterKey(); + drop_stats_ = xds_client()->AddClusterDropStats( + config_->lrs_load_reporting_server_name().value(), + key.first /*cluster_name*/, key.second /*eds_service_name*/); + } + MaybeUpdateDropPickerLocked(); + } + // Update child policy if needed. + // Note that this comes after updating drop_stats_, since we want that + // to be used by any new picker we create here. + if (child_policy_ != nullptr) UpdateChildPolicyLocked(); + // Create endpoint watcher if needed. + if (is_initial_update) { + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_eds_trace)) { + gpr_log(GPR_INFO, "[edslb %p] starting xds watch for %s", this, + std::string(GetEdsResourceName()).c_str()); + } + auto watcher = absl::make_unique( + Ref(DEBUG_LOCATION, "EndpointWatcher")); + endpoint_watcher_ = watcher.get(); + xds_client()->WatchEndpointData(GetEdsResourceName(), std::move(watcher)); + } +} + +void EdsLb::ResetBackoffLocked() { + // When the XdsClient is instantiated in the resolver instead of in this + // LB policy, this is done via the resolver, so we don't need to do it + // for xds_client_from_channel_ here. + if (xds_client_ != nullptr) xds_client_->ResetBackoff(); + if (child_policy_ != nullptr) { + child_policy_->ResetBackoffLocked(); + } + if (fallback_policy_ != nullptr) { + fallback_policy_->ResetBackoffLocked(); + } +} + +// +// child policy-related methods +// + +void EdsLb::UpdatePriorityList( + XdsApi::PriorityListUpdate priority_list_update) { + // Build some maps from locality to child number and the reverse from + // the old data in priority_list_update_ and priority_child_numbers_. + std::map + locality_child_map; + std::map> child_locality_map; + for (uint32_t priority = 0; priority < priority_list_update_.size(); + ++priority) { + auto* locality_map = priority_list_update_.Find(priority); + GPR_ASSERT(locality_map != nullptr); + size_t child_number = priority_child_numbers_[priority]; + for (const auto& p : locality_map->localities) { + XdsLocalityName* locality_name = p.first.get(); + locality_child_map[locality_name] = child_number; + child_locality_map[child_number].insert(locality_name); + } + } + // Construct new list of children. + std::vector priority_child_numbers; + for (uint32_t priority = 0; priority < priority_list_update.size(); + ++priority) { + auto* locality_map = priority_list_update.Find(priority); + GPR_ASSERT(locality_map != nullptr); + absl::optional child_number; + // If one of the localities in this priority already existed, reuse its + // child number. + for (const auto& p : locality_map->localities) { + XdsLocalityName* locality_name = p.first.get(); + if (!child_number.has_value()) { + auto it = locality_child_map.find(locality_name); + if (it != locality_child_map.end()) { + child_number = it->second; + locality_child_map.erase(it); + // Remove localities that *used* to be in this child number, so + // that we don't incorrectly reuse this child number for a + // subsequent priority. + for (XdsLocalityName* old_locality : + child_locality_map[*child_number]) { + locality_child_map.erase(old_locality); + } + } + } else { + // Remove all localities that are now in this child number, so + // that we don't accidentally reuse this child number for a + // subsequent priority. + locality_child_map.erase(locality_name); + } + } + // If we didn't find an existing child number, assign a new one. + if (!child_number.has_value()) { + for (child_number = 0; + child_locality_map.find(*child_number) != child_locality_map.end(); + ++(*child_number)) + ; + // Add entry so we know that the child number is in use. + // (Don't need to add the list of localities, since we won't use them.) + child_locality_map[*child_number]; + } + priority_child_numbers.push_back(*child_number); + } + // Save update. + priority_list_update_ = std::move(priority_list_update); + priority_child_numbers_ = std::move(priority_child_numbers); + // Update child policy. + UpdateChildPolicyLocked(); +} + +ServerAddressList EdsLb::CreateChildPolicyAddressesLocked() { + ServerAddressList addresses; + for (uint32_t priority = 0; priority < priority_list_update_.size(); + ++priority) { + std::string priority_child_name = + absl::StrCat("child", priority_child_numbers_[priority]); + const auto* locality_map = priority_list_update_.Find(priority); + GPR_ASSERT(locality_map != nullptr); + for (const auto& p : locality_map->localities) { + const auto& locality_name = p.first; + const auto& locality = p.second; + std::vector hierarchical_path = { + priority_child_name, locality_name->AsHumanReadableString()}; + for (size_t i = 0; i < locality.serverlist.size(); ++i) { + const ServerAddress& address = locality.serverlist[i]; + grpc_arg new_arg = MakeHierarchicalPathArg(hierarchical_path); + grpc_channel_args* args = + grpc_channel_args_copy_and_add(address.args(), &new_arg, 1); + addresses.emplace_back(address.address(), args); + } + } + } + return addresses; +} + +RefCountedPtr +EdsLb::CreateChildPolicyConfigLocked() { + Json::Object priority_children; + Json::Array priority_priorities; + for (uint32_t priority = 0; priority < priority_list_update_.size(); + ++priority) { + const auto* locality_map = priority_list_update_.Find(priority); + GPR_ASSERT(locality_map != nullptr); + Json::Object weighted_targets; + for (const auto& p : locality_map->localities) { + XdsLocalityName* locality_name = p.first.get(); + const auto& locality = p.second; + // Construct JSON object containing locality name. + Json::Object locality_name_json; + if (!locality_name->region().empty()) { + locality_name_json["region"] = locality_name->region(); + } + if (!locality_name->zone().empty()) { + locality_name_json["zone"] = locality_name->zone(); + } + if (!locality_name->sub_zone().empty()) { + locality_name_json["subzone"] = locality_name->sub_zone(); + } + // Construct endpoint-picking policy. + // Wrap it in the LRS policy if load reporting is enabled. + Json endpoint_picking_policy; + if (config_->lrs_load_reporting_server_name().has_value()) { + const auto key = GetLrsClusterKey(); + Json::Object lrs_config = { + {"clusterName", std::string(key.first)}, + {"locality", std::move(locality_name_json)}, + {"lrsLoadReportingServerName", + config_->lrs_load_reporting_server_name().value()}, + {"childPolicy", config_->endpoint_picking_policy()}, + }; + if (!key.second.empty()) { + lrs_config["edsServiceName"] = std::string(key.second); + } + endpoint_picking_policy = Json::Array{Json::Object{ + {"lrs_experimental", std::move(lrs_config)}, + }}; + } else { + endpoint_picking_policy = config_->endpoint_picking_policy(); + } + // Add weighted target entry. + weighted_targets[locality_name->AsHumanReadableString()] = Json::Object{ + {"weight", locality.lb_weight}, + {"childPolicy", std::move(endpoint_picking_policy)}, + }; + } + // Add priority entry. + const size_t child_number = priority_child_numbers_[priority]; + std::string child_name = absl::StrCat("child", child_number); + priority_priorities.emplace_back(child_name); + Json locality_picking_config = config_->locality_picking_policy(); + Json::Object& config = + *(*locality_picking_config.mutable_array())[0].mutable_object(); + auto it = config.begin(); + GPR_ASSERT(it != config.end()); + (*it->second.mutable_object())["targets"] = std::move(weighted_targets); + priority_children[child_name] = Json::Object{ + {"config", std::move(locality_picking_config)}, + }; + } + Json json = Json::Array{Json::Object{ + {"priority_experimental", + Json::Object{ + {"children", std::move(priority_children)}, + {"priorities", std::move(priority_priorities)}, + }}, + }}; + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_eds_trace)) { + std::string json_str = json.Dump(/*indent=*/1); + gpr_log(GPR_INFO, "[edslb %p] generated config for child policy: %s", this, + json_str.c_str()); + } + grpc_error* error = GRPC_ERROR_NONE; + RefCountedPtr config = + LoadBalancingPolicyRegistry::ParseLoadBalancingConfig(json, &error); + if (error != GRPC_ERROR_NONE) { + // This should never happen, but if it does, we basically have no + // way to fix it, so we put the channel in TRANSIENT_FAILURE. + gpr_log(GPR_ERROR, + "[edslb %p] error parsing generated child policy config -- " + "will put channel in TRANSIENT_FAILURE: %s", + this, grpc_error_string(error)); + error = grpc_error_set_int( + grpc_error_add_child( + GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "eds LB policy: error parsing generated child policy config"), + error), + GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_INTERNAL); + channel_control_helper()->UpdateState( + GRPC_CHANNEL_TRANSIENT_FAILURE, + absl::make_unique(error)); + return nullptr; + } + return config; +} + +void EdsLb::UpdateChildPolicyLocked() { + if (shutting_down_) return; + UpdateArgs update_args; + update_args.config = CreateChildPolicyConfigLocked(); + if (update_args.config == nullptr) return; + update_args.addresses = CreateChildPolicyAddressesLocked(); + update_args.args = CreateChildPolicyArgsLocked(args_); + if (child_policy_ == nullptr) { + child_policy_ = CreateChildPolicyLocked(update_args.args); + } + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_eds_trace)) { + gpr_log(GPR_INFO, "[edslb %p] Updating child policy %p", this, + child_policy_.get()); + } + child_policy_->UpdateLocked(std::move(update_args)); +} + +grpc_channel_args* EdsLb::CreateChildPolicyArgsLocked( + const grpc_channel_args* args) { + absl::InlinedVector args_to_add = { + // A channel arg indicating if the target is a backend inferred from an + // xds load balancer. + grpc_channel_arg_integer_create( + const_cast(GRPC_ARG_ADDRESS_IS_BACKEND_FROM_XDS_LOAD_BALANCER), + 1), + // Inhibit client-side health checking, since the balancer does + // this for us. + grpc_channel_arg_integer_create( + const_cast(GRPC_ARG_INHIBIT_HEALTH_CHECKING), 1), + }; + if (xds_client_from_channel_ == nullptr) { + args_to_add.emplace_back(xds_client_->MakeChannelArg()); + } + return grpc_channel_args_copy_and_add(args, args_to_add.data(), + args_to_add.size()); +} + +OrphanablePtr EdsLb::CreateChildPolicyLocked( + const grpc_channel_args* args) { + LoadBalancingPolicy::Args lb_policy_args; + lb_policy_args.combiner = combiner(); + lb_policy_args.args = args; + lb_policy_args.channel_control_helper = + absl::make_unique(Ref(DEBUG_LOCATION, "Helper")); + OrphanablePtr lb_policy = + LoadBalancingPolicyRegistry::CreateLoadBalancingPolicy( + "priority_experimental", std::move(lb_policy_args)); + if (GPR_UNLIKELY(lb_policy == nullptr)) { + gpr_log(GPR_ERROR, "[edslb %p] failure creating child policy", this); + return nullptr; + } + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_eds_trace)) { + gpr_log(GPR_INFO, "[edslb %p]: Created new child policy %p", this, + lb_policy.get()); + } + // Add our interested_parties pollset_set to that of the newly created + // child policy. This will make the child policy progress upon activity on + // this policy, which in turn is tied to the application's call. + grpc_pollset_set_add_pollset_set(lb_policy->interested_parties(), + interested_parties()); + return lb_policy; +} + +void EdsLb::MaybeUpdateDropPickerLocked() { + // If we are in fallback mode, don't override the picker. + if (fallback_policy_ != nullptr) return; + // If we're dropping all calls, report READY, regardless of what (or + // whether) the child has reported. + if (drop_config_ != nullptr && drop_config_->drop_all()) { + channel_control_helper()->UpdateState(GRPC_CHANNEL_READY, + absl::make_unique(this)); + return; + } + // Update only if we have a child picker. + if (child_picker_ != nullptr) { + channel_control_helper()->UpdateState(child_state_, + absl::make_unique(this)); + } +} + +// +// fallback-related methods +// + +void EdsLb::MaybeCancelFallbackAtStartupChecks() { + if (!fallback_at_startup_checks_pending_) return; + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_eds_trace)) { + gpr_log(GPR_INFO, "[edslb %p] Cancelling fallback timer", this); + } + grpc_timer_cancel(&lb_fallback_timer_); + fallback_at_startup_checks_pending_ = false; +} + +void EdsLb::OnFallbackTimer(void* arg, grpc_error* error) { + EdsLb* edslb_policy = static_cast(arg); + edslb_policy->combiner()->Run( + GRPC_CLOSURE_INIT(&edslb_policy->lb_on_fallback_, + &EdsLb::OnFallbackTimerLocked, edslb_policy, nullptr), + GRPC_ERROR_REF(error)); +} + +void EdsLb::OnFallbackTimerLocked(void* arg, grpc_error* error) { + EdsLb* edslb_policy = static_cast(arg); + // If some fallback-at-startup check is done after the timer fires but before + // this callback actually runs, don't fall back. + if (edslb_policy->fallback_at_startup_checks_pending_ && + !edslb_policy->shutting_down_ && error == GRPC_ERROR_NONE) { + gpr_log(GPR_INFO, + "[edslb %p] Child policy not ready after fallback timeout; " + "entering fallback mode", + edslb_policy); + edslb_policy->fallback_at_startup_checks_pending_ = false; + edslb_policy->UpdateFallbackPolicyLocked(); + } + edslb_policy->Unref(DEBUG_LOCATION, "on_fallback_timer"); +} + +void EdsLb::UpdateFallbackPolicyLocked() { + if (shutting_down_) return; + // Create policy if needed. + if (fallback_policy_ == nullptr) { + fallback_policy_ = CreateFallbackPolicyLocked(args_); + } + // Construct update args. + UpdateArgs update_args; + update_args.addresses = fallback_backend_addresses_; + update_args.config = config_->fallback_policy(); + update_args.args = grpc_channel_args_copy(args_); + // Update the policy. + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_eds_trace)) { + gpr_log(GPR_INFO, "[edslb %p] Updating fallback child policy handler %p", + this, fallback_policy_.get()); + } + fallback_policy_->UpdateLocked(std::move(update_args)); +} + +OrphanablePtr EdsLb::CreateFallbackPolicyLocked( + const grpc_channel_args* args) { + LoadBalancingPolicy::Args lb_policy_args; + lb_policy_args.combiner = combiner(); + lb_policy_args.args = args; + lb_policy_args.channel_control_helper = + absl::make_unique(Ref(DEBUG_LOCATION, "FallbackHelper")); + OrphanablePtr lb_policy = + MakeOrphanable(std::move(lb_policy_args), + &grpc_lb_eds_trace); + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_eds_trace)) { + gpr_log(GPR_INFO, "[edslb %p] Created new fallback child policy handler %p", + this, lb_policy.get()); + } + // Add our interested_parties pollset_set to that of the newly created + // child policy. This will make the child policy progress upon activity on + // this policy, which in turn is tied to the application's call. + grpc_pollset_set_add_pollset_set(lb_policy->interested_parties(), + interested_parties()); + return lb_policy; +} + +void EdsLb::MaybeExitFallbackMode() { + if (fallback_policy_ == nullptr) return; + gpr_log(GPR_INFO, "[edslb %p] Exiting fallback mode", this); + fallback_policy_.reset(); +} + +// +// factory +// + +class EdsLbFactory : public LoadBalancingPolicyFactory { + public: + explicit EdsLbFactory(const char* name) : name_(name) {} + + OrphanablePtr CreateLoadBalancingPolicy( + LoadBalancingPolicy::Args args) const override { + return MakeOrphanable(std::move(args), &grpc_lb_eds_trace, + name_); + } + + const char* name() const override { return name_; } + + RefCountedPtr ParseLoadBalancingConfig( + const Json& json, grpc_error** error) const override { + GPR_DEBUG_ASSERT(error != nullptr && *error == GRPC_ERROR_NONE); + if (json.type() == Json::Type::JSON_NULL) { + // xds was mentioned as a policy in the deprecated loadBalancingPolicy + // field or in the client API. + *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "field:loadBalancingPolicy error:eds policy requires configuration. " + "Please use loadBalancingConfig field of service config instead."); + return nullptr; + } + std::vector error_list; + // EDS service name. + std::string eds_service_name; + auto it = json.object_value().find("edsServiceName"); + if (it != json.object_value().end()) { + if (it->second.type() != Json::Type::STRING) { + error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "field:edsServiceName error:type should be string")); + } else { + eds_service_name = it->second.string_value(); + } + } + // Cluster name. + std::string cluster_name; + if (name_ == kEds) { + it = json.object_value().find("clusterName"); + if (it == json.object_value().end()) { + error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "field:clusterName error:required field missing")); + } else if (it->second.type() != Json::Type::STRING) { + error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "field:clusterName error:type should be string")); + } else { + cluster_name = it->second.string_value(); + } + } else { + // For xds policy, this field does not exist in the config, so it + // will always be set to the same value as edsServiceName. + cluster_name = eds_service_name; + } + // LRS load reporting server name. + absl::optional lrs_load_reporting_server_name; + it = json.object_value().find("lrsLoadReportingServerName"); + if (it != json.object_value().end()) { + if (it->second.type() != Json::Type::STRING) { + error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "field:lrsLoadReportingServerName error:type should be string")); + } else { + lrs_load_reporting_server_name.emplace(it->second.string_value()); + } + } + // Locality-picking policy. Not supported for xds policy. + Json locality_picking_policy = Json::Array{ + Json::Object{ + {"weighted_target_experimental", + Json::Object{ + {"targets", Json::Object()}, + }}, + }, + }; + if (name_ == kEds) { + it = json.object_value().find("localityPickingPolicy"); + if (it != json.object_value().end()) { + locality_picking_policy = it->second; + } + } + grpc_error* parse_error = GRPC_ERROR_NONE; + if (LoadBalancingPolicyRegistry::ParseLoadBalancingConfig( + locality_picking_policy, &parse_error) == nullptr) { + GPR_DEBUG_ASSERT(parse_error != GRPC_ERROR_NONE); + error_list.push_back(GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING( + "localityPickingPolicy", &parse_error, 1)); + GRPC_ERROR_UNREF(parse_error); + } + // Endpoint-picking policy. Called "childPolicy" for xds policy. + const char* field_name = + name_ == kEds ? "endpointPickingPolicy" : "childPolicy"; + Json endpoint_picking_policy; + it = json.object_value().find(field_name); + if (it == json.object_value().end()) { + endpoint_picking_policy = Json::Array{ + Json::Object{ + {"round_robin", Json::Object()}, + }, + }; + } else { + endpoint_picking_policy = it->second; + } + parse_error = GRPC_ERROR_NONE; + if (LoadBalancingPolicyRegistry::ParseLoadBalancingConfig( + endpoint_picking_policy, &parse_error) == nullptr) { + GPR_DEBUG_ASSERT(parse_error != GRPC_ERROR_NONE); + error_list.push_back(GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING( + field_name, &parse_error, 1)); + GRPC_ERROR_UNREF(parse_error); + } + // Fallback policy. + Json fallback_policy_config; + it = json.object_value().find("fallbackPolicy"); + if (it == json.object_value().end()) { + fallback_policy_config = Json::Array{Json::Object{ + {"round_robin", Json::Object()}, + }}; + } else { + fallback_policy_config = it->second; + } + parse_error = GRPC_ERROR_NONE; + RefCountedPtr fallback_policy = + LoadBalancingPolicyRegistry::ParseLoadBalancingConfig( + fallback_policy_config, &parse_error); + if (fallback_policy == nullptr) { + GPR_DEBUG_ASSERT(parse_error != GRPC_ERROR_NONE); + error_list.push_back(GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING( + "fallbackPolicy", &parse_error, 1)); + GRPC_ERROR_UNREF(parse_error); + error_list.push_back(parse_error); + } + if (error_list.empty()) { + return MakeRefCounted( + name_, std::move(cluster_name), std::move(eds_service_name), + std::move(lrs_load_reporting_server_name), + std::move(locality_picking_policy), + std::move(endpoint_picking_policy), std::move(fallback_policy)); + } else { + *error = GRPC_ERROR_CREATE_FROM_VECTOR( + "eds_experimental LB policy config", &error_list); + return nullptr; + } + } + + private: + class EdsChildHandler : public ChildPolicyHandler { + public: + EdsChildHandler(Args args, TraceFlag* tracer, const char* name) + : ChildPolicyHandler(std::move(args), tracer), name_(name) {} + + bool ConfigChangeRequiresNewPolicyInstance( + LoadBalancingPolicy::Config* old_config, + LoadBalancingPolicy::Config* new_config) const override { + GPR_ASSERT(old_config->name() == name_); + GPR_ASSERT(new_config->name() == name_); + EdsLbConfig* old_eds_config = static_cast(old_config); + EdsLbConfig* new_eds_config = static_cast(new_config); + return old_eds_config->cluster_name() != new_eds_config->cluster_name() || + old_eds_config->eds_service_name() != + new_eds_config->eds_service_name(); + } + + OrphanablePtr CreateLoadBalancingPolicy( + const char* name, LoadBalancingPolicy::Args args) const override { + return MakeOrphanable(name_, std::move(args)); + } + + private: + const char* name_; + }; + + const char* name_; +}; + +} // namespace + +} // namespace grpc_core + +// +// Plugin registration +// + +void grpc_lb_policy_eds_init() { + grpc_core::LoadBalancingPolicyRegistry::Builder:: + RegisterLoadBalancingPolicyFactory( + absl::make_unique(grpc_core::kEds)); + // TODO(roth): This is here just for backward compatibility with some + // old tests we have internally. Remove this once they are upgraded + // to use the new policy name and config. + grpc_core::LoadBalancingPolicyRegistry::Builder:: + RegisterLoadBalancingPolicyFactory( + absl::make_unique(grpc_core::kXds)); +} + +void grpc_lb_policy_eds_shutdown() {} diff --git a/src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc b/src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc new file mode 100644 index 00000000000..b91d1b3bb9d --- /dev/null +++ b/src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc @@ -0,0 +1,524 @@ +// +// Copyright 2018 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#include + +#include + +#include "src/core/ext/filters/client_channel/lb_policy.h" +#include "src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h" +#include "src/core/ext/filters/client_channel/lb_policy_factory.h" +#include "src/core/ext/filters/client_channel/lb_policy_registry.h" +#include "src/core/ext/filters/client_channel/xds/xds_client.h" +#include "src/core/ext/filters/client_channel/xds/xds_client_stats.h" +#include "src/core/lib/channel/channel_args.h" +#include "src/core/lib/gprpp/orphanable.h" +#include "src/core/lib/gprpp/ref_counted_ptr.h" +#include "src/core/lib/iomgr/combiner.h" + +namespace grpc_core { + +TraceFlag grpc_lb_lrs_trace(false, "lrs_lb"); + +namespace { + +constexpr char kLrs[] = "lrs_experimental"; + +// Config for LRS LB policy. +class LrsLbConfig : public LoadBalancingPolicy::Config { + public: + LrsLbConfig(RefCountedPtr child_policy, + std::string cluster_name, std::string eds_service_name, + std::string lrs_load_reporting_server_name, + RefCountedPtr locality_name) + : child_policy_(std::move(child_policy)), + cluster_name_(std::move(cluster_name)), + eds_service_name_(std::move(eds_service_name)), + lrs_load_reporting_server_name_( + std::move(lrs_load_reporting_server_name)), + locality_name_(std::move(locality_name)) {} + + const char* name() const override { return kLrs; } + + RefCountedPtr child_policy() const { + return child_policy_; + } + const std::string& cluster_name() const { return cluster_name_; } + const std::string& eds_service_name() const { return eds_service_name_; } + const std::string& lrs_load_reporting_server_name() const { + return lrs_load_reporting_server_name_; + }; + RefCountedPtr locality_name() const { + return locality_name_; + } + + private: + RefCountedPtr child_policy_; + std::string cluster_name_; + std::string eds_service_name_; + std::string lrs_load_reporting_server_name_; + RefCountedPtr locality_name_; +}; + +// LRS LB policy. +class LrsLb : public LoadBalancingPolicy { + public: + LrsLb(RefCountedPtr xds_client, Args args); + + const char* name() const override { return kLrs; } + + void UpdateLocked(UpdateArgs args) override; + void ExitIdleLocked() override; + void ResetBackoffLocked() override; + + private: + // A simple wrapper for ref-counting a picker from the child policy. + class RefCountedPicker : public RefCounted { + public: + explicit RefCountedPicker(std::unique_ptr picker) + : picker_(std::move(picker)) {} + PickResult Pick(PickArgs args) { return picker_->Pick(args); } + + private: + std::unique_ptr picker_; + }; + + // A picker that wraps the picker from the child to perform load reporting. + class LoadReportingPicker : public SubchannelPicker { + public: + LoadReportingPicker(RefCountedPtr picker, + RefCountedPtr locality_stats) + : picker_(std::move(picker)), + locality_stats_(std::move(locality_stats)) {} + + PickResult Pick(PickArgs args); + + private: + RefCountedPtr picker_; + RefCountedPtr locality_stats_; + }; + + class Helper : public ChannelControlHelper { + public: + explicit Helper(RefCountedPtr lrs_policy) + : lrs_policy_(std::move(lrs_policy)) {} + + ~Helper() { lrs_policy_.reset(DEBUG_LOCATION, "Helper"); } + + RefCountedPtr CreateSubchannel( + const grpc_channel_args& args) override; + void UpdateState(grpc_connectivity_state state, + std::unique_ptr picker) override; + void RequestReresolution() override; + void AddTraceEvent(TraceSeverity severity, StringView message) override; + + private: + RefCountedPtr lrs_policy_; + }; + + ~LrsLb(); + + void ShutdownLocked() override; + + OrphanablePtr CreateChildPolicyLocked( + const grpc_channel_args* args); + void UpdateChildPolicyLocked(ServerAddressList addresses, + const grpc_channel_args* args); + + void MaybeUpdatePickerLocked(); + + // Current config from the resolver. + RefCountedPtr config_; + + // Internal state. + bool shutting_down_ = false; + + // The xds client. + RefCountedPtr xds_client_; + + // The stats for client-side load reporting. + RefCountedPtr locality_stats_; + + OrphanablePtr child_policy_; + + // Latest state and picker reported by the child policy. + grpc_connectivity_state state_ = GRPC_CHANNEL_IDLE; + RefCountedPtr picker_; +}; + +// +// LrsLb::LoadReportingPicker +// + +LoadBalancingPolicy::PickResult LrsLb::LoadReportingPicker::Pick( + LoadBalancingPolicy::PickArgs args) { + // Forward the pick to the picker returned from the child policy. + PickResult result = picker_->Pick(args); + if (result.type == PickResult::PICK_COMPLETE && + result.subchannel != nullptr) { + // Record a call started. + locality_stats_->AddCallStarted(); + // Intercept the recv_trailing_metadata op to record call completion. + XdsClusterLocalityStats* locality_stats = + locality_stats_->Ref(DEBUG_LOCATION, "LocalityStats+call").release(); + result.recv_trailing_metadata_ready = + // Note: This callback does not run in either the control plane + // combiner or in the data plane mutex. + [locality_stats](grpc_error* error, MetadataInterface* /*metadata*/, + CallState* /*call_state*/) { + const bool call_failed = error != GRPC_ERROR_NONE; + locality_stats->AddCallFinished(call_failed); + locality_stats->Unref(DEBUG_LOCATION, "LocalityStats+call"); + }; + } + return result; +} + +// +// LrsLb +// + +LrsLb::LrsLb(RefCountedPtr xds_client, Args args) + : LoadBalancingPolicy(std::move(args)), xds_client_(std::move(xds_client)) { + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_lrs_trace)) { + gpr_log(GPR_INFO, "[lrs_lb %p] created -- using xds client %p from channel", + this, xds_client_.get()); + } +} + +LrsLb::~LrsLb() { + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_lrs_trace)) { + gpr_log(GPR_INFO, "[lrs_lb %p] destroying xds LB policy", this); + } +} + +void LrsLb::ShutdownLocked() { + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_lrs_trace)) { + gpr_log(GPR_INFO, "[lrs_lb %p] shutting down", this); + } + shutting_down_ = true; + // Remove the child policy's interested_parties pollset_set from the + // xDS policy. + if (child_policy_ != nullptr) { + grpc_pollset_set_del_pollset_set(child_policy_->interested_parties(), + interested_parties()); + child_policy_.reset(); + } + // Drop our ref to the child's picker, in case it's holding a ref to + // the child. + picker_.reset(); + locality_stats_.reset(); + xds_client_.reset(); +} + +void LrsLb::ExitIdleLocked() { + if (child_policy_ != nullptr) child_policy_->ExitIdleLocked(); +} + +void LrsLb::ResetBackoffLocked() { + // The XdsClient will have its backoff reset by the xds resolver, so we + // don't need to do it here. + if (child_policy_ != nullptr) child_policy_->ResetBackoffLocked(); +} + +void LrsLb::UpdateLocked(UpdateArgs args) { + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_lrs_trace)) { + gpr_log(GPR_INFO, "[lrs_lb %p] Received update", this); + } + // Update config. + auto old_config = std::move(config_); + config_ = std::move(args.config); + // Update load reporting if needed. + if (old_config == nullptr || + config_->lrs_load_reporting_server_name() != + old_config->lrs_load_reporting_server_name() || + config_->cluster_name() != old_config->cluster_name() || + config_->eds_service_name() != old_config->eds_service_name() || + *config_->locality_name() != *old_config->locality_name()) { + locality_stats_ = xds_client_->AddClusterLocalityStats( + config_->lrs_load_reporting_server_name(), config_->cluster_name(), + config_->eds_service_name(), config_->locality_name()); + MaybeUpdatePickerLocked(); + } + // Update child policy. + UpdateChildPolicyLocked(std::move(args.addresses), args.args); + args.args = nullptr; // Ownership passed to UpdateChildPolicyLocked(). +} + +void LrsLb::MaybeUpdatePickerLocked() { + if (picker_ != nullptr) { + auto lrs_picker = + absl::make_unique(picker_, locality_stats_); + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_lrs_trace)) { + gpr_log(GPR_INFO, "[lrs_lb %p] updating connectivity: state=%s picker=%p", + this, ConnectivityStateName(state_), lrs_picker.get()); + } + channel_control_helper()->UpdateState(state_, std::move(lrs_picker)); + } +} + +OrphanablePtr LrsLb::CreateChildPolicyLocked( + const grpc_channel_args* args) { + LoadBalancingPolicy::Args lb_policy_args; + lb_policy_args.combiner = combiner(); + lb_policy_args.args = args; + lb_policy_args.channel_control_helper = + absl::make_unique(Ref(DEBUG_LOCATION, "Helper")); + OrphanablePtr lb_policy = + MakeOrphanable(std::move(lb_policy_args), + &grpc_lb_lrs_trace); + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_lrs_trace)) { + gpr_log(GPR_INFO, "[lrs_lb %p] Created new child policy handler %p", this, + lb_policy.get()); + } + // Add our interested_parties pollset_set to that of the newly created + // child policy. This will make the child policy progress upon activity on + // this policy, which in turn is tied to the application's call. + grpc_pollset_set_add_pollset_set(lb_policy->interested_parties(), + interested_parties()); + return lb_policy; +} + +void LrsLb::UpdateChildPolicyLocked(ServerAddressList addresses, + const grpc_channel_args* args) { + // Create policy if needed. + if (child_policy_ == nullptr) { + child_policy_ = CreateChildPolicyLocked(args); + } + // Construct update args. + UpdateArgs update_args; + update_args.addresses = std::move(addresses); + update_args.config = config_->child_policy(); + update_args.args = args; + // Update the policy. + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_lrs_trace)) { + gpr_log(GPR_INFO, "[lrs_lb %p] Updating child policy handler %p", this, + child_policy_.get()); + } + child_policy_->UpdateLocked(std::move(update_args)); +} + +// +// LrsLb::Helper +// + +RefCountedPtr LrsLb::Helper::CreateSubchannel( + const grpc_channel_args& args) { + if (lrs_policy_->shutting_down_) return nullptr; + return lrs_policy_->channel_control_helper()->CreateSubchannel(args); +} + +void LrsLb::Helper::UpdateState(grpc_connectivity_state state, + std::unique_ptr picker) { + if (lrs_policy_->shutting_down_) return; + if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_lrs_trace)) { + gpr_log(GPR_INFO, + "[lrs_lb %p] child connectivity state update: state=%s picker=%p", + lrs_policy_.get(), ConnectivityStateName(state), picker.get()); + } + // Save the state and picker. + lrs_policy_->state_ = state; + lrs_policy_->picker_ = MakeRefCounted(std::move(picker)); + // Wrap the picker and return it to the channel. + lrs_policy_->MaybeUpdatePickerLocked(); +} + +void LrsLb::Helper::RequestReresolution() { + if (lrs_policy_->shutting_down_) return; + lrs_policy_->channel_control_helper()->RequestReresolution(); +} + +void LrsLb::Helper::AddTraceEvent(TraceSeverity severity, StringView message) { + if (lrs_policy_->shutting_down_) return; + lrs_policy_->channel_control_helper()->AddTraceEvent(severity, message); +} + +// +// factory +// + +class LrsLbFactory : public LoadBalancingPolicyFactory { + public: + OrphanablePtr CreateLoadBalancingPolicy( + LoadBalancingPolicy::Args args) const override { + RefCountedPtr xds_client = + XdsClient::GetFromChannelArgs(*args.args); + if (xds_client == nullptr) { + gpr_log(GPR_ERROR, + "XdsClient not present in channel args -- cannot instantiate " + "lrs LB policy"); + return nullptr; + } + return MakeOrphanable(std::move(xds_client), std::move(args)); + } + + const char* name() const override { return kLrs; } + + RefCountedPtr ParseLoadBalancingConfig( + const Json& json, grpc_error** error) const override { + GPR_DEBUG_ASSERT(error != nullptr && *error == GRPC_ERROR_NONE); + if (json.type() == Json::Type::JSON_NULL) { + // lrs was mentioned as a policy in the deprecated loadBalancingPolicy + // field or in the client API. + *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "field:loadBalancingPolicy error:lrs policy requires configuration. " + "Please use loadBalancingConfig field of service config instead."); + return nullptr; + } + std::vector error_list; + // Child policy. + RefCountedPtr child_policy; + auto it = json.object_value().find("childPolicy"); + if (it == json.object_value().end()) { + error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "field:childPolicy error:required field missing")); + } else { + grpc_error* parse_error = GRPC_ERROR_NONE; + child_policy = LoadBalancingPolicyRegistry::ParseLoadBalancingConfig( + it->second, &parse_error); + if (child_policy == nullptr) { + GPR_DEBUG_ASSERT(parse_error != GRPC_ERROR_NONE); + std::vector child_errors; + child_errors.push_back(parse_error); + error_list.push_back( + GRPC_ERROR_CREATE_FROM_VECTOR("field:childPolicy", &child_errors)); + } + } + // Cluster name. + std::string cluster_name; + it = json.object_value().find("clusterName"); + if (it == json.object_value().end()) { + error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "field:clusterName error:required field missing")); + } else if (it->second.type() != Json::Type::STRING) { + error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "field:clusterName error:type should be string")); + } else { + cluster_name = it->second.string_value(); + } + // EDS service name. + std::string eds_service_name; + it = json.object_value().find("edsServiceName"); + if (it != json.object_value().end()) { + if (it->second.type() != Json::Type::STRING) { + error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "field:edsServiceName error:type should be string")); + } else { + eds_service_name = it->second.string_value(); + } + } + // Locality. + RefCountedPtr locality_name; + it = json.object_value().find("locality"); + if (it == json.object_value().end()) { + error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "field:locality error:required field missing")); + } else { + std::vector child_errors = + ParseLocality(it->second, &locality_name); + if (!child_errors.empty()) { + error_list.push_back( + GRPC_ERROR_CREATE_FROM_VECTOR("field:locality", &child_errors)); + } + } + // LRS load reporting server name. + std::string lrs_load_reporting_server_name; + it = json.object_value().find("lrsLoadReportingServerName"); + if (it == json.object_value().end()) { + error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "field:lrsLoadReportingServerName error:required field missing")); + } else if (it->second.type() != Json::Type::STRING) { + error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "field:lrsLoadReportingServerName error:type should be string")); + } else { + lrs_load_reporting_server_name = it->second.string_value(); + } + if (!error_list.empty()) { + *error = GRPC_ERROR_CREATE_FROM_VECTOR( + "lrs_experimental LB policy config", &error_list); + return nullptr; + } + return MakeRefCounted( + std::move(child_policy), std::move(cluster_name), + std::move(eds_service_name), std::move(lrs_load_reporting_server_name), + std::move(locality_name)); + } + + private: + static std::vector ParseLocality( + const Json& json, RefCountedPtr* name) { + std::vector error_list; + if (json.type() != Json::Type::OBJECT) { + error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "locality field is not an object")); + return error_list; + } + std::string region; + auto it = json.object_value().find("region"); + if (it != json.object_value().end()) { + if (it->second.type() != Json::Type::STRING) { + error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "\"region\" field is not a string")); + } else { + region = it->second.string_value(); + } + } + std::string zone; + it = json.object_value().find("zone"); + if (it != json.object_value().end()) { + if (it->second.type() != Json::Type::STRING) { + error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "\"zone\" field is not a string")); + } else { + zone = it->second.string_value(); + } + } + std::string subzone; + it = json.object_value().find("subzone"); + if (it != json.object_value().end()) { + if (it->second.type() != Json::Type::STRING) { + error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "\"subzone\" field is not a string")); + } else { + subzone = it->second.string_value(); + } + } + if (region.empty() && zone.empty() && subzone.empty()) { + error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "at least one of region, zone, or subzone must be set")); + } + if (error_list.empty()) { + *name = MakeRefCounted(region, zone, subzone); + } + return error_list; + } +}; + +} // namespace + +} // namespace grpc_core + +// +// Plugin registration +// + +void grpc_lb_policy_lrs_init() { + grpc_core::LoadBalancingPolicyRegistry::Builder:: + RegisterLoadBalancingPolicyFactory( + absl::make_unique()); +} + +void grpc_lb_policy_lrs_shutdown() {} diff --git a/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc b/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc deleted file mode 100644 index 9196bf628ca..00000000000 --- a/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc +++ /dev/null @@ -1,1754 +0,0 @@ -/* - * - * Copyright 2018 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#include - -#include "src/core/lib/iomgr/sockaddr.h" -#include "src/core/lib/iomgr/socket_utils.h" - -#include -#include -#include - -#include "absl/types/optional.h" - -#include -#include -#include -#include - -#include "src/core/ext/filters/client_channel/client_channel.h" -#include "src/core/ext/filters/client_channel/lb_policy.h" -#include "src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h" -#include "src/core/ext/filters/client_channel/lb_policy/xds/xds.h" -#include "src/core/ext/filters/client_channel/lb_policy_factory.h" -#include "src/core/ext/filters/client_channel/lb_policy_registry.h" -#include "src/core/ext/filters/client_channel/parse_address.h" -#include "src/core/ext/filters/client_channel/server_address.h" -#include "src/core/ext/filters/client_channel/service_config.h" -#include "src/core/ext/filters/client_channel/xds/xds_client.h" -#include "src/core/ext/filters/client_channel/xds/xds_client_stats.h" -#include "src/core/lib/backoff/backoff.h" -#include "src/core/lib/channel/channel_args.h" -#include "src/core/lib/channel/channel_stack.h" -#include "src/core/lib/gpr/string.h" -#include "src/core/lib/gprpp/manual_constructor.h" -#include "src/core/lib/gprpp/map.h" -#include "src/core/lib/gprpp/memory.h" -#include "src/core/lib/gprpp/orphanable.h" -#include "src/core/lib/gprpp/ref_counted_ptr.h" -#include "src/core/lib/gprpp/sync.h" -#include "src/core/lib/iomgr/combiner.h" -#include "src/core/lib/iomgr/sockaddr.h" -#include "src/core/lib/iomgr/sockaddr_utils.h" -#include "src/core/lib/iomgr/timer.h" -#include "src/core/lib/slice/slice_hash_table.h" -#include "src/core/lib/slice/slice_internal.h" -#include "src/core/lib/slice/slice_string_helpers.h" -#include "src/core/lib/surface/call.h" -#include "src/core/lib/surface/channel.h" -#include "src/core/lib/surface/channel_init.h" -#include "src/core/lib/transport/static_metadata.h" - -#define GRPC_XDS_DEFAULT_FALLBACK_TIMEOUT_MS 10000 -#define GRPC_XDS_DEFAULT_LOCALITY_RETENTION_INTERVAL_MS (15 * 60 * 1000) -#define GRPC_XDS_DEFAULT_FAILOVER_TIMEOUT_MS 10000 - -namespace grpc_core { - -TraceFlag grpc_lb_xds_trace(false, "xds_lb"); - -namespace { - -constexpr char kXds[] = "xds_experimental"; - -class XdsConfig : public LoadBalancingPolicy::Config { - public: - XdsConfig(RefCountedPtr child_policy, - RefCountedPtr fallback_policy, - std::string eds_service_name, - absl::optional lrs_load_reporting_server_name) - : child_policy_(std::move(child_policy)), - fallback_policy_(std::move(fallback_policy)), - eds_service_name_(std::move(eds_service_name)), - lrs_load_reporting_server_name_( - std::move(lrs_load_reporting_server_name)) {} - - const char* name() const override { return kXds; } - - RefCountedPtr child_policy() const { - return child_policy_; - } - - RefCountedPtr fallback_policy() const { - return fallback_policy_; - } - - const char* eds_service_name() const { - return eds_service_name_.empty() ? nullptr : eds_service_name_.c_str(); - }; - - const absl::optional& lrs_load_reporting_server_name() const { - return lrs_load_reporting_server_name_; - }; - - private: - RefCountedPtr child_policy_; - RefCountedPtr fallback_policy_; - std::string eds_service_name_; - absl::optional lrs_load_reporting_server_name_; -}; - -class XdsLb : public LoadBalancingPolicy { - public: - explicit XdsLb(Args args); - - const char* name() const override { return kXds; } - - void UpdateLocked(UpdateArgs args) override; - void ResetBackoffLocked() override; - - private: - class EndpointWatcher; - - // A simple wrapper to convert the picker returned from a locality's child - // policy as a unique_ptr<> to a RefCountedPtr<>. This allows it to be - // referenced by both the picker and the locality. - class RefCountedEndpointPicker : public RefCounted { - public: - explicit RefCountedEndpointPicker(std::unique_ptr picker) - : picker_(std::move(picker)) {} - PickResult Pick(PickArgs args) { return picker_->Pick(args); } - - private: - std::unique_ptr picker_; - }; - - // A picker that wraps the RefCountedEndpointPicker and performs load - // reporting for the locality. - class LoadReportingPicker : public RefCounted { - public: - LoadReportingPicker(RefCountedPtr picker, - RefCountedPtr locality_stats) - : picker_(std::move(picker)), - locality_stats_(std::move(locality_stats)) {} - - PickResult Pick(PickArgs args); - - RefCountedEndpointPicker* picker() const { return picker_.get(); } - XdsClusterLocalityStats* locality_stats() const { - return locality_stats_.get(); - } - - private: - RefCountedPtr picker_; - RefCountedPtr locality_stats_; - }; - - // A picker that uses a stateless weighting algorithm to pick the locality - // to use for each request. - class LocalityPicker : public SubchannelPicker { - public: - // Maintains a weighted list of pickers from each locality that is in ready - // state. The first element in the pair represents the end of a range - // proportional to the locality's weight. The start of the range is the - // previous value in the vector and is 0 for the first element. - using PickerList = - InlinedVector>, - 1>; - LocalityPicker(XdsLb* xds_policy, PickerList pickers) - : drop_stats_(xds_policy->drop_stats_), - drop_config_(xds_policy->drop_config_), - pickers_(std::move(pickers)) {} - - PickResult Pick(PickArgs args) override; - - private: - // Calls the picker of the locality that the key falls within. - PickResult PickFromLocality(const uint32_t key, PickArgs args); - - RefCountedPtr drop_stats_; - RefCountedPtr drop_config_; - PickerList pickers_; - }; - - class FallbackHelper : public ChannelControlHelper { - public: - explicit FallbackHelper(RefCountedPtr parent) - : parent_(std::move(parent)) {} - - ~FallbackHelper() { parent_.reset(DEBUG_LOCATION, "FallbackHelper"); } - - RefCountedPtr CreateSubchannel( - const grpc_channel_args& args) override; - void UpdateState(grpc_connectivity_state state, - std::unique_ptr picker) override; - void RequestReresolution() override; - void AddTraceEvent(TraceSeverity severity, StringView message) override; - - private: - RefCountedPtr parent_; - }; - - // Each LocalityMap holds a ref to the XdsLb. - class LocalityMap : public InternallyRefCounted { - public: - // Each Locality holds a ref to the LocalityMap it is in. - class Locality : public InternallyRefCounted { - public: - Locality(RefCountedPtr locality_map, - RefCountedPtr name); - ~Locality(); - - void UpdateLocked(uint32_t locality_weight, ServerAddressList serverlist, - bool update_locality_stats); - void ShutdownLocked(); - void ResetBackoffLocked(); - void DeactivateLocked(); - void Orphan() override; - - uint32_t weight() const { return weight_; } - - grpc_connectivity_state connectivity_state() const { - return connectivity_state_; - } - - RefCountedPtr GetLoadReportingPicker() { - // Recreate load reporting picker if stats object has changed. - if (load_reporting_picker_ == nullptr || - load_reporting_picker_->picker() != picker_wrapper_.get() || - load_reporting_picker_->locality_stats() != stats_.get()) { - load_reporting_picker_ = - MakeRefCounted(picker_wrapper_, stats_); - } - return load_reporting_picker_; - } - - void set_locality_map(RefCountedPtr locality_map) { - locality_map_ = std::move(locality_map); - } - - private: - class Helper : public ChannelControlHelper { - public: - explicit Helper(RefCountedPtr locality) - : locality_(std::move(locality)) {} - - ~Helper() { locality_.reset(DEBUG_LOCATION, "Helper"); } - - RefCountedPtr CreateSubchannel( - const grpc_channel_args& args) override; - void UpdateState(grpc_connectivity_state state, - std::unique_ptr picker) override; - // This is a no-op, because we get the addresses from the xds - // client, which is a watch-based API. - void RequestReresolution() override {} - void AddTraceEvent(TraceSeverity severity, StringView message) override; - - private: - RefCountedPtr locality_; - }; - - // Methods for dealing with the child policy. - OrphanablePtr CreateChildPolicyLocked( - const grpc_channel_args* args); - grpc_channel_args* CreateChildPolicyArgsLocked( - const grpc_channel_args* args); - - void UpdateLocalityStats(); - - static void OnDelayedRemovalTimer(void* arg, grpc_error* error); - static void OnDelayedRemovalTimerLocked(void* arg, grpc_error* error); - - XdsLb* xds_policy() const { return locality_map_->xds_policy(); } - - // The owning locality map. - RefCountedPtr locality_map_; - - RefCountedPtr name_; - RefCountedPtr stats_; - OrphanablePtr child_policy_; - RefCountedPtr picker_wrapper_; - RefCountedPtr load_reporting_picker_; - grpc_connectivity_state connectivity_state_ = GRPC_CHANNEL_IDLE; - uint32_t weight_; - - // States for delayed removal. - grpc_timer delayed_removal_timer_; - grpc_closure on_delayed_removal_timer_; - bool delayed_removal_timer_callback_pending_ = false; - bool shutdown_ = false; - }; - - LocalityMap(RefCountedPtr xds_policy, uint32_t priority); - - ~LocalityMap() { xds_policy_.reset(DEBUG_LOCATION, "LocalityMap"); } - - void UpdateLocked( - const XdsApi::PriorityListUpdate::LocalityMap& priority_update, - bool update_locality_stats); - void ResetBackoffLocked(); - void UpdateXdsPickerLocked(); - OrphanablePtr ExtractLocalityLocked( - const RefCountedPtr& name); - void DeactivateLocked(); - // Returns true if this locality map becomes the currently used one (i.e., - // its priority is selected) after reactivation. - bool MaybeReactivateLocked(); - void MaybeCancelFailoverTimerLocked(); - - void Orphan() override; - - XdsLb* xds_policy() const { return xds_policy_.get(); } - uint32_t priority() const { return priority_; } - grpc_connectivity_state connectivity_state() const { - return connectivity_state_; - } - bool failover_timer_callback_pending() const { - return failover_timer_callback_pending_; - } - - private: - void OnLocalityStateUpdateLocked(); - void UpdateConnectivityStateLocked(); - static void OnDelayedRemovalTimer(void* arg, grpc_error* error); - static void OnFailoverTimer(void* arg, grpc_error* error); - static void OnDelayedRemovalTimerLocked(void* arg, grpc_error* error); - static void OnFailoverTimerLocked(void* arg, grpc_error* error); - - const XdsApi::PriorityListUpdate& priority_list_update() const { - return xds_policy_->priority_list_update_; - } - const XdsApi::PriorityListUpdate::LocalityMap* locality_map_update() const { - return xds_policy_->priority_list_update_.Find(priority_); - } - - RefCountedPtr xds_policy_; - - std::map, OrphanablePtr, - XdsLocalityName::Less> - localities_; - const uint32_t priority_; - grpc_connectivity_state connectivity_state_ = GRPC_CHANNEL_IDLE; - - // States for delayed removal. - grpc_timer delayed_removal_timer_; - grpc_closure on_delayed_removal_timer_; - bool delayed_removal_timer_callback_pending_ = false; - - // States of failover. - grpc_timer failover_timer_; - grpc_closure on_failover_timer_; - bool failover_timer_callback_pending_ = false; - }; - - ~XdsLb(); - - void ShutdownLocked() override; - - const char* eds_service_name() const { - if (config_ != nullptr && config_->eds_service_name() != nullptr) { - return config_->eds_service_name(); - } - return server_name_.c_str(); - } - - XdsClient* xds_client() const { - return xds_client_from_channel_ != nullptr ? xds_client_from_channel_.get() - : xds_client_.get(); - } - - void UpdatePrioritiesLocked(bool update_locality_stats); - void UpdateXdsPickerLocked(); - void MaybeCreateLocalityMapLocked(uint32_t priority); - void FailoverOnConnectionFailureLocked(); - void FailoverOnDisconnectionLocked(uint32_t failed_priority); - void SwitchToHigherPriorityLocked(uint32_t priority); - void DeactivatePrioritiesLowerThan(uint32_t priority); - OrphanablePtr ExtractLocalityLocked( - const RefCountedPtr& name, uint32_t exclude_priority); - // Callers should make sure the priority list is non-empty. - uint32_t LowestPriority() const { - return static_cast(priorities_.size()) - 1; - } - bool Contains(uint32_t priority) { return priority < priorities_.size(); } - - // Methods for dealing with fallback state. - void MaybeCancelFallbackAtStartupChecks(); - static void OnFallbackTimer(void* arg, grpc_error* error); - static void OnFallbackTimerLocked(void* arg, grpc_error* error); - void UpdateFallbackPolicyLocked(); - OrphanablePtr CreateFallbackPolicyLocked( - const grpc_channel_args* args); - void MaybeExitFallbackMode(); - - // Server name from target URI. - std::string server_name_; - - // Current channel args and config from the resolver. - const grpc_channel_args* args_ = nullptr; - RefCountedPtr config_; - - // Internal state. - bool shutting_down_ = false; - - // The xds client and endpoint watcher. - // If we get the XdsClient from the channel, we store it in - // xds_client_from_channel_; if we create it ourselves, we store it in - // xds_client_. - RefCountedPtr xds_client_from_channel_; - OrphanablePtr xds_client_; - // A pointer to the endpoint watcher, to be used when cancelling the watch. - // Note that this is not owned, so this pointer must never be derefernced. - EndpointWatcher* endpoint_watcher_ = nullptr; - - // Whether the checks for fallback at startup are ALL pending. There are - // several cases where this can be reset: - // 1. The fallback timer fires, we enter fallback mode. - // 2. Before the fallback timer fires, the endpoint watcher reports an - // error, we enter fallback mode. - // 3. Before the fallback timer fires, if any child policy in the locality map - // becomes READY, we cancel the fallback timer. - bool fallback_at_startup_checks_pending_ = false; - // Timeout in milliseconds for before using fallback backend addresses. - // 0 means not using fallback. - const grpc_millis lb_fallback_timeout_ms_; - // The backend addresses from the resolver. - ServerAddressList fallback_backend_addresses_; - // Fallback timer. - grpc_timer lb_fallback_timer_; - grpc_closure lb_on_fallback_; - - // Non-null iff we are in fallback mode. - OrphanablePtr fallback_policy_; - - const grpc_millis locality_retention_interval_ms_; - const grpc_millis locality_map_failover_timeout_ms_; - // The list of locality maps, indexed by priority. P0 is the highest - // priority. - InlinedVector, 2> priorities_; - // The priority that is being used. - uint32_t current_priority_ = UINT32_MAX; - // The update for priority_list_. - XdsApi::PriorityListUpdate priority_list_update_; - - // The config for dropping calls. - RefCountedPtr drop_config_; - - // Drop stats for client-side load reporting. - RefCountedPtr drop_stats_; -}; - -// -// XdsLb::LoadReportingPicker -// - -LoadBalancingPolicy::PickResult XdsLb::LoadReportingPicker::Pick( - LoadBalancingPolicy::PickArgs args) { - // Forward the pick to the picker returned from the child policy. - PickResult result = picker_->Pick(args); - if (result.type != PickResult::PICK_COMPLETE || - result.subchannel == nullptr || locality_stats_ == nullptr) { - return result; - } - // Record a call started. - locality_stats_->AddCallStarted(); - // Intercept the recv_trailing_metadata op to record call completion. - XdsClusterLocalityStats* locality_stats = - locality_stats_->Ref(DEBUG_LOCATION, "LocalityStats+call").release(); - result.recv_trailing_metadata_ready = - // Note: This callback does not run in either the control plane - // combiner or in the data plane mutex. - [locality_stats](grpc_error* error, MetadataInterface* /*metadata*/, - CallState* /*call_state*/) { - const bool call_failed = error != GRPC_ERROR_NONE; - locality_stats->AddCallFinished(call_failed); - locality_stats->Unref(DEBUG_LOCATION, "LocalityStats+call"); - }; - return result; -} - -// -// XdsLb::LocalityPicker -// - -XdsLb::PickResult XdsLb::LocalityPicker::Pick(PickArgs args) { - // Handle drop. - const std::string* drop_category; - if (drop_config_->ShouldDrop(&drop_category)) { - if (drop_stats_ != nullptr) drop_stats_->AddCallDropped(*drop_category); - PickResult result; - result.type = PickResult::PICK_COMPLETE; - return result; - } - // If we didn't drop, we better have some localities to pick from. - if (pickers_.empty()) { // Should never happen. - PickResult result; - result.type = PickResult::PICK_FAILED; - result.error = - grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "xds picker not given any localities"), - GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_INTERNAL); - return result; - } - // Generate a random number in [0, total weight). - const uint32_t key = rand() % pickers_[pickers_.size() - 1].first; - // Forward pick to whichever locality maps to the range in which the - // random number falls in. - return PickFromLocality(key, args); -} - -XdsLb::PickResult XdsLb::LocalityPicker::PickFromLocality(const uint32_t key, - PickArgs args) { - size_t mid = 0; - size_t start_index = 0; - size_t end_index = pickers_.size() - 1; - size_t index = 0; - while (end_index > start_index) { - mid = (start_index + end_index) / 2; - if (pickers_[mid].first > key) { - end_index = mid; - } else if (pickers_[mid].first < key) { - start_index = mid + 1; - } else { - index = mid + 1; - break; - } - } - if (index == 0) index = start_index; - GPR_ASSERT(pickers_[index].first > key); - return pickers_[index].second->Pick(args); -} - -// -// XdsLb::FallbackHelper -// - -RefCountedPtr XdsLb::FallbackHelper::CreateSubchannel( - const grpc_channel_args& args) { - if (parent_->shutting_down_) return nullptr; - return parent_->channel_control_helper()->CreateSubchannel(args); -} - -void XdsLb::FallbackHelper::UpdateState( - grpc_connectivity_state state, std::unique_ptr picker) { - if (parent_->shutting_down_) return; - parent_->channel_control_helper()->UpdateState(state, std::move(picker)); -} - -void XdsLb::FallbackHelper::RequestReresolution() { - if (parent_->shutting_down_) return; - parent_->channel_control_helper()->RequestReresolution(); -} - -void XdsLb::FallbackHelper::AddTraceEvent(TraceSeverity severity, - StringView message) { - if (parent_->shutting_down_) return; - parent_->channel_control_helper()->AddTraceEvent(severity, message); -} - -// -// XdsLb::EndpointWatcher -// - -class XdsLb::EndpointWatcher : public XdsClient::EndpointWatcherInterface { - public: - explicit EndpointWatcher(RefCountedPtr xds_policy) - : xds_policy_(std::move(xds_policy)) {} - - ~EndpointWatcher() { xds_policy_.reset(DEBUG_LOCATION, "EndpointWatcher"); } - - void OnEndpointChanged(XdsApi::EdsUpdate update) override { - if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) { - gpr_log(GPR_INFO, "[xdslb %p] Received EDS update from xds client", - xds_policy_.get()); - } - // If the balancer tells us to drop all the calls, we should exit fallback - // mode immediately. - if (update.drop_config->drop_all()) xds_policy_->MaybeExitFallbackMode(); - // Update the drop config. - const bool drop_config_changed = - xds_policy_->drop_config_ == nullptr || - *xds_policy_->drop_config_ != *update.drop_config; - xds_policy_->drop_config_ = std::move(update.drop_config); - // Ignore identical locality update. - if (xds_policy_->priority_list_update_ == update.priority_list_update) { - if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) { - gpr_log(GPR_INFO, - "[xdslb %p] Incoming locality update identical to current, " - "ignoring. (drop_config_changed=%d)", - xds_policy_.get(), drop_config_changed); - } - if (drop_config_changed) { - xds_policy_->UpdateXdsPickerLocked(); - } - return; - } - // Update the priority list. - xds_policy_->priority_list_update_ = std::move(update.priority_list_update); - xds_policy_->UpdatePrioritiesLocked(false /*update_locality_stats*/); - } - - void OnError(grpc_error* error) override { - // If the fallback-at-startup checks are pending, go into fallback mode - // immediately. This short-circuits the timeout for the - // fallback-at-startup case. - if (xds_policy_->fallback_at_startup_checks_pending_) { - gpr_log(GPR_INFO, - "[xdslb %p] xds watcher reported error; entering fallback " - "mode: %s", - xds_policy_.get(), grpc_error_string(error)); - xds_policy_->fallback_at_startup_checks_pending_ = false; - grpc_timer_cancel(&xds_policy_->lb_fallback_timer_); - xds_policy_->UpdateFallbackPolicyLocked(); - // If the xds call failed, request re-resolution. - // TODO(roth): We check the error string contents here to - // differentiate between the xds call failing and the xds channel - // going into TRANSIENT_FAILURE. This is a pretty ugly hack, - // but it's okay for now, since we're not yet sure whether we will - // continue to support the current fallback functionality. If we - // decide to keep the fallback approach, then we should either - // find a cleaner way to expose the difference between these two - // cases or decide that we're okay re-resolving in both cases. - // Note that even if we do keep the current fallback functionality, - // this re-resolution will only be necessary if we are going to be - // using this LB policy with resolvers other than the xds resolver. - if (strstr(grpc_error_string(error), "xds call failed")) { - xds_policy_->channel_control_helper()->RequestReresolution(); - } - } else if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) { - gpr_log(GPR_INFO, "[xdslb %p] xds watcher reported error (ignoring): %s", - xds_policy_.get(), grpc_error_string(error)); - } - GRPC_ERROR_UNREF(error); - } - - private: - RefCountedPtr xds_policy_; -}; - -// -// ctor and dtor -// - -XdsLb::XdsLb(Args args) - : LoadBalancingPolicy(std::move(args)), - xds_client_from_channel_(XdsClient::GetFromChannelArgs(*args.args)), - lb_fallback_timeout_ms_(grpc_channel_args_find_integer( - args.args, GRPC_ARG_XDS_FALLBACK_TIMEOUT_MS, - {GRPC_XDS_DEFAULT_FALLBACK_TIMEOUT_MS, 0, INT_MAX})), - locality_retention_interval_ms_(grpc_channel_args_find_integer( - args.args, GRPC_ARG_LOCALITY_RETENTION_INTERVAL_MS, - {GRPC_XDS_DEFAULT_LOCALITY_RETENTION_INTERVAL_MS, 0, INT_MAX})), - locality_map_failover_timeout_ms_(grpc_channel_args_find_integer( - args.args, GRPC_ARG_XDS_FAILOVER_TIMEOUT_MS, - {GRPC_XDS_DEFAULT_FAILOVER_TIMEOUT_MS, 0, INT_MAX})) { - if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) { - gpr_log(GPR_INFO, "[xdslb %p] created -- xds client from channel: %p", this, - xds_client_from_channel_.get()); - } - // Record server name. - const grpc_arg* arg = grpc_channel_args_find(args.args, GRPC_ARG_SERVER_URI); - const char* server_uri = grpc_channel_arg_get_string(arg); - GPR_ASSERT(server_uri != nullptr); - grpc_uri* uri = grpc_uri_parse(server_uri, true); - GPR_ASSERT(uri->path[0] != '\0'); - server_name_ = uri->path[0] == '/' ? uri->path + 1 : uri->path; - if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) { - gpr_log(GPR_INFO, "[xdslb %p] server name from channel: %s", this, - server_name_.c_str()); - } - grpc_uri_destroy(uri); -} - -XdsLb::~XdsLb() { - if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) { - gpr_log(GPR_INFO, "[xdslb %p] destroying xds LB policy", this); - } - grpc_channel_args_destroy(args_); -} - -void XdsLb::ShutdownLocked() { - if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) { - gpr_log(GPR_INFO, "[xdslb %p] shutting down", this); - } - shutting_down_ = true; - MaybeCancelFallbackAtStartupChecks(); - priorities_.clear(); - drop_stats_.reset(); - if (fallback_policy_ != nullptr) { - grpc_pollset_set_del_pollset_set(fallback_policy_->interested_parties(), - interested_parties()); - fallback_policy_.reset(); - } - // Cancel the endpoint watch here instead of in our dtor if we are using the - // XdsResolver, because the watcher holds a ref to us and we might not be - // destroying the Xds client leading to a situation where the Xds lb policy is - // never destroyed. - if (xds_client_from_channel_ != nullptr) { - if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) { - gpr_log(GPR_INFO, "[xdslb %p] cancelling watch for %s", this, - eds_service_name()); - } - xds_client()->CancelEndpointDataWatch(StringView(eds_service_name()), - endpoint_watcher_); - xds_client_from_channel_.reset(); - } - xds_client_.reset(); -} - -// -// public methods -// - -void XdsLb::ResetBackoffLocked() { - // When the XdsClient is instantiated in the resolver instead of in this - // LB policy, this is done via the resolver, so we don't need to do it - // for xds_client_from_channel_ here. - if (xds_client_ != nullptr) xds_client_->ResetBackoff(); - for (size_t i = 0; i < priorities_.size(); ++i) { - priorities_[i]->ResetBackoffLocked(); - } - if (fallback_policy_ != nullptr) { - fallback_policy_->ResetBackoffLocked(); - } -} - -void XdsLb::UpdateLocked(UpdateArgs args) { - if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) { - gpr_log(GPR_INFO, "[xdslb %p] Received update", this); - } - const bool is_initial_update = args_ == nullptr; - // Update config. - auto old_config = std::move(config_); - config_ = std::move(args.config); - // Update fallback address list. - fallback_backend_addresses_ = std::move(args.addresses); - // Update args. - grpc_channel_args_destroy(args_); - args_ = args.args; - args.args = nullptr; - // Update the existing fallback policy. The fallback policy config and/or the - // fallback addresses may be new. - if (fallback_policy_ != nullptr) UpdateFallbackPolicyLocked(); - if (is_initial_update) { - // Initialize XdsClient. - if (xds_client_from_channel_ == nullptr) { - grpc_error* error = GRPC_ERROR_NONE; - xds_client_ = MakeOrphanable( - combiner(), interested_parties(), StringView(eds_service_name()), - nullptr /* service config watcher */, *args_, &error); - // TODO(roth): If we decide that we care about fallback mode, add - // proper error handling here. - GPR_ASSERT(error == GRPC_ERROR_NONE); - if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) { - gpr_log(GPR_INFO, "[xdslb %p] Created xds client %p", this, - xds_client_.get()); - } - } - // Start fallback-at-startup checks. - grpc_millis deadline = ExecCtx::Get()->Now() + lb_fallback_timeout_ms_; - Ref(DEBUG_LOCATION, "on_fallback_timer").release(); // Held by closure - GRPC_CLOSURE_INIT(&lb_on_fallback_, &XdsLb::OnFallbackTimer, this, - grpc_schedule_on_exec_ctx); - fallback_at_startup_checks_pending_ = true; - grpc_timer_init(&lb_fallback_timer_, deadline, &lb_on_fallback_); - } - // Update drop stats for load reporting if needed. - if (is_initial_update || config_->lrs_load_reporting_server_name() != - old_config->lrs_load_reporting_server_name()) { - drop_stats_.reset(); - if (config_->lrs_load_reporting_server_name().has_value()) { - drop_stats_ = xds_client()->AddClusterDropStats( - config_->lrs_load_reporting_server_name().value(), - // TODO(roth): We currently hard-code the assumption that - // cluster name and EDS service name are the same. Fix this - // as part of refectoring this LB policy. - eds_service_name(), eds_service_name()); - } - } - // On the initial update, create the endpoint watcher. - if (is_initial_update) { - if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) { - gpr_log(GPR_INFO, "[xdslb %p] starting watch for %s", this, - eds_service_name()); - } - auto watcher = absl::make_unique( - Ref(DEBUG_LOCATION, "EndpointWatcher")); - endpoint_watcher_ = watcher.get(); - xds_client()->WatchEndpointData(StringView(eds_service_name()), - std::move(watcher)); - } else { - // Update priority list. - // Note that this comes after updating drop_stats_, since we want that - // to be used by any new picker we create here. - // No need to do this on the initial update, since there won't be any - // priorities to update yet. - const bool update_locality_stats = - config_->lrs_load_reporting_server_name() != - old_config->lrs_load_reporting_server_name(); - UpdatePrioritiesLocked(update_locality_stats); - } -} - -// -// fallback-related methods -// - -void XdsLb::MaybeCancelFallbackAtStartupChecks() { - if (!fallback_at_startup_checks_pending_) return; - if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) { - gpr_log(GPR_INFO, "[xdslb %p] Cancelling fallback timer", this); - } - grpc_timer_cancel(&lb_fallback_timer_); - fallback_at_startup_checks_pending_ = false; -} - -void XdsLb::OnFallbackTimer(void* arg, grpc_error* error) { - XdsLb* xdslb_policy = static_cast(arg); - xdslb_policy->combiner()->Run( - GRPC_CLOSURE_INIT(&xdslb_policy->lb_on_fallback_, - &XdsLb::OnFallbackTimerLocked, xdslb_policy, nullptr), - GRPC_ERROR_REF(error)); -} - -void XdsLb::OnFallbackTimerLocked(void* arg, grpc_error* error) { - XdsLb* xdslb_policy = static_cast(arg); - // If some fallback-at-startup check is done after the timer fires but before - // this callback actually runs, don't fall back. - if (xdslb_policy->fallback_at_startup_checks_pending_ && - !xdslb_policy->shutting_down_ && error == GRPC_ERROR_NONE) { - gpr_log(GPR_INFO, - "[xdslb %p] Child policy not ready after fallback timeout; " - "entering fallback mode", - xdslb_policy); - xdslb_policy->fallback_at_startup_checks_pending_ = false; - xdslb_policy->UpdateFallbackPolicyLocked(); - } - xdslb_policy->Unref(DEBUG_LOCATION, "on_fallback_timer"); -} - -void XdsLb::UpdateFallbackPolicyLocked() { - if (shutting_down_) return; - // Create policy if needed. - if (fallback_policy_ == nullptr) { - fallback_policy_ = CreateFallbackPolicyLocked(args_); - GPR_ASSERT(fallback_policy_ != nullptr); - } - // Perform update. - UpdateArgs update_args; - update_args.addresses = fallback_backend_addresses_; - update_args.config = config_->fallback_policy(); - update_args.args = grpc_channel_args_copy(args_); - if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) { - gpr_log(GPR_INFO, "[xdslb %p] Updating fallback child policy handler %p", - this, fallback_policy_.get()); - } - fallback_policy_->UpdateLocked(std::move(update_args)); -} - -OrphanablePtr XdsLb::CreateFallbackPolicyLocked( - const grpc_channel_args* args) { - LoadBalancingPolicy::Args lb_policy_args; - lb_policy_args.combiner = combiner(); - lb_policy_args.args = args; - lb_policy_args.channel_control_helper = - absl::make_unique(Ref(DEBUG_LOCATION, "FallbackHelper")); - OrphanablePtr lb_policy = - MakeOrphanable(std::move(lb_policy_args), - &grpc_lb_xds_trace); - if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) { - gpr_log(GPR_INFO, - "[xdslb %p] Created new fallback child policy handler (%p)", this, - lb_policy.get()); - } - // Add the xDS's interested_parties pollset_set to that of the newly created - // child policy. This will make the child policy progress upon activity on xDS - // LB, which in turn is tied to the application's call. - grpc_pollset_set_add_pollset_set(lb_policy->interested_parties(), - interested_parties()); - return lb_policy; -} - -void XdsLb::MaybeExitFallbackMode() { - if (fallback_policy_ == nullptr) return; - gpr_log(GPR_INFO, "[xdslb %p] Exiting fallback mode", this); - fallback_policy_.reset(); -} - -// -// priority list-related methods -// - -void XdsLb::UpdatePrioritiesLocked(bool update_locality_stats) { - // 1. Remove from the priority list the priorities that are not in the update. - DeactivatePrioritiesLowerThan(priority_list_update_.LowestPriority()); - // 2. Update all the existing priorities. - for (uint32_t priority = 0; priority < priorities_.size(); ++priority) { - LocalityMap* locality_map = priorities_[priority].get(); - const auto* locality_map_update = priority_list_update_.Find(priority); - // If we have more current priorities than exist in the update, stop here. - if (locality_map_update == nullptr) break; - // Propagate locality_map_update. - // TODO(juanlishen): Find a clean way to skip duplicate update for a - // priority. - locality_map->UpdateLocked(*locality_map_update, update_locality_stats); - } - // 3. Only create a new locality map if all the existing ones have failed. - if (priorities_.empty() || - !priorities_[priorities_.size() - 1]->failover_timer_callback_pending()) { - const uint32_t new_priority = static_cast(priorities_.size()); - // Create a new locality map. Note that in some rare cases (e.g., the - // locality map reports TRANSIENT_FAILURE synchronously due to subchannel - // sharing), the following invocation may result in multiple locality maps - // to be created. - MaybeCreateLocalityMapLocked(new_priority); - } - // 4. If we updated locality stats and we already have at least one - // priority, update the picker to start using the new stats object(s). - if (update_locality_stats && !priorities_.empty()) { - UpdateXdsPickerLocked(); - } -} - -void XdsLb::UpdateXdsPickerLocked() { - // If we are in fallback mode, don't generate an xds picker from localities. - if (fallback_policy_ != nullptr) return; - // If we're dropping all calls, report READY, even though we won't - // have a selected priority. - if (drop_config_ != nullptr && drop_config_->drop_all()) { - channel_control_helper()->UpdateState( - GRPC_CHANNEL_READY, - absl::make_unique(this, LocalityPicker::PickerList{})); - return; - } - // If we don't have a selected priority, report TRANSIENT_FAILURE. - if (current_priority_ == UINT32_MAX) { - if (fallback_policy_ == nullptr) { - grpc_error* error = grpc_error_set_int( - GRPC_ERROR_CREATE_FROM_STATIC_STRING("no ready locality map"), - GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE); - channel_control_helper()->UpdateState( - GRPC_CHANNEL_TRANSIENT_FAILURE, - absl::make_unique(error)); - } - return; - } - priorities_[current_priority_]->UpdateXdsPickerLocked(); -} - -void XdsLb::MaybeCreateLocalityMapLocked(uint32_t priority) { - // Exhausted priorities in the update. - if (!priority_list_update_.Contains(priority)) return; - auto new_locality_map = - new LocalityMap(Ref(DEBUG_LOCATION, "LocalityMap"), priority); - priorities_.emplace_back(OrphanablePtr(new_locality_map)); - new_locality_map->UpdateLocked(*priority_list_update_.Find(priority), - false /*update_locality_stats*/); -} - -void XdsLb::FailoverOnConnectionFailureLocked() { - const uint32_t failed_priority = LowestPriority(); - // If we're failing over from the lowest priority, report TRANSIENT_FAILURE. - if (failed_priority == priority_list_update_.LowestPriority()) { - UpdateXdsPickerLocked(); - } - MaybeCreateLocalityMapLocked(failed_priority + 1); -} - -void XdsLb::FailoverOnDisconnectionLocked(uint32_t failed_priority) { - current_priority_ = UINT32_MAX; - for (uint32_t next_priority = failed_priority + 1; - next_priority <= priority_list_update_.LowestPriority(); - ++next_priority) { - if (!Contains(next_priority)) { - MaybeCreateLocalityMapLocked(next_priority); - return; - } - if (priorities_[next_priority]->MaybeReactivateLocked()) return; - } -} - -void XdsLb::SwitchToHigherPriorityLocked(uint32_t priority) { - current_priority_ = priority; - DeactivatePrioritiesLowerThan(current_priority_); - UpdateXdsPickerLocked(); -} - -void XdsLb::DeactivatePrioritiesLowerThan(uint32_t priority) { - if (priorities_.empty()) return; - // Deactivate the locality maps from the lowest priority. - for (uint32_t p = LowestPriority(); p > priority; --p) { - if (locality_retention_interval_ms_ == 0) { - priorities_.pop_back(); - } else { - priorities_[p]->DeactivateLocked(); - } - } -} - -OrphanablePtr XdsLb::ExtractLocalityLocked( - const RefCountedPtr& name, uint32_t exclude_priority) { - for (uint32_t priority = 0; priority < priorities_.size(); ++priority) { - if (priority == exclude_priority) continue; - LocalityMap* locality_map = priorities_[priority].get(); - auto locality = locality_map->ExtractLocalityLocked(name); - if (locality != nullptr) { - if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) { - gpr_log(GPR_INFO, - "[xdslb %p] moving locality %p %s to new priority (%" PRIu32 - " -> %" PRIu32 ")", - this, locality.get(), name->AsHumanReadableString(), - exclude_priority, priority); - } - return locality; - } - } - return nullptr; -} - -// -// XdsLb::LocalityMap -// - -XdsLb::LocalityMap::LocalityMap(RefCountedPtr xds_policy, - uint32_t priority) - : xds_policy_(std::move(xds_policy)), priority_(priority) { - if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) { - gpr_log(GPR_INFO, "[xdslb %p] Creating priority %" PRIu32, - xds_policy_.get(), priority_); - } - GRPC_CLOSURE_INIT(&on_failover_timer_, OnFailoverTimer, this, - grpc_schedule_on_exec_ctx); - // Start the failover timer. - Ref(DEBUG_LOCATION, "LocalityMap+OnFailoverTimerLocked").release(); - grpc_timer_init( - &failover_timer_, - ExecCtx::Get()->Now() + xds_policy_->locality_map_failover_timeout_ms_, - &on_failover_timer_); - failover_timer_callback_pending_ = true; - // This is the first locality map ever created, report CONNECTING. - if (priority_ == 0 && xds_policy_->fallback_policy_ == nullptr) { - xds_policy_->channel_control_helper()->UpdateState( - GRPC_CHANNEL_CONNECTING, - absl::make_unique( - xds_policy_->Ref(DEBUG_LOCATION, "QueuePicker"))); - } -} - -void XdsLb::LocalityMap::UpdateLocked( - const XdsApi::PriorityListUpdate::LocalityMap& priority_update, - bool update_locality_stats) { - if (xds_policy_->shutting_down_) return; - if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) { - gpr_log(GPR_INFO, "[xdslb %p] Start Updating priority %" PRIu32, - xds_policy(), priority_); - } - // Maybe reactivate the locality map in case all the active locality maps have - // failed. - MaybeReactivateLocked(); - // Remove (later) the localities not in priority_update. - for (auto iter = localities_.begin(); iter != localities_.end();) { - const auto& name = iter->first; - Locality* locality = iter->second.get(); - if (priority_update.Contains(name)) { - ++iter; - continue; - } - if (xds_policy()->locality_retention_interval_ms_ == 0) { - iter = localities_.erase(iter); - } else { - locality->DeactivateLocked(); - ++iter; - } - } - // Add or update the localities in priority_update. - for (const auto& p : priority_update.localities) { - const auto& name = p.first; - const auto& locality_update = p.second; - OrphanablePtr& locality = localities_[name]; - if (locality == nullptr) { - // Move from another locality map if possible. - locality = xds_policy_->ExtractLocalityLocked(name, priority_); - if (locality != nullptr) { - locality->set_locality_map( - Ref(DEBUG_LOCATION, "LocalityMap+Locality_move")); - } else { - locality = MakeOrphanable( - Ref(DEBUG_LOCATION, "LocalityMap+Locality"), name); - } - } - // Keep a copy of serverlist in the update so that we can compare it - // with the future ones. - locality->UpdateLocked(locality_update.lb_weight, - locality_update.serverlist, update_locality_stats); - } - // If this is the current priority and we removed all of the READY - // localities, go into state CONNECTING. - // TODO(roth): Ideally, we should model this as a graceful policy - // switch: we should keep using the old localities for a short period - // of time, long enough to give the new localities a chance to get - // connected. As part of refactoring this policy, we should try to - // fix that. - if (priority_ == xds_policy()->current_priority_) { - bool found_ready = false; - for (auto& p : localities_) { - const auto& locality_name = p.first; - Locality* locality = p.second.get(); - if (!locality_map_update()->Contains(locality_name)) continue; - if (locality->connectivity_state() == GRPC_CHANNEL_READY) { - found_ready = true; - break; - } - } - if (!found_ready) { - xds_policy_->channel_control_helper()->UpdateState( - GRPC_CHANNEL_CONNECTING, - absl::make_unique( - xds_policy_->Ref(DEBUG_LOCATION, "QueuePicker"))); - xds_policy_->current_priority_ = UINT32_MAX; - } - } -} - -void XdsLb::LocalityMap::ResetBackoffLocked() { - for (auto& p : localities_) p.second->ResetBackoffLocked(); -} - -void XdsLb::LocalityMap::UpdateXdsPickerLocked() { - if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) { - gpr_log(GPR_INFO, "[xdslb %p] constructing new picker", xds_policy()); - } - // Construct a new xds picker which maintains a map of all locality pickers - // that are ready. Each locality is represented by a portion of the range - // proportional to its weight, such that the total range is the sum of the - // weights of all localities. - LocalityPicker::PickerList picker_list; - uint32_t end = 0; - for (auto& p : localities_) { - const auto& locality_name = p.first; - Locality* locality = p.second.get(); - // Skip the localities that are not in the latest locality map update. - const auto* locality_update = locality_map_update(); - if (locality_update == nullptr) continue; - if (!locality_update->Contains(locality_name)) continue; - if (locality->connectivity_state() != GRPC_CHANNEL_READY) continue; - end += locality->weight(); - picker_list.push_back( - std::make_pair(end, locality->GetLoadReportingPicker())); - if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) { - gpr_log(GPR_INFO, "[xdslb %p] locality=%s weight=%d picker=%p", - xds_policy(), locality_name->AsHumanReadableString(), - locality->weight(), picker_list.back().second.get()); - } - } - xds_policy()->channel_control_helper()->UpdateState( - GRPC_CHANNEL_READY, - absl::make_unique(xds_policy(), std::move(picker_list))); -} - -OrphanablePtr -XdsLb::LocalityMap::ExtractLocalityLocked( - const RefCountedPtr& name) { - for (auto iter = localities_.begin(); iter != localities_.end(); ++iter) { - const auto& name_in_map = iter->first; - if (*name_in_map == *name) { - auto locality = std::move(iter->second); - localities_.erase(iter); - return locality; - } - } - return nullptr; -} - -void XdsLb::LocalityMap::DeactivateLocked() { - if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) { - gpr_log(GPR_INFO, "[xdslb %p] deactivating priority %" PRIu32, xds_policy(), - priority_); - } - // If already deactivated, don't do it again. - if (delayed_removal_timer_callback_pending_) return; - MaybeCancelFailoverTimerLocked(); - // Start a timer to delete the locality. - Ref(DEBUG_LOCATION, "LocalityMap+timer").release(); - if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) { - gpr_log(GPR_INFO, - "[xdslb %p] Will remove priority %" PRIu32 " in %" PRId64 " ms.", - xds_policy(), priority_, - xds_policy()->locality_retention_interval_ms_); - } - GRPC_CLOSURE_INIT(&on_delayed_removal_timer_, OnDelayedRemovalTimer, this, - grpc_schedule_on_exec_ctx); - grpc_timer_init( - &delayed_removal_timer_, - ExecCtx::Get()->Now() + xds_policy()->locality_retention_interval_ms_, - &on_delayed_removal_timer_); - delayed_removal_timer_callback_pending_ = true; -} - -bool XdsLb::LocalityMap::MaybeReactivateLocked() { - // Don't reactivate a priority that is not higher than the current one. - if (priority_ >= xds_policy_->current_priority_) return false; - // Reactivate this priority by cancelling deletion timer. - if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) { - gpr_log(GPR_INFO, "[xdslb %p] reactivating priority %" PRIu32, xds_policy(), - priority_); - } - if (delayed_removal_timer_callback_pending_) { - grpc_timer_cancel(&delayed_removal_timer_); - } - // Switch to this higher priority if it's READY. - if (connectivity_state_ != GRPC_CHANNEL_READY) return false; - xds_policy_->SwitchToHigherPriorityLocked(priority_); - return true; -} - -void XdsLb::LocalityMap::MaybeCancelFailoverTimerLocked() { - if (failover_timer_callback_pending_) grpc_timer_cancel(&failover_timer_); -} - -void XdsLb::LocalityMap::Orphan() { - if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) { - gpr_log(GPR_INFO, "[xdslb %p] Priority %" PRIu32 " orphaned.", xds_policy(), - priority_); - } - MaybeCancelFailoverTimerLocked(); - if (delayed_removal_timer_callback_pending_) { - grpc_timer_cancel(&delayed_removal_timer_); - } - localities_.clear(); - Unref(DEBUG_LOCATION, "LocalityMap+Orphan"); -} - -void XdsLb::LocalityMap::OnLocalityStateUpdateLocked() { - UpdateConnectivityStateLocked(); - // Ignore priorities not in priority_list_update. - if (!priority_list_update().Contains(priority_)) return; - const uint32_t current_priority = xds_policy_->current_priority_; - // Ignore lower-than-current priorities. - if (priority_ > current_priority) return; - // Maybe update fallback state. - if (connectivity_state_ == GRPC_CHANNEL_READY) { - xds_policy_->MaybeCancelFallbackAtStartupChecks(); - xds_policy_->MaybeExitFallbackMode(); - } - // Update is for a higher-than-current priority. (Special case: update is for - // any active priority if there is no current priority.) - if (priority_ < current_priority) { - if (connectivity_state_ == GRPC_CHANNEL_READY) { - MaybeCancelFailoverTimerLocked(); - // If a higher-than-current priority becomes READY, switch to use it. - xds_policy_->SwitchToHigherPriorityLocked(priority_); - } else if (connectivity_state_ == GRPC_CHANNEL_TRANSIENT_FAILURE) { - // If a higher-than-current priority becomes TRANSIENT_FAILURE, only - // handle it if it's the priority that is still in failover timeout. - if (failover_timer_callback_pending_) { - MaybeCancelFailoverTimerLocked(); - xds_policy_->FailoverOnConnectionFailureLocked(); - } - } - return; - } - // Update is for current priority. - if (connectivity_state_ != GRPC_CHANNEL_READY) { - // Fail over if it's no longer READY. - xds_policy_->FailoverOnDisconnectionLocked(priority_); - } - // At this point, one of the following things has happened to the current - // priority. - // 1. It remained the same (but received picker update from its localities). - // 2. It changed to a lower priority due to failover. - // 3. It became invalid because failover didn't yield a READY priority. - // In any case, update the xds picker. - xds_policy_->UpdateXdsPickerLocked(); -} - -void XdsLb::LocalityMap::UpdateConnectivityStateLocked() { - size_t num_ready = 0; - size_t num_connecting = 0; - size_t num_idle = 0; - size_t num_transient_failures = 0; - for (const auto& p : localities_) { - const auto& locality_name = p.first; - const Locality* locality = p.second.get(); - // Skip the localities that are not in the latest locality map update. - if (!locality_map_update()->Contains(locality_name)) continue; - switch (locality->connectivity_state()) { - case GRPC_CHANNEL_READY: { - ++num_ready; - break; - } - case GRPC_CHANNEL_CONNECTING: { - ++num_connecting; - break; - } - case GRPC_CHANNEL_IDLE: { - ++num_idle; - break; - } - case GRPC_CHANNEL_TRANSIENT_FAILURE: { - ++num_transient_failures; - break; - } - default: - GPR_UNREACHABLE_CODE(return ); - } - } - if (num_ready > 0) { - connectivity_state_ = GRPC_CHANNEL_READY; - } else if (num_connecting > 0) { - connectivity_state_ = GRPC_CHANNEL_CONNECTING; - } else if (num_idle > 0) { - connectivity_state_ = GRPC_CHANNEL_IDLE; - } else { - connectivity_state_ = GRPC_CHANNEL_TRANSIENT_FAILURE; - } - if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) { - gpr_log(GPR_INFO, - "[xdslb %p] Priority %" PRIu32 " (%p) connectivity changed to %s", - xds_policy(), priority_, this, - ConnectivityStateName(connectivity_state_)); - } -} - -void XdsLb::LocalityMap::OnDelayedRemovalTimer(void* arg, grpc_error* error) { - LocalityMap* self = static_cast(arg); - self->xds_policy_->combiner()->Run( - GRPC_CLOSURE_INIT(&self->on_delayed_removal_timer_, - OnDelayedRemovalTimerLocked, self, nullptr), - GRPC_ERROR_REF(error)); -} - -void XdsLb::LocalityMap::OnDelayedRemovalTimerLocked(void* arg, - grpc_error* error) { - LocalityMap* self = static_cast(arg); - self->delayed_removal_timer_callback_pending_ = false; - if (error == GRPC_ERROR_NONE && !self->xds_policy_->shutting_down_) { - const bool keep = self->priority_list_update().Contains(self->priority_) && - self->priority_ <= self->xds_policy_->current_priority_; - if (!keep) { - // This check is to make sure we always delete the locality maps from - // the lowest priority even if the closures of the back-to-back timers - // are not run in FIFO order. - // TODO(juanlishen): Eliminate unnecessary maintenance overhead for some - // deactivated locality maps when out-of-order closures are run. - // TODO(juanlishen): Check the timer implementation to see if this - // defense is necessary. - if (self->priority_ == self->xds_policy_->LowestPriority()) { - self->xds_policy_->priorities_.pop_back(); - } else { - gpr_log(GPR_ERROR, - "[xdslb %p] Priority %" PRIu32 - " is not the lowest priority (highest numeric value) but is " - "attempted to be deleted.", - self->xds_policy(), self->priority_); - } - } - } - self->Unref(DEBUG_LOCATION, "LocalityMap+timer"); -} - -void XdsLb::LocalityMap::OnFailoverTimer(void* arg, grpc_error* error) { - LocalityMap* self = static_cast(arg); - self->xds_policy_->combiner()->Run( - GRPC_CLOSURE_INIT(&self->on_failover_timer_, OnFailoverTimerLocked, self, - nullptr), - GRPC_ERROR_REF(error)); -} - -void XdsLb::LocalityMap::OnFailoverTimerLocked(void* arg, grpc_error* error) { - LocalityMap* self = static_cast(arg); - self->failover_timer_callback_pending_ = false; - if (error == GRPC_ERROR_NONE && !self->xds_policy_->shutting_down_) { - self->xds_policy_->FailoverOnConnectionFailureLocked(); - } - self->Unref(DEBUG_LOCATION, "LocalityMap+OnFailoverTimerLocked"); -} - -// -// XdsLb::LocalityMap::Locality -// - -XdsLb::LocalityMap::Locality::Locality(RefCountedPtr locality_map, - RefCountedPtr name) - : locality_map_(std::move(locality_map)), name_(std::move(name)) { - if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) { - gpr_log(GPR_INFO, "[xdslb %p] created Locality %p for %s", xds_policy(), - this, name_->AsHumanReadableString()); - } - // Initialize locality stats if load reporting is enabled. - UpdateLocalityStats(); -} - -XdsLb::LocalityMap::Locality::~Locality() { - if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) { - gpr_log(GPR_INFO, "[xdslb %p] Locality %p %s: destroying locality", - xds_policy(), this, name_->AsHumanReadableString()); - } - locality_map_.reset(DEBUG_LOCATION, "Locality"); -} - -void XdsLb::LocalityMap::Locality::UpdateLocalityStats() { - stats_.reset(); - if (xds_policy()->config_->lrs_load_reporting_server_name().has_value()) { - stats_ = xds_policy()->xds_client()->AddClusterLocalityStats( - xds_policy()->config_->lrs_load_reporting_server_name().value(), - // TODO(roth): We currently hard-code the assumption that - // cluster name and EDS service name are the same. Fix this - // as part of refectoring this LB policy. - xds_policy()->eds_service_name(), xds_policy()->eds_service_name(), - name_); - } -} - -grpc_channel_args* XdsLb::LocalityMap::Locality::CreateChildPolicyArgsLocked( - const grpc_channel_args* args_in) { - const grpc_arg args_to_add[] = { - // A channel arg indicating if the target is a backend inferred from a - // grpclb load balancer. - grpc_channel_arg_integer_create( - const_cast(GRPC_ARG_ADDRESS_IS_BACKEND_FROM_XDS_LOAD_BALANCER), - 1), - // Inhibit client-side health checking, since the balancer does - // this for us. - grpc_channel_arg_integer_create( - const_cast(GRPC_ARG_INHIBIT_HEALTH_CHECKING), 1), - }; - return grpc_channel_args_copy_and_add(args_in, args_to_add, - GPR_ARRAY_SIZE(args_to_add)); -} - -OrphanablePtr -XdsLb::LocalityMap::Locality::CreateChildPolicyLocked( - const grpc_channel_args* args) { - LoadBalancingPolicy::Args lb_policy_args; - lb_policy_args.combiner = xds_policy()->combiner(); - lb_policy_args.args = args; - lb_policy_args.channel_control_helper = - absl::make_unique(this->Ref(DEBUG_LOCATION, "Helper")); - OrphanablePtr lb_policy = - MakeOrphanable(std::move(lb_policy_args), - &grpc_lb_xds_trace); - if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) { - gpr_log(GPR_INFO, - "[xdslb %p] Locality %p %s: Created new child policy handler (%p)", - xds_policy(), this, name_->AsHumanReadableString(), - lb_policy.get()); - } - // Add the xDS's interested_parties pollset_set to that of the newly created - // child policy. This will make the child policy progress upon activity on - // xDS LB, which in turn is tied to the application's call. - grpc_pollset_set_add_pollset_set(lb_policy->interested_parties(), - xds_policy()->interested_parties()); - return lb_policy; -} - -void XdsLb::LocalityMap::Locality::UpdateLocked(uint32_t locality_weight, - ServerAddressList serverlist, - bool update_locality_stats) { - if (xds_policy()->shutting_down_) return; - // Update locality weight. - weight_ = locality_weight; - if (delayed_removal_timer_callback_pending_) { - if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) { - gpr_log(GPR_INFO, "[xdslb %p] Locality %p %s: reactivating", xds_policy(), - this, name_->AsHumanReadableString()); - } - grpc_timer_cancel(&delayed_removal_timer_); - } - // Update locality stats. - if (update_locality_stats) UpdateLocalityStats(); - // Construct update args. - UpdateArgs update_args; - update_args.addresses = std::move(serverlist); - update_args.config = xds_policy()->config_->child_policy(); - update_args.args = CreateChildPolicyArgsLocked(xds_policy()->args_); - // Create child policy if needed. - if (child_policy_ == nullptr) { - child_policy_ = CreateChildPolicyLocked(update_args.args); - GPR_ASSERT(child_policy_ != nullptr); - } - // Update the policy. - if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) { - gpr_log(GPR_INFO, - "[xdslb %p] Locality %p %s: Updating child policy handler %p", - xds_policy(), this, name_->AsHumanReadableString(), - child_policy_.get()); - } - child_policy_->UpdateLocked(std::move(update_args)); -} - -void XdsLb::LocalityMap::Locality::ShutdownLocked() { - if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) { - gpr_log(GPR_INFO, "[xdslb %p] Locality %p %s: shutting down locality", - xds_policy(), this, name_->AsHumanReadableString()); - } - stats_.reset(); - // Remove the child policy's interested_parties pollset_set from the - // xDS policy. - grpc_pollset_set_del_pollset_set(child_policy_->interested_parties(), - xds_policy()->interested_parties()); - child_policy_.reset(); - // Drop our ref to the child's picker, in case it's holding a ref to - // the child. - load_reporting_picker_.reset(); - picker_wrapper_.reset(); - if (delayed_removal_timer_callback_pending_) { - grpc_timer_cancel(&delayed_removal_timer_); - } - shutdown_ = true; -} - -void XdsLb::LocalityMap::Locality::ResetBackoffLocked() { - child_policy_->ResetBackoffLocked(); -} - -void XdsLb::LocalityMap::Locality::Orphan() { - ShutdownLocked(); - Unref(); -} - -void XdsLb::LocalityMap::Locality::DeactivateLocked() { - // If already deactivated, don't do that again. - if (weight_ == 0) return; - if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) { - gpr_log(GPR_INFO, "[xdslb %p] Locality %p %s: deactivating", xds_policy(), - this, name_->AsHumanReadableString()); - } - // Set the locality weight to 0 so that future xds picker won't contain this - // locality. - weight_ = 0; - // Start a timer to delete the locality. - Ref(DEBUG_LOCATION, "Locality+timer").release(); - GRPC_CLOSURE_INIT(&on_delayed_removal_timer_, OnDelayedRemovalTimer, this, - grpc_schedule_on_exec_ctx); - grpc_timer_init( - &delayed_removal_timer_, - ExecCtx::Get()->Now() + xds_policy()->locality_retention_interval_ms_, - &on_delayed_removal_timer_); - delayed_removal_timer_callback_pending_ = true; -} - -void XdsLb::LocalityMap::Locality::OnDelayedRemovalTimer(void* arg, - grpc_error* error) { - Locality* self = static_cast(arg); - self->xds_policy()->combiner()->Run( - GRPC_CLOSURE_INIT(&self->on_delayed_removal_timer_, - OnDelayedRemovalTimerLocked, self, nullptr), - GRPC_ERROR_REF(error)); -} - -void XdsLb::LocalityMap::Locality::OnDelayedRemovalTimerLocked( - void* arg, grpc_error* error) { - Locality* self = static_cast(arg); - self->delayed_removal_timer_callback_pending_ = false; - if (error == GRPC_ERROR_NONE && !self->shutdown_ && self->weight_ == 0) { - self->locality_map_->localities_.erase(self->name_); - } - self->Unref(DEBUG_LOCATION, "Locality+timer"); -} - -// -// XdsLb::LocalityMap::Locality::Helper -// - -RefCountedPtr -XdsLb::LocalityMap::Locality::Helper::CreateSubchannel( - const grpc_channel_args& args) { - if (locality_->xds_policy()->shutting_down_) return nullptr; - return locality_->xds_policy()->channel_control_helper()->CreateSubchannel( - args); -} - -void XdsLb::LocalityMap::Locality::Helper::UpdateState( - grpc_connectivity_state state, std::unique_ptr picker) { - if (locality_->xds_policy()->shutting_down_) return; - if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_xds_trace)) { - gpr_log(GPR_INFO, - "[xdslb %p helper %p] child policy handler %p reports state=%s", - locality_->xds_policy(), this, locality_->child_policy_.get(), - ConnectivityStateName(state)); - } - // Cache the state and picker in the locality. - locality_->connectivity_state_ = state; - locality_->picker_wrapper_ = - MakeRefCounted(std::move(picker)); - // Notify the locality map. - locality_->locality_map_->OnLocalityStateUpdateLocked(); -} - -void XdsLb::LocalityMap::Locality::Helper::AddTraceEvent(TraceSeverity severity, - StringView message) { - if (locality_->xds_policy()->shutting_down_) return; - locality_->xds_policy()->channel_control_helper()->AddTraceEvent(severity, - message); -} - -// -// factory -// - -class XdsFactory : public LoadBalancingPolicyFactory { - public: - OrphanablePtr CreateLoadBalancingPolicy( - LoadBalancingPolicy::Args args) const override { - return MakeOrphanable(std::move(args), &grpc_lb_xds_trace); - } - - const char* name() const override { return kXds; } - - RefCountedPtr ParseLoadBalancingConfig( - const Json& json, grpc_error** error) const override { - GPR_DEBUG_ASSERT(error != nullptr && *error == GRPC_ERROR_NONE); - if (json.type() == Json::Type::JSON_NULL) { - // xds was mentioned as a policy in the deprecated loadBalancingPolicy - // field or in the client API. - *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "field:loadBalancingPolicy error:xds policy requires configuration. " - "Please use loadBalancingConfig field of service config instead."); - return nullptr; - } - std::vector error_list; - // Child policy. - Json json_tmp; - const Json* child_policy_json; - auto it = json.object_value().find("childPolicy"); - if (it == json.object_value().end()) { - json_tmp = Json::Array{Json::Object{ - {"round_robin", Json::Object()}, - }}; - child_policy_json = &json_tmp; - } else { - child_policy_json = &it->second; - } - grpc_error* parse_error = GRPC_ERROR_NONE; - RefCountedPtr child_policy = - LoadBalancingPolicyRegistry::ParseLoadBalancingConfig( - *child_policy_json, &parse_error); - if (child_policy == nullptr) { - GPR_DEBUG_ASSERT(parse_error != GRPC_ERROR_NONE); - std::vector child_errors; - child_errors.push_back(parse_error); - error_list.push_back( - GRPC_ERROR_CREATE_FROM_VECTOR("field:childPolicy", &child_errors)); - } - // Fallback policy. - const Json* fallback_policy_json; - it = json.object_value().find("fallbackPolicy"); - if (it == json.object_value().end()) { - json_tmp = Json::Array{Json::Object{ - {"round_robin", Json::Object()}, - }}; - fallback_policy_json = &json_tmp; - } else { - fallback_policy_json = &it->second; - } - RefCountedPtr fallback_policy = - LoadBalancingPolicyRegistry::ParseLoadBalancingConfig( - *fallback_policy_json, &parse_error); - if (fallback_policy == nullptr) { - GPR_DEBUG_ASSERT(parse_error != GRPC_ERROR_NONE); - std::vector child_errors; - child_errors.push_back(parse_error); - error_list.push_back( - GRPC_ERROR_CREATE_FROM_VECTOR("field:fallbackPolicy", &child_errors)); - } - // EDS service name. - const char* eds_service_name = nullptr; - it = json.object_value().find("edsServiceName"); - if (it != json.object_value().end()) { - if (it->second.type() != Json::Type::STRING) { - error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "field:edsServiceName error:type should be string")); - } else { - eds_service_name = it->second.string_value().c_str(); - } - } - // LRS load reporting server name. - const char* lrs_load_reporting_server_name = nullptr; - it = json.object_value().find("lrsLoadReportingServerName"); - if (it != json.object_value().end()) { - if (it->second.type() != Json::Type::STRING) { - error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "field:lrsLoadReportingServerName error:type should be string")); - } else { - lrs_load_reporting_server_name = it->second.string_value().c_str(); - } - } - if (error_list.empty()) { - absl::optional optional_lrs_load_reporting_server_name; - if (lrs_load_reporting_server_name != nullptr) { - optional_lrs_load_reporting_server_name.emplace( - std::string(lrs_load_reporting_server_name)); - } - return MakeRefCounted( - std::move(child_policy), std::move(fallback_policy), - eds_service_name == nullptr ? "" : eds_service_name, - std::move(optional_lrs_load_reporting_server_name)); - } else { - *error = GRPC_ERROR_CREATE_FROM_VECTOR("Xds Parser", &error_list); - return nullptr; - } - } - - private: - class XdsChildHandler : public ChildPolicyHandler { - public: - XdsChildHandler(Args args, TraceFlag* tracer) - : ChildPolicyHandler(std::move(args), tracer) {} - - bool ConfigChangeRequiresNewPolicyInstance( - LoadBalancingPolicy::Config* old_config, - LoadBalancingPolicy::Config* new_config) const override { - GPR_ASSERT(old_config->name() == kXds); - GPR_ASSERT(new_config->name() == kXds); - XdsConfig* old_xds_config = static_cast(old_config); - XdsConfig* new_xds_config = static_cast(new_config); - const char* old_eds_service_name = - old_xds_config->eds_service_name() == nullptr - ? "" - : old_xds_config->eds_service_name(); - const char* new_eds_service_name = - new_xds_config->eds_service_name() == nullptr - ? "" - : new_xds_config->eds_service_name(); - return strcmp(old_eds_service_name, new_eds_service_name) != 0; - } - - OrphanablePtr CreateLoadBalancingPolicy( - const char* name, LoadBalancingPolicy::Args args) const override { - return MakeOrphanable(std::move(args)); - } - }; -}; - -} // namespace - -} // namespace grpc_core - -// -// Plugin registration -// - -void grpc_lb_policy_xds_init() { - grpc_core::LoadBalancingPolicyRegistry::Builder:: - RegisterLoadBalancingPolicyFactory( - absl::make_unique()); -} - -void grpc_lb_policy_xds_shutdown() {} diff --git a/src/core/ext/filters/client_channel/lb_policy/xds/xds.h b/src/core/ext/filters/client_channel/lb_policy/xds/xds.h index 13d3435da34..1de3472a3a0 100644 --- a/src/core/ext/filters/client_channel/lb_policy/xds/xds.h +++ b/src/core/ext/filters/client_channel/lb_policy/xds/xds.h @@ -29,5 +29,4 @@ #define GRPC_ARG_ADDRESS_IS_BACKEND_FROM_XDS_LOAD_BALANCER \ "grpc.address_is_backend_from_xds_load_balancer" -#endif /* GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_XDS_XDS_H \ - */ +#endif /* GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_XDS_XDS_H */ diff --git a/src/core/ext/filters/client_channel/lb_policy_registry.cc b/src/core/ext/filters/client_channel/lb_policy_registry.cc index 79e5f2f4926..498b158900e 100644 --- a/src/core/ext/filters/client_channel/lb_policy_registry.cc +++ b/src/core/ext/filters/client_channel/lb_policy_registry.cc @@ -35,6 +35,8 @@ class RegistryState { void RegisterLoadBalancingPolicyFactory( std::unique_ptr factory) { + gpr_log(GPR_DEBUG, "registering LB policy factory for \"%s\"", + factory->name()); for (size_t i = 0; i < factories_.size(); ++i) { GPR_ASSERT(strcmp(factories_[i]->name(), factory->name()) != 0); } diff --git a/src/core/ext/filters/client_channel/xds/xds_client_stats.h b/src/core/ext/filters/client_channel/xds/xds_client_stats.h index ab592ae6954..e0dd29d75ff 100644 --- a/src/core/ext/filters/client_channel/xds/xds_client_stats.h +++ b/src/core/ext/filters/client_channel/xds/xds_client_stats.h @@ -42,11 +42,7 @@ class XdsLocalityName : public RefCounted { struct Less { bool operator()(const XdsLocalityName* lhs, const XdsLocalityName* rhs) const { - int cmp_result = lhs->region_.compare(rhs->region_); - if (cmp_result != 0) return cmp_result < 0; - cmp_result = lhs->zone_.compare(rhs->zone_); - if (cmp_result != 0) return cmp_result < 0; - return lhs->sub_zone_.compare(rhs->sub_zone_) < 0; + return lhs->Compare(*rhs) < 0; } bool operator()(const RefCountedPtr& lhs, @@ -65,6 +61,18 @@ class XdsLocalityName : public RefCounted { sub_zone_ == other.sub_zone_; } + bool operator!=(const XdsLocalityName& other) const { + return !(*this == other); + } + + int Compare(const XdsLocalityName& other) const { + int cmp_result = region_.compare(other.region_); + if (cmp_result != 0) return cmp_result; + cmp_result = zone_.compare(other.zone_); + if (cmp_result != 0) return cmp_result; + return sub_zone_.compare(other.sub_zone_); + } + const std::string& region() const { return region_; } const std::string& zone() const { return zone_; } const std::string& sub_zone() const { return sub_zone_; } diff --git a/src/core/plugin_registry/grpc_plugin_registry.cc b/src/core/plugin_registry/grpc_plugin_registry.cc index 20ad526d837..b52c5be1719 100644 --- a/src/core/plugin_registry/grpc_plugin_registry.cc +++ b/src/core/plugin_registry/grpc_plugin_registry.cc @@ -36,8 +36,14 @@ void grpc_lb_policy_grpclb_init(void); void grpc_lb_policy_grpclb_shutdown(void); void grpc_lb_policy_cds_init(void); void grpc_lb_policy_cds_shutdown(void); -void grpc_lb_policy_xds_init(void); -void grpc_lb_policy_xds_shutdown(void); +void grpc_lb_policy_eds_init(void); +void grpc_lb_policy_eds_shutdown(void); +void grpc_lb_policy_lrs_init(void); +void grpc_lb_policy_lrs_shutdown(void); +void grpc_lb_policy_priority_init(void); +void grpc_lb_policy_priority_shutdown(void); +void grpc_lb_policy_weighted_target_init(void); +void grpc_lb_policy_weighted_target_shutdown(void); void grpc_lb_policy_pick_first_init(void); void grpc_lb_policy_pick_first_shutdown(void); void grpc_lb_policy_round_robin_init(void); @@ -78,8 +84,14 @@ void grpc_register_built_in_plugins(void) { grpc_lb_policy_grpclb_shutdown); grpc_register_plugin(grpc_lb_policy_cds_init, grpc_lb_policy_cds_shutdown); - grpc_register_plugin(grpc_lb_policy_xds_init, - grpc_lb_policy_xds_shutdown); + grpc_register_plugin(grpc_lb_policy_eds_init, + grpc_lb_policy_eds_shutdown); + grpc_register_plugin(grpc_lb_policy_lrs_init, + grpc_lb_policy_lrs_shutdown); + grpc_register_plugin(grpc_lb_policy_priority_init, + grpc_lb_policy_priority_shutdown); + grpc_register_plugin(grpc_lb_policy_weighted_target_init, + grpc_lb_policy_weighted_target_shutdown); grpc_register_plugin(grpc_lb_policy_pick_first_init, grpc_lb_policy_pick_first_shutdown); grpc_register_plugin(grpc_lb_policy_round_robin_init, diff --git a/src/core/plugin_registry/grpc_unsecure_plugin_registry.cc b/src/core/plugin_registry/grpc_unsecure_plugin_registry.cc index bfed2e22ddd..b1e442a07c0 100644 --- a/src/core/plugin_registry/grpc_unsecure_plugin_registry.cc +++ b/src/core/plugin_registry/grpc_unsecure_plugin_registry.cc @@ -44,8 +44,14 @@ void grpc_lb_policy_grpclb_init(void); void grpc_lb_policy_grpclb_shutdown(void); void grpc_lb_policy_cds_init(void); void grpc_lb_policy_cds_shutdown(void); -void grpc_lb_policy_xds_init(void); -void grpc_lb_policy_xds_shutdown(void); +void grpc_lb_policy_eds_init(void); +void grpc_lb_policy_eds_shutdown(void); +void grpc_lb_policy_lrs_init(void); +void grpc_lb_policy_lrs_shutdown(void); +void grpc_lb_policy_priority_init(void); +void grpc_lb_policy_priority_shutdown(void); +void grpc_lb_policy_weighted_target_init(void); +void grpc_lb_policy_weighted_target_shutdown(void); void grpc_lb_policy_pick_first_init(void); void grpc_lb_policy_pick_first_shutdown(void); void grpc_lb_policy_round_robin_init(void); @@ -86,8 +92,14 @@ void grpc_register_built_in_plugins(void) { grpc_lb_policy_grpclb_shutdown); grpc_register_plugin(grpc_lb_policy_cds_init, grpc_lb_policy_cds_shutdown); - grpc_register_plugin(grpc_lb_policy_xds_init, - grpc_lb_policy_xds_shutdown); + grpc_register_plugin(grpc_lb_policy_eds_init, + grpc_lb_policy_eds_shutdown); + grpc_register_plugin(grpc_lb_policy_lrs_init, + grpc_lb_policy_lrs_shutdown); + grpc_register_plugin(grpc_lb_policy_priority_init, + grpc_lb_policy_priority_shutdown); + grpc_register_plugin(grpc_lb_policy_weighted_target_init, + grpc_lb_policy_weighted_target_shutdown); grpc_register_plugin(grpc_lb_policy_pick_first_init, grpc_lb_policy_pick_first_shutdown); grpc_register_plugin(grpc_lb_policy_round_robin_init, diff --git a/src/python/grpcio/grpc_core_dependencies.py b/src/python/grpcio/grpc_core_dependencies.py index 46cce67f77e..6c2dfed4ae3 100644 --- a/src/python/grpcio/grpc_core_dependencies.py +++ b/src/python/grpcio/grpc_core_dependencies.py @@ -28,6 +28,7 @@ CORE_SOURCE_FILES = [ 'src/core/ext/filters/client_channel/http_connect_handshaker.cc', 'src/core/ext/filters/client_channel/http_proxy.cc', 'src/core/ext/filters/client_channel/lb_policy.cc', + 'src/core/ext/filters/client_channel/lb_policy/address_filtering.cc', 'src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc', 'src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc', 'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc', @@ -36,9 +37,12 @@ CORE_SOURCE_FILES = [ 'src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc', 'src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc', 'src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc', + 'src/core/ext/filters/client_channel/lb_policy/priority/priority.cc', 'src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc', + 'src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc', 'src/core/ext/filters/client_channel/lb_policy/xds/cds.cc', - 'src/core/ext/filters/client_channel/lb_policy/xds/xds.cc', + 'src/core/ext/filters/client_channel/lb_policy/xds/eds.cc', + 'src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc', 'src/core/ext/filters/client_channel/lb_policy_registry.cc', 'src/core/ext/filters/client_channel/local_subchannel_pool.cc', 'src/core/ext/filters/client_channel/parse_address.cc', diff --git a/test/core/client_channel/service_config_test.cc b/test/core/client_channel/service_config_test.cc index d659fbeb51d..5cdb51341ab 100644 --- a/test/core/client_channel/service_config_test.cc +++ b/test/core/client_channel/service_config_test.cc @@ -464,7 +464,7 @@ TEST_F(ClientChannelParserTest, ValidLoadBalancingConfigXds) { "{\n" " \"loadBalancingConfig\":[\n" " { \"does_not_exist\":{} },\n" - " { \"xds_experimental\":{ \"balancerName\": \"fake:///lb\" } }\n" + " { \"eds_experimental\":{ \"clusterName\": \"foo\" } }\n" " ]\n" "}"; grpc_error* error = GRPC_ERROR_NONE; @@ -474,7 +474,7 @@ TEST_F(ClientChannelParserTest, ValidLoadBalancingConfigXds) { static_cast( svc_cfg->GetGlobalParsedConfig(0)); auto lb_config = parsed_config->parsed_lb_config(); - EXPECT_STREQ(lb_config->name(), "xds_experimental"); + EXPECT_STREQ(lb_config->name(), "eds_experimental"); } TEST_F(ClientChannelParserTest, UnknownLoadBalancingConfig) { @@ -544,14 +544,14 @@ TEST_F(ClientChannelParserTest, UnknownLoadBalancingPolicy) { } TEST_F(ClientChannelParserTest, LoadBalancingPolicyXdsNotAllowed) { - const char* test_json = "{\"loadBalancingPolicy\":\"xds_experimental\"}"; + const char* test_json = "{\"loadBalancingPolicy\":\"eds_experimental\"}"; grpc_error* error = GRPC_ERROR_NONE; auto svc_cfg = ServiceConfig::Create(test_json, &error); std::regex regex( "Service config parsing error.*referenced_errors.*" "Global Params.*referenced_errors.*" "Client channel global parser.*referenced_errors.*" - "field:loadBalancingPolicy error:xds_experimental requires " + "field:loadBalancingPolicy error:eds_experimental requires " "a config. Please use loadBalancingConfig instead."); VerifyRegexMatch(error, regex); } diff --git a/test/cpp/end2end/xds_end2end_test.cc b/test/cpp/end2end/xds_end2end_test.cc index e84692d2812..2efbc38a364 100644 --- a/test/cpp/end2end/xds_end2end_test.cc +++ b/test/cpp/end2end/xds_end2end_test.cc @@ -1153,7 +1153,7 @@ class XdsEnd2endTest : public ::testing::TestWithParam { args.SetInt(GRPC_ARG_XDS_FALLBACK_TIMEOUT_MS, fallback_timeout); } if (failover_timeout > 0) { - args.SetInt(GRPC_ARG_XDS_FAILOVER_TIMEOUT_MS, failover_timeout); + args.SetInt(GRPC_ARG_PRIORITY_FAILOVER_TIMEOUT_MS, failover_timeout); } if (xds_resource_does_not_exist_timeout > 0) { args.SetInt(GRPC_ARG_XDS_RESOURCE_DOES_NOT_EXIST_TIMEOUT_MS, @@ -1285,7 +1285,8 @@ class XdsEnd2endTest : public ::testing::TestWithParam { : kDefaultServiceConfigWithoutLoadReporting_; result.service_config = grpc_core::ServiceConfig::Create(service_config_json, &error); - GRPC_ERROR_UNREF(error); + ASSERT_NE(result.service_config.get(), nullptr); + ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error); grpc_arg arg = grpc_core::FakeResolverResponseGenerator::MakeChannelArg( lb_channel_response_generator == nullptr ? lb_channel_response_generator_.get() @@ -1317,7 +1318,8 @@ class XdsEnd2endTest : public ::testing::TestWithParam { grpc_error* error = GRPC_ERROR_NONE; result.service_config = grpc_core::ServiceConfig::Create(service_config_json, &error); - GRPC_ERROR_UNREF(error); + ASSERT_NE(result.service_config.get(), nullptr); + ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error); } if (lb_channel_response_generator == nullptr) { lb_channel_response_generator = lb_channel_response_generator_.get(); diff --git a/tools/doxygen/Doxyfile.c++.internal b/tools/doxygen/Doxyfile.c++.internal index edbe236dc17..60e99d7b5a0 100644 --- a/tools/doxygen/Doxyfile.c++.internal +++ b/tools/doxygen/Doxyfile.c++.internal @@ -1091,6 +1091,8 @@ src/core/ext/filters/client_channel/http_proxy.cc \ src/core/ext/filters/client_channel/http_proxy.h \ src/core/ext/filters/client_channel/lb_policy.cc \ src/core/ext/filters/client_channel/lb_policy.h \ +src/core/ext/filters/client_channel/lb_policy/address_filtering.cc \ +src/core/ext/filters/client_channel/lb_policy/address_filtering.h \ src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc \ src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h \ src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc \ @@ -1106,10 +1108,13 @@ src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h \ src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc \ src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h \ src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc \ +src/core/ext/filters/client_channel/lb_policy/priority/priority.cc \ src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc \ src/core/ext/filters/client_channel/lb_policy/subchannel_list.h \ +src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc \ src/core/ext/filters/client_channel/lb_policy/xds/cds.cc \ -src/core/ext/filters/client_channel/lb_policy/xds/xds.cc \ +src/core/ext/filters/client_channel/lb_policy/xds/eds.cc \ +src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc \ src/core/ext/filters/client_channel/lb_policy/xds/xds.h \ src/core/ext/filters/client_channel/lb_policy_factory.h \ src/core/ext/filters/client_channel/lb_policy_registry.cc \ diff --git a/tools/doxygen/Doxyfile.core.internal b/tools/doxygen/Doxyfile.core.internal index 5c03ac61231..fef1fd11d4a 100644 --- a/tools/doxygen/Doxyfile.core.internal +++ b/tools/doxygen/Doxyfile.core.internal @@ -888,6 +888,8 @@ src/core/ext/filters/client_channel/http_proxy.cc \ src/core/ext/filters/client_channel/http_proxy.h \ src/core/ext/filters/client_channel/lb_policy.cc \ src/core/ext/filters/client_channel/lb_policy.h \ +src/core/ext/filters/client_channel/lb_policy/address_filtering.cc \ +src/core/ext/filters/client_channel/lb_policy/address_filtering.h \ src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc \ src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h \ src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc \ @@ -903,10 +905,13 @@ src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h \ src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc \ src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h \ src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc \ +src/core/ext/filters/client_channel/lb_policy/priority/priority.cc \ src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc \ src/core/ext/filters/client_channel/lb_policy/subchannel_list.h \ +src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc \ src/core/ext/filters/client_channel/lb_policy/xds/cds.cc \ -src/core/ext/filters/client_channel/lb_policy/xds/xds.cc \ +src/core/ext/filters/client_channel/lb_policy/xds/eds.cc \ +src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc \ src/core/ext/filters/client_channel/lb_policy/xds/xds.h \ src/core/ext/filters/client_channel/lb_policy_factory.h \ src/core/ext/filters/client_channel/lb_policy_registry.cc \ diff --git a/tools/internal_ci/linux/grpc_xds_bazel_python_test_in_docker.sh b/tools/internal_ci/linux/grpc_xds_bazel_python_test_in_docker.sh index 6ed8856bf0d..a9a74eef377 100755 --- a/tools/internal_ci/linux/grpc_xds_bazel_python_test_in_docker.sh +++ b/tools/internal_ci/linux/grpc_xds_bazel_python_test_in_docker.sh @@ -48,7 +48,7 @@ touch "$TOOLS_DIR"/src/proto/grpc/testing/__init__.py bazel build //src/python/grpcio_tests/tests_py3_only/interop:xds_interop_client -GRPC_VERBOSITY=debug GRPC_TRACE=xds_client,xds_resolver,cds_lb,xds_lb "$PYTHON" \ +GRPC_VERBOSITY=debug GRPC_TRACE=xds_client,xds_resolver,cds_lb,eds_lb,priority_lb,weighted_target_lb,lrs_lb "$PYTHON" \ tools/run_tests/run_xds_tests.py \ --test_case=all \ --project_id=grpc-testing \ diff --git a/tools/internal_ci/linux/grpc_xds_bazel_test_in_docker.sh b/tools/internal_ci/linux/grpc_xds_bazel_test_in_docker.sh index d0a1338817b..943ba2b1981 100755 --- a/tools/internal_ci/linux/grpc_xds_bazel_test_in_docker.sh +++ b/tools/internal_ci/linux/grpc_xds_bazel_test_in_docker.sh @@ -48,7 +48,7 @@ touch "$TOOLS_DIR"/src/proto/grpc/testing/__init__.py bazel build test/cpp/interop:xds_interop_client -GRPC_VERBOSITY=debug GRPC_TRACE=xds_client,xds_resolver,cds_lb,xds_lb "$PYTHON" \ +GRPC_VERBOSITY=debug GRPC_TRACE=xds_client,xds_resolver,cds_lb,eds_lb,priority_lb,weighted_target_lb,lrs_lb "$PYTHON" \ tools/run_tests/run_xds_tests.py \ --test_case=all \ --project_id=grpc-testing \ From 1c1321ddea3fe5f2357872654d48ea4d1f1af54e Mon Sep 17 00:00:00 2001 From: Richard Belleville Date: Tue, 7 Apr 2020 16:10:20 -0700 Subject: [PATCH 394/758] Indentation --- tools/run_tests/helper_scripts/build_python.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/run_tests/helper_scripts/build_python.sh b/tools/run_tests/helper_scripts/build_python.sh index cfcb151bcce..e79a8896092 100755 --- a/tools/run_tests/helper_scripts/build_python.sh +++ b/tools/run_tests/helper_scripts/build_python.sh @@ -224,8 +224,8 @@ pip_install_dir "$ROOT/src/python/grpcio_testing" # Build/install tests pip_install coverage==4.4 oauth2client==4.1.0 \ - google-auth==1.0.0 requests==2.14.2 \ - googleapis-common-protos==1.5.5 + google-auth==1.0.0 requests==2.14.2 \ + googleapis-common-protos==1.5.5 $VENV_PYTHON "$ROOT/src/python/grpcio_tests/setup.py" preprocess $VENV_PYTHON "$ROOT/src/python/grpcio_tests/setup.py" build_package_protos pip_install_dir "$ROOT/src/python/grpcio_tests" From bc831fec51a1e669b48627f9ce1276a6af93a7ca Mon Sep 17 00:00:00 2001 From: Eric Gribkoff Date: Wed, 1 Apr 2020 16:54:43 -0700 Subject: [PATCH 395/758] Use grpcHealthCheck and targetGrpcProxy --- tools/run_tests/run_xds_tests.py | 118 +++++++++++++++++-------------- 1 file changed, 66 insertions(+), 52 deletions(-) diff --git a/tools/run_tests/run_xds_tests.py b/tools/run_tests/run_xds_tests.py index 3e165da4f1d..016eed9a115 100755 --- a/tools/run_tests/run_xds_tests.py +++ b/tools/run_tests/run_xds_tests.py @@ -122,6 +122,13 @@ argp.add_argument( help= 'If provided, uses this file instead of retrieving via the GCP discovery ' 'API') +argp.add_argument( + '--alpha_compute_discovery_document', + default=None, + type=str, + help= + 'If provided, uses this file instead of retrieving via the alpha GCP ' + 'discovery API') argp.add_argument('--network', default='global/networks/default', help='GCP network to use') @@ -577,14 +584,14 @@ def add_instance_group(gcp, zone, name, size): def create_health_check(gcp, name): config = { 'name': name, - 'type': 'TCP', - 'tcpHealthCheck': { - 'portName': 'grpc' + 'type': 'GRPC', + 'grpcHealthCheck': { + 'portSpecification': 'USE_SERVING_PORT' } } logger.debug('Sending GCP request with body=%s', config) - result = gcp.compute.healthChecks().insert(project=gcp.project, - body=config).execute() + result = gcp.alpha_compute.healthChecks().insert(project=gcp.project, + body=config).execute() wait_for_global_operation(gcp, result['name']) gcp.health_check = GcpResource(config['name'], result['targetLink']) @@ -613,11 +620,11 @@ def add_backend_service(gcp, name): 'loadBalancingScheme': 'INTERNAL_SELF_MANAGED', 'healthChecks': [gcp.health_check.url], 'portName': 'grpc', - 'protocol': 'HTTP2' + 'protocol': 'GRPC' } logger.debug('Sending GCP request with body=%s', config) - result = gcp.compute.backendServices().insert(project=gcp.project, - body=config).execute() + result = gcp.alpha_compute.backendServices().insert(project=gcp.project, + body=config).execute() wait_for_global_operation(gcp, result['name']) backend_service = GcpResource(config['name'], result['targetLink']) gcp.backend_services.append(backend_service) @@ -644,33 +651,45 @@ def create_url_map(gcp, name, backend_service, host_name): gcp.url_map = GcpResource(config['name'], result['targetLink']) -def create_target_http_proxy(gcp, name): +def create_target_grpc_proxy(gcp, name): config = { 'name': name, 'url_map': gcp.url_map.url, + # TODO(ericgribkoff) This requires forwarding rule's ip=0.0.0.0 + # 'validate_for_proxyless': True, } logger.debug('Sending GCP request with body=%s', config) - result = gcp.compute.targetHttpProxies().insert(project=gcp.project, - body=config).execute() + result = gcp.alpha_compute.targetGrpcProxies().insert( + project=gcp.project, body=config).execute() wait_for_global_operation(gcp, result['name']) - gcp.target_http_proxy = GcpResource(config['name'], result['targetLink']) - - -def create_global_forwarding_rule(gcp, name, ip, port): - config = { - 'name': name, - 'loadBalancingScheme': 'INTERNAL_SELF_MANAGED', - 'portRange': str(port), - 'IPAddress': ip, - 'network': args.network, - 'target': gcp.target_http_proxy.url, - } - logger.debug('Sending GCP request with body=%s', config) - result = gcp.compute.globalForwardingRules().insert(project=gcp.project, - body=config).execute() - wait_for_global_operation(gcp, result['name']) - gcp.global_forwarding_rule = GcpResource(config['name'], - result['targetLink']) + gcp.target_grpc_proxy = GcpResource(config['name'], result['targetLink']) + + +def create_global_forwarding_rule(gcp, name, potential_ips, potential_ports): + for port in potential_ports: + for ip in potential_ips: + try: + config = { + 'name': name, + 'loadBalancingScheme': 'INTERNAL_SELF_MANAGED', + 'portRange': str(port), + 'IPAddress': ip, + 'network': args.network, + 'target': gcp.target_grpc_proxy.url, + } + logger.debug('Sending GCP request with body=%s', config) + result = gcp.alpha_compute.globalForwardingRules().insert( + project=gcp.project, body=config).execute() + wait_for_global_operation(gcp, result['name']) + gcp.global_forwarding_rule = GcpResource( + config['name'], result['targetLink']) + gcp.service_port = port + return + except googleapiclient.errors.HttpError as http_error: + logger.warning( + 'Got error %s when attempting to create forwarding rule to ' + '%s:%d. Retrying with another ip:port.' % + (http_error, ip, port)) def delete_global_forwarding_rule(gcp): @@ -683,11 +702,11 @@ def delete_global_forwarding_rule(gcp): logger.info('Delete failed: %s', http_error) -def delete_target_http_proxy(gcp): +def delete_target_grpc_proxy(gcp): try: - result = gcp.compute.targetHttpProxies().delete( + result = gcp.alpha_compute.targetGrpcProxies().delete( project=gcp.project, - targetHttpProxy=gcp.target_http_proxy.name).execute() + targetGrpcProxy=gcp.target_grpc_proxy.name).execute() wait_for_global_operation(gcp, result['name']) except googleapiclient.errors.HttpError as http_error: logger.info('Delete failed: %s', http_error) @@ -769,7 +788,7 @@ def patch_backend_instances(gcp, } for instance_group in instance_groups], } logger.debug('Sending GCP request with body=%s', config) - result = gcp.compute.backendServices().patch( + result = gcp.alpha_compute.backendServices().patch( project=gcp.project, backendService=backend_service.name, body=config).execute() wait_for_global_operation(gcp, result['name']) @@ -910,8 +929,8 @@ def start_xds_client(cmd): def clean_up(gcp): if gcp.global_forwarding_rule: delete_global_forwarding_rule(gcp) - if gcp.target_http_proxy: - delete_target_http_proxy(gcp) + if gcp.target_grpc_proxy: + delete_target_grpc_proxy(gcp) if gcp.url_map: delete_url_map(gcp) delete_backend_services(gcp) @@ -941,14 +960,15 @@ class GcpResource(object): class GcpState(object): - def __init__(self, compute, project): + def __init__(self, compute, alpha_compute, project): self.compute = compute + self.alpha_compute = alpha_compute self.project = project self.health_check = None self.health_check_firewall_rule = None self.backend_services = [] self.url_map = None - self.target_http_proxy = None + self.target_grpc_proxy = None self.global_forwarding_rule = None self.service_port = None self.instance_template = None @@ -959,18 +979,22 @@ if args.compute_discovery_document: with open(args.compute_discovery_document, 'r') as discovery_doc: compute = googleapiclient.discovery.build_from_document( discovery_doc.read()) + with open(args.alpha_compute_discovery_document, 'r') as discovery_doc: + alpha_compute = googleapiclient.discovery.build_from_document( + discovery_doc.read()) else: compute = googleapiclient.discovery.build('compute', 'v1') + alpha_compute = googleapiclient.discovery.build('compute', 'alpha') try: - gcp = GcpState(compute, args.project_id) + gcp = GcpState(compute, alpha_compute, args.project_id) health_check_name = _BASE_HEALTH_CHECK_NAME + args.gcp_suffix firewall_name = _BASE_FIREWALL_RULE_NAME + args.gcp_suffix backend_service_name = _BASE_BACKEND_SERVICE_NAME + args.gcp_suffix alternate_backend_service_name = _BASE_BACKEND_SERVICE_NAME + '-alternate' + args.gcp_suffix url_map_name = _BASE_URL_MAP_NAME + args.gcp_suffix service_host_name = _BASE_SERVICE_HOST + args.gcp_suffix - target_http_proxy_name = _BASE_TARGET_PROXY_NAME + args.gcp_suffix + target_grpc_proxy_name = _BASE_TARGET_PROXY_NAME + args.gcp_suffix forwarding_rule_name = _BASE_FORWARDING_RULE_NAME + args.gcp_suffix template_name = _BASE_TEMPLATE_NAME + args.gcp_suffix instance_group_name = _BASE_INSTANCE_GROUP_NAME + args.gcp_suffix @@ -984,7 +1008,7 @@ try: alternate_backend_service = add_backend_service( gcp, alternate_backend_service_name) create_url_map(gcp, url_map_name, backend_service, service_host_name) - create_target_http_proxy(gcp, target_http_proxy_name) + create_target_grpc_proxy(gcp, target_grpc_proxy_name) potential_service_ports = list(args.service_port_range) random.shuffle(potential_service_ports) if args.forwarding_rule_ip_prefix == '': @@ -994,18 +1018,8 @@ try: args.forwarding_rule_ip_prefix + str(x) for x in range(256) ] random.shuffle(potential_ips) - for port in potential_service_ports: - for ip in potential_ips: - try: - create_global_forwarding_rule(gcp, forwarding_rule_name, ip, - port) - gcp.service_port = port - break - except googleapiclient.errors.HttpError as http_error: - logger.warning( - 'Got error %s when attempting to create forwarding rule to ' - '%s:%d. Retrying with another ip:port.' % - (http_error, ip, port)) + create_global_forwarding_rule(gcp, forwarding_rule_name, potential_ips, + potential_service_ports) if not gcp.service_port: raise Exception( 'Failed to find a valid ip:port for the forwarding rule') From d9c6b001c00fb715258328702c855a0fc362ce51 Mon Sep 17 00:00:00 2001 From: Eric Gribkoff Date: Thu, 2 Apr 2020 15:30:44 -0700 Subject: [PATCH 396/758] Use validate-for-proxyless --- tools/run_tests/run_xds_tests.py | 98 ++++++++++++++------------------ 1 file changed, 42 insertions(+), 56 deletions(-) diff --git a/tools/run_tests/run_xds_tests.py b/tools/run_tests/run_xds_tests.py index 016eed9a115..3dc66ab7424 100755 --- a/tools/run_tests/run_xds_tests.py +++ b/tools/run_tests/run_xds_tests.py @@ -126,23 +126,18 @@ argp.add_argument( '--alpha_compute_discovery_document', default=None, type=str, - help= - 'If provided, uses this file instead of retrieving via the alpha GCP ' + help='If provided, uses this file instead of retrieving via the alpha GCP ' 'discovery API') argp.add_argument('--network', default='global/networks/default', help='GCP network to use') argp.add_argument('--service_port_range', - default='80', + default='8080:8110', type=parse_port_range, help='Listening port for created gRPC backends. Specified as ' 'either a single int or as a range in the format min:max, in ' 'which case an available port p will be chosen s.t. min <= p ' '<= max') -argp.add_argument('--forwarding_rule_ip_prefix', - default='172.16.0.', - help='If set, an available IP with this prefix followed by ' - '0-255 will be used for the generated forwarding rule.') argp.add_argument( '--stats_port', default=8079, @@ -651,12 +646,25 @@ def create_url_map(gcp, name, backend_service, host_name): gcp.url_map = GcpResource(config['name'], result['targetLink']) +def patch_url_map_host_rule(gcp, name, backend_service, host_name): + config = { + 'hostRules': [{ + 'hosts': ['%s:%d' % (host_name, gcp.service_port)], + 'pathMatcher': _PATH_MATCHER_NAME + }] + } + logger.debug('Sending GCP request with body=%s', config) + result = gcp.compute.urlMaps().patch(project=gcp.project, + urlMap=name, + body=config).execute() + wait_for_global_operation(gcp, result['name']) + + def create_target_grpc_proxy(gcp, name): config = { 'name': name, 'url_map': gcp.url_map.url, - # TODO(ericgribkoff) This requires forwarding rule's ip=0.0.0.0 - # 'validate_for_proxyless': True, + 'validate_for_proxyless': True, } logger.debug('Sending GCP request with body=%s', config) result = gcp.alpha_compute.targetGrpcProxies().insert( @@ -665,31 +673,29 @@ def create_target_grpc_proxy(gcp, name): gcp.target_grpc_proxy = GcpResource(config['name'], result['targetLink']) -def create_global_forwarding_rule(gcp, name, potential_ips, potential_ports): +def create_global_forwarding_rule(gcp, name, potential_ports): for port in potential_ports: - for ip in potential_ips: - try: - config = { - 'name': name, - 'loadBalancingScheme': 'INTERNAL_SELF_MANAGED', - 'portRange': str(port), - 'IPAddress': ip, - 'network': args.network, - 'target': gcp.target_grpc_proxy.url, - } - logger.debug('Sending GCP request with body=%s', config) - result = gcp.alpha_compute.globalForwardingRules().insert( - project=gcp.project, body=config).execute() - wait_for_global_operation(gcp, result['name']) - gcp.global_forwarding_rule = GcpResource( - config['name'], result['targetLink']) - gcp.service_port = port - return - except googleapiclient.errors.HttpError as http_error: - logger.warning( - 'Got error %s when attempting to create forwarding rule to ' - '%s:%d. Retrying with another ip:port.' % - (http_error, ip, port)) + try: + config = { + 'name': name, + 'loadBalancingScheme': 'INTERNAL_SELF_MANAGED', + 'portRange': str(port), + 'IPAddress': '0.0.0.0', + 'network': args.network, + 'target': gcp.target_grpc_proxy.url, + } + logger.debug('Sending GCP request with body=%s', config) + result = gcp.alpha_compute.globalForwardingRules().insert( + project=gcp.project, body=config).execute() + wait_for_global_operation(gcp, result['name']) + gcp.global_forwarding_rule = GcpResource(config['name'], + result['targetLink']) + gcp.service_port = port + return + except googleapiclient.errors.HttpError as http_error: + logger.warning( + 'Got error %s when attempting to create forwarding rule to ' + '0.0.0.0:%d. Retrying with another port.' % (http_error, port)) def delete_global_forwarding_rule(gcp): @@ -911,21 +917,6 @@ def get_instance_names(gcp, instance_group): return instance_names -def start_xds_client(cmd): - bootstrap_path = None - with tempfile.NamedTemporaryFile(delete=False) as bootstrap_file: - bootstrap_file.write( - _BOOTSTRAP_TEMPLATE.format( - node_id=socket.gethostname()).encode('utf-8')) - bootstrap_path = bootstrap_file.name - - client_process = subprocess.Popen(shlex.split(cmd), - env=dict( - os.environ, - GRPC_XDS_BOOTSTRAP=bootstrap_path)) - return client_process - - def clean_up(gcp): if gcp.global_forwarding_rule: delete_global_forwarding_rule(gcp) @@ -1011,18 +1002,13 @@ try: create_target_grpc_proxy(gcp, target_grpc_proxy_name) potential_service_ports = list(args.service_port_range) random.shuffle(potential_service_ports) - if args.forwarding_rule_ip_prefix == '': - potential_ips = ['0.0.0.0'] - else: - potential_ips = [ - args.forwarding_rule_ip_prefix + str(x) for x in range(256) - ] - random.shuffle(potential_ips) - create_global_forwarding_rule(gcp, forwarding_rule_name, potential_ips, + create_global_forwarding_rule(gcp, forwarding_rule_name, potential_service_ports) if not gcp.service_port: raise Exception( 'Failed to find a valid ip:port for the forwarding rule') + patch_url_map_host_rule(gcp, url_map_name, backend_service, + service_host_name) startup_script = get_startup_script(args.path_to_server_binary, gcp.service_port) create_instance_template(gcp, template_name, args.network, From 652ab6c49797639714b20d5c9326ec9ce7d15f27 Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Tue, 7 Apr 2020 19:41:33 -0700 Subject: [PATCH 397/758] Clamp the max recv flow control window to 2^31 - 1 --- src/core/ext/transport/chttp2/transport/flow_control.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/core/ext/transport/chttp2/transport/flow_control.cc b/src/core/ext/transport/chttp2/transport/flow_control.cc index d53475a1b61..babe564d39d 100644 --- a/src/core/ext/transport/chttp2/transport/flow_control.cc +++ b/src/core/ext/transport/chttp2/transport/flow_control.cc @@ -284,8 +284,8 @@ void StreamFlowControl::IncomingByteStreamUpdate(size_t max_size_hint, [GRPC_CHTTP2_SETTINGS_INITIAL_WINDOW_SIZE]; /* clamp max recv hint to an allowable size */ - if (max_size_hint >= UINT32_MAX - sent_init_window) { - max_recv_bytes = UINT32_MAX - sent_init_window; + if (max_size_hint >= kMaxWindowUpdateSize - sent_init_window) { + max_recv_bytes = kMaxWindowUpdateSize - sent_init_window; } else { max_recv_bytes = static_cast(max_size_hint); } @@ -298,7 +298,7 @@ void StreamFlowControl::IncomingByteStreamUpdate(size_t max_size_hint, } /* add some small lookahead to keep pipelines flowing */ - GPR_ASSERT(max_recv_bytes <= UINT32_MAX - sent_init_window); + GPR_DEBUG_ASSERT(max_recv_bytes <= kMaxWindowUpdateSize - sent_init_window); if (local_window_delta_ < max_recv_bytes) { uint32_t add_max_recv_bytes = static_cast(max_recv_bytes - local_window_delta_); From 0c2f9565f421816a81472065e649ef398f9fda86 Mon Sep 17 00:00:00 2001 From: Donna Dionne Date: Tue, 7 Apr 2020 22:08:54 -0700 Subject: [PATCH 398/758] Fixing code review comments --- .../lb_policy/xds/xds_routing.cc | 198 +++++++++--------- .../ext/filters/client_channel/xds/xds_api.cc | 6 + .../filters/client_channel/xds/xds_client.cc | 65 +++--- test/cpp/end2end/xds_end2end_test.cc | 16 +- 4 files changed, 153 insertions(+), 132 deletions(-) diff --git a/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc b/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc index 53e6b26767a..7098b9ae9db 100644 --- a/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc +++ b/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc @@ -228,8 +228,8 @@ XdsRoutingLb::PickResult XdsRoutingLb::RoutePicker::Pick(PickArgs args) { for (const Route& route : route_table_) { if ((path_elements[0] == route.matcher.service && (path_elements[1] == route.matcher.method || - "" == route.matcher.method)) || - ("" == route.matcher.service && "" == route.matcher.method)) { + route.matcher.method.empty())) || + (route.matcher.service.empty() && route.matcher.method.empty())) { return route.picker.get()->Pick(args); } } @@ -237,8 +237,7 @@ XdsRoutingLb::PickResult XdsRoutingLb::RoutePicker::Pick(PickArgs args) { result.type = PickResult::PICK_FAILED; result.error = grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "xds routing picker not given any picker; default " - "route not configured"), + "xds routing picker: no matching route"), GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE); return result; } @@ -302,7 +301,7 @@ void XdsRoutingLb::UpdateLocked(UpdateArgs args) { // Add or update the actions in the new config. for (const auto& p : config_->action_map()) { const std::string& name = p.first; - RefCountedPtr config = p.second; + const RefCountedPtr& config = p.second; auto it = actions_.find(name); if (it == actions_.end()) { it = actions_.emplace(std::make_pair(name, nullptr)).first; @@ -367,21 +366,20 @@ void XdsRoutingLb::UpdateStateLocked() { switch (connectivity_state) { case GRPC_CHANNEL_READY: { RoutePicker::RouteTable route_table; - for (int i = 0; i < config_->route_table().size(); ++i) { + for (const auto& config_route : config_->route_table()) { RoutePicker::Route route; - route.matcher = config_->route_table()[i].matcher; - auto it = actions_.find(config_->route_table()[i].action); - if (it != actions_.end()) { - route.picker = it->second->picker_wrapper(); - } else { - gpr_log(GPR_INFO, - "[xds_routing_lb %p] child policy may have mis-behaved and " - "did not return a picker, creating a QueuePicker for %s", - this, config_->route_table()[i].action.c_str()); + route.matcher = config_route.matcher; + route.picker = actions_[config_route.action]->picker_wrapper(); + if (route.picker == nullptr) { + if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_routing_lb_trace)) { + gpr_log(GPR_INFO, + "[xds_routing_lb %p] child %s has not yet returned a " + "picker; creating a QueuePicker.", + this, config_route.action.c_str()); + } route.picker = MakeRefCounted( - config_->route_table()[i].action, - absl::make_unique( - Ref(DEBUG_LOCATION, "QueuePicker"))); + config_route.action, absl::make_unique( + Ref(DEBUG_LOCATION, "QueuePicker"))); } route_table.push_back(std::move(route)); } @@ -625,7 +623,7 @@ class XdsRoutingLbFactory : public LoadBalancingPolicyFactory { std::vector error_list; // action map. XdsRoutingLbConfig::ActionMap action_map; - std::set action_in_use_set; + std::set action_in_use; auto it = json.object_value().find("actions"); if (it == json.object_value().end()) { error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( @@ -649,6 +647,7 @@ class XdsRoutingLbFactory : public LoadBalancingPolicyFactory { error_list.push_back(error); } else { action_map[p.first] = std::move(child_config); + action_in_use.insert(p.first); } } } @@ -667,63 +666,26 @@ class XdsRoutingLbFactory : public LoadBalancingPolicyFactory { } else { const Json::Array& array = it->second.array_value(); for (size_t i = 0; i < array.size(); ++i) { - const Json& element = array[i]; - if (element.type() != Json::Type::OBJECT) { - error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( - absl::StrCat("filed: routes element: ", i, - " should be of type object") - .c_str())); - } else { - XdsRoutingLbConfig::Route route; - // Parse MethodName. - auto it = element.object_value().find("methodName"); - if (it == json.object_value().end()) { - error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( - absl::StrCat("field:routes element: ", i, - " methodName is required") - .c_str())); - } else if (it->second.type() != Json::Type::OBJECT) { - error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( - absl::StrCat("field:routes element: ", i, - " methodName type should be object") - .c_str())); - } else { - std::vector route_errors = - ParseRouteConfig(it->second, &route.matcher); - if (!route_errors.empty()) { - grpc_error* error = GRPC_ERROR_CREATE_FROM_COPIED_STRING( - absl::StrCat("field:routes element: ", i, " error").c_str()); - for (grpc_error* route_error : route_errors) { - error = grpc_error_add_child(error, route_error); - } - error_list.push_back(error); - } - } - // Parse action. - it = element.object_value().find("action"); - if (it == json.object_value().end()) { - error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( - absl::StrCat("field:routes element: ", i, " action is required") - .c_str())); - } else if (it->second.type() != Json::Type::STRING) { - error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( - absl::StrCat("field:routes element: ", i, - " action type should be string") - .c_str())); - } else { - route.action = it->second.string_value(); - } - // Validate action exists and mark it as used. - if (action_map.find(route.action) == action_map.end()) { - grpc_error* error = GRPC_ERROR_CREATE_FROM_STATIC_STRING( - absl::StrCat("action ", route.action, " does not exist") - .c_str()); - error_list.push_back(error); - } else { - action_in_use_set.insert(route.action); + XdsRoutingLbConfig::Route route; + std::vector route_errors = ParseRoute(array[i], &route); + if (!route_errors.empty()) { + grpc_error* error = GRPC_ERROR_CREATE_FROM_COPIED_STRING( + absl::StrCat("field:routes element: ", i, " error").c_str()); + for (grpc_error* route_error : route_errors) { + error = grpc_error_add_child(error, route_error); } - route_table.emplace_back(std::move(route)); + error_list.push_back(error); + } + // Validate action exists and mark it as used. + if (action_map.find(route.action) == action_map.end()) { + grpc_error* error = GRPC_ERROR_CREATE_FROM_STATIC_STRING( + absl::StrCat("field: routes element: ", i, " error: action ", + route.action, " does not exist") + .c_str()); + error_list.push_back(error); } + action_in_use.erase(route.action); + route_table.emplace_back(std::move(route)); } } if (route_table.size() == 0) { @@ -731,11 +693,15 @@ class XdsRoutingLbFactory : public LoadBalancingPolicyFactory { GRPC_ERROR_CREATE_FROM_STATIC_STRING("no valid routes configured"); error_list.push_back(error); } - for (const auto& action : action_map) { - if (action_in_use_set.find(action.first) == action_in_use_set.end()) { - error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( - absl::StrCat("action ", action.first, " is never used").c_str())); - } + if (!(route_table[route_table.size() - 1].matcher.service.empty() && + route_table[route_table.size() - 1].matcher.method.empty())) { + grpc_error* error = GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "default route must not contain service or method"); + error_list.push_back(error); + } + if (!action_in_use.empty()) { + error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "some actions were not referenced by any route")); } if (!error_list.empty()) { *error = GRPC_ERROR_CREATE_FROM_VECTOR( @@ -775,35 +741,77 @@ class XdsRoutingLbFactory : public LoadBalancingPolicyFactory { return error_list; } - static std::vector ParseRouteConfig( + static std::vector ParseMethodName( const Json& json, XdsRoutingLbConfig::Matcher* route_config) { std::vector error_list; + if (json.type() != Json::Type::OBJECT) { + error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "field:methodName should be of type object")); + return error_list; + } // Parse service auto it = json.object_value().find("service"); - if (it == json.object_value().end()) { + if (it != json.object_value().end()) { + if (it->second.type() != Json::Type::STRING) { + error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "field:service error: should be string")); + } else { + route_config->service = it->second.string_value(); + } + } + // Parse method + it = json.object_value().find("method"); + if (it != json.object_value().end()) { + if (it->second.type() != Json::Type::STRING) { + error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "field:method error: should be string")); + } else { + route_config->method = it->second.string_value(); + } + } + if (route_config->service.empty() && !route_config->method.empty()) { error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "field:service error: required field not present")); - } else if (it->second.type() != Json::Type::STRING) { + "field:methodName error: service is empty when method is " + "not")); + } + return error_list; + } + + static std::vector ParseRoute(const Json& json, + XdsRoutingLbConfig::Route* route) { + std::vector error_list; + if (json.type() != Json::Type::OBJECT) { error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "field:service error: should be string")); + "field:route element should be of type object")); + return error_list; + } + // Parse MethodName. + auto it = json.object_value().find("methodName"); + if (it == json.object_value().end()) { + error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "field:routes element: methodName is required")); } else { - route_config->service = it->second.string_value(); + std::vector route_errors = + ParseMethodName(it->second, &route->matcher); + if (!route_errors.empty()) { + grpc_error* error = + GRPC_ERROR_CREATE_FROM_COPIED_STRING("field:route element error"); + for (grpc_error* route_error : route_errors) { + error = grpc_error_add_child(error, route_error); + } + error_list.push_back(error); + } } - // Parse method - it = json.object_value().find("method"); + // Parse action. + it = json.object_value().find("action"); if (it == json.object_value().end()) { error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "field:method error: required field not present")); + "field:route element: action is required")); } else if (it->second.type() != Json::Type::STRING) { error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "field:method error: should be string")); + "field:route element error action should be of type string")); } else { - route_config->method = it->second.string_value(); - } - if (route_config->service == "" && route_config->method != "") { - error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "field:methodName error: service is empty when method is " - "not")); + route->action = it->second.string_value(); } return error_list; } diff --git a/src/core/ext/filters/client_channel/xds/xds_api.cc b/src/core/ext/filters/client_channel/xds/xds_api.cc index 2c18af46a16..71e9c07dba7 100644 --- a/src/core/ext/filters/client_channel/xds/xds_api.cc +++ b/src/core/ext/filters/client_channel/xds/xds_api.cc @@ -1045,6 +1045,12 @@ grpc_error* RouteConfigParse( "Path is not empty string, prefix cannot also be non-empty."); } } + if (i == (size - 1)) { + if (!(rds_route.service.empty() && rds_route.method.empty())) { + return GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "Default route must have empty service and method"); + } + } if (!envoy_api_v2_route_Route_has_route(route)) { return GRPC_ERROR_CREATE_FROM_STATIC_STRING( "No RouteAction found in route."); diff --git a/src/core/ext/filters/client_channel/xds/xds_client.cc b/src/core/ext/filters/client_channel/xds/xds_client.cc index 29ca7e78901..568b437fac5 100644 --- a/src/core/ext/filters/client_channel/xds/xds_client.cc +++ b/src/core/ext/filters/client_channel/xds/xds_client.cc @@ -903,6 +903,10 @@ void XdsClient::ChannelState::AdsCallState::AcceptLdsUpdate( ? lds_update->route_config_name.c_str() : "")); if (lds_update->rds_update.has_value()) { + gpr_log(GPR_INFO, + " [xds_client %p] LDS update received; LDS RouteConfiguration " + "contains %lu routes", + this, lds_update->rds_update.value().routes.size()); for (const auto& route : lds_update->rds_update.value().routes) { gpr_log(GPR_INFO, " route: { service=\"%s\", " @@ -960,15 +964,18 @@ void XdsClient::ChannelState::AdsCallState::AcceptRdsUpdate( GRPC_ERROR_CREATE_FROM_STATIC_STRING( "RDS update does not include requested resource")); return; - } else { - if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) { - for (const auto& route : rds_update.value().routes) { - gpr_log(GPR_INFO, - " route: { service=\"%s\", " - "method=\"%s\" }, cluster=\"%s\" }", - route.service.c_str(), route.method.c_str(), - route.cluster_name.c_str()); - } + } + if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) { + gpr_log(GPR_INFO, + "[xds_client %p] RDS update received; RouteConfiguration contains " + "%lu routes", + this, rds_update.value().routes.size()); + for (const auto& route : rds_update.value().routes) { + gpr_log(GPR_INFO, + " route: { service=\"%s\", " + "method=\"%s\" }, cluster=\"%s\" }", + route.service.c_str(), route.method.c_str(), + route.cluster_name.c_str()); } } auto& rds_state = state_map_[XdsApi::kRdsTypeUrl]; @@ -2048,31 +2055,29 @@ void XdsClient::ResetBackoff() { namespace { std::string CreateServiceConfigActionCluster(const std::string& cluster_name) { - std::string json = absl::StrFormat( - " \"cds:%s\":{\n" - " \"child_policy\":[ {\n" - " \"cds_experimental\":{\n" - " \"cluster\": \"%s\"\n" - " }\n" - " } ]\n" - " }", - cluster_name.c_str(), cluster_name.c_str()); - return json; + return ( + absl::StrFormat(" \"cds:%s\":{\n" + " \"child_policy\":[ {\n" + " \"cds_experimental\":{\n" + " \"cluster\": \"%s\"\n" + " }\n" + " } ]\n" + " }", + cluster_name.c_str(), cluster_name.c_str())); } std::string CreateServiceConfigRoute(const std::string& cluster_name, const std::string& service, const std::string& method) { - std::string json = absl::StrFormat( - " { \n" - " \"methodName\": {\n" - " \"service\": \"%s\",\n" - " \"method\": \"%s\"\n" - " },\n" - " \"action\": \"cds:%s\"\n" - " }", - service.c_str(), method.c_str(), cluster_name.c_str()); - return json; + return ( + absl::StrFormat(" { \n" + " \"methodName\": {\n" + " \"service\": \"%s\",\n" + " \"method\": \"%s\"\n" + " },\n" + " \"action\": \"cds:%s\"\n" + " }", + service.c_str(), method.c_str(), cluster_name.c_str())); } } // namespace @@ -2111,8 +2116,6 @@ grpc_error* XdsClient::CreateServiceConfig( std::string json = absl::StrJoin(config_parts, ""); grpc_error* error = GRPC_ERROR_NONE; *service_config = ServiceConfig::Create(json.c_str(), &error); - gpr_log(GPR_INFO, "Built service config: \"%s\"", - service_config->get()->json_string().c_str()); return error; } diff --git a/test/cpp/end2end/xds_end2end_test.cc b/test/cpp/end2end/xds_end2end_test.cc index f7772ba0376..5b86667ca67 100644 --- a/test/cpp/end2end/xds_end2end_test.cc +++ b/test/cpp/end2end/xds_end2end_test.cc @@ -2155,8 +2155,8 @@ TEST_P(LdsTest, DefaultRouteInvalid) { AdsServiceImpl::NACKED); } -// Tests that LDS client should send a ACK if route match has non-empty prefix -// in the LDS response. +// Tests that LDS client should send a NACK if route match has non-empty prefix +// as the only route (default) in the LDS response. TEST_P(LdsTest, RouteMatchHasNonemptyPrefix) { RouteConfiguration route_config = balancers_[0]->ads_service()->default_route_config(); @@ -2170,7 +2170,7 @@ TEST_P(LdsTest, RouteMatchHasNonemptyPrefix) { SetNextResolutionForLbChannelAllBalancers(); CheckRpcSendFailure(); EXPECT_EQ(balancers_[0]->ads_service()->lds_response_state(), - AdsServiceImpl::ACKED); + AdsServiceImpl::NACKED); } // Tests that LDS client should send a NACK if route has an action other than @@ -2321,6 +2321,10 @@ TEST_P(LdsTest, XdsRoutingPrefixMatching) { auto* matched_route = new_route_config.mutable_virtual_hosts(0)->add_routes(); matched_route->mutable_match()->set_prefix("/grpc.testing.EchoTestService"); matched_route->mutable_route()->set_cluster(kNewCluster2Name); + auto* default_route = new_route_config.mutable_virtual_hosts(0)->add_routes(); + default_route->mutable_match()->set_prefix(""); + default_route->mutable_match()->set_path(""); + default_route->mutable_route()->set_cluster(kDefaultResourceName); Listener listener = balancers_[0]->ads_service()->BuildListener(new_route_config); balancers_[0]->ads_service()->SetLdsResource(listener, kDefaultResourceName); @@ -2471,8 +2475,8 @@ TEST_P(RdsTest, DefaultRouteInvalid) { AdsServiceImpl::NACKED); } -// Tests that RDS client should send a ACK if route match has non-empty prefix -// in the RDS response. +// Tests that RDS client should send a NACK if route match has non-empty prefix +// as the only route (default) in the RDS response. TEST_P(RdsTest, RouteMatchHasNonemptyPrefix) { balancers_[0]->ads_service()->SetLdsToUseDynamicRds(); RouteConfiguration route_config = @@ -2487,7 +2491,7 @@ TEST_P(RdsTest, RouteMatchHasNonemptyPrefix) { SetNextResolutionForLbChannelAllBalancers(); CheckRpcSendFailure(); EXPECT_EQ(balancers_[0]->ads_service()->rds_response_state(), - AdsServiceImpl::ACKED); + AdsServiceImpl::NACKED); } // Tests that RDS client should send a NACK if route has an action other than From fdbdcb93d2a2e1f28ba98e9990efafd6f9e2b380 Mon Sep 17 00:00:00 2001 From: Ashitha Santhosh Date: Tue, 7 Apr 2020 23:44:40 -0700 Subject: [PATCH 399/758] Remove ABSL_CONST_INIT. --- .../tsi/alts/handshaker/alts_handshaker_client.cc | 8 ++++---- src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc | 13 +++++-------- src/core/tsi/alts/handshaker/alts_tsi_handshaker.h | 6 +++--- .../tsi/alts/handshaker/alts_tsi_handshaker_test.cc | 4 ++-- 4 files changed, 14 insertions(+), 17 deletions(-) diff --git a/src/core/tsi/alts/handshaker/alts_handshaker_client.cc b/src/core/tsi/alts/handshaker/alts_handshaker_client.cc index 5c5a407f54f..61927276195 100644 --- a/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +++ b/src/core/tsi/alts/handshaker/alts_handshaker_client.cc @@ -508,8 +508,8 @@ static grpc_byte_buffer* get_serialized_start_client( upb_strview_makez(ptr->data)); ptr = ptr->next; } - grpc_gcp_StartClientHandshakeReq_set_max_frame_size(start_client, - client->max_frame_size); + grpc_gcp_StartClientHandshakeReq_set_max_frame_size( + start_client, static_cast(client->max_frame_size)); return get_serialized_handshaker_req(req, arena.ptr()); } @@ -569,8 +569,8 @@ static grpc_byte_buffer* get_serialized_start_server( arena.ptr()); grpc_gcp_RpcProtocolVersions_assign_from_struct( server_version, arena.ptr(), &client->options->rpc_versions); - grpc_gcp_StartServerHandshakeReq_set_max_frame_size(start_server, - client->max_frame_size); + grpc_gcp_StartServerHandshakeReq_set_max_frame_size( + start_server, static_cast(client->max_frame_size)); return get_serialized_handshaker_req(req, arena.ptr()); } diff --git a/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc b/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc index b2687825d17..2a925182d3f 100644 --- a/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +++ b/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc @@ -41,9 +41,6 @@ #include "src/core/tsi/alts/handshaker/alts_tsi_utils.h" #include "src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.h" -const size_t kMinFrameSize = 16 * 1024; -const size_t kMaxFrameSize = 128 * 1024; - /* Main struct for ALTS TSI handshaker. */ struct alts_tsi_handshaker { tsi_handshaker base; @@ -166,17 +163,17 @@ static tsi_result handshaker_result_create_zero_copy_grpc_protector( // In case the peer does not send max frame size (e.g. peer is gRPC Go or // peer uses an old binary), the negotiated frame size is set to - // kMinFrameSize (ignoring max_output_protected_frame_size value if + // kTsiAltsMinFrameSize (ignoring max_output_protected_frame_size value if // present). Otherwise, it is based on peer and user specified max frame // size (if present). - size_t max_frame_size = kMinFrameSize; + size_t max_frame_size = kTsiAltsMinFrameSize; if (result->max_frame_size) { size_t peer_max_frame_size = result->max_frame_size; max_frame_size = std::min(peer_max_frame_size, max_output_protected_frame_size == nullptr - ? kMaxFrameSize + ? kTsiAltsMaxFrameSize : *max_output_protected_frame_size); - max_frame_size = std::max(max_frame_size, kMinFrameSize); + max_frame_size = std::max(max_frame_size, kTsiAltsMinFrameSize); } max_output_protected_frame_size = &max_frame_size; gpr_log(GPR_DEBUG, @@ -622,7 +619,7 @@ tsi_result alts_tsi_handshaker_create( handshaker->options = grpc_alts_credentials_options_copy(options); handshaker->max_frame_size = user_specified_max_frame_size != 0 ? user_specified_max_frame_size - : kMaxFrameSize; + : kTsiAltsMaxFrameSize; handshaker->base.vtable = handshaker->use_dedicated_cq ? &handshaker_vtable_dedicated : &handshaker_vtable; diff --git a/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h b/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h index 6959c563a5e..e1ae985a84d 100644 --- a/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +++ b/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h @@ -39,9 +39,9 @@ const size_t kTsiAltsNumOfPeerProperties = 5; // Frame size negotiation extends send frame size range to -// [kMinFrameSize, kMaxFrameSize] -ABSL_CONST_INIT extern const size_t kMinFrameSize; -ABSL_CONST_INIT extern const size_t kMaxFrameSize; +// [kTsiAltsMinFrameSize, kTsiAltsMaxFrameSize]. +const size_t kTsiAltsMinFrameSize = 16 * 1024; +const size_t kTsiAltsMaxFrameSize = 128 * 1024; typedef struct alts_tsi_handshaker alts_tsi_handshaker; diff --git a/test/core/tsi/alts/handshaker/alts_tsi_handshaker_test.cc b/test/core/tsi/alts/handshaker/alts_tsi_handshaker_test.cc index 8f38640ef67..2127e980488 100644 --- a/test/core/tsi/alts/handshaker/alts_tsi_handshaker_test.cc +++ b/test/core/tsi/alts/handshaker/alts_tsi_handshaker_test.cc @@ -296,7 +296,7 @@ static void on_client_next_success_cb(tsi_result status, void* user_data, size_t actual_max_frame_size; tsi_zero_copy_grpc_protector_max_frame_size(zero_copy_protector, &actual_max_frame_size); - GPR_ASSERT(actual_max_frame_size == kMaxFrameSize); + GPR_ASSERT(actual_max_frame_size == kTsiAltsMaxFrameSize); tsi_zero_copy_grpc_protector_destroy(zero_copy_protector); /* Validate peer identity. */ tsi_peer peer; @@ -370,7 +370,7 @@ static void on_server_next_success_cb(tsi_result status, void* user_data, size_t actual_max_frame_size; tsi_zero_copy_grpc_protector_max_frame_size(zero_copy_protector, &actual_max_frame_size); - GPR_ASSERT(actual_max_frame_size == kMinFrameSize); + GPR_ASSERT(actual_max_frame_size == kTsiAltsMinFrameSize); tsi_zero_copy_grpc_protector_destroy(zero_copy_protector); /* Validate peer identity. */ tsi_peer peer; From c3fc65c9e00bb630cadfc4e420501d66633f9257 Mon Sep 17 00:00:00 2001 From: "Mark D. Roth" Date: Wed, 8 Apr 2020 07:29:45 -0700 Subject: [PATCH 400/758] Don't NACK EDS updates with no localities, but report TRANSIENT_FAILURE. --- .../client_channel/lb_policy/xds/eds.cc | 19 ++++++++------ .../ext/filters/client_channel/xds/xds_api.cc | 7 ------ test/cpp/end2end/xds_end2end_test.cc | 25 +++++++++---------- 3 files changed, 23 insertions(+), 28 deletions(-) diff --git a/src/core/ext/filters/client_channel/lb_policy/xds/eds.cc b/src/core/ext/filters/client_channel/lb_policy/xds/eds.cc index 2f1acdb9f80..099fb286223 100644 --- a/src/core/ext/filters/client_channel/lb_policy/xds/eds.cc +++ b/src/core/ext/filters/client_channel/lb_policy/xds/eds.cc @@ -405,19 +405,22 @@ class EdsLb::EndpointWatcher : public XdsClient::EndpointWatcherInterface { } eds_policy_->drop_config_ = std::move(update.drop_config); eds_policy_->MaybeUpdateDropPickerLocked(); + } else if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_eds_trace)) { + gpr_log(GPR_INFO, "[edslb %p] Drop config unchanged, ignoring", + eds_policy_.get()); } // Update priority and locality info. - if (eds_policy_->priority_list_update_ == update.priority_list_update) { + if (eds_policy_->child_policy_ == nullptr || + eds_policy_->priority_list_update_ != update.priority_list_update) { if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_eds_trace)) { - gpr_log(GPR_INFO, - "[edslb %p] Incoming locality update identical to current, " - "ignoring. (drop_config_changed=%d)", - eds_policy_.get(), drop_config_changed); + gpr_log(GPR_INFO, "[edslb %p] Updating priority list", + eds_policy_.get()); } - return; + eds_policy_->UpdatePriorityList(std::move(update.priority_list_update)); + } else if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_eds_trace)) { + gpr_log(GPR_INFO, "[edslb %p] Priority list unchanged, ignoring", + eds_policy_.get()); } - // Update the child policy with the new priority and endpoint data. - eds_policy_->UpdatePriorityList(std::move(update.priority_list_update)); } void OnError(grpc_error* error) override { diff --git a/src/core/ext/filters/client_channel/xds/xds_api.cc b/src/core/ext/filters/client_channel/xds/xds_api.cc index 2ac824ba08e..4cf5d8c26a2 100644 --- a/src/core/ext/filters/client_channel/xds/xds_api.cc +++ b/src/core/ext/filters/client_channel/xds/xds_api.cc @@ -1420,13 +1420,6 @@ grpc_error* EdsResponseParse( if (error != GRPC_ERROR_NONE) return error; } } - // Validate the update content. - if (eds_update.priority_list_update.empty() && - !eds_update.drop_config->drop_all()) { - return GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "EDS response doesn't contain any valid " - "locality but doesn't require to drop all calls."); - } eds_update_map->emplace(std::string(cluster_name.data, cluster_name.size), std::move(eds_update)); } diff --git a/test/cpp/end2end/xds_end2end_test.cc b/test/cpp/end2end/xds_end2end_test.cc index 2efbc38a364..2e643a43670 100644 --- a/test/cpp/end2end/xds_end2end_test.cc +++ b/test/cpp/end2end/xds_end2end_test.cc @@ -2355,19 +2355,6 @@ TEST_P(EdsTest, Timeout) { CheckRpcSendFailure(); } -// Tests that EDS client should send a NACK if the EDS update contains -// no localities but does not say to drop all calls. -TEST_P(EdsTest, NacksNoLocalitiesWithoutDropAll) { - SetNextResolution({}); - SetNextResolutionForLbChannelAllBalancers(); - AdsServiceImpl::EdsResourceArgs args; - balancers_[0]->ads_service()->SetEdsResource( - AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); - CheckRpcSendFailure(); - EXPECT_EQ(balancers_[0]->ads_service()->eds_response_state(), - AdsServiceImpl::NACKED); -} - // Tests that EDS client should send a NACK if the EDS update contains // sparse priorities. TEST_P(EdsTest, NacksSparsePriorityList) { @@ -2454,6 +2441,18 @@ TEST_P(LocalityMapTest, LocalityContainingNoEndpoints) { kNumRpcs / backends_.size()); } +// EDS update with no localities. +TEST_P(LocalityMapTest, NoLocalities) { + SetNextResolution({}); + SetNextResolutionForLbChannelAllBalancers(); + // EDS response contains 2 localities, one with no endpoints. + balancers_[0]->ads_service()->SetEdsResource( + AdsServiceImpl::BuildEdsResource({}), kDefaultResourceName); + Status status = SendRpc(); + EXPECT_FALSE(status.ok()); + EXPECT_EQ(status.error_code(), GRPC_STATUS_UNAVAILABLE); +} + // Tests that the locality map can work properly even when it contains a large // number of localities. TEST_P(LocalityMapTest, StressTest) { From f1979cece2324549fd24c3d58de707331ae40e3b Mon Sep 17 00:00:00 2001 From: Vijay Pai Date: Wed, 8 Apr 2020 08:41:54 -0700 Subject: [PATCH 401/758] Disable SockPair fixture --- test/cpp/microbenchmarks/bm_fullstack_streaming_pump.cc | 6 ------ 1 file changed, 6 deletions(-) diff --git a/test/cpp/microbenchmarks/bm_fullstack_streaming_pump.cc b/test/cpp/microbenchmarks/bm_fullstack_streaming_pump.cc index d4533e6c78e..d0df2417139 100644 --- a/test/cpp/microbenchmarks/bm_fullstack_streaming_pump.cc +++ b/test/cpp/microbenchmarks/bm_fullstack_streaming_pump.cc @@ -34,8 +34,6 @@ BENCHMARK_TEMPLATE(BM_PumpStreamClientToServer, UDS) ->Range(0, 128 * 1024 * 1024); BENCHMARK_TEMPLATE(BM_PumpStreamClientToServer, InProcess) ->Range(0, 128 * 1024 * 1024); -BENCHMARK_TEMPLATE(BM_PumpStreamClientToServer, SockPair) - ->Range(0, 128 * 1024 * 1024); BENCHMARK_TEMPLATE(BM_PumpStreamClientToServer, InProcessCHTTP2) ->Range(0, 128 * 1024 * 1024); BENCHMARK_TEMPLATE(BM_PumpStreamServerToClient, TCP) @@ -44,19 +42,15 @@ BENCHMARK_TEMPLATE(BM_PumpStreamServerToClient, UDS) ->Range(0, 128 * 1024 * 1024); BENCHMARK_TEMPLATE(BM_PumpStreamServerToClient, InProcess) ->Range(0, 128 * 1024 * 1024); -BENCHMARK_TEMPLATE(BM_PumpStreamServerToClient, SockPair) - ->Range(0, 128 * 1024 * 1024); BENCHMARK_TEMPLATE(BM_PumpStreamServerToClient, InProcessCHTTP2) ->Range(0, 128 * 1024 * 1024); BENCHMARK_TEMPLATE(BM_PumpStreamClientToServer, MinTCP)->Arg(0); BENCHMARK_TEMPLATE(BM_PumpStreamClientToServer, MinUDS)->Arg(0); BENCHMARK_TEMPLATE(BM_PumpStreamClientToServer, MinInProcess)->Arg(0); -BENCHMARK_TEMPLATE(BM_PumpStreamClientToServer, MinSockPair)->Arg(0); BENCHMARK_TEMPLATE(BM_PumpStreamClientToServer, MinInProcessCHTTP2)->Arg(0); BENCHMARK_TEMPLATE(BM_PumpStreamServerToClient, MinTCP)->Arg(0); BENCHMARK_TEMPLATE(BM_PumpStreamServerToClient, MinUDS)->Arg(0); BENCHMARK_TEMPLATE(BM_PumpStreamServerToClient, MinInProcess)->Arg(0); -BENCHMARK_TEMPLATE(BM_PumpStreamServerToClient, MinSockPair)->Arg(0); BENCHMARK_TEMPLATE(BM_PumpStreamServerToClient, MinInProcessCHTTP2)->Arg(0); } // namespace testing From bb3b5d1d238bb562425f4ba417d5fc9f41799f70 Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Wed, 8 Apr 2020 11:52:03 -0400 Subject: [PATCH 402/758] switch grpc-dart interop test to dart2.7 --- .../interoptest/grpc_interop_dart/Dockerfile.template | 5 +---- tools/dockerfile/interoptest/grpc_interop_dart/Dockerfile | 5 +---- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/templates/tools/dockerfile/interoptest/grpc_interop_dart/Dockerfile.template b/templates/tools/dockerfile/interoptest/grpc_interop_dart/Dockerfile.template index dee59335280..7836341a913 100644 --- a/templates/tools/dockerfile/interoptest/grpc_interop_dart/Dockerfile.template +++ b/templates/tools/dockerfile/interoptest/grpc_interop_dart/Dockerfile.template @@ -14,10 +14,7 @@ # See the License for the specific language governing permissions and # limitations under the License. - FROM google/dart:2.3 - - # Upgrade Dart to version 2. - RUN apt-get update && apt-get upgrade -y dart + FROM google/dart:2.7 # Define the default command. CMD ["bash"] diff --git a/tools/dockerfile/interoptest/grpc_interop_dart/Dockerfile b/tools/dockerfile/interoptest/grpc_interop_dart/Dockerfile index 43d8a60daea..dd9b8e55b0c 100644 --- a/tools/dockerfile/interoptest/grpc_interop_dart/Dockerfile +++ b/tools/dockerfile/interoptest/grpc_interop_dart/Dockerfile @@ -12,10 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -FROM google/dart:2.3 - -# Upgrade Dart to version 2. -RUN apt-get update && apt-get upgrade -y dart +FROM google/dart:2.7 # Define the default command. CMD ["bash"] From 527509abc40b74e2e95ed19ec99cd06175fb3fd8 Mon Sep 17 00:00:00 2001 From: Vijay Pai Date: Wed, 8 Apr 2020 10:09:00 -0700 Subject: [PATCH 403/758] Unmark flaky on streaming_pump --- test/cpp/microbenchmarks/BUILD | 1 - 1 file changed, 1 deletion(-) diff --git a/test/cpp/microbenchmarks/BUILD b/test/cpp/microbenchmarks/BUILD index 7e8d371fc3c..e8065fa8964 100644 --- a/test/cpp/microbenchmarks/BUILD +++ b/test/cpp/microbenchmarks/BUILD @@ -206,7 +206,6 @@ grpc_cc_test( srcs = [ "bm_fullstack_streaming_pump.cc", ], - flaky = True, # TODO(b/150422385) tags = [ "no_mac", # to emulate "excluded_poll_engines: poll" "no_windows", From 719ec593d05b228828402ea708e93ed9e7760c1b Mon Sep 17 00:00:00 2001 From: Vijay Pai Date: Wed, 8 Apr 2020 10:31:33 -0700 Subject: [PATCH 404/758] Regen projects --- Makefile | 2 ++ build_autogenerated.yaml | 1 - tools/run_tests/generated/tests.json | 20 ++++++++++++++++++++ 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index d1a58c87a8b..4aab6a0adb9 100644 --- a/Makefile +++ b/Makefile @@ -2176,6 +2176,8 @@ test_cxx: buildtests_cxx $(Q) $(BINDIR)/$(CONFIG)/bm_error || ( echo test bm_error failed ; exit 1 ) $(E) "[RUN] Testing bm_fullstack_streaming_ping_pong" $(Q) $(BINDIR)/$(CONFIG)/bm_fullstack_streaming_ping_pong || ( echo test bm_fullstack_streaming_ping_pong failed ; exit 1 ) + $(E) "[RUN] Testing bm_fullstack_streaming_pump" + $(Q) $(BINDIR)/$(CONFIG)/bm_fullstack_streaming_pump || ( echo test bm_fullstack_streaming_pump failed ; exit 1 ) $(E) "[RUN] Testing bm_fullstack_unary_ping_pong" $(Q) $(BINDIR)/$(CONFIG)/bm_fullstack_unary_ping_pong || ( echo test bm_fullstack_unary_ping_pong failed ; exit 1 ) $(E) "[RUN] Testing bm_metadata" diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml index 69e0b124799..3e4cab440ed 100644 --- a/build_autogenerated.yaml +++ b/build_autogenerated.yaml @@ -5127,7 +5127,6 @@ targets: - posix - name: bm_fullstack_streaming_pump build: test - run: false language: c++ headers: - test/cpp/microbenchmarks/fullstack_streaming_pump.h diff --git a/tools/run_tests/generated/tests.json b/tools/run_tests/generated/tests.json index fc5695d84a3..c1707be58da 100644 --- a/tools/run_tests/generated/tests.json +++ b/tools/run_tests/generated/tests.json @@ -3757,6 +3757,26 @@ ], "uses_polling": true }, + { + "args": [], + "benchmark": true, + "ci_platforms": [ + "linux", + "posix" + ], + "cpu_cost": 1.0, + "exclude_configs": [], + "exclude_iomgrs": [], + "flaky": false, + "gtest": false, + "language": "c++", + "name": "bm_fullstack_streaming_pump", + "platforms": [ + "linux", + "posix" + ], + "uses_polling": true + }, { "args": [], "benchmark": true, From d9611cf1ca60e3d9bb1c5d37657fe9aef22c42c6 Mon Sep 17 00:00:00 2001 From: Donna Dionne Date: Wed, 8 Apr 2020 16:20:16 -0700 Subject: [PATCH 405/758] Fixed AllServerUnavailableFailFast test to return UNAVAILBLE instead UNKNOWN. --- .../ext/filters/client_channel/lb_policy/xds/xds_routing.cc | 4 ++-- test/cpp/end2end/xds_end2end_test.cc | 4 +--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc b/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc index 7098b9ae9db..19542fc8b3a 100644 --- a/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc +++ b/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc @@ -393,8 +393,8 @@ void XdsRoutingLb::UpdateStateLocked() { break; default: picker = absl::make_unique( - GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "xds_routing: all children report state TRANSIENT_FAILURE")); + grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING("TRANSIENT_FAILURE from XdsRoutingLb"), + GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE)); } channel_control_helper()->UpdateState(connectivity_state, std::move(picker)); } diff --git a/test/cpp/end2end/xds_end2end_test.cc b/test/cpp/end2end/xds_end2end_test.cc index 5b86667ca67..cb86de8aa86 100644 --- a/test/cpp/end2end/xds_end2end_test.cc +++ b/test/cpp/end2end/xds_end2end_test.cc @@ -1748,9 +1748,7 @@ TEST_P(BasicTest, AllServersUnreachableFailFast) { AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); const Status status = SendRpc(); // The error shouldn't be DEADLINE_EXCEEDED. - gpr_log(GPR_INFO, "error code %d message received %s", status.error_code(), - status.error_message().c_str()); - EXPECT_NE(StatusCode::DEADLINE_EXCEEDED, status.error_code()); + EXPECT_EQ(StatusCode::UNAVAILABLE, status.error_code()); } // Tests that RPCs fail when the backends are down, and will succeed again after From e4dcc0319c022babd472a461da76c0827f1dc038 Mon Sep 17 00:00:00 2001 From: ZhenLian Date: Wed, 8 Apr 2020 10:50:49 -0700 Subject: [PATCH 406/758] [2/n] Avoid using hardcoded test credentials --- test/core/end2end/fixtures/h2_oauth2.cc | 36 ++++++++++++++---- test/core/end2end/fixtures/h2_ssl.cc | 49 ++++++++++++------------- test/core/end2end/generate_tests.bzl | 14 +++++++ 3 files changed, 65 insertions(+), 34 deletions(-) diff --git a/test/core/end2end/fixtures/h2_oauth2.cc b/test/core/end2end/fixtures/h2_oauth2.cc index 0800d5929f2..22f85a2feea 100644 --- a/test/core/end2end/fixtures/h2_oauth2.cc +++ b/test/core/end2end/fixtures/h2_oauth2.cc @@ -16,22 +16,26 @@ * */ -#include "test/core/end2end/end2end_tests.h" - -#include -#include - #include #include +#include +#include #include "src/core/lib/channel/channel_args.h" #include "src/core/lib/gprpp/host_port.h" #include "src/core/lib/iomgr/iomgr.h" +#include "src/core/lib/iomgr/load_file.h" #include "src/core/lib/security/credentials/credentials.h" -#include "test/core/end2end/data/ssl_test_data.h" +#include "test/core/end2end/end2end_tests.h" #include "test/core/util/port.h" #include "test/core/util/test_config.h" +#define CA_CERT_PATH "src/core/tsi/test_creds/ca.pem" +#define CLIENT_CERT_PATH "src/core/tsi/test_creds/client.pem" +#define CLIENT_KEY_PATH "src/core/tsi/test_creds/client.key" +#define SERVER_CERT_PATH "src/core/tsi/test_creds/server1.pem" +#define SERVER_KEY_PATH "src/core/tsi/test_creds/server1.key" + static const char oauth2_md[] = "Bearer aaslkfjs424535asdf"; static const char* client_identity_property_name = "smurf_name"; static const char* client_identity = "Brainy Smurf"; @@ -139,6 +143,11 @@ void chttp2_tear_down_secure_fullstack(grpc_end2end_test_fixture* f) { static void chttp2_init_client_simple_ssl_with_oauth2_secure_fullstack( grpc_end2end_test_fixture* f, grpc_channel_args* client_args) { grpc_core::ExecCtx exec_ctx; + grpc_slice ca_slice; + GPR_ASSERT(GRPC_LOG_IF_ERROR("load_file", + grpc_load_file(CA_CERT_PATH, 1, &ca_slice))); + const char* test_root_cert = + reinterpret_cast GRPC_SLICE_START_PTR(ca_slice); grpc_channel_credentials* ssl_creds = grpc_ssl_credentials_create(test_root_cert, nullptr, nullptr, nullptr); grpc_call_credentials* oauth2_creds = grpc_md_only_test_credentials_create( @@ -156,6 +165,7 @@ static void chttp2_init_client_simple_ssl_with_oauth2_secure_fullstack( grpc_channel_args_destroy(new_client_args); grpc_channel_credentials_release(ssl_creds); grpc_call_credentials_release(oauth2_creds); + grpc_slice_unref(ca_slice); } static int fail_server_auth_check(grpc_channel_args* server_args) { @@ -193,13 +203,23 @@ static grpc_auth_metadata_processor test_processor_create(int failing) { static void chttp2_init_server_simple_ssl_secure_fullstack( grpc_end2end_test_fixture* f, grpc_channel_args* server_args) { - grpc_ssl_pem_key_cert_pair pem_key_cert_pair = {test_server1_key, - test_server1_cert}; + grpc_slice cert_slice, key_slice; + GPR_ASSERT(GRPC_LOG_IF_ERROR( + "load_file", grpc_load_file(SERVER_CERT_PATH, 1, &cert_slice))); + GPR_ASSERT(GRPC_LOG_IF_ERROR("load_file", + grpc_load_file(SERVER_KEY_PATH, 1, &key_slice))); + const char* server_cert = + reinterpret_cast GRPC_SLICE_START_PTR(cert_slice); + const char* server_key = + reinterpret_cast GRPC_SLICE_START_PTR(key_slice); + grpc_ssl_pem_key_cert_pair pem_key_cert_pair = {server_key, server_cert}; grpc_server_credentials* ssl_creds = grpc_ssl_server_credentials_create( nullptr, &pem_key_cert_pair, 1, 0, nullptr); grpc_server_credentials_set_auth_metadata_processor( ssl_creds, test_processor_create(fail_server_auth_check(server_args))); chttp2_init_server_secure_fullstack(f, server_args, ssl_creds); + grpc_slice_unref(cert_slice); + grpc_slice_unref(key_slice); } /* All test configurations */ diff --git a/test/core/end2end/fixtures/h2_ssl.cc b/test/core/end2end/fixtures/h2_ssl.cc index 2ba2418151d..1e46486dd5e 100644 --- a/test/core/end2end/fixtures/h2_ssl.cc +++ b/test/core/end2end/fixtures/h2_ssl.cc @@ -16,23 +16,26 @@ * */ -#include "test/core/end2end/end2end_tests.h" - -#include -#include - #include #include +#include +#include #include "src/core/lib/channel/channel_args.h" #include "src/core/lib/gpr/string.h" #include "src/core/lib/gpr/tmpfile.h" #include "src/core/lib/gprpp/host_port.h" +#include "src/core/lib/iomgr/load_file.h" #include "src/core/lib/security/credentials/credentials.h" #include "src/core/lib/security/security_connector/ssl_utils_config.h" -#include "test/core/end2end/data/ssl_test_data.h" +#include "test/core/end2end/end2end_tests.h" #include "test/core/util/port.h" #include "test/core/util/test_config.h" +#define CA_CERT_PATH "src/core/tsi/test_creds/ca.pem" +#define CLIENT_CERT_PATH "src/core/tsi/test_creds/client.pem" +#define CLIENT_KEY_PATH "src/core/tsi/test_creds/client.key" +#define SERVER_CERT_PATH "src/core/tsi/test_creds/server1.pem" +#define SERVER_KEY_PATH "src/core/tsi/test_creds/server1.key" struct fullstack_secure_fixture_data { grpc_core::UniquePtr localaddr; @@ -124,10 +127,20 @@ static int fail_server_auth_check(grpc_channel_args* server_args) { static void chttp2_init_server_simple_ssl_secure_fullstack( grpc_end2end_test_fixture* f, grpc_channel_args* server_args) { - grpc_ssl_pem_key_cert_pair pem_cert_key_pair = {test_server1_key, - test_server1_cert}; + grpc_slice cert_slice, key_slice; + GPR_ASSERT(GRPC_LOG_IF_ERROR( + "load_file", grpc_load_file(SERVER_CERT_PATH, 1, &cert_slice))); + GPR_ASSERT(GRPC_LOG_IF_ERROR("load_file", + grpc_load_file(SERVER_KEY_PATH, 1, &key_slice))); + const char* server_cert = + reinterpret_cast GRPC_SLICE_START_PTR(cert_slice); + const char* server_key = + reinterpret_cast GRPC_SLICE_START_PTR(key_slice); + grpc_ssl_pem_key_cert_pair pem_key_cert_pair = {server_key, server_cert}; grpc_server_credentials* ssl_creds = grpc_ssl_server_credentials_create( - nullptr, &pem_cert_key_pair, 1, 0, nullptr); + nullptr, &pem_key_cert_pair, 1, 0, nullptr); + grpc_slice_unref(cert_slice); + grpc_slice_unref(key_slice); if (fail_server_auth_check(server_args)) { grpc_auth_metadata_processor processor = {process_auth_failure, nullptr, nullptr}; @@ -152,20 +165,9 @@ static grpc_end2end_test_config configs[] = { int main(int argc, char** argv) { size_t i; - FILE* roots_file; - size_t roots_size = strlen(test_root_cert); - char* roots_filename; - grpc::testing::TestEnvironment env(argc, argv); grpc_end2end_tests_pre_init(); - - /* Set the SSL roots env var. */ - roots_file = gpr_tmpfile("chttp2_simple_ssl_fullstack_test", &roots_filename); - GPR_ASSERT(roots_filename != nullptr); - GPR_ASSERT(roots_file != nullptr); - GPR_ASSERT(fwrite(test_root_cert, 1, roots_size, roots_file) == roots_size); - fclose(roots_file); - GPR_GLOBAL_CONFIG_SET(grpc_default_ssl_roots_file_path, roots_filename); + GPR_GLOBAL_CONFIG_SET(grpc_default_ssl_roots_file_path, CA_CERT_PATH); grpc_init(); @@ -174,10 +176,5 @@ int main(int argc, char** argv) { } grpc_shutdown(); - - /* Cleanup. */ - remove(roots_filename); - gpr_free(roots_filename); - return 0; } diff --git a/test/core/end2end/generate_tests.bzl b/test/core/end2end/generate_tests.bzl index 2b73af6f715..e7034222e52 100755 --- a/test/core/end2end/generate_tests.bzl +++ b/test/core/end2end/generate_tests.bzl @@ -429,6 +429,13 @@ def grpc_end2end_tests(): name = "%s_test" % f, srcs = ["fixtures/%s.cc" % f], language = "C++", + data = [ + "//src/core/tsi/test_creds:ca.pem", + "//src/core/tsi/test_creds:client.key", + "//src/core/tsi/test_creds:client.pem", + "//src/core/tsi/test_creds:server1.key", + "//src/core/tsi/test_creds:server1.pem", + ], deps = [ ":end2end_tests", "//test/core/util:grpc_test_util", @@ -499,6 +506,13 @@ def grpc_end2end_nosec_tests(): name = "%s_nosec_test" % f, srcs = ["fixtures/%s.cc" % f], language = "C++", + data = [ + "//src/core/tsi/test_creds:ca.pem", + "//src/core/tsi/test_creds:client.key", + "//src/core/tsi/test_creds:client.pem", + "//src/core/tsi/test_creds:server1.key", + "//src/core/tsi/test_creds:server1.pem", + ], deps = [ ":end2end_nosec_tests", "//test/core/util:grpc_test_util_unsecure", From 06c6fa73b08e7cdb3010891d28e160cfda4306e3 Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Thu, 9 Apr 2020 08:55:07 -0400 Subject: [PATCH 407/758] avoid too long name for retry_exceeds_buffer_size_in_initial_batch --- test/core/end2end/generate_tests.bzl | 3 +++ 1 file changed, 3 insertions(+) diff --git a/test/core/end2end/generate_tests.bzl b/test/core/end2end/generate_tests.bzl index e7034222e52..3c1817ff82b 100755 --- a/test/core/end2end/generate_tests.bzl +++ b/test/core/end2end/generate_tests.bzl @@ -282,6 +282,9 @@ END2END_TESTS = { "retry_exceeds_buffer_size_in_initial_batch": _test_options( needs_client_channel = True, proxyable = False, + # TODO(jtattermusch): too long bazel test name makes the test flaky on Windows RBE + # See b/151617965 + short_name = "retry_exceeds_buffer_size_in_init", ), "retry_exceeds_buffer_size_in_subsequent_batch": _test_options( needs_client_channel = True, From 697f411fef03c1ef296f0e4efa686e3621213f05 Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Thu, 9 Apr 2020 10:05:07 -0400 Subject: [PATCH 408/758] mark client_channel_stress_test as flaky --- Makefile | 2 -- build_autogenerated.yaml | 1 + test/cpp/client/BUILD | 1 + tools/run_tests/generated/tests.json | 22 ---------------------- 4 files changed, 2 insertions(+), 24 deletions(-) diff --git a/Makefile b/Makefile index d1a58c87a8b..3c912074365 100644 --- a/Makefile +++ b/Makefile @@ -2204,8 +2204,6 @@ test_cxx: buildtests_cxx $(Q) $(BINDIR)/$(CONFIG)/cli_call_test || ( echo test cli_call_test failed ; exit 1 ) $(E) "[RUN] Testing client_callback_end2end_test" $(Q) $(BINDIR)/$(CONFIG)/client_callback_end2end_test || ( echo test client_callback_end2end_test failed ; exit 1 ) - $(E) "[RUN] Testing client_channel_stress_test" - $(Q) $(BINDIR)/$(CONFIG)/client_channel_stress_test || ( echo test client_channel_stress_test failed ; exit 1 ) $(E) "[RUN] Testing client_interceptors_end2end_test" $(Q) $(BINDIR)/$(CONFIG)/client_interceptors_end2end_test || ( echo test client_interceptors_end2end_test failed ; exit 1 ) $(E) "[RUN] Testing codegen_test_full" diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml index 69e0b124799..3da4665b127 100644 --- a/build_autogenerated.yaml +++ b/build_autogenerated.yaml @@ -5511,6 +5511,7 @@ targets: - name: client_channel_stress_test gtest: true build: test + run: false language: c++ headers: - test/cpp/end2end/test_service_impl.h diff --git a/test/cpp/client/BUILD b/test/cpp/client/BUILD index 73b0aa37457..18e9ce4973f 100644 --- a/test/cpp/client/BUILD +++ b/test/cpp/client/BUILD @@ -35,6 +35,7 @@ grpc_cc_test( grpc_cc_test( name = "client_channel_stress_test", srcs = ["client_channel_stress_test.cc"], + flaky = True, # TODO(b/153136407) # TODO(jtattermusch): test fails frequently on Win RBE, but passes locally # reenable the tests once it works reliably on Win RBE. # TODO(roth): Test disabled on msan and tsan due to variable diff --git a/tools/run_tests/generated/tests.json b/tools/run_tests/generated/tests.json index fc5695d84a3..7bc5d2575a9 100644 --- a/tools/run_tests/generated/tests.json +++ b/tools/run_tests/generated/tests.json @@ -4077,28 +4077,6 @@ ], "uses_polling": true }, - { - "args": [], - "benchmark": false, - "ci_platforms": [ - "linux", - "mac", - "posix" - ], - "cpu_cost": 1.0, - "exclude_configs": [], - "exclude_iomgrs": [], - "flaky": false, - "gtest": true, - "language": "c++", - "name": "client_channel_stress_test", - "platforms": [ - "linux", - "mac", - "posix" - ], - "uses_polling": true - }, { "args": [], "benchmark": false, From ebe94949cafbad27c841a5ecd20a544d8629eced Mon Sep 17 00:00:00 2001 From: Patrice Chalin Date: Thu, 9 Apr 2020 16:22:37 -0400 Subject: [PATCH 409/758] Removing obsolete C++ tutorial content Contributes to https://github.com/grpc/grpc.io/issues/180 --- examples/cpp/cpptutorial.md | 489 +----------------------------------- 1 file changed, 1 insertion(+), 488 deletions(-) diff --git a/examples/cpp/cpptutorial.md b/examples/cpp/cpptutorial.md index c40676de134..21411f9db98 100644 --- a/examples/cpp/cpptutorial.md +++ b/examples/cpp/cpptutorial.md @@ -1,488 +1 @@ -# gRPC Basics: C++ - -This tutorial provides a basic C++ programmer's introduction to working with -gRPC. By walking through this example you'll learn how to: - -- Define a service in a `.proto` file. -- Generate server and client code using the protocol buffer compiler. -- Use the C++ gRPC API to write a simple client and server for your service. - -It assumes that you are familiar with -[protocol buffers](https://developers.google.com/protocol-buffers/docs/overview). -Note that the example in this tutorial uses the proto3 version of the protocol -buffers language, which is currently in alpha release: you can find out more in -the [proto3 language guide](https://developers.google.com/protocol-buffers/docs/proto3) -and see the [release notes](https://github.com/google/protobuf/releases) for the -new version in the protocol buffers Github repository. - -## Why use gRPC? - -Our example is a simple route mapping application that lets clients get -information about features on their route, create a summary of their route, and -exchange route information such as traffic updates with the server and other -clients. - -With gRPC we can define our service once in a `.proto` file and implement clients -and servers in any of gRPC's supported languages, which in turn can be run in -environments ranging from servers inside Google to your own tablet - all the -complexity of communication between different languages and environments is -handled for you by gRPC. We also get all the advantages of working with protocol -buffers, including efficient serialization, a simple IDL, and easy interface -updating. - -## Example code and setup - -The example code for our tutorial is in [examples/cpp/route_guide](route_guide). -You also should have the relevant tools installed to generate the server and -client interface code - if you don't already, follow the setup instructions in -[BUILDING.md](../../BUILDING.md). - -## Defining the service - -Our first step is to define the gRPC *service* and the method *request* and -*response* types using -[protocol buffers](https://developers.google.com/protocol-buffers/docs/overview). -You can see the complete `.proto` file in -[`examples/protos/route_guide.proto`](../protos/route_guide.proto). - -To define a service, you specify a named `service` in your `.proto` file: - -```protobuf -service RouteGuide { - ... -} -``` - -Then you define `rpc` methods inside your service definition, specifying their -request and response types. gRPC lets you define four kinds of service method, -all of which are used in the `RouteGuide` service: - -- A *simple RPC* where the client sends a request to the server using the stub - and waits for a response to come back, just like a normal function call. - -```protobuf - // Obtains the feature at a given position. - rpc GetFeature(Point) returns (Feature) {} -``` - -- A *server-side streaming RPC* where the client sends a request to the server - and gets a stream to read a sequence of messages back. The client reads from - the returned stream until there are no more messages. As you can see in our - example, you specify a server-side streaming method by placing the `stream` - keyword before the *response* type. - -```protobuf - // Obtains the Features available within the given Rectangle. Results are - // streamed rather than returned at once (e.g. in a response message with a - // repeated field), as the rectangle may cover a large area and contain a - // huge number of features. - rpc ListFeatures(Rectangle) returns (stream Feature) {} -``` - -- A *client-side streaming RPC* where the client writes a sequence of messages - and sends them to the server, again using a provided stream. Once the client - has finished writing the messages, it waits for the server to read them all - and return its response. You specify a client-side streaming method by placing - the `stream` keyword before the *request* type. - -```protobuf - // Accepts a stream of Points on a route being traversed, returning a - // RouteSummary when traversal is completed. - rpc RecordRoute(stream Point) returns (RouteSummary) {} -``` - -- A *bidirectional streaming RPC* where both sides send a sequence of messages - using a read-write stream. The two streams operate independently, so clients - and servers can read and write in whatever order they like: for example, the - server could wait to receive all the client messages before writing its - responses, or it could alternately read a message then write a message, or - some other combination of reads and writes. The order of messages in each - stream is preserved. You specify this type of method by placing the `stream` - keyword before both the request and the response. - -```protobuf - // Accepts a stream of RouteNotes sent while a route is being traversed, - // while receiving other RouteNotes (e.g. from other users). - rpc RouteChat(stream RouteNote) returns (stream RouteNote) {} -``` - -Our `.proto` file also contains protocol buffer message type definitions for all -the request and response types used in our service methods - for example, here's -the `Point` message type: - -```protobuf -// Points are represented as latitude-longitude pairs in the E7 representation -// (degrees multiplied by 10**7 and rounded to the nearest integer). -// Latitudes should be in the range +/- 90 degrees and longitude should be in -// the range +/- 180 degrees (inclusive). -message Point { - int32 latitude = 1; - int32 longitude = 2; -} -``` - -## Generating client and server code - -Next we need to generate the gRPC client and server interfaces from our `.proto` -service definition. We do this using the protocol buffer compiler `protoc` with -a special gRPC C++ plugin. - -For simplicity, we've provided a [Makefile](route_guide/Makefile) that runs -`protoc` for you with the appropriate plugin, input, and output (if you want to -run this yourself, make sure you've installed protoc and followed the gRPC code -[installation instructions](../../BUILDING.md) first): - -```shell -$ make route_guide.grpc.pb.cc route_guide.pb.cc -``` - -which actually runs: - -```shell -$ protoc -I ../../protos --grpc_out=. --plugin=protoc-gen-grpc=`which grpc_cpp_plugin` ../../protos/route_guide.proto -$ protoc -I ../../protos --cpp_out=. ../../protos/route_guide.proto -``` - -Running this command generates the following files in your current directory: -- `route_guide.pb.h`, the header which declares your generated message classes -- `route_guide.pb.cc`, which contains the implementation of your message classes -- `route_guide.grpc.pb.h`, the header which declares your generated service - classes -- `route_guide.grpc.pb.cc`, which contains the implementation of your service - classes - -These contain: -- All the protocol buffer code to populate, serialize, and retrieve our request - and response message types -- A class called `RouteGuide` that contains - - a remote interface type (or *stub*) for clients to call with the methods - defined in the `RouteGuide` service. - - two abstract interfaces for servers to implement, also with the methods - defined in the `RouteGuide` service. - - - -## Creating the server - -First let's look at how we create a `RouteGuide` server. If you're only -interested in creating gRPC clients, you can skip this section and go straight -to [Creating the client](#client) (though you might find it interesting -anyway!). - -There are two parts to making our `RouteGuide` service do its job: -- Implementing the service interface generated from our service definition: - doing the actual "work" of our service. -- Running a gRPC server to listen for requests from clients and return the - service responses. - -You can find our example `RouteGuide` server in -[route_guide/route_guide_server.cc](route_guide/route_guide_server.cc). Let's -take a closer look at how it works. - -### Implementing RouteGuide - -As you can see, our server has a `RouteGuideImpl` class that implements the -generated `RouteGuide::Service` interface: - -```cpp -class RouteGuideImpl final : public RouteGuide::Service { -... -} -``` -In this case we're implementing the *synchronous* version of `RouteGuide`, which -provides our default gRPC server behaviour. It's also possible to implement an -asynchronous interface, `RouteGuide::AsyncService`, which allows you to further -customize your server's threading behaviour, though we won't look at this in -this tutorial. - -`RouteGuideImpl` implements all our service methods. Let's look at the simplest -type first, `GetFeature`, which just gets a `Point` from the client and returns -the corresponding feature information from its database in a `Feature`. - -```cpp - Status GetFeature(ServerContext* context, const Point* point, - Feature* feature) override { - feature->set_name(GetFeatureName(*point, feature_list_)); - feature->mutable_location()->CopyFrom(*point); - return Status::OK; - } -``` - -The method is passed a context object for the RPC, the client's `Point` protocol -buffer request, and a `Feature` protocol buffer to fill in with the response -information. In the method we populate the `Feature` with the appropriate -information, and then `return` with an `OK` status to tell gRPC that we've -finished dealing with the RPC and that the `Feature` can be returned to the -client. - -Now let's look at something a bit more complicated - a streaming RPC. -`ListFeatures` is a server-side streaming RPC, so we need to send back multiple -`Feature`s to our client. - -```cpp -Status ListFeatures(ServerContext* context, const Rectangle* rectangle, - ServerWriter* writer) override { - auto lo = rectangle->lo(); - auto hi = rectangle->hi(); - long left = std::min(lo.longitude(), hi.longitude()); - long right = std::max(lo.longitude(), hi.longitude()); - long top = std::max(lo.latitude(), hi.latitude()); - long bottom = std::min(lo.latitude(), hi.latitude()); - for (const Feature& f : feature_list_) { - if (f.location().longitude() >= left && - f.location().longitude() <= right && - f.location().latitude() >= bottom && - f.location().latitude() <= top) { - writer->Write(f); - } - } - return Status::OK; -} -``` - -As you can see, instead of getting simple request and response objects in our -method parameters, this time we get a request object (the `Rectangle` in which -our client wants to find `Feature`s) and a special `ServerWriter` object. In the -method, we populate as many `Feature` objects as we need to return, writing them -to the `ServerWriter` using its `Write()` method. Finally, as in our simple RPC, -we `return Status::OK` to tell gRPC that we've finished writing responses. - -If you look at the client-side streaming method `RecordRoute` you'll see it's -quite similar, except this time we get a `ServerReader` instead of a request -object and a single response. We use the `ServerReader`s `Read()` method to -repeatedly read in our client's requests to a request object (in this case a -`Point`) until there are no more messages: the server needs to check the return -value of `Read()` after each call. If `true`, the stream is still good and it -can continue reading; if `false` the message stream has ended. - -```cpp -while (stream->Read(&point)) { - ...//process client input -} -``` -Finally, let's look at our bidirectional streaming RPC `RouteChat()`. - -```cpp - Status RouteChat(ServerContext* context, - ServerReaderWriter* stream) override { - std::vector received_notes; - RouteNote note; - while (stream->Read(¬e)) { - for (const RouteNote& n : received_notes) { - if (n.location().latitude() == note.location().latitude() && - n.location().longitude() == note.location().longitude()) { - stream->Write(n); - } - } - received_notes.push_back(note); - } - - return Status::OK; - } -``` - -This time we get a `ServerReaderWriter` that can be used to read *and* write -messages. The syntax for reading and writing here is exactly the same as for our -client-streaming and server-streaming methods. Although each side will always -get the other's messages in the order they were written, both the client and -server can read and write in any order — the streams operate completely -independently. - -### Starting the server - -Once we've implemented all our methods, we also need to start up a gRPC server -so that clients can actually use our service. The following snippet shows how we -do this for our `RouteGuide` service: - -```cpp -void RunServer(const std::string& db_path) { - std::string server_address("0.0.0.0:50051"); - RouteGuideImpl service(db_path); - - ServerBuilder builder; - builder.AddListeningPort(server_address, grpc::InsecureServerCredentials()); - builder.RegisterService(&service); - std::unique_ptr server(builder.BuildAndStart()); - std::cout << "Server listening on " << server_address << std::endl; - server->Wait(); -} -``` -As you can see, we build and start our server using a `ServerBuilder`. To do this, we: - -1. Create an instance of our service implementation class `RouteGuideImpl`. -1. Create an instance of the factory `ServerBuilder` class. -1. Specify the address and port we want to use to listen for client requests - using the builder's `AddListeningPort()` method. -1. Register our service implementation with the builder. -1. Call `BuildAndStart()` on the builder to create and start an RPC server for - our service. -1. Call `Wait()` on the server to do a blocking wait until process is killed or - `Shutdown()` is called. - - -## Creating the client - -In this section, we'll look at creating a C++ client for our `RouteGuide` -service. You can see our complete example client code in -[route_guide/route_guide_client.cc](route_guide/route_guide_client.cc). - -### Creating a stub - -To call service methods, we first need to create a *stub*. - -First we need to create a gRPC *channel* for our stub, specifying the server -address and port we want to connect to without SSL: - -```cpp -grpc::CreateChannel("localhost:50051", grpc::InsecureChannelCredentials()); -``` - -Now we can use the channel to create our stub using the `NewStub` method -provided in the `RouteGuide` class we generated from our `.proto`. - -```cpp -public: - RouteGuideClient(std::shared_ptr channel, const std::string& db) - : stub_(RouteGuide::NewStub(channel)) { - ... - } -``` - -### Calling service methods - -Now let's look at how we call our service methods. Note that in this tutorial -we're calling the *blocking/synchronous* versions of each method: this means -that the RPC call waits for the server to respond, and will either return a -response or raise an exception. - -#### Simple RPC - -Calling the simple RPC `GetFeature` is nearly as straightforward as calling a -local method. - -```cpp - Point point; - Feature feature; - point = MakePoint(409146138, -746188906); - GetOneFeature(point, &feature); - -... - - bool GetOneFeature(const Point& point, Feature* feature) { - ClientContext context; - Status status = stub_->GetFeature(&context, point, feature); - ... - } -``` - -As you can see, we create and populate a request protocol buffer object (in our -case `Point`), and create a response protocol buffer object for the server to -fill in. We also create a `ClientContext` object for our call - you can -optionally set RPC configuration values on this object, such as deadlines, -though for now we'll use the default settings. Note that you cannot reuse this -object between calls. Finally, we call the method on the stub, passing it the -context, request, and response. If the method returns `OK`, then we can read the -response information from the server from our response object. - -```cpp -std::cout << "Found feature called " << feature->name() << " at " - << feature->location().latitude()/kCoordFactor_ << ", " - << feature->location().longitude()/kCoordFactor_ << std::endl; -``` - -#### Streaming RPCs - -Now let's look at our streaming methods. If you've already read [Creating the -server](#server) some of this may look very familiar - streaming RPCs are -implemented in a similar way on both sides. Here's where we call the server-side -streaming method `ListFeatures`, which returns a stream of geographical -`Feature`s: - -```cpp -std::unique_ptr > reader( - stub_->ListFeatures(&context, rect)); -while (reader->Read(&feature)) { - std::cout << "Found feature called " - << feature.name() << " at " - << feature.location().latitude()/kCoordFactor_ << ", " - << feature.location().longitude()/kCoordFactor_ << std::endl; -} -Status status = reader->Finish(); -``` - -Instead of passing the method a context, request, and response, we pass it a -context and request and get a `ClientReader` object back. The client can use the -`ClientReader` to read the server's responses. We use the `ClientReader`s -`Read()` method to repeatedly read in the server's responses to a response -protocol buffer object (in this case a `Feature`) until there are no more -messages: the client needs to check the return value of `Read()` after each -call. If `true`, the stream is still good and it can continue reading; if -`false` the message stream has ended. Finally, we call `Finish()` on the stream -to complete the call and get our RPC status. - -The client-side streaming method `RecordRoute` is similar, except there we pass -the method a context and response object and get back a `ClientWriter`. - -```cpp - std::unique_ptr > writer( - stub_->RecordRoute(&context, &stats)); - for (int i = 0; i < kPoints; i++) { - const Feature& f = feature_list_[feature_distribution(generator)]; - std::cout << "Visiting point " - << f.location().latitude()/kCoordFactor_ << ", " - << f.location().longitude()/kCoordFactor_ << std::endl; - if (!writer->Write(f.location())) { - // Broken stream. - break; - } - std::this_thread::sleep_for(std::chrono::milliseconds( - delay_distribution(generator))); - } - writer->WritesDone(); - Status status = writer->Finish(); - if (status.IsOk()) { - std::cout << "Finished trip with " << stats.point_count() << " points\n" - << "Passed " << stats.feature_count() << " features\n" - << "Travelled " << stats.distance() << " meters\n" - << "It took " << stats.elapsed_time() << " seconds" - << std::endl; - } else { - std::cout << "RecordRoute rpc failed." << std::endl; - } -``` - -Once we've finished writing our client's requests to the stream using `Write()`, -we need to call `WritesDone()` on the stream to let gRPC know that we've -finished writing, then `Finish()` to complete the call and get our RPC status. -If the status is `OK`, our response object that we initially passed to -`RecordRoute()` will be populated with the server's response. - -Finally, let's look at our bidirectional streaming RPC `RouteChat()`. In this -case, we just pass a context to the method and get back a `ClientReaderWriter`, -which we can use to both write and read messages. - -```cpp -std::shared_ptr > stream( - stub_->RouteChat(&context)); -``` - -The syntax for reading and writing here is exactly the same as for our -client-streaming and server-streaming methods. Although each side will always -get the other's messages in the order they were written, both the client and -server can read and write in any order — the streams operate completely -independently. - -## Try it out! - -Build client and server: -```shell -$ make -``` -Run the server, which will listen on port 50051: -```shell -$ ./route_guide_server -``` -Run the client (in a different terminal): -```shell -$ ./route_guide_client -``` +The content of this page has moved to [gRPC Basics - C++](https://grpc.io/docs/tutorials/basic/cpp). From df5b521e079e250fab89fb95a12a372baedb0200 Mon Sep 17 00:00:00 2001 From: Patrice Chalin Date: Thu, 9 Apr 2020 16:56:10 -0400 Subject: [PATCH 410/758] Ignore `cmake/build/` anywhere in the repo Ignore `cmake/build/` anywhere in the repo, not just at the root level. This is helpful when working on the examples. --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index bd9a5139fe2..383fc25b360 100644 --- a/.gitignore +++ b/.gitignore @@ -136,7 +136,7 @@ bm_diff_old/ bm_*.json # cmake build files -/cmake/build +**/cmake/build/ # Visual Studio Code artifacts .vscode/* From 33082023e936d03f89ed2226d6617208449e412c Mon Sep 17 00:00:00 2001 From: Patrice Chalin Date: Thu, 9 Apr 2020 17:00:33 -0400 Subject: [PATCH 411/758] C++ examples README cleanup Contributes to https://github.com/grpc/grpc.io/issues/180. cc @ejona86 @jtattermusch @srini100 --- examples/cpp/README.md | 51 +++++++++--------------------------------- 1 file changed, 10 insertions(+), 41 deletions(-) diff --git a/examples/cpp/README.md b/examples/cpp/README.md index 0e358bf9a22..a0ff629b1a0 100644 --- a/examples/cpp/README.md +++ b/examples/cpp/README.md @@ -1,44 +1,13 @@ -# gRPC in 3 minutes (C++) +# gRPC C++ Examples -## Installation +- **[Hello World][]!** Eager to run your first gRPC example? You'll find + instructions for building gRPC and running a simple "Hello World" app in [Quick Start][]. +- **[Route Guide][].** For a basic tutorial on gRPC see [gRPC Basics][]. -To install gRPC on your system, follow the instructions to build from source -[here](../../BUILDING.md). This also installs the protocol buffer compiler -`protoc` (if you don't have it already), and the C++ gRPC plugin for `protoc`. +For information about the other examples in this directory, see their respective +README files. -## Hello C++ gRPC! - -Here's how to build and run the C++ implementation of the [Hello -World](../protos/helloworld.proto) example used in [Getting started](..). - -### Client and server implementations - -The client implementation is at [greeter_client.cc](helloworld/greeter_client.cc). - -The server implementation is at [greeter_server.cc](helloworld/greeter_server.cc). - -### Try it! -Build client and server: - -```sh -$ make -``` - -Run the server, which will listen on port 50051: - -```sh -$ ./greeter_server -``` - -Run the client (in a different terminal): - -```sh -$ ./greeter_client -``` - -If things go smoothly, you will see the "Greeter received: Hello world" in the -client side output. - -## Tutorial - -You can find a more detailed tutorial in [gRPC Basics: C++](cpptutorial.md) +[gRPC Basics]: https://grpc.io/docs/tutorials/basic/cpp +[Hello World]: helloworld +[Quick Start]: https://grpc.io/docs/quickstart/cpp +[Route Guide]: route_guide From a3714f5b08b5b9a164d89ba93505b8d0c084167c Mon Sep 17 00:00:00 2001 From: Patrice Chalin Date: Thu, 9 Apr 2020 17:20:48 -0400 Subject: [PATCH 412/758] C++ Hello World: refer reader to Quick Start --- examples/cpp/helloworld/README.md | 266 +----------------------------- 1 file changed, 4 insertions(+), 262 deletions(-) diff --git a/examples/cpp/helloworld/README.md b/examples/cpp/helloworld/README.md index 71718645645..e13c83281a7 100644 --- a/examples/cpp/helloworld/README.md +++ b/examples/cpp/helloworld/README.md @@ -1,264 +1,6 @@ -# gRPC C++ Hello World Tutorial +# gRPC C++ Hello World Example -### Install gRPC -Make sure you have installed gRPC on your system. Follow the -[BUILDING.md](../../../BUILDING.md) instructions. +You can find a complete set of instructions for building gRPC and running the +Hello World app in the [C++ Quick Start][]. -### Get the tutorial source code - -The example code for this and our other examples lives in the `examples` -directory. Clone this repository at the [latest stable release tag](https://github.com/grpc/grpc/releases) -to your local machine by running the following command: - - -```sh -$ git clone -b RELEASE_TAG_HERE https://github.com/grpc/grpc -``` - -Change your current directory to examples/cpp/helloworld - -```sh -$ cd examples/cpp/helloworld/ -``` - -### Defining a service - -The first step in creating our example is to define a *service*: an RPC -service specifies the methods that can be called remotely with their parameters -and return types. As you saw in the -[overview](#protocolbuffers) above, gRPC does this using [protocol -buffers](https://developers.google.com/protocol-buffers/docs/overview). We -use the protocol buffers interface definition language (IDL) to define our -service methods, and define the parameters and return -types as protocol buffer message types. Both the client and the -server use interface code generated from the service definition. - -Here's our example service definition, defined using protocol buffers IDL in -[helloworld.proto](../../protos/helloworld.proto). The `Greeting` -service has one method, `hello`, that lets the server receive a single -`HelloRequest` -message from the remote client containing the user's name, then send back -a greeting in a single `HelloReply`. This is the simplest type of RPC you -can specify in gRPC - we'll look at some other types later in this document. - -```protobuf -syntax = "proto3"; - -option java_package = "ex.grpc"; - -package helloworld; - -// The greeting service definition. -service Greeter { - // Sends a greeting - rpc SayHello (HelloRequest) returns (HelloReply) {} -} - -// The request message containing the user's name. -message HelloRequest { - string name = 1; -} - -// The response message containing the greetings -message HelloReply { - string message = 1; -} - -``` - - -### Generating gRPC code - -Once we've defined our service, we use the protocol buffer compiler -`protoc` to generate the special client and server code we need to create -our application. The generated code contains both stub code for clients to -use and an abstract interface for servers to implement, both with the method -defined in our `Greeting` service. - -To generate the client and server side interfaces: - -```sh -$ make helloworld.grpc.pb.cc helloworld.pb.cc -``` -Which internally invokes the proto-compiler as: - -```sh -$ protoc -I ../../protos/ --grpc_out=. --plugin=protoc-gen-grpc=grpc_cpp_plugin ../../protos/helloworld.proto -$ protoc -I ../../protos/ --cpp_out=. ../../protos/helloworld.proto -``` - -### Writing a client - -- Create a channel. A channel is a logical connection to an endpoint. A gRPC - channel can be created with the target address, credentials to use and - arguments as follows - - ```cpp - auto channel = CreateChannel("localhost:50051", InsecureChannelCredentials()); - ``` - -- Create a stub. A stub implements the rpc methods of a service and in the - generated code, a method is provided to create a stub with a channel: - - ```cpp - auto stub = helloworld::Greeter::NewStub(channel); - ``` - -- Make a unary rpc, with `ClientContext` and request/response proto messages. - - ```cpp - ClientContext context; - HelloRequest request; - request.set_name("hello"); - HelloReply reply; - Status status = stub->SayHello(&context, request, &reply); - ``` - -- Check returned status and response. - - ```cpp - if (status.ok()) { - // check reply.message() - } else { - // rpc failed. - } - ``` - -For a working example, refer to [greeter_client.cc](greeter_client.cc). - -### Writing a server - -- Implement the service interface - - ```cpp - class GreeterServiceImpl final : public Greeter::Service { - Status SayHello(ServerContext* context, const HelloRequest* request, - HelloReply* reply) override { - std::string prefix("Hello "); - reply->set_message(prefix + request->name()); - return Status::OK; - } - }; - - ``` - -- Build a server exporting the service - - ```cpp - GreeterServiceImpl service; - ServerBuilder builder; - builder.AddListeningPort("0.0.0.0:50051", grpc::InsecureServerCredentials()); - builder.RegisterService(&service); - std::unique_ptr server(builder.BuildAndStart()); - ``` - -For a working example, refer to [greeter_server.cc](greeter_server.cc). - -### Writing asynchronous client and server - -gRPC uses `CompletionQueue` API for asynchronous operations. The basic work flow -is -- bind a `CompletionQueue` to a rpc call -- do something like a read or write, present with a unique `void*` tag -- call `CompletionQueue::Next` to wait for operations to complete. If a tag - appears, it indicates that the corresponding operation is complete. - -#### Async client - -The channel and stub creation code is the same as the sync client. - -- Initiate the rpc and create a handle for the rpc. Bind the rpc to a - `CompletionQueue`. - - ```cpp - CompletionQueue cq; - auto rpc = stub->AsyncSayHello(&context, request, &cq); - ``` - -- Ask for reply and final status, with a unique tag - - ```cpp - Status status; - rpc->Finish(&reply, &status, (void*)1); - ``` - -- Wait for the completion queue to return the next tag. The reply and status are - ready once the tag passed into the corresponding `Finish()` call is returned. - - ```cpp - void* got_tag; - bool ok = false; - cq.Next(&got_tag, &ok); - if (ok && got_tag == (void*)1) { - // check reply and status - } - ``` - -For a working example, refer to [greeter_async_client.cc](greeter_async_client.cc). - -#### Async server - -The server implementation requests a rpc call with a tag and then wait for the -completion queue to return the tag. The basic flow is - -- Build a server exporting the async service - - ```cpp - helloworld::Greeter::AsyncService service; - ServerBuilder builder; - builder.AddListeningPort("0.0.0.0:50051", InsecureServerCredentials()); - builder.RegisterService(&service); - auto cq = builder.AddCompletionQueue(); - auto server = builder.BuildAndStart(); - ``` - -- Request one rpc - - ```cpp - ServerContext context; - HelloRequest request; - ServerAsyncResponseWriter responder; - service.RequestSayHello(&context, &request, &responder, &cq, &cq, (void*)1); - ``` - -- Wait for the completion queue to return the tag. The context, request and - responder are ready once the tag is retrieved. - - ```cpp - HelloReply reply; - Status status; - void* got_tag; - bool ok = false; - cq.Next(&got_tag, &ok); - if (ok && got_tag == (void*)1) { - // set reply and status - responder.Finish(reply, status, (void*)2); - } - ``` - -- Wait for the completion queue to return the tag. The rpc is finished when the - tag is back. - - ```cpp - void* got_tag; - bool ok = false; - cq.Next(&got_tag, &ok); - if (ok && got_tag == (void*)2) { - // clean up - } - ``` - -To handle multiple rpcs, the async server creates an object `CallData` to -maintain the state of each rpc and use the address of it as the unique tag. For -simplicity the server only uses one completion queue for all events, and runs a -main loop in `HandleRpcs` to query the queue. - -For a working example, refer to [greeter_async_server.cc](greeter_async_server.cc). - -#### Flags for the client - -```sh -./greeter_client --target="a target string used to create a GRPC client channel" -``` - -The Default value for --target is "localhost:50051". +[C++ Quick Start]: https://grpc.io/docs/quickstart/cpp From 309c8e65f4dc9fcf2a8a355f8dfed03d1061a0cf Mon Sep 17 00:00:00 2001 From: Taras Galkovskyi Date: Thu, 9 Apr 2020 21:39:08 +0000 Subject: [PATCH 413/758] declare alts support for python interop client/server --- .../grpcio_tests/tests/interop/client.py | 39 +++++++++++-------- .../grpcio_tests/tests/interop/server.py | 11 ++++++ .../grpcio_tests/tests_aio/interop/client.py | 2 +- .../grpcio_tests/tests_aio/interop/server.py | 8 ++-- tools/run_tests/run_interop_tests.py | 4 +- 5 files changed, 42 insertions(+), 22 deletions(-) diff --git a/src/python/grpcio_tests/tests/interop/client.py b/src/python/grpcio_tests/tests/interop/client.py index 71b2fecef18..6537413dbdd 100644 --- a/src/python/grpcio_tests/tests/interop/client.py +++ b/src/python/grpcio_tests/tests/interop/client.py @@ -43,6 +43,10 @@ def parse_interop_client_args(): default=False, type=resources.parse_bool, help='require a secure connection') + parser.add_argument('--use_alts', + default=False, + type=resources.parse_bool, + help='require an ALTS secure connection') parser.add_argument('--use_test_ca', default=False, type=resources.parse_bool, @@ -85,22 +89,25 @@ def _create_call_credentials(args): def get_secure_channel_parameters(args): call_credentials = _create_call_credentials(args) - if args.use_test_ca: - root_certificates = resources.test_root_certificates() - else: - root_certificates = None # will load default roots. - - channel_credentials = grpc.ssl_channel_credentials(root_certificates) - if call_credentials is not None: - channel_credentials = grpc.composite_channel_credentials( - channel_credentials, call_credentials) - channel_opts = None - if args.server_host_override: - channel_opts = (( - 'grpc.ssl_target_name_override', - args.server_host_override, - ),) + if args.use_tls: + if args.use_test_ca: + root_certificates = resources.test_root_certificates() + else: + root_certificates = None # will load default roots. + + channel_credentials = grpc.ssl_channel_credentials(root_certificates) + if call_credentials is not None: + channel_credentials = grpc.composite_channel_credentials( + channel_credentials, call_credentials) + + if args.server_host_override: + channel_opts = (( + 'grpc.ssl_target_name_override', + args.server_host_override, + ),) + else args.use_alts: + channel_credentials = grpc.alts_channel_credentials() return channel_credentials, channel_opts @@ -108,7 +115,7 @@ def get_secure_channel_parameters(args): def _create_channel(args): target = '{}:{}'.format(args.server_host, args.server_port) - if args.use_tls: + if args.use_tls or args.use_alts: channel_credentials, options = get_secure_channel_parameters(args) return grpc.secure_channel(target, channel_credentials, options) else: diff --git a/src/python/grpcio_tests/tests/interop/server.py b/src/python/grpcio_tests/tests/interop/server.py index 0a0061f5b1c..852b13c7b94 100644 --- a/src/python/grpcio_tests/tests/interop/server.py +++ b/src/python/grpcio_tests/tests/interop/server.py @@ -38,6 +38,10 @@ def parse_interop_server_arguments(): default=False, type=resources.parse_bool, help='require a secure connection') + parser.add_argument('--use_alts', + default=False, + type=resources.parse_bool, + help='require an ALTS connection') return parser.parse_args() @@ -47,6 +51,10 @@ def get_server_credentials(): return grpc.ssl_server_credentials(((private_key, certificate_chain),)) +def get_alts_server_credentials(): + return grpc.alts_server_credentials() + + def serve(): args = parse_interop_server_arguments() @@ -56,6 +64,9 @@ def serve(): if args.use_tls: credentials = get_server_credentials() server.add_secure_port('[::]:{}'.format(args.port), credentials) + elif args.use_alts: + credentials = get_alts_server_credentials() + server.add_secure_port('[::]:{}'.format(args.port), credentials) else: server.add_insecure_port('[::]:{}'.format(args.port)) diff --git a/src/python/grpcio_tests/tests_aio/interop/client.py b/src/python/grpcio_tests/tests_aio/interop/client.py index 89793f94054..7731f3bd6eb 100644 --- a/src/python/grpcio_tests/tests_aio/interop/client.py +++ b/src/python/grpcio_tests/tests_aio/interop/client.py @@ -30,7 +30,7 @@ _LOGGER.setLevel(logging.DEBUG) def _create_channel(args): target = f'{args.server_host}:{args.server_port}' - if args.use_tls: + if args.use_tls or args.use_alts: channel_credentials, options = interop_client_lib.get_secure_channel_parameters( args) return aio.secure_channel(target, channel_credentials, options) diff --git a/src/python/grpcio_tests/tests_aio/interop/server.py b/src/python/grpcio_tests/tests_aio/interop/server.py index 06a6c51d13a..ae5ee95769e 100644 --- a/src/python/grpcio_tests/tests_aio/interop/server.py +++ b/src/python/grpcio_tests/tests_aio/interop/server.py @@ -30,9 +30,11 @@ _LOGGER.setLevel(logging.DEBUG) async def serve(): args = interop_server_lib.parse_interop_server_arguments() - if args.use_tls: - credentials = interop_server_lib.get_server_credentials() - + if args.use_tls or args.use_alts: + if args.use_tls: + credentials = interop_server_lib.get_server_credentials() + else: + credentials = interop_server_lib.get_alts_server_credentials() address, server = await _test_server.start_test_server( port=args.port, secure=True, server_credentials=credentials) else: diff --git a/tools/run_tests/run_interop_tests.py b/tools/run_tests/run_interop_tests.py index d183c5b4b47..63920f78f31 100755 --- a/tools/run_tests/run_interop_tests.py +++ b/tools/run_tests/run_interop_tests.py @@ -786,9 +786,9 @@ _LANGUAGES_WITH_HTTP2_CLIENTS_FOR_HTTP2_SERVER_TEST_CASES = [ 'java', 'go', 'python', 'c++' ] -_LANGUAGES_FOR_ALTS_TEST_CASES = ['java', 'go', 'c++'] +_LANGUAGES_FOR_ALTS_TEST_CASES = ['java', 'go', 'c++', 'python'] -_SERVERS_FOR_ALTS_TEST_CASES = ['java', 'go', 'c++'] +_SERVERS_FOR_ALTS_TEST_CASES = ['java', 'go', 'c++', 'python'] _TRANSPORT_SECURITY_OPTIONS = ['tls', 'alts', 'insecure'] From ed04792ac54865ebe13ed57d9d66dacaca240dd6 Mon Sep 17 00:00:00 2001 From: Taras Galkovskyi Date: Thu, 9 Apr 2020 22:36:58 +0000 Subject: [PATCH 414/758] unify interop alts credentials use --- src/python/grpcio_tests/tests/interop/server.py | 16 +++++++--------- .../grpcio_tests/tests_aio/interop/server.py | 5 +---- 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/src/python/grpcio_tests/tests/interop/server.py b/src/python/grpcio_tests/tests/interop/server.py index 852b13c7b94..e389533aa85 100644 --- a/src/python/grpcio_tests/tests/interop/server.py +++ b/src/python/grpcio_tests/tests/interop/server.py @@ -46,13 +46,14 @@ def parse_interop_server_arguments(): def get_server_credentials(): - private_key = resources.private_key() - certificate_chain = resources.certificate_chain() - return grpc.ssl_server_credentials(((private_key, certificate_chain),)) + if args.use_tls: + private_key = resources.private_key() + certificate_chain = resources.certificate_chain() + return grpc.ssl_server_credentials(((private_key, certificate_chain),)) + else: + return grpc.alts_server_credentials() -def get_alts_server_credentials(): - return grpc.alts_server_credentials() def serve(): @@ -61,12 +62,9 @@ def serve(): server = test_common.test_server() test_pb2_grpc.add_TestServiceServicer_to_server(service.TestService(), server) - if args.use_tls: + if args.use_tls or args.use_alts: credentials = get_server_credentials() server.add_secure_port('[::]:{}'.format(args.port), credentials) - elif args.use_alts: - credentials = get_alts_server_credentials() - server.add_secure_port('[::]:{}'.format(args.port), credentials) else: server.add_insecure_port('[::]:{}'.format(args.port)) diff --git a/src/python/grpcio_tests/tests_aio/interop/server.py b/src/python/grpcio_tests/tests_aio/interop/server.py index ae5ee95769e..82c52cebf0c 100644 --- a/src/python/grpcio_tests/tests_aio/interop/server.py +++ b/src/python/grpcio_tests/tests_aio/interop/server.py @@ -31,10 +31,7 @@ async def serve(): args = interop_server_lib.parse_interop_server_arguments() if args.use_tls or args.use_alts: - if args.use_tls: - credentials = interop_server_lib.get_server_credentials() - else: - credentials = interop_server_lib.get_alts_server_credentials() + credentials = interop_server_lib.get_server_credentials() address, server = await _test_server.start_test_server( port=args.port, secure=True, server_credentials=credentials) else: From 802368945f09b8c7fee493ebebe8a7a86eba6f65 Mon Sep 17 00:00:00 2001 From: Muxi Yan Date: Thu, 9 Apr 2020 17:03:51 -0700 Subject: [PATCH 415/758] gzip generates the same content for each build_projects --- src/objective-c/BoringSSL-GRPC.podspec | 2 +- templates/src/objective-c/BoringSSL-GRPC.podspec.template | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/objective-c/BoringSSL-GRPC.podspec b/src/objective-c/BoringSSL-GRPC.podspec index cf93c7ed58d..8f33cab82c5 100644 --- a/src/objective-c/BoringSSL-GRPC.podspec +++ b/src/objective-c/BoringSSL-GRPC.podspec @@ -213,7 +213,7 @@ Pod::Spec.new do |s| # /src/boringssl/boringssl_prefix_symbols.h. Here we decode the content and inject the header to # the correct location in BoringSSL. base64 -D < src/include/openssl/boringssl_prefix_symbols.h - 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 EOF # We are renaming openssl to openssl_grpc so that there is no conflict with openssl if it exists diff --git a/templates/src/objective-c/BoringSSL-GRPC.podspec.template b/templates/src/objective-c/BoringSSL-GRPC.podspec.template index 9401d9b3efc..15ff707a6a4 100644 --- a/templates/src/objective-c/BoringSSL-GRPC.podspec.template +++ b/templates/src/objective-c/BoringSSL-GRPC.podspec.template @@ -9,7 +9,7 @@ import gzip, shutil, os, base64 # TODO(mxyan): move to python3 style gzip compression when possible - with open('src/boringssl/boringssl_prefix_symbols.h', 'rb') as f_in, gzip.open('src/boringssl/boringssl_prefix_symbols.h.gz', 'wb') as f_out: + with open('src/boringssl/boringssl_prefix_symbols.h', 'rb') as f_in, gzip.GzipFile('src/boringssl/boringssl_prefix_symbols.h.gz', 'w', mtime=0.0) as f_out: shutil.copyfileobj(f_in, f_out) with open('src/boringssl/boringssl_prefix_symbols.h.gz', 'rb') as f_in: prefix_gz = f_in.read() From 44bc3b9bd6c030f9ed5983b682ae51e454bf1026 Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Thu, 9 Apr 2020 22:45:08 -0700 Subject: [PATCH 416/758] Reviewer comments --- .../message_compress_filter.cc | 186 +++++++++--------- 1 file changed, 94 insertions(+), 92 deletions(-) diff --git a/src/core/ext/filters/http/message_compress/message_compress_filter.cc b/src/core/ext/filters/http/message_compress/message_compress_filter.cc index fcee54ebfe3..b962c99e1d5 100644 --- a/src/core/ext/filters/http/message_compress/message_compress_filter.cc +++ b/src/core/ext/filters/http/message_compress/message_compress_filter.cc @@ -21,6 +21,8 @@ #include #include +#include "absl/types/optional.h" + #include #include #include @@ -44,7 +46,7 @@ namespace { class ChannelData { public: - ChannelData(grpc_channel_element_args* args) { + explicit ChannelData(grpc_channel_element_args* args) { // Get the enabled and the default algorithms from channel args. enabled_compression_algorithms_bitset_ = grpc_channel_args_compression_algorithm_get_states(args->channel_args); @@ -101,8 +103,8 @@ class ChannelData { class CallData { public: CallData(grpc_call_element* elem, const grpc_call_element_args& args) - : elem_(elem), call_combiner_(args.call_combiner) { - ChannelData* channeld = static_cast(elem_->channel_data); + : call_combiner_(args.call_combiner) { + ChannelData* channeld = static_cast(elem->channel_data); // The call's message compression algorithm is set to channel's default // setting. It can be overridden later by initial metadata. if (GPR_LIKELY(GPR_BITGET(channeld->enabled_compression_algorithms_bitset(), @@ -112,7 +114,7 @@ class CallData { channeld->default_compression_algorithm()); } GRPC_CLOSURE_INIT(&start_send_message_batch_in_call_combiner_, - StartSendMessageBatch, this, grpc_schedule_on_exec_ctx); + StartSendMessageBatch, elem, grpc_schedule_on_exec_ctx); } ~CallData() { @@ -122,28 +124,29 @@ class CallData { GRPC_ERROR_UNREF(cancel_error_); } - static void CompressStartTransportStreamOpBatch( + void CompressStartTransportStreamOpBatch( grpc_call_element* elem, grpc_transport_stream_op_batch* batch); + private: bool SkipMessageCompression(); - void InitializeState(); + void InitializeState(grpc_call_element* elem); - grpc_error* ProcessSendInitialMetadata(grpc_metadata_batch* initial_metadata); + grpc_error* ProcessSendInitialMetadata(grpc_call_element* elem, + grpc_metadata_batch* initial_metadata); // Methods for processing a send_message batch - static void StartSendMessageBatch(void* arg, grpc_error* unused); - static void OnSendMessageNextDone(void* arg, grpc_error* error); + static void StartSendMessageBatch(void* elem_arg, grpc_error* unused); + static void OnSendMessageNextDone(void* elem_arg, grpc_error* error); grpc_error* PullSliceFromSendMessage(); - void ContinueReadingSendMessage(); - void FinishSendMessage(); - void SendMessageBatchContinue(); - static void FailSendMessageBatchInCallCombiner(void* arg, grpc_error* error); + void ContinueReadingSendMessage(grpc_call_element* elem); + void FinishSendMessage(grpc_call_element* elem); + void SendMessageBatchContinue(grpc_call_element* elem); + static void FailSendMessageBatchInCallCombiner(void* calld_arg, + grpc_error* error); - static void SendMessageOnComplete(void* arg, grpc_error* error); + static void SendMessageOnComplete(void* calld_arg, grpc_error* error); - private: - grpc_call_element* elem_ = nullptr; - grpc_core::CallCombiner* call_combiner_ = nullptr; + grpc_core::CallCombiner* call_combiner_; grpc_message_compression_algorithm message_compression_algorithm_ = GRPC_MESSAGE_COMPRESS_NONE; grpc_error* cancel_error_ = GRPC_ERROR_NONE; @@ -160,8 +163,7 @@ class CallData { grpc_linked_mdelem accept_encoding_storage_; grpc_linked_mdelem accept_stream_encoding_storage_; grpc_slice_buffer slices_; /**< Buffers up input slices to be compressed */ - grpc_core::ManualConstructor - replacement_stream_; + absl::optional replacement_stream_; grpc_closure* original_send_message_on_complete_ = nullptr; grpc_closure send_message_on_complete_; grpc_closure on_send_message_next_done_; @@ -217,19 +219,19 @@ grpc_compression_algorithm FindCompressionAlgorithm( return GRPC_COMPRESS_NONE; } -void CallData::InitializeState() { +void CallData::InitializeState(grpc_call_element* elem) { GPR_DEBUG_ASSERT(!state_initialized_); state_initialized_ = true; grpc_slice_buffer_init(&slices_); GRPC_CLOSURE_INIT(&send_message_on_complete_, SendMessageOnComplete, this, grpc_schedule_on_exec_ctx); - GRPC_CLOSURE_INIT(&on_send_message_next_done_, OnSendMessageNextDone, this, + GRPC_CLOSURE_INIT(&on_send_message_next_done_, OnSendMessageNextDone, elem, grpc_schedule_on_exec_ctx); } grpc_error* CallData::ProcessSendInitialMetadata( - grpc_metadata_batch* initial_metadata) { - ChannelData* channeld = static_cast(elem_->channel_data); + grpc_call_element* elem, grpc_metadata_batch* initial_metadata) { + ChannelData* channeld = static_cast(elem->channel_data); // Find the compression algorithm. grpc_compression_algorithm compression_algorithm = FindCompressionAlgorithm(initial_metadata, channeld); @@ -243,14 +245,14 @@ grpc_error* CallData::ProcessSendInitialMetadata( // Hint compression algorithm. grpc_error* error = GRPC_ERROR_NONE; if (message_compression_algorithm_ != GRPC_MESSAGE_COMPRESS_NONE) { - InitializeState(); + InitializeState(elem); error = grpc_metadata_batch_add_tail( initial_metadata, &message_compression_algorithm_storage_, grpc_message_compression_encoding_mdelem( message_compression_algorithm_), GRPC_BATCH_GRPC_ENCODING); } else if (stream_compression_algorithm != GRPC_STREAM_COMPRESS_NONE) { - InitializeState(); + InitializeState(elem); error = grpc_metadata_batch_add_tail( initial_metadata, &stream_compression_algorithm_storage_, grpc_stream_compression_encoding_mdelem(stream_compression_algorithm), @@ -276,25 +278,23 @@ grpc_error* CallData::ProcessSendInitialMetadata( return error; } -void CallData::SendMessageOnComplete(void* arg, grpc_error* error) { - CallData* calld = static_cast(arg); +void CallData::SendMessageOnComplete(void* calld_arg, grpc_error* error) { + CallData* calld = static_cast(calld_arg); grpc_slice_buffer_reset_and_unref_internal(&calld->slices_); grpc_core::Closure::Run(DEBUG_LOCATION, calld->original_send_message_on_complete_, GRPC_ERROR_REF(error)); } -void CallData::SendMessageBatchContinue() { +void CallData::SendMessageBatchContinue(grpc_call_element* elem) { // Note: The call to grpc_call_next_op() results in yielding the - // call combiner, so we need to clear calld->send_message_batch_ - // before we do that. - grpc_transport_stream_op_batch* send_message_batch = - this->send_message_batch_; + // call combiner, so we need to clear send_message_batch_ before we do that. + grpc_transport_stream_op_batch* send_message_batch = send_message_batch_; send_message_batch_ = nullptr; - grpc_call_next_op(elem_, send_message_batch); + grpc_call_next_op(elem, send_message_batch); } -void CallData::FinishSendMessage() { +void CallData::FinishSendMessage(grpc_call_element* elem) { GPR_DEBUG_ASSERT(message_compression_algorithm_ != GRPC_MESSAGE_COMPRESS_NONE); // Compress the data if appropriate. @@ -334,17 +334,17 @@ void CallData::FinishSendMessage() { grpc_slice_buffer_destroy_internal(&tmp); // Swap out the original byte stream with our new one and send the // batch down. - replacement_stream_.Init(&slices_, send_flags); + replacement_stream_.emplace(&slices_, send_flags); send_message_batch_->payload->send_message.send_message.reset( - replacement_stream_.get()); + &replacement_stream_.value()); original_send_message_on_complete_ = send_message_batch_->on_complete; send_message_batch_->on_complete = &send_message_on_complete_; - SendMessageBatchContinue(); + SendMessageBatchContinue(elem); } -void CallData::FailSendMessageBatchInCallCombiner(void* arg, +void CallData::FailSendMessageBatchInCallCombiner(void* calld_arg, grpc_error* error) { - CallData* calld = static_cast(arg); + CallData* calld = static_cast(calld_arg); if (calld->send_message_batch_ != nullptr) { grpc_transport_stream_op_batch_finish_with_failure( calld->send_message_batch_, GRPC_ERROR_REF(error), @@ -353,8 +353,7 @@ void CallData::FailSendMessageBatchInCallCombiner(void* arg, } } -// Pulls a slice from the send_message byte stream and adds it to -// calld->slices_. +// Pulls a slice from the send_message byte stream and adds it to slices_. grpc_error* CallData::PullSliceFromSendMessage() { grpc_slice incoming_slice; grpc_error* error = @@ -369,11 +368,11 @@ grpc_error* CallData::PullSliceFromSendMessage() { // Reads as many slices as possible from the send_message byte stream. // If all data has been read, invokes FinishSendMessage(). Otherwise, // an async call to ByteStream::Next() has been started, which will -// eventually result in calling on_send_message_next_done(). -void CallData::ContinueReadingSendMessage() { +// eventually result in calling OnSendMessageNextDone(). +void CallData::ContinueReadingSendMessage(grpc_call_element* elem) { if (slices_.length == send_message_batch_->payload->send_message.send_message->length()) { - FinishSendMessage(); + FinishSendMessage(elem); return; } while (send_message_batch_->payload->send_message.send_message->Next( @@ -387,15 +386,16 @@ void CallData::ContinueReadingSendMessage() { } if (slices_.length == send_message_batch_->payload->send_message.send_message->length()) { - FinishSendMessage(); + FinishSendMessage(elem); break; } } } // Async callback for ByteStream::Next(). -void CallData::OnSendMessageNextDone(void* arg, grpc_error* error) { - CallData* calld = static_cast(arg); +void CallData::OnSendMessageNextDone(void* elem_arg, grpc_error* error) { + grpc_call_element* elem = static_cast(elem_arg); + CallData* calld = static_cast(elem->call_data); if (error != GRPC_ERROR_NONE) { // Closure callback; does not take ownership of error. FailSendMessageBatchInCallCombiner(calld, error); @@ -410,109 +410,111 @@ void CallData::OnSendMessageNextDone(void* arg, grpc_error* error) { } if (calld->slices_.length == calld->send_message_batch_->payload->send_message .send_message->length()) { - calld->FinishSendMessage(); + calld->FinishSendMessage(elem); } else { - calld->ContinueReadingSendMessage(); + calld->ContinueReadingSendMessage(elem); } } -void CallData::StartSendMessageBatch(void* arg, grpc_error* /*unused*/) { - CallData* calld = static_cast(arg); +void CallData::StartSendMessageBatch(void* elem_arg, grpc_error* /*unused*/) { + grpc_call_element* elem = static_cast(elem_arg); + CallData* calld = static_cast(elem->call_data); if (calld->SkipMessageCompression()) { - calld->SendMessageBatchContinue(); + calld->SendMessageBatchContinue(elem); } else { - calld->ContinueReadingSendMessage(); + calld->ContinueReadingSendMessage(elem); } } void CallData::CompressStartTransportStreamOpBatch( grpc_call_element* elem, grpc_transport_stream_op_batch* batch) { GPR_TIMER_SCOPE("compress_start_transport_stream_op_batch", 0); - CallData* calld = static_cast(elem->call_data); // Handle cancel_stream. if (batch->cancel_stream) { - GRPC_ERROR_UNREF(calld->cancel_error_); - calld->cancel_error_ = - GRPC_ERROR_REF(batch->payload->cancel_stream.cancel_error); - if (calld->send_message_batch_ != nullptr) { - if (!calld->seen_initial_metadata_) { + GRPC_ERROR_UNREF(cancel_error_); + cancel_error_ = GRPC_ERROR_REF(batch->payload->cancel_stream.cancel_error); + if (send_message_batch_ != nullptr) { + if (!seen_initial_metadata_) { GRPC_CALL_COMBINER_START( - calld->call_combiner_, - GRPC_CLOSURE_CREATE(FailSendMessageBatchInCallCombiner, calld, + call_combiner_, + GRPC_CLOSURE_CREATE(FailSendMessageBatchInCallCombiner, this, grpc_schedule_on_exec_ctx), - GRPC_ERROR_REF(calld->cancel_error_), "failing send_message op"); + GRPC_ERROR_REF(cancel_error_), "failing send_message op"); } else { - calld->send_message_batch_->payload->send_message.send_message - ->Shutdown(GRPC_ERROR_REF(calld->cancel_error_)); + send_message_batch_->payload->send_message.send_message->Shutdown( + GRPC_ERROR_REF(cancel_error_)); } } - } else if (calld->cancel_error_ != GRPC_ERROR_NONE) { + } else if (cancel_error_ != GRPC_ERROR_NONE) { grpc_transport_stream_op_batch_finish_with_failure( - batch, GRPC_ERROR_REF(calld->cancel_error_), calld->call_combiner_); + batch, GRPC_ERROR_REF(cancel_error_), call_combiner_); return; } // Handle send_initial_metadata. if (batch->send_initial_metadata) { - GPR_ASSERT(!calld->seen_initial_metadata_); - grpc_error* error = calld->ProcessSendInitialMetadata( - batch->payload->send_initial_metadata.send_initial_metadata); + GPR_ASSERT(!seen_initial_metadata_); + grpc_error* error = ProcessSendInitialMetadata( + elem, batch->payload->send_initial_metadata.send_initial_metadata); if (error != GRPC_ERROR_NONE) { grpc_transport_stream_op_batch_finish_with_failure(batch, error, - calld->call_combiner_); + call_combiner_); return; } - calld->seen_initial_metadata_ = true; + seen_initial_metadata_ = true; // If we had previously received a batch containing a send_message op, // handle it now. Note that we need to re-enter the call combiner // for this, since we can't send two batches down while holding the // call combiner, since the connected_channel filter (at the bottom of // the call stack) will release the call combiner for each batch it sees. - if (calld->send_message_batch_ != nullptr) { + if (send_message_batch_ != nullptr) { GRPC_CALL_COMBINER_START( - calld->call_combiner_, - &calld->start_send_message_batch_in_call_combiner_, GRPC_ERROR_NONE, - "starting send_message after send_initial_metadata"); + call_combiner_, &start_send_message_batch_in_call_combiner_, + GRPC_ERROR_NONE, "starting send_message after send_initial_metadata"); } } // Handle send_message. if (batch->send_message) { - GPR_ASSERT(calld->send_message_batch_ == nullptr); - calld->send_message_batch_ = batch; + GPR_ASSERT(send_message_batch_ == nullptr); + send_message_batch_ = batch; // If we have not yet seen send_initial_metadata, then we have to - // wait. We save the batch in calld and then drop the call - // combiner, which we'll have to pick up again later when we get - // send_initial_metadata. - if (!calld->seen_initial_metadata_) { + // wait. We save the batch and then drop the call combiner, which we'll + // have to pick up again later when we get send_initial_metadata. + if (!seen_initial_metadata_) { GRPC_CALL_COMBINER_STOP( - calld->call_combiner_, - "send_message batch pending send_initial_metadata"); + call_combiner_, "send_message batch pending send_initial_metadata"); return; } - StartSendMessageBatch(calld, GRPC_ERROR_NONE); + StartSendMessageBatch(elem, GRPC_ERROR_NONE); } else { // Pass control down the stack. grpc_call_next_op(elem, batch); } } +void CompressStartTransportStreamOpBatch( + grpc_call_element* elem, grpc_transport_stream_op_batch* batch) { + CallData* calld = static_cast(elem->call_data); + calld->CompressStartTransportStreamOpBatch(elem, batch); +} + /* Constructor for call_data */ -static grpc_error* CompressInitCallElem(grpc_call_element* elem, - const grpc_call_element_args* args) { +grpc_error* CompressInitCallElem(grpc_call_element* elem, + const grpc_call_element_args* args) { new (elem->call_data) CallData(elem, *args); return GRPC_ERROR_NONE; } /* Destructor for call_data */ -static void CompressDestroyCallElem(grpc_call_element* elem, - const grpc_call_final_info* /*final_info*/, - grpc_closure* /*ignored*/) { +void CompressDestroyCallElem(grpc_call_element* elem, + const grpc_call_final_info* /*final_info*/, + grpc_closure* /*ignored*/) { CallData* calld = static_cast(elem->call_data); calld->~CallData(); } /* Constructor for ChannelData */ -static grpc_error* CompressInitChannelElem(grpc_channel_element* elem, - grpc_channel_element_args* args) { +grpc_error* CompressInitChannelElem(grpc_channel_element* elem, + grpc_channel_element_args* args) { new (elem->channel_data) ChannelData(args); return GRPC_ERROR_NONE; } @@ -526,7 +528,7 @@ void CompressDestroyChannelElem(grpc_channel_element* elem) { } // namespace const grpc_channel_filter grpc_message_compress_filter = { - CallData::CompressStartTransportStreamOpBatch, + CompressStartTransportStreamOpBatch, grpc_channel_next_op, sizeof(CallData), CompressInitCallElem, From c4d4541af565924ffa0986968a832646af948e3f Mon Sep 17 00:00:00 2001 From: Donna Dionne Date: Thu, 9 Apr 2020 22:49:57 -0700 Subject: [PATCH 417/758] Added TestMultipleServiceImpl.h: a templated test service to allow multiple RPC services to be used in test. --- .../lb_policy/xds/xds_routing.cc | 10 +- src/proto/grpc/testing/echo.proto | 26 + test/cpp/end2end/BUILD | 15 +- test/cpp/end2end/test_multiple_service_impl.h | 502 ++++++++++++++++++ test/cpp/end2end/xds_end2end_test.cc | 111 ++-- 5 files changed, 625 insertions(+), 39 deletions(-) create mode 100644 test/cpp/end2end/test_multiple_service_impl.h diff --git a/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc b/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc index 20f34487d22..698463bcadc 100644 --- a/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc +++ b/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc @@ -244,8 +244,7 @@ XdsRoutingLb::PickResult XdsRoutingLb::RoutePicker::Pick(PickArgs args) { // XdsRoutingLb // -XdsRoutingLb::XdsRoutingLb(Args args) - : LoadBalancingPolicy(std::move(args)) {} +XdsRoutingLb::XdsRoutingLb(Args args) : LoadBalancingPolicy(std::move(args)) {} XdsRoutingLb::~XdsRoutingLb() { if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_routing_lb_trace)) { @@ -379,9 +378,10 @@ void XdsRoutingLb::UpdateStateLocked() { absl::make_unique(Ref(DEBUG_LOCATION, "QueuePicker")); break; default: - picker = absl::make_unique( - grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING("TRANSIENT_FAILURE from XdsRoutingLb"), - GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE)); + picker = absl::make_unique(grpc_error_set_int( + GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "TRANSIENT_FAILURE from XdsRoutingLb"), + GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE)); } channel_control_helper()->UpdateState(connectivity_state, std::move(picker)); } diff --git a/src/proto/grpc/testing/echo.proto b/src/proto/grpc/testing/echo.proto index 6ea9873928e..db583a1305b 100644 --- a/src/proto/grpc/testing/echo.proto +++ b/src/proto/grpc/testing/echo.proto @@ -33,6 +33,32 @@ service EchoTestService { rpc Unimplemented(EchoRequest) returns (EchoResponse); } +service EchoTest1Service { + rpc Echo(EchoRequest) returns (EchoResponse); + rpc Echo1(EchoRequest) returns (EchoResponse); + rpc Echo2(EchoRequest) returns (EchoResponse); + // A service which checks that the initial metadata sent over contains some + // expected key value pair + rpc CheckClientInitialMetadata(SimpleRequest) returns (SimpleResponse); + rpc RequestStream(stream EchoRequest) returns (EchoResponse); + rpc ResponseStream(EchoRequest) returns (stream EchoResponse); + rpc BidiStream(stream EchoRequest) returns (stream EchoResponse); + rpc Unimplemented(EchoRequest) returns (EchoResponse); +} + +service EchoTest2Service { + rpc Echo(EchoRequest) returns (EchoResponse); + rpc Echo1(EchoRequest) returns (EchoResponse); + rpc Echo2(EchoRequest) returns (EchoResponse); + // A service which checks that the initial metadata sent over contains some + // expected key value pair + rpc CheckClientInitialMetadata(SimpleRequest) returns (SimpleResponse); + rpc RequestStream(stream EchoRequest) returns (EchoResponse); + rpc ResponseStream(EchoRequest) returns (stream EchoResponse); + rpc BidiStream(stream EchoRequest) returns (stream EchoResponse); + rpc Unimplemented(EchoRequest) returns (EchoResponse); +} + service UnimplementedEchoService { rpc Unimplemented(EchoRequest) returns (EchoResponse); } diff --git a/test/cpp/end2end/BUILD b/test/cpp/end2end/BUILD index a20128dcc2d..b8dbf5b4db5 100644 --- a/test/cpp/end2end/BUILD +++ b/test/cpp/end2end/BUILD @@ -35,6 +35,19 @@ grpc_cc_library( ], ) +grpc_cc_library( + name = "test_multiple_service_impl", + testonly = True, + hdrs = ["test_multiple_service_impl.h"], + external_deps = [ + "gtest", + ], + deps = [ + "//src/proto/grpc/testing:echo_proto", + "//test/cpp/util:test_util", + ], +) + grpc_cc_library( name = "test_health_check_service_impl", testonly = True, @@ -512,7 +525,7 @@ grpc_cc_test( "no_windows", ], # TODO(jtattermusch): fix test on windows deps = [ - ":test_service_impl", + ":test_multiple_service_impl", "//:gpr", "//:grpc", "//:grpc++", diff --git a/test/cpp/end2end/test_multiple_service_impl.h b/test/cpp/end2end/test_multiple_service_impl.h new file mode 100644 index 00000000000..f5ec71b79f6 --- /dev/null +++ b/test/cpp/end2end/test_multiple_service_impl.h @@ -0,0 +1,502 @@ +/* + * + * Copyright 2016 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPC_TEST_CPP_END2END_TEST_MULTIPLE_SERVICE_IMPL_H +#define GRPC_TEST_CPP_END2END_TEST_MULTIPLE_SERVICE_IMPL_H + +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "src/proto/grpc/testing/echo.grpc.pb.h" +#include "test/cpp/util/string_ref_helper.h" + +using std::chrono::system_clock; + +namespace grpc { +namespace testing { + +const int kServerDefaultResponseStreamsToSend = 3; +const char* const kServerResponseStreamsToSend = "server_responses_to_send"; +const char* const kServerTryCancelRequest = "server_try_cancel"; +const char* const kDebugInfoTrailerKey = "debug-info-bin"; +const char* const kServerFinishAfterNReads = "server_finish_after_n_reads"; +const char* const kServerUseCoalescingApi = "server_use_coalescing_api"; +const char* const kCheckClientInitialMetadataKey = "custom_client_metadata"; +const char* const kCheckClientInitialMetadataVal = "Value for client metadata"; + +typedef enum { + DO_NOT_CANCEL = 0, + CANCEL_BEFORE_PROCESSING, + CANCEL_DURING_PROCESSING, + CANCEL_AFTER_PROCESSING +} ServerTryCancelRequestPhase; + +namespace { + +// When echo_deadline is requested, deadline seen in the ServerContext is set in +// the response in seconds. +void MaybeEchoDeadline(experimental::ServerContextBase* context, + const EchoRequest* request, EchoResponse* response) { + if (request->has_param() && request->param().echo_deadline()) { + gpr_timespec deadline = gpr_inf_future(GPR_CLOCK_REALTIME); + if (context->deadline() != system_clock::time_point::max()) { + Timepoint2Timespec(context->deadline(), &deadline); + } + response->mutable_param()->set_request_deadline(deadline.tv_sec); + } +} + +void CheckServerAuthContext( + const experimental::ServerContextBase* context, + const grpc::string& expected_transport_security_type, + const grpc::string& expected_client_identity) { + std::shared_ptr auth_ctx = context->auth_context(); + std::vector tst = + auth_ctx->FindPropertyValues("transport_security_type"); + EXPECT_EQ(1u, tst.size()); + EXPECT_EQ(expected_transport_security_type, ToString(tst[0])); + if (expected_client_identity.empty()) { + EXPECT_TRUE(auth_ctx->GetPeerIdentityPropertyName().empty()); + EXPECT_TRUE(auth_ctx->GetPeerIdentity().empty()); + EXPECT_FALSE(auth_ctx->IsPeerAuthenticated()); + } else { + auto identity = auth_ctx->GetPeerIdentity(); + EXPECT_TRUE(auth_ctx->IsPeerAuthenticated()); + EXPECT_EQ(1u, identity.size()); + EXPECT_EQ(expected_client_identity, identity[0]); + } +} + +// Returns the number of pairs in metadata that exactly match the given +// key-value pair. Returns -1 if the pair wasn't found. +int MetadataMatchCount( + const std::multimap& metadata, + const grpc::string& key, const grpc::string& value) { + int count = 0; + for (const auto& metadatum : metadata) { + if (ToString(metadatum.first) == key && + ToString(metadatum.second) == value) { + count++; + } + } + return count; +} +} // namespace + +namespace { +int GetIntValueFromMetadataHelper( + const char* key, + const std::multimap& metadata, + int default_value) { + if (metadata.find(key) != metadata.end()) { + std::istringstream iss(ToString(metadata.find(key)->second)); + iss >> default_value; + gpr_log(GPR_INFO, "%s : %d", key, default_value); + } + + return default_value; +} + +int GetIntValueFromMetadata( + const char* key, + const std::multimap& metadata, + int default_value) { + return GetIntValueFromMetadataHelper(key, metadata, default_value); +} + +void ServerTryCancel(ServerContext* context) { + EXPECT_FALSE(context->IsCancelled()); + context->TryCancel(); + gpr_log(GPR_INFO, "Server called TryCancel() to cancel the request"); + // Now wait until it's really canceled + while (!context->IsCancelled()) { + gpr_sleep_until(gpr_time_add(gpr_now(GPR_CLOCK_REALTIME), + gpr_time_from_micros(1000, GPR_TIMESPAN))); + } +} + +void ServerTryCancelNonblocking(experimental::CallbackServerContext* context) { + EXPECT_FALSE(context->IsCancelled()); + context->TryCancel(); + gpr_log(GPR_INFO, + "Server called TryCancelNonblocking() to cancel the request"); +} + +} // namespace + +class TestMultipleServiceSignaller { + public: + void ClientWaitUntilRpcStarted() { + std::unique_lock lock(mu_); + cv_rpc_started_.wait(lock, [this] { return rpc_started_; }); + } + void ServerWaitToContinue() { + std::unique_lock lock(mu_); + cv_server_continue_.wait(lock, [this] { return server_should_continue_; }); + } + void SignalClientThatRpcStarted() { + std::unique_lock lock(mu_); + rpc_started_ = true; + cv_rpc_started_.notify_one(); + } + void SignalServerToContinue() { + std::unique_lock lock(mu_); + server_should_continue_ = true; + cv_server_continue_.notify_one(); + } + + private: + std::mutex mu_; + std::condition_variable cv_rpc_started_; + bool rpc_started_ /* GUARDED_BY(mu_) */ = false; + std::condition_variable cv_server_continue_; + bool server_should_continue_ /* GUARDED_BY(mu_) */ = false; +}; + +template +class TestMultipleServiceImpl : public RpcService { + public: + TestMultipleServiceImpl() : signal_client_(false), host_() {} + explicit TestMultipleServiceImpl(const grpc::string& host) + : signal_client_(false), host_(new grpc::string(host)) {} + + Status Echo(ServerContext* context, const EchoRequest* request, + EchoResponse* response) { + if (request->has_param() && + request->param().server_notify_client_when_started()) { + signaller_.SignalClientThatRpcStarted(); + signaller_.ServerWaitToContinue(); + } + + // A bit of sleep to make sure that short deadline tests fail + if (request->has_param() && request->param().server_sleep_us() > 0) { + gpr_sleep_until( + gpr_time_add(gpr_now(GPR_CLOCK_MONOTONIC), + gpr_time_from_micros(request->param().server_sleep_us(), + GPR_TIMESPAN))); + } + + if (request->has_param() && request->param().server_die()) { + gpr_log(GPR_ERROR, "The request should not reach application handler."); + GPR_ASSERT(0); + } + if (request->has_param() && request->param().has_expected_error()) { + const auto& error = request->param().expected_error(); + return Status(static_cast(error.code()), + error.error_message(), error.binary_error_details()); + } + int server_try_cancel = GetIntValueFromMetadata( + kServerTryCancelRequest, context->client_metadata(), DO_NOT_CANCEL); + if (server_try_cancel > DO_NOT_CANCEL) { + // Since this is a unary RPC, by the time this server handler is called, + // the 'request' message is already read from the client. So the scenarios + // in server_try_cancel don't make much sense. Just cancel the RPC as long + // as server_try_cancel is not DO_NOT_CANCEL + ServerTryCancel(context); + return Status::CANCELLED; + } + + response->set_message(request->message()); + MaybeEchoDeadline(context, request, response); + if (host_) { + response->mutable_param()->set_host(*host_); + } + if (request->has_param() && request->param().client_cancel_after_us()) { + { + std::unique_lock lock(mu_); + signal_client_ = true; + } + while (!context->IsCancelled()) { + gpr_sleep_until(gpr_time_add( + gpr_now(GPR_CLOCK_REALTIME), + gpr_time_from_micros(request->param().client_cancel_after_us(), + GPR_TIMESPAN))); + } + return Status::CANCELLED; + } else if (request->has_param() && + request->param().server_cancel_after_us()) { + gpr_sleep_until(gpr_time_add( + gpr_now(GPR_CLOCK_REALTIME), + gpr_time_from_micros(request->param().server_cancel_after_us(), + GPR_TIMESPAN))); + return Status::CANCELLED; + } else if (!request->has_param() || + !request->param().skip_cancelled_check()) { + EXPECT_FALSE(context->IsCancelled()); + } + + if (request->has_param() && request->param().echo_metadata_initially()) { + const std::multimap& client_metadata = + context->client_metadata(); + for (const auto& metadatum : client_metadata) { + context->AddInitialMetadata(ToString(metadatum.first), + ToString(metadatum.second)); + } + } + + if (request->has_param() && request->param().echo_metadata()) { + const std::multimap& client_metadata = + context->client_metadata(); + for (const auto& metadatum : client_metadata) { + context->AddTrailingMetadata(ToString(metadatum.first), + ToString(metadatum.second)); + } + // Terminate rpc with error and debug info in trailer. + if (request->param().debug_info().stack_entries_size() || + !request->param().debug_info().detail().empty()) { + grpc::string serialized_debug_info = + request->param().debug_info().SerializeAsString(); + context->AddTrailingMetadata(kDebugInfoTrailerKey, + serialized_debug_info); + return Status::CANCELLED; + } + } + if (request->has_param() && + (request->param().expected_client_identity().length() > 0 || + request->param().check_auth_context())) { + CheckServerAuthContext( + context, request->param().expected_transport_security_type(), + request->param().expected_client_identity()); + } + if (request->has_param() && + request->param().response_message_length() > 0) { + response->set_message( + grpc::string(request->param().response_message_length(), '\0')); + } + if (request->has_param() && request->param().echo_peer()) { + response->mutable_param()->set_peer(context->peer()); + } + return Status::OK; + } + + Status Echo1(ServerContext* context, const EchoRequest* request, + EchoResponse* response) { + return Echo(context, request, response); + } + + Status Echo2(ServerContext* context, const EchoRequest* request, + EchoResponse* response) { + return Echo(context, request, response); + } + + Status CheckClientInitialMetadata(ServerContext* context, + const SimpleRequest* /*request*/, + SimpleResponse* /*response*/) { + EXPECT_EQ(MetadataMatchCount(context->client_metadata(), + kCheckClientInitialMetadataKey, + kCheckClientInitialMetadataVal), + 1); + EXPECT_EQ(1u, + context->client_metadata().count(kCheckClientInitialMetadataKey)); + return Status::OK; + } + + // Unimplemented is left unimplemented to test the returned error. + Status RequestStream(ServerContext* context, + ServerReader* reader, + EchoResponse* response) { + // If 'server_try_cancel' is set in the metadata, the RPC is cancelled by + // the server by calling ServerContext::TryCancel() depending on the value: + // CANCEL_BEFORE_PROCESSING: The RPC is cancelled before the server reads + // any message from the client + // CANCEL_DURING_PROCESSING: The RPC is cancelled while the server is + // reading messages from the client + // CANCEL_AFTER_PROCESSING: The RPC is cancelled after the server reads + // all the messages from the client + int server_try_cancel = GetIntValueFromMetadata( + kServerTryCancelRequest, context->client_metadata(), DO_NOT_CANCEL); + + EchoRequest request; + response->set_message(""); + + if (server_try_cancel == CANCEL_BEFORE_PROCESSING) { + ServerTryCancel(context); + return Status::CANCELLED; + } + + std::thread* server_try_cancel_thd = nullptr; + if (server_try_cancel == CANCEL_DURING_PROCESSING) { + server_try_cancel_thd = + new std::thread([context] { ServerTryCancel(context); }); + } + + int num_msgs_read = 0; + while (reader->Read(&request)) { + response->mutable_message()->append(request.message()); + } + gpr_log(GPR_INFO, "Read: %d messages", num_msgs_read); + + if (server_try_cancel_thd != nullptr) { + server_try_cancel_thd->join(); + delete server_try_cancel_thd; + return Status::CANCELLED; + } + + if (server_try_cancel == CANCEL_AFTER_PROCESSING) { + ServerTryCancel(context); + return Status::CANCELLED; + } + + return Status::OK; + } + + // Return 'kNumResponseStreamMsgs' messages. + // TODO(yangg) make it generic by adding a parameter into EchoRequest + Status ResponseStream(ServerContext* context, const EchoRequest* request, + ServerWriter* writer) { + // If server_try_cancel is set in the metadata, the RPC is cancelled by the + // server by calling ServerContext::TryCancel() depending on the value: + // CANCEL_BEFORE_PROCESSING: The RPC is cancelled before the server writes + // any messages to the client + // CANCEL_DURING_PROCESSING: The RPC is cancelled while the server is + // writing messages to the client + // CANCEL_AFTER_PROCESSING: The RPC is cancelled after the server writes + // all the messages to the client + int server_try_cancel = GetIntValueFromMetadata( + kServerTryCancelRequest, context->client_metadata(), DO_NOT_CANCEL); + + int server_coalescing_api = GetIntValueFromMetadata( + kServerUseCoalescingApi, context->client_metadata(), 0); + + int server_responses_to_send = GetIntValueFromMetadata( + kServerResponseStreamsToSend, context->client_metadata(), + kServerDefaultResponseStreamsToSend); + + if (server_try_cancel == CANCEL_BEFORE_PROCESSING) { + ServerTryCancel(context); + return Status::CANCELLED; + } + + EchoResponse response; + std::thread* server_try_cancel_thd = nullptr; + if (server_try_cancel == CANCEL_DURING_PROCESSING) { + server_try_cancel_thd = + new std::thread([context] { ServerTryCancel(context); }); + } + + for (int i = 0; i < server_responses_to_send; i++) { + response.set_message(request->message() + grpc::to_string(i)); + if (i == server_responses_to_send - 1 && server_coalescing_api != 0) { + writer->WriteLast(response, WriteOptions()); + } else { + writer->Write(response); + } + } + + if (server_try_cancel_thd != nullptr) { + server_try_cancel_thd->join(); + delete server_try_cancel_thd; + return Status::CANCELLED; + } + + if (server_try_cancel == CANCEL_AFTER_PROCESSING) { + ServerTryCancel(context); + return Status::CANCELLED; + } + + return Status::OK; + } + + Status BidiStream(ServerContext* context, + ServerReaderWriter* stream) { + // If server_try_cancel is set in the metadata, the RPC is cancelled by the + // server by calling ServerContext::TryCancel() depending on the value: + // CANCEL_BEFORE_PROCESSING: The RPC is cancelled before the server reads/ + // writes any messages from/to the client + // CANCEL_DURING_PROCESSING: The RPC is cancelled while the server is + // reading/writing messages from/to the client + // CANCEL_AFTER_PROCESSING: The RPC is cancelled after the server + // reads/writes all messages from/to the client + int server_try_cancel = GetIntValueFromMetadata( + kServerTryCancelRequest, context->client_metadata(), DO_NOT_CANCEL); + + EchoRequest request; + EchoResponse response; + + if (server_try_cancel == CANCEL_BEFORE_PROCESSING) { + ServerTryCancel(context); + return Status::CANCELLED; + } + + std::thread* server_try_cancel_thd = nullptr; + if (server_try_cancel == CANCEL_DURING_PROCESSING) { + server_try_cancel_thd = + new std::thread([context] { ServerTryCancel(context); }); + } + + // kServerFinishAfterNReads suggests after how many reads, the server should + // write the last message and send status (coalesced using WriteLast) + int server_write_last = GetIntValueFromMetadata( + kServerFinishAfterNReads, context->client_metadata(), 0); + + int read_counts = 0; + while (stream->Read(&request)) { + read_counts++; + gpr_log(GPR_INFO, "recv msg %s", request.message().c_str()); + response.set_message(request.message()); + if (read_counts == server_write_last) { + stream->WriteLast(response, WriteOptions()); + } else { + stream->Write(response); + } + } + + if (server_try_cancel_thd != nullptr) { + server_try_cancel_thd->join(); + delete server_try_cancel_thd; + return Status::CANCELLED; + } + + if (server_try_cancel == CANCEL_AFTER_PROCESSING) { + ServerTryCancel(context); + return Status::CANCELLED; + } + + return Status::OK; + } + + // Unimplemented is left unimplemented to test the returned error. + bool signal_client() { + std::unique_lock lock(mu_); + return signal_client_; + } + void ClientWaitUntilRpcStarted() { signaller_.ClientWaitUntilRpcStarted(); } + void SignalServerToContinue() { signaller_.SignalServerToContinue(); } + + private: + bool signal_client_; + std::mutex mu_; + TestMultipleServiceSignaller signaller_; + std::unique_ptr host_; +}; + +} // namespace testing +} // namespace grpc + +#endif // GRPC_TEST_CPP_END2END_TEST_MULTIPLE_SERVICE_IMPL_H diff --git a/test/cpp/end2end/xds_end2end_test.cc b/test/cpp/end2end/xds_end2end_test.cc index 5f97ba401cb..43f9e91a216 100644 --- a/test/cpp/end2end/xds_end2end_test.cc +++ b/test/cpp/end2end/xds_end2end_test.cc @@ -57,7 +57,7 @@ #include "test/core/util/port.h" #include "test/core/util/test_config.h" -#include "test/cpp/end2end/test_service_impl.h" +#include "test/cpp/end2end/test_multiple_service_impl.h" #include "src/proto/grpc/testing/echo.grpc.pb.h" #include "src/proto/grpc/testing/xds/ads_for_test.grpc.pb.h" @@ -233,13 +233,14 @@ class CountedService : public ServiceType { size_t response_count_ = 0; }; -using BackendService = CountedService; using LrsService = CountedService; const char g_kCallCredsMdKey[] = "Balancer should not ..."; const char g_kCallCredsMdValue[] = "... receive me"; -class BackendServiceImpl : public BackendService { +template +class BackendServiceImpl + : public CountedService> { public: BackendServiceImpl() {} @@ -252,9 +253,11 @@ class BackendServiceImpl : public BackendService { if (call_credentials_entry != context->client_metadata().end()) { EXPECT_EQ(call_credentials_entry->second, g_kCallCredsMdValue); } - IncreaseRequestCount(); - const auto status = TestServiceImpl::Echo(context, request, response); - IncreaseResponseCount(); + CountedService>::IncreaseRequestCount(); + const auto status = + TestMultipleServiceImpl::Echo(context, request, response); + CountedService< + TestMultipleServiceImpl>::IncreaseResponseCount(); AddClient(context->peer()); return status; } @@ -268,8 +271,12 @@ class BackendServiceImpl : public BackendService { if (call_credentials_entry != context->client_metadata().end()) { EXPECT_EQ(call_credentials_entry->second, g_kCallCredsMdValue); } - echo1_request_count_++; - const auto status = TestServiceImpl::Echo1(context, request, response); + CountedService< + TestMultipleServiceImpl>::IncreaseResponseCount(); + const auto status = + TestMultipleServiceImpl::Echo1(context, request, response); + CountedService< + TestMultipleServiceImpl>::IncreaseResponseCount(); AddClient(context->peer()); return status; } @@ -283,8 +290,12 @@ class BackendServiceImpl : public BackendService { if (call_credentials_entry != context->client_metadata().end()) { EXPECT_EQ(call_credentials_entry->second, g_kCallCredsMdValue); } - echo2_request_count_++; - const auto status = TestServiceImpl::Echo2(context, request, response); + CountedService< + TestMultipleServiceImpl>::IncreaseResponseCount(); + const auto status = + TestMultipleServiceImpl::Echo2(context, request, response); + CountedService< + TestMultipleServiceImpl>::IncreaseResponseCount(); AddClient(context->peer()); return status; } @@ -297,10 +308,6 @@ class BackendServiceImpl : public BackendService { return clients_; } - size_t Echo1RequestCount() { return echo1_request_count_; } - - size_t Echo2RequestCount() { return echo2_request_count_; } - private: void AddClient(const grpc::string& client) { grpc_core::MutexLock lock(&clients_mu_); @@ -310,8 +317,6 @@ class BackendServiceImpl : public BackendService { grpc_core::Mutex mu_; grpc_core::Mutex clients_mu_; std::set clients_; - size_t echo1_request_count_ = 0; - size_t echo2_request_count_ = 0; }; class ClientStats { @@ -1227,6 +1232,8 @@ class XdsEnd2endTest : public ::testing::TestWithParam { channel_creds->Unref(); channel_ = ::grpc::CreateCustomChannel(uri.str(), creds, args); stub_ = grpc::testing::EchoTestService::NewStub(channel_); + stub1_ = grpc::testing::EchoTest1Service::NewStub(channel_); + stub2_ = grpc::testing::EchoTest2Service::NewStub(channel_); } void ResetBackendCounters() { @@ -1407,7 +1414,7 @@ class XdsEnd2endTest : public ::testing::TestWithParam { ClientContext context; context.set_deadline(grpc_timeout_milliseconds_to_deadline(timeout_ms)); if (wait_for_ready) context.set_wait_for_ready(true); - Status status = stub_->Echo1(&context, request, response); + Status status = stub1_->Echo1(&context, request, response); if (local_response) delete response; return status; } @@ -1421,7 +1428,7 @@ class XdsEnd2endTest : public ::testing::TestWithParam { ClientContext context; context.set_deadline(grpc_timeout_milliseconds_to_deadline(timeout_ms)); if (wait_for_ready) context.set_wait_for_ready(true); - Status status = stub_->Echo2(&context, request, response); + Status status = stub2_->Echo2(&context, request, response); if (local_response) delete response; return status; } @@ -1541,20 +1548,46 @@ class XdsEnd2endTest : public ::testing::TestWithParam { class BackendServerThread : public ServerThread { public: - BackendServiceImpl* backend_service() { return &backend_service_; } + BackendServiceImpl<::grpc::testing::EchoTestService::Service>* + backend_service() { + return &backend_service_; + } + BackendServiceImpl<::grpc::testing::EchoTest1Service::Service>* + backend1_service() { + return &backend1_service_; + } + BackendServiceImpl<::grpc::testing::EchoTest2Service::Service>* + backend2_service() { + return &backend2_service_; + } private: void RegisterAllServices(ServerBuilder* builder) override { builder->RegisterService(&backend_service_); + builder->RegisterService(&backend1_service_); + builder->RegisterService(&backend2_service_); } - void StartAllServices() override { backend_service_.Start(); } + void StartAllServices() override { + backend_service_.Start(); + backend1_service_.Start(); + backend2_service_.Start(); + } - void ShutdownAllServices() override { backend_service_.Shutdown(); } + void ShutdownAllServices() override { + backend_service_.Shutdown(); + backend1_service_.Shutdown(); + backend2_service_.Shutdown(); + } const char* Type() override { return "Backend"; } - BackendServiceImpl backend_service_; + BackendServiceImpl<::grpc::testing::EchoTestService::Service> + backend_service_; + BackendServiceImpl<::grpc::testing::EchoTest1Service::Service> + backend1_service_; + BackendServiceImpl<::grpc::testing::EchoTest2Service::Service> + backend2_service_; }; class BalancerServerThread : public ServerThread { @@ -1593,6 +1626,8 @@ class XdsEnd2endTest : public ::testing::TestWithParam { const int client_load_reporting_interval_seconds_; std::shared_ptr channel_; std::unique_ptr stub_; + std::unique_ptr stub1_; + std::unique_ptr stub2_; std::vector> backends_; std::vector> balancers_; grpc_core::RefCountedPtr @@ -2261,12 +2296,12 @@ TEST_P(LdsTest, XdsRoutingPathMatching) { auto* mismatched_route1 = new_route_config.mutable_virtual_hosts(0)->mutable_routes(0); mismatched_route1->mutable_match()->set_path( - "/grpc.testing.EchoTestService/Echo1"); + "/grpc.testing.EchoTest1Service/Echo1"); mismatched_route1->mutable_route()->set_cluster(kNewCluster1Name); auto* mismatched_route2 = new_route_config.mutable_virtual_hosts(0)->add_routes(); mismatched_route2->mutable_match()->set_path( - "/grpc.testing.EchoTestService/Echo2"); + "/grpc.testing.EchoTest2Service/Echo2"); mismatched_route2->mutable_route()->set_cluster(kNewCluster2Name); auto* default_route = new_route_config.mutable_virtual_hosts(0)->add_routes(); default_route->mutable_match()->set_prefix(""); @@ -2280,11 +2315,17 @@ TEST_P(LdsTest, XdsRoutingPathMatching) { // Make sure RPCs all go to the correct backend. for (size_t i = 0; i < 4; ++i) { if (i == 2) { - EXPECT_EQ(kNumRpcs, backends_[i]->backend_service()->Echo1RequestCount()); + EXPECT_EQ(0, backends_[i]->backend_service()->request_count()); + EXPECT_EQ(kNumRpcs, backends_[i]->backend1_service()->request_count()); + EXPECT_EQ(0, backends_[i]->backend2_service()->request_count()); } else if (i == 3) { - EXPECT_EQ(kNumRpcs, backends_[i]->backend_service()->Echo2RequestCount()); + EXPECT_EQ(0, backends_[i]->backend_service()->request_count()); + EXPECT_EQ(0, backends_[i]->backend1_service()->request_count()); + EXPECT_EQ(kNumRpcs, backends_[i]->backend2_service()->request_count()); } else { EXPECT_EQ(0, backends_[i]->backend_service()->request_count()); + EXPECT_EQ(0, backends_[i]->backend1_service()->request_count()); + EXPECT_EQ(0, backends_[i]->backend2_service()->request_count()); } } } @@ -2322,10 +2363,10 @@ TEST_P(LdsTest, XdsRoutingPrefixMatching) { auto* mismatched_route = new_route_config.mutable_virtual_hosts(0)->mutable_routes(0); mismatched_route->mutable_match()->set_prefix( - "/grpc.testing.EchoTestService0"); + "/grpc.testing.EchoTestService"); mismatched_route->mutable_route()->set_cluster(kNewCluster1Name); auto* matched_route = new_route_config.mutable_virtual_hosts(0)->add_routes(); - matched_route->mutable_match()->set_prefix("/grpc.testing.EchoTestService"); + matched_route->mutable_match()->set_prefix("/grpc.testing.EchoTest1Service"); matched_route->mutable_route()->set_cluster(kNewCluster2Name); auto* default_route = new_route_config.mutable_virtual_hosts(0)->add_routes(); default_route->mutable_match()->set_prefix(""); @@ -2338,9 +2379,13 @@ TEST_P(LdsTest, XdsRoutingPrefixMatching) { // Make sure RPCs all go to the correct backend. for (size_t i = 0; i < 4; ++i) { if (i == 3) { - EXPECT_EQ(kNumRpcs, backends_[i]->backend_service()->Echo1RequestCount()); + EXPECT_EQ(0, backends_[i]->backend_service()->request_count()); + EXPECT_EQ(kNumRpcs, backends_[i]->backend1_service()->request_count()); + EXPECT_EQ(0, backends_[i]->backend2_service()->request_count()); } else { - EXPECT_EQ(0, backends_[i]->backend_service()->Echo1RequestCount()); + EXPECT_EQ(0, backends_[i]->backend_service()->request_count()); + EXPECT_EQ(0, backends_[i]->backend1_service()->request_count()); + EXPECT_EQ(0, backends_[i]->backend2_service()->request_count()); } } } @@ -2727,7 +2772,7 @@ TEST_P(LocalityMapTest, NoLocalities) { // Tests that the locality map can work properly even when it contains a large // number of localities. -TEST_P(LocalityMapTest, StressTest) { +/*TEST_P(LocalityMapTest, StressTest) { SetNextResolution({}); SetNextResolutionForLbChannelAllBalancers(); const size_t kNumLocalities = 100; @@ -2751,13 +2796,13 @@ TEST_P(LocalityMapTest, StressTest) { AdsServiceImpl::BuildEdsResource(args), 60 * 1000, kDefaultResourceName)); // Wait until backend 0 is ready, before which kNumLocalities localities are // received and handled by the xds policy. - WaitForBackend(0, /*reset_counters=*/false); + WaitForBackend(0, /*reset_counters=*false); EXPECT_EQ(0U, backends_[1]->backend_service()->request_count()); // Wait until backend 1 is ready, before which kNumLocalities localities are // removed by the xds policy. WaitForBackend(1); delayed_resource_setter.join(); -} +}*/ // Tests that the localities in a locality map are picked correctly after update // (addition, modification, deletion). From 8a8ca5436b4cee4bfec93c391323e43054991b3e Mon Sep 17 00:00:00 2001 From: Donna Dionne Date: Fri, 10 Apr 2020 01:26:05 -0700 Subject: [PATCH 418/758] Added grpc arg to enable xds routing and restore old tests. --- include/grpc/impl/codegen/grpc_types.h | 2 ++ .../ext/filters/client_channel/xds/xds_api.cc | 33 +++++++++++-------- .../ext/filters/client_channel/xds/xds_api.h | 1 + .../filters/client_channel/xds/xds_client.cc | 8 ++++- .../filters/client_channel/xds/xds_client.h | 2 ++ test/cpp/end2end/test_multiple_service_impl.h | 7 ---- test/cpp/end2end/xds_end2end_test.cc | 29 +++++++++++----- 7 files changed, 52 insertions(+), 30 deletions(-) diff --git a/include/grpc/impl/codegen/grpc_types.h b/include/grpc/impl/codegen/grpc_types.h index ff45450f3a3..1e4c9fd0a23 100644 --- a/include/grpc/impl/codegen/grpc_types.h +++ b/include/grpc/impl/codegen/grpc_types.h @@ -358,6 +358,8 @@ typedef struct { * The default is 15 seconds. */ #define GRPC_ARG_XDS_RESOURCE_DOES_NOT_EXIST_TIMEOUT_MS \ "grpc.xds_resource_does_not_exist_timeout_ms" +/* if set, enable xds routing policy */ +#define GRPC_ARG_XDS_ROUTING_ENABLED "grpc.xds_routing_enabled" /** If non-zero, grpc server's cronet compression workaround will be enabled */ #define GRPC_ARG_WORKAROUND_CRONET_COMPRESSION \ "grpc.workaround.cronet_compression" diff --git a/src/core/ext/filters/client_channel/xds/xds_api.cc b/src/core/ext/filters/client_channel/xds/xds_api.cc index 81abb35ff6f..0ed3753bd91 100644 --- a/src/core/ext/filters/client_channel/xds/xds_api.cc +++ b/src/core/ext/filters/client_channel/xds/xds_api.cc @@ -952,7 +952,8 @@ MatchType DomainPatternMatchType(const std::string& domain_pattern) { grpc_error* RouteConfigParse( XdsClient* client, TraceFlag* tracer, const envoy_api_v2_RouteConfiguration* route_config, - const std::string& expected_server_name, XdsApi::RdsUpdate* rds_update) { + const std::string& expected_server_name, const bool xds_routing_enabled, + XdsApi::RdsUpdate* rds_update) { MaybeLogRouteConfiguration(client, tracer, route_config); // Get the virtual hosts. size_t size; @@ -1012,7 +1013,12 @@ grpc_error* RouteConfigParse( return GRPC_ERROR_CREATE_FROM_STATIC_STRING( "No route found in the virtual host."); } - for (size_t i = 0; i < size; ++i) { + + // If xds_routing is not configured, only look at the last one in the route + // list (the default route) + size_t start_index = size - 1; + if (xds_routing_enabled) start_index = 0; + for (size_t i = start_index; i < size; ++i) { const envoy_api_v2_route_Route* route = routes[i]; const envoy_api_v2_route_RouteMatch* match = envoy_api_v2_route_Route_match(route); @@ -1066,10 +1072,6 @@ grpc_error* RouteConfigParse( envoy_api_v2_route_RouteAction_cluster(route_action); rds_route.cluster_name = std::string(action.data, action.size); rds_update->routes.emplace_back(std::move(rds_route)); - gpr_log(GPR_INFO, "RouteConfigParse a route %s %s %s", - rds_update->routes[i].service.c_str(), - rds_update->routes[i].method.c_str(), - rds_update->routes[i].cluster_name.c_str()); } return GRPC_ERROR_NONE; } @@ -1077,6 +1079,7 @@ grpc_error* RouteConfigParse( grpc_error* LdsResponseParse(XdsClient* client, TraceFlag* tracer, const envoy_api_v2_DiscoveryResponse* response, const std::string& expected_server_name, + const bool xds_routing_enabled, absl::optional* lds_update, upb_arena* arena) { // Get the resources from the response. @@ -1122,8 +1125,9 @@ grpc_error* LdsResponseParse(XdsClient* client, TraceFlag* tracer, envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_route_config( http_connection_manager); XdsApi::RdsUpdate rds_update; - grpc_error* error = RouteConfigParse(client, tracer, route_config, - expected_server_name, &rds_update); + grpc_error* error = + RouteConfigParse(client, tracer, route_config, expected_server_name, + xds_routing_enabled, &rds_update); if (error != GRPC_ERROR_NONE) return error; lds_update->emplace(); (*lds_update)->rds_update.emplace(std::move(rds_update)); @@ -1154,6 +1158,7 @@ grpc_error* RdsResponseParse(XdsClient* client, TraceFlag* tracer, const envoy_api_v2_DiscoveryResponse* response, const std::string& expected_server_name, const std::string& expected_route_config_name, + const bool xds_routing_enabled, absl::optional* rds_update, upb_arena* arena) { // Get the resources from the response. @@ -1182,8 +1187,9 @@ grpc_error* RdsResponseParse(XdsClient* client, TraceFlag* tracer, if (!upb_strview_eql(name, expected_name)) continue; // Parse the route_config. XdsApi::RdsUpdate local_rds_update; - grpc_error* error = RouteConfigParse( - client, tracer, route_config, expected_server_name, &local_rds_update); + grpc_error* error = + RouteConfigParse(client, tracer, route_config, expected_server_name, + xds_routing_enabled, &local_rds_update); if (error != GRPC_ERROR_NONE) return error; rds_update->emplace(std::move(local_rds_update)); return GRPC_ERROR_NONE; @@ -1463,6 +1469,7 @@ grpc_error* EdsResponseParse( grpc_error* XdsApi::ParseAdsResponse( const grpc_slice& encoded_response, const std::string& expected_server_name, const std::string& expected_route_config_name, + const bool xds_routing_enabled, const std::set& expected_cluster_names, const std::set& expected_eds_service_names, absl::optional* lds_update, @@ -1494,11 +1501,11 @@ grpc_error* XdsApi::ParseAdsResponse( // Parse the response according to the resource type. if (*type_url == kLdsTypeUrl) { return LdsResponseParse(client_, tracer_, response, expected_server_name, - lds_update, arena.ptr()); + xds_routing_enabled, lds_update, arena.ptr()); } else if (*type_url == kRdsTypeUrl) { return RdsResponseParse(client_, tracer_, response, expected_server_name, - expected_route_config_name, rds_update, - arena.ptr()); + expected_route_config_name, xds_routing_enabled, + rds_update, arena.ptr()); } else if (*type_url == kCdsTypeUrl) { return CdsResponseParse(client_, tracer_, response, expected_cluster_names, cds_update_map, arena.ptr()); diff --git a/src/core/ext/filters/client_channel/xds/xds_api.h b/src/core/ext/filters/client_channel/xds/xds_api.h index 28b173f019e..9bd74c777f7 100644 --- a/src/core/ext/filters/client_channel/xds/xds_api.h +++ b/src/core/ext/filters/client_channel/xds/xds_api.h @@ -257,6 +257,7 @@ class XdsApi { const grpc_slice& encoded_response, const std::string& expected_server_name, const std::string& expected_route_config_name, + const bool xds_routing_enabled, const std::set& expected_cluster_names, const std::set& expected_eds_service_names, absl::optional* lds_update, diff --git a/src/core/ext/filters/client_channel/xds/xds_client.cc b/src/core/ext/filters/client_channel/xds/xds_client.cc index 568b437fac5..78176ac865a 100644 --- a/src/core/ext/filters/client_channel/xds/xds_client.cc +++ b/src/core/ext/filters/client_channel/xds/xds_client.cc @@ -1245,7 +1245,7 @@ void XdsClient::ChannelState::AdsCallState::OnResponseReceivedLocked( (xds_client->lds_result_.has_value() ? xds_client->lds_result_->route_config_name : ""), - ads_calld->ClusterNamesForRequest(), + xds_client->xds_routing_enabled_, ads_calld->ClusterNamesForRequest(), ads_calld->EdsServiceNamesForRequest(), &lds_update, &rds_update, &cds_update_map, &eds_update_map, &version, &nonce, &type_url); grpc_slice_unref_internal(response_slice); @@ -1820,6 +1820,11 @@ grpc_millis GetRequestTimeout(const grpc_channel_args& args) { {15000, 0, INT_MAX}); } +bool GetXdsRoutingEnabled(const grpc_channel_args& args) { + return grpc_channel_args_find_integer(&args, GRPC_ARG_XDS_ROUTING_ENABLED, + {0, 0, 1}); +} + } // namespace XdsClient::XdsClient(Combiner* combiner, grpc_pollset_set* interested_parties, @@ -1828,6 +1833,7 @@ XdsClient::XdsClient(Combiner* combiner, grpc_pollset_set* interested_parties, const grpc_channel_args& channel_args, grpc_error** error) : InternallyRefCounted(&grpc_xds_client_trace), request_timeout_(GetRequestTimeout(channel_args)), + xds_routing_enabled_(GetXdsRoutingEnabled(channel_args)), combiner_(GRPC_COMBINER_REF(combiner, "xds_client")), interested_parties_(interested_parties), bootstrap_( diff --git a/src/core/ext/filters/client_channel/xds/xds_client.h b/src/core/ext/filters/client_channel/xds/xds_client.h index e958d016bce..c79c169eb2e 100644 --- a/src/core/ext/filters/client_channel/xds/xds_client.h +++ b/src/core/ext/filters/client_channel/xds/xds_client.h @@ -241,6 +241,8 @@ class XdsClient : public InternallyRefCounted { const grpc_millis request_timeout_; + const bool xds_routing_enabled_; + Combiner* combiner_; grpc_pollset_set* interested_parties_; diff --git a/test/cpp/end2end/test_multiple_service_impl.h b/test/cpp/end2end/test_multiple_service_impl.h index f5ec71b79f6..2b06117774c 100644 --- a/test/cpp/end2end/test_multiple_service_impl.h +++ b/test/cpp/end2end/test_multiple_service_impl.h @@ -141,13 +141,6 @@ void ServerTryCancel(ServerContext* context) { } } -void ServerTryCancelNonblocking(experimental::CallbackServerContext* context) { - EXPECT_FALSE(context->IsCancelled()); - context->TryCancel(); - gpr_log(GPR_INFO, - "Server called TryCancelNonblocking() to cancel the request"); -} - } // namespace class TestMultipleServiceSignaller { diff --git a/test/cpp/end2end/xds_end2end_test.cc b/test/cpp/end2end/xds_end2end_test.cc index 43f9e91a216..3a4831f7a26 100644 --- a/test/cpp/end2end/xds_end2end_test.cc +++ b/test/cpp/end2end/xds_end2end_test.cc @@ -1187,7 +1187,8 @@ class XdsEnd2endTest : public ::testing::TestWithParam { void ResetStub(int fallback_timeout = 0, int failover_timeout = 0, const grpc::string& expected_targets = "", - int xds_resource_does_not_exist_timeout = 0) { + int xds_resource_does_not_exist_timeout = 0, + int xds_routing_enabled = false) { ChannelArguments args; // TODO(juanlishen): Add setter to ChannelArguments. if (fallback_timeout > 0) { @@ -1200,6 +1201,9 @@ class XdsEnd2endTest : public ::testing::TestWithParam { args.SetInt(GRPC_ARG_XDS_RESOURCE_DOES_NOT_EXIST_TIMEOUT_MS, xds_resource_does_not_exist_timeout); } + if (xds_routing_enabled) { + args.SetInt(GRPC_ARG_XDS_ROUTING_ENABLED, 1); + } // If the parent channel is using the fake resolver, we inject the // response generator for the parent here, and then SetNextResolution() // will inject the xds channel's response generator via the parent's @@ -2178,11 +2182,13 @@ TEST_P(LdsTest, ChooseMatchedDomain) { AdsServiceImpl::ACKED); } -// Tests that the LDS client should NACK when the last route is not a default -// route. -TEST_P(LdsTest, DefaultRouteInvalid) { +// Tests that LDS client should choose the last route in the virtual host if +// multiple routes exist in the LDS response. +TEST_P(LdsTest, ChooseLastRoute) { RouteConfiguration route_config = balancers_[0]->ads_service()->default_route_config(); + *(route_config.mutable_virtual_hosts(0)->add_routes()) = + route_config.virtual_hosts(0).routes(0); route_config.mutable_virtual_hosts(0) ->mutable_routes(0) ->mutable_route() @@ -2193,7 +2199,7 @@ TEST_P(LdsTest, DefaultRouteInvalid) { SetNextResolutionForLbChannelAllBalancers(); (void)SendRpc(); EXPECT_EQ(balancers_[0]->ads_service()->lds_response_state(), - AdsServiceImpl::NACKED); + AdsServiceImpl::ACKED); } // Tests that LDS client should send a NACK if route match has non-empty prefix @@ -2259,6 +2265,7 @@ TEST_P(LdsTest, Timeout) { // Tests that LDS client should choose the default route (with no matching // specified) after unable to find a match with previous routes. TEST_P(LdsTest, XdsRoutingPathMatching) { + ResetStub(0, 0, "", 0, 1); const char* kNewCluster1Name = "new_cluster_1"; const char* kNewCluster2Name = "new_cluster_2"; const size_t kNumRpcs = 10; @@ -2331,6 +2338,7 @@ TEST_P(LdsTest, XdsRoutingPathMatching) { } TEST_P(LdsTest, XdsRoutingPrefixMatching) { + ResetStub(0, 0, "", 0, 1); const char* kNewCluster1Name = "new_cluster_1"; const char* kNewCluster2Name = "new_cluster_2"; const size_t kNumRpcs = 10; @@ -2393,6 +2401,7 @@ TEST_P(LdsTest, XdsRoutingPrefixMatching) { // Tests that LDS client should choose the default route (with no matching // specified) after unable to find a match with previous routes. TEST_P(LdsTest, XdsRoutingDefaultRoute) { + ResetStub(0, 0, "", 0, 1); const char* kNewCluster1Name = "new_cluster_1"; const char* kNewCluster2Name = "new_cluster_2"; const size_t kNumRpcs = 10; @@ -2507,12 +2516,14 @@ TEST_P(RdsTest, ChooseMatchedDomain) { AdsServiceImpl::ACKED); } -// Tests that the RDS client should NACK when the last route is not a default -// route. -TEST_P(RdsTest, DefaultRouteInvalid) { +// Tests that RDS client should choose the last route in the virtual host if +// multiple routes exist in the RDS response. +TEST_P(RdsTest, ChooseLastRoute) { balancers_[0]->ads_service()->SetLdsToUseDynamicRds(); RouteConfiguration route_config = balancers_[0]->ads_service()->default_route_config(); + *(route_config.mutable_virtual_hosts(0)->add_routes()) = + route_config.virtual_hosts(0).routes(0); route_config.mutable_virtual_hosts(0) ->mutable_routes(0) ->mutable_route() @@ -2523,7 +2534,7 @@ TEST_P(RdsTest, DefaultRouteInvalid) { SetNextResolutionForLbChannelAllBalancers(); (void)SendRpc(); EXPECT_EQ(balancers_[0]->ads_service()->rds_response_state(), - AdsServiceImpl::NACKED); + AdsServiceImpl::ACKED); } // Tests that RDS client should send a NACK if route match has non-empty prefix From 0a7b9dac06674d0c282ee7f20ff0bc5df2d59773 Mon Sep 17 00:00:00 2001 From: Donna Dionne Date: Fri, 10 Apr 2020 03:15:09 -0700 Subject: [PATCH 419/758] Fixing code review comments. --- .../lb_policy/xds/xds_routing.cc | 72 ++++++++--------- .../ext/filters/client_channel/xds/xds_api.cc | 15 ++-- .../filters/client_channel/xds/xds_client.cc | 42 +++++----- test/cpp/end2end/xds_end2end_test.cc | 78 ++----------------- 4 files changed, 70 insertions(+), 137 deletions(-) diff --git a/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc b/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc index 698463bcadc..7bcc05cc018 100644 --- a/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc +++ b/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc @@ -236,7 +236,7 @@ XdsRoutingLb::PickResult XdsRoutingLb::RoutePicker::Pick(PickArgs args) { result.error = grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING( "xds routing picker: no matching route"), - GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE); + GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_INTERNAL); return result; } @@ -610,7 +610,7 @@ class XdsRoutingLbFactory : public LoadBalancingPolicyFactory { std::vector error_list; // action map. XdsRoutingLbConfig::ActionMap action_map; - std::set action_in_use; + std::set action_to_be_used; auto it = json.object_value().find("actions"); if (it == json.object_value().end()) { error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( @@ -634,13 +634,13 @@ class XdsRoutingLbFactory : public LoadBalancingPolicyFactory { error_list.push_back(error); } else { action_map[p.first] = std::move(child_config); - action_in_use.insert(p.first); + action_to_be_used.insert(p.first); } } } - if (action_map.size() == 0) { + if (action_map.empty()) { error_list.push_back( - GRPC_ERROR_CREATE_FROM_COPIED_STRING("no valid actions configured")); + GRPC_ERROR_CREATE_FROM_STATIC_STRING("no valid actions configured")); } XdsRoutingLbConfig::RouteTable route_table; it = json.object_value().find("routes"); @@ -654,8 +654,11 @@ class XdsRoutingLbFactory : public LoadBalancingPolicyFactory { const Json::Array& array = it->second.array_value(); for (size_t i = 0; i < array.size(); ++i) { XdsRoutingLbConfig::Route route; - std::vector route_errors = ParseRoute(array[i], &route); + std::vector route_errors = + ParseRoute(array[i], action_map, &route, &action_to_be_used); if (!route_errors.empty()) { + // Can't use GRPC_ERROR_CREATE_FROM_VECTOR() here, because the error + // string is not static in this case. grpc_error* error = GRPC_ERROR_CREATE_FROM_COPIED_STRING( absl::StrCat("field:routes element: ", i, " error").c_str()); for (grpc_error* route_error : route_errors) { @@ -663,30 +666,21 @@ class XdsRoutingLbFactory : public LoadBalancingPolicyFactory { } error_list.push_back(error); } - // Validate action exists and mark it as used. - if (action_map.find(route.action) == action_map.end()) { - grpc_error* error = GRPC_ERROR_CREATE_FROM_STATIC_STRING( - absl::StrCat("field: routes element: ", i, " error: action ", - route.action, " does not exist") - .c_str()); - error_list.push_back(error); - } - action_in_use.erase(route.action); route_table.emplace_back(std::move(route)); } } - if (route_table.size() == 0) { + if (route_table.empty()) { grpc_error* error = GRPC_ERROR_CREATE_FROM_STATIC_STRING("no valid routes configured"); error_list.push_back(error); } - if (!(route_table[route_table.size() - 1].matcher.service.empty() && - route_table[route_table.size() - 1].matcher.method.empty())) { + if (!route_table.back().matcher.service.empty() || + !route_table.back().matcher.method.empty()) { grpc_error* error = GRPC_ERROR_CREATE_FROM_STATIC_STRING( "default route must not contain service or method"); error_list.push_back(error); } - if (!action_in_use.empty()) { + if (!action_to_be_used.empty()) { error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( "some actions were not referenced by any route")); } @@ -733,7 +727,7 @@ class XdsRoutingLbFactory : public LoadBalancingPolicyFactory { std::vector error_list; if (json.type() != Json::Type::OBJECT) { error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "field:methodName should be of type object")); + "value should be of type object")); return error_list; } // Parse service @@ -758,47 +752,53 @@ class XdsRoutingLbFactory : public LoadBalancingPolicyFactory { } if (route_config->service.empty() && !route_config->method.empty()) { error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "field:methodName error: service is empty when method is " - "not")); + "service is empty when method is not")); } return error_list; } - static std::vector ParseRoute(const Json& json, - XdsRoutingLbConfig::Route* route) { + static std::vector ParseRoute( + const Json& json, const XdsRoutingLbConfig::ActionMap& action_map, + XdsRoutingLbConfig::Route* route, + std::set* action_to_be_used) { std::vector error_list; if (json.type() != Json::Type::OBJECT) { error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "field:route element should be of type object")); + "value should be of type object")); return error_list; } // Parse MethodName. auto it = json.object_value().find("methodName"); if (it == json.object_value().end()) { error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "field:routes element: methodName is required")); + "field:methodName error:required field missing")); } else { - std::vector route_errors = + std::vector method_name_errors = ParseMethodName(it->second, &route->matcher); - if (!route_errors.empty()) { - grpc_error* error = - GRPC_ERROR_CREATE_FROM_COPIED_STRING("field:route element error"); - for (grpc_error* route_error : route_errors) { - error = grpc_error_add_child(error, route_error); - } - error_list.push_back(error); + if (!method_name_errors.empty()) { + error_list.push_back(GRPC_ERROR_CREATE_FROM_VECTOR( + "field:methodName", &method_name_errors)); } } // Parse action. it = json.object_value().find("action"); if (it == json.object_value().end()) { error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "field:route element: action is required")); + "field:action error:required field missing")); } else if (it->second.type() != Json::Type::STRING) { error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "field:route element error action should be of type string")); + "field:action error:should be of type string")); } else { route->action = it->second.string_value(); + // Validate action exists and mark it as used. + if (!route->action.empty() && + action_map.find(route->action) == action_map.end()) { + error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + absl::StrCat("field:action error:", route->action, + " does not exist") + .c_str())); + } + action_to_be_used->erase(route->action); } return error_list; } diff --git a/src/core/ext/filters/client_channel/xds/xds_api.cc b/src/core/ext/filters/client_channel/xds/xds_api.cc index 0ed3753bd91..d74b2ab694f 100644 --- a/src/core/ext/filters/client_channel/xds/xds_api.cc +++ b/src/core/ext/filters/client_channel/xds/xds_api.cc @@ -1051,12 +1051,6 @@ grpc_error* RouteConfigParse( "Path is not empty string, prefix cannot also be non-empty."); } } - if (i == (size - 1)) { - if (!(rds_route.service.empty() && rds_route.method.empty())) { - return GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "Default route must have empty service and method"); - } - } if (!envoy_api_v2_route_Route_has_route(route)) { return GRPC_ERROR_CREATE_FROM_STATIC_STRING( "No RouteAction found in route."); @@ -1073,6 +1067,15 @@ grpc_error* RouteConfigParse( rds_route.cluster_name = std::string(action.data, action.size); rds_update->routes.emplace_back(std::move(rds_route)); } + if (rds_update->routes.empty()) { + return GRPC_ERROR_CREATE_FROM_STATIC_STRING("No valid routes specified."); + } else { + if (!rds_update->routes.back().service.empty() || + !rds_update->routes.back().method.empty()) { + return GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "Default route must have empty service and method"); + } + } return GRPC_ERROR_NONE; } diff --git a/src/core/ext/filters/client_channel/xds/xds_client.cc b/src/core/ext/filters/client_channel/xds/xds_client.cc index 78176ac865a..33e9d17c519 100644 --- a/src/core/ext/filters/client_channel/xds/xds_client.cc +++ b/src/core/ext/filters/client_channel/xds/xds_client.cc @@ -903,10 +903,8 @@ void XdsClient::ChannelState::AdsCallState::AcceptLdsUpdate( ? lds_update->route_config_name.c_str() : "")); if (lds_update->rds_update.has_value()) { - gpr_log(GPR_INFO, - " [xds_client %p] LDS update received; LDS RouteConfiguration " - "contains %lu routes", - this, lds_update->rds_update.value().routes.size()); + gpr_log(GPR_INFO, " RouteConfiguration contains %lu routes", this, + lds_update->rds_update.value().routes.size()); for (const auto& route : lds_update->rds_update.value().routes) { gpr_log(GPR_INFO, " route: { service=\"%s\", " @@ -2061,29 +2059,29 @@ void XdsClient::ResetBackoff() { namespace { std::string CreateServiceConfigActionCluster(const std::string& cluster_name) { - return ( - absl::StrFormat(" \"cds:%s\":{\n" - " \"child_policy\":[ {\n" - " \"cds_experimental\":{\n" - " \"cluster\": \"%s\"\n" - " }\n" - " } ]\n" - " }", - cluster_name.c_str(), cluster_name.c_str())); + return absl::StrFormat( + " \"cds:%s\":{\n" + " \"child_policy\":[ {\n" + " \"cds_experimental\":{\n" + " \"cluster\": \"%s\"\n" + " }\n" + " } ]\n" + " }", + cluster_name.c_str(), cluster_name.c_str()); } std::string CreateServiceConfigRoute(const std::string& cluster_name, const std::string& service, const std::string& method) { - return ( - absl::StrFormat(" { \n" - " \"methodName\": {\n" - " \"service\": \"%s\",\n" - " \"method\": \"%s\"\n" - " },\n" - " \"action\": \"cds:%s\"\n" - " }", - service.c_str(), method.c_str(), cluster_name.c_str())); + return absl::StrFormat( + " { \n" + " \"methodName\": {\n" + " \"service\": \"%s\",\n" + " \"method\": \"%s\"\n" + " },\n" + " \"action\": \"cds:%s\"\n" + " }", + service.c_str(), method.c_str(), cluster_name.c_str()); } } // namespace diff --git a/test/cpp/end2end/xds_end2end_test.cc b/test/cpp/end2end/xds_end2end_test.cc index 3a4831f7a26..2665f9e9082 100644 --- a/test/cpp/end2end/xds_end2end_test.cc +++ b/test/cpp/end2end/xds_end2end_test.cc @@ -2312,11 +2312,11 @@ TEST_P(LdsTest, XdsRoutingPathMatching) { mismatched_route2->mutable_route()->set_cluster(kNewCluster2Name); auto* default_route = new_route_config.mutable_virtual_hosts(0)->add_routes(); default_route->mutable_match()->set_prefix(""); - default_route->mutable_match()->set_path(""); default_route->mutable_route()->set_cluster(kDefaultResourceName); Listener listener = balancers_[0]->ads_service()->BuildListener(new_route_config); balancers_[0]->ads_service()->SetLdsResource(listener, kDefaultResourceName); + CheckRpcSendOk(kNumRpcs, 1000, true); CheckEcho1RpcSendOk(kNumRpcs, 1000, true); CheckEcho2RpcSendOk(kNumRpcs, 1000, true); // Make sure RPCs all go to the correct backend. @@ -2330,7 +2330,7 @@ TEST_P(LdsTest, XdsRoutingPathMatching) { EXPECT_EQ(0, backends_[i]->backend1_service()->request_count()); EXPECT_EQ(kNumRpcs, backends_[i]->backend2_service()->request_count()); } else { - EXPECT_EQ(0, backends_[i]->backend_service()->request_count()); + EXPECT_EQ(kNumRpcs / 2, backends_[i]->backend_service()->request_count()); EXPECT_EQ(0, backends_[i]->backend1_service()->request_count()); EXPECT_EQ(0, backends_[i]->backend2_service()->request_count()); } @@ -2378,7 +2378,6 @@ TEST_P(LdsTest, XdsRoutingPrefixMatching) { matched_route->mutable_route()->set_cluster(kNewCluster2Name); auto* default_route = new_route_config.mutable_virtual_hosts(0)->add_routes(); default_route->mutable_match()->set_prefix(""); - default_route->mutable_match()->set_path(""); default_route->mutable_route()->set_cluster(kDefaultResourceName); Listener listener = balancers_[0]->ads_service()->BuildListener(new_route_config); @@ -2398,73 +2397,6 @@ TEST_P(LdsTest, XdsRoutingPrefixMatching) { } } -// Tests that LDS client should choose the default route (with no matching -// specified) after unable to find a match with previous routes. -TEST_P(LdsTest, XdsRoutingDefaultRoute) { - ResetStub(0, 0, "", 0, 1); - const char* kNewCluster1Name = "new_cluster_1"; - const char* kNewCluster2Name = "new_cluster_2"; - const size_t kNumRpcs = 10; - SetNextResolution({}); - SetNextResolutionForLbChannelAllBalancers(); - // Populate new EDS resources. - AdsServiceImpl::EdsResourceArgs args({ - {"locality0", GetBackendPorts(0, 2)}, - }); - AdsServiceImpl::EdsResourceArgs args1({ - {"locality0", GetBackendPorts(2, 3)}, - }); - AdsServiceImpl::EdsResourceArgs args2({ - {"locality0", GetBackendPorts(3, 4)}, - }); - balancers_[0]->ads_service()->SetEdsResource( - AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); - balancers_[0]->ads_service()->SetEdsResource( - AdsServiceImpl::BuildEdsResource(args1, kNewCluster1Name), - kNewCluster1Name); - balancers_[0]->ads_service()->SetEdsResource( - AdsServiceImpl::BuildEdsResource(args2, kNewCluster2Name), - kNewCluster2Name); - // Populate new CDS resources. - Cluster new_cluster1 = balancers_[0]->ads_service()->default_cluster(); - new_cluster1.set_name(kNewCluster1Name); - balancers_[0]->ads_service()->SetCdsResource(new_cluster1, kNewCluster1Name); - Cluster new_cluster2 = balancers_[0]->ads_service()->default_cluster(); - new_cluster2.set_name(kNewCluster2Name); - balancers_[0]->ads_service()->SetCdsResource(new_cluster2, kNewCluster2Name); - // Change RDS resource to set up prefix matching and path matching that do - // match the traffic, so traffic goes to the default cluster. - RouteConfiguration new_route_config = - balancers_[0]->ads_service()->default_route_config(); - auto* mismatched_route1 = - new_route_config.mutable_virtual_hosts(0)->mutable_routes(0); - mismatched_route1->mutable_match()->set_prefix( - "/grpc.testing.EchoTestService0"); - mismatched_route1->mutable_route()->set_cluster(kNewCluster1Name); - auto* mismatched_route2 = - new_route_config.mutable_virtual_hosts(0)->add_routes(); - mismatched_route2->mutable_match()->set_path( - "/grpc.testing.EchoTestService/Echo1"); - mismatched_route2->mutable_route()->set_cluster(kNewCluster2Name); - auto* default_route = new_route_config.mutable_virtual_hosts(0)->add_routes(); - default_route->mutable_match()->set_prefix(""); - default_route->mutable_match()->set_path(""); - default_route->mutable_route()->set_cluster(kDefaultResourceName); - Listener listener = - balancers_[0]->ads_service()->BuildListener(new_route_config); - balancers_[0]->ads_service()->SetLdsResource(listener, kDefaultResourceName); - WaitForAllBackends(0, 2); - CheckRpcSendOk(kNumRpcs); - // Make sure RPCs all go to the correct backend. - for (size_t i = 0; i < 4; ++i) { - if (i < 2) { - EXPECT_EQ(kNumRpcs / 2, backends_[i]->backend_service()->request_count()); - } else { - EXPECT_EQ(0, backends_[i]->backend_service()->request_count()); - } - } -} - using RdsTest = BasicTest; // Tests that RDS client should send an ACK upon correct RDS response. @@ -2783,7 +2715,7 @@ TEST_P(LocalityMapTest, NoLocalities) { // Tests that the locality map can work properly even when it contains a large // number of localities. -/*TEST_P(LocalityMapTest, StressTest) { +TEST_P(LocalityMapTest, StressTest) { SetNextResolution({}); SetNextResolutionForLbChannelAllBalancers(); const size_t kNumLocalities = 100; @@ -2807,13 +2739,13 @@ TEST_P(LocalityMapTest, NoLocalities) { AdsServiceImpl::BuildEdsResource(args), 60 * 1000, kDefaultResourceName)); // Wait until backend 0 is ready, before which kNumLocalities localities are // received and handled by the xds policy. - WaitForBackend(0, /*reset_counters=*false); + WaitForBackend(0, /*reset_counters=*/false); EXPECT_EQ(0U, backends_[1]->backend_service()->request_count()); // Wait until backend 1 is ready, before which kNumLocalities localities are // removed by the xds policy. WaitForBackend(1); delayed_resource_setter.join(); -}*/ +} // Tests that the localities in a locality map are picked correctly after update // (addition, modification, deletion). From 7a654ed1a5569c5bb3ee443ad24425a265e19669 Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Fri, 10 Apr 2020 03:34:37 -0700 Subject: [PATCH 420/758] Remove const data member from ByteStream to make it copyable --- src/core/lib/transport/byte_stream.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/lib/transport/byte_stream.h b/src/core/lib/transport/byte_stream.h index 6988ab843b2..ffa9b47c20d 100644 --- a/src/core/lib/transport/byte_stream.h +++ b/src/core/lib/transport/byte_stream.h @@ -72,7 +72,7 @@ class ByteStream : public Orphanable { : length_(length), flags_(flags) {} private: - const uint32_t length_; + uint32_t length_; uint32_t flags_; }; From 2b3eca0858f26cac5f2ecf47d1c3172c4fdb7fef Mon Sep 17 00:00:00 2001 From: Taras Galkovskyi Date: Fri, 10 Apr 2020 14:09:17 +0000 Subject: [PATCH 421/758] adding api to configure target service accounts for client ALTS --- src/python/grpcio/grpc/__init__.py | 8 +++++--- .../grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi | 8 +++++--- src/python/grpcio/grpc/_cython/_cygrpc/grpc.pxi | 1 + src/python/grpcio_tests/tests/interop/client.py | 2 +- 4 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/python/grpcio/grpc/__init__.py b/src/python/grpcio/grpc/__init__.py index 04c3f69a475..ac17c53d6e9 100644 --- a/src/python/grpcio/grpc/__init__.py +++ b/src/python/grpcio/grpc/__init__.py @@ -1833,22 +1833,24 @@ def local_server_credentials(local_connect_type=LocalConnectionType.LOCAL_TCP): _cygrpc.server_credentials_local(local_connect_type.value)) -def alts_channel_credentials(): +def alts_channel_credentials(service_accounts=[]): """Creates a ChannelCredentials for use with an ALTS-enabled Channel. This is an EXPERIMENTAL API. + Args: + service_accounts: list of strings, target service accounts Returns: A ChannelCredentials for use with an ALTS-enabled Channel """ - return ChannelCredentials(_cygrpc.channel_credentials_alts()) + return ChannelCredentials(_cygrpc.channel_credentials_alts(service_accounts)) def alts_server_credentials(): """Creates a ServerCredentials for use with an ALTS-enabled connections. This is an EXPERIMENTAL API. - + Returns: A ServerCredentials for use with an ALTS-enabled Server """ diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi index a45766abc67..3cc11362bc6 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi @@ -354,8 +354,10 @@ def server_credentials_local(grpc_local_connect_type local_connect_type): cdef class ALTSChannelCredentials(ChannelCredentials): - def __cinit__(self): + def __cinit__(self, service_accounts): self.c_options = grpc_alts_credentials_client_options_create() + for account in service_accounts: + grpc_alts_credentials_client_options_add_target_service_account(self.c_options, account) def __dealloc__(self): if self.c_options != NULL: @@ -365,8 +367,8 @@ cdef class ALTSChannelCredentials(ChannelCredentials): return grpc_alts_credentials_create(self.c_options) -def channel_credentials_alts(): - return ALTSChannelCredentials() +def channel_credentials_alts(service_accounts): + return ALTSChannelCredentials(service_accounts) def server_credentials_alts(): diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/grpc.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/grpc.pxi index e8b164a7004..98a71f92699 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/grpc.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/grpc.pxi @@ -618,6 +618,7 @@ cdef extern from "grpc/grpc_security.h": grpc_alts_credentials_options* grpc_alts_credentials_client_options_create() grpc_alts_credentials_options* grpc_alts_credentials_server_options_create() void grpc_alts_credentials_options_destroy(grpc_alts_credentials_options *options) + void grpc_alts_credentials_client_options_add_target_service_account(grpc_alts_credentials_options *options, const char *service_account) diff --git a/src/python/grpcio_tests/tests/interop/client.py b/src/python/grpcio_tests/tests/interop/client.py index 6537413dbdd..03f6113a88c 100644 --- a/src/python/grpcio_tests/tests/interop/client.py +++ b/src/python/grpcio_tests/tests/interop/client.py @@ -107,7 +107,7 @@ def get_secure_channel_parameters(args): args.server_host_override, ),) else args.use_alts: - channel_credentials = grpc.alts_channel_credentials() + channel_credentials = grpc.alts_channel_credentials(['svc_account1@gmail.com']) return channel_credentials, channel_opts From 83ada3b598671946c482c955445e6ec44bdb5e95 Mon Sep 17 00:00:00 2001 From: Taras Galkovskyi Date: Fri, 10 Apr 2020 14:20:27 +0000 Subject: [PATCH 422/758] adjusting formatting & tests --- src/python/grpcio/grpc/_cython/_cygrpc/credentials.pxd.pxi | 1 + src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi | 1 + src/python/grpcio_tests/tests/unit/_alts_credentials_test.py | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/credentials.pxd.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/credentials.pxd.pxi index 2b68117eaa6..ddaedb30bd4 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/credentials.pxd.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/credentials.pxd.pxi @@ -12,6 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. + cdef class CallCredentials: cdef grpc_call_credentials *c(self) except * diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi index 3cc11362bc6..e7ed15cd16b 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi @@ -12,6 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. + def _spawn_callback_in_thread(cb_func, args): t = ForkManagedThread(target=cb_func, args=args) t.setDaemon(True) diff --git a/src/python/grpcio_tests/tests/unit/_alts_credentials_test.py b/src/python/grpcio_tests/tests/unit/_alts_credentials_test.py index 4a608b80cfa..a6809c02a1a 100644 --- a/src/python/grpcio_tests/tests/unit/_alts_credentials_test.py +++ b/src/python/grpcio_tests/tests/unit/_alts_credentials_test.py @@ -37,7 +37,7 @@ class ALTSCredentialsTest(unittest.TestCase): 'TODO(https://github.com/grpc/grpc/issues/20078)') def test_alts(self): server_addr = 'localhost:{}' - channel_creds = grpc.alts_channel_credentials() + channel_creds = grpc.alts_channel_credentials(['svcacct@server.com']) server_creds = grpc.alts_server_credentials() server = self._create_server() From 72cd29266d29df73a249fc406a72acdb3be4dc88 Mon Sep 17 00:00:00 2001 From: Taras Galkovskyi Date: Fri, 10 Apr 2020 14:27:30 +0000 Subject: [PATCH 423/758] simplify ALTS client --- .../python/data_transmission/alts_client.py | 97 ++----------------- .../python/data_transmission/alts_server.py | 91 ++--------------- 2 files changed, 14 insertions(+), 174 deletions(-) diff --git a/examples/python/data_transmission/alts_client.py b/examples/python/data_transmission/alts_client.py index 4595e249b38..a1dc8ec558e 100644 --- a/examples/python/data_transmission/alts_client.py +++ b/examples/python/data_transmission/alts_client.py @@ -1,4 +1,4 @@ -# Copyright 2019 gRPC authors. +# Copyright 2020 gRPC authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -11,107 +11,24 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -"""The example of four ways of data transmission using gRPC in Python.""" +"""The example of using ALTS credentials to setup gRPC client.""" import time import grpc +import client import demo_pb2_grpc import demo_pb2 SERVER_ADDRESS = "localhost:23333" -CLIENT_ID = 1 - -# 中文注释和英文翻译 -# Note that this example was contributed by an external user using Chinese comments. -# In all cases, the Chinese comment text is translated to English just below it. - - -# 一元模式(在一次调用中, 客户端只能向服务器传输一次请求数据, 服务器也只能返回一次响应) -# unary-unary(In a single call, the client can only send request once, and the server can -# only respond once.) -def simple_method(stub): - print("--------------Call SimpleMethod Begin--------------") - request = demo_pb2.Request(client_id=CLIENT_ID, - request_data="called by Python client") - response = stub.SimpleMethod(request) - print("resp from server(%d), the message=%s" % - (response.server_id, response.response_data)) - print("--------------Call SimpleMethod Over---------------") - - -# 客户端流模式(在一次调用中, 客户端可以多次向服务器传输数据, 但是服务器只能返回一次响应) -# stream-unary (In a single call, the client can transfer data to the server several times, -# but the server can only return a response once.) -def client_streaming_method(stub): - print("--------------Call ClientStreamingMethod Begin--------------") - - # 创建一个生成器 - # create a generator - def request_messages(): - for i in range(5): - request = demo_pb2.Request( - client_id=CLIENT_ID, - request_data=("called by Python client, message:%d" % i)) - yield request - - response = stub.ClientStreamingMethod(request_messages()) - print("resp from server(%d), the message=%s" % - (response.server_id, response.response_data)) - print("--------------Call ClientStreamingMethod Over---------------") - - -# 服务端流模式(在一次调用中, 客户端只能一次向服务器传输数据, 但是服务器可以多次返回响应) -# unary-stream (In a single call, the client can only transmit data to the server at one time, -# but the server can return the response many times.) -def server_streaming_method(stub): - print("--------------Call ServerStreamingMethod Begin--------------") - request = demo_pb2.Request(client_id=CLIENT_ID, - request_data="called by Python client") - response_iterator = stub.ServerStreamingMethod(request) - for response in response_iterator: - print("recv from server(%d), message=%s" % - (response.server_id, response.response_data)) - - print("--------------Call ServerStreamingMethod Over---------------") - - -# 双向流模式 (在一次调用中, 客户端和服务器都可以向对方多次收发数据) -# stream-stream (In a single call, both client and server can send and receive data -# to each other multiple times.) -def bidirectional_streaming_method(stub): - print( - "--------------Call BidirectionalStreamingMethod Begin---------------") - - # 创建一个生成器 - # create a generator - def request_messages(): - for i in range(5): - request = demo_pb2.Request( - client_id=CLIENT_ID, - request_data=("called by Python client, message: %d" % i)) - yield request - time.sleep(1) - - response_iterator = stub.BidirectionalStreamingMethod(request_messages()) - for response in response_iterator: - print("recv from server(%d), message=%s" % - (response.server_id, response.response_data)) - - print("--------------Call BidirectionalStreamingMethod Over---------------") - def main(): with grpc.secure_channel(SERVER_ADDRESS, credentials=grpc.alts_channel_credentials()) as channel: stub = demo_pb2_grpc.GRPCDemoStub(channel) - - simple_method(stub) - - client_streaming_method(stub) - - server_streaming_method(stub) - - bidirectional_streaming_method(stub) + client.simple_method(stub) + client.client_streaming_method(stub) + client.server_streaming_method(stub) + client.bidirectional_streaming_method(stub) if __name__ == '__main__': diff --git a/examples/python/data_transmission/alts_server.py b/examples/python/data_transmission/alts_server.py index 05c2dc34ac1..29a8417152e 100644 --- a/examples/python/data_transmission/alts_server.py +++ b/examples/python/data_transmission/alts_server.py @@ -11,7 +11,7 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -"""The example of four ways of data transmission using gRPC in Python.""" +"""The example of using ALTS credentials to setup gRPC server in python.""" from threading import Thread from concurrent import futures @@ -19,95 +19,18 @@ from concurrent import futures import grpc import demo_pb2_grpc import demo_pb2 +import server SERVER_ADDRESS = 'localhost:23333' -SERVER_ID = 1 - - -class DemoServer(demo_pb2_grpc.GRPCDemoServicer): - - # 一元模式(在一次调用中, 客户端只能向服务器传输一次请求数据, 服务器也只能返回一次响应) - # unary-unary(In a single call, the client can only send request once, and the server can - # only respond once.) - def SimpleMethod(self, request, context): - print("SimpleMethod called by client(%d) the message: %s" % - (request.client_id, request.request_data)) - response = demo_pb2.Response( - server_id=SERVER_ID, - response_data="Python server SimpleMethod Ok!!!!") - return response - - # 客户端流模式(在一次调用中, 客户端可以多次向服务器传输数据, 但是服务器只能返回一次响应) - # stream-unary (In a single call, the client can transfer data to the server several times, - # but the server can only return a response once.) - def ClientStreamingMethod(self, request_iterator, context): - print("ClientStreamingMethod called by client...") - for request in request_iterator: - print("recv from client(%d), message= %s" % - (request.client_id, request.request_data)) - response = demo_pb2.Response( - server_id=SERVER_ID, - response_data="Python server ClientStreamingMethod ok") - return response - - # 服务端流模式(在一次调用中, 客户端只能一次向服务器传输数据, 但是服务器可以多次返回响应) - # unary-stream (In a single call, the client can only transmit data to the server at one time, - # but the server can return the response many times.) - def ServerStreamingMethod(self, request, context): - print("ServerStreamingMethod called by client(%d), message= %s" % - (request.client_id, request.request_data)) - - # 创建一个生成器 - # create a generator - def response_messages(): - for i in range(5): - response = demo_pb2.Response( - server_id=SERVER_ID, - response_data=("send by Python server, message=%d" % i)) - yield response - - return response_messages() - - # 双向流模式 (在一次调用中, 客户端和服务器都可以向对方多次收发数据) - # stream-stream (In a single call, both client and server can send and receive data - # to each other multiple times.) - def BidirectionalStreamingMethod(self, request_iterator, context): - print("BidirectionalStreamingMethod called by client...") - - # 开启一个子线程去接收数据 - # Open a sub thread to receive data - def parse_request(): - for request in request_iterator: - print("recv from client(%d), message= %s" % - (request.client_id, request.request_data)) - - t = Thread(target=parse_request) - t.start() - - for i in range(5): - yield demo_pb2.Response( - server_id=SERVER_ID, - response_data=("send by Python server, message= %d" % i)) - - t.join() def main(): - server = grpc.server(futures.ThreadPoolExecutor()) - - demo_pb2_grpc.add_GRPCDemoServicer_to_server(DemoServer(), server) - - server.add_secure_port(SERVER_ADDRESS, server_credentials=grpc.alts_server_credentials()) + svr = grpc.server(futures.ThreadPoolExecutor()) + demo_pb2_grpc.add_GRPCDemoServicer_to_server(server.DemoServer(), svr) + svr.add_secure_port(SERVER_ADDRESS, server_credentials=grpc.alts_server_credentials()) print("------------------start Python GRPC server with ALTS encryption") - server.start() - server.wait_for_termination() - - # If raise Error: - # AttributeError: '_Server' object has no attribute 'wait_for_termination' - # You can use the following code instead: - # import time - # while 1: - # time.sleep(10) + svr.start() + svr.wait_for_termination() if __name__ == '__main__': From 97e7c5e9b6dbb34439f355a77a2e66d42593e41e Mon Sep 17 00:00:00 2001 From: Taras Galkovskyi Date: Fri, 10 Apr 2020 14:30:57 +0000 Subject: [PATCH 424/758] ALTS BUILD file for exampel --- examples/BUILD | 2 ++ 1 file changed, 2 insertions(+) diff --git a/examples/BUILD b/examples/BUILD index a214e4ec977..057940abd3a 100644 --- a/examples/BUILD +++ b/examples/BUILD @@ -255,6 +255,7 @@ py_binary( "python/data_transmission/alts_server.py", "python/data_transmission/demo_pb2.py", "python/data_transmission/demo_pb2_grpc.py", + "python/data_transmission/server.py", ], deps = [ "//src/python/grpcio/grpc:grpcio", @@ -268,6 +269,7 @@ py_binary( main = "alts_client.py", srcs = [ "python/data_transmission/alts_client.py", + "python/data_transmission/client.py", "python/data_transmission/demo_pb2.py", "python/data_transmission/demo_pb2_grpc.py", ], From d5d258b70f8a544f7386c81ea8a5b945369fddb0 Mon Sep 17 00:00:00 2001 From: Eric Gribkoff Date: Fri, 10 Apr 2020 00:08:48 -0700 Subject: [PATCH 425/758] Do not set default port in url map patch --- tools/run_tests/run_xds_tests.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/tools/run_tests/run_xds_tests.py b/tools/run_tests/run_xds_tests.py index 3dc66ab7424..b7e82310461 100755 --- a/tools/run_tests/run_xds_tests.py +++ b/tools/run_tests/run_xds_tests.py @@ -646,7 +646,7 @@ def create_url_map(gcp, name, backend_service, host_name): gcp.url_map = GcpResource(config['name'], result['targetLink']) -def patch_url_map_host_rule(gcp, name, backend_service, host_name): +def patch_url_map_host_rule_with_port(gcp, name, backend_service, host_name): config = { 'hostRules': [{ 'hosts': ['%s:%d' % (host_name, gcp.service_port)], @@ -1007,8 +1007,10 @@ try: if not gcp.service_port: raise Exception( 'Failed to find a valid ip:port for the forwarding rule') - patch_url_map_host_rule(gcp, url_map_name, backend_service, - service_host_name) + if gcp.service_port != _DEFAULT_SERVICE_PORT: + patch_url_map_host_rule_with_port(gcp, url_map_name, + backend_service, + service_host_name) startup_script = get_startup_script(args.path_to_server_binary, gcp.service_port) create_instance_template(gcp, template_name, args.network, From c34311d996f484fd9f3ba9de46966aef7295733c Mon Sep 17 00:00:00 2001 From: Eric Gribkoff Date: Fri, 10 Apr 2020 10:13:57 -0700 Subject: [PATCH 426/758] Wait longer for backend instance patch --- tools/run_tests/run_xds_tests.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tools/run_tests/run_xds_tests.py b/tools/run_tests/run_xds_tests.py index b7e82310461..3ee9286431d 100755 --- a/tools/run_tests/run_xds_tests.py +++ b/tools/run_tests/run_xds_tests.py @@ -797,7 +797,9 @@ def patch_backend_instances(gcp, result = gcp.alpha_compute.backendServices().patch( project=gcp.project, backendService=backend_service.name, body=config).execute() - wait_for_global_operation(gcp, result['name']) + wait_for_global_operation(gcp, + result['name'], + timeout_sec=_WAIT_FOR_BACKEND_SEC) def resize_instance_group(gcp, From 65e24bcfc904f363ef6a98c0a355c64a9153243f Mon Sep 17 00:00:00 2001 From: Muxi Yan Date: Fri, 10 Apr 2020 10:40:41 -0700 Subject: [PATCH 427/758] make generated header idempotent --- src/boringssl/boringssl_prefix_symbols.h | 6475 +++++++++-------- src/objective-c/BoringSSL-GRPC.podspec | 2 +- .../generate_boringssl_prefix_header.sh | 2 +- 3 files changed, 3240 insertions(+), 3239 deletions(-) diff --git a/src/boringssl/boringssl_prefix_symbols.h b/src/boringssl/boringssl_prefix_symbols.h index 72b63f318a7..46578af028b 100644 --- a/src/boringssl/boringssl_prefix_symbols.h +++ b/src/boringssl/boringssl_prefix_symbols.h @@ -19,3240 +19,3241 @@ #define BORINGSSL_ADD_PREFIX(a, b) BORINGSSL_ADD_PREFIX_INNER(a, b) #define BORINGSSL_ADD_PREFIX_INNER(a, b) a ## _ ## b -#define GRPC_BIO_f_ssl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_f_ssl) -#define GRPC_BIO_set_ssl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_set_ssl) -#define GRPC_DTLS_client_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DTLS_client_method) -#define GRPC_DTLS_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DTLS_method) -#define GRPC_DTLS_server_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DTLS_server_method) -#define GRPC_DTLS_with_buffers_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DTLS_with_buffers_method) -#define GRPC_DTLSv1_2_client_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DTLSv1_2_client_method) -#define GRPC_DTLSv1_2_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DTLSv1_2_method) -#define GRPC_DTLSv1_2_server_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DTLSv1_2_server_method) -#define GRPC_DTLSv1_client_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DTLSv1_client_method) -#define GRPC_DTLSv1_get_timeout BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DTLSv1_get_timeout) -#define GRPC_DTLSv1_handle_timeout BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DTLSv1_handle_timeout) -#define GRPC_DTLSv1_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DTLSv1_method) -#define GRPC_DTLSv1_server_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DTLSv1_server_method) -#define GRPC_DTLSv1_set_initial_timeout_duration BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DTLSv1_set_initial_timeout_duration) -#define GRPC_ERR_load_SSL_strings BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ERR_load_SSL_strings) -#define GRPC_OPENSSL_init_ssl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OPENSSL_init_ssl) -#define GRPC_PEM_read_SSL_SESSION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_SSL_SESSION) -#define GRPC_PEM_read_bio_SSL_SESSION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_bio_SSL_SESSION) -#define GRPC_PEM_write_SSL_SESSION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_SSL_SESSION) -#define GRPC_PEM_write_bio_SSL_SESSION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_bio_SSL_SESSION) -#define GRPC_SSL_CIPHER_description BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CIPHER_description) -#define GRPC_SSL_CIPHER_get_auth_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CIPHER_get_auth_nid) -#define GRPC_SSL_CIPHER_get_bits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CIPHER_get_bits) -#define GRPC_SSL_CIPHER_get_cipher_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CIPHER_get_cipher_nid) -#define GRPC_SSL_CIPHER_get_digest_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CIPHER_get_digest_nid) -#define GRPC_SSL_CIPHER_get_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CIPHER_get_id) -#define GRPC_SSL_CIPHER_get_kx_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CIPHER_get_kx_name) -#define GRPC_SSL_CIPHER_get_kx_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CIPHER_get_kx_nid) -#define GRPC_SSL_CIPHER_get_max_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CIPHER_get_max_version) -#define GRPC_SSL_CIPHER_get_min_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CIPHER_get_min_version) -#define GRPC_SSL_CIPHER_get_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CIPHER_get_name) -#define GRPC_SSL_CIPHER_get_prf_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CIPHER_get_prf_nid) -#define GRPC_SSL_CIPHER_get_rfc_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CIPHER_get_rfc_name) -#define GRPC_SSL_CIPHER_get_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CIPHER_get_value) -#define GRPC_SSL_CIPHER_get_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CIPHER_get_version) -#define GRPC_SSL_CIPHER_is_aead BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CIPHER_is_aead) -#define GRPC_SSL_CIPHER_is_block_cipher BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CIPHER_is_block_cipher) -#define GRPC_SSL_CIPHER_standard_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CIPHER_standard_name) -#define GRPC_SSL_COMP_add_compression_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_COMP_add_compression_method) -#define GRPC_SSL_COMP_free_compression_methods BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_COMP_free_compression_methods) -#define GRPC_SSL_COMP_get0_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_COMP_get0_name) -#define GRPC_SSL_COMP_get_compression_methods BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_COMP_get_compression_methods) -#define GRPC_SSL_COMP_get_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_COMP_get_id) -#define GRPC_SSL_COMP_get_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_COMP_get_name) -#define GRPC_SSL_CTX_add0_chain_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_add0_chain_cert) -#define GRPC_SSL_CTX_add1_chain_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_add1_chain_cert) -#define GRPC_SSL_CTX_add_cert_compression_alg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_add_cert_compression_alg) -#define GRPC_SSL_CTX_add_client_CA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_add_client_CA) -#define GRPC_SSL_CTX_add_extra_chain_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_add_extra_chain_cert) -#define GRPC_SSL_CTX_add_session BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_add_session) -#define GRPC_SSL_CTX_check_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_check_private_key) -#define GRPC_SSL_CTX_cipher_in_group BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_cipher_in_group) -#define GRPC_SSL_CTX_clear_chain_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_clear_chain_certs) -#define GRPC_SSL_CTX_clear_extra_chain_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_clear_extra_chain_certs) -#define GRPC_SSL_CTX_clear_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_clear_mode) -#define GRPC_SSL_CTX_clear_options BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_clear_options) -#define GRPC_SSL_CTX_enable_ocsp_stapling BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_enable_ocsp_stapling) -#define GRPC_SSL_CTX_enable_signed_cert_timestamps BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_enable_signed_cert_timestamps) -#define GRPC_SSL_CTX_enable_tls_channel_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_enable_tls_channel_id) -#define GRPC_SSL_CTX_flush_sessions BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_flush_sessions) -#define GRPC_SSL_CTX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_free) -#define GRPC_SSL_CTX_get0_certificate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_get0_certificate) -#define GRPC_SSL_CTX_get0_chain_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_get0_chain_certs) -#define GRPC_SSL_CTX_get0_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_get0_param) -#define GRPC_SSL_CTX_get0_privatekey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_get0_privatekey) -#define GRPC_SSL_CTX_get_cert_store BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_get_cert_store) -#define GRPC_SSL_CTX_get_channel_id_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_get_channel_id_cb) -#define GRPC_SSL_CTX_get_ciphers BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_get_ciphers) -#define GRPC_SSL_CTX_get_client_CA_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_get_client_CA_list) -#define GRPC_SSL_CTX_get_default_passwd_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_get_default_passwd_cb) -#define GRPC_SSL_CTX_get_default_passwd_cb_userdata BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_get_default_passwd_cb_userdata) -#define GRPC_SSL_CTX_get_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_get_ex_data) -#define GRPC_SSL_CTX_get_ex_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_get_ex_new_index) -#define GRPC_SSL_CTX_get_extra_chain_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_get_extra_chain_certs) -#define GRPC_SSL_CTX_get_info_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_get_info_callback) -#define GRPC_SSL_CTX_get_keylog_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_get_keylog_callback) -#define GRPC_SSL_CTX_get_max_cert_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_get_max_cert_list) -#define GRPC_SSL_CTX_get_max_proto_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_get_max_proto_version) -#define GRPC_SSL_CTX_get_min_proto_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_get_min_proto_version) -#define GRPC_SSL_CTX_get_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_get_mode) -#define GRPC_SSL_CTX_get_options BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_get_options) -#define GRPC_SSL_CTX_get_quiet_shutdown BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_get_quiet_shutdown) -#define GRPC_SSL_CTX_get_read_ahead BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_get_read_ahead) -#define GRPC_SSL_CTX_get_session_cache_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_get_session_cache_mode) -#define GRPC_SSL_CTX_get_timeout BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_get_timeout) -#define GRPC_SSL_CTX_get_tlsext_ticket_keys BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_get_tlsext_ticket_keys) -#define GRPC_SSL_CTX_get_verify_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_get_verify_callback) -#define GRPC_SSL_CTX_get_verify_depth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_get_verify_depth) -#define GRPC_SSL_CTX_get_verify_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_get_verify_mode) -#define GRPC_SSL_CTX_load_verify_locations BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_load_verify_locations) -#define GRPC_SSL_CTX_need_tmp_RSA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_need_tmp_RSA) -#define GRPC_SSL_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_new) -#define GRPC_SSL_CTX_remove_session BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_remove_session) -#define GRPC_SSL_CTX_sess_accept BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_sess_accept) -#define GRPC_SSL_CTX_sess_accept_good BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_sess_accept_good) -#define GRPC_SSL_CTX_sess_accept_renegotiate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_sess_accept_renegotiate) -#define GRPC_SSL_CTX_sess_cache_full BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_sess_cache_full) -#define GRPC_SSL_CTX_sess_cb_hits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_sess_cb_hits) -#define GRPC_SSL_CTX_sess_connect BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_sess_connect) -#define GRPC_SSL_CTX_sess_connect_good BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_sess_connect_good) -#define GRPC_SSL_CTX_sess_connect_renegotiate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_sess_connect_renegotiate) -#define GRPC_SSL_CTX_sess_get_cache_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_sess_get_cache_size) -#define GRPC_SSL_CTX_sess_get_get_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_sess_get_get_cb) -#define GRPC_SSL_CTX_sess_get_new_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_sess_get_new_cb) -#define GRPC_SSL_CTX_sess_get_remove_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_sess_get_remove_cb) -#define GRPC_SSL_CTX_sess_hits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_sess_hits) -#define GRPC_SSL_CTX_sess_misses BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_sess_misses) -#define GRPC_SSL_CTX_sess_number BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_sess_number) -#define GRPC_SSL_CTX_sess_set_cache_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_sess_set_cache_size) -#define GRPC_SSL_CTX_sess_set_get_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_sess_set_get_cb) -#define GRPC_SSL_CTX_sess_set_new_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_sess_set_new_cb) -#define GRPC_SSL_CTX_sess_set_remove_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_sess_set_remove_cb) -#define GRPC_SSL_CTX_sess_timeouts BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_sess_timeouts) -#define GRPC_SSL_CTX_set0_buffer_pool BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set0_buffer_pool) -#define GRPC_SSL_CTX_set0_chain BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set0_chain) -#define GRPC_SSL_CTX_set0_client_CAs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set0_client_CAs) -#define GRPC_SSL_CTX_set0_verify_cert_store BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set0_verify_cert_store) -#define GRPC_SSL_CTX_set1_chain BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set1_chain) -#define GRPC_SSL_CTX_set1_curves BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set1_curves) -#define GRPC_SSL_CTX_set1_curves_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set1_curves_list) -#define GRPC_SSL_CTX_set1_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set1_param) -#define GRPC_SSL_CTX_set1_sigalgs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set1_sigalgs) -#define GRPC_SSL_CTX_set1_sigalgs_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set1_sigalgs_list) -#define GRPC_SSL_CTX_set1_tls_channel_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set1_tls_channel_id) -#define GRPC_SSL_CTX_set1_verify_cert_store BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set1_verify_cert_store) -#define GRPC_SSL_CTX_set_allow_unknown_alpn_protos BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_allow_unknown_alpn_protos) -#define GRPC_SSL_CTX_set_alpn_protos BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_alpn_protos) -#define GRPC_SSL_CTX_set_alpn_select_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_alpn_select_cb) -#define GRPC_SSL_CTX_set_cert_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_cert_cb) -#define GRPC_SSL_CTX_set_cert_store BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_cert_store) -#define GRPC_SSL_CTX_set_cert_verify_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_cert_verify_callback) -#define GRPC_SSL_CTX_set_chain_and_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_chain_and_key) -#define GRPC_SSL_CTX_set_channel_id_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_channel_id_cb) -#define GRPC_SSL_CTX_set_cipher_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_cipher_list) -#define GRPC_SSL_CTX_set_client_CA_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_client_CA_list) -#define GRPC_SSL_CTX_set_client_cert_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_client_cert_cb) -#define GRPC_SSL_CTX_set_current_time_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_current_time_cb) -#define GRPC_SSL_CTX_set_custom_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_custom_verify) -#define GRPC_SSL_CTX_set_default_passwd_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_default_passwd_cb) -#define GRPC_SSL_CTX_set_default_passwd_cb_userdata BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_default_passwd_cb_userdata) -#define GRPC_SSL_CTX_set_default_verify_paths BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_default_verify_paths) -#define GRPC_SSL_CTX_set_dos_protection_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_dos_protection_cb) -#define GRPC_SSL_CTX_set_early_data_enabled BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_early_data_enabled) -#define GRPC_SSL_CTX_set_ed25519_enabled BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_ed25519_enabled) -#define GRPC_SSL_CTX_set_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_ex_data) -#define GRPC_SSL_CTX_set_false_start_allowed_without_alpn BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_false_start_allowed_without_alpn) -#define GRPC_SSL_CTX_set_grease_enabled BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_grease_enabled) -#define GRPC_SSL_CTX_set_ignore_tls13_downgrade BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_ignore_tls13_downgrade) -#define GRPC_SSL_CTX_set_info_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_info_callback) -#define GRPC_SSL_CTX_set_keylog_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_keylog_callback) -#define GRPC_SSL_CTX_set_max_cert_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_max_cert_list) -#define GRPC_SSL_CTX_set_max_proto_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_max_proto_version) -#define GRPC_SSL_CTX_set_max_send_fragment BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_max_send_fragment) -#define GRPC_SSL_CTX_set_min_proto_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_min_proto_version) -#define GRPC_SSL_CTX_set_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_mode) -#define GRPC_SSL_CTX_set_msg_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_msg_callback) -#define GRPC_SSL_CTX_set_msg_callback_arg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_msg_callback_arg) -#define GRPC_SSL_CTX_set_next_proto_select_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_next_proto_select_cb) -#define GRPC_SSL_CTX_set_next_protos_advertised_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_next_protos_advertised_cb) -#define GRPC_SSL_CTX_set_ocsp_response BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_ocsp_response) -#define GRPC_SSL_CTX_set_options BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_options) -#define GRPC_SSL_CTX_set_private_key_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_private_key_method) -#define GRPC_SSL_CTX_set_psk_client_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_psk_client_callback) -#define GRPC_SSL_CTX_set_psk_server_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_psk_server_callback) -#define GRPC_SSL_CTX_set_purpose BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_purpose) -#define GRPC_SSL_CTX_set_quic_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_quic_method) -#define GRPC_SSL_CTX_set_quiet_shutdown BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_quiet_shutdown) -#define GRPC_SSL_CTX_set_read_ahead BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_read_ahead) -#define GRPC_SSL_CTX_set_retain_only_sha256_of_client_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_retain_only_sha256_of_client_certs) -#define GRPC_SSL_CTX_set_reverify_on_resume BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_reverify_on_resume) -#define GRPC_SSL_CTX_set_select_certificate_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_select_certificate_cb) -#define GRPC_SSL_CTX_set_session_cache_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_session_cache_mode) -#define GRPC_SSL_CTX_set_session_id_context BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_session_id_context) -#define GRPC_SSL_CTX_set_session_psk_dhe_timeout BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_session_psk_dhe_timeout) -#define GRPC_SSL_CTX_set_signed_cert_timestamp_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_signed_cert_timestamp_list) -#define GRPC_SSL_CTX_set_signing_algorithm_prefs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_signing_algorithm_prefs) -#define GRPC_SSL_CTX_set_srtp_profiles BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_srtp_profiles) -#define GRPC_SSL_CTX_set_strict_cipher_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_strict_cipher_list) -#define GRPC_SSL_CTX_set_ticket_aead_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_ticket_aead_method) -#define GRPC_SSL_CTX_set_timeout BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_timeout) -#define GRPC_SSL_CTX_set_tls_channel_id_enabled BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_tls_channel_id_enabled) -#define GRPC_SSL_CTX_set_tlsext_servername_arg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_tlsext_servername_arg) -#define GRPC_SSL_CTX_set_tlsext_servername_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_tlsext_servername_callback) -#define GRPC_SSL_CTX_set_tlsext_status_arg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_tlsext_status_arg) -#define GRPC_SSL_CTX_set_tlsext_status_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_tlsext_status_cb) -#define GRPC_SSL_CTX_set_tlsext_ticket_key_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_tlsext_ticket_key_cb) -#define GRPC_SSL_CTX_set_tlsext_ticket_keys BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_tlsext_ticket_keys) -#define GRPC_SSL_CTX_set_tlsext_use_srtp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_tlsext_use_srtp) -#define GRPC_SSL_CTX_set_tmp_dh BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_tmp_dh) -#define GRPC_SSL_CTX_set_tmp_dh_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_tmp_dh_callback) -#define GRPC_SSL_CTX_set_tmp_ecdh BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_tmp_ecdh) -#define GRPC_SSL_CTX_set_tmp_rsa BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_tmp_rsa) -#define GRPC_SSL_CTX_set_tmp_rsa_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_tmp_rsa_callback) -#define GRPC_SSL_CTX_set_trust BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_trust) -#define GRPC_SSL_CTX_set_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_verify) -#define GRPC_SSL_CTX_set_verify_algorithm_prefs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_verify_algorithm_prefs) -#define GRPC_SSL_CTX_set_verify_depth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_set_verify_depth) -#define GRPC_SSL_CTX_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_up_ref) -#define GRPC_SSL_CTX_use_PrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_use_PrivateKey) -#define GRPC_SSL_CTX_use_PrivateKey_ASN1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_use_PrivateKey_ASN1) -#define GRPC_SSL_CTX_use_PrivateKey_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_use_PrivateKey_file) -#define GRPC_SSL_CTX_use_RSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_use_RSAPrivateKey) -#define GRPC_SSL_CTX_use_RSAPrivateKey_ASN1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_use_RSAPrivateKey_ASN1) -#define GRPC_SSL_CTX_use_RSAPrivateKey_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_use_RSAPrivateKey_file) -#define GRPC_SSL_CTX_use_certificate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_use_certificate) -#define GRPC_SSL_CTX_use_certificate_ASN1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_use_certificate_ASN1) -#define GRPC_SSL_CTX_use_certificate_chain_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_use_certificate_chain_file) -#define GRPC_SSL_CTX_use_certificate_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_use_certificate_file) -#define GRPC_SSL_CTX_use_psk_identity_hint BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_CTX_use_psk_identity_hint) -#define GRPC_SSL_SESSION_early_data_capable BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_SESSION_early_data_capable) -#define GRPC_SSL_SESSION_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_SESSION_free) -#define GRPC_SSL_SESSION_from_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_SESSION_from_bytes) -#define GRPC_SSL_SESSION_get0_cipher BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_SESSION_get0_cipher) -#define GRPC_SSL_SESSION_get0_id_context BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_SESSION_get0_id_context) -#define GRPC_SSL_SESSION_get0_ocsp_response BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_SESSION_get0_ocsp_response) -#define GRPC_SSL_SESSION_get0_peer BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_SESSION_get0_peer) -#define GRPC_SSL_SESSION_get0_peer_certificates BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_SESSION_get0_peer_certificates) -#define GRPC_SSL_SESSION_get0_peer_sha256 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_SESSION_get0_peer_sha256) -#define GRPC_SSL_SESSION_get0_signed_cert_timestamp_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_SESSION_get0_signed_cert_timestamp_list) -#define GRPC_SSL_SESSION_get0_ticket BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_SESSION_get0_ticket) -#define GRPC_SSL_SESSION_get_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_SESSION_get_ex_data) -#define GRPC_SSL_SESSION_get_ex_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_SESSION_get_ex_new_index) -#define GRPC_SSL_SESSION_get_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_SESSION_get_id) -#define GRPC_SSL_SESSION_get_master_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_SESSION_get_master_key) -#define GRPC_SSL_SESSION_get_protocol_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_SESSION_get_protocol_version) -#define GRPC_SSL_SESSION_get_ticket_lifetime_hint BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_SESSION_get_ticket_lifetime_hint) -#define GRPC_SSL_SESSION_get_time BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_SESSION_get_time) -#define GRPC_SSL_SESSION_get_timeout BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_SESSION_get_timeout) -#define GRPC_SSL_SESSION_get_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_SESSION_get_version) -#define GRPC_SSL_SESSION_has_peer_sha256 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_SESSION_has_peer_sha256) -#define GRPC_SSL_SESSION_has_ticket BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_SESSION_has_ticket) -#define GRPC_SSL_SESSION_is_resumable BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_SESSION_is_resumable) -#define GRPC_SSL_SESSION_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_SESSION_new) -#define GRPC_SSL_SESSION_set1_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_SESSION_set1_id) -#define GRPC_SSL_SESSION_set1_id_context BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_SESSION_set1_id_context) -#define GRPC_SSL_SESSION_set_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_SESSION_set_ex_data) -#define GRPC_SSL_SESSION_set_protocol_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_SESSION_set_protocol_version) -#define GRPC_SSL_SESSION_set_ticket BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_SESSION_set_ticket) -#define GRPC_SSL_SESSION_set_time BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_SESSION_set_time) -#define GRPC_SSL_SESSION_set_timeout BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_SESSION_set_timeout) -#define GRPC_SSL_SESSION_should_be_single_use BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_SESSION_should_be_single_use) -#define GRPC_SSL_SESSION_to_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_SESSION_to_bytes) -#define GRPC_SSL_SESSION_to_bytes_for_ticket BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_SESSION_to_bytes_for_ticket) -#define GRPC_SSL_SESSION_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_SESSION_up_ref) -#define GRPC_SSL_accept BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_accept) -#define GRPC_SSL_add0_chain_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_add0_chain_cert) -#define GRPC_SSL_add1_chain_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_add1_chain_cert) -#define GRPC_SSL_add_client_CA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_add_client_CA) -#define GRPC_SSL_add_file_cert_subjects_to_stack BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_add_file_cert_subjects_to_stack) -#define GRPC_SSL_alert_desc_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_alert_desc_string) -#define GRPC_SSL_alert_desc_string_long BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_alert_desc_string_long) -#define GRPC_SSL_alert_from_verify_result BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_alert_from_verify_result) -#define GRPC_SSL_alert_type_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_alert_type_string) -#define GRPC_SSL_alert_type_string_long BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_alert_type_string_long) -#define GRPC_SSL_cache_hit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_cache_hit) -#define GRPC_SSL_certs_clear BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_certs_clear) -#define GRPC_SSL_check_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_check_private_key) -#define GRPC_SSL_clear BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_clear) -#define GRPC_SSL_clear_chain_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_clear_chain_certs) -#define GRPC_SSL_clear_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_clear_mode) -#define GRPC_SSL_clear_options BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_clear_options) -#define GRPC_SSL_connect BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_connect) -#define GRPC_SSL_cutthrough_complete BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_cutthrough_complete) -#define GRPC_SSL_delegated_credential_used BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_delegated_credential_used) -#define GRPC_SSL_do_handshake BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_do_handshake) -#define GRPC_SSL_dup_CA_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_dup_CA_list) -#define GRPC_SSL_early_callback_ctx_extension_get BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_early_callback_ctx_extension_get) -#define GRPC_SSL_early_data_accepted BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_early_data_accepted) -#define GRPC_SSL_enable_ocsp_stapling BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_enable_ocsp_stapling) -#define GRPC_SSL_enable_signed_cert_timestamps BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_enable_signed_cert_timestamps) -#define GRPC_SSL_enable_tls_channel_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_enable_tls_channel_id) -#define GRPC_SSL_error_description BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_error_description) -#define GRPC_SSL_export_keying_material BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_export_keying_material) -#define GRPC_SSL_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_free) -#define GRPC_SSL_generate_key_block BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_generate_key_block) -#define GRPC_SSL_get0_alpn_selected BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get0_alpn_selected) -#define GRPC_SSL_get0_certificate_types BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get0_certificate_types) -#define GRPC_SSL_get0_chain_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get0_chain_certs) -#define GRPC_SSL_get0_next_proto_negotiated BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get0_next_proto_negotiated) -#define GRPC_SSL_get0_ocsp_response BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get0_ocsp_response) -#define GRPC_SSL_get0_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get0_param) -#define GRPC_SSL_get0_peer_certificates BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get0_peer_certificates) -#define GRPC_SSL_get0_peer_verify_algorithms BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get0_peer_verify_algorithms) -#define GRPC_SSL_get0_server_requested_CAs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get0_server_requested_CAs) -#define GRPC_SSL_get0_session_id_context BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get0_session_id_context) -#define GRPC_SSL_get0_signed_cert_timestamp_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get0_signed_cert_timestamp_list) -#define GRPC_SSL_get1_session BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get1_session) -#define GRPC_SSL_get_SSL_CTX BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_SSL_CTX) -#define GRPC_SSL_get_certificate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_certificate) -#define GRPC_SSL_get_cipher_by_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_cipher_by_value) -#define GRPC_SSL_get_cipher_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_cipher_list) -#define GRPC_SSL_get_ciphers BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_ciphers) -#define GRPC_SSL_get_client_CA_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_client_CA_list) -#define GRPC_SSL_get_client_random BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_client_random) -#define GRPC_SSL_get_current_cipher BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_current_cipher) -#define GRPC_SSL_get_current_compression BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_current_compression) -#define GRPC_SSL_get_current_expansion BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_current_expansion) -#define GRPC_SSL_get_curve_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_curve_id) -#define GRPC_SSL_get_curve_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_curve_name) -#define GRPC_SSL_get_default_timeout BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_default_timeout) -#define GRPC_SSL_get_early_data_reason BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_early_data_reason) -#define GRPC_SSL_get_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_error) -#define GRPC_SSL_get_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_ex_data) -#define GRPC_SSL_get_ex_data_X509_STORE_CTX_idx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_ex_data_X509_STORE_CTX_idx) -#define GRPC_SSL_get_ex_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_ex_new_index) -#define GRPC_SSL_get_extms_support BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_extms_support) -#define GRPC_SSL_get_fd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_fd) -#define GRPC_SSL_get_finished BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_finished) -#define GRPC_SSL_get_info_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_info_callback) -#define GRPC_SSL_get_ivs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_ivs) -#define GRPC_SSL_get_key_block_len BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_key_block_len) -#define GRPC_SSL_get_max_cert_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_max_cert_list) -#define GRPC_SSL_get_max_proto_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_max_proto_version) -#define GRPC_SSL_get_min_proto_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_min_proto_version) -#define GRPC_SSL_get_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_mode) -#define GRPC_SSL_get_negotiated_token_binding_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_negotiated_token_binding_param) -#define GRPC_SSL_get_options BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_options) -#define GRPC_SSL_get_peer_cert_chain BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_peer_cert_chain) -#define GRPC_SSL_get_peer_certificate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_peer_certificate) -#define GRPC_SSL_get_peer_finished BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_peer_finished) -#define GRPC_SSL_get_peer_full_cert_chain BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_peer_full_cert_chain) -#define GRPC_SSL_get_peer_quic_transport_params BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_peer_quic_transport_params) -#define GRPC_SSL_get_peer_signature_algorithm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_peer_signature_algorithm) -#define GRPC_SSL_get_pending_cipher BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_pending_cipher) -#define GRPC_SSL_get_privatekey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_privatekey) -#define GRPC_SSL_get_psk_identity BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_psk_identity) -#define GRPC_SSL_get_psk_identity_hint BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_psk_identity_hint) -#define GRPC_SSL_get_quiet_shutdown BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_quiet_shutdown) -#define GRPC_SSL_get_rbio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_rbio) -#define GRPC_SSL_get_read_ahead BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_read_ahead) -#define GRPC_SSL_get_read_sequence BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_read_sequence) -#define GRPC_SSL_get_rfd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_rfd) -#define GRPC_SSL_get_secure_renegotiation_support BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_secure_renegotiation_support) -#define GRPC_SSL_get_selected_srtp_profile BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_selected_srtp_profile) -#define GRPC_SSL_get_server_random BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_server_random) -#define GRPC_SSL_get_server_tmp_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_server_tmp_key) -#define GRPC_SSL_get_servername BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_servername) -#define GRPC_SSL_get_servername_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_servername_type) -#define GRPC_SSL_get_session BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_session) -#define GRPC_SSL_get_shared_ciphers BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_shared_ciphers) -#define GRPC_SSL_get_shared_sigalgs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_shared_sigalgs) -#define GRPC_SSL_get_shutdown BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_shutdown) -#define GRPC_SSL_get_signature_algorithm_digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_signature_algorithm_digest) -#define GRPC_SSL_get_signature_algorithm_key_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_signature_algorithm_key_type) -#define GRPC_SSL_get_signature_algorithm_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_signature_algorithm_name) -#define GRPC_SSL_get_srtp_profiles BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_srtp_profiles) -#define GRPC_SSL_get_ticket_age_skew BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_ticket_age_skew) -#define GRPC_SSL_get_tls_channel_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_tls_channel_id) -#define GRPC_SSL_get_tls_unique BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_tls_unique) -#define GRPC_SSL_get_tlsext_status_ocsp_resp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_tlsext_status_ocsp_resp) -#define GRPC_SSL_get_tlsext_status_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_tlsext_status_type) -#define GRPC_SSL_get_verify_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_verify_callback) -#define GRPC_SSL_get_verify_depth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_verify_depth) -#define GRPC_SSL_get_verify_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_verify_mode) -#define GRPC_SSL_get_verify_result BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_verify_result) -#define GRPC_SSL_get_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_version) -#define GRPC_SSL_get_wbio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_wbio) -#define GRPC_SSL_get_wfd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_wfd) -#define GRPC_SSL_get_write_sequence BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_get_write_sequence) -#define GRPC_SSL_in_early_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_in_early_data) -#define GRPC_SSL_in_false_start BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_in_false_start) -#define GRPC_SSL_in_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_in_init) -#define GRPC_SSL_is_dtls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_is_dtls) -#define GRPC_SSL_is_init_finished BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_is_init_finished) -#define GRPC_SSL_is_server BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_is_server) -#define GRPC_SSL_is_signature_algorithm_rsa_pss BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_is_signature_algorithm_rsa_pss) -#define GRPC_SSL_is_tls13_downgrade BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_is_tls13_downgrade) -#define GRPC_SSL_is_token_binding_negotiated BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_is_token_binding_negotiated) -#define GRPC_SSL_key_update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_key_update) -#define GRPC_SSL_library_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_library_init) -#define GRPC_SSL_load_client_CA_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_load_client_CA_file) -#define GRPC_SSL_load_error_strings BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_load_error_strings) -#define GRPC_SSL_magic_pending_session_ptr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_magic_pending_session_ptr) -#define GRPC_SSL_max_seal_overhead BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_max_seal_overhead) -#define GRPC_SSL_need_tmp_RSA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_need_tmp_RSA) -#define GRPC_SSL_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_new) -#define GRPC_SSL_num_renegotiations BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_num_renegotiations) -#define GRPC_SSL_peek BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_peek) -#define GRPC_SSL_pending BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_pending) -#define GRPC_SSL_process_quic_post_handshake BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_process_quic_post_handshake) -#define GRPC_SSL_provide_quic_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_provide_quic_data) -#define GRPC_SSL_quic_max_handshake_flight_len BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_quic_max_handshake_flight_len) -#define GRPC_SSL_quic_read_level BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_quic_read_level) -#define GRPC_SSL_quic_write_level BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_quic_write_level) -#define GRPC_SSL_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_read) -#define GRPC_SSL_renegotiate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_renegotiate) -#define GRPC_SSL_renegotiate_pending BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_renegotiate_pending) -#define GRPC_SSL_reset_early_data_reject BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_reset_early_data_reject) -#define GRPC_SSL_select_next_proto BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_select_next_proto) -#define GRPC_SSL_send_fatal_alert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_send_fatal_alert) -#define GRPC_SSL_session_reused BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_session_reused) -#define GRPC_SSL_set0_chain BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set0_chain) -#define GRPC_SSL_set0_client_CAs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set0_client_CAs) -#define GRPC_SSL_set0_rbio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set0_rbio) -#define GRPC_SSL_set0_verify_cert_store BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set0_verify_cert_store) -#define GRPC_SSL_set0_wbio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set0_wbio) -#define GRPC_SSL_set1_chain BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set1_chain) -#define GRPC_SSL_set1_curves BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set1_curves) -#define GRPC_SSL_set1_curves_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set1_curves_list) -#define GRPC_SSL_set1_delegated_credential BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set1_delegated_credential) -#define GRPC_SSL_set1_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set1_param) -#define GRPC_SSL_set1_sigalgs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set1_sigalgs) -#define GRPC_SSL_set1_sigalgs_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set1_sigalgs_list) -#define GRPC_SSL_set1_tls_channel_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set1_tls_channel_id) -#define GRPC_SSL_set1_verify_cert_store BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set1_verify_cert_store) -#define GRPC_SSL_set_SSL_CTX BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_SSL_CTX) -#define GRPC_SSL_set_accept_state BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_accept_state) -#define GRPC_SSL_set_alpn_protos BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_alpn_protos) -#define GRPC_SSL_set_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_bio) -#define GRPC_SSL_set_cert_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_cert_cb) -#define GRPC_SSL_set_chain_and_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_chain_and_key) -#define GRPC_SSL_set_cipher_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_cipher_list) -#define GRPC_SSL_set_client_CA_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_client_CA_list) -#define GRPC_SSL_set_connect_state BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_connect_state) -#define GRPC_SSL_set_custom_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_custom_verify) -#define GRPC_SSL_set_early_data_enabled BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_early_data_enabled) -#define GRPC_SSL_set_enforce_rsa_key_usage BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_enforce_rsa_key_usage) -#define GRPC_SSL_set_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_ex_data) -#define GRPC_SSL_set_fd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_fd) -#define GRPC_SSL_set_ignore_tls13_downgrade BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_ignore_tls13_downgrade) -#define GRPC_SSL_set_info_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_info_callback) -#define GRPC_SSL_set_jdk11_workaround BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_jdk11_workaround) -#define GRPC_SSL_set_max_cert_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_max_cert_list) -#define GRPC_SSL_set_max_proto_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_max_proto_version) -#define GRPC_SSL_set_max_send_fragment BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_max_send_fragment) -#define GRPC_SSL_set_min_proto_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_min_proto_version) -#define GRPC_SSL_set_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_mode) -#define GRPC_SSL_set_msg_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_msg_callback) -#define GRPC_SSL_set_msg_callback_arg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_msg_callback_arg) -#define GRPC_SSL_set_mtu BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_mtu) -#define GRPC_SSL_set_ocsp_response BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_ocsp_response) -#define GRPC_SSL_set_options BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_options) -#define GRPC_SSL_set_private_key_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_private_key_method) -#define GRPC_SSL_set_psk_client_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_psk_client_callback) -#define GRPC_SSL_set_psk_server_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_psk_server_callback) -#define GRPC_SSL_set_purpose BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_purpose) -#define GRPC_SSL_set_quic_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_quic_method) -#define GRPC_SSL_set_quic_transport_params BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_quic_transport_params) -#define GRPC_SSL_set_quiet_shutdown BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_quiet_shutdown) -#define GRPC_SSL_set_read_ahead BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_read_ahead) -#define GRPC_SSL_set_renegotiate_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_renegotiate_mode) -#define GRPC_SSL_set_retain_only_sha256_of_client_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_retain_only_sha256_of_client_certs) -#define GRPC_SSL_set_rfd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_rfd) -#define GRPC_SSL_set_session BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_session) -#define GRPC_SSL_set_session_id_context BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_session_id_context) -#define GRPC_SSL_set_shed_handshake_config BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_shed_handshake_config) -#define GRPC_SSL_set_shutdown BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_shutdown) -#define GRPC_SSL_set_signed_cert_timestamp_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_signed_cert_timestamp_list) -#define GRPC_SSL_set_signing_algorithm_prefs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_signing_algorithm_prefs) -#define GRPC_SSL_set_srtp_profiles BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_srtp_profiles) -#define GRPC_SSL_set_state BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_state) -#define GRPC_SSL_set_strict_cipher_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_strict_cipher_list) -#define GRPC_SSL_set_tls_channel_id_enabled BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_tls_channel_id_enabled) -#define GRPC_SSL_set_tlsext_host_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_tlsext_host_name) -#define GRPC_SSL_set_tlsext_status_ocsp_resp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_tlsext_status_ocsp_resp) -#define GRPC_SSL_set_tlsext_status_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_tlsext_status_type) -#define GRPC_SSL_set_tlsext_use_srtp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_tlsext_use_srtp) -#define GRPC_SSL_set_tmp_dh BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_tmp_dh) -#define GRPC_SSL_set_tmp_dh_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_tmp_dh_callback) -#define GRPC_SSL_set_tmp_ecdh BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_tmp_ecdh) -#define GRPC_SSL_set_tmp_rsa BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_tmp_rsa) -#define GRPC_SSL_set_tmp_rsa_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_tmp_rsa_callback) -#define GRPC_SSL_set_token_binding_params BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_token_binding_params) -#define GRPC_SSL_set_trust BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_trust) -#define GRPC_SSL_set_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_verify) -#define GRPC_SSL_set_verify_depth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_verify_depth) -#define GRPC_SSL_set_verify_result BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_verify_result) -#define GRPC_SSL_set_wfd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_set_wfd) -#define GRPC_SSL_shutdown BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_shutdown) -#define GRPC_SSL_state BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_state) -#define GRPC_SSL_state_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_state_string) -#define GRPC_SSL_state_string_long BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_state_string_long) -#define GRPC_SSL_total_renegotiations BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_total_renegotiations) -#define GRPC_SSL_use_PrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_use_PrivateKey) -#define GRPC_SSL_use_PrivateKey_ASN1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_use_PrivateKey_ASN1) -#define GRPC_SSL_use_PrivateKey_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_use_PrivateKey_file) -#define GRPC_SSL_use_RSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_use_RSAPrivateKey) -#define GRPC_SSL_use_RSAPrivateKey_ASN1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_use_RSAPrivateKey_ASN1) -#define GRPC_SSL_use_RSAPrivateKey_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_use_RSAPrivateKey_file) -#define GRPC_SSL_use_certificate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_use_certificate) -#define GRPC_SSL_use_certificate_ASN1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_use_certificate_ASN1) -#define GRPC_SSL_use_certificate_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_use_certificate_file) -#define GRPC_SSL_use_psk_identity_hint BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_use_psk_identity_hint) -#define GRPC_SSL_used_hello_retry_request BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_used_hello_retry_request) -#define GRPC_SSL_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_version) -#define GRPC_SSL_want BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_want) -#define GRPC_SSL_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSL_write) -#define GRPC_SSLv23_client_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSLv23_client_method) -#define GRPC_SSLv23_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSLv23_method) -#define GRPC_SSLv23_server_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSLv23_server_method) -#define GRPC_TLS_client_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_TLS_client_method) -#define GRPC_TLS_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_TLS_method) -#define GRPC_TLS_server_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_TLS_server_method) -#define GRPC_TLS_with_buffers_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_TLS_with_buffers_method) -#define GRPC_TLSv1_1_client_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_TLSv1_1_client_method) -#define GRPC_TLSv1_1_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_TLSv1_1_method) -#define GRPC_TLSv1_1_server_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_TLSv1_1_server_method) -#define GRPC_TLSv1_2_client_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_TLSv1_2_client_method) -#define GRPC_TLSv1_2_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_TLSv1_2_method) -#define GRPC_TLSv1_2_server_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_TLSv1_2_server_method) -#define GRPC_TLSv1_client_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_TLSv1_client_method) -#define GRPC_TLSv1_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_TLSv1_method) -#define GRPC_TLSv1_server_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_TLSv1_server_method) -#define GRPC_d2i_SSL_SESSION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_SSL_SESSION) -#define GRPC_d2i_SSL_SESSION_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_SSL_SESSION_bio) -#define GRPC_i2d_SSL_SESSION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_SSL_SESSION) -#define GRPC_i2d_SSL_SESSION_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_SSL_SESSION_bio) -#define GRPC_sk_CRYPTO_BUFFER_call_copy_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_CRYPTO_BUFFER_call_copy_func) -#define GRPC_sk_CRYPTO_BUFFER_call_free_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_CRYPTO_BUFFER_call_free_func) -#define GRPC_sk_CRYPTO_BUFFER_deep_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_CRYPTO_BUFFER_deep_copy) -#define GRPC_sk_CRYPTO_BUFFER_new_null BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_CRYPTO_BUFFER_new_null) -#define GRPC_sk_CRYPTO_BUFFER_num BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_CRYPTO_BUFFER_num) -#define GRPC_sk_CRYPTO_BUFFER_push BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_CRYPTO_BUFFER_push) -#define GRPC_sk_CRYPTO_BUFFER_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_CRYPTO_BUFFER_set) -#define GRPC_sk_CRYPTO_BUFFER_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_CRYPTO_BUFFER_value) -#define GRPC_sk_SRTP_PROTECTION_PROFILE_new_null BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_SRTP_PROTECTION_PROFILE_new_null) -#define GRPC_sk_SRTP_PROTECTION_PROFILE_num BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_SRTP_PROTECTION_PROFILE_num) -#define GRPC_sk_SRTP_PROTECTION_PROFILE_push BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_SRTP_PROTECTION_PROFILE_push) -#define GRPC_sk_SSL_CIPHER_call_cmp_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_SSL_CIPHER_call_cmp_func) -#define GRPC_sk_SSL_CIPHER_delete BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_SSL_CIPHER_delete) -#define GRPC_sk_SSL_CIPHER_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_SSL_CIPHER_dup) -#define GRPC_sk_SSL_CIPHER_find BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_SSL_CIPHER_find) -#define GRPC_sk_SSL_CIPHER_new_null BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_SSL_CIPHER_new_null) -#define GRPC_sk_SSL_CIPHER_num BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_SSL_CIPHER_num) -#define GRPC_sk_SSL_CIPHER_push BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_SSL_CIPHER_push) -#define GRPC_sk_SSL_CIPHER_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_SSL_CIPHER_value) -#define GRPC_sk_X509_NAME_call_cmp_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_X509_NAME_call_cmp_func) -#define GRPC_sk_X509_NAME_call_copy_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_X509_NAME_call_copy_func) -#define GRPC_sk_X509_NAME_call_free_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_X509_NAME_call_free_func) -#define GRPC_sk_X509_NAME_deep_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_X509_NAME_deep_copy) -#define GRPC_sk_X509_NAME_find BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_X509_NAME_find) -#define GRPC_sk_X509_NAME_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_X509_NAME_free) -#define GRPC_sk_X509_NAME_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_X509_NAME_new) -#define GRPC_sk_X509_NAME_new_null BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_X509_NAME_new_null) -#define GRPC_sk_X509_NAME_pop_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_X509_NAME_pop_free) -#define GRPC_sk_X509_NAME_push BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_X509_NAME_push) -#define GRPC_sk_X509_NAME_set_cmp_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_X509_NAME_set_cmp_func) -#define GRPC_sk_X509_NAME_sort BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_X509_NAME_sort) -#define GRPC_sk_X509_call_free_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_X509_call_free_func) -#define GRPC_sk_X509_new_null BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_X509_new_null) -#define GRPC_sk_X509_num BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_X509_num) -#define GRPC_sk_X509_pop_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_X509_pop_free) -#define GRPC_sk_X509_shift BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_X509_shift) -#define GRPC_sk_X509_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_X509_value) -#define GRPC_ACCESS_DESCRIPTION_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ACCESS_DESCRIPTION_free) -#define GRPC_ACCESS_DESCRIPTION_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ACCESS_DESCRIPTION_it) -#define GRPC_ACCESS_DESCRIPTION_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ACCESS_DESCRIPTION_new) -#define GRPC_AES_CMAC BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_AES_CMAC) -#define GRPC_AES_cbc_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_AES_cbc_encrypt) -#define GRPC_AES_cfb128_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_AES_cfb128_encrypt) -#define GRPC_AES_ctr128_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_AES_ctr128_encrypt) -#define GRPC_AES_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_AES_decrypt) -#define GRPC_AES_ecb_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_AES_ecb_encrypt) -#define GRPC_AES_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_AES_encrypt) -#define GRPC_AES_ofb128_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_AES_ofb128_encrypt) -#define GRPC_AES_set_decrypt_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_AES_set_decrypt_key) -#define GRPC_AES_set_encrypt_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_AES_set_encrypt_key) -#define GRPC_AES_unwrap_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_AES_unwrap_key) -#define GRPC_AES_unwrap_key_padded BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_AES_unwrap_key_padded) -#define GRPC_AES_wrap_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_AES_wrap_key) -#define GRPC_AES_wrap_key_padded BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_AES_wrap_key_padded) -#define GRPC_ASN1_ANY_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_ANY_it) -#define GRPC_ASN1_BIT_STRING_check BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_BIT_STRING_check) -#define GRPC_ASN1_BIT_STRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_BIT_STRING_free) -#define GRPC_ASN1_BIT_STRING_get_bit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_BIT_STRING_get_bit) -#define GRPC_ASN1_BIT_STRING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_BIT_STRING_it) -#define GRPC_ASN1_BIT_STRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_BIT_STRING_new) -#define GRPC_ASN1_BIT_STRING_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_BIT_STRING_set) -#define GRPC_ASN1_BIT_STRING_set_bit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_BIT_STRING_set_bit) -#define GRPC_ASN1_BMPSTRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_BMPSTRING_free) -#define GRPC_ASN1_BMPSTRING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_BMPSTRING_it) -#define GRPC_ASN1_BMPSTRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_BMPSTRING_new) -#define GRPC_ASN1_BOOLEAN_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_BOOLEAN_it) -#define GRPC_ASN1_ENUMERATED_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_ENUMERATED_free) -#define GRPC_ASN1_ENUMERATED_get BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_ENUMERATED_get) -#define GRPC_ASN1_ENUMERATED_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_ENUMERATED_it) -#define GRPC_ASN1_ENUMERATED_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_ENUMERATED_new) -#define GRPC_ASN1_ENUMERATED_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_ENUMERATED_set) -#define GRPC_ASN1_ENUMERATED_to_BN BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_ENUMERATED_to_BN) -#define GRPC_ASN1_FBOOLEAN_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_FBOOLEAN_it) -#define GRPC_ASN1_GENERALIZEDTIME_adj BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_GENERALIZEDTIME_adj) -#define GRPC_ASN1_GENERALIZEDTIME_check BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_GENERALIZEDTIME_check) -#define GRPC_ASN1_GENERALIZEDTIME_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_GENERALIZEDTIME_free) -#define GRPC_ASN1_GENERALIZEDTIME_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_GENERALIZEDTIME_it) -#define GRPC_ASN1_GENERALIZEDTIME_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_GENERALIZEDTIME_new) -#define GRPC_ASN1_GENERALIZEDTIME_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_GENERALIZEDTIME_print) -#define GRPC_ASN1_GENERALIZEDTIME_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_GENERALIZEDTIME_set) -#define GRPC_ASN1_GENERALIZEDTIME_set_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_GENERALIZEDTIME_set_string) -#define GRPC_ASN1_GENERALSTRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_GENERALSTRING_free) -#define GRPC_ASN1_GENERALSTRING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_GENERALSTRING_it) -#define GRPC_ASN1_GENERALSTRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_GENERALSTRING_new) -#define GRPC_ASN1_IA5STRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_IA5STRING_free) -#define GRPC_ASN1_IA5STRING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_IA5STRING_it) -#define GRPC_ASN1_IA5STRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_IA5STRING_new) -#define GRPC_ASN1_INTEGER_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_INTEGER_cmp) -#define GRPC_ASN1_INTEGER_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_INTEGER_dup) -#define GRPC_ASN1_INTEGER_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_INTEGER_free) -#define GRPC_ASN1_INTEGER_get BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_INTEGER_get) -#define GRPC_ASN1_INTEGER_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_INTEGER_it) -#define GRPC_ASN1_INTEGER_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_INTEGER_new) -#define GRPC_ASN1_INTEGER_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_INTEGER_set) -#define GRPC_ASN1_INTEGER_set_uint64 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_INTEGER_set_uint64) -#define GRPC_ASN1_INTEGER_to_BN BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_INTEGER_to_BN) -#define GRPC_ASN1_NULL_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_NULL_free) -#define GRPC_ASN1_NULL_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_NULL_it) -#define GRPC_ASN1_NULL_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_NULL_new) -#define GRPC_ASN1_OBJECT_create BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_OBJECT_create) -#define GRPC_ASN1_OBJECT_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_OBJECT_free) -#define GRPC_ASN1_OBJECT_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_OBJECT_it) -#define GRPC_ASN1_OBJECT_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_OBJECT_new) -#define GRPC_ASN1_OCTET_STRING_NDEF_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_OCTET_STRING_NDEF_it) -#define GRPC_ASN1_OCTET_STRING_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_OCTET_STRING_cmp) -#define GRPC_ASN1_OCTET_STRING_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_OCTET_STRING_dup) -#define GRPC_ASN1_OCTET_STRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_OCTET_STRING_free) -#define GRPC_ASN1_OCTET_STRING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_OCTET_STRING_it) -#define GRPC_ASN1_OCTET_STRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_OCTET_STRING_new) -#define GRPC_ASN1_OCTET_STRING_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_OCTET_STRING_set) -#define GRPC_ASN1_PRINTABLESTRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_PRINTABLESTRING_free) -#define GRPC_ASN1_PRINTABLESTRING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_PRINTABLESTRING_it) -#define GRPC_ASN1_PRINTABLESTRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_PRINTABLESTRING_new) -#define GRPC_ASN1_PRINTABLE_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_PRINTABLE_free) -#define GRPC_ASN1_PRINTABLE_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_PRINTABLE_it) -#define GRPC_ASN1_PRINTABLE_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_PRINTABLE_new) -#define GRPC_ASN1_PRINTABLE_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_PRINTABLE_type) -#define GRPC_ASN1_SEQUENCE_ANY_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_SEQUENCE_ANY_it) -#define GRPC_ASN1_SEQUENCE_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_SEQUENCE_it) -#define GRPC_ASN1_SET_ANY_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_SET_ANY_it) -#define GRPC_ASN1_STRING_TABLE_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_STRING_TABLE_add) -#define GRPC_ASN1_STRING_TABLE_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_STRING_TABLE_cleanup) -#define GRPC_ASN1_STRING_TABLE_get BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_STRING_TABLE_get) -#define GRPC_ASN1_STRING_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_STRING_cmp) -#define GRPC_ASN1_STRING_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_STRING_copy) -#define GRPC_ASN1_STRING_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_STRING_data) -#define GRPC_ASN1_STRING_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_STRING_dup) -#define GRPC_ASN1_STRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_STRING_free) -#define GRPC_ASN1_STRING_get0_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_STRING_get0_data) -#define GRPC_ASN1_STRING_get_default_mask BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_STRING_get_default_mask) -#define GRPC_ASN1_STRING_length BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_STRING_length) -#define GRPC_ASN1_STRING_length_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_STRING_length_set) -#define GRPC_ASN1_STRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_STRING_new) -#define GRPC_ASN1_STRING_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_STRING_print) -#define GRPC_ASN1_STRING_print_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_STRING_print_ex) -#define GRPC_ASN1_STRING_print_ex_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_STRING_print_ex_fp) -#define GRPC_ASN1_STRING_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_STRING_set) -#define GRPC_ASN1_STRING_set0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_STRING_set0) -#define GRPC_ASN1_STRING_set_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_STRING_set_by_NID) -#define GRPC_ASN1_STRING_set_default_mask BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_STRING_set_default_mask) -#define GRPC_ASN1_STRING_set_default_mask_asc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_STRING_set_default_mask_asc) -#define GRPC_ASN1_STRING_to_UTF8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_STRING_to_UTF8) -#define GRPC_ASN1_STRING_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_STRING_type) -#define GRPC_ASN1_STRING_type_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_STRING_type_new) -#define GRPC_ASN1_T61STRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_T61STRING_free) -#define GRPC_ASN1_T61STRING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_T61STRING_it) -#define GRPC_ASN1_T61STRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_T61STRING_new) -#define GRPC_ASN1_TBOOLEAN_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_TBOOLEAN_it) -#define GRPC_ASN1_TIME_adj BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_TIME_adj) -#define GRPC_ASN1_TIME_check BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_TIME_check) -#define GRPC_ASN1_TIME_diff BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_TIME_diff) -#define GRPC_ASN1_TIME_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_TIME_free) -#define GRPC_ASN1_TIME_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_TIME_it) -#define GRPC_ASN1_TIME_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_TIME_new) -#define GRPC_ASN1_TIME_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_TIME_print) -#define GRPC_ASN1_TIME_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_TIME_set) -#define GRPC_ASN1_TIME_set_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_TIME_set_string) -#define GRPC_ASN1_TIME_to_generalizedtime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_TIME_to_generalizedtime) -#define GRPC_ASN1_TYPE_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_TYPE_cmp) -#define GRPC_ASN1_TYPE_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_TYPE_free) -#define GRPC_ASN1_TYPE_get BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_TYPE_get) -#define GRPC_ASN1_TYPE_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_TYPE_new) -#define GRPC_ASN1_TYPE_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_TYPE_set) -#define GRPC_ASN1_TYPE_set1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_TYPE_set1) -#define GRPC_ASN1_UNIVERSALSTRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_UNIVERSALSTRING_free) -#define GRPC_ASN1_UNIVERSALSTRING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_UNIVERSALSTRING_it) -#define GRPC_ASN1_UNIVERSALSTRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_UNIVERSALSTRING_new) -#define GRPC_ASN1_UTCTIME_adj BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_UTCTIME_adj) -#define GRPC_ASN1_UTCTIME_check BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_UTCTIME_check) -#define GRPC_ASN1_UTCTIME_cmp_time_t BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_UTCTIME_cmp_time_t) -#define GRPC_ASN1_UTCTIME_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_UTCTIME_free) -#define GRPC_ASN1_UTCTIME_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_UTCTIME_it) -#define GRPC_ASN1_UTCTIME_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_UTCTIME_new) -#define GRPC_ASN1_UTCTIME_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_UTCTIME_print) -#define GRPC_ASN1_UTCTIME_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_UTCTIME_set) -#define GRPC_ASN1_UTCTIME_set_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_UTCTIME_set_string) -#define GRPC_ASN1_UTF8STRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_UTF8STRING_free) -#define GRPC_ASN1_UTF8STRING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_UTF8STRING_it) -#define GRPC_ASN1_UTF8STRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_UTF8STRING_new) -#define GRPC_ASN1_VISIBLESTRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_VISIBLESTRING_free) -#define GRPC_ASN1_VISIBLESTRING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_VISIBLESTRING_it) -#define GRPC_ASN1_VISIBLESTRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_VISIBLESTRING_new) -#define GRPC_ASN1_digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_digest) -#define GRPC_ASN1_generate_nconf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_generate_nconf) -#define GRPC_ASN1_generate_v3 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_generate_v3) -#define GRPC_ASN1_get_object BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_get_object) -#define GRPC_ASN1_item_d2i BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_item_d2i) -#define GRPC_ASN1_item_d2i_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_item_d2i_bio) -#define GRPC_ASN1_item_d2i_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_item_d2i_fp) -#define GRPC_ASN1_item_digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_item_digest) -#define GRPC_ASN1_item_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_item_dup) -#define GRPC_ASN1_item_ex_d2i BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_item_ex_d2i) -#define GRPC_ASN1_item_ex_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_item_ex_free) -#define GRPC_ASN1_item_ex_i2d BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_item_ex_i2d) -#define GRPC_ASN1_item_ex_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_item_ex_new) -#define GRPC_ASN1_item_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_item_free) -#define GRPC_ASN1_item_i2d BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_item_i2d) -#define GRPC_ASN1_item_i2d_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_item_i2d_bio) -#define GRPC_ASN1_item_i2d_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_item_i2d_fp) -#define GRPC_ASN1_item_ndef_i2d BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_item_ndef_i2d) -#define GRPC_ASN1_item_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_item_new) -#define GRPC_ASN1_item_pack BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_item_pack) -#define GRPC_ASN1_item_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_item_sign) -#define GRPC_ASN1_item_sign_ctx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_item_sign_ctx) -#define GRPC_ASN1_item_unpack BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_item_unpack) -#define GRPC_ASN1_item_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_item_verify) -#define GRPC_ASN1_mbstring_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_mbstring_copy) -#define GRPC_ASN1_mbstring_ncopy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_mbstring_ncopy) -#define GRPC_ASN1_object_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_object_size) -#define GRPC_ASN1_primitive_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_primitive_free) -#define GRPC_ASN1_primitive_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_primitive_new) -#define GRPC_ASN1_put_eoc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_put_eoc) -#define GRPC_ASN1_put_object BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_put_object) -#define GRPC_ASN1_tag2bit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_tag2bit) -#define GRPC_ASN1_tag2str BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_tag2str) -#define GRPC_ASN1_template_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_template_free) -#define GRPC_ASN1_template_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ASN1_template_new) -#define GRPC_AUTHORITY_INFO_ACCESS_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_AUTHORITY_INFO_ACCESS_free) -#define GRPC_AUTHORITY_INFO_ACCESS_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_AUTHORITY_INFO_ACCESS_it) -#define GRPC_AUTHORITY_INFO_ACCESS_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_AUTHORITY_INFO_ACCESS_new) -#define GRPC_AUTHORITY_KEYID_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_AUTHORITY_KEYID_free) -#define GRPC_AUTHORITY_KEYID_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_AUTHORITY_KEYID_it) -#define GRPC_AUTHORITY_KEYID_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_AUTHORITY_KEYID_new) -#define GRPC_BASIC_CONSTRAINTS_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BASIC_CONSTRAINTS_free) -#define GRPC_BASIC_CONSTRAINTS_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BASIC_CONSTRAINTS_it) -#define GRPC_BASIC_CONSTRAINTS_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BASIC_CONSTRAINTS_new) -#define GRPC_BIO_append_filename BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_append_filename) -#define GRPC_BIO_callback_ctrl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_callback_ctrl) -#define GRPC_BIO_clear_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_clear_flags) -#define GRPC_BIO_clear_retry_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_clear_retry_flags) -#define GRPC_BIO_copy_next_retry BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_copy_next_retry) -#define GRPC_BIO_ctrl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_ctrl) -#define GRPC_BIO_ctrl_get_read_request BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_ctrl_get_read_request) -#define GRPC_BIO_ctrl_get_write_guarantee BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_ctrl_get_write_guarantee) -#define GRPC_BIO_ctrl_pending BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_ctrl_pending) -#define GRPC_BIO_do_connect BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_do_connect) -#define GRPC_BIO_eof BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_eof) -#define GRPC_BIO_find_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_find_type) -#define GRPC_BIO_flush BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_flush) -#define GRPC_BIO_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_free) -#define GRPC_BIO_free_all BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_free_all) -#define GRPC_BIO_get_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_get_data) -#define GRPC_BIO_get_fd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_get_fd) -#define GRPC_BIO_get_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_get_fp) -#define GRPC_BIO_get_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_get_init) -#define GRPC_BIO_get_mem_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_get_mem_data) -#define GRPC_BIO_get_mem_ptr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_get_mem_ptr) -#define GRPC_BIO_get_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_get_new_index) -#define GRPC_BIO_get_retry_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_get_retry_flags) -#define GRPC_BIO_get_retry_reason BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_get_retry_reason) -#define GRPC_BIO_get_shutdown BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_get_shutdown) -#define GRPC_BIO_gets BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_gets) -#define GRPC_BIO_hexdump BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_hexdump) -#define GRPC_BIO_indent BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_indent) -#define GRPC_BIO_int_ctrl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_int_ctrl) -#define GRPC_BIO_mem_contents BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_mem_contents) -#define GRPC_BIO_meth_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_meth_free) -#define GRPC_BIO_meth_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_meth_new) -#define GRPC_BIO_meth_set_create BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_meth_set_create) -#define GRPC_BIO_meth_set_ctrl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_meth_set_ctrl) -#define GRPC_BIO_meth_set_destroy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_meth_set_destroy) -#define GRPC_BIO_meth_set_gets BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_meth_set_gets) -#define GRPC_BIO_meth_set_puts BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_meth_set_puts) -#define GRPC_BIO_meth_set_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_meth_set_read) -#define GRPC_BIO_meth_set_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_meth_set_write) -#define GRPC_BIO_method_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_method_type) -#define GRPC_BIO_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_new) -#define GRPC_BIO_new_bio_pair BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_new_bio_pair) -#define GRPC_BIO_new_connect BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_new_connect) -#define GRPC_BIO_new_fd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_new_fd) -#define GRPC_BIO_new_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_new_file) -#define GRPC_BIO_new_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_new_fp) -#define GRPC_BIO_new_mem_buf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_new_mem_buf) -#define GRPC_BIO_new_socket BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_new_socket) -#define GRPC_BIO_next BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_next) -#define GRPC_BIO_number_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_number_read) -#define GRPC_BIO_number_written BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_number_written) -#define GRPC_BIO_pending BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_pending) -#define GRPC_BIO_pop BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_pop) -#define GRPC_BIO_printf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_printf) -#define GRPC_BIO_ptr_ctrl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_ptr_ctrl) -#define GRPC_BIO_push BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_push) -#define GRPC_BIO_puts BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_puts) -#define GRPC_BIO_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_read) -#define GRPC_BIO_read_asn1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_read_asn1) -#define GRPC_BIO_read_filename BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_read_filename) -#define GRPC_BIO_reset BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_reset) -#define GRPC_BIO_rw_filename BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_rw_filename) -#define GRPC_BIO_s_connect BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_s_connect) -#define GRPC_BIO_s_fd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_s_fd) -#define GRPC_BIO_s_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_s_file) -#define GRPC_BIO_s_mem BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_s_mem) -#define GRPC_BIO_s_socket BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_s_socket) -#define GRPC_BIO_set_close BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_set_close) -#define GRPC_BIO_set_conn_hostname BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_set_conn_hostname) -#define GRPC_BIO_set_conn_int_port BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_set_conn_int_port) -#define GRPC_BIO_set_conn_port BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_set_conn_port) -#define GRPC_BIO_set_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_set_data) -#define GRPC_BIO_set_fd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_set_fd) -#define GRPC_BIO_set_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_set_flags) -#define GRPC_BIO_set_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_set_fp) -#define GRPC_BIO_set_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_set_init) -#define GRPC_BIO_set_mem_buf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_set_mem_buf) -#define GRPC_BIO_set_mem_eof_return BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_set_mem_eof_return) -#define GRPC_BIO_set_nbio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_set_nbio) -#define GRPC_BIO_set_retry_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_set_retry_read) -#define GRPC_BIO_set_retry_special BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_set_retry_special) -#define GRPC_BIO_set_retry_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_set_retry_write) -#define GRPC_BIO_set_shutdown BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_set_shutdown) -#define GRPC_BIO_set_write_buffer_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_set_write_buffer_size) -#define GRPC_BIO_should_io_special BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_should_io_special) -#define GRPC_BIO_should_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_should_read) -#define GRPC_BIO_should_retry BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_should_retry) -#define GRPC_BIO_should_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_should_write) -#define GRPC_BIO_shutdown_wr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_shutdown_wr) -#define GRPC_BIO_snprintf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_snprintf) -#define GRPC_BIO_test_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_test_flags) -#define GRPC_BIO_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_up_ref) -#define GRPC_BIO_vfree BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_vfree) -#define GRPC_BIO_vsnprintf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_vsnprintf) -#define GRPC_BIO_wpending BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_wpending) -#define GRPC_BIO_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_write) -#define GRPC_BIO_write_all BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_write_all) -#define GRPC_BIO_write_filename BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BIO_write_filename) -#define GRPC_BN_BLINDING_convert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_BLINDING_convert) -#define GRPC_BN_BLINDING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_BLINDING_free) -#define GRPC_BN_BLINDING_invert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_BLINDING_invert) -#define GRPC_BN_BLINDING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_BLINDING_new) -#define GRPC_BN_CTX_end BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_CTX_end) -#define GRPC_BN_CTX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_CTX_free) -#define GRPC_BN_CTX_get BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_CTX_get) -#define GRPC_BN_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_CTX_new) -#define GRPC_BN_CTX_start BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_CTX_start) -#define GRPC_BN_GENCB_call BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_GENCB_call) -#define GRPC_BN_GENCB_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_GENCB_set) -#define GRPC_BN_MONT_CTX_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_MONT_CTX_copy) -#define GRPC_BN_MONT_CTX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_MONT_CTX_free) -#define GRPC_BN_MONT_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_MONT_CTX_new) -#define GRPC_BN_MONT_CTX_new_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_MONT_CTX_new_consttime) -#define GRPC_BN_MONT_CTX_new_for_modulus BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_MONT_CTX_new_for_modulus) -#define GRPC_BN_MONT_CTX_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_MONT_CTX_set) -#define GRPC_BN_MONT_CTX_set_locked BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_MONT_CTX_set_locked) -#define GRPC_BN_abs_is_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_abs_is_word) -#define GRPC_BN_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_add) -#define GRPC_BN_add_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_add_word) -#define GRPC_BN_asc2bn BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_asc2bn) -#define GRPC_BN_bin2bn BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_bin2bn) -#define GRPC_BN_bn2bin BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_bn2bin) -#define GRPC_BN_bn2bin_padded BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_bn2bin_padded) -#define GRPC_BN_bn2binpad BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_bn2binpad) -#define GRPC_BN_bn2cbb_padded BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_bn2cbb_padded) -#define GRPC_BN_bn2dec BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_bn2dec) -#define GRPC_BN_bn2hex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_bn2hex) -#define GRPC_BN_bn2le_padded BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_bn2le_padded) -#define GRPC_BN_bn2mpi BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_bn2mpi) -#define GRPC_BN_clear BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_clear) -#define GRPC_BN_clear_bit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_clear_bit) -#define GRPC_BN_clear_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_clear_free) -#define GRPC_BN_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_cmp) -#define GRPC_BN_cmp_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_cmp_word) -#define GRPC_BN_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_copy) -#define GRPC_BN_count_low_zero_bits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_count_low_zero_bits) -#define GRPC_BN_dec2bn BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_dec2bn) -#define GRPC_BN_div BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_div) -#define GRPC_BN_div_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_div_word) -#define GRPC_BN_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_dup) -#define GRPC_BN_enhanced_miller_rabin_primality_test BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_enhanced_miller_rabin_primality_test) -#define GRPC_BN_equal_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_equal_consttime) -#define GRPC_BN_exp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_exp) -#define GRPC_BN_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_free) -#define GRPC_BN_from_montgomery BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_from_montgomery) -#define GRPC_BN_gcd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_gcd) -#define GRPC_BN_generate_prime_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_generate_prime_ex) -#define GRPC_BN_get_rfc3526_prime_1536 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_get_rfc3526_prime_1536) -#define GRPC_BN_get_u64 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_get_u64) -#define GRPC_BN_get_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_get_word) -#define GRPC_BN_hex2bn BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_hex2bn) -#define GRPC_BN_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_init) -#define GRPC_BN_is_bit_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_is_bit_set) -#define GRPC_BN_is_negative BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_is_negative) -#define GRPC_BN_is_odd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_is_odd) -#define GRPC_BN_is_one BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_is_one) -#define GRPC_BN_is_pow2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_is_pow2) -#define GRPC_BN_is_prime_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_is_prime_ex) -#define GRPC_BN_is_prime_fasttest_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_is_prime_fasttest_ex) -#define GRPC_BN_is_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_is_word) -#define GRPC_BN_is_zero BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_is_zero) -#define GRPC_BN_le2bn BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_le2bn) -#define GRPC_BN_lshift BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_lshift) -#define GRPC_BN_lshift1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_lshift1) -#define GRPC_BN_marshal_asn1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_marshal_asn1) -#define GRPC_BN_mask_bits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_mask_bits) -#define GRPC_BN_mod_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_mod_add) -#define GRPC_BN_mod_add_quick BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_mod_add_quick) -#define GRPC_BN_mod_exp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_mod_exp) -#define GRPC_BN_mod_exp2_mont BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_mod_exp2_mont) -#define GRPC_BN_mod_exp_mont BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_mod_exp_mont) -#define GRPC_BN_mod_exp_mont_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_mod_exp_mont_consttime) -#define GRPC_BN_mod_exp_mont_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_mod_exp_mont_word) -#define GRPC_BN_mod_inverse BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_mod_inverse) -#define GRPC_BN_mod_inverse_blinded BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_mod_inverse_blinded) -#define GRPC_BN_mod_inverse_odd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_mod_inverse_odd) -#define GRPC_BN_mod_lshift BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_mod_lshift) -#define GRPC_BN_mod_lshift1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_mod_lshift1) -#define GRPC_BN_mod_lshift1_quick BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_mod_lshift1_quick) -#define GRPC_BN_mod_lshift_quick BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_mod_lshift_quick) -#define GRPC_BN_mod_mul BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_mod_mul) -#define GRPC_BN_mod_mul_montgomery BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_mod_mul_montgomery) -#define GRPC_BN_mod_pow2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_mod_pow2) -#define GRPC_BN_mod_sqr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_mod_sqr) -#define GRPC_BN_mod_sqrt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_mod_sqrt) -#define GRPC_BN_mod_sub BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_mod_sub) -#define GRPC_BN_mod_sub_quick BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_mod_sub_quick) -#define GRPC_BN_mod_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_mod_word) -#define GRPC_BN_mpi2bn BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_mpi2bn) -#define GRPC_BN_mul BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_mul) -#define GRPC_BN_mul_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_mul_word) -#define GRPC_BN_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_new) -#define GRPC_BN_nnmod BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_nnmod) -#define GRPC_BN_nnmod_pow2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_nnmod_pow2) -#define GRPC_BN_num_bits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_num_bits) -#define GRPC_BN_num_bits_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_num_bits_word) -#define GRPC_BN_num_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_num_bytes) -#define GRPC_BN_one BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_one) -#define GRPC_BN_parse_asn1_unsigned BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_parse_asn1_unsigned) -#define GRPC_BN_primality_test BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_primality_test) -#define GRPC_BN_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_print) -#define GRPC_BN_print_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_print_fp) -#define GRPC_BN_pseudo_rand BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_pseudo_rand) -#define GRPC_BN_pseudo_rand_range BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_pseudo_rand_range) -#define GRPC_BN_rand BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_rand) -#define GRPC_BN_rand_range BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_rand_range) -#define GRPC_BN_rand_range_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_rand_range_ex) -#define GRPC_BN_rshift BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_rshift) -#define GRPC_BN_rshift1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_rshift1) -#define GRPC_BN_set_bit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_set_bit) -#define GRPC_BN_set_negative BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_set_negative) -#define GRPC_BN_set_u64 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_set_u64) -#define GRPC_BN_set_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_set_word) -#define GRPC_BN_sqr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_sqr) -#define GRPC_BN_sqrt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_sqrt) -#define GRPC_BN_sub BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_sub) -#define GRPC_BN_sub_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_sub_word) -#define GRPC_BN_to_ASN1_ENUMERATED BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_to_ASN1_ENUMERATED) -#define GRPC_BN_to_ASN1_INTEGER BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_to_ASN1_INTEGER) -#define GRPC_BN_to_montgomery BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_to_montgomery) -#define GRPC_BN_uadd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_uadd) -#define GRPC_BN_ucmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_ucmp) -#define GRPC_BN_usub BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_usub) -#define GRPC_BN_value_one BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_value_one) -#define GRPC_BN_zero BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BN_zero) -#define GRPC_BORINGSSL_function_hit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BORINGSSL_function_hit) -#define GRPC_BORINGSSL_self_test BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BORINGSSL_self_test) -#define GRPC_BUF_MEM_append BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BUF_MEM_append) -#define GRPC_BUF_MEM_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BUF_MEM_free) -#define GRPC_BUF_MEM_grow BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BUF_MEM_grow) -#define GRPC_BUF_MEM_grow_clean BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BUF_MEM_grow_clean) -#define GRPC_BUF_MEM_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BUF_MEM_new) -#define GRPC_BUF_MEM_reserve BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BUF_MEM_reserve) -#define GRPC_BUF_memdup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BUF_memdup) -#define GRPC_BUF_strdup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BUF_strdup) -#define GRPC_BUF_strlcat BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BUF_strlcat) -#define GRPC_BUF_strlcpy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BUF_strlcpy) -#define GRPC_BUF_strndup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BUF_strndup) -#define GRPC_BUF_strnlen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_BUF_strnlen) -#define GRPC_CBB_add_asn1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_add_asn1) -#define GRPC_CBB_add_asn1_bool BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_add_asn1_bool) -#define GRPC_CBB_add_asn1_int64 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_add_asn1_int64) -#define GRPC_CBB_add_asn1_octet_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_add_asn1_octet_string) -#define GRPC_CBB_add_asn1_oid_from_text BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_add_asn1_oid_from_text) -#define GRPC_CBB_add_asn1_uint64 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_add_asn1_uint64) -#define GRPC_CBB_add_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_add_bytes) -#define GRPC_CBB_add_space BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_add_space) -#define GRPC_CBB_add_u16 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_add_u16) -#define GRPC_CBB_add_u16_length_prefixed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_add_u16_length_prefixed) -#define GRPC_CBB_add_u16le BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_add_u16le) -#define GRPC_CBB_add_u24 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_add_u24) -#define GRPC_CBB_add_u24_length_prefixed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_add_u24_length_prefixed) -#define GRPC_CBB_add_u32 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_add_u32) -#define GRPC_CBB_add_u32le BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_add_u32le) -#define GRPC_CBB_add_u64 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_add_u64) -#define GRPC_CBB_add_u64le BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_add_u64le) -#define GRPC_CBB_add_u8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_add_u8) -#define GRPC_CBB_add_u8_length_prefixed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_add_u8_length_prefixed) -#define GRPC_CBB_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_cleanup) -#define GRPC_CBB_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_data) -#define GRPC_CBB_did_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_did_write) -#define GRPC_CBB_discard_child BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_discard_child) -#define GRPC_CBB_finish BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_finish) -#define GRPC_CBB_finish_i2d BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_finish_i2d) -#define GRPC_CBB_flush BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_flush) -#define GRPC_CBB_flush_asn1_set_of BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_flush_asn1_set_of) -#define GRPC_CBB_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_init) -#define GRPC_CBB_init_fixed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_init_fixed) -#define GRPC_CBB_len BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_len) -#define GRPC_CBB_reserve BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_reserve) -#define GRPC_CBB_zero BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBB_zero) -#define GRPC_CBS_asn1_ber_to_der BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_asn1_ber_to_der) -#define GRPC_CBS_asn1_bitstring_has_bit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_asn1_bitstring_has_bit) -#define GRPC_CBS_asn1_oid_to_text BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_asn1_oid_to_text) -#define GRPC_CBS_contains_zero_byte BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_contains_zero_byte) -#define GRPC_CBS_copy_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_copy_bytes) -#define GRPC_CBS_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_data) -#define GRPC_CBS_get_any_asn1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_get_any_asn1) -#define GRPC_CBS_get_any_asn1_element BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_get_any_asn1_element) -#define GRPC_CBS_get_any_ber_asn1_element BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_get_any_ber_asn1_element) -#define GRPC_CBS_get_asn1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_get_asn1) -#define GRPC_CBS_get_asn1_bool BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_get_asn1_bool) -#define GRPC_CBS_get_asn1_element BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_get_asn1_element) -#define GRPC_CBS_get_asn1_implicit_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_get_asn1_implicit_string) -#define GRPC_CBS_get_asn1_int64 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_get_asn1_int64) -#define GRPC_CBS_get_asn1_uint64 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_get_asn1_uint64) -#define GRPC_CBS_get_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_get_bytes) -#define GRPC_CBS_get_last_u8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_get_last_u8) -#define GRPC_CBS_get_optional_asn1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_get_optional_asn1) -#define GRPC_CBS_get_optional_asn1_bool BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_get_optional_asn1_bool) -#define GRPC_CBS_get_optional_asn1_octet_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_get_optional_asn1_octet_string) -#define GRPC_CBS_get_optional_asn1_uint64 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_get_optional_asn1_uint64) -#define GRPC_CBS_get_u16 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_get_u16) -#define GRPC_CBS_get_u16_length_prefixed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_get_u16_length_prefixed) -#define GRPC_CBS_get_u16le BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_get_u16le) -#define GRPC_CBS_get_u24 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_get_u24) -#define GRPC_CBS_get_u24_length_prefixed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_get_u24_length_prefixed) -#define GRPC_CBS_get_u32 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_get_u32) -#define GRPC_CBS_get_u32le BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_get_u32le) -#define GRPC_CBS_get_u64 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_get_u64) -#define GRPC_CBS_get_u64le BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_get_u64le) -#define GRPC_CBS_get_u8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_get_u8) -#define GRPC_CBS_get_u8_length_prefixed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_get_u8_length_prefixed) -#define GRPC_CBS_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_init) -#define GRPC_CBS_is_valid_asn1_bitstring BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_is_valid_asn1_bitstring) -#define GRPC_CBS_len BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_len) -#define GRPC_CBS_mem_equal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_mem_equal) -#define GRPC_CBS_peek_asn1_tag BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_peek_asn1_tag) -#define GRPC_CBS_skip BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_skip) -#define GRPC_CBS_stow BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_stow) -#define GRPC_CBS_strdup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CBS_strdup) -#define GRPC_CERTIFICATEPOLICIES_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CERTIFICATEPOLICIES_free) -#define GRPC_CERTIFICATEPOLICIES_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CERTIFICATEPOLICIES_it) -#define GRPC_CERTIFICATEPOLICIES_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CERTIFICATEPOLICIES_new) -#define GRPC_CMAC_CTX_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CMAC_CTX_copy) -#define GRPC_CMAC_CTX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CMAC_CTX_free) -#define GRPC_CMAC_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CMAC_CTX_new) -#define GRPC_CMAC_Final BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CMAC_Final) -#define GRPC_CMAC_Init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CMAC_Init) -#define GRPC_CMAC_Reset BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CMAC_Reset) -#define GRPC_CMAC_Update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CMAC_Update) -#define GRPC_CONF_VALUE_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CONF_VALUE_new) -#define GRPC_CONF_modules_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CONF_modules_free) -#define GRPC_CONF_modules_load_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CONF_modules_load_file) -#define GRPC_CONF_parse_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CONF_parse_list) -#define GRPC_CRL_DIST_POINTS_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRL_DIST_POINTS_free) -#define GRPC_CRL_DIST_POINTS_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRL_DIST_POINTS_it) -#define GRPC_CRL_DIST_POINTS_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRL_DIST_POINTS_new) -#define GRPC_CRYPTO_BUFFER_POOL_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_BUFFER_POOL_free) -#define GRPC_CRYPTO_BUFFER_POOL_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_BUFFER_POOL_new) -#define GRPC_CRYPTO_BUFFER_alloc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_BUFFER_alloc) -#define GRPC_CRYPTO_BUFFER_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_BUFFER_data) -#define GRPC_CRYPTO_BUFFER_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_BUFFER_free) -#define GRPC_CRYPTO_BUFFER_init_CBS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_BUFFER_init_CBS) -#define GRPC_CRYPTO_BUFFER_len BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_BUFFER_len) -#define GRPC_CRYPTO_BUFFER_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_BUFFER_new) -#define GRPC_CRYPTO_BUFFER_new_from_CBS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_BUFFER_new_from_CBS) -#define GRPC_CRYPTO_BUFFER_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_BUFFER_up_ref) -#define GRPC_CRYPTO_MUTEX_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_MUTEX_cleanup) -#define GRPC_CRYPTO_MUTEX_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_MUTEX_init) -#define GRPC_CRYPTO_MUTEX_lock_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_MUTEX_lock_read) -#define GRPC_CRYPTO_MUTEX_lock_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_MUTEX_lock_write) -#define GRPC_CRYPTO_MUTEX_unlock_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_MUTEX_unlock_read) -#define GRPC_CRYPTO_MUTEX_unlock_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_MUTEX_unlock_write) -#define GRPC_CRYPTO_POLYVAL_finish BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_POLYVAL_finish) -#define GRPC_CRYPTO_POLYVAL_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_POLYVAL_init) -#define GRPC_CRYPTO_POLYVAL_update_blocks BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_POLYVAL_update_blocks) -#define GRPC_CRYPTO_STATIC_MUTEX_lock_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_STATIC_MUTEX_lock_read) -#define GRPC_CRYPTO_STATIC_MUTEX_lock_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_STATIC_MUTEX_lock_write) -#define GRPC_CRYPTO_STATIC_MUTEX_unlock_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_STATIC_MUTEX_unlock_read) -#define GRPC_CRYPTO_STATIC_MUTEX_unlock_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_STATIC_MUTEX_unlock_write) -#define GRPC_CRYPTO_THREADID_current BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_THREADID_current) -#define GRPC_CRYPTO_THREADID_set_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_THREADID_set_callback) -#define GRPC_CRYPTO_THREADID_set_numeric BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_THREADID_set_numeric) -#define GRPC_CRYPTO_THREADID_set_pointer BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_THREADID_set_pointer) -#define GRPC_CRYPTO_cbc128_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_cbc128_decrypt) -#define GRPC_CRYPTO_cbc128_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_cbc128_encrypt) -#define GRPC_CRYPTO_cfb128_1_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_cfb128_1_encrypt) -#define GRPC_CRYPTO_cfb128_8_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_cfb128_8_encrypt) -#define GRPC_CRYPTO_cfb128_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_cfb128_encrypt) -#define GRPC_CRYPTO_chacha_20 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_chacha_20) -#define GRPC_CRYPTO_cleanup_all_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_cleanup_all_ex_data) -#define GRPC_CRYPTO_ctr128_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_ctr128_encrypt) -#define GRPC_CRYPTO_ctr128_encrypt_ctr32 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_ctr128_encrypt_ctr32) -#define GRPC_CRYPTO_free_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_free_ex_data) -#define GRPC_CRYPTO_gcm128_aad BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_gcm128_aad) -#define GRPC_CRYPTO_gcm128_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_gcm128_decrypt) -#define GRPC_CRYPTO_gcm128_decrypt_ctr32 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_gcm128_decrypt_ctr32) -#define GRPC_CRYPTO_gcm128_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_gcm128_encrypt) -#define GRPC_CRYPTO_gcm128_encrypt_ctr32 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_gcm128_encrypt_ctr32) -#define GRPC_CRYPTO_gcm128_finish BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_gcm128_finish) -#define GRPC_CRYPTO_gcm128_init_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_gcm128_init_key) -#define GRPC_CRYPTO_gcm128_setiv BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_gcm128_setiv) -#define GRPC_CRYPTO_gcm128_tag BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_gcm128_tag) -#define GRPC_CRYPTO_get_dynlock_create_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_get_dynlock_create_callback) -#define GRPC_CRYPTO_get_dynlock_destroy_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_get_dynlock_destroy_callback) -#define GRPC_CRYPTO_get_dynlock_lock_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_get_dynlock_lock_callback) -#define GRPC_CRYPTO_get_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_get_ex_data) -#define GRPC_CRYPTO_get_ex_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_get_ex_new_index) -#define GRPC_CRYPTO_get_lock_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_get_lock_name) -#define GRPC_CRYPTO_get_locking_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_get_locking_callback) -#define GRPC_CRYPTO_get_thread_local BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_get_thread_local) -#define GRPC_CRYPTO_ghash_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_ghash_init) -#define GRPC_CRYPTO_has_asm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_has_asm) -#define GRPC_CRYPTO_hchacha20 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_hchacha20) -#define GRPC_CRYPTO_is_confidential_build BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_is_confidential_build) -#define GRPC_CRYPTO_library_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_library_init) -#define GRPC_CRYPTO_malloc_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_malloc_init) -#define GRPC_CRYPTO_memcmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_memcmp) -#define GRPC_CRYPTO_new_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_new_ex_data) -#define GRPC_CRYPTO_num_locks BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_num_locks) -#define GRPC_CRYPTO_ofb128_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_ofb128_encrypt) -#define GRPC_CRYPTO_once BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_once) -#define GRPC_CRYPTO_poly1305_finish BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_poly1305_finish) -#define GRPC_CRYPTO_poly1305_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_poly1305_init) -#define GRPC_CRYPTO_poly1305_update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_poly1305_update) -#define GRPC_CRYPTO_rdrand BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_rdrand) -#define GRPC_CRYPTO_rdrand_multiple8_buf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_rdrand_multiple8_buf) -#define GRPC_CRYPTO_refcount_dec_and_test_zero BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_refcount_dec_and_test_zero) -#define GRPC_CRYPTO_refcount_inc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_refcount_inc) -#define GRPC_CRYPTO_set_add_lock_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_set_add_lock_callback) -#define GRPC_CRYPTO_set_dynlock_create_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_set_dynlock_create_callback) -#define GRPC_CRYPTO_set_dynlock_destroy_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_set_dynlock_destroy_callback) -#define GRPC_CRYPTO_set_dynlock_lock_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_set_dynlock_lock_callback) -#define GRPC_CRYPTO_set_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_set_ex_data) -#define GRPC_CRYPTO_set_id_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_set_id_callback) -#define GRPC_CRYPTO_set_locking_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_set_locking_callback) -#define GRPC_CRYPTO_set_thread_local BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_set_thread_local) -#define GRPC_CRYPTO_sysrand BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_sysrand) -#define GRPC_CRYPTO_tls1_prf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CRYPTO_tls1_prf) -#define GRPC_CTR_DRBG_clear BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CTR_DRBG_clear) -#define GRPC_CTR_DRBG_generate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CTR_DRBG_generate) -#define GRPC_CTR_DRBG_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CTR_DRBG_init) -#define GRPC_CTR_DRBG_reseed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_CTR_DRBG_reseed) -#define GRPC_ChaCha20_ctr32 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ChaCha20_ctr32) -#define GRPC_DES_decrypt3 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DES_decrypt3) -#define GRPC_DES_ecb3_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DES_ecb3_encrypt) -#define GRPC_DES_ecb_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DES_ecb_encrypt) -#define GRPC_DES_ede2_cbc_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DES_ede2_cbc_encrypt) -#define GRPC_DES_ede3_cbc_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DES_ede3_cbc_encrypt) -#define GRPC_DES_encrypt3 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DES_encrypt3) -#define GRPC_DES_ncbc_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DES_ncbc_encrypt) -#define GRPC_DES_set_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DES_set_key) -#define GRPC_DES_set_key_unchecked BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DES_set_key_unchecked) -#define GRPC_DES_set_odd_parity BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DES_set_odd_parity) -#define GRPC_DH_check BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DH_check) -#define GRPC_DH_check_pub_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DH_check_pub_key) -#define GRPC_DH_compute_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DH_compute_key) -#define GRPC_DH_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DH_free) -#define GRPC_DH_generate_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DH_generate_key) -#define GRPC_DH_generate_parameters_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DH_generate_parameters_ex) -#define GRPC_DH_get0_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DH_get0_key) -#define GRPC_DH_get0_pqg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DH_get0_pqg) -#define GRPC_DH_get_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DH_get_ex_data) -#define GRPC_DH_get_ex_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DH_get_ex_new_index) -#define GRPC_DH_marshal_parameters BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DH_marshal_parameters) -#define GRPC_DH_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DH_new) -#define GRPC_DH_num_bits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DH_num_bits) -#define GRPC_DH_parse_parameters BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DH_parse_parameters) -#define GRPC_DH_set0_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DH_set0_key) -#define GRPC_DH_set0_pqg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DH_set0_pqg) -#define GRPC_DH_set_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DH_set_ex_data) -#define GRPC_DH_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DH_size) -#define GRPC_DH_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DH_up_ref) -#define GRPC_DHparams_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DHparams_dup) -#define GRPC_DIRECTORYSTRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DIRECTORYSTRING_free) -#define GRPC_DIRECTORYSTRING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DIRECTORYSTRING_it) -#define GRPC_DIRECTORYSTRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DIRECTORYSTRING_new) -#define GRPC_DISPLAYTEXT_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DISPLAYTEXT_free) -#define GRPC_DISPLAYTEXT_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DISPLAYTEXT_it) -#define GRPC_DISPLAYTEXT_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DISPLAYTEXT_new) -#define GRPC_DIST_POINT_NAME_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DIST_POINT_NAME_free) -#define GRPC_DIST_POINT_NAME_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DIST_POINT_NAME_it) -#define GRPC_DIST_POINT_NAME_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DIST_POINT_NAME_new) -#define GRPC_DIST_POINT_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DIST_POINT_free) -#define GRPC_DIST_POINT_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DIST_POINT_it) -#define GRPC_DIST_POINT_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DIST_POINT_new) -#define GRPC_DIST_POINT_set_dpname BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DIST_POINT_set_dpname) -#define GRPC_DSA_SIG_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DSA_SIG_free) -#define GRPC_DSA_SIG_marshal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DSA_SIG_marshal) -#define GRPC_DSA_SIG_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DSA_SIG_new) -#define GRPC_DSA_SIG_parse BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DSA_SIG_parse) -#define GRPC_DSA_check_signature BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DSA_check_signature) -#define GRPC_DSA_do_check_signature BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DSA_do_check_signature) -#define GRPC_DSA_do_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DSA_do_sign) -#define GRPC_DSA_do_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DSA_do_verify) -#define GRPC_DSA_dup_DH BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DSA_dup_DH) -#define GRPC_DSA_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DSA_free) -#define GRPC_DSA_generate_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DSA_generate_key) -#define GRPC_DSA_generate_parameters_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DSA_generate_parameters_ex) -#define GRPC_DSA_get0_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DSA_get0_key) -#define GRPC_DSA_get0_pqg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DSA_get0_pqg) -#define GRPC_DSA_get_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DSA_get_ex_data) -#define GRPC_DSA_get_ex_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DSA_get_ex_new_index) -#define GRPC_DSA_marshal_parameters BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DSA_marshal_parameters) -#define GRPC_DSA_marshal_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DSA_marshal_private_key) -#define GRPC_DSA_marshal_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DSA_marshal_public_key) -#define GRPC_DSA_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DSA_new) -#define GRPC_DSA_parse_parameters BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DSA_parse_parameters) -#define GRPC_DSA_parse_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DSA_parse_private_key) -#define GRPC_DSA_parse_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DSA_parse_public_key) -#define GRPC_DSA_set0_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DSA_set0_key) -#define GRPC_DSA_set0_pqg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DSA_set0_pqg) -#define GRPC_DSA_set_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DSA_set_ex_data) -#define GRPC_DSA_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DSA_sign) -#define GRPC_DSA_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DSA_size) -#define GRPC_DSA_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DSA_up_ref) -#define GRPC_DSA_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DSA_verify) -#define GRPC_DSAparams_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_DSAparams_dup) -#define GRPC_ECDH_compute_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ECDH_compute_key) -#define GRPC_ECDH_compute_key_fips BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ECDH_compute_key_fips) -#define GRPC_ECDSA_SIG_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ECDSA_SIG_free) -#define GRPC_ECDSA_SIG_from_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ECDSA_SIG_from_bytes) -#define GRPC_ECDSA_SIG_get0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ECDSA_SIG_get0) -#define GRPC_ECDSA_SIG_marshal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ECDSA_SIG_marshal) -#define GRPC_ECDSA_SIG_max_len BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ECDSA_SIG_max_len) -#define GRPC_ECDSA_SIG_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ECDSA_SIG_new) -#define GRPC_ECDSA_SIG_parse BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ECDSA_SIG_parse) -#define GRPC_ECDSA_SIG_set0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ECDSA_SIG_set0) -#define GRPC_ECDSA_SIG_to_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ECDSA_SIG_to_bytes) -#define GRPC_ECDSA_do_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ECDSA_do_sign) -#define GRPC_ECDSA_do_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ECDSA_do_verify) -#define GRPC_ECDSA_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ECDSA_sign) -#define GRPC_ECDSA_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ECDSA_size) -#define GRPC_ECDSA_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ECDSA_verify) -#define GRPC_EC_GFp_mont_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_GFp_mont_method) -#define GRPC_EC_GFp_nistp224_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_GFp_nistp224_method) -#define GRPC_EC_GFp_nistp256_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_GFp_nistp256_method) -#define GRPC_EC_GFp_nistz256_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_GFp_nistz256_method) -#define GRPC_EC_GROUP_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_GROUP_cmp) -#define GRPC_EC_GROUP_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_GROUP_dup) -#define GRPC_EC_GROUP_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_GROUP_free) -#define GRPC_EC_GROUP_get0_generator BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_GROUP_get0_generator) -#define GRPC_EC_GROUP_get0_order BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_GROUP_get0_order) -#define GRPC_EC_GROUP_get_cofactor BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_GROUP_get_cofactor) -#define GRPC_EC_GROUP_get_curve_GFp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_GROUP_get_curve_GFp) -#define GRPC_EC_GROUP_get_curve_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_GROUP_get_curve_name) -#define GRPC_EC_GROUP_get_degree BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_GROUP_get_degree) -#define GRPC_EC_GROUP_get_order BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_GROUP_get_order) -#define GRPC_EC_GROUP_method_of BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_GROUP_method_of) -#define GRPC_EC_GROUP_new_by_curve_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_GROUP_new_by_curve_name) -#define GRPC_EC_GROUP_new_curve_GFp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_GROUP_new_curve_GFp) -#define GRPC_EC_GROUP_order_bits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_GROUP_order_bits) -#define GRPC_EC_GROUP_set_asn1_flag BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_GROUP_set_asn1_flag) -#define GRPC_EC_GROUP_set_generator BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_GROUP_set_generator) -#define GRPC_EC_GROUP_set_point_conversion_form BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_GROUP_set_point_conversion_form) -#define GRPC_EC_KEY_check_fips BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_KEY_check_fips) -#define GRPC_EC_KEY_check_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_KEY_check_key) -#define GRPC_EC_KEY_derive_from_secret BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_KEY_derive_from_secret) -#define GRPC_EC_KEY_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_KEY_dup) -#define GRPC_EC_KEY_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_KEY_free) -#define GRPC_EC_KEY_generate_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_KEY_generate_key) -#define GRPC_EC_KEY_generate_key_fips BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_KEY_generate_key_fips) -#define GRPC_EC_KEY_get0_group BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_KEY_get0_group) -#define GRPC_EC_KEY_get0_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_KEY_get0_private_key) -#define GRPC_EC_KEY_get0_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_KEY_get0_public_key) -#define GRPC_EC_KEY_get_conv_form BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_KEY_get_conv_form) -#define GRPC_EC_KEY_get_enc_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_KEY_get_enc_flags) -#define GRPC_EC_KEY_get_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_KEY_get_ex_data) -#define GRPC_EC_KEY_get_ex_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_KEY_get_ex_new_index) -#define GRPC_EC_KEY_is_opaque BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_KEY_is_opaque) -#define GRPC_EC_KEY_key2buf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_KEY_key2buf) -#define GRPC_EC_KEY_marshal_curve_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_KEY_marshal_curve_name) -#define GRPC_EC_KEY_marshal_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_KEY_marshal_private_key) -#define GRPC_EC_KEY_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_KEY_new) -#define GRPC_EC_KEY_new_by_curve_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_KEY_new_by_curve_name) -#define GRPC_EC_KEY_new_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_KEY_new_method) -#define GRPC_EC_KEY_parse_curve_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_KEY_parse_curve_name) -#define GRPC_EC_KEY_parse_parameters BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_KEY_parse_parameters) -#define GRPC_EC_KEY_parse_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_KEY_parse_private_key) -#define GRPC_EC_KEY_set_asn1_flag BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_KEY_set_asn1_flag) -#define GRPC_EC_KEY_set_conv_form BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_KEY_set_conv_form) -#define GRPC_EC_KEY_set_enc_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_KEY_set_enc_flags) -#define GRPC_EC_KEY_set_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_KEY_set_ex_data) -#define GRPC_EC_KEY_set_group BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_KEY_set_group) -#define GRPC_EC_KEY_set_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_KEY_set_private_key) -#define GRPC_EC_KEY_set_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_KEY_set_public_key) -#define GRPC_EC_KEY_set_public_key_affine_coordinates BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_KEY_set_public_key_affine_coordinates) -#define GRPC_EC_KEY_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_KEY_up_ref) -#define GRPC_EC_METHOD_get_field_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_METHOD_get_field_type) -#define GRPC_EC_POINT_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_POINT_add) -#define GRPC_EC_POINT_clear_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_POINT_clear_free) -#define GRPC_EC_POINT_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_POINT_cmp) -#define GRPC_EC_POINT_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_POINT_copy) -#define GRPC_EC_POINT_dbl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_POINT_dbl) -#define GRPC_EC_POINT_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_POINT_dup) -#define GRPC_EC_POINT_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_POINT_free) -#define GRPC_EC_POINT_get_affine_coordinates_GFp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_POINT_get_affine_coordinates_GFp) -#define GRPC_EC_POINT_invert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_POINT_invert) -#define GRPC_EC_POINT_is_at_infinity BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_POINT_is_at_infinity) -#define GRPC_EC_POINT_is_on_curve BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_POINT_is_on_curve) -#define GRPC_EC_POINT_mul BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_POINT_mul) -#define GRPC_EC_POINT_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_POINT_new) -#define GRPC_EC_POINT_oct2point BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_POINT_oct2point) -#define GRPC_EC_POINT_point2cbb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_POINT_point2cbb) -#define GRPC_EC_POINT_point2oct BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_POINT_point2oct) -#define GRPC_EC_POINT_set_affine_coordinates_GFp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_POINT_set_affine_coordinates_GFp) -#define GRPC_EC_POINT_set_compressed_coordinates_GFp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_POINT_set_compressed_coordinates_GFp) -#define GRPC_EC_POINT_set_to_infinity BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_POINT_set_to_infinity) -#define GRPC_EC_curve_nid2nist BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_curve_nid2nist) -#define GRPC_EC_curve_nist2nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_curve_nist2nid) -#define GRPC_EC_get_builtin_curves BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EC_get_builtin_curves) -#define GRPC_ED25519_keypair BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ED25519_keypair) -#define GRPC_ED25519_keypair_from_seed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ED25519_keypair_from_seed) -#define GRPC_ED25519_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ED25519_sign) -#define GRPC_ED25519_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ED25519_verify) -#define GRPC_EDIPARTYNAME_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EDIPARTYNAME_free) -#define GRPC_EDIPARTYNAME_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EDIPARTYNAME_it) -#define GRPC_EDIPARTYNAME_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EDIPARTYNAME_new) -#define GRPC_ENGINE_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ENGINE_free) -#define GRPC_ENGINE_get_ECDSA_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ENGINE_get_ECDSA_method) -#define GRPC_ENGINE_get_RSA_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ENGINE_get_RSA_method) -#define GRPC_ENGINE_load_builtin_engines BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ENGINE_load_builtin_engines) -#define GRPC_ENGINE_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ENGINE_new) -#define GRPC_ENGINE_register_all_complete BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ENGINE_register_all_complete) -#define GRPC_ENGINE_set_ECDSA_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ENGINE_set_ECDSA_method) -#define GRPC_ENGINE_set_RSA_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ENGINE_set_RSA_method) -#define GRPC_ERR_SAVE_STATE_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ERR_SAVE_STATE_free) -#define GRPC_ERR_add_error_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ERR_add_error_data) -#define GRPC_ERR_add_error_dataf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ERR_add_error_dataf) -#define GRPC_ERR_clear_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ERR_clear_error) -#define GRPC_ERR_clear_system_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ERR_clear_system_error) -#define GRPC_ERR_error_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ERR_error_string) -#define GRPC_ERR_error_string_n BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ERR_error_string_n) -#define GRPC_ERR_free_strings BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ERR_free_strings) -#define GRPC_ERR_func_error_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ERR_func_error_string) -#define GRPC_ERR_get_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ERR_get_error) -#define GRPC_ERR_get_error_line BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ERR_get_error_line) -#define GRPC_ERR_get_error_line_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ERR_get_error_line_data) -#define GRPC_ERR_get_next_error_library BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ERR_get_next_error_library) -#define GRPC_ERR_lib_error_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ERR_lib_error_string) -#define GRPC_ERR_load_BIO_strings BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ERR_load_BIO_strings) -#define GRPC_ERR_load_ERR_strings BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ERR_load_ERR_strings) -#define GRPC_ERR_load_RAND_strings BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ERR_load_RAND_strings) -#define GRPC_ERR_load_crypto_strings BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ERR_load_crypto_strings) -#define GRPC_ERR_peek_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ERR_peek_error) -#define GRPC_ERR_peek_error_line BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ERR_peek_error_line) -#define GRPC_ERR_peek_error_line_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ERR_peek_error_line_data) -#define GRPC_ERR_peek_last_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ERR_peek_last_error) -#define GRPC_ERR_peek_last_error_line BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ERR_peek_last_error_line) -#define GRPC_ERR_peek_last_error_line_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ERR_peek_last_error_line_data) -#define GRPC_ERR_pop_to_mark BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ERR_pop_to_mark) -#define GRPC_ERR_print_errors BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ERR_print_errors) -#define GRPC_ERR_print_errors_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ERR_print_errors_cb) -#define GRPC_ERR_print_errors_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ERR_print_errors_fp) -#define GRPC_ERR_put_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ERR_put_error) -#define GRPC_ERR_reason_error_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ERR_reason_error_string) -#define GRPC_ERR_remove_state BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ERR_remove_state) -#define GRPC_ERR_remove_thread_state BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ERR_remove_thread_state) -#define GRPC_ERR_restore_state BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ERR_restore_state) -#define GRPC_ERR_save_state BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ERR_save_state) -#define GRPC_ERR_set_mark BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ERR_set_mark) -#define GRPC_EVP_AEAD_CTX_aead BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_AEAD_CTX_aead) -#define GRPC_EVP_AEAD_CTX_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_AEAD_CTX_cleanup) -#define GRPC_EVP_AEAD_CTX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_AEAD_CTX_free) -#define GRPC_EVP_AEAD_CTX_get_iv BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_AEAD_CTX_get_iv) -#define GRPC_EVP_AEAD_CTX_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_AEAD_CTX_init) -#define GRPC_EVP_AEAD_CTX_init_with_direction BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_AEAD_CTX_init_with_direction) -#define GRPC_EVP_AEAD_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_AEAD_CTX_new) -#define GRPC_EVP_AEAD_CTX_open BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_AEAD_CTX_open) -#define GRPC_EVP_AEAD_CTX_open_gather BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_AEAD_CTX_open_gather) -#define GRPC_EVP_AEAD_CTX_seal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_AEAD_CTX_seal) -#define GRPC_EVP_AEAD_CTX_seal_scatter BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_AEAD_CTX_seal_scatter) -#define GRPC_EVP_AEAD_CTX_tag_len BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_AEAD_CTX_tag_len) -#define GRPC_EVP_AEAD_CTX_zero BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_AEAD_CTX_zero) -#define GRPC_EVP_AEAD_key_length BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_AEAD_key_length) -#define GRPC_EVP_AEAD_max_overhead BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_AEAD_max_overhead) -#define GRPC_EVP_AEAD_max_tag_len BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_AEAD_max_tag_len) -#define GRPC_EVP_AEAD_nonce_length BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_AEAD_nonce_length) -#define GRPC_EVP_BytesToKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_BytesToKey) -#define GRPC_EVP_CIPHER_CTX_block_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_CIPHER_CTX_block_size) -#define GRPC_EVP_CIPHER_CTX_cipher BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_CIPHER_CTX_cipher) -#define GRPC_EVP_CIPHER_CTX_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_CIPHER_CTX_cleanup) -#define GRPC_EVP_CIPHER_CTX_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_CIPHER_CTX_copy) -#define GRPC_EVP_CIPHER_CTX_ctrl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_CIPHER_CTX_ctrl) -#define GRPC_EVP_CIPHER_CTX_encrypting BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_CIPHER_CTX_encrypting) -#define GRPC_EVP_CIPHER_CTX_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_CIPHER_CTX_flags) -#define GRPC_EVP_CIPHER_CTX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_CIPHER_CTX_free) -#define GRPC_EVP_CIPHER_CTX_get_app_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_CIPHER_CTX_get_app_data) -#define GRPC_EVP_CIPHER_CTX_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_CIPHER_CTX_init) -#define GRPC_EVP_CIPHER_CTX_iv_length BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_CIPHER_CTX_iv_length) -#define GRPC_EVP_CIPHER_CTX_key_length BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_CIPHER_CTX_key_length) -#define GRPC_EVP_CIPHER_CTX_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_CIPHER_CTX_mode) -#define GRPC_EVP_CIPHER_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_CIPHER_CTX_new) -#define GRPC_EVP_CIPHER_CTX_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_CIPHER_CTX_nid) -#define GRPC_EVP_CIPHER_CTX_reset BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_CIPHER_CTX_reset) -#define GRPC_EVP_CIPHER_CTX_set_app_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_CIPHER_CTX_set_app_data) -#define GRPC_EVP_CIPHER_CTX_set_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_CIPHER_CTX_set_flags) -#define GRPC_EVP_CIPHER_CTX_set_key_length BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_CIPHER_CTX_set_key_length) -#define GRPC_EVP_CIPHER_CTX_set_padding BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_CIPHER_CTX_set_padding) -#define GRPC_EVP_CIPHER_block_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_CIPHER_block_size) -#define GRPC_EVP_CIPHER_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_CIPHER_flags) -#define GRPC_EVP_CIPHER_iv_length BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_CIPHER_iv_length) -#define GRPC_EVP_CIPHER_key_length BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_CIPHER_key_length) -#define GRPC_EVP_CIPHER_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_CIPHER_mode) -#define GRPC_EVP_CIPHER_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_CIPHER_nid) -#define GRPC_EVP_Cipher BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_Cipher) -#define GRPC_EVP_CipherFinal_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_CipherFinal_ex) -#define GRPC_EVP_CipherInit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_CipherInit) -#define GRPC_EVP_CipherInit_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_CipherInit_ex) -#define GRPC_EVP_CipherUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_CipherUpdate) -#define GRPC_EVP_DecodeBase64 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_DecodeBase64) -#define GRPC_EVP_DecodeBlock BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_DecodeBlock) -#define GRPC_EVP_DecodeFinal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_DecodeFinal) -#define GRPC_EVP_DecodeInit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_DecodeInit) -#define GRPC_EVP_DecodeUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_DecodeUpdate) -#define GRPC_EVP_DecodedLength BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_DecodedLength) -#define GRPC_EVP_DecryptFinal_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_DecryptFinal_ex) -#define GRPC_EVP_DecryptInit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_DecryptInit) -#define GRPC_EVP_DecryptInit_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_DecryptInit_ex) -#define GRPC_EVP_DecryptUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_DecryptUpdate) -#define GRPC_EVP_Digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_Digest) -#define GRPC_EVP_DigestFinal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_DigestFinal) -#define GRPC_EVP_DigestFinalXOF BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_DigestFinalXOF) -#define GRPC_EVP_DigestFinal_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_DigestFinal_ex) -#define GRPC_EVP_DigestInit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_DigestInit) -#define GRPC_EVP_DigestInit_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_DigestInit_ex) -#define GRPC_EVP_DigestSign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_DigestSign) -#define GRPC_EVP_DigestSignFinal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_DigestSignFinal) -#define GRPC_EVP_DigestSignInit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_DigestSignInit) -#define GRPC_EVP_DigestSignUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_DigestSignUpdate) -#define GRPC_EVP_DigestUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_DigestUpdate) -#define GRPC_EVP_DigestVerify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_DigestVerify) -#define GRPC_EVP_DigestVerifyFinal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_DigestVerifyFinal) -#define GRPC_EVP_DigestVerifyInit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_DigestVerifyInit) -#define GRPC_EVP_DigestVerifyUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_DigestVerifyUpdate) -#define GRPC_EVP_EncodeBlock BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_EncodeBlock) -#define GRPC_EVP_EncodeFinal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_EncodeFinal) -#define GRPC_EVP_EncodeInit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_EncodeInit) -#define GRPC_EVP_EncodeUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_EncodeUpdate) -#define GRPC_EVP_EncodedLength BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_EncodedLength) -#define GRPC_EVP_EncryptFinal_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_EncryptFinal_ex) -#define GRPC_EVP_EncryptInit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_EncryptInit) -#define GRPC_EVP_EncryptInit_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_EncryptInit_ex) -#define GRPC_EVP_EncryptUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_EncryptUpdate) -#define GRPC_EVP_MD_CTX_block_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_MD_CTX_block_size) -#define GRPC_EVP_MD_CTX_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_MD_CTX_cleanup) -#define GRPC_EVP_MD_CTX_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_MD_CTX_copy) -#define GRPC_EVP_MD_CTX_copy_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_MD_CTX_copy_ex) -#define GRPC_EVP_MD_CTX_create BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_MD_CTX_create) -#define GRPC_EVP_MD_CTX_destroy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_MD_CTX_destroy) -#define GRPC_EVP_MD_CTX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_MD_CTX_free) -#define GRPC_EVP_MD_CTX_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_MD_CTX_init) -#define GRPC_EVP_MD_CTX_md BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_MD_CTX_md) -#define GRPC_EVP_MD_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_MD_CTX_new) -#define GRPC_EVP_MD_CTX_reset BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_MD_CTX_reset) -#define GRPC_EVP_MD_CTX_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_MD_CTX_size) -#define GRPC_EVP_MD_CTX_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_MD_CTX_type) -#define GRPC_EVP_MD_block_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_MD_block_size) -#define GRPC_EVP_MD_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_MD_flags) -#define GRPC_EVP_MD_meth_get_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_MD_meth_get_flags) -#define GRPC_EVP_MD_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_MD_size) -#define GRPC_EVP_MD_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_MD_type) -#define GRPC_EVP_PBE_scrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PBE_scrypt) -#define GRPC_EVP_PKCS82PKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKCS82PKEY) -#define GRPC_EVP_PKEY2PKCS8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY2PKCS8) -#define GRPC_EVP_PKEY_CTX_ctrl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_CTX_ctrl) -#define GRPC_EVP_PKEY_CTX_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_CTX_dup) -#define GRPC_EVP_PKEY_CTX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_CTX_free) -#define GRPC_EVP_PKEY_CTX_get0_pkey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_CTX_get0_pkey) -#define GRPC_EVP_PKEY_CTX_get0_rsa_oaep_label BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_CTX_get0_rsa_oaep_label) -#define GRPC_EVP_PKEY_CTX_get_rsa_mgf1_md BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_CTX_get_rsa_mgf1_md) -#define GRPC_EVP_PKEY_CTX_get_rsa_oaep_md BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_CTX_get_rsa_oaep_md) -#define GRPC_EVP_PKEY_CTX_get_rsa_padding BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_CTX_get_rsa_padding) -#define GRPC_EVP_PKEY_CTX_get_rsa_pss_saltlen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_CTX_get_rsa_pss_saltlen) -#define GRPC_EVP_PKEY_CTX_get_signature_md BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_CTX_get_signature_md) -#define GRPC_EVP_PKEY_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_CTX_new) -#define GRPC_EVP_PKEY_CTX_new_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_CTX_new_id) -#define GRPC_EVP_PKEY_CTX_set0_rsa_oaep_label BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_CTX_set0_rsa_oaep_label) -#define GRPC_EVP_PKEY_CTX_set_ec_param_enc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_CTX_set_ec_param_enc) -#define GRPC_EVP_PKEY_CTX_set_ec_paramgen_curve_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_CTX_set_ec_paramgen_curve_nid) -#define GRPC_EVP_PKEY_CTX_set_rsa_keygen_bits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_CTX_set_rsa_keygen_bits) -#define GRPC_EVP_PKEY_CTX_set_rsa_keygen_pubexp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_CTX_set_rsa_keygen_pubexp) -#define GRPC_EVP_PKEY_CTX_set_rsa_mgf1_md BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_CTX_set_rsa_mgf1_md) -#define GRPC_EVP_PKEY_CTX_set_rsa_oaep_md BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_CTX_set_rsa_oaep_md) -#define GRPC_EVP_PKEY_CTX_set_rsa_padding BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_CTX_set_rsa_padding) -#define GRPC_EVP_PKEY_CTX_set_rsa_pss_keygen_md BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_CTX_set_rsa_pss_keygen_md) -#define GRPC_EVP_PKEY_CTX_set_rsa_pss_keygen_mgf1_md BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_CTX_set_rsa_pss_keygen_mgf1_md) -#define GRPC_EVP_PKEY_CTX_set_rsa_pss_keygen_saltlen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_CTX_set_rsa_pss_keygen_saltlen) -#define GRPC_EVP_PKEY_CTX_set_rsa_pss_saltlen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_CTX_set_rsa_pss_saltlen) -#define GRPC_EVP_PKEY_CTX_set_signature_md BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_CTX_set_signature_md) -#define GRPC_EVP_PKEY_assign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_assign) -#define GRPC_EVP_PKEY_assign_DSA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_assign_DSA) -#define GRPC_EVP_PKEY_assign_EC_KEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_assign_EC_KEY) -#define GRPC_EVP_PKEY_assign_RSA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_assign_RSA) -#define GRPC_EVP_PKEY_base_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_base_id) -#define GRPC_EVP_PKEY_bits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_bits) -#define GRPC_EVP_PKEY_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_cmp) -#define GRPC_EVP_PKEY_cmp_parameters BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_cmp_parameters) -#define GRPC_EVP_PKEY_copy_parameters BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_copy_parameters) -#define GRPC_EVP_PKEY_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_decrypt) -#define GRPC_EVP_PKEY_decrypt_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_decrypt_init) -#define GRPC_EVP_PKEY_derive BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_derive) -#define GRPC_EVP_PKEY_derive_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_derive_init) -#define GRPC_EVP_PKEY_derive_set_peer BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_derive_set_peer) -#define GRPC_EVP_PKEY_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_encrypt) -#define GRPC_EVP_PKEY_encrypt_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_encrypt_init) -#define GRPC_EVP_PKEY_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_free) -#define GRPC_EVP_PKEY_get0_DH BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_get0_DH) -#define GRPC_EVP_PKEY_get0_DSA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_get0_DSA) -#define GRPC_EVP_PKEY_get0_EC_KEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_get0_EC_KEY) -#define GRPC_EVP_PKEY_get0_RSA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_get0_RSA) -#define GRPC_EVP_PKEY_get1_DH BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_get1_DH) -#define GRPC_EVP_PKEY_get1_DSA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_get1_DSA) -#define GRPC_EVP_PKEY_get1_EC_KEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_get1_EC_KEY) -#define GRPC_EVP_PKEY_get1_RSA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_get1_RSA) -#define GRPC_EVP_PKEY_get1_tls_encodedpoint BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_get1_tls_encodedpoint) -#define GRPC_EVP_PKEY_get_raw_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_get_raw_private_key) -#define GRPC_EVP_PKEY_get_raw_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_get_raw_public_key) -#define GRPC_EVP_PKEY_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_id) -#define GRPC_EVP_PKEY_is_opaque BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_is_opaque) -#define GRPC_EVP_PKEY_keygen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_keygen) -#define GRPC_EVP_PKEY_keygen_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_keygen_init) -#define GRPC_EVP_PKEY_missing_parameters BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_missing_parameters) -#define GRPC_EVP_PKEY_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_new) -#define GRPC_EVP_PKEY_new_raw_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_new_raw_private_key) -#define GRPC_EVP_PKEY_new_raw_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_new_raw_public_key) -#define GRPC_EVP_PKEY_paramgen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_paramgen) -#define GRPC_EVP_PKEY_paramgen_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_paramgen_init) -#define GRPC_EVP_PKEY_print_params BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_print_params) -#define GRPC_EVP_PKEY_print_private BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_print_private) -#define GRPC_EVP_PKEY_print_public BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_print_public) -#define GRPC_EVP_PKEY_set1_DSA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_set1_DSA) -#define GRPC_EVP_PKEY_set1_EC_KEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_set1_EC_KEY) -#define GRPC_EVP_PKEY_set1_RSA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_set1_RSA) -#define GRPC_EVP_PKEY_set1_tls_encodedpoint BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_set1_tls_encodedpoint) -#define GRPC_EVP_PKEY_set_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_set_type) -#define GRPC_EVP_PKEY_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_sign) -#define GRPC_EVP_PKEY_sign_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_sign_init) -#define GRPC_EVP_PKEY_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_size) -#define GRPC_EVP_PKEY_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_type) -#define GRPC_EVP_PKEY_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_up_ref) -#define GRPC_EVP_PKEY_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_verify) -#define GRPC_EVP_PKEY_verify_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_verify_init) -#define GRPC_EVP_PKEY_verify_recover BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_verify_recover) -#define GRPC_EVP_PKEY_verify_recover_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_PKEY_verify_recover_init) -#define GRPC_EVP_SignFinal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_SignFinal) -#define GRPC_EVP_SignInit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_SignInit) -#define GRPC_EVP_SignInit_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_SignInit_ex) -#define GRPC_EVP_SignUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_SignUpdate) -#define GRPC_EVP_VerifyFinal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_VerifyFinal) -#define GRPC_EVP_VerifyInit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_VerifyInit) -#define GRPC_EVP_VerifyInit_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_VerifyInit_ex) -#define GRPC_EVP_VerifyUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_VerifyUpdate) -#define GRPC_EVP_add_cipher_alias BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_add_cipher_alias) -#define GRPC_EVP_add_digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_add_digest) -#define GRPC_EVP_aead_aes_128_cbc_sha1_tls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aead_aes_128_cbc_sha1_tls) -#define GRPC_EVP_aead_aes_128_cbc_sha1_tls_implicit_iv BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aead_aes_128_cbc_sha1_tls_implicit_iv) -#define GRPC_EVP_aead_aes_128_cbc_sha256_tls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aead_aes_128_cbc_sha256_tls) -#define GRPC_EVP_aead_aes_128_ccm_bluetooth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aead_aes_128_ccm_bluetooth) -#define GRPC_EVP_aead_aes_128_ccm_bluetooth_8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aead_aes_128_ccm_bluetooth_8) -#define GRPC_EVP_aead_aes_128_ctr_hmac_sha256 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aead_aes_128_ctr_hmac_sha256) -#define GRPC_EVP_aead_aes_128_gcm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aead_aes_128_gcm) -#define GRPC_EVP_aead_aes_128_gcm_siv BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aead_aes_128_gcm_siv) -#define GRPC_EVP_aead_aes_128_gcm_tls12 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aead_aes_128_gcm_tls12) -#define GRPC_EVP_aead_aes_128_gcm_tls13 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aead_aes_128_gcm_tls13) -#define GRPC_EVP_aead_aes_192_gcm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aead_aes_192_gcm) -#define GRPC_EVP_aead_aes_256_cbc_sha1_tls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aead_aes_256_cbc_sha1_tls) -#define GRPC_EVP_aead_aes_256_cbc_sha1_tls_implicit_iv BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aead_aes_256_cbc_sha1_tls_implicit_iv) -#define GRPC_EVP_aead_aes_256_cbc_sha256_tls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aead_aes_256_cbc_sha256_tls) -#define GRPC_EVP_aead_aes_256_cbc_sha384_tls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aead_aes_256_cbc_sha384_tls) -#define GRPC_EVP_aead_aes_256_ctr_hmac_sha256 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aead_aes_256_ctr_hmac_sha256) -#define GRPC_EVP_aead_aes_256_gcm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aead_aes_256_gcm) -#define GRPC_EVP_aead_aes_256_gcm_siv BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aead_aes_256_gcm_siv) -#define GRPC_EVP_aead_aes_256_gcm_tls12 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aead_aes_256_gcm_tls12) -#define GRPC_EVP_aead_aes_256_gcm_tls13 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aead_aes_256_gcm_tls13) -#define GRPC_EVP_aead_chacha20_poly1305 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aead_chacha20_poly1305) -#define GRPC_EVP_aead_des_ede3_cbc_sha1_tls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aead_des_ede3_cbc_sha1_tls) -#define GRPC_EVP_aead_des_ede3_cbc_sha1_tls_implicit_iv BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aead_des_ede3_cbc_sha1_tls_implicit_iv) -#define GRPC_EVP_aead_null_sha1_tls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aead_null_sha1_tls) -#define GRPC_EVP_aead_xchacha20_poly1305 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aead_xchacha20_poly1305) -#define GRPC_EVP_aes_128_cbc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aes_128_cbc) -#define GRPC_EVP_aes_128_ctr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aes_128_ctr) -#define GRPC_EVP_aes_128_ecb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aes_128_ecb) -#define GRPC_EVP_aes_128_gcm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aes_128_gcm) -#define GRPC_EVP_aes_128_ofb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aes_128_ofb) -#define GRPC_EVP_aes_192_cbc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aes_192_cbc) -#define GRPC_EVP_aes_192_ctr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aes_192_ctr) -#define GRPC_EVP_aes_192_ecb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aes_192_ecb) -#define GRPC_EVP_aes_192_gcm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aes_192_gcm) -#define GRPC_EVP_aes_192_ofb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aes_192_ofb) -#define GRPC_EVP_aes_256_cbc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aes_256_cbc) -#define GRPC_EVP_aes_256_ctr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aes_256_ctr) -#define GRPC_EVP_aes_256_ecb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aes_256_ecb) -#define GRPC_EVP_aes_256_gcm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aes_256_gcm) -#define GRPC_EVP_aes_256_ofb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_aes_256_ofb) -#define GRPC_EVP_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_cleanup) -#define GRPC_EVP_des_cbc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_des_cbc) -#define GRPC_EVP_des_ecb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_des_ecb) -#define GRPC_EVP_des_ede BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_des_ede) -#define GRPC_EVP_des_ede3 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_des_ede3) -#define GRPC_EVP_des_ede3_cbc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_des_ede3_cbc) -#define GRPC_EVP_des_ede3_ecb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_des_ede3_ecb) -#define GRPC_EVP_des_ede_cbc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_des_ede_cbc) -#define GRPC_EVP_enc_null BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_enc_null) -#define GRPC_EVP_get_cipherbyname BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_get_cipherbyname) -#define GRPC_EVP_get_cipherbynid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_get_cipherbynid) -#define GRPC_EVP_get_digestbyname BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_get_digestbyname) -#define GRPC_EVP_get_digestbynid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_get_digestbynid) -#define GRPC_EVP_get_digestbyobj BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_get_digestbyobj) -#define GRPC_EVP_has_aes_hardware BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_has_aes_hardware) -#define GRPC_EVP_marshal_digest_algorithm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_marshal_digest_algorithm) -#define GRPC_EVP_marshal_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_marshal_private_key) -#define GRPC_EVP_marshal_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_marshal_public_key) -#define GRPC_EVP_md4 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_md4) -#define GRPC_EVP_md5 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_md5) -#define GRPC_EVP_md5_sha1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_md5_sha1) -#define GRPC_EVP_parse_digest_algorithm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_parse_digest_algorithm) -#define GRPC_EVP_parse_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_parse_private_key) -#define GRPC_EVP_parse_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_parse_public_key) -#define GRPC_EVP_rc2_40_cbc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_rc2_40_cbc) -#define GRPC_EVP_rc2_cbc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_rc2_cbc) -#define GRPC_EVP_rc4 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_rc4) -#define GRPC_EVP_sha1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_sha1) -#define GRPC_EVP_sha224 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_sha224) -#define GRPC_EVP_sha256 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_sha256) -#define GRPC_EVP_sha384 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_sha384) -#define GRPC_EVP_sha512 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_sha512) -#define GRPC_EVP_tls_cbc_copy_mac BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_tls_cbc_copy_mac) -#define GRPC_EVP_tls_cbc_digest_record BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_tls_cbc_digest_record) -#define GRPC_EVP_tls_cbc_record_digest_supported BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_tls_cbc_record_digest_supported) -#define GRPC_EVP_tls_cbc_remove_padding BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EVP_tls_cbc_remove_padding) -#define GRPC_EXTENDED_KEY_USAGE_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EXTENDED_KEY_USAGE_free) -#define GRPC_EXTENDED_KEY_USAGE_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EXTENDED_KEY_USAGE_it) -#define GRPC_EXTENDED_KEY_USAGE_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_EXTENDED_KEY_USAGE_new) -#define GRPC_FIPS_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_FIPS_mode) -#define GRPC_FIPS_mode_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_FIPS_mode_set) -#define GRPC_GENERAL_NAMES_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_GENERAL_NAMES_free) -#define GRPC_GENERAL_NAMES_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_GENERAL_NAMES_it) -#define GRPC_GENERAL_NAMES_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_GENERAL_NAMES_new) -#define GRPC_GENERAL_NAME_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_GENERAL_NAME_cmp) -#define GRPC_GENERAL_NAME_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_GENERAL_NAME_dup) -#define GRPC_GENERAL_NAME_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_GENERAL_NAME_free) -#define GRPC_GENERAL_NAME_get0_otherName BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_GENERAL_NAME_get0_otherName) -#define GRPC_GENERAL_NAME_get0_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_GENERAL_NAME_get0_value) -#define GRPC_GENERAL_NAME_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_GENERAL_NAME_it) -#define GRPC_GENERAL_NAME_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_GENERAL_NAME_new) -#define GRPC_GENERAL_NAME_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_GENERAL_NAME_print) -#define GRPC_GENERAL_NAME_set0_othername BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_GENERAL_NAME_set0_othername) -#define GRPC_GENERAL_NAME_set0_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_GENERAL_NAME_set0_value) -#define GRPC_GENERAL_SUBTREE_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_GENERAL_SUBTREE_free) -#define GRPC_GENERAL_SUBTREE_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_GENERAL_SUBTREE_it) -#define GRPC_GENERAL_SUBTREE_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_GENERAL_SUBTREE_new) -#define GRPC_HKDF BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_HKDF) -#define GRPC_HKDF_expand BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_HKDF_expand) -#define GRPC_HKDF_extract BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_HKDF_extract) -#define GRPC_HMAC BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_HMAC) -#define GRPC_HMAC_CTX_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_HMAC_CTX_cleanup) -#define GRPC_HMAC_CTX_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_HMAC_CTX_copy) -#define GRPC_HMAC_CTX_copy_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_HMAC_CTX_copy_ex) -#define GRPC_HMAC_CTX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_HMAC_CTX_free) -#define GRPC_HMAC_CTX_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_HMAC_CTX_init) -#define GRPC_HMAC_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_HMAC_CTX_new) -#define GRPC_HMAC_CTX_reset BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_HMAC_CTX_reset) -#define GRPC_HMAC_Final BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_HMAC_Final) -#define GRPC_HMAC_Init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_HMAC_Init) -#define GRPC_HMAC_Init_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_HMAC_Init_ex) -#define GRPC_HMAC_Update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_HMAC_Update) -#define GRPC_HMAC_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_HMAC_size) -#define GRPC_HRSS_decap BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_HRSS_decap) -#define GRPC_HRSS_encap BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_HRSS_encap) -#define GRPC_HRSS_generate_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_HRSS_generate_key) -#define GRPC_HRSS_marshal_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_HRSS_marshal_public_key) -#define GRPC_HRSS_parse_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_HRSS_parse_public_key) -#define GRPC_HRSS_poly3_invert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_HRSS_poly3_invert) -#define GRPC_HRSS_poly3_mul BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_HRSS_poly3_mul) -#define GRPC_ISSUING_DIST_POINT_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ISSUING_DIST_POINT_free) -#define GRPC_ISSUING_DIST_POINT_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ISSUING_DIST_POINT_it) -#define GRPC_ISSUING_DIST_POINT_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ISSUING_DIST_POINT_new) -#define GRPC_MD4 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_MD4) -#define GRPC_MD4_Final BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_MD4_Final) -#define GRPC_MD4_Init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_MD4_Init) -#define GRPC_MD4_Transform BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_MD4_Transform) -#define GRPC_MD4_Update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_MD4_Update) -#define GRPC_MD5 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_MD5) -#define GRPC_MD5_Final BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_MD5_Final) -#define GRPC_MD5_Init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_MD5_Init) -#define GRPC_MD5_Transform BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_MD5_Transform) -#define GRPC_MD5_Update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_MD5_Update) -#define GRPC_METHOD_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_METHOD_ref) -#define GRPC_METHOD_unref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_METHOD_unref) -#define GRPC_NAME_CONSTRAINTS_check BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_NAME_CONSTRAINTS_check) -#define GRPC_NAME_CONSTRAINTS_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_NAME_CONSTRAINTS_free) -#define GRPC_NAME_CONSTRAINTS_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_NAME_CONSTRAINTS_it) -#define GRPC_NAME_CONSTRAINTS_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_NAME_CONSTRAINTS_new) -#define GRPC_NCONF_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_NCONF_free) -#define GRPC_NCONF_get_section BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_NCONF_get_section) -#define GRPC_NCONF_get_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_NCONF_get_string) -#define GRPC_NCONF_load BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_NCONF_load) -#define GRPC_NCONF_load_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_NCONF_load_bio) -#define GRPC_NCONF_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_NCONF_new) -#define GRPC_NETSCAPE_SPKAC_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_NETSCAPE_SPKAC_free) -#define GRPC_NETSCAPE_SPKAC_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_NETSCAPE_SPKAC_it) -#define GRPC_NETSCAPE_SPKAC_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_NETSCAPE_SPKAC_new) -#define GRPC_NETSCAPE_SPKI_b64_decode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_NETSCAPE_SPKI_b64_decode) -#define GRPC_NETSCAPE_SPKI_b64_encode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_NETSCAPE_SPKI_b64_encode) -#define GRPC_NETSCAPE_SPKI_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_NETSCAPE_SPKI_free) -#define GRPC_NETSCAPE_SPKI_get_pubkey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_NETSCAPE_SPKI_get_pubkey) -#define GRPC_NETSCAPE_SPKI_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_NETSCAPE_SPKI_it) -#define GRPC_NETSCAPE_SPKI_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_NETSCAPE_SPKI_new) -#define GRPC_NETSCAPE_SPKI_set_pubkey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_NETSCAPE_SPKI_set_pubkey) -#define GRPC_NETSCAPE_SPKI_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_NETSCAPE_SPKI_sign) -#define GRPC_NETSCAPE_SPKI_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_NETSCAPE_SPKI_verify) -#define GRPC_NOTICEREF_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_NOTICEREF_free) -#define GRPC_NOTICEREF_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_NOTICEREF_it) -#define GRPC_NOTICEREF_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_NOTICEREF_new) -#define GRPC_OBJ_cbs2nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OBJ_cbs2nid) -#define GRPC_OBJ_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OBJ_cleanup) -#define GRPC_OBJ_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OBJ_cmp) -#define GRPC_OBJ_create BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OBJ_create) -#define GRPC_OBJ_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OBJ_dup) -#define GRPC_OBJ_find_sigid_algs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OBJ_find_sigid_algs) -#define GRPC_OBJ_find_sigid_by_algs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OBJ_find_sigid_by_algs) -#define GRPC_OBJ_get0_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OBJ_get0_data) -#define GRPC_OBJ_length BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OBJ_length) -#define GRPC_OBJ_ln2nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OBJ_ln2nid) -#define GRPC_OBJ_nid2cbb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OBJ_nid2cbb) -#define GRPC_OBJ_nid2ln BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OBJ_nid2ln) -#define GRPC_OBJ_nid2obj BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OBJ_nid2obj) -#define GRPC_OBJ_nid2sn BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OBJ_nid2sn) -#define GRPC_OBJ_obj2nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OBJ_obj2nid) -#define GRPC_OBJ_obj2txt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OBJ_obj2txt) -#define GRPC_OBJ_sn2nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OBJ_sn2nid) -#define GRPC_OBJ_txt2nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OBJ_txt2nid) -#define GRPC_OBJ_txt2obj BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OBJ_txt2obj) -#define GRPC_OPENSSL_add_all_algorithms_conf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OPENSSL_add_all_algorithms_conf) -#define GRPC_OPENSSL_built_in_curves BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OPENSSL_built_in_curves) -#define GRPC_OPENSSL_cleanse BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OPENSSL_cleanse) -#define GRPC_OPENSSL_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OPENSSL_cleanup) -#define GRPC_OPENSSL_clear_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OPENSSL_clear_free) -#define GRPC_OPENSSL_config BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OPENSSL_config) -#define GRPC_OPENSSL_cpuid_setup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OPENSSL_cpuid_setup) -#define GRPC_OPENSSL_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OPENSSL_free) -#define GRPC_OPENSSL_gmtime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OPENSSL_gmtime) -#define GRPC_OPENSSL_gmtime_adj BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OPENSSL_gmtime_adj) -#define GRPC_OPENSSL_gmtime_diff BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OPENSSL_gmtime_diff) -#define GRPC_OPENSSL_hash32 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OPENSSL_hash32) -#define GRPC_OPENSSL_ia32cap_P BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OPENSSL_ia32cap_P) -#define GRPC_OPENSSL_init_crypto BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OPENSSL_init_crypto) -#define GRPC_OPENSSL_load_builtin_modules BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OPENSSL_load_builtin_modules) -#define GRPC_OPENSSL_malloc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OPENSSL_malloc) -#define GRPC_OPENSSL_malloc_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OPENSSL_malloc_init) -#define GRPC_OPENSSL_memdup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OPENSSL_memdup) -#define GRPC_OPENSSL_no_config BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OPENSSL_no_config) -#define GRPC_OPENSSL_realloc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OPENSSL_realloc) -#define GRPC_OPENSSL_strcasecmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OPENSSL_strcasecmp) -#define GRPC_OPENSSL_strdup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OPENSSL_strdup) -#define GRPC_OPENSSL_strlcat BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OPENSSL_strlcat) -#define GRPC_OPENSSL_strlcpy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OPENSSL_strlcpy) -#define GRPC_OPENSSL_strncasecmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OPENSSL_strncasecmp) -#define GRPC_OPENSSL_strndup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OPENSSL_strndup) -#define GRPC_OPENSSL_strnlen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OPENSSL_strnlen) -#define GRPC_OPENSSL_tolower BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OPENSSL_tolower) -#define GRPC_OTHERNAME_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OTHERNAME_cmp) -#define GRPC_OTHERNAME_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OTHERNAME_free) -#define GRPC_OTHERNAME_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OTHERNAME_it) -#define GRPC_OTHERNAME_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OTHERNAME_new) -#define GRPC_OpenSSL_add_all_algorithms BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OpenSSL_add_all_algorithms) -#define GRPC_OpenSSL_add_all_ciphers BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OpenSSL_add_all_ciphers) -#define GRPC_OpenSSL_add_all_digests BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OpenSSL_add_all_digests) -#define GRPC_OpenSSL_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OpenSSL_version) -#define GRPC_OpenSSL_version_num BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_OpenSSL_version_num) -#define GRPC_PEM_ASN1_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_ASN1_read) -#define GRPC_PEM_ASN1_read_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_ASN1_read_bio) -#define GRPC_PEM_ASN1_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_ASN1_write) -#define GRPC_PEM_ASN1_write_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_ASN1_write_bio) -#define GRPC_PEM_X509_INFO_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_X509_INFO_read) -#define GRPC_PEM_X509_INFO_read_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_X509_INFO_read_bio) -#define GRPC_PEM_X509_INFO_write_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_X509_INFO_write_bio) -#define GRPC_PEM_bytes_read_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_bytes_read_bio) -#define GRPC_PEM_def_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_def_callback) -#define GRPC_PEM_dek_info BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_dek_info) -#define GRPC_PEM_do_header BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_do_header) -#define GRPC_PEM_get_EVP_CIPHER_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_get_EVP_CIPHER_INFO) -#define GRPC_PEM_proc_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_proc_type) -#define GRPC_PEM_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read) -#define GRPC_PEM_read_DHparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_DHparams) -#define GRPC_PEM_read_DSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_DSAPrivateKey) -#define GRPC_PEM_read_DSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_DSA_PUBKEY) -#define GRPC_PEM_read_DSAparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_DSAparams) -#define GRPC_PEM_read_ECPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_ECPrivateKey) -#define GRPC_PEM_read_EC_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_EC_PUBKEY) -#define GRPC_PEM_read_PKCS7 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_PKCS7) -#define GRPC_PEM_read_PKCS8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_PKCS8) -#define GRPC_PEM_read_PKCS8_PRIV_KEY_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_PKCS8_PRIV_KEY_INFO) -#define GRPC_PEM_read_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_PUBKEY) -#define GRPC_PEM_read_PrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_PrivateKey) -#define GRPC_PEM_read_RSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_RSAPrivateKey) -#define GRPC_PEM_read_RSAPublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_RSAPublicKey) -#define GRPC_PEM_read_RSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_RSA_PUBKEY) -#define GRPC_PEM_read_X509 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_X509) -#define GRPC_PEM_read_X509_AUX BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_X509_AUX) -#define GRPC_PEM_read_X509_CRL BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_X509_CRL) -#define GRPC_PEM_read_X509_REQ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_X509_REQ) -#define GRPC_PEM_read_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_bio) -#define GRPC_PEM_read_bio_DHparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_bio_DHparams) -#define GRPC_PEM_read_bio_DSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_bio_DSAPrivateKey) -#define GRPC_PEM_read_bio_DSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_bio_DSA_PUBKEY) -#define GRPC_PEM_read_bio_DSAparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_bio_DSAparams) -#define GRPC_PEM_read_bio_ECPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_bio_ECPrivateKey) -#define GRPC_PEM_read_bio_EC_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_bio_EC_PUBKEY) -#define GRPC_PEM_read_bio_PKCS7 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_bio_PKCS7) -#define GRPC_PEM_read_bio_PKCS8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_bio_PKCS8) -#define GRPC_PEM_read_bio_PKCS8_PRIV_KEY_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_bio_PKCS8_PRIV_KEY_INFO) -#define GRPC_PEM_read_bio_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_bio_PUBKEY) -#define GRPC_PEM_read_bio_PrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_bio_PrivateKey) -#define GRPC_PEM_read_bio_RSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_bio_RSAPrivateKey) -#define GRPC_PEM_read_bio_RSAPublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_bio_RSAPublicKey) -#define GRPC_PEM_read_bio_RSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_bio_RSA_PUBKEY) -#define GRPC_PEM_read_bio_X509 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_bio_X509) -#define GRPC_PEM_read_bio_X509_AUX BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_bio_X509_AUX) -#define GRPC_PEM_read_bio_X509_CRL BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_bio_X509_CRL) -#define GRPC_PEM_read_bio_X509_REQ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_read_bio_X509_REQ) -#define GRPC_PEM_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write) -#define GRPC_PEM_write_DHparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_DHparams) -#define GRPC_PEM_write_DSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_DSAPrivateKey) -#define GRPC_PEM_write_DSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_DSA_PUBKEY) -#define GRPC_PEM_write_DSAparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_DSAparams) -#define GRPC_PEM_write_ECPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_ECPrivateKey) -#define GRPC_PEM_write_EC_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_EC_PUBKEY) -#define GRPC_PEM_write_PKCS7 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_PKCS7) -#define GRPC_PEM_write_PKCS8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_PKCS8) -#define GRPC_PEM_write_PKCS8PrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_PKCS8PrivateKey) -#define GRPC_PEM_write_PKCS8PrivateKey_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_PKCS8PrivateKey_nid) -#define GRPC_PEM_write_PKCS8_PRIV_KEY_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_PKCS8_PRIV_KEY_INFO) -#define GRPC_PEM_write_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_PUBKEY) -#define GRPC_PEM_write_PrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_PrivateKey) -#define GRPC_PEM_write_RSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_RSAPrivateKey) -#define GRPC_PEM_write_RSAPublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_RSAPublicKey) -#define GRPC_PEM_write_RSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_RSA_PUBKEY) -#define GRPC_PEM_write_X509 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_X509) -#define GRPC_PEM_write_X509_AUX BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_X509_AUX) -#define GRPC_PEM_write_X509_CRL BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_X509_CRL) -#define GRPC_PEM_write_X509_REQ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_X509_REQ) -#define GRPC_PEM_write_X509_REQ_NEW BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_X509_REQ_NEW) -#define GRPC_PEM_write_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_bio) -#define GRPC_PEM_write_bio_DHparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_bio_DHparams) -#define GRPC_PEM_write_bio_DSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_bio_DSAPrivateKey) -#define GRPC_PEM_write_bio_DSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_bio_DSA_PUBKEY) -#define GRPC_PEM_write_bio_DSAparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_bio_DSAparams) -#define GRPC_PEM_write_bio_ECPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_bio_ECPrivateKey) -#define GRPC_PEM_write_bio_EC_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_bio_EC_PUBKEY) -#define GRPC_PEM_write_bio_PKCS7 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_bio_PKCS7) -#define GRPC_PEM_write_bio_PKCS8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_bio_PKCS8) -#define GRPC_PEM_write_bio_PKCS8PrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_bio_PKCS8PrivateKey) -#define GRPC_PEM_write_bio_PKCS8PrivateKey_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_bio_PKCS8PrivateKey_nid) -#define GRPC_PEM_write_bio_PKCS8_PRIV_KEY_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_bio_PKCS8_PRIV_KEY_INFO) -#define GRPC_PEM_write_bio_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_bio_PUBKEY) -#define GRPC_PEM_write_bio_PrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_bio_PrivateKey) -#define GRPC_PEM_write_bio_RSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_bio_RSAPrivateKey) -#define GRPC_PEM_write_bio_RSAPublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_bio_RSAPublicKey) -#define GRPC_PEM_write_bio_RSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_bio_RSA_PUBKEY) -#define GRPC_PEM_write_bio_X509 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_bio_X509) -#define GRPC_PEM_write_bio_X509_AUX BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_bio_X509_AUX) -#define GRPC_PEM_write_bio_X509_CRL BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_bio_X509_CRL) -#define GRPC_PEM_write_bio_X509_REQ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_bio_X509_REQ) -#define GRPC_PEM_write_bio_X509_REQ_NEW BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PEM_write_bio_X509_REQ_NEW) -#define GRPC_PKCS12_PBE_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PKCS12_PBE_add) -#define GRPC_PKCS12_create BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PKCS12_create) -#define GRPC_PKCS12_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PKCS12_free) -#define GRPC_PKCS12_get_key_and_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PKCS12_get_key_and_certs) -#define GRPC_PKCS12_parse BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PKCS12_parse) -#define GRPC_PKCS12_verify_mac BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PKCS12_verify_mac) -#define GRPC_PKCS5_PBKDF2_HMAC BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PKCS5_PBKDF2_HMAC) -#define GRPC_PKCS5_PBKDF2_HMAC_SHA1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PKCS5_PBKDF2_HMAC_SHA1) -#define GRPC_PKCS5_pbe2_decrypt_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PKCS5_pbe2_decrypt_init) -#define GRPC_PKCS5_pbe2_encrypt_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PKCS5_pbe2_encrypt_init) -#define GRPC_PKCS7_bundle_CRLs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PKCS7_bundle_CRLs) -#define GRPC_PKCS7_bundle_certificates BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PKCS7_bundle_certificates) -#define GRPC_PKCS7_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PKCS7_free) -#define GRPC_PKCS7_get_CRLs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PKCS7_get_CRLs) -#define GRPC_PKCS7_get_PEM_CRLs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PKCS7_get_PEM_CRLs) -#define GRPC_PKCS7_get_PEM_certificates BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PKCS7_get_PEM_certificates) -#define GRPC_PKCS7_get_certificates BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PKCS7_get_certificates) -#define GRPC_PKCS7_get_raw_certificates BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PKCS7_get_raw_certificates) -#define GRPC_PKCS7_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PKCS7_sign) -#define GRPC_PKCS7_type_is_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PKCS7_type_is_data) -#define GRPC_PKCS7_type_is_digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PKCS7_type_is_digest) -#define GRPC_PKCS7_type_is_encrypted BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PKCS7_type_is_encrypted) -#define GRPC_PKCS7_type_is_enveloped BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PKCS7_type_is_enveloped) -#define GRPC_PKCS7_type_is_signed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PKCS7_type_is_signed) -#define GRPC_PKCS7_type_is_signedAndEnveloped BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PKCS7_type_is_signedAndEnveloped) -#define GRPC_PKCS8_PRIV_KEY_INFO_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PKCS8_PRIV_KEY_INFO_free) -#define GRPC_PKCS8_PRIV_KEY_INFO_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PKCS8_PRIV_KEY_INFO_it) -#define GRPC_PKCS8_PRIV_KEY_INFO_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PKCS8_PRIV_KEY_INFO_new) -#define GRPC_PKCS8_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PKCS8_decrypt) -#define GRPC_PKCS8_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PKCS8_encrypt) -#define GRPC_PKCS8_marshal_encrypted_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PKCS8_marshal_encrypted_private_key) -#define GRPC_PKCS8_parse_encrypted_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PKCS8_parse_encrypted_private_key) -#define GRPC_PKCS8_pkey_get0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PKCS8_pkey_get0) -#define GRPC_PKCS8_pkey_set0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PKCS8_pkey_set0) -#define GRPC_PKEY_USAGE_PERIOD_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PKEY_USAGE_PERIOD_free) -#define GRPC_PKEY_USAGE_PERIOD_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PKEY_USAGE_PERIOD_it) -#define GRPC_PKEY_USAGE_PERIOD_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PKEY_USAGE_PERIOD_new) -#define GRPC_POLICYINFO_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_POLICYINFO_free) -#define GRPC_POLICYINFO_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_POLICYINFO_it) -#define GRPC_POLICYINFO_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_POLICYINFO_new) -#define GRPC_POLICYQUALINFO_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_POLICYQUALINFO_free) -#define GRPC_POLICYQUALINFO_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_POLICYQUALINFO_it) -#define GRPC_POLICYQUALINFO_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_POLICYQUALINFO_new) -#define GRPC_POLICY_CONSTRAINTS_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_POLICY_CONSTRAINTS_free) -#define GRPC_POLICY_CONSTRAINTS_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_POLICY_CONSTRAINTS_it) -#define GRPC_POLICY_CONSTRAINTS_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_POLICY_CONSTRAINTS_new) -#define GRPC_POLICY_MAPPINGS_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_POLICY_MAPPINGS_it) -#define GRPC_POLICY_MAPPING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_POLICY_MAPPING_free) -#define GRPC_POLICY_MAPPING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_POLICY_MAPPING_it) -#define GRPC_POLICY_MAPPING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_POLICY_MAPPING_new) -#define GRPC_PROXY_CERT_INFO_EXTENSION_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PROXY_CERT_INFO_EXTENSION_free) -#define GRPC_PROXY_CERT_INFO_EXTENSION_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PROXY_CERT_INFO_EXTENSION_it) -#define GRPC_PROXY_CERT_INFO_EXTENSION_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PROXY_CERT_INFO_EXTENSION_new) -#define GRPC_PROXY_POLICY_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PROXY_POLICY_free) -#define GRPC_PROXY_POLICY_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PROXY_POLICY_it) -#define GRPC_PROXY_POLICY_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_PROXY_POLICY_new) -#define GRPC_RAND_SSLeay BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RAND_SSLeay) -#define GRPC_RAND_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RAND_add) -#define GRPC_RAND_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RAND_bytes) -#define GRPC_RAND_bytes_with_additional_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RAND_bytes_with_additional_data) -#define GRPC_RAND_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RAND_cleanup) -#define GRPC_RAND_egd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RAND_egd) -#define GRPC_RAND_enable_fork_unsafe_buffering BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RAND_enable_fork_unsafe_buffering) -#define GRPC_RAND_file_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RAND_file_name) -#define GRPC_RAND_get_rand_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RAND_get_rand_method) -#define GRPC_RAND_load_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RAND_load_file) -#define GRPC_RAND_poll BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RAND_poll) -#define GRPC_RAND_pseudo_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RAND_pseudo_bytes) -#define GRPC_RAND_seed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RAND_seed) -#define GRPC_RAND_set_rand_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RAND_set_rand_method) -#define GRPC_RAND_set_urandom_fd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RAND_set_urandom_fd) -#define GRPC_RAND_status BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RAND_status) -#define GRPC_RC4 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RC4) -#define GRPC_RC4_set_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RC4_set_key) -#define GRPC_RSAPrivateKey_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSAPrivateKey_dup) -#define GRPC_RSAPublicKey_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSAPublicKey_dup) -#define GRPC_RSAZ_1024_mod_exp_avx2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSAZ_1024_mod_exp_avx2) -#define GRPC_RSA_PSS_PARAMS_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_PSS_PARAMS_free) -#define GRPC_RSA_PSS_PARAMS_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_PSS_PARAMS_it) -#define GRPC_RSA_PSS_PARAMS_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_PSS_PARAMS_new) -#define GRPC_RSA_add_pkcs1_prefix BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_add_pkcs1_prefix) -#define GRPC_RSA_bits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_bits) -#define GRPC_RSA_blinding_on BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_blinding_on) -#define GRPC_RSA_check_fips BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_check_fips) -#define GRPC_RSA_check_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_check_key) -#define GRPC_RSA_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_decrypt) -#define GRPC_RSA_default_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_default_method) -#define GRPC_RSA_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_encrypt) -#define GRPC_RSA_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_flags) -#define GRPC_RSA_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_free) -#define GRPC_RSA_generate_key_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_generate_key_ex) -#define GRPC_RSA_generate_key_fips BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_generate_key_fips) -#define GRPC_RSA_get0_crt_params BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_get0_crt_params) -#define GRPC_RSA_get0_factors BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_get0_factors) -#define GRPC_RSA_get0_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_get0_key) -#define GRPC_RSA_get_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_get_ex_data) -#define GRPC_RSA_get_ex_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_get_ex_new_index) -#define GRPC_RSA_is_opaque BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_is_opaque) -#define GRPC_RSA_marshal_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_marshal_private_key) -#define GRPC_RSA_marshal_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_marshal_public_key) -#define GRPC_RSA_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_new) -#define GRPC_RSA_new_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_new_method) -#define GRPC_RSA_padding_add_PKCS1_OAEP_mgf1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_padding_add_PKCS1_OAEP_mgf1) -#define GRPC_RSA_padding_add_PKCS1_PSS_mgf1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_padding_add_PKCS1_PSS_mgf1) -#define GRPC_RSA_padding_add_PKCS1_type_1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_padding_add_PKCS1_type_1) -#define GRPC_RSA_padding_add_PKCS1_type_2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_padding_add_PKCS1_type_2) -#define GRPC_RSA_padding_add_none BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_padding_add_none) -#define GRPC_RSA_padding_check_PKCS1_OAEP_mgf1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_padding_check_PKCS1_OAEP_mgf1) -#define GRPC_RSA_padding_check_PKCS1_type_1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_padding_check_PKCS1_type_1) -#define GRPC_RSA_padding_check_PKCS1_type_2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_padding_check_PKCS1_type_2) -#define GRPC_RSA_parse_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_parse_private_key) -#define GRPC_RSA_parse_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_parse_public_key) -#define GRPC_RSA_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_print) -#define GRPC_RSA_private_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_private_decrypt) -#define GRPC_RSA_private_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_private_encrypt) -#define GRPC_RSA_private_key_from_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_private_key_from_bytes) -#define GRPC_RSA_private_key_to_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_private_key_to_bytes) -#define GRPC_RSA_private_transform BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_private_transform) -#define GRPC_RSA_public_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_public_decrypt) -#define GRPC_RSA_public_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_public_encrypt) -#define GRPC_RSA_public_key_from_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_public_key_from_bytes) -#define GRPC_RSA_public_key_to_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_public_key_to_bytes) -#define GRPC_RSA_set0_crt_params BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_set0_crt_params) -#define GRPC_RSA_set0_factors BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_set0_factors) -#define GRPC_RSA_set0_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_set0_key) -#define GRPC_RSA_set_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_set_ex_data) -#define GRPC_RSA_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_sign) -#define GRPC_RSA_sign_pss_mgf1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_sign_pss_mgf1) -#define GRPC_RSA_sign_raw BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_sign_raw) -#define GRPC_RSA_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_size) -#define GRPC_RSA_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_up_ref) -#define GRPC_RSA_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_verify) -#define GRPC_RSA_verify_PKCS1_PSS_mgf1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_verify_PKCS1_PSS_mgf1) -#define GRPC_RSA_verify_pss_mgf1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_verify_pss_mgf1) -#define GRPC_RSA_verify_raw BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_RSA_verify_raw) -#define GRPC_SHA1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SHA1) -#define GRPC_SHA1_Final BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SHA1_Final) -#define GRPC_SHA1_Init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SHA1_Init) -#define GRPC_SHA1_Transform BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SHA1_Transform) -#define GRPC_SHA1_Update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SHA1_Update) -#define GRPC_SHA224 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SHA224) -#define GRPC_SHA224_Final BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SHA224_Final) -#define GRPC_SHA224_Init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SHA224_Init) -#define GRPC_SHA224_Update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SHA224_Update) -#define GRPC_SHA256 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SHA256) -#define GRPC_SHA256_Final BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SHA256_Final) -#define GRPC_SHA256_Init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SHA256_Init) -#define GRPC_SHA256_Transform BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SHA256_Transform) -#define GRPC_SHA256_TransformBlocks BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SHA256_TransformBlocks) -#define GRPC_SHA256_Update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SHA256_Update) -#define GRPC_SHA384 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SHA384) -#define GRPC_SHA384_Final BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SHA384_Final) -#define GRPC_SHA384_Init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SHA384_Init) -#define GRPC_SHA384_Update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SHA384_Update) -#define GRPC_SHA512 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SHA512) -#define GRPC_SHA512_Final BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SHA512_Final) -#define GRPC_SHA512_Init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SHA512_Init) -#define GRPC_SHA512_Transform BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SHA512_Transform) -#define GRPC_SHA512_Update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SHA512_Update) -#define GRPC_SIPHASH_24 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SIPHASH_24) -#define GRPC_SPAKE2_CTX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SPAKE2_CTX_free) -#define GRPC_SPAKE2_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SPAKE2_CTX_new) -#define GRPC_SPAKE2_generate_msg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SPAKE2_generate_msg) -#define GRPC_SPAKE2_process_msg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SPAKE2_process_msg) -#define GRPC_SSLeay BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSLeay) -#define GRPC_SSLeay_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SSLeay_version) -#define GRPC_SXNETID_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SXNETID_free) -#define GRPC_SXNETID_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SXNETID_it) -#define GRPC_SXNETID_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SXNETID_new) -#define GRPC_SXNET_add_id_INTEGER BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SXNET_add_id_INTEGER) -#define GRPC_SXNET_add_id_asc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SXNET_add_id_asc) -#define GRPC_SXNET_add_id_ulong BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SXNET_add_id_ulong) -#define GRPC_SXNET_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SXNET_free) -#define GRPC_SXNET_get_id_INTEGER BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SXNET_get_id_INTEGER) -#define GRPC_SXNET_get_id_asc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SXNET_get_id_asc) -#define GRPC_SXNET_get_id_ulong BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SXNET_get_id_ulong) -#define GRPC_SXNET_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SXNET_it) -#define GRPC_SXNET_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_SXNET_new) -#define GRPC_USERNOTICE_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_USERNOTICE_free) -#define GRPC_USERNOTICE_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_USERNOTICE_it) -#define GRPC_USERNOTICE_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_USERNOTICE_new) -#define GRPC_UTF8_getc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_UTF8_getc) -#define GRPC_UTF8_putc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_UTF8_putc) -#define GRPC_X25519 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X25519) -#define GRPC_X25519_keypair BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X25519_keypair) -#define GRPC_X25519_public_from_private BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X25519_public_from_private) -#define GRPC_X509V3_EXT_CRL_add_nconf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509V3_EXT_CRL_add_nconf) -#define GRPC_X509V3_EXT_REQ_add_nconf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509V3_EXT_REQ_add_nconf) -#define GRPC_X509V3_EXT_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509V3_EXT_add) -#define GRPC_X509V3_EXT_add_alias BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509V3_EXT_add_alias) -#define GRPC_X509V3_EXT_add_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509V3_EXT_add_list) -#define GRPC_X509V3_EXT_add_nconf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509V3_EXT_add_nconf) -#define GRPC_X509V3_EXT_add_nconf_sk BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509V3_EXT_add_nconf_sk) -#define GRPC_X509V3_EXT_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509V3_EXT_cleanup) -#define GRPC_X509V3_EXT_d2i BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509V3_EXT_d2i) -#define GRPC_X509V3_EXT_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509V3_EXT_free) -#define GRPC_X509V3_EXT_get BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509V3_EXT_get) -#define GRPC_X509V3_EXT_get_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509V3_EXT_get_nid) -#define GRPC_X509V3_EXT_i2d BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509V3_EXT_i2d) -#define GRPC_X509V3_EXT_nconf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509V3_EXT_nconf) -#define GRPC_X509V3_EXT_nconf_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509V3_EXT_nconf_nid) -#define GRPC_X509V3_EXT_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509V3_EXT_print) -#define GRPC_X509V3_EXT_print_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509V3_EXT_print_fp) -#define GRPC_X509V3_EXT_val_prn BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509V3_EXT_val_prn) -#define GRPC_X509V3_NAME_from_section BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509V3_NAME_from_section) -#define GRPC_X509V3_add1_i2d BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509V3_add1_i2d) -#define GRPC_X509V3_add_standard_extensions BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509V3_add_standard_extensions) -#define GRPC_X509V3_add_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509V3_add_value) -#define GRPC_X509V3_add_value_bool BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509V3_add_value_bool) -#define GRPC_X509V3_add_value_bool_nf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509V3_add_value_bool_nf) -#define GRPC_X509V3_add_value_int BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509V3_add_value_int) -#define GRPC_X509V3_add_value_uchar BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509V3_add_value_uchar) -#define GRPC_X509V3_conf_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509V3_conf_free) -#define GRPC_X509V3_extensions_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509V3_extensions_print) -#define GRPC_X509V3_get_d2i BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509V3_get_d2i) -#define GRPC_X509V3_get_section BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509V3_get_section) -#define GRPC_X509V3_get_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509V3_get_string) -#define GRPC_X509V3_get_value_bool BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509V3_get_value_bool) -#define GRPC_X509V3_get_value_int BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509V3_get_value_int) -#define GRPC_X509V3_parse_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509V3_parse_list) -#define GRPC_X509V3_section_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509V3_section_free) -#define GRPC_X509V3_set_ctx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509V3_set_ctx) -#define GRPC_X509V3_set_nconf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509V3_set_nconf) -#define GRPC_X509V3_string_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509V3_string_free) -#define GRPC_X509_ALGORS_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_ALGORS_it) -#define GRPC_X509_ALGOR_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_ALGOR_cmp) -#define GRPC_X509_ALGOR_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_ALGOR_dup) -#define GRPC_X509_ALGOR_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_ALGOR_free) -#define GRPC_X509_ALGOR_get0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_ALGOR_get0) -#define GRPC_X509_ALGOR_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_ALGOR_it) -#define GRPC_X509_ALGOR_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_ALGOR_new) -#define GRPC_X509_ALGOR_set0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_ALGOR_set0) -#define GRPC_X509_ALGOR_set_md BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_ALGOR_set_md) -#define GRPC_X509_ATTRIBUTE_SET_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_ATTRIBUTE_SET_it) -#define GRPC_X509_ATTRIBUTE_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_ATTRIBUTE_count) -#define GRPC_X509_ATTRIBUTE_create BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_ATTRIBUTE_create) -#define GRPC_X509_ATTRIBUTE_create_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_ATTRIBUTE_create_by_NID) -#define GRPC_X509_ATTRIBUTE_create_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_ATTRIBUTE_create_by_OBJ) -#define GRPC_X509_ATTRIBUTE_create_by_txt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_ATTRIBUTE_create_by_txt) -#define GRPC_X509_ATTRIBUTE_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_ATTRIBUTE_dup) -#define GRPC_X509_ATTRIBUTE_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_ATTRIBUTE_free) -#define GRPC_X509_ATTRIBUTE_get0_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_ATTRIBUTE_get0_data) -#define GRPC_X509_ATTRIBUTE_get0_object BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_ATTRIBUTE_get0_object) -#define GRPC_X509_ATTRIBUTE_get0_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_ATTRIBUTE_get0_type) -#define GRPC_X509_ATTRIBUTE_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_ATTRIBUTE_it) -#define GRPC_X509_ATTRIBUTE_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_ATTRIBUTE_new) -#define GRPC_X509_ATTRIBUTE_set1_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_ATTRIBUTE_set1_data) -#define GRPC_X509_ATTRIBUTE_set1_object BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_ATTRIBUTE_set1_object) -#define GRPC_X509_CERT_AUX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CERT_AUX_free) -#define GRPC_X509_CERT_AUX_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CERT_AUX_it) -#define GRPC_X509_CERT_AUX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CERT_AUX_new) -#define GRPC_X509_CERT_AUX_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CERT_AUX_print) -#define GRPC_X509_CINF_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CINF_free) -#define GRPC_X509_CINF_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CINF_it) -#define GRPC_X509_CINF_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CINF_new) -#define GRPC_X509_CRL_INFO_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_INFO_free) -#define GRPC_X509_CRL_INFO_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_INFO_it) -#define GRPC_X509_CRL_INFO_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_INFO_new) -#define GRPC_X509_CRL_METHOD_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_METHOD_free) -#define GRPC_X509_CRL_METHOD_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_METHOD_new) -#define GRPC_X509_CRL_add0_revoked BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_add0_revoked) -#define GRPC_X509_CRL_add1_ext_i2d BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_add1_ext_i2d) -#define GRPC_X509_CRL_add_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_add_ext) -#define GRPC_X509_CRL_check_suiteb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_check_suiteb) -#define GRPC_X509_CRL_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_cmp) -#define GRPC_X509_CRL_delete_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_delete_ext) -#define GRPC_X509_CRL_diff BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_diff) -#define GRPC_X509_CRL_digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_digest) -#define GRPC_X509_CRL_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_dup) -#define GRPC_X509_CRL_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_free) -#define GRPC_X509_CRL_get0_by_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_get0_by_cert) -#define GRPC_X509_CRL_get0_by_serial BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_get0_by_serial) -#define GRPC_X509_CRL_get0_lastUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_get0_lastUpdate) -#define GRPC_X509_CRL_get0_nextUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_get0_nextUpdate) -#define GRPC_X509_CRL_get0_signature BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_get0_signature) -#define GRPC_X509_CRL_get_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_get_ext) -#define GRPC_X509_CRL_get_ext_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_get_ext_by_NID) -#define GRPC_X509_CRL_get_ext_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_get_ext_by_OBJ) -#define GRPC_X509_CRL_get_ext_by_critical BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_get_ext_by_critical) -#define GRPC_X509_CRL_get_ext_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_get_ext_count) -#define GRPC_X509_CRL_get_ext_d2i BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_get_ext_d2i) -#define GRPC_X509_CRL_get_meth_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_get_meth_data) -#define GRPC_X509_CRL_get_signature_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_get_signature_nid) -#define GRPC_X509_CRL_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_it) -#define GRPC_X509_CRL_match BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_match) -#define GRPC_X509_CRL_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_new) -#define GRPC_X509_CRL_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_print) -#define GRPC_X509_CRL_print_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_print_fp) -#define GRPC_X509_CRL_set_default_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_set_default_method) -#define GRPC_X509_CRL_set_issuer_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_set_issuer_name) -#define GRPC_X509_CRL_set_lastUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_set_lastUpdate) -#define GRPC_X509_CRL_set_meth_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_set_meth_data) -#define GRPC_X509_CRL_set_nextUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_set_nextUpdate) -#define GRPC_X509_CRL_set_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_set_version) -#define GRPC_X509_CRL_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_sign) -#define GRPC_X509_CRL_sign_ctx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_sign_ctx) -#define GRPC_X509_CRL_sort BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_sort) -#define GRPC_X509_CRL_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_up_ref) -#define GRPC_X509_CRL_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_CRL_verify) -#define GRPC_X509_EXTENSIONS_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_EXTENSIONS_it) -#define GRPC_X509_EXTENSION_create_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_EXTENSION_create_by_NID) -#define GRPC_X509_EXTENSION_create_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_EXTENSION_create_by_OBJ) -#define GRPC_X509_EXTENSION_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_EXTENSION_dup) -#define GRPC_X509_EXTENSION_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_EXTENSION_free) -#define GRPC_X509_EXTENSION_get_critical BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_EXTENSION_get_critical) -#define GRPC_X509_EXTENSION_get_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_EXTENSION_get_data) -#define GRPC_X509_EXTENSION_get_object BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_EXTENSION_get_object) -#define GRPC_X509_EXTENSION_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_EXTENSION_it) -#define GRPC_X509_EXTENSION_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_EXTENSION_new) -#define GRPC_X509_EXTENSION_set_critical BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_EXTENSION_set_critical) -#define GRPC_X509_EXTENSION_set_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_EXTENSION_set_data) -#define GRPC_X509_EXTENSION_set_object BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_EXTENSION_set_object) -#define GRPC_X509_INFO_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_INFO_free) -#define GRPC_X509_INFO_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_INFO_new) -#define GRPC_X509_LOOKUP_by_alias BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_LOOKUP_by_alias) -#define GRPC_X509_LOOKUP_by_fingerprint BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_LOOKUP_by_fingerprint) -#define GRPC_X509_LOOKUP_by_issuer_serial BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_LOOKUP_by_issuer_serial) -#define GRPC_X509_LOOKUP_by_subject BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_LOOKUP_by_subject) -#define GRPC_X509_LOOKUP_ctrl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_LOOKUP_ctrl) -#define GRPC_X509_LOOKUP_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_LOOKUP_file) -#define GRPC_X509_LOOKUP_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_LOOKUP_free) -#define GRPC_X509_LOOKUP_hash_dir BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_LOOKUP_hash_dir) -#define GRPC_X509_LOOKUP_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_LOOKUP_init) -#define GRPC_X509_LOOKUP_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_LOOKUP_new) -#define GRPC_X509_LOOKUP_shutdown BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_LOOKUP_shutdown) -#define GRPC_X509_NAME_ENTRIES_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_ENTRIES_it) -#define GRPC_X509_NAME_ENTRY_create_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_ENTRY_create_by_NID) -#define GRPC_X509_NAME_ENTRY_create_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_ENTRY_create_by_OBJ) -#define GRPC_X509_NAME_ENTRY_create_by_txt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_ENTRY_create_by_txt) -#define GRPC_X509_NAME_ENTRY_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_ENTRY_dup) -#define GRPC_X509_NAME_ENTRY_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_ENTRY_free) -#define GRPC_X509_NAME_ENTRY_get_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_ENTRY_get_data) -#define GRPC_X509_NAME_ENTRY_get_object BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_ENTRY_get_object) -#define GRPC_X509_NAME_ENTRY_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_ENTRY_it) -#define GRPC_X509_NAME_ENTRY_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_ENTRY_new) -#define GRPC_X509_NAME_ENTRY_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_ENTRY_set) -#define GRPC_X509_NAME_ENTRY_set_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_ENTRY_set_data) -#define GRPC_X509_NAME_ENTRY_set_object BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_ENTRY_set_object) -#define GRPC_X509_NAME_INTERNAL_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_INTERNAL_it) -#define GRPC_X509_NAME_add_entry BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_add_entry) -#define GRPC_X509_NAME_add_entry_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_add_entry_by_NID) -#define GRPC_X509_NAME_add_entry_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_add_entry_by_OBJ) -#define GRPC_X509_NAME_add_entry_by_txt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_add_entry_by_txt) -#define GRPC_X509_NAME_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_cmp) -#define GRPC_X509_NAME_delete_entry BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_delete_entry) -#define GRPC_X509_NAME_digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_digest) -#define GRPC_X509_NAME_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_dup) -#define GRPC_X509_NAME_entry_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_entry_count) -#define GRPC_X509_NAME_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_free) -#define GRPC_X509_NAME_get0_der BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_get0_der) -#define GRPC_X509_NAME_get_entry BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_get_entry) -#define GRPC_X509_NAME_get_index_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_get_index_by_NID) -#define GRPC_X509_NAME_get_index_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_get_index_by_OBJ) -#define GRPC_X509_NAME_get_text_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_get_text_by_NID) -#define GRPC_X509_NAME_get_text_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_get_text_by_OBJ) -#define GRPC_X509_NAME_hash BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_hash) -#define GRPC_X509_NAME_hash_old BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_hash_old) -#define GRPC_X509_NAME_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_it) -#define GRPC_X509_NAME_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_new) -#define GRPC_X509_NAME_oneline BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_oneline) -#define GRPC_X509_NAME_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_print) -#define GRPC_X509_NAME_print_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_print_ex) -#define GRPC_X509_NAME_print_ex_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_print_ex_fp) -#define GRPC_X509_NAME_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_NAME_set) -#define GRPC_X509_OBJECT_free_contents BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_OBJECT_free_contents) -#define GRPC_X509_OBJECT_get0_X509 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_OBJECT_get0_X509) -#define GRPC_X509_OBJECT_get_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_OBJECT_get_type) -#define GRPC_X509_OBJECT_idx_by_subject BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_OBJECT_idx_by_subject) -#define GRPC_X509_OBJECT_retrieve_by_subject BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_OBJECT_retrieve_by_subject) -#define GRPC_X509_OBJECT_retrieve_match BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_OBJECT_retrieve_match) -#define GRPC_X509_OBJECT_up_ref_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_OBJECT_up_ref_count) -#define GRPC_X509_PKEY_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_PKEY_free) -#define GRPC_X509_PKEY_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_PKEY_new) -#define GRPC_X509_POLICY_NODE_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_POLICY_NODE_print) -#define GRPC_X509_PUBKEY_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_PUBKEY_free) -#define GRPC_X509_PUBKEY_get BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_PUBKEY_get) -#define GRPC_X509_PUBKEY_get0_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_PUBKEY_get0_param) -#define GRPC_X509_PUBKEY_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_PUBKEY_it) -#define GRPC_X509_PUBKEY_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_PUBKEY_new) -#define GRPC_X509_PUBKEY_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_PUBKEY_set) -#define GRPC_X509_PUBKEY_set0_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_PUBKEY_set0_param) -#define GRPC_X509_PURPOSE_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_PURPOSE_add) -#define GRPC_X509_PURPOSE_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_PURPOSE_cleanup) -#define GRPC_X509_PURPOSE_get0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_PURPOSE_get0) -#define GRPC_X509_PURPOSE_get0_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_PURPOSE_get0_name) -#define GRPC_X509_PURPOSE_get0_sname BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_PURPOSE_get0_sname) -#define GRPC_X509_PURPOSE_get_by_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_PURPOSE_get_by_id) -#define GRPC_X509_PURPOSE_get_by_sname BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_PURPOSE_get_by_sname) -#define GRPC_X509_PURPOSE_get_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_PURPOSE_get_count) -#define GRPC_X509_PURPOSE_get_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_PURPOSE_get_id) -#define GRPC_X509_PURPOSE_get_trust BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_PURPOSE_get_trust) -#define GRPC_X509_PURPOSE_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_PURPOSE_set) -#define GRPC_X509_REQ_INFO_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REQ_INFO_free) -#define GRPC_X509_REQ_INFO_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REQ_INFO_it) -#define GRPC_X509_REQ_INFO_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REQ_INFO_new) -#define GRPC_X509_REQ_add1_attr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REQ_add1_attr) -#define GRPC_X509_REQ_add1_attr_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REQ_add1_attr_by_NID) -#define GRPC_X509_REQ_add1_attr_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REQ_add1_attr_by_OBJ) -#define GRPC_X509_REQ_add1_attr_by_txt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REQ_add1_attr_by_txt) -#define GRPC_X509_REQ_add_extensions BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REQ_add_extensions) -#define GRPC_X509_REQ_add_extensions_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REQ_add_extensions_nid) -#define GRPC_X509_REQ_check_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REQ_check_private_key) -#define GRPC_X509_REQ_delete_attr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REQ_delete_attr) -#define GRPC_X509_REQ_digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REQ_digest) -#define GRPC_X509_REQ_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REQ_dup) -#define GRPC_X509_REQ_extension_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REQ_extension_nid) -#define GRPC_X509_REQ_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REQ_free) -#define GRPC_X509_REQ_get0_signature BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REQ_get0_signature) -#define GRPC_X509_REQ_get1_email BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REQ_get1_email) -#define GRPC_X509_REQ_get_attr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REQ_get_attr) -#define GRPC_X509_REQ_get_attr_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REQ_get_attr_by_NID) -#define GRPC_X509_REQ_get_attr_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REQ_get_attr_by_OBJ) -#define GRPC_X509_REQ_get_attr_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REQ_get_attr_count) -#define GRPC_X509_REQ_get_extension_nids BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REQ_get_extension_nids) -#define GRPC_X509_REQ_get_extensions BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REQ_get_extensions) -#define GRPC_X509_REQ_get_pubkey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REQ_get_pubkey) -#define GRPC_X509_REQ_get_signature_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REQ_get_signature_nid) -#define GRPC_X509_REQ_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REQ_it) -#define GRPC_X509_REQ_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REQ_new) -#define GRPC_X509_REQ_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REQ_print) -#define GRPC_X509_REQ_print_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REQ_print_ex) -#define GRPC_X509_REQ_print_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REQ_print_fp) -#define GRPC_X509_REQ_set_extension_nids BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REQ_set_extension_nids) -#define GRPC_X509_REQ_set_pubkey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REQ_set_pubkey) -#define GRPC_X509_REQ_set_subject_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REQ_set_subject_name) -#define GRPC_X509_REQ_set_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REQ_set_version) -#define GRPC_X509_REQ_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REQ_sign) -#define GRPC_X509_REQ_sign_ctx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REQ_sign_ctx) -#define GRPC_X509_REQ_to_X509 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REQ_to_X509) -#define GRPC_X509_REQ_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REQ_verify) -#define GRPC_X509_REVOKED_add1_ext_i2d BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REVOKED_add1_ext_i2d) -#define GRPC_X509_REVOKED_add_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REVOKED_add_ext) -#define GRPC_X509_REVOKED_delete_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REVOKED_delete_ext) -#define GRPC_X509_REVOKED_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REVOKED_dup) -#define GRPC_X509_REVOKED_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REVOKED_free) -#define GRPC_X509_REVOKED_get0_revocationDate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REVOKED_get0_revocationDate) -#define GRPC_X509_REVOKED_get0_serialNumber BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REVOKED_get0_serialNumber) -#define GRPC_X509_REVOKED_get_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REVOKED_get_ext) -#define GRPC_X509_REVOKED_get_ext_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REVOKED_get_ext_by_NID) -#define GRPC_X509_REVOKED_get_ext_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REVOKED_get_ext_by_OBJ) -#define GRPC_X509_REVOKED_get_ext_by_critical BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REVOKED_get_ext_by_critical) -#define GRPC_X509_REVOKED_get_ext_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REVOKED_get_ext_count) -#define GRPC_X509_REVOKED_get_ext_d2i BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REVOKED_get_ext_d2i) -#define GRPC_X509_REVOKED_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REVOKED_it) -#define GRPC_X509_REVOKED_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REVOKED_new) -#define GRPC_X509_REVOKED_set_revocationDate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REVOKED_set_revocationDate) -#define GRPC_X509_REVOKED_set_serialNumber BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_REVOKED_set_serialNumber) -#define GRPC_X509_SIG_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_SIG_free) -#define GRPC_X509_SIG_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_SIG_it) -#define GRPC_X509_SIG_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_SIG_new) -#define GRPC_X509_STORE_CTX_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_CTX_cleanup) -#define GRPC_X509_STORE_CTX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_CTX_free) -#define GRPC_X509_STORE_CTX_get0_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_CTX_get0_cert) -#define GRPC_X509_STORE_CTX_get0_current_crl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_CTX_get0_current_crl) -#define GRPC_X509_STORE_CTX_get0_current_issuer BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_CTX_get0_current_issuer) -#define GRPC_X509_STORE_CTX_get0_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_CTX_get0_param) -#define GRPC_X509_STORE_CTX_get0_parent_ctx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_CTX_get0_parent_ctx) -#define GRPC_X509_STORE_CTX_get0_policy_tree BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_CTX_get0_policy_tree) -#define GRPC_X509_STORE_CTX_get0_store BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_CTX_get0_store) -#define GRPC_X509_STORE_CTX_get0_untrusted BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_CTX_get0_untrusted) -#define GRPC_X509_STORE_CTX_get1_chain BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_CTX_get1_chain) -#define GRPC_X509_STORE_CTX_get1_issuer BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_CTX_get1_issuer) -#define GRPC_X509_STORE_CTX_get_chain BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_CTX_get_chain) -#define GRPC_X509_STORE_CTX_get_current_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_CTX_get_current_cert) -#define GRPC_X509_STORE_CTX_get_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_CTX_get_error) -#define GRPC_X509_STORE_CTX_get_error_depth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_CTX_get_error_depth) -#define GRPC_X509_STORE_CTX_get_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_CTX_get_ex_data) -#define GRPC_X509_STORE_CTX_get_ex_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_CTX_get_ex_new_index) -#define GRPC_X509_STORE_CTX_get_explicit_policy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_CTX_get_explicit_policy) -#define GRPC_X509_STORE_CTX_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_CTX_init) -#define GRPC_X509_STORE_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_CTX_new) -#define GRPC_X509_STORE_CTX_purpose_inherit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_CTX_purpose_inherit) -#define GRPC_X509_STORE_CTX_set0_crls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_CTX_set0_crls) -#define GRPC_X509_STORE_CTX_set0_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_CTX_set0_param) -#define GRPC_X509_STORE_CTX_set_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_CTX_set_cert) -#define GRPC_X509_STORE_CTX_set_chain BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_CTX_set_chain) -#define GRPC_X509_STORE_CTX_set_default BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_CTX_set_default) -#define GRPC_X509_STORE_CTX_set_depth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_CTX_set_depth) -#define GRPC_X509_STORE_CTX_set_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_CTX_set_error) -#define GRPC_X509_STORE_CTX_set_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_CTX_set_ex_data) -#define GRPC_X509_STORE_CTX_set_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_CTX_set_flags) -#define GRPC_X509_STORE_CTX_set_purpose BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_CTX_set_purpose) -#define GRPC_X509_STORE_CTX_set_time BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_CTX_set_time) -#define GRPC_X509_STORE_CTX_set_trust BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_CTX_set_trust) -#define GRPC_X509_STORE_CTX_set_verify_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_CTX_set_verify_cb) -#define GRPC_X509_STORE_CTX_trusted_stack BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_CTX_trusted_stack) -#define GRPC_X509_STORE_CTX_zero BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_CTX_zero) -#define GRPC_X509_STORE_add_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_add_cert) -#define GRPC_X509_STORE_add_crl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_add_crl) -#define GRPC_X509_STORE_add_lookup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_add_lookup) -#define GRPC_X509_STORE_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_free) -#define GRPC_X509_STORE_get0_objects BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_get0_objects) -#define GRPC_X509_STORE_get0_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_get0_param) -#define GRPC_X509_STORE_get1_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_get1_certs) -#define GRPC_X509_STORE_get1_crls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_get1_crls) -#define GRPC_X509_STORE_get_by_subject BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_get_by_subject) -#define GRPC_X509_STORE_get_cert_crl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_get_cert_crl) -#define GRPC_X509_STORE_get_check_crl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_get_check_crl) -#define GRPC_X509_STORE_get_check_issued BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_get_check_issued) -#define GRPC_X509_STORE_get_check_revocation BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_get_check_revocation) -#define GRPC_X509_STORE_get_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_get_cleanup) -#define GRPC_X509_STORE_get_get_crl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_get_get_crl) -#define GRPC_X509_STORE_get_get_issuer BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_get_get_issuer) -#define GRPC_X509_STORE_get_lookup_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_get_lookup_certs) -#define GRPC_X509_STORE_get_lookup_crls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_get_lookup_crls) -#define GRPC_X509_STORE_get_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_get_verify) -#define GRPC_X509_STORE_get_verify_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_get_verify_cb) -#define GRPC_X509_STORE_load_locations BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_load_locations) -#define GRPC_X509_STORE_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_new) -#define GRPC_X509_STORE_set0_additional_untrusted BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_set0_additional_untrusted) -#define GRPC_X509_STORE_set1_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_set1_param) -#define GRPC_X509_STORE_set_cert_crl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_set_cert_crl) -#define GRPC_X509_STORE_set_check_crl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_set_check_crl) -#define GRPC_X509_STORE_set_check_issued BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_set_check_issued) -#define GRPC_X509_STORE_set_check_revocation BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_set_check_revocation) -#define GRPC_X509_STORE_set_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_set_cleanup) -#define GRPC_X509_STORE_set_default_paths BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_set_default_paths) -#define GRPC_X509_STORE_set_depth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_set_depth) -#define GRPC_X509_STORE_set_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_set_flags) -#define GRPC_X509_STORE_set_get_crl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_set_get_crl) -#define GRPC_X509_STORE_set_get_issuer BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_set_get_issuer) -#define GRPC_X509_STORE_set_lookup_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_set_lookup_certs) -#define GRPC_X509_STORE_set_lookup_crls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_set_lookup_crls) -#define GRPC_X509_STORE_set_purpose BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_set_purpose) -#define GRPC_X509_STORE_set_trust BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_set_trust) -#define GRPC_X509_STORE_set_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_set_verify) -#define GRPC_X509_STORE_set_verify_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_set_verify_cb) -#define GRPC_X509_STORE_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_STORE_up_ref) -#define GRPC_X509_TRUST_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_TRUST_add) -#define GRPC_X509_TRUST_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_TRUST_cleanup) -#define GRPC_X509_TRUST_get0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_TRUST_get0) -#define GRPC_X509_TRUST_get0_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_TRUST_get0_name) -#define GRPC_X509_TRUST_get_by_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_TRUST_get_by_id) -#define GRPC_X509_TRUST_get_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_TRUST_get_count) -#define GRPC_X509_TRUST_get_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_TRUST_get_flags) -#define GRPC_X509_TRUST_get_trust BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_TRUST_get_trust) -#define GRPC_X509_TRUST_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_TRUST_set) -#define GRPC_X509_TRUST_set_default BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_TRUST_set_default) -#define GRPC_X509_VAL_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_VAL_free) -#define GRPC_X509_VAL_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_VAL_it) -#define GRPC_X509_VAL_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_VAL_new) -#define GRPC_X509_VERIFY_PARAM_add0_policy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_VERIFY_PARAM_add0_policy) -#define GRPC_X509_VERIFY_PARAM_add0_table BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_VERIFY_PARAM_add0_table) -#define GRPC_X509_VERIFY_PARAM_add1_host BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_VERIFY_PARAM_add1_host) -#define GRPC_X509_VERIFY_PARAM_clear_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_VERIFY_PARAM_clear_flags) -#define GRPC_X509_VERIFY_PARAM_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_VERIFY_PARAM_free) -#define GRPC_X509_VERIFY_PARAM_get0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_VERIFY_PARAM_get0) -#define GRPC_X509_VERIFY_PARAM_get0_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_VERIFY_PARAM_get0_name) -#define GRPC_X509_VERIFY_PARAM_get0_peername BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_VERIFY_PARAM_get0_peername) -#define GRPC_X509_VERIFY_PARAM_get_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_VERIFY_PARAM_get_count) -#define GRPC_X509_VERIFY_PARAM_get_depth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_VERIFY_PARAM_get_depth) -#define GRPC_X509_VERIFY_PARAM_get_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_VERIFY_PARAM_get_flags) -#define GRPC_X509_VERIFY_PARAM_inherit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_VERIFY_PARAM_inherit) -#define GRPC_X509_VERIFY_PARAM_lookup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_VERIFY_PARAM_lookup) -#define GRPC_X509_VERIFY_PARAM_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_VERIFY_PARAM_new) -#define GRPC_X509_VERIFY_PARAM_set1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_VERIFY_PARAM_set1) -#define GRPC_X509_VERIFY_PARAM_set1_email BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_VERIFY_PARAM_set1_email) -#define GRPC_X509_VERIFY_PARAM_set1_host BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_VERIFY_PARAM_set1_host) -#define GRPC_X509_VERIFY_PARAM_set1_ip BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_VERIFY_PARAM_set1_ip) -#define GRPC_X509_VERIFY_PARAM_set1_ip_asc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_VERIFY_PARAM_set1_ip_asc) -#define GRPC_X509_VERIFY_PARAM_set1_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_VERIFY_PARAM_set1_name) -#define GRPC_X509_VERIFY_PARAM_set1_policies BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_VERIFY_PARAM_set1_policies) -#define GRPC_X509_VERIFY_PARAM_set_depth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_VERIFY_PARAM_set_depth) -#define GRPC_X509_VERIFY_PARAM_set_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_VERIFY_PARAM_set_flags) -#define GRPC_X509_VERIFY_PARAM_set_hostflags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_VERIFY_PARAM_set_hostflags) -#define GRPC_X509_VERIFY_PARAM_set_purpose BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_VERIFY_PARAM_set_purpose) -#define GRPC_X509_VERIFY_PARAM_set_time BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_VERIFY_PARAM_set_time) -#define GRPC_X509_VERIFY_PARAM_set_trust BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_VERIFY_PARAM_set_trust) -#define GRPC_X509_VERIFY_PARAM_table_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_VERIFY_PARAM_table_cleanup) -#define GRPC_X509_add1_ext_i2d BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_add1_ext_i2d) -#define GRPC_X509_add1_reject_object BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_add1_reject_object) -#define GRPC_X509_add1_trust_object BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_add1_trust_object) -#define GRPC_X509_add_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_add_ext) -#define GRPC_X509_alias_get0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_alias_get0) -#define GRPC_X509_alias_set1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_alias_set1) -#define GRPC_X509_chain_check_suiteb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_chain_check_suiteb) -#define GRPC_X509_chain_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_chain_up_ref) -#define GRPC_X509_check_akid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_check_akid) -#define GRPC_X509_check_ca BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_check_ca) -#define GRPC_X509_check_email BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_check_email) -#define GRPC_X509_check_host BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_check_host) -#define GRPC_X509_check_ip BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_check_ip) -#define GRPC_X509_check_ip_asc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_check_ip_asc) -#define GRPC_X509_check_issued BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_check_issued) -#define GRPC_X509_check_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_check_private_key) -#define GRPC_X509_check_purpose BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_check_purpose) -#define GRPC_X509_check_trust BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_check_trust) -#define GRPC_X509_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_cmp) -#define GRPC_X509_cmp_current_time BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_cmp_current_time) -#define GRPC_X509_cmp_time BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_cmp_time) -#define GRPC_X509_delete_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_delete_ext) -#define GRPC_X509_digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_digest) -#define GRPC_X509_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_dup) -#define GRPC_X509_email_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_email_free) -#define GRPC_X509_find_by_issuer_and_serial BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_find_by_issuer_and_serial) -#define GRPC_X509_find_by_subject BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_find_by_subject) -#define GRPC_X509_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_free) -#define GRPC_X509_get0_extensions BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_get0_extensions) -#define GRPC_X509_get0_notAfter BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_get0_notAfter) -#define GRPC_X509_get0_notBefore BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_get0_notBefore) -#define GRPC_X509_get0_pubkey_bitstr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_get0_pubkey_bitstr) -#define GRPC_X509_get0_signature BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_get0_signature) -#define GRPC_X509_get0_tbs_sigalg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_get0_tbs_sigalg) -#define GRPC_X509_get1_email BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_get1_email) -#define GRPC_X509_get1_ocsp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_get1_ocsp) -#define GRPC_X509_get_default_cert_area BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_get_default_cert_area) -#define GRPC_X509_get_default_cert_dir BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_get_default_cert_dir) -#define GRPC_X509_get_default_cert_dir_env BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_get_default_cert_dir_env) -#define GRPC_X509_get_default_cert_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_get_default_cert_file) -#define GRPC_X509_get_default_cert_file_env BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_get_default_cert_file_env) -#define GRPC_X509_get_default_private_dir BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_get_default_private_dir) -#define GRPC_X509_get_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_get_ex_data) -#define GRPC_X509_get_ex_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_get_ex_new_index) -#define GRPC_X509_get_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_get_ext) -#define GRPC_X509_get_ext_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_get_ext_by_NID) -#define GRPC_X509_get_ext_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_get_ext_by_OBJ) -#define GRPC_X509_get_ext_by_critical BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_get_ext_by_critical) -#define GRPC_X509_get_ext_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_get_ext_count) -#define GRPC_X509_get_ext_d2i BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_get_ext_d2i) -#define GRPC_X509_get_extended_key_usage BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_get_extended_key_usage) -#define GRPC_X509_get_extension_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_get_extension_flags) -#define GRPC_X509_get_issuer_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_get_issuer_name) -#define GRPC_X509_get_key_usage BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_get_key_usage) -#define GRPC_X509_get_pubkey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_get_pubkey) -#define GRPC_X509_get_serialNumber BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_get_serialNumber) -#define GRPC_X509_get_signature_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_get_signature_nid) -#define GRPC_X509_get_subject_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_get_subject_name) -#define GRPC_X509_gmtime_adj BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_gmtime_adj) -#define GRPC_X509_issuer_and_serial_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_issuer_and_serial_cmp) -#define GRPC_X509_issuer_and_serial_hash BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_issuer_and_serial_hash) -#define GRPC_X509_issuer_name_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_issuer_name_cmp) -#define GRPC_X509_issuer_name_hash BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_issuer_name_hash) -#define GRPC_X509_issuer_name_hash_old BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_issuer_name_hash_old) -#define GRPC_X509_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_it) -#define GRPC_X509_keyid_get0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_keyid_get0) -#define GRPC_X509_keyid_set1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_keyid_set1) -#define GRPC_X509_load_cert_crl_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_load_cert_crl_file) -#define GRPC_X509_load_cert_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_load_cert_file) -#define GRPC_X509_load_crl_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_load_crl_file) -#define GRPC_X509_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_new) -#define GRPC_X509_ocspid_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_ocspid_print) -#define GRPC_X509_parse_from_buffer BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_parse_from_buffer) -#define GRPC_X509_policy_check BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_policy_check) -#define GRPC_X509_policy_level_get0_node BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_policy_level_get0_node) -#define GRPC_X509_policy_level_node_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_policy_level_node_count) -#define GRPC_X509_policy_node_get0_parent BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_policy_node_get0_parent) -#define GRPC_X509_policy_node_get0_policy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_policy_node_get0_policy) -#define GRPC_X509_policy_node_get0_qualifiers BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_policy_node_get0_qualifiers) -#define GRPC_X509_policy_tree_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_policy_tree_free) -#define GRPC_X509_policy_tree_get0_level BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_policy_tree_get0_level) -#define GRPC_X509_policy_tree_get0_policies BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_policy_tree_get0_policies) -#define GRPC_X509_policy_tree_get0_user_policies BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_policy_tree_get0_user_policies) -#define GRPC_X509_policy_tree_level_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_policy_tree_level_count) -#define GRPC_X509_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_print) -#define GRPC_X509_print_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_print_ex) -#define GRPC_X509_print_ex_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_print_ex_fp) -#define GRPC_X509_print_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_print_fp) -#define GRPC_X509_pubkey_digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_pubkey_digest) -#define GRPC_X509_reject_clear BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_reject_clear) -#define GRPC_X509_set_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_set_ex_data) -#define GRPC_X509_set_issuer_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_set_issuer_name) -#define GRPC_X509_set_notAfter BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_set_notAfter) -#define GRPC_X509_set_notBefore BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_set_notBefore) -#define GRPC_X509_set_pubkey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_set_pubkey) -#define GRPC_X509_set_serialNumber BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_set_serialNumber) -#define GRPC_X509_set_subject_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_set_subject_name) -#define GRPC_X509_set_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_set_version) -#define GRPC_X509_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_sign) -#define GRPC_X509_sign_ctx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_sign_ctx) -#define GRPC_X509_signature_dump BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_signature_dump) -#define GRPC_X509_signature_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_signature_print) -#define GRPC_X509_subject_name_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_subject_name_cmp) -#define GRPC_X509_subject_name_hash BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_subject_name_hash) -#define GRPC_X509_subject_name_hash_old BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_subject_name_hash_old) -#define GRPC_X509_supported_extension BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_supported_extension) -#define GRPC_X509_time_adj BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_time_adj) -#define GRPC_X509_time_adj_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_time_adj_ex) -#define GRPC_X509_to_X509_REQ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_to_X509_REQ) -#define GRPC_X509_trust_clear BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_trust_clear) -#define GRPC_X509_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_up_ref) -#define GRPC_X509_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_verify) -#define GRPC_X509_verify_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_verify_cert) -#define GRPC_X509_verify_cert_error_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509_verify_cert_error_string) -#define GRPC_X509at_add1_attr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509at_add1_attr) -#define GRPC_X509at_add1_attr_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509at_add1_attr_by_NID) -#define GRPC_X509at_add1_attr_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509at_add1_attr_by_OBJ) -#define GRPC_X509at_add1_attr_by_txt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509at_add1_attr_by_txt) -#define GRPC_X509at_delete_attr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509at_delete_attr) -#define GRPC_X509at_get0_data_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509at_get0_data_by_OBJ) -#define GRPC_X509at_get_attr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509at_get_attr) -#define GRPC_X509at_get_attr_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509at_get_attr_by_NID) -#define GRPC_X509at_get_attr_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509at_get_attr_by_OBJ) -#define GRPC_X509at_get_attr_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509at_get_attr_count) -#define GRPC_X509v3_add_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509v3_add_ext) -#define GRPC_X509v3_delete_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509v3_delete_ext) -#define GRPC_X509v3_get_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509v3_get_ext) -#define GRPC_X509v3_get_ext_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509v3_get_ext_by_NID) -#define GRPC_X509v3_get_ext_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509v3_get_ext_by_OBJ) -#define GRPC_X509v3_get_ext_by_critical BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509v3_get_ext_by_critical) -#define GRPC_X509v3_get_ext_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_X509v3_get_ext_count) -#define GRPC_a2i_GENERAL_NAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_a2i_GENERAL_NAME) -#define GRPC_a2i_IPADDRESS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_a2i_IPADDRESS) -#define GRPC_a2i_IPADDRESS_NC BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_a2i_IPADDRESS_NC) -#define GRPC_a2i_ipadd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_a2i_ipadd) -#define GRPC_abi_test_bad_unwind_temporary BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_bad_unwind_temporary) -#define GRPC_abi_test_bad_unwind_wrong_register BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_bad_unwind_wrong_register) -#define GRPC_abi_test_clobber_r10 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_clobber_r10) -#define GRPC_abi_test_clobber_r11 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_clobber_r11) -#define GRPC_abi_test_clobber_r12 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_clobber_r12) -#define GRPC_abi_test_clobber_r13 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_clobber_r13) -#define GRPC_abi_test_clobber_r14 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_clobber_r14) -#define GRPC_abi_test_clobber_r15 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_clobber_r15) -#define GRPC_abi_test_clobber_r8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_clobber_r8) -#define GRPC_abi_test_clobber_r9 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_clobber_r9) -#define GRPC_abi_test_clobber_rax BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_clobber_rax) -#define GRPC_abi_test_clobber_rbp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_clobber_rbp) -#define GRPC_abi_test_clobber_rbx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_clobber_rbx) -#define GRPC_abi_test_clobber_rcx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_clobber_rcx) -#define GRPC_abi_test_clobber_rdi BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_clobber_rdi) -#define GRPC_abi_test_clobber_rdx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_clobber_rdx) -#define GRPC_abi_test_clobber_rsi BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_clobber_rsi) -#define GRPC_abi_test_clobber_xmm0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_clobber_xmm0) -#define GRPC_abi_test_clobber_xmm1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_clobber_xmm1) -#define GRPC_abi_test_clobber_xmm10 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_clobber_xmm10) -#define GRPC_abi_test_clobber_xmm11 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_clobber_xmm11) -#define GRPC_abi_test_clobber_xmm12 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_clobber_xmm12) -#define GRPC_abi_test_clobber_xmm13 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_clobber_xmm13) -#define GRPC_abi_test_clobber_xmm14 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_clobber_xmm14) -#define GRPC_abi_test_clobber_xmm15 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_clobber_xmm15) -#define GRPC_abi_test_clobber_xmm2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_clobber_xmm2) -#define GRPC_abi_test_clobber_xmm3 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_clobber_xmm3) -#define GRPC_abi_test_clobber_xmm4 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_clobber_xmm4) -#define GRPC_abi_test_clobber_xmm5 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_clobber_xmm5) -#define GRPC_abi_test_clobber_xmm6 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_clobber_xmm6) -#define GRPC_abi_test_clobber_xmm7 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_clobber_xmm7) -#define GRPC_abi_test_clobber_xmm8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_clobber_xmm8) -#define GRPC_abi_test_clobber_xmm9 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_clobber_xmm9) -#define GRPC_abi_test_get_and_clear_direction_flag BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_get_and_clear_direction_flag) -#define GRPC_abi_test_set_direction_flag BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_set_direction_flag) -#define GRPC_abi_test_trampoline BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_trampoline) -#define GRPC_abi_test_unwind_return BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_unwind_return) -#define GRPC_abi_test_unwind_start BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_unwind_start) -#define GRPC_abi_test_unwind_stop BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_abi_test_unwind_stop) -#define GRPC_aes128gcmsiv_aes_ks BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_aes128gcmsiv_aes_ks) -#define GRPC_aes128gcmsiv_aes_ks_enc_x1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_aes128gcmsiv_aes_ks_enc_x1) -#define GRPC_aes128gcmsiv_dec BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_aes128gcmsiv_dec) -#define GRPC_aes128gcmsiv_ecb_enc_block BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_aes128gcmsiv_ecb_enc_block) -#define GRPC_aes128gcmsiv_enc_msg_x4 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_aes128gcmsiv_enc_msg_x4) -#define GRPC_aes128gcmsiv_enc_msg_x8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_aes128gcmsiv_enc_msg_x8) -#define GRPC_aes128gcmsiv_kdf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_aes128gcmsiv_kdf) -#define GRPC_aes256gcmsiv_aes_ks BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_aes256gcmsiv_aes_ks) -#define GRPC_aes256gcmsiv_aes_ks_enc_x1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_aes256gcmsiv_aes_ks_enc_x1) -#define GRPC_aes256gcmsiv_dec BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_aes256gcmsiv_dec) -#define GRPC_aes256gcmsiv_ecb_enc_block BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_aes256gcmsiv_ecb_enc_block) -#define GRPC_aes256gcmsiv_enc_msg_x4 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_aes256gcmsiv_enc_msg_x4) -#define GRPC_aes256gcmsiv_enc_msg_x8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_aes256gcmsiv_enc_msg_x8) -#define GRPC_aes256gcmsiv_kdf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_aes256gcmsiv_kdf) -#define GRPC_aes_ctr_set_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_aes_ctr_set_key) -#define GRPC_aes_hw_cbc_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_aes_hw_cbc_encrypt) -#define GRPC_aes_hw_ctr32_encrypt_blocks BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_aes_hw_ctr32_encrypt_blocks) -#define GRPC_aes_hw_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_aes_hw_decrypt) -#define GRPC_aes_hw_ecb_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_aes_hw_ecb_encrypt) -#define GRPC_aes_hw_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_aes_hw_encrypt) -#define GRPC_aes_hw_set_decrypt_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_aes_hw_set_decrypt_key) -#define GRPC_aes_hw_set_encrypt_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_aes_hw_set_encrypt_key) -#define GRPC_aes_nohw_cbc_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_aes_nohw_cbc_encrypt) -#define GRPC_aes_nohw_ctr32_encrypt_blocks BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_aes_nohw_ctr32_encrypt_blocks) -#define GRPC_aes_nohw_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_aes_nohw_decrypt) -#define GRPC_aes_nohw_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_aes_nohw_encrypt) -#define GRPC_aes_nohw_set_decrypt_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_aes_nohw_set_decrypt_key) -#define GRPC_aes_nohw_set_encrypt_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_aes_nohw_set_encrypt_key) -#define GRPC_aesgcmsiv_htable6_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_aesgcmsiv_htable6_init) -#define GRPC_aesgcmsiv_htable_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_aesgcmsiv_htable_init) -#define GRPC_aesgcmsiv_htable_polyval BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_aesgcmsiv_htable_polyval) -#define GRPC_aesgcmsiv_polyval_horner BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_aesgcmsiv_polyval_horner) -#define GRPC_aesni_gcm_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_aesni_gcm_decrypt) -#define GRPC_aesni_gcm_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_aesni_gcm_encrypt) -#define GRPC_asn1_do_adb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_asn1_do_adb) -#define GRPC_asn1_enc_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_asn1_enc_free) -#define GRPC_asn1_enc_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_asn1_enc_init) -#define GRPC_asn1_enc_restore BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_asn1_enc_restore) -#define GRPC_asn1_enc_save BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_asn1_enc_save) -#define GRPC_asn1_ex_c2i BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_asn1_ex_c2i) -#define GRPC_asn1_ex_i2c BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_asn1_ex_i2c) -#define GRPC_asn1_generalizedtime_to_tm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_asn1_generalizedtime_to_tm) -#define GRPC_asn1_get_choice_selector BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_asn1_get_choice_selector) -#define GRPC_asn1_get_field_ptr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_asn1_get_field_ptr) -#define GRPC_asn1_item_combine_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_asn1_item_combine_free) -#define GRPC_asn1_refcount_dec_and_test_zero BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_asn1_refcount_dec_and_test_zero) -#define GRPC_asn1_refcount_set_one BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_asn1_refcount_set_one) -#define GRPC_asn1_set_choice_selector BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_asn1_set_choice_selector) -#define GRPC_asn1_utctime_to_tm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_asn1_utctime_to_tm) -#define GRPC_beeu_mod_inverse_vartime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_beeu_mod_inverse_vartime) -#define GRPC_bio_clear_socket_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bio_clear_socket_error) -#define GRPC_bio_fd_should_retry BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bio_fd_should_retry) -#define GRPC_bio_ip_and_port_to_socket_and_addr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bio_ip_and_port_to_socket_and_addr) -#define GRPC_bio_sock_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bio_sock_error) -#define GRPC_bio_socket_nbio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bio_socket_nbio) -#define GRPC_bn_abs_sub_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_abs_sub_consttime) -#define GRPC_bn_add_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_add_words) -#define GRPC_bn_copy_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_copy_words) -#define GRPC_bn_div_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_div_consttime) -#define GRPC_bn_expand BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_expand) -#define GRPC_bn_fits_in_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_fits_in_words) -#define GRPC_bn_from_montgomery BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_from_montgomery) -#define GRPC_bn_from_montgomery_small BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_from_montgomery_small) -#define GRPC_bn_gather5 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_gather5) -#define GRPC_bn_in_range_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_in_range_words) -#define GRPC_bn_is_bit_set_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_is_bit_set_words) -#define GRPC_bn_is_relatively_prime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_is_relatively_prime) -#define GRPC_bn_jacobi BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_jacobi) -#define GRPC_bn_lcm_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_lcm_consttime) -#define GRPC_bn_less_than_montgomery_R BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_less_than_montgomery_R) -#define GRPC_bn_less_than_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_less_than_words) -#define GRPC_bn_miller_rabin_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_miller_rabin_init) -#define GRPC_bn_miller_rabin_iteration BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_miller_rabin_iteration) -#define GRPC_bn_minimal_width BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_minimal_width) -#define GRPC_bn_mod_add_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_mod_add_consttime) -#define GRPC_bn_mod_add_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_mod_add_words) -#define GRPC_bn_mod_exp_base_2_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_mod_exp_base_2_consttime) -#define GRPC_bn_mod_exp_mont_small BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_mod_exp_mont_small) -#define GRPC_bn_mod_inverse_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_mod_inverse_consttime) -#define GRPC_bn_mod_inverse_prime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_mod_inverse_prime) -#define GRPC_bn_mod_inverse_prime_mont_small BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_mod_inverse_prime_mont_small) -#define GRPC_bn_mod_inverse_secret_prime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_mod_inverse_secret_prime) -#define GRPC_bn_mod_lshift1_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_mod_lshift1_consttime) -#define GRPC_bn_mod_lshift_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_mod_lshift_consttime) -#define GRPC_bn_mod_mul_montgomery_small BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_mod_mul_montgomery_small) -#define GRPC_bn_mod_sub_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_mod_sub_consttime) -#define GRPC_bn_mod_sub_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_mod_sub_words) -#define GRPC_bn_mod_u16_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_mod_u16_consttime) -#define GRPC_bn_mont_n0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_mont_n0) -#define GRPC_bn_mul_add_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_mul_add_words) -#define GRPC_bn_mul_comba4 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_mul_comba4) -#define GRPC_bn_mul_comba8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_mul_comba8) -#define GRPC_bn_mul_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_mul_consttime) -#define GRPC_bn_mul_mont BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_mul_mont) -#define GRPC_bn_mul_mont_gather5 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_mul_mont_gather5) -#define GRPC_bn_mul_small BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_mul_small) -#define GRPC_bn_mul_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_mul_words) -#define GRPC_bn_odd_number_is_obviously_composite BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_odd_number_is_obviously_composite) -#define GRPC_bn_one_to_montgomery BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_one_to_montgomery) -#define GRPC_bn_power5 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_power5) -#define GRPC_bn_rand_range_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_rand_range_words) -#define GRPC_bn_rand_secret_range BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_rand_secret_range) -#define GRPC_bn_reduce_once BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_reduce_once) -#define GRPC_bn_reduce_once_in_place BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_reduce_once_in_place) -#define GRPC_bn_resize_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_resize_words) -#define GRPC_bn_rshift1_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_rshift1_words) -#define GRPC_bn_rshift_secret_shift BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_rshift_secret_shift) -#define GRPC_bn_rshift_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_rshift_words) -#define GRPC_bn_scatter5 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_scatter5) -#define GRPC_bn_select_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_select_words) -#define GRPC_bn_set_minimal_width BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_set_minimal_width) -#define GRPC_bn_set_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_set_words) -#define GRPC_bn_sqr8x_internal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_sqr8x_internal) -#define GRPC_bn_sqr_comba4 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_sqr_comba4) -#define GRPC_bn_sqr_comba8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_sqr_comba8) -#define GRPC_bn_sqr_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_sqr_consttime) -#define GRPC_bn_sqr_small BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_sqr_small) -#define GRPC_bn_sqr_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_sqr_words) -#define GRPC_bn_sqrx8x_internal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_sqrx8x_internal) -#define GRPC_bn_sub_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_sub_words) -#define GRPC_bn_to_montgomery_small BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_to_montgomery_small) -#define GRPC_bn_uadd_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_uadd_consttime) -#define GRPC_bn_usub_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_usub_consttime) -#define GRPC_bn_wexpand BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_bn_wexpand) -#define GRPC_boringssl_fips_self_test BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_boringssl_fips_self_test) -#define GRPC_c2i_ASN1_BIT_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_c2i_ASN1_BIT_STRING) -#define GRPC_c2i_ASN1_INTEGER BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_c2i_ASN1_INTEGER) -#define GRPC_c2i_ASN1_OBJECT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_c2i_ASN1_OBJECT) -#define GRPC_cbb_add_latin1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_cbb_add_latin1) -#define GRPC_cbb_add_ucs2_be BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_cbb_add_ucs2_be) -#define GRPC_cbb_add_utf32_be BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_cbb_add_utf32_be) -#define GRPC_cbb_add_utf8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_cbb_add_utf8) -#define GRPC_cbb_get_utf8_len BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_cbb_get_utf8_len) -#define GRPC_cbs_get_latin1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_cbs_get_latin1) -#define GRPC_cbs_get_ucs2_be BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_cbs_get_ucs2_be) -#define GRPC_cbs_get_utf32_be BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_cbs_get_utf32_be) -#define GRPC_cbs_get_utf8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_cbs_get_utf8) -#define GRPC_chacha20_poly1305_open BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_chacha20_poly1305_open) -#define GRPC_chacha20_poly1305_seal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_chacha20_poly1305_seal) -#define GRPC_crypto_gcm_clmul_enabled BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_crypto_gcm_clmul_enabled) -#define GRPC_d2i_ACCESS_DESCRIPTION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_ACCESS_DESCRIPTION) -#define GRPC_d2i_ASN1_BIT_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_ASN1_BIT_STRING) -#define GRPC_d2i_ASN1_BMPSTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_ASN1_BMPSTRING) -#define GRPC_d2i_ASN1_BOOLEAN BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_ASN1_BOOLEAN) -#define GRPC_d2i_ASN1_ENUMERATED BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_ASN1_ENUMERATED) -#define GRPC_d2i_ASN1_GENERALIZEDTIME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_ASN1_GENERALIZEDTIME) -#define GRPC_d2i_ASN1_GENERALSTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_ASN1_GENERALSTRING) -#define GRPC_d2i_ASN1_IA5STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_ASN1_IA5STRING) -#define GRPC_d2i_ASN1_INTEGER BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_ASN1_INTEGER) -#define GRPC_d2i_ASN1_NULL BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_ASN1_NULL) -#define GRPC_d2i_ASN1_OBJECT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_ASN1_OBJECT) -#define GRPC_d2i_ASN1_OCTET_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_ASN1_OCTET_STRING) -#define GRPC_d2i_ASN1_PRINTABLE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_ASN1_PRINTABLE) -#define GRPC_d2i_ASN1_PRINTABLESTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_ASN1_PRINTABLESTRING) -#define GRPC_d2i_ASN1_SEQUENCE_ANY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_ASN1_SEQUENCE_ANY) -#define GRPC_d2i_ASN1_SET_ANY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_ASN1_SET_ANY) -#define GRPC_d2i_ASN1_T61STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_ASN1_T61STRING) -#define GRPC_d2i_ASN1_TIME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_ASN1_TIME) -#define GRPC_d2i_ASN1_TYPE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_ASN1_TYPE) -#define GRPC_d2i_ASN1_UNIVERSALSTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_ASN1_UNIVERSALSTRING) -#define GRPC_d2i_ASN1_UTCTIME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_ASN1_UTCTIME) -#define GRPC_d2i_ASN1_UTF8STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_ASN1_UTF8STRING) -#define GRPC_d2i_ASN1_VISIBLESTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_ASN1_VISIBLESTRING) -#define GRPC_d2i_AUTHORITY_INFO_ACCESS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_AUTHORITY_INFO_ACCESS) -#define GRPC_d2i_AUTHORITY_KEYID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_AUTHORITY_KEYID) -#define GRPC_d2i_AutoPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_AutoPrivateKey) -#define GRPC_d2i_BASIC_CONSTRAINTS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_BASIC_CONSTRAINTS) -#define GRPC_d2i_CERTIFICATEPOLICIES BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_CERTIFICATEPOLICIES) -#define GRPC_d2i_CRL_DIST_POINTS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_CRL_DIST_POINTS) -#define GRPC_d2i_DHparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_DHparams) -#define GRPC_d2i_DHparams_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_DHparams_bio) -#define GRPC_d2i_DIRECTORYSTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_DIRECTORYSTRING) -#define GRPC_d2i_DISPLAYTEXT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_DISPLAYTEXT) -#define GRPC_d2i_DIST_POINT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_DIST_POINT) -#define GRPC_d2i_DIST_POINT_NAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_DIST_POINT_NAME) -#define GRPC_d2i_DSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_DSAPrivateKey) -#define GRPC_d2i_DSAPrivateKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_DSAPrivateKey_bio) -#define GRPC_d2i_DSAPrivateKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_DSAPrivateKey_fp) -#define GRPC_d2i_DSAPublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_DSAPublicKey) -#define GRPC_d2i_DSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_DSA_PUBKEY) -#define GRPC_d2i_DSA_PUBKEY_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_DSA_PUBKEY_bio) -#define GRPC_d2i_DSA_PUBKEY_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_DSA_PUBKEY_fp) -#define GRPC_d2i_DSA_SIG BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_DSA_SIG) -#define GRPC_d2i_DSAparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_DSAparams) -#define GRPC_d2i_ECDSA_SIG BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_ECDSA_SIG) -#define GRPC_d2i_ECParameters BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_ECParameters) -#define GRPC_d2i_ECPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_ECPrivateKey) -#define GRPC_d2i_ECPrivateKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_ECPrivateKey_bio) -#define GRPC_d2i_ECPrivateKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_ECPrivateKey_fp) -#define GRPC_d2i_EC_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_EC_PUBKEY) -#define GRPC_d2i_EC_PUBKEY_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_EC_PUBKEY_bio) -#define GRPC_d2i_EC_PUBKEY_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_EC_PUBKEY_fp) -#define GRPC_d2i_EDIPARTYNAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_EDIPARTYNAME) -#define GRPC_d2i_EXTENDED_KEY_USAGE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_EXTENDED_KEY_USAGE) -#define GRPC_d2i_GENERAL_NAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_GENERAL_NAME) -#define GRPC_d2i_GENERAL_NAMES BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_GENERAL_NAMES) -#define GRPC_d2i_ISSUING_DIST_POINT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_ISSUING_DIST_POINT) -#define GRPC_d2i_NETSCAPE_SPKAC BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_NETSCAPE_SPKAC) -#define GRPC_d2i_NETSCAPE_SPKI BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_NETSCAPE_SPKI) -#define GRPC_d2i_NOTICEREF BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_NOTICEREF) -#define GRPC_d2i_OTHERNAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_OTHERNAME) -#define GRPC_d2i_PKCS12 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_PKCS12) -#define GRPC_d2i_PKCS12_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_PKCS12_bio) -#define GRPC_d2i_PKCS12_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_PKCS12_fp) -#define GRPC_d2i_PKCS7 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_PKCS7) -#define GRPC_d2i_PKCS7_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_PKCS7_bio) -#define GRPC_d2i_PKCS8PrivateKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_PKCS8PrivateKey_bio) -#define GRPC_d2i_PKCS8PrivateKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_PKCS8PrivateKey_fp) -#define GRPC_d2i_PKCS8_PRIV_KEY_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_PKCS8_PRIV_KEY_INFO) -#define GRPC_d2i_PKCS8_PRIV_KEY_INFO_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_PKCS8_PRIV_KEY_INFO_bio) -#define GRPC_d2i_PKCS8_PRIV_KEY_INFO_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_PKCS8_PRIV_KEY_INFO_fp) -#define GRPC_d2i_PKCS8_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_PKCS8_bio) -#define GRPC_d2i_PKCS8_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_PKCS8_fp) -#define GRPC_d2i_PKEY_USAGE_PERIOD BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_PKEY_USAGE_PERIOD) -#define GRPC_d2i_POLICYINFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_POLICYINFO) -#define GRPC_d2i_POLICYQUALINFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_POLICYQUALINFO) -#define GRPC_d2i_PROXY_CERT_INFO_EXTENSION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_PROXY_CERT_INFO_EXTENSION) -#define GRPC_d2i_PROXY_POLICY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_PROXY_POLICY) -#define GRPC_d2i_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_PUBKEY) -#define GRPC_d2i_PUBKEY_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_PUBKEY_bio) -#define GRPC_d2i_PUBKEY_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_PUBKEY_fp) -#define GRPC_d2i_PrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_PrivateKey) -#define GRPC_d2i_PrivateKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_PrivateKey_bio) -#define GRPC_d2i_PrivateKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_PrivateKey_fp) -#define GRPC_d2i_PublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_PublicKey) -#define GRPC_d2i_RSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_RSAPrivateKey) -#define GRPC_d2i_RSAPrivateKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_RSAPrivateKey_bio) -#define GRPC_d2i_RSAPrivateKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_RSAPrivateKey_fp) -#define GRPC_d2i_RSAPublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_RSAPublicKey) -#define GRPC_d2i_RSAPublicKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_RSAPublicKey_bio) -#define GRPC_d2i_RSAPublicKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_RSAPublicKey_fp) -#define GRPC_d2i_RSA_PSS_PARAMS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_RSA_PSS_PARAMS) -#define GRPC_d2i_RSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_RSA_PUBKEY) -#define GRPC_d2i_RSA_PUBKEY_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_RSA_PUBKEY_bio) -#define GRPC_d2i_RSA_PUBKEY_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_RSA_PUBKEY_fp) -#define GRPC_d2i_SXNET BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_SXNET) -#define GRPC_d2i_SXNETID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_SXNETID) -#define GRPC_d2i_USERNOTICE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_USERNOTICE) -#define GRPC_d2i_X509 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_X509) -#define GRPC_d2i_X509_ALGOR BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_X509_ALGOR) -#define GRPC_d2i_X509_ALGORS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_X509_ALGORS) -#define GRPC_d2i_X509_ATTRIBUTE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_X509_ATTRIBUTE) -#define GRPC_d2i_X509_AUX BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_X509_AUX) -#define GRPC_d2i_X509_CERT_AUX BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_X509_CERT_AUX) -#define GRPC_d2i_X509_CINF BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_X509_CINF) -#define GRPC_d2i_X509_CRL BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_X509_CRL) -#define GRPC_d2i_X509_CRL_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_X509_CRL_INFO) -#define GRPC_d2i_X509_CRL_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_X509_CRL_bio) -#define GRPC_d2i_X509_CRL_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_X509_CRL_fp) -#define GRPC_d2i_X509_EXTENSION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_X509_EXTENSION) -#define GRPC_d2i_X509_EXTENSIONS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_X509_EXTENSIONS) -#define GRPC_d2i_X509_NAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_X509_NAME) -#define GRPC_d2i_X509_NAME_ENTRY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_X509_NAME_ENTRY) -#define GRPC_d2i_X509_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_X509_PUBKEY) -#define GRPC_d2i_X509_REQ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_X509_REQ) -#define GRPC_d2i_X509_REQ_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_X509_REQ_INFO) -#define GRPC_d2i_X509_REQ_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_X509_REQ_bio) -#define GRPC_d2i_X509_REQ_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_X509_REQ_fp) -#define GRPC_d2i_X509_REVOKED BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_X509_REVOKED) -#define GRPC_d2i_X509_SIG BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_X509_SIG) -#define GRPC_d2i_X509_VAL BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_X509_VAL) -#define GRPC_d2i_X509_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_X509_bio) -#define GRPC_d2i_X509_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_d2i_X509_fp) -#define GRPC_dsa_asn1_meth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_dsa_asn1_meth) -#define GRPC_ec_GFp_mont_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_GFp_mont_add) -#define GRPC_ec_GFp_mont_bignum_to_felem BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_GFp_mont_bignum_to_felem) -#define GRPC_ec_GFp_mont_dbl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_GFp_mont_dbl) -#define GRPC_ec_GFp_mont_felem_mul BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_GFp_mont_felem_mul) -#define GRPC_ec_GFp_mont_felem_sqr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_GFp_mont_felem_sqr) -#define GRPC_ec_GFp_mont_felem_to_bignum BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_GFp_mont_felem_to_bignum) -#define GRPC_ec_GFp_mont_group_finish BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_GFp_mont_group_finish) -#define GRPC_ec_GFp_mont_group_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_GFp_mont_group_init) -#define GRPC_ec_GFp_mont_group_set_curve BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_GFp_mont_group_set_curve) -#define GRPC_ec_GFp_mont_mul BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_GFp_mont_mul) -#define GRPC_ec_GFp_mont_mul_base BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_GFp_mont_mul_base) -#define GRPC_ec_GFp_mont_mul_public BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_GFp_mont_mul_public) -#define GRPC_ec_GFp_nistp_recode_scalar_bits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_GFp_nistp_recode_scalar_bits) -#define GRPC_ec_GFp_simple_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_GFp_simple_cmp) -#define GRPC_ec_GFp_simple_cmp_x_coordinate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_GFp_simple_cmp_x_coordinate) -#define GRPC_ec_GFp_simple_group_finish BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_GFp_simple_group_finish) -#define GRPC_ec_GFp_simple_group_get_curve BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_GFp_simple_group_get_curve) -#define GRPC_ec_GFp_simple_group_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_GFp_simple_group_init) -#define GRPC_ec_GFp_simple_group_set_curve BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_GFp_simple_group_set_curve) -#define GRPC_ec_GFp_simple_invert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_GFp_simple_invert) -#define GRPC_ec_GFp_simple_is_at_infinity BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_GFp_simple_is_at_infinity) -#define GRPC_ec_GFp_simple_is_on_curve BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_GFp_simple_is_on_curve) -#define GRPC_ec_GFp_simple_mont_inv_mod_ord_vartime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_GFp_simple_mont_inv_mod_ord_vartime) -#define GRPC_ec_GFp_simple_point_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_GFp_simple_point_copy) -#define GRPC_ec_GFp_simple_point_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_GFp_simple_point_init) -#define GRPC_ec_GFp_simple_point_set_affine_coordinates BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_GFp_simple_point_set_affine_coordinates) -#define GRPC_ec_GFp_simple_point_set_to_infinity BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_GFp_simple_point_set_to_infinity) -#define GRPC_ec_asn1_meth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_asn1_meth) -#define GRPC_ec_bignum_to_felem BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_bignum_to_felem) -#define GRPC_ec_bignum_to_scalar BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_bignum_to_scalar) -#define GRPC_ec_cmp_x_coordinate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_cmp_x_coordinate) -#define GRPC_ec_compute_wNAF BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_compute_wNAF) -#define GRPC_ec_felem_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_felem_add) -#define GRPC_ec_felem_equal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_felem_equal) -#define GRPC_ec_felem_neg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_felem_neg) -#define GRPC_ec_felem_non_zero_mask BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_felem_non_zero_mask) -#define GRPC_ec_felem_select BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_felem_select) -#define GRPC_ec_felem_sub BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_felem_sub) -#define GRPC_ec_felem_to_bignum BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_felem_to_bignum) -#define GRPC_ec_get_x_coordinate_as_scalar BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_get_x_coordinate_as_scalar) -#define GRPC_ec_group_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_group_new) -#define GRPC_ec_pkey_meth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_pkey_meth) -#define GRPC_ec_point_get_affine_coordinate_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_point_get_affine_coordinate_bytes) -#define GRPC_ec_point_mul_scalar BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_point_mul_scalar) -#define GRPC_ec_point_mul_scalar_base BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_point_mul_scalar_base) -#define GRPC_ec_point_mul_scalar_public BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_point_mul_scalar_public) -#define GRPC_ec_random_nonzero_scalar BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_random_nonzero_scalar) -#define GRPC_ec_scalar_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_scalar_add) -#define GRPC_ec_scalar_equal_vartime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_scalar_equal_vartime) -#define GRPC_ec_scalar_from_montgomery BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_scalar_from_montgomery) -#define GRPC_ec_scalar_inv_montgomery BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_scalar_inv_montgomery) -#define GRPC_ec_scalar_inv_montgomery_vartime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_scalar_inv_montgomery_vartime) -#define GRPC_ec_scalar_is_zero BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_scalar_is_zero) -#define GRPC_ec_scalar_mul_montgomery BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_scalar_mul_montgomery) -#define GRPC_ec_scalar_to_montgomery BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_scalar_to_montgomery) -#define GRPC_ec_simple_scalar_inv_montgomery BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ec_simple_scalar_inv_montgomery) -#define GRPC_ecp_nistz256_avx2_select_w7 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ecp_nistz256_avx2_select_w7) -#define GRPC_ecp_nistz256_mul_mont BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ecp_nistz256_mul_mont) -#define GRPC_ecp_nistz256_neg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ecp_nistz256_neg) -#define GRPC_ecp_nistz256_ord_mul_mont BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ecp_nistz256_ord_mul_mont) -#define GRPC_ecp_nistz256_ord_sqr_mont BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ecp_nistz256_ord_sqr_mont) -#define GRPC_ecp_nistz256_point_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ecp_nistz256_point_add) -#define GRPC_ecp_nistz256_point_add_affine BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ecp_nistz256_point_add_affine) -#define GRPC_ecp_nistz256_point_double BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ecp_nistz256_point_double) -#define GRPC_ecp_nistz256_select_w5 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ecp_nistz256_select_w5) -#define GRPC_ecp_nistz256_select_w7 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ecp_nistz256_select_w7) -#define GRPC_ecp_nistz256_sqr_mont BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ecp_nistz256_sqr_mont) -#define GRPC_ed25519_asn1_meth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ed25519_asn1_meth) -#define GRPC_ed25519_pkey_meth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_ed25519_pkey_meth) -#define GRPC_gcm_ghash_avx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_gcm_ghash_avx) -#define GRPC_gcm_ghash_clmul BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_gcm_ghash_clmul) -#define GRPC_gcm_ghash_nohw BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_gcm_ghash_nohw) -#define GRPC_gcm_ghash_ssse3 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_gcm_ghash_ssse3) -#define GRPC_gcm_gmult_avx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_gcm_gmult_avx) -#define GRPC_gcm_gmult_clmul BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_gcm_gmult_clmul) -#define GRPC_gcm_gmult_nohw BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_gcm_gmult_nohw) -#define GRPC_gcm_gmult_ssse3 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_gcm_gmult_ssse3) -#define GRPC_gcm_init_avx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_gcm_init_avx) -#define GRPC_gcm_init_clmul BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_gcm_init_clmul) -#define GRPC_gcm_init_nohw BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_gcm_init_nohw) -#define GRPC_gcm_init_ssse3 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_gcm_init_ssse3) -#define GRPC_i2a_ACCESS_DESCRIPTION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2a_ACCESS_DESCRIPTION) -#define GRPC_i2a_ASN1_ENUMERATED BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2a_ASN1_ENUMERATED) -#define GRPC_i2a_ASN1_INTEGER BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2a_ASN1_INTEGER) -#define GRPC_i2a_ASN1_OBJECT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2a_ASN1_OBJECT) -#define GRPC_i2a_ASN1_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2a_ASN1_STRING) -#define GRPC_i2c_ASN1_BIT_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2c_ASN1_BIT_STRING) -#define GRPC_i2c_ASN1_INTEGER BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2c_ASN1_INTEGER) -#define GRPC_i2d_ACCESS_DESCRIPTION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_ACCESS_DESCRIPTION) -#define GRPC_i2d_ASN1_BIT_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_ASN1_BIT_STRING) -#define GRPC_i2d_ASN1_BMPSTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_ASN1_BMPSTRING) -#define GRPC_i2d_ASN1_BOOLEAN BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_ASN1_BOOLEAN) -#define GRPC_i2d_ASN1_ENUMERATED BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_ASN1_ENUMERATED) -#define GRPC_i2d_ASN1_GENERALIZEDTIME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_ASN1_GENERALIZEDTIME) -#define GRPC_i2d_ASN1_GENERALSTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_ASN1_GENERALSTRING) -#define GRPC_i2d_ASN1_IA5STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_ASN1_IA5STRING) -#define GRPC_i2d_ASN1_INTEGER BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_ASN1_INTEGER) -#define GRPC_i2d_ASN1_NULL BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_ASN1_NULL) -#define GRPC_i2d_ASN1_OBJECT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_ASN1_OBJECT) -#define GRPC_i2d_ASN1_OCTET_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_ASN1_OCTET_STRING) -#define GRPC_i2d_ASN1_PRINTABLE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_ASN1_PRINTABLE) -#define GRPC_i2d_ASN1_PRINTABLESTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_ASN1_PRINTABLESTRING) -#define GRPC_i2d_ASN1_SEQUENCE_ANY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_ASN1_SEQUENCE_ANY) -#define GRPC_i2d_ASN1_SET_ANY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_ASN1_SET_ANY) -#define GRPC_i2d_ASN1_T61STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_ASN1_T61STRING) -#define GRPC_i2d_ASN1_TIME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_ASN1_TIME) -#define GRPC_i2d_ASN1_TYPE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_ASN1_TYPE) -#define GRPC_i2d_ASN1_UNIVERSALSTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_ASN1_UNIVERSALSTRING) -#define GRPC_i2d_ASN1_UTCTIME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_ASN1_UTCTIME) -#define GRPC_i2d_ASN1_UTF8STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_ASN1_UTF8STRING) -#define GRPC_i2d_ASN1_VISIBLESTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_ASN1_VISIBLESTRING) -#define GRPC_i2d_AUTHORITY_INFO_ACCESS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_AUTHORITY_INFO_ACCESS) -#define GRPC_i2d_AUTHORITY_KEYID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_AUTHORITY_KEYID) -#define GRPC_i2d_BASIC_CONSTRAINTS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_BASIC_CONSTRAINTS) -#define GRPC_i2d_CERTIFICATEPOLICIES BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_CERTIFICATEPOLICIES) -#define GRPC_i2d_CRL_DIST_POINTS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_CRL_DIST_POINTS) -#define GRPC_i2d_DHparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_DHparams) -#define GRPC_i2d_DHparams_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_DHparams_bio) -#define GRPC_i2d_DIRECTORYSTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_DIRECTORYSTRING) -#define GRPC_i2d_DISPLAYTEXT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_DISPLAYTEXT) -#define GRPC_i2d_DIST_POINT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_DIST_POINT) -#define GRPC_i2d_DIST_POINT_NAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_DIST_POINT_NAME) -#define GRPC_i2d_DSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_DSAPrivateKey) -#define GRPC_i2d_DSAPrivateKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_DSAPrivateKey_bio) -#define GRPC_i2d_DSAPrivateKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_DSAPrivateKey_fp) -#define GRPC_i2d_DSAPublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_DSAPublicKey) -#define GRPC_i2d_DSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_DSA_PUBKEY) -#define GRPC_i2d_DSA_PUBKEY_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_DSA_PUBKEY_bio) -#define GRPC_i2d_DSA_PUBKEY_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_DSA_PUBKEY_fp) -#define GRPC_i2d_DSA_SIG BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_DSA_SIG) -#define GRPC_i2d_DSAparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_DSAparams) -#define GRPC_i2d_ECDSA_SIG BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_ECDSA_SIG) -#define GRPC_i2d_ECParameters BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_ECParameters) -#define GRPC_i2d_ECPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_ECPrivateKey) -#define GRPC_i2d_ECPrivateKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_ECPrivateKey_bio) -#define GRPC_i2d_ECPrivateKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_ECPrivateKey_fp) -#define GRPC_i2d_EC_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_EC_PUBKEY) -#define GRPC_i2d_EC_PUBKEY_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_EC_PUBKEY_bio) -#define GRPC_i2d_EC_PUBKEY_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_EC_PUBKEY_fp) -#define GRPC_i2d_EDIPARTYNAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_EDIPARTYNAME) -#define GRPC_i2d_EXTENDED_KEY_USAGE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_EXTENDED_KEY_USAGE) -#define GRPC_i2d_GENERAL_NAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_GENERAL_NAME) -#define GRPC_i2d_GENERAL_NAMES BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_GENERAL_NAMES) -#define GRPC_i2d_ISSUING_DIST_POINT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_ISSUING_DIST_POINT) -#define GRPC_i2d_NETSCAPE_SPKAC BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_NETSCAPE_SPKAC) -#define GRPC_i2d_NETSCAPE_SPKI BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_NETSCAPE_SPKI) -#define GRPC_i2d_NOTICEREF BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_NOTICEREF) -#define GRPC_i2d_OTHERNAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_OTHERNAME) -#define GRPC_i2d_PKCS12 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_PKCS12) -#define GRPC_i2d_PKCS12_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_PKCS12_bio) -#define GRPC_i2d_PKCS12_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_PKCS12_fp) -#define GRPC_i2d_PKCS7 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_PKCS7) -#define GRPC_i2d_PKCS7_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_PKCS7_bio) -#define GRPC_i2d_PKCS8PrivateKeyInfo_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_PKCS8PrivateKeyInfo_bio) -#define GRPC_i2d_PKCS8PrivateKeyInfo_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_PKCS8PrivateKeyInfo_fp) -#define GRPC_i2d_PKCS8PrivateKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_PKCS8PrivateKey_bio) -#define GRPC_i2d_PKCS8PrivateKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_PKCS8PrivateKey_fp) -#define GRPC_i2d_PKCS8PrivateKey_nid_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_PKCS8PrivateKey_nid_bio) -#define GRPC_i2d_PKCS8PrivateKey_nid_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_PKCS8PrivateKey_nid_fp) -#define GRPC_i2d_PKCS8_PRIV_KEY_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_PKCS8_PRIV_KEY_INFO) -#define GRPC_i2d_PKCS8_PRIV_KEY_INFO_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_PKCS8_PRIV_KEY_INFO_bio) -#define GRPC_i2d_PKCS8_PRIV_KEY_INFO_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_PKCS8_PRIV_KEY_INFO_fp) -#define GRPC_i2d_PKCS8_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_PKCS8_bio) -#define GRPC_i2d_PKCS8_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_PKCS8_fp) -#define GRPC_i2d_PKEY_USAGE_PERIOD BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_PKEY_USAGE_PERIOD) -#define GRPC_i2d_POLICYINFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_POLICYINFO) -#define GRPC_i2d_POLICYQUALINFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_POLICYQUALINFO) -#define GRPC_i2d_PROXY_CERT_INFO_EXTENSION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_PROXY_CERT_INFO_EXTENSION) -#define GRPC_i2d_PROXY_POLICY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_PROXY_POLICY) -#define GRPC_i2d_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_PUBKEY) -#define GRPC_i2d_PUBKEY_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_PUBKEY_bio) -#define GRPC_i2d_PUBKEY_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_PUBKEY_fp) -#define GRPC_i2d_PrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_PrivateKey) -#define GRPC_i2d_PrivateKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_PrivateKey_bio) -#define GRPC_i2d_PrivateKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_PrivateKey_fp) -#define GRPC_i2d_PublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_PublicKey) -#define GRPC_i2d_RSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_RSAPrivateKey) -#define GRPC_i2d_RSAPrivateKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_RSAPrivateKey_bio) -#define GRPC_i2d_RSAPrivateKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_RSAPrivateKey_fp) -#define GRPC_i2d_RSAPublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_RSAPublicKey) -#define GRPC_i2d_RSAPublicKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_RSAPublicKey_bio) -#define GRPC_i2d_RSAPublicKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_RSAPublicKey_fp) -#define GRPC_i2d_RSA_PSS_PARAMS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_RSA_PSS_PARAMS) -#define GRPC_i2d_RSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_RSA_PUBKEY) -#define GRPC_i2d_RSA_PUBKEY_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_RSA_PUBKEY_bio) -#define GRPC_i2d_RSA_PUBKEY_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_RSA_PUBKEY_fp) -#define GRPC_i2d_SXNET BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_SXNET) -#define GRPC_i2d_SXNETID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_SXNETID) -#define GRPC_i2d_USERNOTICE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_USERNOTICE) -#define GRPC_i2d_X509 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_X509) -#define GRPC_i2d_X509_ALGOR BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_X509_ALGOR) -#define GRPC_i2d_X509_ALGORS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_X509_ALGORS) -#define GRPC_i2d_X509_ATTRIBUTE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_X509_ATTRIBUTE) -#define GRPC_i2d_X509_AUX BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_X509_AUX) -#define GRPC_i2d_X509_CERT_AUX BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_X509_CERT_AUX) -#define GRPC_i2d_X509_CINF BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_X509_CINF) -#define GRPC_i2d_X509_CRL BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_X509_CRL) -#define GRPC_i2d_X509_CRL_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_X509_CRL_INFO) -#define GRPC_i2d_X509_CRL_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_X509_CRL_bio) -#define GRPC_i2d_X509_CRL_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_X509_CRL_fp) -#define GRPC_i2d_X509_EXTENSION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_X509_EXTENSION) -#define GRPC_i2d_X509_EXTENSIONS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_X509_EXTENSIONS) -#define GRPC_i2d_X509_NAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_X509_NAME) -#define GRPC_i2d_X509_NAME_ENTRY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_X509_NAME_ENTRY) -#define GRPC_i2d_X509_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_X509_PUBKEY) -#define GRPC_i2d_X509_REQ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_X509_REQ) -#define GRPC_i2d_X509_REQ_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_X509_REQ_INFO) -#define GRPC_i2d_X509_REQ_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_X509_REQ_bio) -#define GRPC_i2d_X509_REQ_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_X509_REQ_fp) -#define GRPC_i2d_X509_REVOKED BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_X509_REVOKED) -#define GRPC_i2d_X509_SIG BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_X509_SIG) -#define GRPC_i2d_X509_VAL BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_X509_VAL) -#define GRPC_i2d_X509_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_X509_bio) -#define GRPC_i2d_X509_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_X509_fp) -#define GRPC_i2d_re_X509_CRL_tbs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_re_X509_CRL_tbs) -#define GRPC_i2d_re_X509_REQ_tbs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_re_X509_REQ_tbs) -#define GRPC_i2d_re_X509_tbs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2d_re_X509_tbs) -#define GRPC_i2o_ECPublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2o_ECPublicKey) -#define GRPC_i2s_ASN1_ENUMERATED BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2s_ASN1_ENUMERATED) -#define GRPC_i2s_ASN1_ENUMERATED_TABLE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2s_ASN1_ENUMERATED_TABLE) -#define GRPC_i2s_ASN1_INTEGER BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2s_ASN1_INTEGER) -#define GRPC_i2s_ASN1_OCTET_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2s_ASN1_OCTET_STRING) -#define GRPC_i2t_ASN1_OBJECT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2t_ASN1_OBJECT) -#define GRPC_i2v_ASN1_BIT_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2v_ASN1_BIT_STRING) -#define GRPC_i2v_GENERAL_NAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2v_GENERAL_NAME) -#define GRPC_i2v_GENERAL_NAMES BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_i2v_GENERAL_NAMES) -#define GRPC_kBoringSSLRSASqrtTwo BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_kBoringSSLRSASqrtTwo) -#define GRPC_kBoringSSLRSASqrtTwoLen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_kBoringSSLRSASqrtTwoLen) -#define GRPC_kOpenSSLReasonStringData BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_kOpenSSLReasonStringData) -#define GRPC_kOpenSSLReasonValues BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_kOpenSSLReasonValues) -#define GRPC_kOpenSSLReasonValuesLen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_kOpenSSLReasonValuesLen) -#define GRPC_level_add_node BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_level_add_node) -#define GRPC_level_find_node BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_level_find_node) -#define GRPC_lh_delete BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_lh_delete) -#define GRPC_lh_doall_arg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_lh_doall_arg) -#define GRPC_lh_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_lh_free) -#define GRPC_lh_insert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_lh_insert) -#define GRPC_lh_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_lh_new) -#define GRPC_lh_num_items BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_lh_num_items) -#define GRPC_lh_retrieve BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_lh_retrieve) -#define GRPC_lh_retrieve_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_lh_retrieve_key) -#define GRPC_lh_strhash BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_lh_strhash) -#define GRPC_md4_block_data_order BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_md4_block_data_order) -#define GRPC_md5_block_asm_data_order BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_md5_block_asm_data_order) -#define GRPC_o2i_ECPublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_o2i_ECPublicKey) -#define GRPC_pkcs12_iterations_acceptable BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_pkcs12_iterations_acceptable) -#define GRPC_pkcs12_key_gen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_pkcs12_key_gen) -#define GRPC_pkcs12_pbe_encrypt_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_pkcs12_pbe_encrypt_init) -#define GRPC_pkcs7_bundle BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_pkcs7_bundle) -#define GRPC_pkcs7_parse_header BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_pkcs7_parse_header) -#define GRPC_pkcs8_pbe_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_pkcs8_pbe_decrypt) -#define GRPC_policy_cache_find_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_policy_cache_find_data) -#define GRPC_policy_cache_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_policy_cache_free) -#define GRPC_policy_cache_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_policy_cache_set) -#define GRPC_policy_cache_set_mapping BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_policy_cache_set_mapping) -#define GRPC_policy_data_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_policy_data_free) -#define GRPC_policy_data_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_policy_data_new) -#define GRPC_policy_node_cmp_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_policy_node_cmp_new) -#define GRPC_policy_node_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_policy_node_free) -#define GRPC_policy_node_match BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_policy_node_match) -#define GRPC_rand_fork_unsafe_buffering_enabled BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_rand_fork_unsafe_buffering_enabled) -#define GRPC_rsa_asn1_meth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_rsa_asn1_meth) -#define GRPC_rsa_default_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_rsa_default_decrypt) -#define GRPC_rsa_default_private_transform BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_rsa_default_private_transform) -#define GRPC_rsa_default_sign_raw BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_rsa_default_sign_raw) -#define GRPC_rsa_default_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_rsa_default_size) -#define GRPC_rsa_pkey_meth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_rsa_pkey_meth) -#define GRPC_rsaz_1024_gather5_avx2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_rsaz_1024_gather5_avx2) -#define GRPC_rsaz_1024_mul_avx2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_rsaz_1024_mul_avx2) -#define GRPC_rsaz_1024_norm2red_avx2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_rsaz_1024_norm2red_avx2) -#define GRPC_rsaz_1024_red2norm_avx2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_rsaz_1024_red2norm_avx2) -#define GRPC_rsaz_1024_scatter5_avx2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_rsaz_1024_scatter5_avx2) -#define GRPC_rsaz_1024_sqr_avx2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_rsaz_1024_sqr_avx2) -#define GRPC_s2i_ASN1_INTEGER BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_s2i_ASN1_INTEGER) -#define GRPC_s2i_ASN1_OCTET_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_s2i_ASN1_OCTET_STRING) -#define GRPC_sha1_block_data_order BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sha1_block_data_order) -#define GRPC_sha256_block_data_order BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sha256_block_data_order) -#define GRPC_sha512_block_data_order BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sha512_block_data_order) -#define GRPC_sk_deep_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_deep_copy) -#define GRPC_sk_delete BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_delete) -#define GRPC_sk_delete_ptr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_delete_ptr) -#define GRPC_sk_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_dup) -#define GRPC_sk_find BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_find) -#define GRPC_sk_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_free) -#define GRPC_sk_insert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_insert) -#define GRPC_sk_is_sorted BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_is_sorted) -#define GRPC_sk_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_new) -#define GRPC_sk_new_null BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_new_null) -#define GRPC_sk_num BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_num) -#define GRPC_sk_pop BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_pop) -#define GRPC_sk_pop_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_pop_free) -#define GRPC_sk_pop_free_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_pop_free_ex) -#define GRPC_sk_push BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_push) -#define GRPC_sk_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_set) -#define GRPC_sk_set_cmp_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_set_cmp_func) -#define GRPC_sk_shift BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_shift) -#define GRPC_sk_sort BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_sort) -#define GRPC_sk_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_value) -#define GRPC_sk_zero BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_sk_zero) -#define GRPC_tree_find_sk BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_tree_find_sk) -#define GRPC_v2i_ASN1_BIT_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_v2i_ASN1_BIT_STRING) -#define GRPC_v2i_GENERAL_NAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_v2i_GENERAL_NAME) -#define GRPC_v2i_GENERAL_NAMES BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_v2i_GENERAL_NAMES) -#define GRPC_v2i_GENERAL_NAME_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_v2i_GENERAL_NAME_ex) -#define GRPC_v3_akey_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_v3_akey_id) -#define GRPC_v3_alt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_v3_alt) -#define GRPC_v3_bcons BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_v3_bcons) -#define GRPC_v3_cpols BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_v3_cpols) -#define GRPC_v3_crl_invdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_v3_crl_invdate) -#define GRPC_v3_crl_num BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_v3_crl_num) -#define GRPC_v3_crl_reason BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_v3_crl_reason) -#define GRPC_v3_crld BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_v3_crld) -#define GRPC_v3_delta_crl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_v3_delta_crl) -#define GRPC_v3_ext_ku BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_v3_ext_ku) -#define GRPC_v3_freshest_crl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_v3_freshest_crl) -#define GRPC_v3_idp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_v3_idp) -#define GRPC_v3_info BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_v3_info) -#define GRPC_v3_inhibit_anyp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_v3_inhibit_anyp) -#define GRPC_v3_key_usage BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_v3_key_usage) -#define GRPC_v3_name_constraints BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_v3_name_constraints) -#define GRPC_v3_ns_ia5_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_v3_ns_ia5_list) -#define GRPC_v3_nscert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_v3_nscert) -#define GRPC_v3_ocsp_accresp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_v3_ocsp_accresp) -#define GRPC_v3_ocsp_nocheck BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_v3_ocsp_nocheck) -#define GRPC_v3_pci BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_v3_pci) -#define GRPC_v3_pkey_usage_period BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_v3_pkey_usage_period) -#define GRPC_v3_policy_constraints BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_v3_policy_constraints) -#define GRPC_v3_policy_mappings BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_v3_policy_mappings) -#define GRPC_v3_sinfo BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_v3_sinfo) -#define GRPC_v3_skey_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_v3_skey_id) -#define GRPC_v3_sxnet BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_v3_sxnet) -#define GRPC_vpaes_cbc_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_vpaes_cbc_encrypt) -#define GRPC_vpaes_ctr32_encrypt_blocks BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_vpaes_ctr32_encrypt_blocks) -#define GRPC_vpaes_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_vpaes_decrypt) -#define GRPC_vpaes_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_vpaes_encrypt) -#define GRPC_vpaes_set_decrypt_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_vpaes_set_decrypt_key) -#define GRPC_vpaes_set_encrypt_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_vpaes_set_encrypt_key) -#define GRPC_x25519_asn1_meth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_x25519_asn1_meth) -#define GRPC_x25519_ge_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_x25519_ge_add) -#define GRPC_x25519_ge_frombytes_vartime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_x25519_ge_frombytes_vartime) -#define GRPC_x25519_ge_p1p1_to_p2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_x25519_ge_p1p1_to_p2) -#define GRPC_x25519_ge_p1p1_to_p3 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_x25519_ge_p1p1_to_p3) -#define GRPC_x25519_ge_p3_to_cached BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_x25519_ge_p3_to_cached) -#define GRPC_x25519_ge_scalarmult BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_x25519_ge_scalarmult) -#define GRPC_x25519_ge_scalarmult_base BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_x25519_ge_scalarmult_base) -#define GRPC_x25519_ge_scalarmult_small_precomp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_x25519_ge_scalarmult_small_precomp) -#define GRPC_x25519_ge_sub BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_x25519_ge_sub) -#define GRPC_x25519_ge_tobytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_x25519_ge_tobytes) -#define GRPC_x25519_pkey_meth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_x25519_pkey_meth) -#define GRPC_x25519_sc_reduce BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_x25519_sc_reduce) -#define GRPC_x509_digest_sign_algorithm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_x509_digest_sign_algorithm) -#define GRPC_x509_digest_verify_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_x509_digest_verify_init) -#define GRPC_x509_print_rsa_pss_params BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_x509_print_rsa_pss_params) -#define GRPC_x509_rsa_ctx_to_pss BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_x509_rsa_ctx_to_pss) -#define GRPC_x509_rsa_pss_to_ctx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_x509_rsa_pss_to_ctx) -#define GRPC_x509v3_bytes_to_hex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_x509v3_bytes_to_hex) -#define GRPC_x509v3_hex_to_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_x509v3_hex_to_bytes) -#define GRPC_x509v3_looks_like_dns_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_x509v3_looks_like_dns_name) -#define GRPC_x509v3_name_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GRPC_x509v3_name_cmp) +#define BIO_f_ssl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_f_ssl) +#define BIO_set_ssl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_ssl) +#define DTLS_client_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DTLS_client_method) +#define DTLS_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DTLS_method) +#define DTLS_server_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DTLS_server_method) +#define DTLS_with_buffers_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DTLS_with_buffers_method) +#define DTLSv1_2_client_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DTLSv1_2_client_method) +#define DTLSv1_2_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DTLSv1_2_method) +#define DTLSv1_2_server_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DTLSv1_2_server_method) +#define DTLSv1_client_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DTLSv1_client_method) +#define DTLSv1_get_timeout BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DTLSv1_get_timeout) +#define DTLSv1_handle_timeout BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DTLSv1_handle_timeout) +#define DTLSv1_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DTLSv1_method) +#define DTLSv1_server_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DTLSv1_server_method) +#define DTLSv1_set_initial_timeout_duration BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DTLSv1_set_initial_timeout_duration) +#define ERR_load_SSL_strings BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_load_SSL_strings) +#define OPENSSL_init_ssl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_init_ssl) +#define PEM_read_SSL_SESSION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_SSL_SESSION) +#define PEM_read_bio_SSL_SESSION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_SSL_SESSION) +#define PEM_write_SSL_SESSION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_SSL_SESSION) +#define PEM_write_bio_SSL_SESSION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_SSL_SESSION) +#define SSL_CIPHER_description BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_description) +#define SSL_CIPHER_get_auth_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_get_auth_nid) +#define SSL_CIPHER_get_bits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_get_bits) +#define SSL_CIPHER_get_cipher_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_get_cipher_nid) +#define SSL_CIPHER_get_digest_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_get_digest_nid) +#define SSL_CIPHER_get_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_get_id) +#define SSL_CIPHER_get_kx_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_get_kx_name) +#define SSL_CIPHER_get_kx_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_get_kx_nid) +#define SSL_CIPHER_get_max_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_get_max_version) +#define SSL_CIPHER_get_min_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_get_min_version) +#define SSL_CIPHER_get_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_get_name) +#define SSL_CIPHER_get_prf_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_get_prf_nid) +#define SSL_CIPHER_get_rfc_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_get_rfc_name) +#define SSL_CIPHER_get_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_get_value) +#define SSL_CIPHER_get_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_get_version) +#define SSL_CIPHER_is_aead BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_is_aead) +#define SSL_CIPHER_is_block_cipher BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_is_block_cipher) +#define SSL_CIPHER_standard_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CIPHER_standard_name) +#define SSL_COMP_add_compression_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_COMP_add_compression_method) +#define SSL_COMP_free_compression_methods BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_COMP_free_compression_methods) +#define SSL_COMP_get0_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_COMP_get0_name) +#define SSL_COMP_get_compression_methods BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_COMP_get_compression_methods) +#define SSL_COMP_get_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_COMP_get_id) +#define SSL_COMP_get_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_COMP_get_name) +#define SSL_CTX_add0_chain_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_add0_chain_cert) +#define SSL_CTX_add1_chain_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_add1_chain_cert) +#define SSL_CTX_add_cert_compression_alg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_add_cert_compression_alg) +#define SSL_CTX_add_client_CA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_add_client_CA) +#define SSL_CTX_add_extra_chain_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_add_extra_chain_cert) +#define SSL_CTX_add_session BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_add_session) +#define SSL_CTX_check_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_check_private_key) +#define SSL_CTX_cipher_in_group BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_cipher_in_group) +#define SSL_CTX_clear_chain_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_clear_chain_certs) +#define SSL_CTX_clear_extra_chain_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_clear_extra_chain_certs) +#define SSL_CTX_clear_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_clear_mode) +#define SSL_CTX_clear_options BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_clear_options) +#define SSL_CTX_enable_ocsp_stapling BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_enable_ocsp_stapling) +#define SSL_CTX_enable_signed_cert_timestamps BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_enable_signed_cert_timestamps) +#define SSL_CTX_enable_tls_channel_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_enable_tls_channel_id) +#define SSL_CTX_flush_sessions BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_flush_sessions) +#define SSL_CTX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_free) +#define SSL_CTX_get0_certificate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get0_certificate) +#define SSL_CTX_get0_chain_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get0_chain_certs) +#define SSL_CTX_get0_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get0_param) +#define SSL_CTX_get0_privatekey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get0_privatekey) +#define SSL_CTX_get_cert_store BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_cert_store) +#define SSL_CTX_get_channel_id_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_channel_id_cb) +#define SSL_CTX_get_ciphers BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_ciphers) +#define SSL_CTX_get_client_CA_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_client_CA_list) +#define SSL_CTX_get_default_passwd_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_default_passwd_cb) +#define SSL_CTX_get_default_passwd_cb_userdata BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_default_passwd_cb_userdata) +#define SSL_CTX_get_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_ex_data) +#define SSL_CTX_get_ex_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_ex_new_index) +#define SSL_CTX_get_extra_chain_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_extra_chain_certs) +#define SSL_CTX_get_info_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_info_callback) +#define SSL_CTX_get_keylog_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_keylog_callback) +#define SSL_CTX_get_max_cert_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_max_cert_list) +#define SSL_CTX_get_max_proto_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_max_proto_version) +#define SSL_CTX_get_min_proto_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_min_proto_version) +#define SSL_CTX_get_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_mode) +#define SSL_CTX_get_options BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_options) +#define SSL_CTX_get_quiet_shutdown BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_quiet_shutdown) +#define SSL_CTX_get_read_ahead BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_read_ahead) +#define SSL_CTX_get_session_cache_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_session_cache_mode) +#define SSL_CTX_get_timeout BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_timeout) +#define SSL_CTX_get_tlsext_ticket_keys BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_tlsext_ticket_keys) +#define SSL_CTX_get_verify_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_verify_callback) +#define SSL_CTX_get_verify_depth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_verify_depth) +#define SSL_CTX_get_verify_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_get_verify_mode) +#define SSL_CTX_load_verify_locations BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_load_verify_locations) +#define SSL_CTX_need_tmp_RSA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_need_tmp_RSA) +#define SSL_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_new) +#define SSL_CTX_remove_session BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_remove_session) +#define SSL_CTX_sess_accept BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_accept) +#define SSL_CTX_sess_accept_good BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_accept_good) +#define SSL_CTX_sess_accept_renegotiate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_accept_renegotiate) +#define SSL_CTX_sess_cache_full BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_cache_full) +#define SSL_CTX_sess_cb_hits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_cb_hits) +#define SSL_CTX_sess_connect BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_connect) +#define SSL_CTX_sess_connect_good BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_connect_good) +#define SSL_CTX_sess_connect_renegotiate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_connect_renegotiate) +#define SSL_CTX_sess_get_cache_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_get_cache_size) +#define SSL_CTX_sess_get_get_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_get_get_cb) +#define SSL_CTX_sess_get_new_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_get_new_cb) +#define SSL_CTX_sess_get_remove_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_get_remove_cb) +#define SSL_CTX_sess_hits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_hits) +#define SSL_CTX_sess_misses BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_misses) +#define SSL_CTX_sess_number BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_number) +#define SSL_CTX_sess_set_cache_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_set_cache_size) +#define SSL_CTX_sess_set_get_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_set_get_cb) +#define SSL_CTX_sess_set_new_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_set_new_cb) +#define SSL_CTX_sess_set_remove_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_set_remove_cb) +#define SSL_CTX_sess_timeouts BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_sess_timeouts) +#define SSL_CTX_set0_buffer_pool BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set0_buffer_pool) +#define SSL_CTX_set0_chain BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set0_chain) +#define SSL_CTX_set0_client_CAs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set0_client_CAs) +#define SSL_CTX_set0_verify_cert_store BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set0_verify_cert_store) +#define SSL_CTX_set1_chain BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set1_chain) +#define SSL_CTX_set1_curves BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set1_curves) +#define SSL_CTX_set1_curves_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set1_curves_list) +#define SSL_CTX_set1_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set1_param) +#define SSL_CTX_set1_sigalgs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set1_sigalgs) +#define SSL_CTX_set1_sigalgs_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set1_sigalgs_list) +#define SSL_CTX_set1_tls_channel_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set1_tls_channel_id) +#define SSL_CTX_set1_verify_cert_store BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set1_verify_cert_store) +#define SSL_CTX_set_allow_unknown_alpn_protos BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_allow_unknown_alpn_protos) +#define SSL_CTX_set_alpn_protos BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_alpn_protos) +#define SSL_CTX_set_alpn_select_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_alpn_select_cb) +#define SSL_CTX_set_cert_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_cert_cb) +#define SSL_CTX_set_cert_store BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_cert_store) +#define SSL_CTX_set_cert_verify_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_cert_verify_callback) +#define SSL_CTX_set_chain_and_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_chain_and_key) +#define SSL_CTX_set_channel_id_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_channel_id_cb) +#define SSL_CTX_set_cipher_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_cipher_list) +#define SSL_CTX_set_client_CA_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_client_CA_list) +#define SSL_CTX_set_client_cert_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_client_cert_cb) +#define SSL_CTX_set_current_time_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_current_time_cb) +#define SSL_CTX_set_custom_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_custom_verify) +#define SSL_CTX_set_default_passwd_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_default_passwd_cb) +#define SSL_CTX_set_default_passwd_cb_userdata BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_default_passwd_cb_userdata) +#define SSL_CTX_set_default_verify_paths BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_default_verify_paths) +#define SSL_CTX_set_dos_protection_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_dos_protection_cb) +#define SSL_CTX_set_early_data_enabled BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_early_data_enabled) +#define SSL_CTX_set_ed25519_enabled BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_ed25519_enabled) +#define SSL_CTX_set_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_ex_data) +#define SSL_CTX_set_false_start_allowed_without_alpn BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_false_start_allowed_without_alpn) +#define SSL_CTX_set_grease_enabled BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_grease_enabled) +#define SSL_CTX_set_ignore_tls13_downgrade BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_ignore_tls13_downgrade) +#define SSL_CTX_set_info_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_info_callback) +#define SSL_CTX_set_keylog_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_keylog_callback) +#define SSL_CTX_set_max_cert_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_max_cert_list) +#define SSL_CTX_set_max_proto_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_max_proto_version) +#define SSL_CTX_set_max_send_fragment BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_max_send_fragment) +#define SSL_CTX_set_min_proto_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_min_proto_version) +#define SSL_CTX_set_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_mode) +#define SSL_CTX_set_msg_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_msg_callback) +#define SSL_CTX_set_msg_callback_arg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_msg_callback_arg) +#define SSL_CTX_set_next_proto_select_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_next_proto_select_cb) +#define SSL_CTX_set_next_protos_advertised_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_next_protos_advertised_cb) +#define SSL_CTX_set_ocsp_response BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_ocsp_response) +#define SSL_CTX_set_options BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_options) +#define SSL_CTX_set_private_key_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_private_key_method) +#define SSL_CTX_set_psk_client_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_psk_client_callback) +#define SSL_CTX_set_psk_server_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_psk_server_callback) +#define SSL_CTX_set_purpose BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_purpose) +#define SSL_CTX_set_quic_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_quic_method) +#define SSL_CTX_set_quiet_shutdown BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_quiet_shutdown) +#define SSL_CTX_set_read_ahead BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_read_ahead) +#define SSL_CTX_set_retain_only_sha256_of_client_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_retain_only_sha256_of_client_certs) +#define SSL_CTX_set_reverify_on_resume BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_reverify_on_resume) +#define SSL_CTX_set_select_certificate_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_select_certificate_cb) +#define SSL_CTX_set_session_cache_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_session_cache_mode) +#define SSL_CTX_set_session_id_context BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_session_id_context) +#define SSL_CTX_set_session_psk_dhe_timeout BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_session_psk_dhe_timeout) +#define SSL_CTX_set_signed_cert_timestamp_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_signed_cert_timestamp_list) +#define SSL_CTX_set_signing_algorithm_prefs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_signing_algorithm_prefs) +#define SSL_CTX_set_srtp_profiles BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_srtp_profiles) +#define SSL_CTX_set_strict_cipher_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_strict_cipher_list) +#define SSL_CTX_set_ticket_aead_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_ticket_aead_method) +#define SSL_CTX_set_timeout BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_timeout) +#define SSL_CTX_set_tls_channel_id_enabled BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_tls_channel_id_enabled) +#define SSL_CTX_set_tlsext_servername_arg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_tlsext_servername_arg) +#define SSL_CTX_set_tlsext_servername_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_tlsext_servername_callback) +#define SSL_CTX_set_tlsext_status_arg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_tlsext_status_arg) +#define SSL_CTX_set_tlsext_status_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_tlsext_status_cb) +#define SSL_CTX_set_tlsext_ticket_key_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_tlsext_ticket_key_cb) +#define SSL_CTX_set_tlsext_ticket_keys BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_tlsext_ticket_keys) +#define SSL_CTX_set_tlsext_use_srtp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_tlsext_use_srtp) +#define SSL_CTX_set_tmp_dh BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_tmp_dh) +#define SSL_CTX_set_tmp_dh_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_tmp_dh_callback) +#define SSL_CTX_set_tmp_ecdh BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_tmp_ecdh) +#define SSL_CTX_set_tmp_rsa BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_tmp_rsa) +#define SSL_CTX_set_tmp_rsa_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_tmp_rsa_callback) +#define SSL_CTX_set_trust BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_trust) +#define SSL_CTX_set_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_verify) +#define SSL_CTX_set_verify_algorithm_prefs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_verify_algorithm_prefs) +#define SSL_CTX_set_verify_depth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_set_verify_depth) +#define SSL_CTX_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_up_ref) +#define SSL_CTX_use_PrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_use_PrivateKey) +#define SSL_CTX_use_PrivateKey_ASN1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_use_PrivateKey_ASN1) +#define SSL_CTX_use_PrivateKey_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_use_PrivateKey_file) +#define SSL_CTX_use_RSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_use_RSAPrivateKey) +#define SSL_CTX_use_RSAPrivateKey_ASN1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_use_RSAPrivateKey_ASN1) +#define SSL_CTX_use_RSAPrivateKey_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_use_RSAPrivateKey_file) +#define SSL_CTX_use_certificate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_use_certificate) +#define SSL_CTX_use_certificate_ASN1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_use_certificate_ASN1) +#define SSL_CTX_use_certificate_chain_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_use_certificate_chain_file) +#define SSL_CTX_use_certificate_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_use_certificate_file) +#define SSL_CTX_use_psk_identity_hint BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_use_psk_identity_hint) +#define SSL_SESSION_early_data_capable BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_early_data_capable) +#define SSL_SESSION_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_free) +#define SSL_SESSION_from_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_from_bytes) +#define SSL_SESSION_get0_cipher BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get0_cipher) +#define SSL_SESSION_get0_id_context BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get0_id_context) +#define SSL_SESSION_get0_ocsp_response BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get0_ocsp_response) +#define SSL_SESSION_get0_peer BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get0_peer) +#define SSL_SESSION_get0_peer_certificates BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get0_peer_certificates) +#define SSL_SESSION_get0_peer_sha256 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get0_peer_sha256) +#define SSL_SESSION_get0_signed_cert_timestamp_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get0_signed_cert_timestamp_list) +#define SSL_SESSION_get0_ticket BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get0_ticket) +#define SSL_SESSION_get_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get_ex_data) +#define SSL_SESSION_get_ex_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get_ex_new_index) +#define SSL_SESSION_get_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get_id) +#define SSL_SESSION_get_master_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get_master_key) +#define SSL_SESSION_get_protocol_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get_protocol_version) +#define SSL_SESSION_get_ticket_lifetime_hint BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get_ticket_lifetime_hint) +#define SSL_SESSION_get_time BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get_time) +#define SSL_SESSION_get_timeout BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get_timeout) +#define SSL_SESSION_get_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_get_version) +#define SSL_SESSION_has_peer_sha256 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_has_peer_sha256) +#define SSL_SESSION_has_ticket BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_has_ticket) +#define SSL_SESSION_is_resumable BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_is_resumable) +#define SSL_SESSION_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_new) +#define SSL_SESSION_set1_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_set1_id) +#define SSL_SESSION_set1_id_context BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_set1_id_context) +#define SSL_SESSION_set_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_set_ex_data) +#define SSL_SESSION_set_protocol_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_set_protocol_version) +#define SSL_SESSION_set_ticket BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_set_ticket) +#define SSL_SESSION_set_time BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_set_time) +#define SSL_SESSION_set_timeout BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_set_timeout) +#define SSL_SESSION_should_be_single_use BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_should_be_single_use) +#define SSL_SESSION_to_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_to_bytes) +#define SSL_SESSION_to_bytes_for_ticket BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_to_bytes_for_ticket) +#define SSL_SESSION_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_SESSION_up_ref) +#define SSL_accept BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_accept) +#define SSL_add0_chain_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_add0_chain_cert) +#define SSL_add1_chain_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_add1_chain_cert) +#define SSL_add_client_CA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_add_client_CA) +#define SSL_add_file_cert_subjects_to_stack BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_add_file_cert_subjects_to_stack) +#define SSL_alert_desc_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_alert_desc_string) +#define SSL_alert_desc_string_long BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_alert_desc_string_long) +#define SSL_alert_from_verify_result BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_alert_from_verify_result) +#define SSL_alert_type_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_alert_type_string) +#define SSL_alert_type_string_long BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_alert_type_string_long) +#define SSL_cache_hit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_cache_hit) +#define SSL_certs_clear BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_certs_clear) +#define SSL_check_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_check_private_key) +#define SSL_clear BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_clear) +#define SSL_clear_chain_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_clear_chain_certs) +#define SSL_clear_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_clear_mode) +#define SSL_clear_options BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_clear_options) +#define SSL_connect BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_connect) +#define SSL_cutthrough_complete BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_cutthrough_complete) +#define SSL_delegated_credential_used BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_delegated_credential_used) +#define SSL_do_handshake BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_do_handshake) +#define SSL_dup_CA_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_dup_CA_list) +#define SSL_early_callback_ctx_extension_get BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_early_callback_ctx_extension_get) +#define SSL_early_data_accepted BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_early_data_accepted) +#define SSL_enable_ocsp_stapling BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_enable_ocsp_stapling) +#define SSL_enable_signed_cert_timestamps BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_enable_signed_cert_timestamps) +#define SSL_enable_tls_channel_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_enable_tls_channel_id) +#define SSL_error_description BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_error_description) +#define SSL_export_keying_material BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_export_keying_material) +#define SSL_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_free) +#define SSL_generate_key_block BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_generate_key_block) +#define SSL_get0_alpn_selected BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get0_alpn_selected) +#define SSL_get0_certificate_types BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get0_certificate_types) +#define SSL_get0_chain_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get0_chain_certs) +#define SSL_get0_next_proto_negotiated BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get0_next_proto_negotiated) +#define SSL_get0_ocsp_response BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get0_ocsp_response) +#define SSL_get0_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get0_param) +#define SSL_get0_peer_certificates BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get0_peer_certificates) +#define SSL_get0_peer_verify_algorithms BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get0_peer_verify_algorithms) +#define SSL_get0_server_requested_CAs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get0_server_requested_CAs) +#define SSL_get0_session_id_context BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get0_session_id_context) +#define SSL_get0_signed_cert_timestamp_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get0_signed_cert_timestamp_list) +#define SSL_get1_session BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get1_session) +#define SSL_get_SSL_CTX BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_SSL_CTX) +#define SSL_get_certificate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_certificate) +#define SSL_get_cipher_by_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_cipher_by_value) +#define SSL_get_cipher_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_cipher_list) +#define SSL_get_ciphers BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_ciphers) +#define SSL_get_client_CA_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_client_CA_list) +#define SSL_get_client_random BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_client_random) +#define SSL_get_current_cipher BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_current_cipher) +#define SSL_get_current_compression BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_current_compression) +#define SSL_get_current_expansion BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_current_expansion) +#define SSL_get_curve_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_curve_id) +#define SSL_get_curve_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_curve_name) +#define SSL_get_default_timeout BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_default_timeout) +#define SSL_get_early_data_reason BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_early_data_reason) +#define SSL_get_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_error) +#define SSL_get_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_ex_data) +#define SSL_get_ex_data_X509_STORE_CTX_idx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_ex_data_X509_STORE_CTX_idx) +#define SSL_get_ex_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_ex_new_index) +#define SSL_get_extms_support BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_extms_support) +#define SSL_get_fd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_fd) +#define SSL_get_finished BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_finished) +#define SSL_get_info_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_info_callback) +#define SSL_get_ivs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_ivs) +#define SSL_get_key_block_len BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_key_block_len) +#define SSL_get_max_cert_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_max_cert_list) +#define SSL_get_max_proto_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_max_proto_version) +#define SSL_get_min_proto_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_min_proto_version) +#define SSL_get_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_mode) +#define SSL_get_negotiated_token_binding_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_negotiated_token_binding_param) +#define SSL_get_options BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_options) +#define SSL_get_peer_cert_chain BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_peer_cert_chain) +#define SSL_get_peer_certificate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_peer_certificate) +#define SSL_get_peer_finished BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_peer_finished) +#define SSL_get_peer_full_cert_chain BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_peer_full_cert_chain) +#define SSL_get_peer_quic_transport_params BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_peer_quic_transport_params) +#define SSL_get_peer_signature_algorithm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_peer_signature_algorithm) +#define SSL_get_pending_cipher BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_pending_cipher) +#define SSL_get_privatekey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_privatekey) +#define SSL_get_psk_identity BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_psk_identity) +#define SSL_get_psk_identity_hint BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_psk_identity_hint) +#define SSL_get_quiet_shutdown BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_quiet_shutdown) +#define SSL_get_rbio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_rbio) +#define SSL_get_read_ahead BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_read_ahead) +#define SSL_get_read_sequence BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_read_sequence) +#define SSL_get_rfd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_rfd) +#define SSL_get_secure_renegotiation_support BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_secure_renegotiation_support) +#define SSL_get_selected_srtp_profile BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_selected_srtp_profile) +#define SSL_get_server_random BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_server_random) +#define SSL_get_server_tmp_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_server_tmp_key) +#define SSL_get_servername BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_servername) +#define SSL_get_servername_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_servername_type) +#define SSL_get_session BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_session) +#define SSL_get_shared_ciphers BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_shared_ciphers) +#define SSL_get_shared_sigalgs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_shared_sigalgs) +#define SSL_get_shutdown BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_shutdown) +#define SSL_get_signature_algorithm_digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_signature_algorithm_digest) +#define SSL_get_signature_algorithm_key_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_signature_algorithm_key_type) +#define SSL_get_signature_algorithm_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_signature_algorithm_name) +#define SSL_get_srtp_profiles BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_srtp_profiles) +#define SSL_get_ticket_age_skew BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_ticket_age_skew) +#define SSL_get_tls_channel_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_tls_channel_id) +#define SSL_get_tls_unique BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_tls_unique) +#define SSL_get_tlsext_status_ocsp_resp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_tlsext_status_ocsp_resp) +#define SSL_get_tlsext_status_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_tlsext_status_type) +#define SSL_get_verify_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_verify_callback) +#define SSL_get_verify_depth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_verify_depth) +#define SSL_get_verify_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_verify_mode) +#define SSL_get_verify_result BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_verify_result) +#define SSL_get_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_version) +#define SSL_get_wbio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_wbio) +#define SSL_get_wfd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_wfd) +#define SSL_get_write_sequence BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get_write_sequence) +#define SSL_in_early_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_in_early_data) +#define SSL_in_false_start BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_in_false_start) +#define SSL_in_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_in_init) +#define SSL_is_dtls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_is_dtls) +#define SSL_is_init_finished BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_is_init_finished) +#define SSL_is_server BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_is_server) +#define SSL_is_signature_algorithm_rsa_pss BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_is_signature_algorithm_rsa_pss) +#define SSL_is_tls13_downgrade BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_is_tls13_downgrade) +#define SSL_is_token_binding_negotiated BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_is_token_binding_negotiated) +#define SSL_key_update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_key_update) +#define SSL_library_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_library_init) +#define SSL_load_client_CA_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_load_client_CA_file) +#define SSL_load_error_strings BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_load_error_strings) +#define SSL_magic_pending_session_ptr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_magic_pending_session_ptr) +#define SSL_max_seal_overhead BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_max_seal_overhead) +#define SSL_need_tmp_RSA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_need_tmp_RSA) +#define SSL_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_new) +#define SSL_num_renegotiations BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_num_renegotiations) +#define SSL_peek BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_peek) +#define SSL_pending BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_pending) +#define SSL_process_quic_post_handshake BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_process_quic_post_handshake) +#define SSL_provide_quic_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_provide_quic_data) +#define SSL_quic_max_handshake_flight_len BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_quic_max_handshake_flight_len) +#define SSL_quic_read_level BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_quic_read_level) +#define SSL_quic_write_level BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_quic_write_level) +#define SSL_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_read) +#define SSL_renegotiate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_renegotiate) +#define SSL_renegotiate_pending BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_renegotiate_pending) +#define SSL_reset_early_data_reject BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_reset_early_data_reject) +#define SSL_select_next_proto BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_select_next_proto) +#define SSL_send_fatal_alert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_send_fatal_alert) +#define SSL_session_reused BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_session_reused) +#define SSL_set0_chain BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set0_chain) +#define SSL_set0_client_CAs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set0_client_CAs) +#define SSL_set0_rbio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set0_rbio) +#define SSL_set0_verify_cert_store BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set0_verify_cert_store) +#define SSL_set0_wbio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set0_wbio) +#define SSL_set1_chain BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set1_chain) +#define SSL_set1_curves BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set1_curves) +#define SSL_set1_curves_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set1_curves_list) +#define SSL_set1_delegated_credential BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set1_delegated_credential) +#define SSL_set1_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set1_param) +#define SSL_set1_sigalgs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set1_sigalgs) +#define SSL_set1_sigalgs_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set1_sigalgs_list) +#define SSL_set1_tls_channel_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set1_tls_channel_id) +#define SSL_set1_verify_cert_store BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set1_verify_cert_store) +#define SSL_set_SSL_CTX BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_SSL_CTX) +#define SSL_set_accept_state BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_accept_state) +#define SSL_set_alpn_protos BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_alpn_protos) +#define SSL_set_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_bio) +#define SSL_set_cert_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_cert_cb) +#define SSL_set_chain_and_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_chain_and_key) +#define SSL_set_cipher_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_cipher_list) +#define SSL_set_client_CA_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_client_CA_list) +#define SSL_set_connect_state BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_connect_state) +#define SSL_set_custom_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_custom_verify) +#define SSL_set_early_data_enabled BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_early_data_enabled) +#define SSL_set_enforce_rsa_key_usage BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_enforce_rsa_key_usage) +#define SSL_set_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_ex_data) +#define SSL_set_fd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_fd) +#define SSL_set_ignore_tls13_downgrade BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_ignore_tls13_downgrade) +#define SSL_set_info_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_info_callback) +#define SSL_set_jdk11_workaround BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_jdk11_workaround) +#define SSL_set_max_cert_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_max_cert_list) +#define SSL_set_max_proto_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_max_proto_version) +#define SSL_set_max_send_fragment BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_max_send_fragment) +#define SSL_set_min_proto_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_min_proto_version) +#define SSL_set_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_mode) +#define SSL_set_msg_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_msg_callback) +#define SSL_set_msg_callback_arg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_msg_callback_arg) +#define SSL_set_mtu BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_mtu) +#define SSL_set_ocsp_response BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_ocsp_response) +#define SSL_set_options BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_options) +#define SSL_set_private_key_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_private_key_method) +#define SSL_set_psk_client_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_psk_client_callback) +#define SSL_set_psk_server_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_psk_server_callback) +#define SSL_set_purpose BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_purpose) +#define SSL_set_quic_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_quic_method) +#define SSL_set_quic_transport_params BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_quic_transport_params) +#define SSL_set_quiet_shutdown BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_quiet_shutdown) +#define SSL_set_read_ahead BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_read_ahead) +#define SSL_set_renegotiate_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_renegotiate_mode) +#define SSL_set_retain_only_sha256_of_client_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_retain_only_sha256_of_client_certs) +#define SSL_set_rfd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_rfd) +#define SSL_set_session BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_session) +#define SSL_set_session_id_context BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_session_id_context) +#define SSL_set_shed_handshake_config BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_shed_handshake_config) +#define SSL_set_shutdown BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_shutdown) +#define SSL_set_signed_cert_timestamp_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_signed_cert_timestamp_list) +#define SSL_set_signing_algorithm_prefs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_signing_algorithm_prefs) +#define SSL_set_srtp_profiles BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_srtp_profiles) +#define SSL_set_state BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_state) +#define SSL_set_strict_cipher_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_strict_cipher_list) +#define SSL_set_tls_channel_id_enabled BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_tls_channel_id_enabled) +#define SSL_set_tlsext_host_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_tlsext_host_name) +#define SSL_set_tlsext_status_ocsp_resp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_tlsext_status_ocsp_resp) +#define SSL_set_tlsext_status_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_tlsext_status_type) +#define SSL_set_tlsext_use_srtp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_tlsext_use_srtp) +#define SSL_set_tmp_dh BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_tmp_dh) +#define SSL_set_tmp_dh_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_tmp_dh_callback) +#define SSL_set_tmp_ecdh BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_tmp_ecdh) +#define SSL_set_tmp_rsa BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_tmp_rsa) +#define SSL_set_tmp_rsa_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_tmp_rsa_callback) +#define SSL_set_token_binding_params BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_token_binding_params) +#define SSL_set_trust BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_trust) +#define SSL_set_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_verify) +#define SSL_set_verify_depth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_verify_depth) +#define SSL_set_verify_result BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_verify_result) +#define SSL_set_wfd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_wfd) +#define SSL_shutdown BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_shutdown) +#define SSL_state BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_state) +#define SSL_state_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_state_string) +#define SSL_state_string_long BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_state_string_long) +#define SSL_total_renegotiations BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_total_renegotiations) +#define SSL_use_PrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_use_PrivateKey) +#define SSL_use_PrivateKey_ASN1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_use_PrivateKey_ASN1) +#define SSL_use_PrivateKey_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_use_PrivateKey_file) +#define SSL_use_RSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_use_RSAPrivateKey) +#define SSL_use_RSAPrivateKey_ASN1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_use_RSAPrivateKey_ASN1) +#define SSL_use_RSAPrivateKey_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_use_RSAPrivateKey_file) +#define SSL_use_certificate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_use_certificate) +#define SSL_use_certificate_ASN1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_use_certificate_ASN1) +#define SSL_use_certificate_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_use_certificate_file) +#define SSL_use_psk_identity_hint BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_use_psk_identity_hint) +#define SSL_used_hello_retry_request BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_used_hello_retry_request) +#define SSL_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_version) +#define SSL_want BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_want) +#define SSL_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_write) +#define SSLv23_client_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSLv23_client_method) +#define SSLv23_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSLv23_method) +#define SSLv23_server_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSLv23_server_method) +#define TLS_client_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TLS_client_method) +#define TLS_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TLS_method) +#define TLS_server_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TLS_server_method) +#define TLS_with_buffers_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TLS_with_buffers_method) +#define TLSv1_1_client_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TLSv1_1_client_method) +#define TLSv1_1_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TLSv1_1_method) +#define TLSv1_1_server_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TLSv1_1_server_method) +#define TLSv1_2_client_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TLSv1_2_client_method) +#define TLSv1_2_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TLSv1_2_method) +#define TLSv1_2_server_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TLSv1_2_server_method) +#define TLSv1_client_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TLSv1_client_method) +#define TLSv1_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TLSv1_method) +#define TLSv1_server_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TLSv1_server_method) +#define d2i_SSL_SESSION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_SSL_SESSION) +#define d2i_SSL_SESSION_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_SSL_SESSION_bio) +#define i2d_SSL_SESSION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_SSL_SESSION) +#define i2d_SSL_SESSION_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_SSL_SESSION_bio) +#define sk_CRYPTO_BUFFER_call_copy_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_CRYPTO_BUFFER_call_copy_func) +#define sk_CRYPTO_BUFFER_call_free_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_CRYPTO_BUFFER_call_free_func) +#define sk_CRYPTO_BUFFER_deep_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_CRYPTO_BUFFER_deep_copy) +#define sk_CRYPTO_BUFFER_new_null BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_CRYPTO_BUFFER_new_null) +#define sk_CRYPTO_BUFFER_num BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_CRYPTO_BUFFER_num) +#define sk_CRYPTO_BUFFER_push BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_CRYPTO_BUFFER_push) +#define sk_CRYPTO_BUFFER_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_CRYPTO_BUFFER_set) +#define sk_CRYPTO_BUFFER_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_CRYPTO_BUFFER_value) +#define sk_SRTP_PROTECTION_PROFILE_new_null BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_SRTP_PROTECTION_PROFILE_new_null) +#define sk_SRTP_PROTECTION_PROFILE_num BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_SRTP_PROTECTION_PROFILE_num) +#define sk_SRTP_PROTECTION_PROFILE_push BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_SRTP_PROTECTION_PROFILE_push) +#define sk_SSL_CIPHER_call_cmp_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_SSL_CIPHER_call_cmp_func) +#define sk_SSL_CIPHER_delete BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_SSL_CIPHER_delete) +#define sk_SSL_CIPHER_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_SSL_CIPHER_dup) +#define sk_SSL_CIPHER_find BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_SSL_CIPHER_find) +#define sk_SSL_CIPHER_new_null BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_SSL_CIPHER_new_null) +#define sk_SSL_CIPHER_num BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_SSL_CIPHER_num) +#define sk_SSL_CIPHER_push BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_SSL_CIPHER_push) +#define sk_SSL_CIPHER_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_SSL_CIPHER_value) +#define sk_X509_NAME_call_cmp_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_NAME_call_cmp_func) +#define sk_X509_NAME_call_copy_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_NAME_call_copy_func) +#define sk_X509_NAME_call_free_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_NAME_call_free_func) +#define sk_X509_NAME_deep_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_NAME_deep_copy) +#define sk_X509_NAME_find BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_NAME_find) +#define sk_X509_NAME_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_NAME_free) +#define sk_X509_NAME_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_NAME_new) +#define sk_X509_NAME_new_null BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_NAME_new_null) +#define sk_X509_NAME_pop_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_NAME_pop_free) +#define sk_X509_NAME_push BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_NAME_push) +#define sk_X509_NAME_set_cmp_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_NAME_set_cmp_func) +#define sk_X509_NAME_sort BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_NAME_sort) +#define sk_X509_call_free_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_call_free_func) +#define sk_X509_new_null BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_new_null) +#define sk_X509_num BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_num) +#define sk_X509_pop_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_pop_free) +#define sk_X509_shift BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_shift) +#define sk_X509_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_value) +#define ACCESS_DESCRIPTION_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ACCESS_DESCRIPTION_free) +#define ACCESS_DESCRIPTION_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ACCESS_DESCRIPTION_it) +#define ACCESS_DESCRIPTION_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ACCESS_DESCRIPTION_new) +#define AES_CMAC BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AES_CMAC) +#define AES_cbc_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AES_cbc_encrypt) +#define AES_cfb128_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AES_cfb128_encrypt) +#define AES_ctr128_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AES_ctr128_encrypt) +#define AES_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AES_decrypt) +#define AES_ecb_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AES_ecb_encrypt) +#define AES_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AES_encrypt) +#define AES_ofb128_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AES_ofb128_encrypt) +#define AES_set_decrypt_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AES_set_decrypt_key) +#define AES_set_encrypt_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AES_set_encrypt_key) +#define AES_unwrap_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AES_unwrap_key) +#define AES_unwrap_key_padded BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AES_unwrap_key_padded) +#define AES_wrap_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AES_wrap_key) +#define AES_wrap_key_padded BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AES_wrap_key_padded) +#define ASN1_ANY_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_ANY_it) +#define ASN1_BIT_STRING_check BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_BIT_STRING_check) +#define ASN1_BIT_STRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_BIT_STRING_free) +#define ASN1_BIT_STRING_get_bit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_BIT_STRING_get_bit) +#define ASN1_BIT_STRING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_BIT_STRING_it) +#define ASN1_BIT_STRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_BIT_STRING_new) +#define ASN1_BIT_STRING_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_BIT_STRING_set) +#define ASN1_BIT_STRING_set_bit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_BIT_STRING_set_bit) +#define ASN1_BMPSTRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_BMPSTRING_free) +#define ASN1_BMPSTRING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_BMPSTRING_it) +#define ASN1_BMPSTRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_BMPSTRING_new) +#define ASN1_BOOLEAN_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_BOOLEAN_it) +#define ASN1_ENUMERATED_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_ENUMERATED_free) +#define ASN1_ENUMERATED_get BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_ENUMERATED_get) +#define ASN1_ENUMERATED_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_ENUMERATED_it) +#define ASN1_ENUMERATED_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_ENUMERATED_new) +#define ASN1_ENUMERATED_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_ENUMERATED_set) +#define ASN1_ENUMERATED_to_BN BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_ENUMERATED_to_BN) +#define ASN1_FBOOLEAN_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_FBOOLEAN_it) +#define ASN1_GENERALIZEDTIME_adj BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_GENERALIZEDTIME_adj) +#define ASN1_GENERALIZEDTIME_check BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_GENERALIZEDTIME_check) +#define ASN1_GENERALIZEDTIME_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_GENERALIZEDTIME_free) +#define ASN1_GENERALIZEDTIME_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_GENERALIZEDTIME_it) +#define ASN1_GENERALIZEDTIME_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_GENERALIZEDTIME_new) +#define ASN1_GENERALIZEDTIME_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_GENERALIZEDTIME_print) +#define ASN1_GENERALIZEDTIME_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_GENERALIZEDTIME_set) +#define ASN1_GENERALIZEDTIME_set_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_GENERALIZEDTIME_set_string) +#define ASN1_GENERALSTRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_GENERALSTRING_free) +#define ASN1_GENERALSTRING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_GENERALSTRING_it) +#define ASN1_GENERALSTRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_GENERALSTRING_new) +#define ASN1_IA5STRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_IA5STRING_free) +#define ASN1_IA5STRING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_IA5STRING_it) +#define ASN1_IA5STRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_IA5STRING_new) +#define ASN1_INTEGER_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_INTEGER_cmp) +#define ASN1_INTEGER_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_INTEGER_dup) +#define ASN1_INTEGER_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_INTEGER_free) +#define ASN1_INTEGER_get BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_INTEGER_get) +#define ASN1_INTEGER_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_INTEGER_it) +#define ASN1_INTEGER_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_INTEGER_new) +#define ASN1_INTEGER_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_INTEGER_set) +#define ASN1_INTEGER_set_uint64 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_INTEGER_set_uint64) +#define ASN1_INTEGER_to_BN BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_INTEGER_to_BN) +#define ASN1_NULL_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_NULL_free) +#define ASN1_NULL_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_NULL_it) +#define ASN1_NULL_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_NULL_new) +#define ASN1_OBJECT_create BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_OBJECT_create) +#define ASN1_OBJECT_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_OBJECT_free) +#define ASN1_OBJECT_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_OBJECT_it) +#define ASN1_OBJECT_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_OBJECT_new) +#define ASN1_OCTET_STRING_NDEF_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_OCTET_STRING_NDEF_it) +#define ASN1_OCTET_STRING_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_OCTET_STRING_cmp) +#define ASN1_OCTET_STRING_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_OCTET_STRING_dup) +#define ASN1_OCTET_STRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_OCTET_STRING_free) +#define ASN1_OCTET_STRING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_OCTET_STRING_it) +#define ASN1_OCTET_STRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_OCTET_STRING_new) +#define ASN1_OCTET_STRING_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_OCTET_STRING_set) +#define ASN1_PRINTABLESTRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_PRINTABLESTRING_free) +#define ASN1_PRINTABLESTRING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_PRINTABLESTRING_it) +#define ASN1_PRINTABLESTRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_PRINTABLESTRING_new) +#define ASN1_PRINTABLE_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_PRINTABLE_free) +#define ASN1_PRINTABLE_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_PRINTABLE_it) +#define ASN1_PRINTABLE_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_PRINTABLE_new) +#define ASN1_PRINTABLE_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_PRINTABLE_type) +#define ASN1_SEQUENCE_ANY_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_SEQUENCE_ANY_it) +#define ASN1_SEQUENCE_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_SEQUENCE_it) +#define ASN1_SET_ANY_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_SET_ANY_it) +#define ASN1_STRING_TABLE_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_TABLE_add) +#define ASN1_STRING_TABLE_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_TABLE_cleanup) +#define ASN1_STRING_TABLE_get BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_TABLE_get) +#define ASN1_STRING_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_cmp) +#define ASN1_STRING_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_copy) +#define ASN1_STRING_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_data) +#define ASN1_STRING_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_dup) +#define ASN1_STRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_free) +#define ASN1_STRING_get0_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_get0_data) +#define ASN1_STRING_get_default_mask BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_get_default_mask) +#define ASN1_STRING_length BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_length) +#define ASN1_STRING_length_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_length_set) +#define ASN1_STRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_new) +#define ASN1_STRING_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_print) +#define ASN1_STRING_print_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_print_ex) +#define ASN1_STRING_print_ex_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_print_ex_fp) +#define ASN1_STRING_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_set) +#define ASN1_STRING_set0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_set0) +#define ASN1_STRING_set_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_set_by_NID) +#define ASN1_STRING_set_default_mask BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_set_default_mask) +#define ASN1_STRING_set_default_mask_asc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_set_default_mask_asc) +#define ASN1_STRING_to_UTF8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_to_UTF8) +#define ASN1_STRING_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_type) +#define ASN1_STRING_type_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_type_new) +#define ASN1_T61STRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_T61STRING_free) +#define ASN1_T61STRING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_T61STRING_it) +#define ASN1_T61STRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_T61STRING_new) +#define ASN1_TBOOLEAN_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TBOOLEAN_it) +#define ASN1_TIME_adj BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TIME_adj) +#define ASN1_TIME_check BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TIME_check) +#define ASN1_TIME_diff BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TIME_diff) +#define ASN1_TIME_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TIME_free) +#define ASN1_TIME_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TIME_it) +#define ASN1_TIME_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TIME_new) +#define ASN1_TIME_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TIME_print) +#define ASN1_TIME_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TIME_set) +#define ASN1_TIME_set_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TIME_set_string) +#define ASN1_TIME_to_generalizedtime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TIME_to_generalizedtime) +#define ASN1_TYPE_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TYPE_cmp) +#define ASN1_TYPE_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TYPE_free) +#define ASN1_TYPE_get BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TYPE_get) +#define ASN1_TYPE_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TYPE_new) +#define ASN1_TYPE_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TYPE_set) +#define ASN1_TYPE_set1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_TYPE_set1) +#define ASN1_UNIVERSALSTRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_UNIVERSALSTRING_free) +#define ASN1_UNIVERSALSTRING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_UNIVERSALSTRING_it) +#define ASN1_UNIVERSALSTRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_UNIVERSALSTRING_new) +#define ASN1_UTCTIME_adj BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_UTCTIME_adj) +#define ASN1_UTCTIME_check BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_UTCTIME_check) +#define ASN1_UTCTIME_cmp_time_t BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_UTCTIME_cmp_time_t) +#define ASN1_UTCTIME_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_UTCTIME_free) +#define ASN1_UTCTIME_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_UTCTIME_it) +#define ASN1_UTCTIME_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_UTCTIME_new) +#define ASN1_UTCTIME_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_UTCTIME_print) +#define ASN1_UTCTIME_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_UTCTIME_set) +#define ASN1_UTCTIME_set_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_UTCTIME_set_string) +#define ASN1_UTF8STRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_UTF8STRING_free) +#define ASN1_UTF8STRING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_UTF8STRING_it) +#define ASN1_UTF8STRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_UTF8STRING_new) +#define ASN1_VISIBLESTRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_VISIBLESTRING_free) +#define ASN1_VISIBLESTRING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_VISIBLESTRING_it) +#define ASN1_VISIBLESTRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_VISIBLESTRING_new) +#define ASN1_digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_digest) +#define ASN1_generate_nconf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_generate_nconf) +#define ASN1_generate_v3 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_generate_v3) +#define ASN1_get_object BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_get_object) +#define ASN1_item_d2i BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_d2i) +#define ASN1_item_d2i_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_d2i_bio) +#define ASN1_item_d2i_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_d2i_fp) +#define ASN1_item_digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_digest) +#define ASN1_item_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_dup) +#define ASN1_item_ex_d2i BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_ex_d2i) +#define ASN1_item_ex_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_ex_free) +#define ASN1_item_ex_i2d BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_ex_i2d) +#define ASN1_item_ex_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_ex_new) +#define ASN1_item_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_free) +#define ASN1_item_i2d BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_i2d) +#define ASN1_item_i2d_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_i2d_bio) +#define ASN1_item_i2d_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_i2d_fp) +#define ASN1_item_ndef_i2d BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_ndef_i2d) +#define ASN1_item_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_new) +#define ASN1_item_pack BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_pack) +#define ASN1_item_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_sign) +#define ASN1_item_sign_ctx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_sign_ctx) +#define ASN1_item_unpack BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_unpack) +#define ASN1_item_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_item_verify) +#define ASN1_mbstring_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_mbstring_copy) +#define ASN1_mbstring_ncopy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_mbstring_ncopy) +#define ASN1_object_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_object_size) +#define ASN1_primitive_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_primitive_free) +#define ASN1_primitive_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_primitive_new) +#define ASN1_put_eoc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_put_eoc) +#define ASN1_put_object BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_put_object) +#define ASN1_tag2bit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_tag2bit) +#define ASN1_tag2str BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_tag2str) +#define ASN1_template_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_template_free) +#define ASN1_template_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_template_new) +#define AUTHORITY_INFO_ACCESS_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AUTHORITY_INFO_ACCESS_free) +#define AUTHORITY_INFO_ACCESS_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AUTHORITY_INFO_ACCESS_it) +#define AUTHORITY_INFO_ACCESS_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AUTHORITY_INFO_ACCESS_new) +#define AUTHORITY_KEYID_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AUTHORITY_KEYID_free) +#define AUTHORITY_KEYID_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AUTHORITY_KEYID_it) +#define AUTHORITY_KEYID_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, AUTHORITY_KEYID_new) +#define BASIC_CONSTRAINTS_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BASIC_CONSTRAINTS_free) +#define BASIC_CONSTRAINTS_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BASIC_CONSTRAINTS_it) +#define BASIC_CONSTRAINTS_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BASIC_CONSTRAINTS_new) +#define BIO_append_filename BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_append_filename) +#define BIO_callback_ctrl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_callback_ctrl) +#define BIO_clear_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_clear_flags) +#define BIO_clear_retry_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_clear_retry_flags) +#define BIO_copy_next_retry BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_copy_next_retry) +#define BIO_ctrl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_ctrl) +#define BIO_ctrl_get_read_request BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_ctrl_get_read_request) +#define BIO_ctrl_get_write_guarantee BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_ctrl_get_write_guarantee) +#define BIO_ctrl_pending BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_ctrl_pending) +#define BIO_do_connect BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_do_connect) +#define BIO_eof BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_eof) +#define BIO_find_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_find_type) +#define BIO_flush BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_flush) +#define BIO_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_free) +#define BIO_free_all BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_free_all) +#define BIO_get_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_get_data) +#define BIO_get_fd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_get_fd) +#define BIO_get_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_get_fp) +#define BIO_get_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_get_init) +#define BIO_get_mem_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_get_mem_data) +#define BIO_get_mem_ptr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_get_mem_ptr) +#define BIO_get_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_get_new_index) +#define BIO_get_retry_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_get_retry_flags) +#define BIO_get_retry_reason BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_get_retry_reason) +#define BIO_get_shutdown BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_get_shutdown) +#define BIO_gets BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_gets) +#define BIO_hexdump BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_hexdump) +#define BIO_indent BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_indent) +#define BIO_int_ctrl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_int_ctrl) +#define BIO_mem_contents BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_mem_contents) +#define BIO_meth_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_meth_free) +#define BIO_meth_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_meth_new) +#define BIO_meth_set_create BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_meth_set_create) +#define BIO_meth_set_ctrl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_meth_set_ctrl) +#define BIO_meth_set_destroy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_meth_set_destroy) +#define BIO_meth_set_gets BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_meth_set_gets) +#define BIO_meth_set_puts BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_meth_set_puts) +#define BIO_meth_set_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_meth_set_read) +#define BIO_meth_set_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_meth_set_write) +#define BIO_method_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_method_type) +#define BIO_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_new) +#define BIO_new_bio_pair BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_new_bio_pair) +#define BIO_new_connect BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_new_connect) +#define BIO_new_fd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_new_fd) +#define BIO_new_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_new_file) +#define BIO_new_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_new_fp) +#define BIO_new_mem_buf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_new_mem_buf) +#define BIO_new_socket BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_new_socket) +#define BIO_next BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_next) +#define BIO_number_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_number_read) +#define BIO_number_written BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_number_written) +#define BIO_pending BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_pending) +#define BIO_pop BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_pop) +#define BIO_printf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_printf) +#define BIO_ptr_ctrl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_ptr_ctrl) +#define BIO_push BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_push) +#define BIO_puts BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_puts) +#define BIO_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_read) +#define BIO_read_asn1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_read_asn1) +#define BIO_read_filename BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_read_filename) +#define BIO_reset BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_reset) +#define BIO_rw_filename BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_rw_filename) +#define BIO_s_connect BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_s_connect) +#define BIO_s_fd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_s_fd) +#define BIO_s_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_s_file) +#define BIO_s_mem BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_s_mem) +#define BIO_s_socket BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_s_socket) +#define BIO_set_close BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_close) +#define BIO_set_conn_hostname BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_conn_hostname) +#define BIO_set_conn_int_port BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_conn_int_port) +#define BIO_set_conn_port BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_conn_port) +#define BIO_set_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_data) +#define BIO_set_fd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_fd) +#define BIO_set_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_flags) +#define BIO_set_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_fp) +#define BIO_set_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_init) +#define BIO_set_mem_buf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_mem_buf) +#define BIO_set_mem_eof_return BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_mem_eof_return) +#define BIO_set_nbio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_nbio) +#define BIO_set_retry_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_retry_read) +#define BIO_set_retry_special BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_retry_special) +#define BIO_set_retry_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_retry_write) +#define BIO_set_shutdown BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_shutdown) +#define BIO_set_write_buffer_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_write_buffer_size) +#define BIO_should_io_special BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_should_io_special) +#define BIO_should_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_should_read) +#define BIO_should_retry BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_should_retry) +#define BIO_should_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_should_write) +#define BIO_shutdown_wr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_shutdown_wr) +#define BIO_snprintf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_snprintf) +#define BIO_test_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_test_flags) +#define BIO_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_up_ref) +#define BIO_vfree BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_vfree) +#define BIO_vsnprintf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_vsnprintf) +#define BIO_wpending BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_wpending) +#define BIO_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_write) +#define BIO_write_all BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_write_all) +#define BIO_write_filename BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_write_filename) +#define BN_BLINDING_convert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_BLINDING_convert) +#define BN_BLINDING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_BLINDING_free) +#define BN_BLINDING_invert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_BLINDING_invert) +#define BN_BLINDING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_BLINDING_new) +#define BN_CTX_end BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_CTX_end) +#define BN_CTX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_CTX_free) +#define BN_CTX_get BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_CTX_get) +#define BN_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_CTX_new) +#define BN_CTX_start BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_CTX_start) +#define BN_GENCB_call BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_GENCB_call) +#define BN_GENCB_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_GENCB_set) +#define BN_MONT_CTX_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_MONT_CTX_copy) +#define BN_MONT_CTX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_MONT_CTX_free) +#define BN_MONT_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_MONT_CTX_new) +#define BN_MONT_CTX_new_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_MONT_CTX_new_consttime) +#define BN_MONT_CTX_new_for_modulus BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_MONT_CTX_new_for_modulus) +#define BN_MONT_CTX_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_MONT_CTX_set) +#define BN_MONT_CTX_set_locked BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_MONT_CTX_set_locked) +#define BN_abs_is_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_abs_is_word) +#define BN_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_add) +#define BN_add_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_add_word) +#define BN_asc2bn BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_asc2bn) +#define BN_bin2bn BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_bin2bn) +#define BN_bn2bin BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_bn2bin) +#define BN_bn2bin_padded BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_bn2bin_padded) +#define BN_bn2binpad BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_bn2binpad) +#define BN_bn2cbb_padded BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_bn2cbb_padded) +#define BN_bn2dec BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_bn2dec) +#define BN_bn2hex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_bn2hex) +#define BN_bn2le_padded BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_bn2le_padded) +#define BN_bn2mpi BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_bn2mpi) +#define BN_clear BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_clear) +#define BN_clear_bit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_clear_bit) +#define BN_clear_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_clear_free) +#define BN_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_cmp) +#define BN_cmp_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_cmp_word) +#define BN_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_copy) +#define BN_count_low_zero_bits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_count_low_zero_bits) +#define BN_dec2bn BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_dec2bn) +#define BN_div BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_div) +#define BN_div_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_div_word) +#define BN_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_dup) +#define BN_enhanced_miller_rabin_primality_test BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_enhanced_miller_rabin_primality_test) +#define BN_equal_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_equal_consttime) +#define BN_exp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_exp) +#define BN_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_free) +#define BN_from_montgomery BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_from_montgomery) +#define BN_gcd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_gcd) +#define BN_generate_prime_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_generate_prime_ex) +#define BN_get_rfc3526_prime_1536 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_get_rfc3526_prime_1536) +#define BN_get_u64 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_get_u64) +#define BN_get_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_get_word) +#define BN_hex2bn BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_hex2bn) +#define BN_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_init) +#define BN_is_bit_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_is_bit_set) +#define BN_is_negative BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_is_negative) +#define BN_is_odd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_is_odd) +#define BN_is_one BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_is_one) +#define BN_is_pow2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_is_pow2) +#define BN_is_prime_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_is_prime_ex) +#define BN_is_prime_fasttest_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_is_prime_fasttest_ex) +#define BN_is_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_is_word) +#define BN_is_zero BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_is_zero) +#define BN_le2bn BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_le2bn) +#define BN_lshift BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_lshift) +#define BN_lshift1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_lshift1) +#define BN_marshal_asn1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_marshal_asn1) +#define BN_mask_bits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mask_bits) +#define BN_mod_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_add) +#define BN_mod_add_quick BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_add_quick) +#define BN_mod_exp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_exp) +#define BN_mod_exp2_mont BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_exp2_mont) +#define BN_mod_exp_mont BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_exp_mont) +#define BN_mod_exp_mont_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_exp_mont_consttime) +#define BN_mod_exp_mont_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_exp_mont_word) +#define BN_mod_inverse BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_inverse) +#define BN_mod_inverse_blinded BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_inverse_blinded) +#define BN_mod_inverse_odd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_inverse_odd) +#define BN_mod_lshift BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_lshift) +#define BN_mod_lshift1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_lshift1) +#define BN_mod_lshift1_quick BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_lshift1_quick) +#define BN_mod_lshift_quick BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_lshift_quick) +#define BN_mod_mul BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_mul) +#define BN_mod_mul_montgomery BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_mul_montgomery) +#define BN_mod_pow2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_pow2) +#define BN_mod_sqr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_sqr) +#define BN_mod_sqrt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_sqrt) +#define BN_mod_sub BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_sub) +#define BN_mod_sub_quick BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_sub_quick) +#define BN_mod_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mod_word) +#define BN_mpi2bn BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mpi2bn) +#define BN_mul BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mul) +#define BN_mul_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_mul_word) +#define BN_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_new) +#define BN_nnmod BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_nnmod) +#define BN_nnmod_pow2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_nnmod_pow2) +#define BN_num_bits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_num_bits) +#define BN_num_bits_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_num_bits_word) +#define BN_num_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_num_bytes) +#define BN_one BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_one) +#define BN_parse_asn1_unsigned BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_parse_asn1_unsigned) +#define BN_primality_test BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_primality_test) +#define BN_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_print) +#define BN_print_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_print_fp) +#define BN_pseudo_rand BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_pseudo_rand) +#define BN_pseudo_rand_range BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_pseudo_rand_range) +#define BN_rand BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_rand) +#define BN_rand_range BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_rand_range) +#define BN_rand_range_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_rand_range_ex) +#define BN_rshift BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_rshift) +#define BN_rshift1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_rshift1) +#define BN_set_bit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_set_bit) +#define BN_set_negative BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_set_negative) +#define BN_set_u64 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_set_u64) +#define BN_set_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_set_word) +#define BN_sqr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_sqr) +#define BN_sqrt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_sqrt) +#define BN_sub BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_sub) +#define BN_sub_word BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_sub_word) +#define BN_to_ASN1_ENUMERATED BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_to_ASN1_ENUMERATED) +#define BN_to_ASN1_INTEGER BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_to_ASN1_INTEGER) +#define BN_to_montgomery BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_to_montgomery) +#define BN_uadd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_uadd) +#define BN_ucmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_ucmp) +#define BN_usub BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_usub) +#define BN_value_one BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_value_one) +#define BN_zero BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BN_zero) +#define BORINGSSL_function_hit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BORINGSSL_function_hit) +#define BORINGSSL_self_test BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BORINGSSL_self_test) +#define BUF_MEM_append BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BUF_MEM_append) +#define BUF_MEM_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BUF_MEM_free) +#define BUF_MEM_grow BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BUF_MEM_grow) +#define BUF_MEM_grow_clean BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BUF_MEM_grow_clean) +#define BUF_MEM_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BUF_MEM_new) +#define BUF_MEM_reserve BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BUF_MEM_reserve) +#define BUF_memdup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BUF_memdup) +#define BUF_strdup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BUF_strdup) +#define BUF_strlcat BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BUF_strlcat) +#define BUF_strlcpy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BUF_strlcpy) +#define BUF_strndup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BUF_strndup) +#define BUF_strnlen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BUF_strnlen) +#define CBB_add_asn1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_asn1) +#define CBB_add_asn1_bool BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_asn1_bool) +#define CBB_add_asn1_int64 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_asn1_int64) +#define CBB_add_asn1_octet_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_asn1_octet_string) +#define CBB_add_asn1_oid_from_text BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_asn1_oid_from_text) +#define CBB_add_asn1_uint64 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_asn1_uint64) +#define CBB_add_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_bytes) +#define CBB_add_space BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_space) +#define CBB_add_u16 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_u16) +#define CBB_add_u16_length_prefixed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_u16_length_prefixed) +#define CBB_add_u16le BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_u16le) +#define CBB_add_u24 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_u24) +#define CBB_add_u24_length_prefixed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_u24_length_prefixed) +#define CBB_add_u32 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_u32) +#define CBB_add_u32le BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_u32le) +#define CBB_add_u64 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_u64) +#define CBB_add_u64le BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_u64le) +#define CBB_add_u8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_u8) +#define CBB_add_u8_length_prefixed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_add_u8_length_prefixed) +#define CBB_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_cleanup) +#define CBB_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_data) +#define CBB_did_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_did_write) +#define CBB_discard_child BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_discard_child) +#define CBB_finish BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_finish) +#define CBB_finish_i2d BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_finish_i2d) +#define CBB_flush BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_flush) +#define CBB_flush_asn1_set_of BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_flush_asn1_set_of) +#define CBB_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_init) +#define CBB_init_fixed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_init_fixed) +#define CBB_len BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_len) +#define CBB_reserve BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_reserve) +#define CBB_zero BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBB_zero) +#define CBS_asn1_ber_to_der BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_asn1_ber_to_der) +#define CBS_asn1_bitstring_has_bit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_asn1_bitstring_has_bit) +#define CBS_asn1_oid_to_text BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_asn1_oid_to_text) +#define CBS_contains_zero_byte BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_contains_zero_byte) +#define CBS_copy_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_copy_bytes) +#define CBS_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_data) +#define CBS_get_any_asn1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_any_asn1) +#define CBS_get_any_asn1_element BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_any_asn1_element) +#define CBS_get_any_ber_asn1_element BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_any_ber_asn1_element) +#define CBS_get_asn1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_asn1) +#define CBS_get_asn1_bool BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_asn1_bool) +#define CBS_get_asn1_element BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_asn1_element) +#define CBS_get_asn1_implicit_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_asn1_implicit_string) +#define CBS_get_asn1_int64 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_asn1_int64) +#define CBS_get_asn1_uint64 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_asn1_uint64) +#define CBS_get_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_bytes) +#define CBS_get_last_u8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_last_u8) +#define CBS_get_optional_asn1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_optional_asn1) +#define CBS_get_optional_asn1_bool BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_optional_asn1_bool) +#define CBS_get_optional_asn1_octet_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_optional_asn1_octet_string) +#define CBS_get_optional_asn1_uint64 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_optional_asn1_uint64) +#define CBS_get_u16 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_u16) +#define CBS_get_u16_length_prefixed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_u16_length_prefixed) +#define CBS_get_u16le BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_u16le) +#define CBS_get_u24 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_u24) +#define CBS_get_u24_length_prefixed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_u24_length_prefixed) +#define CBS_get_u32 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_u32) +#define CBS_get_u32le BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_u32le) +#define CBS_get_u64 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_u64) +#define CBS_get_u64le BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_u64le) +#define CBS_get_u8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_u8) +#define CBS_get_u8_length_prefixed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_u8_length_prefixed) +#define CBS_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_init) +#define CBS_is_valid_asn1_bitstring BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_is_valid_asn1_bitstring) +#define CBS_len BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_len) +#define CBS_mem_equal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_mem_equal) +#define CBS_peek_asn1_tag BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_peek_asn1_tag) +#define CBS_skip BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_skip) +#define CBS_stow BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_stow) +#define CBS_strdup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_strdup) +#define CERTIFICATEPOLICIES_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CERTIFICATEPOLICIES_free) +#define CERTIFICATEPOLICIES_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CERTIFICATEPOLICIES_it) +#define CERTIFICATEPOLICIES_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CERTIFICATEPOLICIES_new) +#define CMAC_CTX_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CMAC_CTX_copy) +#define CMAC_CTX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CMAC_CTX_free) +#define CMAC_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CMAC_CTX_new) +#define CMAC_Final BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CMAC_Final) +#define CMAC_Init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CMAC_Init) +#define CMAC_Reset BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CMAC_Reset) +#define CMAC_Update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CMAC_Update) +#define CONF_VALUE_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CONF_VALUE_new) +#define CONF_modules_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CONF_modules_free) +#define CONF_modules_load_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CONF_modules_load_file) +#define CONF_parse_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CONF_parse_list) +#define CRL_DIST_POINTS_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRL_DIST_POINTS_free) +#define CRL_DIST_POINTS_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRL_DIST_POINTS_it) +#define CRL_DIST_POINTS_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRL_DIST_POINTS_new) +#define CRYPTO_BUFFER_POOL_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_BUFFER_POOL_free) +#define CRYPTO_BUFFER_POOL_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_BUFFER_POOL_new) +#define CRYPTO_BUFFER_alloc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_BUFFER_alloc) +#define CRYPTO_BUFFER_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_BUFFER_data) +#define CRYPTO_BUFFER_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_BUFFER_free) +#define CRYPTO_BUFFER_init_CBS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_BUFFER_init_CBS) +#define CRYPTO_BUFFER_len BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_BUFFER_len) +#define CRYPTO_BUFFER_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_BUFFER_new) +#define CRYPTO_BUFFER_new_from_CBS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_BUFFER_new_from_CBS) +#define CRYPTO_BUFFER_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_BUFFER_up_ref) +#define CRYPTO_MUTEX_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_MUTEX_cleanup) +#define CRYPTO_MUTEX_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_MUTEX_init) +#define CRYPTO_MUTEX_lock_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_MUTEX_lock_read) +#define CRYPTO_MUTEX_lock_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_MUTEX_lock_write) +#define CRYPTO_MUTEX_unlock_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_MUTEX_unlock_read) +#define CRYPTO_MUTEX_unlock_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_MUTEX_unlock_write) +#define CRYPTO_POLYVAL_finish BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_POLYVAL_finish) +#define CRYPTO_POLYVAL_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_POLYVAL_init) +#define CRYPTO_POLYVAL_update_blocks BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_POLYVAL_update_blocks) +#define CRYPTO_STATIC_MUTEX_lock_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_STATIC_MUTEX_lock_read) +#define CRYPTO_STATIC_MUTEX_lock_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_STATIC_MUTEX_lock_write) +#define CRYPTO_STATIC_MUTEX_unlock_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_STATIC_MUTEX_unlock_read) +#define CRYPTO_STATIC_MUTEX_unlock_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_STATIC_MUTEX_unlock_write) +#define CRYPTO_THREADID_current BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_THREADID_current) +#define CRYPTO_THREADID_set_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_THREADID_set_callback) +#define CRYPTO_THREADID_set_numeric BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_THREADID_set_numeric) +#define CRYPTO_THREADID_set_pointer BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_THREADID_set_pointer) +#define CRYPTO_cbc128_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_cbc128_decrypt) +#define CRYPTO_cbc128_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_cbc128_encrypt) +#define CRYPTO_cfb128_1_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_cfb128_1_encrypt) +#define CRYPTO_cfb128_8_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_cfb128_8_encrypt) +#define CRYPTO_cfb128_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_cfb128_encrypt) +#define CRYPTO_chacha_20 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_chacha_20) +#define CRYPTO_cleanup_all_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_cleanup_all_ex_data) +#define CRYPTO_ctr128_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_ctr128_encrypt) +#define CRYPTO_ctr128_encrypt_ctr32 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_ctr128_encrypt_ctr32) +#define CRYPTO_free_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_free_ex_data) +#define CRYPTO_gcm128_aad BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_gcm128_aad) +#define CRYPTO_gcm128_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_gcm128_decrypt) +#define CRYPTO_gcm128_decrypt_ctr32 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_gcm128_decrypt_ctr32) +#define CRYPTO_gcm128_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_gcm128_encrypt) +#define CRYPTO_gcm128_encrypt_ctr32 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_gcm128_encrypt_ctr32) +#define CRYPTO_gcm128_finish BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_gcm128_finish) +#define CRYPTO_gcm128_init_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_gcm128_init_key) +#define CRYPTO_gcm128_setiv BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_gcm128_setiv) +#define CRYPTO_gcm128_tag BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_gcm128_tag) +#define CRYPTO_get_dynlock_create_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_get_dynlock_create_callback) +#define CRYPTO_get_dynlock_destroy_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_get_dynlock_destroy_callback) +#define CRYPTO_get_dynlock_lock_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_get_dynlock_lock_callback) +#define CRYPTO_get_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_get_ex_data) +#define CRYPTO_get_ex_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_get_ex_new_index) +#define CRYPTO_get_lock_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_get_lock_name) +#define CRYPTO_get_locking_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_get_locking_callback) +#define CRYPTO_get_thread_local BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_get_thread_local) +#define CRYPTO_ghash_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_ghash_init) +#define CRYPTO_has_asm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_has_asm) +#define CRYPTO_hchacha20 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_hchacha20) +#define CRYPTO_is_confidential_build BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_is_confidential_build) +#define CRYPTO_library_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_library_init) +#define CRYPTO_malloc_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_malloc_init) +#define CRYPTO_memcmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_memcmp) +#define CRYPTO_new_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_new_ex_data) +#define CRYPTO_num_locks BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_num_locks) +#define CRYPTO_ofb128_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_ofb128_encrypt) +#define CRYPTO_once BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_once) +#define CRYPTO_poly1305_finish BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_poly1305_finish) +#define CRYPTO_poly1305_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_poly1305_init) +#define CRYPTO_poly1305_update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_poly1305_update) +#define CRYPTO_rdrand BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_rdrand) +#define CRYPTO_rdrand_multiple8_buf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_rdrand_multiple8_buf) +#define CRYPTO_refcount_dec_and_test_zero BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_refcount_dec_and_test_zero) +#define CRYPTO_refcount_inc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_refcount_inc) +#define CRYPTO_set_add_lock_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_set_add_lock_callback) +#define CRYPTO_set_dynlock_create_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_set_dynlock_create_callback) +#define CRYPTO_set_dynlock_destroy_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_set_dynlock_destroy_callback) +#define CRYPTO_set_dynlock_lock_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_set_dynlock_lock_callback) +#define CRYPTO_set_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_set_ex_data) +#define CRYPTO_set_id_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_set_id_callback) +#define CRYPTO_set_locking_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_set_locking_callback) +#define CRYPTO_set_thread_local BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_set_thread_local) +#define CRYPTO_sysrand BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_sysrand) +#define CRYPTO_tls1_prf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_tls1_prf) +#define CTR_DRBG_clear BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CTR_DRBG_clear) +#define CTR_DRBG_generate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CTR_DRBG_generate) +#define CTR_DRBG_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CTR_DRBG_init) +#define CTR_DRBG_reseed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CTR_DRBG_reseed) +#define ChaCha20_ctr32 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ChaCha20_ctr32) +#define DES_decrypt3 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DES_decrypt3) +#define DES_ecb3_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DES_ecb3_encrypt) +#define DES_ecb_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DES_ecb_encrypt) +#define DES_ede2_cbc_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DES_ede2_cbc_encrypt) +#define DES_ede3_cbc_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DES_ede3_cbc_encrypt) +#define DES_encrypt3 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DES_encrypt3) +#define DES_ncbc_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DES_ncbc_encrypt) +#define DES_set_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DES_set_key) +#define DES_set_key_unchecked BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DES_set_key_unchecked) +#define DES_set_odd_parity BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DES_set_odd_parity) +#define DH_check BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_check) +#define DH_check_pub_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_check_pub_key) +#define DH_compute_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_compute_key) +#define DH_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_free) +#define DH_generate_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_generate_key) +#define DH_generate_parameters_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_generate_parameters_ex) +#define DH_get0_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_get0_key) +#define DH_get0_pqg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_get0_pqg) +#define DH_get_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_get_ex_data) +#define DH_get_ex_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_get_ex_new_index) +#define DH_marshal_parameters BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_marshal_parameters) +#define DH_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_new) +#define DH_num_bits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_num_bits) +#define DH_parse_parameters BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_parse_parameters) +#define DH_set0_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_set0_key) +#define DH_set0_pqg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_set0_pqg) +#define DH_set_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_set_ex_data) +#define DH_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_size) +#define DH_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DH_up_ref) +#define DHparams_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DHparams_dup) +#define DIRECTORYSTRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DIRECTORYSTRING_free) +#define DIRECTORYSTRING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DIRECTORYSTRING_it) +#define DIRECTORYSTRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DIRECTORYSTRING_new) +#define DISPLAYTEXT_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DISPLAYTEXT_free) +#define DISPLAYTEXT_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DISPLAYTEXT_it) +#define DISPLAYTEXT_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DISPLAYTEXT_new) +#define DIST_POINT_NAME_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DIST_POINT_NAME_free) +#define DIST_POINT_NAME_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DIST_POINT_NAME_it) +#define DIST_POINT_NAME_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DIST_POINT_NAME_new) +#define DIST_POINT_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DIST_POINT_free) +#define DIST_POINT_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DIST_POINT_it) +#define DIST_POINT_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DIST_POINT_new) +#define DIST_POINT_set_dpname BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DIST_POINT_set_dpname) +#define DSA_SIG_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_SIG_free) +#define DSA_SIG_marshal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_SIG_marshal) +#define DSA_SIG_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_SIG_new) +#define DSA_SIG_parse BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_SIG_parse) +#define DSA_check_signature BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_check_signature) +#define DSA_do_check_signature BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_do_check_signature) +#define DSA_do_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_do_sign) +#define DSA_do_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_do_verify) +#define DSA_dup_DH BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_dup_DH) +#define DSA_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_free) +#define DSA_generate_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_generate_key) +#define DSA_generate_parameters_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_generate_parameters_ex) +#define DSA_get0_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_get0_key) +#define DSA_get0_pqg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_get0_pqg) +#define DSA_get_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_get_ex_data) +#define DSA_get_ex_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_get_ex_new_index) +#define DSA_marshal_parameters BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_marshal_parameters) +#define DSA_marshal_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_marshal_private_key) +#define DSA_marshal_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_marshal_public_key) +#define DSA_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_new) +#define DSA_parse_parameters BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_parse_parameters) +#define DSA_parse_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_parse_private_key) +#define DSA_parse_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_parse_public_key) +#define DSA_set0_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_set0_key) +#define DSA_set0_pqg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_set0_pqg) +#define DSA_set_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_set_ex_data) +#define DSA_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_sign) +#define DSA_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_size) +#define DSA_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_up_ref) +#define DSA_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSA_verify) +#define DSAparams_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DSAparams_dup) +#define ECDH_compute_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDH_compute_key) +#define ECDH_compute_key_fips BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDH_compute_key_fips) +#define ECDSA_SIG_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDSA_SIG_free) +#define ECDSA_SIG_from_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDSA_SIG_from_bytes) +#define ECDSA_SIG_get0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDSA_SIG_get0) +#define ECDSA_SIG_marshal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDSA_SIG_marshal) +#define ECDSA_SIG_max_len BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDSA_SIG_max_len) +#define ECDSA_SIG_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDSA_SIG_new) +#define ECDSA_SIG_parse BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDSA_SIG_parse) +#define ECDSA_SIG_set0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDSA_SIG_set0) +#define ECDSA_SIG_to_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDSA_SIG_to_bytes) +#define ECDSA_do_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDSA_do_sign) +#define ECDSA_do_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDSA_do_verify) +#define ECDSA_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDSA_sign) +#define ECDSA_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDSA_size) +#define ECDSA_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ECDSA_verify) +#define EC_GFp_mont_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GFp_mont_method) +#define EC_GFp_nistp224_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GFp_nistp224_method) +#define EC_GFp_nistp256_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GFp_nistp256_method) +#define EC_GFp_nistz256_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GFp_nistz256_method) +#define EC_GROUP_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_cmp) +#define EC_GROUP_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_dup) +#define EC_GROUP_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_free) +#define EC_GROUP_get0_generator BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_get0_generator) +#define EC_GROUP_get0_order BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_get0_order) +#define EC_GROUP_get_cofactor BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_get_cofactor) +#define EC_GROUP_get_curve_GFp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_get_curve_GFp) +#define EC_GROUP_get_curve_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_get_curve_name) +#define EC_GROUP_get_degree BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_get_degree) +#define EC_GROUP_get_order BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_get_order) +#define EC_GROUP_method_of BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_method_of) +#define EC_GROUP_new_by_curve_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_new_by_curve_name) +#define EC_GROUP_new_curve_GFp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_new_curve_GFp) +#define EC_GROUP_order_bits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_order_bits) +#define EC_GROUP_set_asn1_flag BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_set_asn1_flag) +#define EC_GROUP_set_generator BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_set_generator) +#define EC_GROUP_set_point_conversion_form BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_GROUP_set_point_conversion_form) +#define EC_KEY_check_fips BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_check_fips) +#define EC_KEY_check_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_check_key) +#define EC_KEY_derive_from_secret BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_derive_from_secret) +#define EC_KEY_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_dup) +#define EC_KEY_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_free) +#define EC_KEY_generate_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_generate_key) +#define EC_KEY_generate_key_fips BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_generate_key_fips) +#define EC_KEY_get0_group BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_get0_group) +#define EC_KEY_get0_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_get0_private_key) +#define EC_KEY_get0_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_get0_public_key) +#define EC_KEY_get_conv_form BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_get_conv_form) +#define EC_KEY_get_enc_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_get_enc_flags) +#define EC_KEY_get_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_get_ex_data) +#define EC_KEY_get_ex_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_get_ex_new_index) +#define EC_KEY_is_opaque BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_is_opaque) +#define EC_KEY_key2buf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_key2buf) +#define EC_KEY_marshal_curve_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_marshal_curve_name) +#define EC_KEY_marshal_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_marshal_private_key) +#define EC_KEY_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_new) +#define EC_KEY_new_by_curve_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_new_by_curve_name) +#define EC_KEY_new_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_new_method) +#define EC_KEY_parse_curve_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_parse_curve_name) +#define EC_KEY_parse_parameters BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_parse_parameters) +#define EC_KEY_parse_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_parse_private_key) +#define EC_KEY_set_asn1_flag BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_set_asn1_flag) +#define EC_KEY_set_conv_form BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_set_conv_form) +#define EC_KEY_set_enc_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_set_enc_flags) +#define EC_KEY_set_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_set_ex_data) +#define EC_KEY_set_group BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_set_group) +#define EC_KEY_set_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_set_private_key) +#define EC_KEY_set_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_set_public_key) +#define EC_KEY_set_public_key_affine_coordinates BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_set_public_key_affine_coordinates) +#define EC_KEY_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_KEY_up_ref) +#define EC_METHOD_get_field_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_METHOD_get_field_type) +#define EC_POINT_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_add) +#define EC_POINT_clear_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_clear_free) +#define EC_POINT_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_cmp) +#define EC_POINT_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_copy) +#define EC_POINT_dbl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_dbl) +#define EC_POINT_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_dup) +#define EC_POINT_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_free) +#define EC_POINT_get_affine_coordinates_GFp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_get_affine_coordinates_GFp) +#define EC_POINT_invert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_invert) +#define EC_POINT_is_at_infinity BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_is_at_infinity) +#define EC_POINT_is_on_curve BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_is_on_curve) +#define EC_POINT_mul BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_mul) +#define EC_POINT_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_new) +#define EC_POINT_oct2point BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_oct2point) +#define EC_POINT_point2cbb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_point2cbb) +#define EC_POINT_point2oct BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_point2oct) +#define EC_POINT_set_affine_coordinates_GFp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_set_affine_coordinates_GFp) +#define EC_POINT_set_compressed_coordinates_GFp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_set_compressed_coordinates_GFp) +#define EC_POINT_set_to_infinity BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_POINT_set_to_infinity) +#define EC_curve_nid2nist BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_curve_nid2nist) +#define EC_curve_nist2nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_curve_nist2nid) +#define EC_get_builtin_curves BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EC_get_builtin_curves) +#define ED25519_keypair BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ED25519_keypair) +#define ED25519_keypair_from_seed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ED25519_keypair_from_seed) +#define ED25519_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ED25519_sign) +#define ED25519_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ED25519_verify) +#define EDIPARTYNAME_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EDIPARTYNAME_free) +#define EDIPARTYNAME_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EDIPARTYNAME_it) +#define EDIPARTYNAME_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EDIPARTYNAME_new) +#define ENGINE_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ENGINE_free) +#define ENGINE_get_ECDSA_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ENGINE_get_ECDSA_method) +#define ENGINE_get_RSA_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ENGINE_get_RSA_method) +#define ENGINE_load_builtin_engines BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ENGINE_load_builtin_engines) +#define ENGINE_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ENGINE_new) +#define ENGINE_register_all_complete BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ENGINE_register_all_complete) +#define ENGINE_set_ECDSA_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ENGINE_set_ECDSA_method) +#define ENGINE_set_RSA_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ENGINE_set_RSA_method) +#define ERR_SAVE_STATE_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_SAVE_STATE_free) +#define ERR_add_error_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_add_error_data) +#define ERR_add_error_dataf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_add_error_dataf) +#define ERR_clear_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_clear_error) +#define ERR_clear_system_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_clear_system_error) +#define ERR_error_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_error_string) +#define ERR_error_string_n BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_error_string_n) +#define ERR_free_strings BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_free_strings) +#define ERR_func_error_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_func_error_string) +#define ERR_get_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_get_error) +#define ERR_get_error_line BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_get_error_line) +#define ERR_get_error_line_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_get_error_line_data) +#define ERR_get_next_error_library BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_get_next_error_library) +#define ERR_lib_error_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_lib_error_string) +#define ERR_load_BIO_strings BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_load_BIO_strings) +#define ERR_load_ERR_strings BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_load_ERR_strings) +#define ERR_load_RAND_strings BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_load_RAND_strings) +#define ERR_load_crypto_strings BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_load_crypto_strings) +#define ERR_peek_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_peek_error) +#define ERR_peek_error_line BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_peek_error_line) +#define ERR_peek_error_line_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_peek_error_line_data) +#define ERR_peek_last_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_peek_last_error) +#define ERR_peek_last_error_line BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_peek_last_error_line) +#define ERR_peek_last_error_line_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_peek_last_error_line_data) +#define ERR_pop_to_mark BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_pop_to_mark) +#define ERR_print_errors BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_print_errors) +#define ERR_print_errors_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_print_errors_cb) +#define ERR_print_errors_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_print_errors_fp) +#define ERR_put_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_put_error) +#define ERR_reason_error_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_reason_error_string) +#define ERR_remove_state BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_remove_state) +#define ERR_remove_thread_state BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_remove_thread_state) +#define ERR_restore_state BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_restore_state) +#define ERR_save_state BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_save_state) +#define ERR_set_mark BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_set_mark) +#define EVP_AEAD_CTX_aead BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_CTX_aead) +#define EVP_AEAD_CTX_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_CTX_cleanup) +#define EVP_AEAD_CTX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_CTX_free) +#define EVP_AEAD_CTX_get_iv BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_CTX_get_iv) +#define EVP_AEAD_CTX_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_CTX_init) +#define EVP_AEAD_CTX_init_with_direction BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_CTX_init_with_direction) +#define EVP_AEAD_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_CTX_new) +#define EVP_AEAD_CTX_open BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_CTX_open) +#define EVP_AEAD_CTX_open_gather BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_CTX_open_gather) +#define EVP_AEAD_CTX_seal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_CTX_seal) +#define EVP_AEAD_CTX_seal_scatter BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_CTX_seal_scatter) +#define EVP_AEAD_CTX_tag_len BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_CTX_tag_len) +#define EVP_AEAD_CTX_zero BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_CTX_zero) +#define EVP_AEAD_key_length BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_key_length) +#define EVP_AEAD_max_overhead BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_max_overhead) +#define EVP_AEAD_max_tag_len BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_max_tag_len) +#define EVP_AEAD_nonce_length BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_AEAD_nonce_length) +#define EVP_BytesToKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_BytesToKey) +#define EVP_CIPHER_CTX_block_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_block_size) +#define EVP_CIPHER_CTX_cipher BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_cipher) +#define EVP_CIPHER_CTX_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_cleanup) +#define EVP_CIPHER_CTX_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_copy) +#define EVP_CIPHER_CTX_ctrl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_ctrl) +#define EVP_CIPHER_CTX_encrypting BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_encrypting) +#define EVP_CIPHER_CTX_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_flags) +#define EVP_CIPHER_CTX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_free) +#define EVP_CIPHER_CTX_get_app_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_get_app_data) +#define EVP_CIPHER_CTX_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_init) +#define EVP_CIPHER_CTX_iv_length BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_iv_length) +#define EVP_CIPHER_CTX_key_length BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_key_length) +#define EVP_CIPHER_CTX_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_mode) +#define EVP_CIPHER_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_new) +#define EVP_CIPHER_CTX_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_nid) +#define EVP_CIPHER_CTX_reset BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_reset) +#define EVP_CIPHER_CTX_set_app_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_set_app_data) +#define EVP_CIPHER_CTX_set_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_set_flags) +#define EVP_CIPHER_CTX_set_key_length BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_set_key_length) +#define EVP_CIPHER_CTX_set_padding BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_CTX_set_padding) +#define EVP_CIPHER_block_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_block_size) +#define EVP_CIPHER_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_flags) +#define EVP_CIPHER_iv_length BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_iv_length) +#define EVP_CIPHER_key_length BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_key_length) +#define EVP_CIPHER_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_mode) +#define EVP_CIPHER_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CIPHER_nid) +#define EVP_Cipher BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_Cipher) +#define EVP_CipherFinal_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CipherFinal_ex) +#define EVP_CipherInit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CipherInit) +#define EVP_CipherInit_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CipherInit_ex) +#define EVP_CipherUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_CipherUpdate) +#define EVP_DecodeBase64 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DecodeBase64) +#define EVP_DecodeBlock BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DecodeBlock) +#define EVP_DecodeFinal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DecodeFinal) +#define EVP_DecodeInit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DecodeInit) +#define EVP_DecodeUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DecodeUpdate) +#define EVP_DecodedLength BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DecodedLength) +#define EVP_DecryptFinal_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DecryptFinal_ex) +#define EVP_DecryptInit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DecryptInit) +#define EVP_DecryptInit_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DecryptInit_ex) +#define EVP_DecryptUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DecryptUpdate) +#define EVP_Digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_Digest) +#define EVP_DigestFinal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DigestFinal) +#define EVP_DigestFinalXOF BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DigestFinalXOF) +#define EVP_DigestFinal_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DigestFinal_ex) +#define EVP_DigestInit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DigestInit) +#define EVP_DigestInit_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DigestInit_ex) +#define EVP_DigestSign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DigestSign) +#define EVP_DigestSignFinal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DigestSignFinal) +#define EVP_DigestSignInit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DigestSignInit) +#define EVP_DigestSignUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DigestSignUpdate) +#define EVP_DigestUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DigestUpdate) +#define EVP_DigestVerify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DigestVerify) +#define EVP_DigestVerifyFinal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DigestVerifyFinal) +#define EVP_DigestVerifyInit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DigestVerifyInit) +#define EVP_DigestVerifyUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_DigestVerifyUpdate) +#define EVP_EncodeBlock BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_EncodeBlock) +#define EVP_EncodeFinal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_EncodeFinal) +#define EVP_EncodeInit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_EncodeInit) +#define EVP_EncodeUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_EncodeUpdate) +#define EVP_EncodedLength BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_EncodedLength) +#define EVP_EncryptFinal_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_EncryptFinal_ex) +#define EVP_EncryptInit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_EncryptInit) +#define EVP_EncryptInit_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_EncryptInit_ex) +#define EVP_EncryptUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_EncryptUpdate) +#define EVP_MD_CTX_block_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_CTX_block_size) +#define EVP_MD_CTX_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_CTX_cleanup) +#define EVP_MD_CTX_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_CTX_copy) +#define EVP_MD_CTX_copy_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_CTX_copy_ex) +#define EVP_MD_CTX_create BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_CTX_create) +#define EVP_MD_CTX_destroy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_CTX_destroy) +#define EVP_MD_CTX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_CTX_free) +#define EVP_MD_CTX_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_CTX_init) +#define EVP_MD_CTX_md BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_CTX_md) +#define EVP_MD_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_CTX_new) +#define EVP_MD_CTX_reset BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_CTX_reset) +#define EVP_MD_CTX_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_CTX_size) +#define EVP_MD_CTX_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_CTX_type) +#define EVP_MD_block_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_block_size) +#define EVP_MD_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_flags) +#define EVP_MD_meth_get_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_meth_get_flags) +#define EVP_MD_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_size) +#define EVP_MD_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_type) +#define EVP_PBE_scrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PBE_scrypt) +#define EVP_PKCS82PKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKCS82PKEY) +#define EVP_PKEY2PKCS8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY2PKCS8) +#define EVP_PKEY_CTX_ctrl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_ctrl) +#define EVP_PKEY_CTX_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_dup) +#define EVP_PKEY_CTX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_free) +#define EVP_PKEY_CTX_get0_pkey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_get0_pkey) +#define EVP_PKEY_CTX_get0_rsa_oaep_label BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_get0_rsa_oaep_label) +#define EVP_PKEY_CTX_get_rsa_mgf1_md BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_get_rsa_mgf1_md) +#define EVP_PKEY_CTX_get_rsa_oaep_md BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_get_rsa_oaep_md) +#define EVP_PKEY_CTX_get_rsa_padding BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_get_rsa_padding) +#define EVP_PKEY_CTX_get_rsa_pss_saltlen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_get_rsa_pss_saltlen) +#define EVP_PKEY_CTX_get_signature_md BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_get_signature_md) +#define EVP_PKEY_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_new) +#define EVP_PKEY_CTX_new_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_new_id) +#define EVP_PKEY_CTX_set0_rsa_oaep_label BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_set0_rsa_oaep_label) +#define EVP_PKEY_CTX_set_ec_param_enc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_set_ec_param_enc) +#define EVP_PKEY_CTX_set_ec_paramgen_curve_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_set_ec_paramgen_curve_nid) +#define EVP_PKEY_CTX_set_rsa_keygen_bits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_set_rsa_keygen_bits) +#define EVP_PKEY_CTX_set_rsa_keygen_pubexp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_set_rsa_keygen_pubexp) +#define EVP_PKEY_CTX_set_rsa_mgf1_md BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_set_rsa_mgf1_md) +#define EVP_PKEY_CTX_set_rsa_oaep_md BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_set_rsa_oaep_md) +#define EVP_PKEY_CTX_set_rsa_padding BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_set_rsa_padding) +#define EVP_PKEY_CTX_set_rsa_pss_keygen_md BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_set_rsa_pss_keygen_md) +#define EVP_PKEY_CTX_set_rsa_pss_keygen_mgf1_md BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_set_rsa_pss_keygen_mgf1_md) +#define EVP_PKEY_CTX_set_rsa_pss_keygen_saltlen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_set_rsa_pss_keygen_saltlen) +#define EVP_PKEY_CTX_set_rsa_pss_saltlen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_set_rsa_pss_saltlen) +#define EVP_PKEY_CTX_set_signature_md BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_set_signature_md) +#define EVP_PKEY_assign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_assign) +#define EVP_PKEY_assign_DSA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_assign_DSA) +#define EVP_PKEY_assign_EC_KEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_assign_EC_KEY) +#define EVP_PKEY_assign_RSA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_assign_RSA) +#define EVP_PKEY_base_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_base_id) +#define EVP_PKEY_bits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_bits) +#define EVP_PKEY_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_cmp) +#define EVP_PKEY_cmp_parameters BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_cmp_parameters) +#define EVP_PKEY_copy_parameters BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_copy_parameters) +#define EVP_PKEY_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_decrypt) +#define EVP_PKEY_decrypt_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_decrypt_init) +#define EVP_PKEY_derive BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_derive) +#define EVP_PKEY_derive_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_derive_init) +#define EVP_PKEY_derive_set_peer BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_derive_set_peer) +#define EVP_PKEY_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_encrypt) +#define EVP_PKEY_encrypt_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_encrypt_init) +#define EVP_PKEY_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_free) +#define EVP_PKEY_get0_DH BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_get0_DH) +#define EVP_PKEY_get0_DSA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_get0_DSA) +#define EVP_PKEY_get0_EC_KEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_get0_EC_KEY) +#define EVP_PKEY_get0_RSA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_get0_RSA) +#define EVP_PKEY_get1_DH BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_get1_DH) +#define EVP_PKEY_get1_DSA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_get1_DSA) +#define EVP_PKEY_get1_EC_KEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_get1_EC_KEY) +#define EVP_PKEY_get1_RSA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_get1_RSA) +#define EVP_PKEY_get1_tls_encodedpoint BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_get1_tls_encodedpoint) +#define EVP_PKEY_get_raw_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_get_raw_private_key) +#define EVP_PKEY_get_raw_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_get_raw_public_key) +#define EVP_PKEY_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_id) +#define EVP_PKEY_is_opaque BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_is_opaque) +#define EVP_PKEY_keygen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_keygen) +#define EVP_PKEY_keygen_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_keygen_init) +#define EVP_PKEY_missing_parameters BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_missing_parameters) +#define EVP_PKEY_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_new) +#define EVP_PKEY_new_raw_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_new_raw_private_key) +#define EVP_PKEY_new_raw_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_new_raw_public_key) +#define EVP_PKEY_paramgen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_paramgen) +#define EVP_PKEY_paramgen_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_paramgen_init) +#define EVP_PKEY_print_params BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_print_params) +#define EVP_PKEY_print_private BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_print_private) +#define EVP_PKEY_print_public BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_print_public) +#define EVP_PKEY_set1_DSA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_set1_DSA) +#define EVP_PKEY_set1_EC_KEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_set1_EC_KEY) +#define EVP_PKEY_set1_RSA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_set1_RSA) +#define EVP_PKEY_set1_tls_encodedpoint BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_set1_tls_encodedpoint) +#define EVP_PKEY_set_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_set_type) +#define EVP_PKEY_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_sign) +#define EVP_PKEY_sign_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_sign_init) +#define EVP_PKEY_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_size) +#define EVP_PKEY_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_type) +#define EVP_PKEY_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_up_ref) +#define EVP_PKEY_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_verify) +#define EVP_PKEY_verify_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_verify_init) +#define EVP_PKEY_verify_recover BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_verify_recover) +#define EVP_PKEY_verify_recover_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_verify_recover_init) +#define EVP_SignFinal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_SignFinal) +#define EVP_SignInit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_SignInit) +#define EVP_SignInit_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_SignInit_ex) +#define EVP_SignUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_SignUpdate) +#define EVP_VerifyFinal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_VerifyFinal) +#define EVP_VerifyInit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_VerifyInit) +#define EVP_VerifyInit_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_VerifyInit_ex) +#define EVP_VerifyUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_VerifyUpdate) +#define EVP_add_cipher_alias BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_add_cipher_alias) +#define EVP_add_digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_add_digest) +#define EVP_aead_aes_128_cbc_sha1_tls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_128_cbc_sha1_tls) +#define EVP_aead_aes_128_cbc_sha1_tls_implicit_iv BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_128_cbc_sha1_tls_implicit_iv) +#define EVP_aead_aes_128_cbc_sha256_tls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_128_cbc_sha256_tls) +#define EVP_aead_aes_128_ccm_bluetooth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_128_ccm_bluetooth) +#define EVP_aead_aes_128_ccm_bluetooth_8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_128_ccm_bluetooth_8) +#define EVP_aead_aes_128_ctr_hmac_sha256 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_128_ctr_hmac_sha256) +#define EVP_aead_aes_128_gcm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_128_gcm) +#define EVP_aead_aes_128_gcm_siv BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_128_gcm_siv) +#define EVP_aead_aes_128_gcm_tls12 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_128_gcm_tls12) +#define EVP_aead_aes_128_gcm_tls13 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_128_gcm_tls13) +#define EVP_aead_aes_192_gcm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_192_gcm) +#define EVP_aead_aes_256_cbc_sha1_tls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_256_cbc_sha1_tls) +#define EVP_aead_aes_256_cbc_sha1_tls_implicit_iv BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_256_cbc_sha1_tls_implicit_iv) +#define EVP_aead_aes_256_cbc_sha256_tls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_256_cbc_sha256_tls) +#define EVP_aead_aes_256_cbc_sha384_tls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_256_cbc_sha384_tls) +#define EVP_aead_aes_256_ctr_hmac_sha256 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_256_ctr_hmac_sha256) +#define EVP_aead_aes_256_gcm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_256_gcm) +#define EVP_aead_aes_256_gcm_siv BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_256_gcm_siv) +#define EVP_aead_aes_256_gcm_tls12 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_256_gcm_tls12) +#define EVP_aead_aes_256_gcm_tls13 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_aes_256_gcm_tls13) +#define EVP_aead_chacha20_poly1305 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_chacha20_poly1305) +#define EVP_aead_des_ede3_cbc_sha1_tls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_des_ede3_cbc_sha1_tls) +#define EVP_aead_des_ede3_cbc_sha1_tls_implicit_iv BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_des_ede3_cbc_sha1_tls_implicit_iv) +#define EVP_aead_null_sha1_tls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_null_sha1_tls) +#define EVP_aead_xchacha20_poly1305 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aead_xchacha20_poly1305) +#define EVP_aes_128_cbc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_128_cbc) +#define EVP_aes_128_ctr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_128_ctr) +#define EVP_aes_128_ecb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_128_ecb) +#define EVP_aes_128_gcm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_128_gcm) +#define EVP_aes_128_ofb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_128_ofb) +#define EVP_aes_192_cbc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_192_cbc) +#define EVP_aes_192_ctr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_192_ctr) +#define EVP_aes_192_ecb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_192_ecb) +#define EVP_aes_192_gcm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_192_gcm) +#define EVP_aes_192_ofb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_192_ofb) +#define EVP_aes_256_cbc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_256_cbc) +#define EVP_aes_256_ctr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_256_ctr) +#define EVP_aes_256_ecb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_256_ecb) +#define EVP_aes_256_gcm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_256_gcm) +#define EVP_aes_256_ofb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_aes_256_ofb) +#define EVP_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_cleanup) +#define EVP_des_cbc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_des_cbc) +#define EVP_des_ecb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_des_ecb) +#define EVP_des_ede BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_des_ede) +#define EVP_des_ede3 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_des_ede3) +#define EVP_des_ede3_cbc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_des_ede3_cbc) +#define EVP_des_ede3_ecb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_des_ede3_ecb) +#define EVP_des_ede_cbc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_des_ede_cbc) +#define EVP_enc_null BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_enc_null) +#define EVP_get_cipherbyname BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_get_cipherbyname) +#define EVP_get_cipherbynid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_get_cipherbynid) +#define EVP_get_digestbyname BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_get_digestbyname) +#define EVP_get_digestbynid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_get_digestbynid) +#define EVP_get_digestbyobj BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_get_digestbyobj) +#define EVP_has_aes_hardware BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_has_aes_hardware) +#define EVP_marshal_digest_algorithm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_marshal_digest_algorithm) +#define EVP_marshal_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_marshal_private_key) +#define EVP_marshal_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_marshal_public_key) +#define EVP_md4 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_md4) +#define EVP_md5 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_md5) +#define EVP_md5_sha1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_md5_sha1) +#define EVP_parse_digest_algorithm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_parse_digest_algorithm) +#define EVP_parse_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_parse_private_key) +#define EVP_parse_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_parse_public_key) +#define EVP_rc2_40_cbc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_rc2_40_cbc) +#define EVP_rc2_cbc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_rc2_cbc) +#define EVP_rc4 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_rc4) +#define EVP_sha1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_sha1) +#define EVP_sha224 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_sha224) +#define EVP_sha256 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_sha256) +#define EVP_sha384 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_sha384) +#define EVP_sha512 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_sha512) +#define EVP_tls_cbc_copy_mac BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_tls_cbc_copy_mac) +#define EVP_tls_cbc_digest_record BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_tls_cbc_digest_record) +#define EVP_tls_cbc_record_digest_supported BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_tls_cbc_record_digest_supported) +#define EVP_tls_cbc_remove_padding BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_tls_cbc_remove_padding) +#define EXTENDED_KEY_USAGE_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EXTENDED_KEY_USAGE_free) +#define EXTENDED_KEY_USAGE_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EXTENDED_KEY_USAGE_it) +#define EXTENDED_KEY_USAGE_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EXTENDED_KEY_USAGE_new) +#define FIPS_mode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, FIPS_mode) +#define FIPS_mode_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, FIPS_mode_set) +#define GENERAL_NAMES_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_NAMES_free) +#define GENERAL_NAMES_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_NAMES_it) +#define GENERAL_NAMES_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_NAMES_new) +#define GENERAL_NAME_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_NAME_cmp) +#define GENERAL_NAME_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_NAME_dup) +#define GENERAL_NAME_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_NAME_free) +#define GENERAL_NAME_get0_otherName BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_NAME_get0_otherName) +#define GENERAL_NAME_get0_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_NAME_get0_value) +#define GENERAL_NAME_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_NAME_it) +#define GENERAL_NAME_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_NAME_new) +#define GENERAL_NAME_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_NAME_print) +#define GENERAL_NAME_set0_othername BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_NAME_set0_othername) +#define GENERAL_NAME_set0_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_NAME_set0_value) +#define GENERAL_SUBTREE_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_SUBTREE_free) +#define GENERAL_SUBTREE_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_SUBTREE_it) +#define GENERAL_SUBTREE_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, GENERAL_SUBTREE_new) +#define HKDF BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HKDF) +#define HKDF_expand BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HKDF_expand) +#define HKDF_extract BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HKDF_extract) +#define HMAC BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HMAC) +#define HMAC_CTX_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HMAC_CTX_cleanup) +#define HMAC_CTX_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HMAC_CTX_copy) +#define HMAC_CTX_copy_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HMAC_CTX_copy_ex) +#define HMAC_CTX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HMAC_CTX_free) +#define HMAC_CTX_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HMAC_CTX_init) +#define HMAC_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HMAC_CTX_new) +#define HMAC_CTX_reset BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HMAC_CTX_reset) +#define HMAC_Final BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HMAC_Final) +#define HMAC_Init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HMAC_Init) +#define HMAC_Init_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HMAC_Init_ex) +#define HMAC_Update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HMAC_Update) +#define HMAC_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HMAC_size) +#define HRSS_decap BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HRSS_decap) +#define HRSS_encap BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HRSS_encap) +#define HRSS_generate_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HRSS_generate_key) +#define HRSS_marshal_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HRSS_marshal_public_key) +#define HRSS_parse_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HRSS_parse_public_key) +#define HRSS_poly3_invert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HRSS_poly3_invert) +#define HRSS_poly3_mul BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, HRSS_poly3_mul) +#define ISSUING_DIST_POINT_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ISSUING_DIST_POINT_free) +#define ISSUING_DIST_POINT_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ISSUING_DIST_POINT_it) +#define ISSUING_DIST_POINT_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ISSUING_DIST_POINT_new) +#define MD4 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, MD4) +#define MD4_Final BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, MD4_Final) +#define MD4_Init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, MD4_Init) +#define MD4_Transform BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, MD4_Transform) +#define MD4_Update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, MD4_Update) +#define MD5 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, MD5) +#define MD5_Final BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, MD5_Final) +#define MD5_Init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, MD5_Init) +#define MD5_Transform BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, MD5_Transform) +#define MD5_Update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, MD5_Update) +#define METHOD_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, METHOD_ref) +#define METHOD_unref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, METHOD_unref) +#define NAME_CONSTRAINTS_check BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NAME_CONSTRAINTS_check) +#define NAME_CONSTRAINTS_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NAME_CONSTRAINTS_free) +#define NAME_CONSTRAINTS_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NAME_CONSTRAINTS_it) +#define NAME_CONSTRAINTS_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NAME_CONSTRAINTS_new) +#define NCONF_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NCONF_free) +#define NCONF_get_section BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NCONF_get_section) +#define NCONF_get_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NCONF_get_string) +#define NCONF_load BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NCONF_load) +#define NCONF_load_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NCONF_load_bio) +#define NCONF_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NCONF_new) +#define NETSCAPE_SPKAC_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NETSCAPE_SPKAC_free) +#define NETSCAPE_SPKAC_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NETSCAPE_SPKAC_it) +#define NETSCAPE_SPKAC_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NETSCAPE_SPKAC_new) +#define NETSCAPE_SPKI_b64_decode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NETSCAPE_SPKI_b64_decode) +#define NETSCAPE_SPKI_b64_encode BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NETSCAPE_SPKI_b64_encode) +#define NETSCAPE_SPKI_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NETSCAPE_SPKI_free) +#define NETSCAPE_SPKI_get_pubkey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NETSCAPE_SPKI_get_pubkey) +#define NETSCAPE_SPKI_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NETSCAPE_SPKI_it) +#define NETSCAPE_SPKI_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NETSCAPE_SPKI_new) +#define NETSCAPE_SPKI_set_pubkey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NETSCAPE_SPKI_set_pubkey) +#define NETSCAPE_SPKI_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NETSCAPE_SPKI_sign) +#define NETSCAPE_SPKI_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NETSCAPE_SPKI_verify) +#define NOTICEREF_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NOTICEREF_free) +#define NOTICEREF_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NOTICEREF_it) +#define NOTICEREF_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, NOTICEREF_new) +#define OBJ_cbs2nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_cbs2nid) +#define OBJ_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_cleanup) +#define OBJ_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_cmp) +#define OBJ_create BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_create) +#define OBJ_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_dup) +#define OBJ_find_sigid_algs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_find_sigid_algs) +#define OBJ_find_sigid_by_algs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_find_sigid_by_algs) +#define OBJ_get0_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_get0_data) +#define OBJ_length BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_length) +#define OBJ_ln2nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_ln2nid) +#define OBJ_nid2cbb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_nid2cbb) +#define OBJ_nid2ln BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_nid2ln) +#define OBJ_nid2obj BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_nid2obj) +#define OBJ_nid2sn BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_nid2sn) +#define OBJ_obj2nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_obj2nid) +#define OBJ_obj2txt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_obj2txt) +#define OBJ_sn2nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_sn2nid) +#define OBJ_txt2nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_txt2nid) +#define OBJ_txt2obj BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OBJ_txt2obj) +#define OPENSSL_add_all_algorithms_conf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_add_all_algorithms_conf) +#define OPENSSL_built_in_curves BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_built_in_curves) +#define OPENSSL_cleanse BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_cleanse) +#define OPENSSL_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_cleanup) +#define OPENSSL_clear_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_clear_free) +#define OPENSSL_config BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_config) +#define OPENSSL_cpuid_setup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_cpuid_setup) +#define OPENSSL_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_free) +#define OPENSSL_gmtime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_gmtime) +#define OPENSSL_gmtime_adj BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_gmtime_adj) +#define OPENSSL_gmtime_diff BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_gmtime_diff) +#define OPENSSL_hash32 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_hash32) +#define OPENSSL_ia32cap_P BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_ia32cap_P) +#define OPENSSL_init_crypto BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_init_crypto) +#define OPENSSL_load_builtin_modules BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_load_builtin_modules) +#define OPENSSL_malloc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_malloc) +#define OPENSSL_malloc_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_malloc_init) +#define OPENSSL_memdup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_memdup) +#define OPENSSL_no_config BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_no_config) +#define OPENSSL_realloc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_realloc) +#define OPENSSL_strcasecmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_strcasecmp) +#define OPENSSL_strdup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_strdup) +#define OPENSSL_strlcat BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_strlcat) +#define OPENSSL_strlcpy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_strlcpy) +#define OPENSSL_strncasecmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_strncasecmp) +#define OPENSSL_strndup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_strndup) +#define OPENSSL_strnlen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_strnlen) +#define OPENSSL_tolower BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_tolower) +#define OTHERNAME_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OTHERNAME_cmp) +#define OTHERNAME_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OTHERNAME_free) +#define OTHERNAME_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OTHERNAME_it) +#define OTHERNAME_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OTHERNAME_new) +#define OpenSSL_add_all_algorithms BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OpenSSL_add_all_algorithms) +#define OpenSSL_add_all_ciphers BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OpenSSL_add_all_ciphers) +#define OpenSSL_add_all_digests BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OpenSSL_add_all_digests) +#define OpenSSL_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OpenSSL_version) +#define OpenSSL_version_num BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OpenSSL_version_num) +#define PEM_ASN1_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_ASN1_read) +#define PEM_ASN1_read_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_ASN1_read_bio) +#define PEM_ASN1_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_ASN1_write) +#define PEM_ASN1_write_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_ASN1_write_bio) +#define PEM_X509_INFO_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_X509_INFO_read) +#define PEM_X509_INFO_read_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_X509_INFO_read_bio) +#define PEM_X509_INFO_write_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_X509_INFO_write_bio) +#define PEM_bytes_read_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_bytes_read_bio) +#define PEM_def_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_def_callback) +#define PEM_dek_info BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_dek_info) +#define PEM_do_header BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_do_header) +#define PEM_get_EVP_CIPHER_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_get_EVP_CIPHER_INFO) +#define PEM_proc_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_proc_type) +#define PEM_read BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read) +#define PEM_read_DHparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_DHparams) +#define PEM_read_DSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_DSAPrivateKey) +#define PEM_read_DSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_DSA_PUBKEY) +#define PEM_read_DSAparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_DSAparams) +#define PEM_read_ECPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_ECPrivateKey) +#define PEM_read_EC_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_EC_PUBKEY) +#define PEM_read_PKCS7 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_PKCS7) +#define PEM_read_PKCS8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_PKCS8) +#define PEM_read_PKCS8_PRIV_KEY_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_PKCS8_PRIV_KEY_INFO) +#define PEM_read_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_PUBKEY) +#define PEM_read_PrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_PrivateKey) +#define PEM_read_RSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_RSAPrivateKey) +#define PEM_read_RSAPublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_RSAPublicKey) +#define PEM_read_RSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_RSA_PUBKEY) +#define PEM_read_X509 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_X509) +#define PEM_read_X509_AUX BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_X509_AUX) +#define PEM_read_X509_CRL BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_X509_CRL) +#define PEM_read_X509_REQ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_X509_REQ) +#define PEM_read_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio) +#define PEM_read_bio_DHparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_DHparams) +#define PEM_read_bio_DSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_DSAPrivateKey) +#define PEM_read_bio_DSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_DSA_PUBKEY) +#define PEM_read_bio_DSAparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_DSAparams) +#define PEM_read_bio_ECPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_ECPrivateKey) +#define PEM_read_bio_EC_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_EC_PUBKEY) +#define PEM_read_bio_PKCS7 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_PKCS7) +#define PEM_read_bio_PKCS8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_PKCS8) +#define PEM_read_bio_PKCS8_PRIV_KEY_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_PKCS8_PRIV_KEY_INFO) +#define PEM_read_bio_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_PUBKEY) +#define PEM_read_bio_PrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_PrivateKey) +#define PEM_read_bio_RSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_RSAPrivateKey) +#define PEM_read_bio_RSAPublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_RSAPublicKey) +#define PEM_read_bio_RSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_RSA_PUBKEY) +#define PEM_read_bio_X509 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_X509) +#define PEM_read_bio_X509_AUX BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_X509_AUX) +#define PEM_read_bio_X509_CRL BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_X509_CRL) +#define PEM_read_bio_X509_REQ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_read_bio_X509_REQ) +#define PEM_write BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write) +#define PEM_write_DHparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_DHparams) +#define PEM_write_DSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_DSAPrivateKey) +#define PEM_write_DSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_DSA_PUBKEY) +#define PEM_write_DSAparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_DSAparams) +#define PEM_write_ECPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_ECPrivateKey) +#define PEM_write_EC_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_EC_PUBKEY) +#define PEM_write_PKCS7 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_PKCS7) +#define PEM_write_PKCS8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_PKCS8) +#define PEM_write_PKCS8PrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_PKCS8PrivateKey) +#define PEM_write_PKCS8PrivateKey_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_PKCS8PrivateKey_nid) +#define PEM_write_PKCS8_PRIV_KEY_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_PKCS8_PRIV_KEY_INFO) +#define PEM_write_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_PUBKEY) +#define PEM_write_PrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_PrivateKey) +#define PEM_write_RSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_RSAPrivateKey) +#define PEM_write_RSAPublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_RSAPublicKey) +#define PEM_write_RSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_RSA_PUBKEY) +#define PEM_write_X509 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_X509) +#define PEM_write_X509_AUX BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_X509_AUX) +#define PEM_write_X509_CRL BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_X509_CRL) +#define PEM_write_X509_REQ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_X509_REQ) +#define PEM_write_X509_REQ_NEW BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_X509_REQ_NEW) +#define PEM_write_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio) +#define PEM_write_bio_DHparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_DHparams) +#define PEM_write_bio_DSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_DSAPrivateKey) +#define PEM_write_bio_DSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_DSA_PUBKEY) +#define PEM_write_bio_DSAparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_DSAparams) +#define PEM_write_bio_ECPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_ECPrivateKey) +#define PEM_write_bio_EC_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_EC_PUBKEY) +#define PEM_write_bio_PKCS7 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_PKCS7) +#define PEM_write_bio_PKCS8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_PKCS8) +#define PEM_write_bio_PKCS8PrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_PKCS8PrivateKey) +#define PEM_write_bio_PKCS8PrivateKey_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_PKCS8PrivateKey_nid) +#define PEM_write_bio_PKCS8_PRIV_KEY_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_PKCS8_PRIV_KEY_INFO) +#define PEM_write_bio_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_PUBKEY) +#define PEM_write_bio_PrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_PrivateKey) +#define PEM_write_bio_RSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_RSAPrivateKey) +#define PEM_write_bio_RSAPublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_RSAPublicKey) +#define PEM_write_bio_RSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_RSA_PUBKEY) +#define PEM_write_bio_X509 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_X509) +#define PEM_write_bio_X509_AUX BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_X509_AUX) +#define PEM_write_bio_X509_CRL BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_X509_CRL) +#define PEM_write_bio_X509_REQ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_X509_REQ) +#define PEM_write_bio_X509_REQ_NEW BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PEM_write_bio_X509_REQ_NEW) +#define PKCS12_PBE_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS12_PBE_add) +#define PKCS12_create BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS12_create) +#define PKCS12_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS12_free) +#define PKCS12_get_key_and_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS12_get_key_and_certs) +#define PKCS12_parse BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS12_parse) +#define PKCS12_verify_mac BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS12_verify_mac) +#define PKCS5_PBKDF2_HMAC BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS5_PBKDF2_HMAC) +#define PKCS5_PBKDF2_HMAC_SHA1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS5_PBKDF2_HMAC_SHA1) +#define PKCS5_pbe2_decrypt_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS5_pbe2_decrypt_init) +#define PKCS5_pbe2_encrypt_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS5_pbe2_encrypt_init) +#define PKCS7_bundle_CRLs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS7_bundle_CRLs) +#define PKCS7_bundle_certificates BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS7_bundle_certificates) +#define PKCS7_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS7_free) +#define PKCS7_get_CRLs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS7_get_CRLs) +#define PKCS7_get_PEM_CRLs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS7_get_PEM_CRLs) +#define PKCS7_get_PEM_certificates BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS7_get_PEM_certificates) +#define PKCS7_get_certificates BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS7_get_certificates) +#define PKCS7_get_raw_certificates BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS7_get_raw_certificates) +#define PKCS7_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS7_sign) +#define PKCS7_type_is_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS7_type_is_data) +#define PKCS7_type_is_digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS7_type_is_digest) +#define PKCS7_type_is_encrypted BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS7_type_is_encrypted) +#define PKCS7_type_is_enveloped BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS7_type_is_enveloped) +#define PKCS7_type_is_signed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS7_type_is_signed) +#define PKCS7_type_is_signedAndEnveloped BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS7_type_is_signedAndEnveloped) +#define PKCS8_PRIV_KEY_INFO_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS8_PRIV_KEY_INFO_free) +#define PKCS8_PRIV_KEY_INFO_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS8_PRIV_KEY_INFO_it) +#define PKCS8_PRIV_KEY_INFO_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS8_PRIV_KEY_INFO_new) +#define PKCS8_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS8_decrypt) +#define PKCS8_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS8_encrypt) +#define PKCS8_marshal_encrypted_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS8_marshal_encrypted_private_key) +#define PKCS8_parse_encrypted_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS8_parse_encrypted_private_key) +#define PKCS8_pkey_get0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS8_pkey_get0) +#define PKCS8_pkey_set0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKCS8_pkey_set0) +#define PKEY_USAGE_PERIOD_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKEY_USAGE_PERIOD_free) +#define PKEY_USAGE_PERIOD_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKEY_USAGE_PERIOD_it) +#define PKEY_USAGE_PERIOD_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PKEY_USAGE_PERIOD_new) +#define POLICYINFO_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, POLICYINFO_free) +#define POLICYINFO_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, POLICYINFO_it) +#define POLICYINFO_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, POLICYINFO_new) +#define POLICYQUALINFO_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, POLICYQUALINFO_free) +#define POLICYQUALINFO_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, POLICYQUALINFO_it) +#define POLICYQUALINFO_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, POLICYQUALINFO_new) +#define POLICY_CONSTRAINTS_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, POLICY_CONSTRAINTS_free) +#define POLICY_CONSTRAINTS_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, POLICY_CONSTRAINTS_it) +#define POLICY_CONSTRAINTS_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, POLICY_CONSTRAINTS_new) +#define POLICY_MAPPINGS_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, POLICY_MAPPINGS_it) +#define POLICY_MAPPING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, POLICY_MAPPING_free) +#define POLICY_MAPPING_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, POLICY_MAPPING_it) +#define POLICY_MAPPING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, POLICY_MAPPING_new) +#define PROXY_CERT_INFO_EXTENSION_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PROXY_CERT_INFO_EXTENSION_free) +#define PROXY_CERT_INFO_EXTENSION_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PROXY_CERT_INFO_EXTENSION_it) +#define PROXY_CERT_INFO_EXTENSION_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PROXY_CERT_INFO_EXTENSION_new) +#define PROXY_POLICY_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PROXY_POLICY_free) +#define PROXY_POLICY_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PROXY_POLICY_it) +#define PROXY_POLICY_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, PROXY_POLICY_new) +#define RAND_SSLeay BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_SSLeay) +#define RAND_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_add) +#define RAND_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_bytes) +#define RAND_bytes_with_additional_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_bytes_with_additional_data) +#define RAND_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_cleanup) +#define RAND_egd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_egd) +#define RAND_enable_fork_unsafe_buffering BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_enable_fork_unsafe_buffering) +#define RAND_file_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_file_name) +#define RAND_get_rand_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_get_rand_method) +#define RAND_load_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_load_file) +#define RAND_poll BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_poll) +#define RAND_pseudo_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_pseudo_bytes) +#define RAND_seed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_seed) +#define RAND_set_rand_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_set_rand_method) +#define RAND_set_urandom_fd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_set_urandom_fd) +#define RAND_status BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_status) +#define RC4 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RC4) +#define RC4_set_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RC4_set_key) +#define RSAPrivateKey_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSAPrivateKey_dup) +#define RSAPublicKey_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSAPublicKey_dup) +#define RSAZ_1024_mod_exp_avx2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSAZ_1024_mod_exp_avx2) +#define RSA_PSS_PARAMS_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_PSS_PARAMS_free) +#define RSA_PSS_PARAMS_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_PSS_PARAMS_it) +#define RSA_PSS_PARAMS_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_PSS_PARAMS_new) +#define RSA_add_pkcs1_prefix BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_add_pkcs1_prefix) +#define RSA_bits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_bits) +#define RSA_blinding_on BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_blinding_on) +#define RSA_check_fips BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_check_fips) +#define RSA_check_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_check_key) +#define RSA_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_decrypt) +#define RSA_default_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_default_method) +#define RSA_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_encrypt) +#define RSA_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_flags) +#define RSA_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_free) +#define RSA_generate_key_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_generate_key_ex) +#define RSA_generate_key_fips BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_generate_key_fips) +#define RSA_get0_crt_params BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_get0_crt_params) +#define RSA_get0_factors BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_get0_factors) +#define RSA_get0_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_get0_key) +#define RSA_get_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_get_ex_data) +#define RSA_get_ex_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_get_ex_new_index) +#define RSA_is_opaque BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_is_opaque) +#define RSA_marshal_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_marshal_private_key) +#define RSA_marshal_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_marshal_public_key) +#define RSA_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_new) +#define RSA_new_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_new_method) +#define RSA_padding_add_PKCS1_OAEP_mgf1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_padding_add_PKCS1_OAEP_mgf1) +#define RSA_padding_add_PKCS1_PSS_mgf1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_padding_add_PKCS1_PSS_mgf1) +#define RSA_padding_add_PKCS1_type_1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_padding_add_PKCS1_type_1) +#define RSA_padding_add_PKCS1_type_2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_padding_add_PKCS1_type_2) +#define RSA_padding_add_none BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_padding_add_none) +#define RSA_padding_check_PKCS1_OAEP_mgf1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_padding_check_PKCS1_OAEP_mgf1) +#define RSA_padding_check_PKCS1_type_1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_padding_check_PKCS1_type_1) +#define RSA_padding_check_PKCS1_type_2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_padding_check_PKCS1_type_2) +#define RSA_parse_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_parse_private_key) +#define RSA_parse_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_parse_public_key) +#define RSA_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_print) +#define RSA_private_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_private_decrypt) +#define RSA_private_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_private_encrypt) +#define RSA_private_key_from_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_private_key_from_bytes) +#define RSA_private_key_to_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_private_key_to_bytes) +#define RSA_private_transform BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_private_transform) +#define RSA_public_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_public_decrypt) +#define RSA_public_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_public_encrypt) +#define RSA_public_key_from_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_public_key_from_bytes) +#define RSA_public_key_to_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_public_key_to_bytes) +#define RSA_set0_crt_params BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_set0_crt_params) +#define RSA_set0_factors BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_set0_factors) +#define RSA_set0_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_set0_key) +#define RSA_set_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_set_ex_data) +#define RSA_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_sign) +#define RSA_sign_pss_mgf1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_sign_pss_mgf1) +#define RSA_sign_raw BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_sign_raw) +#define RSA_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_size) +#define RSA_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_up_ref) +#define RSA_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_verify) +#define RSA_verify_PKCS1_PSS_mgf1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_verify_PKCS1_PSS_mgf1) +#define RSA_verify_pss_mgf1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_verify_pss_mgf1) +#define RSA_verify_raw BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_verify_raw) +#define SHA1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA1) +#define SHA1_Final BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA1_Final) +#define SHA1_Init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA1_Init) +#define SHA1_Transform BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA1_Transform) +#define SHA1_Update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA1_Update) +#define SHA224 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA224) +#define SHA224_Final BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA224_Final) +#define SHA224_Init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA224_Init) +#define SHA224_Update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA224_Update) +#define SHA256 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA256) +#define SHA256_Final BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA256_Final) +#define SHA256_Init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA256_Init) +#define SHA256_Transform BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA256_Transform) +#define SHA256_TransformBlocks BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA256_TransformBlocks) +#define SHA256_Update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA256_Update) +#define SHA384 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA384) +#define SHA384_Final BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA384_Final) +#define SHA384_Init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA384_Init) +#define SHA384_Update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA384_Update) +#define SHA512 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA512) +#define SHA512_Final BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA512_Final) +#define SHA512_Init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA512_Init) +#define SHA512_Transform BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA512_Transform) +#define SHA512_Update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SHA512_Update) +#define SIPHASH_24 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SIPHASH_24) +#define SPAKE2_CTX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SPAKE2_CTX_free) +#define SPAKE2_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SPAKE2_CTX_new) +#define SPAKE2_generate_msg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SPAKE2_generate_msg) +#define SPAKE2_process_msg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SPAKE2_process_msg) +#define SSLeay BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSLeay) +#define SSLeay_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSLeay_version) +#define SXNETID_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SXNETID_free) +#define SXNETID_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SXNETID_it) +#define SXNETID_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SXNETID_new) +#define SXNET_add_id_INTEGER BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SXNET_add_id_INTEGER) +#define SXNET_add_id_asc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SXNET_add_id_asc) +#define SXNET_add_id_ulong BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SXNET_add_id_ulong) +#define SXNET_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SXNET_free) +#define SXNET_get_id_INTEGER BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SXNET_get_id_INTEGER) +#define SXNET_get_id_asc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SXNET_get_id_asc) +#define SXNET_get_id_ulong BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SXNET_get_id_ulong) +#define SXNET_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SXNET_it) +#define SXNET_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SXNET_new) +#define USERNOTICE_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, USERNOTICE_free) +#define USERNOTICE_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, USERNOTICE_it) +#define USERNOTICE_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, USERNOTICE_new) +#define UTF8_getc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, UTF8_getc) +#define UTF8_putc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, UTF8_putc) +#define X25519 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X25519) +#define X25519_keypair BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X25519_keypair) +#define X25519_public_from_private BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X25519_public_from_private) +#define X509V3_EXT_CRL_add_nconf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_CRL_add_nconf) +#define X509V3_EXT_REQ_add_nconf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_REQ_add_nconf) +#define X509V3_EXT_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_add) +#define X509V3_EXT_add_alias BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_add_alias) +#define X509V3_EXT_add_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_add_list) +#define X509V3_EXT_add_nconf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_add_nconf) +#define X509V3_EXT_add_nconf_sk BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_add_nconf_sk) +#define X509V3_EXT_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_cleanup) +#define X509V3_EXT_d2i BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_d2i) +#define X509V3_EXT_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_free) +#define X509V3_EXT_get BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_get) +#define X509V3_EXT_get_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_get_nid) +#define X509V3_EXT_i2d BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_i2d) +#define X509V3_EXT_nconf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_nconf) +#define X509V3_EXT_nconf_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_nconf_nid) +#define X509V3_EXT_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_print) +#define X509V3_EXT_print_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_print_fp) +#define X509V3_EXT_val_prn BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_EXT_val_prn) +#define X509V3_NAME_from_section BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_NAME_from_section) +#define X509V3_add1_i2d BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_add1_i2d) +#define X509V3_add_standard_extensions BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_add_standard_extensions) +#define X509V3_add_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_add_value) +#define X509V3_add_value_bool BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_add_value_bool) +#define X509V3_add_value_bool_nf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_add_value_bool_nf) +#define X509V3_add_value_int BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_add_value_int) +#define X509V3_add_value_uchar BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_add_value_uchar) +#define X509V3_conf_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_conf_free) +#define X509V3_extensions_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_extensions_print) +#define X509V3_get_d2i BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_get_d2i) +#define X509V3_get_section BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_get_section) +#define X509V3_get_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_get_string) +#define X509V3_get_value_bool BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_get_value_bool) +#define X509V3_get_value_int BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_get_value_int) +#define X509V3_parse_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_parse_list) +#define X509V3_section_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_section_free) +#define X509V3_set_ctx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_set_ctx) +#define X509V3_set_nconf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_set_nconf) +#define X509V3_string_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509V3_string_free) +#define X509_ALGORS_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ALGORS_it) +#define X509_ALGOR_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ALGOR_cmp) +#define X509_ALGOR_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ALGOR_dup) +#define X509_ALGOR_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ALGOR_free) +#define X509_ALGOR_get0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ALGOR_get0) +#define X509_ALGOR_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ALGOR_it) +#define X509_ALGOR_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ALGOR_new) +#define X509_ALGOR_set0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ALGOR_set0) +#define X509_ALGOR_set_md BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ALGOR_set_md) +#define X509_ATTRIBUTE_SET_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ATTRIBUTE_SET_it) +#define X509_ATTRIBUTE_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ATTRIBUTE_count) +#define X509_ATTRIBUTE_create BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ATTRIBUTE_create) +#define X509_ATTRIBUTE_create_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ATTRIBUTE_create_by_NID) +#define X509_ATTRIBUTE_create_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ATTRIBUTE_create_by_OBJ) +#define X509_ATTRIBUTE_create_by_txt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ATTRIBUTE_create_by_txt) +#define X509_ATTRIBUTE_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ATTRIBUTE_dup) +#define X509_ATTRIBUTE_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ATTRIBUTE_free) +#define X509_ATTRIBUTE_get0_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ATTRIBUTE_get0_data) +#define X509_ATTRIBUTE_get0_object BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ATTRIBUTE_get0_object) +#define X509_ATTRIBUTE_get0_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ATTRIBUTE_get0_type) +#define X509_ATTRIBUTE_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ATTRIBUTE_it) +#define X509_ATTRIBUTE_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ATTRIBUTE_new) +#define X509_ATTRIBUTE_set1_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ATTRIBUTE_set1_data) +#define X509_ATTRIBUTE_set1_object BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ATTRIBUTE_set1_object) +#define X509_CERT_AUX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CERT_AUX_free) +#define X509_CERT_AUX_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CERT_AUX_it) +#define X509_CERT_AUX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CERT_AUX_new) +#define X509_CERT_AUX_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CERT_AUX_print) +#define X509_CINF_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CINF_free) +#define X509_CINF_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CINF_it) +#define X509_CINF_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CINF_new) +#define X509_CRL_INFO_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_INFO_free) +#define X509_CRL_INFO_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_INFO_it) +#define X509_CRL_INFO_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_INFO_new) +#define X509_CRL_METHOD_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_METHOD_free) +#define X509_CRL_METHOD_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_METHOD_new) +#define X509_CRL_add0_revoked BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_add0_revoked) +#define X509_CRL_add1_ext_i2d BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_add1_ext_i2d) +#define X509_CRL_add_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_add_ext) +#define X509_CRL_check_suiteb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_check_suiteb) +#define X509_CRL_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_cmp) +#define X509_CRL_delete_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_delete_ext) +#define X509_CRL_diff BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_diff) +#define X509_CRL_digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_digest) +#define X509_CRL_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_dup) +#define X509_CRL_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_free) +#define X509_CRL_get0_by_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_get0_by_cert) +#define X509_CRL_get0_by_serial BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_get0_by_serial) +#define X509_CRL_get0_lastUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_get0_lastUpdate) +#define X509_CRL_get0_nextUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_get0_nextUpdate) +#define X509_CRL_get0_signature BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_get0_signature) +#define X509_CRL_get_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_get_ext) +#define X509_CRL_get_ext_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_get_ext_by_NID) +#define X509_CRL_get_ext_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_get_ext_by_OBJ) +#define X509_CRL_get_ext_by_critical BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_get_ext_by_critical) +#define X509_CRL_get_ext_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_get_ext_count) +#define X509_CRL_get_ext_d2i BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_get_ext_d2i) +#define X509_CRL_get_meth_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_get_meth_data) +#define X509_CRL_get_signature_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_get_signature_nid) +#define X509_CRL_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_it) +#define X509_CRL_match BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_match) +#define X509_CRL_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_new) +#define X509_CRL_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_print) +#define X509_CRL_print_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_print_fp) +#define X509_CRL_set_default_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_set_default_method) +#define X509_CRL_set_issuer_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_set_issuer_name) +#define X509_CRL_set_lastUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_set_lastUpdate) +#define X509_CRL_set_meth_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_set_meth_data) +#define X509_CRL_set_nextUpdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_set_nextUpdate) +#define X509_CRL_set_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_set_version) +#define X509_CRL_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_sign) +#define X509_CRL_sign_ctx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_sign_ctx) +#define X509_CRL_sort BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_sort) +#define X509_CRL_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_up_ref) +#define X509_CRL_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_CRL_verify) +#define X509_EXTENSIONS_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_EXTENSIONS_it) +#define X509_EXTENSION_create_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_EXTENSION_create_by_NID) +#define X509_EXTENSION_create_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_EXTENSION_create_by_OBJ) +#define X509_EXTENSION_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_EXTENSION_dup) +#define X509_EXTENSION_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_EXTENSION_free) +#define X509_EXTENSION_get_critical BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_EXTENSION_get_critical) +#define X509_EXTENSION_get_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_EXTENSION_get_data) +#define X509_EXTENSION_get_object BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_EXTENSION_get_object) +#define X509_EXTENSION_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_EXTENSION_it) +#define X509_EXTENSION_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_EXTENSION_new) +#define X509_EXTENSION_set_critical BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_EXTENSION_set_critical) +#define X509_EXTENSION_set_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_EXTENSION_set_data) +#define X509_EXTENSION_set_object BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_EXTENSION_set_object) +#define X509_INFO_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_INFO_free) +#define X509_INFO_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_INFO_new) +#define X509_LOOKUP_by_alias BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_LOOKUP_by_alias) +#define X509_LOOKUP_by_fingerprint BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_LOOKUP_by_fingerprint) +#define X509_LOOKUP_by_issuer_serial BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_LOOKUP_by_issuer_serial) +#define X509_LOOKUP_by_subject BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_LOOKUP_by_subject) +#define X509_LOOKUP_ctrl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_LOOKUP_ctrl) +#define X509_LOOKUP_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_LOOKUP_file) +#define X509_LOOKUP_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_LOOKUP_free) +#define X509_LOOKUP_hash_dir BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_LOOKUP_hash_dir) +#define X509_LOOKUP_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_LOOKUP_init) +#define X509_LOOKUP_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_LOOKUP_new) +#define X509_LOOKUP_shutdown BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_LOOKUP_shutdown) +#define X509_NAME_ENTRIES_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_ENTRIES_it) +#define X509_NAME_ENTRY_create_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_ENTRY_create_by_NID) +#define X509_NAME_ENTRY_create_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_ENTRY_create_by_OBJ) +#define X509_NAME_ENTRY_create_by_txt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_ENTRY_create_by_txt) +#define X509_NAME_ENTRY_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_ENTRY_dup) +#define X509_NAME_ENTRY_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_ENTRY_free) +#define X509_NAME_ENTRY_get_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_ENTRY_get_data) +#define X509_NAME_ENTRY_get_object BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_ENTRY_get_object) +#define X509_NAME_ENTRY_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_ENTRY_it) +#define X509_NAME_ENTRY_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_ENTRY_new) +#define X509_NAME_ENTRY_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_ENTRY_set) +#define X509_NAME_ENTRY_set_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_ENTRY_set_data) +#define X509_NAME_ENTRY_set_object BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_ENTRY_set_object) +#define X509_NAME_INTERNAL_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_INTERNAL_it) +#define X509_NAME_add_entry BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_add_entry) +#define X509_NAME_add_entry_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_add_entry_by_NID) +#define X509_NAME_add_entry_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_add_entry_by_OBJ) +#define X509_NAME_add_entry_by_txt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_add_entry_by_txt) +#define X509_NAME_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_cmp) +#define X509_NAME_delete_entry BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_delete_entry) +#define X509_NAME_digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_digest) +#define X509_NAME_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_dup) +#define X509_NAME_entry_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_entry_count) +#define X509_NAME_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_free) +#define X509_NAME_get0_der BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_get0_der) +#define X509_NAME_get_entry BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_get_entry) +#define X509_NAME_get_index_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_get_index_by_NID) +#define X509_NAME_get_index_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_get_index_by_OBJ) +#define X509_NAME_get_text_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_get_text_by_NID) +#define X509_NAME_get_text_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_get_text_by_OBJ) +#define X509_NAME_hash BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_hash) +#define X509_NAME_hash_old BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_hash_old) +#define X509_NAME_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_it) +#define X509_NAME_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_new) +#define X509_NAME_oneline BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_oneline) +#define X509_NAME_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_print) +#define X509_NAME_print_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_print_ex) +#define X509_NAME_print_ex_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_print_ex_fp) +#define X509_NAME_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_NAME_set) +#define X509_OBJECT_free_contents BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_OBJECT_free_contents) +#define X509_OBJECT_get0_X509 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_OBJECT_get0_X509) +#define X509_OBJECT_get_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_OBJECT_get_type) +#define X509_OBJECT_idx_by_subject BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_OBJECT_idx_by_subject) +#define X509_OBJECT_retrieve_by_subject BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_OBJECT_retrieve_by_subject) +#define X509_OBJECT_retrieve_match BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_OBJECT_retrieve_match) +#define X509_OBJECT_up_ref_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_OBJECT_up_ref_count) +#define X509_PKEY_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PKEY_free) +#define X509_PKEY_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PKEY_new) +#define X509_POLICY_NODE_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_POLICY_NODE_print) +#define X509_PUBKEY_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PUBKEY_free) +#define X509_PUBKEY_get BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PUBKEY_get) +#define X509_PUBKEY_get0_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PUBKEY_get0_param) +#define X509_PUBKEY_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PUBKEY_it) +#define X509_PUBKEY_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PUBKEY_new) +#define X509_PUBKEY_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PUBKEY_set) +#define X509_PUBKEY_set0_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PUBKEY_set0_param) +#define X509_PURPOSE_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PURPOSE_add) +#define X509_PURPOSE_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PURPOSE_cleanup) +#define X509_PURPOSE_get0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PURPOSE_get0) +#define X509_PURPOSE_get0_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PURPOSE_get0_name) +#define X509_PURPOSE_get0_sname BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PURPOSE_get0_sname) +#define X509_PURPOSE_get_by_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PURPOSE_get_by_id) +#define X509_PURPOSE_get_by_sname BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PURPOSE_get_by_sname) +#define X509_PURPOSE_get_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PURPOSE_get_count) +#define X509_PURPOSE_get_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PURPOSE_get_id) +#define X509_PURPOSE_get_trust BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PURPOSE_get_trust) +#define X509_PURPOSE_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_PURPOSE_set) +#define X509_REQ_INFO_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_INFO_free) +#define X509_REQ_INFO_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_INFO_it) +#define X509_REQ_INFO_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_INFO_new) +#define X509_REQ_add1_attr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_add1_attr) +#define X509_REQ_add1_attr_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_add1_attr_by_NID) +#define X509_REQ_add1_attr_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_add1_attr_by_OBJ) +#define X509_REQ_add1_attr_by_txt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_add1_attr_by_txt) +#define X509_REQ_add_extensions BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_add_extensions) +#define X509_REQ_add_extensions_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_add_extensions_nid) +#define X509_REQ_check_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_check_private_key) +#define X509_REQ_delete_attr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_delete_attr) +#define X509_REQ_digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_digest) +#define X509_REQ_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_dup) +#define X509_REQ_extension_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_extension_nid) +#define X509_REQ_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_free) +#define X509_REQ_get0_signature BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_get0_signature) +#define X509_REQ_get1_email BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_get1_email) +#define X509_REQ_get_attr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_get_attr) +#define X509_REQ_get_attr_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_get_attr_by_NID) +#define X509_REQ_get_attr_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_get_attr_by_OBJ) +#define X509_REQ_get_attr_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_get_attr_count) +#define X509_REQ_get_extension_nids BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_get_extension_nids) +#define X509_REQ_get_extensions BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_get_extensions) +#define X509_REQ_get_pubkey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_get_pubkey) +#define X509_REQ_get_signature_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_get_signature_nid) +#define X509_REQ_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_it) +#define X509_REQ_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_new) +#define X509_REQ_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_print) +#define X509_REQ_print_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_print_ex) +#define X509_REQ_print_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_print_fp) +#define X509_REQ_set_extension_nids BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_set_extension_nids) +#define X509_REQ_set_pubkey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_set_pubkey) +#define X509_REQ_set_subject_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_set_subject_name) +#define X509_REQ_set_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_set_version) +#define X509_REQ_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_sign) +#define X509_REQ_sign_ctx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_sign_ctx) +#define X509_REQ_to_X509 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_to_X509) +#define X509_REQ_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REQ_verify) +#define X509_REVOKED_add1_ext_i2d BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_add1_ext_i2d) +#define X509_REVOKED_add_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_add_ext) +#define X509_REVOKED_delete_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_delete_ext) +#define X509_REVOKED_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_dup) +#define X509_REVOKED_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_free) +#define X509_REVOKED_get0_revocationDate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_get0_revocationDate) +#define X509_REVOKED_get0_serialNumber BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_get0_serialNumber) +#define X509_REVOKED_get_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_get_ext) +#define X509_REVOKED_get_ext_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_get_ext_by_NID) +#define X509_REVOKED_get_ext_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_get_ext_by_OBJ) +#define X509_REVOKED_get_ext_by_critical BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_get_ext_by_critical) +#define X509_REVOKED_get_ext_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_get_ext_count) +#define X509_REVOKED_get_ext_d2i BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_get_ext_d2i) +#define X509_REVOKED_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_it) +#define X509_REVOKED_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_new) +#define X509_REVOKED_set_revocationDate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_set_revocationDate) +#define X509_REVOKED_set_serialNumber BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_REVOKED_set_serialNumber) +#define X509_SIG_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_SIG_free) +#define X509_SIG_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_SIG_it) +#define X509_SIG_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_SIG_new) +#define X509_STORE_CTX_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_cleanup) +#define X509_STORE_CTX_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_free) +#define X509_STORE_CTX_get0_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get0_cert) +#define X509_STORE_CTX_get0_current_crl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get0_current_crl) +#define X509_STORE_CTX_get0_current_issuer BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get0_current_issuer) +#define X509_STORE_CTX_get0_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get0_param) +#define X509_STORE_CTX_get0_parent_ctx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get0_parent_ctx) +#define X509_STORE_CTX_get0_policy_tree BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get0_policy_tree) +#define X509_STORE_CTX_get0_store BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get0_store) +#define X509_STORE_CTX_get0_untrusted BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get0_untrusted) +#define X509_STORE_CTX_get1_chain BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get1_chain) +#define X509_STORE_CTX_get1_issuer BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get1_issuer) +#define X509_STORE_CTX_get_chain BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get_chain) +#define X509_STORE_CTX_get_current_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get_current_cert) +#define X509_STORE_CTX_get_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get_error) +#define X509_STORE_CTX_get_error_depth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get_error_depth) +#define X509_STORE_CTX_get_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get_ex_data) +#define X509_STORE_CTX_get_ex_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get_ex_new_index) +#define X509_STORE_CTX_get_explicit_policy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_get_explicit_policy) +#define X509_STORE_CTX_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_init) +#define X509_STORE_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_new) +#define X509_STORE_CTX_purpose_inherit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_purpose_inherit) +#define X509_STORE_CTX_set0_crls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_set0_crls) +#define X509_STORE_CTX_set0_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_set0_param) +#define X509_STORE_CTX_set_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_set_cert) +#define X509_STORE_CTX_set_chain BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_set_chain) +#define X509_STORE_CTX_set_default BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_set_default) +#define X509_STORE_CTX_set_depth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_set_depth) +#define X509_STORE_CTX_set_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_set_error) +#define X509_STORE_CTX_set_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_set_ex_data) +#define X509_STORE_CTX_set_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_set_flags) +#define X509_STORE_CTX_set_purpose BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_set_purpose) +#define X509_STORE_CTX_set_time BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_set_time) +#define X509_STORE_CTX_set_trust BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_set_trust) +#define X509_STORE_CTX_set_verify_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_set_verify_cb) +#define X509_STORE_CTX_trusted_stack BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_trusted_stack) +#define X509_STORE_CTX_zero BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_CTX_zero) +#define X509_STORE_add_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_add_cert) +#define X509_STORE_add_crl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_add_crl) +#define X509_STORE_add_lookup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_add_lookup) +#define X509_STORE_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_free) +#define X509_STORE_get0_objects BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get0_objects) +#define X509_STORE_get0_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get0_param) +#define X509_STORE_get1_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get1_certs) +#define X509_STORE_get1_crls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get1_crls) +#define X509_STORE_get_by_subject BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get_by_subject) +#define X509_STORE_get_cert_crl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get_cert_crl) +#define X509_STORE_get_check_crl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get_check_crl) +#define X509_STORE_get_check_issued BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get_check_issued) +#define X509_STORE_get_check_revocation BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get_check_revocation) +#define X509_STORE_get_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get_cleanup) +#define X509_STORE_get_get_crl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get_get_crl) +#define X509_STORE_get_get_issuer BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get_get_issuer) +#define X509_STORE_get_lookup_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get_lookup_certs) +#define X509_STORE_get_lookup_crls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get_lookup_crls) +#define X509_STORE_get_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get_verify) +#define X509_STORE_get_verify_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_get_verify_cb) +#define X509_STORE_load_locations BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_load_locations) +#define X509_STORE_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_new) +#define X509_STORE_set0_additional_untrusted BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set0_additional_untrusted) +#define X509_STORE_set1_param BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set1_param) +#define X509_STORE_set_cert_crl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_cert_crl) +#define X509_STORE_set_check_crl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_check_crl) +#define X509_STORE_set_check_issued BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_check_issued) +#define X509_STORE_set_check_revocation BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_check_revocation) +#define X509_STORE_set_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_cleanup) +#define X509_STORE_set_default_paths BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_default_paths) +#define X509_STORE_set_depth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_depth) +#define X509_STORE_set_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_flags) +#define X509_STORE_set_get_crl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_get_crl) +#define X509_STORE_set_get_issuer BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_get_issuer) +#define X509_STORE_set_lookup_certs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_lookup_certs) +#define X509_STORE_set_lookup_crls BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_lookup_crls) +#define X509_STORE_set_purpose BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_purpose) +#define X509_STORE_set_trust BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_trust) +#define X509_STORE_set_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_verify) +#define X509_STORE_set_verify_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_set_verify_cb) +#define X509_STORE_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_STORE_up_ref) +#define X509_TRUST_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_TRUST_add) +#define X509_TRUST_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_TRUST_cleanup) +#define X509_TRUST_get0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_TRUST_get0) +#define X509_TRUST_get0_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_TRUST_get0_name) +#define X509_TRUST_get_by_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_TRUST_get_by_id) +#define X509_TRUST_get_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_TRUST_get_count) +#define X509_TRUST_get_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_TRUST_get_flags) +#define X509_TRUST_get_trust BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_TRUST_get_trust) +#define X509_TRUST_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_TRUST_set) +#define X509_TRUST_set_default BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_TRUST_set_default) +#define X509_VAL_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VAL_free) +#define X509_VAL_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VAL_it) +#define X509_VAL_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VAL_new) +#define X509_VERIFY_PARAM_add0_policy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_add0_policy) +#define X509_VERIFY_PARAM_add0_table BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_add0_table) +#define X509_VERIFY_PARAM_add1_host BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_add1_host) +#define X509_VERIFY_PARAM_clear_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_clear_flags) +#define X509_VERIFY_PARAM_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_free) +#define X509_VERIFY_PARAM_get0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_get0) +#define X509_VERIFY_PARAM_get0_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_get0_name) +#define X509_VERIFY_PARAM_get0_peername BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_get0_peername) +#define X509_VERIFY_PARAM_get_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_get_count) +#define X509_VERIFY_PARAM_get_depth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_get_depth) +#define X509_VERIFY_PARAM_get_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_get_flags) +#define X509_VERIFY_PARAM_inherit BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_inherit) +#define X509_VERIFY_PARAM_lookup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_lookup) +#define X509_VERIFY_PARAM_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_new) +#define X509_VERIFY_PARAM_set1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_set1) +#define X509_VERIFY_PARAM_set1_email BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_set1_email) +#define X509_VERIFY_PARAM_set1_host BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_set1_host) +#define X509_VERIFY_PARAM_set1_ip BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_set1_ip) +#define X509_VERIFY_PARAM_set1_ip_asc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_set1_ip_asc) +#define X509_VERIFY_PARAM_set1_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_set1_name) +#define X509_VERIFY_PARAM_set1_policies BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_set1_policies) +#define X509_VERIFY_PARAM_set_depth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_set_depth) +#define X509_VERIFY_PARAM_set_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_set_flags) +#define X509_VERIFY_PARAM_set_hostflags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_set_hostflags) +#define X509_VERIFY_PARAM_set_purpose BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_set_purpose) +#define X509_VERIFY_PARAM_set_time BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_set_time) +#define X509_VERIFY_PARAM_set_trust BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_set_trust) +#define X509_VERIFY_PARAM_table_cleanup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_VERIFY_PARAM_table_cleanup) +#define X509_add1_ext_i2d BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_add1_ext_i2d) +#define X509_add1_reject_object BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_add1_reject_object) +#define X509_add1_trust_object BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_add1_trust_object) +#define X509_add_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_add_ext) +#define X509_alias_get0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_alias_get0) +#define X509_alias_set1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_alias_set1) +#define X509_chain_check_suiteb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_chain_check_suiteb) +#define X509_chain_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_chain_up_ref) +#define X509_check_akid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_check_akid) +#define X509_check_ca BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_check_ca) +#define X509_check_email BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_check_email) +#define X509_check_host BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_check_host) +#define X509_check_ip BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_check_ip) +#define X509_check_ip_asc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_check_ip_asc) +#define X509_check_issued BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_check_issued) +#define X509_check_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_check_private_key) +#define X509_check_purpose BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_check_purpose) +#define X509_check_trust BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_check_trust) +#define X509_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_cmp) +#define X509_cmp_current_time BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_cmp_current_time) +#define X509_cmp_time BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_cmp_time) +#define X509_delete_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_delete_ext) +#define X509_digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_digest) +#define X509_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_dup) +#define X509_email_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_email_free) +#define X509_find_by_issuer_and_serial BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_find_by_issuer_and_serial) +#define X509_find_by_subject BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_find_by_subject) +#define X509_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_free) +#define X509_get0_extensions BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get0_extensions) +#define X509_get0_notAfter BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get0_notAfter) +#define X509_get0_notBefore BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get0_notBefore) +#define X509_get0_pubkey_bitstr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get0_pubkey_bitstr) +#define X509_get0_signature BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get0_signature) +#define X509_get0_tbs_sigalg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get0_tbs_sigalg) +#define X509_get1_email BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get1_email) +#define X509_get1_ocsp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get1_ocsp) +#define X509_get_default_cert_area BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_default_cert_area) +#define X509_get_default_cert_dir BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_default_cert_dir) +#define X509_get_default_cert_dir_env BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_default_cert_dir_env) +#define X509_get_default_cert_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_default_cert_file) +#define X509_get_default_cert_file_env BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_default_cert_file_env) +#define X509_get_default_private_dir BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_default_private_dir) +#define X509_get_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_ex_data) +#define X509_get_ex_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_ex_new_index) +#define X509_get_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_ext) +#define X509_get_ext_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_ext_by_NID) +#define X509_get_ext_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_ext_by_OBJ) +#define X509_get_ext_by_critical BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_ext_by_critical) +#define X509_get_ext_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_ext_count) +#define X509_get_ext_d2i BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_ext_d2i) +#define X509_get_extended_key_usage BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_extended_key_usage) +#define X509_get_extension_flags BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_extension_flags) +#define X509_get_issuer_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_issuer_name) +#define X509_get_key_usage BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_key_usage) +#define X509_get_pubkey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_pubkey) +#define X509_get_serialNumber BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_serialNumber) +#define X509_get_signature_nid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_signature_nid) +#define X509_get_subject_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_get_subject_name) +#define X509_gmtime_adj BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_gmtime_adj) +#define X509_issuer_and_serial_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_issuer_and_serial_cmp) +#define X509_issuer_and_serial_hash BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_issuer_and_serial_hash) +#define X509_issuer_name_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_issuer_name_cmp) +#define X509_issuer_name_hash BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_issuer_name_hash) +#define X509_issuer_name_hash_old BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_issuer_name_hash_old) +#define X509_it BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_it) +#define X509_keyid_get0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_keyid_get0) +#define X509_keyid_set1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_keyid_set1) +#define X509_load_cert_crl_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_load_cert_crl_file) +#define X509_load_cert_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_load_cert_file) +#define X509_load_crl_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_load_crl_file) +#define X509_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_new) +#define X509_ocspid_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_ocspid_print) +#define X509_parse_from_buffer BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_parse_from_buffer) +#define X509_policy_check BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_policy_check) +#define X509_policy_level_get0_node BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_policy_level_get0_node) +#define X509_policy_level_node_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_policy_level_node_count) +#define X509_policy_node_get0_parent BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_policy_node_get0_parent) +#define X509_policy_node_get0_policy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_policy_node_get0_policy) +#define X509_policy_node_get0_qualifiers BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_policy_node_get0_qualifiers) +#define X509_policy_tree_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_policy_tree_free) +#define X509_policy_tree_get0_level BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_policy_tree_get0_level) +#define X509_policy_tree_get0_policies BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_policy_tree_get0_policies) +#define X509_policy_tree_get0_user_policies BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_policy_tree_get0_user_policies) +#define X509_policy_tree_level_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_policy_tree_level_count) +#define X509_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_print) +#define X509_print_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_print_ex) +#define X509_print_ex_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_print_ex_fp) +#define X509_print_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_print_fp) +#define X509_pubkey_digest BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_pubkey_digest) +#define X509_reject_clear BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_reject_clear) +#define X509_set_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_set_ex_data) +#define X509_set_issuer_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_set_issuer_name) +#define X509_set_notAfter BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_set_notAfter) +#define X509_set_notBefore BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_set_notBefore) +#define X509_set_pubkey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_set_pubkey) +#define X509_set_serialNumber BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_set_serialNumber) +#define X509_set_subject_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_set_subject_name) +#define X509_set_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_set_version) +#define X509_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_sign) +#define X509_sign_ctx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_sign_ctx) +#define X509_signature_dump BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_signature_dump) +#define X509_signature_print BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_signature_print) +#define X509_subject_name_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_subject_name_cmp) +#define X509_subject_name_hash BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_subject_name_hash) +#define X509_subject_name_hash_old BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_subject_name_hash_old) +#define X509_supported_extension BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_supported_extension) +#define X509_time_adj BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_time_adj) +#define X509_time_adj_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_time_adj_ex) +#define X509_to_X509_REQ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_to_X509_REQ) +#define X509_trust_clear BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_trust_clear) +#define X509_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_up_ref) +#define X509_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_verify) +#define X509_verify_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_verify_cert) +#define X509_verify_cert_error_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_verify_cert_error_string) +#define X509at_add1_attr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509at_add1_attr) +#define X509at_add1_attr_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509at_add1_attr_by_NID) +#define X509at_add1_attr_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509at_add1_attr_by_OBJ) +#define X509at_add1_attr_by_txt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509at_add1_attr_by_txt) +#define X509at_delete_attr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509at_delete_attr) +#define X509at_get0_data_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509at_get0_data_by_OBJ) +#define X509at_get_attr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509at_get_attr) +#define X509at_get_attr_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509at_get_attr_by_NID) +#define X509at_get_attr_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509at_get_attr_by_OBJ) +#define X509at_get_attr_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509at_get_attr_count) +#define X509v3_add_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509v3_add_ext) +#define X509v3_delete_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509v3_delete_ext) +#define X509v3_get_ext BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509v3_get_ext) +#define X509v3_get_ext_by_NID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509v3_get_ext_by_NID) +#define X509v3_get_ext_by_OBJ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509v3_get_ext_by_OBJ) +#define X509v3_get_ext_by_critical BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509v3_get_ext_by_critical) +#define X509v3_get_ext_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509v3_get_ext_count) +#define a2i_GENERAL_NAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, a2i_GENERAL_NAME) +#define a2i_IPADDRESS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, a2i_IPADDRESS) +#define a2i_IPADDRESS_NC BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, a2i_IPADDRESS_NC) +#define a2i_ipadd BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, a2i_ipadd) +#define abi_test_bad_unwind_temporary BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_bad_unwind_temporary) +#define abi_test_bad_unwind_wrong_register BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_bad_unwind_wrong_register) +#define abi_test_clobber_r10 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_r10) +#define abi_test_clobber_r11 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_r11) +#define abi_test_clobber_r12 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_r12) +#define abi_test_clobber_r13 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_r13) +#define abi_test_clobber_r14 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_r14) +#define abi_test_clobber_r15 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_r15) +#define abi_test_clobber_r8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_r8) +#define abi_test_clobber_r9 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_r9) +#define abi_test_clobber_rax BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_rax) +#define abi_test_clobber_rbp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_rbp) +#define abi_test_clobber_rbx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_rbx) +#define abi_test_clobber_rcx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_rcx) +#define abi_test_clobber_rdi BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_rdi) +#define abi_test_clobber_rdx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_rdx) +#define abi_test_clobber_rsi BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_rsi) +#define abi_test_clobber_xmm0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm0) +#define abi_test_clobber_xmm1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm1) +#define abi_test_clobber_xmm10 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm10) +#define abi_test_clobber_xmm11 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm11) +#define abi_test_clobber_xmm12 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm12) +#define abi_test_clobber_xmm13 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm13) +#define abi_test_clobber_xmm14 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm14) +#define abi_test_clobber_xmm15 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm15) +#define abi_test_clobber_xmm2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm2) +#define abi_test_clobber_xmm3 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm3) +#define abi_test_clobber_xmm4 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm4) +#define abi_test_clobber_xmm5 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm5) +#define abi_test_clobber_xmm6 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm6) +#define abi_test_clobber_xmm7 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm7) +#define abi_test_clobber_xmm8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm8) +#define abi_test_clobber_xmm9 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm9) +#define abi_test_get_and_clear_direction_flag BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_get_and_clear_direction_flag) +#define abi_test_set_direction_flag BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_set_direction_flag) +#define abi_test_trampoline BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_trampoline) +#define abi_test_unwind_return BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_unwind_return) +#define abi_test_unwind_start BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_unwind_start) +#define abi_test_unwind_stop BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_unwind_stop) +#define aes128gcmsiv_aes_ks BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes128gcmsiv_aes_ks) +#define aes128gcmsiv_aes_ks_enc_x1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes128gcmsiv_aes_ks_enc_x1) +#define aes128gcmsiv_dec BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes128gcmsiv_dec) +#define aes128gcmsiv_ecb_enc_block BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes128gcmsiv_ecb_enc_block) +#define aes128gcmsiv_enc_msg_x4 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes128gcmsiv_enc_msg_x4) +#define aes128gcmsiv_enc_msg_x8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes128gcmsiv_enc_msg_x8) +#define aes128gcmsiv_kdf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes128gcmsiv_kdf) +#define aes256gcmsiv_aes_ks BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes256gcmsiv_aes_ks) +#define aes256gcmsiv_aes_ks_enc_x1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes256gcmsiv_aes_ks_enc_x1) +#define aes256gcmsiv_dec BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes256gcmsiv_dec) +#define aes256gcmsiv_ecb_enc_block BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes256gcmsiv_ecb_enc_block) +#define aes256gcmsiv_enc_msg_x4 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes256gcmsiv_enc_msg_x4) +#define aes256gcmsiv_enc_msg_x8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes256gcmsiv_enc_msg_x8) +#define aes256gcmsiv_kdf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes256gcmsiv_kdf) +#define aes_ctr_set_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_ctr_set_key) +#define aes_hw_cbc_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_hw_cbc_encrypt) +#define aes_hw_ctr32_encrypt_blocks BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_hw_ctr32_encrypt_blocks) +#define aes_hw_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_hw_decrypt) +#define aes_hw_ecb_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_hw_ecb_encrypt) +#define aes_hw_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_hw_encrypt) +#define aes_hw_set_decrypt_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_hw_set_decrypt_key) +#define aes_hw_set_encrypt_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_hw_set_encrypt_key) +#define aes_nohw_cbc_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_nohw_cbc_encrypt) +#define aes_nohw_ctr32_encrypt_blocks BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_nohw_ctr32_encrypt_blocks) +#define aes_nohw_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_nohw_decrypt) +#define aes_nohw_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_nohw_encrypt) +#define aes_nohw_set_decrypt_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_nohw_set_decrypt_key) +#define aes_nohw_set_encrypt_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_nohw_set_encrypt_key) +#define aesgcmsiv_htable6_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aesgcmsiv_htable6_init) +#define aesgcmsiv_htable_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aesgcmsiv_htable_init) +#define aesgcmsiv_htable_polyval BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aesgcmsiv_htable_polyval) +#define aesgcmsiv_polyval_horner BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aesgcmsiv_polyval_horner) +#define aesni_gcm_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aesni_gcm_decrypt) +#define aesni_gcm_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aesni_gcm_encrypt) +#define asn1_do_adb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_do_adb) +#define asn1_enc_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_enc_free) +#define asn1_enc_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_enc_init) +#define asn1_enc_restore BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_enc_restore) +#define asn1_enc_save BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_enc_save) +#define asn1_ex_c2i BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_ex_c2i) +#define asn1_ex_i2c BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_ex_i2c) +#define asn1_generalizedtime_to_tm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_generalizedtime_to_tm) +#define asn1_get_choice_selector BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_get_choice_selector) +#define asn1_get_field_ptr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_get_field_ptr) +#define asn1_item_combine_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_item_combine_free) +#define asn1_refcount_dec_and_test_zero BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_refcount_dec_and_test_zero) +#define asn1_refcount_set_one BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_refcount_set_one) +#define asn1_set_choice_selector BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_set_choice_selector) +#define asn1_utctime_to_tm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, asn1_utctime_to_tm) +#define beeu_mod_inverse_vartime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, beeu_mod_inverse_vartime) +#define bio_clear_socket_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bio_clear_socket_error) +#define bio_fd_should_retry BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bio_fd_should_retry) +#define bio_ip_and_port_to_socket_and_addr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bio_ip_and_port_to_socket_and_addr) +#define bio_sock_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bio_sock_error) +#define bio_socket_nbio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bio_socket_nbio) +#define bn_abs_sub_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_abs_sub_consttime) +#define bn_add_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_add_words) +#define bn_copy_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_copy_words) +#define bn_div_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_div_consttime) +#define bn_expand BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_expand) +#define bn_fits_in_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_fits_in_words) +#define bn_from_montgomery BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_from_montgomery) +#define bn_from_montgomery_small BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_from_montgomery_small) +#define bn_gather5 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_gather5) +#define bn_in_range_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_in_range_words) +#define bn_is_bit_set_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_is_bit_set_words) +#define bn_is_relatively_prime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_is_relatively_prime) +#define bn_jacobi BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_jacobi) +#define bn_lcm_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_lcm_consttime) +#define bn_less_than_montgomery_R BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_less_than_montgomery_R) +#define bn_less_than_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_less_than_words) +#define bn_miller_rabin_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_miller_rabin_init) +#define bn_miller_rabin_iteration BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_miller_rabin_iteration) +#define bn_minimal_width BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_minimal_width) +#define bn_mod_add_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mod_add_consttime) +#define bn_mod_add_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mod_add_words) +#define bn_mod_exp_base_2_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mod_exp_base_2_consttime) +#define bn_mod_exp_mont_small BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mod_exp_mont_small) +#define bn_mod_inverse_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mod_inverse_consttime) +#define bn_mod_inverse_prime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mod_inverse_prime) +#define bn_mod_inverse_prime_mont_small BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mod_inverse_prime_mont_small) +#define bn_mod_inverse_secret_prime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mod_inverse_secret_prime) +#define bn_mod_lshift1_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mod_lshift1_consttime) +#define bn_mod_lshift_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mod_lshift_consttime) +#define bn_mod_mul_montgomery_small BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mod_mul_montgomery_small) +#define bn_mod_sub_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mod_sub_consttime) +#define bn_mod_sub_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mod_sub_words) +#define bn_mod_u16_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mod_u16_consttime) +#define bn_mont_n0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mont_n0) +#define bn_mul_add_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mul_add_words) +#define bn_mul_comba4 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mul_comba4) +#define bn_mul_comba8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mul_comba8) +#define bn_mul_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mul_consttime) +#define bn_mul_mont BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mul_mont) +#define bn_mul_mont_gather5 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mul_mont_gather5) +#define bn_mul_small BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mul_small) +#define bn_mul_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mul_words) +#define bn_odd_number_is_obviously_composite BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_odd_number_is_obviously_composite) +#define bn_one_to_montgomery BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_one_to_montgomery) +#define bn_power5 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_power5) +#define bn_rand_range_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_rand_range_words) +#define bn_rand_secret_range BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_rand_secret_range) +#define bn_reduce_once BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_reduce_once) +#define bn_reduce_once_in_place BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_reduce_once_in_place) +#define bn_resize_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_resize_words) +#define bn_rshift1_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_rshift1_words) +#define bn_rshift_secret_shift BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_rshift_secret_shift) +#define bn_rshift_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_rshift_words) +#define bn_scatter5 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_scatter5) +#define bn_select_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_select_words) +#define bn_set_minimal_width BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_set_minimal_width) +#define bn_set_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_set_words) +#define bn_sqr8x_internal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_sqr8x_internal) +#define bn_sqr_comba4 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_sqr_comba4) +#define bn_sqr_comba8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_sqr_comba8) +#define bn_sqr_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_sqr_consttime) +#define bn_sqr_small BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_sqr_small) +#define bn_sqr_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_sqr_words) +#define bn_sqrx8x_internal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_sqrx8x_internal) +#define bn_sub_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_sub_words) +#define bn_to_montgomery_small BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_to_montgomery_small) +#define bn_uadd_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_uadd_consttime) +#define bn_usub_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_usub_consttime) +#define bn_wexpand BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_wexpand) +#define boringssl_fips_self_test BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, boringssl_fips_self_test) +#define c2i_ASN1_BIT_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, c2i_ASN1_BIT_STRING) +#define c2i_ASN1_INTEGER BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, c2i_ASN1_INTEGER) +#define c2i_ASN1_OBJECT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, c2i_ASN1_OBJECT) +#define cbb_add_latin1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, cbb_add_latin1) +#define cbb_add_ucs2_be BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, cbb_add_ucs2_be) +#define cbb_add_utf32_be BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, cbb_add_utf32_be) +#define cbb_add_utf8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, cbb_add_utf8) +#define cbb_get_utf8_len BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, cbb_get_utf8_len) +#define cbs_get_latin1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, cbs_get_latin1) +#define cbs_get_ucs2_be BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, cbs_get_ucs2_be) +#define cbs_get_utf32_be BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, cbs_get_utf32_be) +#define cbs_get_utf8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, cbs_get_utf8) +#define chacha20_poly1305_open BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, chacha20_poly1305_open) +#define chacha20_poly1305_seal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, chacha20_poly1305_seal) +#define crypto_gcm_clmul_enabled BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, crypto_gcm_clmul_enabled) +#define d2i_ACCESS_DESCRIPTION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ACCESS_DESCRIPTION) +#define d2i_ASN1_BIT_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_BIT_STRING) +#define d2i_ASN1_BMPSTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_BMPSTRING) +#define d2i_ASN1_BOOLEAN BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_BOOLEAN) +#define d2i_ASN1_ENUMERATED BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_ENUMERATED) +#define d2i_ASN1_GENERALIZEDTIME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_GENERALIZEDTIME) +#define d2i_ASN1_GENERALSTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_GENERALSTRING) +#define d2i_ASN1_IA5STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_IA5STRING) +#define d2i_ASN1_INTEGER BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_INTEGER) +#define d2i_ASN1_NULL BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_NULL) +#define d2i_ASN1_OBJECT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_OBJECT) +#define d2i_ASN1_OCTET_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_OCTET_STRING) +#define d2i_ASN1_PRINTABLE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_PRINTABLE) +#define d2i_ASN1_PRINTABLESTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_PRINTABLESTRING) +#define d2i_ASN1_SEQUENCE_ANY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_SEQUENCE_ANY) +#define d2i_ASN1_SET_ANY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_SET_ANY) +#define d2i_ASN1_T61STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_T61STRING) +#define d2i_ASN1_TIME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_TIME) +#define d2i_ASN1_TYPE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_TYPE) +#define d2i_ASN1_UNIVERSALSTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_UNIVERSALSTRING) +#define d2i_ASN1_UTCTIME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_UTCTIME) +#define d2i_ASN1_UTF8STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_UTF8STRING) +#define d2i_ASN1_VISIBLESTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_VISIBLESTRING) +#define d2i_AUTHORITY_INFO_ACCESS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_AUTHORITY_INFO_ACCESS) +#define d2i_AUTHORITY_KEYID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_AUTHORITY_KEYID) +#define d2i_AutoPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_AutoPrivateKey) +#define d2i_BASIC_CONSTRAINTS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_BASIC_CONSTRAINTS) +#define d2i_CERTIFICATEPOLICIES BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_CERTIFICATEPOLICIES) +#define d2i_CRL_DIST_POINTS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_CRL_DIST_POINTS) +#define d2i_DHparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DHparams) +#define d2i_DHparams_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DHparams_bio) +#define d2i_DIRECTORYSTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DIRECTORYSTRING) +#define d2i_DISPLAYTEXT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DISPLAYTEXT) +#define d2i_DIST_POINT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DIST_POINT) +#define d2i_DIST_POINT_NAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DIST_POINT_NAME) +#define d2i_DSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DSAPrivateKey) +#define d2i_DSAPrivateKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DSAPrivateKey_bio) +#define d2i_DSAPrivateKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DSAPrivateKey_fp) +#define d2i_DSAPublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DSAPublicKey) +#define d2i_DSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DSA_PUBKEY) +#define d2i_DSA_PUBKEY_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DSA_PUBKEY_bio) +#define d2i_DSA_PUBKEY_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DSA_PUBKEY_fp) +#define d2i_DSA_SIG BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DSA_SIG) +#define d2i_DSAparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DSAparams) +#define d2i_ECDSA_SIG BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ECDSA_SIG) +#define d2i_ECParameters BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ECParameters) +#define d2i_ECPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ECPrivateKey) +#define d2i_ECPrivateKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ECPrivateKey_bio) +#define d2i_ECPrivateKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ECPrivateKey_fp) +#define d2i_EC_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_EC_PUBKEY) +#define d2i_EC_PUBKEY_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_EC_PUBKEY_bio) +#define d2i_EC_PUBKEY_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_EC_PUBKEY_fp) +#define d2i_EDIPARTYNAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_EDIPARTYNAME) +#define d2i_EXTENDED_KEY_USAGE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_EXTENDED_KEY_USAGE) +#define d2i_GENERAL_NAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_GENERAL_NAME) +#define d2i_GENERAL_NAMES BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_GENERAL_NAMES) +#define d2i_ISSUING_DIST_POINT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ISSUING_DIST_POINT) +#define d2i_NETSCAPE_SPKAC BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_NETSCAPE_SPKAC) +#define d2i_NETSCAPE_SPKI BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_NETSCAPE_SPKI) +#define d2i_NOTICEREF BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_NOTICEREF) +#define d2i_OTHERNAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_OTHERNAME) +#define d2i_PKCS12 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PKCS12) +#define d2i_PKCS12_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PKCS12_bio) +#define d2i_PKCS12_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PKCS12_fp) +#define d2i_PKCS7 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PKCS7) +#define d2i_PKCS7_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PKCS7_bio) +#define d2i_PKCS8PrivateKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PKCS8PrivateKey_bio) +#define d2i_PKCS8PrivateKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PKCS8PrivateKey_fp) +#define d2i_PKCS8_PRIV_KEY_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PKCS8_PRIV_KEY_INFO) +#define d2i_PKCS8_PRIV_KEY_INFO_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PKCS8_PRIV_KEY_INFO_bio) +#define d2i_PKCS8_PRIV_KEY_INFO_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PKCS8_PRIV_KEY_INFO_fp) +#define d2i_PKCS8_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PKCS8_bio) +#define d2i_PKCS8_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PKCS8_fp) +#define d2i_PKEY_USAGE_PERIOD BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PKEY_USAGE_PERIOD) +#define d2i_POLICYINFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_POLICYINFO) +#define d2i_POLICYQUALINFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_POLICYQUALINFO) +#define d2i_PROXY_CERT_INFO_EXTENSION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PROXY_CERT_INFO_EXTENSION) +#define d2i_PROXY_POLICY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PROXY_POLICY) +#define d2i_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PUBKEY) +#define d2i_PUBKEY_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PUBKEY_bio) +#define d2i_PUBKEY_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PUBKEY_fp) +#define d2i_PrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PrivateKey) +#define d2i_PrivateKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PrivateKey_bio) +#define d2i_PrivateKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PrivateKey_fp) +#define d2i_PublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PublicKey) +#define d2i_RSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_RSAPrivateKey) +#define d2i_RSAPrivateKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_RSAPrivateKey_bio) +#define d2i_RSAPrivateKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_RSAPrivateKey_fp) +#define d2i_RSAPublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_RSAPublicKey) +#define d2i_RSAPublicKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_RSAPublicKey_bio) +#define d2i_RSAPublicKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_RSAPublicKey_fp) +#define d2i_RSA_PSS_PARAMS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_RSA_PSS_PARAMS) +#define d2i_RSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_RSA_PUBKEY) +#define d2i_RSA_PUBKEY_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_RSA_PUBKEY_bio) +#define d2i_RSA_PUBKEY_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_RSA_PUBKEY_fp) +#define d2i_SXNET BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_SXNET) +#define d2i_SXNETID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_SXNETID) +#define d2i_USERNOTICE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_USERNOTICE) +#define d2i_X509 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509) +#define d2i_X509_ALGOR BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_ALGOR) +#define d2i_X509_ALGORS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_ALGORS) +#define d2i_X509_ATTRIBUTE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_ATTRIBUTE) +#define d2i_X509_AUX BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_AUX) +#define d2i_X509_CERT_AUX BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_CERT_AUX) +#define d2i_X509_CINF BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_CINF) +#define d2i_X509_CRL BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_CRL) +#define d2i_X509_CRL_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_CRL_INFO) +#define d2i_X509_CRL_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_CRL_bio) +#define d2i_X509_CRL_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_CRL_fp) +#define d2i_X509_EXTENSION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_EXTENSION) +#define d2i_X509_EXTENSIONS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_EXTENSIONS) +#define d2i_X509_NAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_NAME) +#define d2i_X509_NAME_ENTRY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_NAME_ENTRY) +#define d2i_X509_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_PUBKEY) +#define d2i_X509_REQ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_REQ) +#define d2i_X509_REQ_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_REQ_INFO) +#define d2i_X509_REQ_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_REQ_bio) +#define d2i_X509_REQ_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_REQ_fp) +#define d2i_X509_REVOKED BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_REVOKED) +#define d2i_X509_SIG BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_SIG) +#define d2i_X509_VAL BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_VAL) +#define d2i_X509_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_bio) +#define d2i_X509_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_fp) +#define dsa_asn1_meth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, dsa_asn1_meth) +#define ec_GFp_mont_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_mont_add) +#define ec_GFp_mont_bignum_to_felem BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_mont_bignum_to_felem) +#define ec_GFp_mont_dbl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_mont_dbl) +#define ec_GFp_mont_felem_mul BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_mont_felem_mul) +#define ec_GFp_mont_felem_sqr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_mont_felem_sqr) +#define ec_GFp_mont_felem_to_bignum BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_mont_felem_to_bignum) +#define ec_GFp_mont_group_finish BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_mont_group_finish) +#define ec_GFp_mont_group_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_mont_group_init) +#define ec_GFp_mont_group_set_curve BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_mont_group_set_curve) +#define ec_GFp_mont_mul BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_mont_mul) +#define ec_GFp_mont_mul_base BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_mont_mul_base) +#define ec_GFp_mont_mul_public BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_mont_mul_public) +#define ec_GFp_nistp_recode_scalar_bits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_nistp_recode_scalar_bits) +#define ec_GFp_simple_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_simple_cmp) +#define ec_GFp_simple_cmp_x_coordinate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_simple_cmp_x_coordinate) +#define ec_GFp_simple_group_finish BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_simple_group_finish) +#define ec_GFp_simple_group_get_curve BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_simple_group_get_curve) +#define ec_GFp_simple_group_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_simple_group_init) +#define ec_GFp_simple_group_set_curve BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_simple_group_set_curve) +#define ec_GFp_simple_invert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_simple_invert) +#define ec_GFp_simple_is_at_infinity BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_simple_is_at_infinity) +#define ec_GFp_simple_is_on_curve BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_simple_is_on_curve) +#define ec_GFp_simple_mont_inv_mod_ord_vartime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_simple_mont_inv_mod_ord_vartime) +#define ec_GFp_simple_point_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_simple_point_copy) +#define ec_GFp_simple_point_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_simple_point_init) +#define ec_GFp_simple_point_set_affine_coordinates BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_simple_point_set_affine_coordinates) +#define ec_GFp_simple_point_set_to_infinity BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_simple_point_set_to_infinity) +#define ec_asn1_meth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_asn1_meth) +#define ec_bignum_to_felem BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_bignum_to_felem) +#define ec_bignum_to_scalar BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_bignum_to_scalar) +#define ec_cmp_x_coordinate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_cmp_x_coordinate) +#define ec_compute_wNAF BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_compute_wNAF) +#define ec_felem_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_felem_add) +#define ec_felem_equal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_felem_equal) +#define ec_felem_neg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_felem_neg) +#define ec_felem_non_zero_mask BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_felem_non_zero_mask) +#define ec_felem_select BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_felem_select) +#define ec_felem_sub BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_felem_sub) +#define ec_felem_to_bignum BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_felem_to_bignum) +#define ec_get_x_coordinate_as_scalar BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_get_x_coordinate_as_scalar) +#define ec_group_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_group_new) +#define ec_pkey_meth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_pkey_meth) +#define ec_point_get_affine_coordinate_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_point_get_affine_coordinate_bytes) +#define ec_point_mul_scalar BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_point_mul_scalar) +#define ec_point_mul_scalar_base BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_point_mul_scalar_base) +#define ec_point_mul_scalar_public BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_point_mul_scalar_public) +#define ec_random_nonzero_scalar BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_random_nonzero_scalar) +#define ec_scalar_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_scalar_add) +#define ec_scalar_equal_vartime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_scalar_equal_vartime) +#define ec_scalar_from_montgomery BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_scalar_from_montgomery) +#define ec_scalar_inv_montgomery BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_scalar_inv_montgomery) +#define ec_scalar_inv_montgomery_vartime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_scalar_inv_montgomery_vartime) +#define ec_scalar_is_zero BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_scalar_is_zero) +#define ec_scalar_mul_montgomery BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_scalar_mul_montgomery) +#define ec_scalar_to_montgomery BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_scalar_to_montgomery) +#define ec_simple_scalar_inv_montgomery BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_simple_scalar_inv_montgomery) +#define ecp_nistz256_avx2_select_w7 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ecp_nistz256_avx2_select_w7) +#define ecp_nistz256_mul_mont BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ecp_nistz256_mul_mont) +#define ecp_nistz256_neg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ecp_nistz256_neg) +#define ecp_nistz256_ord_mul_mont BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ecp_nistz256_ord_mul_mont) +#define ecp_nistz256_ord_sqr_mont BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ecp_nistz256_ord_sqr_mont) +#define ecp_nistz256_point_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ecp_nistz256_point_add) +#define ecp_nistz256_point_add_affine BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ecp_nistz256_point_add_affine) +#define ecp_nistz256_point_double BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ecp_nistz256_point_double) +#define ecp_nistz256_select_w5 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ecp_nistz256_select_w5) +#define ecp_nistz256_select_w7 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ecp_nistz256_select_w7) +#define ecp_nistz256_sqr_mont BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ecp_nistz256_sqr_mont) +#define ed25519_asn1_meth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ed25519_asn1_meth) +#define ed25519_pkey_meth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ed25519_pkey_meth) +#define gcm_ghash_avx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, gcm_ghash_avx) +#define gcm_ghash_clmul BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, gcm_ghash_clmul) +#define gcm_ghash_nohw BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, gcm_ghash_nohw) +#define gcm_ghash_ssse3 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, gcm_ghash_ssse3) +#define gcm_gmult_avx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, gcm_gmult_avx) +#define gcm_gmult_clmul BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, gcm_gmult_clmul) +#define gcm_gmult_nohw BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, gcm_gmult_nohw) +#define gcm_gmult_ssse3 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, gcm_gmult_ssse3) +#define gcm_init_avx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, gcm_init_avx) +#define gcm_init_clmul BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, gcm_init_clmul) +#define gcm_init_nohw BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, gcm_init_nohw) +#define gcm_init_ssse3 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, gcm_init_ssse3) +#define i2a_ACCESS_DESCRIPTION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2a_ACCESS_DESCRIPTION) +#define i2a_ASN1_ENUMERATED BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2a_ASN1_ENUMERATED) +#define i2a_ASN1_INTEGER BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2a_ASN1_INTEGER) +#define i2a_ASN1_OBJECT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2a_ASN1_OBJECT) +#define i2a_ASN1_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2a_ASN1_STRING) +#define i2c_ASN1_BIT_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2c_ASN1_BIT_STRING) +#define i2c_ASN1_INTEGER BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2c_ASN1_INTEGER) +#define i2d_ACCESS_DESCRIPTION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ACCESS_DESCRIPTION) +#define i2d_ASN1_BIT_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_BIT_STRING) +#define i2d_ASN1_BMPSTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_BMPSTRING) +#define i2d_ASN1_BOOLEAN BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_BOOLEAN) +#define i2d_ASN1_ENUMERATED BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_ENUMERATED) +#define i2d_ASN1_GENERALIZEDTIME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_GENERALIZEDTIME) +#define i2d_ASN1_GENERALSTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_GENERALSTRING) +#define i2d_ASN1_IA5STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_IA5STRING) +#define i2d_ASN1_INTEGER BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_INTEGER) +#define i2d_ASN1_NULL BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_NULL) +#define i2d_ASN1_OBJECT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_OBJECT) +#define i2d_ASN1_OCTET_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_OCTET_STRING) +#define i2d_ASN1_PRINTABLE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_PRINTABLE) +#define i2d_ASN1_PRINTABLESTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_PRINTABLESTRING) +#define i2d_ASN1_SEQUENCE_ANY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_SEQUENCE_ANY) +#define i2d_ASN1_SET_ANY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_SET_ANY) +#define i2d_ASN1_T61STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_T61STRING) +#define i2d_ASN1_TIME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_TIME) +#define i2d_ASN1_TYPE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_TYPE) +#define i2d_ASN1_UNIVERSALSTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_UNIVERSALSTRING) +#define i2d_ASN1_UTCTIME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_UTCTIME) +#define i2d_ASN1_UTF8STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_UTF8STRING) +#define i2d_ASN1_VISIBLESTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_VISIBLESTRING) +#define i2d_AUTHORITY_INFO_ACCESS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_AUTHORITY_INFO_ACCESS) +#define i2d_AUTHORITY_KEYID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_AUTHORITY_KEYID) +#define i2d_BASIC_CONSTRAINTS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_BASIC_CONSTRAINTS) +#define i2d_CERTIFICATEPOLICIES BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_CERTIFICATEPOLICIES) +#define i2d_CRL_DIST_POINTS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_CRL_DIST_POINTS) +#define i2d_DHparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DHparams) +#define i2d_DHparams_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DHparams_bio) +#define i2d_DIRECTORYSTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DIRECTORYSTRING) +#define i2d_DISPLAYTEXT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DISPLAYTEXT) +#define i2d_DIST_POINT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DIST_POINT) +#define i2d_DIST_POINT_NAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DIST_POINT_NAME) +#define i2d_DSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DSAPrivateKey) +#define i2d_DSAPrivateKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DSAPrivateKey_bio) +#define i2d_DSAPrivateKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DSAPrivateKey_fp) +#define i2d_DSAPublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DSAPublicKey) +#define i2d_DSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DSA_PUBKEY) +#define i2d_DSA_PUBKEY_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DSA_PUBKEY_bio) +#define i2d_DSA_PUBKEY_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DSA_PUBKEY_fp) +#define i2d_DSA_SIG BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DSA_SIG) +#define i2d_DSAparams BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DSAparams) +#define i2d_ECDSA_SIG BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ECDSA_SIG) +#define i2d_ECParameters BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ECParameters) +#define i2d_ECPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ECPrivateKey) +#define i2d_ECPrivateKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ECPrivateKey_bio) +#define i2d_ECPrivateKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ECPrivateKey_fp) +#define i2d_EC_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_EC_PUBKEY) +#define i2d_EC_PUBKEY_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_EC_PUBKEY_bio) +#define i2d_EC_PUBKEY_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_EC_PUBKEY_fp) +#define i2d_EDIPARTYNAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_EDIPARTYNAME) +#define i2d_EXTENDED_KEY_USAGE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_EXTENDED_KEY_USAGE) +#define i2d_GENERAL_NAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_GENERAL_NAME) +#define i2d_GENERAL_NAMES BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_GENERAL_NAMES) +#define i2d_ISSUING_DIST_POINT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ISSUING_DIST_POINT) +#define i2d_NETSCAPE_SPKAC BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_NETSCAPE_SPKAC) +#define i2d_NETSCAPE_SPKI BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_NETSCAPE_SPKI) +#define i2d_NOTICEREF BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_NOTICEREF) +#define i2d_OTHERNAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_OTHERNAME) +#define i2d_PKCS12 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS12) +#define i2d_PKCS12_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS12_bio) +#define i2d_PKCS12_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS12_fp) +#define i2d_PKCS7 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS7) +#define i2d_PKCS7_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS7_bio) +#define i2d_PKCS8PrivateKeyInfo_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS8PrivateKeyInfo_bio) +#define i2d_PKCS8PrivateKeyInfo_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS8PrivateKeyInfo_fp) +#define i2d_PKCS8PrivateKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS8PrivateKey_bio) +#define i2d_PKCS8PrivateKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS8PrivateKey_fp) +#define i2d_PKCS8PrivateKey_nid_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS8PrivateKey_nid_bio) +#define i2d_PKCS8PrivateKey_nid_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS8PrivateKey_nid_fp) +#define i2d_PKCS8_PRIV_KEY_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS8_PRIV_KEY_INFO) +#define i2d_PKCS8_PRIV_KEY_INFO_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS8_PRIV_KEY_INFO_bio) +#define i2d_PKCS8_PRIV_KEY_INFO_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS8_PRIV_KEY_INFO_fp) +#define i2d_PKCS8_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS8_bio) +#define i2d_PKCS8_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS8_fp) +#define i2d_PKEY_USAGE_PERIOD BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKEY_USAGE_PERIOD) +#define i2d_POLICYINFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_POLICYINFO) +#define i2d_POLICYQUALINFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_POLICYQUALINFO) +#define i2d_PROXY_CERT_INFO_EXTENSION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PROXY_CERT_INFO_EXTENSION) +#define i2d_PROXY_POLICY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PROXY_POLICY) +#define i2d_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PUBKEY) +#define i2d_PUBKEY_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PUBKEY_bio) +#define i2d_PUBKEY_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PUBKEY_fp) +#define i2d_PrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PrivateKey) +#define i2d_PrivateKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PrivateKey_bio) +#define i2d_PrivateKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PrivateKey_fp) +#define i2d_PublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PublicKey) +#define i2d_RSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_RSAPrivateKey) +#define i2d_RSAPrivateKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_RSAPrivateKey_bio) +#define i2d_RSAPrivateKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_RSAPrivateKey_fp) +#define i2d_RSAPublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_RSAPublicKey) +#define i2d_RSAPublicKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_RSAPublicKey_bio) +#define i2d_RSAPublicKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_RSAPublicKey_fp) +#define i2d_RSA_PSS_PARAMS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_RSA_PSS_PARAMS) +#define i2d_RSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_RSA_PUBKEY) +#define i2d_RSA_PUBKEY_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_RSA_PUBKEY_bio) +#define i2d_RSA_PUBKEY_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_RSA_PUBKEY_fp) +#define i2d_SXNET BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_SXNET) +#define i2d_SXNETID BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_SXNETID) +#define i2d_USERNOTICE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_USERNOTICE) +#define i2d_X509 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509) +#define i2d_X509_ALGOR BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_ALGOR) +#define i2d_X509_ALGORS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_ALGORS) +#define i2d_X509_ATTRIBUTE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_ATTRIBUTE) +#define i2d_X509_AUX BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_AUX) +#define i2d_X509_CERT_AUX BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_CERT_AUX) +#define i2d_X509_CINF BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_CINF) +#define i2d_X509_CRL BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_CRL) +#define i2d_X509_CRL_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_CRL_INFO) +#define i2d_X509_CRL_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_CRL_bio) +#define i2d_X509_CRL_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_CRL_fp) +#define i2d_X509_EXTENSION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_EXTENSION) +#define i2d_X509_EXTENSIONS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_EXTENSIONS) +#define i2d_X509_NAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_NAME) +#define i2d_X509_NAME_ENTRY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_NAME_ENTRY) +#define i2d_X509_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_PUBKEY) +#define i2d_X509_REQ BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_REQ) +#define i2d_X509_REQ_INFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_REQ_INFO) +#define i2d_X509_REQ_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_REQ_bio) +#define i2d_X509_REQ_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_REQ_fp) +#define i2d_X509_REVOKED BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_REVOKED) +#define i2d_X509_SIG BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_SIG) +#define i2d_X509_VAL BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_VAL) +#define i2d_X509_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_bio) +#define i2d_X509_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_fp) +#define i2d_re_X509_CRL_tbs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_re_X509_CRL_tbs) +#define i2d_re_X509_REQ_tbs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_re_X509_REQ_tbs) +#define i2d_re_X509_tbs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_re_X509_tbs) +#define i2o_ECPublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2o_ECPublicKey) +#define i2s_ASN1_ENUMERATED BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2s_ASN1_ENUMERATED) +#define i2s_ASN1_ENUMERATED_TABLE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2s_ASN1_ENUMERATED_TABLE) +#define i2s_ASN1_INTEGER BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2s_ASN1_INTEGER) +#define i2s_ASN1_OCTET_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2s_ASN1_OCTET_STRING) +#define i2t_ASN1_OBJECT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2t_ASN1_OBJECT) +#define i2v_ASN1_BIT_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2v_ASN1_BIT_STRING) +#define i2v_GENERAL_NAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2v_GENERAL_NAME) +#define i2v_GENERAL_NAMES BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2v_GENERAL_NAMES) +#define kBoringSSLRSASqrtTwo BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, kBoringSSLRSASqrtTwo) +#define kBoringSSLRSASqrtTwoLen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, kBoringSSLRSASqrtTwoLen) +#define kOpenSSLReasonStringData BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, kOpenSSLReasonStringData) +#define kOpenSSLReasonValues BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, kOpenSSLReasonValues) +#define kOpenSSLReasonValuesLen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, kOpenSSLReasonValuesLen) +#define level_add_node BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, level_add_node) +#define level_find_node BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, level_find_node) +#define lh_delete BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, lh_delete) +#define lh_doall_arg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, lh_doall_arg) +#define lh_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, lh_free) +#define lh_insert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, lh_insert) +#define lh_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, lh_new) +#define lh_num_items BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, lh_num_items) +#define lh_retrieve BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, lh_retrieve) +#define lh_retrieve_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, lh_retrieve_key) +#define lh_strhash BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, lh_strhash) +#define md4_block_data_order BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, md4_block_data_order) +#define md5_block_asm_data_order BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, md5_block_asm_data_order) +#define o2i_ECPublicKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, o2i_ECPublicKey) +#define pkcs12_iterations_acceptable BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, pkcs12_iterations_acceptable) +#define pkcs12_key_gen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, pkcs12_key_gen) +#define pkcs12_pbe_encrypt_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, pkcs12_pbe_encrypt_init) +#define pkcs7_bundle BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, pkcs7_bundle) +#define pkcs7_parse_header BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, pkcs7_parse_header) +#define pkcs8_pbe_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, pkcs8_pbe_decrypt) +#define policy_cache_find_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, policy_cache_find_data) +#define policy_cache_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, policy_cache_free) +#define policy_cache_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, policy_cache_set) +#define policy_cache_set_mapping BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, policy_cache_set_mapping) +#define policy_data_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, policy_data_free) +#define policy_data_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, policy_data_new) +#define policy_node_cmp_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, policy_node_cmp_new) +#define policy_node_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, policy_node_free) +#define policy_node_match BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, policy_node_match) +#define poly_Rq_mul BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, poly_Rq_mul) +#define rand_fork_unsafe_buffering_enabled BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, rand_fork_unsafe_buffering_enabled) +#define rsa_asn1_meth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, rsa_asn1_meth) +#define rsa_default_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, rsa_default_decrypt) +#define rsa_default_private_transform BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, rsa_default_private_transform) +#define rsa_default_sign_raw BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, rsa_default_sign_raw) +#define rsa_default_size BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, rsa_default_size) +#define rsa_pkey_meth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, rsa_pkey_meth) +#define rsaz_1024_gather5_avx2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, rsaz_1024_gather5_avx2) +#define rsaz_1024_mul_avx2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, rsaz_1024_mul_avx2) +#define rsaz_1024_norm2red_avx2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, rsaz_1024_norm2red_avx2) +#define rsaz_1024_red2norm_avx2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, rsaz_1024_red2norm_avx2) +#define rsaz_1024_scatter5_avx2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, rsaz_1024_scatter5_avx2) +#define rsaz_1024_sqr_avx2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, rsaz_1024_sqr_avx2) +#define s2i_ASN1_INTEGER BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, s2i_ASN1_INTEGER) +#define s2i_ASN1_OCTET_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, s2i_ASN1_OCTET_STRING) +#define sha1_block_data_order BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sha1_block_data_order) +#define sha256_block_data_order BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sha256_block_data_order) +#define sha512_block_data_order BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sha512_block_data_order) +#define sk_deep_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_deep_copy) +#define sk_delete BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_delete) +#define sk_delete_ptr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_delete_ptr) +#define sk_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_dup) +#define sk_find BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_find) +#define sk_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_free) +#define sk_insert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_insert) +#define sk_is_sorted BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_is_sorted) +#define sk_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_new) +#define sk_new_null BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_new_null) +#define sk_num BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_num) +#define sk_pop BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_pop) +#define sk_pop_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_pop_free) +#define sk_pop_free_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_pop_free_ex) +#define sk_push BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_push) +#define sk_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_set) +#define sk_set_cmp_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_set_cmp_func) +#define sk_shift BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_shift) +#define sk_sort BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_sort) +#define sk_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_value) +#define sk_zero BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_zero) +#define tree_find_sk BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, tree_find_sk) +#define v2i_ASN1_BIT_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v2i_ASN1_BIT_STRING) +#define v2i_GENERAL_NAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v2i_GENERAL_NAME) +#define v2i_GENERAL_NAMES BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v2i_GENERAL_NAMES) +#define v2i_GENERAL_NAME_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v2i_GENERAL_NAME_ex) +#define v3_akey_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_akey_id) +#define v3_alt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_alt) +#define v3_bcons BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_bcons) +#define v3_cpols BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_cpols) +#define v3_crl_invdate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_crl_invdate) +#define v3_crl_num BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_crl_num) +#define v3_crl_reason BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_crl_reason) +#define v3_crld BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_crld) +#define v3_delta_crl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_delta_crl) +#define v3_ext_ku BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_ext_ku) +#define v3_freshest_crl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_freshest_crl) +#define v3_idp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_idp) +#define v3_info BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_info) +#define v3_inhibit_anyp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_inhibit_anyp) +#define v3_key_usage BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_key_usage) +#define v3_name_constraints BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_name_constraints) +#define v3_ns_ia5_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_ns_ia5_list) +#define v3_nscert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_nscert) +#define v3_ocsp_accresp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_ocsp_accresp) +#define v3_ocsp_nocheck BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_ocsp_nocheck) +#define v3_pci BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_pci) +#define v3_pkey_usage_period BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_pkey_usage_period) +#define v3_policy_constraints BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_policy_constraints) +#define v3_policy_mappings BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_policy_mappings) +#define v3_sinfo BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_sinfo) +#define v3_skey_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_skey_id) +#define v3_sxnet BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, v3_sxnet) +#define vpaes_cbc_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, vpaes_cbc_encrypt) +#define vpaes_ctr32_encrypt_blocks BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, vpaes_ctr32_encrypt_blocks) +#define vpaes_decrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, vpaes_decrypt) +#define vpaes_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, vpaes_encrypt) +#define vpaes_set_decrypt_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, vpaes_set_decrypt_key) +#define vpaes_set_encrypt_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, vpaes_set_encrypt_key) +#define x25519_asn1_meth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x25519_asn1_meth) +#define x25519_ge_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x25519_ge_add) +#define x25519_ge_frombytes_vartime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x25519_ge_frombytes_vartime) +#define x25519_ge_p1p1_to_p2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x25519_ge_p1p1_to_p2) +#define x25519_ge_p1p1_to_p3 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x25519_ge_p1p1_to_p3) +#define x25519_ge_p3_to_cached BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x25519_ge_p3_to_cached) +#define x25519_ge_scalarmult BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x25519_ge_scalarmult) +#define x25519_ge_scalarmult_base BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x25519_ge_scalarmult_base) +#define x25519_ge_scalarmult_small_precomp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x25519_ge_scalarmult_small_precomp) +#define x25519_ge_sub BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x25519_ge_sub) +#define x25519_ge_tobytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x25519_ge_tobytes) +#define x25519_pkey_meth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x25519_pkey_meth) +#define x25519_sc_reduce BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x25519_sc_reduce) +#define x509_digest_sign_algorithm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x509_digest_sign_algorithm) +#define x509_digest_verify_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x509_digest_verify_init) +#define x509_print_rsa_pss_params BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x509_print_rsa_pss_params) +#define x509_rsa_ctx_to_pss BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x509_rsa_ctx_to_pss) +#define x509_rsa_pss_to_ctx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x509_rsa_pss_to_ctx) +#define x509v3_bytes_to_hex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x509v3_bytes_to_hex) +#define x509v3_hex_to_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x509v3_hex_to_bytes) +#define x509v3_looks_like_dns_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x509v3_looks_like_dns_name) +#define x509v3_name_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, x509v3_name_cmp) diff --git a/src/objective-c/BoringSSL-GRPC.podspec b/src/objective-c/BoringSSL-GRPC.podspec index 8f33cab82c5..b19433780eb 100644 --- a/src/objective-c/BoringSSL-GRPC.podspec +++ b/src/objective-c/BoringSSL-GRPC.podspec @@ -213,7 +213,7 @@ Pod::Spec.new do |s| # /src/boringssl/boringssl_prefix_symbols.h. Here we decode the content and inject the header to # the correct location in BoringSSL. base64 -D < src/include/openssl/boringssl_prefix_symbols.h - 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 EOF # We are renaming openssl to openssl_grpc so that there is no conflict with openssl if it exists diff --git a/tools/distrib/generate_boringssl_prefix_header.sh b/tools/distrib/generate_boringssl_prefix_header.sh index 740c58b26ac..60714030e53 100755 --- a/tools/distrib/generate_boringssl_prefix_header.sh +++ b/tools/distrib/generate_boringssl_prefix_header.sh @@ -32,10 +32,10 @@ BORINGSSL_COMMIT=$(git rev-parse HEAD) BORINGSSL_PREFIX_HEADERS_DIR=src/boringssl # generate the prefix header +rm -rf build mkdir -p build cd build cmake .. -make clean make -j [ -f ssl/libssl.a ] || { echo "Failed to build libssl.a" ; exit 1 ; } From 6355d71a9fd116f6fbf8c22e9caf79bc58c9d27d Mon Sep 17 00:00:00 2001 From: Eric Gribkoff Date: Fri, 10 Apr 2020 10:41:21 -0700 Subject: [PATCH 428/758] Make GCP alpha API use optional --- tools/run_tests/run_xds_tests.py | 119 +++++++++++++++++++++---------- 1 file changed, 82 insertions(+), 37 deletions(-) diff --git a/tools/run_tests/run_xds_tests.py b/tools/run_tests/run_xds_tests.py index 3ee9286431d..27d195efcb5 100755 --- a/tools/run_tests/run_xds_tests.py +++ b/tools/run_tests/run_xds_tests.py @@ -182,6 +182,10 @@ argp.add_argument('--log_client_output', help='Log captured client output', default=False, action='store_true') +argp.add_argument('--only_stable_gcp_apis', + help='Do not use alpha compute APIs', + default=False, + action='store_true') args = argp.parse_args() if args.verbose: @@ -577,16 +581,27 @@ def add_instance_group(gcp, zone, name, size): def create_health_check(gcp, name): - config = { - 'name': name, - 'type': 'GRPC', - 'grpcHealthCheck': { - 'portSpecification': 'USE_SERVING_PORT' + if gcp.alpha_compute: + config = { + 'name': name, + 'type': 'GRPC', + 'grpcHealthCheck': { + 'portSpecification': 'USE_SERVING_PORT' + } } - } + compute_to_use = gcp.alpha_compute + else: + config = { + 'name': name, + 'type': 'TCP', + 'tcpHealthCheck': { + 'portName': 'grpc' + } + } + compute_to_use = gcp.compute logger.debug('Sending GCP request with body=%s', config) - result = gcp.alpha_compute.healthChecks().insert(project=gcp.project, - body=config).execute() + result = compute_to_use.healthChecks().insert(project=gcp.project, + body=config).execute() wait_for_global_operation(gcp, result['name']) gcp.health_check = GcpResource(config['name'], result['targetLink']) @@ -610,15 +625,21 @@ def create_health_check_firewall_rule(gcp, name): def add_backend_service(gcp, name): + if gcp.alpha_compute: + protocol = 'GRPC' + compute_to_use = gcp.alpha_compute + else: + protocol = 'HTTP2' + compute_to_use = gcp.compute config = { 'name': name, 'loadBalancingScheme': 'INTERNAL_SELF_MANAGED', 'healthChecks': [gcp.health_check.url], 'portName': 'grpc', - 'protocol': 'GRPC' + 'protocol': protocol } logger.debug('Sending GCP request with body=%s', config) - result = gcp.alpha_compute.backendServices().insert(project=gcp.project, + result = compute_to_use.backendServices().insert(project=gcp.project, body=config).execute() wait_for_global_operation(gcp, result['name']) backend_service = GcpResource(config['name'], result['targetLink']) @@ -660,20 +681,33 @@ def patch_url_map_host_rule_with_port(gcp, name, backend_service, host_name): wait_for_global_operation(gcp, result['name']) -def create_target_grpc_proxy(gcp, name): - config = { - 'name': name, - 'url_map': gcp.url_map.url, - 'validate_for_proxyless': True, - } - logger.debug('Sending GCP request with body=%s', config) - result = gcp.alpha_compute.targetGrpcProxies().insert( - project=gcp.project, body=config).execute() +def create_target_proxy(gcp, name): + if gcp.alpha_compute: + config = { + 'name': name, + 'url_map': gcp.url_map.url, + 'validate_for_proxyless': True, + } + logger.debug('Sending GCP request with body=%s', config) + result = gcp.alpha_compute.targetGrpcProxies().insert( + project=gcp.project, body=config).execute() + else: + config = { + 'name': name, + 'url_map': gcp.url_map.url, + } + logger.debug('Sending GCP request with body=%s', config) + result = gcp.compute.targetHttpProxies().insert(project=gcp.project, + body=config).execute() wait_for_global_operation(gcp, result['name']) - gcp.target_grpc_proxy = GcpResource(config['name'], result['targetLink']) + gcp.target_proxy = GcpResource(config['name'], result['targetLink']) def create_global_forwarding_rule(gcp, name, potential_ports): + if gcp.alpha_compute: + compute_to_use = gcp.alpha_compute + else: + compute_to_use = gcp.compute for port in potential_ports: try: config = { @@ -682,10 +716,10 @@ def create_global_forwarding_rule(gcp, name, potential_ports): 'portRange': str(port), 'IPAddress': '0.0.0.0', 'network': args.network, - 'target': gcp.target_grpc_proxy.url, + 'target': gcp.target_proxy.url, } logger.debug('Sending GCP request with body=%s', config) - result = gcp.alpha_compute.globalForwardingRules().insert( + result = compute_to_use.globalForwardingRules().insert( project=gcp.project, body=config).execute() wait_for_global_operation(gcp, result['name']) gcp.global_forwarding_rule = GcpResource(config['name'], @@ -708,11 +742,16 @@ def delete_global_forwarding_rule(gcp): logger.info('Delete failed: %s', http_error) -def delete_target_grpc_proxy(gcp): +def delete_target_proxy(gcp): try: - result = gcp.alpha_compute.targetGrpcProxies().delete( - project=gcp.project, - targetGrpcProxy=gcp.target_grpc_proxy.name).execute() + if gcp.alpha_compute: + result = gcp.alpha_compute.targetGrpcProxies().delete( + project=gcp.project, + targetGrpcProxy=gcp.target_proxy.name).execute() + else: + result = gcp.alpha_compute.targetHttpProxies().delete( + project=gcp.project, + targetHttpProxy=gcp.target_proxy.name).execute() wait_for_global_operation(gcp, result['name']) except googleapiclient.errors.HttpError as http_error: logger.info('Delete failed: %s', http_error) @@ -786,6 +825,10 @@ def patch_backend_instances(gcp, backend_service, instance_groups, balancing_mode='UTILIZATION'): + if gcp.alpha_compute: + compute_to_use = gcp.alpha_compute + else: + compute_to_use = gcp.compute config = { 'backends': [{ 'group': instance_group.url, @@ -794,7 +837,7 @@ def patch_backend_instances(gcp, } for instance_group in instance_groups], } logger.debug('Sending GCP request with body=%s', config) - result = gcp.alpha_compute.backendServices().patch( + result = compute_to_use.backendServices().patch( project=gcp.project, backendService=backend_service.name, body=config).execute() wait_for_global_operation(gcp, @@ -922,8 +965,8 @@ def get_instance_names(gcp, instance_group): def clean_up(gcp): if gcp.global_forwarding_rule: delete_global_forwarding_rule(gcp) - if gcp.target_grpc_proxy: - delete_target_grpc_proxy(gcp) + if gcp.target_proxy: + delete_target_proxy(gcp) if gcp.url_map: delete_url_map(gcp) delete_backend_services(gcp) @@ -961,23 +1004,25 @@ class GcpState(object): self.health_check_firewall_rule = None self.backend_services = [] self.url_map = None - self.target_grpc_proxy = None + self.target_proxy = None self.global_forwarding_rule = None self.service_port = None self.instance_template = None self.instance_groups = [] - +alpha_compute = None if args.compute_discovery_document: with open(args.compute_discovery_document, 'r') as discovery_doc: compute = googleapiclient.discovery.build_from_document( discovery_doc.read()) - with open(args.alpha_compute_discovery_document, 'r') as discovery_doc: - alpha_compute = googleapiclient.discovery.build_from_document( - discovery_doc.read()) + if not args.only_stable_gcp_apis and args.alpha_compute_discovery_document: + with open(args.alpha_compute_discovery_document, 'r') as discovery_doc: + alpha_compute = googleapiclient.discovery.build_from_document( + discovery_doc.read()) else: compute = googleapiclient.discovery.build('compute', 'v1') - alpha_compute = googleapiclient.discovery.build('compute', 'alpha') + if not args.only_stable_gcp_apis: + alpha_compute = googleapiclient.discovery.build('compute', 'alpha') try: gcp = GcpState(compute, alpha_compute, args.project_id) @@ -987,7 +1032,7 @@ try: alternate_backend_service_name = _BASE_BACKEND_SERVICE_NAME + '-alternate' + args.gcp_suffix url_map_name = _BASE_URL_MAP_NAME + args.gcp_suffix service_host_name = _BASE_SERVICE_HOST + args.gcp_suffix - target_grpc_proxy_name = _BASE_TARGET_PROXY_NAME + args.gcp_suffix + target_proxy_name = _BASE_TARGET_PROXY_NAME + args.gcp_suffix forwarding_rule_name = _BASE_FORWARDING_RULE_NAME + args.gcp_suffix template_name = _BASE_TEMPLATE_NAME + args.gcp_suffix instance_group_name = _BASE_INSTANCE_GROUP_NAME + args.gcp_suffix @@ -1001,7 +1046,7 @@ try: alternate_backend_service = add_backend_service( gcp, alternate_backend_service_name) create_url_map(gcp, url_map_name, backend_service, service_host_name) - create_target_grpc_proxy(gcp, target_grpc_proxy_name) + create_target_proxy(gcp, target_proxy_name) potential_service_ports = list(args.service_port_range) random.shuffle(potential_service_ports) create_global_forwarding_rule(gcp, forwarding_rule_name, From ade157dd7afa0c7536767f188a3553c5e9966880 Mon Sep 17 00:00:00 2001 From: Eric Gribkoff Date: Fri, 10 Apr 2020 11:01:54 -0700 Subject: [PATCH 429/758] yapf --- tools/run_tests/run_xds_tests.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/run_tests/run_xds_tests.py b/tools/run_tests/run_xds_tests.py index 27d195efcb5..845aa228171 100755 --- a/tools/run_tests/run_xds_tests.py +++ b/tools/run_tests/run_xds_tests.py @@ -640,7 +640,7 @@ def add_backend_service(gcp, name): } logger.debug('Sending GCP request with body=%s', config) result = compute_to_use.backendServices().insert(project=gcp.project, - body=config).execute() + body=config).execute() wait_for_global_operation(gcp, result['name']) backend_service = GcpResource(config['name'], result['targetLink']) gcp.backend_services.append(backend_service) @@ -1010,6 +1010,7 @@ class GcpState(object): self.instance_template = None self.instance_groups = [] + alpha_compute = None if args.compute_discovery_document: with open(args.compute_discovery_document, 'r') as discovery_doc: From 6aa983e819047a10eda73b235b5903f5ec42982c Mon Sep 17 00:00:00 2001 From: Eric Gribkoff Date: Fri, 10 Apr 2020 11:26:26 -0700 Subject: [PATCH 430/758] typo --- tools/run_tests/run_xds_tests.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/run_tests/run_xds_tests.py b/tools/run_tests/run_xds_tests.py index 845aa228171..762743e0993 100755 --- a/tools/run_tests/run_xds_tests.py +++ b/tools/run_tests/run_xds_tests.py @@ -749,7 +749,7 @@ def delete_target_proxy(gcp): project=gcp.project, targetGrpcProxy=gcp.target_proxy.name).execute() else: - result = gcp.alpha_compute.targetHttpProxies().delete( + result = gcp.compute.targetHttpProxies().delete( project=gcp.project, targetHttpProxy=gcp.target_proxy.name).execute() wait_for_global_operation(gcp, result['name']) From edc2a6b988c8019b2e5debaaa8d4716c62fbe3d9 Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Fri, 10 Apr 2020 12:16:37 -0700 Subject: [PATCH 431/758] Add option for logging keepalive pings --- doc/environment_variables.md | 1 + .../transport/chttp2/transport/chttp2_transport.cc | 8 ++++++-- .../transport/chttp2/transport/chttp2_transport.h | 1 + src/core/ext/transport/chttp2/transport/writing.cc | 13 +++++++++---- 4 files changed, 17 insertions(+), 6 deletions(-) diff --git a/doc/environment_variables.md b/doc/environment_variables.md index ab45f937bff..fe3a81657eb 100644 --- a/doc/environment_variables.md +++ b/doc/environment_variables.md @@ -66,6 +66,7 @@ some configuration as environment variables that can be set. - http2_stream_state - traces all http2 stream state mutations. - http1 - traces HTTP/1.x operations performed by gRPC - inproc - traces the in-process transport + - keepalive - traces keepalive pings - flowctl - traces http2 flow control - lrs_lb - traces lrs LB policy - op_failure - traces error information when failure is pushed onto a diff --git a/src/core/ext/transport/chttp2/transport/chttp2_transport.cc b/src/core/ext/transport/chttp2/transport/chttp2_transport.cc index 3f27466611f..790a66c1260 100644 --- a/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +++ b/src/core/ext/transport/chttp2/transport/chttp2_transport.cc @@ -99,6 +99,7 @@ static int g_default_max_ping_strikes = DEFAULT_MAX_PING_STRIKES; #define MAX_CLIENT_STREAM_ID 0x7fffffffu grpc_core::TraceFlag grpc_http_trace(false, "http"); +grpc_core::TraceFlag grpc_keepalive_trace(false, "keepalive"); grpc_core::DebugOnlyTraceFlag grpc_trace_chttp2_refcount(false, "chttp2_refcount"); @@ -2771,6 +2772,7 @@ static void init_keepalive_ping(void* arg, grpc_error* error) { static void init_keepalive_ping_locked(void* arg, grpc_error* error) { grpc_chttp2_transport* t = static_cast(arg); + GPR_ASSERT(t->keepalive_state == GRPC_CHTTP2_KEEPALIVE_STATE_WAITING); if (t->destroying || t->closed_with_error != GRPC_ERROR_NONE) { t->keepalive_state = GRPC_CHTTP2_KEEPALIVE_STATE_DYING; @@ -2817,7 +2819,8 @@ static void start_keepalive_ping_locked(void* arg, grpc_error* error) { if (t->channelz_socket != nullptr) { t->channelz_socket->RecordKeepaliveSent(); } - if (GRPC_TRACE_FLAG_ENABLED(grpc_http_trace)) { + if (GRPC_TRACE_FLAG_ENABLED(grpc_http_trace) || + GRPC_TRACE_FLAG_ENABLED(grpc_keepalive_trace)) { gpr_log(GPR_INFO, "%s: Start keepalive ping", t->peer_string); } GRPC_CHTTP2_REF_TRANSPORT(t, "keepalive watchdog"); @@ -2840,7 +2843,8 @@ static void finish_keepalive_ping_locked(void* arg, grpc_error* error) { grpc_chttp2_transport* t = static_cast(arg); if (t->keepalive_state == GRPC_CHTTP2_KEEPALIVE_STATE_PINGING) { if (error == GRPC_ERROR_NONE) { - if (GRPC_TRACE_FLAG_ENABLED(grpc_http_trace)) { + if (GRPC_TRACE_FLAG_ENABLED(grpc_http_trace) || + GRPC_TRACE_FLAG_ENABLED(grpc_keepalive_trace)) { gpr_log(GPR_INFO, "%s: Finish keepalive ping", t->peer_string); } if (!t->keepalive_ping_started) { diff --git a/src/core/ext/transport/chttp2/transport/chttp2_transport.h b/src/core/ext/transport/chttp2/transport/chttp2_transport.h index 39574f93ec7..b04630bbe2b 100644 --- a/src/core/ext/transport/chttp2/transport/chttp2_transport.h +++ b/src/core/ext/transport/chttp2/transport/chttp2_transport.h @@ -27,6 +27,7 @@ #include "src/core/lib/transport/transport.h" extern grpc_core::TraceFlag grpc_http_trace; +extern grpc_core::TraceFlag grpc_keepalive_trace; extern grpc_core::TraceFlag grpc_trace_http2_stream_state; extern grpc_core::DebugOnlyTraceFlag grpc_trace_chttp2_refcount; extern grpc_core::DebugOnlyTraceFlag grpc_trace_chttp2_hpack_parser; diff --git a/src/core/ext/transport/chttp2/transport/writing.cc b/src/core/ext/transport/chttp2/transport/writing.cc index c7613afcf6f..98d7f9f3edc 100644 --- a/src/core/ext/transport/chttp2/transport/writing.cc +++ b/src/core/ext/transport/chttp2/transport/writing.cc @@ -18,6 +18,7 @@ #include +#include "src/core/ext/transport/chttp2/transport/chttp2_transport.h" #include "src/core/ext/transport/chttp2/transport/context_list.h" #include "src/core/ext/transport/chttp2/transport/internal.h" @@ -54,7 +55,8 @@ static void maybe_initiate_ping(grpc_chttp2_transport* t) { if (!grpc_closure_list_empty(pq->lists[GRPC_CHTTP2_PCL_INFLIGHT])) { /* ping already in-flight: wait */ if (GRPC_TRACE_FLAG_ENABLED(grpc_http_trace) || - GRPC_TRACE_FLAG_ENABLED(grpc_bdp_estimator_trace)) { + GRPC_TRACE_FLAG_ENABLED(grpc_bdp_estimator_trace) || + GRPC_TRACE_FLAG_ENABLED(grpc_keepalive_trace)) { gpr_log(GPR_INFO, "%s: Ping delayed [%p]: already pinging", t->is_client ? "CLIENT" : "SERVER", t->peer_string); } @@ -64,7 +66,8 @@ static void maybe_initiate_ping(grpc_chttp2_transport* t) { t->ping_policy.max_pings_without_data != 0) { /* need to receive something of substance before sending a ping again */ if (GRPC_TRACE_FLAG_ENABLED(grpc_http_trace) || - GRPC_TRACE_FLAG_ENABLED(grpc_bdp_estimator_trace)) { + GRPC_TRACE_FLAG_ENABLED(grpc_bdp_estimator_trace) || + GRPC_TRACE_FLAG_ENABLED(grpc_keepalive_trace)) { gpr_log(GPR_INFO, "%s: Ping delayed [%p]: too many recent pings: %d/%d", t->is_client ? "CLIENT" : "SERVER", t->peer_string, t->ping_state.pings_before_data_required, @@ -85,7 +88,8 @@ static void maybe_initiate_ping(grpc_chttp2_transport* t) { if (next_allowed_ping > now) { /* not enough elapsed time between successive pings */ if (GRPC_TRACE_FLAG_ENABLED(grpc_http_trace) || - GRPC_TRACE_FLAG_ENABLED(grpc_bdp_estimator_trace)) { + GRPC_TRACE_FLAG_ENABLED(grpc_bdp_estimator_trace) || + GRPC_TRACE_FLAG_ENABLED(grpc_keepalive_trace)) { gpr_log(GPR_INFO, "%s: Ping delayed [%p]: not enough time elapsed since last ping. " " Last ping %f: Next ping %f: Now %f", @@ -116,7 +120,8 @@ static void maybe_initiate_ping(grpc_chttp2_transport* t) { GRPC_STATS_INC_HTTP2_PINGS_SENT(); t->ping_state.last_ping_sent_time = now; if (GRPC_TRACE_FLAG_ENABLED(grpc_http_trace) || - GRPC_TRACE_FLAG_ENABLED(grpc_bdp_estimator_trace)) { + GRPC_TRACE_FLAG_ENABLED(grpc_bdp_estimator_trace) || + GRPC_TRACE_FLAG_ENABLED(grpc_keepalive_trace)) { gpr_log(GPR_INFO, "%s: Ping sent [%s]: %d/%d", t->is_client ? "CLIENT" : "SERVER", t->peer_string, t->ping_state.pings_before_data_required, From c90dc0e0987cbce29db4b9ac39ecec75ec78dd23 Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Fri, 10 Apr 2020 12:18:39 -0700 Subject: [PATCH 432/758] Remove blank line --- src/core/ext/transport/chttp2/transport/chttp2_transport.cc | 1 - 1 file changed, 1 deletion(-) diff --git a/src/core/ext/transport/chttp2/transport/chttp2_transport.cc b/src/core/ext/transport/chttp2/transport/chttp2_transport.cc index 790a66c1260..f1724764da3 100644 --- a/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +++ b/src/core/ext/transport/chttp2/transport/chttp2_transport.cc @@ -2772,7 +2772,6 @@ static void init_keepalive_ping(void* arg, grpc_error* error) { static void init_keepalive_ping_locked(void* arg, grpc_error* error) { grpc_chttp2_transport* t = static_cast(arg); - GPR_ASSERT(t->keepalive_state == GRPC_CHTTP2_KEEPALIVE_STATE_WAITING); if (t->destroying || t->closed_with_error != GRPC_ERROR_NONE) { t->keepalive_state = GRPC_CHTTP2_KEEPALIVE_STATE_DYING; From 2d0ed47223e252a8ecf2d1fca9a0fdee8ac5711b Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Fri, 10 Apr 2020 12:28:25 -0700 Subject: [PATCH 433/758] Reviewer comments --- doc/environment_variables.md | 2 +- src/core/ext/transport/chttp2/transport/chttp2_transport.cc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/environment_variables.md b/doc/environment_variables.md index fe3a81657eb..ec1b4f86717 100644 --- a/doc/environment_variables.md +++ b/doc/environment_variables.md @@ -66,7 +66,7 @@ some configuration as environment variables that can be set. - http2_stream_state - traces all http2 stream state mutations. - http1 - traces HTTP/1.x operations performed by gRPC - inproc - traces the in-process transport - - keepalive - traces keepalive pings + - http_keepalive - traces gRPC keepalive pings - flowctl - traces http2 flow control - lrs_lb - traces lrs LB policy - op_failure - traces error information when failure is pushed onto a diff --git a/src/core/ext/transport/chttp2/transport/chttp2_transport.cc b/src/core/ext/transport/chttp2/transport/chttp2_transport.cc index f1724764da3..cc03a406903 100644 --- a/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +++ b/src/core/ext/transport/chttp2/transport/chttp2_transport.cc @@ -99,7 +99,7 @@ static int g_default_max_ping_strikes = DEFAULT_MAX_PING_STRIKES; #define MAX_CLIENT_STREAM_ID 0x7fffffffu grpc_core::TraceFlag grpc_http_trace(false, "http"); -grpc_core::TraceFlag grpc_keepalive_trace(false, "keepalive"); +grpc_core::TraceFlag grpc_keepalive_trace(false, "http_keepalive"); grpc_core::DebugOnlyTraceFlag grpc_trace_chttp2_refcount(false, "chttp2_refcount"); From cdf7b2cc7a9404d993c43d44ca00b762b7cfa087 Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Fri, 10 Apr 2020 14:03:25 -0700 Subject: [PATCH 434/758] Use std::aligned_storage instead of absl::optional to maintain compatibility with Windows --- .../http/message_compress/message_compress_filter.cc | 11 ++++++++--- src/core/lib/transport/byte_stream.h | 2 +- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/core/ext/filters/http/message_compress/message_compress_filter.cc b/src/core/ext/filters/http/message_compress/message_compress_filter.cc index b962c99e1d5..09c914fab07 100644 --- a/src/core/ext/filters/http/message_compress/message_compress_filter.cc +++ b/src/core/ext/filters/http/message_compress/message_compress_filter.cc @@ -163,7 +163,10 @@ class CallData { grpc_linked_mdelem accept_encoding_storage_; grpc_linked_mdelem accept_stream_encoding_storage_; grpc_slice_buffer slices_; /**< Buffers up input slices to be compressed */ - absl::optional replacement_stream_; + // Allocate space for the replacement stream + std::aligned_storage::type + replacement_stream_; grpc_closure* original_send_message_on_complete_ = nullptr; grpc_closure send_message_on_complete_; grpc_closure on_send_message_next_done_; @@ -334,9 +337,11 @@ void CallData::FinishSendMessage(grpc_call_element* elem) { grpc_slice_buffer_destroy_internal(&tmp); // Swap out the original byte stream with our new one and send the // batch down. - replacement_stream_.emplace(&slices_, send_flags); + new (&replacement_stream_) + grpc_core::SliceBufferByteStream(&slices_, send_flags); send_message_batch_->payload->send_message.send_message.reset( - &replacement_stream_.value()); + reinterpret_cast( + &replacement_stream_)); original_send_message_on_complete_ = send_message_batch_->on_complete; send_message_batch_->on_complete = &send_message_on_complete_; SendMessageBatchContinue(elem); diff --git a/src/core/lib/transport/byte_stream.h b/src/core/lib/transport/byte_stream.h index ffa9b47c20d..6988ab843b2 100644 --- a/src/core/lib/transport/byte_stream.h +++ b/src/core/lib/transport/byte_stream.h @@ -72,7 +72,7 @@ class ByteStream : public Orphanable { : length_(length), flags_(flags) {} private: - uint32_t length_; + const uint32_t length_; uint32_t flags_; }; From 3c34eae97e00a7db0b9e9e1505bec4cbcda4bd02 Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Thu, 2 Apr 2020 18:54:18 -0700 Subject: [PATCH 435/758] Move decompression into gRPC Core --- BUILD | 2 + BUILD.gn | 2 + CMakeLists.txt | 2 + Makefile | 2 + build_autogenerated.yaml | 4 + config.m4 | 2 + config.w32 | 2 + gRPC-C++.podspec | 2 + gRPC-Core.podspec | 3 + grpc.gemspec | 2 + grpc.gyp | 2 + include/grpc/impl/codegen/grpc_types.h | 8 + package.xml | 2 + .../ext/filters/http/http_filters_plugin.cc | 13 + .../message_decompress_filter.cc | 339 ++++++++++++++++++ .../message_decompress_filter.h | 29 ++ src/core/lib/surface/call.cc | 7 + src/core/lib/surface/call.h | 4 + src/python/grpcio/grpc_core_dependencies.py | 1 + tools/doxygen/Doxyfile.c++.internal | 2 + tools/doxygen/Doxyfile.core.internal | 2 + 21 files changed, 432 insertions(+) create mode 100644 src/core/ext/filters/http/message_decompress/message_decompress_filter.cc create mode 100644 src/core/ext/filters/http/message_decompress/message_decompress_filter.h diff --git a/BUILD b/BUILD index 81de8203a03..00cbedae6e7 100644 --- a/BUILD +++ b/BUILD @@ -1193,11 +1193,13 @@ grpc_cc_library( "src/core/ext/filters/http/client/http_client_filter.cc", "src/core/ext/filters/http/http_filters_plugin.cc", "src/core/ext/filters/http/message_compress/message_compress_filter.cc", + "src/core/ext/filters/http/message_decompress/message_decompress_filter.cc", "src/core/ext/filters/http/server/http_server_filter.cc", ], hdrs = [ "src/core/ext/filters/http/client/http_client_filter.h", "src/core/ext/filters/http/message_compress/message_compress_filter.h", + "src/core/ext/filters/http/message_decompress/message_decompress_filter.h", "src/core/ext/filters/http/server/http_server_filter.h", ], language = "c++", diff --git a/BUILD.gn b/BUILD.gn index 129ad2b2639..94ba02bed75 100644 --- a/BUILD.gn +++ b/BUILD.gn @@ -318,6 +318,8 @@ config("grpc_config") { "src/core/ext/filters/http/http_filters_plugin.cc", "src/core/ext/filters/http/message_compress/message_compress_filter.cc", "src/core/ext/filters/http/message_compress/message_compress_filter.h", + "src/core/ext/filters/http/message_decompress/message_decompress_filter.cc", + "src/core/ext/filters/http/message_decompress/message_decompress_filter.h", "src/core/ext/filters/http/server/http_server_filter.cc", "src/core/ext/filters/http/server/http_server_filter.h", "src/core/ext/filters/max_age/max_age_filter.cc", diff --git a/CMakeLists.txt b/CMakeLists.txt index 27bf340b65a..bcd98a9dd73 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1369,6 +1369,7 @@ add_library(grpc src/core/ext/filters/http/client_authority_filter.cc src/core/ext/filters/http/http_filters_plugin.cc src/core/ext/filters/http/message_compress/message_compress_filter.cc + src/core/ext/filters/http/message_decompress/message_decompress_filter.cc src/core/ext/filters/http/server/http_server_filter.cc src/core/ext/filters/max_age/max_age_filter.cc src/core/ext/filters/message_size/message_size_filter.cc @@ -2028,6 +2029,7 @@ add_library(grpc_unsecure src/core/ext/filters/http/client_authority_filter.cc src/core/ext/filters/http/http_filters_plugin.cc src/core/ext/filters/http/message_compress/message_compress_filter.cc + src/core/ext/filters/http/message_decompress/message_decompress_filter.cc src/core/ext/filters/http/server/http_server_filter.cc src/core/ext/filters/max_age/max_age_filter.cc src/core/ext/filters/message_size/message_size_filter.cc diff --git a/Makefile b/Makefile index d6c8cd19efa..b99620e7207 100644 --- a/Makefile +++ b/Makefile @@ -3694,6 +3694,7 @@ LIBGRPC_SRC = \ src/core/ext/filters/http/client_authority_filter.cc \ src/core/ext/filters/http/http_filters_plugin.cc \ src/core/ext/filters/http/message_compress/message_compress_filter.cc \ + src/core/ext/filters/http/message_decompress/message_decompress_filter.cc \ src/core/ext/filters/http/server/http_server_filter.cc \ src/core/ext/filters/max_age/max_age_filter.cc \ src/core/ext/filters/message_size/message_size_filter.cc \ @@ -4327,6 +4328,7 @@ LIBGRPC_UNSECURE_SRC = \ src/core/ext/filters/http/client_authority_filter.cc \ src/core/ext/filters/http/http_filters_plugin.cc \ src/core/ext/filters/http/message_compress/message_compress_filter.cc \ + src/core/ext/filters/http/message_decompress/message_decompress_filter.cc \ src/core/ext/filters/http/server/http_server_filter.cc \ src/core/ext/filters/max_age/max_age_filter.cc \ src/core/ext/filters/message_size/message_size_filter.cc \ diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml index 30dba593d4f..e7fc808d798 100644 --- a/build_autogenerated.yaml +++ b/build_autogenerated.yaml @@ -423,6 +423,7 @@ libs: - src/core/ext/filters/http/client/http_client_filter.h - src/core/ext/filters/http/client_authority_filter.h - src/core/ext/filters/http/message_compress/message_compress_filter.h + - src/core/ext/filters/http/message_decompress/message_decompress_filter.h - src/core/ext/filters/http/server/http_server_filter.h - src/core/ext/filters/max_age/max_age_filter.h - src/core/ext/filters/message_size/message_size_filter.h @@ -795,6 +796,7 @@ libs: - src/core/ext/filters/http/client_authority_filter.cc - src/core/ext/filters/http/http_filters_plugin.cc - src/core/ext/filters/http/message_compress/message_compress_filter.cc + - src/core/ext/filters/http/message_decompress/message_decompress_filter.cc - src/core/ext/filters/http/server/http_server_filter.cc - src/core/ext/filters/max_age/max_age_filter.cc - src/core/ext/filters/message_size/message_size_filter.cc @@ -1325,6 +1327,7 @@ libs: - src/core/ext/filters/http/client/http_client_filter.h - src/core/ext/filters/http/client_authority_filter.h - src/core/ext/filters/http/message_compress/message_compress_filter.h + - src/core/ext/filters/http/message_decompress/message_decompress_filter.h - src/core/ext/filters/http/server/http_server_filter.h - src/core/ext/filters/max_age/max_age_filter.h - src/core/ext/filters/message_size/message_size_filter.h @@ -1632,6 +1635,7 @@ libs: - src/core/ext/filters/http/client_authority_filter.cc - src/core/ext/filters/http/http_filters_plugin.cc - src/core/ext/filters/http/message_compress/message_compress_filter.cc + - src/core/ext/filters/http/message_decompress/message_decompress_filter.cc - src/core/ext/filters/http/server/http_server_filter.cc - src/core/ext/filters/max_age/max_age_filter.cc - src/core/ext/filters/message_size/message_size_filter.cc diff --git a/config.m4 b/config.m4 index 6b450315f4f..4a252459015 100644 --- a/config.m4 +++ b/config.m4 @@ -104,6 +104,7 @@ if test "$PHP_GRPC" != "no"; then src/core/ext/filters/http/client_authority_filter.cc \ src/core/ext/filters/http/http_filters_plugin.cc \ src/core/ext/filters/http/message_compress/message_compress_filter.cc \ + src/core/ext/filters/http/message_decompress/message_decompress_filter.cc \ src/core/ext/filters/http/server/http_server_filter.cc \ src/core/ext/filters/max_age/max_age_filter.cc \ src/core/ext/filters/message_size/message_size_filter.cc \ @@ -841,6 +842,7 @@ if test "$PHP_GRPC" != "no"; then PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/http) PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/http/client) PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/http/message_compress) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/http/message_decompress) PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/http/server) PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/max_age) PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/message_size) diff --git a/config.w32 b/config.w32 index 59cdbdb1ce4..afdf09c9c39 100644 --- a/config.w32 +++ b/config.w32 @@ -73,6 +73,7 @@ if (PHP_GRPC != "no") { "src\\core\\ext\\filters\\http\\client_authority_filter.cc " + "src\\core\\ext\\filters\\http\\http_filters_plugin.cc " + "src\\core\\ext\\filters\\http\\message_compress\\message_compress_filter.cc " + + "src\\core\\ext\\filters\\http\\message_decompress\\message_decompress_filter.cc " + "src\\core\\ext\\filters\\http\\server\\http_server_filter.cc " + "src\\core\\ext\\filters\\max_age\\max_age_filter.cc " + "src\\core\\ext\\filters\\message_size\\message_size_filter.cc " + @@ -842,6 +843,7 @@ if (PHP_GRPC != "no") { FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\http"); FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\http\\client"); FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\http\\message_compress"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\http\\message_decompress"); FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\http\\server"); FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\max_age"); FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\message_size"); diff --git a/gRPC-C++.podspec b/gRPC-C++.podspec index 77980999b59..bda48ecdd6d 100644 --- a/gRPC-C++.podspec +++ b/gRPC-C++.podspec @@ -274,6 +274,7 @@ Pod::Spec.new do |s| 'src/core/ext/filters/http/client/http_client_filter.h', 'src/core/ext/filters/http/client_authority_filter.h', 'src/core/ext/filters/http/message_compress/message_compress_filter.h', + 'src/core/ext/filters/http/message_decompress/message_decompress_filter.h', 'src/core/ext/filters/http/server/http_server_filter.h', 'src/core/ext/filters/max_age/max_age_filter.h', 'src/core/ext/filters/message_size/message_size_filter.h', @@ -725,6 +726,7 @@ Pod::Spec.new do |s| 'src/core/ext/filters/http/client/http_client_filter.h', 'src/core/ext/filters/http/client_authority_filter.h', 'src/core/ext/filters/http/message_compress/message_compress_filter.h', + 'src/core/ext/filters/http/message_decompress/message_decompress_filter.h', 'src/core/ext/filters/http/server/http_server_filter.h', 'src/core/ext/filters/max_age/max_age_filter.h', 'src/core/ext/filters/message_size/message_size_filter.h', diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec index 749e77b3fa7..b75f502128d 100644 --- a/gRPC-Core.podspec +++ b/gRPC-Core.podspec @@ -301,6 +301,8 @@ Pod::Spec.new do |s| 'src/core/ext/filters/http/http_filters_plugin.cc', 'src/core/ext/filters/http/message_compress/message_compress_filter.cc', 'src/core/ext/filters/http/message_compress/message_compress_filter.h', + 'src/core/ext/filters/http/message_decompress/message_decompress_filter.cc', + 'src/core/ext/filters/http/message_decompress/message_decompress_filter.h', 'src/core/ext/filters/http/server/http_server_filter.cc', 'src/core/ext/filters/http/server/http_server_filter.h', 'src/core/ext/filters/max_age/max_age_filter.cc', @@ -1078,6 +1080,7 @@ Pod::Spec.new do |s| 'src/core/ext/filters/http/client/http_client_filter.h', 'src/core/ext/filters/http/client_authority_filter.h', 'src/core/ext/filters/http/message_compress/message_compress_filter.h', + 'src/core/ext/filters/http/message_decompress/message_decompress_filter.h', 'src/core/ext/filters/http/server/http_server_filter.h', 'src/core/ext/filters/max_age/max_age_filter.h', 'src/core/ext/filters/message_size/message_size_filter.h', diff --git a/grpc.gemspec b/grpc.gemspec index 29e5d3d436b..e902a7c29fc 100644 --- a/grpc.gemspec +++ b/grpc.gemspec @@ -223,6 +223,8 @@ Gem::Specification.new do |s| s.files += %w( src/core/ext/filters/http/http_filters_plugin.cc ) s.files += %w( src/core/ext/filters/http/message_compress/message_compress_filter.cc ) s.files += %w( src/core/ext/filters/http/message_compress/message_compress_filter.h ) + s.files += %w( src/core/ext/filters/http/message_decompress/message_decompress_filter.cc ) + s.files += %w( src/core/ext/filters/http/message_decompress/message_decompress_filter.h ) s.files += %w( src/core/ext/filters/http/server/http_server_filter.cc ) s.files += %w( src/core/ext/filters/http/server/http_server_filter.h ) s.files += %w( src/core/ext/filters/max_age/max_age_filter.cc ) diff --git a/grpc.gyp b/grpc.gyp index a62c034d65a..458eae5e114 100644 --- a/grpc.gyp +++ b/grpc.gyp @@ -497,6 +497,7 @@ 'src/core/ext/filters/http/client_authority_filter.cc', 'src/core/ext/filters/http/http_filters_plugin.cc', 'src/core/ext/filters/http/message_compress/message_compress_filter.cc', + 'src/core/ext/filters/http/message_decompress/message_decompress_filter.cc', 'src/core/ext/filters/http/server/http_server_filter.cc', 'src/core/ext/filters/max_age/max_age_filter.cc', 'src/core/ext/filters/message_size/message_size_filter.cc', @@ -992,6 +993,7 @@ 'src/core/ext/filters/http/client_authority_filter.cc', 'src/core/ext/filters/http/http_filters_plugin.cc', 'src/core/ext/filters/http/message_compress/message_compress_filter.cc', + 'src/core/ext/filters/http/message_decompress/message_decompress_filter.cc', 'src/core/ext/filters/http/server/http_server_filter.cc', 'src/core/ext/filters/max_age/max_age_filter.cc', 'src/core/ext/filters/message_size/message_size_filter.cc', diff --git a/include/grpc/impl/codegen/grpc_types.h b/include/grpc/impl/codegen/grpc_types.h index ff45450f3a3..c1624ad9b7c 100644 --- a/include/grpc/impl/codegen/grpc_types.h +++ b/include/grpc/impl/codegen/grpc_types.h @@ -174,6 +174,14 @@ typedef struct { /** Enable/disable support for per-message compression. Defaults to 1, unless GRPC_ARG_MINIMAL_STACK is enabled, in which case it defaults to 0. */ #define GRPC_ARG_ENABLE_PER_MESSAGE_COMPRESSION "grpc.per_message_compression" +/** Experimental Arg. Enable/disable support for per-message decompression. + Defaults to 1, unless GRPC_ARG_MINIMAL_STACK is enabled, in which case it + defaults to 0. If disabled, decompression will be performed lazily by + grpc_byte_buffer_reader. This arg also determines whether max message limits + will be applied to the decompressed buffer or the non-decompressed buffer. It + is recommended to keep this enabled to protect against zip bomb attacks. */ +#define GRPC_ARG_ENABLE_PER_MESSAGE_DECOMPRESSION \ + "grpc.per_message_decompression" /** Enable/disable support for deadline checking. Defaults to 1, unless GRPC_ARG_MINIMAL_STACK is enabled, in which case it defaults to 0 */ #define GRPC_ARG_ENABLE_DEADLINE_CHECKS "grpc.enable_deadline_checking" diff --git a/package.xml b/package.xml index 06d1669ec48..5391f709cd3 100644 --- a/package.xml +++ b/package.xml @@ -203,6 +203,8 @@ + + diff --git a/src/core/ext/filters/http/http_filters_plugin.cc b/src/core/ext/filters/http/http_filters_plugin.cc index f03fa0141df..59749d54546 100644 --- a/src/core/ext/filters/http/http_filters_plugin.cc +++ b/src/core/ext/filters/http/http_filters_plugin.cc @@ -22,6 +22,7 @@ #include "src/core/ext/filters/http/client/http_client_filter.h" #include "src/core/ext/filters/http/message_compress/message_compress_filter.h" +#include "src/core/ext/filters/http/message_decompress/message_decompress_filter.h" #include "src/core/ext/filters/http/server/http_server_filter.h" #include "src/core/lib/channel/channel_stack_builder.h" #include "src/core/lib/surface/call.h" @@ -36,6 +37,9 @@ typedef struct { static optional_filter compress_filter = { &grpc_message_compress_filter, GRPC_ARG_ENABLE_PER_MESSAGE_COMPRESSION}; +static optional_filter decompress_filter = { + &grpc_message_decompress_filter, GRPC_ARG_ENABLE_PER_MESSAGE_DECOMPRESSION}; + static bool is_building_http_like_transport( grpc_channel_stack_builder* builder) { grpc_transport* t = grpc_channel_stack_builder_get_transport(builder); @@ -75,6 +79,15 @@ void grpc_http_filters_init(void) { grpc_channel_init_register_stage(GRPC_SERVER_CHANNEL, GRPC_CHANNEL_INIT_BUILTIN_PRIORITY, maybe_add_optional_filter, &compress_filter); + grpc_channel_init_register_stage( + GRPC_CLIENT_SUBCHANNEL, GRPC_CHANNEL_INIT_BUILTIN_PRIORITY, + maybe_add_optional_filter, &decompress_filter); + grpc_channel_init_register_stage( + GRPC_CLIENT_DIRECT_CHANNEL, GRPC_CHANNEL_INIT_BUILTIN_PRIORITY, + maybe_add_optional_filter, &decompress_filter); + grpc_channel_init_register_stage( + GRPC_SERVER_CHANNEL, GRPC_CHANNEL_INIT_BUILTIN_PRIORITY, + maybe_add_optional_filter, &decompress_filter); grpc_channel_init_register_stage( GRPC_CLIENT_SUBCHANNEL, GRPC_CHANNEL_INIT_BUILTIN_PRIORITY, maybe_add_required_filter, (void*)&grpc_http_client_filter); diff --git a/src/core/ext/filters/http/message_decompress/message_decompress_filter.cc b/src/core/ext/filters/http/message_decompress/message_decompress_filter.cc new file mode 100644 index 00000000000..c6a5f8d2847 --- /dev/null +++ b/src/core/ext/filters/http/message_decompress/message_decompress_filter.cc @@ -0,0 +1,339 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include + +#include +#include + +#include +#include +#include +#include + +#include "src/core/ext/filters/http/message_decompress/message_decompress_filter.h" +#include "src/core/lib/channel/channel_args.h" +#include "src/core/lib/compression/algorithm_metadata.h" +#include "src/core/lib/compression/compression_args.h" +#include "src/core/lib/compression/compression_internal.h" +#include "src/core/lib/compression/message_compress.h" +#include "src/core/lib/gpr/string.h" +#include "src/core/lib/gprpp/manual_constructor.h" +#include "src/core/lib/profiling/timers.h" +#include "src/core/lib/slice/slice_internal.h" +#include "src/core/lib/slice/slice_string_helpers.h" +#include "src/core/lib/surface/call.h" +#include "src/core/lib/transport/static_metadata.h" + +namespace { + +class ChannelData {}; + +class CallData { + public: + CallData(const grpc_call_element_args& args) + : call_combiner_(args.call_combiner) { + // Initialize state for recv_initial_metadata_ready callback + GRPC_CLOSURE_INIT(&on_recv_initial_metadata_ready_, + OnRecvInitialMetadataReady, this, + grpc_schedule_on_exec_ctx); + // Initialize state for recv_message_ready callback + grpc_slice_buffer_init(&recv_slices_); + GRPC_CLOSURE_INIT(&on_recv_message_next_done_, OnRecvMessageNextDone, this, + grpc_schedule_on_exec_ctx); + GRPC_CLOSURE_INIT(&on_recv_message_ready_, OnRecvMessageReady, this, + grpc_schedule_on_exec_ctx); + // Initialize state for recv_trailing_metadata_ready callback + GRPC_CLOSURE_INIT(&on_recv_trailing_metadata_ready_, + OnRecvTrailingMetadataReady, this, + grpc_schedule_on_exec_ctx); + } + + static void DecompressStartTransportStreamOpBatch( + grpc_call_element* elem, grpc_transport_stream_op_batch* batch); + + static void OnRecvInitialMetadataReady(void* arg, grpc_error* error); + + // Methods for processing a receive message event + void MaybeResumeOnRecvMessageReady(); + static void OnRecvMessageReady(void* arg, grpc_error* error); + static void OnRecvMessageNextDone(void* arg, grpc_error* error); + grpc_error* PullSliceFromRecvMessage(); + void ContinueReadingRecvMessage(); + void FinishRecvMessage(); + void ContinueRecvMessageReadyCallback(grpc_error* error); + + // Methods for processing a recv_trailing_metadata event + void MaybeResumeOnRecvTrailingMetadataReady(); + static void OnRecvTrailingMetadataReady(void* arg, grpc_error* error); + + private: + grpc_core::CallCombiner* call_combiner_ = nullptr; + // Overall error for the call + grpc_error* error_ = GRPC_ERROR_NONE; + // Fields for handling recv_initial_metadata_ready callback + grpc_closure on_recv_initial_metadata_ready_; + grpc_closure* original_recv_initial_metadata_ready_ = nullptr; + grpc_metadata_batch* recv_initial_metadata_ = nullptr; + // Fields for handling recv_message_ready callback + bool seen_recv_message_ready_ = false; + grpc_message_compression_algorithm algorithm_ = GRPC_MESSAGE_COMPRESS_NONE; + grpc_closure on_recv_message_ready_; + grpc_closure* original_recv_message_ready_ = nullptr; + grpc_closure on_recv_message_next_done_; + grpc_core::OrphanablePtr* recv_message_ = nullptr; + // recv_slices_ holds the slices read from the original recv_message stream. + // It is initialized during construction and reset when a new stream is + // created using it. + grpc_slice_buffer recv_slices_; + grpc_core::ManualConstructor + recv_replacement_stream_; + // Fields for handling recv_trailing_metadata_ready callback + bool seen_recv_trailing_metadata_ready_ = false; + grpc_closure on_recv_trailing_metadata_ready_; + grpc_closure* original_recv_trailing_metadata_ready_ = nullptr; + grpc_error* on_recv_trailing_metadata_ready_error_ = GRPC_ERROR_NONE; +}; + +grpc_message_compression_algorithm DecodeMessageCompressionAlgorithm( + grpc_mdelem md) { + grpc_message_compression_algorithm algorithm = + grpc_message_compression_algorithm_from_slice(GRPC_MDVALUE(md)); + if (algorithm == GRPC_MESSAGE_COMPRESS_ALGORITHMS_COUNT) { + char* md_c_str = grpc_slice_to_c_string(GRPC_MDVALUE(md)); + gpr_log(GPR_ERROR, + "Invalid incoming message compression algorithm: '%s'. " + "Interpreting incoming data as uncompressed.", + md_c_str); + gpr_free(md_c_str); + return GRPC_MESSAGE_COMPRESS_NONE; + } + return algorithm; +} + +void CallData::OnRecvInitialMetadataReady(void* arg, grpc_error* error) { + CallData* calld = static_cast(arg); + if (error == GRPC_ERROR_NONE) { + grpc_linked_mdelem* grpc_encoding = + calld->recv_initial_metadata_->idx.named.grpc_encoding; + if (grpc_encoding != nullptr) { + calld->algorithm_ = DecodeMessageCompressionAlgorithm(grpc_encoding->md); + grpc_metadata_batch_remove(calld->recv_initial_metadata_, + GRPC_BATCH_GRPC_ENCODING); + } + } + calld->MaybeResumeOnRecvMessageReady(); + calld->MaybeResumeOnRecvTrailingMetadataReady(); + grpc_closure* closure = calld->original_recv_initial_metadata_ready_; + calld->original_recv_initial_metadata_ready_ = nullptr; + grpc_core::Closure::Run(DEBUG_LOCATION, closure, GRPC_ERROR_REF(error)); +} + +void CallData::MaybeResumeOnRecvMessageReady() { + if (seen_recv_message_ready_) { + seen_recv_message_ready_ = false; + GRPC_CALL_COMBINER_START(call_combiner_, &on_recv_message_ready_, + GRPC_ERROR_NONE, + "continue recv_message_ready callback"); + } +} + +void CallData::OnRecvMessageReady(void* arg, grpc_error* error) { + CallData* calld = static_cast(arg); + if (error == GRPC_ERROR_NONE && + calld->algorithm_ != GRPC_MESSAGE_COMPRESS_NONE) { + // recv_message can be NULL if trailing metadata is received instead of + // message. + if (*calld->recv_message_ == nullptr || + (*calld->recv_message_)->length() == 0) { + calld->ContinueRecvMessageReadyCallback(GRPC_ERROR_NONE); + return; + } + if (calld->original_recv_initial_metadata_ready_ != nullptr) { + calld->seen_recv_message_ready_ = true; + GRPC_CALL_COMBINER_STOP(calld->call_combiner_, + "Deferring OnRecvMessageReady until after " + "OnRecvInitialMetadataReady"); + return; + } + calld->ContinueReadingRecvMessage(); + } else { + calld->ContinueRecvMessageReadyCallback(GRPC_ERROR_REF(error)); + } +} + +void CallData::ContinueReadingRecvMessage() { + while ((*recv_message_) + ->Next(~static_cast(0), &on_recv_message_next_done_)) { + grpc_error* error = PullSliceFromRecvMessage(); + if (error != GRPC_ERROR_NONE) { + return ContinueRecvMessageReadyCallback(error); + } + // We have read the entire message. + if (recv_slices_.length == (*recv_message_)->length()) { + return FinishRecvMessage(); + } + } +} + +grpc_error* CallData::PullSliceFromRecvMessage() { + grpc_slice incoming_slice; + grpc_error* error = (*recv_message_)->Pull(&incoming_slice); + if (error == GRPC_ERROR_NONE) { + grpc_slice_buffer_add(&recv_slices_, incoming_slice); + } + return error; +} + +void CallData::OnRecvMessageNextDone(void* arg, grpc_error* error) { + CallData* calld = static_cast(arg); + if (error != GRPC_ERROR_NONE) { + return calld->ContinueRecvMessageReadyCallback(GRPC_ERROR_REF(error)); + } + error = calld->PullSliceFromRecvMessage(); + if (error != GRPC_ERROR_NONE) { + return calld->ContinueRecvMessageReadyCallback(error); + } + if (calld->recv_slices_.length == (*calld->recv_message_)->length()) { + calld->FinishRecvMessage(); + } else { + calld->ContinueReadingRecvMessage(); + } +} + +void CallData::FinishRecvMessage() { + grpc_slice_buffer decompressed_slices; + if (grpc_msg_decompress(algorithm_, &recv_slices_, &decompressed_slices) == + 0) { + gpr_log( + GPR_ERROR, + "Unexpected error decompressing data for algorithm with enum value %d", + algorithm_); + } + uint32_t recv_flags = (*recv_message_)->flags(); + // Swap out the original receive byte stream with our new one and send the + // batch down. + recv_replacement_stream_.Init(&recv_slices_, recv_flags); + recv_message_->reset(recv_replacement_stream_.get()); + recv_message_ = nullptr; + ContinueRecvMessageReadyCallback(GRPC_ERROR_NONE); +} + +void CallData::ContinueRecvMessageReadyCallback(grpc_error* error) { + MaybeResumeOnRecvTrailingMetadataReady(); + // The surface will clean up the receiving stream if there is an error. + grpc_closure* closure = original_recv_message_ready_; + original_recv_message_ready_ = nullptr; + grpc_core::Closure::Run(DEBUG_LOCATION, closure, error); +} + +void CallData::MaybeResumeOnRecvTrailingMetadataReady() { + if (seen_recv_trailing_metadata_ready_) { + seen_recv_trailing_metadata_ready_ = false; + grpc_error* error = on_recv_trailing_metadata_ready_error_; + on_recv_trailing_metadata_ready_error_ = GRPC_ERROR_NONE; + GRPC_CALL_COMBINER_START(call_combiner_, &on_recv_trailing_metadata_ready_, + error, "Continuing OnRecvTrailingMetadataReady"); + } +} + +void CallData::OnRecvTrailingMetadataReady(void* arg, grpc_error* error) { + CallData* calld = static_cast(arg); + if (calld->original_recv_initial_metadata_ready_ != nullptr || + calld->original_recv_message_ready_ != nullptr) { + calld->seen_recv_trailing_metadata_ready_ = true; + calld->on_recv_trailing_metadata_ready_error_ = GRPC_ERROR_REF(error); + GRPC_CALL_COMBINER_STOP( + calld->call_combiner_, + "Deferring OnRecvTrailingMetadataReady until after " + "OnRecvInitialMetadataReady and OnRecvMessageReady"); + return; + } + error = grpc_error_add_child(GRPC_ERROR_REF(error), calld->error_); + calld->error_ = GRPC_ERROR_NONE; + grpc_closure* closure = calld->original_recv_trailing_metadata_ready_; + calld->original_recv_trailing_metadata_ready_ = nullptr; + grpc_core::Closure::Run(DEBUG_LOCATION, closure, error); +} + +void CallData::DecompressStartTransportStreamOpBatch( + grpc_call_element* elem, grpc_transport_stream_op_batch* batch) { + GPR_TIMER_SCOPE("compress_start_transport_stream_op_batch", 0); + CallData* calld = static_cast(elem->call_data); + // Handle recv_initial_metadata. + if (batch->recv_initial_metadata) { + calld->recv_initial_metadata_ = + batch->payload->recv_initial_metadata.recv_initial_metadata; + calld->original_recv_initial_metadata_ready_ = + batch->payload->recv_initial_metadata.recv_initial_metadata_ready; + batch->payload->recv_initial_metadata.recv_initial_metadata_ready = + &calld->on_recv_initial_metadata_ready_; + } + // Handle recv_message + if (batch->recv_message) { + calld->recv_message_ = batch->payload->recv_message.recv_message; + calld->original_recv_message_ready_ = + batch->payload->recv_message.recv_message_ready; + batch->payload->recv_message.recv_message_ready = + &calld->on_recv_message_ready_; + } + // Handle recv_trailing_metadata + if (batch->recv_trailing_metadata) { + calld->original_recv_trailing_metadata_ready_ = + batch->payload->recv_trailing_metadata.recv_trailing_metadata_ready; + batch->payload->recv_trailing_metadata.recv_trailing_metadata_ready = + &calld->on_recv_trailing_metadata_ready_; + } + // Pass control down the stack. + grpc_call_next_op(elem, batch); +} + +static grpc_error* DecompressInitCallElem(grpc_call_element* elem, + const grpc_call_element_args* args) { + new (elem->call_data) CallData(*args); + return GRPC_ERROR_NONE; +} + +static void DecompressDestroyCallElem( + grpc_call_element* elem, const grpc_call_final_info* /*final_info*/, + grpc_closure* /*ignored*/) { + CallData* calld = static_cast(elem->call_data); + calld->~CallData(); +} + +static grpc_error* DecompressInitChannelElem( + grpc_channel_element* /*elem*/, grpc_channel_element_args* /*args*/) { + return GRPC_ERROR_NONE; +} + +void DecompressDestroyChannelElem(grpc_channel_element* /*elem*/) { return; } + +} // namespace + +const grpc_channel_filter grpc_message_decompress_filter = { + CallData::DecompressStartTransportStreamOpBatch, + grpc_channel_next_op, + sizeof(CallData), + DecompressInitCallElem, + grpc_call_stack_ignore_set_pollset_or_pollset_set, + DecompressDestroyCallElem, + 0, // sizeof(ChannelData) + DecompressInitChannelElem, + DecompressDestroyChannelElem, + grpc_channel_next_get_info, + "message_decompress"}; diff --git a/src/core/ext/filters/http/message_decompress/message_decompress_filter.h b/src/core/ext/filters/http/message_decompress/message_decompress_filter.h new file mode 100644 index 00000000000..5e6b01d5cbb --- /dev/null +++ b/src/core/ext/filters/http/message_decompress/message_decompress_filter.h @@ -0,0 +1,29 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPC_CORE_EXT_FILTERS_HTTP_MESSAGE_DECOMPRESS_MESSAGE_DECOMPRESS_FILTER_H +#define GRPC_CORE_EXT_FILTERS_HTTP_MESSAGE_DECOMPRESS_MESSAGE_DECOMPRESS_FILTER_H + +#include + +#include "src/core/lib/channel/channel_stack.h" + +extern const grpc_channel_filter grpc_message_decompress_filter; + +#endif /* GRPC_CORE_EXT_FILTERS_HTTP_MESSAGE_DECOMPRESS_MESSAGE_DECOMPRESS_FILTER_H \ + */ diff --git a/src/core/lib/surface/call.cc b/src/core/lib/surface/call.cc index fcebe9bc410..339b2438c03 100644 --- a/src/core/lib/surface/call.cc +++ b/src/core/lib/surface/call.cc @@ -200,6 +200,8 @@ struct grpc_call { /* Stream compression algorithm for *incoming* data */ grpc_stream_compression_algorithm incoming_stream_compression_algorithm = GRPC_STREAM_COMPRESS_NONE; + /* Maximum size for uncompressed receive message in bytes. -1 for unlimited */ + int max_uncompressed_receive_message_length = -1; /* Supported encodings (compression algorithms), a bitset. * Always support no compression. */ uint32_t encodings_accepted_by_peer = 1 << GRPC_MESSAGE_COMPRESS_NONE; @@ -497,6 +499,11 @@ void grpc_call_set_completion_queue(grpc_call* call, &call->pollent); } +void grpc_call_set_max_uncompressed_receive_message_length(grpc_call* call, + int limit) { + call->max_uncompressed_receive_message_length = limit; +} + #ifndef NDEBUG #define REF_REASON reason #define REF_ARG , const char* reason diff --git a/src/core/lib/surface/call.h b/src/core/lib/surface/call.h index a33664af6a9..351e57d75cb 100644 --- a/src/core/lib/surface/call.h +++ b/src/core/lib/surface/call.h @@ -59,6 +59,10 @@ grpc_error* grpc_call_create(const grpc_call_create_args* args, void grpc_call_set_completion_queue(grpc_call* call, grpc_completion_queue* cq); +/* Sets the max uncompressed receive message length for the call. */ +void grpc_call_set_max_uncompressed_receive_message_length(grpc_call* call, + int limit); + #ifndef NDEBUG void grpc_call_internal_ref(grpc_call* call, const char* reason); void grpc_call_internal_unref(grpc_call* call, const char* reason); diff --git a/src/python/grpcio/grpc_core_dependencies.py b/src/python/grpcio/grpc_core_dependencies.py index 6c2dfed4ae3..607eb74c354 100644 --- a/src/python/grpcio/grpc_core_dependencies.py +++ b/src/python/grpcio/grpc_core_dependencies.py @@ -82,6 +82,7 @@ CORE_SOURCE_FILES = [ 'src/core/ext/filters/http/client_authority_filter.cc', 'src/core/ext/filters/http/http_filters_plugin.cc', 'src/core/ext/filters/http/message_compress/message_compress_filter.cc', + 'src/core/ext/filters/http/message_decompress/message_decompress_filter.cc', 'src/core/ext/filters/http/server/http_server_filter.cc', 'src/core/ext/filters/max_age/max_age_filter.cc', 'src/core/ext/filters/message_size/message_size_filter.cc', diff --git a/tools/doxygen/Doxyfile.c++.internal b/tools/doxygen/Doxyfile.c++.internal index 60e99d7b5a0..3e9f42468a0 100644 --- a/tools/doxygen/Doxyfile.c++.internal +++ b/tools/doxygen/Doxyfile.c++.internal @@ -1186,6 +1186,8 @@ src/core/ext/filters/http/client_authority_filter.h \ src/core/ext/filters/http/http_filters_plugin.cc \ src/core/ext/filters/http/message_compress/message_compress_filter.cc \ src/core/ext/filters/http/message_compress/message_compress_filter.h \ +src/core/ext/filters/http/message_decompress/message_decompress_filter.cc \ +src/core/ext/filters/http/message_decompress/message_decompress_filter.h \ src/core/ext/filters/http/server/http_server_filter.cc \ src/core/ext/filters/http/server/http_server_filter.h \ src/core/ext/filters/max_age/max_age_filter.cc \ diff --git a/tools/doxygen/Doxyfile.core.internal b/tools/doxygen/Doxyfile.core.internal index fef1fd11d4a..8b6f9a7cb3c 100644 --- a/tools/doxygen/Doxyfile.core.internal +++ b/tools/doxygen/Doxyfile.core.internal @@ -986,6 +986,8 @@ src/core/ext/filters/http/client_authority_filter.h \ src/core/ext/filters/http/http_filters_plugin.cc \ src/core/ext/filters/http/message_compress/message_compress_filter.cc \ src/core/ext/filters/http/message_compress/message_compress_filter.h \ +src/core/ext/filters/http/message_decompress/message_decompress_filter.cc \ +src/core/ext/filters/http/message_decompress/message_decompress_filter.h \ src/core/ext/filters/http/server/http_server_filter.cc \ src/core/ext/filters/http/server/http_server_filter.h \ src/core/ext/filters/max_age/max_age_filter.cc \ From f1d8be6af42b605c312476b68beab41af1a0142e Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Fri, 3 Apr 2020 04:29:24 -0700 Subject: [PATCH 436/758] Pass decompression errors to status --- .../message_decompress_filter.cc | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/src/core/ext/filters/http/message_decompress/message_decompress_filter.cc b/src/core/ext/filters/http/message_decompress/message_decompress_filter.cc index c6a5f8d2847..2543a86fdad 100644 --- a/src/core/ext/filters/http/message_decompress/message_decompress_filter.cc +++ b/src/core/ext/filters/http/message_decompress/message_decompress_filter.cc @@ -25,6 +25,7 @@ #include #include #include +#include #include "src/core/ext/filters/http/message_decompress/message_decompress_filter.h" #include "src/core/lib/channel/channel_args.h" @@ -220,18 +221,23 @@ void CallData::FinishRecvMessage() { grpc_slice_buffer decompressed_slices; if (grpc_msg_decompress(algorithm_, &recv_slices_, &decompressed_slices) == 0) { - gpr_log( - GPR_ERROR, + char* msg; + gpr_asprintf( + &msg, "Unexpected error decompressing data for algorithm with enum value %d", algorithm_); + GPR_DEBUG_ASSERT(error_ == GRPC_ERROR_NONE); + error_ = GRPC_ERROR_CREATE_FROM_COPIED_STRING(msg); + gpr_free(msg); + } else { + uint32_t recv_flags = (*recv_message_)->flags(); + // Swap out the original receive byte stream with our new one and send the + // batch down. + recv_replacement_stream_.Init(&recv_slices_, recv_flags); + recv_message_->reset(recv_replacement_stream_.get()); + recv_message_ = nullptr; } - uint32_t recv_flags = (*recv_message_)->flags(); - // Swap out the original receive byte stream with our new one and send the - // batch down. - recv_replacement_stream_.Init(&recv_slices_, recv_flags); - recv_message_->reset(recv_replacement_stream_.get()); - recv_message_ = nullptr; - ContinueRecvMessageReadyCallback(GRPC_ERROR_NONE); + ContinueRecvMessageReadyCallback(GRPC_ERROR_REF(error_)); } void CallData::ContinueRecvMessageReadyCallback(grpc_error* error) { From aca1145bb6b91f8309b39e69e51ae688dc7c4bbf Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Mon, 6 Apr 2020 18:26:38 -0700 Subject: [PATCH 437/758] Fix C Core tests --- include/grpc/impl/codegen/grpc_types.h | 4 +- .../ext/filters/http/http_filters_plugin.cc | 3 +- .../message_decompress_filter.cc | 35 +++---- test/core/end2end/tests/compressed_payload.cc | 96 +++++++++++++++---- 4 files changed, 101 insertions(+), 37 deletions(-) diff --git a/include/grpc/impl/codegen/grpc_types.h b/include/grpc/impl/codegen/grpc_types.h index c1624ad9b7c..26d5984b53a 100644 --- a/include/grpc/impl/codegen/grpc_types.h +++ b/include/grpc/impl/codegen/grpc_types.h @@ -180,8 +180,8 @@ typedef struct { grpc_byte_buffer_reader. This arg also determines whether max message limits will be applied to the decompressed buffer or the non-decompressed buffer. It is recommended to keep this enabled to protect against zip bomb attacks. */ -#define GRPC_ARG_ENABLE_PER_MESSAGE_DECOMPRESSION \ - "grpc.per_message_decompression" +#define GRPC_ARG_ENABLE_PER_MESSAGE_DECOMPRESSION_INSIDE_CORE \ + "grpc.per_message_decompression_inside_core" /** Enable/disable support for deadline checking. Defaults to 1, unless GRPC_ARG_MINIMAL_STACK is enabled, in which case it defaults to 0 */ #define GRPC_ARG_ENABLE_DEADLINE_CHECKS "grpc.enable_deadline_checking" diff --git a/src/core/ext/filters/http/http_filters_plugin.cc b/src/core/ext/filters/http/http_filters_plugin.cc index 59749d54546..3c90df4a15c 100644 --- a/src/core/ext/filters/http/http_filters_plugin.cc +++ b/src/core/ext/filters/http/http_filters_plugin.cc @@ -38,7 +38,8 @@ static optional_filter compress_filter = { &grpc_message_compress_filter, GRPC_ARG_ENABLE_PER_MESSAGE_COMPRESSION}; static optional_filter decompress_filter = { - &grpc_message_decompress_filter, GRPC_ARG_ENABLE_PER_MESSAGE_DECOMPRESSION}; + &grpc_message_decompress_filter, + GRPC_ARG_ENABLE_PER_MESSAGE_DECOMPRESSION_INSIDE_CORE}; static bool is_building_http_like_transport( grpc_channel_stack_builder* builder) { diff --git a/src/core/ext/filters/http/message_decompress/message_decompress_filter.cc b/src/core/ext/filters/http/message_decompress/message_decompress_filter.cc index 2543a86fdad..c30285408f6 100644 --- a/src/core/ext/filters/http/message_decompress/message_decompress_filter.cc +++ b/src/core/ext/filters/http/message_decompress/message_decompress_filter.cc @@ -54,7 +54,6 @@ class CallData { OnRecvInitialMetadataReady, this, grpc_schedule_on_exec_ctx); // Initialize state for recv_message_ready callback - grpc_slice_buffer_init(&recv_slices_); GRPC_CLOSURE_INIT(&on_recv_message_next_done_, OnRecvMessageNextDone, this, grpc_schedule_on_exec_ctx); GRPC_CLOSURE_INIT(&on_recv_message_ready_, OnRecvMessageReady, this, @@ -134,8 +133,6 @@ void CallData::OnRecvInitialMetadataReady(void* arg, grpc_error* error) { calld->recv_initial_metadata_->idx.named.grpc_encoding; if (grpc_encoding != nullptr) { calld->algorithm_ = DecodeMessageCompressionAlgorithm(grpc_encoding->md); - grpc_metadata_batch_remove(calld->recv_initial_metadata_, - GRPC_BATCH_GRPC_ENCODING); } } calld->MaybeResumeOnRecvMessageReady(); @@ -156,15 +153,7 @@ void CallData::MaybeResumeOnRecvMessageReady() { void CallData::OnRecvMessageReady(void* arg, grpc_error* error) { CallData* calld = static_cast(arg); - if (error == GRPC_ERROR_NONE && - calld->algorithm_ != GRPC_MESSAGE_COMPRESS_NONE) { - // recv_message can be NULL if trailing metadata is received instead of - // message. - if (*calld->recv_message_ == nullptr || - (*calld->recv_message_)->length() == 0) { - calld->ContinueRecvMessageReadyCallback(GRPC_ERROR_NONE); - return; - } + if (error == GRPC_ERROR_NONE) { if (calld->original_recv_initial_metadata_ready_ != nullptr) { calld->seen_recv_message_ready_ = true; GRPC_CALL_COMBINER_STOP(calld->call_combiner_, @@ -172,10 +161,20 @@ void CallData::OnRecvMessageReady(void* arg, grpc_error* error) { "OnRecvInitialMetadataReady"); return; } - calld->ContinueReadingRecvMessage(); - } else { - calld->ContinueRecvMessageReadyCallback(GRPC_ERROR_REF(error)); + if (calld->algorithm_ != GRPC_MESSAGE_COMPRESS_NONE) { + // recv_message can be NULL if trailing metadata is received instead of + // message, or it's possible that the message was not compressed. + if (*calld->recv_message_ == nullptr || + (*calld->recv_message_)->length() == 0 || + ((*calld->recv_message_)->flags() & GRPC_WRITE_INTERNAL_COMPRESS) == + 0) { + return calld->ContinueRecvMessageReadyCallback(GRPC_ERROR_NONE); + } + grpc_slice_buffer_init(&calld->recv_slices_); + return calld->ContinueReadingRecvMessage(); + } } + calld->ContinueRecvMessageReadyCallback(GRPC_ERROR_REF(error)); } void CallData::ContinueReadingRecvMessage() { @@ -219,6 +218,7 @@ void CallData::OnRecvMessageNextDone(void* arg, grpc_error* error) { void CallData::FinishRecvMessage() { grpc_slice_buffer decompressed_slices; + grpc_slice_buffer_init(&decompressed_slices); if (grpc_msg_decompress(algorithm_, &recv_slices_, &decompressed_slices) == 0) { char* msg; @@ -230,10 +230,11 @@ void CallData::FinishRecvMessage() { error_ = GRPC_ERROR_CREATE_FROM_COPIED_STRING(msg); gpr_free(msg); } else { - uint32_t recv_flags = (*recv_message_)->flags(); + uint32_t recv_flags = + (*recv_message_)->flags() & (~GRPC_WRITE_INTERNAL_COMPRESS); // Swap out the original receive byte stream with our new one and send the // batch down. - recv_replacement_stream_.Init(&recv_slices_, recv_flags); + recv_replacement_stream_.Init(&decompressed_slices, recv_flags); recv_message_->reset(recv_replacement_stream_.get()); recv_message_ = nullptr; } diff --git a/test/core/end2end/tests/compressed_payload.cc b/test/core/end2end/tests/compressed_payload.cc index 81e6bfccd10..6fc6bf985d3 100644 --- a/test/core/end2end/tests/compressed_payload.cc +++ b/test/core/end2end/tests/compressed_payload.cc @@ -97,7 +97,8 @@ static void request_for_disabled_algorithm( uint32_t send_flags_bitmask, grpc_compression_algorithm algorithm_to_disable, grpc_compression_algorithm requested_client_compression_algorithm, - grpc_status_code expected_error, grpc_metadata* client_metadata) { + grpc_status_code expected_error, grpc_metadata* client_metadata, + bool decompress_in_core) { grpc_call* c; grpc_call* s; grpc_slice request_payload_slice; @@ -132,6 +133,21 @@ static void request_for_disabled_algorithm( grpc_core::ExecCtx exec_ctx; server_args = grpc_channel_args_compression_algorithm_set_state( &server_args, algorithm_to_disable, false); + if (!decompress_in_core) { + grpc_arg disable_decompression_in_core_arg = + grpc_channel_arg_integer_create( + const_cast( + GRPC_ARG_ENABLE_PER_MESSAGE_DECOMPRESSION_INSIDE_CORE), + 0); + grpc_channel_args* old_client_args = client_args; + grpc_channel_args* old_server_args = server_args; + client_args = grpc_channel_args_copy_and_add( + client_args, &disable_decompression_in_core_arg, 1); + server_args = grpc_channel_args_copy_and_add( + server_args, &disable_decompression_in_core_arg, 1); + grpc_channel_args_destroy(old_client_args); + grpc_channel_args_destroy(old_server_args); + } } f = begin_test(config, test_name, client_args, server_args); @@ -264,7 +280,7 @@ static void request_for_disabled_algorithm( config.tear_down_data(&f); } -static void request_with_payload_template( +static void request_with_payload_template_inner( grpc_end2end_test_config config, const char* test_name, uint32_t client_send_flags_bitmask, grpc_compression_algorithm default_client_channel_compression_algorithm, @@ -273,7 +289,7 @@ static void request_with_payload_template( grpc_compression_algorithm expected_algorithm_from_server, grpc_metadata* client_init_metadata, bool set_server_level, grpc_compression_level server_compression_level, - bool send_message_before_initial_metadata) { + bool send_message_before_initial_metadata, bool decompress_in_core) { grpc_call* c; grpc_call* s; grpc_slice request_payload_slice; @@ -308,11 +324,28 @@ static void request_with_payload_template( grpc_slice response_payload_slice = grpc_slice_from_copied_string(response_str); - client_args = grpc_channel_args_set_channel_default_compression_algorithm( - nullptr, default_client_channel_compression_algorithm); - server_args = grpc_channel_args_set_channel_default_compression_algorithm( - nullptr, default_server_channel_compression_algorithm); - + { + grpc_core::ExecCtx exec_ctx; + client_args = grpc_channel_args_set_channel_default_compression_algorithm( + nullptr, default_client_channel_compression_algorithm); + server_args = grpc_channel_args_set_channel_default_compression_algorithm( + nullptr, default_server_channel_compression_algorithm); + if (!decompress_in_core) { + grpc_arg disable_decompression_in_core_arg = + grpc_channel_arg_integer_create( + const_cast( + GRPC_ARG_ENABLE_PER_MESSAGE_DECOMPRESSION_INSIDE_CORE), + 0); + grpc_channel_args* old_client_args = client_args; + grpc_channel_args* old_server_args = server_args; + client_args = grpc_channel_args_copy_and_add( + client_args, &disable_decompression_in_core_arg, 1); + server_args = grpc_channel_args_copy_and_add( + server_args, &disable_decompression_in_core_arg, 1); + grpc_channel_args_destroy(old_client_args); + grpc_channel_args_destroy(old_server_args); + } + } f = begin_test(config, test_name, client_args, server_args); cqv = cq_verifier_create(f.cq); @@ -341,7 +374,6 @@ static void request_with_payload_template( GPR_ASSERT(GRPC_CALL_OK == error); CQ_EXPECT_COMPLETION(cqv, tag(2), true); } - memset(ops, 0, sizeof(ops)); op = ops; op->op = GRPC_OP_SEND_INITIAL_METADATA; @@ -385,7 +417,6 @@ static void request_with_payload_template( GRPC_COMPRESS_DEFLATE) != 0); GPR_ASSERT(GPR_BITGET(grpc_call_test_only_get_encodings_accepted_by_peer(s), GRPC_COMPRESS_GZIP) != 0); - memset(ops, 0, sizeof(ops)); op = ops; op->op = GRPC_OP_SEND_INITIAL_METADATA; @@ -406,7 +437,6 @@ static void request_with_payload_template( error = grpc_call_start_batch(s, ops, static_cast(op - ops), tag(101), nullptr); GPR_ASSERT(GRPC_CALL_OK == error); - for (int i = 0; i < 2; i++) { response_payload = grpc_raw_byte_buffer_create(&response_payload_slice, 1); @@ -442,7 +472,8 @@ static void request_with_payload_template( GPR_ASSERT(request_payload_recv->type == GRPC_BB_RAW); GPR_ASSERT(byte_buffer_eq_string(request_payload_recv, request_str)); GPR_ASSERT(request_payload_recv->data.raw.compression == - expected_algorithm_from_client); + (decompress_in_core ? GRPC_COMPRESS_NONE + : expected_algorithm_from_client)); memset(ops, 0, sizeof(ops)); op = ops; @@ -475,11 +506,13 @@ static void request_with_payload_template( if (server_compression_level > GRPC_COMPRESS_LEVEL_NONE) { const grpc_compression_algorithm algo_for_server_level = grpc_call_compression_for_level(s, server_compression_level); - GPR_ASSERT(response_payload_recv->data.raw.compression == - algo_for_server_level); + GPR_ASSERT( + response_payload_recv->data.raw.compression == + (decompress_in_core ? GRPC_COMPRESS_NONE : algo_for_server_level)); } else { GPR_ASSERT(response_payload_recv->data.raw.compression == - expected_algorithm_from_server); + (decompress_in_core ? GRPC_COMPRESS_NONE + : expected_algorithm_from_server)); } grpc_byte_buffer_destroy(request_payload); @@ -487,7 +520,6 @@ static void request_with_payload_template( grpc_byte_buffer_destroy(request_payload_recv); grpc_byte_buffer_destroy(response_payload_recv); } - grpc_slice_unref(request_payload_slice); grpc_slice_unref(response_payload_slice); @@ -547,6 +579,32 @@ static void request_with_payload_template( config.tear_down_data(&f); } +static void request_with_payload_template( + grpc_end2end_test_config config, const char* test_name, + uint32_t client_send_flags_bitmask, + grpc_compression_algorithm default_client_channel_compression_algorithm, + grpc_compression_algorithm default_server_channel_compression_algorithm, + grpc_compression_algorithm expected_algorithm_from_client, + grpc_compression_algorithm expected_algorithm_from_server, + grpc_metadata* client_init_metadata, bool set_server_level, + grpc_compression_level server_compression_level, + bool send_message_before_initial_metadata) { + request_with_payload_template_inner( + config, test_name, client_send_flags_bitmask, + default_client_channel_compression_algorithm, + default_server_channel_compression_algorithm, + expected_algorithm_from_client, expected_algorithm_from_server, + client_init_metadata, set_server_level, server_compression_level, + send_message_before_initial_metadata, false); + request_with_payload_template_inner( + config, test_name, client_send_flags_bitmask, + default_client_channel_compression_algorithm, + default_server_channel_compression_algorithm, + expected_algorithm_from_client, expected_algorithm_from_server, + client_init_metadata, set_server_level, server_compression_level, + send_message_before_initial_metadata, true); +} + static void test_invoke_request_with_exceptionally_uncompressed_payload( grpc_end2end_test_config config) { request_with_payload_template( @@ -634,7 +692,11 @@ static void test_invoke_request_with_disabled_algorithm( request_for_disabled_algorithm(config, "test_invoke_request_with_disabled_algorithm", 0, GRPC_COMPRESS_GZIP, GRPC_COMPRESS_GZIP, - GRPC_STATUS_UNIMPLEMENTED, nullptr); + GRPC_STATUS_UNIMPLEMENTED, nullptr, false); + request_for_disabled_algorithm(config, + "test_invoke_request_with_disabled_algorithm", + 0, GRPC_COMPRESS_GZIP, GRPC_COMPRESS_GZIP, + GRPC_STATUS_UNIMPLEMENTED, nullptr, true); } void compressed_payload(grpc_end2end_test_config config) { From cbb307806443e4541c01588b367796150c035b89 Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Mon, 6 Apr 2020 19:04:10 -0700 Subject: [PATCH 438/758] Fix minimal stack and workaround cronet compression test --- .../channel/minimal_stack_is_minimal_test.cc | 16 ++-- test/core/end2end/tests/compressed_payload.cc | 92 ++++++++----------- .../tests/workaround_cronet_compression.cc | 48 +++++++--- 3 files changed, 80 insertions(+), 76 deletions(-) diff --git a/test/core/channel/minimal_stack_is_minimal_test.cc b/test/core/channel/minimal_stack_is_minimal_test.cc index bee0bfb41f2..8ab5bfe8f72 100644 --- a/test/core/channel/minimal_stack_is_minimal_test.cc +++ b/test/core/channel/minimal_stack_is_minimal_test.cc @@ -91,15 +91,17 @@ int main(int argc, char** argv) { "message_size", "connected", NULL); errors += CHECK_STACK("unknown", nullptr, GRPC_SERVER_CHANNEL, "server", "message_size", "deadline", "connected", NULL); - errors += CHECK_STACK("chttp2", nullptr, GRPC_CLIENT_DIRECT_CHANNEL, - "authority", "message_size", "deadline", "http-client", - "message_compress", "connected", NULL); + errors += + CHECK_STACK("chttp2", nullptr, GRPC_CLIENT_DIRECT_CHANNEL, "authority", + "message_size", "deadline", "http-client", + "message_decompress", "message_compress", "connected", NULL); errors += CHECK_STACK("chttp2", nullptr, GRPC_CLIENT_SUBCHANNEL, "authority", - "message_size", "http-client", "message_compress", - "connected", NULL); - errors += CHECK_STACK("chttp2", nullptr, GRPC_SERVER_CHANNEL, "server", - "message_size", "deadline", "http-server", + "message_size", "http-client", "message_decompress", "message_compress", "connected", NULL); + errors += + CHECK_STACK("chttp2", nullptr, GRPC_SERVER_CHANNEL, "server", + "message_size", "deadline", "http-server", + "message_decompress", "message_compress", "connected", NULL); errors += CHECK_STACK(nullptr, nullptr, GRPC_CLIENT_CHANNEL, "client-channel", NULL); diff --git a/test/core/end2end/tests/compressed_payload.cc b/test/core/end2end/tests/compressed_payload.cc index 6fc6bf985d3..463c0fb2f79 100644 --- a/test/core/end2end/tests/compressed_payload.cc +++ b/test/core/end2end/tests/compressed_payload.cc @@ -129,25 +129,22 @@ static void request_for_disabled_algorithm( nullptr, requested_client_compression_algorithm); server_args = grpc_channel_args_set_channel_default_compression_algorithm( nullptr, GRPC_COMPRESS_NONE); - { - grpc_core::ExecCtx exec_ctx; - server_args = grpc_channel_args_compression_algorithm_set_state( - &server_args, algorithm_to_disable, false); - if (!decompress_in_core) { - grpc_arg disable_decompression_in_core_arg = - grpc_channel_arg_integer_create( - const_cast( - GRPC_ARG_ENABLE_PER_MESSAGE_DECOMPRESSION_INSIDE_CORE), - 0); - grpc_channel_args* old_client_args = client_args; - grpc_channel_args* old_server_args = server_args; - client_args = grpc_channel_args_copy_and_add( - client_args, &disable_decompression_in_core_arg, 1); - server_args = grpc_channel_args_copy_and_add( - server_args, &disable_decompression_in_core_arg, 1); - grpc_channel_args_destroy(old_client_args); - grpc_channel_args_destroy(old_server_args); - } + server_args = grpc_channel_args_compression_algorithm_set_state( + &server_args, algorithm_to_disable, false); + if (!decompress_in_core) { + grpc_arg disable_decompression_in_core_arg = + grpc_channel_arg_integer_create( + const_cast( + GRPC_ARG_ENABLE_PER_MESSAGE_DECOMPRESSION_INSIDE_CORE), + 0); + grpc_channel_args* old_client_args = client_args; + grpc_channel_args* old_server_args = server_args; + client_args = grpc_channel_args_copy_and_add( + client_args, &disable_decompression_in_core_arg, 1); + server_args = grpc_channel_args_copy_and_add( + server_args, &disable_decompression_in_core_arg, 1); + grpc_channel_args_destroy(old_client_args); + grpc_channel_args_destroy(old_server_args); } f = begin_test(config, test_name, client_args, server_args); @@ -269,13 +266,8 @@ static void request_for_disabled_algorithm( grpc_slice_unref(request_payload_slice); grpc_byte_buffer_destroy(request_payload); grpc_byte_buffer_destroy(request_payload_recv); - - { - grpc_core::ExecCtx exec_ctx; - grpc_channel_args_destroy(client_args); - grpc_channel_args_destroy(server_args); - } - + grpc_channel_args_destroy(client_args); + grpc_channel_args_destroy(server_args); end_test(&f); config.tear_down_data(&f); } @@ -324,27 +316,24 @@ static void request_with_payload_template_inner( grpc_slice response_payload_slice = grpc_slice_from_copied_string(response_str); - { - grpc_core::ExecCtx exec_ctx; - client_args = grpc_channel_args_set_channel_default_compression_algorithm( - nullptr, default_client_channel_compression_algorithm); - server_args = grpc_channel_args_set_channel_default_compression_algorithm( - nullptr, default_server_channel_compression_algorithm); - if (!decompress_in_core) { - grpc_arg disable_decompression_in_core_arg = - grpc_channel_arg_integer_create( - const_cast( - GRPC_ARG_ENABLE_PER_MESSAGE_DECOMPRESSION_INSIDE_CORE), - 0); - grpc_channel_args* old_client_args = client_args; - grpc_channel_args* old_server_args = server_args; - client_args = grpc_channel_args_copy_and_add( - client_args, &disable_decompression_in_core_arg, 1); - server_args = grpc_channel_args_copy_and_add( - server_args, &disable_decompression_in_core_arg, 1); - grpc_channel_args_destroy(old_client_args); - grpc_channel_args_destroy(old_server_args); - } + client_args = grpc_channel_args_set_channel_default_compression_algorithm( + nullptr, default_client_channel_compression_algorithm); + server_args = grpc_channel_args_set_channel_default_compression_algorithm( + nullptr, default_server_channel_compression_algorithm); + if (!decompress_in_core) { + grpc_arg disable_decompression_in_core_arg = + grpc_channel_arg_integer_create( + const_cast( + GRPC_ARG_ENABLE_PER_MESSAGE_DECOMPRESSION_INSIDE_CORE), + 0); + grpc_channel_args* old_client_args = client_args; + grpc_channel_args* old_server_args = server_args; + client_args = grpc_channel_args_copy_and_add( + client_args, &disable_decompression_in_core_arg, 1); + server_args = grpc_channel_args_copy_and_add( + server_args, &disable_decompression_in_core_arg, 1); + grpc_channel_args_destroy(old_client_args); + grpc_channel_args_destroy(old_server_args); } f = begin_test(config, test_name, client_args, server_args); cqv = cq_verifier_create(f.cq); @@ -568,13 +557,8 @@ static void request_with_payload_template_inner( grpc_call_unref(s); cq_verifier_destroy(cqv); - - { - grpc_core::ExecCtx exec_ctx; - grpc_channel_args_destroy(client_args); - grpc_channel_args_destroy(server_args); - } - + grpc_channel_args_destroy(client_args); + grpc_channel_args_destroy(server_args); end_test(&f); config.tear_down_data(&f); } diff --git a/test/core/end2end/tests/workaround_cronet_compression.cc b/test/core/end2end/tests/workaround_cronet_compression.cc index 1a47244b68d..595562b2d82 100644 --- a/test/core/end2end/tests/workaround_cronet_compression.cc +++ b/test/core/end2end/tests/workaround_cronet_compression.cc @@ -100,8 +100,8 @@ static void request_with_payload_template( grpc_compression_algorithm expected_algorithm_from_client, grpc_compression_algorithm expected_algorithm_from_server, grpc_metadata* client_init_metadata, bool set_server_level, - grpc_compression_level server_compression_level, - char* user_agent_override) { + grpc_compression_level server_compression_level, char* user_agent_override, + bool decompress_in_core) { grpc_call* c; grpc_call* s; grpc_slice request_payload_slice; @@ -140,9 +140,23 @@ static void request_with_payload_template( nullptr, default_client_channel_compression_algorithm); server_args = grpc_channel_args_set_channel_default_compression_algorithm( nullptr, default_server_channel_compression_algorithm); + if (!decompress_in_core) { + grpc_arg disable_decompression_in_core_arg = + grpc_channel_arg_integer_create( + const_cast( + GRPC_ARG_ENABLE_PER_MESSAGE_DECOMPRESSION_INSIDE_CORE), + 0); + grpc_channel_args* old_client_args = client_args; + grpc_channel_args* old_server_args = server_args; + client_args = grpc_channel_args_copy_and_add( + client_args, &disable_decompression_in_core_arg, 1); + server_args = grpc_channel_args_copy_and_add( + server_args, &disable_decompression_in_core_arg, 1); + grpc_channel_args_destroy(old_client_args); + grpc_channel_args_destroy(old_server_args); + } if (user_agent_override) { - grpc_core::ExecCtx exec_ctx; grpc_channel_args* client_args_old = client_args; grpc_arg arg; arg.key = const_cast(GRPC_ARG_PRIMARY_USER_AGENT_STRING); @@ -267,7 +281,8 @@ static void request_with_payload_template( GPR_ASSERT(request_payload_recv->type == GRPC_BB_RAW); GPR_ASSERT(byte_buffer_eq_string(request_payload_recv, request_str)); GPR_ASSERT(request_payload_recv->data.raw.compression == - expected_algorithm_from_client); + (decompress_in_core ? GRPC_COMPRESS_NONE + : expected_algorithm_from_client)); memset(ops, 0, sizeof(ops)); op = ops; @@ -288,11 +303,13 @@ static void request_with_payload_template( if (server_compression_level > GRPC_COMPRESS_LEVEL_NONE) { const grpc_compression_algorithm algo_for_server_level = grpc_call_compression_for_level(s, server_compression_level); - GPR_ASSERT(response_payload_recv->data.raw.compression == - algo_for_server_level); + GPR_ASSERT( + response_payload_recv->data.raw.compression == + (decompress_in_core ? GRPC_COMPRESS_NONE : algo_for_server_level)); } else { GPR_ASSERT(response_payload_recv->data.raw.compression == - expected_algorithm_from_server); + (decompress_in_core ? GRPC_COMPRESS_NONE + : expected_algorithm_from_server)); } grpc_byte_buffer_destroy(request_payload); @@ -349,13 +366,8 @@ static void request_with_payload_template( grpc_call_unref(s); cq_verifier_destroy(cqv); - - { - grpc_core::ExecCtx exec_ctx; - grpc_channel_args_destroy(client_args); - grpc_channel_args_destroy(server_args); - } - + grpc_channel_args_destroy(client_args); + grpc_channel_args_destroy(server_args); end_test(&f); config.tear_down_data(&f); } @@ -387,7 +399,13 @@ static void test_workaround_cronet_compression( GRPC_COMPRESS_GZIP, GRPC_COMPRESS_GZIP, GRPC_COMPRESS_GZIP, workaround_configs[i].expected_algorithm_from_server, nullptr, false, /* ignored */ GRPC_COMPRESS_LEVEL_NONE, - workaround_configs[i].user_agent_override); + workaround_configs[i].user_agent_override, true); + request_with_payload_template( + config, "test_invoke_request_with_compressed_payload", 0, + GRPC_COMPRESS_GZIP, GRPC_COMPRESS_GZIP, GRPC_COMPRESS_GZIP, + workaround_configs[i].expected_algorithm_from_server, nullptr, false, + /* ignored */ GRPC_COMPRESS_LEVEL_NONE, + workaround_configs[i].user_agent_override, false); } } From 331b3323927e65e796f8bc59d838d8f72c40609c Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Mon, 6 Apr 2020 21:49:16 -0700 Subject: [PATCH 439/758] Try fixing interop tests --- .../message_decompress/message_decompress_filter.cc | 10 ++++++---- src/core/lib/transport/byte_stream.h | 9 +++++++-- test/cpp/interop/client_helper.h | 8 ++++++-- test/cpp/interop/interop_client.cc | 9 ++++----- test/cpp/interop/interop_server.cc | 5 ++--- test/cpp/interop/server_helper.cc | 8 ++++++-- test/cpp/interop/server_helper.h | 2 +- 7 files changed, 32 insertions(+), 19 deletions(-) diff --git a/src/core/ext/filters/http/message_decompress/message_decompress_filter.cc b/src/core/ext/filters/http/message_decompress/message_decompress_filter.cc index c30285408f6..0a756449573 100644 --- a/src/core/ext/filters/http/message_decompress/message_decompress_filter.cc +++ b/src/core/ext/filters/http/message_decompress/message_decompress_filter.cc @@ -35,11 +35,8 @@ #include "src/core/lib/compression/message_compress.h" #include "src/core/lib/gpr/string.h" #include "src/core/lib/gprpp/manual_constructor.h" -#include "src/core/lib/profiling/timers.h" #include "src/core/lib/slice/slice_internal.h" #include "src/core/lib/slice/slice_string_helpers.h" -#include "src/core/lib/surface/call.h" -#include "src/core/lib/transport/static_metadata.h" namespace { @@ -229,15 +226,20 @@ void CallData::FinishRecvMessage() { GPR_DEBUG_ASSERT(error_ == GRPC_ERROR_NONE); error_ = GRPC_ERROR_CREATE_FROM_COPIED_STRING(msg); gpr_free(msg); + grpc_slice_buffer_destroy_internal(&decompressed_slices); } else { uint32_t recv_flags = - (*recv_message_)->flags() & (~GRPC_WRITE_INTERNAL_COMPRESS); + ((*recv_message_)->flags() & (~GRPC_WRITE_INTERNAL_COMPRESS)) | + GRPC_WRITE_INTERNAL_TEST_ONLY_WAS_COMPRESSED; // Swap out the original receive byte stream with our new one and send the // batch down. + // Initializing recv_replacement_stream_ with decompressed_slices removes + // all the slices from decompressed_slices leaving it empty. recv_replacement_stream_.Init(&decompressed_slices, recv_flags); recv_message_->reset(recv_replacement_stream_.get()); recv_message_ = nullptr; } + grpc_slice_buffer_destroy_internal(&recv_slices_); ContinueRecvMessageReadyCallback(GRPC_ERROR_REF(error_)); } diff --git a/src/core/lib/transport/byte_stream.h b/src/core/lib/transport/byte_stream.h index 6988ab843b2..ecb605ad9bb 100644 --- a/src/core/lib/transport/byte_stream.h +++ b/src/core/lib/transport/byte_stream.h @@ -26,10 +26,15 @@ #include "src/core/lib/iomgr/closure.h" /** Internal bit flag for grpc_begin_message's \a flags signaling the use of - * compression for the message */ + * compression for the message. (Does not apply for stream compression.) */ #define GRPC_WRITE_INTERNAL_COMPRESS (0x80000000u) +/** Internal bit flag for determining whether the message was compressed and had + * to be decompressed by the message_decompress filter. (Does not apply for + * stream compression.) */ +#define GRPC_WRITE_INTERNAL_TEST_ONLY_WAS_COMPRESSED (0x40000000u) /** Mask of all valid internal flags. */ -#define GRPC_WRITE_INTERNAL_USED_MASK (GRPC_WRITE_INTERNAL_COMPRESS) +#define GRPC_WRITE_INTERNAL_USED_MASK \ + (GRPC_WRITE_INTERNAL_COMPRESS | GRPC_WRITE_INTERNAL_TEST_ONLY_WAS_COMPRESSED) namespace grpc_core { diff --git a/test/cpp/interop/client_helper.h b/test/cpp/interop/client_helper.h index e0bb6eacd90..e97274177ab 100644 --- a/test/cpp/interop/client_helper.h +++ b/test/cpp/interop/client_helper.h @@ -27,6 +27,7 @@ #include #include "src/core/lib/surface/call_test_only.h" +#include "src/core/lib/transport/byte_stream.h" namespace grpc { namespace testing { @@ -54,8 +55,11 @@ class InteropClientContextInspector { return grpc_call_test_only_get_compression_algorithm(context_.call_); } - uint32_t GetMessageFlags() const { - return grpc_call_test_only_get_message_flags(context_.call_); + bool WasCompressed() const { + return (grpc_call_test_only_get_message_flags(context_.call_) & + GRPC_WRITE_INTERNAL_COMPRESS) || + (grpc_call_test_only_get_message_flags(context_.call_) & + GRPC_WRITE_INTERNAL_TEST_ONLY_WAS_COMPRESSED); } private: diff --git a/test/cpp/interop/interop_client.cc b/test/cpp/interop/interop_client.cc index b05e1de82ef..71ee79a6e96 100644 --- a/test/cpp/interop/interop_client.cc +++ b/test/cpp/interop/interop_client.cc @@ -30,7 +30,6 @@ #include #include -#include "src/core/lib/transport/byte_stream.h" #include "src/proto/grpc/testing/empty.pb.h" #include "src/proto/grpc/testing/messages.pb.h" #include "src/proto/grpc/testing/test.grpc.pb.h" @@ -67,10 +66,10 @@ void UnaryCompressionChecks(const InteropClientContextInspector& inspector, "from server."); abort(); } - GPR_ASSERT(inspector.GetMessageFlags() & GRPC_WRITE_INTERNAL_COMPRESS); + GPR_ASSERT(inspector.WasCompressed()); } else { // Didn't request compression -> make sure the response is uncompressed - GPR_ASSERT(!(inspector.GetMessageFlags() & GRPC_WRITE_INTERNAL_COMPRESS)); + GPR_ASSERT(!(inspector.WasCompressed())); } } } // namespace @@ -577,10 +576,10 @@ bool InteropClient::DoServerCompressedStreaming() { GPR_ASSERT(request.response_parameters(k).has_compressed()); if (request.response_parameters(k).compressed().value()) { GPR_ASSERT(inspector.GetCallCompressionAlgorithm() > GRPC_COMPRESS_NONE); - GPR_ASSERT(inspector.GetMessageFlags() & GRPC_WRITE_INTERNAL_COMPRESS); + GPR_ASSERT(inspector.WasCompressed()); } else { // requested *no* compression. - GPR_ASSERT(!(inspector.GetMessageFlags() & GRPC_WRITE_INTERNAL_COMPRESS)); + GPR_ASSERT(!(inspector.WasCompressed())); } ++k; } diff --git a/test/cpp/interop/interop_server.cc b/test/cpp/interop/interop_server.cc index 5482e4f6759..ca3a03883df 100644 --- a/test/cpp/interop/interop_server.cc +++ b/test/cpp/interop/interop_server.cc @@ -31,7 +31,6 @@ #include #include "src/core/lib/gpr/string.h" -#include "src/core/lib/transport/byte_stream.h" #include "src/proto/grpc/testing/empty.pb.h" #include "src/proto/grpc/testing/messages.pb.h" #include "src/proto/grpc/testing/test.grpc.pb.h" @@ -118,7 +117,7 @@ bool CheckExpectedCompression(const ServerContext& context, "Expected compression but got uncompressed request from client."); return false; } - if (!(inspector.GetMessageFlags() & GRPC_WRITE_INTERNAL_COMPRESS)) { + if (!(inspector.WasCompressed())) { gpr_log(GPR_ERROR, "Failure: Requested compression in a compressable request, but " "compression bit in message flags not set."); @@ -126,7 +125,7 @@ bool CheckExpectedCompression(const ServerContext& context, } } else { // Didn't expect compression -> make sure the request is uncompressed - if (inspector.GetMessageFlags() & GRPC_WRITE_INTERNAL_COMPRESS) { + if (inspector.WasCompressed()) { gpr_log(GPR_ERROR, "Failure: Didn't requested compression, but compression bit in " "message flags set."); diff --git a/test/cpp/interop/server_helper.cc b/test/cpp/interop/server_helper.cc index 21945219982..6a3637f6bfa 100644 --- a/test/cpp/interop/server_helper.cc +++ b/test/cpp/interop/server_helper.cc @@ -24,6 +24,7 @@ #include #include "src/core/lib/surface/call_test_only.h" +#include "src/core/lib/transport/byte_stream.h" #include "test/cpp/util/test_credentials_provider.h" DECLARE_bool(use_alts); @@ -60,8 +61,11 @@ uint32_t InteropServerContextInspector::GetEncodingsAcceptedByClient() const { return grpc_call_test_only_get_encodings_accepted_by_peer(context_.call_); } -uint32_t InteropServerContextInspector::GetMessageFlags() const { - return grpc_call_test_only_get_message_flags(context_.call_); +bool InteropServerContextInspector::WasCompressed() const { + return (grpc_call_test_only_get_message_flags(context_.call_) & + GRPC_WRITE_INTERNAL_COMPRESS) || + (grpc_call_test_only_get_message_flags(context_.call_) & + GRPC_WRITE_INTERNAL_TEST_ONLY_WAS_COMPRESSED); } std::shared_ptr diff --git a/test/cpp/interop/server_helper.h b/test/cpp/interop/server_helper.h index 1bfbf8e474d..237c33cd0cd 100644 --- a/test/cpp/interop/server_helper.h +++ b/test/cpp/interop/server_helper.h @@ -44,7 +44,7 @@ class InteropServerContextInspector { bool IsCancelled() const; grpc_compression_algorithm GetCallCompressionAlgorithm() const; uint32_t GetEncodingsAcceptedByClient() const; - uint32_t GetMessageFlags() const; + bool WasCompressed() const; private: const ::grpc::ServerContext& context_; From e5a1509d94d14c6660e6b3078990f2724cc7a099 Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Tue, 7 Apr 2020 01:10:51 -0700 Subject: [PATCH 440/758] Move around slice buffer initialization and destruction --- .../http/message_decompress/message_decompress_filter.cc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/core/ext/filters/http/message_decompress/message_decompress_filter.cc b/src/core/ext/filters/http/message_decompress/message_decompress_filter.cc index 0a756449573..ea2dd9ffe49 100644 --- a/src/core/ext/filters/http/message_decompress/message_decompress_filter.cc +++ b/src/core/ext/filters/http/message_decompress/message_decompress_filter.cc @@ -51,6 +51,7 @@ class CallData { OnRecvInitialMetadataReady, this, grpc_schedule_on_exec_ctx); // Initialize state for recv_message_ready callback + grpc_slice_buffer_init(&recv_slices_); GRPC_CLOSURE_INIT(&on_recv_message_next_done_, OnRecvMessageNextDone, this, grpc_schedule_on_exec_ctx); GRPC_CLOSURE_INIT(&on_recv_message_ready_, OnRecvMessageReady, this, @@ -61,6 +62,8 @@ class CallData { grpc_schedule_on_exec_ctx); } + ~CallData() { grpc_slice_buffer_destroy_internal(&recv_slices_); } + static void DecompressStartTransportStreamOpBatch( grpc_call_element* elem, grpc_transport_stream_op_batch* batch); @@ -167,6 +170,7 @@ void CallData::OnRecvMessageReady(void* arg, grpc_error* error) { 0) { return calld->ContinueRecvMessageReadyCallback(GRPC_ERROR_NONE); } + grpc_slice_buffer_destroy_internal(&calld->recv_slices_); grpc_slice_buffer_init(&calld->recv_slices_); return calld->ContinueReadingRecvMessage(); } @@ -239,7 +243,6 @@ void CallData::FinishRecvMessage() { recv_message_->reset(recv_replacement_stream_.get()); recv_message_ = nullptr; } - grpc_slice_buffer_destroy_internal(&recv_slices_); ContinueRecvMessageReadyCallback(GRPC_ERROR_REF(error_)); } From ce8a1df7137a0bf4fe0ac9883434cd39812e3f1f Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Tue, 7 Apr 2020 11:06:44 -0700 Subject: [PATCH 441/758] Reviewer comments --- .../message_decompress_filter.cc | 73 ++++++++++--------- .../message_decompress_filter.h | 37 +++++----- src/core/lib/surface/call.cc | 7 -- src/core/lib/surface/call.h | 4 - 4 files changed, 57 insertions(+), 64 deletions(-) diff --git a/src/core/ext/filters/http/message_decompress/message_decompress_filter.cc b/src/core/ext/filters/http/message_decompress/message_decompress_filter.cc index ea2dd9ffe49..eb90c01449b 100644 --- a/src/core/ext/filters/http/message_decompress/message_decompress_filter.cc +++ b/src/core/ext/filters/http/message_decompress/message_decompress_filter.cc @@ -1,20 +1,20 @@ -/* - * - * Copyright 2015 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ +// +// +// Copyright 2020 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// #include @@ -44,7 +44,7 @@ class ChannelData {}; class CallData { public: - CallData(const grpc_call_element_args& args) + explicit CallData(const grpc_call_element_args& args) : call_combiner_(args.call_combiner) { // Initialize state for recv_initial_metadata_ready callback GRPC_CLOSURE_INIT(&on_recv_initial_metadata_ready_, @@ -64,9 +64,11 @@ class CallData { ~CallData() { grpc_slice_buffer_destroy_internal(&recv_slices_); } - static void DecompressStartTransportStreamOpBatch( + public: + void DecompressStartTransportStreamOpBatch( grpc_call_element* elem, grpc_transport_stream_op_batch* batch); + private: static void OnRecvInitialMetadataReady(void* arg, grpc_error* error); // Methods for processing a receive message event @@ -82,8 +84,7 @@ class CallData { void MaybeResumeOnRecvTrailingMetadataReady(); static void OnRecvTrailingMetadataReady(void* arg, grpc_error* error); - private: - grpc_core::CallCombiner* call_combiner_ = nullptr; + grpc_core::CallCombiner* call_combiner_; // Overall error for the call grpc_error* error_ = GRPC_ERROR_NONE; // Fields for handling recv_initial_metadata_ready callback @@ -285,36 +286,40 @@ void CallData::OnRecvTrailingMetadataReady(void* arg, grpc_error* error) { void CallData::DecompressStartTransportStreamOpBatch( grpc_call_element* elem, grpc_transport_stream_op_batch* batch) { - GPR_TIMER_SCOPE("compress_start_transport_stream_op_batch", 0); - CallData* calld = static_cast(elem->call_data); // Handle recv_initial_metadata. if (batch->recv_initial_metadata) { - calld->recv_initial_metadata_ = + recv_initial_metadata_ = batch->payload->recv_initial_metadata.recv_initial_metadata; - calld->original_recv_initial_metadata_ready_ = + original_recv_initial_metadata_ready_ = batch->payload->recv_initial_metadata.recv_initial_metadata_ready; batch->payload->recv_initial_metadata.recv_initial_metadata_ready = - &calld->on_recv_initial_metadata_ready_; + &on_recv_initial_metadata_ready_; } // Handle recv_message if (batch->recv_message) { - calld->recv_message_ = batch->payload->recv_message.recv_message; - calld->original_recv_message_ready_ = + recv_message_ = batch->payload->recv_message.recv_message; + original_recv_message_ready_ = batch->payload->recv_message.recv_message_ready; - batch->payload->recv_message.recv_message_ready = - &calld->on_recv_message_ready_; + batch->payload->recv_message.recv_message_ready = &on_recv_message_ready_; } // Handle recv_trailing_metadata if (batch->recv_trailing_metadata) { - calld->original_recv_trailing_metadata_ready_ = + original_recv_trailing_metadata_ready_ = batch->payload->recv_trailing_metadata.recv_trailing_metadata_ready; batch->payload->recv_trailing_metadata.recv_trailing_metadata_ready = - &calld->on_recv_trailing_metadata_ready_; + &on_recv_trailing_metadata_ready_; } // Pass control down the stack. grpc_call_next_op(elem, batch); } +void DecompressStartTransportStreamOpBatch( + grpc_call_element* elem, grpc_transport_stream_op_batch* batch) { + GPR_TIMER_SCOPE("decompress_start_transport_stream_op_batch", 0); + CallData* calld = static_cast(elem->call_data); + calld->DecompressStartTransportStreamOpBatch(elem, batch); +} + static grpc_error* DecompressInitCallElem(grpc_call_element* elem, const grpc_call_element_args* args) { new (elem->call_data) CallData(*args); @@ -333,12 +338,12 @@ static grpc_error* DecompressInitChannelElem( return GRPC_ERROR_NONE; } -void DecompressDestroyChannelElem(grpc_channel_element* /*elem*/) { return; } +void DecompressDestroyChannelElem(grpc_channel_element* /*elem*/) {} } // namespace const grpc_channel_filter grpc_message_decompress_filter = { - CallData::DecompressStartTransportStreamOpBatch, + DecompressStartTransportStreamOpBatch, grpc_channel_next_op, sizeof(CallData), DecompressInitCallElem, diff --git a/src/core/ext/filters/http/message_decompress/message_decompress_filter.h b/src/core/ext/filters/http/message_decompress/message_decompress_filter.h index 5e6b01d5cbb..bd5c538273b 100644 --- a/src/core/ext/filters/http/message_decompress/message_decompress_filter.h +++ b/src/core/ext/filters/http/message_decompress/message_decompress_filter.h @@ -1,20 +1,20 @@ -/* - * - * Copyright 2015 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ +// +// +// Copyright 2020 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// #ifndef GRPC_CORE_EXT_FILTERS_HTTP_MESSAGE_DECOMPRESS_MESSAGE_DECOMPRESS_FILTER_H #define GRPC_CORE_EXT_FILTERS_HTTP_MESSAGE_DECOMPRESS_MESSAGE_DECOMPRESS_FILTER_H @@ -25,5 +25,4 @@ extern const grpc_channel_filter grpc_message_decompress_filter; -#endif /* GRPC_CORE_EXT_FILTERS_HTTP_MESSAGE_DECOMPRESS_MESSAGE_DECOMPRESS_FILTER_H \ - */ +#endif // GRPC_CORE_EXT_FILTERS_HTTP_MESSAGE_DECOMPRESS_MESSAGE_DECOMPRESS_FILTER_H diff --git a/src/core/lib/surface/call.cc b/src/core/lib/surface/call.cc index 339b2438c03..fcebe9bc410 100644 --- a/src/core/lib/surface/call.cc +++ b/src/core/lib/surface/call.cc @@ -200,8 +200,6 @@ struct grpc_call { /* Stream compression algorithm for *incoming* data */ grpc_stream_compression_algorithm incoming_stream_compression_algorithm = GRPC_STREAM_COMPRESS_NONE; - /* Maximum size for uncompressed receive message in bytes. -1 for unlimited */ - int max_uncompressed_receive_message_length = -1; /* Supported encodings (compression algorithms), a bitset. * Always support no compression. */ uint32_t encodings_accepted_by_peer = 1 << GRPC_MESSAGE_COMPRESS_NONE; @@ -499,11 +497,6 @@ void grpc_call_set_completion_queue(grpc_call* call, &call->pollent); } -void grpc_call_set_max_uncompressed_receive_message_length(grpc_call* call, - int limit) { - call->max_uncompressed_receive_message_length = limit; -} - #ifndef NDEBUG #define REF_REASON reason #define REF_ARG , const char* reason diff --git a/src/core/lib/surface/call.h b/src/core/lib/surface/call.h index 351e57d75cb..a33664af6a9 100644 --- a/src/core/lib/surface/call.h +++ b/src/core/lib/surface/call.h @@ -59,10 +59,6 @@ grpc_error* grpc_call_create(const grpc_call_create_args* args, void grpc_call_set_completion_queue(grpc_call* call, grpc_completion_queue* cq); -/* Sets the max uncompressed receive message length for the call. */ -void grpc_call_set_max_uncompressed_receive_message_length(grpc_call* call, - int limit); - #ifndef NDEBUG void grpc_call_internal_ref(grpc_call* call, const char* reason); void grpc_call_internal_unref(grpc_call* call, const char* reason); From 4e6327493dad16acad922fade50c23404ebb4531 Mon Sep 17 00:00:00 2001 From: Richard Belleville Date: Fri, 10 Apr 2020 18:57:37 -0700 Subject: [PATCH 442/758] Support SO_REUSEPORT on manylinux2010 --- src/core/lib/iomgr/socket_utils_common_posix.cc | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/core/lib/iomgr/socket_utils_common_posix.cc b/src/core/lib/iomgr/socket_utils_common_posix.cc index a5048d890d3..f368cb76f62 100644 --- a/src/core/lib/iomgr/socket_utils_common_posix.cc +++ b/src/core/lib/iomgr/socket_utils_common_posix.cc @@ -210,7 +210,6 @@ static gpr_once g_probe_so_reuesport_once = GPR_ONCE_INIT; static int g_support_so_reuseport = false; void probe_so_reuseport_once(void) { -#ifndef GPR_MANYLINUX1 int s = socket(AF_INET, SOCK_STREAM, 0); if (s < 0) { /* This might be an ipv6-only environment in which case 'socket(AF_INET,..)' @@ -222,7 +221,6 @@ void probe_so_reuseport_once(void) { "check for SO_REUSEPORT", grpc_set_socket_reuse_port(s, 1)); close(s); } -#endif } bool grpc_is_socket_reuse_port_supported() { From 96024a9ad30c9863f7a94716ba79e6f087368067 Mon Sep 17 00:00:00 2001 From: Richard Belleville Date: Fri, 10 Apr 2020 19:22:55 -0700 Subject: [PATCH 443/758] Update documentation --- examples/python/multiprocessing/README.md | 17 ++++++++--------- examples/python/multiprocessing/server.py | 6 ------ 2 files changed, 8 insertions(+), 15 deletions(-) diff --git a/examples/python/multiprocessing/README.md b/examples/python/multiprocessing/README.md index 709a815aca5..19cc00b6a4e 100644 --- a/examples/python/multiprocessing/README.md +++ b/examples/python/multiprocessing/README.md @@ -1,16 +1,19 @@ ## Multiprocessing with gRPC Python Multiprocessing allows application developers to sidestep the Python global -interpreter lock and achieve true concurrency on multicore systems. +interpreter lock and achieve true parallelism on multicore systems. Unfortunately, using multiprocessing and gRPC Python is not yet as simple as instantiating your server with a `futures.ProcessPoolExecutor`. The library is implemented as a C extension, maintaining much of the state that drives the system in native code. As such, upon calling -[`fork`](http://man7.org/linux/man-pages/man2/fork.2.html), much of the -state copied into the child process is invalid, leading to hangs and crashes. +[`fork`](http://man7.org/linux/man-pages/man2/fork.2.html), any threads in a +critical section may leave the state of the gRPC library invalid in the child +process. See this [excellent research +paper](https://www.microsoft.com/en-us/research/uploads/prod/2019/04/fork-hotos19.pdf) +for a thorough discussion of the topic. -However, calling `fork` without `exec` in your python process is supported +Ccalling `fork` without `exec` in your process *is* supported *before* any gRPC servers have been instantiated. Application developers can take advantage of this to parallelize their CPU-intensive operations. @@ -18,11 +21,7 @@ take advantage of this to parallelize their CPU-intensive operations. This example calculates the first 10,000 prime numbers as an RPC. We instantiate one server per subprocess, balancing requests between the servers using the -[`SO_REUSEPORT`](https://lwn.net/Articles/542629/) socket option. Note that this -option is not available in `manylinux1` distributions, which are, as of the time -of writing, the only gRPC Python wheels available on PyPI. To take advantage of this -feature, you'll need to build from source, either using bazel (as we do for -these examples) or via pip, using `pip install grpcio --no-binary grpcio`. +[`SO_REUSEPORT`](https://lwn.net/Articles/542629/) socket option. ```python _PROCESS_COUNT = multiprocessing.cpu_count() diff --git a/examples/python/multiprocessing/server.py b/examples/python/multiprocessing/server.py index ad788b8eb51..74a8860119f 100644 --- a/examples/python/multiprocessing/server.py +++ b/examples/python/multiprocessing/server.py @@ -67,12 +67,6 @@ def _run_server(bind_address): _LOGGER.info('Starting new server.') options = (('grpc.so_reuseport', 1),) - # WARNING: This example takes advantage of SO_REUSEPORT. Due to the - # limitations of manylinux1, none of our precompiled Linux wheels currently - # support this option. (https://github.com/grpc/grpc/issues/18210). To take - # advantage of this feature, install from source with - # `pip install grpcio --no-binary grpcio`. - server = grpc.server(futures.ThreadPoolExecutor( max_workers=_THREAD_CONCURRENCY,), options=options) From e97cd37e68c49504af71429bd0a3083f17aedd17 Mon Sep 17 00:00:00 2001 From: Richard Belleville Date: Fri, 10 Apr 2020 19:33:07 -0700 Subject: [PATCH 444/758] Support running multiprocessing example without Bazel --- examples/python/multiprocessing/BUILD | 2 ++ examples/python/multiprocessing/README.md | 8 ++++++++ examples/python/multiprocessing/client.py | 4 ++-- examples/python/multiprocessing/server.py | 4 ++-- 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/examples/python/multiprocessing/BUILD b/examples/python/multiprocessing/BUILD index ea9b6a3ec6f..1ee3b647ae4 100644 --- a/examples/python/multiprocessing/BUILD +++ b/examples/python/multiprocessing/BUILD @@ -44,6 +44,7 @@ py_binary( ":prime_proto_pb2_grpc", "//src/python/grpcio/grpc:grpcio", ], + imports = ["."], ) py_binary( @@ -60,6 +61,7 @@ py_binary( "//conditions:default": ["@futures//:futures"], "//:python3": [], }), + imports = ["."], ) py_test( diff --git a/examples/python/multiprocessing/README.md b/examples/python/multiprocessing/README.md index 19cc00b6a4e..a800190682f 100644 --- a/examples/python/multiprocessing/README.md +++ b/examples/python/multiprocessing/README.md @@ -64,3 +64,11 @@ For example, ``` bazel run //examples/python/multiprocessing:client -- [::]:33915 ``` + +Alternatively, generate code using the following and then run the client and server +directly: + +```python +cd examples/python/helloworld +python -m grpc_tools.protoc -I . prime.proto --python_out=. --grpc_python_out=. +``` diff --git a/examples/python/multiprocessing/client.py b/examples/python/multiprocessing/client.py index b9acc65fdc5..7676bd4ec88 100644 --- a/examples/python/multiprocessing/client.py +++ b/examples/python/multiprocessing/client.py @@ -26,8 +26,8 @@ import sys import grpc -from examples.python.multiprocessing import prime_pb2 -from examples.python.multiprocessing import prime_pb2_grpc +import prime_pb2 +import prime_pb2_grpc _PROCESS_COUNT = 8 _MAXIMUM_CANDIDATE = 10000 diff --git a/examples/python/multiprocessing/server.py b/examples/python/multiprocessing/server.py index 74a8860119f..a5ee00755e6 100644 --- a/examples/python/multiprocessing/server.py +++ b/examples/python/multiprocessing/server.py @@ -29,8 +29,8 @@ import sys import grpc -from examples.python.multiprocessing import prime_pb2 -from examples.python.multiprocessing import prime_pb2_grpc +import prime_pb2 +import prime_pb2_grpc _LOGGER = logging.getLogger(__name__) From c14fce7ab4e25c39639a306ca2ed54e0cf56f3fd Mon Sep 17 00:00:00 2001 From: Richard Belleville Date: Fri, 10 Apr 2020 19:35:01 -0700 Subject: [PATCH 445/758] Typo --- examples/python/multiprocessing/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/python/multiprocessing/README.md b/examples/python/multiprocessing/README.md index a800190682f..5dce50ad3bd 100644 --- a/examples/python/multiprocessing/README.md +++ b/examples/python/multiprocessing/README.md @@ -13,8 +13,8 @@ process. See this [excellent research paper](https://www.microsoft.com/en-us/research/uploads/prod/2019/04/fork-hotos19.pdf) for a thorough discussion of the topic. -Ccalling `fork` without `exec` in your process *is* supported -*before* any gRPC servers have been instantiated. Application developers can +Calling `fork` without `exec` in your process *is* supported +before any gRPC servers have been instantiated. Application developers can take advantage of this to parallelize their CPU-intensive operations. ## Calculating Prime Numbers with Multiple Processes From 1ae804c8c01af46ec4df20b4d54dd46e6a9701e3 Mon Sep 17 00:00:00 2001 From: Donna Dionne Date: Sat, 11 Apr 2020 21:39:40 -0700 Subject: [PATCH 446/758] Fixing code review comments: - Fixing for comments in all except for test file - Multi-purpose test_service_impl.h as oppose to creating new files. --- include/grpc/impl/codegen/grpc_types.h | 5 +- .../lb_policy/xds/xds_routing.cc | 33 +- .../ext/filters/client_channel/xds/xds_api.cc | 8 +- .../filters/client_channel/xds/xds_client.cc | 6 +- test/cpp/end2end/BUILD | 2 +- test/cpp/end2end/test_multiple_service_impl.h | 495 ------------------ test/cpp/end2end/test_service_impl.cc | 380 -------------- test/cpp/end2end/test_service_impl.h | 399 +++++++++++++- test/cpp/end2end/xds_end2end_test.cc | 3 +- 9 files changed, 421 insertions(+), 910 deletions(-) delete mode 100644 test/cpp/end2end/test_multiple_service_impl.h diff --git a/include/grpc/impl/codegen/grpc_types.h b/include/grpc/impl/codegen/grpc_types.h index 1e4c9fd0a23..5a73918c0d0 100644 --- a/include/grpc/impl/codegen/grpc_types.h +++ b/include/grpc/impl/codegen/grpc_types.h @@ -358,7 +358,10 @@ typedef struct { * The default is 15 seconds. */ #define GRPC_ARG_XDS_RESOURCE_DOES_NOT_EXIST_TIMEOUT_MS \ "grpc.xds_resource_does_not_exist_timeout_ms" -/* if set, enable xds routing policy */ +/* If set, enable xds routing policy. This boolean argument is currently + * disabled by default; however, it will be changed to enabled by default + * once the functionality proves stable. This arg will eventually + * be removed completely. */ #define GRPC_ARG_XDS_ROUTING_ENABLED "grpc.xds_routing_enabled" /** If non-zero, grpc server's cronet compression workaround will be enabled */ #define GRPC_ARG_WORKAROUND_CRONET_COMPRESSION \ diff --git a/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc b/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc index 7bcc05cc018..40174672e96 100644 --- a/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc +++ b/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc @@ -610,7 +610,7 @@ class XdsRoutingLbFactory : public LoadBalancingPolicyFactory { std::vector error_list; // action map. XdsRoutingLbConfig::ActionMap action_map; - std::set action_to_be_used; + std::set actions_to_be_used; auto it = json.object_value().find("actions"); if (it == json.object_value().end()) { error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( @@ -620,6 +620,11 @@ class XdsRoutingLbFactory : public LoadBalancingPolicyFactory { "field:actions error:type should be object")); } else { for (const auto& p : it->second.object_value()) { + if (p.first.empty()) { + error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "field:actions element error: name cannot be empty")); + continue; + } RefCountedPtr child_config; std::vector child_errors = ParseChildConfig(p.second, &child_config); @@ -634,7 +639,7 @@ class XdsRoutingLbFactory : public LoadBalancingPolicyFactory { error_list.push_back(error); } else { action_map[p.first] = std::move(child_config); - action_to_be_used.insert(p.first); + actions_to_be_used.insert(p.first); } } } @@ -655,7 +660,7 @@ class XdsRoutingLbFactory : public LoadBalancingPolicyFactory { for (size_t i = 0; i < array.size(); ++i) { XdsRoutingLbConfig::Route route; std::vector route_errors = - ParseRoute(array[i], action_map, &route, &action_to_be_used); + ParseRoute(array[i], action_map, &route, &actions_to_be_used); if (!route_errors.empty()) { // Can't use GRPC_ERROR_CREATE_FROM_VECTOR() here, because the error // string is not static in this case. @@ -680,7 +685,7 @@ class XdsRoutingLbFactory : public LoadBalancingPolicyFactory { "default route must not contain service or method"); error_list.push_back(error); } - if (!action_to_be_used.empty()) { + if (!actions_to_be_used.empty()) { error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( "some actions were not referenced by any route")); } @@ -760,7 +765,7 @@ class XdsRoutingLbFactory : public LoadBalancingPolicyFactory { static std::vector ParseRoute( const Json& json, const XdsRoutingLbConfig::ActionMap& action_map, XdsRoutingLbConfig::Route* route, - std::set* action_to_be_used) { + std::set* actions_to_be_used) { std::vector error_list; if (json.type() != Json::Type::OBJECT) { error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( @@ -790,15 +795,19 @@ class XdsRoutingLbFactory : public LoadBalancingPolicyFactory { "field:action error:should be of type string")); } else { route->action = it->second.string_value(); - // Validate action exists and mark it as used. - if (!route->action.empty() && - action_map.find(route->action) == action_map.end()) { + if (route->action.empty()) { error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( - absl::StrCat("field:action error:", route->action, - " does not exist") - .c_str())); + "field:action error:cannot be empty")); + } else { + // Validate action exists and mark it as used. + if (action_map.find(route->action) == action_map.end()) { + error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + absl::StrCat("field:action error:", route->action, + " does not exist") + .c_str())); + } + actions_to_be_used->erase(route->action); } - action_to_be_used->erase(route->action); } return error_list; } diff --git a/src/core/ext/filters/client_channel/xds/xds_api.cc b/src/core/ext/filters/client_channel/xds/xds_api.cc index d74b2ab694f..855d34a780d 100644 --- a/src/core/ext/filters/client_channel/xds/xds_api.cc +++ b/src/core/ext/filters/client_channel/xds/xds_api.cc @@ -1013,11 +1013,9 @@ grpc_error* RouteConfigParse( return GRPC_ERROR_CREATE_FROM_STATIC_STRING( "No route found in the virtual host."); } - // If xds_routing is not configured, only look at the last one in the route // list (the default route) - size_t start_index = size - 1; - if (xds_routing_enabled) start_index = 0; + size_t start_index = xds_routing_enabled ? 0 : size - 1; for (size_t i = start_index; i < size; ++i) { const envoy_api_v2_route_Route* route = routes[i]; const envoy_api_v2_route_RouteMatch* match = @@ -1064,6 +1062,10 @@ grpc_error* RouteConfigParse( } const upb_strview action = envoy_api_v2_route_RouteAction_cluster(route_action); + if (action.size == 0) { + return GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "RouteAction has empty cluster."); + } rds_route.cluster_name = std::string(action.data, action.size); rds_update->routes.emplace_back(std::move(rds_route)); } diff --git a/src/core/ext/filters/client_channel/xds/xds_client.cc b/src/core/ext/filters/client_channel/xds/xds_client.cc index 33e9d17c519..2f0657496da 100644 --- a/src/core/ext/filters/client_channel/xds/xds_client.cc +++ b/src/core/ext/filters/client_channel/xds/xds_client.cc @@ -903,7 +903,7 @@ void XdsClient::ChannelState::AdsCallState::AcceptLdsUpdate( ? lds_update->route_config_name.c_str() : "")); if (lds_update->rds_update.has_value()) { - gpr_log(GPR_INFO, " RouteConfiguration contains %lu routes", this, + gpr_log(GPR_INFO, " RouteConfiguration contains %lu routes", lds_update->rds_update.value().routes.size()); for (const auto& route : lds_update->rds_update.value().routes) { gpr_log(GPR_INFO, @@ -1819,8 +1819,8 @@ grpc_millis GetRequestTimeout(const grpc_channel_args& args) { } bool GetXdsRoutingEnabled(const grpc_channel_args& args) { - return grpc_channel_args_find_integer(&args, GRPC_ARG_XDS_ROUTING_ENABLED, - {0, 0, 1}); + return grpc_channel_args_find_bool(&args, GRPC_ARG_XDS_ROUTING_ENABLED, + false); } } // namespace diff --git a/test/cpp/end2end/BUILD b/test/cpp/end2end/BUILD index b8dbf5b4db5..bb6be0c4f02 100644 --- a/test/cpp/end2end/BUILD +++ b/test/cpp/end2end/BUILD @@ -38,7 +38,7 @@ grpc_cc_library( grpc_cc_library( name = "test_multiple_service_impl", testonly = True, - hdrs = ["test_multiple_service_impl.h"], + hdrs = ["test_service_impl.h"], external_deps = [ "gtest", ], diff --git a/test/cpp/end2end/test_multiple_service_impl.h b/test/cpp/end2end/test_multiple_service_impl.h deleted file mode 100644 index 2b06117774c..00000000000 --- a/test/cpp/end2end/test_multiple_service_impl.h +++ /dev/null @@ -1,495 +0,0 @@ -/* - * - * Copyright 2016 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef GRPC_TEST_CPP_END2END_TEST_MULTIPLE_SERVICE_IMPL_H -#define GRPC_TEST_CPP_END2END_TEST_MULTIPLE_SERVICE_IMPL_H - -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#include -#include - -#include "src/proto/grpc/testing/echo.grpc.pb.h" -#include "test/cpp/util/string_ref_helper.h" - -using std::chrono::system_clock; - -namespace grpc { -namespace testing { - -const int kServerDefaultResponseStreamsToSend = 3; -const char* const kServerResponseStreamsToSend = "server_responses_to_send"; -const char* const kServerTryCancelRequest = "server_try_cancel"; -const char* const kDebugInfoTrailerKey = "debug-info-bin"; -const char* const kServerFinishAfterNReads = "server_finish_after_n_reads"; -const char* const kServerUseCoalescingApi = "server_use_coalescing_api"; -const char* const kCheckClientInitialMetadataKey = "custom_client_metadata"; -const char* const kCheckClientInitialMetadataVal = "Value for client metadata"; - -typedef enum { - DO_NOT_CANCEL = 0, - CANCEL_BEFORE_PROCESSING, - CANCEL_DURING_PROCESSING, - CANCEL_AFTER_PROCESSING -} ServerTryCancelRequestPhase; - -namespace { - -// When echo_deadline is requested, deadline seen in the ServerContext is set in -// the response in seconds. -void MaybeEchoDeadline(experimental::ServerContextBase* context, - const EchoRequest* request, EchoResponse* response) { - if (request->has_param() && request->param().echo_deadline()) { - gpr_timespec deadline = gpr_inf_future(GPR_CLOCK_REALTIME); - if (context->deadline() != system_clock::time_point::max()) { - Timepoint2Timespec(context->deadline(), &deadline); - } - response->mutable_param()->set_request_deadline(deadline.tv_sec); - } -} - -void CheckServerAuthContext( - const experimental::ServerContextBase* context, - const grpc::string& expected_transport_security_type, - const grpc::string& expected_client_identity) { - std::shared_ptr auth_ctx = context->auth_context(); - std::vector tst = - auth_ctx->FindPropertyValues("transport_security_type"); - EXPECT_EQ(1u, tst.size()); - EXPECT_EQ(expected_transport_security_type, ToString(tst[0])); - if (expected_client_identity.empty()) { - EXPECT_TRUE(auth_ctx->GetPeerIdentityPropertyName().empty()); - EXPECT_TRUE(auth_ctx->GetPeerIdentity().empty()); - EXPECT_FALSE(auth_ctx->IsPeerAuthenticated()); - } else { - auto identity = auth_ctx->GetPeerIdentity(); - EXPECT_TRUE(auth_ctx->IsPeerAuthenticated()); - EXPECT_EQ(1u, identity.size()); - EXPECT_EQ(expected_client_identity, identity[0]); - } -} - -// Returns the number of pairs in metadata that exactly match the given -// key-value pair. Returns -1 if the pair wasn't found. -int MetadataMatchCount( - const std::multimap& metadata, - const grpc::string& key, const grpc::string& value) { - int count = 0; - for (const auto& metadatum : metadata) { - if (ToString(metadatum.first) == key && - ToString(metadatum.second) == value) { - count++; - } - } - return count; -} -} // namespace - -namespace { -int GetIntValueFromMetadataHelper( - const char* key, - const std::multimap& metadata, - int default_value) { - if (metadata.find(key) != metadata.end()) { - std::istringstream iss(ToString(metadata.find(key)->second)); - iss >> default_value; - gpr_log(GPR_INFO, "%s : %d", key, default_value); - } - - return default_value; -} - -int GetIntValueFromMetadata( - const char* key, - const std::multimap& metadata, - int default_value) { - return GetIntValueFromMetadataHelper(key, metadata, default_value); -} - -void ServerTryCancel(ServerContext* context) { - EXPECT_FALSE(context->IsCancelled()); - context->TryCancel(); - gpr_log(GPR_INFO, "Server called TryCancel() to cancel the request"); - // Now wait until it's really canceled - while (!context->IsCancelled()) { - gpr_sleep_until(gpr_time_add(gpr_now(GPR_CLOCK_REALTIME), - gpr_time_from_micros(1000, GPR_TIMESPAN))); - } -} - -} // namespace - -class TestMultipleServiceSignaller { - public: - void ClientWaitUntilRpcStarted() { - std::unique_lock lock(mu_); - cv_rpc_started_.wait(lock, [this] { return rpc_started_; }); - } - void ServerWaitToContinue() { - std::unique_lock lock(mu_); - cv_server_continue_.wait(lock, [this] { return server_should_continue_; }); - } - void SignalClientThatRpcStarted() { - std::unique_lock lock(mu_); - rpc_started_ = true; - cv_rpc_started_.notify_one(); - } - void SignalServerToContinue() { - std::unique_lock lock(mu_); - server_should_continue_ = true; - cv_server_continue_.notify_one(); - } - - private: - std::mutex mu_; - std::condition_variable cv_rpc_started_; - bool rpc_started_ /* GUARDED_BY(mu_) */ = false; - std::condition_variable cv_server_continue_; - bool server_should_continue_ /* GUARDED_BY(mu_) */ = false; -}; - -template -class TestMultipleServiceImpl : public RpcService { - public: - TestMultipleServiceImpl() : signal_client_(false), host_() {} - explicit TestMultipleServiceImpl(const grpc::string& host) - : signal_client_(false), host_(new grpc::string(host)) {} - - Status Echo(ServerContext* context, const EchoRequest* request, - EchoResponse* response) { - if (request->has_param() && - request->param().server_notify_client_when_started()) { - signaller_.SignalClientThatRpcStarted(); - signaller_.ServerWaitToContinue(); - } - - // A bit of sleep to make sure that short deadline tests fail - if (request->has_param() && request->param().server_sleep_us() > 0) { - gpr_sleep_until( - gpr_time_add(gpr_now(GPR_CLOCK_MONOTONIC), - gpr_time_from_micros(request->param().server_sleep_us(), - GPR_TIMESPAN))); - } - - if (request->has_param() && request->param().server_die()) { - gpr_log(GPR_ERROR, "The request should not reach application handler."); - GPR_ASSERT(0); - } - if (request->has_param() && request->param().has_expected_error()) { - const auto& error = request->param().expected_error(); - return Status(static_cast(error.code()), - error.error_message(), error.binary_error_details()); - } - int server_try_cancel = GetIntValueFromMetadata( - kServerTryCancelRequest, context->client_metadata(), DO_NOT_CANCEL); - if (server_try_cancel > DO_NOT_CANCEL) { - // Since this is a unary RPC, by the time this server handler is called, - // the 'request' message is already read from the client. So the scenarios - // in server_try_cancel don't make much sense. Just cancel the RPC as long - // as server_try_cancel is not DO_NOT_CANCEL - ServerTryCancel(context); - return Status::CANCELLED; - } - - response->set_message(request->message()); - MaybeEchoDeadline(context, request, response); - if (host_) { - response->mutable_param()->set_host(*host_); - } - if (request->has_param() && request->param().client_cancel_after_us()) { - { - std::unique_lock lock(mu_); - signal_client_ = true; - } - while (!context->IsCancelled()) { - gpr_sleep_until(gpr_time_add( - gpr_now(GPR_CLOCK_REALTIME), - gpr_time_from_micros(request->param().client_cancel_after_us(), - GPR_TIMESPAN))); - } - return Status::CANCELLED; - } else if (request->has_param() && - request->param().server_cancel_after_us()) { - gpr_sleep_until(gpr_time_add( - gpr_now(GPR_CLOCK_REALTIME), - gpr_time_from_micros(request->param().server_cancel_after_us(), - GPR_TIMESPAN))); - return Status::CANCELLED; - } else if (!request->has_param() || - !request->param().skip_cancelled_check()) { - EXPECT_FALSE(context->IsCancelled()); - } - - if (request->has_param() && request->param().echo_metadata_initially()) { - const std::multimap& client_metadata = - context->client_metadata(); - for (const auto& metadatum : client_metadata) { - context->AddInitialMetadata(ToString(metadatum.first), - ToString(metadatum.second)); - } - } - - if (request->has_param() && request->param().echo_metadata()) { - const std::multimap& client_metadata = - context->client_metadata(); - for (const auto& metadatum : client_metadata) { - context->AddTrailingMetadata(ToString(metadatum.first), - ToString(metadatum.second)); - } - // Terminate rpc with error and debug info in trailer. - if (request->param().debug_info().stack_entries_size() || - !request->param().debug_info().detail().empty()) { - grpc::string serialized_debug_info = - request->param().debug_info().SerializeAsString(); - context->AddTrailingMetadata(kDebugInfoTrailerKey, - serialized_debug_info); - return Status::CANCELLED; - } - } - if (request->has_param() && - (request->param().expected_client_identity().length() > 0 || - request->param().check_auth_context())) { - CheckServerAuthContext( - context, request->param().expected_transport_security_type(), - request->param().expected_client_identity()); - } - if (request->has_param() && - request->param().response_message_length() > 0) { - response->set_message( - grpc::string(request->param().response_message_length(), '\0')); - } - if (request->has_param() && request->param().echo_peer()) { - response->mutable_param()->set_peer(context->peer()); - } - return Status::OK; - } - - Status Echo1(ServerContext* context, const EchoRequest* request, - EchoResponse* response) { - return Echo(context, request, response); - } - - Status Echo2(ServerContext* context, const EchoRequest* request, - EchoResponse* response) { - return Echo(context, request, response); - } - - Status CheckClientInitialMetadata(ServerContext* context, - const SimpleRequest* /*request*/, - SimpleResponse* /*response*/) { - EXPECT_EQ(MetadataMatchCount(context->client_metadata(), - kCheckClientInitialMetadataKey, - kCheckClientInitialMetadataVal), - 1); - EXPECT_EQ(1u, - context->client_metadata().count(kCheckClientInitialMetadataKey)); - return Status::OK; - } - - // Unimplemented is left unimplemented to test the returned error. - Status RequestStream(ServerContext* context, - ServerReader* reader, - EchoResponse* response) { - // If 'server_try_cancel' is set in the metadata, the RPC is cancelled by - // the server by calling ServerContext::TryCancel() depending on the value: - // CANCEL_BEFORE_PROCESSING: The RPC is cancelled before the server reads - // any message from the client - // CANCEL_DURING_PROCESSING: The RPC is cancelled while the server is - // reading messages from the client - // CANCEL_AFTER_PROCESSING: The RPC is cancelled after the server reads - // all the messages from the client - int server_try_cancel = GetIntValueFromMetadata( - kServerTryCancelRequest, context->client_metadata(), DO_NOT_CANCEL); - - EchoRequest request; - response->set_message(""); - - if (server_try_cancel == CANCEL_BEFORE_PROCESSING) { - ServerTryCancel(context); - return Status::CANCELLED; - } - - std::thread* server_try_cancel_thd = nullptr; - if (server_try_cancel == CANCEL_DURING_PROCESSING) { - server_try_cancel_thd = - new std::thread([context] { ServerTryCancel(context); }); - } - - int num_msgs_read = 0; - while (reader->Read(&request)) { - response->mutable_message()->append(request.message()); - } - gpr_log(GPR_INFO, "Read: %d messages", num_msgs_read); - - if (server_try_cancel_thd != nullptr) { - server_try_cancel_thd->join(); - delete server_try_cancel_thd; - return Status::CANCELLED; - } - - if (server_try_cancel == CANCEL_AFTER_PROCESSING) { - ServerTryCancel(context); - return Status::CANCELLED; - } - - return Status::OK; - } - - // Return 'kNumResponseStreamMsgs' messages. - // TODO(yangg) make it generic by adding a parameter into EchoRequest - Status ResponseStream(ServerContext* context, const EchoRequest* request, - ServerWriter* writer) { - // If server_try_cancel is set in the metadata, the RPC is cancelled by the - // server by calling ServerContext::TryCancel() depending on the value: - // CANCEL_BEFORE_PROCESSING: The RPC is cancelled before the server writes - // any messages to the client - // CANCEL_DURING_PROCESSING: The RPC is cancelled while the server is - // writing messages to the client - // CANCEL_AFTER_PROCESSING: The RPC is cancelled after the server writes - // all the messages to the client - int server_try_cancel = GetIntValueFromMetadata( - kServerTryCancelRequest, context->client_metadata(), DO_NOT_CANCEL); - - int server_coalescing_api = GetIntValueFromMetadata( - kServerUseCoalescingApi, context->client_metadata(), 0); - - int server_responses_to_send = GetIntValueFromMetadata( - kServerResponseStreamsToSend, context->client_metadata(), - kServerDefaultResponseStreamsToSend); - - if (server_try_cancel == CANCEL_BEFORE_PROCESSING) { - ServerTryCancel(context); - return Status::CANCELLED; - } - - EchoResponse response; - std::thread* server_try_cancel_thd = nullptr; - if (server_try_cancel == CANCEL_DURING_PROCESSING) { - server_try_cancel_thd = - new std::thread([context] { ServerTryCancel(context); }); - } - - for (int i = 0; i < server_responses_to_send; i++) { - response.set_message(request->message() + grpc::to_string(i)); - if (i == server_responses_to_send - 1 && server_coalescing_api != 0) { - writer->WriteLast(response, WriteOptions()); - } else { - writer->Write(response); - } - } - - if (server_try_cancel_thd != nullptr) { - server_try_cancel_thd->join(); - delete server_try_cancel_thd; - return Status::CANCELLED; - } - - if (server_try_cancel == CANCEL_AFTER_PROCESSING) { - ServerTryCancel(context); - return Status::CANCELLED; - } - - return Status::OK; - } - - Status BidiStream(ServerContext* context, - ServerReaderWriter* stream) { - // If server_try_cancel is set in the metadata, the RPC is cancelled by the - // server by calling ServerContext::TryCancel() depending on the value: - // CANCEL_BEFORE_PROCESSING: The RPC is cancelled before the server reads/ - // writes any messages from/to the client - // CANCEL_DURING_PROCESSING: The RPC is cancelled while the server is - // reading/writing messages from/to the client - // CANCEL_AFTER_PROCESSING: The RPC is cancelled after the server - // reads/writes all messages from/to the client - int server_try_cancel = GetIntValueFromMetadata( - kServerTryCancelRequest, context->client_metadata(), DO_NOT_CANCEL); - - EchoRequest request; - EchoResponse response; - - if (server_try_cancel == CANCEL_BEFORE_PROCESSING) { - ServerTryCancel(context); - return Status::CANCELLED; - } - - std::thread* server_try_cancel_thd = nullptr; - if (server_try_cancel == CANCEL_DURING_PROCESSING) { - server_try_cancel_thd = - new std::thread([context] { ServerTryCancel(context); }); - } - - // kServerFinishAfterNReads suggests after how many reads, the server should - // write the last message and send status (coalesced using WriteLast) - int server_write_last = GetIntValueFromMetadata( - kServerFinishAfterNReads, context->client_metadata(), 0); - - int read_counts = 0; - while (stream->Read(&request)) { - read_counts++; - gpr_log(GPR_INFO, "recv msg %s", request.message().c_str()); - response.set_message(request.message()); - if (read_counts == server_write_last) { - stream->WriteLast(response, WriteOptions()); - } else { - stream->Write(response); - } - } - - if (server_try_cancel_thd != nullptr) { - server_try_cancel_thd->join(); - delete server_try_cancel_thd; - return Status::CANCELLED; - } - - if (server_try_cancel == CANCEL_AFTER_PROCESSING) { - ServerTryCancel(context); - return Status::CANCELLED; - } - - return Status::OK; - } - - // Unimplemented is left unimplemented to test the returned error. - bool signal_client() { - std::unique_lock lock(mu_); - return signal_client_; - } - void ClientWaitUntilRpcStarted() { signaller_.ClientWaitUntilRpcStarted(); } - void SignalServerToContinue() { signaller_.SignalServerToContinue(); } - - private: - bool signal_client_; - std::mutex mu_; - TestMultipleServiceSignaller signaller_; - std::unique_ptr host_; -}; - -} // namespace testing -} // namespace grpc - -#endif // GRPC_TEST_CPP_END2END_TEST_MULTIPLE_SERVICE_IMPL_H diff --git a/test/cpp/end2end/test_service_impl.cc b/test/cpp/end2end/test_service_impl.cc index ad1592bf7d8..6517c5d6cc1 100644 --- a/test/cpp/end2end/test_service_impl.cc +++ b/test/cpp/end2end/test_service_impl.cc @@ -36,88 +36,6 @@ namespace grpc { namespace testing { namespace { -// When echo_deadline is requested, deadline seen in the ServerContext is set in -// the response in seconds. -void MaybeEchoDeadline(experimental::ServerContextBase* context, - const EchoRequest* request, EchoResponse* response) { - if (request->has_param() && request->param().echo_deadline()) { - gpr_timespec deadline = gpr_inf_future(GPR_CLOCK_REALTIME); - if (context->deadline() != system_clock::time_point::max()) { - Timepoint2Timespec(context->deadline(), &deadline); - } - response->mutable_param()->set_request_deadline(deadline.tv_sec); - } -} - -void CheckServerAuthContext( - const experimental::ServerContextBase* context, - const grpc::string& expected_transport_security_type, - const grpc::string& expected_client_identity) { - std::shared_ptr auth_ctx = context->auth_context(); - std::vector tst = - auth_ctx->FindPropertyValues("transport_security_type"); - EXPECT_EQ(1u, tst.size()); - EXPECT_EQ(expected_transport_security_type, ToString(tst[0])); - if (expected_client_identity.empty()) { - EXPECT_TRUE(auth_ctx->GetPeerIdentityPropertyName().empty()); - EXPECT_TRUE(auth_ctx->GetPeerIdentity().empty()); - EXPECT_FALSE(auth_ctx->IsPeerAuthenticated()); - } else { - auto identity = auth_ctx->GetPeerIdentity(); - EXPECT_TRUE(auth_ctx->IsPeerAuthenticated()); - EXPECT_EQ(1u, identity.size()); - EXPECT_EQ(expected_client_identity, identity[0]); - } -} - -// Returns the number of pairs in metadata that exactly match the given -// key-value pair. Returns -1 if the pair wasn't found. -int MetadataMatchCount( - const std::multimap& metadata, - const grpc::string& key, const grpc::string& value) { - int count = 0; - for (const auto& metadatum : metadata) { - if (ToString(metadatum.first) == key && - ToString(metadatum.second) == value) { - count++; - } - } - return count; -} -} // namespace - -namespace { -int GetIntValueFromMetadataHelper( - const char* key, - const std::multimap& metadata, - int default_value) { - if (metadata.find(key) != metadata.end()) { - std::istringstream iss(ToString(metadata.find(key)->second)); - iss >> default_value; - gpr_log(GPR_INFO, "%s : %d", key, default_value); - } - - return default_value; -} - -int GetIntValueFromMetadata( - const char* key, - const std::multimap& metadata, - int default_value) { - return GetIntValueFromMetadataHelper(key, metadata, default_value); -} - -void ServerTryCancel(ServerContext* context) { - EXPECT_FALSE(context->IsCancelled()); - context->TryCancel(); - gpr_log(GPR_INFO, "Server called TryCancel() to cancel the request"); - // Now wait until it's really canceled - while (!context->IsCancelled()) { - gpr_sleep_until(gpr_time_add(gpr_now(GPR_CLOCK_REALTIME), - gpr_time_from_micros(1000, GPR_TIMESPAN))); - } -} - void ServerTryCancelNonblocking(experimental::CallbackServerContext* context) { EXPECT_FALSE(context->IsCancelled()); context->TryCancel(); @@ -127,304 +45,6 @@ void ServerTryCancelNonblocking(experimental::CallbackServerContext* context) { } // namespace -Status TestServiceImpl::Echo(ServerContext* context, const EchoRequest* request, - EchoResponse* response) { - if (request->has_param() && - request->param().server_notify_client_when_started()) { - signaller_.SignalClientThatRpcStarted(); - signaller_.ServerWaitToContinue(); - } - - // A bit of sleep to make sure that short deadline tests fail - if (request->has_param() && request->param().server_sleep_us() > 0) { - gpr_sleep_until( - gpr_time_add(gpr_now(GPR_CLOCK_MONOTONIC), - gpr_time_from_micros(request->param().server_sleep_us(), - GPR_TIMESPAN))); - } - - if (request->has_param() && request->param().server_die()) { - gpr_log(GPR_ERROR, "The request should not reach application handler."); - GPR_ASSERT(0); - } - if (request->has_param() && request->param().has_expected_error()) { - const auto& error = request->param().expected_error(); - return Status(static_cast(error.code()), error.error_message(), - error.binary_error_details()); - } - int server_try_cancel = GetIntValueFromMetadata( - kServerTryCancelRequest, context->client_metadata(), DO_NOT_CANCEL); - if (server_try_cancel > DO_NOT_CANCEL) { - // Since this is a unary RPC, by the time this server handler is called, - // the 'request' message is already read from the client. So the scenarios - // in server_try_cancel don't make much sense. Just cancel the RPC as long - // as server_try_cancel is not DO_NOT_CANCEL - ServerTryCancel(context); - return Status::CANCELLED; - } - - response->set_message(request->message()); - MaybeEchoDeadline(context, request, response); - if (host_) { - response->mutable_param()->set_host(*host_); - } - if (request->has_param() && request->param().client_cancel_after_us()) { - { - std::unique_lock lock(mu_); - signal_client_ = true; - } - while (!context->IsCancelled()) { - gpr_sleep_until(gpr_time_add( - gpr_now(GPR_CLOCK_REALTIME), - gpr_time_from_micros(request->param().client_cancel_after_us(), - GPR_TIMESPAN))); - } - return Status::CANCELLED; - } else if (request->has_param() && - request->param().server_cancel_after_us()) { - gpr_sleep_until(gpr_time_add( - gpr_now(GPR_CLOCK_REALTIME), - gpr_time_from_micros(request->param().server_cancel_after_us(), - GPR_TIMESPAN))); - return Status::CANCELLED; - } else if (!request->has_param() || - !request->param().skip_cancelled_check()) { - EXPECT_FALSE(context->IsCancelled()); - } - - if (request->has_param() && request->param().echo_metadata_initially()) { - const std::multimap& client_metadata = - context->client_metadata(); - for (const auto& metadatum : client_metadata) { - context->AddInitialMetadata(ToString(metadatum.first), - ToString(metadatum.second)); - } - } - - if (request->has_param() && request->param().echo_metadata()) { - const std::multimap& client_metadata = - context->client_metadata(); - for (const auto& metadatum : client_metadata) { - context->AddTrailingMetadata(ToString(metadatum.first), - ToString(metadatum.second)); - } - // Terminate rpc with error and debug info in trailer. - if (request->param().debug_info().stack_entries_size() || - !request->param().debug_info().detail().empty()) { - grpc::string serialized_debug_info = - request->param().debug_info().SerializeAsString(); - context->AddTrailingMetadata(kDebugInfoTrailerKey, serialized_debug_info); - return Status::CANCELLED; - } - } - if (request->has_param() && - (request->param().expected_client_identity().length() > 0 || - request->param().check_auth_context())) { - CheckServerAuthContext(context, - request->param().expected_transport_security_type(), - request->param().expected_client_identity()); - } - if (request->has_param() && request->param().response_message_length() > 0) { - response->set_message( - grpc::string(request->param().response_message_length(), '\0')); - } - if (request->has_param() && request->param().echo_peer()) { - response->mutable_param()->set_peer(context->peer()); - } - return Status::OK; -} - -Status TestServiceImpl::Echo1(ServerContext* context, - const EchoRequest* request, - EchoResponse* response) { - return Echo(context, request, response); -} - -Status TestServiceImpl::Echo2(ServerContext* context, - const EchoRequest* request, - EchoResponse* response) { - return Echo(context, request, response); -} - -Status TestServiceImpl::CheckClientInitialMetadata( - ServerContext* context, const SimpleRequest* /*request*/, - SimpleResponse* /*response*/) { - EXPECT_EQ(MetadataMatchCount(context->client_metadata(), - kCheckClientInitialMetadataKey, - kCheckClientInitialMetadataVal), - 1); - EXPECT_EQ(1u, - context->client_metadata().count(kCheckClientInitialMetadataKey)); - return Status::OK; -} - -// Unimplemented is left unimplemented to test the returned error. - -Status TestServiceImpl::RequestStream(ServerContext* context, - ServerReader* reader, - EchoResponse* response) { - // If 'server_try_cancel' is set in the metadata, the RPC is cancelled by - // the server by calling ServerContext::TryCancel() depending on the value: - // CANCEL_BEFORE_PROCESSING: The RPC is cancelled before the server reads - // any message from the client - // CANCEL_DURING_PROCESSING: The RPC is cancelled while the server is - // reading messages from the client - // CANCEL_AFTER_PROCESSING: The RPC is cancelled after the server reads - // all the messages from the client - int server_try_cancel = GetIntValueFromMetadata( - kServerTryCancelRequest, context->client_metadata(), DO_NOT_CANCEL); - - EchoRequest request; - response->set_message(""); - - if (server_try_cancel == CANCEL_BEFORE_PROCESSING) { - ServerTryCancel(context); - return Status::CANCELLED; - } - - std::thread* server_try_cancel_thd = nullptr; - if (server_try_cancel == CANCEL_DURING_PROCESSING) { - server_try_cancel_thd = - new std::thread([context] { ServerTryCancel(context); }); - } - - int num_msgs_read = 0; - while (reader->Read(&request)) { - response->mutable_message()->append(request.message()); - } - gpr_log(GPR_INFO, "Read: %d messages", num_msgs_read); - - if (server_try_cancel_thd != nullptr) { - server_try_cancel_thd->join(); - delete server_try_cancel_thd; - return Status::CANCELLED; - } - - if (server_try_cancel == CANCEL_AFTER_PROCESSING) { - ServerTryCancel(context); - return Status::CANCELLED; - } - - return Status::OK; -} - -// Return 'kNumResponseStreamMsgs' messages. -// TODO(yangg) make it generic by adding a parameter into EchoRequest -Status TestServiceImpl::ResponseStream(ServerContext* context, - const EchoRequest* request, - ServerWriter* writer) { - // If server_try_cancel is set in the metadata, the RPC is cancelled by the - // server by calling ServerContext::TryCancel() depending on the value: - // CANCEL_BEFORE_PROCESSING: The RPC is cancelled before the server writes - // any messages to the client - // CANCEL_DURING_PROCESSING: The RPC is cancelled while the server is - // writing messages to the client - // CANCEL_AFTER_PROCESSING: The RPC is cancelled after the server writes - // all the messages to the client - int server_try_cancel = GetIntValueFromMetadata( - kServerTryCancelRequest, context->client_metadata(), DO_NOT_CANCEL); - - int server_coalescing_api = GetIntValueFromMetadata( - kServerUseCoalescingApi, context->client_metadata(), 0); - - int server_responses_to_send = GetIntValueFromMetadata( - kServerResponseStreamsToSend, context->client_metadata(), - kServerDefaultResponseStreamsToSend); - - if (server_try_cancel == CANCEL_BEFORE_PROCESSING) { - ServerTryCancel(context); - return Status::CANCELLED; - } - - EchoResponse response; - std::thread* server_try_cancel_thd = nullptr; - if (server_try_cancel == CANCEL_DURING_PROCESSING) { - server_try_cancel_thd = - new std::thread([context] { ServerTryCancel(context); }); - } - - for (int i = 0; i < server_responses_to_send; i++) { - response.set_message(request->message() + grpc::to_string(i)); - if (i == server_responses_to_send - 1 && server_coalescing_api != 0) { - writer->WriteLast(response, WriteOptions()); - } else { - writer->Write(response); - } - } - - if (server_try_cancel_thd != nullptr) { - server_try_cancel_thd->join(); - delete server_try_cancel_thd; - return Status::CANCELLED; - } - - if (server_try_cancel == CANCEL_AFTER_PROCESSING) { - ServerTryCancel(context); - return Status::CANCELLED; - } - - return Status::OK; -} - -Status TestServiceImpl::BidiStream( - ServerContext* context, - ServerReaderWriter* stream) { - // If server_try_cancel is set in the metadata, the RPC is cancelled by the - // server by calling ServerContext::TryCancel() depending on the value: - // CANCEL_BEFORE_PROCESSING: The RPC is cancelled before the server reads/ - // writes any messages from/to the client - // CANCEL_DURING_PROCESSING: The RPC is cancelled while the server is - // reading/writing messages from/to the client - // CANCEL_AFTER_PROCESSING: The RPC is cancelled after the server - // reads/writes all messages from/to the client - int server_try_cancel = GetIntValueFromMetadata( - kServerTryCancelRequest, context->client_metadata(), DO_NOT_CANCEL); - - EchoRequest request; - EchoResponse response; - - if (server_try_cancel == CANCEL_BEFORE_PROCESSING) { - ServerTryCancel(context); - return Status::CANCELLED; - } - - std::thread* server_try_cancel_thd = nullptr; - if (server_try_cancel == CANCEL_DURING_PROCESSING) { - server_try_cancel_thd = - new std::thread([context] { ServerTryCancel(context); }); - } - - // kServerFinishAfterNReads suggests after how many reads, the server should - // write the last message and send status (coalesced using WriteLast) - int server_write_last = GetIntValueFromMetadata( - kServerFinishAfterNReads, context->client_metadata(), 0); - - int read_counts = 0; - while (stream->Read(&request)) { - read_counts++; - gpr_log(GPR_INFO, "recv msg %s", request.message().c_str()); - response.set_message(request.message()); - if (read_counts == server_write_last) { - stream->WriteLast(response, WriteOptions()); - } else { - stream->Write(response); - } - } - - if (server_try_cancel_thd != nullptr) { - server_try_cancel_thd->join(); - delete server_try_cancel_thd; - return Status::CANCELLED; - } - - if (server_try_cancel == CANCEL_AFTER_PROCESSING) { - ServerTryCancel(context); - return Status::CANCELLED; - } - - return Status::OK; -} - experimental::ServerUnaryReactor* CallbackTestServiceImpl::Echo( experimental::CallbackServerContext* context, const EchoRequest* request, EchoResponse* response) { diff --git a/test/cpp/end2end/test_service_impl.h b/test/cpp/end2end/test_service_impl.h index e41359f9655..905f2cbea89 100644 --- a/test/cpp/end2end/test_service_impl.h +++ b/test/cpp/end2end/test_service_impl.h @@ -15,6 +15,7 @@ * limitations under the License. * */ + #ifndef GRPC_TEST_CPP_END2END_TEST_SERVICE_IMPL_H #define GRPC_TEST_CPP_END2END_TEST_SERVICE_IMPL_H @@ -23,9 +24,19 @@ #include #include +#include +#include +#include #include +#include + +#include +#include #include "src/proto/grpc/testing/echo.grpc.pb.h" +#include "test/cpp/util/string_ref_helper.h" + +using std::chrono::system_clock; namespace grpc { namespace testing { @@ -46,6 +57,92 @@ typedef enum { CANCEL_AFTER_PROCESSING } ServerTryCancelRequestPhase; +namespace { + +// When echo_deadline is requested, deadline seen in the ServerContext is set in +// the response in seconds. +void MaybeEchoDeadline(experimental::ServerContextBase* context, + const EchoRequest* request, EchoResponse* response) { + if (request->has_param() && request->param().echo_deadline()) { + gpr_timespec deadline = gpr_inf_future(GPR_CLOCK_REALTIME); + if (context->deadline() != system_clock::time_point::max()) { + Timepoint2Timespec(context->deadline(), &deadline); + } + response->mutable_param()->set_request_deadline(deadline.tv_sec); + } +} + +void CheckServerAuthContext( + const experimental::ServerContextBase* context, + const grpc::string& expected_transport_security_type, + const grpc::string& expected_client_identity) { + std::shared_ptr auth_ctx = context->auth_context(); + std::vector tst = + auth_ctx->FindPropertyValues("transport_security_type"); + EXPECT_EQ(1u, tst.size()); + EXPECT_EQ(expected_transport_security_type, ToString(tst[0])); + if (expected_client_identity.empty()) { + EXPECT_TRUE(auth_ctx->GetPeerIdentityPropertyName().empty()); + EXPECT_TRUE(auth_ctx->GetPeerIdentity().empty()); + EXPECT_FALSE(auth_ctx->IsPeerAuthenticated()); + } else { + auto identity = auth_ctx->GetPeerIdentity(); + EXPECT_TRUE(auth_ctx->IsPeerAuthenticated()); + EXPECT_EQ(1u, identity.size()); + EXPECT_EQ(expected_client_identity, identity[0]); + } +} + +// Returns the number of pairs in metadata that exactly match the given +// key-value pair. Returns -1 if the pair wasn't found. +int MetadataMatchCount( + const std::multimap& metadata, + const grpc::string& key, const grpc::string& value) { + int count = 0; + for (const auto& metadatum : metadata) { + if (ToString(metadatum.first) == key && + ToString(metadatum.second) == value) { + count++; + } + } + return count; +} +} // namespace + +namespace { +int GetIntValueFromMetadataHelper( + const char* key, + const std::multimap& metadata, + int default_value) { + if (metadata.find(key) != metadata.end()) { + std::istringstream iss(ToString(metadata.find(key)->second)); + iss >> default_value; + gpr_log(GPR_INFO, "%s : %d", key, default_value); + } + + return default_value; +} + +int GetIntValueFromMetadata( + const char* key, + const std::multimap& metadata, + int default_value) { + return GetIntValueFromMetadataHelper(key, metadata, default_value); +} + +void ServerTryCancel(ServerContext* context) { + EXPECT_FALSE(context->IsCancelled()); + context->TryCancel(); + gpr_log(GPR_INFO, "Server called TryCancel() to cancel the request"); + // Now wait until it's really canceled + while (!context->IsCancelled()) { + gpr_sleep_until(gpr_time_add(gpr_now(GPR_CLOCK_REALTIME), + gpr_time_from_micros(1000, GPR_TIMESPAN))); + } +} + +} // namespace + class TestServiceSignaller { public: void ClientWaitUntilRpcStarted() { @@ -75,38 +172,309 @@ class TestServiceSignaller { bool server_should_continue_ /* GUARDED_BY(mu_) */ = false; }; -class TestServiceImpl : public ::grpc::testing::EchoTestService::Service { +template +class TestMultipleServiceImpl : public RpcService { public: - TestServiceImpl() : signal_client_(false), host_() {} - explicit TestServiceImpl(const grpc::string& host) + TestMultipleServiceImpl() : signal_client_(false), host_() {} + explicit TestMultipleServiceImpl(const grpc::string& host) : signal_client_(false), host_(new grpc::string(host)) {} Status Echo(ServerContext* context, const EchoRequest* request, - EchoResponse* response) override; + EchoResponse* response) { + if (request->has_param() && + request->param().server_notify_client_when_started()) { + signaller_.SignalClientThatRpcStarted(); + signaller_.ServerWaitToContinue(); + } + + // A bit of sleep to make sure that short deadline tests fail + if (request->has_param() && request->param().server_sleep_us() > 0) { + gpr_sleep_until( + gpr_time_add(gpr_now(GPR_CLOCK_MONOTONIC), + gpr_time_from_micros(request->param().server_sleep_us(), + GPR_TIMESPAN))); + } + + if (request->has_param() && request->param().server_die()) { + gpr_log(GPR_ERROR, "The request should not reach application handler."); + GPR_ASSERT(0); + } + if (request->has_param() && request->param().has_expected_error()) { + const auto& error = request->param().expected_error(); + return Status(static_cast(error.code()), + error.error_message(), error.binary_error_details()); + } + int server_try_cancel = GetIntValueFromMetadata( + kServerTryCancelRequest, context->client_metadata(), DO_NOT_CANCEL); + if (server_try_cancel > DO_NOT_CANCEL) { + // Since this is a unary RPC, by the time this server handler is called, + // the 'request' message is already read from the client. So the scenarios + // in server_try_cancel don't make much sense. Just cancel the RPC as long + // as server_try_cancel is not DO_NOT_CANCEL + ServerTryCancel(context); + return Status::CANCELLED; + } + + response->set_message(request->message()); + MaybeEchoDeadline(context, request, response); + if (host_) { + response->mutable_param()->set_host(*host_); + } + if (request->has_param() && request->param().client_cancel_after_us()) { + { + std::unique_lock lock(mu_); + signal_client_ = true; + } + while (!context->IsCancelled()) { + gpr_sleep_until(gpr_time_add( + gpr_now(GPR_CLOCK_REALTIME), + gpr_time_from_micros(request->param().client_cancel_after_us(), + GPR_TIMESPAN))); + } + return Status::CANCELLED; + } else if (request->has_param() && + request->param().server_cancel_after_us()) { + gpr_sleep_until(gpr_time_add( + gpr_now(GPR_CLOCK_REALTIME), + gpr_time_from_micros(request->param().server_cancel_after_us(), + GPR_TIMESPAN))); + return Status::CANCELLED; + } else if (!request->has_param() || + !request->param().skip_cancelled_check()) { + EXPECT_FALSE(context->IsCancelled()); + } + + if (request->has_param() && request->param().echo_metadata_initially()) { + const std::multimap& client_metadata = + context->client_metadata(); + for (const auto& metadatum : client_metadata) { + context->AddInitialMetadata(ToString(metadatum.first), + ToString(metadatum.second)); + } + } + + if (request->has_param() && request->param().echo_metadata()) { + const std::multimap& client_metadata = + context->client_metadata(); + for (const auto& metadatum : client_metadata) { + context->AddTrailingMetadata(ToString(metadatum.first), + ToString(metadatum.second)); + } + // Terminate rpc with error and debug info in trailer. + if (request->param().debug_info().stack_entries_size() || + !request->param().debug_info().detail().empty()) { + grpc::string serialized_debug_info = + request->param().debug_info().SerializeAsString(); + context->AddTrailingMetadata(kDebugInfoTrailerKey, + serialized_debug_info); + return Status::CANCELLED; + } + } + if (request->has_param() && + (request->param().expected_client_identity().length() > 0 || + request->param().check_auth_context())) { + CheckServerAuthContext( + context, request->param().expected_transport_security_type(), + request->param().expected_client_identity()); + } + if (request->has_param() && + request->param().response_message_length() > 0) { + response->set_message( + grpc::string(request->param().response_message_length(), '\0')); + } + if (request->has_param() && request->param().echo_peer()) { + response->mutable_param()->set_peer(context->peer()); + } + return Status::OK; + } Status Echo1(ServerContext* context, const EchoRequest* request, - EchoResponse* response) override; + EchoResponse* response) { + return Echo(context, request, response); + } Status Echo2(ServerContext* context, const EchoRequest* request, - EchoResponse* response) override; + EchoResponse* response) { + return Echo(context, request, response); + } Status CheckClientInitialMetadata(ServerContext* context, - const SimpleRequest* request, - SimpleResponse* response) override; + const SimpleRequest* /*request*/, + SimpleResponse* /*response*/) { + EXPECT_EQ(MetadataMatchCount(context->client_metadata(), + kCheckClientInitialMetadataKey, + kCheckClientInitialMetadataVal), + 1); + EXPECT_EQ(1u, + context->client_metadata().count(kCheckClientInitialMetadataKey)); + return Status::OK; + } // Unimplemented is left unimplemented to test the returned error. - Status RequestStream(ServerContext* context, ServerReader* reader, - EchoResponse* response) override; + EchoResponse* response) { + // If 'server_try_cancel' is set in the metadata, the RPC is cancelled by + // the server by calling ServerContext::TryCancel() depending on the value: + // CANCEL_BEFORE_PROCESSING: The RPC is cancelled before the server reads + // any message from the client + // CANCEL_DURING_PROCESSING: The RPC is cancelled while the server is + // reading messages from the client + // CANCEL_AFTER_PROCESSING: The RPC is cancelled after the server reads + // all the messages from the client + int server_try_cancel = GetIntValueFromMetadata( + kServerTryCancelRequest, context->client_metadata(), DO_NOT_CANCEL); + + EchoRequest request; + response->set_message(""); + if (server_try_cancel == CANCEL_BEFORE_PROCESSING) { + ServerTryCancel(context); + return Status::CANCELLED; + } + + std::thread* server_try_cancel_thd = nullptr; + if (server_try_cancel == CANCEL_DURING_PROCESSING) { + server_try_cancel_thd = + new std::thread([context] { ServerTryCancel(context); }); + } + + int num_msgs_read = 0; + while (reader->Read(&request)) { + response->mutable_message()->append(request.message()); + } + gpr_log(GPR_INFO, "Read: %d messages", num_msgs_read); + + if (server_try_cancel_thd != nullptr) { + server_try_cancel_thd->join(); + delete server_try_cancel_thd; + return Status::CANCELLED; + } + + if (server_try_cancel == CANCEL_AFTER_PROCESSING) { + ServerTryCancel(context); + return Status::CANCELLED; + } + + return Status::OK; + } + + // Return 'kNumResponseStreamMsgs' messages. + // TODO(yangg) make it generic by adding a parameter into EchoRequest Status ResponseStream(ServerContext* context, const EchoRequest* request, - ServerWriter* writer) override; + ServerWriter* writer) { + // If server_try_cancel is set in the metadata, the RPC is cancelled by the + // server by calling ServerContext::TryCancel() depending on the value: + // CANCEL_BEFORE_PROCESSING: The RPC is cancelled before the server writes + // any messages to the client + // CANCEL_DURING_PROCESSING: The RPC is cancelled while the server is + // writing messages to the client + // CANCEL_AFTER_PROCESSING: The RPC is cancelled after the server writes + // all the messages to the client + int server_try_cancel = GetIntValueFromMetadata( + kServerTryCancelRequest, context->client_metadata(), DO_NOT_CANCEL); - Status BidiStream( - ServerContext* context, - ServerReaderWriter* stream) override; + int server_coalescing_api = GetIntValueFromMetadata( + kServerUseCoalescingApi, context->client_metadata(), 0); + int server_responses_to_send = GetIntValueFromMetadata( + kServerResponseStreamsToSend, context->client_metadata(), + kServerDefaultResponseStreamsToSend); + + if (server_try_cancel == CANCEL_BEFORE_PROCESSING) { + ServerTryCancel(context); + return Status::CANCELLED; + } + + EchoResponse response; + std::thread* server_try_cancel_thd = nullptr; + if (server_try_cancel == CANCEL_DURING_PROCESSING) { + server_try_cancel_thd = + new std::thread([context] { ServerTryCancel(context); }); + } + + for (int i = 0; i < server_responses_to_send; i++) { + response.set_message(request->message() + grpc::to_string(i)); + if (i == server_responses_to_send - 1 && server_coalescing_api != 0) { + writer->WriteLast(response, WriteOptions()); + } else { + writer->Write(response); + } + } + + if (server_try_cancel_thd != nullptr) { + server_try_cancel_thd->join(); + delete server_try_cancel_thd; + return Status::CANCELLED; + } + + if (server_try_cancel == CANCEL_AFTER_PROCESSING) { + ServerTryCancel(context); + return Status::CANCELLED; + } + + return Status::OK; + } + + Status BidiStream(ServerContext* context, + ServerReaderWriter* stream) { + // If server_try_cancel is set in the metadata, the RPC is cancelled by the + // server by calling ServerContext::TryCancel() depending on the value: + // CANCEL_BEFORE_PROCESSING: The RPC is cancelled before the server reads/ + // writes any messages from/to the client + // CANCEL_DURING_PROCESSING: The RPC is cancelled while the server is + // reading/writing messages from/to the client + // CANCEL_AFTER_PROCESSING: The RPC is cancelled after the server + // reads/writes all messages from/to the client + int server_try_cancel = GetIntValueFromMetadata( + kServerTryCancelRequest, context->client_metadata(), DO_NOT_CANCEL); + + EchoRequest request; + EchoResponse response; + + if (server_try_cancel == CANCEL_BEFORE_PROCESSING) { + ServerTryCancel(context); + return Status::CANCELLED; + } + + std::thread* server_try_cancel_thd = nullptr; + if (server_try_cancel == CANCEL_DURING_PROCESSING) { + server_try_cancel_thd = + new std::thread([context] { ServerTryCancel(context); }); + } + + // kServerFinishAfterNReads suggests after how many reads, the server should + // write the last message and send status (coalesced using WriteLast) + int server_write_last = GetIntValueFromMetadata( + kServerFinishAfterNReads, context->client_metadata(), 0); + + int read_counts = 0; + while (stream->Read(&request)) { + read_counts++; + gpr_log(GPR_INFO, "recv msg %s", request.message().c_str()); + response.set_message(request.message()); + if (read_counts == server_write_last) { + stream->WriteLast(response, WriteOptions()); + } else { + stream->Write(response); + } + } + + if (server_try_cancel_thd != nullptr) { + server_try_cancel_thd->join(); + delete server_try_cancel_thd; + return Status::CANCELLED; + } + + if (server_try_cancel == CANCEL_AFTER_PROCESSING) { + ServerTryCancel(context); + return Status::CANCELLED; + } + + return Status::OK; + } + + // Unimplemented is left unimplemented to test the returned error. bool signal_client() { std::unique_lock lock(mu_); return signal_client_; @@ -162,6 +530,9 @@ class CallbackTestServiceImpl std::unique_ptr host_; }; +using TestServiceImpl = + TestMultipleServiceImpl<::grpc::testing::EchoTestService::Service>; + } // namespace testing } // namespace grpc diff --git a/test/cpp/end2end/xds_end2end_test.cc b/test/cpp/end2end/xds_end2end_test.cc index 2665f9e9082..2e9d2ae501a 100644 --- a/test/cpp/end2end/xds_end2end_test.cc +++ b/test/cpp/end2end/xds_end2end_test.cc @@ -57,7 +57,7 @@ #include "test/core/util/port.h" #include "test/core/util/test_config.h" -#include "test/cpp/end2end/test_multiple_service_impl.h" +#include "test/cpp/end2end/test_service_impl.h" #include "src/proto/grpc/testing/echo.grpc.pb.h" #include "src/proto/grpc/testing/xds/ads_for_test.grpc.pb.h" @@ -2316,6 +2316,7 @@ TEST_P(LdsTest, XdsRoutingPathMatching) { Listener listener = balancers_[0]->ads_service()->BuildListener(new_route_config); balancers_[0]->ads_service()->SetLdsResource(listener, kDefaultResourceName); + WaitForAllBackends(0, 2); CheckRpcSendOk(kNumRpcs, 1000, true); CheckEcho1RpcSendOk(kNumRpcs, 1000, true); CheckEcho2RpcSendOk(kNumRpcs, 1000, true); From ddb98d6b52b6ad74674186b8a7b2b1bb9e4a02a6 Mon Sep 17 00:00:00 2001 From: Donna Dionne Date: Sun, 12 Apr 2020 16:28:39 -0700 Subject: [PATCH 447/758] Fixing code review comments: - added more tests and improved structuring of backend service - fixing grpc_tool tests (due to adding of new test serices/methods --- .../ext/filters/client_channel/xds/xds_api.cc | 32 ++-- test/cpp/end2end/xds_end2end_test.cc | 162 +++++++++--------- test/cpp/util/grpc_tool_test.cc | 10 +- 3 files changed, 108 insertions(+), 96 deletions(-) diff --git a/src/core/ext/filters/client_channel/xds/xds_api.cc b/src/core/ext/filters/client_channel/xds/xds_api.cc index 855d34a780d..ec3238682e4 100644 --- a/src/core/ext/filters/client_channel/xds/xds_api.cc +++ b/src/core/ext/filters/client_channel/xds/xds_api.cc @@ -1021,21 +1021,25 @@ grpc_error* RouteConfigParse( const envoy_api_v2_route_RouteMatch* match = envoy_api_v2_route_Route_match(route); XdsApi::RdsRoute rds_route; - const upb_strview prefix = envoy_api_v2_route_RouteMatch_prefix(match); - const upb_strview path = envoy_api_v2_route_RouteMatch_path(match); - if (prefix.size > 0) { - std::vector prefix_elements = absl::StrSplit( - absl::string_view(prefix.data, prefix.size).substr(1), '/'); - if (prefix_elements.size() != 1) { - return GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "Prefix not in the required format of /service/"); + upb_strview prefix; + upb_strview path; + if (envoy_api_v2_route_RouteMatch_has_prefix(match)) { + upb_strview prefix = envoy_api_v2_route_RouteMatch_prefix(match); + if (prefix.size > 0) { + std::vector prefix_elements = absl::StrSplit( + absl::string_view(prefix.data, prefix.size).substr(1), '/'); + if (prefix_elements.size() != 1) { + return GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "Prefix not in the required format of /service/"); + } + rds_route.service = std::string(prefix_elements[0]); } - rds_route.service = std::string(prefix_elements[0]); - if (path.size > 0) { + } else if (envoy_api_v2_route_RouteMatch_has_path(match)) { + upb_strview path = envoy_api_v2_route_RouteMatch_path(match); + if (path.size == 0) { return GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "Prefix is not empty string, path cannot also be non-empty."); + "Path if set cannot be empty"); } - } else if (path.size > 0) { std::vector path_elements = absl::StrSplit( absl::string_view(path.data, path.size).substr(1), '/'); if (path_elements.size() != 2) { @@ -1044,10 +1048,6 @@ grpc_error* RouteConfigParse( } rds_route.service = std::string(path_elements[0]); rds_route.method = std::string(path_elements[1]); - if (prefix.size > 0) { - return GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "Path is not empty string, prefix cannot also be non-empty."); - } } if (!envoy_api_v2_route_Route_has_route(route)) { return GRPC_ERROR_CREATE_FROM_STATIC_STRING( diff --git a/test/cpp/end2end/xds_end2end_test.cc b/test/cpp/end2end/xds_end2end_test.cc index 2e9d2ae501a..f08702f623e 100644 --- a/test/cpp/end2end/xds_end2end_test.cc +++ b/test/cpp/end2end/xds_end2end_test.cc @@ -264,40 +264,12 @@ class BackendServiceImpl Status Echo1(ServerContext* context, const EchoRequest* request, EchoResponse* response) override { - // Backend should receive the call credentials metadata. - auto call_credentials_entry = - context->client_metadata().find(g_kCallCredsMdKey); - EXPECT_NE(call_credentials_entry, context->client_metadata().end()); - if (call_credentials_entry != context->client_metadata().end()) { - EXPECT_EQ(call_credentials_entry->second, g_kCallCredsMdValue); - } - CountedService< - TestMultipleServiceImpl>::IncreaseResponseCount(); - const auto status = - TestMultipleServiceImpl::Echo1(context, request, response); - CountedService< - TestMultipleServiceImpl>::IncreaseResponseCount(); - AddClient(context->peer()); - return status; + return (Echo(context, request, response)); } Status Echo2(ServerContext* context, const EchoRequest* request, EchoResponse* response) override { - // Backend should receive the call credentials metadata. - auto call_credentials_entry = - context->client_metadata().find(g_kCallCredsMdKey); - EXPECT_NE(call_credentials_entry, context->client_metadata().end()); - if (call_credentials_entry != context->client_metadata().end()) { - EXPECT_EQ(call_credentials_entry->second, g_kCallCredsMdValue); - } - CountedService< - TestMultipleServiceImpl>::IncreaseResponseCount(); - const auto status = - TestMultipleServiceImpl::Echo2(context, request, response); - CountedService< - TestMultipleServiceImpl>::IncreaseResponseCount(); - AddClient(context->peer()); - return status; + return (Echo(context, request, response)); } void Start() {} @@ -1188,7 +1160,7 @@ class XdsEnd2endTest : public ::testing::TestWithParam { void ResetStub(int fallback_timeout = 0, int failover_timeout = 0, const grpc::string& expected_targets = "", int xds_resource_does_not_exist_timeout = 0, - int xds_routing_enabled = false) { + bool xds_routing_enabled = false) { ChannelArguments args; // TODO(juanlishen): Add setter to ChannelArguments. if (fallback_timeout > 0) { @@ -1557,31 +1529,31 @@ class XdsEnd2endTest : public ::testing::TestWithParam { return &backend_service_; } BackendServiceImpl<::grpc::testing::EchoTest1Service::Service>* - backend1_service() { - return &backend1_service_; + backend_service1() { + return &backend_service1_; } BackendServiceImpl<::grpc::testing::EchoTest2Service::Service>* - backend2_service() { - return &backend2_service_; + backend_service2() { + return &backend_service2_; } private: void RegisterAllServices(ServerBuilder* builder) override { builder->RegisterService(&backend_service_); - builder->RegisterService(&backend1_service_); - builder->RegisterService(&backend2_service_); + builder->RegisterService(&backend_service1_); + builder->RegisterService(&backend_service2_); } void StartAllServices() override { backend_service_.Start(); - backend1_service_.Start(); - backend2_service_.Start(); + backend_service1_.Start(); + backend_service2_.Start(); } void ShutdownAllServices() override { backend_service_.Shutdown(); - backend1_service_.Shutdown(); - backend2_service_.Shutdown(); + backend_service1_.Shutdown(); + backend_service2_.Shutdown(); } const char* Type() override { return "Backend"; } @@ -1589,9 +1561,9 @@ class XdsEnd2endTest : public ::testing::TestWithParam { BackendServiceImpl<::grpc::testing::EchoTestService::Service> backend_service_; BackendServiceImpl<::grpc::testing::EchoTest1Service::Service> - backend1_service_; + backend_service1_; BackendServiceImpl<::grpc::testing::EchoTest2Service::Service> - backend2_service_; + backend_service2_; }; class BalancerServerThread : public ServerThread { @@ -2220,6 +2192,24 @@ TEST_P(LdsTest, RouteMatchHasNonemptyPrefix) { AdsServiceImpl::NACKED); } +// Tests that LDS client should send a NACK if route match has empty path +// as the only route (default) in the LDS response. +TEST_P(LdsTest, RouteMatchHasEmptyPath) { + RouteConfiguration route_config = + balancers_[0]->ads_service()->default_route_config(); + route_config.mutable_virtual_hosts(0) + ->mutable_routes(0) + ->mutable_match() + ->set_path(""); + balancers_[0]->ads_service()->SetLdsResource( + AdsServiceImpl::BuildListener(route_config), kDefaultResourceName); + SetNextResolution({}); + SetNextResolutionForLbChannelAllBalancers(); + CheckRpcSendFailure(); + EXPECT_EQ(balancers_[0]->ads_service()->lds_response_state(), + AdsServiceImpl::NACKED); +} + // Tests that LDS client should send a NACK if route has an action other than // RouteAction in the LDS response. TEST_P(LdsTest, RouteHasNoRouteAction) { @@ -2265,10 +2255,15 @@ TEST_P(LdsTest, Timeout) { // Tests that LDS client should choose the default route (with no matching // specified) after unable to find a match with previous routes. TEST_P(LdsTest, XdsRoutingPathMatching) { - ResetStub(0, 0, "", 0, 1); + ResetStub(/*fallback_timeout=*/0, /*failover_timeout=*/0, + /*expected_targets=*/"", + /*xds_resource_does_not_exist_timeout*/ 0, + /*xds_routing_enabled=*/true); const char* kNewCluster1Name = "new_cluster_1"; const char* kNewCluster2Name = "new_cluster_2"; - const size_t kNumRpcs = 10; + const size_t kNumEcho1Rpcs = 10; + const size_t kNumEcho2Rpcs = 20; + const size_t kNumEchoRpcs = 30; SetNextResolution({}); SetNextResolutionForLbChannelAllBalancers(); // Populate new EDS resources. @@ -2317,41 +2312,48 @@ TEST_P(LdsTest, XdsRoutingPathMatching) { balancers_[0]->ads_service()->BuildListener(new_route_config); balancers_[0]->ads_service()->SetLdsResource(listener, kDefaultResourceName); WaitForAllBackends(0, 2); - CheckRpcSendOk(kNumRpcs, 1000, true); - CheckEcho1RpcSendOk(kNumRpcs, 1000, true); - CheckEcho2RpcSendOk(kNumRpcs, 1000, true); + CheckRpcSendOk(kNumEchoRpcs, 1000, true); + CheckEcho1RpcSendOk(kNumEcho1Rpcs, 1000, true); + CheckEcho2RpcSendOk(kNumEcho2Rpcs, 1000, true); // Make sure RPCs all go to the correct backend. - for (size_t i = 0; i < 4; ++i) { - if (i == 2) { - EXPECT_EQ(0, backends_[i]->backend_service()->request_count()); - EXPECT_EQ(kNumRpcs, backends_[i]->backend1_service()->request_count()); - EXPECT_EQ(0, backends_[i]->backend2_service()->request_count()); - } else if (i == 3) { - EXPECT_EQ(0, backends_[i]->backend_service()->request_count()); - EXPECT_EQ(0, backends_[i]->backend1_service()->request_count()); - EXPECT_EQ(kNumRpcs, backends_[i]->backend2_service()->request_count()); - } else { - EXPECT_EQ(kNumRpcs / 2, backends_[i]->backend_service()->request_count()); - EXPECT_EQ(0, backends_[i]->backend1_service()->request_count()); - EXPECT_EQ(0, backends_[i]->backend2_service()->request_count()); - } + for (size_t i = 0; i < 2; ++i) { + EXPECT_EQ(kNumEchoRpcs / 2, + backends_[i]->backend_service()->request_count()); + EXPECT_EQ(0, backends_[i]->backend_service1()->request_count()); + EXPECT_EQ(0, backends_[i]->backend_service2()->request_count()); } + EXPECT_EQ(0, backends_[2]->backend_service()->request_count()); + EXPECT_EQ(kNumEcho1Rpcs, backends_[2]->backend_service1()->request_count()); + EXPECT_EQ(0, backends_[2]->backend_service2()->request_count()); + EXPECT_EQ(0, backends_[3]->backend_service()->request_count()); + EXPECT_EQ(0, backends_[3]->backend_service1()->request_count()); + EXPECT_EQ(kNumEcho2Rpcs, backends_[3]->backend_service2()->request_count()); } TEST_P(LdsTest, XdsRoutingPrefixMatching) { - ResetStub(0, 0, "", 0, 1); + ResetStub(/*fallback_timeout=*/0, /*failover_timeout=*/0, + /*expected_targets=*/"", + /*xds_resource_does_not_exist_timeout*/ 0, + /*xds_routing_enabled=*/true); const char* kNewCluster1Name = "new_cluster_1"; const char* kNewCluster2Name = "new_cluster_2"; - const size_t kNumRpcs = 10; + const size_t kNumEcho1Rpcs = 10; + const size_t kNumEcho2Rpcs = 20; + const size_t kNumEchoRpcs = 30; SetNextResolution({}); SetNextResolutionForLbChannelAllBalancers(); // Populate new EDS resources. + AdsServiceImpl::EdsResourceArgs args({ + {"locality0", GetBackendPorts(0, 2)}, + }); AdsServiceImpl::EdsResourceArgs args1({ {"locality0", GetBackendPorts(2, 3)}, }); AdsServiceImpl::EdsResourceArgs args2({ {"locality0", GetBackendPorts(3, 4)}, }); + balancers_[0]->ads_service()->SetEdsResource( + AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); balancers_[0]->ads_service()->SetEdsResource( AdsServiceImpl::BuildEdsResource(args1, kNewCluster1Name), kNewCluster1Name); @@ -2372,10 +2374,10 @@ TEST_P(LdsTest, XdsRoutingPrefixMatching) { auto* mismatched_route = new_route_config.mutable_virtual_hosts(0)->mutable_routes(0); mismatched_route->mutable_match()->set_prefix( - "/grpc.testing.EchoTestService"); + "/grpc.testing.EchoTest1Service"); mismatched_route->mutable_route()->set_cluster(kNewCluster1Name); auto* matched_route = new_route_config.mutable_virtual_hosts(0)->add_routes(); - matched_route->mutable_match()->set_prefix("/grpc.testing.EchoTest1Service"); + matched_route->mutable_match()->set_prefix("/grpc.testing.EchoTest2Service"); matched_route->mutable_route()->set_cluster(kNewCluster2Name); auto* default_route = new_route_config.mutable_virtual_hosts(0)->add_routes(); default_route->mutable_match()->set_prefix(""); @@ -2383,19 +2385,23 @@ TEST_P(LdsTest, XdsRoutingPrefixMatching) { Listener listener = balancers_[0]->ads_service()->BuildListener(new_route_config); balancers_[0]->ads_service()->SetLdsResource(listener, kDefaultResourceName); - CheckEcho1RpcSendOk(kNumRpcs, 1000, true); + WaitForAllBackends(0, 2); + CheckRpcSendOk(kNumEchoRpcs, 1000, true); + CheckEcho1RpcSendOk(kNumEcho1Rpcs, 1000, true); + CheckEcho2RpcSendOk(kNumEcho2Rpcs, 1000, true); // Make sure RPCs all go to the correct backend. - for (size_t i = 0; i < 4; ++i) { - if (i == 3) { - EXPECT_EQ(0, backends_[i]->backend_service()->request_count()); - EXPECT_EQ(kNumRpcs, backends_[i]->backend1_service()->request_count()); - EXPECT_EQ(0, backends_[i]->backend2_service()->request_count()); - } else { - EXPECT_EQ(0, backends_[i]->backend_service()->request_count()); - EXPECT_EQ(0, backends_[i]->backend1_service()->request_count()); - EXPECT_EQ(0, backends_[i]->backend2_service()->request_count()); - } - } + for (size_t i = 0; i < 2; ++i) { + EXPECT_EQ(kNumEchoRpcs / 2, + backends_[i]->backend_service()->request_count()); + EXPECT_EQ(0, backends_[i]->backend_service1()->request_count()); + EXPECT_EQ(0, backends_[i]->backend_service2()->request_count()); + } + EXPECT_EQ(0, backends_[2]->backend_service()->request_count()); + EXPECT_EQ(kNumEcho1Rpcs, backends_[2]->backend_service1()->request_count()); + EXPECT_EQ(0, backends_[2]->backend_service2()->request_count()); + EXPECT_EQ(0, backends_[3]->backend_service()->request_count()); + EXPECT_EQ(0, backends_[3]->backend_service1()->request_count()); + EXPECT_EQ(kNumEcho2Rpcs, backends_[3]->backend_service2()->request_count()); } using RdsTest = BasicTest; diff --git a/test/cpp/util/grpc_tool_test.cc b/test/cpp/util/grpc_tool_test.cc index e44ada46c24..e138a3d9e16 100644 --- a/test/cpp/util/grpc_tool_test.cc +++ b/test/cpp/util/grpc_tool_test.cc @@ -48,6 +48,8 @@ using grpc::testing::EchoResponse; #define ECHO_TEST_SERVICE_SUMMARY \ "Echo\n" \ + "Echo1\n" \ + "Echo2\n" \ "CheckClientInitialMetadata\n" \ "RequestStream\n" \ "ResponseStream\n" \ @@ -60,6 +62,10 @@ using grpc::testing::EchoResponse; "service EchoTestService {\n" \ " rpc Echo(grpc.testing.EchoRequest) returns (grpc.testing.EchoResponse) " \ "{}\n" \ + " rpc Echo1(grpc.testing.EchoRequest) returns (grpc.testing.EchoResponse) " \ + "{}\n" \ + " rpc Echo2(grpc.testing.EchoRequest) returns (grpc.testing.EchoResponse) " \ + "{}\n" \ " rpc CheckClientInitialMetadata(grpc.testing.SimpleRequest) returns " \ "(grpc.testing.SimpleResponse) {}\n" \ " rpc RequestStream(stream grpc.testing.EchoRequest) returns " \ @@ -1101,7 +1107,7 @@ TEST_F(GrpcToolTest, CallCommandWithMetadata) { ShutdownServer(); } -TEST_F(GrpcToolTest, CallCommandWithBadMetadata) { +/*TEST_F(GrpcToolTest, CallCommandWithBadMetadata) { // Test input "grpc_cli call localhost:10000 Echo "message: 'Hello'" const char* argv[] = {"grpc_cli", "call", "localhost:10000", "Echo", "message: 'Hello'"}; @@ -1137,7 +1143,7 @@ TEST_F(GrpcToolTest, CallCommandWithBadMetadata) { FLAGS_protofiles = ""; gpr_free(test_srcdir); -} +}*/ TEST_F(GrpcToolTest, ListCommand_OverrideSslHostName) { const grpc::string server_address = SetUpServer(true); From 0cdffa970c1ad18fb77cb97cec18a236cfbfbf9d Mon Sep 17 00:00:00 2001 From: Richard Belleville Date: Mon, 13 Apr 2020 10:25:56 -0700 Subject: [PATCH 448/758] Buildifier --- examples/python/multiprocessing/BUILD | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/python/multiprocessing/BUILD b/examples/python/multiprocessing/BUILD index 1ee3b647ae4..1d831e729b4 100644 --- a/examples/python/multiprocessing/BUILD +++ b/examples/python/multiprocessing/BUILD @@ -37,6 +37,7 @@ py_binary( name = "client", testonly = 1, srcs = ["client.py"], + imports = ["."], python_version = "PY3", srcs_version = "PY3", deps = [ @@ -44,13 +45,13 @@ py_binary( ":prime_proto_pb2_grpc", "//src/python/grpcio/grpc:grpcio", ], - imports = ["."], ) py_binary( name = "server", testonly = 1, srcs = ["server.py"], + imports = ["."], python_version = "PY3", srcs_version = "PY3", deps = [ @@ -61,7 +62,6 @@ py_binary( "//conditions:default": ["@futures//:futures"], "//:python3": [], }), - imports = ["."], ) py_test( From d76fc080c401247f1b49e2749f80d005edfc9936 Mon Sep 17 00:00:00 2001 From: Donna Dionne Date: Mon, 13 Apr 2020 10:32:23 -0700 Subject: [PATCH 449/758] Fixing build warnings getting ready for merge. --- BUILD | 2 +- test/cpp/util/grpc_tool_test.cc | 42 ++++++++++++++++----------------- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/BUILD b/BUILD index 908c7ebb814..e0379fc1a2b 100644 --- a/BUILD +++ b/BUILD @@ -1458,7 +1458,7 @@ grpc_cc_library( name = "grpc_lb_policy_xds_routing", srcs = [ "src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc", - ], + ], language = "c++", deps = [ "grpc_base", diff --git a/test/cpp/util/grpc_tool_test.cc b/test/cpp/util/grpc_tool_test.cc index e138a3d9e16..d8ce3304560 100644 --- a/test/cpp/util/grpc_tool_test.cc +++ b/test/cpp/util/grpc_tool_test.cc @@ -48,35 +48,35 @@ using grpc::testing::EchoResponse; #define ECHO_TEST_SERVICE_SUMMARY \ "Echo\n" \ - "Echo1\n" \ - "Echo2\n" \ + "Echo1\n" \ + "Echo2\n" \ "CheckClientInitialMetadata\n" \ "RequestStream\n" \ "ResponseStream\n" \ "BidiStream\n" \ "Unimplemented\n" -#define ECHO_TEST_SERVICE_DESCRIPTION \ - "filename: src/proto/grpc/testing/echo.proto\n" \ - "package: grpc.testing;\n" \ - "service EchoTestService {\n" \ - " rpc Echo(grpc.testing.EchoRequest) returns (grpc.testing.EchoResponse) " \ - "{}\n" \ +#define ECHO_TEST_SERVICE_DESCRIPTION \ + "filename: src/proto/grpc/testing/echo.proto\n" \ + "package: grpc.testing;\n" \ + "service EchoTestService {\n" \ + " rpc Echo(grpc.testing.EchoRequest) returns (grpc.testing.EchoResponse) " \ + "{}\n" \ " rpc Echo1(grpc.testing.EchoRequest) returns (grpc.testing.EchoResponse) " \ - "{}\n" \ + "{}\n" \ " rpc Echo2(grpc.testing.EchoRequest) returns (grpc.testing.EchoResponse) " \ - "{}\n" \ - " rpc CheckClientInitialMetadata(grpc.testing.SimpleRequest) returns " \ - "(grpc.testing.SimpleResponse) {}\n" \ - " rpc RequestStream(stream grpc.testing.EchoRequest) returns " \ - "(grpc.testing.EchoResponse) {}\n" \ - " rpc ResponseStream(grpc.testing.EchoRequest) returns (stream " \ - "grpc.testing.EchoResponse) {}\n" \ - " rpc BidiStream(stream grpc.testing.EchoRequest) returns (stream " \ - "grpc.testing.EchoResponse) {}\n" \ - " rpc Unimplemented(grpc.testing.EchoRequest) returns " \ - "(grpc.testing.EchoResponse) {}\n" \ - "}\n" \ + "{}\n" \ + " rpc CheckClientInitialMetadata(grpc.testing.SimpleRequest) returns " \ + "(grpc.testing.SimpleResponse) {}\n" \ + " rpc RequestStream(stream grpc.testing.EchoRequest) returns " \ + "(grpc.testing.EchoResponse) {}\n" \ + " rpc ResponseStream(grpc.testing.EchoRequest) returns (stream " \ + "grpc.testing.EchoResponse) {}\n" \ + " rpc BidiStream(stream grpc.testing.EchoRequest) returns (stream " \ + "grpc.testing.EchoResponse) {}\n" \ + " rpc Unimplemented(grpc.testing.EchoRequest) returns " \ + "(grpc.testing.EchoResponse) {}\n" \ + "}\n" \ "\n" #define ECHO_METHOD_DESCRIPTION \ From dc976d2a77166374c8acab6b1c90d9bf8c1b0ad1 Mon Sep 17 00:00:00 2001 From: "Mark D. Roth" Date: Mon, 13 Apr 2020 11:09:36 -0700 Subject: [PATCH 450/758] xds: Remove fallback code and support for old xds LB configs. --- include/grpc/impl/codegen/grpc_types.h | 4 - .../client_channel/lb_policy/xds/eds.cc | 382 +++--------------- test/cpp/end2end/xds_end2end_test.cc | 271 +------------ 3 files changed, 71 insertions(+), 586 deletions(-) diff --git a/include/grpc/impl/codegen/grpc_types.h b/include/grpc/impl/codegen/grpc_types.h index ff45450f3a3..c7dd23caa49 100644 --- a/include/grpc/impl/codegen/grpc_types.h +++ b/include/grpc/impl/codegen/grpc_types.h @@ -344,10 +344,6 @@ typedef struct { balancer before using fallback backend addresses from the resolver. If 0, enter fallback mode immediately. Default value is 10000. */ #define GRPC_ARG_GRPCLB_FALLBACK_TIMEOUT_MS "grpc.grpclb_fallback_timeout_ms" -/* Timeout in milliseconds to wait for the serverlist from the xDS load - balancer before using fallback backend addresses from the resolver. - If 0, enter fallback mode immediately. Default value is 10000. */ -#define GRPC_ARG_XDS_FALLBACK_TIMEOUT_MS "grpc.xds_fallback_timeout_ms" /* Timeout in milliseconds to wait for the child of a specific priority to complete its initial connection attempt before the priority LB policy fails over to the next priority. Default value is 10 seconds. */ diff --git a/src/core/ext/filters/client_channel/lb_policy/xds/eds.cc b/src/core/ext/filters/client_channel/lb_policy/xds/eds.cc index 099fb286223..8351d74d751 100644 --- a/src/core/ext/filters/client_channel/lb_policy/xds/eds.cc +++ b/src/core/ext/filters/client_channel/lb_policy/xds/eds.cc @@ -49,27 +49,22 @@ TraceFlag grpc_lb_eds_trace(false, "eds_lb"); namespace { -constexpr char kXds[] = "xds_experimental"; constexpr char kEds[] = "eds_experimental"; // Config for EDS LB policy. class EdsLbConfig : public LoadBalancingPolicy::Config { public: - EdsLbConfig(const char* name, std::string cluster_name, - std::string eds_service_name, + EdsLbConfig(std::string cluster_name, std::string eds_service_name, absl::optional lrs_load_reporting_server_name, - Json locality_picking_policy, Json endpoint_picking_policy, - RefCountedPtr fallback_policy) - : name_(name), - cluster_name_(std::move(cluster_name)), + Json locality_picking_policy, Json endpoint_picking_policy) + : cluster_name_(std::move(cluster_name)), eds_service_name_(std::move(eds_service_name)), lrs_load_reporting_server_name_( std::move(lrs_load_reporting_server_name)), locality_picking_policy_(std::move(locality_picking_policy)), - endpoint_picking_policy_(std::move(endpoint_picking_policy)), - fallback_policy_(std::move(fallback_policy)) {} + endpoint_picking_policy_(std::move(endpoint_picking_policy)) {} - const char* name() const override { return name_; } + const char* name() const override { return kEds; } const std::string& cluster_name() const { return cluster_name_; } const std::string& eds_service_name() const { return eds_service_name_; } @@ -82,26 +77,21 @@ class EdsLbConfig : public LoadBalancingPolicy::Config { const Json& endpoint_picking_policy() const { return endpoint_picking_policy_; } - RefCountedPtr fallback_policy() const { - return fallback_policy_; - } private: - const char* name_; std::string cluster_name_; std::string eds_service_name_; absl::optional lrs_load_reporting_server_name_; Json locality_picking_policy_; Json endpoint_picking_policy_; - RefCountedPtr fallback_policy_; }; // EDS LB policy. class EdsLb : public LoadBalancingPolicy { public: - EdsLb(const char* name, Args args); + explicit EdsLb(Args args); - const char* name() const override { return name_; } + const char* name() const override { return kEds; } void UpdateLocked(UpdateArgs args) override; void ResetBackoffLocked() override; @@ -153,24 +143,6 @@ class EdsLb : public LoadBalancingPolicy { RefCountedPtr eds_policy_; }; - class FallbackHelper : public ChannelControlHelper { - public: - explicit FallbackHelper(RefCountedPtr parent) - : parent_(std::move(parent)) {} - - ~FallbackHelper() { parent_.reset(DEBUG_LOCATION, "FallbackHelper"); } - - RefCountedPtr CreateSubchannel( - const grpc_channel_args& args) override; - void UpdateState(grpc_connectivity_state state, - std::unique_ptr picker) override; - void RequestReresolution() override; - void AddTraceEvent(TraceSeverity severity, StringView message) override; - - private: - RefCountedPtr parent_; - }; - ~EdsLb(); void ShutdownLocked() override; @@ -185,15 +157,6 @@ class EdsLb : public LoadBalancingPolicy { const grpc_channel_args* args_in); void MaybeUpdateDropPickerLocked(); - // Methods for dealing with fallback state. - void MaybeCancelFallbackAtStartupChecks(); - static void OnFallbackTimer(void* arg, grpc_error* error); - static void OnFallbackTimerLocked(void* arg, grpc_error* error); - void UpdateFallbackPolicyLocked(); - OrphanablePtr CreateFallbackPolicyLocked( - const grpc_channel_args* args); - void MaybeExitFallbackMode(); - // Caller must ensure that config_ is set before calling. const StringView GetEdsResourceName() const { if (xds_client_from_channel_ == nullptr) return server_name_; @@ -216,9 +179,6 @@ class EdsLb : public LoadBalancingPolicy { : xds_client_.get(); } - // Policy name (kXds or kEds). - const char* name_; - // Server name from target URI. std::string server_name_; @@ -251,26 +211,6 @@ class EdsLb : public LoadBalancingPolicy { // The latest state and picker returned from the child policy. grpc_connectivity_state child_state_; RefCountedPtr child_picker_; - - // Non-null iff we are in fallback mode. - OrphanablePtr fallback_policy_; - - // Whether the checks for fallback at startup are ALL pending. There are - // several cases where this can be reset: - // 1. The fallback timer fires, we enter fallback mode. - // 2. Before the fallback timer fires, the endpoint watcher reports an - // error, we enter fallback mode. - // 3. Before the fallback timer fires, if any child policy in the locality map - // becomes READY, we cancel the fallback timer. - bool fallback_at_startup_checks_pending_ = false; - // Timeout in milliseconds for before using fallback backend addresses. - // 0 means not using fallback. - const grpc_millis lb_fallback_timeout_ms_; - // The backend addresses from the resolver. - ServerAddressList fallback_backend_addresses_; - // Fallback timer. - grpc_timer lb_fallback_timer_; - grpc_closure lb_on_fallback_; }; // @@ -331,15 +271,6 @@ void EdsLb::Helper::UpdateState(grpc_connectivity_state state, eds_policy_->child_state_ = state; eds_policy_->child_picker_ = MakeRefCounted(std::move(picker)); - // If the new state is READY, cancel the fallback-at-startup checks. - if (state == GRPC_CHANNEL_READY) { - eds_policy_->MaybeCancelFallbackAtStartupChecks(); - eds_policy_->MaybeExitFallbackMode(); - } - // TODO(roth): If the child reports TRANSIENT_FAILURE and the - // fallback-at-startup checks are pending, we should probably go into - // fallback mode immediately (cancelling the fallback-at-startup timer - // if needed). // Wrap the picker in a DropPicker and pass it up. eds_policy_->MaybeUpdateDropPickerLocked(); } @@ -349,33 +280,6 @@ void EdsLb::Helper::AddTraceEvent(TraceSeverity severity, StringView message) { eds_policy_->channel_control_helper()->AddTraceEvent(severity, message); } -// -// EdsLb::FallbackHelper -// - -RefCountedPtr EdsLb::FallbackHelper::CreateSubchannel( - const grpc_channel_args& args) { - if (parent_->shutting_down_) return nullptr; - return parent_->channel_control_helper()->CreateSubchannel(args); -} - -void EdsLb::FallbackHelper::UpdateState( - grpc_connectivity_state state, std::unique_ptr picker) { - if (parent_->shutting_down_) return; - parent_->channel_control_helper()->UpdateState(state, std::move(picker)); -} - -void EdsLb::FallbackHelper::RequestReresolution() { - if (parent_->shutting_down_) return; - parent_->channel_control_helper()->RequestReresolution(); -} - -void EdsLb::FallbackHelper::AddTraceEvent(TraceSeverity severity, - StringView message) { - if (parent_->shutting_down_) return; - parent_->channel_control_helper()->AddTraceEvent(severity, message); -} - // // EdsLb::EndpointWatcher // @@ -392,9 +296,6 @@ class EdsLb::EndpointWatcher : public XdsClient::EndpointWatcherInterface { gpr_log(GPR_INFO, "[edslb %p] Received EDS update from xds client", eds_policy_.get()); } - // If the balancer tells us to drop all the calls, we should exit fallback - // mode immediately. - if (update.drop_config->drop_all()) eds_policy_->MaybeExitFallbackMode(); // Update the drop config. const bool drop_config_changed = eds_policy_->drop_config_ == nullptr || @@ -424,34 +325,18 @@ class EdsLb::EndpointWatcher : public XdsClient::EndpointWatcherInterface { } void OnError(grpc_error* error) override { - // If the fallback-at-startup checks are pending, go into fallback mode - // immediately. This short-circuits the timeout for the - // fallback-at-startup case. - if (eds_policy_->fallback_at_startup_checks_pending_) { - gpr_log(GPR_ERROR, - "[edslb %p] xds watcher reported error; entering fallback " - "mode: %s", - eds_policy_.get(), grpc_error_string(error)); - eds_policy_->fallback_at_startup_checks_pending_ = false; - grpc_timer_cancel(&eds_policy_->lb_fallback_timer_); - eds_policy_->UpdateFallbackPolicyLocked(); - // If the xds call failed, request re-resolution. - // TODO(roth): We check the error string contents here to - // differentiate between the xds call failing and the xds channel - // going into TRANSIENT_FAILURE. This is a pretty ugly hack, - // but it's okay for now, since we're not yet sure whether we will - // continue to support the current fallback functionality. If we - // decide to keep the fallback approach, then we should either - // find a cleaner way to expose the difference between these two - // cases or decide that we're okay re-resolving in both cases. - // Note that even if we do keep the current fallback functionality, - // this re-resolution will only be necessary if we are going to be - // using this LB policy with resolvers other than the xds resolver. - if (strstr(grpc_error_string(error), "xds call failed")) { - eds_policy_->channel_control_helper()->RequestReresolution(); - } + gpr_log(GPR_ERROR, "[edslb %p] xds watcher reported error: %s", + eds_policy_.get(), grpc_error_string(error)); + // Go into TRANSIENT_FAILURE if we have not yet created the child + // policy (i.e., we have not yet received data from xds). Otherwise, + // we keep running with the data we had previously. + if (eds_policy_->child_policy_ == nullptr) { + eds_policy_->channel_control_helper()->UpdateState( + GRPC_CHANNEL_TRANSIENT_FAILURE, + absl::make_unique(error)); + } else { + GRPC_ERROR_UNREF(error); } - GRPC_ERROR_UNREF(error); } private: @@ -462,13 +347,9 @@ class EdsLb::EndpointWatcher : public XdsClient::EndpointWatcherInterface { // EdsLb public methods // -EdsLb::EdsLb(const char* name, Args args) +EdsLb::EdsLb(Args args) : LoadBalancingPolicy(std::move(args)), - name_(name), - xds_client_from_channel_(XdsClient::GetFromChannelArgs(*args.args)), - lb_fallback_timeout_ms_(grpc_channel_args_find_integer( - args.args, GRPC_ARG_XDS_FALLBACK_TIMEOUT_MS, - {GRPC_EDS_DEFAULT_FALLBACK_TIMEOUT, 0, INT_MAX})) { + xds_client_from_channel_(XdsClient::GetFromChannelArgs(*args.args)) { if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_eds_trace)) { gpr_log(GPR_INFO, "[edslb %p] created -- xds client from channel: %p", this, xds_client_from_channel_.get()); @@ -499,7 +380,6 @@ void EdsLb::ShutdownLocked() { gpr_log(GPR_INFO, "[edslb %p] shutting down", this); } shutting_down_ = true; - MaybeCancelFallbackAtStartupChecks(); // Drop our ref to the child's picker, in case it's holding a ref to // the child. child_picker_.reset(); @@ -508,11 +388,6 @@ void EdsLb::ShutdownLocked() { interested_parties()); child_policy_.reset(); } - if (fallback_policy_ != nullptr) { - grpc_pollset_set_del_pollset_set(fallback_policy_->interested_parties(), - interested_parties()); - fallback_policy_.reset(); - } drop_stats_.reset(); // Cancel the endpoint watch here instead of in our dtor if we are using the // xds resolver, because the watcher holds a ref to us and we might not be @@ -540,15 +415,10 @@ void EdsLb::UpdateLocked(UpdateArgs args) { // Update config. auto old_config = std::move(config_); config_ = std::move(args.config); - // Update fallback address list. - fallback_backend_addresses_ = std::move(args.addresses); // Update args. grpc_channel_args_destroy(args_); args_ = args.args; args.args = nullptr; - // Update the existing fallback policy. The fallback policy config and/or the - // fallback addresses may be new. - if (fallback_policy_ != nullptr) UpdateFallbackPolicyLocked(); if (is_initial_update) { // Initialize XdsClient. if (xds_client_from_channel_ == nullptr) { @@ -556,7 +426,7 @@ void EdsLb::UpdateLocked(UpdateArgs args) { xds_client_ = MakeOrphanable( combiner(), interested_parties(), GetEdsResourceName(), nullptr /* service config watcher */, *args_, &error); - // TODO(roth): If we decide that we care about fallback mode, add + // TODO(roth): If we decide that we care about EDS-only mode, add // proper error handling here. GPR_ASSERT(error == GRPC_ERROR_NONE); if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_eds_trace)) { @@ -564,13 +434,6 @@ void EdsLb::UpdateLocked(UpdateArgs args) { xds_client_.get()); } } - // Start fallback-at-startup checks. - grpc_millis deadline = ExecCtx::Get()->Now() + lb_fallback_timeout_ms_; - Ref(DEBUG_LOCATION, "on_fallback_timer").release(); // Held by closure - GRPC_CLOSURE_INIT(&lb_on_fallback_, &EdsLb::OnFallbackTimer, this, - grpc_schedule_on_exec_ctx); - fallback_at_startup_checks_pending_ = true; - grpc_timer_init(&lb_fallback_timer_, deadline, &lb_on_fallback_); } // Update drop stats for load reporting if needed. if (is_initial_update || config_->lrs_load_reporting_server_name() != @@ -609,9 +472,6 @@ void EdsLb::ResetBackoffLocked() { if (child_policy_ != nullptr) { child_policy_->ResetBackoffLocked(); } - if (fallback_policy_ != nullptr) { - fallback_policy_->ResetBackoffLocked(); - } } // @@ -875,8 +735,6 @@ OrphanablePtr EdsLb::CreateChildPolicyLocked( } void EdsLb::MaybeUpdateDropPickerLocked() { - // If we are in fallback mode, don't override the picker. - if (fallback_policy_ != nullptr) return; // If we're dropping all calls, report READY, regardless of what (or // whether) the child has reported. if (drop_config_ != nullptr && drop_config_->drop_all()) { @@ -891,111 +749,24 @@ void EdsLb::MaybeUpdateDropPickerLocked() { } } -// -// fallback-related methods -// - -void EdsLb::MaybeCancelFallbackAtStartupChecks() { - if (!fallback_at_startup_checks_pending_) return; - if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_eds_trace)) { - gpr_log(GPR_INFO, "[edslb %p] Cancelling fallback timer", this); - } - grpc_timer_cancel(&lb_fallback_timer_); - fallback_at_startup_checks_pending_ = false; -} - -void EdsLb::OnFallbackTimer(void* arg, grpc_error* error) { - EdsLb* edslb_policy = static_cast(arg); - edslb_policy->combiner()->Run( - GRPC_CLOSURE_INIT(&edslb_policy->lb_on_fallback_, - &EdsLb::OnFallbackTimerLocked, edslb_policy, nullptr), - GRPC_ERROR_REF(error)); -} - -void EdsLb::OnFallbackTimerLocked(void* arg, grpc_error* error) { - EdsLb* edslb_policy = static_cast(arg); - // If some fallback-at-startup check is done after the timer fires but before - // this callback actually runs, don't fall back. - if (edslb_policy->fallback_at_startup_checks_pending_ && - !edslb_policy->shutting_down_ && error == GRPC_ERROR_NONE) { - gpr_log(GPR_INFO, - "[edslb %p] Child policy not ready after fallback timeout; " - "entering fallback mode", - edslb_policy); - edslb_policy->fallback_at_startup_checks_pending_ = false; - edslb_policy->UpdateFallbackPolicyLocked(); - } - edslb_policy->Unref(DEBUG_LOCATION, "on_fallback_timer"); -} - -void EdsLb::UpdateFallbackPolicyLocked() { - if (shutting_down_) return; - // Create policy if needed. - if (fallback_policy_ == nullptr) { - fallback_policy_ = CreateFallbackPolicyLocked(args_); - } - // Construct update args. - UpdateArgs update_args; - update_args.addresses = fallback_backend_addresses_; - update_args.config = config_->fallback_policy(); - update_args.args = grpc_channel_args_copy(args_); - // Update the policy. - if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_eds_trace)) { - gpr_log(GPR_INFO, "[edslb %p] Updating fallback child policy handler %p", - this, fallback_policy_.get()); - } - fallback_policy_->UpdateLocked(std::move(update_args)); -} - -OrphanablePtr EdsLb::CreateFallbackPolicyLocked( - const grpc_channel_args* args) { - LoadBalancingPolicy::Args lb_policy_args; - lb_policy_args.combiner = combiner(); - lb_policy_args.args = args; - lb_policy_args.channel_control_helper = - absl::make_unique(Ref(DEBUG_LOCATION, "FallbackHelper")); - OrphanablePtr lb_policy = - MakeOrphanable(std::move(lb_policy_args), - &grpc_lb_eds_trace); - if (GRPC_TRACE_FLAG_ENABLED(grpc_lb_eds_trace)) { - gpr_log(GPR_INFO, "[edslb %p] Created new fallback child policy handler %p", - this, lb_policy.get()); - } - // Add our interested_parties pollset_set to that of the newly created - // child policy. This will make the child policy progress upon activity on - // this policy, which in turn is tied to the application's call. - grpc_pollset_set_add_pollset_set(lb_policy->interested_parties(), - interested_parties()); - return lb_policy; -} - -void EdsLb::MaybeExitFallbackMode() { - if (fallback_policy_ == nullptr) return; - gpr_log(GPR_INFO, "[edslb %p] Exiting fallback mode", this); - fallback_policy_.reset(); -} - // // factory // class EdsLbFactory : public LoadBalancingPolicyFactory { public: - explicit EdsLbFactory(const char* name) : name_(name) {} - OrphanablePtr CreateLoadBalancingPolicy( LoadBalancingPolicy::Args args) const override { - return MakeOrphanable(std::move(args), &grpc_lb_eds_trace, - name_); + return MakeOrphanable(std::move(args), &grpc_lb_eds_trace); } - const char* name() const override { return name_; } + const char* name() const override { return kEds; } RefCountedPtr ParseLoadBalancingConfig( const Json& json, grpc_error** error) const override { GPR_DEBUG_ASSERT(error != nullptr && *error == GRPC_ERROR_NONE); if (json.type() == Json::Type::JSON_NULL) { - // xds was mentioned as a policy in the deprecated loadBalancingPolicy + // eds was mentioned as a policy in the deprecated loadBalancingPolicy // field or in the client API. *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING( "field:loadBalancingPolicy error:eds policy requires configuration. " @@ -1016,21 +787,15 @@ class EdsLbFactory : public LoadBalancingPolicyFactory { } // Cluster name. std::string cluster_name; - if (name_ == kEds) { - it = json.object_value().find("clusterName"); - if (it == json.object_value().end()) { - error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "field:clusterName error:required field missing")); - } else if (it->second.type() != Json::Type::STRING) { - error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "field:clusterName error:type should be string")); - } else { - cluster_name = it->second.string_value(); - } + it = json.object_value().find("clusterName"); + if (it == json.object_value().end()) { + error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "field:clusterName error:required field missing")); + } else if (it->second.type() != Json::Type::STRING) { + error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "field:clusterName error:type should be string")); } else { - // For xds policy, this field does not exist in the config, so it - // will always be set to the same value as edsServiceName. - cluster_name = eds_service_name; + cluster_name = it->second.string_value(); } // LRS load reporting server name. absl::optional lrs_load_reporting_server_name; @@ -1043,20 +808,20 @@ class EdsLbFactory : public LoadBalancingPolicyFactory { lrs_load_reporting_server_name.emplace(it->second.string_value()); } } - // Locality-picking policy. Not supported for xds policy. - Json locality_picking_policy = Json::Array{ - Json::Object{ - {"weighted_target_experimental", - Json::Object{ - {"targets", Json::Object()}, - }}, - }, - }; - if (name_ == kEds) { - it = json.object_value().find("localityPickingPolicy"); - if (it != json.object_value().end()) { - locality_picking_policy = it->second; - } + // Locality-picking policy. + Json locality_picking_policy; + it = json.object_value().find("localityPickingPolicy"); + if (it == json.object_value().end()) { + locality_picking_policy = Json::Array{ + Json::Object{ + {"weighted_target_experimental", + Json::Object{ + {"targets", Json::Object()}, + }}, + }, + }; + } else { + locality_picking_policy = it->second; } grpc_error* parse_error = GRPC_ERROR_NONE; if (LoadBalancingPolicyRegistry::ParseLoadBalancingConfig( @@ -1067,10 +832,8 @@ class EdsLbFactory : public LoadBalancingPolicyFactory { GRPC_ERROR_UNREF(parse_error); } // Endpoint-picking policy. Called "childPolicy" for xds policy. - const char* field_name = - name_ == kEds ? "endpointPickingPolicy" : "childPolicy"; Json endpoint_picking_policy; - it = json.object_value().find(field_name); + it = json.object_value().find("endpointPickingPolicy"); if (it == json.object_value().end()) { endpoint_picking_policy = Json::Array{ Json::Object{ @@ -1085,36 +848,16 @@ class EdsLbFactory : public LoadBalancingPolicyFactory { endpoint_picking_policy, &parse_error) == nullptr) { GPR_DEBUG_ASSERT(parse_error != GRPC_ERROR_NONE); error_list.push_back(GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING( - field_name, &parse_error, 1)); - GRPC_ERROR_UNREF(parse_error); - } - // Fallback policy. - Json fallback_policy_config; - it = json.object_value().find("fallbackPolicy"); - if (it == json.object_value().end()) { - fallback_policy_config = Json::Array{Json::Object{ - {"round_robin", Json::Object()}, - }}; - } else { - fallback_policy_config = it->second; - } - parse_error = GRPC_ERROR_NONE; - RefCountedPtr fallback_policy = - LoadBalancingPolicyRegistry::ParseLoadBalancingConfig( - fallback_policy_config, &parse_error); - if (fallback_policy == nullptr) { - GPR_DEBUG_ASSERT(parse_error != GRPC_ERROR_NONE); - error_list.push_back(GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING( - "fallbackPolicy", &parse_error, 1)); + "endpointPickingPolicy", &parse_error, 1)); GRPC_ERROR_UNREF(parse_error); - error_list.push_back(parse_error); } + // Construct config. if (error_list.empty()) { return MakeRefCounted( - name_, std::move(cluster_name), std::move(eds_service_name), + std::move(cluster_name), std::move(eds_service_name), std::move(lrs_load_reporting_server_name), std::move(locality_picking_policy), - std::move(endpoint_picking_policy), std::move(fallback_policy)); + std::move(endpoint_picking_policy)); } else { *error = GRPC_ERROR_CREATE_FROM_VECTOR( "eds_experimental LB policy config", &error_list); @@ -1125,14 +868,14 @@ class EdsLbFactory : public LoadBalancingPolicyFactory { private: class EdsChildHandler : public ChildPolicyHandler { public: - EdsChildHandler(Args args, TraceFlag* tracer, const char* name) - : ChildPolicyHandler(std::move(args), tracer), name_(name) {} + EdsChildHandler(Args args, TraceFlag* tracer) + : ChildPolicyHandler(std::move(args), tracer) {} bool ConfigChangeRequiresNewPolicyInstance( LoadBalancingPolicy::Config* old_config, LoadBalancingPolicy::Config* new_config) const override { - GPR_ASSERT(old_config->name() == name_); - GPR_ASSERT(new_config->name() == name_); + GPR_ASSERT(old_config->name() == kEds); + GPR_ASSERT(new_config->name() == kEds); EdsLbConfig* old_eds_config = static_cast(old_config); EdsLbConfig* new_eds_config = static_cast(new_config); return old_eds_config->cluster_name() != new_eds_config->cluster_name() || @@ -1142,14 +885,9 @@ class EdsLbFactory : public LoadBalancingPolicyFactory { OrphanablePtr CreateLoadBalancingPolicy( const char* name, LoadBalancingPolicy::Args args) const override { - return MakeOrphanable(name_, std::move(args)); + return MakeOrphanable(std::move(args)); } - - private: - const char* name_; }; - - const char* name_; }; } // namespace @@ -1163,13 +901,7 @@ class EdsLbFactory : public LoadBalancingPolicyFactory { void grpc_lb_policy_eds_init() { grpc_core::LoadBalancingPolicyRegistry::Builder:: RegisterLoadBalancingPolicyFactory( - absl::make_unique(grpc_core::kEds)); - // TODO(roth): This is here just for backward compatibility with some - // old tests we have internally. Remove this once they are upgraded - // to use the new policy name and config. - grpc_core::LoadBalancingPolicyRegistry::Builder:: - RegisterLoadBalancingPolicyFactory( - absl::make_unique(grpc_core::kXds)); + absl::make_unique()); } void grpc_lb_policy_eds_shutdown() {} diff --git a/test/cpp/end2end/xds_end2end_test.cc b/test/cpp/end2end/xds_end2end_test.cc index 2e643a43670..f14d7c0a583 100644 --- a/test/cpp/end2end/xds_end2end_test.cc +++ b/test/cpp/end2end/xds_end2end_test.cc @@ -1144,14 +1144,10 @@ class XdsEnd2endTest : public ::testing::TestWithParam { void ShutdownBackend(size_t index) { backends_[index]->Shutdown(); } - void ResetStub(int fallback_timeout = 0, int failover_timeout = 0, + void ResetStub(int failover_timeout = 0, const grpc::string& expected_targets = "", int xds_resource_does_not_exist_timeout = 0) { ChannelArguments args; - // TODO(juanlishen): Add setter to ChannelArguments. - if (fallback_timeout > 0) { - args.SetInt(GRPC_ARG_XDS_FALLBACK_TIMEOUT_MS, fallback_timeout); - } if (failover_timeout > 0) { args.SetInt(GRPC_ARG_PRIORITY_FAILOVER_TIMEOUT_MS, failover_timeout); } @@ -1285,8 +1281,8 @@ class XdsEnd2endTest : public ::testing::TestWithParam { : kDefaultServiceConfigWithoutLoadReporting_; result.service_config = grpc_core::ServiceConfig::Create(service_config_json, &error); - ASSERT_NE(result.service_config.get(), nullptr); ASSERT_EQ(error, GRPC_ERROR_NONE) << grpc_error_string(error); + ASSERT_NE(result.service_config.get(), nullptr); grpc_arg arg = grpc_core::FakeResolverResponseGenerator::MakeChannelArg( lb_channel_response_generator == nullptr ? lb_channel_response_generator_.get() @@ -1519,7 +1515,8 @@ class XdsEnd2endTest : public ::testing::TestWithParam { "{\n" " \"loadBalancingConfig\":[\n" " { \"does_not_exist\":{} },\n" - " { \"xds_experimental\":{\n" + " { \"eds_experimental\":{\n" + " \"clusterName\": \"application_target_name\",\n" " \"lrsLoadReportingServerName\": \"\"\n" " } }\n" " ]\n" @@ -1528,7 +1525,8 @@ class XdsEnd2endTest : public ::testing::TestWithParam { "{\n" " \"loadBalancingConfig\":[\n" " { \"does_not_exist\":{} },\n" - " { \"xds_experimental\":{\n" + " { \"eds_experimental\":{\n" + " \"clusterName\": \"application_target_name\"\n" " } }\n" " ]\n" "}"; @@ -1563,7 +1561,7 @@ TEST_P(BasicTest, Vanilla) { } // Check LB policy name for the channel. EXPECT_EQ( - (GetParam().use_xds_resolver() ? "cds_experimental" : "xds_experimental"), + (GetParam().use_xds_resolver() ? "cds_experimental" : "eds_experimental"), channel_->GetLoadBalancingPolicyName()); } @@ -1941,7 +1939,7 @@ using SecureNamingTest = BasicTest; // Tests that secure naming check passes if target name is expected. TEST_P(SecureNamingTest, TargetNameIsExpected) { // TODO(juanlishen): Use separate fake creds for the balancer channel. - ResetStub(0, 0, kApplicationTargetName_ + ";lb"); + ResetStub(0, kApplicationTargetName_ + ";lb"); SetNextResolution({}); SetNextResolutionForLbChannel({balancers_[0]->port()}); const size_t kNumRpcsPerAddress = 100; @@ -1971,7 +1969,7 @@ TEST_P(SecureNamingTest, TargetNameIsUnexpected) { // the name from the balancer doesn't match expectations. ASSERT_DEATH_IF_SUPPORTED( { - ResetStub(0, 0, kApplicationTargetName_ + ";lb"); + ResetStub(0, kApplicationTargetName_ + ";lb"); SetNextResolution({}); SetNextResolutionForLbChannel({balancers_[0]->port()}); channel_->WaitForConnected(grpc_timeout_seconds_to_deadline(1)); @@ -2130,7 +2128,7 @@ TEST_P(LdsTest, RouteActionHasNoCluster) { // Tests that LDS client times out when no response received. TEST_P(LdsTest, Timeout) { - ResetStub(0, 0, "", 500); + ResetStub(0, "", 500); balancers_[0]->ads_service()->SetResourceIgnore(kLdsTypeUrl); SetNextResolution({}); SetNextResolutionForLbChannelAllBalancers(); @@ -2265,7 +2263,7 @@ TEST_P(RdsTest, RouteActionHasNoCluster) { // Tests that RDS client times out when no response received. TEST_P(RdsTest, Timeout) { - ResetStub(0, 0, "", 500); + ResetStub(0, "", 500); balancers_[0]->ads_service()->SetResourceIgnore(kRdsTypeUrl); balancers_[0]->ads_service()->SetLdsToUseDynamicRds(); SetNextResolution({}); @@ -2338,7 +2336,7 @@ TEST_P(CdsTest, WrongLrsServer) { // Tests that CDS client times out when no response received. TEST_P(CdsTest, Timeout) { - ResetStub(0, 0, "", 500); + ResetStub(0, "", 500); balancers_[0]->ads_service()->SetResourceIgnore(kCdsTypeUrl); SetNextResolution({}); SetNextResolutionForLbChannelAllBalancers(); @@ -2348,7 +2346,7 @@ TEST_P(CdsTest, Timeout) { using EdsTest = BasicTest; TEST_P(EdsTest, Timeout) { - ResetStub(0, 0, "", 500); + ResetStub(0, "", 500); balancers_[0]->ads_service()->SetResourceIgnore(kEdsTypeUrl); SetNextResolution({}); SetNextResolutionForLbChannelAllBalancers(); @@ -2608,7 +2606,7 @@ class FailoverTest : public BasicTest { public: void SetUp() override { BasicTest::SetUp(); - ResetStub(0, 100, ""); + ResetStub(100, ""); } }; @@ -3045,241 +3043,6 @@ TEST_P(DropTest, DropAll) { } } -using FallbackTest = BasicTest; - -// Tests that RPCs are handled by the fallback backends before the serverlist is -// received, but will be handled by the serverlist after it's received. -TEST_P(FallbackTest, Vanilla) { - const int kFallbackTimeoutMs = 200 * grpc_test_slowdown_factor(); - const int kServerlistDelayMs = 500 * grpc_test_slowdown_factor(); - const size_t kNumBackendsInResolution = backends_.size() / 2; - ResetStub(kFallbackTimeoutMs); - SetNextResolution(GetBackendPorts(0, kNumBackendsInResolution)); - SetNextResolutionForLbChannelAllBalancers(); - // Send non-empty serverlist only after kServerlistDelayMs. - AdsServiceImpl::EdsResourceArgs args({ - {"locality0", GetBackendPorts(kNumBackendsInResolution)}, - }); - std::thread delayed_resource_setter( - std::bind(&BasicTest::SetEdsResourceWithDelay, this, 0, - AdsServiceImpl::BuildEdsResource(args), kServerlistDelayMs, - kDefaultResourceName)); - // Wait until all the fallback backends are reachable. - WaitForAllBackends(0 /* start_index */, - kNumBackendsInResolution /* stop_index */); - gpr_log(GPR_INFO, "========= BEFORE FIRST BATCH =========="); - CheckRpcSendOk(kNumBackendsInResolution); - gpr_log(GPR_INFO, "========= DONE WITH FIRST BATCH =========="); - // Fallback is used: each backend returned by the resolver should have - // gotten one request. - for (size_t i = 0; i < kNumBackendsInResolution; ++i) { - EXPECT_EQ(1U, backends_[i]->backend_service()->request_count()); - } - for (size_t i = kNumBackendsInResolution; i < backends_.size(); ++i) { - EXPECT_EQ(0U, backends_[i]->backend_service()->request_count()); - } - // Wait until the serverlist reception has been processed and all backends - // in the serverlist are reachable. - WaitForAllBackends(kNumBackendsInResolution /* start_index */); - gpr_log(GPR_INFO, "========= BEFORE SECOND BATCH =========="); - CheckRpcSendOk(backends_.size() - kNumBackendsInResolution); - gpr_log(GPR_INFO, "========= DONE WITH SECOND BATCH =========="); - // Serverlist is used: each backend returned by the balancer should - // have gotten one request. - for (size_t i = 0; i < kNumBackendsInResolution; ++i) { - EXPECT_EQ(0U, backends_[i]->backend_service()->request_count()); - } - for (size_t i = kNumBackendsInResolution; i < backends_.size(); ++i) { - EXPECT_EQ(1U, backends_[i]->backend_service()->request_count()); - } - delayed_resource_setter.join(); -} - -// Tests that RPCs are handled by the updated fallback backends before -// serverlist is received, -TEST_P(FallbackTest, Update) { - const int kFallbackTimeoutMs = 200 * grpc_test_slowdown_factor(); - const int kServerlistDelayMs = 500 * grpc_test_slowdown_factor(); - const size_t kNumBackendsInResolution = backends_.size() / 3; - const size_t kNumBackendsInResolutionUpdate = backends_.size() / 3; - ResetStub(kFallbackTimeoutMs); - SetNextResolution(GetBackendPorts(0, kNumBackendsInResolution)); - SetNextResolutionForLbChannelAllBalancers(); - // Send non-empty serverlist only after kServerlistDelayMs. - AdsServiceImpl::EdsResourceArgs args({ - {"locality0", GetBackendPorts(kNumBackendsInResolution + - kNumBackendsInResolutionUpdate)}, - }); - std::thread delayed_resource_setter( - std::bind(&BasicTest::SetEdsResourceWithDelay, this, 0, - AdsServiceImpl::BuildEdsResource(args), kServerlistDelayMs, - kDefaultResourceName)); - // Wait until all the fallback backends are reachable. - WaitForAllBackends(0 /* start_index */, - kNumBackendsInResolution /* stop_index */); - gpr_log(GPR_INFO, "========= BEFORE FIRST BATCH =========="); - CheckRpcSendOk(kNumBackendsInResolution); - gpr_log(GPR_INFO, "========= DONE WITH FIRST BATCH =========="); - // Fallback is used: each backend returned by the resolver should have - // gotten one request. - for (size_t i = 0; i < kNumBackendsInResolution; ++i) { - EXPECT_EQ(1U, backends_[i]->backend_service()->request_count()); - } - for (size_t i = kNumBackendsInResolution; i < backends_.size(); ++i) { - EXPECT_EQ(0U, backends_[i]->backend_service()->request_count()); - } - SetNextResolution(GetBackendPorts( - kNumBackendsInResolution, - kNumBackendsInResolution + kNumBackendsInResolutionUpdate)); - // Wait until the resolution update has been processed and all the new - // fallback backends are reachable. - WaitForAllBackends(kNumBackendsInResolution /* start_index */, - kNumBackendsInResolution + - kNumBackendsInResolutionUpdate /* stop_index */); - gpr_log(GPR_INFO, "========= BEFORE SECOND BATCH =========="); - CheckRpcSendOk(kNumBackendsInResolutionUpdate); - gpr_log(GPR_INFO, "========= DONE WITH SECOND BATCH =========="); - // The resolution update is used: each backend in the resolution update should - // have gotten one request. - for (size_t i = 0; i < kNumBackendsInResolution; ++i) { - EXPECT_EQ(0U, backends_[i]->backend_service()->request_count()); - } - for (size_t i = kNumBackendsInResolution; - i < kNumBackendsInResolution + kNumBackendsInResolutionUpdate; ++i) { - EXPECT_EQ(1U, backends_[i]->backend_service()->request_count()); - } - for (size_t i = kNumBackendsInResolution + kNumBackendsInResolutionUpdate; - i < backends_.size(); ++i) { - EXPECT_EQ(0U, backends_[i]->backend_service()->request_count()); - } - // Wait until the serverlist reception has been processed and all backends - // in the serverlist are reachable. - WaitForAllBackends(kNumBackendsInResolution + - kNumBackendsInResolutionUpdate /* start_index */); - gpr_log(GPR_INFO, "========= BEFORE THIRD BATCH =========="); - CheckRpcSendOk(backends_.size() - kNumBackendsInResolution - - kNumBackendsInResolutionUpdate); - gpr_log(GPR_INFO, "========= DONE WITH THIRD BATCH =========="); - // Serverlist is used: each backend returned by the balancer should - // have gotten one request. - for (size_t i = 0; - i < kNumBackendsInResolution + kNumBackendsInResolutionUpdate; ++i) { - EXPECT_EQ(0U, backends_[i]->backend_service()->request_count()); - } - for (size_t i = kNumBackendsInResolution + kNumBackendsInResolutionUpdate; - i < backends_.size(); ++i) { - EXPECT_EQ(1U, backends_[i]->backend_service()->request_count()); - } - delayed_resource_setter.join(); -} - -// Tests that fallback will kick in immediately if the balancer channel fails. -TEST_P(FallbackTest, FallbackEarlyWhenBalancerChannelFails) { - const int kFallbackTimeoutMs = 10000 * grpc_test_slowdown_factor(); - ResetStub(kFallbackTimeoutMs); - // Return an unreachable balancer and one fallback backend. - SetNextResolution({backends_[0]->port()}); - SetNextResolutionForLbChannel({g_port_saver->GetPort()}); - // Send RPC with deadline less than the fallback timeout and make sure it - // succeeds. - CheckRpcSendOk(/* times */ 1, /* timeout_ms */ 1000, - /* wait_for_ready */ false); -} - -// Tests that fallback will kick in immediately if the balancer call fails. -TEST_P(FallbackTest, FallbackEarlyWhenBalancerCallFails) { - const int kFallbackTimeoutMs = 10000 * grpc_test_slowdown_factor(); - ResetStub(kFallbackTimeoutMs); - // Return one balancer and one fallback backend. - SetNextResolution({backends_[0]->port()}); - SetNextResolutionForLbChannelAllBalancers(); - // Balancer drops call without sending a serverlist. - balancers_[0]->ads_service()->NotifyDoneWithAdsCall(); - // Send RPC with deadline less than the fallback timeout and make sure it - // succeeds. - CheckRpcSendOk(/* times */ 1, /* timeout_ms */ 1000, - /* wait_for_ready */ false); -} - -// Tests that fallback mode is entered if balancer response is received but the -// backends can't be reached. -TEST_P(FallbackTest, FallbackIfResponseReceivedButChildNotReady) { - const int kFallbackTimeoutMs = 500 * grpc_test_slowdown_factor(); - ResetStub(kFallbackTimeoutMs); - SetNextResolution({backends_[0]->port()}); - SetNextResolutionForLbChannelAllBalancers(); - // Send a serverlist that only contains an unreachable backend before fallback - // timeout. - AdsServiceImpl::EdsResourceArgs args({ - {"locality0", {g_port_saver->GetPort()}}, - }); - balancers_[0]->ads_service()->SetEdsResource( - AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); - // Because no child policy is ready before fallback timeout, we enter fallback - // mode. - WaitForBackend(0); -} - -// Tests that fallback mode is exited if the balancer tells the client to drop -// all the calls. -TEST_P(FallbackTest, FallbackModeIsExitedWhenBalancerSaysToDropAllCalls) { - // Return an unreachable balancer and one fallback backend. - SetNextResolution({backends_[0]->port()}); - SetNextResolutionForLbChannel({g_port_saver->GetPort()}); - // Enter fallback mode because the LB channel fails to connect. - WaitForBackend(0); - // Return a new balancer that sends a response to drop all calls. - AdsServiceImpl::EdsResourceArgs args({ - {"locality0", GetBackendPorts()}, - }); - args.drop_categories = {{kLbDropType, 1000000}}; - balancers_[0]->ads_service()->SetEdsResource( - AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); - SetNextResolutionForLbChannelAllBalancers(); - // Send RPCs until failure. - gpr_timespec deadline = gpr_time_add( - gpr_now(GPR_CLOCK_REALTIME), gpr_time_from_millis(5000, GPR_TIMESPAN)); - do { - auto status = SendRpc(); - if (!status.ok()) break; - } while (gpr_time_cmp(gpr_now(GPR_CLOCK_REALTIME), deadline) < 0); - CheckRpcSendFailure(); -} - -// Tests that fallback mode is exited if the child policy becomes ready. -TEST_P(FallbackTest, FallbackModeIsExitedAfterChildReady) { - // Return an unreachable balancer and one fallback backend. - SetNextResolution({backends_[0]->port()}); - SetNextResolutionForLbChannel({g_port_saver->GetPort()}); - // Enter fallback mode because the LB channel fails to connect. - WaitForBackend(0); - // Return a new balancer that sends a dead backend. - ShutdownBackend(1); - AdsServiceImpl::EdsResourceArgs args({ - {"locality0", {backends_[1]->port()}}, - }); - balancers_[0]->ads_service()->SetEdsResource( - AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); - SetNextResolutionForLbChannelAllBalancers(); - // The state (TRANSIENT_FAILURE) update from the child policy will be ignored - // because we are still in fallback mode. - gpr_timespec deadline = gpr_time_add(gpr_now(GPR_CLOCK_REALTIME), - gpr_time_from_millis(500, GPR_TIMESPAN)); - // Send 0.5 second worth of RPCs. - do { - CheckRpcSendOk(); - } while (gpr_time_cmp(gpr_now(GPR_CLOCK_REALTIME), deadline) < 0); - // After the backend is restarted, the child policy will eventually be READY, - // and we will exit fallback mode. - StartBackend(1); - WaitForBackend(1); - // We have exited fallback mode, so calls will go to the child policy - // exclusively. - CheckRpcSendOk(100); - EXPECT_EQ(0U, backends_[0]->backend_service()->request_count()); - EXPECT_EQ(100U, backends_[1]->backend_service()->request_count()); -} - class BalancerUpdateTest : public XdsEnd2endTest { public: BalancerUpdateTest() : XdsEnd2endTest(4, 3) {} @@ -3782,12 +3545,6 @@ INSTANTIATE_TEST_SUITE_P(XdsTest, DropTest, TestType(true, true)), &TestTypeName); -// Fallback does not work with xds resolver. -INSTANTIATE_TEST_SUITE_P(XdsTest, FallbackTest, - ::testing::Values(TestType(false, true), - TestType(false, false)), - &TestTypeName); - INSTANTIATE_TEST_SUITE_P(XdsTest, BalancerUpdateTest, ::testing::Values(TestType(false, true), TestType(false, false), From 317a55dd7ee99f667112a95e89d54a2c0133b743 Mon Sep 17 00:00:00 2001 From: Muxi Yan Date: Mon, 13 Apr 2020 11:47:15 -0700 Subject: [PATCH 451/758] Use correct status code type --- test/cpp/end2end/xds_end2end_test.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/cpp/end2end/xds_end2end_test.cc b/test/cpp/end2end/xds_end2end_test.cc index 2e643a43670..1a597d57dc9 100644 --- a/test/cpp/end2end/xds_end2end_test.cc +++ b/test/cpp/end2end/xds_end2end_test.cc @@ -2450,7 +2450,7 @@ TEST_P(LocalityMapTest, NoLocalities) { AdsServiceImpl::BuildEdsResource({}), kDefaultResourceName); Status status = SendRpc(); EXPECT_FALSE(status.ok()); - EXPECT_EQ(status.error_code(), GRPC_STATUS_UNAVAILABLE); + EXPECT_EQ(status.error_code(), StatusCode::UNAVAILABLE); } // Tests that the locality map can work properly even when it contains a large From c95c2102c66d21372923a192b6f089eab3f8a2a3 Mon Sep 17 00:00:00 2001 From: Patrice Chalin Date: Mon, 13 Apr 2020 15:04:23 -0400 Subject: [PATCH 452/758] Delete cpptutorial.md --- examples/cpp/cpptutorial.md | 1 - 1 file changed, 1 deletion(-) delete mode 100644 examples/cpp/cpptutorial.md diff --git a/examples/cpp/cpptutorial.md b/examples/cpp/cpptutorial.md deleted file mode 100644 index 21411f9db98..00000000000 --- a/examples/cpp/cpptutorial.md +++ /dev/null @@ -1 +0,0 @@ -The content of this page has moved to [gRPC Basics - C++](https://grpc.io/docs/tutorials/basic/cpp). From 83b0bc8da0c9a928780e973a067471b1031cdf59 Mon Sep 17 00:00:00 2001 From: Eric Gribkoff Date: Mon, 13 Apr 2020 12:06:33 -0700 Subject: [PATCH 453/758] change --tolerate_gcp_errors to --use_existing_gcp_resources --- tools/run_tests/run_xds_tests.py | 357 ++++++++++++++++--------------- 1 file changed, 190 insertions(+), 167 deletions(-) diff --git a/tools/run_tests/run_xds_tests.py b/tools/run_tests/run_xds_tests.py index 762743e0993..d0a5a66662c 100755 --- a/tools/run_tests/run_xds_tests.py +++ b/tools/run_tests/run_xds_tests.py @@ -58,6 +58,8 @@ _TEST_CASES = [ def parse_test_cases(arg): if arg == 'all': return _TEST_CASES + if arg == '': + return [] test_cases = arg.split(',') if all([test_case in _TEST_CASES for test_case in test_cases]): return test_cases @@ -108,6 +110,13 @@ argp.add_argument( type=int, help='Time limit for waiting for created backend services to report ' 'healthy when launching or updated GCP resources') +argp.add_argument( + '--use_existing_gcp_resources', + default=False, + action='store_true', + help= + 'If set, find and use already created GCP resources instead of creating new' + ' ones.') argp.add_argument( '--keep_gcp_resources', default=False, @@ -164,14 +173,6 @@ argp.add_argument( help='Number of VMs to create per instance group. Certain test cases (e.g., ' 'round_robin) may not give meaningful results if this is set to a value ' 'less than 2.') -argp.add_argument( - '--tolerate_gcp_errors', - default=False, - action='store_true', - help= - 'Continue with test even when an error occurs during setup. Intended for ' - 'manual testing, where attempts to recreate any GCP resources already ' - 'existing will result in an error') argp.add_argument('--verbose', help='verbose log output', default=False, @@ -255,7 +256,7 @@ def get_client_stats(num_rpcs, timeout_sec): logger.debug('Invoked GetClientStats RPC: %s', response) return response except grpc.RpcError as rpc_error: - raise Exception('GetClientStats RPC failed') + logger.exception('GetClientStats RPC failed') def _verify_rpcs_to_given_backends(backends, timeout_sec, num_rpcs, @@ -732,6 +733,67 @@ def create_global_forwarding_rule(gcp, name, potential_ports): '0.0.0.0:%d. Retrying with another port.' % (http_error, port)) +def get_health_check(gcp, health_check_name): + result = gcp.compute.healthChecks().get( + project=gcp.project, healthCheck=health_check_name).execute() + gcp.health_check = GcpResource(health_check_name, result['selfLink']) + + +def get_health_check_firewall_rule(gcp, firewall_name): + result = gcp.compute.firewalls().get(project=gcp.project, + firewall=firewall_name).execute() + gcp.health_check_firewall_rule = GcpResource(firewall_name, + result['selfLink']) + + +def get_backend_service(gcp, backend_service_name): + result = gcp.compute.backendServices().get( + project=gcp.project, backendService=backend_service_name).execute() + backend_service = GcpResource(backend_service_name, result['selfLink']) + gcp.backend_services.append(backend_service) + return backend_service + + +def get_url_map(gcp, url_map_name): + result = gcp.compute.urlMaps().get(project=gcp.project, + urlMap=url_map_name).execute() + gcp.url_map = GcpResource(url_map_name, result['selfLink']) + + +def get_target_proxy(gcp, target_proxy_name): + if gcp.alpha_compute: + result = gcp.alpha_compute.targetGrpcProxies().get( + project=gcp.project, targetGrpcProxy=target_proxy_name).execute() + else: + result = gcp.compute.targetHttpProxies().get( + project=gcp.project, targetHttpProxy=target_proxy_name).execute() + gcp.target_proxy = GcpResource(target_proxy_name, result['selfLink']) + + +def get_global_forwarding_rule(gcp, forwarding_rule_name): + result = gcp.compute.globalForwardingRules().get( + project=gcp.project, forwardingRule=forwarding_rule_name).execute() + gcp.global_forwarding_rule = GcpResource(forwarding_rule_name, + result['selfLink']) + + +def get_instance_template(gcp, template_name): + result = gcp.compute.instanceTemplates().get( + project=gcp.project, instanceTemplate=template_name).execute() + gcp.instance_template = GcpResource(template_name, result['selfLink']) + + +def get_instance_group(gcp, zone, instance_group_name): + result = gcp.compute.instanceGroups().get( + project=gcp.project, zone=zone, + instanceGroup=instance_group_name).execute() + gcp.service_port = result['namedPorts'][0]['port'] + instance_group = InstanceGroup(instance_group_name, result['selfLink'], + zone) + gcp.instance_groups.append(instance_group) + return instance_group + + def delete_global_forwarding_rule(gcp): try: result = gcp.compute.globalForwardingRules().delete( @@ -1040,7 +1102,30 @@ try: same_zone_instance_group_name = _BASE_INSTANCE_GROUP_NAME + '-same-zone' + args.gcp_suffix if _USE_SECONDARY_IG: secondary_zone_instance_group_name = _BASE_INSTANCE_GROUP_NAME + '-secondary-zone' + args.gcp_suffix - try: + if args.use_existing_gcp_resources: + logger.info('Reusing existing GCP resources') + get_health_check(gcp, health_check_name) + try: + get_health_check_firewall_rule(gcp, firewall_name) + except googleapiclient.errors.HttpError as http_error: + # Firewall rule may be auto-deleted periodically depending on GCP + # project settings. + logger.exception('Failed to find firewall rule, recreating') + create_health_check_firewall_rule(gcp, firewall_name) + backend_service = get_backend_service(gcp, backend_service_name) + alternate_backend_service = get_backend_service( + gcp, alternate_backend_service_name) + get_url_map(gcp, url_map_name) + get_target_proxy(gcp, target_proxy_name) + get_global_forwarding_rule(gcp, forwarding_rule_name) + get_instance_template(gcp, template_name) + instance_group = get_instance_group(gcp, args.zone, instance_group_name) + same_zone_instance_group = get_instance_group( + gcp, args.zone, same_zone_instance_group_name) + if _USE_SECONDARY_IG: + secondary_zone_instance_group = get_instance_group( + gcp, args.secondary_zone, secondary_zone_instance_group_name) + else: create_health_check(gcp, health_check_name) create_health_check_firewall_rule(gcp, firewall_name) backend_service = add_backend_service(gcp, backend_service_name) @@ -1073,166 +1158,104 @@ try: secondary_zone_instance_group = add_instance_group( gcp, args.secondary_zone, secondary_zone_instance_group_name, _INSTANCE_GROUP_SIZE) - except googleapiclient.errors.HttpError as http_error: - if args.tolerate_gcp_errors: - logger.warning( - 'Failed to set up backends: %s. Attempting to continue since ' - '--tolerate_gcp_errors=true', http_error) - if not gcp.instance_template: - result = compute.instanceTemplates().get( - project=args.project_id, - instanceTemplate=template_name).execute() - gcp.instance_template = GcpResource(template_name, - result['selfLink']) - if not gcp.backend_services: - result = compute.backendServices().get( - project=args.project_id, - backendService=backend_service_name).execute() - backend_service = GcpResource(backend_service_name, - result['selfLink']) - gcp.backend_services.append(backend_service) - result = compute.backendServices().get( - project=args.project_id, - backendService=alternate_backend_service_name).execute() - alternate_backend_service = GcpResource( - alternate_backend_service_name, result['selfLink']) - gcp.backend_services.append(alternate_backend_service) - if not gcp.instance_groups: - result = compute.instanceGroups().get( - project=args.project_id, - zone=args.zone, - instanceGroup=instance_group_name).execute() - instance_group = InstanceGroup(instance_group_name, - result['selfLink'], args.zone) - gcp.instance_groups.append(instance_group) - result = compute.instanceGroups().get( - project=args.project_id, - zone=args.zone, - instanceGroup=same_zone_instance_group_name).execute() - same_zone_instance_group = InstanceGroup( - same_zone_instance_group_name, result['selfLink'], - args.zone) - gcp.instance_groups.append(same_zone_instance_group) - if _USE_SECONDARY_IG: - result = compute.instanceGroups().get( - project=args.project_id, - zone=args.secondary_zone, - instanceGroup=secondary_zone_instance_group_name - ).execute() - secondary_zone_instance_group = InstanceGroup( - secondary_zone_instance_group_name, result['selfLink'], - args.secondary_zone) - gcp.instance_groups.append(secondary_zone_instance_group) - if not gcp.health_check: - result = compute.healthChecks().get( - project=args.project_id, - healthCheck=health_check_name).execute() - gcp.health_check = GcpResource(health_check_name, - result['selfLink']) - if not gcp.url_map: - result = compute.urlMaps().get(project=args.project_id, - urlMap=url_map_name).execute() - gcp.url_map = GcpResource(url_map_name, result['selfLink']) - if not gcp.service_port: - gcp.service_port = args.service_port_range[0] - logger.warning('Using arbitrary service port in range: %d' % - gcp.service_port) - else: - raise http_error wait_for_healthy_backends(gcp, backend_service, instance_group) - if gcp.service_port == _DEFAULT_SERVICE_PORT: - server_uri = service_host_name - else: - server_uri = service_host_name + ':' + str(gcp.service_port) - if args.bootstrap_file: - bootstrap_path = os.path.abspath(args.bootstrap_file) - else: - with tempfile.NamedTemporaryFile(delete=False) as bootstrap_file: - bootstrap_file.write( - _BOOTSTRAP_TEMPLATE.format( - node_id=socket.gethostname()).encode('utf-8')) - bootstrap_path = bootstrap_file.name - client_env = dict(os.environ, GRPC_XDS_BOOTSTRAP=bootstrap_path) - client_cmd = shlex.split( - args.client_cmd.format(server_uri=server_uri, - stats_port=args.stats_port, - qps=args.qps)) - - test_results = {} - failed_tests = [] - for test_case in args.test_case: - result = jobset.JobResult() - log_dir = os.path.join(_TEST_LOG_BASE_DIR, test_case) - if not os.path.exists(log_dir): - os.makedirs(log_dir) - test_log_filename = os.path.join(log_dir, _SPONGE_LOG_NAME) - test_log_file = open(test_log_filename, 'w+') - client_process = None - try: - client_process = subprocess.Popen(client_cmd, - env=client_env, - stderr=subprocess.STDOUT, - stdout=test_log_file) - if test_case == 'backends_restart': - test_backends_restart(gcp, backend_service, instance_group) - elif test_case == 'change_backend_service': - test_change_backend_service(gcp, backend_service, - instance_group, - alternate_backend_service, - same_zone_instance_group) - elif test_case == 'new_instance_group_receives_traffic': - test_new_instance_group_receives_traffic( - gcp, backend_service, instance_group, - same_zone_instance_group) - elif test_case == 'ping_pong': - test_ping_pong(gcp, backend_service, instance_group) - elif test_case == 'remove_instance_group': - test_remove_instance_group(gcp, backend_service, instance_group, - same_zone_instance_group) - elif test_case == 'round_robin': - test_round_robin(gcp, backend_service, instance_group) - elif test_case == 'secondary_locality_gets_no_requests_on_partial_primary_failure': - test_secondary_locality_gets_no_requests_on_partial_primary_failure( - gcp, backend_service, instance_group, - secondary_zone_instance_group) - elif test_case == 'secondary_locality_gets_requests_on_primary_failure': - test_secondary_locality_gets_requests_on_primary_failure( - gcp, backend_service, instance_group, - secondary_zone_instance_group) - else: - logger.error('Unknown test case: %s', test_case) - sys.exit(1) - result.state = 'PASSED' - result.returncode = 0 - except Exception as e: - logger.error('Test case %s failed: %s', test_case, e) - failed_tests.append(test_case) - result.state = 'FAILED' - result.message = str(e) - finally: - if client_process: - client_process.terminate() - test_log_file.close() - # Workaround for Python 3, as report_utils will invoke decode() on - # result.message, which has a default value of ''. - result.message = result.message.encode('UTF-8') - test_results[test_case] = [result] - if args.log_client_output: - logger.info('Client output:') - with open(test_log_filename, 'r') as client_output: - logger.info(client_output.read()) - if not os.path.exists(_TEST_LOG_BASE_DIR): - os.makedirs(_TEST_LOG_BASE_DIR) - report_utils.render_junit_xml_report(test_results, - os.path.join(_TEST_LOG_BASE_DIR, - _SPONGE_XML_NAME), - suite_name='xds_tests', - multi_target=True) - if failed_tests: - logger.error('Test case(s) %s failed', failed_tests) - sys.exit(1) + if args.test_case: + + if gcp.service_port == _DEFAULT_SERVICE_PORT: + server_uri = service_host_name + else: + server_uri = service_host_name + ':' + str(gcp.service_port) + if args.bootstrap_file: + bootstrap_path = os.path.abspath(args.bootstrap_file) + else: + with tempfile.NamedTemporaryFile(delete=False) as bootstrap_file: + bootstrap_file.write( + _BOOTSTRAP_TEMPLATE.format( + node_id=socket.gethostname()).encode('utf-8')) + bootstrap_path = bootstrap_file.name + client_env = dict(os.environ, GRPC_XDS_BOOTSTRAP=bootstrap_path) + client_cmd = shlex.split( + args.client_cmd.format(server_uri=server_uri, + stats_port=args.stats_port, + qps=args.qps)) + + test_results = {} + failed_tests = [] + for test_case in args.test_case: + result = jobset.JobResult() + log_dir = os.path.join(_TEST_LOG_BASE_DIR, test_case) + if not os.path.exists(log_dir): + os.makedirs(log_dir) + test_log_filename = os.path.join(log_dir, _SPONGE_LOG_NAME) + test_log_file = open(test_log_filename, 'w+') + client_process = None + try: + client_process = subprocess.Popen(client_cmd, + env=client_env, + stderr=subprocess.STDOUT, + stdout=test_log_file) + if test_case == 'backends_restart': + test_backends_restart(gcp, backend_service, instance_group) + elif test_case == 'change_backend_service': + test_change_backend_service(gcp, backend_service, + instance_group, + alternate_backend_service, + same_zone_instance_group) + elif test_case == 'new_instance_group_receives_traffic': + test_new_instance_group_receives_traffic( + gcp, backend_service, instance_group, + same_zone_instance_group) + elif test_case == 'ping_pong': + test_ping_pong(gcp, backend_service, instance_group) + elif test_case == 'remove_instance_group': + test_remove_instance_group(gcp, backend_service, + instance_group, + same_zone_instance_group) + elif test_case == 'round_robin': + test_round_robin(gcp, backend_service, instance_group) + elif test_case == 'secondary_locality_gets_no_requests_on_partial_primary_failure': + test_secondary_locality_gets_no_requests_on_partial_primary_failure( + gcp, backend_service, instance_group, + secondary_zone_instance_group) + elif test_case == 'secondary_locality_gets_requests_on_primary_failure': + test_secondary_locality_gets_requests_on_primary_failure( + gcp, backend_service, instance_group, + secondary_zone_instance_group) + else: + logger.error('Unknown test case: %s', test_case) + sys.exit(1) + result.state = 'PASSED' + result.returncode = 0 + except Exception as e: + logger.exception('Test case %s failed', test_case) + failed_tests.append(test_case) + result.state = 'FAILED' + result.message = str(e) + finally: + if client_process: + client_process.terminate() + test_log_file.close() + # Workaround for Python 3, as report_utils will invoke decode() on + # result.message, which has a default value of ''. + result.message = result.message.encode('UTF-8') + test_results[test_case] = [result] + if args.log_client_output: + logger.info('Client output:') + with open(test_log_filename, 'r') as client_output: + logger.info(client_output.read()) + if not os.path.exists(_TEST_LOG_BASE_DIR): + os.makedirs(_TEST_LOG_BASE_DIR) + report_utils.render_junit_xml_report(test_results, + os.path.join( + _TEST_LOG_BASE_DIR, + _SPONGE_XML_NAME), + suite_name='xds_tests', + multi_target=True) + if failed_tests: + logger.error('Test case(s) %s failed', failed_tests) + sys.exit(1) finally: if not args.keep_gcp_resources: logger.info('Cleaning up GCP resources. This may take some time.') From 4fae974ffae4bf31dc9d6d629c42aa8e6b73f1e6 Mon Sep 17 00:00:00 2001 From: Donna Dionne Date: Mon, 13 Apr 2020 14:41:42 -0700 Subject: [PATCH 454/758] A merge error was missed! --- build_autogenerated.yaml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml index 56b0b288ad6..9d7005254e2 100644 --- a/build_autogenerated.yaml +++ b/build_autogenerated.yaml @@ -1592,13 +1592,10 @@ libs: - src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc - src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc - src/core/ext/filters/client_channel/lb_policy/xds/cds.cc -<<<<<<< HEAD - - src/core/ext/filters/client_channel/lb_policy/xds/xds.cc - src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc -======= - src/core/ext/filters/client_channel/lb_policy/xds/eds.cc - src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc ->>>>>>> upstream/master + - src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc - src/core/ext/filters/client_channel/lb_policy_registry.cc - src/core/ext/filters/client_channel/local_subchannel_pool.cc - src/core/ext/filters/client_channel/parse_address.cc From 6a1ea0bacc4151c8e38c62b5cb040cd827b96ee8 Mon Sep 17 00:00:00 2001 From: Donna Dionne Date: Mon, 13 Apr 2020 14:52:46 -0700 Subject: [PATCH 455/758] Another Merge error --- CMakeLists.txt | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d23e3425c02..23fe27d0942 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1988,13 +1988,10 @@ add_library(grpc_unsecure src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc src/core/ext/filters/client_channel/lb_policy/xds/cds.cc -<<<<<<< HEAD - src/core/ext/filters/client_channel/lb_policy/xds/xds.cc src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc -======= src/core/ext/filters/client_channel/lb_policy/xds/eds.cc src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc ->>>>>>> upstream/master + src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc src/core/ext/filters/client_channel/lb_policy_registry.cc src/core/ext/filters/client_channel/local_subchannel_pool.cc src/core/ext/filters/client_channel/parse_address.cc From d38f7cfe5e23aa45c133a866be12a457ebc707fd Mon Sep 17 00:00:00 2001 From: Brian O'Connor <558367+bocon13@users.noreply.github.com> Date: Thu, 9 Apr 2020 00:04:35 -0700 Subject: [PATCH 456/758] Fixing bug with END_STREAM if header has continuations - The HEADER frame should get the END_STREAM flag per the HTTP/2 spec; the old code put END_STREAM on the last CONTINUATION frame. - Removing deprecated parameter, is_last_in_stream, from finish_frame(); it has been superseded by the is_end_of_stream member of the framer_state struct. - Adding some gRPC frame validation tests to hpack_encoder_test.cc, and explicting checking that the END_STREAM flag is not on the CONTINUATION frame. fixes #21436 --- .../chttp2/transport/hpack_encoder.cc | 40 +++-- .../transport/chttp2/hpack_encoder_test.cc | 143 ++++++++++++++++++ 2 files changed, 170 insertions(+), 13 deletions(-) diff --git a/src/core/ext/transport/chttp2/transport/hpack_encoder.cc b/src/core/ext/transport/chttp2/transport/hpack_encoder.cc index 16a46953cfc..3124f3efa6e 100644 --- a/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +++ b/src/core/ext/transport/chttp2/transport/hpack_encoder.cc @@ -277,6 +277,7 @@ typedef struct { /* maximum size of a frame */ size_t max_frame_size; bool use_true_binary_metadata; + bool is_end_of_stream; } framer_state; /* fills p (which is expected to be kDataFrameHeaderSize bytes long) @@ -315,17 +316,29 @@ static size_t current_frame_size(framer_state* st) { } /* finish a frame - fill in the previously reserved header */ -static void finish_frame(framer_state* st, int is_header_boundary, - int is_last_in_stream) { +static void finish_frame(framer_state* st, int is_header_boundary) { uint8_t type = 0xff; - type = st->is_first_frame ? GRPC_CHTTP2_FRAME_HEADER - : GRPC_CHTTP2_FRAME_CONTINUATION; - fill_header( - GRPC_SLICE_START_PTR(st->output->slices[st->header_idx]), type, - st->stream_id, current_frame_size(st), - static_cast( - (is_last_in_stream ? GRPC_CHTTP2_DATA_FLAG_END_STREAM : 0) | - (is_header_boundary ? GRPC_CHTTP2_DATA_FLAG_END_HEADERS : 0))); + type = + static_cast(st->is_first_frame ? GRPC_CHTTP2_FRAME_HEADER + : GRPC_CHTTP2_FRAME_CONTINUATION); + uint8_t flags = 0xff; + /* per the HTTP/2 spec: + A HEADERS frame carries the END_STREAM flag that signals the end of a + stream. However, a HEADERS frame with the END_STREAM flag set can be + followed by CONTINUATION frames on the same stream. Logically, the + CONTINUATION frames are part of the HEADERS frame. + Thus, we add the END_STREAM flag to the HEADER frame (the first frame). */ + flags = static_cast(st->is_first_frame && st->is_end_of_stream + ? GRPC_CHTTP2_DATA_FLAG_END_STREAM + : 0); + /* per the HTTP/2 spec: + A HEADERS frame without the END_HEADERS flag set MUST be followed by + a CONTINUATION frame for the same stream. + Thus, we add the END_HEADER flag to the last frame. */ + flags |= static_cast( + is_header_boundary ? GRPC_CHTTP2_DATA_FLAG_END_HEADERS : 0); + fill_header(GRPC_SLICE_START_PTR(st->output->slices[st->header_idx]), type, + st->stream_id, current_frame_size(st), flags); st->stats->framing_bytes += kDataFrameHeaderSize; st->is_first_frame = 0; } @@ -347,7 +360,7 @@ static void ensure_space(framer_state* st, size_t need_bytes) { if (GPR_LIKELY(current_frame_size(st) + need_bytes <= st->max_frame_size)) { return; } - finish_frame(st, 0, 0); + finish_frame(st, 0); begin_frame(st); } @@ -362,7 +375,7 @@ static void add_header_data(framer_state* st, grpc_slice slice) { } else { st->stats->header_bytes += remaining; grpc_slice_buffer_add(st->output, grpc_slice_split_head(&slice, remaining)); - finish_frame(st, 0, 0); + finish_frame(st, 0); begin_frame(st); add_header_data(st, slice); } @@ -841,6 +854,7 @@ void grpc_chttp2_encode_header(grpc_chttp2_hpack_compressor* c, st.stats = options->stats; st.max_frame_size = options->max_frame_size; st.use_true_binary_metadata = options->use_true_binary_metadata; + st.is_end_of_stream = options->is_eof; /* Encode a metadata batch; store the returned values, representing a metadata element that needs to be unreffed back into the metadata @@ -883,5 +897,5 @@ void grpc_chttp2_encode_header(grpc_chttp2_hpack_compressor* c, deadline_enc(c, deadline, &st); } - finish_frame(&st, 1, options->is_eof); + finish_frame(&st, 1); } diff --git a/test/core/transport/chttp2/hpack_encoder_test.cc b/test/core/transport/chttp2/hpack_encoder_test.cc index 707091bc129..8099b4fe021 100644 --- a/test/core/transport/chttp2/hpack_encoder_test.cc +++ b/test/core/transport/chttp2/hpack_encoder_test.cc @@ -49,6 +49,102 @@ typedef struct { bool only_intern_key; } verify_params; +/* verify that the output frames that are generated by encoding the stream + have sensible type and flags values */ +static void verify_frames(grpc_slice_buffer& output, bool header_is_eof) { + /* per the HTTP/2 spec: + All frames begin with a fixed 9-octet header followed by a + variable-length payload. + + +-----------------------------------------------+ + | Length (24) | + +---------------+---------------+---------------+ + | Type (8) | Flags (8) | + +-+-------------+---------------+-------------------------------+ + |R| Stream Identifier (31) | + +=+=============================================================+ + | Frame Payload (0...) ... + +---------------------------------------------------------------+ + */ + uint8_t type = 0xff, flags = 0xff; + size_t i, merged_length, frame_size; + bool first_frame = false; + bool in_header = false; + bool end_header = false; + bool is_closed = false; + for (i = 0; i < output.count;) { + first_frame = i == 0; + grpc_slice* slice = &output.slices[i++]; + + // Read gRPC frame header + uint8_t* p = GRPC_SLICE_START_PTR(*slice); + frame_size = 0; + frame_size |= static_cast(p[0]) << 16; + frame_size |= static_cast(p[1]) << 8; + frame_size |= static_cast(p[2]); + type = p[3]; + flags = p[4]; + + // Read remainder of the gRPC frame + merged_length = GRPC_SLICE_LENGTH(*slice); + while (merged_length < frame_size + 9) { // including 9 byte frame header + grpc_slice* slice = &output.slices[i++]; + merged_length += GRPC_SLICE_LENGTH(*slice); + } + + // Verifications + if (first_frame && type != GRPC_CHTTP2_FRAME_HEADER) { + gpr_log(GPR_ERROR, "expected first frame to be of type header"); + gpr_log(GPR_ERROR, "EXPECT: 0x%x", GRPC_CHTTP2_FRAME_HEADER); + gpr_log(GPR_ERROR, "GOT: 0x%x", type); + g_failure = 1; + } else if (first_frame && header_is_eof && + !(flags & GRPC_CHTTP2_DATA_FLAG_END_STREAM)) { + gpr_log(GPR_ERROR, "missing END_STREAM flag in HEADER frame"); + g_failure = 1; + } + if (is_closed && + (type == GRPC_CHTTP2_FRAME_DATA || type == GRPC_CHTTP2_FRAME_HEADER)) { + gpr_log(GPR_ERROR, + "stream is closed; new frame headers and data are not allowed"); + g_failure = 1; + } + if (end_header && (type == GRPC_CHTTP2_FRAME_HEADER || + type == GRPC_CHTTP2_FRAME_CONTINUATION)) { + gpr_log(GPR_ERROR, + "frame header is ended; new headers and continuations are not " + "allowed"); + g_failure = 1; + } + if (in_header && + (type == GRPC_CHTTP2_FRAME_DATA || type == GRPC_CHTTP2_FRAME_HEADER)) { + gpr_log(GPR_ERROR, + "parsing frame header; new headers and data are not allowed"); + g_failure = 1; + } + if (flags & ~(GRPC_CHTTP2_DATA_FLAG_END_STREAM | + GRPC_CHTTP2_DATA_FLAG_END_HEADERS)) { + gpr_log(GPR_ERROR, "unexpected frame flags: 0x%x", flags); + g_failure = 1; + } + + // Update state + if (flags & GRPC_CHTTP2_DATA_FLAG_END_HEADERS) { + in_header = false; + end_header = true; + } else if (type == GRPC_CHTTP2_DATA_FLAG_END_HEADERS) { + in_header = true; + } + if (flags & GRPC_CHTTP2_DATA_FLAG_END_STREAM) { + is_closed = true; + if (type == GRPC_CHTTP2_FRAME_CONTINUATION) { + gpr_log(GPR_ERROR, "unexpected END_STREAM flag in CONTINUATION frame"); + g_failure = 1; + } + } + } +} + /* verify that the output generated by encoding the stream matches the hexstring passed in */ static void verify(const verify_params params, const char* expected, @@ -106,6 +202,7 @@ static void verify(const verify_params params, const char* expected, &stats /* stats */ }; grpc_chttp2_encode_header(&g_compressor, nullptr, 0, &b, &hopt, &output); + verify_frames(output, params.eof); merged = grpc_slice_merge(output.slices, output.count); grpc_slice_buffer_destroy_internal(&output); grpc_metadata_batch_destroy(&b); @@ -151,6 +248,50 @@ static void test_basic_headers() { verify(params, "000004 0104 deadbeef 0f 2f 0176", 1, "a", "v"); } +static void verify_continuation_headers(const char* key, const char* value, + bool is_eof) { + grpc_slice_buffer output; + grpc_mdelem elem = grpc_mdelem_from_slices( + grpc_slice_intern(grpc_slice_from_static_string(key)), + grpc_slice_intern(grpc_slice_from_static_string(value))); + grpc_linked_mdelem* e = + static_cast(gpr_malloc(sizeof(*e))); + grpc_metadata_batch b; + grpc_metadata_batch_init(&b); + e[0].md = elem; + e[0].prev = nullptr; + e[0].next = nullptr; + b.list.head = &e[0]; + b.list.tail = &e[0]; + b.list.count = 1; + grpc_slice_buffer_init(&output); + + grpc_transport_one_way_stats stats; + stats = {}; + grpc_encode_header_options hopt = {0xdeadbeef, /* stream_id */ + is_eof, /* is_eof */ + false, /* use_true_binary_metadata */ + 150, /* max_frame_size */ + &stats /* stats */}; + grpc_chttp2_encode_header(&g_compressor, nullptr, 0, &b, &hopt, &output); + verify_frames(output, is_eof); + grpc_slice_buffer_destroy_internal(&output); + grpc_metadata_batch_destroy(&b); + gpr_free(e); +} + +static void test_continuation_headers() { + char value[200]; + memset(value, 'a', 200); + value[199] = 0; // null terminator + verify_continuation_headers("key", value, true); + + char value2[400]; + memset(value2, 'b', 400); + value2[399] = 0; // null terminator + verify_continuation_headers("key2", value2, true); +} + static void encode_int_to_str(int i, char* p) { p[0] = static_cast('a' + i % 26); i /= 26; @@ -225,6 +366,7 @@ static void verify_table_size_change_match_elem_size(const char* key, 16384, /* max_frame_size */ &stats /* stats */}; grpc_chttp2_encode_header(&g_compressor, nullptr, 0, &b, &hopt, &output); + verify_frames(output, false); grpc_slice_buffer_destroy_internal(&output); grpc_metadata_batch_destroy(&b); @@ -267,6 +409,7 @@ int main(int argc, char** argv) { TEST(test_decode_table_overflow); TEST(test_encode_header_size); TEST(test_interned_key_indexed); + TEST(test_continuation_headers); grpc_shutdown(); for (i = 0; i < num_to_delete; i++) { gpr_free(to_delete[i]); From 6864760acbdf106aa2236c1e70da6c1fad16cd0a Mon Sep 17 00:00:00 2001 From: Donna Dionne Date: Mon, 13 Apr 2020 15:40:57 -0700 Subject: [PATCH 457/758] Remove unused variables. --- src/core/ext/filters/client_channel/xds/xds_api.cc | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/core/ext/filters/client_channel/xds/xds_api.cc b/src/core/ext/filters/client_channel/xds/xds_api.cc index ec3238682e4..8a19d2b7dae 100644 --- a/src/core/ext/filters/client_channel/xds/xds_api.cc +++ b/src/core/ext/filters/client_channel/xds/xds_api.cc @@ -1021,8 +1021,6 @@ grpc_error* RouteConfigParse( const envoy_api_v2_route_RouteMatch* match = envoy_api_v2_route_Route_match(route); XdsApi::RdsRoute rds_route; - upb_strview prefix; - upb_strview path; if (envoy_api_v2_route_RouteMatch_has_prefix(match)) { upb_strview prefix = envoy_api_v2_route_RouteMatch_prefix(match); if (prefix.size > 0) { From 73fc26d273823256316c743a0a2366fc572bfbdb Mon Sep 17 00:00:00 2001 From: Donna Dionne Date: Mon, 13 Apr 2020 16:02:13 -0700 Subject: [PATCH 458/758] Checking in result of sudo ./tools/buildgen/generate_projects.sh --- CMakeLists.txt | 2 -- Makefile | 4 ---- build_autogenerated.yaml | 2 -- 3 files changed, 8 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 23fe27d0942..95b67085e6a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1988,7 +1988,6 @@ add_library(grpc_unsecure src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc src/core/ext/filters/client_channel/lb_policy/xds/cds.cc - src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc src/core/ext/filters/client_channel/lb_policy/xds/eds.cc src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc @@ -14453,7 +14452,6 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/lrs_for_test.grpc.pb.cc ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/lrs_for_test.pb.h ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/lrs_for_test.grpc.pb.h - test/cpp/end2end/test_service_impl.cc test/cpp/end2end/xds_end2end_test.cc third_party/googletest/googletest/src/gtest-all.cc third_party/googletest/googlemock/src/gmock-all.cc diff --git a/Makefile b/Makefile index 788d076b89e..5c143303bda 100644 --- a/Makefile +++ b/Makefile @@ -19036,7 +19036,6 @@ XDS_END2END_TEST_SRC = \ $(GENDIR)/src/proto/grpc/testing/xds/eds_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/eds_for_test.grpc.pb.cc \ $(GENDIR)/src/proto/grpc/testing/xds/lds_rds_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/lds_rds_for_test.grpc.pb.cc \ $(GENDIR)/src/proto/grpc/testing/xds/lrs_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/lrs_for_test.grpc.pb.cc \ - test/cpp/end2end/test_service_impl.cc \ test/cpp/end2end/xds_end2end_test.cc \ XDS_END2END_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(XDS_END2END_TEST_SRC)))) @@ -19086,8 +19085,6 @@ $(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/xds/lds_rds_for_test.o: $(LIBDIR)/$( $(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/xds/lrs_for_test.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a -$(OBJDIR)/$(CONFIG)/test/cpp/end2end/test_service_impl.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a - $(OBJDIR)/$(CONFIG)/test/cpp/end2end/xds_end2end_test.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a deps_xds_end2end_test: $(XDS_END2END_TEST_OBJS:.o=.dep) @@ -19097,7 +19094,6 @@ ifneq ($(NO_DEPS),true) -include $(XDS_END2END_TEST_OBJS:.o=.dep) endif endif -$(OBJDIR)/$(CONFIG)/test/cpp/end2end/test_service_impl.o: $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/ads_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/ads_for_test.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/cds_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/cds_for_test.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/eds_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/eds_for_test.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/lds_rds_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/lds_rds_for_test.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/lrs_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/lrs_for_test.grpc.pb.cc $(OBJDIR)/$(CONFIG)/test/cpp/end2end/xds_end2end_test.o: $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/ads_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/ads_for_test.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/cds_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/cds_for_test.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/eds_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/eds_for_test.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/lds_rds_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/lds_rds_for_test.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/lrs_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/lrs_for_test.grpc.pb.cc diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml index 9d7005254e2..662af21ae8d 100644 --- a/build_autogenerated.yaml +++ b/build_autogenerated.yaml @@ -1592,7 +1592,6 @@ libs: - src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc - src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc - src/core/ext/filters/client_channel/lb_policy/xds/cds.cc - - src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc - src/core/ext/filters/client_channel/lb_policy/xds/eds.cc - src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc - src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc @@ -7560,7 +7559,6 @@ targets: - src/proto/grpc/testing/xds/eds_for_test.proto - src/proto/grpc/testing/xds/lds_rds_for_test.proto - src/proto/grpc/testing/xds/lrs_for_test.proto - - test/cpp/end2end/test_service_impl.cc - test/cpp/end2end/xds_end2end_test.cc deps: - grpc++_test_util From d24387ae4f57adbe78b4bb50d3de852623d10448 Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Mon, 13 Apr 2020 17:28:38 -0700 Subject: [PATCH 459/758] Removing compression from grpc_byte_buffer_reader, removing ManualConstructor in decompress filter and fixing tests --- .../grpc/impl/codegen/byte_buffer_reader.h | 1 - include/grpc/impl/codegen/grpc_types.h | 7 +- .../ext/filters/http/http_filters_plugin.cc | 28 +++---- .../message_decompress_filter.cc | 12 ++- src/core/lib/surface/byte_buffer_reader.cc | 55 +------------- .../channel/minimal_stack_is_minimal_test.cc | 6 +- test/core/end2end/cq_verifier.cc | 42 +++++------ test/core/end2end/tests/compressed_payload.cc | 1 + test/core/surface/byte_buffer_reader_test.cc | 73 ------------------- 9 files changed, 51 insertions(+), 174 deletions(-) diff --git a/include/grpc/impl/codegen/byte_buffer_reader.h b/include/grpc/impl/codegen/byte_buffer_reader.h index e06e19558a1..7cd87c82a24 100644 --- a/include/grpc/impl/codegen/byte_buffer_reader.h +++ b/include/grpc/impl/codegen/byte_buffer_reader.h @@ -27,7 +27,6 @@ struct grpc_byte_buffer; struct grpc_byte_buffer_reader { struct grpc_byte_buffer* buffer_in; - struct grpc_byte_buffer* buffer_out; /** Different current objects correspond to different types of byte buffers */ union grpc_byte_buffer_reader_current { /** Index into a slice buffer's array of slices */ diff --git a/include/grpc/impl/codegen/grpc_types.h b/include/grpc/impl/codegen/grpc_types.h index 26d5984b53a..91df2508a6f 100644 --- a/include/grpc/impl/codegen/grpc_types.h +++ b/include/grpc/impl/codegen/grpc_types.h @@ -175,11 +175,8 @@ typedef struct { GRPC_ARG_MINIMAL_STACK is enabled, in which case it defaults to 0. */ #define GRPC_ARG_ENABLE_PER_MESSAGE_COMPRESSION "grpc.per_message_compression" /** Experimental Arg. Enable/disable support for per-message decompression. - Defaults to 1, unless GRPC_ARG_MINIMAL_STACK is enabled, in which case it - defaults to 0. If disabled, decompression will be performed lazily by - grpc_byte_buffer_reader. This arg also determines whether max message limits - will be applied to the decompressed buffer or the non-decompressed buffer. It - is recommended to keep this enabled to protect against zip bomb attacks. */ + Defaults to 1. If disabled, decompression will not be performed and the + application will see the compressed message in the byte buffer. */ #define GRPC_ARG_ENABLE_PER_MESSAGE_DECOMPRESSION_INSIDE_CORE \ "grpc.per_message_decompression_inside_core" /** Enable/disable support for deadline checking. Defaults to 1, unless diff --git a/src/core/ext/filters/http/http_filters_plugin.cc b/src/core/ext/filters/http/http_filters_plugin.cc index 3c90df4a15c..e7024a2b61b 100644 --- a/src/core/ext/filters/http/http_filters_plugin.cc +++ b/src/core/ext/filters/http/http_filters_plugin.cc @@ -47,6 +47,7 @@ static bool is_building_http_like_transport( return t != nullptr && strstr(t->vtable->name, "http"); } +template static bool maybe_add_optional_filter(grpc_channel_stack_builder* builder, void* arg) { if (!is_building_http_like_transport(builder)) return true; @@ -55,7 +56,8 @@ static bool maybe_add_optional_filter(grpc_channel_stack_builder* builder, grpc_channel_stack_builder_get_channel_arguments(builder); bool enable = grpc_channel_arg_get_bool( grpc_channel_args_find(channel_args, filtarg->control_channel_arg), - !grpc_channel_args_want_minimal_stack(channel_args)); + enable_in_minimal_stack || + !grpc_channel_args_want_minimal_stack(channel_args)); return enable ? grpc_channel_stack_builder_prepend_filter( builder, filtarg->filter, nullptr, nullptr) : true; @@ -71,24 +73,24 @@ static bool maybe_add_required_filter(grpc_channel_stack_builder* builder, } void grpc_http_filters_init(void) { - grpc_channel_init_register_stage(GRPC_CLIENT_SUBCHANNEL, - GRPC_CHANNEL_INIT_BUILTIN_PRIORITY, - maybe_add_optional_filter, &compress_filter); - grpc_channel_init_register_stage(GRPC_CLIENT_DIRECT_CHANNEL, - GRPC_CHANNEL_INIT_BUILTIN_PRIORITY, - maybe_add_optional_filter, &compress_filter); - grpc_channel_init_register_stage(GRPC_SERVER_CHANNEL, - GRPC_CHANNEL_INIT_BUILTIN_PRIORITY, - maybe_add_optional_filter, &compress_filter); grpc_channel_init_register_stage( GRPC_CLIENT_SUBCHANNEL, GRPC_CHANNEL_INIT_BUILTIN_PRIORITY, - maybe_add_optional_filter, &decompress_filter); + maybe_add_optional_filter, &compress_filter); grpc_channel_init_register_stage( GRPC_CLIENT_DIRECT_CHANNEL, GRPC_CHANNEL_INIT_BUILTIN_PRIORITY, - maybe_add_optional_filter, &decompress_filter); + maybe_add_optional_filter, &compress_filter); grpc_channel_init_register_stage( GRPC_SERVER_CHANNEL, GRPC_CHANNEL_INIT_BUILTIN_PRIORITY, - maybe_add_optional_filter, &decompress_filter); + maybe_add_optional_filter, &compress_filter); + grpc_channel_init_register_stage( + GRPC_CLIENT_SUBCHANNEL, GRPC_CHANNEL_INIT_BUILTIN_PRIORITY, + maybe_add_optional_filter, &decompress_filter); + grpc_channel_init_register_stage( + GRPC_CLIENT_DIRECT_CHANNEL, GRPC_CHANNEL_INIT_BUILTIN_PRIORITY, + maybe_add_optional_filter, &decompress_filter); + grpc_channel_init_register_stage( + GRPC_SERVER_CHANNEL, GRPC_CHANNEL_INIT_BUILTIN_PRIORITY, + maybe_add_optional_filter, &decompress_filter); grpc_channel_init_register_stage( GRPC_CLIENT_SUBCHANNEL, GRPC_CHANNEL_INIT_BUILTIN_PRIORITY, maybe_add_required_filter, (void*)&grpc_http_client_filter); diff --git a/src/core/ext/filters/http/message_decompress/message_decompress_filter.cc b/src/core/ext/filters/http/message_decompress/message_decompress_filter.cc index eb90c01449b..a53529c9bb4 100644 --- a/src/core/ext/filters/http/message_decompress/message_decompress_filter.cc +++ b/src/core/ext/filters/http/message_decompress/message_decompress_filter.cc @@ -102,7 +102,8 @@ class CallData { // It is initialized during construction and reset when a new stream is // created using it. grpc_slice_buffer recv_slices_; - grpc_core::ManualConstructor + std::aligned_storage::type recv_replacement_stream_; // Fields for handling recv_trailing_metadata_ready callback bool seen_recv_trailing_metadata_ready_ = false; @@ -181,7 +182,8 @@ void CallData::OnRecvMessageReady(void* arg, grpc_error* error) { void CallData::ContinueReadingRecvMessage() { while ((*recv_message_) - ->Next(~static_cast(0), &on_recv_message_next_done_)) { + ->Next((*recv_message_)->length() - recv_slices_.length, + &on_recv_message_next_done_)) { grpc_error* error = PullSliceFromRecvMessage(); if (error != GRPC_ERROR_NONE) { return ContinueRecvMessageReadyCallback(error); @@ -240,8 +242,10 @@ void CallData::FinishRecvMessage() { // batch down. // Initializing recv_replacement_stream_ with decompressed_slices removes // all the slices from decompressed_slices leaving it empty. - recv_replacement_stream_.Init(&decompressed_slices, recv_flags); - recv_message_->reset(recv_replacement_stream_.get()); + new (&recv_replacement_stream_) + grpc_core::SliceBufferByteStream(&decompressed_slices, recv_flags); + recv_message_->reset(reinterpret_cast( + &recv_replacement_stream_)); recv_message_ = nullptr; } ContinueRecvMessageReadyCallback(GRPC_ERROR_REF(error_)); diff --git a/src/core/lib/surface/byte_buffer_reader.cc b/src/core/lib/surface/byte_buffer_reader.cc index ed8ecc49590..baf205d8154 100644 --- a/src/core/lib/surface/byte_buffer_reader.cc +++ b/src/core/lib/surface/byte_buffer_reader.cc @@ -22,57 +22,19 @@ #include #include -#include #include #include #include #include -#include "src/core/lib/compression/message_compress.h" #include "src/core/lib/iomgr/exec_ctx.h" #include "src/core/lib/slice/slice_internal.h" -static int is_compressed(grpc_byte_buffer* buffer) { - switch (buffer->type) { - case GRPC_BB_RAW: - if (buffer->data.raw.compression == GRPC_COMPRESS_NONE) { - return 0 /* GPR_FALSE */; - } - break; - } - return 1 /* GPR_TRUE */; -} - int grpc_byte_buffer_reader_init(grpc_byte_buffer_reader* reader, grpc_byte_buffer* buffer) { - grpc_core::ExecCtx exec_ctx; - grpc_slice_buffer decompressed_slices_buffer; reader->buffer_in = buffer; switch (reader->buffer_in->type) { case GRPC_BB_RAW: - grpc_slice_buffer_init(&decompressed_slices_buffer); - if (is_compressed(reader->buffer_in)) { - if (grpc_msg_decompress( - - grpc_compression_algorithm_to_message_compression_algorithm( - reader->buffer_in->data.raw.compression), - &reader->buffer_in->data.raw.slice_buffer, - &decompressed_slices_buffer) == 0) { - gpr_log(GPR_ERROR, - "Unexpected error decompressing data for algorithm with enum " - "value '%d'.", - reader->buffer_in->data.raw.compression); - memset(reader, 0, sizeof(*reader)); - return 0; - } else { /* all fine */ - reader->buffer_out = - grpc_raw_byte_buffer_create(decompressed_slices_buffer.slices, - decompressed_slices_buffer.count); - } - grpc_slice_buffer_destroy_internal(&decompressed_slices_buffer); - } else { /* not compressed, use the input buffer as output */ - reader->buffer_out = reader->buffer_in; - } reader->current.index = 0; break; } @@ -80,23 +42,14 @@ int grpc_byte_buffer_reader_init(grpc_byte_buffer_reader* reader, return 1; } -void grpc_byte_buffer_reader_destroy(grpc_byte_buffer_reader* reader) { - switch (reader->buffer_in->type) { - case GRPC_BB_RAW: - /* keeping the same if-else structure as in the init function */ - if (is_compressed(reader->buffer_in)) { - grpc_byte_buffer_destroy(reader->buffer_out); - } - break; - } -} +void grpc_byte_buffer_reader_destroy(grpc_byte_buffer_reader* reader) {} int grpc_byte_buffer_reader_peek(grpc_byte_buffer_reader* reader, grpc_slice** slice) { switch (reader->buffer_in->type) { case GRPC_BB_RAW: { grpc_slice_buffer* slice_buffer; - slice_buffer = &reader->buffer_out->data.raw.slice_buffer; + slice_buffer = &reader->buffer_in->data.raw.slice_buffer; if (reader->current.index < slice_buffer->count) { *slice = &slice_buffer->slices[reader->current.index]; reader->current.index += 1; @@ -113,7 +66,7 @@ int grpc_byte_buffer_reader_next(grpc_byte_buffer_reader* reader, switch (reader->buffer_in->type) { case GRPC_BB_RAW: { grpc_slice_buffer* slice_buffer; - slice_buffer = &reader->buffer_out->data.raw.slice_buffer; + slice_buffer = &reader->buffer_in->data.raw.slice_buffer; if (reader->current.index < slice_buffer->count) { *slice = grpc_slice_ref_internal( slice_buffer->slices[reader->current.index]); @@ -129,7 +82,7 @@ int grpc_byte_buffer_reader_next(grpc_byte_buffer_reader* reader, grpc_slice grpc_byte_buffer_reader_readall(grpc_byte_buffer_reader* reader) { grpc_slice in_slice; size_t bytes_read = 0; - const size_t input_size = grpc_byte_buffer_length(reader->buffer_out); + const size_t input_size = grpc_byte_buffer_length(reader->buffer_in); grpc_slice out_slice = GRPC_SLICE_MALLOC(input_size); uint8_t* const outbuf = GRPC_SLICE_START_PTR(out_slice); /* just an alias */ diff --git a/test/core/channel/minimal_stack_is_minimal_test.cc b/test/core/channel/minimal_stack_is_minimal_test.cc index 8ab5bfe8f72..d02c5806f82 100644 --- a/test/core/channel/minimal_stack_is_minimal_test.cc +++ b/test/core/channel/minimal_stack_is_minimal_test.cc @@ -68,11 +68,11 @@ int main(int argc, char** argv) { grpc_channel_args minimal_stack_args = {1, &minimal_stack_arg}; errors += CHECK_STACK("unknown", &minimal_stack_args, GRPC_CLIENT_DIRECT_CHANNEL, - "authority", "connected", NULL); + "authority", "message_decompress", "connected", NULL); errors += CHECK_STACK("unknown", &minimal_stack_args, GRPC_CLIENT_SUBCHANNEL, - "authority", "connected", NULL); + "authority", "message_decompress", "connected", NULL); errors += CHECK_STACK("unknown", &minimal_stack_args, GRPC_SERVER_CHANNEL, - "server", "connected", NULL); + "server", "message_decompress", "connected", NULL); errors += CHECK_STACK("chttp2", &minimal_stack_args, GRPC_CLIENT_DIRECT_CHANNEL, "authority", "http-client", "connected", NULL); diff --git a/test/core/end2end/cq_verifier.cc b/test/core/end2end/cq_verifier.cc index f7e64effcd4..3d45b6d647c 100644 --- a/test/core/end2end/cq_verifier.cc +++ b/test/core/end2end/cq_verifier.cc @@ -29,6 +29,8 @@ #include #include #include +#include "src/core/lib/compression/compression_internal.h" +#include "src/core/lib/compression/message_compress.h" #include "src/core/lib/gpr/string.h" #include "src/core/lib/surface/event_string.h" @@ -145,33 +147,25 @@ int raw_byte_buffer_eq_slice(grpc_byte_buffer* rbb, grpc_slice b) { } int byte_buffer_eq_slice(grpc_byte_buffer* bb, grpc_slice b) { - grpc_byte_buffer_reader reader; - grpc_byte_buffer* rbb; - int res; - - GPR_ASSERT(grpc_byte_buffer_reader_init(&reader, bb) && - "Couldn't init byte buffer reader"); - rbb = grpc_raw_byte_buffer_from_reader(&reader); - res = raw_byte_buffer_eq_slice(rbb, b); - grpc_byte_buffer_reader_destroy(&reader); - grpc_byte_buffer_destroy(rbb); - - return res; + if (bb->data.raw.compression > GRPC_COMPRESS_NONE) { + grpc_slice_buffer decompressed_buffer; + grpc_slice_buffer_init(&decompressed_buffer); + GPR_ASSERT(grpc_msg_decompress( + grpc_compression_algorithm_to_message_compression_algorithm( + bb->data.raw.compression), + &bb->data.raw.slice_buffer, &decompressed_buffer)); + grpc_byte_buffer* rbb = grpc_raw_byte_buffer_create( + decompressed_buffer.slices, decompressed_buffer.count); + int ret_val = raw_byte_buffer_eq_slice(rbb, b); + grpc_byte_buffer_destroy(rbb); + grpc_slice_buffer_destroy(&decompressed_buffer); + return ret_val; + } + return raw_byte_buffer_eq_slice(bb, b); } int byte_buffer_eq_string(grpc_byte_buffer* bb, const char* str) { - grpc_byte_buffer_reader reader; - grpc_byte_buffer* rbb; - int res; - - GPR_ASSERT(grpc_byte_buffer_reader_init(&reader, bb) && - "Couldn't init byte buffer reader"); - rbb = grpc_raw_byte_buffer_from_reader(&reader); - res = raw_byte_buffer_eq_slice(rbb, grpc_slice_from_copied_string(str)); - grpc_byte_buffer_reader_destroy(&reader); - grpc_byte_buffer_destroy(rbb); - - return res; + return byte_buffer_eq_slice(bb, grpc_slice_from_copied_string(str)); } static bool is_probably_integer(void* p) { return ((uintptr_t)p) < 1000000; } diff --git a/test/core/end2end/tests/compressed_payload.cc b/test/core/end2end/tests/compressed_payload.cc index 463c0fb2f79..6441c1c9633 100644 --- a/test/core/end2end/tests/compressed_payload.cc +++ b/test/core/end2end/tests/compressed_payload.cc @@ -491,6 +491,7 @@ static void request_with_payload_template_inner( cq_verify(cqv); GPR_ASSERT(response_payload_recv->type == GRPC_BB_RAW); + gpr_log(GPR_ERROR, "%d", decompress_in_core); GPR_ASSERT(byte_buffer_eq_string(response_payload_recv, response_str)); if (server_compression_level > GRPC_COMPRESS_LEVEL_NONE) { const grpc_compression_algorithm algo_for_server_level = diff --git a/test/core/surface/byte_buffer_reader_test.cc b/test/core/surface/byte_buffer_reader_test.cc index fc2654426d7..47d76f49277 100644 --- a/test/core/surface/byte_buffer_reader_test.cc +++ b/test/core/surface/byte_buffer_reader_test.cc @@ -25,7 +25,6 @@ #include #include -#include "src/core/lib/compression/message_compress.h" #include "src/core/lib/gprpp/thd.h" #include "src/core/lib/iomgr/exec_ctx.h" #include "test/core/util/test_config.h" @@ -168,75 +167,6 @@ static void test_peek_none_compressed_slice(void) { grpc_byte_buffer_destroy(buffer); } -static void test_read_corrupted_slice(void) { - grpc_slice slice; - grpc_byte_buffer* buffer; - grpc_byte_buffer_reader reader; - - LOG_TEST("test_read_corrupted_slice"); - slice = grpc_slice_from_copied_string("test"); - buffer = grpc_raw_byte_buffer_create(&slice, 1); - buffer->data.raw.compression = GRPC_COMPRESS_GZIP; /* lies! */ - grpc_slice_unref(slice); - GPR_ASSERT(!grpc_byte_buffer_reader_init(&reader, buffer)); - grpc_byte_buffer_destroy(buffer); -} - -static void read_compressed_slice(grpc_compression_algorithm algorithm, - size_t input_size) { - grpc_slice input_slice; - grpc_slice_buffer sliceb_in; - grpc_slice_buffer sliceb_out; - grpc_byte_buffer* buffer; - grpc_byte_buffer_reader reader; - grpc_slice read_slice; - size_t read_count = 0; - - grpc_slice_buffer_init(&sliceb_in); - grpc_slice_buffer_init(&sliceb_out); - - input_slice = grpc_slice_malloc(input_size); - memset(GRPC_SLICE_START_PTR(input_slice), 'a', input_size); - grpc_slice_buffer_add(&sliceb_in, input_slice); /* takes ownership */ - { - grpc_core::ExecCtx exec_ctx; - GPR_ASSERT(grpc_msg_compress( - - grpc_compression_algorithm_to_message_compression_algorithm(algorithm), - &sliceb_in, &sliceb_out)); - } - - buffer = grpc_raw_compressed_byte_buffer_create(sliceb_out.slices, - sliceb_out.count, algorithm); - GPR_ASSERT(grpc_byte_buffer_reader_init(&reader, buffer) && - "Couldn't init byte buffer reader"); - - while (grpc_byte_buffer_reader_next(&reader, &read_slice)) { - GPR_ASSERT(memcmp(GRPC_SLICE_START_PTR(read_slice), - GRPC_SLICE_START_PTR(input_slice) + read_count, - GRPC_SLICE_LENGTH(read_slice)) == 0); - read_count += GRPC_SLICE_LENGTH(read_slice); - grpc_slice_unref(read_slice); - } - GPR_ASSERT(read_count == input_size); - grpc_byte_buffer_reader_destroy(&reader); - grpc_byte_buffer_destroy(buffer); - grpc_slice_buffer_destroy(&sliceb_out); - grpc_slice_buffer_destroy(&sliceb_in); -} - -static void test_read_gzip_compressed_slice(void) { - const size_t INPUT_SIZE = 2048; - LOG_TEST("test_read_gzip_compressed_slice"); - read_compressed_slice(GRPC_COMPRESS_GZIP, INPUT_SIZE); -} - -static void test_read_deflate_compressed_slice(void) { - const size_t INPUT_SIZE = 2048; - LOG_TEST("test_read_deflate_compressed_slice"); - read_compressed_slice(GRPC_COMPRESS_DEFLATE, INPUT_SIZE); -} - static void test_byte_buffer_from_reader(void) { grpc_slice slice; grpc_byte_buffer *buffer, *buffer_from_reader; @@ -342,9 +272,6 @@ int main(int argc, char** argv) { test_peek_one_slice(); test_peek_one_slice_malloc(); test_peek_none_compressed_slice(); - test_read_gzip_compressed_slice(); - test_read_deflate_compressed_slice(); - test_read_corrupted_slice(); test_byte_buffer_from_reader(); test_byte_buffer_copy(); test_readall(); From f54891aff8841b7ccd4ad02bc720079a42b0ba3b Mon Sep 17 00:00:00 2001 From: Donna Dionne Date: Mon, 13 Apr 2020 18:11:10 -0700 Subject: [PATCH 460/758] Fixing a build error. --- .../ext/filters/client_channel/lb_policy/xds/xds_routing.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc b/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc index 40174672e96..473870eacac 100644 --- a/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc +++ b/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc @@ -215,7 +215,7 @@ class XdsRoutingLb : public LoadBalancingPolicy { XdsRoutingLb::PickResult XdsRoutingLb::RoutePicker::Pick(PickArgs args) { absl::string_view path; - for (const auto& p : *(args.initial_metadata)) { + for (const auto p : *(args.initial_metadata)) { if (p.first == ":path") { path = p.second; break; From b26724f327aa82b57138930d9b80218758bc4456 Mon Sep 17 00:00:00 2001 From: jeffreyqw <49655798+jeffreyqw@users.noreply.github.com> Date: Mon, 13 Apr 2020 20:14:12 -0700 Subject: [PATCH 461/758] PHP:Dockerfile grpc-centos Update Docker image: Centos7 with GCC5, PHP7.2 --- src/php/bin/build_all_docker_images.sh | 2 +- src/php/docker/README.md | 14 +++++++ src/php/docker/centos7/Dockerfile | 57 ++++++++++++++++++++++++++ 3 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 src/php/docker/centos7/Dockerfile diff --git a/src/php/bin/build_all_docker_images.sh b/src/php/bin/build_all_docker_images.sh index 3a644387173..09bb1d6e907 100755 --- a/src/php/bin/build_all_docker_images.sh +++ b/src/php/bin/build_all_docker_images.sh @@ -16,7 +16,7 @@ set -e cd $(dirname $0)/../../.. -ALL_IMAGES=( grpc-ext grpc-src alpine php5 php-src php-future php-zts +ALL_IMAGES=( grpc-ext grpc-src alpine centos7 php5 php-src php-future php-zts fork-support ) if [[ "$1" == "--cmds" ]]; then diff --git a/src/php/docker/README.md b/src/php/docker/README.md index ab5acf84f7d..3df7039b8ce 100644 --- a/src/php/docker/README.md +++ b/src/php/docker/README.md @@ -95,6 +95,20 @@ Run image: ```sh $ docker run -it --rm grpc-php/alpine ``` +### `centos7` + +This image builds the `grpc` extension against the GCC version in Centos7 base image. + +Build `centos7` docker image: +```sh +$ cd grpc +$ docker build -t grpc-gcc5/centos -f ./src/php/docker/centos7/Dockerfile . +``` + +Run image: +```sh +$ docker run -it --rm grpc-gcc5/centos +``` ### `php-src` diff --git a/src/php/docker/centos7/Dockerfile b/src/php/docker/centos7/Dockerfile new file mode 100644 index 00000000000..e6491a0cb38 --- /dev/null +++ b/src/php/docker/centos7/Dockerfile @@ -0,0 +1,57 @@ +# Copyright 2019 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +FROM centos:centos7 + +# Install PHP7.2 +RUN yum update -y && \ + yum install epel-release -y && \ + rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm && \ + rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm && \ + yum --enablerepo=remi-php72 install php -y && \ + yum-config-manager --enable remi-php72 && \ + yum install -y php-fpm php-pear make php-devel wget libmpc-devel mpfr-devel gmp-devel yum-utils && \ + yum clean all -y + +ARG MAKEFLAGS=-j8 + +WORKDIR /tmp + +# Easy way to install gcc version +# devtoolset-3-toolchain(GCC-4) +# devtoolset-4-toolchain(GCC-5) +# devtoolset-6-toolchain(GCC-6) +# devtoolset-7-toolchain(GCC-7) +# etc + +RUN yum install -y centos-release-scl && \ + yum install -y devtoolset-4-gcc* + +SHELL [ "/usr/bin/scl", "enable", "devtoolset-4"] + +# Install phpunit +RUN wget https://phar.phpunit.de/phpunit-5.7.27.phar && \ + mv phpunit-5.7.27.phar /usr/local/bin/phpunit && \ + chmod +x /usr/local/bin/phpunit + + +WORKDIR /github/grpc + +COPY . . + +RUN pear package && \ + find . -name grpc-*.tgz | xargs -I{} pecl install {} + + +CMD ["/github/grpc/src/php/bin/run_tests.sh", "--skip-persistent-channel-tests"] From 6ec6c24dc13bc0a87a76853475b19e380565a45e Mon Sep 17 00:00:00 2001 From: Donna Dionne Date: Mon, 13 Apr 2020 22:16:42 -0700 Subject: [PATCH 462/758] Fixing code review comments. --- .../ext/filters/client_channel/xds/xds_api.cc | 4 + test/cpp/end2end/test_service_impl.h | 168 +++++++++--------- test/cpp/end2end/xds_end2end_test.cc | 48 +++-- test/cpp/util/grpc_tool_test.cc | 7 +- 4 files changed, 110 insertions(+), 117 deletions(-) diff --git a/src/core/ext/filters/client_channel/xds/xds_api.cc b/src/core/ext/filters/client_channel/xds/xds_api.cc index 8a19d2b7dae..13d5b0bd4d2 100644 --- a/src/core/ext/filters/client_channel/xds/xds_api.cc +++ b/src/core/ext/filters/client_channel/xds/xds_api.cc @@ -1046,6 +1046,10 @@ grpc_error* RouteConfigParse( } rds_route.service = std::string(path_elements[0]); rds_route.method = std::string(path_elements[1]); + } else { + // TODO(donnadionne): We may change this behavior once we decide how to + // handle unsupported fields. + continue; } if (!envoy_api_v2_route_Route_has_route(route)) { return GRPC_ERROR_CREATE_FROM_STATIC_STRING( diff --git a/test/cpp/end2end/test_service_impl.h b/test/cpp/end2end/test_service_impl.h index 905f2cbea89..1fed3e55d61 100644 --- a/test/cpp/end2end/test_service_impl.h +++ b/test/cpp/end2end/test_service_impl.h @@ -57,92 +57,6 @@ typedef enum { CANCEL_AFTER_PROCESSING } ServerTryCancelRequestPhase; -namespace { - -// When echo_deadline is requested, deadline seen in the ServerContext is set in -// the response in seconds. -void MaybeEchoDeadline(experimental::ServerContextBase* context, - const EchoRequest* request, EchoResponse* response) { - if (request->has_param() && request->param().echo_deadline()) { - gpr_timespec deadline = gpr_inf_future(GPR_CLOCK_REALTIME); - if (context->deadline() != system_clock::time_point::max()) { - Timepoint2Timespec(context->deadline(), &deadline); - } - response->mutable_param()->set_request_deadline(deadline.tv_sec); - } -} - -void CheckServerAuthContext( - const experimental::ServerContextBase* context, - const grpc::string& expected_transport_security_type, - const grpc::string& expected_client_identity) { - std::shared_ptr auth_ctx = context->auth_context(); - std::vector tst = - auth_ctx->FindPropertyValues("transport_security_type"); - EXPECT_EQ(1u, tst.size()); - EXPECT_EQ(expected_transport_security_type, ToString(tst[0])); - if (expected_client_identity.empty()) { - EXPECT_TRUE(auth_ctx->GetPeerIdentityPropertyName().empty()); - EXPECT_TRUE(auth_ctx->GetPeerIdentity().empty()); - EXPECT_FALSE(auth_ctx->IsPeerAuthenticated()); - } else { - auto identity = auth_ctx->GetPeerIdentity(); - EXPECT_TRUE(auth_ctx->IsPeerAuthenticated()); - EXPECT_EQ(1u, identity.size()); - EXPECT_EQ(expected_client_identity, identity[0]); - } -} - -// Returns the number of pairs in metadata that exactly match the given -// key-value pair. Returns -1 if the pair wasn't found. -int MetadataMatchCount( - const std::multimap& metadata, - const grpc::string& key, const grpc::string& value) { - int count = 0; - for (const auto& metadatum : metadata) { - if (ToString(metadatum.first) == key && - ToString(metadatum.second) == value) { - count++; - } - } - return count; -} -} // namespace - -namespace { -int GetIntValueFromMetadataHelper( - const char* key, - const std::multimap& metadata, - int default_value) { - if (metadata.find(key) != metadata.end()) { - std::istringstream iss(ToString(metadata.find(key)->second)); - iss >> default_value; - gpr_log(GPR_INFO, "%s : %d", key, default_value); - } - - return default_value; -} - -int GetIntValueFromMetadata( - const char* key, - const std::multimap& metadata, - int default_value) { - return GetIntValueFromMetadataHelper(key, metadata, default_value); -} - -void ServerTryCancel(ServerContext* context) { - EXPECT_FALSE(context->IsCancelled()); - context->TryCancel(); - gpr_log(GPR_INFO, "Server called TryCancel() to cancel the request"); - // Now wait until it's really canceled - while (!context->IsCancelled()) { - gpr_sleep_until(gpr_time_add(gpr_now(GPR_CLOCK_REALTIME), - gpr_time_from_micros(1000, GPR_TIMESPAN))); - } -} - -} // namespace - class TestServiceSignaller { public: void ClientWaitUntilRpcStarted() { @@ -179,6 +93,87 @@ class TestMultipleServiceImpl : public RpcService { explicit TestMultipleServiceImpl(const grpc::string& host) : signal_client_(false), host_(new grpc::string(host)) {} + // When echo_deadline is requested, deadline seen in the ServerContext is set + // in the response in seconds. + void static MaybeEchoDeadline(experimental::ServerContextBase* context, + const EchoRequest* request, + EchoResponse* response) { + if (request->has_param() && request->param().echo_deadline()) { + gpr_timespec deadline = gpr_inf_future(GPR_CLOCK_REALTIME); + if (context->deadline() != system_clock::time_point::max()) { + Timepoint2Timespec(context->deadline(), &deadline); + } + response->mutable_param()->set_request_deadline(deadline.tv_sec); + } + } + + void static CheckServerAuthContext( + const experimental::ServerContextBase* context, + const grpc::string& expected_transport_security_type, + const grpc::string& expected_client_identity) { + std::shared_ptr auth_ctx = context->auth_context(); + std::vector tst = + auth_ctx->FindPropertyValues("transport_security_type"); + EXPECT_EQ(1u, tst.size()); + EXPECT_EQ(expected_transport_security_type, ToString(tst[0])); + if (expected_client_identity.empty()) { + EXPECT_TRUE(auth_ctx->GetPeerIdentityPropertyName().empty()); + EXPECT_TRUE(auth_ctx->GetPeerIdentity().empty()); + EXPECT_FALSE(auth_ctx->IsPeerAuthenticated()); + } else { + auto identity = auth_ctx->GetPeerIdentity(); + EXPECT_TRUE(auth_ctx->IsPeerAuthenticated()); + EXPECT_EQ(1u, identity.size()); + EXPECT_EQ(expected_client_identity, identity[0]); + } + } + + // Returns the number of pairs in metadata that exactly match the given + // key-value pair. Returns -1 if the pair wasn't found. + int static MetadataMatchCount( + const std::multimap& metadata, + const grpc::string& key, const grpc::string& value) { + int count = 0; + for (const auto& metadatum : metadata) { + if (ToString(metadatum.first) == key && + ToString(metadatum.second) == value) { + count++; + } + } + return count; + } + + int static GetIntValueFromMetadataHelper( + const char* key, + const std::multimap& metadata, + int default_value) { + if (metadata.find(key) != metadata.end()) { + std::istringstream iss(ToString(metadata.find(key)->second)); + iss >> default_value; + gpr_log(GPR_INFO, "%s : %d", key, default_value); + } + + return default_value; + } + + int static GetIntValueFromMetadata( + const char* key, + const std::multimap& metadata, + int default_value) { + return GetIntValueFromMetadataHelper(key, metadata, default_value); + } + + void static ServerTryCancel(ServerContext* context) { + EXPECT_FALSE(context->IsCancelled()); + context->TryCancel(); + gpr_log(GPR_INFO, "Server called TryCancel() to cancel the request"); + // Now wait until it's really canceled + while (!context->IsCancelled()) { + gpr_sleep_until(gpr_time_add(gpr_now(GPR_CLOCK_REALTIME), + gpr_time_from_micros(1000, GPR_TIMESPAN))); + } + } + Status Echo(ServerContext* context, const EchoRequest* request, EchoResponse* response) { if (request->has_param() && @@ -311,6 +306,7 @@ class TestMultipleServiceImpl : public RpcService { } // Unimplemented is left unimplemented to test the returned error. + Status RequestStream(ServerContext* context, ServerReader* reader, EchoResponse* response) { diff --git a/test/cpp/end2end/xds_end2end_test.cc b/test/cpp/end2end/xds_end2end_test.cc index f08702f623e..0b1a474d265 100644 --- a/test/cpp/end2end/xds_end2end_test.cc +++ b/test/cpp/end2end/xds_end2end_test.cc @@ -264,12 +264,12 @@ class BackendServiceImpl Status Echo1(ServerContext* context, const EchoRequest* request, EchoResponse* response) override { - return (Echo(context, request, response)); + return Echo(context, request, response); } Status Echo2(ServerContext* context, const EchoRequest* request, EchoResponse* response) override { - return (Echo(context, request, response)); + return Echo(context, request, response); } void Start() {} @@ -2197,10 +2197,10 @@ TEST_P(LdsTest, RouteMatchHasNonemptyPrefix) { TEST_P(LdsTest, RouteMatchHasEmptyPath) { RouteConfiguration route_config = balancers_[0]->ads_service()->default_route_config(); - route_config.mutable_virtual_hosts(0) - ->mutable_routes(0) - ->mutable_match() - ->set_path(""); + auto* route1 = route_config.mutable_virtual_hosts(0)->mutable_routes(0); + route1->mutable_match()->set_path(""); + auto* default_route = route_config.mutable_virtual_hosts(0)->add_routes(); + default_route->mutable_match()->set_prefix(""); balancers_[0]->ads_service()->SetLdsResource( AdsServiceImpl::BuildListener(route_config), kDefaultResourceName); SetNextResolution({}); @@ -2291,20 +2291,15 @@ TEST_P(LdsTest, XdsRoutingPathMatching) { Cluster new_cluster2 = balancers_[0]->ads_service()->default_cluster(); new_cluster2.set_name(kNewCluster2Name); balancers_[0]->ads_service()->SetCdsResource(new_cluster2, kNewCluster2Name); - // Change RDS resource to set up prefix matching to direct traffic to the - // second new cluster. + // Populating Route Configurations for LDS. RouteConfiguration new_route_config = balancers_[0]->ads_service()->default_route_config(); - auto* mismatched_route1 = - new_route_config.mutable_virtual_hosts(0)->mutable_routes(0); - mismatched_route1->mutable_match()->set_path( - "/grpc.testing.EchoTest1Service/Echo1"); - mismatched_route1->mutable_route()->set_cluster(kNewCluster1Name); - auto* mismatched_route2 = - new_route_config.mutable_virtual_hosts(0)->add_routes(); - mismatched_route2->mutable_match()->set_path( - "/grpc.testing.EchoTest2Service/Echo2"); - mismatched_route2->mutable_route()->set_cluster(kNewCluster2Name); + auto* route1 = new_route_config.mutable_virtual_hosts(0)->mutable_routes(0); + route1->mutable_match()->set_path("/grpc.testing.EchoTest1Service/Echo1"); + route1->mutable_route()->set_cluster(kNewCluster1Name); + auto* route2 = new_route_config.mutable_virtual_hosts(0)->add_routes(); + route2->mutable_match()->set_path("/grpc.testing.EchoTest2Service/Echo2"); + route2->mutable_route()->set_cluster(kNewCluster2Name); auto* default_route = new_route_config.mutable_virtual_hosts(0)->add_routes(); default_route->mutable_match()->set_prefix(""); default_route->mutable_route()->set_cluster(kDefaultResourceName); @@ -2367,18 +2362,15 @@ TEST_P(LdsTest, XdsRoutingPrefixMatching) { Cluster new_cluster2 = balancers_[0]->ads_service()->default_cluster(); new_cluster2.set_name(kNewCluster2Name); balancers_[0]->ads_service()->SetCdsResource(new_cluster2, kNewCluster2Name); - // Change RDS resource to set up prefix matching to direct traffic to the - // second new cluster. + // Populating Route Configurations for LDS. RouteConfiguration new_route_config = balancers_[0]->ads_service()->default_route_config(); - auto* mismatched_route = - new_route_config.mutable_virtual_hosts(0)->mutable_routes(0); - mismatched_route->mutable_match()->set_prefix( - "/grpc.testing.EchoTest1Service"); - mismatched_route->mutable_route()->set_cluster(kNewCluster1Name); - auto* matched_route = new_route_config.mutable_virtual_hosts(0)->add_routes(); - matched_route->mutable_match()->set_prefix("/grpc.testing.EchoTest2Service"); - matched_route->mutable_route()->set_cluster(kNewCluster2Name); + auto* route1 = new_route_config.mutable_virtual_hosts(0)->mutable_routes(0); + route1->mutable_match()->set_prefix("/grpc.testing.EchoTest1Service"); + route1->mutable_route()->set_cluster(kNewCluster1Name); + auto* route2 = new_route_config.mutable_virtual_hosts(0)->add_routes(); + route2->mutable_match()->set_prefix("/grpc.testing.EchoTest2Service"); + route2->mutable_route()->set_cluster(kNewCluster2Name); auto* default_route = new_route_config.mutable_virtual_hosts(0)->add_routes(); default_route->mutable_match()->set_prefix(""); default_route->mutable_route()->set_cluster(kDefaultResourceName); diff --git a/test/cpp/util/grpc_tool_test.cc b/test/cpp/util/grpc_tool_test.cc index d8ce3304560..b353033f874 100644 --- a/test/cpp/util/grpc_tool_test.cc +++ b/test/cpp/util/grpc_tool_test.cc @@ -1107,9 +1107,10 @@ TEST_F(GrpcToolTest, CallCommandWithMetadata) { ShutdownServer(); } -/*TEST_F(GrpcToolTest, CallCommandWithBadMetadata) { +TEST_F(GrpcToolTest, CallCommandWithBadMetadata) { // Test input "grpc_cli call localhost:10000 Echo "message: 'Hello'" - const char* argv[] = {"grpc_cli", "call", "localhost:10000", "Echo", + const char* argv[] = {"grpc_cli", "call", "localhost:10000", + "grpc.testing.EchoTestService.Echo", "message: 'Hello'"}; FLAGS_protofiles = "src/proto/grpc/testing/echo.proto"; char* test_srcdir = gpr_getenv("TEST_SRCDIR"); @@ -1143,7 +1144,7 @@ TEST_F(GrpcToolTest, CallCommandWithMetadata) { FLAGS_protofiles = ""; gpr_free(test_srcdir); -}*/ +} TEST_F(GrpcToolTest, ListCommand_OverrideSslHostName) { const grpc::string server_address = SetUpServer(true); From 8776c85f39f355bb1743ec4fc060578e2329bc34 Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Tue, 14 Apr 2020 00:03:11 -0700 Subject: [PATCH 463/758] Fix refcounting for WatcherWrapper --- src/core/ext/filters/client_channel/client_channel.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/ext/filters/client_channel/client_channel.cc b/src/core/ext/filters/client_channel/client_channel.cc index 1fcc5302760..aea8e00a501 100644 --- a/src/core/ext/filters/client_channel/client_channel.cc +++ b/src/core/ext/filters/client_channel/client_channel.cc @@ -1025,7 +1025,7 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface { "subchannel %p; hopping into work_serializer", parent_->chand_, parent_.get(), parent_->subchannel_); } - Ref(); // ref owned by lambda + Ref().release(); // ref owned by lambda parent_->chand_->work_serializer_->Run( [this]() { ApplyUpdateInControlPlaneWorkSerializer(); From 019b2069268375bf386333ad7de2251ebd2f538f Mon Sep 17 00:00:00 2001 From: Donna Dionne Date: Tue, 14 Apr 2020 00:04:31 -0700 Subject: [PATCH 464/758] Fixing CR comments and build errors. --- test/cpp/end2end/test_service_impl.h | 162 +++++++++++++-------------- test/cpp/end2end/xds_end2end_test.cc | 107 ++++++------------ 2 files changed, 114 insertions(+), 155 deletions(-) diff --git a/test/cpp/end2end/test_service_impl.h b/test/cpp/end2end/test_service_impl.h index 1fed3e55d61..4e12201bacd 100644 --- a/test/cpp/end2end/test_service_impl.h +++ b/test/cpp/end2end/test_service_impl.h @@ -57,6 +57,86 @@ typedef enum { CANCEL_AFTER_PROCESSING } ServerTryCancelRequestPhase; +// When echo_deadline is requested, deadline seen in the ServerContext is set in +// the response in seconds. +void MaybeEchoDeadline(experimental::ServerContextBase* context, + const EchoRequest* request, EchoResponse* response) { + if (request->has_param() && request->param().echo_deadline()) { + gpr_timespec deadline = gpr_inf_future(GPR_CLOCK_REALTIME); + if (context->deadline() != system_clock::time_point::max()) { + Timepoint2Timespec(context->deadline(), &deadline); + } + response->mutable_param()->set_request_deadline(deadline.tv_sec); + } +} + +void CheckServerAuthContext( + const experimental::ServerContextBase* context, + const grpc::string& expected_transport_security_type, + const grpc::string& expected_client_identity) { + std::shared_ptr auth_ctx = context->auth_context(); + std::vector tst = + auth_ctx->FindPropertyValues("transport_security_type"); + EXPECT_EQ(1u, tst.size()); + EXPECT_EQ(expected_transport_security_type, ToString(tst[0])); + if (expected_client_identity.empty()) { + EXPECT_TRUE(auth_ctx->GetPeerIdentityPropertyName().empty()); + EXPECT_TRUE(auth_ctx->GetPeerIdentity().empty()); + EXPECT_FALSE(auth_ctx->IsPeerAuthenticated()); + } else { + auto identity = auth_ctx->GetPeerIdentity(); + EXPECT_TRUE(auth_ctx->IsPeerAuthenticated()); + EXPECT_EQ(1u, identity.size()); + EXPECT_EQ(expected_client_identity, identity[0]); + } +} + +// Returns the number of pairs in metadata that exactly match the given +// key-value pair. Returns -1 if the pair wasn't found. +int MetadataMatchCount( + const std::multimap& metadata, + const grpc::string& key, const grpc::string& value) { + int count = 0; + for (const auto& metadatum : metadata) { + if (ToString(metadatum.first) == key && + ToString(metadatum.second) == value) { + count++; + } + } + return count; +} + +int GetIntValueFromMetadataHelper( + const char* key, + const std::multimap& metadata, + int default_value) { + if (metadata.find(key) != metadata.end()) { + std::istringstream iss(ToString(metadata.find(key)->second)); + iss >> default_value; + gpr_log(GPR_INFO, "%s : %d", key, default_value); + } + + return default_value; +} + +int GetIntValueFromMetadata( + const char* key, + const std::multimap& metadata, + int default_value) { + return GetIntValueFromMetadataHelper(key, metadata, default_value); +} + +void ServerTryCancel(ServerContext* context) { + EXPECT_FALSE(context->IsCancelled()); + context->TryCancel(); + gpr_log(GPR_INFO, "Server called TryCancel() to cancel the request"); + // Now wait until it's really canceled + while (!context->IsCancelled()) { + gpr_sleep_until(gpr_time_add(gpr_now(GPR_CLOCK_REALTIME), + gpr_time_from_micros(1000, GPR_TIMESPAN))); + } +} + class TestServiceSignaller { public: void ClientWaitUntilRpcStarted() { @@ -93,87 +173,6 @@ class TestMultipleServiceImpl : public RpcService { explicit TestMultipleServiceImpl(const grpc::string& host) : signal_client_(false), host_(new grpc::string(host)) {} - // When echo_deadline is requested, deadline seen in the ServerContext is set - // in the response in seconds. - void static MaybeEchoDeadline(experimental::ServerContextBase* context, - const EchoRequest* request, - EchoResponse* response) { - if (request->has_param() && request->param().echo_deadline()) { - gpr_timespec deadline = gpr_inf_future(GPR_CLOCK_REALTIME); - if (context->deadline() != system_clock::time_point::max()) { - Timepoint2Timespec(context->deadline(), &deadline); - } - response->mutable_param()->set_request_deadline(deadline.tv_sec); - } - } - - void static CheckServerAuthContext( - const experimental::ServerContextBase* context, - const grpc::string& expected_transport_security_type, - const grpc::string& expected_client_identity) { - std::shared_ptr auth_ctx = context->auth_context(); - std::vector tst = - auth_ctx->FindPropertyValues("transport_security_type"); - EXPECT_EQ(1u, tst.size()); - EXPECT_EQ(expected_transport_security_type, ToString(tst[0])); - if (expected_client_identity.empty()) { - EXPECT_TRUE(auth_ctx->GetPeerIdentityPropertyName().empty()); - EXPECT_TRUE(auth_ctx->GetPeerIdentity().empty()); - EXPECT_FALSE(auth_ctx->IsPeerAuthenticated()); - } else { - auto identity = auth_ctx->GetPeerIdentity(); - EXPECT_TRUE(auth_ctx->IsPeerAuthenticated()); - EXPECT_EQ(1u, identity.size()); - EXPECT_EQ(expected_client_identity, identity[0]); - } - } - - // Returns the number of pairs in metadata that exactly match the given - // key-value pair. Returns -1 if the pair wasn't found. - int static MetadataMatchCount( - const std::multimap& metadata, - const grpc::string& key, const grpc::string& value) { - int count = 0; - for (const auto& metadatum : metadata) { - if (ToString(metadatum.first) == key && - ToString(metadatum.second) == value) { - count++; - } - } - return count; - } - - int static GetIntValueFromMetadataHelper( - const char* key, - const std::multimap& metadata, - int default_value) { - if (metadata.find(key) != metadata.end()) { - std::istringstream iss(ToString(metadata.find(key)->second)); - iss >> default_value; - gpr_log(GPR_INFO, "%s : %d", key, default_value); - } - - return default_value; - } - - int static GetIntValueFromMetadata( - const char* key, - const std::multimap& metadata, - int default_value) { - return GetIntValueFromMetadataHelper(key, metadata, default_value); - } - - void static ServerTryCancel(ServerContext* context) { - EXPECT_FALSE(context->IsCancelled()); - context->TryCancel(); - gpr_log(GPR_INFO, "Server called TryCancel() to cancel the request"); - // Now wait until it's really canceled - while (!context->IsCancelled()) { - gpr_sleep_until(gpr_time_add(gpr_now(GPR_CLOCK_REALTIME), - gpr_time_from_micros(1000, GPR_TIMESPAN))); - } - } - Status Echo(ServerContext* context, const EchoRequest* request, EchoResponse* response) { if (request->has_param() && @@ -306,7 +305,6 @@ class TestMultipleServiceImpl : public RpcService { } // Unimplemented is left unimplemented to test the returned error. - Status RequestStream(ServerContext* context, ServerReader* reader, EchoResponse* response) { diff --git a/test/cpp/end2end/xds_end2end_test.cc b/test/cpp/end2end/xds_end2end_test.cc index 0b1a474d265..204df6f8687 100644 --- a/test/cpp/end2end/xds_end2end_test.cc +++ b/test/cpp/end2end/xds_end2end_test.cc @@ -1363,7 +1363,8 @@ class XdsEnd2endTest : public ::testing::TestWithParam { return backend_ports; } - Status SendRpc(EchoResponse* response = nullptr, int timeout_ms = 1000, + Status SendRpc(const string& method_name = "Echo", + EchoResponse* response = nullptr, int timeout_ms = 1000, bool wait_for_ready = false, bool server_fail = false) { const bool local_response = (response == nullptr); if (local_response) response = new EchoResponse; @@ -1376,44 +1377,26 @@ class XdsEnd2endTest : public ::testing::TestWithParam { ClientContext context; context.set_deadline(grpc_timeout_milliseconds_to_deadline(timeout_ms)); if (wait_for_ready) context.set_wait_for_ready(true); - Status status = stub_->Echo(&context, request, response); - if (local_response) delete response; - return status; - } - - Status SendEcho1Rpc(EchoResponse* response = nullptr, int timeout_ms = 1000, - bool wait_for_ready = false) { - const bool local_response = (response == nullptr); - if (local_response) response = new EchoResponse; - EchoRequest request; - request.set_message(kRequestMessage_); - ClientContext context; - context.set_deadline(grpc_timeout_milliseconds_to_deadline(timeout_ms)); - if (wait_for_ready) context.set_wait_for_ready(true); - Status status = stub1_->Echo1(&context, request, response); - if (local_response) delete response; - return status; - } - - Status SendEcho2Rpc(EchoResponse* response = nullptr, int timeout_ms = 1000, - bool wait_for_ready = false) { - const bool local_response = (response == nullptr); - if (local_response) response = new EchoResponse; - EchoRequest request; - request.set_message(kRequestMessage_); - ClientContext context; - context.set_deadline(grpc_timeout_milliseconds_to_deadline(timeout_ms)); - if (wait_for_ready) context.set_wait_for_ready(true); - Status status = stub2_->Echo2(&context, request, response); + Status status; + if (method_name == "Echo") { + status = stub_->Echo(&context, request, response); + } else if (method_name == "Echo1") { + status = stub1_->Echo1(&context, request, response); + } else if (method_name == "Echo2") { + status = stub2_->Echo2(&context, request, response); + } if (local_response) delete response; return status; } - void CheckRpcSendOk(const size_t times = 1, const int timeout_ms = 1000, + void CheckRpcSendOk(const size_t times = 1, + const string& method_name = "Echo", + const int timeout_ms = 1000, bool wait_for_ready = false) { for (size_t i = 0; i < times; ++i) { EchoResponse response; - const Status status = SendRpc(&response, timeout_ms, wait_for_ready); + const Status status = + SendRpc(method_name, &response, timeout_ms, wait_for_ready); EXPECT_TRUE(status.ok()) << "code=" << status.error_code() << " message=" << status.error_message(); EXPECT_EQ(response.message(), kRequestMessage_); @@ -1422,33 +1405,11 @@ class XdsEnd2endTest : public ::testing::TestWithParam { void CheckRpcSendFailure(const size_t times = 1, bool server_fail = false) { for (size_t i = 0; i < times; ++i) { - const Status status = SendRpc(nullptr, 1000, false, server_fail); + const Status status = SendRpc("Echo", nullptr, 1000, false, server_fail); EXPECT_FALSE(status.ok()); } } - void CheckEcho1RpcSendOk(const size_t times = 1, const int timeout_ms = 1000, - bool wait_for_ready = false) { - for (size_t i = 0; i < times; ++i) { - EchoResponse response; - const Status status = SendEcho1Rpc(&response, timeout_ms, wait_for_ready); - EXPECT_TRUE(status.ok()) << "code=" << status.error_code() - << " message=" << status.error_message(); - EXPECT_EQ(response.message(), kRequestMessage_); - } - } - - void CheckEcho2RpcSendOk(const size_t times = 1, const int timeout_ms = 1000, - bool wait_for_ready = false) { - for (size_t i = 0; i < times; ++i) { - EchoResponse response; - const Status status = SendEcho2Rpc(&response, timeout_ms, wait_for_ready); - EXPECT_TRUE(status.ok()) << "code=" << status.error_code() - << " message=" << status.error_message(); - EXPECT_EQ(response.message(), kRequestMessage_); - } - } - public: // This method could benefit test subclasses; to make it accessible // via bind with a qualified name, it needs to be public. @@ -1738,7 +1699,7 @@ TEST_P(BasicTest, InitiallyEmptyServerlist) { kDefaultResourceName)); const auto t0 = system_clock::now(); // Client will block: LB will initially send empty serverlist. - CheckRpcSendOk(1, kCallDeadlineMs, true /* wait_for_ready */); + CheckRpcSendOk(1, "Echo", kCallDeadlineMs, true /* wait_for_ready */); const auto ellapsed_ms = std::chrono::duration_cast( system_clock::now() - t0); @@ -1786,7 +1747,7 @@ TEST_P(BasicTest, BackendsRestart) { CheckRpcSendFailure(); // Restart all backends. RPCs should start succeeding again. StartAllBackends(); - CheckRpcSendOk(1 /* times */, 2000 /* timeout_ms */, + CheckRpcSendOk(1 /* times */, "Echo", 2000 /* timeout_ms */, true /* wait_for_ready */); } @@ -2307,9 +2268,9 @@ TEST_P(LdsTest, XdsRoutingPathMatching) { balancers_[0]->ads_service()->BuildListener(new_route_config); balancers_[0]->ads_service()->SetLdsResource(listener, kDefaultResourceName); WaitForAllBackends(0, 2); - CheckRpcSendOk(kNumEchoRpcs, 1000, true); - CheckEcho1RpcSendOk(kNumEcho1Rpcs, 1000, true); - CheckEcho2RpcSendOk(kNumEcho2Rpcs, 1000, true); + CheckRpcSendOk(kNumEchoRpcs, "Echo", 1000, true); + CheckRpcSendOk(kNumEcho1Rpcs, "Echo1", 1000, true); + CheckRpcSendOk(kNumEcho2Rpcs, "Echo2", 1000, true); // Make sure RPCs all go to the correct backend. for (size_t i = 0; i < 2; ++i) { EXPECT_EQ(kNumEchoRpcs / 2, @@ -2378,9 +2339,9 @@ TEST_P(LdsTest, XdsRoutingPrefixMatching) { balancers_[0]->ads_service()->BuildListener(new_route_config); balancers_[0]->ads_service()->SetLdsResource(listener, kDefaultResourceName); WaitForAllBackends(0, 2); - CheckRpcSendOk(kNumEchoRpcs, 1000, true); - CheckEcho1RpcSendOk(kNumEcho1Rpcs, 1000, true); - CheckEcho2RpcSendOk(kNumEcho2Rpcs, 1000, true); + CheckRpcSendOk(kNumEchoRpcs, "Echo", 1000, true); + CheckRpcSendOk(kNumEcho1Rpcs, "Echo1", 1000, true); + CheckRpcSendOk(kNumEcho2Rpcs, "Echo2", 1000, true); // Make sure RPCs all go to the correct backend. for (size_t i = 0; i < 2; ++i) { EXPECT_EQ(kNumEchoRpcs / 2, @@ -3090,7 +3051,7 @@ TEST_P(DropTest, Vanilla) { size_t num_drops = 0; for (size_t i = 0; i < kNumRpcs; ++i) { EchoResponse response; - const Status status = SendRpc(&response); + const Status status = SendRpc("Echo", &response); if (!status.ok() && status.error_message() == "Call dropped by load balancing policy") { ++num_drops; @@ -3130,7 +3091,7 @@ TEST_P(DropTest, DropPerHundred) { size_t num_drops = 0; for (size_t i = 0; i < kNumRpcs; ++i) { EchoResponse response; - const Status status = SendRpc(&response); + const Status status = SendRpc("Echo", &response); if (!status.ok() && status.error_message() == "Call dropped by load balancing policy") { ++num_drops; @@ -3169,7 +3130,7 @@ TEST_P(DropTest, DropPerTenThousand) { size_t num_drops = 0; for (size_t i = 0; i < kNumRpcs; ++i) { EchoResponse response; - const Status status = SendRpc(&response); + const Status status = SendRpc("Echo", &response); if (!status.ok() && status.error_message() == "Call dropped by load balancing policy") { ++num_drops; @@ -3212,7 +3173,7 @@ TEST_P(DropTest, Update) { gpr_log(GPR_INFO, "========= BEFORE FIRST BATCH =========="); for (size_t i = 0; i < kNumRpcs; ++i) { EchoResponse response; - const Status status = SendRpc(&response); + const Status status = SendRpc("Echo", &response); if (!status.ok() && status.error_message() == "Call dropped by load balancing policy") { ++num_drops; @@ -3244,7 +3205,7 @@ TEST_P(DropTest, Update) { size_t num_rpcs = kNumRpcs; while (seen_drop_rate < kDropRateThreshold) { EchoResponse response; - const Status status = SendRpc(&response); + const Status status = SendRpc("Echo", &response); ++num_rpcs; if (!status.ok() && status.error_message() == "Call dropped by load balancing policy") { @@ -3261,7 +3222,7 @@ TEST_P(DropTest, Update) { gpr_log(GPR_INFO, "========= BEFORE SECOND BATCH =========="); for (size_t i = 0; i < kNumRpcs; ++i) { EchoResponse response; - const Status status = SendRpc(&response); + const Status status = SendRpc("Echo", &response); if (!status.ok() && status.error_message() == "Call dropped by load balancing policy") { ++num_drops; @@ -3298,7 +3259,7 @@ TEST_P(DropTest, DropAll) { // Send kNumRpcs RPCs and all of them are dropped. for (size_t i = 0; i < kNumRpcs; ++i) { EchoResponse response; - const Status status = SendRpc(&response); + const Status status = SendRpc("Echo", &response); EXPECT_EQ(status.error_code(), StatusCode::UNAVAILABLE); EXPECT_EQ(status.error_message(), "Call dropped by load balancing policy"); } @@ -3441,7 +3402,7 @@ TEST_P(FallbackTest, FallbackEarlyWhenBalancerChannelFails) { SetNextResolutionForLbChannel({g_port_saver->GetPort()}); // Send RPC with deadline less than the fallback timeout and make sure it // succeeds. - CheckRpcSendOk(/* times */ 1, /* timeout_ms */ 1000, + CheckRpcSendOk(/* times */ 1, "Echo", /* timeout_ms */ 1000, /* wait_for_ready */ false); } @@ -3456,7 +3417,7 @@ TEST_P(FallbackTest, FallbackEarlyWhenBalancerCallFails) { balancers_[0]->ads_service()->NotifyDoneWithAdsCall(); // Send RPC with deadline less than the fallback timeout and make sure it // succeeds. - CheckRpcSendOk(/* times */ 1, /* timeout_ms */ 1000, + CheckRpcSendOk(/* times */ 1, "Echo", /* timeout_ms */ 1000, /* wait_for_ready */ false); } @@ -3928,7 +3889,7 @@ TEST_P(ClientLoadReportingWithDropTest, Vanilla) { // Send kNumRpcs RPCs and count the drops. for (size_t i = 0; i < kNumRpcs; ++i) { EchoResponse response; - const Status status = SendRpc(&response); + const Status status = SendRpc("Echo", &response); if (!status.ok() && status.error_message() == "Call dropped by load balancing policy") { ++num_drops; From 0ac1f04ecc145c8380bc3db05877800a317fe9b7 Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Fri, 6 Sep 2019 06:02:32 -0400 Subject: [PATCH 465/758] remove g-stands-for from user agent string --- src/core/ext/filters/http/client/http_client_filter.cc | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/core/ext/filters/http/client/http_client_filter.cc b/src/core/ext/filters/http/client/http_client_filter.cc index b1956c344dc..d690d6f758c 100644 --- a/src/core/ext/filters/http/client/http_client_filter.cc +++ b/src/core/ext/filters/http/client/http_client_filter.cc @@ -538,9 +538,8 @@ static grpc_core::ManagedMemorySlice user_agent_from_args( } } - gpr_asprintf(&tmp, "%sgrpc-c/%s (%s; %s; %s)", is_first ? "" : " ", - grpc_version_string(), GPR_PLATFORM_STRING, transport_name, - grpc_g_stands_for()); + gpr_asprintf(&tmp, "%sgrpc-c/%s (%s; %s)", is_first ? "" : " ", + grpc_version_string(), GPR_PLATFORM_STRING, transport_name); is_first = 0; gpr_strvec_add(&v, tmp); From 9417b28bca22a6f86afc5cb1d22e71224e76f047 Mon Sep 17 00:00:00 2001 From: Donna Dionne Date: Tue, 14 Apr 2020 00:44:47 -0700 Subject: [PATCH 466/758] Fixing build issues. --- test/cpp/end2end/test_service_impl.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/cpp/end2end/test_service_impl.h b/test/cpp/end2end/test_service_impl.h index 4e12201bacd..88416853d54 100644 --- a/test/cpp/end2end/test_service_impl.h +++ b/test/cpp/end2end/test_service_impl.h @@ -57,6 +57,7 @@ typedef enum { CANCEL_AFTER_PROCESSING } ServerTryCancelRequestPhase; +namespace { // When echo_deadline is requested, deadline seen in the ServerContext is set in // the response in seconds. void MaybeEchoDeadline(experimental::ServerContextBase* context, @@ -136,6 +137,7 @@ void ServerTryCancel(ServerContext* context) { gpr_time_from_micros(1000, GPR_TIMESPAN))); } } +} // namespace class TestServiceSignaller { public: From 921147d1aa3ba4e0edd2dcf36623868022ccd487 Mon Sep 17 00:00:00 2001 From: Donna Dionne Date: Tue, 14 Apr 2020 01:02:57 -0700 Subject: [PATCH 467/758] clang change --- test/cpp/end2end/test_service_impl.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/cpp/end2end/test_service_impl.h b/test/cpp/end2end/test_service_impl.h index 88416853d54..429ead3eb0b 100644 --- a/test/cpp/end2end/test_service_impl.h +++ b/test/cpp/end2end/test_service_impl.h @@ -137,7 +137,7 @@ void ServerTryCancel(ServerContext* context) { gpr_time_from_micros(1000, GPR_TIMESPAN))); } } -} // namespace +} // namespace class TestServiceSignaller { public: From d7a62868c8704e11fd13ad92bfb28e596c668568 Mon Sep 17 00:00:00 2001 From: "Mark D. Roth" Date: Tue, 14 Apr 2020 09:04:09 -0700 Subject: [PATCH 468/758] Mark client_channel_stress_test as manual. --- test/cpp/client/BUILD | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/test/cpp/client/BUILD b/test/cpp/client/BUILD index 18e9ce4973f..ce0f6d39f9f 100644 --- a/test/cpp/client/BUILD +++ b/test/cpp/client/BUILD @@ -35,18 +35,16 @@ grpc_cc_test( grpc_cc_test( name = "client_channel_stress_test", srcs = ["client_channel_stress_test.cc"], - flaky = True, # TODO(b/153136407) # TODO(jtattermusch): test fails frequently on Win RBE, but passes locally # reenable the tests once it works reliably on Win RBE. - # TODO(roth): Test disabled on msan and tsan due to variable - # duration problem triggered by https://github.com/grpc/grpc/pull/22481. - # Re-enable once the problem is diagnosed and fixed. Tracked - # internally in b/153136407. + # TODO(roth): Test marked as manual for now due to variable duration + # problem triggered by https://github.com/grpc/grpc/pull/22481. + # Once we figure out the problem, either re-enable or just decide to + # remove this test. Tracked internally in b/153136407. tags = [ + "manual", "no_test_android", # fails on android due to "Too many open files". "no_windows", - "nomsan", - "notsan", ], deps = [ "//:gpr", From e8d47d31de4c7a818b437a60013e80d67f0ea0ac Mon Sep 17 00:00:00 2001 From: ZhenLian Date: Wed, 8 Apr 2020 21:35:13 -0700 Subject: [PATCH 469/758] [3/n] Avoid using hardcoded test credentials --- test/core/end2end/fixtures/h2_oauth2.cc | 2 - test/core/end2end/fixtures/h2_ssl.cc | 3 +- .../end2end/fixtures/h2_ssl_cred_reload.cc | 51 +++++++------- test/core/end2end/fixtures/h2_ssl_proxy.cc | 62 +++++++++------- test/core/end2end/fixtures/h2_tls.cc | 70 ++++++++++++------- test/core/end2end/generate_tests.bzl | 4 -- 6 files changed, 107 insertions(+), 85 deletions(-) diff --git a/test/core/end2end/fixtures/h2_oauth2.cc b/test/core/end2end/fixtures/h2_oauth2.cc index 22f85a2feea..13a9e1c483b 100644 --- a/test/core/end2end/fixtures/h2_oauth2.cc +++ b/test/core/end2end/fixtures/h2_oauth2.cc @@ -31,8 +31,6 @@ #include "test/core/util/test_config.h" #define CA_CERT_PATH "src/core/tsi/test_creds/ca.pem" -#define CLIENT_CERT_PATH "src/core/tsi/test_creds/client.pem" -#define CLIENT_KEY_PATH "src/core/tsi/test_creds/client.key" #define SERVER_CERT_PATH "src/core/tsi/test_creds/server1.pem" #define SERVER_KEY_PATH "src/core/tsi/test_creds/server1.key" diff --git a/test/core/end2end/fixtures/h2_ssl.cc b/test/core/end2end/fixtures/h2_ssl.cc index 1e46486dd5e..9cb9aaf881a 100644 --- a/test/core/end2end/fixtures/h2_ssl.cc +++ b/test/core/end2end/fixtures/h2_ssl.cc @@ -31,9 +31,8 @@ #include "test/core/end2end/end2end_tests.h" #include "test/core/util/port.h" #include "test/core/util/test_config.h" + #define CA_CERT_PATH "src/core/tsi/test_creds/ca.pem" -#define CLIENT_CERT_PATH "src/core/tsi/test_creds/client.pem" -#define CLIENT_KEY_PATH "src/core/tsi/test_creds/client.key" #define SERVER_CERT_PATH "src/core/tsi/test_creds/server1.pem" #define SERVER_KEY_PATH "src/core/tsi/test_creds/server1.key" diff --git a/test/core/end2end/fixtures/h2_ssl_cred_reload.cc b/test/core/end2end/fixtures/h2_ssl_cred_reload.cc index 97600990230..589f2fd3d92 100644 --- a/test/core/end2end/fixtures/h2_ssl_cred_reload.cc +++ b/test/core/end2end/fixtures/h2_ssl_cred_reload.cc @@ -16,24 +16,26 @@ * */ -#include "test/core/end2end/end2end_tests.h" - -#include -#include - #include #include +#include +#include #include "src/core/lib/channel/channel_args.h" #include "src/core/lib/gpr/string.h" #include "src/core/lib/gpr/tmpfile.h" #include "src/core/lib/gprpp/host_port.h" +#include "src/core/lib/iomgr/load_file.h" #include "src/core/lib/security/credentials/credentials.h" #include "src/core/lib/security/security_connector/ssl_utils_config.h" -#include "test/core/end2end/data/ssl_test_data.h" +#include "test/core/end2end/end2end_tests.h" #include "test/core/util/port.h" #include "test/core/util/test_config.h" +#define CA_CERT_PATH "src/core/tsi/test_creds/ca.pem" +#define SERVER_CERT_PATH "src/core/tsi/test_creds/server1.pem" +#define SERVER_KEY_PATH "src/core/tsi/test_creds/server1.key" + struct fullstack_secure_fixture_data { grpc_core::UniquePtr localaddr; bool server_credential_reloaded = false; @@ -48,10 +50,25 @@ ssl_server_certificate_config_callback( fullstack_secure_fixture_data* ffd = static_cast(user_data); if (!ffd->server_credential_reloaded) { - grpc_ssl_pem_key_cert_pair pem_key_cert_pair = {test_server1_key, - test_server1_cert}; - *config = grpc_ssl_server_certificate_config_create(test_root_cert, + grpc_slice ca_slice, cert_slice, key_slice; + GPR_ASSERT(GRPC_LOG_IF_ERROR("load_file", + grpc_load_file(CA_CERT_PATH, 1, &ca_slice))); + GPR_ASSERT(GRPC_LOG_IF_ERROR( + "load_file", grpc_load_file(SERVER_CERT_PATH, 1, &cert_slice))); + GPR_ASSERT(GRPC_LOG_IF_ERROR( + "load_file", grpc_load_file(SERVER_KEY_PATH, 1, &key_slice))); + const char* ca_cert = + reinterpret_cast GRPC_SLICE_START_PTR(ca_slice); + const char* server_cert = + reinterpret_cast GRPC_SLICE_START_PTR(cert_slice); + const char* server_key = + reinterpret_cast GRPC_SLICE_START_PTR(key_slice); + grpc_ssl_pem_key_cert_pair pem_key_cert_pair = {server_key, server_cert}; + *config = grpc_ssl_server_certificate_config_create(ca_cert, &pem_key_cert_pair, 1); + grpc_slice_unref(cert_slice); + grpc_slice_unref(key_slice); + grpc_slice_unref(ca_slice); ffd->server_credential_reloaded = true; return GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_NEW; } else { @@ -175,20 +192,10 @@ static grpc_end2end_test_config configs[] = { int main(int argc, char** argv) { size_t i; - FILE* roots_file; - size_t roots_size = strlen(test_root_cert); - char* roots_filename; grpc::testing::TestEnvironment env(argc, argv); grpc_end2end_tests_pre_init(); - - /* Set the SSL roots env var. */ - roots_file = gpr_tmpfile("chttp2_simple_ssl_fullstack_test", &roots_filename); - GPR_ASSERT(roots_filename != nullptr); - GPR_ASSERT(roots_file != nullptr); - GPR_ASSERT(fwrite(test_root_cert, 1, roots_size, roots_file) == roots_size); - fclose(roots_file); - GPR_GLOBAL_CONFIG_SET(grpc_default_ssl_roots_file_path, roots_filename); + GPR_GLOBAL_CONFIG_SET(grpc_default_ssl_roots_file_path, CA_CERT_PATH); grpc_init(); @@ -198,9 +205,5 @@ int main(int argc, char** argv) { grpc_shutdown(); - /* Cleanup. */ - remove(roots_filename); - gpr_free(roots_filename); - return 0; } diff --git a/test/core/end2end/fixtures/h2_ssl_proxy.cc b/test/core/end2end/fixtures/h2_ssl_proxy.cc index aea19e54403..ecccda35838 100644 --- a/test/core/end2end/fixtures/h2_ssl_proxy.cc +++ b/test/core/end2end/fixtures/h2_ssl_proxy.cc @@ -16,24 +16,26 @@ * */ -#include "test/core/end2end/end2end_tests.h" - -#include -#include - #include #include +#include +#include #include "src/core/lib/channel/channel_args.h" #include "src/core/lib/gpr/string.h" #include "src/core/lib/gpr/tmpfile.h" +#include "src/core/lib/iomgr/load_file.h" #include "src/core/lib/security/credentials/credentials.h" #include "src/core/lib/security/security_connector/ssl_utils_config.h" -#include "test/core/end2end/data/ssl_test_data.h" +#include "test/core/end2end/end2end_tests.h" #include "test/core/end2end/fixtures/proxy.h" #include "test/core/util/port.h" #include "test/core/util/test_config.h" +#define CA_CERT_PATH "src/core/tsi/test_creds/ca.pem" +#define SERVER_CERT_PATH "src/core/tsi/test_creds/server1.pem" +#define SERVER_KEY_PATH "src/core/tsi/test_creds/server1.key" + typedef struct fullstack_secure_fixture_data { grpc_end2end_proxy* proxy; } fullstack_secure_fixture_data; @@ -41,10 +43,20 @@ typedef struct fullstack_secure_fixture_data { static grpc_server* create_proxy_server(const char* port, grpc_channel_args* server_args) { grpc_server* s = grpc_server_create(server_args, nullptr); - grpc_ssl_pem_key_cert_pair pem_cert_key_pair = {test_server1_key, - test_server1_cert}; + grpc_slice cert_slice, key_slice; + GPR_ASSERT(GRPC_LOG_IF_ERROR( + "load_file", grpc_load_file(SERVER_CERT_PATH, 1, &cert_slice))); + GPR_ASSERT(GRPC_LOG_IF_ERROR("load_file", + grpc_load_file(SERVER_KEY_PATH, 1, &key_slice))); + const char* server_cert = + reinterpret_cast GRPC_SLICE_START_PTR(cert_slice); + const char* server_key = + reinterpret_cast GRPC_SLICE_START_PTR(key_slice); + grpc_ssl_pem_key_cert_pair pem_key_cert_pair = {server_key, server_cert}; grpc_server_credentials* ssl_creds = grpc_ssl_server_credentials_create( - nullptr, &pem_cert_key_pair, 1, 0, nullptr); + nullptr, &pem_key_cert_pair, 1, 0, nullptr); + grpc_slice_unref(cert_slice); + grpc_slice_unref(key_slice); GPR_ASSERT(grpc_server_add_secure_http2_port(s, port, ssl_creds)); grpc_server_credentials_release(ssl_creds); return s; @@ -166,10 +178,20 @@ static int fail_server_auth_check(grpc_channel_args* server_args) { static void chttp2_init_server_simple_ssl_secure_fullstack( grpc_end2end_test_fixture* f, grpc_channel_args* server_args) { - grpc_ssl_pem_key_cert_pair pem_cert_key_pair = {test_server1_key, - test_server1_cert}; + grpc_slice cert_slice, key_slice; + GPR_ASSERT(GRPC_LOG_IF_ERROR( + "load_file", grpc_load_file(SERVER_CERT_PATH, 1, &cert_slice))); + GPR_ASSERT(GRPC_LOG_IF_ERROR("load_file", + grpc_load_file(SERVER_KEY_PATH, 1, &key_slice))); + const char* server_cert = + reinterpret_cast GRPC_SLICE_START_PTR(cert_slice); + const char* server_key = + reinterpret_cast GRPC_SLICE_START_PTR(key_slice); + grpc_ssl_pem_key_cert_pair pem_key_cert_pair = {server_key, server_cert}; grpc_server_credentials* ssl_creds = grpc_ssl_server_credentials_create( - nullptr, &pem_cert_key_pair, 1, 0, nullptr); + nullptr, &pem_key_cert_pair, 1, 0, nullptr); + grpc_slice_unref(cert_slice); + grpc_slice_unref(key_slice); if (fail_server_auth_check(server_args)) { grpc_auth_metadata_processor processor = {process_auth_failure, nullptr, nullptr}; @@ -195,20 +217,10 @@ static grpc_end2end_test_config configs[] = { int main(int argc, char** argv) { size_t i; - FILE* roots_file; - size_t roots_size = strlen(test_root_cert); - char* roots_filename; grpc::testing::TestEnvironment env(argc, argv); grpc_end2end_tests_pre_init(); - - /* Set the SSL roots env var. */ - roots_file = gpr_tmpfile("chttp2_simple_ssl_fullstack_test", &roots_filename); - GPR_ASSERT(roots_filename != nullptr); - GPR_ASSERT(roots_file != nullptr); - GPR_ASSERT(fwrite(test_root_cert, 1, roots_size, roots_file) == roots_size); - fclose(roots_file); - GPR_GLOBAL_CONFIG_SET(grpc_default_ssl_roots_file_path, roots_filename); + GPR_GLOBAL_CONFIG_SET(grpc_default_ssl_roots_file_path, CA_CERT_PATH); grpc_init(); @@ -218,9 +230,5 @@ int main(int argc, char** argv) { grpc_shutdown(); - /* Cleanup. */ - remove(roots_filename); - gpr_free(roots_filename); - return 0; } diff --git a/test/core/end2end/fixtures/h2_tls.cc b/test/core/end2end/fixtures/h2_tls.cc index dfba0f12530..95cff3a2b00 100644 --- a/test/core/end2end/fixtures/h2_tls.cc +++ b/test/core/end2end/fixtures/h2_tls.cc @@ -30,14 +30,18 @@ #include "src/core/lib/gprpp/host_port.h" #include "src/core/lib/gprpp/inlined_vector.h" #include "src/core/lib/gprpp/thd.h" +#include "src/core/lib/iomgr/load_file.h" #include "src/core/lib/security/credentials/credentials.h" #include "src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h" #include "src/core/lib/security/security_connector/ssl_utils_config.h" -#include "test/core/end2end/data/ssl_test_data.h" #include "test/core/end2end/end2end_tests.h" #include "test/core/util/port.h" #include "test/core/util/test_config.h" +#define CA_CERT_PATH "src/core/tsi/test_creds/ca.pem" +#define SERVER_CERT_PATH "src/core/tsi/test_creds/server1.pem" +#define SERVER_KEY_PATH "src/core/tsi/test_creds/server1.key" + typedef grpc_core::InlinedVector ThreadList; struct fullstack_secure_fixture_data { @@ -140,17 +144,30 @@ static int client_cred_reload_sync(void* /*config_user_data*/, arg->status = GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_UNCHANGED; return 0; } - const grpc_ssl_pem_key_cert_pair pem_key_pair = { - test_server1_key, - test_server1_cert, - }; + grpc_slice ca_slice, cert_slice, key_slice; + GPR_ASSERT(GRPC_LOG_IF_ERROR("load_file", + grpc_load_file(CA_CERT_PATH, 1, &ca_slice))); + GPR_ASSERT(GRPC_LOG_IF_ERROR( + "load_file", grpc_load_file(SERVER_CERT_PATH, 1, &cert_slice))); + GPR_ASSERT(GRPC_LOG_IF_ERROR("load_file", + grpc_load_file(SERVER_KEY_PATH, 1, &key_slice))); + const char* ca_cert = + reinterpret_cast GRPC_SLICE_START_PTR(ca_slice); + const char* server_cert = + reinterpret_cast GRPC_SLICE_START_PTR(cert_slice); + const char* server_key = + reinterpret_cast GRPC_SLICE_START_PTR(key_slice); + grpc_ssl_pem_key_cert_pair pem_key_cert_pair = {server_key, server_cert}; if (arg->key_materials_config->pem_key_cert_pair_list().empty()) { - const auto* pem_key_pair_ptr = &pem_key_pair; + const auto* pem_key_cert_pair_ptr = &pem_key_cert_pair; grpc_tls_key_materials_config_set_key_materials( - arg->key_materials_config, test_root_cert, &pem_key_pair_ptr, 1); + arg->key_materials_config, ca_cert, &pem_key_cert_pair_ptr, 1); } // new credential has been reloaded. arg->status = GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_NEW; + grpc_slice_unref(cert_slice); + grpc_slice_unref(key_slice); + grpc_slice_unref(ca_slice); return 0; } @@ -163,21 +180,34 @@ static int server_cred_reload_sync(void* /*config_user_data*/, arg->status = GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_UNCHANGED; return 0; } - const grpc_ssl_pem_key_cert_pair pem_key_pair = { - test_server1_key, - test_server1_cert, - }; + grpc_slice ca_slice, cert_slice, key_slice; + GPR_ASSERT(GRPC_LOG_IF_ERROR("load_file", + grpc_load_file(CA_CERT_PATH, 1, &ca_slice))); + GPR_ASSERT(GRPC_LOG_IF_ERROR( + "load_file", grpc_load_file(SERVER_CERT_PATH, 1, &cert_slice))); + GPR_ASSERT(GRPC_LOG_IF_ERROR("load_file", + grpc_load_file(SERVER_KEY_PATH, 1, &key_slice))); + const char* ca_cert = + reinterpret_cast GRPC_SLICE_START_PTR(ca_slice); + const char* server_cert = + reinterpret_cast GRPC_SLICE_START_PTR(cert_slice); + const char* server_key = + reinterpret_cast GRPC_SLICE_START_PTR(key_slice); + grpc_ssl_pem_key_cert_pair pem_key_cert_pair = {server_key, server_cert}; GPR_ASSERT(arg != nullptr); GPR_ASSERT(arg->key_materials_config != nullptr); GPR_ASSERT(arg->key_materials_config->pem_key_cert_pair_list().data() != nullptr); if (arg->key_materials_config->pem_key_cert_pair_list().empty()) { - const auto* pem_key_pair_ptr = &pem_key_pair; + const auto* pem_key_cert_pair_ptr = &pem_key_cert_pair; grpc_tls_key_materials_config_set_key_materials( - arg->key_materials_config, test_root_cert, &pem_key_pair_ptr, 1); + arg->key_materials_config, ca_cert, &pem_key_cert_pair_ptr, 1); } // new credential has been reloaded. arg->status = GRPC_SSL_CERTIFICATE_CONFIG_RELOAD_NEW; + grpc_slice_unref(cert_slice); + grpc_slice_unref(key_slice); + grpc_slice_unref(ca_slice); return 0; } @@ -268,25 +298,13 @@ static grpc_end2end_test_config configs[] = { }; int main(int argc, char** argv) { - FILE* roots_file; - size_t roots_size = strlen(test_root_cert); - char* roots_filename; grpc::testing::TestEnvironment env(argc, argv); grpc_end2end_tests_pre_init(); - /* Set the SSL roots env var. */ - roots_file = gpr_tmpfile("chttp2_simple_ssl_fullstack_test", &roots_filename); - GPR_ASSERT(roots_filename != nullptr); - GPR_ASSERT(roots_file != nullptr); - GPR_ASSERT(fwrite(test_root_cert, 1, roots_size, roots_file) == roots_size); - fclose(roots_file); - GPR_GLOBAL_CONFIG_SET(grpc_default_ssl_roots_file_path, roots_filename); + GPR_GLOBAL_CONFIG_SET(grpc_default_ssl_roots_file_path, CA_CERT_PATH); grpc_init(); for (size_t ind = 0; ind < sizeof(configs) / sizeof(*configs); ind++) { grpc_end2end_tests(argc, argv, configs[ind]); } grpc_shutdown(); - /* Cleanup. */ - remove(roots_filename); - gpr_free(roots_filename); return 0; } diff --git a/test/core/end2end/generate_tests.bzl b/test/core/end2end/generate_tests.bzl index e7034222e52..851bb5ca0d0 100755 --- a/test/core/end2end/generate_tests.bzl +++ b/test/core/end2end/generate_tests.bzl @@ -431,8 +431,6 @@ def grpc_end2end_tests(): language = "C++", data = [ "//src/core/tsi/test_creds:ca.pem", - "//src/core/tsi/test_creds:client.key", - "//src/core/tsi/test_creds:client.pem", "//src/core/tsi/test_creds:server1.key", "//src/core/tsi/test_creds:server1.pem", ], @@ -508,8 +506,6 @@ def grpc_end2end_nosec_tests(): language = "C++", data = [ "//src/core/tsi/test_creds:ca.pem", - "//src/core/tsi/test_creds:client.key", - "//src/core/tsi/test_creds:client.pem", "//src/core/tsi/test_creds:server1.key", "//src/core/tsi/test_creds:server1.pem", ], From 6113d708120795565f4ccbab27b803f9630932c4 Mon Sep 17 00:00:00 2001 From: Eric Gribkoff Date: Tue, 14 Apr 2020 10:55:37 -0700 Subject: [PATCH 470/758] Enable retries for failed GCP API calls The HttpRequest.execute() method used to make GCP calls has a `num_retries` parameter, as documented at https://googleapis.github.io/google-api-python-client/docs/epy/googleapiclient.http.HttpRequest-class.html#execute --- tools/run_tests/run_xds_tests.py | 119 ++++++++++++++++++------------- 1 file changed, 71 insertions(+), 48 deletions(-) diff --git a/tools/run_tests/run_xds_tests.py b/tools/run_tests/run_xds_tests.py index 762743e0993..876825295db 100755 --- a/tools/run_tests/run_xds_tests.py +++ b/tools/run_tests/run_xds_tests.py @@ -198,6 +198,7 @@ _INSTANCE_GROUP_SIZE = args.instance_group_size _NUM_TEST_RPCS = 10 * args.qps _WAIT_FOR_STATS_SEC = 180 _WAIT_FOR_URL_MAP_PATCH_SEC = 300 +_GCP_API_RETRIES = 5 _BOOTSTRAP_TEMPLATE = """ {{ "node": {{ @@ -549,8 +550,8 @@ def create_instance_template(gcp, name, network, source_image, machine_type, } logger.debug('Sending GCP request with body=%s', config) - result = gcp.compute.instanceTemplates().insert(project=gcp.project, - body=config).execute() + result = gcp.compute.instanceTemplates().insert( + project=gcp.project, body=config).execute(num_retries=_GCP_API_RETRIES) wait_for_global_operation(gcp, result['name']) gcp.instance_template = GcpResource(config['name'], result['targetLink']) @@ -567,13 +568,14 @@ def add_instance_group(gcp, zone, name, size): } logger.debug('Sending GCP request with body=%s', config) - result = gcp.compute.instanceGroupManagers().insert(project=gcp.project, - zone=zone, - body=config).execute() + result = gcp.compute.instanceGroupManagers().insert( + project=gcp.project, zone=zone, + body=config).execute(num_retries=_GCP_API_RETRIES) wait_for_zone_operation(gcp, zone, result['name']) result = gcp.compute.instanceGroupManagers().get( project=gcp.project, zone=zone, - instanceGroupManager=config['name']).execute() + instanceGroupManager=config['name']).execute( + num_retries=_GCP_API_RETRIES) instance_group = InstanceGroup(config['name'], result['instanceGroup'], zone) gcp.instance_groups.append(instance_group) @@ -600,8 +602,8 @@ def create_health_check(gcp, name): } compute_to_use = gcp.compute logger.debug('Sending GCP request with body=%s', config) - result = compute_to_use.healthChecks().insert(project=gcp.project, - body=config).execute() + result = compute_to_use.healthChecks().insert( + project=gcp.project, body=config).execute(num_retries=_GCP_API_RETRIES) wait_for_global_operation(gcp, result['name']) gcp.health_check = GcpResource(config['name'], result['targetLink']) @@ -617,8 +619,8 @@ def create_health_check_firewall_rule(gcp, name): 'targetTags': ['allow-health-checks'], } logger.debug('Sending GCP request with body=%s', config) - result = gcp.compute.firewalls().insert(project=gcp.project, - body=config).execute() + result = gcp.compute.firewalls().insert( + project=gcp.project, body=config).execute(num_retries=_GCP_API_RETRIES) wait_for_global_operation(gcp, result['name']) gcp.health_check_firewall_rule = GcpResource(config['name'], result['targetLink']) @@ -639,8 +641,8 @@ def add_backend_service(gcp, name): 'protocol': protocol } logger.debug('Sending GCP request with body=%s', config) - result = compute_to_use.backendServices().insert(project=gcp.project, - body=config).execute() + result = compute_to_use.backendServices().insert( + project=gcp.project, body=config).execute(num_retries=_GCP_API_RETRIES) wait_for_global_operation(gcp, result['name']) backend_service = GcpResource(config['name'], result['targetLink']) gcp.backend_services.append(backend_service) @@ -661,8 +663,8 @@ def create_url_map(gcp, name, backend_service, host_name): }] } logger.debug('Sending GCP request with body=%s', config) - result = gcp.compute.urlMaps().insert(project=gcp.project, - body=config).execute() + result = gcp.compute.urlMaps().insert( + project=gcp.project, body=config).execute(num_retries=_GCP_API_RETRIES) wait_for_global_operation(gcp, result['name']) gcp.url_map = GcpResource(config['name'], result['targetLink']) @@ -675,9 +677,9 @@ def patch_url_map_host_rule_with_port(gcp, name, backend_service, host_name): }] } logger.debug('Sending GCP request with body=%s', config) - result = gcp.compute.urlMaps().patch(project=gcp.project, - urlMap=name, - body=config).execute() + result = gcp.compute.urlMaps().patch( + project=gcp.project, urlMap=name, + body=config).execute(num_retries=_GCP_API_RETRIES) wait_for_global_operation(gcp, result['name']) @@ -690,15 +692,17 @@ def create_target_proxy(gcp, name): } logger.debug('Sending GCP request with body=%s', config) result = gcp.alpha_compute.targetGrpcProxies().insert( - project=gcp.project, body=config).execute() + project=gcp.project, + body=config).execute(num_retries=_GCP_API_RETRIES) else: config = { 'name': name, 'url_map': gcp.url_map.url, } logger.debug('Sending GCP request with body=%s', config) - result = gcp.compute.targetHttpProxies().insert(project=gcp.project, - body=config).execute() + result = gcp.compute.targetHttpProxies().insert( + project=gcp.project, + body=config).execute(num_retries=_GCP_API_RETRIES) wait_for_global_operation(gcp, result['name']) gcp.target_proxy = GcpResource(config['name'], result['targetLink']) @@ -720,7 +724,8 @@ def create_global_forwarding_rule(gcp, name, potential_ports): } logger.debug('Sending GCP request with body=%s', config) result = compute_to_use.globalForwardingRules().insert( - project=gcp.project, body=config).execute() + project=gcp.project, + body=config).execute(num_retries=_GCP_API_RETRIES) wait_for_global_operation(gcp, result['name']) gcp.global_forwarding_rule = GcpResource(config['name'], result['targetLink']) @@ -736,7 +741,8 @@ def delete_global_forwarding_rule(gcp): try: result = gcp.compute.globalForwardingRules().delete( project=gcp.project, - forwardingRule=gcp.global_forwarding_rule.name).execute() + forwardingRule=gcp.global_forwarding_rule.name).execute( + num_retries=_GCP_API_RETRIES) wait_for_global_operation(gcp, result['name']) except googleapiclient.errors.HttpError as http_error: logger.info('Delete failed: %s', http_error) @@ -747,11 +753,13 @@ def delete_target_proxy(gcp): if gcp.alpha_compute: result = gcp.alpha_compute.targetGrpcProxies().delete( project=gcp.project, - targetGrpcProxy=gcp.target_proxy.name).execute() + targetGrpcProxy=gcp.target_proxy.name).execute( + num_retries=_GCP_API_RETRIES) else: result = gcp.compute.targetHttpProxies().delete( project=gcp.project, - targetHttpProxy=gcp.target_proxy.name).execute() + targetHttpProxy=gcp.target_proxy.name).execute( + num_retries=_GCP_API_RETRIES) wait_for_global_operation(gcp, result['name']) except googleapiclient.errors.HttpError as http_error: logger.info('Delete failed: %s', http_error) @@ -760,7 +768,8 @@ def delete_target_proxy(gcp): def delete_url_map(gcp): try: result = gcp.compute.urlMaps().delete( - project=gcp.project, urlMap=gcp.url_map.name).execute() + project=gcp.project, + urlMap=gcp.url_map.name).execute(num_retries=_GCP_API_RETRIES) wait_for_global_operation(gcp, result['name']) except googleapiclient.errors.HttpError as http_error: logger.info('Delete failed: %s', http_error) @@ -771,7 +780,8 @@ def delete_backend_services(gcp): try: result = gcp.compute.backendServices().delete( project=gcp.project, - backendService=backend_service.name).execute() + backendService=backend_service.name).execute( + num_retries=_GCP_API_RETRIES) wait_for_global_operation(gcp, result['name']) except googleapiclient.errors.HttpError as http_error: logger.info('Delete failed: %s', http_error) @@ -781,7 +791,8 @@ def delete_firewall(gcp): try: result = gcp.compute.firewalls().delete( project=gcp.project, - firewall=gcp.health_check_firewall_rule.name).execute() + firewall=gcp.health_check_firewall_rule.name).execute( + num_retries=_GCP_API_RETRIES) wait_for_global_operation(gcp, result['name']) except googleapiclient.errors.HttpError as http_error: logger.info('Delete failed: %s', http_error) @@ -790,7 +801,8 @@ def delete_firewall(gcp): def delete_health_check(gcp): try: result = gcp.compute.healthChecks().delete( - project=gcp.project, healthCheck=gcp.health_check.name).execute() + project=gcp.project, healthCheck=gcp.health_check.name).execute( + num_retries=_GCP_API_RETRIES) wait_for_global_operation(gcp, result['name']) except googleapiclient.errors.HttpError as http_error: logger.info('Delete failed: %s', http_error) @@ -802,7 +814,8 @@ def delete_instance_groups(gcp): result = gcp.compute.instanceGroupManagers().delete( project=gcp.project, zone=instance_group.zone, - instanceGroupManager=instance_group.name).execute() + instanceGroupManager=instance_group.name).execute( + num_retries=_GCP_API_RETRIES) wait_for_zone_operation(gcp, instance_group.zone, result['name'], @@ -815,7 +828,8 @@ def delete_instance_template(gcp): try: result = gcp.compute.instanceTemplates().delete( project=gcp.project, - instanceTemplate=gcp.instance_template.name).execute() + instanceTemplate=gcp.instance_template.name).execute( + num_retries=_GCP_API_RETRIES) wait_for_global_operation(gcp, result['name']) except googleapiclient.errors.HttpError as http_error: logger.info('Delete failed: %s', http_error) @@ -839,7 +853,7 @@ def patch_backend_instances(gcp, logger.debug('Sending GCP request with body=%s', config) result = compute_to_use.backendServices().patch( project=gcp.project, backendService=backend_service.name, - body=config).execute() + body=config).execute(num_retries=_GCP_API_RETRIES) wait_for_global_operation(gcp, result['name'], timeout_sec=_WAIT_FOR_BACKEND_SEC) @@ -853,7 +867,7 @@ def resize_instance_group(gcp, project=gcp.project, zone=instance_group.zone, instanceGroupManager=instance_group.name, - size=new_size).execute() + size=new_size).execute(num_retries=_GCP_API_RETRIES) wait_for_zone_operation(gcp, instance_group.zone, result['name'], @@ -878,9 +892,9 @@ def patch_url_map_backend_service(gcp, backend_service): }] } logger.debug('Sending GCP request with body=%s', config) - result = gcp.compute.urlMaps().patch(project=gcp.project, - urlMap=gcp.url_map.name, - body=config).execute() + result = gcp.compute.urlMaps().patch( + project=gcp.project, urlMap=gcp.url_map.name, + body=config).execute(num_retries=_GCP_API_RETRIES) wait_for_global_operation(gcp, result['name']) @@ -890,7 +904,8 @@ def wait_for_global_operation(gcp, start_time = time.time() while time.time() - start_time <= timeout_sec: result = gcp.compute.globalOperations().get( - project=gcp.project, operation=operation).execute() + project=gcp.project, + operation=operation).execute(num_retries=_GCP_API_RETRIES) if result['status'] == 'DONE': if 'error' in result: raise Exception(result['error']) @@ -907,7 +922,8 @@ def wait_for_zone_operation(gcp, start_time = time.time() while time.time() - start_time <= timeout_sec: result = gcp.compute.zoneOperations().get( - project=gcp.project, zone=zone, operation=operation).execute() + project=gcp.project, zone=zone, + operation=operation).execute(num_retries=_GCP_API_RETRIES) if result['status'] == 'DONE': if 'error' in result: raise Exception(result['error']) @@ -927,7 +943,7 @@ def wait_for_healthy_backends(gcp, result = gcp.compute.backendServices().getHealth( project=gcp.project, backendService=backend_service.name, - body=config).execute() + body=config).execute(num_retries=_GCP_API_RETRIES) if 'healthStatus' in result: healthy = True for instance in result['healthStatus']: @@ -949,7 +965,7 @@ def get_instance_names(gcp, instance_group): instanceGroup=instance_group.name, body={ 'instanceState': 'ALL' - }).execute() + }).execute(num_retries=_GCP_API_RETRIES) if 'items' not in result: return [] for item in result['items']: @@ -1081,19 +1097,22 @@ try: if not gcp.instance_template: result = compute.instanceTemplates().get( project=args.project_id, - instanceTemplate=template_name).execute() + instanceTemplate=template_name).execute( + num_retries=_GCP_API_RETRIES) gcp.instance_template = GcpResource(template_name, result['selfLink']) if not gcp.backend_services: result = compute.backendServices().get( project=args.project_id, - backendService=backend_service_name).execute() + backendService=backend_service_name).execute( + num_retries=_GCP_API_RETRIES) backend_service = GcpResource(backend_service_name, result['selfLink']) gcp.backend_services.append(backend_service) result = compute.backendServices().get( project=args.project_id, - backendService=alternate_backend_service_name).execute() + backendService=alternate_backend_service_name).execute( + num_retries=_GCP_API_RETRIES) alternate_backend_service = GcpResource( alternate_backend_service_name, result['selfLink']) gcp.backend_services.append(alternate_backend_service) @@ -1101,14 +1120,16 @@ try: result = compute.instanceGroups().get( project=args.project_id, zone=args.zone, - instanceGroup=instance_group_name).execute() + instanceGroup=instance_group_name).execute( + num_retries=_GCP_API_RETRIES) instance_group = InstanceGroup(instance_group_name, result['selfLink'], args.zone) gcp.instance_groups.append(instance_group) result = compute.instanceGroups().get( project=args.project_id, zone=args.zone, - instanceGroup=same_zone_instance_group_name).execute() + instanceGroup=same_zone_instance_group_name).execute( + num_retries=_GCP_API_RETRIES) same_zone_instance_group = InstanceGroup( same_zone_instance_group_name, result['selfLink'], args.zone) @@ -1118,7 +1139,7 @@ try: project=args.project_id, zone=args.secondary_zone, instanceGroup=secondary_zone_instance_group_name - ).execute() + ).execute(num_retries=_GCP_API_RETRIES) secondary_zone_instance_group = InstanceGroup( secondary_zone_instance_group_name, result['selfLink'], args.secondary_zone) @@ -1126,12 +1147,14 @@ try: if not gcp.health_check: result = compute.healthChecks().get( project=args.project_id, - healthCheck=health_check_name).execute() + healthCheck=health_check_name).execute( + num_retries=_GCP_API_RETRIES) gcp.health_check = GcpResource(health_check_name, result['selfLink']) if not gcp.url_map: - result = compute.urlMaps().get(project=args.project_id, - urlMap=url_map_name).execute() + result = compute.urlMaps().get( + project=args.project_id, + urlMap=url_map_name).execute(num_retries=_GCP_API_RETRIES) gcp.url_map = GcpResource(url_map_name, result['selfLink']) if not gcp.service_port: gcp.service_port = args.service_port_range[0] From d1cb8a32aa58ada95b0de3c8a7e2d7c69c9f1673 Mon Sep 17 00:00:00 2001 From: Eric Gribkoff Date: Tue, 14 Apr 2020 11:05:56 -0700 Subject: [PATCH 471/758] increase time.sleep between polling operations --- tools/run_tests/run_xds_tests.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tools/run_tests/run_xds_tests.py b/tools/run_tests/run_xds_tests.py index 876825295db..c6247c15fb8 100755 --- a/tools/run_tests/run_xds_tests.py +++ b/tools/run_tests/run_xds_tests.py @@ -879,7 +879,7 @@ def resize_instance_group(gcp, break if time.time() - start_time > timeout_sec: raise Exception('Failed to resize primary instance group') - time.sleep(1) + time.sleep(2) def patch_url_map_backend_service(gcp, backend_service): @@ -910,7 +910,7 @@ def wait_for_global_operation(gcp, if 'error' in result: raise Exception(result['error']) return - time.sleep(1) + time.sleep(2) raise Exception('Operation %s did not complete within %d', operation, timeout_sec) @@ -928,7 +928,7 @@ def wait_for_zone_operation(gcp, if 'error' in result: raise Exception(result['error']) return - time.sleep(1) + time.sleep(2) raise Exception('Operation %s did not complete within %d', operation, timeout_sec) @@ -952,7 +952,7 @@ def wait_for_healthy_backends(gcp, break if healthy: return - time.sleep(1) + time.sleep(2) raise Exception('Not all backends became healthy within %d seconds: %s' % (timeout_sec, result)) From 633719d1046c6c9137d2a6a361969b61a1a990b9 Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Tue, 14 Apr 2020 11:39:40 -0700 Subject: [PATCH 472/758] Revert API changes to byte buffer reader --- include/grpc/impl/codegen/byte_buffer_reader.h | 1 + .../message_decompress/message_decompress_filter.h | 3 ++- src/core/lib/surface/byte_buffer_reader.cc | 12 +++++++----- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/include/grpc/impl/codegen/byte_buffer_reader.h b/include/grpc/impl/codegen/byte_buffer_reader.h index 7cd87c82a24..e06e19558a1 100644 --- a/include/grpc/impl/codegen/byte_buffer_reader.h +++ b/include/grpc/impl/codegen/byte_buffer_reader.h @@ -27,6 +27,7 @@ struct grpc_byte_buffer; struct grpc_byte_buffer_reader { struct grpc_byte_buffer* buffer_in; + struct grpc_byte_buffer* buffer_out; /** Different current objects correspond to different types of byte buffers */ union grpc_byte_buffer_reader_current { /** Index into a slice buffer's array of slices */ diff --git a/src/core/ext/filters/http/message_decompress/message_decompress_filter.h b/src/core/ext/filters/http/message_decompress/message_decompress_filter.h index bd5c538273b..1dac6be01a1 100644 --- a/src/core/ext/filters/http/message_decompress/message_decompress_filter.h +++ b/src/core/ext/filters/http/message_decompress/message_decompress_filter.h @@ -25,4 +25,5 @@ extern const grpc_channel_filter grpc_message_decompress_filter; -#endif // GRPC_CORE_EXT_FILTERS_HTTP_MESSAGE_DECOMPRESS_MESSAGE_DECOMPRESS_FILTER_H +#endif /* GRPC_CORE_EXT_FILTERS_HTTP_MESSAGE_DECOMPRESS_MESSAGE_DECOMPRESS_FILTER_H \ + */ diff --git a/src/core/lib/surface/byte_buffer_reader.cc b/src/core/lib/surface/byte_buffer_reader.cc index baf205d8154..3689c79455e 100644 --- a/src/core/lib/surface/byte_buffer_reader.cc +++ b/src/core/lib/surface/byte_buffer_reader.cc @@ -35,21 +35,23 @@ int grpc_byte_buffer_reader_init(grpc_byte_buffer_reader* reader, reader->buffer_in = buffer; switch (reader->buffer_in->type) { case GRPC_BB_RAW: + reader->buffer_out = reader->buffer_in; reader->current.index = 0; break; } - return 1; } -void grpc_byte_buffer_reader_destroy(grpc_byte_buffer_reader* reader) {} +void grpc_byte_buffer_reader_destroy(grpc_byte_buffer_reader* reader) { + reader->buffer_out = nullptr; +} int grpc_byte_buffer_reader_peek(grpc_byte_buffer_reader* reader, grpc_slice** slice) { switch (reader->buffer_in->type) { case GRPC_BB_RAW: { grpc_slice_buffer* slice_buffer; - slice_buffer = &reader->buffer_in->data.raw.slice_buffer; + slice_buffer = &reader->buffer_out->data.raw.slice_buffer; if (reader->current.index < slice_buffer->count) { *slice = &slice_buffer->slices[reader->current.index]; reader->current.index += 1; @@ -66,7 +68,7 @@ int grpc_byte_buffer_reader_next(grpc_byte_buffer_reader* reader, switch (reader->buffer_in->type) { case GRPC_BB_RAW: { grpc_slice_buffer* slice_buffer; - slice_buffer = &reader->buffer_in->data.raw.slice_buffer; + slice_buffer = &reader->buffer_out->data.raw.slice_buffer; if (reader->current.index < slice_buffer->count) { *slice = grpc_slice_ref_internal( slice_buffer->slices[reader->current.index]); @@ -82,7 +84,7 @@ int grpc_byte_buffer_reader_next(grpc_byte_buffer_reader* reader, grpc_slice grpc_byte_buffer_reader_readall(grpc_byte_buffer_reader* reader) { grpc_slice in_slice; size_t bytes_read = 0; - const size_t input_size = grpc_byte_buffer_length(reader->buffer_in); + const size_t input_size = grpc_byte_buffer_length(reader->buffer_out); grpc_slice out_slice = GRPC_SLICE_MALLOC(input_size); uint8_t* const outbuf = GRPC_SLICE_START_PTR(out_slice); /* just an alias */ From 096c2761821ef1f6e0277ca1872fe62c791b96a3 Mon Sep 17 00:00:00 2001 From: ZhenLian Date: Tue, 14 Apr 2020 00:06:16 -0700 Subject: [PATCH 473/758] [4/n] Avoid using hardcoded test credentials --- test/core/security/BUILD | 15 +++++ .../grpc_tls_credentials_options_test.cc | 58 ++++++++++++++----- test/core/security/ssl_server_fuzzer.cc | 33 ++++++----- .../security/tls_security_connector_test.cc | 33 ++++++++--- test/core/surface/BUILD | 5 ++ .../surface/sequential_connectivity_test.cc | 28 +++++++-- test/core/util/grpc_fuzzer.bzl | 4 +- 7 files changed, 136 insertions(+), 40 deletions(-) diff --git a/test/core/security/BUILD b/test/core/security/BUILD index d4ffb2b3a32..ad698aa68ad 100644 --- a/test/core/security/BUILD +++ b/test/core/security/BUILD @@ -37,6 +37,11 @@ grpc_fuzzer( name = "ssl_server_fuzzer", srcs = ["ssl_server_fuzzer.cc"], corpus = "corpus/ssl_server_corpus", + data = [ + "//src/core/tsi/test_creds:ca.pem", + "//src/core/tsi/test_creds:server1.key", + "//src/core/tsi/test_creds:server1.pem", + ], language = "C++", tags = ["no_windows"], deps = [ @@ -248,6 +253,11 @@ grpc_cc_test( grpc_cc_test( name = "tls_security_connector_test", srcs = ["tls_security_connector_test.cc"], + data = [ + "//src/core/tsi/test_creds:ca.pem", + "//src/core/tsi/test_creds:server1.key", + "//src/core/tsi/test_creds:server1.pem", + ], external_deps = [ "gtest", ], @@ -266,6 +276,11 @@ grpc_cc_test( grpc_cc_test( name = "grpc_tls_credentials_options_test", srcs = ["grpc_tls_credentials_options_test.cc"], + data = [ + "//src/core/tsi/test_creds:ca.pem", + "//src/core/tsi/test_creds:server1.key", + "//src/core/tsi/test_creds:server1.pem", + ], external_deps = ["gtest"], language = "C++", deps = [ diff --git a/test/core/security/grpc_tls_credentials_options_test.cc b/test/core/security/grpc_tls_credentials_options_test.cc index 142aabf5858..ff8bf1dac04 100644 --- a/test/core/security/grpc_tls_credentials_options_test.cc +++ b/test/core/security/grpc_tls_credentials_options_test.cc @@ -17,7 +17,6 @@ */ #include "src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h" -#include "test/core/end2end/data/ssl_test_data.h" #include #include @@ -25,28 +24,61 @@ #include #include +#include "src/core/lib/iomgr/load_file.h" + +#define CA_CERT_PATH "src/core/tsi/test_creds/ca.pem" +#define SERVER_CERT_PATH "src/core/tsi/test_creds/server1.pem" +#define SERVER_KEY_PATH "src/core/tsi/test_creds/server1.key" + namespace testing { static void SetKeyMaterials(grpc_tls_key_materials_config* config) { - const grpc_ssl_pem_key_cert_pair pem_key_pair = { - test_server1_key, - test_server1_cert, - }; - const auto* pem_key_pair_ptr = &pem_key_pair; - grpc_tls_key_materials_config_set_key_materials(config, test_root_cert, - &pem_key_pair_ptr, 1); + grpc_slice ca_slice, cert_slice, key_slice; + GPR_ASSERT(GRPC_LOG_IF_ERROR("load_file", + grpc_load_file(CA_CERT_PATH, 1, &ca_slice))); + GPR_ASSERT(GRPC_LOG_IF_ERROR( + "load_file", grpc_load_file(SERVER_CERT_PATH, 1, &cert_slice))); + GPR_ASSERT(GRPC_LOG_IF_ERROR("load_file", + grpc_load_file(SERVER_KEY_PATH, 1, &key_slice))); + const char* ca_cert = + reinterpret_cast GRPC_SLICE_START_PTR(ca_slice); + const char* server_cert = + reinterpret_cast GRPC_SLICE_START_PTR(cert_slice); + const char* server_key = + reinterpret_cast GRPC_SLICE_START_PTR(key_slice); + grpc_ssl_pem_key_cert_pair pem_key_cert_pair = {server_key, server_cert}; + const auto* pem_key_cert_pair_ptr = &pem_key_cert_pair; + grpc_tls_key_materials_config_set_key_materials(config, ca_cert, + &pem_key_cert_pair_ptr, 1); + grpc_slice_unref(cert_slice); + grpc_slice_unref(key_slice); + grpc_slice_unref(ca_slice); } TEST(GrpcTlsCredentialsOptionsTest, SetKeyMaterials) { grpc_tls_key_materials_config* config = grpc_tls_key_materials_config_create(); SetKeyMaterials(config); - EXPECT_STREQ(config->pem_root_certs(), test_root_cert); + grpc_slice ca_slice, cert_slice, key_slice; + GPR_ASSERT(GRPC_LOG_IF_ERROR("load_file", + grpc_load_file(CA_CERT_PATH, 1, &ca_slice))); + GPR_ASSERT(GRPC_LOG_IF_ERROR( + "load_file", grpc_load_file(SERVER_CERT_PATH, 1, &cert_slice))); + GPR_ASSERT(GRPC_LOG_IF_ERROR("load_file", + grpc_load_file(SERVER_KEY_PATH, 1, &key_slice))); + const char* ca_cert = + reinterpret_cast GRPC_SLICE_START_PTR(ca_slice); + const char* server_cert = + reinterpret_cast GRPC_SLICE_START_PTR(cert_slice); + const char* server_key = + reinterpret_cast GRPC_SLICE_START_PTR(key_slice); + EXPECT_STREQ(config->pem_root_certs(), ca_cert); EXPECT_EQ(config->pem_key_cert_pair_list().size(), 1); - EXPECT_STREQ(config->pem_key_cert_pair_list()[0].private_key(), - test_server1_key); - EXPECT_STREQ(config->pem_key_cert_pair_list()[0].cert_chain(), - test_server1_cert); + EXPECT_STREQ(config->pem_key_cert_pair_list()[0].private_key(), server_key); + EXPECT_STREQ(config->pem_key_cert_pair_list()[0].cert_chain(), server_cert); + grpc_slice_unref(cert_slice); + grpc_slice_unref(key_slice); + grpc_slice_unref(ca_slice); delete config; } diff --git a/test/core/security/ssl_server_fuzzer.cc b/test/core/security/ssl_server_fuzzer.cc index 18f1dd7814b..538e43964c1 100644 --- a/test/core/security/ssl_server_fuzzer.cc +++ b/test/core/security/ssl_server_fuzzer.cc @@ -23,9 +23,12 @@ #include "src/core/lib/iomgr/load_file.h" #include "src/core/lib/security/credentials/credentials.h" #include "src/core/lib/security/security_connector/security_connector.h" -#include "test/core/end2end/data/ssl_test_data.h" #include "test/core/util/mock_endpoint.h" +#define CA_CERT_PATH "src/core/tsi/test_creds/ca.pem" +#define SERVER_CERT_PATH "src/core/tsi/test_creds/server1.pem" +#define SERVER_KEY_PATH "src/core/tsi/test_creds/server1.key" + bool squelch = true; // ssl has an array of global gpr_mu's that are never released. // Turning this on will fail the leak check. @@ -66,18 +69,25 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { mock_endpoint, grpc_slice_from_copied_buffer((const char*)data, size)); // Load key pair and establish server SSL credentials. - grpc_ssl_pem_key_cert_pair pem_key_cert_pair; grpc_slice ca_slice, cert_slice, key_slice; - ca_slice = grpc_slice_from_static_string(test_root_cert); - cert_slice = grpc_slice_from_static_string(test_server1_cert); - key_slice = grpc_slice_from_static_string(test_server1_key); - const char* ca_cert = (const char*)GRPC_SLICE_START_PTR(ca_slice); - pem_key_cert_pair.private_key = - (const char*)GRPC_SLICE_START_PTR(key_slice); - pem_key_cert_pair.cert_chain = - (const char*)GRPC_SLICE_START_PTR(cert_slice); + GPR_ASSERT(GRPC_LOG_IF_ERROR("load_file", + grpc_load_file(CA_CERT_PATH, 1, &ca_slice))); + GPR_ASSERT(GRPC_LOG_IF_ERROR( + "load_file", grpc_load_file(SERVER_CERT_PATH, 1, &cert_slice))); + GPR_ASSERT(GRPC_LOG_IF_ERROR( + "load_file", grpc_load_file(SERVER_KEY_PATH, 1, &key_slice))); + const char* ca_cert = + reinterpret_cast GRPC_SLICE_START_PTR(ca_slice); + const char* server_cert = + reinterpret_cast GRPC_SLICE_START_PTR(cert_slice); + const char* server_key = + reinterpret_cast GRPC_SLICE_START_PTR(key_slice); + grpc_ssl_pem_key_cert_pair pem_key_cert_pair = {server_key, server_cert}; grpc_server_credentials* creds = grpc_ssl_server_credentials_create( ca_cert, &pem_key_cert_pair, 1, 0, nullptr); + grpc_slice_unref(cert_slice); + grpc_slice_unref(key_slice); + grpc_slice_unref(ca_slice); // Create security connector grpc_core::RefCountedPtr sc = @@ -109,9 +119,6 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { sc.reset(DEBUG_LOCATION, "test"); grpc_server_credentials_release(creds); - grpc_slice_unref(cert_slice); - grpc_slice_unref(key_slice); - grpc_slice_unref(ca_slice); grpc_core::ExecCtx::Get()->Flush(); } diff --git a/test/core/security/tls_security_connector_test.cc b/test/core/security/tls_security_connector_test.cc index 3f81f025a80..ef2f94a80b8 100644 --- a/test/core/security/tls_security_connector_test.cc +++ b/test/core/security/tls_security_connector_test.cc @@ -26,22 +26,39 @@ #include #include +#include "src/core/lib/iomgr/load_file.h" #include "src/core/tsi/transport_security.h" -#include "test/core/end2end/data/ssl_test_data.h" #include "test/core/util/test_config.h" +#define CA_CERT_PATH "src/core/tsi/test_creds/ca.pem" +#define SERVER_CERT_PATH "src/core/tsi/test_creds/server1.pem" +#define SERVER_KEY_PATH "src/core/tsi/test_creds/server1.key" + namespace { enum CredReloadResult { FAIL, SUCCESS, UNCHANGED, ASYNC }; void SetKeyMaterials(grpc_tls_key_materials_config* config) { - const grpc_ssl_pem_key_cert_pair pem_key_pair = { - test_server1_key, - test_server1_cert, - }; - const auto* pem_key_pair_ptr = &pem_key_pair; - grpc_tls_key_materials_config_set_key_materials(config, test_root_cert, - &pem_key_pair_ptr, 1); + grpc_slice ca_slice, cert_slice, key_slice; + GPR_ASSERT(GRPC_LOG_IF_ERROR("load_file", + grpc_load_file(CA_CERT_PATH, 1, &ca_slice))); + GPR_ASSERT(GRPC_LOG_IF_ERROR( + "load_file", grpc_load_file(SERVER_CERT_PATH, 1, &cert_slice))); + GPR_ASSERT(GRPC_LOG_IF_ERROR("load_file", + grpc_load_file(SERVER_KEY_PATH, 1, &key_slice))); + const char* ca_cert = + reinterpret_cast GRPC_SLICE_START_PTR(ca_slice); + const char* server_cert = + reinterpret_cast GRPC_SLICE_START_PTR(cert_slice); + const char* server_key = + reinterpret_cast GRPC_SLICE_START_PTR(key_slice); + grpc_ssl_pem_key_cert_pair pem_key_cert_pair = {server_key, server_cert}; + const auto* pem_key_cert_pair_ptr = &pem_key_cert_pair; + grpc_tls_key_materials_config_set_key_materials(config, ca_cert, + &pem_key_cert_pair_ptr, 1); + grpc_slice_unref(cert_slice); + grpc_slice_unref(key_slice); + grpc_slice_unref(ca_slice); } int CredReloadSuccess(void* /*config_user_data*/, diff --git a/test/core/surface/BUILD b/test/core/surface/BUILD index 37a371dc4e8..b7ea065f020 100644 --- a/test/core/surface/BUILD +++ b/test/core/surface/BUILD @@ -136,6 +136,11 @@ grpc_cc_test( grpc_cc_test( name = "sequential_connectivity_test", srcs = ["sequential_connectivity_test.cc"], + data = [ + "//src/core/tsi/test_creds:ca.pem", + "//src/core/tsi/test_creds:server1.key", + "//src/core/tsi/test_creds:server1.pem", + ], flaky = True, # TODO(b/151696318) language = "C++", deps = [ diff --git a/test/core/surface/sequential_connectivity_test.cc b/test/core/surface/sequential_connectivity_test.cc index c4a8667331c..8f7a46bfe38 100644 --- a/test/core/surface/sequential_connectivity_test.cc +++ b/test/core/surface/sequential_connectivity_test.cc @@ -25,10 +25,14 @@ #include "src/core/lib/gprpp/host_port.h" #include "src/core/lib/gprpp/thd.h" #include "src/core/lib/iomgr/exec_ctx.h" -#include "test/core/end2end/data/ssl_test_data.h" +#include "src/core/lib/iomgr/load_file.h" #include "test/core/util/port.h" #include "test/core/util/test_config.h" +#define CA_CERT_PATH "src/core/tsi/test_creds/ca.pem" +#define SERVER_CERT_PATH "src/core/tsi/test_creds/server1.pem" +#define SERVER_KEY_PATH "src/core/tsi/test_creds/server1.key" + typedef struct test_fixture { const char* name; void (*add_server_port)(grpc_server* server, const char* addr); @@ -139,17 +143,33 @@ static const test_fixture insecure_test = { }; static void secure_test_add_port(grpc_server* server, const char* addr) { - grpc_ssl_pem_key_cert_pair pem_cert_key_pair = {test_server1_key, - test_server1_cert}; + grpc_slice cert_slice, key_slice; + GPR_ASSERT(GRPC_LOG_IF_ERROR( + "load_file", grpc_load_file(SERVER_CERT_PATH, 1, &cert_slice))); + GPR_ASSERT(GRPC_LOG_IF_ERROR("load_file", + grpc_load_file(SERVER_KEY_PATH, 1, &key_slice))); + const char* server_cert = + reinterpret_cast GRPC_SLICE_START_PTR(cert_slice); + const char* server_key = + reinterpret_cast GRPC_SLICE_START_PTR(key_slice); + grpc_ssl_pem_key_cert_pair pem_key_cert_pair = {server_key, server_cert}; grpc_server_credentials* ssl_creds = grpc_ssl_server_credentials_create( - nullptr, &pem_cert_key_pair, 1, 0, nullptr); + nullptr, &pem_key_cert_pair, 1, 0, nullptr); + grpc_slice_unref(cert_slice); + grpc_slice_unref(key_slice); grpc_server_add_secure_http2_port(server, addr, ssl_creds); grpc_server_credentials_release(ssl_creds); } static grpc_channel* secure_test_create_channel(const char* addr) { + grpc_slice ca_slice; + GPR_ASSERT(GRPC_LOG_IF_ERROR("load_file", + grpc_load_file(CA_CERT_PATH, 1, &ca_slice))); + const char* test_root_cert = + reinterpret_cast GRPC_SLICE_START_PTR(ca_slice); grpc_channel_credentials* ssl_creds = grpc_ssl_credentials_create(test_root_cert, nullptr, nullptr, nullptr); + grpc_slice_unref(ca_slice); grpc_arg ssl_name_override = { GRPC_ARG_STRING, const_cast(GRPC_SSL_TARGET_NAME_OVERRIDE_ARG), diff --git a/test/core/util/grpc_fuzzer.bzl b/test/core/util/grpc_fuzzer.bzl index e0a9b78df2f..99594b29e1d 100644 --- a/test/core/util/grpc_fuzzer.bzl +++ b/test/core/util/grpc_fuzzer.bzl @@ -14,12 +14,12 @@ load("//bazel:grpc_build_system.bzl", "grpc_cc_test") -def grpc_fuzzer(name, corpus, srcs = [], deps = [], size = "large", **kwargs): +def grpc_fuzzer(name, corpus, srcs = [], deps = [], data = [], size = "large", **kwargs): grpc_cc_test( name = name, srcs = srcs, deps = deps + ["//test/core/util:fuzzer_corpus_test"], - data = native.glob([corpus + "/**"]), + data = data + native.glob([corpus + "/**"]), external_deps = [ "gtest", ], From b39feead6221a702b6a3d3873a54f6f16883f5d8 Mon Sep 17 00:00:00 2001 From: Donna Dionne Date: Tue, 14 Apr 2020 12:42:17 -0700 Subject: [PATCH 474/758] Fixing code review comments. --- .../ext/filters/client_channel/xds/xds_api.cc | 2 +- test/cpp/end2end/test_service_impl.h | 1 + test/cpp/end2end/xds_end2end_test.cc | 118 ++++++++++++++++-- 3 files changed, 111 insertions(+), 10 deletions(-) diff --git a/src/core/ext/filters/client_channel/xds/xds_api.cc b/src/core/ext/filters/client_channel/xds/xds_api.cc index 13d5b0bd4d2..eba5e25e6bf 100644 --- a/src/core/ext/filters/client_channel/xds/xds_api.cc +++ b/src/core/ext/filters/client_channel/xds/xds_api.cc @@ -1026,7 +1026,7 @@ grpc_error* RouteConfigParse( if (prefix.size > 0) { std::vector prefix_elements = absl::StrSplit( absl::string_view(prefix.data, prefix.size).substr(1), '/'); - if (prefix_elements.size() != 1) { + if (prefix_elements.size() != 2) { return GRPC_ERROR_CREATE_FROM_STATIC_STRING( "Prefix not in the required format of /service/"); } diff --git a/test/cpp/end2end/test_service_impl.h b/test/cpp/end2end/test_service_impl.h index 429ead3eb0b..ed42b1401bf 100644 --- a/test/cpp/end2end/test_service_impl.h +++ b/test/cpp/end2end/test_service_impl.h @@ -307,6 +307,7 @@ class TestMultipleServiceImpl : public RpcService { } // Unimplemented is left unimplemented to test the returned error. + Status RequestStream(ServerContext* context, ServerReader* reader, EchoResponse* response) { diff --git a/test/cpp/end2end/xds_end2end_test.cc b/test/cpp/end2end/xds_end2end_test.cc index 204df6f8687..38e7370f771 100644 --- a/test/cpp/end2end/xds_end2end_test.cc +++ b/test/cpp/end2end/xds_end2end_test.cc @@ -1363,6 +1363,87 @@ class XdsEnd2endTest : public ::testing::TestWithParam { return backend_ports; } + enum RpcServiceMethod { + TEST_ECHO, + TEST_ECHO1, + TEST_ECHO2, + TEST1_ECHO, + TEST1_ECHO1, + TEST1_ECHO2, + TEST2_ECHO, + TEST2_ECHO1, + TEST2_ECHO2, + }; + + struct RpcOptions { + RpcServiceMethod service_method = TEST_ECHO; + EchoResponse* response = nullptr; + int timeout_ms = 1000; + bool wait_for_ready = false; + bool server_fail = false; + int times = 1; + }; + + // TODO@donnadionne: Will replace SendRpc in all tests. + Status SendRpcNew(const RpcOptions& rpc_options, + EchoResponse* response = nullptr) { + const bool local_response = (response == nullptr); + if (local_response) response = new EchoResponse; + EchoRequest request; + request.set_message(kRequestMessage_); + if (rpc_options.server_fail) { + request.mutable_param()->mutable_expected_error()->set_code( + GRPC_STATUS_FAILED_PRECONDITION); + } + ClientContext context; + context.set_deadline( + grpc_timeout_milliseconds_to_deadline(rpc_options.timeout_ms)); + if (rpc_options.wait_for_ready) context.set_wait_for_ready(true); + Status status; + switch (rpc_options.service_method) { + case TEST_ECHO: + status = stub_->Echo(&context, request, response); + break; + case TEST_ECHO1: + status = stub_->Echo1(&context, request, response); + break; + case TEST_ECHO2: + status = stub_->Echo2(&context, request, response); + break; + case TEST1_ECHO: + status = stub1_->Echo(&context, request, response); + break; + case TEST1_ECHO1: + status = stub1_->Echo1(&context, request, response); + break; + case TEST1_ECHO2: + status = stub1_->Echo2(&context, request, response); + break; + case TEST2_ECHO: + status = stub2_->Echo(&context, request, response); + break; + case TEST2_ECHO1: + status = stub2_->Echo1(&context, request, response); + break; + case TEST2_ECHO2: + status = stub2_->Echo2(&context, request, response); + break; + } + if (local_response) delete response; + return status; + } + + // TODO@donnadionne: Will replace ChedkRpcSendOk in all tests. + void CheckRpcSendOkNew(const RpcOptions& rpc_options) { + for (size_t i = 0; i < rpc_options.times; ++i) { + EchoResponse response; + const Status status = SendRpcNew(rpc_options, &response); + EXPECT_TRUE(status.ok()) << "code=" << status.error_code() + << " message=" << status.error_message(); + EXPECT_EQ(response.message(), kRequestMessage_); + } + } + Status SendRpc(const string& method_name = "Echo", EchoResponse* response = nullptr, int timeout_ms = 1000, bool wait_for_ready = false, bool server_fail = false) { @@ -2186,6 +2267,9 @@ TEST_P(LdsTest, RouteHasNoRouteAction) { AdsServiceImpl::NACKED); } +// TODO@donnadionne: Add more invalid config tests to cover all errors in +// xds_api.cc + // Tests that LDS client should send a NACK if RouteAction has a // cluster_specifier other than cluster in the LDS response. TEST_P(LdsTest, RouteActionHasNoCluster) { @@ -2268,9 +2352,17 @@ TEST_P(LdsTest, XdsRoutingPathMatching) { balancers_[0]->ads_service()->BuildListener(new_route_config); balancers_[0]->ads_service()->SetLdsResource(listener, kDefaultResourceName); WaitForAllBackends(0, 2); - CheckRpcSendOk(kNumEchoRpcs, "Echo", 1000, true); - CheckRpcSendOk(kNumEcho1Rpcs, "Echo1", 1000, true); - CheckRpcSendOk(kNumEcho2Rpcs, "Echo2", 1000, true); + RpcOptions rpc_options; + rpc_options.times = kNumEchoRpcs; + rpc_options.service_method = TEST_ECHO; + rpc_options.wait_for_ready = true; + CheckRpcSendOkNew(rpc_options); + rpc_options.times = kNumEcho1Rpcs; + rpc_options.service_method = TEST1_ECHO1; + CheckRpcSendOkNew(rpc_options); + rpc_options.times = kNumEcho2Rpcs; + rpc_options.service_method = TEST2_ECHO2; + CheckRpcSendOkNew(rpc_options); // Make sure RPCs all go to the correct backend. for (size_t i = 0; i < 2; ++i) { EXPECT_EQ(kNumEchoRpcs / 2, @@ -2327,10 +2419,10 @@ TEST_P(LdsTest, XdsRoutingPrefixMatching) { RouteConfiguration new_route_config = balancers_[0]->ads_service()->default_route_config(); auto* route1 = new_route_config.mutable_virtual_hosts(0)->mutable_routes(0); - route1->mutable_match()->set_prefix("/grpc.testing.EchoTest1Service"); + route1->mutable_match()->set_prefix("/grpc.testing.EchoTest1Service/"); route1->mutable_route()->set_cluster(kNewCluster1Name); auto* route2 = new_route_config.mutable_virtual_hosts(0)->add_routes(); - route2->mutable_match()->set_prefix("/grpc.testing.EchoTest2Service"); + route2->mutable_match()->set_prefix("/grpc.testing.EchoTest2Service/"); route2->mutable_route()->set_cluster(kNewCluster2Name); auto* default_route = new_route_config.mutable_virtual_hosts(0)->add_routes(); default_route->mutable_match()->set_prefix(""); @@ -2339,9 +2431,17 @@ TEST_P(LdsTest, XdsRoutingPrefixMatching) { balancers_[0]->ads_service()->BuildListener(new_route_config); balancers_[0]->ads_service()->SetLdsResource(listener, kDefaultResourceName); WaitForAllBackends(0, 2); - CheckRpcSendOk(kNumEchoRpcs, "Echo", 1000, true); - CheckRpcSendOk(kNumEcho1Rpcs, "Echo1", 1000, true); - CheckRpcSendOk(kNumEcho2Rpcs, "Echo2", 1000, true); + RpcOptions rpc_options; + rpc_options.times = kNumEchoRpcs; + rpc_options.service_method = TEST_ECHO; + rpc_options.wait_for_ready = true; + CheckRpcSendOkNew(rpc_options); + rpc_options.times = kNumEcho1Rpcs; + rpc_options.service_method = TEST1_ECHO1; + CheckRpcSendOkNew(rpc_options); + rpc_options.times = kNumEcho2Rpcs; + rpc_options.service_method = TEST2_ECHO2; + CheckRpcSendOkNew(rpc_options); // Make sure RPCs all go to the correct backend. for (size_t i = 0; i < 2; ++i) { EXPECT_EQ(kNumEchoRpcs / 2, @@ -2438,7 +2538,7 @@ TEST_P(RdsTest, RouteMatchHasNonemptyPrefix) { route_config.mutable_virtual_hosts(0) ->mutable_routes(0) ->mutable_match() - ->set_prefix("nonempty_prefix"); + ->set_prefix("/nonempty_prefix/"); balancers_[0]->ads_service()->SetRdsResource(route_config, kDefaultResourceName); SetNextResolution({}); From 27dd9ec2c607267199cfd986f97babf3c5d83f38 Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Tue, 14 Apr 2020 12:52:05 -0700 Subject: [PATCH 475/758] Fix minimal stack test --- .../channel/minimal_stack_is_minimal_test.cc | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/test/core/channel/minimal_stack_is_minimal_test.cc b/test/core/channel/minimal_stack_is_minimal_test.cc index d02c5806f82..858fd5676a1 100644 --- a/test/core/channel/minimal_stack_is_minimal_test.cc +++ b/test/core/channel/minimal_stack_is_minimal_test.cc @@ -68,18 +68,20 @@ int main(int argc, char** argv) { grpc_channel_args minimal_stack_args = {1, &minimal_stack_arg}; errors += CHECK_STACK("unknown", &minimal_stack_args, GRPC_CLIENT_DIRECT_CHANNEL, - "authority", "message_decompress", "connected", NULL); + "authority", "connected", NULL); errors += CHECK_STACK("unknown", &minimal_stack_args, GRPC_CLIENT_SUBCHANNEL, - "authority", "message_decompress", "connected", NULL); + "authority", "connected", NULL); errors += CHECK_STACK("unknown", &minimal_stack_args, GRPC_SERVER_CHANNEL, - "server", "message_decompress", "connected", NULL); - errors += - CHECK_STACK("chttp2", &minimal_stack_args, GRPC_CLIENT_DIRECT_CHANNEL, - "authority", "http-client", "connected", NULL); + "server", "connected", NULL); + errors += CHECK_STACK("chttp2", &minimal_stack_args, + GRPC_CLIENT_DIRECT_CHANNEL, "authority", "http-client", + "message_decompress", "connected", NULL); errors += CHECK_STACK("chttp2", &minimal_stack_args, GRPC_CLIENT_SUBCHANNEL, - "authority", "http-client", "connected", NULL); - errors += CHECK_STACK("chttp2", &minimal_stack_args, GRPC_SERVER_CHANNEL, - "server", "http-server", "connected", NULL); + "authority", "http-client", "message_decompress", + "connected", NULL); + errors += + CHECK_STACK("chttp2", &minimal_stack_args, GRPC_SERVER_CHANNEL, "server", + "http-server", "message_decompress", "connected", NULL); errors += CHECK_STACK(nullptr, &minimal_stack_args, GRPC_CLIENT_CHANNEL, "client-channel", NULL); From 7d82170ec027e16a6015541cdb812660060213a3 Mon Sep 17 00:00:00 2001 From: Vijay Pai Date: Tue, 14 Apr 2020 12:56:51 -0700 Subject: [PATCH 476/758] Remove unneeded assignment --- src/core/lib/surface/server.cc | 1 - 1 file changed, 1 deletion(-) diff --git a/src/core/lib/surface/server.cc b/src/core/lib/surface/server.cc index e6c81d9d460..08b15ac001a 100644 --- a/src/core/lib/surface/server.cc +++ b/src/core/lib/surface/server.cc @@ -577,7 +577,6 @@ static void publish_new_rpc(void* arg, grpc_error* error) { rm->pending_tail->pending_next = calld; rm->pending_tail = calld; } - calld->pending_next = nullptr; gpr_mu_unlock(&server->mu_call); } From 3135d9751a4382ca2aee184cde2da68b9ba9141c Mon Sep 17 00:00:00 2001 From: Donna Dionne Date: Tue, 14 Apr 2020 13:06:16 -0700 Subject: [PATCH 477/758] Fixing a test after merge --- test/cpp/end2end/xds_end2end_test.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/cpp/end2end/xds_end2end_test.cc b/test/cpp/end2end/xds_end2end_test.cc index 25b19adff79..bec71a38398 100644 --- a/test/cpp/end2end/xds_end2end_test.cc +++ b/test/cpp/end2end/xds_end2end_test.cc @@ -1700,7 +1700,7 @@ TEST_P(BasicTest, Vanilla) { } // Check LB policy name for the channel. EXPECT_EQ( - (GetParam().use_xds_resolver() ? "cds_experimental" : "eds_experimental"), + (GetParam().use_xds_resolver() ? "xds_routing_experimental" : "eds_experimental"), channel_->GetLoadBalancingPolicyName()); } From 84b2b98af2b822de8c32e6c848483851b148b75b Mon Sep 17 00:00:00 2001 From: Donna Dionne Date: Tue, 14 Apr 2020 13:07:23 -0700 Subject: [PATCH 478/758] clang fix --- test/cpp/end2end/xds_end2end_test.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/cpp/end2end/xds_end2end_test.cc b/test/cpp/end2end/xds_end2end_test.cc index bec71a38398..f60ece08866 100644 --- a/test/cpp/end2end/xds_end2end_test.cc +++ b/test/cpp/end2end/xds_end2end_test.cc @@ -1699,9 +1699,9 @@ TEST_P(BasicTest, Vanilla) { backends_[i]->backend_service()->request_count()); } // Check LB policy name for the channel. - EXPECT_EQ( - (GetParam().use_xds_resolver() ? "xds_routing_experimental" : "eds_experimental"), - channel_->GetLoadBalancingPolicyName()); + EXPECT_EQ((GetParam().use_xds_resolver() ? "xds_routing_experimental" + : "eds_experimental"), + channel_->GetLoadBalancingPolicyName()); } TEST_P(BasicTest, IgnoresUnhealthyEndpoints) { From 13d00aef9c58686d9e1a5b03a5e50d02943afed7 Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Tue, 14 Apr 2020 13:21:02 -0700 Subject: [PATCH 479/758] Remove unnecessary header --- .../filters/http/message_decompress/message_decompress_filter.cc | 1 - 1 file changed, 1 deletion(-) diff --git a/src/core/ext/filters/http/message_decompress/message_decompress_filter.cc b/src/core/ext/filters/http/message_decompress/message_decompress_filter.cc index a53529c9bb4..65fba4146ae 100644 --- a/src/core/ext/filters/http/message_decompress/message_decompress_filter.cc +++ b/src/core/ext/filters/http/message_decompress/message_decompress_filter.cc @@ -34,7 +34,6 @@ #include "src/core/lib/compression/compression_internal.h" #include "src/core/lib/compression/message_compress.h" #include "src/core/lib/gpr/string.h" -#include "src/core/lib/gprpp/manual_constructor.h" #include "src/core/lib/slice/slice_internal.h" #include "src/core/lib/slice/slice_string_helpers.h" From eb9728f25fc27e899bc964ad51bd235185048a70 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Tue, 14 Apr 2020 13:42:12 -0700 Subject: [PATCH 480/758] Add AsyncIO support to grpcio-reflection --- .../grpc_reflection/v1alpha/BUILD.bazel | 2 +- .../grpc_reflection/v1alpha/_async.py | 57 ++++++ .../grpc_reflection/v1alpha/_base.py | 110 ++++++++++ .../grpc_reflection/v1alpha/reflection.py | 138 +++++-------- .../tests_aio/reflection/BUILD.bazel | 30 +++ .../tests_aio/reflection/__init__.py | 13 ++ .../reflection/reflection_servicer_test.py | 193 ++++++++++++++++++ 7 files changed, 450 insertions(+), 93 deletions(-) create mode 100644 src/python/grpcio_reflection/grpc_reflection/v1alpha/_async.py create mode 100644 src/python/grpcio_reflection/grpc_reflection/v1alpha/_base.py create mode 100644 src/python/grpcio_tests/tests_aio/reflection/BUILD.bazel create mode 100644 src/python/grpcio_tests/tests_aio/reflection/__init__.py create mode 100644 src/python/grpcio_tests/tests_aio/reflection/reflection_servicer_test.py diff --git a/src/python/grpcio_reflection/grpc_reflection/v1alpha/BUILD.bazel b/src/python/grpcio_reflection/grpc_reflection/v1alpha/BUILD.bazel index cf30c395c68..6e3d8e01eea 100644 --- a/src/python/grpcio_reflection/grpc_reflection/v1alpha/BUILD.bazel +++ b/src/python/grpcio_reflection/grpc_reflection/v1alpha/BUILD.bazel @@ -17,7 +17,7 @@ py_grpc_library( py_library( name = "grpc_reflection", - srcs = ["reflection.py"], + srcs = glob(["*.py"]), imports = ["../../"], deps = [ ":reflection_py_pb2", diff --git a/src/python/grpcio_reflection/grpc_reflection/v1alpha/_async.py b/src/python/grpcio_reflection/grpc_reflection/v1alpha/_async.py new file mode 100644 index 00000000000..6e684a4e5e0 --- /dev/null +++ b/src/python/grpcio_reflection/grpc_reflection/v1alpha/_async.py @@ -0,0 +1,57 @@ +# Copyright 2020 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""The AsyncIO version of the reflection servicer.""" + +from typing import AsyncIterable + +import grpc + +from grpc_reflection.v1alpha import reflection_pb2 as _reflection_pb2 +from grpc_reflection.v1alpha._base import BaseReflectionServicer + + +class ReflectionServicer(BaseReflectionServicer): + """Servicer handling RPCs for service statuses.""" + + async def ServerReflectionInfo( + self, request_iterator: AsyncIterable[ + _reflection_pb2.ServerReflectionRequest], unused_context + ) -> AsyncIterable[_reflection_pb2.ServerReflectionResponse]: + async for request in request_iterator: + if request.HasField('file_by_filename'): + yield self._file_by_filename(request.file_by_filename) + elif request.HasField('file_containing_symbol'): + yield self._file_containing_symbol( + request.file_containing_symbol) + elif request.HasField('file_containing_extension'): + yield self._file_containing_extension( + request.file_containing_extension.containing_type, + request.file_containing_extension.extension_number) + elif request.HasField('all_extension_numbers_of_type'): + yield self._all_extension_numbers_of_type( + request.all_extension_numbers_of_type) + elif request.HasField('list_services'): + yield self._list_services() + else: + yield _reflection_pb2.ServerReflectionResponse( + error_response=_reflection_pb2.ErrorResponse( + error_code=grpc.StatusCode.INVALID_ARGUMENT.value[0], + error_message=grpc.StatusCode.INVALID_ARGUMENT.value[1]. + encode(), + )) + + +__all__ = [ + "ReflectionServicer", +] diff --git a/src/python/grpcio_reflection/grpc_reflection/v1alpha/_base.py b/src/python/grpcio_reflection/grpc_reflection/v1alpha/_base.py new file mode 100644 index 00000000000..2c9e79c9dd1 --- /dev/null +++ b/src/python/grpcio_reflection/grpc_reflection/v1alpha/_base.py @@ -0,0 +1,110 @@ +# Copyright 2020 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Base implementation of reflection servicer.""" + +import grpc +from google.protobuf import descriptor_pb2 +from google.protobuf import descriptor_pool + +from grpc_reflection.v1alpha import reflection_pb2 as _reflection_pb2 +from grpc_reflection.v1alpha import reflection_pb2_grpc as _reflection_pb2_grpc + +_POOL = descriptor_pool.Default() + + +def _not_found_error(): + return _reflection_pb2.ServerReflectionResponse( + error_response=_reflection_pb2.ErrorResponse( + error_code=grpc.StatusCode.NOT_FOUND.value[0], + error_message=grpc.StatusCode.NOT_FOUND.value[1].encode(), + )) + + +def _file_descriptor_response(descriptor): + proto = descriptor_pb2.FileDescriptorProto() + descriptor.CopyToProto(proto) + serialized_proto = proto.SerializeToString() + return _reflection_pb2.ServerReflectionResponse( + file_descriptor_response=_reflection_pb2.FileDescriptorResponse( + file_descriptor_proto=(serialized_proto,)),) + + +class BaseReflectionServicer(_reflection_pb2_grpc.ServerReflectionServicer): + """Base class for reflection servicer.""" + + def __init__(self, service_names, pool=None): + """Constructor. + + Args: + service_names: Iterable of fully-qualified service names available. + pool: An optional DescriptorPool instance. + """ + self._service_names = tuple(sorted(service_names)) + self._pool = _POOL if pool is None else pool + + def _file_by_filename(self, filename): + try: + descriptor = self._pool.FindFileByName(filename) + except KeyError: + return _not_found_error() + else: + return _file_descriptor_response(descriptor) + + def _file_containing_symbol(self, fully_qualified_name): + try: + descriptor = self._pool.FindFileContainingSymbol( + fully_qualified_name) + except KeyError: + return _not_found_error() + else: + return _file_descriptor_response(descriptor) + + def _file_containing_extension(self, containing_type, extension_number): + try: + message_descriptor = self._pool.FindMessageTypeByName( + containing_type) + extension_descriptor = self._pool.FindExtensionByNumber( + message_descriptor, extension_number) + descriptor = self._pool.FindFileContainingSymbol( + extension_descriptor.full_name) + except KeyError: + return _not_found_error() + else: + return _file_descriptor_response(descriptor) + + def _all_extension_numbers_of_type(self, containing_type): + try: + message_descriptor = self._pool.FindMessageTypeByName( + containing_type) + extension_numbers = tuple( + sorted(extension.number for extension in + self._pool.FindAllExtensions(message_descriptor))) + except KeyError: + return _not_found_error() + else: + return _reflection_pb2.ServerReflectionResponse( + all_extension_numbers_response=_reflection_pb2. + ExtensionNumberResponse( + base_type_name=message_descriptor.full_name, + extension_number=extension_numbers)) + + def _list_services(self): + return _reflection_pb2.ServerReflectionResponse( + list_services_response=_reflection_pb2.ListServiceResponse(service=[ + _reflection_pb2.ServiceResponse(name=service_name) + for service_name in self._service_names + ])) + + +__all__ = ['BaseReflectionServicer'] diff --git a/src/python/grpcio_reflection/grpc_reflection/v1alpha/reflection.py b/src/python/grpcio_reflection/grpc_reflection/v1alpha/reflection.py index dde291ff740..e3cbeda7d63 100644 --- a/src/python/grpcio_reflection/grpc_reflection/v1alpha/reflection.py +++ b/src/python/grpcio_reflection/grpc_reflection/v1alpha/reflection.py @@ -13,100 +13,21 @@ # limitations under the License. """Reference implementation for reflection in gRPC Python.""" +import sys import grpc -from google.protobuf import descriptor_pb2 -from google.protobuf import descriptor_pool from grpc_reflection.v1alpha import reflection_pb2 as _reflection_pb2 from grpc_reflection.v1alpha import reflection_pb2_grpc as _reflection_pb2_grpc -_POOL = descriptor_pool.Default() +from grpc_reflection.v1alpha._base import BaseReflectionServicer + SERVICE_NAME = _reflection_pb2.DESCRIPTOR.services_by_name[ 'ServerReflection'].full_name -def _not_found_error(): - return _reflection_pb2.ServerReflectionResponse( - error_response=_reflection_pb2.ErrorResponse( - error_code=grpc.StatusCode.NOT_FOUND.value[0], - error_message=grpc.StatusCode.NOT_FOUND.value[1].encode(), - )) - - -def _file_descriptor_response(descriptor): - proto = descriptor_pb2.FileDescriptorProto() - descriptor.CopyToProto(proto) - serialized_proto = proto.SerializeToString() - return _reflection_pb2.ServerReflectionResponse( - file_descriptor_response=_reflection_pb2.FileDescriptorResponse( - file_descriptor_proto=(serialized_proto,)),) - - -class ReflectionServicer(_reflection_pb2_grpc.ServerReflectionServicer): +class ReflectionServicer(BaseReflectionServicer): """Servicer handling RPCs for service statuses.""" - def __init__(self, service_names, pool=None): - """Constructor. - - Args: - service_names: Iterable of fully-qualified service names available. - """ - self._service_names = tuple(sorted(service_names)) - self._pool = _POOL if pool is None else pool - - def _file_by_filename(self, filename): - try: - descriptor = self._pool.FindFileByName(filename) - except KeyError: - return _not_found_error() - else: - return _file_descriptor_response(descriptor) - - def _file_containing_symbol(self, fully_qualified_name): - try: - descriptor = self._pool.FindFileContainingSymbol( - fully_qualified_name) - except KeyError: - return _not_found_error() - else: - return _file_descriptor_response(descriptor) - - def _file_containing_extension(self, containing_type, extension_number): - try: - message_descriptor = self._pool.FindMessageTypeByName( - containing_type) - extension_descriptor = self._pool.FindExtensionByNumber( - message_descriptor, extension_number) - descriptor = self._pool.FindFileContainingSymbol( - extension_descriptor.full_name) - except KeyError: - return _not_found_error() - else: - return _file_descriptor_response(descriptor) - - def _all_extension_numbers_of_type(self, containing_type): - try: - message_descriptor = self._pool.FindMessageTypeByName( - containing_type) - extension_numbers = tuple( - sorted(extension.number for extension in - self._pool.FindAllExtensions(message_descriptor))) - except KeyError: - return _not_found_error() - else: - return _reflection_pb2.ServerReflectionResponse( - all_extension_numbers_response=_reflection_pb2. - ExtensionNumberResponse( - base_type_name=message_descriptor.full_name, - extension_number=extension_numbers)) - - def _list_services(self): - return _reflection_pb2.ServerReflectionResponse( - list_services_response=_reflection_pb2.ListServiceResponse(service=[ - _reflection_pb2.ServiceResponse(name=service_name) - for service_name in self._service_names - ])) - def ServerReflectionInfo(self, request_iterator, context): # pylint: disable=unused-argument for request in request_iterator: @@ -133,13 +54,46 @@ class ReflectionServicer(_reflection_pb2_grpc.ServerReflectionServicer): )) -def enable_server_reflection(service_names, server, pool=None): - """Enables server reflection on a server. +if sys.version_info[0] >= 3 and sys.version_info[1] >= 6: + # Exposes AsyncReflectionServicer as public API. + from . import _async as aio # pylint: disable=unused-import - Args: - service_names: Iterable of fully-qualified service names available. - server: grpc.Server to which reflection service will be added. - pool: DescriptorPool object to use (descriptor_pool.Default() if None). - """ - _reflection_pb2_grpc.add_ServerReflectionServicer_to_server( - ReflectionServicer(service_names, pool=pool), server) + def enable_server_reflection(service_names, server, pool=None): + """Enables server reflection on a server. + + Args: + service_names: Iterable of fully-qualified service names available. + server: grpc.Server to which reflection service will be added. + pool: DescriptorPool object to use (descriptor_pool.Default() if None). + """ + if isinstance(server, grpc.experimental.aio.Server): + _reflection_pb2_grpc.add_ServerReflectionServicer_to_server( + aio.ReflectionServicer(service_names, pool=pool), server) + else: + _reflection_pb2_grpc.add_ServerReflectionServicer_to_server( + ReflectionServicer(service_names, pool=pool), server) + + __all__ = [ + "SERVICE_NAME", + "ReflectionServicer", + "enable_server_reflection", + "aio", + ] +else: + + def enable_server_reflection(service_names, server, pool=None): + """Enables server reflection on a server. + + Args: + service_names: Iterable of fully-qualified service names available. + server: grpc.Server to which reflection service will be added. + pool: DescriptorPool object to use (descriptor_pool.Default() if None). + """ + _reflection_pb2_grpc.add_ServerReflectionServicer_to_server( + ReflectionServicer(service_names, pool=pool), server) + + __all__ = [ + "SERVICE_NAME", + "ReflectionServicer", + "enable_server_reflection", + ] diff --git a/src/python/grpcio_tests/tests_aio/reflection/BUILD.bazel b/src/python/grpcio_tests/tests_aio/reflection/BUILD.bazel new file mode 100644 index 00000000000..88bf8cc903f --- /dev/null +++ b/src/python/grpcio_tests/tests_aio/reflection/BUILD.bazel @@ -0,0 +1,30 @@ +# Copyright 2020 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +package(default_testonly = 1) + +py_test( + name = "reflection_servicer_test", + srcs = ["reflection_servicer_test.py"], + imports = ["../../"], + python_version = "PY3", + deps = [ + "//src/proto/grpc/testing:empty_py_pb2", + "//src/proto/grpc/testing/proto2:empty2_extensions_proto", + "//src/proto/grpc/testing/proto2:empty2_proto", + "//src/python/grpcio/grpc:grpcio", + "//src/python/grpcio_reflection/grpc_reflection/v1alpha:grpc_reflection", + "//src/python/grpcio_tests/tests_aio/unit:_test_base", + ], +) diff --git a/src/python/grpcio_tests/tests_aio/reflection/__init__.py b/src/python/grpcio_tests/tests_aio/reflection/__init__.py new file mode 100644 index 00000000000..5772620b602 --- /dev/null +++ b/src/python/grpcio_tests/tests_aio/reflection/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2016 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/src/python/grpcio_tests/tests_aio/reflection/reflection_servicer_test.py b/src/python/grpcio_tests/tests_aio/reflection/reflection_servicer_test.py new file mode 100644 index 00000000000..11242ed7e5d --- /dev/null +++ b/src/python/grpcio_tests/tests_aio/reflection/reflection_servicer_test.py @@ -0,0 +1,193 @@ +# Copyright 2016 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Tests of grpc_reflection.v1alpha.reflection.""" + +import logging +import unittest + +import grpc +from google.protobuf import descriptor_pb2, descriptor_pool +from grpc.experimental import aio + +from grpc_reflection.v1alpha import (reflection, reflection_pb2, + reflection_pb2_grpc) +from src.proto.grpc.testing import empty_pb2 +from src.proto.grpc.testing.proto2 import empty2_extensions_pb2 +from tests_aio.unit._test_base import AioTestBase + +_EMPTY_PROTO_FILE_NAME = 'src/proto/grpc/testing/empty.proto' +_EMPTY_PROTO_SYMBOL_NAME = 'grpc.testing.Empty' +_SERVICE_NAMES = ('Angstrom', 'Bohr', 'Curie', 'Dyson', 'Einstein', 'Feynman', + 'Galilei') +_EMPTY_EXTENSIONS_SYMBOL_NAME = 'grpc.testing.proto2.EmptyWithExtensions' +_EMPTY_EXTENSIONS_NUMBERS = ( + 124, + 125, + 126, + 127, + 128, +) + + +def _file_descriptor_to_proto(descriptor): + proto = descriptor_pb2.FileDescriptorProto() + descriptor.CopyToProto(proto) + return proto.SerializeToString() + + +class ReflectionServicerTest(AioTestBase): + + async def setUp(self): + self._server = aio.server() + reflection.enable_server_reflection(_SERVICE_NAMES, self._server) + port = self._server.add_insecure_port('[::]:0') + await self._server.start() + + self._channel = aio.insecure_channel('localhost:%d' % port) + self._stub = reflection_pb2_grpc.ServerReflectionStub(self._channel) + + async def tearDown(self): + await self._server.stop(None) + await self._channel.close() + + async def test_file_by_name(self): + requests = ( + reflection_pb2.ServerReflectionRequest( + file_by_filename=_EMPTY_PROTO_FILE_NAME), + reflection_pb2.ServerReflectionRequest( + file_by_filename='i-donut-exist'), + ) + responses = [] + async for response in self._stub.ServerReflectionInfo(iter(requests)): + responses.append(response) + expected_responses = ( + reflection_pb2.ServerReflectionResponse( + valid_host='', + file_descriptor_response=reflection_pb2.FileDescriptorResponse( + file_descriptor_proto=( + _file_descriptor_to_proto(empty_pb2.DESCRIPTOR),))), + reflection_pb2.ServerReflectionResponse( + valid_host='', + error_response=reflection_pb2.ErrorResponse( + error_code=grpc.StatusCode.NOT_FOUND.value[0], + error_message=grpc.StatusCode.NOT_FOUND.value[1].encode(), + )), + ) + self.assertSequenceEqual(expected_responses, responses) + + async def test_file_by_symbol(self): + requests = ( + reflection_pb2.ServerReflectionRequest( + file_containing_symbol=_EMPTY_PROTO_SYMBOL_NAME), + reflection_pb2.ServerReflectionRequest( + file_containing_symbol='i.donut.exist.co.uk.org.net.me.name.foo' + ), + ) + responses = [] + async for response in self._stub.ServerReflectionInfo(iter(requests)): + responses.append(response) + expected_responses = ( + reflection_pb2.ServerReflectionResponse( + valid_host='', + file_descriptor_response=reflection_pb2.FileDescriptorResponse( + file_descriptor_proto=( + _file_descriptor_to_proto(empty_pb2.DESCRIPTOR),))), + reflection_pb2.ServerReflectionResponse( + valid_host='', + error_response=reflection_pb2.ErrorResponse( + error_code=grpc.StatusCode.NOT_FOUND.value[0], + error_message=grpc.StatusCode.NOT_FOUND.value[1].encode(), + )), + ) + self.assertSequenceEqual(expected_responses, responses) + + async def test_file_containing_extension(self): + requests = ( + reflection_pb2.ServerReflectionRequest( + file_containing_extension=reflection_pb2.ExtensionRequest( + containing_type=_EMPTY_EXTENSIONS_SYMBOL_NAME, + extension_number=125, + ),), + reflection_pb2.ServerReflectionRequest( + file_containing_extension=reflection_pb2.ExtensionRequest( + containing_type='i.donut.exist.co.uk.org.net.me.name.foo', + extension_number=55, + ),), + ) + responses = [] + async for response in self._stub.ServerReflectionInfo(iter(requests)): + responses.append(response) + expected_responses = ( + reflection_pb2.ServerReflectionResponse( + valid_host='', + file_descriptor_response=reflection_pb2.FileDescriptorResponse( + file_descriptor_proto=(_file_descriptor_to_proto( + empty2_extensions_pb2.DESCRIPTOR),))), + reflection_pb2.ServerReflectionResponse( + valid_host='', + error_response=reflection_pb2.ErrorResponse( + error_code=grpc.StatusCode.NOT_FOUND.value[0], + error_message=grpc.StatusCode.NOT_FOUND.value[1].encode(), + )), + ) + self.assertSequenceEqual(expected_responses, responses) + + async def test_extension_numbers_of_type(self): + requests = ( + reflection_pb2.ServerReflectionRequest( + all_extension_numbers_of_type=_EMPTY_EXTENSIONS_SYMBOL_NAME), + reflection_pb2.ServerReflectionRequest( + all_extension_numbers_of_type='i.donut.exist.co.uk.net.name.foo' + ), + ) + responses = [] + async for response in self._stub.ServerReflectionInfo(iter(requests)): + responses.append(response) + expected_responses = ( + reflection_pb2.ServerReflectionResponse( + valid_host='', + all_extension_numbers_response=reflection_pb2. + ExtensionNumberResponse( + base_type_name=_EMPTY_EXTENSIONS_SYMBOL_NAME, + extension_number=_EMPTY_EXTENSIONS_NUMBERS)), + reflection_pb2.ServerReflectionResponse( + valid_host='', + error_response=reflection_pb2.ErrorResponse( + error_code=grpc.StatusCode.NOT_FOUND.value[0], + error_message=grpc.StatusCode.NOT_FOUND.value[1].encode(), + )), + ) + self.assertSequenceEqual(expected_responses, responses) + + async def test_list_services(self): + requests = (reflection_pb2.ServerReflectionRequest(list_services='',),) + responses = [] + async for response in self._stub.ServerReflectionInfo(iter(requests)): + responses.append(response) + expected_responses = (reflection_pb2.ServerReflectionResponse( + valid_host='', + list_services_response=reflection_pb2.ListServiceResponse( + service=tuple( + reflection_pb2.ServiceResponse(name=name) + for name in _SERVICE_NAMES))),) + self.assertSequenceEqual(expected_responses, responses) + + def test_reflection_service_name(self): + self.assertEqual(reflection.SERVICE_NAME, + 'grpc.reflection.v1alpha.ServerReflection') + + +if __name__ == '__main__': + logging.basicConfig(level=logging.DEBUG) + unittest.main(verbosity=2) From 9b4070a38072e4c64be0f4190bd8ddedc8cc4b04 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Tue, 14 Apr 2020 14:29:17 -0700 Subject: [PATCH 481/758] Fix the None return case --- .../grpc/_cython/_cygrpc/aio/server.pyx.pxi | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi index b0c62f9b9f2..ef82942e009 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi @@ -264,15 +264,18 @@ async def _finish_handler_with_unary_response(RPCState rpc_state, rpc_state.raise_for_termination() # Serializes the response message - cdef bytes response_raw = serialize( - response_serializer, - response_message, - ) + cdef bytes response_raw + cdef SendMessageOperation send_message_op + if rpc_state.status_code == StatusCode.ok: + response_raw = serialize( + response_serializer, + response_message, + ) + send_message_op = SendMessageOperation(response_raw, rpc_state.get_write_flag()) # Assembles the batch operations cdef tuple finish_ops finish_ops = ( - SendMessageOperation(response_raw, rpc_state.get_write_flag()), SendStatusFromServerOperation( rpc_state.trailing_metadata, rpc_state.status_code, @@ -280,6 +283,8 @@ async def _finish_handler_with_unary_response(RPCState rpc_state, _EMPTY_FLAGS, ), ) + if rpc_state.status_code == StatusCode.ok: + finish_ops += (send_message_op,) if not rpc_state.metadata_sent: finish_ops = prepend_send_initial_metadata_op( finish_ops, From 3e85a129b48dcdf1be70a57261be0e61f06fce8c Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Tue, 14 Apr 2020 15:53:48 -0700 Subject: [PATCH 482/758] Add test case for set_code with no return value --- .../tests_aio/unit/server_test.py | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/src/python/grpcio_tests/tests_aio/unit/server_test.py b/src/python/grpcio_tests/tests_aio/unit/server_test.py index 8c4d20b5838..43c90dc823e 100644 --- a/src/python/grpcio_tests/tests_aio/unit/server_test.py +++ b/src/python/grpcio_tests/tests_aio/unit/server_test.py @@ -38,6 +38,8 @@ _STREAM_STREAM_READER_WRITER = '/test/StreamStreamReaderWriter' _STREAM_STREAM_EVILLY_MIXED = '/test/StreamStreamEvillyMixed' _UNIMPLEMENTED_METHOD = '/test/UnimplementedMethod' _ERROR_IN_STREAM_STREAM = '/test/ErrorInStreamStream' +_ERROR_WITHOUT_RAISE_IN_UNARY_UNARY = '/test/ErrorWithoutRaiseInUnaryUnary' +_ERROR_WITHOUT_RAISE_IN_STREAM_STREAM = '/test/ErrorWithoutRaiseInStreamStream' _REQUEST = b'\x00\x00\x00' _RESPONSE = b'\x01\x01\x01' @@ -86,6 +88,12 @@ class _GenericHandler(grpc.GenericRpcHandler): _ERROR_IN_STREAM_STREAM: grpc.stream_stream_rpc_method_handler( self._error_in_stream_stream), + _ERROR_WITHOUT_RAISE_IN_UNARY_UNARY: + grpc.unary_unary_rpc_method_handler( + self._error_without_raise_in_unary_unary), + _ERROR_WITHOUT_RAISE_IN_STREAM_STREAM: + grpc.stream_stream_rpc_method_handler( + self._error_without_raise_in_stream_stream), } @staticmethod @@ -168,6 +176,16 @@ class _GenericHandler(grpc.GenericRpcHandler): raise RuntimeError('A testing RuntimeError!') yield _RESPONSE + async def _error_without_raise_in_unary_unary(self, request, context): + assert _REQUEST == request + context.set_code(grpc.StatusCode.INTERNAL) + + async def _error_without_raise_in_stream_stream(self, request_iterator, + context): + async for request in request_iterator: + assert _REQUEST == request + context.set_code(grpc.StatusCode.INTERNAL) + def service(self, handler_details): self._called.set_result(None) return self._routing_table.get(handler_details.method) @@ -426,6 +444,26 @@ class TestServer(AioTestBase): # Don't segfault here self.assertEqual(grpc.StatusCode.UNKNOWN, await call.code()) + async def test_error_without_raise_in_unary_unary(self): + call = self._channel.unary_unary(_ERROR_WITHOUT_RAISE_IN_UNARY_UNARY)( + _REQUEST) + + with self.assertRaises(aio.AioRpcError) as exception_context: + await call + + rpc_error = exception_context.exception + self.assertEqual(grpc.StatusCode.INTERNAL, rpc_error.code()) + + async def test_error_without_raise_in_stream_stream(self): + call = self._channel.stream_stream( + _ERROR_WITHOUT_RAISE_IN_STREAM_STREAM)() + + for _ in range(_NUM_STREAM_REQUESTS): + await call.write(_REQUEST) + await call.done_writing() + + self.assertEqual(grpc.StatusCode.INTERNAL, await call.code()) + if __name__ == '__main__': logging.basicConfig(level=logging.DEBUG) From faf946931d5bc8addb4ee8c795173d797eccd21e Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Tue, 14 Apr 2020 16:06:39 -0700 Subject: [PATCH 483/758] Add the new test case to tests.json --- src/python/grpcio_tests/tests_aio/tests.json | 1 + 1 file changed, 1 insertion(+) diff --git a/src/python/grpcio_tests/tests_aio/tests.json b/src/python/grpcio_tests/tests_aio/tests.json index 71f8733f5f9..f28976e360a 100644 --- a/src/python/grpcio_tests/tests_aio/tests.json +++ b/src/python/grpcio_tests/tests_aio/tests.json @@ -3,6 +3,7 @@ "health_check.health_servicer_test.HealthServicerTest", "interop.local_interop_test.InsecureLocalInteropTest", "interop.local_interop_test.SecureLocalInteropTest", + "reflection.reflection_servicer_test.ReflectionServicerTest", "unit._metadata_test.TestTypeMetadata", "unit.abort_test.TestAbort", "unit.aio_rpc_error_test.TestAioRpcError", From b8691f966973f3125152a2e3002fb520d76e56e4 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Tue, 14 Apr 2020 16:06:52 -0700 Subject: [PATCH 484/758] Fix the import for aio gRPC --- .../grpcio_reflection/grpc_reflection/v1alpha/reflection.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/python/grpcio_reflection/grpc_reflection/v1alpha/reflection.py b/src/python/grpcio_reflection/grpc_reflection/v1alpha/reflection.py index e3cbeda7d63..260b08a6b99 100644 --- a/src/python/grpcio_reflection/grpc_reflection/v1alpha/reflection.py +++ b/src/python/grpcio_reflection/grpc_reflection/v1alpha/reflection.py @@ -15,6 +15,7 @@ import sys import grpc +from grpc.experimental import aio as grpc_aio from grpc_reflection.v1alpha import reflection_pb2 as _reflection_pb2 from grpc_reflection.v1alpha import reflection_pb2_grpc as _reflection_pb2_grpc @@ -66,7 +67,7 @@ if sys.version_info[0] >= 3 and sys.version_info[1] >= 6: server: grpc.Server to which reflection service will be added. pool: DescriptorPool object to use (descriptor_pool.Default() if None). """ - if isinstance(server, grpc.experimental.aio.Server): + if isinstance(server, grpc_aio.Server): _reflection_pb2_grpc.add_ServerReflectionServicer_to_server( aio.ReflectionServicer(service_names, pool=pool), server) else: From 3e187feca0c46257b67aa414c5e086dd2cc6365c Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Tue, 14 Apr 2020 16:42:35 -0700 Subject: [PATCH 485/758] Fix the inaccurate cancel injection --- src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi index ef82942e009..e9a69513523 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi @@ -546,7 +546,10 @@ async def _handle_cancellation_from_core(object rpc_task, # Awaits cancellation from peer. await execute_batch(rpc_state, ops, loop) rpc_state.client_closed = True - if op.cancelled() and not rpc_task.done(): + # If 1) received cancel signal; 2) the Task is not finished; 3) the server + # wasn't replying final status. For condition 3, it might cause inaccurate + # log that an RPC is both aborted and cancelled. + if op.cancelled() and not rpc_task.done() and not rpc_state.status_sent: # Injects `CancelledError` to halt the RPC coroutine rpc_task.cancel() From e819e03a83154ddb82cc103e40925904bd2c982c Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Tue, 14 Apr 2020 16:44:20 -0700 Subject: [PATCH 486/758] Restore 27 compatibility --- .../grpcio_reflection/grpc_reflection/v1alpha/reflection.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/python/grpcio_reflection/grpc_reflection/v1alpha/reflection.py b/src/python/grpcio_reflection/grpc_reflection/v1alpha/reflection.py index 260b08a6b99..57e4d098e9f 100644 --- a/src/python/grpcio_reflection/grpc_reflection/v1alpha/reflection.py +++ b/src/python/grpcio_reflection/grpc_reflection/v1alpha/reflection.py @@ -15,7 +15,6 @@ import sys import grpc -from grpc.experimental import aio as grpc_aio from grpc_reflection.v1alpha import reflection_pb2 as _reflection_pb2 from grpc_reflection.v1alpha import reflection_pb2_grpc as _reflection_pb2_grpc @@ -57,7 +56,8 @@ class ReflectionServicer(BaseReflectionServicer): if sys.version_info[0] >= 3 and sys.version_info[1] >= 6: # Exposes AsyncReflectionServicer as public API. - from . import _async as aio # pylint: disable=unused-import + from . import _async as aio + from grpc.experimental import aio as grpc_aio def enable_server_reflection(service_names, server, pool=None): """Enables server reflection on a server. From 2723a1bae63152aa8523913cd6024ff217f57932 Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Tue, 14 Apr 2020 01:09:26 -0700 Subject: [PATCH 487/758] Add a new type of error, GRPC_ERROR_EOS for failing writes when end of stream has been received --- CMakeLists.txt | 2 + Makefile | 674 +----- build_autogenerated.yaml | 2 + config.m4 | 945 -------- config.w32 | 1024 --------- gRPC-Core.podspec | 1 + grpc.gemspec | 1615 -------------- grpc.gyp | 328 +-- package.xml | 1894 +---------------- .../chttp2/transport/chttp2_transport.cc | 13 +- .../ext/transport/inproc/inproc_transport.cc | 4 +- src/core/lib/iomgr/error.cc | 11 +- src/core/lib/iomgr/error.h | 6 +- src/core/lib/surface/call.cc | 13 +- src/core/lib/transport/transport.h | 12 - src/objective-c/BoringSSL-GRPC.podspec | 2 +- src/python/grpcio/grpc_core_dependencies.py | 279 --- test/core/end2end/cq_verifier.cc | 14 +- test/core/end2end/cq_verifier.h | 4 + test/core/end2end/end2end_nosec_tests.cc | 8 + test/core/end2end/end2end_tests.cc | 8 + test/core/end2end/generate_tests.bzl | 9 +- test/core/end2end/tests/client_streaming.cc | 273 +++ .../end2end/tests/streaming_error_response.cc | 10 +- tools/run_tests/generated/tests.json | 52 - 25 files changed, 359 insertions(+), 6844 deletions(-) create mode 100644 test/core/end2end/tests/client_streaming.cc diff --git a/CMakeLists.txt b/CMakeLists.txt index 27bf340b65a..2f2bcd6fb70 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -919,6 +919,7 @@ add_library(end2end_nosec_tests test/core/end2end/tests/cancel_in_a_vacuum.cc test/core/end2end/tests/cancel_with_status.cc test/core/end2end/tests/channelz.cc + test/core/end2end/tests/client_streaming.cc test/core/end2end/tests/compressed_payload.cc test/core/end2end/tests/connectivity.cc test/core/end2end/tests/default_host.cc @@ -1050,6 +1051,7 @@ add_library(end2end_tests test/core/end2end/tests/cancel_in_a_vacuum.cc test/core/end2end/tests/cancel_with_status.cc test/core/end2end/tests/channelz.cc + test/core/end2end/tests/client_streaming.cc test/core/end2end/tests/compressed_payload.cc test/core/end2end/tests/connectivity.cc test/core/end2end/tests/default_host.cc diff --git a/Makefile b/Makefile index d6c8cd19efa..6f1310cf8e6 100644 --- a/Makefile +++ b/Makefile @@ -1308,8 +1308,6 @@ xds_bootstrap_test: $(BINDIR)/$(CONFIG)/xds_bootstrap_test xds_end2end_test: $(BINDIR)/$(CONFIG)/xds_end2end_test xds_interop_client: $(BINDIR)/$(CONFIG)/xds_interop_client xds_interop_server: $(BINDIR)/$(CONFIG)/xds_interop_server -boringssl_ssl_test: $(BINDIR)/$(CONFIG)/boringssl_ssl_test -boringssl_crypto_test: $(BINDIR)/$(CONFIG)/boringssl_crypto_test alts_credentials_fuzzer_one_entry: $(BINDIR)/$(CONFIG)/alts_credentials_fuzzer_one_entry client_fuzzer_one_entry: $(BINDIR)/$(CONFIG)/client_fuzzer_one_entry hpack_parser_fuzzer_test_one_entry: $(BINDIR)/$(CONFIG)/hpack_parser_fuzzer_test_one_entry @@ -1367,7 +1365,7 @@ plugins: $(PROTOC_PLUGINS) privatelibs: privatelibs_c privatelibs_cxx -privatelibs_c: $(LIBDIR)/$(CONFIG)/libend2end_nosec_tests.a $(LIBDIR)/$(CONFIG)/libend2end_tests.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libz.a $(LIBDIR)/$(CONFIG)/libares.a +privatelibs_c: $(LIBDIR)/$(CONFIG)/libend2end_nosec_tests.a $(LIBDIR)/$(CONFIG)/libend2end_tests.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libares.a pc_c: $(LIBDIR)/$(CONFIG)/pkgconfig/grpc.pc $(LIBDIR)/$(CONFIG)/pkgconfig/gpr.pc pc_c_unsecure: $(LIBDIR)/$(CONFIG)/pkgconfig/grpc_unsecure.pc $(LIBDIR)/$(CONFIG)/pkgconfig/gpr.pc @@ -1377,7 +1375,7 @@ pc_cxx: $(LIBDIR)/$(CONFIG)/pkgconfig/grpc++.pc pc_cxx_unsecure: $(LIBDIR)/$(CONFIG)/pkgconfig/grpc++_unsecure.pc ifeq ($(EMBED_OPENSSL),true) -privatelibs_cxx: $(LIBDIR)/$(CONFIG)/libgrpc++_test.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libbenchmark.a +privatelibs_cxx: $(LIBDIR)/$(CONFIG)/libgrpc++_test.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libbenchmark.a else privatelibs_cxx: $(LIBDIR)/$(CONFIG)/libgrpc++_test.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libbenchmark.a endif @@ -1668,8 +1666,6 @@ buildtests_cxx: privatelibs_cxx \ $(BINDIR)/$(CONFIG)/xds_end2end_test \ $(BINDIR)/$(CONFIG)/xds_interop_client \ $(BINDIR)/$(CONFIG)/xds_interop_server \ - $(BINDIR)/$(CONFIG)/boringssl_ssl_test \ - $(BINDIR)/$(CONFIG)/boringssl_crypto_test \ $(BINDIR)/$(CONFIG)/alts_credentials_fuzzer_one_entry \ $(BINDIR)/$(CONFIG)/client_fuzzer_one_entry \ $(BINDIR)/$(CONFIG)/hpack_parser_fuzzer_test_one_entry \ @@ -3290,6 +3286,7 @@ LIBEND2END_NOSEC_TESTS_SRC = \ test/core/end2end/tests/cancel_in_a_vacuum.cc \ test/core/end2end/tests/cancel_with_status.cc \ test/core/end2end/tests/channelz.cc \ + test/core/end2end/tests/client_streaming.cc \ test/core/end2end/tests/compressed_payload.cc \ test/core/end2end/tests/connectivity.cc \ test/core/end2end/tests/default_host.cc \ @@ -3402,6 +3399,7 @@ LIBEND2END_TESTS_SRC = \ test/core/end2end/tests/cancel_in_a_vacuum.cc \ test/core/end2end/tests/cancel_with_status.cc \ test/core/end2end/tests/channelz.cc \ + test/core/end2end/tests/client_streaming.cc \ test/core/end2end/tests/compressed_payload.cc \ test/core/end2end/tests/connectivity.cc \ test/core/end2end/tests/default_host.cc \ @@ -5825,359 +5823,7 @@ $(OBJDIR)/$(CONFIG)/src/cpp/server/channelz/channelz_service.o: $(GENDIR)/src/pr $(OBJDIR)/$(CONFIG)/src/cpp/server/channelz/channelz_service_plugin.o: $(GENDIR)/src/proto/grpc/channelz/channelz.pb.cc $(GENDIR)/src/proto/grpc/channelz/channelz.grpc.pb.cc -LIBBORINGSSL_SRC = \ - third_party/boringssl-with-bazel/err_data.c \ - third_party/boringssl-with-bazel/src/crypto/asn1/a_bitstr.c \ - third_party/boringssl-with-bazel/src/crypto/asn1/a_bool.c \ - third_party/boringssl-with-bazel/src/crypto/asn1/a_d2i_fp.c \ - third_party/boringssl-with-bazel/src/crypto/asn1/a_dup.c \ - third_party/boringssl-with-bazel/src/crypto/asn1/a_enum.c \ - third_party/boringssl-with-bazel/src/crypto/asn1/a_gentm.c \ - third_party/boringssl-with-bazel/src/crypto/asn1/a_i2d_fp.c \ - third_party/boringssl-with-bazel/src/crypto/asn1/a_int.c \ - third_party/boringssl-with-bazel/src/crypto/asn1/a_mbstr.c \ - third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c \ - third_party/boringssl-with-bazel/src/crypto/asn1/a_octet.c \ - third_party/boringssl-with-bazel/src/crypto/asn1/a_print.c \ - third_party/boringssl-with-bazel/src/crypto/asn1/a_strnid.c \ - third_party/boringssl-with-bazel/src/crypto/asn1/a_time.c \ - third_party/boringssl-with-bazel/src/crypto/asn1/a_type.c \ - third_party/boringssl-with-bazel/src/crypto/asn1/a_utctm.c \ - third_party/boringssl-with-bazel/src/crypto/asn1/a_utf8.c \ - third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c \ - third_party/boringssl-with-bazel/src/crypto/asn1/asn1_par.c \ - third_party/boringssl-with-bazel/src/crypto/asn1/asn_pack.c \ - third_party/boringssl-with-bazel/src/crypto/asn1/f_enum.c \ - third_party/boringssl-with-bazel/src/crypto/asn1/f_int.c \ - third_party/boringssl-with-bazel/src/crypto/asn1/f_string.c \ - third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.c \ - third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c \ - third_party/boringssl-with-bazel/src/crypto/asn1/tasn_fre.c \ - third_party/boringssl-with-bazel/src/crypto/asn1/tasn_new.c \ - third_party/boringssl-with-bazel/src/crypto/asn1/tasn_typ.c \ - third_party/boringssl-with-bazel/src/crypto/asn1/tasn_utl.c \ - third_party/boringssl-with-bazel/src/crypto/asn1/time_support.c \ - third_party/boringssl-with-bazel/src/crypto/base64/base64.c \ - third_party/boringssl-with-bazel/src/crypto/bio/bio.c \ - third_party/boringssl-with-bazel/src/crypto/bio/bio_mem.c \ - third_party/boringssl-with-bazel/src/crypto/bio/connect.c \ - third_party/boringssl-with-bazel/src/crypto/bio/fd.c \ - third_party/boringssl-with-bazel/src/crypto/bio/file.c \ - third_party/boringssl-with-bazel/src/crypto/bio/hexdump.c \ - third_party/boringssl-with-bazel/src/crypto/bio/pair.c \ - third_party/boringssl-with-bazel/src/crypto/bio/printf.c \ - third_party/boringssl-with-bazel/src/crypto/bio/socket.c \ - third_party/boringssl-with-bazel/src/crypto/bio/socket_helper.c \ - third_party/boringssl-with-bazel/src/crypto/bn_extra/bn_asn1.c \ - third_party/boringssl-with-bazel/src/crypto/bn_extra/convert.c \ - third_party/boringssl-with-bazel/src/crypto/buf/buf.c \ - third_party/boringssl-with-bazel/src/crypto/bytestring/asn1_compat.c \ - third_party/boringssl-with-bazel/src/crypto/bytestring/ber.c \ - third_party/boringssl-with-bazel/src/crypto/bytestring/cbb.c \ - third_party/boringssl-with-bazel/src/crypto/bytestring/cbs.c \ - third_party/boringssl-with-bazel/src/crypto/bytestring/unicode.c \ - third_party/boringssl-with-bazel/src/crypto/chacha/chacha.c \ - third_party/boringssl-with-bazel/src/crypto/cipher_extra/cipher_extra.c \ - third_party/boringssl-with-bazel/src/crypto/cipher_extra/derive_key.c \ - third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_aesccm.c \ - third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_aesctrhmac.c \ - third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_aesgcmsiv.c \ - third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_chacha20poly1305.c \ - third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_null.c \ - third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_rc2.c \ - third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_rc4.c \ - third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_tls.c \ - third_party/boringssl-with-bazel/src/crypto/cipher_extra/tls_cbc.c \ - third_party/boringssl-with-bazel/src/crypto/cmac/cmac.c \ - third_party/boringssl-with-bazel/src/crypto/conf/conf.c \ - third_party/boringssl-with-bazel/src/crypto/cpu-aarch64-fuchsia.c \ - third_party/boringssl-with-bazel/src/crypto/cpu-aarch64-linux.c \ - third_party/boringssl-with-bazel/src/crypto/cpu-arm-linux.c \ - third_party/boringssl-with-bazel/src/crypto/cpu-arm.c \ - third_party/boringssl-with-bazel/src/crypto/cpu-intel.c \ - third_party/boringssl-with-bazel/src/crypto/cpu-ppc64le.c \ - third_party/boringssl-with-bazel/src/crypto/crypto.c \ - third_party/boringssl-with-bazel/src/crypto/curve25519/spake25519.c \ - third_party/boringssl-with-bazel/src/crypto/dh/check.c \ - third_party/boringssl-with-bazel/src/crypto/dh/dh.c \ - third_party/boringssl-with-bazel/src/crypto/dh/dh_asn1.c \ - third_party/boringssl-with-bazel/src/crypto/dh/params.c \ - third_party/boringssl-with-bazel/src/crypto/digest_extra/digest_extra.c \ - third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c \ - third_party/boringssl-with-bazel/src/crypto/dsa/dsa_asn1.c \ - third_party/boringssl-with-bazel/src/crypto/ec_extra/ec_asn1.c \ - third_party/boringssl-with-bazel/src/crypto/ec_extra/ec_derive.c \ - third_party/boringssl-with-bazel/src/crypto/ecdh_extra/ecdh_extra.c \ - third_party/boringssl-with-bazel/src/crypto/ecdsa_extra/ecdsa_asn1.c \ - third_party/boringssl-with-bazel/src/crypto/engine/engine.c \ - third_party/boringssl-with-bazel/src/crypto/err/err.c \ - third_party/boringssl-with-bazel/src/crypto/evp/digestsign.c \ - third_party/boringssl-with-bazel/src/crypto/evp/evp.c \ - third_party/boringssl-with-bazel/src/crypto/evp/evp_asn1.c \ - third_party/boringssl-with-bazel/src/crypto/evp/evp_ctx.c \ - third_party/boringssl-with-bazel/src/crypto/evp/p_dsa_asn1.c \ - third_party/boringssl-with-bazel/src/crypto/evp/p_ec.c \ - third_party/boringssl-with-bazel/src/crypto/evp/p_ec_asn1.c \ - third_party/boringssl-with-bazel/src/crypto/evp/p_ed25519.c \ - third_party/boringssl-with-bazel/src/crypto/evp/p_ed25519_asn1.c \ - third_party/boringssl-with-bazel/src/crypto/evp/p_rsa.c \ - third_party/boringssl-with-bazel/src/crypto/evp/p_rsa_asn1.c \ - third_party/boringssl-with-bazel/src/crypto/evp/p_x25519.c \ - third_party/boringssl-with-bazel/src/crypto/evp/p_x25519_asn1.c \ - third_party/boringssl-with-bazel/src/crypto/evp/pbkdf.c \ - third_party/boringssl-with-bazel/src/crypto/evp/print.c \ - third_party/boringssl-with-bazel/src/crypto/evp/scrypt.c \ - third_party/boringssl-with-bazel/src/crypto/evp/sign.c \ - third_party/boringssl-with-bazel/src/crypto/ex_data.c \ - third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c \ - third_party/boringssl-with-bazel/src/crypto/fipsmodule/fips_shared_support.c \ - third_party/boringssl-with-bazel/src/crypto/fipsmodule/is_fips.c \ - third_party/boringssl-with-bazel/src/crypto/hkdf/hkdf.c \ - third_party/boringssl-with-bazel/src/crypto/hrss/hrss.c \ - third_party/boringssl-with-bazel/src/crypto/lhash/lhash.c \ - third_party/boringssl-with-bazel/src/crypto/mem.c \ - third_party/boringssl-with-bazel/src/crypto/obj/obj.c \ - third_party/boringssl-with-bazel/src/crypto/obj/obj_xref.c \ - third_party/boringssl-with-bazel/src/crypto/pem/pem_all.c \ - third_party/boringssl-with-bazel/src/crypto/pem/pem_info.c \ - third_party/boringssl-with-bazel/src/crypto/pem/pem_lib.c \ - third_party/boringssl-with-bazel/src/crypto/pem/pem_oth.c \ - third_party/boringssl-with-bazel/src/crypto/pem/pem_pk8.c \ - third_party/boringssl-with-bazel/src/crypto/pem/pem_pkey.c \ - third_party/boringssl-with-bazel/src/crypto/pem/pem_x509.c \ - third_party/boringssl-with-bazel/src/crypto/pem/pem_xaux.c \ - third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7.c \ - third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7_x509.c \ - third_party/boringssl-with-bazel/src/crypto/pkcs8/p5_pbev2.c \ - third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8.c \ - third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c \ - third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305.c \ - third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_arm.c \ - third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_vec.c \ - third_party/boringssl-with-bazel/src/crypto/pool/pool.c \ - third_party/boringssl-with-bazel/src/crypto/rand_extra/deterministic.c \ - third_party/boringssl-with-bazel/src/crypto/rand_extra/forkunsafe.c \ - third_party/boringssl-with-bazel/src/crypto/rand_extra/fuchsia.c \ - third_party/boringssl-with-bazel/src/crypto/rand_extra/rand_extra.c \ - third_party/boringssl-with-bazel/src/crypto/rand_extra/windows.c \ - third_party/boringssl-with-bazel/src/crypto/rc4/rc4.c \ - third_party/boringssl-with-bazel/src/crypto/refcount_c11.c \ - third_party/boringssl-with-bazel/src/crypto/refcount_lock.c \ - third_party/boringssl-with-bazel/src/crypto/rsa_extra/rsa_asn1.c \ - third_party/boringssl-with-bazel/src/crypto/rsa_extra/rsa_print.c \ - third_party/boringssl-with-bazel/src/crypto/siphash/siphash.c \ - third_party/boringssl-with-bazel/src/crypto/stack/stack.c \ - third_party/boringssl-with-bazel/src/crypto/thread.c \ - third_party/boringssl-with-bazel/src/crypto/thread_none.c \ - third_party/boringssl-with-bazel/src/crypto/thread_pthread.c \ - third_party/boringssl-with-bazel/src/crypto/thread_win.c \ - third_party/boringssl-with-bazel/src/crypto/x509/a_digest.c \ - third_party/boringssl-with-bazel/src/crypto/x509/a_sign.c \ - third_party/boringssl-with-bazel/src/crypto/x509/a_strex.c \ - third_party/boringssl-with-bazel/src/crypto/x509/a_verify.c \ - third_party/boringssl-with-bazel/src/crypto/x509/algorithm.c \ - third_party/boringssl-with-bazel/src/crypto/x509/asn1_gen.c \ - third_party/boringssl-with-bazel/src/crypto/x509/by_dir.c \ - third_party/boringssl-with-bazel/src/crypto/x509/by_file.c \ - third_party/boringssl-with-bazel/src/crypto/x509/i2d_pr.c \ - third_party/boringssl-with-bazel/src/crypto/x509/rsa_pss.c \ - third_party/boringssl-with-bazel/src/crypto/x509/t_crl.c \ - third_party/boringssl-with-bazel/src/crypto/x509/t_req.c \ - third_party/boringssl-with-bazel/src/crypto/x509/t_x509.c \ - third_party/boringssl-with-bazel/src/crypto/x509/t_x509a.c \ - third_party/boringssl-with-bazel/src/crypto/x509/x509.c \ - third_party/boringssl-with-bazel/src/crypto/x509/x509_att.c \ - third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.c \ - third_party/boringssl-with-bazel/src/crypto/x509/x509_d2.c \ - third_party/boringssl-with-bazel/src/crypto/x509/x509_def.c \ - third_party/boringssl-with-bazel/src/crypto/x509/x509_ext.c \ - third_party/boringssl-with-bazel/src/crypto/x509/x509_lu.c \ - third_party/boringssl-with-bazel/src/crypto/x509/x509_obj.c \ - third_party/boringssl-with-bazel/src/crypto/x509/x509_r2x.c \ - third_party/boringssl-with-bazel/src/crypto/x509/x509_req.c \ - third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c \ - third_party/boringssl-with-bazel/src/crypto/x509/x509_trs.c \ - third_party/boringssl-with-bazel/src/crypto/x509/x509_txt.c \ - third_party/boringssl-with-bazel/src/crypto/x509/x509_v3.c \ - third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c \ - third_party/boringssl-with-bazel/src/crypto/x509/x509_vpm.c \ - third_party/boringssl-with-bazel/src/crypto/x509/x509cset.c \ - third_party/boringssl-with-bazel/src/crypto/x509/x509name.c \ - third_party/boringssl-with-bazel/src/crypto/x509/x509rset.c \ - third_party/boringssl-with-bazel/src/crypto/x509/x509spki.c \ - third_party/boringssl-with-bazel/src/crypto/x509/x_algor.c \ - third_party/boringssl-with-bazel/src/crypto/x509/x_all.c \ - third_party/boringssl-with-bazel/src/crypto/x509/x_attrib.c \ - third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c \ - third_party/boringssl-with-bazel/src/crypto/x509/x_exten.c \ - third_party/boringssl-with-bazel/src/crypto/x509/x_info.c \ - third_party/boringssl-with-bazel/src/crypto/x509/x_name.c \ - third_party/boringssl-with-bazel/src/crypto/x509/x_pkey.c \ - third_party/boringssl-with-bazel/src/crypto/x509/x_pubkey.c \ - third_party/boringssl-with-bazel/src/crypto/x509/x_req.c \ - third_party/boringssl-with-bazel/src/crypto/x509/x_sig.c \ - third_party/boringssl-with-bazel/src/crypto/x509/x_spki.c \ - third_party/boringssl-with-bazel/src/crypto/x509/x_val.c \ - third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c \ - third_party/boringssl-with-bazel/src/crypto/x509/x_x509a.c \ - third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_cache.c \ - third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_data.c \ - third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_lib.c \ - third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_map.c \ - third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_node.c \ - third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_tree.c \ - third_party/boringssl-with-bazel/src/crypto/x509v3/v3_akey.c \ - third_party/boringssl-with-bazel/src/crypto/x509v3/v3_akeya.c \ - third_party/boringssl-with-bazel/src/crypto/x509v3/v3_alt.c \ - third_party/boringssl-with-bazel/src/crypto/x509v3/v3_bcons.c \ - third_party/boringssl-with-bazel/src/crypto/x509v3/v3_bitst.c \ - third_party/boringssl-with-bazel/src/crypto/x509v3/v3_conf.c \ - third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c \ - third_party/boringssl-with-bazel/src/crypto/x509v3/v3_crld.c \ - third_party/boringssl-with-bazel/src/crypto/x509v3/v3_enum.c \ - third_party/boringssl-with-bazel/src/crypto/x509v3/v3_extku.c \ - third_party/boringssl-with-bazel/src/crypto/x509v3/v3_genn.c \ - third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ia5.c \ - third_party/boringssl-with-bazel/src/crypto/x509v3/v3_info.c \ - third_party/boringssl-with-bazel/src/crypto/x509v3/v3_int.c \ - third_party/boringssl-with-bazel/src/crypto/x509v3/v3_lib.c \ - third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ncons.c \ - third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ocsp.c \ - third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pci.c \ - third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pcia.c \ - third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pcons.c \ - third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pku.c \ - third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pmaps.c \ - third_party/boringssl-with-bazel/src/crypto/x509v3/v3_prn.c \ - third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c \ - third_party/boringssl-with-bazel/src/crypto/x509v3/v3_skey.c \ - third_party/boringssl-with-bazel/src/crypto/x509v3/v3_sxnet.c \ - third_party/boringssl-with-bazel/src/crypto/x509v3/v3_utl.c \ - third_party/boringssl-with-bazel/src/ssl/bio_ssl.cc \ - third_party/boringssl-with-bazel/src/ssl/d1_both.cc \ - third_party/boringssl-with-bazel/src/ssl/d1_lib.cc \ - third_party/boringssl-with-bazel/src/ssl/d1_pkt.cc \ - third_party/boringssl-with-bazel/src/ssl/d1_srtp.cc \ - third_party/boringssl-with-bazel/src/ssl/dtls_method.cc \ - third_party/boringssl-with-bazel/src/ssl/dtls_record.cc \ - third_party/boringssl-with-bazel/src/ssl/handoff.cc \ - third_party/boringssl-with-bazel/src/ssl/handshake.cc \ - third_party/boringssl-with-bazel/src/ssl/handshake_client.cc \ - third_party/boringssl-with-bazel/src/ssl/handshake_server.cc \ - third_party/boringssl-with-bazel/src/ssl/s3_both.cc \ - third_party/boringssl-with-bazel/src/ssl/s3_lib.cc \ - third_party/boringssl-with-bazel/src/ssl/s3_pkt.cc \ - third_party/boringssl-with-bazel/src/ssl/ssl_aead_ctx.cc \ - third_party/boringssl-with-bazel/src/ssl/ssl_asn1.cc \ - third_party/boringssl-with-bazel/src/ssl/ssl_buffer.cc \ - third_party/boringssl-with-bazel/src/ssl/ssl_cert.cc \ - third_party/boringssl-with-bazel/src/ssl/ssl_cipher.cc \ - third_party/boringssl-with-bazel/src/ssl/ssl_file.cc \ - third_party/boringssl-with-bazel/src/ssl/ssl_key_share.cc \ - third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc \ - third_party/boringssl-with-bazel/src/ssl/ssl_privkey.cc \ - third_party/boringssl-with-bazel/src/ssl/ssl_session.cc \ - third_party/boringssl-with-bazel/src/ssl/ssl_stat.cc \ - third_party/boringssl-with-bazel/src/ssl/ssl_transcript.cc \ - third_party/boringssl-with-bazel/src/ssl/ssl_versions.cc \ - third_party/boringssl-with-bazel/src/ssl/ssl_x509.cc \ - third_party/boringssl-with-bazel/src/ssl/t1_enc.cc \ - third_party/boringssl-with-bazel/src/ssl/t1_lib.cc \ - third_party/boringssl-with-bazel/src/ssl/tls13_both.cc \ - third_party/boringssl-with-bazel/src/ssl/tls13_client.cc \ - third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc \ - third_party/boringssl-with-bazel/src/ssl/tls13_server.cc \ - third_party/boringssl-with-bazel/src/ssl/tls_method.cc \ - third_party/boringssl-with-bazel/src/ssl/tls_record.cc \ - third_party/boringssl-with-bazel/src/third_party/fiat/curve25519.c \ - -PUBLIC_HEADERS_C += \ - -LIBBORINGSSL_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBBORINGSSL_SRC)))) - -$(LIBBORINGSSL_OBJS): CPPFLAGS += -Ithird_party/boringssl-with-bazel/src/include -fvisibility=hidden -DOPENSSL_NO_ASM -D_GNU_SOURCE -DWIN32_LEAN_AND_MEAN -D_HAS_EXCEPTIONS=0 -DNOMINMAX -$(LIBBORINGSSL_OBJS): CXXFLAGS += -fno-exceptions -$(LIBBORINGSSL_OBJS): CFLAGS += -g - -$(LIBDIR)/$(CONFIG)/libboringssl.a: $(ZLIB_DEP) $(CARES_DEP) $(ADDRESS_SORTING_DEP) $(UPB_DEP) $(GRPC_ABSEIL_DEP) $(LIBBORINGSSL_OBJS) - $(E) "[AR] Creating $@" - $(Q) mkdir -p `dirname $@` - $(Q) rm -f $(LIBDIR)/$(CONFIG)/libboringssl.a - $(Q) $(AR) $(AROPTS) $(LIBDIR)/$(CONFIG)/libboringssl.a $(LIBBORINGSSL_OBJS) -ifeq ($(SYSTEM),Darwin) - $(Q) ranlib -no_warning_for_no_symbols $(LIBDIR)/$(CONFIG)/libboringssl.a -endif - - - - -ifneq ($(NO_DEPS),true) --include $(LIBBORINGSSL_OBJS:.o=.dep) -endif - - -LIBBORINGSSL_TEST_UTIL_SRC = \ - third_party/boringssl-with-bazel/src/crypto/test/file_test.cc \ - third_party/boringssl-with-bazel/src/crypto/test/malloc.cc \ - third_party/boringssl-with-bazel/src/crypto/test/test_util.cc \ - third_party/boringssl-with-bazel/src/crypto/test/wycheproof_util.cc \ - -PUBLIC_HEADERS_CXX += \ - -LIBBORINGSSL_TEST_UTIL_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBBORINGSSL_TEST_UTIL_SRC)))) - -$(LIBBORINGSSL_TEST_UTIL_OBJS): CPPFLAGS += -Ithird_party/boringssl-with-bazel/src/include -fvisibility=hidden -DOPENSSL_NO_ASM -D_GNU_SOURCE -DWIN32_LEAN_AND_MEAN -D_HAS_EXCEPTIONS=0 -DNOMINMAX -$(LIBBORINGSSL_TEST_UTIL_OBJS): CXXFLAGS += -fno-exceptions -$(LIBBORINGSSL_TEST_UTIL_OBJS): CFLAGS += -g - -ifeq ($(NO_PROTOBUF),true) - -# You can't build a C++ library if you don't have protobuf - a bit overreached, but still okay. - -$(LIBDIR)/$(CONFIG)/libboringssl_test_util.a: protobuf_dep_error - - -else - -$(LIBDIR)/$(CONFIG)/libboringssl_test_util.a: $(ZLIB_DEP) $(CARES_DEP) $(ADDRESS_SORTING_DEP) $(UPB_DEP) $(GRPC_ABSEIL_DEP) $(PROTOBUF_DEP) $(LIBBORINGSSL_TEST_UTIL_OBJS) - $(E) "[AR] Creating $@" - $(Q) mkdir -p `dirname $@` - $(Q) rm -f $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a - $(Q) $(AR) $(AROPTS) $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBBORINGSSL_TEST_UTIL_OBJS) -ifeq ($(SYSTEM),Darwin) - $(Q) ranlib -no_warning_for_no_symbols $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a -endif - - - - -endif - -ifneq ($(NO_DEPS),true) --include $(LIBBORINGSSL_TEST_UTIL_OBJS:.o=.dep) -endif - - LIBBENCHMARK_SRC = \ - third_party/benchmark/src/benchmark.cc \ - third_party/benchmark/src/benchmark_api_internal.cc \ - third_party/benchmark/src/benchmark_main.cc \ - third_party/benchmark/src/benchmark_name.cc \ - third_party/benchmark/src/benchmark_register.cc \ - third_party/benchmark/src/benchmark_runner.cc \ - third_party/benchmark/src/colorprint.cc \ - third_party/benchmark/src/commandlineflags.cc \ - third_party/benchmark/src/complexity.cc \ - third_party/benchmark/src/console_reporter.cc \ - third_party/benchmark/src/counter.cc \ - third_party/benchmark/src/csv_reporter.cc \ - third_party/benchmark/src/json_reporter.cc \ - third_party/benchmark/src/reporter.cc \ - third_party/benchmark/src/sleep.cc \ - third_party/benchmark/src/statistics.cc \ - third_party/benchmark/src/string_util.cc \ - third_party/benchmark/src/sysinfo.cc \ - third_party/benchmark/src/timers.cc \ PUBLIC_HEADERS_CXX += \ @@ -6260,46 +5906,6 @@ ifneq ($(NO_DEPS),true) endif -LIBZ_SRC = \ - third_party/zlib/adler32.c \ - third_party/zlib/compress.c \ - third_party/zlib/crc32.c \ - third_party/zlib/deflate.c \ - third_party/zlib/gzclose.c \ - third_party/zlib/gzlib.c \ - third_party/zlib/gzread.c \ - third_party/zlib/gzwrite.c \ - third_party/zlib/infback.c \ - third_party/zlib/inffast.c \ - third_party/zlib/inflate.c \ - third_party/zlib/inftrees.c \ - third_party/zlib/trees.c \ - third_party/zlib/uncompr.c \ - third_party/zlib/zutil.c \ - -PUBLIC_HEADERS_C += \ - -LIBZ_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBZ_SRC)))) - -$(LIBZ_OBJS): CFLAGS += -fvisibility=hidden - -$(LIBDIR)/$(CONFIG)/libz.a: $(LIBZ_OBJS) - $(E) "[AR] Creating $@" - $(Q) mkdir -p `dirname $@` - $(Q) rm -f $(LIBDIR)/$(CONFIG)/libz.a - $(Q) $(AR) $(AROPTS) $(LIBDIR)/$(CONFIG)/libz.a $(LIBZ_OBJS) -ifeq ($(SYSTEM),Darwin) - $(Q) ranlib -no_warning_for_no_symbols $(LIBDIR)/$(CONFIG)/libz.a -endif - - - - -ifneq ($(NO_DEPS),true) --include $(LIBZ_OBJS:.o=.dep) -endif - - LIBARES_SRC = \ third_party/cares/cares/ares__close_sockets.c \ third_party/cares/cares/ares__get_hostent.c \ @@ -19205,278 +18811,6 @@ endif $(OBJDIR)/$(CONFIG)/test/cpp/interop/xds_interop_server.o: $(GENDIR)/src/proto/grpc/testing/empty.pb.cc $(GENDIR)/src/proto/grpc/testing/empty.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/test.pb.cc $(GENDIR)/src/proto/grpc/testing/test.grpc.pb.cc -BORINGSSL_SSL_TEST_SRC = \ - third_party/boringssl-with-bazel/src/crypto/test/abi_test.cc \ - third_party/boringssl-with-bazel/src/crypto/test/gtest_main.cc \ - third_party/boringssl-with-bazel/src/ssl/span_test.cc \ - third_party/boringssl-with-bazel/src/ssl/ssl_c_test.c \ - third_party/boringssl-with-bazel/src/ssl/ssl_test.cc \ - -BORINGSSL_SSL_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(BORINGSSL_SSL_TEST_SRC)))) - -# boringssl needs an override to ensure that it does not include -# system openssl headers regardless of other configuration -# we do so here with a target specific variable assignment -$(BORINGSSL_SSL_TEST_OBJS): CFLAGS := -Ithird_party/boringssl-with-bazel/src/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value $(NO_W_EXTRA_SEMI) -$(BORINGSSL_SSL_TEST_OBJS): CXXFLAGS := -Ithird_party/boringssl-with-bazel/src/include $(CXXFLAGS) -$(BORINGSSL_SSL_TEST_OBJS): CPPFLAGS += -DOPENSSL_NO_ASM -D_GNU_SOURCE - - -ifeq ($(NO_PROTOBUF),true) - -# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. - -$(BINDIR)/$(CONFIG)/boringssl_ssl_test: protobuf_dep_error - -else - -$(BINDIR)/$(CONFIG)/boringssl_ssl_test: $(PROTOBUF_DEP) $(BORINGSSL_SSL_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a - $(E) "[LD] Linking $@" - $(Q) mkdir -p `dirname $@` - $(Q) $(LDXX) $(LDFLAGS) $(BORINGSSL_SSL_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/boringssl_ssl_test - -endif - -$(BORINGSSL_SSL_TEST_OBJS): CPPFLAGS += -Ithird_party/boringssl-with-bazel/src/include -fvisibility=hidden -DOPENSSL_NO_ASM -D_GNU_SOURCE -DWIN32_LEAN_AND_MEAN -D_HAS_EXCEPTIONS=0 -DNOMINMAX -$(BORINGSSL_SSL_TEST_OBJS): CXXFLAGS += -fno-exceptions -$(BORINGSSL_SSL_TEST_OBJS): CFLAGS += -g -$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/test/abi_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a - -$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/test/gtest_main.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a - -$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/ssl/span_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a - -$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/ssl/ssl_c_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a - -$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/ssl/ssl_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a - -deps_boringssl_ssl_test: $(BORINGSSL_SSL_TEST_OBJS:.o=.dep) - -ifneq ($(NO_DEPS),true) --include $(BORINGSSL_SSL_TEST_OBJS:.o=.dep) -endif - - -BORINGSSL_CRYPTO_TEST_SRC = \ - third_party/boringssl-with-bazel/crypto_test_data.cc \ - third_party/boringssl-with-bazel/src/crypto/abi_self_test.cc \ - third_party/boringssl-with-bazel/src/crypto/asn1/asn1_test.cc \ - third_party/boringssl-with-bazel/src/crypto/base64/base64_test.cc \ - third_party/boringssl-with-bazel/src/crypto/bio/bio_test.cc \ - third_party/boringssl-with-bazel/src/crypto/buf/buf_test.cc \ - third_party/boringssl-with-bazel/src/crypto/bytestring/bytestring_test.cc \ - third_party/boringssl-with-bazel/src/crypto/chacha/chacha_test.cc \ - third_party/boringssl-with-bazel/src/crypto/cipher_extra/aead_test.cc \ - third_party/boringssl-with-bazel/src/crypto/cipher_extra/cipher_test.cc \ - third_party/boringssl-with-bazel/src/crypto/cmac/cmac_test.cc \ - third_party/boringssl-with-bazel/src/crypto/compiler_test.cc \ - third_party/boringssl-with-bazel/src/crypto/constant_time_test.cc \ - third_party/boringssl-with-bazel/src/crypto/cpu-arm-linux_test.cc \ - third_party/boringssl-with-bazel/src/crypto/curve25519/ed25519_test.cc \ - third_party/boringssl-with-bazel/src/crypto/curve25519/spake25519_test.cc \ - third_party/boringssl-with-bazel/src/crypto/curve25519/x25519_test.cc \ - third_party/boringssl-with-bazel/src/crypto/dh/dh_test.cc \ - third_party/boringssl-with-bazel/src/crypto/digest_extra/digest_test.cc \ - third_party/boringssl-with-bazel/src/crypto/dsa/dsa_test.cc \ - third_party/boringssl-with-bazel/src/crypto/ecdh_extra/ecdh_test.cc \ - third_party/boringssl-with-bazel/src/crypto/err/err_test.cc \ - third_party/boringssl-with-bazel/src/crypto/evp/evp_extra_test.cc \ - third_party/boringssl-with-bazel/src/crypto/evp/evp_test.cc \ - third_party/boringssl-with-bazel/src/crypto/evp/pbkdf_test.cc \ - third_party/boringssl-with-bazel/src/crypto/evp/scrypt_test.cc \ - third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/aes_test.cc \ - third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/bn_test.cc \ - third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_test.cc \ - third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256-x86_64_test.cc \ - third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa_test.cc \ - third_party/boringssl-with-bazel/src/crypto/fipsmodule/md5/md5_test.cc \ - third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm_test.cc \ - third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/ctrdrbg_test.cc \ - third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha_test.cc \ - third_party/boringssl-with-bazel/src/crypto/hkdf/hkdf_test.cc \ - third_party/boringssl-with-bazel/src/crypto/hmac_extra/hmac_test.cc \ - third_party/boringssl-with-bazel/src/crypto/hrss/hrss_test.cc \ - third_party/boringssl-with-bazel/src/crypto/impl_dispatch_test.cc \ - third_party/boringssl-with-bazel/src/crypto/lhash/lhash_test.cc \ - third_party/boringssl-with-bazel/src/crypto/obj/obj_test.cc \ - third_party/boringssl-with-bazel/src/crypto/pem/pem_test.cc \ - third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7_test.cc \ - third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs12_test.cc \ - third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_test.cc \ - third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_test.cc \ - third_party/boringssl-with-bazel/src/crypto/pool/pool_test.cc \ - third_party/boringssl-with-bazel/src/crypto/rand_extra/rand_test.cc \ - third_party/boringssl-with-bazel/src/crypto/refcount_test.cc \ - third_party/boringssl-with-bazel/src/crypto/rsa_extra/rsa_test.cc \ - third_party/boringssl-with-bazel/src/crypto/self_test.cc \ - third_party/boringssl-with-bazel/src/crypto/siphash/siphash_test.cc \ - third_party/boringssl-with-bazel/src/crypto/stack/stack_test.cc \ - third_party/boringssl-with-bazel/src/crypto/test/abi_test.cc \ - third_party/boringssl-with-bazel/src/crypto/test/file_test_gtest.cc \ - third_party/boringssl-with-bazel/src/crypto/test/gtest_main.cc \ - third_party/boringssl-with-bazel/src/crypto/thread_test.cc \ - third_party/boringssl-with-bazel/src/crypto/x509/x509_test.cc \ - third_party/boringssl-with-bazel/src/crypto/x509/x509_time_test.cc \ - third_party/boringssl-with-bazel/src/crypto/x509v3/tab_test.cc \ - third_party/boringssl-with-bazel/src/crypto/x509v3/v3name_test.cc \ - -BORINGSSL_CRYPTO_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(BORINGSSL_CRYPTO_TEST_SRC)))) - -# boringssl needs an override to ensure that it does not include -# system openssl headers regardless of other configuration -# we do so here with a target specific variable assignment -$(BORINGSSL_CRYPTO_TEST_OBJS): CFLAGS := -Ithird_party/boringssl-with-bazel/src/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value $(NO_W_EXTRA_SEMI) -$(BORINGSSL_CRYPTO_TEST_OBJS): CXXFLAGS := -Ithird_party/boringssl-with-bazel/src/include $(CXXFLAGS) -$(BORINGSSL_CRYPTO_TEST_OBJS): CPPFLAGS += -DOPENSSL_NO_ASM -D_GNU_SOURCE - - -ifeq ($(NO_PROTOBUF),true) - -# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. - -$(BINDIR)/$(CONFIG)/boringssl_crypto_test: protobuf_dep_error - -else - -$(BINDIR)/$(CONFIG)/boringssl_crypto_test: $(PROTOBUF_DEP) $(BORINGSSL_CRYPTO_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a - $(E) "[LD] Linking $@" - $(Q) mkdir -p `dirname $@` - $(Q) $(LDXX) $(LDFLAGS) $(BORINGSSL_CRYPTO_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/boringssl_crypto_test - -endif - -$(BORINGSSL_CRYPTO_TEST_OBJS): CPPFLAGS += -Ithird_party/boringssl-with-bazel/src/include -fvisibility=hidden -DOPENSSL_NO_ASM -D_GNU_SOURCE -DWIN32_LEAN_AND_MEAN -D_HAS_EXCEPTIONS=0 -DNOMINMAX -$(BORINGSSL_CRYPTO_TEST_OBJS): CXXFLAGS += -fno-exceptions -$(BORINGSSL_CRYPTO_TEST_OBJS): CFLAGS += -g -$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/crypto_test_data.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a - -$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/abi_self_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a - -$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a - -$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/base64/base64_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a - -$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/bio/bio_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a - -$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/buf/buf_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a - -$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/bytestring/bytestring_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a - -$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/chacha/chacha_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a - -$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/cipher_extra/aead_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a - -$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/cipher_extra/cipher_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a - -$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/cmac/cmac_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a - -$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/compiler_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a - -$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/constant_time_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a - -$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/cpu-arm-linux_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a - -$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/curve25519/ed25519_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a - -$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/curve25519/spake25519_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a - -$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/curve25519/x25519_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a - -$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/dh/dh_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a - -$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/digest_extra/digest_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a - -$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/dsa/dsa_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a - -$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/ecdh_extra/ecdh_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a - -$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/err/err_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a - -$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/evp/evp_extra_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a - -$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/evp/evp_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a - -$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/evp/pbkdf_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a - -$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/evp/scrypt_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a - -$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/aes_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a - -$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/bn_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a - -$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a - -$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256-x86_64_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a - -$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a - -$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md5/md5_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a - -$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a - -$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/ctrdrbg_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a - -$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a - -$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/hkdf/hkdf_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a - -$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/hmac_extra/hmac_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a - -$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/hrss/hrss_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a - -$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/impl_dispatch_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a - -$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/lhash/lhash_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a - -$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/obj/obj_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a - -$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/pem/pem_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a - -$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a - -$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs12_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a - -$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a - -$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a - -$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/pool/pool_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a - -$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/rand_extra/rand_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a - -$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/refcount_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a - -$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/rsa_extra/rsa_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a - -$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/self_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a - -$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/siphash/siphash_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a - -$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/stack/stack_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a - -$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/test/abi_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a - -$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/test/file_test_gtest.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a - -$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/test/gtest_main.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a - -$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/thread_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a - -$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/x509/x509_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a - -$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/x509/x509_time_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a - -$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/x509v3/tab_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a - -$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/x509v3/v3name_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a - -deps_boringssl_crypto_test: $(BORINGSSL_CRYPTO_TEST_OBJS:.o=.dep) - -ifneq ($(NO_DEPS),true) --include $(BORINGSSL_CRYPTO_TEST_OBJS:.o=.dep) -endif - - ALTS_CREDENTIALS_FUZZER_ONE_ENTRY_SRC = \ test/core/security/alts_credentials_fuzzer.cc \ test/core/util/one_corpus_entry_fuzzer.cc \ diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml index 30dba593d4f..af53ae25dc9 100644 --- a/build_autogenerated.yaml +++ b/build_autogenerated.yaml @@ -49,6 +49,7 @@ libs: - test/core/end2end/tests/cancel_in_a_vacuum.cc - test/core/end2end/tests/cancel_with_status.cc - test/core/end2end/tests/channelz.cc + - test/core/end2end/tests/client_streaming.cc - test/core/end2end/tests/compressed_payload.cc - test/core/end2end/tests/connectivity.cc - test/core/end2end/tests/default_host.cc @@ -157,6 +158,7 @@ libs: - test/core/end2end/tests/cancel_in_a_vacuum.cc - test/core/end2end/tests/cancel_with_status.cc - test/core/end2end/tests/channelz.cc + - test/core/end2end/tests/client_streaming.cc - test/core/end2end/tests/compressed_payload.cc - test/core/end2end/tests/connectivity.cc - test/core/end2end/tests/default_host.cc diff --git a/config.m4 b/config.m4 index 6b450315f4f..52ba2ef06ef 100644 --- a/config.m4 +++ b/config.m4 @@ -35,948 +35,3 @@ if test "$PHP_GRPC" != "no"; then esac PHP_SUBST(GRPC_SHARED_LIBADD) - - PHP_NEW_EXTENSION(grpc, - src/core/ext/filters/census/grpc_context.cc \ - src/core/ext/filters/client_channel/backend_metric.cc \ - src/core/ext/filters/client_channel/backup_poller.cc \ - src/core/ext/filters/client_channel/channel_connectivity.cc \ - src/core/ext/filters/client_channel/client_channel.cc \ - src/core/ext/filters/client_channel/client_channel_channelz.cc \ - src/core/ext/filters/client_channel/client_channel_factory.cc \ - src/core/ext/filters/client_channel/client_channel_plugin.cc \ - src/core/ext/filters/client_channel/global_subchannel_pool.cc \ - src/core/ext/filters/client_channel/health/health_check_client.cc \ - src/core/ext/filters/client_channel/http_connect_handshaker.cc \ - src/core/ext/filters/client_channel/http_proxy.cc \ - src/core/ext/filters/client_channel/lb_policy.cc \ - src/core/ext/filters/client_channel/lb_policy/address_filtering.cc \ - src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc \ - src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc \ - src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc \ - src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc \ - src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc \ - src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc \ - src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc \ - src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc \ - src/core/ext/filters/client_channel/lb_policy/priority/priority.cc \ - src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc \ - src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc \ - src/core/ext/filters/client_channel/lb_policy/xds/cds.cc \ - src/core/ext/filters/client_channel/lb_policy/xds/eds.cc \ - src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc \ - src/core/ext/filters/client_channel/lb_policy_registry.cc \ - src/core/ext/filters/client_channel/local_subchannel_pool.cc \ - src/core/ext/filters/client_channel/parse_address.cc \ - src/core/ext/filters/client_channel/proxy_mapper_registry.cc \ - src/core/ext/filters/client_channel/resolver.cc \ - src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc \ - src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc \ - src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc \ - src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc \ - src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc \ - src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc \ - src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc \ - src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_libuv.cc \ - src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_posix.cc \ - src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc \ - src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.cc \ - src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc \ - src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc \ - src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc \ - src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc \ - src/core/ext/filters/client_channel/resolver_registry.cc \ - src/core/ext/filters/client_channel/resolver_result_parsing.cc \ - src/core/ext/filters/client_channel/resolving_lb_policy.cc \ - src/core/ext/filters/client_channel/retry_throttle.cc \ - src/core/ext/filters/client_channel/server_address.cc \ - src/core/ext/filters/client_channel/service_config.cc \ - src/core/ext/filters/client_channel/subchannel.cc \ - src/core/ext/filters/client_channel/subchannel_pool_interface.cc \ - src/core/ext/filters/client_channel/xds/xds_api.cc \ - src/core/ext/filters/client_channel/xds/xds_bootstrap.cc \ - src/core/ext/filters/client_channel/xds/xds_channel_secure.cc \ - src/core/ext/filters/client_channel/xds/xds_client.cc \ - src/core/ext/filters/client_channel/xds/xds_client_stats.cc \ - src/core/ext/filters/client_idle/client_idle_filter.cc \ - src/core/ext/filters/deadline/deadline_filter.cc \ - src/core/ext/filters/http/client/http_client_filter.cc \ - src/core/ext/filters/http/client_authority_filter.cc \ - src/core/ext/filters/http/http_filters_plugin.cc \ - src/core/ext/filters/http/message_compress/message_compress_filter.cc \ - src/core/ext/filters/http/server/http_server_filter.cc \ - src/core/ext/filters/max_age/max_age_filter.cc \ - src/core/ext/filters/message_size/message_size_filter.cc \ - src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc \ - src/core/ext/filters/workarounds/workaround_utils.cc \ - src/core/ext/transport/chttp2/alpn/alpn.cc \ - src/core/ext/transport/chttp2/client/authority.cc \ - src/core/ext/transport/chttp2/client/chttp2_connector.cc \ - src/core/ext/transport/chttp2/client/insecure/channel_create.cc \ - src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc \ - src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc \ - src/core/ext/transport/chttp2/server/chttp2_server.cc \ - src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc \ - src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc \ - src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc \ - src/core/ext/transport/chttp2/transport/bin_decoder.cc \ - src/core/ext/transport/chttp2/transport/bin_encoder.cc \ - src/core/ext/transport/chttp2/transport/chttp2_plugin.cc \ - src/core/ext/transport/chttp2/transport/chttp2_transport.cc \ - src/core/ext/transport/chttp2/transport/context_list.cc \ - src/core/ext/transport/chttp2/transport/flow_control.cc \ - src/core/ext/transport/chttp2/transport/frame_data.cc \ - src/core/ext/transport/chttp2/transport/frame_goaway.cc \ - src/core/ext/transport/chttp2/transport/frame_ping.cc \ - src/core/ext/transport/chttp2/transport/frame_rst_stream.cc \ - src/core/ext/transport/chttp2/transport/frame_settings.cc \ - src/core/ext/transport/chttp2/transport/frame_window_update.cc \ - src/core/ext/transport/chttp2/transport/hpack_encoder.cc \ - src/core/ext/transport/chttp2/transport/hpack_parser.cc \ - src/core/ext/transport/chttp2/transport/hpack_table.cc \ - src/core/ext/transport/chttp2/transport/http2_settings.cc \ - src/core/ext/transport/chttp2/transport/huffsyms.cc \ - src/core/ext/transport/chttp2/transport/incoming_metadata.cc \ - src/core/ext/transport/chttp2/transport/parsing.cc \ - src/core/ext/transport/chttp2/transport/stream_lists.cc \ - src/core/ext/transport/chttp2/transport/stream_map.cc \ - src/core/ext/transport/chttp2/transport/varint.cc \ - src/core/ext/transport/chttp2/transport/writing.cc \ - src/core/ext/transport/inproc/inproc_plugin.cc \ - src/core/ext/transport/inproc/inproc_transport.cc \ - src/core/ext/upb-generated/envoy/annotations/deprecation.upb.c \ - src/core/ext/upb-generated/envoy/annotations/resource.upb.c \ - src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c \ - src/core/ext/upb-generated/envoy/api/v2/cds.upb.c \ - src/core/ext/upb-generated/envoy/api/v2/cluster.upb.c \ - src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c \ - src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.c \ - src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c \ - src/core/ext/upb-generated/envoy/api/v2/core/address.upb.c \ - src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c \ - src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c \ - src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c \ - src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c \ - src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.c \ - src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c \ - src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c \ - src/core/ext/upb-generated/envoy/api/v2/eds.upb.c \ - src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.c \ - src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.c \ - src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.c \ - src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.c \ - src/core/ext/upb-generated/envoy/api/v2/lds.upb.c \ - src/core/ext/upb-generated/envoy/api/v2/listener.upb.c \ - src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.c \ - src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.c \ - src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.c \ - src/core/ext/upb-generated/envoy/api/v2/rds.upb.c \ - src/core/ext/upb-generated/envoy/api/v2/route.upb.c \ - src/core/ext/upb-generated/envoy/api/v2/route/route.upb.c \ - src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.c \ - src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.c \ - src/core/ext/upb-generated/envoy/api/v2/srds.upb.c \ - src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.c \ - src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.c \ - src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.c \ - src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.c \ - src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.c \ - src/core/ext/upb-generated/envoy/type/http.upb.c \ - src/core/ext/upb-generated/envoy/type/matcher/regex.upb.c \ - src/core/ext/upb-generated/envoy/type/matcher/string.upb.c \ - src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.c \ - src/core/ext/upb-generated/envoy/type/percent.upb.c \ - src/core/ext/upb-generated/envoy/type/range.upb.c \ - src/core/ext/upb-generated/envoy/type/semantic_version.upb.c \ - src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.c \ - src/core/ext/upb-generated/gogoproto/gogo.upb.c \ - src/core/ext/upb-generated/google/api/annotations.upb.c \ - src/core/ext/upb-generated/google/api/http.upb.c \ - src/core/ext/upb-generated/google/protobuf/any.upb.c \ - src/core/ext/upb-generated/google/protobuf/descriptor.upb.c \ - src/core/ext/upb-generated/google/protobuf/duration.upb.c \ - src/core/ext/upb-generated/google/protobuf/empty.upb.c \ - src/core/ext/upb-generated/google/protobuf/struct.upb.c \ - src/core/ext/upb-generated/google/protobuf/timestamp.upb.c \ - src/core/ext/upb-generated/google/protobuf/wrappers.upb.c \ - src/core/ext/upb-generated/google/rpc/status.upb.c \ - src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c \ - src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c \ - src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c \ - src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c \ - src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c \ - src/core/ext/upb-generated/udpa/annotations/migrate.upb.c \ - src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c \ - src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c \ - src/core/ext/upb-generated/validate/validate.upb.c \ - src/core/lib/avl/avl.cc \ - src/core/lib/backoff/backoff.cc \ - src/core/lib/channel/channel_args.cc \ - src/core/lib/channel/channel_stack.cc \ - src/core/lib/channel/channel_stack_builder.cc \ - src/core/lib/channel/channel_trace.cc \ - src/core/lib/channel/channelz.cc \ - src/core/lib/channel/channelz_registry.cc \ - src/core/lib/channel/connected_channel.cc \ - src/core/lib/channel/handshaker.cc \ - src/core/lib/channel/handshaker_registry.cc \ - src/core/lib/channel/status_util.cc \ - src/core/lib/compression/compression.cc \ - src/core/lib/compression/compression_args.cc \ - src/core/lib/compression/compression_internal.cc \ - src/core/lib/compression/message_compress.cc \ - src/core/lib/compression/stream_compression.cc \ - src/core/lib/compression/stream_compression_gzip.cc \ - src/core/lib/compression/stream_compression_identity.cc \ - src/core/lib/debug/stats.cc \ - src/core/lib/debug/stats_data.cc \ - src/core/lib/debug/trace.cc \ - src/core/lib/gpr/alloc.cc \ - src/core/lib/gpr/atm.cc \ - src/core/lib/gpr/cpu_iphone.cc \ - src/core/lib/gpr/cpu_linux.cc \ - src/core/lib/gpr/cpu_posix.cc \ - src/core/lib/gpr/cpu_windows.cc \ - src/core/lib/gpr/env_linux.cc \ - src/core/lib/gpr/env_posix.cc \ - src/core/lib/gpr/env_windows.cc \ - src/core/lib/gpr/log.cc \ - src/core/lib/gpr/log_android.cc \ - src/core/lib/gpr/log_linux.cc \ - src/core/lib/gpr/log_posix.cc \ - src/core/lib/gpr/log_windows.cc \ - src/core/lib/gpr/murmur_hash.cc \ - src/core/lib/gpr/string.cc \ - src/core/lib/gpr/string_posix.cc \ - src/core/lib/gpr/string_util_windows.cc \ - src/core/lib/gpr/string_windows.cc \ - src/core/lib/gpr/sync.cc \ - src/core/lib/gpr/sync_abseil.cc \ - src/core/lib/gpr/sync_posix.cc \ - src/core/lib/gpr/sync_windows.cc \ - src/core/lib/gpr/time.cc \ - src/core/lib/gpr/time_posix.cc \ - src/core/lib/gpr/time_precise.cc \ - src/core/lib/gpr/time_windows.cc \ - src/core/lib/gpr/tls_pthread.cc \ - src/core/lib/gpr/tmpfile_msys.cc \ - src/core/lib/gpr/tmpfile_posix.cc \ - src/core/lib/gpr/tmpfile_windows.cc \ - src/core/lib/gpr/wrap_memcpy.cc \ - src/core/lib/gprpp/arena.cc \ - src/core/lib/gprpp/fork.cc \ - src/core/lib/gprpp/global_config_env.cc \ - src/core/lib/gprpp/host_port.cc \ - src/core/lib/gprpp/mpscq.cc \ - src/core/lib/gprpp/thd_posix.cc \ - src/core/lib/gprpp/thd_windows.cc \ - src/core/lib/http/format_request.cc \ - src/core/lib/http/httpcli.cc \ - src/core/lib/http/httpcli_security_connector.cc \ - src/core/lib/http/parser.cc \ - src/core/lib/iomgr/buffer_list.cc \ - src/core/lib/iomgr/call_combiner.cc \ - src/core/lib/iomgr/cfstream_handle.cc \ - src/core/lib/iomgr/combiner.cc \ - src/core/lib/iomgr/dualstack_socket_posix.cc \ - src/core/lib/iomgr/endpoint.cc \ - src/core/lib/iomgr/endpoint_cfstream.cc \ - src/core/lib/iomgr/endpoint_pair_posix.cc \ - src/core/lib/iomgr/endpoint_pair_uv.cc \ - src/core/lib/iomgr/endpoint_pair_windows.cc \ - src/core/lib/iomgr/error.cc \ - src/core/lib/iomgr/error_cfstream.cc \ - src/core/lib/iomgr/ev_epoll1_linux.cc \ - src/core/lib/iomgr/ev_epollex_linux.cc \ - src/core/lib/iomgr/ev_poll_posix.cc \ - src/core/lib/iomgr/ev_posix.cc \ - src/core/lib/iomgr/ev_windows.cc \ - src/core/lib/iomgr/exec_ctx.cc \ - src/core/lib/iomgr/executor.cc \ - src/core/lib/iomgr/executor/mpmcqueue.cc \ - src/core/lib/iomgr/executor/threadpool.cc \ - src/core/lib/iomgr/fork_posix.cc \ - src/core/lib/iomgr/fork_windows.cc \ - src/core/lib/iomgr/gethostname_fallback.cc \ - src/core/lib/iomgr/gethostname_host_name_max.cc \ - src/core/lib/iomgr/gethostname_sysconf.cc \ - src/core/lib/iomgr/grpc_if_nametoindex_posix.cc \ - src/core/lib/iomgr/grpc_if_nametoindex_unsupported.cc \ - src/core/lib/iomgr/internal_errqueue.cc \ - src/core/lib/iomgr/iocp_windows.cc \ - src/core/lib/iomgr/iomgr.cc \ - src/core/lib/iomgr/iomgr_custom.cc \ - src/core/lib/iomgr/iomgr_internal.cc \ - src/core/lib/iomgr/iomgr_posix.cc \ - src/core/lib/iomgr/iomgr_posix_cfstream.cc \ - src/core/lib/iomgr/iomgr_uv.cc \ - src/core/lib/iomgr/iomgr_windows.cc \ - src/core/lib/iomgr/is_epollexclusive_available.cc \ - src/core/lib/iomgr/load_file.cc \ - src/core/lib/iomgr/lockfree_event.cc \ - src/core/lib/iomgr/poller/eventmanager_libuv.cc \ - src/core/lib/iomgr/polling_entity.cc \ - src/core/lib/iomgr/pollset.cc \ - src/core/lib/iomgr/pollset_custom.cc \ - src/core/lib/iomgr/pollset_set.cc \ - src/core/lib/iomgr/pollset_set_custom.cc \ - src/core/lib/iomgr/pollset_set_windows.cc \ - src/core/lib/iomgr/pollset_uv.cc \ - src/core/lib/iomgr/pollset_windows.cc \ - src/core/lib/iomgr/resolve_address.cc \ - src/core/lib/iomgr/resolve_address_custom.cc \ - src/core/lib/iomgr/resolve_address_posix.cc \ - src/core/lib/iomgr/resolve_address_windows.cc \ - src/core/lib/iomgr/resource_quota.cc \ - src/core/lib/iomgr/sockaddr_utils.cc \ - src/core/lib/iomgr/socket_factory_posix.cc \ - src/core/lib/iomgr/socket_mutator.cc \ - src/core/lib/iomgr/socket_utils_common_posix.cc \ - src/core/lib/iomgr/socket_utils_linux.cc \ - src/core/lib/iomgr/socket_utils_posix.cc \ - src/core/lib/iomgr/socket_utils_uv.cc \ - src/core/lib/iomgr/socket_utils_windows.cc \ - src/core/lib/iomgr/socket_windows.cc \ - src/core/lib/iomgr/tcp_client.cc \ - src/core/lib/iomgr/tcp_client_cfstream.cc \ - src/core/lib/iomgr/tcp_client_custom.cc \ - src/core/lib/iomgr/tcp_client_posix.cc \ - src/core/lib/iomgr/tcp_client_windows.cc \ - src/core/lib/iomgr/tcp_custom.cc \ - src/core/lib/iomgr/tcp_posix.cc \ - src/core/lib/iomgr/tcp_server.cc \ - src/core/lib/iomgr/tcp_server_custom.cc \ - src/core/lib/iomgr/tcp_server_posix.cc \ - src/core/lib/iomgr/tcp_server_utils_posix_common.cc \ - src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc \ - src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.cc \ - src/core/lib/iomgr/tcp_server_windows.cc \ - src/core/lib/iomgr/tcp_uv.cc \ - src/core/lib/iomgr/tcp_windows.cc \ - src/core/lib/iomgr/time_averaged_stats.cc \ - src/core/lib/iomgr/timer.cc \ - src/core/lib/iomgr/timer_custom.cc \ - src/core/lib/iomgr/timer_generic.cc \ - src/core/lib/iomgr/timer_heap.cc \ - src/core/lib/iomgr/timer_manager.cc \ - src/core/lib/iomgr/timer_uv.cc \ - src/core/lib/iomgr/udp_server.cc \ - src/core/lib/iomgr/unix_sockets_posix.cc \ - src/core/lib/iomgr/unix_sockets_posix_noop.cc \ - src/core/lib/iomgr/wakeup_fd_eventfd.cc \ - src/core/lib/iomgr/wakeup_fd_nospecial.cc \ - src/core/lib/iomgr/wakeup_fd_pipe.cc \ - src/core/lib/iomgr/wakeup_fd_posix.cc \ - src/core/lib/iomgr/work_serializer.cc \ - src/core/lib/json/json_reader.cc \ - src/core/lib/json/json_writer.cc \ - src/core/lib/profiling/basic_timers.cc \ - src/core/lib/profiling/stap_timers.cc \ - src/core/lib/security/context/security_context.cc \ - src/core/lib/security/credentials/alts/alts_credentials.cc \ - src/core/lib/security/credentials/alts/check_gcp_environment.cc \ - src/core/lib/security/credentials/alts/check_gcp_environment_linux.cc \ - src/core/lib/security/credentials/alts/check_gcp_environment_no_op.cc \ - src/core/lib/security/credentials/alts/check_gcp_environment_windows.cc \ - src/core/lib/security/credentials/alts/grpc_alts_credentials_client_options.cc \ - src/core/lib/security/credentials/alts/grpc_alts_credentials_options.cc \ - src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc \ - src/core/lib/security/credentials/composite/composite_credentials.cc \ - src/core/lib/security/credentials/credentials.cc \ - src/core/lib/security/credentials/credentials_metadata.cc \ - src/core/lib/security/credentials/fake/fake_credentials.cc \ - src/core/lib/security/credentials/google_default/credentials_generic.cc \ - src/core/lib/security/credentials/google_default/google_default_credentials.cc \ - src/core/lib/security/credentials/iam/iam_credentials.cc \ - src/core/lib/security/credentials/jwt/json_token.cc \ - src/core/lib/security/credentials/jwt/jwt_credentials.cc \ - src/core/lib/security/credentials/jwt/jwt_verifier.cc \ - src/core/lib/security/credentials/local/local_credentials.cc \ - src/core/lib/security/credentials/oauth2/oauth2_credentials.cc \ - src/core/lib/security/credentials/plugin/plugin_credentials.cc \ - src/core/lib/security/credentials/ssl/ssl_credentials.cc \ - src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc \ - src/core/lib/security/credentials/tls/tls_credentials.cc \ - src/core/lib/security/security_connector/alts/alts_security_connector.cc \ - src/core/lib/security/security_connector/fake/fake_security_connector.cc \ - src/core/lib/security/security_connector/load_system_roots_fallback.cc \ - src/core/lib/security/security_connector/load_system_roots_linux.cc \ - src/core/lib/security/security_connector/local/local_security_connector.cc \ - src/core/lib/security/security_connector/security_connector.cc \ - src/core/lib/security/security_connector/ssl/ssl_security_connector.cc \ - src/core/lib/security/security_connector/ssl_utils.cc \ - src/core/lib/security/security_connector/ssl_utils_config.cc \ - src/core/lib/security/security_connector/tls/tls_security_connector.cc \ - src/core/lib/security/transport/client_auth_filter.cc \ - src/core/lib/security/transport/secure_endpoint.cc \ - src/core/lib/security/transport/security_handshaker.cc \ - src/core/lib/security/transport/server_auth_filter.cc \ - src/core/lib/security/transport/target_authority_table.cc \ - src/core/lib/security/transport/tsi_error.cc \ - src/core/lib/security/util/json_util.cc \ - src/core/lib/slice/b64.cc \ - src/core/lib/slice/percent_encoding.cc \ - src/core/lib/slice/slice.cc \ - src/core/lib/slice/slice_buffer.cc \ - src/core/lib/slice/slice_intern.cc \ - src/core/lib/slice/slice_string_helpers.cc \ - src/core/lib/surface/api_trace.cc \ - src/core/lib/surface/byte_buffer.cc \ - src/core/lib/surface/byte_buffer_reader.cc \ - src/core/lib/surface/call.cc \ - src/core/lib/surface/call_details.cc \ - src/core/lib/surface/call_log_batch.cc \ - src/core/lib/surface/channel.cc \ - src/core/lib/surface/channel_init.cc \ - src/core/lib/surface/channel_ping.cc \ - src/core/lib/surface/channel_stack_type.cc \ - src/core/lib/surface/completion_queue.cc \ - src/core/lib/surface/completion_queue_factory.cc \ - src/core/lib/surface/event_string.cc \ - src/core/lib/surface/init.cc \ - src/core/lib/surface/init_secure.cc \ - src/core/lib/surface/lame_client.cc \ - src/core/lib/surface/metadata_array.cc \ - src/core/lib/surface/server.cc \ - src/core/lib/surface/validate_metadata.cc \ - src/core/lib/surface/version.cc \ - src/core/lib/transport/bdp_estimator.cc \ - src/core/lib/transport/byte_stream.cc \ - src/core/lib/transport/connectivity_state.cc \ - src/core/lib/transport/error_utils.cc \ - src/core/lib/transport/metadata.cc \ - src/core/lib/transport/metadata_batch.cc \ - src/core/lib/transport/pid_controller.cc \ - src/core/lib/transport/static_metadata.cc \ - src/core/lib/transport/status_conversion.cc \ - src/core/lib/transport/status_metadata.cc \ - src/core/lib/transport/timeout_encoding.cc \ - src/core/lib/transport/transport.cc \ - src/core/lib/transport/transport_op_string.cc \ - src/core/lib/uri/uri_parser.cc \ - src/core/plugin_registry/grpc_plugin_registry.cc \ - src/core/tsi/alts/crypt/aes_gcm.cc \ - src/core/tsi/alts/crypt/gsec.cc \ - src/core/tsi/alts/frame_protector/alts_counter.cc \ - src/core/tsi/alts/frame_protector/alts_crypter.cc \ - src/core/tsi/alts/frame_protector/alts_frame_protector.cc \ - src/core/tsi/alts/frame_protector/alts_record_protocol_crypter_common.cc \ - src/core/tsi/alts/frame_protector/alts_seal_privacy_integrity_crypter.cc \ - src/core/tsi/alts/frame_protector/alts_unseal_privacy_integrity_crypter.cc \ - src/core/tsi/alts/frame_protector/frame_handler.cc \ - src/core/tsi/alts/handshaker/alts_handshaker_client.cc \ - src/core/tsi/alts/handshaker/alts_shared_resource.cc \ - src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc \ - src/core/tsi/alts/handshaker/alts_tsi_utils.cc \ - src/core/tsi/alts/handshaker/transport_security_common_api.cc \ - src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc \ - src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.cc \ - src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc \ - src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.cc \ - src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc \ - src/core/tsi/fake_transport_security.cc \ - src/core/tsi/local_transport_security.cc \ - src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc \ - src/core/tsi/ssl/session_cache/ssl_session_cache.cc \ - src/core/tsi/ssl/session_cache/ssl_session_openssl.cc \ - src/core/tsi/ssl_transport_security.cc \ - src/core/tsi/transport_security.cc \ - src/core/tsi/transport_security_grpc.cc \ - src/php/ext/grpc/byte_buffer.c \ - src/php/ext/grpc/call.c \ - src/php/ext/grpc/call_credentials.c \ - src/php/ext/grpc/channel.c \ - src/php/ext/grpc/channel_credentials.c \ - src/php/ext/grpc/completion_queue.c \ - src/php/ext/grpc/php_grpc.c \ - src/php/ext/grpc/server.c \ - src/php/ext/grpc/server_credentials.c \ - src/php/ext/grpc/timeval.c \ - third_party/abseil-cpp/absl/base/dynamic_annotations.cc \ - third_party/abseil-cpp/absl/base/internal/cycleclock.cc \ - third_party/abseil-cpp/absl/base/internal/raw_logging.cc \ - third_party/abseil-cpp/absl/base/internal/spinlock.cc \ - third_party/abseil-cpp/absl/base/internal/spinlock_wait.cc \ - third_party/abseil-cpp/absl/base/internal/sysinfo.cc \ - third_party/abseil-cpp/absl/base/internal/thread_identity.cc \ - third_party/abseil-cpp/absl/base/internal/throw_delegate.cc \ - third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc \ - third_party/abseil-cpp/absl/base/log_severity.cc \ - third_party/abseil-cpp/absl/numeric/int128.cc \ - third_party/abseil-cpp/absl/strings/ascii.cc \ - third_party/abseil-cpp/absl/strings/charconv.cc \ - third_party/abseil-cpp/absl/strings/escaping.cc \ - third_party/abseil-cpp/absl/strings/internal/charconv_bigint.cc \ - third_party/abseil-cpp/absl/strings/internal/charconv_parse.cc \ - third_party/abseil-cpp/absl/strings/internal/escaping.cc \ - third_party/abseil-cpp/absl/strings/internal/memutil.cc \ - third_party/abseil-cpp/absl/strings/internal/ostringstream.cc \ - third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc \ - third_party/abseil-cpp/absl/strings/internal/str_format/bind.cc \ - third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc \ - third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc \ - third_party/abseil-cpp/absl/strings/internal/str_format/output.cc \ - third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc \ - third_party/abseil-cpp/absl/strings/internal/utf8.cc \ - third_party/abseil-cpp/absl/strings/match.cc \ - third_party/abseil-cpp/absl/strings/numbers.cc \ - third_party/abseil-cpp/absl/strings/str_cat.cc \ - third_party/abseil-cpp/absl/strings/str_replace.cc \ - third_party/abseil-cpp/absl/strings/str_split.cc \ - third_party/abseil-cpp/absl/strings/string_view.cc \ - third_party/abseil-cpp/absl/strings/substitute.cc \ - third_party/abseil-cpp/absl/time/civil_time.cc \ - third_party/abseil-cpp/absl/time/clock.cc \ - third_party/abseil-cpp/absl/time/duration.cc \ - third_party/abseil-cpp/absl/time/format.cc \ - third_party/abseil-cpp/absl/time/internal/cctz/src/civil_time_detail.cc \ - third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_fixed.cc \ - third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc \ - third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_if.cc \ - third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.cc \ - third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.cc \ - third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.cc \ - third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc \ - third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_posix.cc \ - third_party/abseil-cpp/absl/time/internal/cctz/src/zone_info_source.cc \ - third_party/abseil-cpp/absl/time/time.cc \ - third_party/abseil-cpp/absl/types/bad_optional_access.cc \ - third_party/address_sorting/address_sorting.c \ - third_party/address_sorting/address_sorting_posix.c \ - third_party/address_sorting/address_sorting_windows.c \ - third_party/boringssl-with-bazel/err_data.c \ - third_party/boringssl-with-bazel/src/crypto/asn1/a_bitstr.c \ - third_party/boringssl-with-bazel/src/crypto/asn1/a_bool.c \ - third_party/boringssl-with-bazel/src/crypto/asn1/a_d2i_fp.c \ - third_party/boringssl-with-bazel/src/crypto/asn1/a_dup.c \ - third_party/boringssl-with-bazel/src/crypto/asn1/a_enum.c \ - third_party/boringssl-with-bazel/src/crypto/asn1/a_gentm.c \ - third_party/boringssl-with-bazel/src/crypto/asn1/a_i2d_fp.c \ - third_party/boringssl-with-bazel/src/crypto/asn1/a_int.c \ - third_party/boringssl-with-bazel/src/crypto/asn1/a_mbstr.c \ - third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c \ - third_party/boringssl-with-bazel/src/crypto/asn1/a_octet.c \ - third_party/boringssl-with-bazel/src/crypto/asn1/a_print.c \ - third_party/boringssl-with-bazel/src/crypto/asn1/a_strnid.c \ - third_party/boringssl-with-bazel/src/crypto/asn1/a_time.c \ - third_party/boringssl-with-bazel/src/crypto/asn1/a_type.c \ - third_party/boringssl-with-bazel/src/crypto/asn1/a_utctm.c \ - third_party/boringssl-with-bazel/src/crypto/asn1/a_utf8.c \ - third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c \ - third_party/boringssl-with-bazel/src/crypto/asn1/asn1_par.c \ - third_party/boringssl-with-bazel/src/crypto/asn1/asn_pack.c \ - third_party/boringssl-with-bazel/src/crypto/asn1/f_enum.c \ - third_party/boringssl-with-bazel/src/crypto/asn1/f_int.c \ - third_party/boringssl-with-bazel/src/crypto/asn1/f_string.c \ - third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.c \ - third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c \ - third_party/boringssl-with-bazel/src/crypto/asn1/tasn_fre.c \ - third_party/boringssl-with-bazel/src/crypto/asn1/tasn_new.c \ - third_party/boringssl-with-bazel/src/crypto/asn1/tasn_typ.c \ - third_party/boringssl-with-bazel/src/crypto/asn1/tasn_utl.c \ - third_party/boringssl-with-bazel/src/crypto/asn1/time_support.c \ - third_party/boringssl-with-bazel/src/crypto/base64/base64.c \ - third_party/boringssl-with-bazel/src/crypto/bio/bio.c \ - third_party/boringssl-with-bazel/src/crypto/bio/bio_mem.c \ - third_party/boringssl-with-bazel/src/crypto/bio/connect.c \ - third_party/boringssl-with-bazel/src/crypto/bio/fd.c \ - third_party/boringssl-with-bazel/src/crypto/bio/file.c \ - third_party/boringssl-with-bazel/src/crypto/bio/hexdump.c \ - third_party/boringssl-with-bazel/src/crypto/bio/pair.c \ - third_party/boringssl-with-bazel/src/crypto/bio/printf.c \ - third_party/boringssl-with-bazel/src/crypto/bio/socket.c \ - third_party/boringssl-with-bazel/src/crypto/bio/socket_helper.c \ - third_party/boringssl-with-bazel/src/crypto/bn_extra/bn_asn1.c \ - third_party/boringssl-with-bazel/src/crypto/bn_extra/convert.c \ - third_party/boringssl-with-bazel/src/crypto/buf/buf.c \ - third_party/boringssl-with-bazel/src/crypto/bytestring/asn1_compat.c \ - third_party/boringssl-with-bazel/src/crypto/bytestring/ber.c \ - third_party/boringssl-with-bazel/src/crypto/bytestring/cbb.c \ - third_party/boringssl-with-bazel/src/crypto/bytestring/cbs.c \ - third_party/boringssl-with-bazel/src/crypto/bytestring/unicode.c \ - third_party/boringssl-with-bazel/src/crypto/chacha/chacha.c \ - third_party/boringssl-with-bazel/src/crypto/cipher_extra/cipher_extra.c \ - third_party/boringssl-with-bazel/src/crypto/cipher_extra/derive_key.c \ - third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_aesccm.c \ - third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_aesctrhmac.c \ - third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_aesgcmsiv.c \ - third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_chacha20poly1305.c \ - third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_null.c \ - third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_rc2.c \ - third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_rc4.c \ - third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_tls.c \ - third_party/boringssl-with-bazel/src/crypto/cipher_extra/tls_cbc.c \ - third_party/boringssl-with-bazel/src/crypto/cmac/cmac.c \ - third_party/boringssl-with-bazel/src/crypto/conf/conf.c \ - third_party/boringssl-with-bazel/src/crypto/cpu-aarch64-fuchsia.c \ - third_party/boringssl-with-bazel/src/crypto/cpu-aarch64-linux.c \ - third_party/boringssl-with-bazel/src/crypto/cpu-arm-linux.c \ - third_party/boringssl-with-bazel/src/crypto/cpu-arm.c \ - third_party/boringssl-with-bazel/src/crypto/cpu-intel.c \ - third_party/boringssl-with-bazel/src/crypto/cpu-ppc64le.c \ - third_party/boringssl-with-bazel/src/crypto/crypto.c \ - third_party/boringssl-with-bazel/src/crypto/curve25519/spake25519.c \ - third_party/boringssl-with-bazel/src/crypto/dh/check.c \ - third_party/boringssl-with-bazel/src/crypto/dh/dh.c \ - third_party/boringssl-with-bazel/src/crypto/dh/dh_asn1.c \ - third_party/boringssl-with-bazel/src/crypto/dh/params.c \ - third_party/boringssl-with-bazel/src/crypto/digest_extra/digest_extra.c \ - third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c \ - third_party/boringssl-with-bazel/src/crypto/dsa/dsa_asn1.c \ - third_party/boringssl-with-bazel/src/crypto/ec_extra/ec_asn1.c \ - third_party/boringssl-with-bazel/src/crypto/ec_extra/ec_derive.c \ - third_party/boringssl-with-bazel/src/crypto/ecdh_extra/ecdh_extra.c \ - third_party/boringssl-with-bazel/src/crypto/ecdsa_extra/ecdsa_asn1.c \ - third_party/boringssl-with-bazel/src/crypto/engine/engine.c \ - third_party/boringssl-with-bazel/src/crypto/err/err.c \ - third_party/boringssl-with-bazel/src/crypto/evp/digestsign.c \ - third_party/boringssl-with-bazel/src/crypto/evp/evp.c \ - third_party/boringssl-with-bazel/src/crypto/evp/evp_asn1.c \ - third_party/boringssl-with-bazel/src/crypto/evp/evp_ctx.c \ - third_party/boringssl-with-bazel/src/crypto/evp/p_dsa_asn1.c \ - third_party/boringssl-with-bazel/src/crypto/evp/p_ec.c \ - third_party/boringssl-with-bazel/src/crypto/evp/p_ec_asn1.c \ - third_party/boringssl-with-bazel/src/crypto/evp/p_ed25519.c \ - third_party/boringssl-with-bazel/src/crypto/evp/p_ed25519_asn1.c \ - third_party/boringssl-with-bazel/src/crypto/evp/p_rsa.c \ - third_party/boringssl-with-bazel/src/crypto/evp/p_rsa_asn1.c \ - third_party/boringssl-with-bazel/src/crypto/evp/p_x25519.c \ - third_party/boringssl-with-bazel/src/crypto/evp/p_x25519_asn1.c \ - third_party/boringssl-with-bazel/src/crypto/evp/pbkdf.c \ - third_party/boringssl-with-bazel/src/crypto/evp/print.c \ - third_party/boringssl-with-bazel/src/crypto/evp/scrypt.c \ - third_party/boringssl-with-bazel/src/crypto/evp/sign.c \ - third_party/boringssl-with-bazel/src/crypto/ex_data.c \ - third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c \ - third_party/boringssl-with-bazel/src/crypto/fipsmodule/fips_shared_support.c \ - third_party/boringssl-with-bazel/src/crypto/fipsmodule/is_fips.c \ - third_party/boringssl-with-bazel/src/crypto/hkdf/hkdf.c \ - third_party/boringssl-with-bazel/src/crypto/hrss/hrss.c \ - third_party/boringssl-with-bazel/src/crypto/lhash/lhash.c \ - third_party/boringssl-with-bazel/src/crypto/mem.c \ - third_party/boringssl-with-bazel/src/crypto/obj/obj.c \ - third_party/boringssl-with-bazel/src/crypto/obj/obj_xref.c \ - third_party/boringssl-with-bazel/src/crypto/pem/pem_all.c \ - third_party/boringssl-with-bazel/src/crypto/pem/pem_info.c \ - third_party/boringssl-with-bazel/src/crypto/pem/pem_lib.c \ - third_party/boringssl-with-bazel/src/crypto/pem/pem_oth.c \ - third_party/boringssl-with-bazel/src/crypto/pem/pem_pk8.c \ - third_party/boringssl-with-bazel/src/crypto/pem/pem_pkey.c \ - third_party/boringssl-with-bazel/src/crypto/pem/pem_x509.c \ - third_party/boringssl-with-bazel/src/crypto/pem/pem_xaux.c \ - third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7.c \ - third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7_x509.c \ - third_party/boringssl-with-bazel/src/crypto/pkcs8/p5_pbev2.c \ - third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8.c \ - third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c \ - third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305.c \ - third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_arm.c \ - third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_vec.c \ - third_party/boringssl-with-bazel/src/crypto/pool/pool.c \ - third_party/boringssl-with-bazel/src/crypto/rand_extra/deterministic.c \ - third_party/boringssl-with-bazel/src/crypto/rand_extra/forkunsafe.c \ - third_party/boringssl-with-bazel/src/crypto/rand_extra/fuchsia.c \ - third_party/boringssl-with-bazel/src/crypto/rand_extra/rand_extra.c \ - third_party/boringssl-with-bazel/src/crypto/rand_extra/windows.c \ - third_party/boringssl-with-bazel/src/crypto/rc4/rc4.c \ - third_party/boringssl-with-bazel/src/crypto/refcount_c11.c \ - third_party/boringssl-with-bazel/src/crypto/refcount_lock.c \ - third_party/boringssl-with-bazel/src/crypto/rsa_extra/rsa_asn1.c \ - third_party/boringssl-with-bazel/src/crypto/rsa_extra/rsa_print.c \ - third_party/boringssl-with-bazel/src/crypto/siphash/siphash.c \ - third_party/boringssl-with-bazel/src/crypto/stack/stack.c \ - third_party/boringssl-with-bazel/src/crypto/thread.c \ - third_party/boringssl-with-bazel/src/crypto/thread_none.c \ - third_party/boringssl-with-bazel/src/crypto/thread_pthread.c \ - third_party/boringssl-with-bazel/src/crypto/thread_win.c \ - third_party/boringssl-with-bazel/src/crypto/x509/a_digest.c \ - third_party/boringssl-with-bazel/src/crypto/x509/a_sign.c \ - third_party/boringssl-with-bazel/src/crypto/x509/a_strex.c \ - third_party/boringssl-with-bazel/src/crypto/x509/a_verify.c \ - third_party/boringssl-with-bazel/src/crypto/x509/algorithm.c \ - third_party/boringssl-with-bazel/src/crypto/x509/asn1_gen.c \ - third_party/boringssl-with-bazel/src/crypto/x509/by_dir.c \ - third_party/boringssl-with-bazel/src/crypto/x509/by_file.c \ - third_party/boringssl-with-bazel/src/crypto/x509/i2d_pr.c \ - third_party/boringssl-with-bazel/src/crypto/x509/rsa_pss.c \ - third_party/boringssl-with-bazel/src/crypto/x509/t_crl.c \ - third_party/boringssl-with-bazel/src/crypto/x509/t_req.c \ - third_party/boringssl-with-bazel/src/crypto/x509/t_x509.c \ - third_party/boringssl-with-bazel/src/crypto/x509/t_x509a.c \ - third_party/boringssl-with-bazel/src/crypto/x509/x509.c \ - third_party/boringssl-with-bazel/src/crypto/x509/x509_att.c \ - third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.c \ - third_party/boringssl-with-bazel/src/crypto/x509/x509_d2.c \ - third_party/boringssl-with-bazel/src/crypto/x509/x509_def.c \ - third_party/boringssl-with-bazel/src/crypto/x509/x509_ext.c \ - third_party/boringssl-with-bazel/src/crypto/x509/x509_lu.c \ - third_party/boringssl-with-bazel/src/crypto/x509/x509_obj.c \ - third_party/boringssl-with-bazel/src/crypto/x509/x509_r2x.c \ - third_party/boringssl-with-bazel/src/crypto/x509/x509_req.c \ - third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c \ - third_party/boringssl-with-bazel/src/crypto/x509/x509_trs.c \ - third_party/boringssl-with-bazel/src/crypto/x509/x509_txt.c \ - third_party/boringssl-with-bazel/src/crypto/x509/x509_v3.c \ - third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c \ - third_party/boringssl-with-bazel/src/crypto/x509/x509_vpm.c \ - third_party/boringssl-with-bazel/src/crypto/x509/x509cset.c \ - third_party/boringssl-with-bazel/src/crypto/x509/x509name.c \ - third_party/boringssl-with-bazel/src/crypto/x509/x509rset.c \ - third_party/boringssl-with-bazel/src/crypto/x509/x509spki.c \ - third_party/boringssl-with-bazel/src/crypto/x509/x_algor.c \ - third_party/boringssl-with-bazel/src/crypto/x509/x_all.c \ - third_party/boringssl-with-bazel/src/crypto/x509/x_attrib.c \ - third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c \ - third_party/boringssl-with-bazel/src/crypto/x509/x_exten.c \ - third_party/boringssl-with-bazel/src/crypto/x509/x_info.c \ - third_party/boringssl-with-bazel/src/crypto/x509/x_name.c \ - third_party/boringssl-with-bazel/src/crypto/x509/x_pkey.c \ - third_party/boringssl-with-bazel/src/crypto/x509/x_pubkey.c \ - third_party/boringssl-with-bazel/src/crypto/x509/x_req.c \ - third_party/boringssl-with-bazel/src/crypto/x509/x_sig.c \ - third_party/boringssl-with-bazel/src/crypto/x509/x_spki.c \ - third_party/boringssl-with-bazel/src/crypto/x509/x_val.c \ - third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c \ - third_party/boringssl-with-bazel/src/crypto/x509/x_x509a.c \ - third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_cache.c \ - third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_data.c \ - third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_lib.c \ - third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_map.c \ - third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_node.c \ - third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_tree.c \ - third_party/boringssl-with-bazel/src/crypto/x509v3/v3_akey.c \ - third_party/boringssl-with-bazel/src/crypto/x509v3/v3_akeya.c \ - third_party/boringssl-with-bazel/src/crypto/x509v3/v3_alt.c \ - third_party/boringssl-with-bazel/src/crypto/x509v3/v3_bcons.c \ - third_party/boringssl-with-bazel/src/crypto/x509v3/v3_bitst.c \ - third_party/boringssl-with-bazel/src/crypto/x509v3/v3_conf.c \ - third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c \ - third_party/boringssl-with-bazel/src/crypto/x509v3/v3_crld.c \ - third_party/boringssl-with-bazel/src/crypto/x509v3/v3_enum.c \ - third_party/boringssl-with-bazel/src/crypto/x509v3/v3_extku.c \ - third_party/boringssl-with-bazel/src/crypto/x509v3/v3_genn.c \ - third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ia5.c \ - third_party/boringssl-with-bazel/src/crypto/x509v3/v3_info.c \ - third_party/boringssl-with-bazel/src/crypto/x509v3/v3_int.c \ - third_party/boringssl-with-bazel/src/crypto/x509v3/v3_lib.c \ - third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ncons.c \ - third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ocsp.c \ - third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pci.c \ - third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pcia.c \ - third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pcons.c \ - third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pku.c \ - third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pmaps.c \ - third_party/boringssl-with-bazel/src/crypto/x509v3/v3_prn.c \ - third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c \ - third_party/boringssl-with-bazel/src/crypto/x509v3/v3_skey.c \ - third_party/boringssl-with-bazel/src/crypto/x509v3/v3_sxnet.c \ - third_party/boringssl-with-bazel/src/crypto/x509v3/v3_utl.c \ - third_party/boringssl-with-bazel/src/ssl/bio_ssl.cc \ - third_party/boringssl-with-bazel/src/ssl/d1_both.cc \ - third_party/boringssl-with-bazel/src/ssl/d1_lib.cc \ - third_party/boringssl-with-bazel/src/ssl/d1_pkt.cc \ - third_party/boringssl-with-bazel/src/ssl/d1_srtp.cc \ - third_party/boringssl-with-bazel/src/ssl/dtls_method.cc \ - third_party/boringssl-with-bazel/src/ssl/dtls_record.cc \ - third_party/boringssl-with-bazel/src/ssl/handoff.cc \ - third_party/boringssl-with-bazel/src/ssl/handshake.cc \ - third_party/boringssl-with-bazel/src/ssl/handshake_client.cc \ - third_party/boringssl-with-bazel/src/ssl/handshake_server.cc \ - third_party/boringssl-with-bazel/src/ssl/s3_both.cc \ - third_party/boringssl-with-bazel/src/ssl/s3_lib.cc \ - third_party/boringssl-with-bazel/src/ssl/s3_pkt.cc \ - third_party/boringssl-with-bazel/src/ssl/ssl_aead_ctx.cc \ - third_party/boringssl-with-bazel/src/ssl/ssl_asn1.cc \ - third_party/boringssl-with-bazel/src/ssl/ssl_buffer.cc \ - third_party/boringssl-with-bazel/src/ssl/ssl_cert.cc \ - third_party/boringssl-with-bazel/src/ssl/ssl_cipher.cc \ - third_party/boringssl-with-bazel/src/ssl/ssl_file.cc \ - third_party/boringssl-with-bazel/src/ssl/ssl_key_share.cc \ - third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc \ - third_party/boringssl-with-bazel/src/ssl/ssl_privkey.cc \ - third_party/boringssl-with-bazel/src/ssl/ssl_session.cc \ - third_party/boringssl-with-bazel/src/ssl/ssl_stat.cc \ - third_party/boringssl-with-bazel/src/ssl/ssl_transcript.cc \ - third_party/boringssl-with-bazel/src/ssl/ssl_versions.cc \ - third_party/boringssl-with-bazel/src/ssl/ssl_x509.cc \ - third_party/boringssl-with-bazel/src/ssl/t1_enc.cc \ - third_party/boringssl-with-bazel/src/ssl/t1_lib.cc \ - third_party/boringssl-with-bazel/src/ssl/tls13_both.cc \ - third_party/boringssl-with-bazel/src/ssl/tls13_client.cc \ - third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc \ - third_party/boringssl-with-bazel/src/ssl/tls13_server.cc \ - third_party/boringssl-with-bazel/src/ssl/tls_method.cc \ - third_party/boringssl-with-bazel/src/ssl/tls_record.cc \ - third_party/boringssl-with-bazel/src/third_party/fiat/curve25519.c \ - third_party/upb/upb/decode.c \ - third_party/upb/upb/encode.c \ - third_party/upb/upb/msg.c \ - third_party/upb/upb/port.c \ - third_party/upb/upb/table.c \ - third_party/upb/upb/upb.c \ - , $ext_shared, , -fvisibility=hidden \ - -DOPENSSL_NO_ASM -D_GNU_SOURCE -DWIN32_LEAN_AND_MEAN \ - -D_HAS_EXCEPTIONS=0 -DNOMINMAX -DGRPC_ARES=0 \ - -DGRPC_POSIX_FORK_ALLOW_PTHREAD_ATFORK=1) - - PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/census) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel/health) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel/lb_policy) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel/lb_policy/grpclb) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel/lb_policy/pick_first) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel/lb_policy/priority) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel/lb_policy/round_robin) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel/lb_policy/weighted_target) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel/lb_policy/xds) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel/resolver/dns) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel/resolver/dns/c_ares) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel/resolver/dns/native) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel/resolver/fake) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel/resolver/sockaddr) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel/resolver/xds) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel/xds) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_idle) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/deadline) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/http) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/http/client) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/http/message_compress) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/http/server) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/max_age) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/message_size) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/workarounds) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/transport/chttp2/alpn) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/transport/chttp2/client) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/transport/chttp2/client/insecure) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/transport/chttp2/client/secure) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/transport/chttp2/server) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/transport/chttp2/server/insecure) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/transport/chttp2/server/secure) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/transport/chttp2/transport) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/transport/inproc) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/annotations) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/api/v2) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/api/v2/auth) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/api/v2/cluster) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/api/v2/core) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/api/v2/endpoint) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/api/v2/listener) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/api/v2/route) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/config/filter/accesslog/v2) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/config/listener/v2) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/service/discovery/v2) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/service/load_stats/v2) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/type) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/type/matcher) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/type/metadata/v2) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/type/tracing/v2) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/gogoproto) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/google/api) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/google/protobuf) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/google/rpc) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/src/proto/grpc/gcp) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/src/proto/grpc/health/v1) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/src/proto/grpc/lb/v1) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/udpa/annotations) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/udpa/data/orca/v1) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/validate) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/avl) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/backoff) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/channel) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/compression) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/debug) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/gpr) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/gprpp) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/http) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/iomgr) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/iomgr/executor) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/iomgr/poller) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/json) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/profiling) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/context) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/credentials) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/credentials/alts) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/credentials/composite) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/credentials/fake) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/credentials/google_default) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/credentials/iam) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/credentials/jwt) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/credentials/local) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/credentials/oauth2) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/credentials/plugin) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/credentials/ssl) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/credentials/tls) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/security_connector) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/security_connector/alts) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/security_connector/fake) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/security_connector/local) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/security_connector/ssl) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/security_connector/tls) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/transport) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/util) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/slice) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/surface) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/transport) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/uri) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/plugin_registry) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/tsi) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/tsi/alts/crypt) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/tsi/alts/frame_protector) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/tsi/alts/handshaker) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/tsi/alts/zero_copy_frame_protector) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/tsi/ssl/session_cache) - PHP_ADD_BUILD_DIR($ext_builddir/src/php/ext/grpc) - PHP_ADD_BUILD_DIR($ext_builddir/third_party/abseil-cpp/absl/base) - PHP_ADD_BUILD_DIR($ext_builddir/third_party/abseil-cpp/absl/base/internal) - PHP_ADD_BUILD_DIR($ext_builddir/third_party/abseil-cpp/absl/numeric) - PHP_ADD_BUILD_DIR($ext_builddir/third_party/abseil-cpp/absl/strings) - PHP_ADD_BUILD_DIR($ext_builddir/third_party/abseil-cpp/absl/strings/internal) - PHP_ADD_BUILD_DIR($ext_builddir/third_party/abseil-cpp/absl/strings/internal/str_format) - PHP_ADD_BUILD_DIR($ext_builddir/third_party/abseil-cpp/absl/time) - PHP_ADD_BUILD_DIR($ext_builddir/third_party/abseil-cpp/absl/time/internal/cctz/src) - PHP_ADD_BUILD_DIR($ext_builddir/third_party/abseil-cpp/absl/types) - PHP_ADD_BUILD_DIR($ext_builddir/third_party/address_sorting) - PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel) - PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto) - PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/asn1) - PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/base64) - PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/bio) - PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/bn_extra) - PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/buf) - PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/bytestring) - PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/chacha) - PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/cipher_extra) - PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/cmac) - PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/conf) - PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/curve25519) - PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/dh) - PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/digest_extra) - PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/dsa) - PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/ec_extra) - PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/ecdh_extra) - PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/ecdsa_extra) - PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/engine) - PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/err) - PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/evp) - PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/fipsmodule) - PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/hkdf) - PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/hrss) - PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/lhash) - PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/obj) - PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/pem) - PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/pkcs7) - PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/pkcs8) - PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/poly1305) - PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/pool) - PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/rand_extra) - PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/rc4) - PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/rsa_extra) - PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/siphash) - PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/stack) - PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/x509) - PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/x509v3) - PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/ssl) - PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/third_party/fiat) - PHP_ADD_BUILD_DIR($ext_builddir/third_party/upb/upb) -fi diff --git a/config.w32 b/config.w32 index 59cdbdb1ce4..8e5ff6d2f1a 100644 --- a/config.w32 +++ b/config.w32 @@ -4,1027 +4,3 @@ ARG_WITH("grpc", "grpc support", "no"); if (PHP_GRPC != "no") { - - EXTENSION("grpc", - "src\\core\\ext\\filters\\census\\grpc_context.cc " + - "src\\core\\ext\\filters\\client_channel\\backend_metric.cc " + - "src\\core\\ext\\filters\\client_channel\\backup_poller.cc " + - "src\\core\\ext\\filters\\client_channel\\channel_connectivity.cc " + - "src\\core\\ext\\filters\\client_channel\\client_channel.cc " + - "src\\core\\ext\\filters\\client_channel\\client_channel_channelz.cc " + - "src\\core\\ext\\filters\\client_channel\\client_channel_factory.cc " + - "src\\core\\ext\\filters\\client_channel\\client_channel_plugin.cc " + - "src\\core\\ext\\filters\\client_channel\\global_subchannel_pool.cc " + - "src\\core\\ext\\filters\\client_channel\\health\\health_check_client.cc " + - "src\\core\\ext\\filters\\client_channel\\http_connect_handshaker.cc " + - "src\\core\\ext\\filters\\client_channel\\http_proxy.cc " + - "src\\core\\ext\\filters\\client_channel\\lb_policy.cc " + - "src\\core\\ext\\filters\\client_channel\\lb_policy\\address_filtering.cc " + - "src\\core\\ext\\filters\\client_channel\\lb_policy\\child_policy_handler.cc " + - "src\\core\\ext\\filters\\client_channel\\lb_policy\\grpclb\\client_load_reporting_filter.cc " + - "src\\core\\ext\\filters\\client_channel\\lb_policy\\grpclb\\grpclb.cc " + - "src\\core\\ext\\filters\\client_channel\\lb_policy\\grpclb\\grpclb_balancer_addresses.cc " + - "src\\core\\ext\\filters\\client_channel\\lb_policy\\grpclb\\grpclb_channel_secure.cc " + - "src\\core\\ext\\filters\\client_channel\\lb_policy\\grpclb\\grpclb_client_stats.cc " + - "src\\core\\ext\\filters\\client_channel\\lb_policy\\grpclb\\load_balancer_api.cc " + - "src\\core\\ext\\filters\\client_channel\\lb_policy\\pick_first\\pick_first.cc " + - "src\\core\\ext\\filters\\client_channel\\lb_policy\\priority\\priority.cc " + - "src\\core\\ext\\filters\\client_channel\\lb_policy\\round_robin\\round_robin.cc " + - "src\\core\\ext\\filters\\client_channel\\lb_policy\\weighted_target\\weighted_target.cc " + - "src\\core\\ext\\filters\\client_channel\\lb_policy\\xds\\cds.cc " + - "src\\core\\ext\\filters\\client_channel\\lb_policy\\xds\\eds.cc " + - "src\\core\\ext\\filters\\client_channel\\lb_policy\\xds\\lrs.cc " + - "src\\core\\ext\\filters\\client_channel\\lb_policy_registry.cc " + - "src\\core\\ext\\filters\\client_channel\\local_subchannel_pool.cc " + - "src\\core\\ext\\filters\\client_channel\\parse_address.cc " + - "src\\core\\ext\\filters\\client_channel\\proxy_mapper_registry.cc " + - "src\\core\\ext\\filters\\client_channel\\resolver.cc " + - "src\\core\\ext\\filters\\client_channel\\resolver\\dns\\c_ares\\dns_resolver_ares.cc " + - "src\\core\\ext\\filters\\client_channel\\resolver\\dns\\c_ares\\grpc_ares_ev_driver.cc " + - "src\\core\\ext\\filters\\client_channel\\resolver\\dns\\c_ares\\grpc_ares_ev_driver_libuv.cc " + - "src\\core\\ext\\filters\\client_channel\\resolver\\dns\\c_ares\\grpc_ares_ev_driver_posix.cc " + - "src\\core\\ext\\filters\\client_channel\\resolver\\dns\\c_ares\\grpc_ares_ev_driver_windows.cc " + - "src\\core\\ext\\filters\\client_channel\\resolver\\dns\\c_ares\\grpc_ares_wrapper.cc " + - "src\\core\\ext\\filters\\client_channel\\resolver\\dns\\c_ares\\grpc_ares_wrapper_fallback.cc " + - "src\\core\\ext\\filters\\client_channel\\resolver\\dns\\c_ares\\grpc_ares_wrapper_libuv.cc " + - "src\\core\\ext\\filters\\client_channel\\resolver\\dns\\c_ares\\grpc_ares_wrapper_posix.cc " + - "src\\core\\ext\\filters\\client_channel\\resolver\\dns\\c_ares\\grpc_ares_wrapper_windows.cc " + - "src\\core\\ext\\filters\\client_channel\\resolver\\dns\\dns_resolver_selection.cc " + - "src\\core\\ext\\filters\\client_channel\\resolver\\dns\\native\\dns_resolver.cc " + - "src\\core\\ext\\filters\\client_channel\\resolver\\fake\\fake_resolver.cc " + - "src\\core\\ext\\filters\\client_channel\\resolver\\sockaddr\\sockaddr_resolver.cc " + - "src\\core\\ext\\filters\\client_channel\\resolver\\xds\\xds_resolver.cc " + - "src\\core\\ext\\filters\\client_channel\\resolver_registry.cc " + - "src\\core\\ext\\filters\\client_channel\\resolver_result_parsing.cc " + - "src\\core\\ext\\filters\\client_channel\\resolving_lb_policy.cc " + - "src\\core\\ext\\filters\\client_channel\\retry_throttle.cc " + - "src\\core\\ext\\filters\\client_channel\\server_address.cc " + - "src\\core\\ext\\filters\\client_channel\\service_config.cc " + - "src\\core\\ext\\filters\\client_channel\\subchannel.cc " + - "src\\core\\ext\\filters\\client_channel\\subchannel_pool_interface.cc " + - "src\\core\\ext\\filters\\client_channel\\xds\\xds_api.cc " + - "src\\core\\ext\\filters\\client_channel\\xds\\xds_bootstrap.cc " + - "src\\core\\ext\\filters\\client_channel\\xds\\xds_channel_secure.cc " + - "src\\core\\ext\\filters\\client_channel\\xds\\xds_client.cc " + - "src\\core\\ext\\filters\\client_channel\\xds\\xds_client_stats.cc " + - "src\\core\\ext\\filters\\client_idle\\client_idle_filter.cc " + - "src\\core\\ext\\filters\\deadline\\deadline_filter.cc " + - "src\\core\\ext\\filters\\http\\client\\http_client_filter.cc " + - "src\\core\\ext\\filters\\http\\client_authority_filter.cc " + - "src\\core\\ext\\filters\\http\\http_filters_plugin.cc " + - "src\\core\\ext\\filters\\http\\message_compress\\message_compress_filter.cc " + - "src\\core\\ext\\filters\\http\\server\\http_server_filter.cc " + - "src\\core\\ext\\filters\\max_age\\max_age_filter.cc " + - "src\\core\\ext\\filters\\message_size\\message_size_filter.cc " + - "src\\core\\ext\\filters\\workarounds\\workaround_cronet_compression_filter.cc " + - "src\\core\\ext\\filters\\workarounds\\workaround_utils.cc " + - "src\\core\\ext\\transport\\chttp2\\alpn\\alpn.cc " + - "src\\core\\ext\\transport\\chttp2\\client\\authority.cc " + - "src\\core\\ext\\transport\\chttp2\\client\\chttp2_connector.cc " + - "src\\core\\ext\\transport\\chttp2\\client\\insecure\\channel_create.cc " + - "src\\core\\ext\\transport\\chttp2\\client\\insecure\\channel_create_posix.cc " + - "src\\core\\ext\\transport\\chttp2\\client\\secure\\secure_channel_create.cc " + - "src\\core\\ext\\transport\\chttp2\\server\\chttp2_server.cc " + - "src\\core\\ext\\transport\\chttp2\\server\\insecure\\server_chttp2.cc " + - "src\\core\\ext\\transport\\chttp2\\server\\insecure\\server_chttp2_posix.cc " + - "src\\core\\ext\\transport\\chttp2\\server\\secure\\server_secure_chttp2.cc " + - "src\\core\\ext\\transport\\chttp2\\transport\\bin_decoder.cc " + - "src\\core\\ext\\transport\\chttp2\\transport\\bin_encoder.cc " + - "src\\core\\ext\\transport\\chttp2\\transport\\chttp2_plugin.cc " + - "src\\core\\ext\\transport\\chttp2\\transport\\chttp2_transport.cc " + - "src\\core\\ext\\transport\\chttp2\\transport\\context_list.cc " + - "src\\core\\ext\\transport\\chttp2\\transport\\flow_control.cc " + - "src\\core\\ext\\transport\\chttp2\\transport\\frame_data.cc " + - "src\\core\\ext\\transport\\chttp2\\transport\\frame_goaway.cc " + - "src\\core\\ext\\transport\\chttp2\\transport\\frame_ping.cc " + - "src\\core\\ext\\transport\\chttp2\\transport\\frame_rst_stream.cc " + - "src\\core\\ext\\transport\\chttp2\\transport\\frame_settings.cc " + - "src\\core\\ext\\transport\\chttp2\\transport\\frame_window_update.cc " + - "src\\core\\ext\\transport\\chttp2\\transport\\hpack_encoder.cc " + - "src\\core\\ext\\transport\\chttp2\\transport\\hpack_parser.cc " + - "src\\core\\ext\\transport\\chttp2\\transport\\hpack_table.cc " + - "src\\core\\ext\\transport\\chttp2\\transport\\http2_settings.cc " + - "src\\core\\ext\\transport\\chttp2\\transport\\huffsyms.cc " + - "src\\core\\ext\\transport\\chttp2\\transport\\incoming_metadata.cc " + - "src\\core\\ext\\transport\\chttp2\\transport\\parsing.cc " + - "src\\core\\ext\\transport\\chttp2\\transport\\stream_lists.cc " + - "src\\core\\ext\\transport\\chttp2\\transport\\stream_map.cc " + - "src\\core\\ext\\transport\\chttp2\\transport\\varint.cc " + - "src\\core\\ext\\transport\\chttp2\\transport\\writing.cc " + - "src\\core\\ext\\transport\\inproc\\inproc_plugin.cc " + - "src\\core\\ext\\transport\\inproc\\inproc_transport.cc " + - "src\\core\\ext\\upb-generated\\envoy\\annotations\\deprecation.upb.c " + - "src\\core\\ext\\upb-generated\\envoy\\annotations\\resource.upb.c " + - "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\auth\\cert.upb.c " + - "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\cds.upb.c " + - "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\cluster.upb.c " + - "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\cluster\\circuit_breaker.upb.c " + - "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\cluster\\filter.upb.c " + - "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\cluster\\outlier_detection.upb.c " + - "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\core\\address.upb.c " + - "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\core\\base.upb.c " + - "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\core\\config_source.upb.c " + - "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\core\\grpc_service.upb.c " + - "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\core\\health_check.upb.c " + - "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\core\\http_uri.upb.c " + - "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\core\\protocol.upb.c " + - "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\discovery.upb.c " + - "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\eds.upb.c " + - "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\endpoint.upb.c " + - "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\endpoint\\endpoint.upb.c " + - "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\endpoint\\endpoint_components.upb.c " + - "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\endpoint\\load_report.upb.c " + - "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\lds.upb.c " + - "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\listener.upb.c " + - "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\listener\\listener.upb.c " + - "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\listener\\listener_components.upb.c " + - "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\listener\\udp_listener_config.upb.c " + - "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\rds.upb.c " + - "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\route.upb.c " + - "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\route\\route.upb.c " + - "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\route\\route_components.upb.c " + - "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\scoped_route.upb.c " + - "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\srds.upb.c " + - "src\\core\\ext\\upb-generated\\envoy\\config\\filter\\accesslog\\v2\\accesslog.upb.c " + - "src\\core\\ext\\upb-generated\\envoy\\config\\filter\\network\\http_connection_manager\\v2\\http_connection_manager.upb.c " + - "src\\core\\ext\\upb-generated\\envoy\\config\\listener\\v2\\api_listener.upb.c " + - "src\\core\\ext\\upb-generated\\envoy\\service\\discovery\\v2\\ads.upb.c " + - "src\\core\\ext\\upb-generated\\envoy\\service\\load_stats\\v2\\lrs.upb.c " + - "src\\core\\ext\\upb-generated\\envoy\\type\\http.upb.c " + - "src\\core\\ext\\upb-generated\\envoy\\type\\matcher\\regex.upb.c " + - "src\\core\\ext\\upb-generated\\envoy\\type\\matcher\\string.upb.c " + - "src\\core\\ext\\upb-generated\\envoy\\type\\metadata\\v2\\metadata.upb.c " + - "src\\core\\ext\\upb-generated\\envoy\\type\\percent.upb.c " + - "src\\core\\ext\\upb-generated\\envoy\\type\\range.upb.c " + - "src\\core\\ext\\upb-generated\\envoy\\type\\semantic_version.upb.c " + - "src\\core\\ext\\upb-generated\\envoy\\type\\tracing\\v2\\custom_tag.upb.c " + - "src\\core\\ext\\upb-generated\\gogoproto\\gogo.upb.c " + - "src\\core\\ext\\upb-generated\\google\\api\\annotations.upb.c " + - "src\\core\\ext\\upb-generated\\google\\api\\http.upb.c " + - "src\\core\\ext\\upb-generated\\google\\protobuf\\any.upb.c " + - "src\\core\\ext\\upb-generated\\google\\protobuf\\descriptor.upb.c " + - "src\\core\\ext\\upb-generated\\google\\protobuf\\duration.upb.c " + - "src\\core\\ext\\upb-generated\\google\\protobuf\\empty.upb.c " + - "src\\core\\ext\\upb-generated\\google\\protobuf\\struct.upb.c " + - "src\\core\\ext\\upb-generated\\google\\protobuf\\timestamp.upb.c " + - "src\\core\\ext\\upb-generated\\google\\protobuf\\wrappers.upb.c " + - "src\\core\\ext\\upb-generated\\google\\rpc\\status.upb.c " + - "src\\core\\ext\\upb-generated\\src\\proto\\grpc\\gcp\\altscontext.upb.c " + - "src\\core\\ext\\upb-generated\\src\\proto\\grpc\\gcp\\handshaker.upb.c " + - "src\\core\\ext\\upb-generated\\src\\proto\\grpc\\gcp\\transport_security_common.upb.c " + - "src\\core\\ext\\upb-generated\\src\\proto\\grpc\\health\\v1\\health.upb.c " + - "src\\core\\ext\\upb-generated\\src\\proto\\grpc\\lb\\v1\\load_balancer.upb.c " + - "src\\core\\ext\\upb-generated\\udpa\\annotations\\migrate.upb.c " + - "src\\core\\ext\\upb-generated\\udpa\\annotations\\sensitive.upb.c " + - "src\\core\\ext\\upb-generated\\udpa\\data\\orca\\v1\\orca_load_report.upb.c " + - "src\\core\\ext\\upb-generated\\validate\\validate.upb.c " + - "src\\core\\lib\\avl\\avl.cc " + - "src\\core\\lib\\backoff\\backoff.cc " + - "src\\core\\lib\\channel\\channel_args.cc " + - "src\\core\\lib\\channel\\channel_stack.cc " + - "src\\core\\lib\\channel\\channel_stack_builder.cc " + - "src\\core\\lib\\channel\\channel_trace.cc " + - "src\\core\\lib\\channel\\channelz.cc " + - "src\\core\\lib\\channel\\channelz_registry.cc " + - "src\\core\\lib\\channel\\connected_channel.cc " + - "src\\core\\lib\\channel\\handshaker.cc " + - "src\\core\\lib\\channel\\handshaker_registry.cc " + - "src\\core\\lib\\channel\\status_util.cc " + - "src\\core\\lib\\compression\\compression.cc " + - "src\\core\\lib\\compression\\compression_args.cc " + - "src\\core\\lib\\compression\\compression_internal.cc " + - "src\\core\\lib\\compression\\message_compress.cc " + - "src\\core\\lib\\compression\\stream_compression.cc " + - "src\\core\\lib\\compression\\stream_compression_gzip.cc " + - "src\\core\\lib\\compression\\stream_compression_identity.cc " + - "src\\core\\lib\\debug\\stats.cc " + - "src\\core\\lib\\debug\\stats_data.cc " + - "src\\core\\lib\\debug\\trace.cc " + - "src\\core\\lib\\gpr\\alloc.cc " + - "src\\core\\lib\\gpr\\atm.cc " + - "src\\core\\lib\\gpr\\cpu_iphone.cc " + - "src\\core\\lib\\gpr\\cpu_linux.cc " + - "src\\core\\lib\\gpr\\cpu_posix.cc " + - "src\\core\\lib\\gpr\\cpu_windows.cc " + - "src\\core\\lib\\gpr\\env_linux.cc " + - "src\\core\\lib\\gpr\\env_posix.cc " + - "src\\core\\lib\\gpr\\env_windows.cc " + - "src\\core\\lib\\gpr\\log.cc " + - "src\\core\\lib\\gpr\\log_android.cc " + - "src\\core\\lib\\gpr\\log_linux.cc " + - "src\\core\\lib\\gpr\\log_posix.cc " + - "src\\core\\lib\\gpr\\log_windows.cc " + - "src\\core\\lib\\gpr\\murmur_hash.cc " + - "src\\core\\lib\\gpr\\string.cc " + - "src\\core\\lib\\gpr\\string_posix.cc " + - "src\\core\\lib\\gpr\\string_util_windows.cc " + - "src\\core\\lib\\gpr\\string_windows.cc " + - "src\\core\\lib\\gpr\\sync.cc " + - "src\\core\\lib\\gpr\\sync_abseil.cc " + - "src\\core\\lib\\gpr\\sync_posix.cc " + - "src\\core\\lib\\gpr\\sync_windows.cc " + - "src\\core\\lib\\gpr\\time.cc " + - "src\\core\\lib\\gpr\\time_posix.cc " + - "src\\core\\lib\\gpr\\time_precise.cc " + - "src\\core\\lib\\gpr\\time_windows.cc " + - "src\\core\\lib\\gpr\\tls_pthread.cc " + - "src\\core\\lib\\gpr\\tmpfile_msys.cc " + - "src\\core\\lib\\gpr\\tmpfile_posix.cc " + - "src\\core\\lib\\gpr\\tmpfile_windows.cc " + - "src\\core\\lib\\gpr\\wrap_memcpy.cc " + - "src\\core\\lib\\gprpp\\arena.cc " + - "src\\core\\lib\\gprpp\\fork.cc " + - "src\\core\\lib\\gprpp\\global_config_env.cc " + - "src\\core\\lib\\gprpp\\host_port.cc " + - "src\\core\\lib\\gprpp\\mpscq.cc " + - "src\\core\\lib\\gprpp\\thd_posix.cc " + - "src\\core\\lib\\gprpp\\thd_windows.cc " + - "src\\core\\lib\\http\\format_request.cc " + - "src\\core\\lib\\http\\httpcli.cc " + - "src\\core\\lib\\http\\httpcli_security_connector.cc " + - "src\\core\\lib\\http\\parser.cc " + - "src\\core\\lib\\iomgr\\buffer_list.cc " + - "src\\core\\lib\\iomgr\\call_combiner.cc " + - "src\\core\\lib\\iomgr\\cfstream_handle.cc " + - "src\\core\\lib\\iomgr\\combiner.cc " + - "src\\core\\lib\\iomgr\\dualstack_socket_posix.cc " + - "src\\core\\lib\\iomgr\\endpoint.cc " + - "src\\core\\lib\\iomgr\\endpoint_cfstream.cc " + - "src\\core\\lib\\iomgr\\endpoint_pair_posix.cc " + - "src\\core\\lib\\iomgr\\endpoint_pair_uv.cc " + - "src\\core\\lib\\iomgr\\endpoint_pair_windows.cc " + - "src\\core\\lib\\iomgr\\error.cc " + - "src\\core\\lib\\iomgr\\error_cfstream.cc " + - "src\\core\\lib\\iomgr\\ev_epoll1_linux.cc " + - "src\\core\\lib\\iomgr\\ev_epollex_linux.cc " + - "src\\core\\lib\\iomgr\\ev_poll_posix.cc " + - "src\\core\\lib\\iomgr\\ev_posix.cc " + - "src\\core\\lib\\iomgr\\ev_windows.cc " + - "src\\core\\lib\\iomgr\\exec_ctx.cc " + - "src\\core\\lib\\iomgr\\executor.cc " + - "src\\core\\lib\\iomgr\\executor\\mpmcqueue.cc " + - "src\\core\\lib\\iomgr\\executor\\threadpool.cc " + - "src\\core\\lib\\iomgr\\fork_posix.cc " + - "src\\core\\lib\\iomgr\\fork_windows.cc " + - "src\\core\\lib\\iomgr\\gethostname_fallback.cc " + - "src\\core\\lib\\iomgr\\gethostname_host_name_max.cc " + - "src\\core\\lib\\iomgr\\gethostname_sysconf.cc " + - "src\\core\\lib\\iomgr\\grpc_if_nametoindex_posix.cc " + - "src\\core\\lib\\iomgr\\grpc_if_nametoindex_unsupported.cc " + - "src\\core\\lib\\iomgr\\internal_errqueue.cc " + - "src\\core\\lib\\iomgr\\iocp_windows.cc " + - "src\\core\\lib\\iomgr\\iomgr.cc " + - "src\\core\\lib\\iomgr\\iomgr_custom.cc " + - "src\\core\\lib\\iomgr\\iomgr_internal.cc " + - "src\\core\\lib\\iomgr\\iomgr_posix.cc " + - "src\\core\\lib\\iomgr\\iomgr_posix_cfstream.cc " + - "src\\core\\lib\\iomgr\\iomgr_uv.cc " + - "src\\core\\lib\\iomgr\\iomgr_windows.cc " + - "src\\core\\lib\\iomgr\\is_epollexclusive_available.cc " + - "src\\core\\lib\\iomgr\\load_file.cc " + - "src\\core\\lib\\iomgr\\lockfree_event.cc " + - "src\\core\\lib\\iomgr\\poller\\eventmanager_libuv.cc " + - "src\\core\\lib\\iomgr\\polling_entity.cc " + - "src\\core\\lib\\iomgr\\pollset.cc " + - "src\\core\\lib\\iomgr\\pollset_custom.cc " + - "src\\core\\lib\\iomgr\\pollset_set.cc " + - "src\\core\\lib\\iomgr\\pollset_set_custom.cc " + - "src\\core\\lib\\iomgr\\pollset_set_windows.cc " + - "src\\core\\lib\\iomgr\\pollset_uv.cc " + - "src\\core\\lib\\iomgr\\pollset_windows.cc " + - "src\\core\\lib\\iomgr\\resolve_address.cc " + - "src\\core\\lib\\iomgr\\resolve_address_custom.cc " + - "src\\core\\lib\\iomgr\\resolve_address_posix.cc " + - "src\\core\\lib\\iomgr\\resolve_address_windows.cc " + - "src\\core\\lib\\iomgr\\resource_quota.cc " + - "src\\core\\lib\\iomgr\\sockaddr_utils.cc " + - "src\\core\\lib\\iomgr\\socket_factory_posix.cc " + - "src\\core\\lib\\iomgr\\socket_mutator.cc " + - "src\\core\\lib\\iomgr\\socket_utils_common_posix.cc " + - "src\\core\\lib\\iomgr\\socket_utils_linux.cc " + - "src\\core\\lib\\iomgr\\socket_utils_posix.cc " + - "src\\core\\lib\\iomgr\\socket_utils_uv.cc " + - "src\\core\\lib\\iomgr\\socket_utils_windows.cc " + - "src\\core\\lib\\iomgr\\socket_windows.cc " + - "src\\core\\lib\\iomgr\\tcp_client.cc " + - "src\\core\\lib\\iomgr\\tcp_client_cfstream.cc " + - "src\\core\\lib\\iomgr\\tcp_client_custom.cc " + - "src\\core\\lib\\iomgr\\tcp_client_posix.cc " + - "src\\core\\lib\\iomgr\\tcp_client_windows.cc " + - "src\\core\\lib\\iomgr\\tcp_custom.cc " + - "src\\core\\lib\\iomgr\\tcp_posix.cc " + - "src\\core\\lib\\iomgr\\tcp_server.cc " + - "src\\core\\lib\\iomgr\\tcp_server_custom.cc " + - "src\\core\\lib\\iomgr\\tcp_server_posix.cc " + - "src\\core\\lib\\iomgr\\tcp_server_utils_posix_common.cc " + - "src\\core\\lib\\iomgr\\tcp_server_utils_posix_ifaddrs.cc " + - "src\\core\\lib\\iomgr\\tcp_server_utils_posix_noifaddrs.cc " + - "src\\core\\lib\\iomgr\\tcp_server_windows.cc " + - "src\\core\\lib\\iomgr\\tcp_uv.cc " + - "src\\core\\lib\\iomgr\\tcp_windows.cc " + - "src\\core\\lib\\iomgr\\time_averaged_stats.cc " + - "src\\core\\lib\\iomgr\\timer.cc " + - "src\\core\\lib\\iomgr\\timer_custom.cc " + - "src\\core\\lib\\iomgr\\timer_generic.cc " + - "src\\core\\lib\\iomgr\\timer_heap.cc " + - "src\\core\\lib\\iomgr\\timer_manager.cc " + - "src\\core\\lib\\iomgr\\timer_uv.cc " + - "src\\core\\lib\\iomgr\\udp_server.cc " + - "src\\core\\lib\\iomgr\\unix_sockets_posix.cc " + - "src\\core\\lib\\iomgr\\unix_sockets_posix_noop.cc " + - "src\\core\\lib\\iomgr\\wakeup_fd_eventfd.cc " + - "src\\core\\lib\\iomgr\\wakeup_fd_nospecial.cc " + - "src\\core\\lib\\iomgr\\wakeup_fd_pipe.cc " + - "src\\core\\lib\\iomgr\\wakeup_fd_posix.cc " + - "src\\core\\lib\\iomgr\\work_serializer.cc " + - "src\\core\\lib\\json\\json_reader.cc " + - "src\\core\\lib\\json\\json_writer.cc " + - "src\\core\\lib\\profiling\\basic_timers.cc " + - "src\\core\\lib\\profiling\\stap_timers.cc " + - "src\\core\\lib\\security\\context\\security_context.cc " + - "src\\core\\lib\\security\\credentials\\alts\\alts_credentials.cc " + - "src\\core\\lib\\security\\credentials\\alts\\check_gcp_environment.cc " + - "src\\core\\lib\\security\\credentials\\alts\\check_gcp_environment_linux.cc " + - "src\\core\\lib\\security\\credentials\\alts\\check_gcp_environment_no_op.cc " + - "src\\core\\lib\\security\\credentials\\alts\\check_gcp_environment_windows.cc " + - "src\\core\\lib\\security\\credentials\\alts\\grpc_alts_credentials_client_options.cc " + - "src\\core\\lib\\security\\credentials\\alts\\grpc_alts_credentials_options.cc " + - "src\\core\\lib\\security\\credentials\\alts\\grpc_alts_credentials_server_options.cc " + - "src\\core\\lib\\security\\credentials\\composite\\composite_credentials.cc " + - "src\\core\\lib\\security\\credentials\\credentials.cc " + - "src\\core\\lib\\security\\credentials\\credentials_metadata.cc " + - "src\\core\\lib\\security\\credentials\\fake\\fake_credentials.cc " + - "src\\core\\lib\\security\\credentials\\google_default\\credentials_generic.cc " + - "src\\core\\lib\\security\\credentials\\google_default\\google_default_credentials.cc " + - "src\\core\\lib\\security\\credentials\\iam\\iam_credentials.cc " + - "src\\core\\lib\\security\\credentials\\jwt\\json_token.cc " + - "src\\core\\lib\\security\\credentials\\jwt\\jwt_credentials.cc " + - "src\\core\\lib\\security\\credentials\\jwt\\jwt_verifier.cc " + - "src\\core\\lib\\security\\credentials\\local\\local_credentials.cc " + - "src\\core\\lib\\security\\credentials\\oauth2\\oauth2_credentials.cc " + - "src\\core\\lib\\security\\credentials\\plugin\\plugin_credentials.cc " + - "src\\core\\lib\\security\\credentials\\ssl\\ssl_credentials.cc " + - "src\\core\\lib\\security\\credentials\\tls\\grpc_tls_credentials_options.cc " + - "src\\core\\lib\\security\\credentials\\tls\\tls_credentials.cc " + - "src\\core\\lib\\security\\security_connector\\alts\\alts_security_connector.cc " + - "src\\core\\lib\\security\\security_connector\\fake\\fake_security_connector.cc " + - "src\\core\\lib\\security\\security_connector\\load_system_roots_fallback.cc " + - "src\\core\\lib\\security\\security_connector\\load_system_roots_linux.cc " + - "src\\core\\lib\\security\\security_connector\\local\\local_security_connector.cc " + - "src\\core\\lib\\security\\security_connector\\security_connector.cc " + - "src\\core\\lib\\security\\security_connector\\ssl\\ssl_security_connector.cc " + - "src\\core\\lib\\security\\security_connector\\ssl_utils.cc " + - "src\\core\\lib\\security\\security_connector\\ssl_utils_config.cc " + - "src\\core\\lib\\security\\security_connector\\tls\\tls_security_connector.cc " + - "src\\core\\lib\\security\\transport\\client_auth_filter.cc " + - "src\\core\\lib\\security\\transport\\secure_endpoint.cc " + - "src\\core\\lib\\security\\transport\\security_handshaker.cc " + - "src\\core\\lib\\security\\transport\\server_auth_filter.cc " + - "src\\core\\lib\\security\\transport\\target_authority_table.cc " + - "src\\core\\lib\\security\\transport\\tsi_error.cc " + - "src\\core\\lib\\security\\util\\json_util.cc " + - "src\\core\\lib\\slice\\b64.cc " + - "src\\core\\lib\\slice\\percent_encoding.cc " + - "src\\core\\lib\\slice\\slice.cc " + - "src\\core\\lib\\slice\\slice_buffer.cc " + - "src\\core\\lib\\slice\\slice_intern.cc " + - "src\\core\\lib\\slice\\slice_string_helpers.cc " + - "src\\core\\lib\\surface\\api_trace.cc " + - "src\\core\\lib\\surface\\byte_buffer.cc " + - "src\\core\\lib\\surface\\byte_buffer_reader.cc " + - "src\\core\\lib\\surface\\call.cc " + - "src\\core\\lib\\surface\\call_details.cc " + - "src\\core\\lib\\surface\\call_log_batch.cc " + - "src\\core\\lib\\surface\\channel.cc " + - "src\\core\\lib\\surface\\channel_init.cc " + - "src\\core\\lib\\surface\\channel_ping.cc " + - "src\\core\\lib\\surface\\channel_stack_type.cc " + - "src\\core\\lib\\surface\\completion_queue.cc " + - "src\\core\\lib\\surface\\completion_queue_factory.cc " + - "src\\core\\lib\\surface\\event_string.cc " + - "src\\core\\lib\\surface\\init.cc " + - "src\\core\\lib\\surface\\init_secure.cc " + - "src\\core\\lib\\surface\\lame_client.cc " + - "src\\core\\lib\\surface\\metadata_array.cc " + - "src\\core\\lib\\surface\\server.cc " + - "src\\core\\lib\\surface\\validate_metadata.cc " + - "src\\core\\lib\\surface\\version.cc " + - "src\\core\\lib\\transport\\bdp_estimator.cc " + - "src\\core\\lib\\transport\\byte_stream.cc " + - "src\\core\\lib\\transport\\connectivity_state.cc " + - "src\\core\\lib\\transport\\error_utils.cc " + - "src\\core\\lib\\transport\\metadata.cc " + - "src\\core\\lib\\transport\\metadata_batch.cc " + - "src\\core\\lib\\transport\\pid_controller.cc " + - "src\\core\\lib\\transport\\static_metadata.cc " + - "src\\core\\lib\\transport\\status_conversion.cc " + - "src\\core\\lib\\transport\\status_metadata.cc " + - "src\\core\\lib\\transport\\timeout_encoding.cc " + - "src\\core\\lib\\transport\\transport.cc " + - "src\\core\\lib\\transport\\transport_op_string.cc " + - "src\\core\\lib\\uri\\uri_parser.cc " + - "src\\core\\plugin_registry\\grpc_plugin_registry.cc " + - "src\\core\\tsi\\alts\\crypt\\aes_gcm.cc " + - "src\\core\\tsi\\alts\\crypt\\gsec.cc " + - "src\\core\\tsi\\alts\\frame_protector\\alts_counter.cc " + - "src\\core\\tsi\\alts\\frame_protector\\alts_crypter.cc " + - "src\\core\\tsi\\alts\\frame_protector\\alts_frame_protector.cc " + - "src\\core\\tsi\\alts\\frame_protector\\alts_record_protocol_crypter_common.cc " + - "src\\core\\tsi\\alts\\frame_protector\\alts_seal_privacy_integrity_crypter.cc " + - "src\\core\\tsi\\alts\\frame_protector\\alts_unseal_privacy_integrity_crypter.cc " + - "src\\core\\tsi\\alts\\frame_protector\\frame_handler.cc " + - "src\\core\\tsi\\alts\\handshaker\\alts_handshaker_client.cc " + - "src\\core\\tsi\\alts\\handshaker\\alts_shared_resource.cc " + - "src\\core\\tsi\\alts\\handshaker\\alts_tsi_handshaker.cc " + - "src\\core\\tsi\\alts\\handshaker\\alts_tsi_utils.cc " + - "src\\core\\tsi\\alts\\handshaker\\transport_security_common_api.cc " + - "src\\core\\tsi\\alts\\zero_copy_frame_protector\\alts_grpc_integrity_only_record_protocol.cc " + - "src\\core\\tsi\\alts\\zero_copy_frame_protector\\alts_grpc_privacy_integrity_record_protocol.cc " + - "src\\core\\tsi\\alts\\zero_copy_frame_protector\\alts_grpc_record_protocol_common.cc " + - "src\\core\\tsi\\alts\\zero_copy_frame_protector\\alts_iovec_record_protocol.cc " + - "src\\core\\tsi\\alts\\zero_copy_frame_protector\\alts_zero_copy_grpc_protector.cc " + - "src\\core\\tsi\\fake_transport_security.cc " + - "src\\core\\tsi\\local_transport_security.cc " + - "src\\core\\tsi\\ssl\\session_cache\\ssl_session_boringssl.cc " + - "src\\core\\tsi\\ssl\\session_cache\\ssl_session_cache.cc " + - "src\\core\\tsi\\ssl\\session_cache\\ssl_session_openssl.cc " + - "src\\core\\tsi\\ssl_transport_security.cc " + - "src\\core\\tsi\\transport_security.cc " + - "src\\core\\tsi\\transport_security_grpc.cc " + - "src\\php\\ext\\grpc\\byte_buffer.c " + - "src\\php\\ext\\grpc\\call.c " + - "src\\php\\ext\\grpc\\call_credentials.c " + - "src\\php\\ext\\grpc\\channel.c " + - "src\\php\\ext\\grpc\\channel_credentials.c " + - "src\\php\\ext\\grpc\\completion_queue.c " + - "src\\php\\ext\\grpc\\php_grpc.c " + - "src\\php\\ext\\grpc\\server.c " + - "src\\php\\ext\\grpc\\server_credentials.c " + - "src\\php\\ext\\grpc\\timeval.c " + - "third_party\\abseil-cpp\\absl\\base\\dynamic_annotations.cc " + - "third_party\\abseil-cpp\\absl\\base\\internal\\cycleclock.cc " + - "third_party\\abseil-cpp\\absl\\base\\internal\\raw_logging.cc " + - "third_party\\abseil-cpp\\absl\\base\\internal\\spinlock.cc " + - "third_party\\abseil-cpp\\absl\\base\\internal\\spinlock_wait.cc " + - "third_party\\abseil-cpp\\absl\\base\\internal\\sysinfo.cc " + - "third_party\\abseil-cpp\\absl\\base\\internal\\thread_identity.cc " + - "third_party\\abseil-cpp\\absl\\base\\internal\\throw_delegate.cc " + - "third_party\\abseil-cpp\\absl\\base\\internal\\unscaledcycleclock.cc " + - "third_party\\abseil-cpp\\absl\\base\\log_severity.cc " + - "third_party\\abseil-cpp\\absl\\numeric\\int128.cc " + - "third_party\\abseil-cpp\\absl\\strings\\ascii.cc " + - "third_party\\abseil-cpp\\absl\\strings\\charconv.cc " + - "third_party\\abseil-cpp\\absl\\strings\\escaping.cc " + - "third_party\\abseil-cpp\\absl\\strings\\internal\\charconv_bigint.cc " + - "third_party\\abseil-cpp\\absl\\strings\\internal\\charconv_parse.cc " + - "third_party\\abseil-cpp\\absl\\strings\\internal\\escaping.cc " + - "third_party\\abseil-cpp\\absl\\strings\\internal\\memutil.cc " + - "third_party\\abseil-cpp\\absl\\strings\\internal\\ostringstream.cc " + - "third_party\\abseil-cpp\\absl\\strings\\internal\\str_format\\arg.cc " + - "third_party\\abseil-cpp\\absl\\strings\\internal\\str_format\\bind.cc " + - "third_party\\abseil-cpp\\absl\\strings\\internal\\str_format\\extension.cc " + - "third_party\\abseil-cpp\\absl\\strings\\internal\\str_format\\float_conversion.cc " + - "third_party\\abseil-cpp\\absl\\strings\\internal\\str_format\\output.cc " + - "third_party\\abseil-cpp\\absl\\strings\\internal\\str_format\\parser.cc " + - "third_party\\abseil-cpp\\absl\\strings\\internal\\utf8.cc " + - "third_party\\abseil-cpp\\absl\\strings\\match.cc " + - "third_party\\abseil-cpp\\absl\\strings\\numbers.cc " + - "third_party\\abseil-cpp\\absl\\strings\\str_cat.cc " + - "third_party\\abseil-cpp\\absl\\strings\\str_replace.cc " + - "third_party\\abseil-cpp\\absl\\strings\\str_split.cc " + - "third_party\\abseil-cpp\\absl\\strings\\string_view.cc " + - "third_party\\abseil-cpp\\absl\\strings\\substitute.cc " + - "third_party\\abseil-cpp\\absl\\time\\civil_time.cc " + - "third_party\\abseil-cpp\\absl\\time\\clock.cc " + - "third_party\\abseil-cpp\\absl\\time\\duration.cc " + - "third_party\\abseil-cpp\\absl\\time\\format.cc " + - "third_party\\abseil-cpp\\absl\\time\\internal\\cctz\\src\\civil_time_detail.cc " + - "third_party\\abseil-cpp\\absl\\time\\internal\\cctz\\src\\time_zone_fixed.cc " + - "third_party\\abseil-cpp\\absl\\time\\internal\\cctz\\src\\time_zone_format.cc " + - "third_party\\abseil-cpp\\absl\\time\\internal\\cctz\\src\\time_zone_if.cc " + - "third_party\\abseil-cpp\\absl\\time\\internal\\cctz\\src\\time_zone_impl.cc " + - "third_party\\abseil-cpp\\absl\\time\\internal\\cctz\\src\\time_zone_info.cc " + - "third_party\\abseil-cpp\\absl\\time\\internal\\cctz\\src\\time_zone_libc.cc " + - "third_party\\abseil-cpp\\absl\\time\\internal\\cctz\\src\\time_zone_lookup.cc " + - "third_party\\abseil-cpp\\absl\\time\\internal\\cctz\\src\\time_zone_posix.cc " + - "third_party\\abseil-cpp\\absl\\time\\internal\\cctz\\src\\zone_info_source.cc " + - "third_party\\abseil-cpp\\absl\\time\\time.cc " + - "third_party\\abseil-cpp\\absl\\types\\bad_optional_access.cc " + - "third_party\\address_sorting\\address_sorting.c " + - "third_party\\address_sorting\\address_sorting_posix.c " + - "third_party\\address_sorting\\address_sorting_windows.c " + - "third_party\\boringssl-with-bazel\\err_data.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\a_bitstr.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\a_bool.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\a_d2i_fp.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\a_dup.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\a_enum.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\a_gentm.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\a_i2d_fp.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\a_int.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\a_mbstr.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\a_object.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\a_octet.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\a_print.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\a_strnid.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\a_time.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\a_type.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\a_utctm.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\a_utf8.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\asn1_lib.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\asn1_par.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\asn_pack.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\f_enum.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\f_int.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\f_string.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\tasn_dec.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\tasn_enc.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\tasn_fre.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\tasn_new.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\tasn_typ.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\tasn_utl.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\time_support.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\base64\\base64.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\bio\\bio.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\bio\\bio_mem.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\bio\\connect.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\bio\\fd.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\bio\\file.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\bio\\hexdump.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\bio\\pair.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\bio\\printf.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\bio\\socket.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\bio\\socket_helper.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\bn_extra\\bn_asn1.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\bn_extra\\convert.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\buf\\buf.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\bytestring\\asn1_compat.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\bytestring\\ber.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\bytestring\\cbb.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\bytestring\\cbs.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\bytestring\\unicode.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\chacha\\chacha.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\cipher_extra\\cipher_extra.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\cipher_extra\\derive_key.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\cipher_extra\\e_aesccm.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\cipher_extra\\e_aesctrhmac.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\cipher_extra\\e_aesgcmsiv.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\cipher_extra\\e_chacha20poly1305.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\cipher_extra\\e_null.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\cipher_extra\\e_rc2.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\cipher_extra\\e_rc4.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\cipher_extra\\e_tls.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\cipher_extra\\tls_cbc.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\cmac\\cmac.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\conf\\conf.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\cpu-aarch64-fuchsia.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\cpu-aarch64-linux.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\cpu-arm-linux.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\cpu-arm.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\cpu-intel.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\cpu-ppc64le.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\crypto.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\curve25519\\spake25519.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\dh\\check.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\dh\\dh.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\dh\\dh_asn1.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\dh\\params.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\digest_extra\\digest_extra.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\dsa\\dsa.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\dsa\\dsa_asn1.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\ec_extra\\ec_asn1.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\ec_extra\\ec_derive.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\ecdh_extra\\ecdh_extra.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\ecdsa_extra\\ecdsa_asn1.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\engine\\engine.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\err\\err.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\digestsign.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\evp.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\evp_asn1.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\evp_ctx.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\p_dsa_asn1.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\p_ec.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\p_ec_asn1.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\p_ed25519.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\p_ed25519_asn1.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\p_rsa.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\p_rsa_asn1.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\p_x25519.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\p_x25519_asn1.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\pbkdf.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\print.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\scrypt.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\sign.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\ex_data.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\fipsmodule\\bcm.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\fipsmodule\\fips_shared_support.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\fipsmodule\\is_fips.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\hkdf\\hkdf.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\hrss\\hrss.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\lhash\\lhash.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\mem.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\obj\\obj.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\obj\\obj_xref.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\pem\\pem_all.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\pem\\pem_info.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\pem\\pem_lib.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\pem\\pem_oth.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\pem\\pem_pk8.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\pem\\pem_pkey.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\pem\\pem_x509.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\pem\\pem_xaux.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\pkcs7\\pkcs7.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\pkcs7\\pkcs7_x509.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\pkcs8\\p5_pbev2.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\pkcs8\\pkcs8.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\pkcs8\\pkcs8_x509.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\poly1305\\poly1305.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\poly1305\\poly1305_arm.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\poly1305\\poly1305_vec.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\pool\\pool.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\rand_extra\\deterministic.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\rand_extra\\forkunsafe.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\rand_extra\\fuchsia.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\rand_extra\\rand_extra.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\rand_extra\\windows.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\rc4\\rc4.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\refcount_c11.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\refcount_lock.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\rsa_extra\\rsa_asn1.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\rsa_extra\\rsa_print.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\siphash\\siphash.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\stack\\stack.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\thread.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\thread_none.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\thread_pthread.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\thread_win.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\a_digest.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\a_sign.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\a_strex.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\a_verify.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\algorithm.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\asn1_gen.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\by_dir.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\by_file.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\i2d_pr.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\rsa_pss.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\t_crl.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\t_req.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\t_x509.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\t_x509a.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509_att.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509_cmp.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509_d2.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509_def.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509_ext.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509_lu.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509_obj.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509_r2x.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509_req.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509_set.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509_trs.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509_txt.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509_v3.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509_vfy.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509_vpm.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509cset.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509name.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509rset.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509spki.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x_algor.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x_all.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x_attrib.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x_crl.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x_exten.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x_info.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x_name.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x_pkey.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x_pubkey.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x_req.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x_sig.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x_spki.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x_val.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x_x509.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x_x509a.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\pcy_cache.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\pcy_data.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\pcy_lib.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\pcy_map.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\pcy_node.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\pcy_tree.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_akey.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_akeya.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_alt.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_bcons.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_bitst.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_conf.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_cpols.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_crld.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_enum.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_extku.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_genn.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_ia5.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_info.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_int.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_lib.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_ncons.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_ocsp.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_pci.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_pcia.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_pcons.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_pku.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_pmaps.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_prn.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_purp.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_skey.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_sxnet.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_utl.c " + - "third_party\\boringssl-with-bazel\\src\\ssl\\bio_ssl.cc " + - "third_party\\boringssl-with-bazel\\src\\ssl\\d1_both.cc " + - "third_party\\boringssl-with-bazel\\src\\ssl\\d1_lib.cc " + - "third_party\\boringssl-with-bazel\\src\\ssl\\d1_pkt.cc " + - "third_party\\boringssl-with-bazel\\src\\ssl\\d1_srtp.cc " + - "third_party\\boringssl-with-bazel\\src\\ssl\\dtls_method.cc " + - "third_party\\boringssl-with-bazel\\src\\ssl\\dtls_record.cc " + - "third_party\\boringssl-with-bazel\\src\\ssl\\handoff.cc " + - "third_party\\boringssl-with-bazel\\src\\ssl\\handshake.cc " + - "third_party\\boringssl-with-bazel\\src\\ssl\\handshake_client.cc " + - "third_party\\boringssl-with-bazel\\src\\ssl\\handshake_server.cc " + - "third_party\\boringssl-with-bazel\\src\\ssl\\s3_both.cc " + - "third_party\\boringssl-with-bazel\\src\\ssl\\s3_lib.cc " + - "third_party\\boringssl-with-bazel\\src\\ssl\\s3_pkt.cc " + - "third_party\\boringssl-with-bazel\\src\\ssl\\ssl_aead_ctx.cc " + - "third_party\\boringssl-with-bazel\\src\\ssl\\ssl_asn1.cc " + - "third_party\\boringssl-with-bazel\\src\\ssl\\ssl_buffer.cc " + - "third_party\\boringssl-with-bazel\\src\\ssl\\ssl_cert.cc " + - "third_party\\boringssl-with-bazel\\src\\ssl\\ssl_cipher.cc " + - "third_party\\boringssl-with-bazel\\src\\ssl\\ssl_file.cc " + - "third_party\\boringssl-with-bazel\\src\\ssl\\ssl_key_share.cc " + - "third_party\\boringssl-with-bazel\\src\\ssl\\ssl_lib.cc " + - "third_party\\boringssl-with-bazel\\src\\ssl\\ssl_privkey.cc " + - "third_party\\boringssl-with-bazel\\src\\ssl\\ssl_session.cc " + - "third_party\\boringssl-with-bazel\\src\\ssl\\ssl_stat.cc " + - "third_party\\boringssl-with-bazel\\src\\ssl\\ssl_transcript.cc " + - "third_party\\boringssl-with-bazel\\src\\ssl\\ssl_versions.cc " + - "third_party\\boringssl-with-bazel\\src\\ssl\\ssl_x509.cc " + - "third_party\\boringssl-with-bazel\\src\\ssl\\t1_enc.cc " + - "third_party\\boringssl-with-bazel\\src\\ssl\\t1_lib.cc " + - "third_party\\boringssl-with-bazel\\src\\ssl\\tls13_both.cc " + - "third_party\\boringssl-with-bazel\\src\\ssl\\tls13_client.cc " + - "third_party\\boringssl-with-bazel\\src\\ssl\\tls13_enc.cc " + - "third_party\\boringssl-with-bazel\\src\\ssl\\tls13_server.cc " + - "third_party\\boringssl-with-bazel\\src\\ssl\\tls_method.cc " + - "third_party\\boringssl-with-bazel\\src\\ssl\\tls_record.cc " + - "third_party\\boringssl-with-bazel\\src\\third_party\\fiat\\curve25519.c " + - "third_party\\upb\\upb\\decode.c " + - "third_party\\upb\\upb\\encode.c " + - "third_party\\upb\\upb\\msg.c " + - "third_party\\upb\\upb\\port.c " + - "third_party\\upb\\upb\\table.c " + - "third_party\\upb\\upb\\upb.c " + - "third_party\\zlib\\adler32.c " + - "third_party\\zlib\\compress.c " + - "third_party\\zlib\\crc32.c " + - "third_party\\zlib\\deflate.c " + - "third_party\\zlib\\gzclose.c " + - "third_party\\zlib\\gzlib.c " + - "third_party\\zlib\\gzread.c " + - "third_party\\zlib\\gzwrite.c " + - "third_party\\zlib\\infback.c " + - "third_party\\zlib\\inffast.c " + - "third_party\\zlib\\inflate.c " + - "third_party\\zlib\\inftrees.c " + - "third_party\\zlib\\trees.c " + - "third_party\\zlib\\uncompr.c " + - "third_party\\zlib\\zutil.c " + - "" - , null, - "/DOPENSSL_NO_ASM /D_GNU_SOURCE /DWIN32_LEAN_AND_MEAN "+ - "/D_HAS_EXCEPTIONS=0 /DNOMINMAX /DGRPC_ARES=0 /D_WIN32_WINNT=0x600 "+ - "/I"+configure_module_dirname+" "+ - "/I"+configure_module_dirname+"\\include "+ - "/I"+configure_module_dirname+"\\src\\core\\ext\\upb-generated "+ - "/I"+configure_module_dirname+"\\src\\php\\ext\\grpc "+ - "/I"+configure_module_dirname+"\\third_party\\abseil-cpp "+ - "/I"+configure_module_dirname+"\\third_party\\address_sorting\\include "+ - "/I"+configure_module_dirname+"\\third_party\\boringssl\\include "+ - "/I"+configure_module_dirname+"\\third_party\\upb "+ - "/I"+configure_module_dirname+"\\third_party\\zlib "); - - base_dir = get_define('BUILD_DIR'); - FSO.CreateFolder(base_dir+"\\ext"); - FSO.CreateFolder(base_dir+"\\ext\\grpc"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\census"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_channel"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_channel\\health"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_channel\\lb_policy"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_channel\\lb_policy\\grpclb"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_channel\\lb_policy\\pick_first"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_channel\\lb_policy\\priority"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_channel\\lb_policy\\round_robin"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_channel\\lb_policy\\weighted_target"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_channel\\lb_policy\\xds"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_channel\\resolver"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_channel\\resolver\\dns"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_channel\\resolver\\dns\\c_ares"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_channel\\resolver\\dns\\native"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_channel\\resolver\\fake"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_channel\\resolver\\sockaddr"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_channel\\resolver\\xds"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_channel\\xds"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_idle"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\deadline"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\http"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\http\\client"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\http\\message_compress"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\http\\server"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\max_age"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\message_size"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\workarounds"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\transport"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\transport\\chttp2"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\transport\\chttp2\\alpn"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\transport\\chttp2\\client"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\transport\\chttp2\\client\\insecure"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\transport\\chttp2\\client\\secure"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\transport\\chttp2\\server"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\transport\\chttp2\\server\\insecure"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\transport\\chttp2\\server\\secure"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\transport\\chttp2\\transport"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\transport\\inproc"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\annotations"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\api"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\api\\v2"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\api\\v2\\auth"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\api\\v2\\cluster"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\api\\v2\\core"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\api\\v2\\endpoint"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\api\\v2\\listener"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\api\\v2\\route"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\config"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\config\\filter"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\config\\filter\\accesslog"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\config\\filter\\accesslog\\v2"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\config\\filter\\network"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\config\\filter\\network\\http_connection_manager"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\config\\filter\\network\\http_connection_manager\\v2"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\config\\listener"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\config\\listener\\v2"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\service"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\service\\discovery"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\service\\discovery\\v2"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\service\\load_stats"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\service\\load_stats\\v2"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\type"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\type\\matcher"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\type\\metadata"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\type\\metadata\\v2"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\type\\tracing"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\type\\tracing\\v2"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\gogoproto"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\google"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\google\\api"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\google\\protobuf"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\google\\rpc"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\src"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\src\\proto"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\src\\proto\\grpc"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\src\\proto\\grpc\\gcp"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\src\\proto\\grpc\\health"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\src\\proto\\grpc\\health\\v1"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\src\\proto\\grpc\\lb"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\src\\proto\\grpc\\lb\\v1"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\udpa"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\udpa\\annotations"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\udpa\\data"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\udpa\\data\\orca"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\udpa\\data\\orca\\v1"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\validate"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\avl"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\backoff"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\channel"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\compression"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\debug"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\gpr"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\gprpp"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\http"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\iomgr"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\iomgr\\executor"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\iomgr\\poller"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\json"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\profiling"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\context"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\credentials"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\credentials\\alts"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\credentials\\composite"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\credentials\\fake"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\credentials\\google_default"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\credentials\\iam"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\credentials\\jwt"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\credentials\\local"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\credentials\\oauth2"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\credentials\\plugin"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\credentials\\ssl"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\credentials\\tls"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\security_connector"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\security_connector\\alts"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\security_connector\\fake"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\security_connector\\local"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\security_connector\\ssl"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\security_connector\\tls"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\transport"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\util"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\slice"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\surface"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\transport"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\uri"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\plugin_registry"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\tsi"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\tsi\\alts"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\tsi\\alts\\crypt"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\tsi\\alts\\frame_protector"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\tsi\\alts\\handshaker"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\tsi\\alts\\zero_copy_frame_protector"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\tsi\\ssl"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\tsi\\ssl\\session_cache"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\php"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\php\\ext"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\php\\ext\\grpc"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\abseil-cpp"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\abseil-cpp\\absl"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\abseil-cpp\\absl\\base"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\abseil-cpp\\absl\\base\\internal"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\abseil-cpp\\absl\\numeric"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\abseil-cpp\\absl\\strings"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\abseil-cpp\\absl\\strings\\internal"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\abseil-cpp\\absl\\strings\\internal\\str_format"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\abseil-cpp\\absl\\time"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\abseil-cpp\\absl\\time\\internal"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\abseil-cpp\\absl\\time\\internal\\cctz"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\abseil-cpp\\absl\\time\\internal\\cctz\\src"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\abseil-cpp\\absl\\types"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\address_sorting"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\asn1"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\base64"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\bio"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\bn_extra"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\buf"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\bytestring"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\chacha"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\cipher_extra"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\cmac"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\conf"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\curve25519"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\dh"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\digest_extra"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\dsa"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\ec_extra"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\ecdh_extra"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\ecdsa_extra"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\engine"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\err"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\evp"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\fipsmodule"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\hkdf"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\hrss"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\lhash"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\obj"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\pem"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\pkcs7"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\pkcs8"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\poly1305"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\pool"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\rand_extra"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\rc4"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\rsa_extra"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\siphash"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\stack"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\x509"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\x509v3"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\ssl"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\third_party"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\third_party\\fiat"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\upb"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\upb\\upb"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\zlib"); - _build_dirs = new Array(); - for (i = 0; i < build_dirs.length; i++) { - if (build_dirs[i].indexOf('grpc') == -1) { - _build_dirs[_build_dirs.length] = build_dirs[i]; - } - } - build_dirs = _build_dirs; -} diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec index 749e77b3fa7..fda497e531d 100644 --- a/gRPC-Core.podspec +++ b/gRPC-Core.podspec @@ -1482,6 +1482,7 @@ Pod::Spec.new do |s| 'test/core/end2end/tests/cancel_test_helpers.h', 'test/core/end2end/tests/cancel_with_status.cc', 'test/core/end2end/tests/channelz.cc', + 'test/core/end2end/tests/client_streaming.cc', 'test/core/end2end/tests/compressed_payload.cc', 'test/core/end2end/tests/connectivity.cc', 'test/core/end2end/tests/default_host.cc', diff --git a/grpc.gemspec b/grpc.gemspec index 29e5d3d436b..15d5beecb3f 100644 --- a/grpc.gemspec +++ b/grpc.gemspec @@ -48,1618 +48,3 @@ Gem::Specification.new do |s| s.add_development_dependency 'googleauth', '>= 0.5.1', '< 0.10' s.extensions = %w(src/ruby/ext/grpc/extconf.rb) - - s.files += %w( include/grpc/byte_buffer.h ) - s.files += %w( include/grpc/byte_buffer_reader.h ) - s.files += %w( include/grpc/census.h ) - s.files += %w( include/grpc/compression.h ) - s.files += %w( include/grpc/fork.h ) - s.files += %w( include/grpc/grpc.h ) - s.files += %w( include/grpc/grpc_posix.h ) - s.files += %w( include/grpc/grpc_security.h ) - s.files += %w( include/grpc/grpc_security_constants.h ) - s.files += %w( include/grpc/impl/codegen/atm.h ) - s.files += %w( include/grpc/impl/codegen/atm_gcc_atomic.h ) - s.files += %w( include/grpc/impl/codegen/atm_gcc_sync.h ) - s.files += %w( include/grpc/impl/codegen/atm_windows.h ) - s.files += %w( include/grpc/impl/codegen/byte_buffer.h ) - s.files += %w( include/grpc/impl/codegen/byte_buffer_reader.h ) - s.files += %w( include/grpc/impl/codegen/compression_types.h ) - s.files += %w( include/grpc/impl/codegen/connectivity_state.h ) - s.files += %w( include/grpc/impl/codegen/fork.h ) - s.files += %w( include/grpc/impl/codegen/gpr_slice.h ) - s.files += %w( include/grpc/impl/codegen/gpr_types.h ) - s.files += %w( include/grpc/impl/codegen/grpc_types.h ) - s.files += %w( include/grpc/impl/codegen/log.h ) - s.files += %w( include/grpc/impl/codegen/port_platform.h ) - s.files += %w( include/grpc/impl/codegen/propagation_bits.h ) - s.files += %w( include/grpc/impl/codegen/slice.h ) - s.files += %w( include/grpc/impl/codegen/status.h ) - s.files += %w( include/grpc/impl/codegen/sync.h ) - s.files += %w( include/grpc/impl/codegen/sync_abseil.h ) - s.files += %w( include/grpc/impl/codegen/sync_custom.h ) - s.files += %w( include/grpc/impl/codegen/sync_generic.h ) - s.files += %w( include/grpc/impl/codegen/sync_posix.h ) - s.files += %w( include/grpc/impl/codegen/sync_windows.h ) - s.files += %w( include/grpc/load_reporting.h ) - s.files += %w( include/grpc/slice.h ) - s.files += %w( include/grpc/slice_buffer.h ) - s.files += %w( include/grpc/status.h ) - s.files += %w( include/grpc/support/alloc.h ) - s.files += %w( include/grpc/support/atm.h ) - s.files += %w( include/grpc/support/atm_gcc_atomic.h ) - s.files += %w( include/grpc/support/atm_gcc_sync.h ) - s.files += %w( include/grpc/support/atm_windows.h ) - s.files += %w( include/grpc/support/cpu.h ) - s.files += %w( include/grpc/support/log.h ) - s.files += %w( include/grpc/support/log_windows.h ) - s.files += %w( include/grpc/support/port_platform.h ) - s.files += %w( include/grpc/support/string_util.h ) - s.files += %w( include/grpc/support/sync.h ) - s.files += %w( include/grpc/support/sync_abseil.h ) - s.files += %w( include/grpc/support/sync_custom.h ) - s.files += %w( include/grpc/support/sync_generic.h ) - s.files += %w( include/grpc/support/sync_posix.h ) - s.files += %w( include/grpc/support/sync_windows.h ) - s.files += %w( include/grpc/support/thd_id.h ) - s.files += %w( include/grpc/support/time.h ) - s.files += %w( include/grpc/support/workaround_list.h ) - s.files += %w( src/core/ext/filters/census/grpc_context.cc ) - s.files += %w( src/core/ext/filters/client_channel/backend_metric.cc ) - s.files += %w( src/core/ext/filters/client_channel/backend_metric.h ) - s.files += %w( src/core/ext/filters/client_channel/backup_poller.cc ) - s.files += %w( src/core/ext/filters/client_channel/backup_poller.h ) - s.files += %w( src/core/ext/filters/client_channel/channel_connectivity.cc ) - s.files += %w( src/core/ext/filters/client_channel/client_channel.cc ) - s.files += %w( src/core/ext/filters/client_channel/client_channel.h ) - s.files += %w( src/core/ext/filters/client_channel/client_channel_channelz.cc ) - s.files += %w( src/core/ext/filters/client_channel/client_channel_channelz.h ) - s.files += %w( src/core/ext/filters/client_channel/client_channel_factory.cc ) - s.files += %w( src/core/ext/filters/client_channel/client_channel_factory.h ) - s.files += %w( src/core/ext/filters/client_channel/client_channel_plugin.cc ) - s.files += %w( src/core/ext/filters/client_channel/connector.h ) - s.files += %w( src/core/ext/filters/client_channel/global_subchannel_pool.cc ) - s.files += %w( src/core/ext/filters/client_channel/global_subchannel_pool.h ) - s.files += %w( src/core/ext/filters/client_channel/health/health_check_client.cc ) - s.files += %w( src/core/ext/filters/client_channel/health/health_check_client.h ) - s.files += %w( src/core/ext/filters/client_channel/http_connect_handshaker.cc ) - s.files += %w( src/core/ext/filters/client_channel/http_connect_handshaker.h ) - s.files += %w( src/core/ext/filters/client_channel/http_proxy.cc ) - s.files += %w( src/core/ext/filters/client_channel/http_proxy.h ) - s.files += %w( src/core/ext/filters/client_channel/lb_policy.cc ) - s.files += %w( src/core/ext/filters/client_channel/lb_policy.h ) - s.files += %w( src/core/ext/filters/client_channel/lb_policy/address_filtering.cc ) - s.files += %w( src/core/ext/filters/client_channel/lb_policy/address_filtering.h ) - s.files += %w( src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc ) - s.files += %w( src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h ) - s.files += %w( src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc ) - s.files += %w( src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h ) - s.files += %w( src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc ) - s.files += %w( src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h ) - s.files += %w( src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc ) - s.files += %w( src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h ) - s.files += %w( src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h ) - s.files += %w( src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc ) - s.files += %w( src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc ) - s.files += %w( src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h ) - s.files += %w( src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc ) - s.files += %w( src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h ) - s.files += %w( src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc ) - s.files += %w( src/core/ext/filters/client_channel/lb_policy/priority/priority.cc ) - s.files += %w( src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc ) - s.files += %w( src/core/ext/filters/client_channel/lb_policy/subchannel_list.h ) - s.files += %w( src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc ) - s.files += %w( src/core/ext/filters/client_channel/lb_policy/xds/cds.cc ) - s.files += %w( src/core/ext/filters/client_channel/lb_policy/xds/eds.cc ) - s.files += %w( src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc ) - s.files += %w( src/core/ext/filters/client_channel/lb_policy/xds/xds.h ) - s.files += %w( src/core/ext/filters/client_channel/lb_policy_factory.h ) - s.files += %w( src/core/ext/filters/client_channel/lb_policy_registry.cc ) - s.files += %w( src/core/ext/filters/client_channel/lb_policy_registry.h ) - s.files += %w( src/core/ext/filters/client_channel/local_subchannel_pool.cc ) - s.files += %w( src/core/ext/filters/client_channel/local_subchannel_pool.h ) - s.files += %w( src/core/ext/filters/client_channel/parse_address.cc ) - s.files += %w( src/core/ext/filters/client_channel/parse_address.h ) - s.files += %w( src/core/ext/filters/client_channel/proxy_mapper.h ) - s.files += %w( src/core/ext/filters/client_channel/proxy_mapper_registry.cc ) - s.files += %w( src/core/ext/filters/client_channel/proxy_mapper_registry.h ) - s.files += %w( src/core/ext/filters/client_channel/resolver.cc ) - s.files += %w( src/core/ext/filters/client_channel/resolver.h ) - s.files += %w( src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc ) - s.files += %w( src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc ) - s.files += %w( src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h ) - s.files += %w( src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc ) - s.files += %w( src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc ) - s.files += %w( src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc ) - s.files += %w( src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc ) - s.files += %w( src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h ) - s.files += %w( src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc ) - s.files += %w( src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_libuv.cc ) - s.files += %w( src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_posix.cc ) - s.files += %w( src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc ) - s.files += %w( src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.cc ) - s.files += %w( src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.h ) - s.files += %w( src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc ) - s.files += %w( src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc ) - s.files += %w( src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h ) - s.files += %w( src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc ) - s.files += %w( src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc ) - s.files += %w( src/core/ext/filters/client_channel/resolver_factory.h ) - s.files += %w( src/core/ext/filters/client_channel/resolver_registry.cc ) - s.files += %w( src/core/ext/filters/client_channel/resolver_registry.h ) - s.files += %w( src/core/ext/filters/client_channel/resolver_result_parsing.cc ) - s.files += %w( src/core/ext/filters/client_channel/resolver_result_parsing.h ) - s.files += %w( src/core/ext/filters/client_channel/resolving_lb_policy.cc ) - s.files += %w( src/core/ext/filters/client_channel/resolving_lb_policy.h ) - s.files += %w( src/core/ext/filters/client_channel/retry_throttle.cc ) - s.files += %w( src/core/ext/filters/client_channel/retry_throttle.h ) - s.files += %w( src/core/ext/filters/client_channel/server_address.cc ) - s.files += %w( src/core/ext/filters/client_channel/server_address.h ) - s.files += %w( src/core/ext/filters/client_channel/service_config.cc ) - s.files += %w( src/core/ext/filters/client_channel/service_config.h ) - s.files += %w( src/core/ext/filters/client_channel/subchannel.cc ) - s.files += %w( src/core/ext/filters/client_channel/subchannel.h ) - s.files += %w( src/core/ext/filters/client_channel/subchannel_interface.h ) - s.files += %w( src/core/ext/filters/client_channel/subchannel_pool_interface.cc ) - s.files += %w( src/core/ext/filters/client_channel/subchannel_pool_interface.h ) - s.files += %w( src/core/ext/filters/client_channel/xds/xds_api.cc ) - s.files += %w( src/core/ext/filters/client_channel/xds/xds_api.h ) - s.files += %w( src/core/ext/filters/client_channel/xds/xds_bootstrap.cc ) - s.files += %w( src/core/ext/filters/client_channel/xds/xds_bootstrap.h ) - s.files += %w( src/core/ext/filters/client_channel/xds/xds_channel.h ) - s.files += %w( src/core/ext/filters/client_channel/xds/xds_channel_args.h ) - s.files += %w( src/core/ext/filters/client_channel/xds/xds_channel_secure.cc ) - s.files += %w( src/core/ext/filters/client_channel/xds/xds_client.cc ) - s.files += %w( src/core/ext/filters/client_channel/xds/xds_client.h ) - s.files += %w( src/core/ext/filters/client_channel/xds/xds_client_stats.cc ) - s.files += %w( src/core/ext/filters/client_channel/xds/xds_client_stats.h ) - s.files += %w( src/core/ext/filters/client_idle/client_idle_filter.cc ) - s.files += %w( src/core/ext/filters/deadline/deadline_filter.cc ) - s.files += %w( src/core/ext/filters/deadline/deadline_filter.h ) - s.files += %w( src/core/ext/filters/http/client/http_client_filter.cc ) - s.files += %w( src/core/ext/filters/http/client/http_client_filter.h ) - s.files += %w( src/core/ext/filters/http/client_authority_filter.cc ) - s.files += %w( src/core/ext/filters/http/client_authority_filter.h ) - s.files += %w( src/core/ext/filters/http/http_filters_plugin.cc ) - s.files += %w( src/core/ext/filters/http/message_compress/message_compress_filter.cc ) - s.files += %w( src/core/ext/filters/http/message_compress/message_compress_filter.h ) - s.files += %w( src/core/ext/filters/http/server/http_server_filter.cc ) - s.files += %w( src/core/ext/filters/http/server/http_server_filter.h ) - s.files += %w( src/core/ext/filters/max_age/max_age_filter.cc ) - s.files += %w( src/core/ext/filters/max_age/max_age_filter.h ) - s.files += %w( src/core/ext/filters/message_size/message_size_filter.cc ) - s.files += %w( src/core/ext/filters/message_size/message_size_filter.h ) - s.files += %w( src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc ) - s.files += %w( src/core/ext/filters/workarounds/workaround_cronet_compression_filter.h ) - s.files += %w( src/core/ext/filters/workarounds/workaround_utils.cc ) - s.files += %w( src/core/ext/filters/workarounds/workaround_utils.h ) - s.files += %w( src/core/ext/transport/chttp2/alpn/alpn.cc ) - s.files += %w( src/core/ext/transport/chttp2/alpn/alpn.h ) - s.files += %w( src/core/ext/transport/chttp2/client/authority.cc ) - s.files += %w( src/core/ext/transport/chttp2/client/authority.h ) - s.files += %w( src/core/ext/transport/chttp2/client/chttp2_connector.cc ) - s.files += %w( src/core/ext/transport/chttp2/client/chttp2_connector.h ) - s.files += %w( src/core/ext/transport/chttp2/client/insecure/channel_create.cc ) - s.files += %w( src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc ) - s.files += %w( src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc ) - s.files += %w( src/core/ext/transport/chttp2/server/chttp2_server.cc ) - s.files += %w( src/core/ext/transport/chttp2/server/chttp2_server.h ) - s.files += %w( src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc ) - s.files += %w( src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc ) - s.files += %w( src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc ) - s.files += %w( src/core/ext/transport/chttp2/transport/bin_decoder.cc ) - s.files += %w( src/core/ext/transport/chttp2/transport/bin_decoder.h ) - s.files += %w( src/core/ext/transport/chttp2/transport/bin_encoder.cc ) - s.files += %w( src/core/ext/transport/chttp2/transport/bin_encoder.h ) - s.files += %w( src/core/ext/transport/chttp2/transport/chttp2_plugin.cc ) - s.files += %w( src/core/ext/transport/chttp2/transport/chttp2_transport.cc ) - s.files += %w( src/core/ext/transport/chttp2/transport/chttp2_transport.h ) - s.files += %w( src/core/ext/transport/chttp2/transport/context_list.cc ) - s.files += %w( src/core/ext/transport/chttp2/transport/context_list.h ) - s.files += %w( src/core/ext/transport/chttp2/transport/flow_control.cc ) - s.files += %w( src/core/ext/transport/chttp2/transport/flow_control.h ) - s.files += %w( src/core/ext/transport/chttp2/transport/frame.h ) - s.files += %w( src/core/ext/transport/chttp2/transport/frame_data.cc ) - s.files += %w( src/core/ext/transport/chttp2/transport/frame_data.h ) - s.files += %w( src/core/ext/transport/chttp2/transport/frame_goaway.cc ) - s.files += %w( src/core/ext/transport/chttp2/transport/frame_goaway.h ) - s.files += %w( src/core/ext/transport/chttp2/transport/frame_ping.cc ) - s.files += %w( src/core/ext/transport/chttp2/transport/frame_ping.h ) - s.files += %w( src/core/ext/transport/chttp2/transport/frame_rst_stream.cc ) - s.files += %w( src/core/ext/transport/chttp2/transport/frame_rst_stream.h ) - s.files += %w( src/core/ext/transport/chttp2/transport/frame_settings.cc ) - s.files += %w( src/core/ext/transport/chttp2/transport/frame_settings.h ) - s.files += %w( src/core/ext/transport/chttp2/transport/frame_window_update.cc ) - s.files += %w( src/core/ext/transport/chttp2/transport/frame_window_update.h ) - s.files += %w( src/core/ext/transport/chttp2/transport/hpack_encoder.cc ) - s.files += %w( src/core/ext/transport/chttp2/transport/hpack_encoder.h ) - s.files += %w( src/core/ext/transport/chttp2/transport/hpack_parser.cc ) - s.files += %w( src/core/ext/transport/chttp2/transport/hpack_parser.h ) - s.files += %w( src/core/ext/transport/chttp2/transport/hpack_table.cc ) - s.files += %w( src/core/ext/transport/chttp2/transport/hpack_table.h ) - s.files += %w( src/core/ext/transport/chttp2/transport/http2_settings.cc ) - s.files += %w( src/core/ext/transport/chttp2/transport/http2_settings.h ) - s.files += %w( src/core/ext/transport/chttp2/transport/huffsyms.cc ) - s.files += %w( src/core/ext/transport/chttp2/transport/huffsyms.h ) - s.files += %w( src/core/ext/transport/chttp2/transport/incoming_metadata.cc ) - s.files += %w( src/core/ext/transport/chttp2/transport/incoming_metadata.h ) - s.files += %w( src/core/ext/transport/chttp2/transport/internal.h ) - s.files += %w( src/core/ext/transport/chttp2/transport/parsing.cc ) - s.files += %w( src/core/ext/transport/chttp2/transport/stream_lists.cc ) - s.files += %w( src/core/ext/transport/chttp2/transport/stream_map.cc ) - s.files += %w( src/core/ext/transport/chttp2/transport/stream_map.h ) - s.files += %w( src/core/ext/transport/chttp2/transport/varint.cc ) - s.files += %w( src/core/ext/transport/chttp2/transport/varint.h ) - s.files += %w( src/core/ext/transport/chttp2/transport/writing.cc ) - s.files += %w( src/core/ext/transport/inproc/inproc_plugin.cc ) - s.files += %w( src/core/ext/transport/inproc/inproc_transport.cc ) - s.files += %w( src/core/ext/transport/inproc/inproc_transport.h ) - s.files += %w( src/core/ext/upb-generated/envoy/annotations/deprecation.upb.c ) - s.files += %w( src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h ) - s.files += %w( src/core/ext/upb-generated/envoy/annotations/resource.upb.c ) - s.files += %w( src/core/ext/upb-generated/envoy/annotations/resource.upb.h ) - s.files += %w( src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c ) - s.files += %w( src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h ) - s.files += %w( src/core/ext/upb-generated/envoy/api/v2/cds.upb.c ) - s.files += %w( src/core/ext/upb-generated/envoy/api/v2/cds.upb.h ) - s.files += %w( src/core/ext/upb-generated/envoy/api/v2/cluster.upb.c ) - s.files += %w( src/core/ext/upb-generated/envoy/api/v2/cluster.upb.h ) - s.files += %w( src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c ) - s.files += %w( src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.h ) - s.files += %w( src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.c ) - s.files += %w( src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.h ) - s.files += %w( src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c ) - s.files += %w( src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.h ) - s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/address.upb.c ) - s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/address.upb.h ) - s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c ) - s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/base.upb.h ) - s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c ) - s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.h ) - s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c ) - s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.h ) - s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c ) - s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.h ) - s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.c ) - s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.h ) - s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c ) - s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h ) - s.files += %w( src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c ) - s.files += %w( src/core/ext/upb-generated/envoy/api/v2/discovery.upb.h ) - s.files += %w( src/core/ext/upb-generated/envoy/api/v2/eds.upb.c ) - s.files += %w( src/core/ext/upb-generated/envoy/api/v2/eds.upb.h ) - s.files += %w( src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.c ) - s.files += %w( src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.h ) - s.files += %w( src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.c ) - s.files += %w( src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.h ) - s.files += %w( src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.c ) - s.files += %w( src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.h ) - s.files += %w( src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.c ) - s.files += %w( src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.h ) - s.files += %w( src/core/ext/upb-generated/envoy/api/v2/lds.upb.c ) - s.files += %w( src/core/ext/upb-generated/envoy/api/v2/lds.upb.h ) - s.files += %w( src/core/ext/upb-generated/envoy/api/v2/listener.upb.c ) - s.files += %w( src/core/ext/upb-generated/envoy/api/v2/listener.upb.h ) - s.files += %w( src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.c ) - s.files += %w( src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.h ) - s.files += %w( src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.c ) - s.files += %w( src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.h ) - s.files += %w( src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.c ) - s.files += %w( src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.h ) - s.files += %w( src/core/ext/upb-generated/envoy/api/v2/rds.upb.c ) - s.files += %w( src/core/ext/upb-generated/envoy/api/v2/rds.upb.h ) - s.files += %w( src/core/ext/upb-generated/envoy/api/v2/route.upb.c ) - s.files += %w( src/core/ext/upb-generated/envoy/api/v2/route.upb.h ) - s.files += %w( src/core/ext/upb-generated/envoy/api/v2/route/route.upb.c ) - s.files += %w( src/core/ext/upb-generated/envoy/api/v2/route/route.upb.h ) - s.files += %w( src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.c ) - s.files += %w( src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.h ) - s.files += %w( src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.c ) - s.files += %w( src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.h ) - s.files += %w( src/core/ext/upb-generated/envoy/api/v2/srds.upb.c ) - s.files += %w( src/core/ext/upb-generated/envoy/api/v2/srds.upb.h ) - s.files += %w( src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.c ) - s.files += %w( src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.h ) - s.files += %w( src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.c ) - s.files += %w( src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.h ) - s.files += %w( src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.c ) - s.files += %w( src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.h ) - s.files += %w( src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.c ) - s.files += %w( src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.h ) - s.files += %w( src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.c ) - s.files += %w( src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.h ) - s.files += %w( src/core/ext/upb-generated/envoy/type/http.upb.c ) - s.files += %w( src/core/ext/upb-generated/envoy/type/http.upb.h ) - s.files += %w( src/core/ext/upb-generated/envoy/type/matcher/regex.upb.c ) - s.files += %w( src/core/ext/upb-generated/envoy/type/matcher/regex.upb.h ) - s.files += %w( src/core/ext/upb-generated/envoy/type/matcher/string.upb.c ) - s.files += %w( src/core/ext/upb-generated/envoy/type/matcher/string.upb.h ) - s.files += %w( src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.c ) - s.files += %w( src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.h ) - s.files += %w( src/core/ext/upb-generated/envoy/type/percent.upb.c ) - s.files += %w( src/core/ext/upb-generated/envoy/type/percent.upb.h ) - s.files += %w( src/core/ext/upb-generated/envoy/type/range.upb.c ) - s.files += %w( src/core/ext/upb-generated/envoy/type/range.upb.h ) - s.files += %w( src/core/ext/upb-generated/envoy/type/semantic_version.upb.c ) - s.files += %w( src/core/ext/upb-generated/envoy/type/semantic_version.upb.h ) - s.files += %w( src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.c ) - s.files += %w( src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.h ) - s.files += %w( src/core/ext/upb-generated/gogoproto/gogo.upb.c ) - s.files += %w( src/core/ext/upb-generated/gogoproto/gogo.upb.h ) - s.files += %w( src/core/ext/upb-generated/google/api/annotations.upb.c ) - s.files += %w( src/core/ext/upb-generated/google/api/annotations.upb.h ) - s.files += %w( src/core/ext/upb-generated/google/api/http.upb.c ) - s.files += %w( src/core/ext/upb-generated/google/api/http.upb.h ) - s.files += %w( src/core/ext/upb-generated/google/protobuf/any.upb.c ) - s.files += %w( src/core/ext/upb-generated/google/protobuf/any.upb.h ) - s.files += %w( src/core/ext/upb-generated/google/protobuf/descriptor.upb.c ) - s.files += %w( src/core/ext/upb-generated/google/protobuf/descriptor.upb.h ) - s.files += %w( src/core/ext/upb-generated/google/protobuf/duration.upb.c ) - s.files += %w( src/core/ext/upb-generated/google/protobuf/duration.upb.h ) - s.files += %w( src/core/ext/upb-generated/google/protobuf/empty.upb.c ) - s.files += %w( src/core/ext/upb-generated/google/protobuf/empty.upb.h ) - s.files += %w( src/core/ext/upb-generated/google/protobuf/struct.upb.c ) - s.files += %w( src/core/ext/upb-generated/google/protobuf/struct.upb.h ) - s.files += %w( src/core/ext/upb-generated/google/protobuf/timestamp.upb.c ) - s.files += %w( src/core/ext/upb-generated/google/protobuf/timestamp.upb.h ) - s.files += %w( src/core/ext/upb-generated/google/protobuf/wrappers.upb.c ) - s.files += %w( src/core/ext/upb-generated/google/protobuf/wrappers.upb.h ) - s.files += %w( src/core/ext/upb-generated/google/rpc/status.upb.c ) - s.files += %w( src/core/ext/upb-generated/google/rpc/status.upb.h ) - s.files += %w( src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c ) - s.files += %w( src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h ) - s.files += %w( src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c ) - s.files += %w( src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h ) - s.files += %w( src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c ) - s.files += %w( src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h ) - s.files += %w( src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c ) - s.files += %w( src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h ) - s.files += %w( src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c ) - s.files += %w( src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h ) - s.files += %w( src/core/ext/upb-generated/udpa/annotations/migrate.upb.c ) - s.files += %w( src/core/ext/upb-generated/udpa/annotations/migrate.upb.h ) - s.files += %w( src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c ) - s.files += %w( src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h ) - s.files += %w( src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c ) - s.files += %w( src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h ) - s.files += %w( src/core/ext/upb-generated/validate/validate.upb.c ) - s.files += %w( src/core/ext/upb-generated/validate/validate.upb.h ) - s.files += %w( src/core/lib/avl/avl.cc ) - s.files += %w( src/core/lib/avl/avl.h ) - s.files += %w( src/core/lib/backoff/backoff.cc ) - s.files += %w( src/core/lib/backoff/backoff.h ) - s.files += %w( src/core/lib/channel/channel_args.cc ) - s.files += %w( src/core/lib/channel/channel_args.h ) - s.files += %w( src/core/lib/channel/channel_stack.cc ) - s.files += %w( src/core/lib/channel/channel_stack.h ) - s.files += %w( src/core/lib/channel/channel_stack_builder.cc ) - s.files += %w( src/core/lib/channel/channel_stack_builder.h ) - s.files += %w( src/core/lib/channel/channel_trace.cc ) - s.files += %w( src/core/lib/channel/channel_trace.h ) - s.files += %w( src/core/lib/channel/channelz.cc ) - s.files += %w( src/core/lib/channel/channelz.h ) - s.files += %w( src/core/lib/channel/channelz_registry.cc ) - s.files += %w( src/core/lib/channel/channelz_registry.h ) - s.files += %w( src/core/lib/channel/connected_channel.cc ) - s.files += %w( src/core/lib/channel/connected_channel.h ) - s.files += %w( src/core/lib/channel/context.h ) - s.files += %w( src/core/lib/channel/handshaker.cc ) - s.files += %w( src/core/lib/channel/handshaker.h ) - s.files += %w( src/core/lib/channel/handshaker_factory.h ) - s.files += %w( src/core/lib/channel/handshaker_registry.cc ) - s.files += %w( src/core/lib/channel/handshaker_registry.h ) - s.files += %w( src/core/lib/channel/status_util.cc ) - s.files += %w( src/core/lib/channel/status_util.h ) - s.files += %w( src/core/lib/compression/algorithm_metadata.h ) - s.files += %w( src/core/lib/compression/compression.cc ) - s.files += %w( src/core/lib/compression/compression_args.cc ) - s.files += %w( src/core/lib/compression/compression_args.h ) - s.files += %w( src/core/lib/compression/compression_internal.cc ) - s.files += %w( src/core/lib/compression/compression_internal.h ) - s.files += %w( src/core/lib/compression/message_compress.cc ) - s.files += %w( src/core/lib/compression/message_compress.h ) - s.files += %w( src/core/lib/compression/stream_compression.cc ) - s.files += %w( src/core/lib/compression/stream_compression.h ) - s.files += %w( src/core/lib/compression/stream_compression_gzip.cc ) - s.files += %w( src/core/lib/compression/stream_compression_gzip.h ) - s.files += %w( src/core/lib/compression/stream_compression_identity.cc ) - s.files += %w( src/core/lib/compression/stream_compression_identity.h ) - s.files += %w( src/core/lib/debug/stats.cc ) - s.files += %w( src/core/lib/debug/stats.h ) - s.files += %w( src/core/lib/debug/stats_data.cc ) - s.files += %w( src/core/lib/debug/stats_data.h ) - s.files += %w( src/core/lib/debug/trace.cc ) - s.files += %w( src/core/lib/debug/trace.h ) - s.files += %w( src/core/lib/gpr/alloc.cc ) - s.files += %w( src/core/lib/gpr/alloc.h ) - s.files += %w( src/core/lib/gpr/arena.h ) - s.files += %w( src/core/lib/gpr/atm.cc ) - s.files += %w( src/core/lib/gpr/cpu_iphone.cc ) - s.files += %w( src/core/lib/gpr/cpu_linux.cc ) - s.files += %w( src/core/lib/gpr/cpu_posix.cc ) - s.files += %w( src/core/lib/gpr/cpu_windows.cc ) - s.files += %w( src/core/lib/gpr/env.h ) - s.files += %w( src/core/lib/gpr/env_linux.cc ) - s.files += %w( src/core/lib/gpr/env_posix.cc ) - s.files += %w( src/core/lib/gpr/env_windows.cc ) - s.files += %w( src/core/lib/gpr/log.cc ) - s.files += %w( src/core/lib/gpr/log_android.cc ) - s.files += %w( src/core/lib/gpr/log_linux.cc ) - s.files += %w( src/core/lib/gpr/log_posix.cc ) - s.files += %w( src/core/lib/gpr/log_windows.cc ) - s.files += %w( src/core/lib/gpr/murmur_hash.cc ) - s.files += %w( src/core/lib/gpr/murmur_hash.h ) - s.files += %w( src/core/lib/gpr/spinlock.h ) - s.files += %w( src/core/lib/gpr/string.cc ) - s.files += %w( src/core/lib/gpr/string.h ) - s.files += %w( src/core/lib/gpr/string_posix.cc ) - s.files += %w( src/core/lib/gpr/string_util_windows.cc ) - s.files += %w( src/core/lib/gpr/string_windows.cc ) - s.files += %w( src/core/lib/gpr/string_windows.h ) - s.files += %w( src/core/lib/gpr/sync.cc ) - s.files += %w( src/core/lib/gpr/sync_abseil.cc ) - s.files += %w( src/core/lib/gpr/sync_posix.cc ) - s.files += %w( src/core/lib/gpr/sync_windows.cc ) - s.files += %w( src/core/lib/gpr/time.cc ) - s.files += %w( src/core/lib/gpr/time_posix.cc ) - s.files += %w( src/core/lib/gpr/time_precise.cc ) - s.files += %w( src/core/lib/gpr/time_precise.h ) - s.files += %w( src/core/lib/gpr/time_windows.cc ) - s.files += %w( src/core/lib/gpr/tls.h ) - s.files += %w( src/core/lib/gpr/tls_gcc.h ) - s.files += %w( src/core/lib/gpr/tls_msvc.h ) - s.files += %w( src/core/lib/gpr/tls_pthread.cc ) - s.files += %w( src/core/lib/gpr/tls_pthread.h ) - s.files += %w( src/core/lib/gpr/tmpfile.h ) - s.files += %w( src/core/lib/gpr/tmpfile_msys.cc ) - s.files += %w( src/core/lib/gpr/tmpfile_posix.cc ) - s.files += %w( src/core/lib/gpr/tmpfile_windows.cc ) - s.files += %w( src/core/lib/gpr/useful.h ) - s.files += %w( src/core/lib/gpr/wrap_memcpy.cc ) - s.files += %w( src/core/lib/gprpp/arena.cc ) - s.files += %w( src/core/lib/gprpp/arena.h ) - s.files += %w( src/core/lib/gprpp/atomic.h ) - s.files += %w( src/core/lib/gprpp/debug_location.h ) - s.files += %w( src/core/lib/gprpp/fork.cc ) - s.files += %w( src/core/lib/gprpp/fork.h ) - s.files += %w( src/core/lib/gprpp/global_config.h ) - s.files += %w( src/core/lib/gprpp/global_config_custom.h ) - s.files += %w( src/core/lib/gprpp/global_config_env.cc ) - s.files += %w( src/core/lib/gprpp/global_config_env.h ) - s.files += %w( src/core/lib/gprpp/global_config_generic.h ) - s.files += %w( src/core/lib/gprpp/host_port.cc ) - s.files += %w( src/core/lib/gprpp/host_port.h ) - s.files += %w( src/core/lib/gprpp/inlined_vector.h ) - s.files += %w( src/core/lib/gprpp/manual_constructor.h ) - s.files += %w( src/core/lib/gprpp/map.h ) - s.files += %w( src/core/lib/gprpp/memory.h ) - s.files += %w( src/core/lib/gprpp/mpscq.cc ) - s.files += %w( src/core/lib/gprpp/mpscq.h ) - s.files += %w( src/core/lib/gprpp/optional.h ) - s.files += %w( src/core/lib/gprpp/orphanable.h ) - s.files += %w( src/core/lib/gprpp/ref_counted.h ) - s.files += %w( src/core/lib/gprpp/ref_counted_ptr.h ) - s.files += %w( src/core/lib/gprpp/string_view.h ) - s.files += %w( src/core/lib/gprpp/sync.h ) - s.files += %w( src/core/lib/gprpp/thd.h ) - s.files += %w( src/core/lib/gprpp/thd_posix.cc ) - s.files += %w( src/core/lib/gprpp/thd_windows.cc ) - s.files += %w( src/core/lib/http/format_request.cc ) - s.files += %w( src/core/lib/http/format_request.h ) - s.files += %w( src/core/lib/http/httpcli.cc ) - s.files += %w( src/core/lib/http/httpcli.h ) - s.files += %w( src/core/lib/http/httpcli_security_connector.cc ) - s.files += %w( src/core/lib/http/parser.cc ) - s.files += %w( src/core/lib/http/parser.h ) - s.files += %w( src/core/lib/iomgr/block_annotate.h ) - s.files += %w( src/core/lib/iomgr/buffer_list.cc ) - s.files += %w( src/core/lib/iomgr/buffer_list.h ) - s.files += %w( src/core/lib/iomgr/call_combiner.cc ) - s.files += %w( src/core/lib/iomgr/call_combiner.h ) - s.files += %w( src/core/lib/iomgr/cfstream_handle.cc ) - s.files += %w( src/core/lib/iomgr/cfstream_handle.h ) - s.files += %w( src/core/lib/iomgr/closure.h ) - s.files += %w( src/core/lib/iomgr/combiner.cc ) - s.files += %w( src/core/lib/iomgr/combiner.h ) - s.files += %w( src/core/lib/iomgr/dualstack_socket_posix.cc ) - s.files += %w( src/core/lib/iomgr/dynamic_annotations.h ) - s.files += %w( src/core/lib/iomgr/endpoint.cc ) - s.files += %w( src/core/lib/iomgr/endpoint.h ) - s.files += %w( src/core/lib/iomgr/endpoint_cfstream.cc ) - s.files += %w( src/core/lib/iomgr/endpoint_cfstream.h ) - s.files += %w( src/core/lib/iomgr/endpoint_pair.h ) - s.files += %w( src/core/lib/iomgr/endpoint_pair_posix.cc ) - s.files += %w( src/core/lib/iomgr/endpoint_pair_uv.cc ) - s.files += %w( src/core/lib/iomgr/endpoint_pair_windows.cc ) - s.files += %w( src/core/lib/iomgr/error.cc ) - s.files += %w( src/core/lib/iomgr/error.h ) - s.files += %w( src/core/lib/iomgr/error_cfstream.cc ) - s.files += %w( src/core/lib/iomgr/error_cfstream.h ) - s.files += %w( src/core/lib/iomgr/error_internal.h ) - s.files += %w( src/core/lib/iomgr/ev_epoll1_linux.cc ) - s.files += %w( src/core/lib/iomgr/ev_epoll1_linux.h ) - s.files += %w( src/core/lib/iomgr/ev_epollex_linux.cc ) - s.files += %w( src/core/lib/iomgr/ev_epollex_linux.h ) - s.files += %w( src/core/lib/iomgr/ev_poll_posix.cc ) - s.files += %w( src/core/lib/iomgr/ev_poll_posix.h ) - s.files += %w( src/core/lib/iomgr/ev_posix.cc ) - s.files += %w( src/core/lib/iomgr/ev_posix.h ) - s.files += %w( src/core/lib/iomgr/ev_windows.cc ) - s.files += %w( src/core/lib/iomgr/exec_ctx.cc ) - s.files += %w( src/core/lib/iomgr/exec_ctx.h ) - s.files += %w( src/core/lib/iomgr/executor.cc ) - s.files += %w( src/core/lib/iomgr/executor.h ) - s.files += %w( src/core/lib/iomgr/executor/mpmcqueue.cc ) - s.files += %w( src/core/lib/iomgr/executor/mpmcqueue.h ) - s.files += %w( src/core/lib/iomgr/executor/threadpool.cc ) - s.files += %w( src/core/lib/iomgr/executor/threadpool.h ) - s.files += %w( src/core/lib/iomgr/fork_posix.cc ) - s.files += %w( src/core/lib/iomgr/fork_windows.cc ) - s.files += %w( src/core/lib/iomgr/gethostname.h ) - s.files += %w( src/core/lib/iomgr/gethostname_fallback.cc ) - s.files += %w( src/core/lib/iomgr/gethostname_host_name_max.cc ) - s.files += %w( src/core/lib/iomgr/gethostname_sysconf.cc ) - s.files += %w( src/core/lib/iomgr/grpc_if_nametoindex.h ) - s.files += %w( src/core/lib/iomgr/grpc_if_nametoindex_posix.cc ) - s.files += %w( src/core/lib/iomgr/grpc_if_nametoindex_unsupported.cc ) - s.files += %w( src/core/lib/iomgr/internal_errqueue.cc ) - s.files += %w( src/core/lib/iomgr/internal_errqueue.h ) - s.files += %w( src/core/lib/iomgr/iocp_windows.cc ) - s.files += %w( src/core/lib/iomgr/iocp_windows.h ) - s.files += %w( src/core/lib/iomgr/iomgr.cc ) - s.files += %w( src/core/lib/iomgr/iomgr.h ) - s.files += %w( src/core/lib/iomgr/iomgr_custom.cc ) - s.files += %w( src/core/lib/iomgr/iomgr_custom.h ) - s.files += %w( src/core/lib/iomgr/iomgr_internal.cc ) - s.files += %w( src/core/lib/iomgr/iomgr_internal.h ) - s.files += %w( src/core/lib/iomgr/iomgr_posix.cc ) - s.files += %w( src/core/lib/iomgr/iomgr_posix.h ) - s.files += %w( src/core/lib/iomgr/iomgr_posix_cfstream.cc ) - s.files += %w( src/core/lib/iomgr/iomgr_uv.cc ) - s.files += %w( src/core/lib/iomgr/iomgr_windows.cc ) - s.files += %w( src/core/lib/iomgr/is_epollexclusive_available.cc ) - s.files += %w( src/core/lib/iomgr/is_epollexclusive_available.h ) - s.files += %w( src/core/lib/iomgr/load_file.cc ) - s.files += %w( src/core/lib/iomgr/load_file.h ) - s.files += %w( src/core/lib/iomgr/lockfree_event.cc ) - s.files += %w( src/core/lib/iomgr/lockfree_event.h ) - s.files += %w( src/core/lib/iomgr/nameser.h ) - s.files += %w( src/core/lib/iomgr/poller/eventmanager_libuv.cc ) - s.files += %w( src/core/lib/iomgr/poller/eventmanager_libuv.h ) - s.files += %w( src/core/lib/iomgr/polling_entity.cc ) - s.files += %w( src/core/lib/iomgr/polling_entity.h ) - s.files += %w( src/core/lib/iomgr/pollset.cc ) - s.files += %w( src/core/lib/iomgr/pollset.h ) - s.files += %w( src/core/lib/iomgr/pollset_custom.cc ) - s.files += %w( src/core/lib/iomgr/pollset_custom.h ) - s.files += %w( src/core/lib/iomgr/pollset_set.cc ) - s.files += %w( src/core/lib/iomgr/pollset_set.h ) - s.files += %w( src/core/lib/iomgr/pollset_set_custom.cc ) - s.files += %w( src/core/lib/iomgr/pollset_set_custom.h ) - s.files += %w( src/core/lib/iomgr/pollset_set_windows.cc ) - s.files += %w( src/core/lib/iomgr/pollset_set_windows.h ) - s.files += %w( src/core/lib/iomgr/pollset_uv.cc ) - s.files += %w( src/core/lib/iomgr/pollset_uv.h ) - s.files += %w( src/core/lib/iomgr/pollset_windows.cc ) - s.files += %w( src/core/lib/iomgr/pollset_windows.h ) - s.files += %w( src/core/lib/iomgr/port.h ) - s.files += %w( src/core/lib/iomgr/python_util.h ) - s.files += %w( src/core/lib/iomgr/resolve_address.cc ) - s.files += %w( src/core/lib/iomgr/resolve_address.h ) - s.files += %w( src/core/lib/iomgr/resolve_address_custom.cc ) - s.files += %w( src/core/lib/iomgr/resolve_address_custom.h ) - s.files += %w( src/core/lib/iomgr/resolve_address_posix.cc ) - s.files += %w( src/core/lib/iomgr/resolve_address_windows.cc ) - s.files += %w( src/core/lib/iomgr/resource_quota.cc ) - s.files += %w( src/core/lib/iomgr/resource_quota.h ) - s.files += %w( src/core/lib/iomgr/sockaddr.h ) - s.files += %w( src/core/lib/iomgr/sockaddr_custom.h ) - s.files += %w( src/core/lib/iomgr/sockaddr_posix.h ) - s.files += %w( src/core/lib/iomgr/sockaddr_utils.cc ) - s.files += %w( src/core/lib/iomgr/sockaddr_utils.h ) - s.files += %w( src/core/lib/iomgr/sockaddr_windows.h ) - s.files += %w( src/core/lib/iomgr/socket_factory_posix.cc ) - s.files += %w( src/core/lib/iomgr/socket_factory_posix.h ) - s.files += %w( src/core/lib/iomgr/socket_mutator.cc ) - s.files += %w( src/core/lib/iomgr/socket_mutator.h ) - s.files += %w( src/core/lib/iomgr/socket_utils.h ) - s.files += %w( src/core/lib/iomgr/socket_utils_common_posix.cc ) - s.files += %w( src/core/lib/iomgr/socket_utils_linux.cc ) - s.files += %w( src/core/lib/iomgr/socket_utils_posix.cc ) - s.files += %w( src/core/lib/iomgr/socket_utils_posix.h ) - s.files += %w( src/core/lib/iomgr/socket_utils_uv.cc ) - s.files += %w( src/core/lib/iomgr/socket_utils_windows.cc ) - s.files += %w( src/core/lib/iomgr/socket_windows.cc ) - s.files += %w( src/core/lib/iomgr/socket_windows.h ) - s.files += %w( src/core/lib/iomgr/sys_epoll_wrapper.h ) - s.files += %w( src/core/lib/iomgr/tcp_client.cc ) - s.files += %w( src/core/lib/iomgr/tcp_client.h ) - s.files += %w( src/core/lib/iomgr/tcp_client_cfstream.cc ) - s.files += %w( src/core/lib/iomgr/tcp_client_custom.cc ) - s.files += %w( src/core/lib/iomgr/tcp_client_posix.cc ) - s.files += %w( src/core/lib/iomgr/tcp_client_posix.h ) - s.files += %w( src/core/lib/iomgr/tcp_client_windows.cc ) - s.files += %w( src/core/lib/iomgr/tcp_custom.cc ) - s.files += %w( src/core/lib/iomgr/tcp_custom.h ) - s.files += %w( src/core/lib/iomgr/tcp_posix.cc ) - s.files += %w( src/core/lib/iomgr/tcp_posix.h ) - s.files += %w( src/core/lib/iomgr/tcp_server.cc ) - s.files += %w( src/core/lib/iomgr/tcp_server.h ) - s.files += %w( src/core/lib/iomgr/tcp_server_custom.cc ) - s.files += %w( src/core/lib/iomgr/tcp_server_posix.cc ) - s.files += %w( src/core/lib/iomgr/tcp_server_utils_posix.h ) - s.files += %w( src/core/lib/iomgr/tcp_server_utils_posix_common.cc ) - s.files += %w( src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc ) - s.files += %w( src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.cc ) - s.files += %w( src/core/lib/iomgr/tcp_server_windows.cc ) - s.files += %w( src/core/lib/iomgr/tcp_uv.cc ) - s.files += %w( src/core/lib/iomgr/tcp_windows.cc ) - s.files += %w( src/core/lib/iomgr/tcp_windows.h ) - s.files += %w( src/core/lib/iomgr/time_averaged_stats.cc ) - s.files += %w( src/core/lib/iomgr/time_averaged_stats.h ) - s.files += %w( src/core/lib/iomgr/timer.cc ) - s.files += %w( src/core/lib/iomgr/timer.h ) - s.files += %w( src/core/lib/iomgr/timer_custom.cc ) - s.files += %w( src/core/lib/iomgr/timer_custom.h ) - s.files += %w( src/core/lib/iomgr/timer_generic.cc ) - s.files += %w( src/core/lib/iomgr/timer_generic.h ) - s.files += %w( src/core/lib/iomgr/timer_heap.cc ) - s.files += %w( src/core/lib/iomgr/timer_heap.h ) - s.files += %w( src/core/lib/iomgr/timer_manager.cc ) - s.files += %w( src/core/lib/iomgr/timer_manager.h ) - s.files += %w( src/core/lib/iomgr/timer_uv.cc ) - s.files += %w( src/core/lib/iomgr/udp_server.cc ) - s.files += %w( src/core/lib/iomgr/udp_server.h ) - s.files += %w( src/core/lib/iomgr/unix_sockets_posix.cc ) - s.files += %w( src/core/lib/iomgr/unix_sockets_posix.h ) - s.files += %w( src/core/lib/iomgr/unix_sockets_posix_noop.cc ) - s.files += %w( src/core/lib/iomgr/wakeup_fd_eventfd.cc ) - s.files += %w( src/core/lib/iomgr/wakeup_fd_nospecial.cc ) - s.files += %w( src/core/lib/iomgr/wakeup_fd_pipe.cc ) - s.files += %w( src/core/lib/iomgr/wakeup_fd_pipe.h ) - s.files += %w( src/core/lib/iomgr/wakeup_fd_posix.cc ) - s.files += %w( src/core/lib/iomgr/wakeup_fd_posix.h ) - s.files += %w( src/core/lib/iomgr/work_serializer.cc ) - s.files += %w( src/core/lib/iomgr/work_serializer.h ) - s.files += %w( src/core/lib/json/json.h ) - s.files += %w( src/core/lib/json/json_reader.cc ) - s.files += %w( src/core/lib/json/json_writer.cc ) - s.files += %w( src/core/lib/profiling/basic_timers.cc ) - s.files += %w( src/core/lib/profiling/stap_timers.cc ) - s.files += %w( src/core/lib/profiling/timers.h ) - s.files += %w( src/core/lib/security/context/security_context.cc ) - s.files += %w( src/core/lib/security/context/security_context.h ) - s.files += %w( src/core/lib/security/credentials/alts/alts_credentials.cc ) - s.files += %w( src/core/lib/security/credentials/alts/alts_credentials.h ) - s.files += %w( src/core/lib/security/credentials/alts/check_gcp_environment.cc ) - s.files += %w( src/core/lib/security/credentials/alts/check_gcp_environment.h ) - s.files += %w( src/core/lib/security/credentials/alts/check_gcp_environment_linux.cc ) - s.files += %w( src/core/lib/security/credentials/alts/check_gcp_environment_no_op.cc ) - s.files += %w( src/core/lib/security/credentials/alts/check_gcp_environment_windows.cc ) - s.files += %w( src/core/lib/security/credentials/alts/grpc_alts_credentials_client_options.cc ) - s.files += %w( src/core/lib/security/credentials/alts/grpc_alts_credentials_options.cc ) - s.files += %w( src/core/lib/security/credentials/alts/grpc_alts_credentials_options.h ) - s.files += %w( src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc ) - s.files += %w( src/core/lib/security/credentials/composite/composite_credentials.cc ) - s.files += %w( src/core/lib/security/credentials/composite/composite_credentials.h ) - s.files += %w( src/core/lib/security/credentials/credentials.cc ) - s.files += %w( src/core/lib/security/credentials/credentials.h ) - s.files += %w( src/core/lib/security/credentials/credentials_metadata.cc ) - s.files += %w( src/core/lib/security/credentials/fake/fake_credentials.cc ) - s.files += %w( src/core/lib/security/credentials/fake/fake_credentials.h ) - s.files += %w( src/core/lib/security/credentials/google_default/credentials_generic.cc ) - s.files += %w( src/core/lib/security/credentials/google_default/google_default_credentials.cc ) - s.files += %w( src/core/lib/security/credentials/google_default/google_default_credentials.h ) - s.files += %w( src/core/lib/security/credentials/iam/iam_credentials.cc ) - s.files += %w( src/core/lib/security/credentials/iam/iam_credentials.h ) - s.files += %w( src/core/lib/security/credentials/jwt/json_token.cc ) - s.files += %w( src/core/lib/security/credentials/jwt/json_token.h ) - s.files += %w( src/core/lib/security/credentials/jwt/jwt_credentials.cc ) - s.files += %w( src/core/lib/security/credentials/jwt/jwt_credentials.h ) - s.files += %w( src/core/lib/security/credentials/jwt/jwt_verifier.cc ) - s.files += %w( src/core/lib/security/credentials/jwt/jwt_verifier.h ) - s.files += %w( src/core/lib/security/credentials/local/local_credentials.cc ) - s.files += %w( src/core/lib/security/credentials/local/local_credentials.h ) - s.files += %w( src/core/lib/security/credentials/oauth2/oauth2_credentials.cc ) - s.files += %w( src/core/lib/security/credentials/oauth2/oauth2_credentials.h ) - s.files += %w( src/core/lib/security/credentials/plugin/plugin_credentials.cc ) - s.files += %w( src/core/lib/security/credentials/plugin/plugin_credentials.h ) - s.files += %w( src/core/lib/security/credentials/ssl/ssl_credentials.cc ) - s.files += %w( src/core/lib/security/credentials/ssl/ssl_credentials.h ) - s.files += %w( src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc ) - s.files += %w( src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h ) - s.files += %w( src/core/lib/security/credentials/tls/tls_credentials.cc ) - s.files += %w( src/core/lib/security/credentials/tls/tls_credentials.h ) - s.files += %w( src/core/lib/security/security_connector/alts/alts_security_connector.cc ) - s.files += %w( src/core/lib/security/security_connector/alts/alts_security_connector.h ) - s.files += %w( src/core/lib/security/security_connector/fake/fake_security_connector.cc ) - s.files += %w( src/core/lib/security/security_connector/fake/fake_security_connector.h ) - s.files += %w( src/core/lib/security/security_connector/load_system_roots.h ) - s.files += %w( src/core/lib/security/security_connector/load_system_roots_fallback.cc ) - s.files += %w( src/core/lib/security/security_connector/load_system_roots_linux.cc ) - s.files += %w( src/core/lib/security/security_connector/load_system_roots_linux.h ) - s.files += %w( src/core/lib/security/security_connector/local/local_security_connector.cc ) - s.files += %w( src/core/lib/security/security_connector/local/local_security_connector.h ) - s.files += %w( src/core/lib/security/security_connector/security_connector.cc ) - s.files += %w( src/core/lib/security/security_connector/security_connector.h ) - s.files += %w( src/core/lib/security/security_connector/ssl/ssl_security_connector.cc ) - s.files += %w( src/core/lib/security/security_connector/ssl/ssl_security_connector.h ) - s.files += %w( src/core/lib/security/security_connector/ssl_utils.cc ) - s.files += %w( src/core/lib/security/security_connector/ssl_utils.h ) - s.files += %w( src/core/lib/security/security_connector/ssl_utils_config.cc ) - s.files += %w( src/core/lib/security/security_connector/ssl_utils_config.h ) - s.files += %w( src/core/lib/security/security_connector/tls/tls_security_connector.cc ) - s.files += %w( src/core/lib/security/security_connector/tls/tls_security_connector.h ) - s.files += %w( src/core/lib/security/transport/auth_filters.h ) - s.files += %w( src/core/lib/security/transport/client_auth_filter.cc ) - s.files += %w( src/core/lib/security/transport/secure_endpoint.cc ) - s.files += %w( src/core/lib/security/transport/secure_endpoint.h ) - s.files += %w( src/core/lib/security/transport/security_handshaker.cc ) - s.files += %w( src/core/lib/security/transport/security_handshaker.h ) - s.files += %w( src/core/lib/security/transport/server_auth_filter.cc ) - s.files += %w( src/core/lib/security/transport/target_authority_table.cc ) - s.files += %w( src/core/lib/security/transport/target_authority_table.h ) - s.files += %w( src/core/lib/security/transport/tsi_error.cc ) - s.files += %w( src/core/lib/security/transport/tsi_error.h ) - s.files += %w( src/core/lib/security/util/json_util.cc ) - s.files += %w( src/core/lib/security/util/json_util.h ) - s.files += %w( src/core/lib/slice/b64.cc ) - s.files += %w( src/core/lib/slice/b64.h ) - s.files += %w( src/core/lib/slice/percent_encoding.cc ) - s.files += %w( src/core/lib/slice/percent_encoding.h ) - s.files += %w( src/core/lib/slice/slice.cc ) - s.files += %w( src/core/lib/slice/slice_buffer.cc ) - s.files += %w( src/core/lib/slice/slice_hash_table.h ) - s.files += %w( src/core/lib/slice/slice_intern.cc ) - s.files += %w( src/core/lib/slice/slice_internal.h ) - s.files += %w( src/core/lib/slice/slice_string_helpers.cc ) - s.files += %w( src/core/lib/slice/slice_string_helpers.h ) - s.files += %w( src/core/lib/slice/slice_utils.h ) - s.files += %w( src/core/lib/slice/slice_weak_hash_table.h ) - s.files += %w( src/core/lib/surface/api_trace.cc ) - s.files += %w( src/core/lib/surface/api_trace.h ) - s.files += %w( src/core/lib/surface/byte_buffer.cc ) - s.files += %w( src/core/lib/surface/byte_buffer_reader.cc ) - s.files += %w( src/core/lib/surface/call.cc ) - s.files += %w( src/core/lib/surface/call.h ) - s.files += %w( src/core/lib/surface/call_details.cc ) - s.files += %w( src/core/lib/surface/call_log_batch.cc ) - s.files += %w( src/core/lib/surface/call_test_only.h ) - s.files += %w( src/core/lib/surface/channel.cc ) - s.files += %w( src/core/lib/surface/channel.h ) - s.files += %w( src/core/lib/surface/channel_init.cc ) - s.files += %w( src/core/lib/surface/channel_init.h ) - s.files += %w( src/core/lib/surface/channel_ping.cc ) - s.files += %w( src/core/lib/surface/channel_stack_type.cc ) - s.files += %w( src/core/lib/surface/channel_stack_type.h ) - s.files += %w( src/core/lib/surface/completion_queue.cc ) - s.files += %w( src/core/lib/surface/completion_queue.h ) - s.files += %w( src/core/lib/surface/completion_queue_factory.cc ) - s.files += %w( src/core/lib/surface/completion_queue_factory.h ) - s.files += %w( src/core/lib/surface/event_string.cc ) - s.files += %w( src/core/lib/surface/event_string.h ) - s.files += %w( src/core/lib/surface/init.cc ) - s.files += %w( src/core/lib/surface/init.h ) - s.files += %w( src/core/lib/surface/init_secure.cc ) - s.files += %w( src/core/lib/surface/lame_client.cc ) - s.files += %w( src/core/lib/surface/lame_client.h ) - s.files += %w( src/core/lib/surface/metadata_array.cc ) - s.files += %w( src/core/lib/surface/server.cc ) - s.files += %w( src/core/lib/surface/server.h ) - s.files += %w( src/core/lib/surface/validate_metadata.cc ) - s.files += %w( src/core/lib/surface/validate_metadata.h ) - s.files += %w( src/core/lib/surface/version.cc ) - s.files += %w( src/core/lib/transport/bdp_estimator.cc ) - s.files += %w( src/core/lib/transport/bdp_estimator.h ) - s.files += %w( src/core/lib/transport/byte_stream.cc ) - s.files += %w( src/core/lib/transport/byte_stream.h ) - s.files += %w( src/core/lib/transport/connectivity_state.cc ) - s.files += %w( src/core/lib/transport/connectivity_state.h ) - s.files += %w( src/core/lib/transport/error_utils.cc ) - s.files += %w( src/core/lib/transport/error_utils.h ) - s.files += %w( src/core/lib/transport/http2_errors.h ) - s.files += %w( src/core/lib/transport/metadata.cc ) - s.files += %w( src/core/lib/transport/metadata.h ) - s.files += %w( src/core/lib/transport/metadata_batch.cc ) - s.files += %w( src/core/lib/transport/metadata_batch.h ) - s.files += %w( src/core/lib/transport/pid_controller.cc ) - s.files += %w( src/core/lib/transport/pid_controller.h ) - s.files += %w( src/core/lib/transport/static_metadata.cc ) - s.files += %w( src/core/lib/transport/static_metadata.h ) - s.files += %w( src/core/lib/transport/status_conversion.cc ) - s.files += %w( src/core/lib/transport/status_conversion.h ) - s.files += %w( src/core/lib/transport/status_metadata.cc ) - s.files += %w( src/core/lib/transport/status_metadata.h ) - s.files += %w( src/core/lib/transport/timeout_encoding.cc ) - s.files += %w( src/core/lib/transport/timeout_encoding.h ) - s.files += %w( src/core/lib/transport/transport.cc ) - s.files += %w( src/core/lib/transport/transport.h ) - s.files += %w( src/core/lib/transport/transport_impl.h ) - s.files += %w( src/core/lib/transport/transport_op_string.cc ) - s.files += %w( src/core/lib/uri/uri_parser.cc ) - s.files += %w( src/core/lib/uri/uri_parser.h ) - s.files += %w( src/core/plugin_registry/grpc_plugin_registry.cc ) - s.files += %w( src/core/tsi/alts/crypt/aes_gcm.cc ) - s.files += %w( src/core/tsi/alts/crypt/gsec.cc ) - s.files += %w( src/core/tsi/alts/crypt/gsec.h ) - s.files += %w( src/core/tsi/alts/frame_protector/alts_counter.cc ) - s.files += %w( src/core/tsi/alts/frame_protector/alts_counter.h ) - s.files += %w( src/core/tsi/alts/frame_protector/alts_crypter.cc ) - s.files += %w( src/core/tsi/alts/frame_protector/alts_crypter.h ) - s.files += %w( src/core/tsi/alts/frame_protector/alts_frame_protector.cc ) - s.files += %w( src/core/tsi/alts/frame_protector/alts_frame_protector.h ) - s.files += %w( src/core/tsi/alts/frame_protector/alts_record_protocol_crypter_common.cc ) - s.files += %w( src/core/tsi/alts/frame_protector/alts_record_protocol_crypter_common.h ) - s.files += %w( src/core/tsi/alts/frame_protector/alts_seal_privacy_integrity_crypter.cc ) - s.files += %w( src/core/tsi/alts/frame_protector/alts_unseal_privacy_integrity_crypter.cc ) - s.files += %w( src/core/tsi/alts/frame_protector/frame_handler.cc ) - s.files += %w( src/core/tsi/alts/frame_protector/frame_handler.h ) - s.files += %w( src/core/tsi/alts/handshaker/alts_handshaker_client.cc ) - s.files += %w( src/core/tsi/alts/handshaker/alts_handshaker_client.h ) - s.files += %w( src/core/tsi/alts/handshaker/alts_shared_resource.cc ) - s.files += %w( src/core/tsi/alts/handshaker/alts_shared_resource.h ) - s.files += %w( src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc ) - s.files += %w( src/core/tsi/alts/handshaker/alts_tsi_handshaker.h ) - s.files += %w( src/core/tsi/alts/handshaker/alts_tsi_handshaker_private.h ) - s.files += %w( src/core/tsi/alts/handshaker/alts_tsi_utils.cc ) - s.files += %w( src/core/tsi/alts/handshaker/alts_tsi_utils.h ) - s.files += %w( src/core/tsi/alts/handshaker/transport_security_common_api.cc ) - s.files += %w( src/core/tsi/alts/handshaker/transport_security_common_api.h ) - s.files += %w( src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc ) - s.files += %w( src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.h ) - s.files += %w( src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.cc ) - s.files += %w( src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.h ) - s.files += %w( src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol.h ) - s.files += %w( src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc ) - s.files += %w( src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.h ) - s.files += %w( src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.cc ) - s.files += %w( src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.h ) - s.files += %w( src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc ) - s.files += %w( src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.h ) - s.files += %w( src/core/tsi/fake_transport_security.cc ) - s.files += %w( src/core/tsi/fake_transport_security.h ) - s.files += %w( src/core/tsi/grpc_shadow_boringssl.h ) - s.files += %w( src/core/tsi/local_transport_security.cc ) - s.files += %w( src/core/tsi/local_transport_security.h ) - s.files += %w( src/core/tsi/ssl/session_cache/ssl_session.h ) - s.files += %w( src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc ) - s.files += %w( src/core/tsi/ssl/session_cache/ssl_session_cache.cc ) - s.files += %w( src/core/tsi/ssl/session_cache/ssl_session_cache.h ) - s.files += %w( src/core/tsi/ssl/session_cache/ssl_session_openssl.cc ) - s.files += %w( src/core/tsi/ssl_transport_security.cc ) - s.files += %w( src/core/tsi/ssl_transport_security.h ) - s.files += %w( src/core/tsi/ssl_types.h ) - s.files += %w( src/core/tsi/transport_security.cc ) - s.files += %w( src/core/tsi/transport_security.h ) - s.files += %w( src/core/tsi/transport_security_grpc.cc ) - s.files += %w( src/core/tsi/transport_security_grpc.h ) - s.files += %w( src/core/tsi/transport_security_interface.h ) - s.files += %w( third_party/abseil-cpp/absl/algorithm/algorithm.h ) - s.files += %w( third_party/abseil-cpp/absl/base/attributes.h ) - s.files += %w( third_party/abseil-cpp/absl/base/call_once.h ) - s.files += %w( third_party/abseil-cpp/absl/base/casts.h ) - s.files += %w( third_party/abseil-cpp/absl/base/config.h ) - s.files += %w( third_party/abseil-cpp/absl/base/const_init.h ) - s.files += %w( third_party/abseil-cpp/absl/base/dynamic_annotations.cc ) - s.files += %w( third_party/abseil-cpp/absl/base/dynamic_annotations.h ) - s.files += %w( third_party/abseil-cpp/absl/base/internal/atomic_hook.h ) - s.files += %w( third_party/abseil-cpp/absl/base/internal/bits.h ) - s.files += %w( third_party/abseil-cpp/absl/base/internal/cycleclock.cc ) - s.files += %w( third_party/abseil-cpp/absl/base/internal/cycleclock.h ) - s.files += %w( third_party/abseil-cpp/absl/base/internal/endian.h ) - s.files += %w( third_party/abseil-cpp/absl/base/internal/errno_saver.h ) - s.files += %w( third_party/abseil-cpp/absl/base/internal/hide_ptr.h ) - s.files += %w( third_party/abseil-cpp/absl/base/internal/identity.h ) - s.files += %w( third_party/abseil-cpp/absl/base/internal/inline_variable.h ) - s.files += %w( third_party/abseil-cpp/absl/base/internal/invoke.h ) - s.files += %w( third_party/abseil-cpp/absl/base/internal/low_level_scheduling.h ) - s.files += %w( third_party/abseil-cpp/absl/base/internal/per_thread_tls.h ) - s.files += %w( third_party/abseil-cpp/absl/base/internal/raw_logging.cc ) - s.files += %w( third_party/abseil-cpp/absl/base/internal/raw_logging.h ) - s.files += %w( third_party/abseil-cpp/absl/base/internal/scheduling_mode.h ) - s.files += %w( third_party/abseil-cpp/absl/base/internal/spinlock.cc ) - s.files += %w( third_party/abseil-cpp/absl/base/internal/spinlock.h ) - s.files += %w( third_party/abseil-cpp/absl/base/internal/spinlock_akaros.inc ) - s.files += %w( third_party/abseil-cpp/absl/base/internal/spinlock_linux.inc ) - s.files += %w( third_party/abseil-cpp/absl/base/internal/spinlock_posix.inc ) - s.files += %w( third_party/abseil-cpp/absl/base/internal/spinlock_wait.cc ) - s.files += %w( third_party/abseil-cpp/absl/base/internal/spinlock_wait.h ) - s.files += %w( third_party/abseil-cpp/absl/base/internal/spinlock_win32.inc ) - s.files += %w( third_party/abseil-cpp/absl/base/internal/sysinfo.cc ) - s.files += %w( third_party/abseil-cpp/absl/base/internal/sysinfo.h ) - s.files += %w( third_party/abseil-cpp/absl/base/internal/thread_annotations.h ) - s.files += %w( third_party/abseil-cpp/absl/base/internal/thread_identity.cc ) - s.files += %w( third_party/abseil-cpp/absl/base/internal/thread_identity.h ) - s.files += %w( third_party/abseil-cpp/absl/base/internal/throw_delegate.cc ) - s.files += %w( third_party/abseil-cpp/absl/base/internal/throw_delegate.h ) - s.files += %w( third_party/abseil-cpp/absl/base/internal/tsan_mutex_interface.h ) - s.files += %w( third_party/abseil-cpp/absl/base/internal/unaligned_access.h ) - s.files += %w( third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc ) - s.files += %w( third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h ) - s.files += %w( third_party/abseil-cpp/absl/base/log_severity.cc ) - s.files += %w( third_party/abseil-cpp/absl/base/log_severity.h ) - s.files += %w( third_party/abseil-cpp/absl/base/macros.h ) - s.files += %w( third_party/abseil-cpp/absl/base/optimization.h ) - s.files += %w( third_party/abseil-cpp/absl/base/options.h ) - s.files += %w( third_party/abseil-cpp/absl/base/policy_checks.h ) - s.files += %w( third_party/abseil-cpp/absl/base/port.h ) - s.files += %w( third_party/abseil-cpp/absl/base/thread_annotations.h ) - s.files += %w( third_party/abseil-cpp/absl/container/inlined_vector.h ) - s.files += %w( third_party/abseil-cpp/absl/container/internal/compressed_tuple.h ) - s.files += %w( third_party/abseil-cpp/absl/container/internal/inlined_vector.h ) - s.files += %w( third_party/abseil-cpp/absl/memory/memory.h ) - s.files += %w( third_party/abseil-cpp/absl/meta/type_traits.h ) - s.files += %w( third_party/abseil-cpp/absl/numeric/int128.cc ) - s.files += %w( third_party/abseil-cpp/absl/numeric/int128.h ) - s.files += %w( third_party/abseil-cpp/absl/numeric/int128_have_intrinsic.inc ) - s.files += %w( third_party/abseil-cpp/absl/numeric/int128_no_intrinsic.inc ) - s.files += %w( third_party/abseil-cpp/absl/strings/ascii.cc ) - s.files += %w( third_party/abseil-cpp/absl/strings/ascii.h ) - s.files += %w( third_party/abseil-cpp/absl/strings/charconv.cc ) - s.files += %w( third_party/abseil-cpp/absl/strings/charconv.h ) - s.files += %w( third_party/abseil-cpp/absl/strings/escaping.cc ) - s.files += %w( third_party/abseil-cpp/absl/strings/escaping.h ) - s.files += %w( third_party/abseil-cpp/absl/strings/internal/char_map.h ) - s.files += %w( third_party/abseil-cpp/absl/strings/internal/charconv_bigint.cc ) - s.files += %w( third_party/abseil-cpp/absl/strings/internal/charconv_bigint.h ) - s.files += %w( third_party/abseil-cpp/absl/strings/internal/charconv_parse.cc ) - s.files += %w( third_party/abseil-cpp/absl/strings/internal/charconv_parse.h ) - s.files += %w( third_party/abseil-cpp/absl/strings/internal/escaping.cc ) - s.files += %w( third_party/abseil-cpp/absl/strings/internal/escaping.h ) - s.files += %w( third_party/abseil-cpp/absl/strings/internal/memutil.cc ) - s.files += %w( third_party/abseil-cpp/absl/strings/internal/memutil.h ) - s.files += %w( third_party/abseil-cpp/absl/strings/internal/ostringstream.cc ) - s.files += %w( third_party/abseil-cpp/absl/strings/internal/ostringstream.h ) - s.files += %w( third_party/abseil-cpp/absl/strings/internal/resize_uninitialized.h ) - s.files += %w( third_party/abseil-cpp/absl/strings/internal/stl_type_traits.h ) - s.files += %w( third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc ) - s.files += %w( third_party/abseil-cpp/absl/strings/internal/str_format/arg.h ) - s.files += %w( third_party/abseil-cpp/absl/strings/internal/str_format/bind.cc ) - s.files += %w( third_party/abseil-cpp/absl/strings/internal/str_format/bind.h ) - s.files += %w( third_party/abseil-cpp/absl/strings/internal/str_format/checker.h ) - s.files += %w( third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc ) - s.files += %w( third_party/abseil-cpp/absl/strings/internal/str_format/extension.h ) - s.files += %w( third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc ) - s.files += %w( third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.h ) - s.files += %w( third_party/abseil-cpp/absl/strings/internal/str_format/output.cc ) - s.files += %w( third_party/abseil-cpp/absl/strings/internal/str_format/output.h ) - s.files += %w( third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc ) - s.files += %w( third_party/abseil-cpp/absl/strings/internal/str_format/parser.h ) - s.files += %w( third_party/abseil-cpp/absl/strings/internal/str_join_internal.h ) - s.files += %w( third_party/abseil-cpp/absl/strings/internal/str_split_internal.h ) - s.files += %w( third_party/abseil-cpp/absl/strings/internal/utf8.cc ) - s.files += %w( third_party/abseil-cpp/absl/strings/internal/utf8.h ) - s.files += %w( third_party/abseil-cpp/absl/strings/match.cc ) - s.files += %w( third_party/abseil-cpp/absl/strings/match.h ) - s.files += %w( third_party/abseil-cpp/absl/strings/numbers.cc ) - s.files += %w( third_party/abseil-cpp/absl/strings/numbers.h ) - s.files += %w( third_party/abseil-cpp/absl/strings/str_cat.cc ) - s.files += %w( third_party/abseil-cpp/absl/strings/str_cat.h ) - s.files += %w( third_party/abseil-cpp/absl/strings/str_format.h ) - s.files += %w( third_party/abseil-cpp/absl/strings/str_join.h ) - s.files += %w( third_party/abseil-cpp/absl/strings/str_replace.cc ) - s.files += %w( third_party/abseil-cpp/absl/strings/str_replace.h ) - s.files += %w( third_party/abseil-cpp/absl/strings/str_split.cc ) - s.files += %w( third_party/abseil-cpp/absl/strings/str_split.h ) - s.files += %w( third_party/abseil-cpp/absl/strings/string_view.cc ) - s.files += %w( third_party/abseil-cpp/absl/strings/string_view.h ) - s.files += %w( third_party/abseil-cpp/absl/strings/strip.h ) - s.files += %w( third_party/abseil-cpp/absl/strings/substitute.cc ) - s.files += %w( third_party/abseil-cpp/absl/strings/substitute.h ) - s.files += %w( third_party/abseil-cpp/absl/time/civil_time.cc ) - s.files += %w( third_party/abseil-cpp/absl/time/civil_time.h ) - s.files += %w( third_party/abseil-cpp/absl/time/clock.cc ) - s.files += %w( third_party/abseil-cpp/absl/time/clock.h ) - s.files += %w( third_party/abseil-cpp/absl/time/duration.cc ) - s.files += %w( third_party/abseil-cpp/absl/time/format.cc ) - s.files += %w( third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time.h ) - s.files += %w( third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h ) - s.files += %w( third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h ) - s.files += %w( third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/zone_info_source.h ) - s.files += %w( third_party/abseil-cpp/absl/time/internal/cctz/src/civil_time_detail.cc ) - s.files += %w( third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_fixed.cc ) - s.files += %w( third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_fixed.h ) - s.files += %w( third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc ) - s.files += %w( third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_if.cc ) - s.files += %w( third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_if.h ) - s.files += %w( third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.cc ) - s.files += %w( third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.h ) - s.files += %w( third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.cc ) - s.files += %w( third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.h ) - s.files += %w( third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.cc ) - s.files += %w( third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.h ) - s.files += %w( third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc ) - s.files += %w( third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_posix.cc ) - s.files += %w( third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_posix.h ) - s.files += %w( third_party/abseil-cpp/absl/time/internal/cctz/src/tzfile.h ) - s.files += %w( third_party/abseil-cpp/absl/time/internal/cctz/src/zone_info_source.cc ) - s.files += %w( third_party/abseil-cpp/absl/time/internal/get_current_time_chrono.inc ) - s.files += %w( third_party/abseil-cpp/absl/time/internal/get_current_time_posix.inc ) - s.files += %w( third_party/abseil-cpp/absl/time/time.cc ) - s.files += %w( third_party/abseil-cpp/absl/time/time.h ) - s.files += %w( third_party/abseil-cpp/absl/types/bad_optional_access.cc ) - s.files += %w( third_party/abseil-cpp/absl/types/bad_optional_access.h ) - s.files += %w( third_party/abseil-cpp/absl/types/internal/optional.h ) - s.files += %w( third_party/abseil-cpp/absl/types/internal/span.h ) - s.files += %w( third_party/abseil-cpp/absl/types/optional.h ) - s.files += %w( third_party/abseil-cpp/absl/types/span.h ) - s.files += %w( third_party/abseil-cpp/absl/utility/utility.h ) - s.files += %w( third_party/address_sorting/address_sorting.c ) - s.files += %w( third_party/address_sorting/address_sorting_internal.h ) - s.files += %w( third_party/address_sorting/address_sorting_posix.c ) - s.files += %w( third_party/address_sorting/address_sorting_windows.c ) - s.files += %w( third_party/address_sorting/include/address_sorting/address_sorting.h ) - s.files += %w( third_party/boringssl-with-bazel/err_data.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/a_bitstr.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/a_bool.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/a_d2i_fp.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/a_dup.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/a_enum.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/a_gentm.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/a_i2d_fp.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/a_int.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/a_mbstr.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/a_octet.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/a_print.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/a_strnid.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/a_time.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/a_type.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/a_utctm.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/a_utf8.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/asn1_locl.h ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/asn1_par.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/asn_pack.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/f_enum.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/f_int.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/f_string.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/tasn_fre.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/tasn_new.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/tasn_typ.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/tasn_utl.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/time_support.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/base64/base64.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/bio/bio.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/bio/bio_mem.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/bio/connect.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/bio/fd.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/bio/file.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/bio/hexdump.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/bio/internal.h ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/bio/pair.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/bio/printf.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/bio/socket.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/bio/socket_helper.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/bn_extra/bn_asn1.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/bn_extra/convert.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/buf/buf.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/bytestring/asn1_compat.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/bytestring/ber.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/bytestring/cbb.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/bytestring/cbs.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/bytestring/internal.h ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/bytestring/unicode.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/chacha/chacha.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/chacha/internal.h ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/cipher_extra/cipher_extra.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/cipher_extra/derive_key.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_aesccm.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_aesctrhmac.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_aesgcmsiv.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_chacha20poly1305.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_null.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_rc2.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_rc4.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_tls.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/cipher_extra/internal.h ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/cipher_extra/tls_cbc.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/cmac/cmac.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/conf/conf.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/conf/conf_def.h ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/conf/internal.h ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/cpu-aarch64-fuchsia.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/cpu-aarch64-linux.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/cpu-arm-linux.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/cpu-arm-linux.h ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/cpu-arm.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/cpu-intel.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/cpu-ppc64le.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/crypto.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/curve25519/spake25519.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/dh/check.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/dh/dh.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/dh/dh_asn1.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/dh/params.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/digest_extra/digest_extra.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/dsa/dsa_asn1.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/ec_extra/ec_asn1.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/ec_extra/ec_derive.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/ecdh_extra/ecdh_extra.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/ecdsa_extra/ecdsa_asn1.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/engine/engine.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/err/err.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/err/internal.h ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/digestsign.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/evp.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/evp_asn1.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/evp_ctx.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/internal.h ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/p_dsa_asn1.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/p_ec.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/p_ec_asn1.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/p_ed25519.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/p_ed25519_asn1.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/p_rsa.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/p_rsa_asn1.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/p_x25519.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/p_x25519_asn1.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/pbkdf.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/print.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/scrypt.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/sign.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/ex_data.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/aes.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/aes_nohw.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/internal.h ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/key_wrap.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/mode_wrappers.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/add.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/asm/x86_64-gcc.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/bn.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/bytes.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/cmp.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/ctx.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/div.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/div_extra.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/exponentiation.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/gcd.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/gcd_extra.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/generic.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/jacobi.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/montgomery.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/montgomery_inv.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/mul.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/prime.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/random.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/rsaz_exp.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/rsaz_exp.h ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/shift.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/sqrt.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/aead.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/cipher.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/e_aes.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/e_des.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/internal.h ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/delocate.h ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/des/des.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/des/internal.h ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/digest.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/digests.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/internal.h ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/md32_common.h ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_key.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_montgomery.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/felem.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/internal.h ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/oct.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p224-64.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256-x86_64-table.h ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256-x86_64.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256-x86_64.h ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/scalar.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple_mul.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/util.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/wnaf.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdh/ecdh.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/fips_shared_support.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/hmac/hmac.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/is_fips.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/md4/md4.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/md5/internal.h ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/md5/md5.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/cbc.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/cfb.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/ctr.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm_nohw.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/internal.h ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/ofb.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/polyval.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/ctrdrbg.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/internal.h ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/rand.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/urandom.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/blinding.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/internal.h ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/padding.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/internal.h ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha1-altivec.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha1.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha256.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha512.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/tls/internal.h ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/tls/kdf.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/hkdf/hkdf.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/hrss/hrss.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/hrss/internal.h ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/internal.h ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/lhash/lhash.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/mem.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/obj/obj.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/obj/obj_dat.h ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/obj/obj_xref.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/pem/pem_all.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/pem/pem_info.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/pem/pem_lib.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/pem/pem_oth.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/pem/pem_pk8.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/pem/pem_pkey.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/pem/pem_x509.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/pem/pem_xaux.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/pkcs7/internal.h ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7_x509.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/pkcs8/internal.h ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/pkcs8/p5_pbev2.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/poly1305/internal.h ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_arm.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_vec.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/pool/internal.h ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/pool/pool.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/rand_extra/deterministic.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/rand_extra/forkunsafe.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/rand_extra/fuchsia.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/rand_extra/rand_extra.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/rand_extra/windows.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/rc4/rc4.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/refcount_c11.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/refcount_lock.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/rsa_extra/rsa_asn1.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/rsa_extra/rsa_print.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/siphash/siphash.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/stack/stack.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/thread.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/thread_none.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/thread_pthread.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/thread_win.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/a_digest.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/a_sign.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/a_strex.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/a_verify.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/algorithm.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/asn1_gen.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/by_dir.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/by_file.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/charmap.h ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/i2d_pr.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/internal.h ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/rsa_pss.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/t_crl.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/t_req.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/t_x509.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/t_x509a.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/vpm_int.h ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509_att.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509_d2.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509_def.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509_ext.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509_lu.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509_obj.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509_r2x.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509_req.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509_trs.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509_txt.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509_v3.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509_vpm.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509cset.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509name.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509rset.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509spki.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x_algor.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x_all.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x_attrib.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x_exten.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x_info.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x_name.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x_pkey.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x_pubkey.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x_req.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x_sig.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x_spki.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x_val.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x_x509a.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/ext_dat.h ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/internal.h ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_cache.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_data.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_int.h ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_lib.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_map.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_node.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_tree.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_akey.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_akeya.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_alt.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_bcons.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_bitst.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_conf.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_crld.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_enum.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_extku.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_genn.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ia5.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_info.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_int.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_lib.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ncons.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ocsp.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pci.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pcia.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pcons.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pku.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pmaps.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_prn.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_skey.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_sxnet.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_utl.c ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/aead.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/aes.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/arm_arch.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/asn1.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/asn1_mac.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/asn1t.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/base.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/base64.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/bio.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/blowfish.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/bn.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/buf.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/buffer.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/bytestring.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/cast.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/chacha.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/cipher.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/cmac.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/conf.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/cpu.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/crypto.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/curve25519.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/des.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/dh.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/digest.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/dsa.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/dtls1.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/e_os2.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/ec.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/ec_key.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/ecdh.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/ecdsa.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/engine.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/err.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/evp.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/ex_data.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/hkdf.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/hmac.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/hrss.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/is_boringssl.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/lhash.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/md4.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/md5.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/mem.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/nid.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/obj.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/obj_mac.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/objects.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/opensslconf.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/opensslv.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/ossl_typ.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/pem.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/pkcs12.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/pkcs7.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/pkcs8.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/poly1305.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/pool.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/rand.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/rc4.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/ripemd.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/rsa.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/safestack.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/sha.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/siphash.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/span.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/srtp.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/ssl.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/ssl3.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/stack.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/thread.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/tls1.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/type_check.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/x509.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/x509_vfy.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/x509v3.h ) - s.files += %w( third_party/boringssl-with-bazel/src/ssl/bio_ssl.cc ) - s.files += %w( third_party/boringssl-with-bazel/src/ssl/d1_both.cc ) - s.files += %w( third_party/boringssl-with-bazel/src/ssl/d1_lib.cc ) - s.files += %w( third_party/boringssl-with-bazel/src/ssl/d1_pkt.cc ) - s.files += %w( third_party/boringssl-with-bazel/src/ssl/d1_srtp.cc ) - s.files += %w( third_party/boringssl-with-bazel/src/ssl/dtls_method.cc ) - s.files += %w( third_party/boringssl-with-bazel/src/ssl/dtls_record.cc ) - s.files += %w( third_party/boringssl-with-bazel/src/ssl/handoff.cc ) - s.files += %w( third_party/boringssl-with-bazel/src/ssl/handshake.cc ) - s.files += %w( third_party/boringssl-with-bazel/src/ssl/handshake_client.cc ) - s.files += %w( third_party/boringssl-with-bazel/src/ssl/handshake_server.cc ) - s.files += %w( third_party/boringssl-with-bazel/src/ssl/internal.h ) - s.files += %w( third_party/boringssl-with-bazel/src/ssl/s3_both.cc ) - s.files += %w( third_party/boringssl-with-bazel/src/ssl/s3_lib.cc ) - s.files += %w( third_party/boringssl-with-bazel/src/ssl/s3_pkt.cc ) - s.files += %w( third_party/boringssl-with-bazel/src/ssl/ssl_aead_ctx.cc ) - s.files += %w( third_party/boringssl-with-bazel/src/ssl/ssl_asn1.cc ) - s.files += %w( third_party/boringssl-with-bazel/src/ssl/ssl_buffer.cc ) - s.files += %w( third_party/boringssl-with-bazel/src/ssl/ssl_cert.cc ) - s.files += %w( third_party/boringssl-with-bazel/src/ssl/ssl_cipher.cc ) - s.files += %w( third_party/boringssl-with-bazel/src/ssl/ssl_file.cc ) - s.files += %w( third_party/boringssl-with-bazel/src/ssl/ssl_key_share.cc ) - s.files += %w( third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc ) - s.files += %w( third_party/boringssl-with-bazel/src/ssl/ssl_privkey.cc ) - s.files += %w( third_party/boringssl-with-bazel/src/ssl/ssl_session.cc ) - s.files += %w( third_party/boringssl-with-bazel/src/ssl/ssl_stat.cc ) - s.files += %w( third_party/boringssl-with-bazel/src/ssl/ssl_transcript.cc ) - s.files += %w( third_party/boringssl-with-bazel/src/ssl/ssl_versions.cc ) - s.files += %w( third_party/boringssl-with-bazel/src/ssl/ssl_x509.cc ) - s.files += %w( third_party/boringssl-with-bazel/src/ssl/t1_enc.cc ) - s.files += %w( third_party/boringssl-with-bazel/src/ssl/t1_lib.cc ) - s.files += %w( third_party/boringssl-with-bazel/src/ssl/tls13_both.cc ) - s.files += %w( third_party/boringssl-with-bazel/src/ssl/tls13_client.cc ) - s.files += %w( third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc ) - s.files += %w( third_party/boringssl-with-bazel/src/ssl/tls13_server.cc ) - s.files += %w( third_party/boringssl-with-bazel/src/ssl/tls_method.cc ) - s.files += %w( third_party/boringssl-with-bazel/src/ssl/tls_record.cc ) - s.files += %w( third_party/boringssl-with-bazel/src/third_party/fiat/curve25519.c ) - s.files += %w( third_party/boringssl-with-bazel/src/third_party/fiat/curve25519_32.h ) - s.files += %w( third_party/boringssl-with-bazel/src/third_party/fiat/curve25519_64.h ) - s.files += %w( third_party/boringssl-with-bazel/src/third_party/fiat/curve25519_tables.h ) - s.files += %w( third_party/boringssl-with-bazel/src/third_party/fiat/internal.h ) - s.files += %w( third_party/boringssl-with-bazel/src/third_party/fiat/p256.c ) - s.files += %w( third_party/boringssl-with-bazel/src/third_party/fiat/p256_32.h ) - s.files += %w( third_party/boringssl-with-bazel/src/third_party/fiat/p256_64.h ) - s.files += %w( third_party/cares/ares_build.h ) - s.files += %w( third_party/cares/cares/ares.h ) - s.files += %w( third_party/cares/cares/ares__close_sockets.c ) - s.files += %w( third_party/cares/cares/ares__get_hostent.c ) - s.files += %w( third_party/cares/cares/ares__read_line.c ) - s.files += %w( third_party/cares/cares/ares__timeval.c ) - s.files += %w( third_party/cares/cares/ares_cancel.c ) - s.files += %w( third_party/cares/cares/ares_create_query.c ) - s.files += %w( third_party/cares/cares/ares_data.c ) - s.files += %w( third_party/cares/cares/ares_data.h ) - s.files += %w( third_party/cares/cares/ares_destroy.c ) - s.files += %w( third_party/cares/cares/ares_dns.h ) - s.files += %w( third_party/cares/cares/ares_expand_name.c ) - s.files += %w( third_party/cares/cares/ares_expand_string.c ) - s.files += %w( third_party/cares/cares/ares_fds.c ) - s.files += %w( third_party/cares/cares/ares_free_hostent.c ) - s.files += %w( third_party/cares/cares/ares_free_string.c ) - s.files += %w( third_party/cares/cares/ares_getenv.c ) - s.files += %w( third_party/cares/cares/ares_getenv.h ) - s.files += %w( third_party/cares/cares/ares_gethostbyaddr.c ) - s.files += %w( third_party/cares/cares/ares_gethostbyname.c ) - s.files += %w( third_party/cares/cares/ares_getnameinfo.c ) - s.files += %w( third_party/cares/cares/ares_getopt.c ) - s.files += %w( third_party/cares/cares/ares_getopt.h ) - s.files += %w( third_party/cares/cares/ares_getsock.c ) - s.files += %w( third_party/cares/cares/ares_inet_net_pton.h ) - s.files += %w( third_party/cares/cares/ares_init.c ) - s.files += %w( third_party/cares/cares/ares_iphlpapi.h ) - s.files += %w( third_party/cares/cares/ares_ipv6.h ) - s.files += %w( third_party/cares/cares/ares_library_init.c ) - s.files += %w( third_party/cares/cares/ares_library_init.h ) - s.files += %w( third_party/cares/cares/ares_llist.c ) - s.files += %w( third_party/cares/cares/ares_llist.h ) - s.files += %w( third_party/cares/cares/ares_mkquery.c ) - s.files += %w( third_party/cares/cares/ares_nowarn.c ) - s.files += %w( third_party/cares/cares/ares_nowarn.h ) - s.files += %w( third_party/cares/cares/ares_options.c ) - s.files += %w( third_party/cares/cares/ares_parse_a_reply.c ) - s.files += %w( third_party/cares/cares/ares_parse_aaaa_reply.c ) - s.files += %w( third_party/cares/cares/ares_parse_mx_reply.c ) - s.files += %w( third_party/cares/cares/ares_parse_naptr_reply.c ) - s.files += %w( third_party/cares/cares/ares_parse_ns_reply.c ) - s.files += %w( third_party/cares/cares/ares_parse_ptr_reply.c ) - s.files += %w( third_party/cares/cares/ares_parse_soa_reply.c ) - s.files += %w( third_party/cares/cares/ares_parse_srv_reply.c ) - s.files += %w( third_party/cares/cares/ares_parse_txt_reply.c ) - s.files += %w( third_party/cares/cares/ares_platform.c ) - s.files += %w( third_party/cares/cares/ares_platform.h ) - s.files += %w( third_party/cares/cares/ares_private.h ) - s.files += %w( third_party/cares/cares/ares_process.c ) - s.files += %w( third_party/cares/cares/ares_query.c ) - s.files += %w( third_party/cares/cares/ares_rules.h ) - s.files += %w( third_party/cares/cares/ares_search.c ) - s.files += %w( third_party/cares/cares/ares_send.c ) - s.files += %w( third_party/cares/cares/ares_setup.h ) - s.files += %w( third_party/cares/cares/ares_strcasecmp.c ) - s.files += %w( third_party/cares/cares/ares_strcasecmp.h ) - s.files += %w( third_party/cares/cares/ares_strdup.c ) - s.files += %w( third_party/cares/cares/ares_strdup.h ) - s.files += %w( third_party/cares/cares/ares_strerror.c ) - s.files += %w( third_party/cares/cares/ares_strsplit.c ) - s.files += %w( third_party/cares/cares/ares_strsplit.h ) - s.files += %w( third_party/cares/cares/ares_timeout.c ) - s.files += %w( third_party/cares/cares/ares_version.c ) - s.files += %w( third_party/cares/cares/ares_version.h ) - s.files += %w( third_party/cares/cares/ares_writev.c ) - s.files += %w( third_party/cares/cares/bitncmp.c ) - s.files += %w( third_party/cares/cares/bitncmp.h ) - s.files += %w( third_party/cares/cares/config-win32.h ) - s.files += %w( third_party/cares/cares/inet_net_pton.c ) - s.files += %w( third_party/cares/cares/inet_ntop.c ) - s.files += %w( third_party/cares/cares/setup_once.h ) - s.files += %w( third_party/cares/cares/windows_port.c ) - s.files += %w( third_party/cares/config_darwin/ares_config.h ) - s.files += %w( third_party/cares/config_freebsd/ares_config.h ) - s.files += %w( third_party/cares/config_linux/ares_config.h ) - s.files += %w( third_party/cares/config_openbsd/ares_config.h ) - s.files += %w( third_party/upb/upb/decode.c ) - s.files += %w( third_party/upb/upb/decode.h ) - s.files += %w( third_party/upb/upb/encode.c ) - s.files += %w( third_party/upb/upb/encode.h ) - s.files += %w( third_party/upb/upb/generated_util.h ) - s.files += %w( third_party/upb/upb/msg.c ) - s.files += %w( third_party/upb/upb/msg.h ) - s.files += %w( third_party/upb/upb/port.c ) - s.files += %w( third_party/upb/upb/port_def.inc ) - s.files += %w( third_party/upb/upb/port_undef.inc ) - s.files += %w( third_party/upb/upb/table.c ) - s.files += %w( third_party/upb/upb/table.int.h ) - s.files += %w( third_party/upb/upb/upb.c ) - s.files += %w( third_party/upb/upb/upb.h ) - s.files += %w( third_party/zlib/adler32.c ) - s.files += %w( third_party/zlib/compress.c ) - s.files += %w( third_party/zlib/crc32.c ) - s.files += %w( third_party/zlib/crc32.h ) - s.files += %w( third_party/zlib/deflate.c ) - s.files += %w( third_party/zlib/deflate.h ) - s.files += %w( third_party/zlib/gzclose.c ) - s.files += %w( third_party/zlib/gzguts.h ) - s.files += %w( third_party/zlib/gzlib.c ) - s.files += %w( third_party/zlib/gzread.c ) - s.files += %w( third_party/zlib/gzwrite.c ) - s.files += %w( third_party/zlib/infback.c ) - s.files += %w( third_party/zlib/inffast.c ) - s.files += %w( third_party/zlib/inffast.h ) - s.files += %w( third_party/zlib/inffixed.h ) - s.files += %w( third_party/zlib/inflate.c ) - s.files += %w( third_party/zlib/inflate.h ) - s.files += %w( third_party/zlib/inftrees.c ) - s.files += %w( third_party/zlib/inftrees.h ) - s.files += %w( third_party/zlib/trees.c ) - s.files += %w( third_party/zlib/trees.h ) - s.files += %w( third_party/zlib/uncompr.c ) - s.files += %w( third_party/zlib/zconf.h ) - s.files += %w( third_party/zlib/zlib.h ) - s.files += %w( third_party/zlib/zutil.c ) - s.files += %w( third_party/zlib/zutil.h ) -end diff --git a/grpc.gyp b/grpc.gyp index a62c034d65a..18fb037d0be 100644 --- a/grpc.gyp +++ b/grpc.gyp @@ -198,6 +198,7 @@ 'test/core/end2end/tests/cancel_in_a_vacuum.cc', 'test/core/end2end/tests/cancel_with_status.cc', 'test/core/end2end/tests/channelz.cc', + 'test/core/end2end/tests/client_streaming.cc', 'test/core/end2end/tests/compressed_payload.cc', 'test/core/end2end/tests/connectivity.cc', 'test/core/end2end/tests/default_host.cc', @@ -299,6 +300,7 @@ 'test/core/end2end/tests/cancel_in_a_vacuum.cc', 'test/core/end2end/tests/cancel_with_status.cc', 'test/core/end2end/tests/channelz.cc', + 'test/core/end2end/tests/client_streaming.cc', 'test/core/end2end/tests/compressed_payload.cc', 'test/core/end2end/tests/connectivity.cc', 'test/core/end2end/tests/default_host.cc', @@ -1509,315 +1511,12 @@ 'src/cpp/server/channelz/channelz_service_plugin.cc', ], }, - { - 'target_name': 'boringssl', - 'type': 'static_library', - 'dependencies': [ - ], - 'sources': [ - 'third_party/boringssl-with-bazel/err_data.c', - 'third_party/boringssl-with-bazel/src/crypto/asn1/a_bitstr.c', - 'third_party/boringssl-with-bazel/src/crypto/asn1/a_bool.c', - 'third_party/boringssl-with-bazel/src/crypto/asn1/a_d2i_fp.c', - 'third_party/boringssl-with-bazel/src/crypto/asn1/a_dup.c', - 'third_party/boringssl-with-bazel/src/crypto/asn1/a_enum.c', - 'third_party/boringssl-with-bazel/src/crypto/asn1/a_gentm.c', - 'third_party/boringssl-with-bazel/src/crypto/asn1/a_i2d_fp.c', - 'third_party/boringssl-with-bazel/src/crypto/asn1/a_int.c', - 'third_party/boringssl-with-bazel/src/crypto/asn1/a_mbstr.c', - 'third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c', - 'third_party/boringssl-with-bazel/src/crypto/asn1/a_octet.c', - 'third_party/boringssl-with-bazel/src/crypto/asn1/a_print.c', - 'third_party/boringssl-with-bazel/src/crypto/asn1/a_strnid.c', - 'third_party/boringssl-with-bazel/src/crypto/asn1/a_time.c', - 'third_party/boringssl-with-bazel/src/crypto/asn1/a_type.c', - 'third_party/boringssl-with-bazel/src/crypto/asn1/a_utctm.c', - 'third_party/boringssl-with-bazel/src/crypto/asn1/a_utf8.c', - 'third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c', - 'third_party/boringssl-with-bazel/src/crypto/asn1/asn1_par.c', - 'third_party/boringssl-with-bazel/src/crypto/asn1/asn_pack.c', - 'third_party/boringssl-with-bazel/src/crypto/asn1/f_enum.c', - 'third_party/boringssl-with-bazel/src/crypto/asn1/f_int.c', - 'third_party/boringssl-with-bazel/src/crypto/asn1/f_string.c', - 'third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.c', - 'third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c', - 'third_party/boringssl-with-bazel/src/crypto/asn1/tasn_fre.c', - 'third_party/boringssl-with-bazel/src/crypto/asn1/tasn_new.c', - 'third_party/boringssl-with-bazel/src/crypto/asn1/tasn_typ.c', - 'third_party/boringssl-with-bazel/src/crypto/asn1/tasn_utl.c', - 'third_party/boringssl-with-bazel/src/crypto/asn1/time_support.c', - 'third_party/boringssl-with-bazel/src/crypto/base64/base64.c', - 'third_party/boringssl-with-bazel/src/crypto/bio/bio.c', - 'third_party/boringssl-with-bazel/src/crypto/bio/bio_mem.c', - 'third_party/boringssl-with-bazel/src/crypto/bio/connect.c', - 'third_party/boringssl-with-bazel/src/crypto/bio/fd.c', - 'third_party/boringssl-with-bazel/src/crypto/bio/file.c', - 'third_party/boringssl-with-bazel/src/crypto/bio/hexdump.c', - 'third_party/boringssl-with-bazel/src/crypto/bio/pair.c', - 'third_party/boringssl-with-bazel/src/crypto/bio/printf.c', - 'third_party/boringssl-with-bazel/src/crypto/bio/socket.c', - 'third_party/boringssl-with-bazel/src/crypto/bio/socket_helper.c', - 'third_party/boringssl-with-bazel/src/crypto/bn_extra/bn_asn1.c', - 'third_party/boringssl-with-bazel/src/crypto/bn_extra/convert.c', - 'third_party/boringssl-with-bazel/src/crypto/buf/buf.c', - 'third_party/boringssl-with-bazel/src/crypto/bytestring/asn1_compat.c', - 'third_party/boringssl-with-bazel/src/crypto/bytestring/ber.c', - 'third_party/boringssl-with-bazel/src/crypto/bytestring/cbb.c', - 'third_party/boringssl-with-bazel/src/crypto/bytestring/cbs.c', - 'third_party/boringssl-with-bazel/src/crypto/bytestring/unicode.c', - 'third_party/boringssl-with-bazel/src/crypto/chacha/chacha.c', - 'third_party/boringssl-with-bazel/src/crypto/cipher_extra/cipher_extra.c', - 'third_party/boringssl-with-bazel/src/crypto/cipher_extra/derive_key.c', - 'third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_aesccm.c', - 'third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_aesctrhmac.c', - 'third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_aesgcmsiv.c', - 'third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_chacha20poly1305.c', - 'third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_null.c', - 'third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_rc2.c', - 'third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_rc4.c', - 'third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_tls.c', - 'third_party/boringssl-with-bazel/src/crypto/cipher_extra/tls_cbc.c', - 'third_party/boringssl-with-bazel/src/crypto/cmac/cmac.c', - 'third_party/boringssl-with-bazel/src/crypto/conf/conf.c', - 'third_party/boringssl-with-bazel/src/crypto/cpu-aarch64-fuchsia.c', - 'third_party/boringssl-with-bazel/src/crypto/cpu-aarch64-linux.c', - 'third_party/boringssl-with-bazel/src/crypto/cpu-arm-linux.c', - 'third_party/boringssl-with-bazel/src/crypto/cpu-arm.c', - 'third_party/boringssl-with-bazel/src/crypto/cpu-intel.c', - 'third_party/boringssl-with-bazel/src/crypto/cpu-ppc64le.c', - 'third_party/boringssl-with-bazel/src/crypto/crypto.c', - 'third_party/boringssl-with-bazel/src/crypto/curve25519/spake25519.c', - 'third_party/boringssl-with-bazel/src/crypto/dh/check.c', - 'third_party/boringssl-with-bazel/src/crypto/dh/dh.c', - 'third_party/boringssl-with-bazel/src/crypto/dh/dh_asn1.c', - 'third_party/boringssl-with-bazel/src/crypto/dh/params.c', - 'third_party/boringssl-with-bazel/src/crypto/digest_extra/digest_extra.c', - 'third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c', - 'third_party/boringssl-with-bazel/src/crypto/dsa/dsa_asn1.c', - 'third_party/boringssl-with-bazel/src/crypto/ec_extra/ec_asn1.c', - 'third_party/boringssl-with-bazel/src/crypto/ec_extra/ec_derive.c', - 'third_party/boringssl-with-bazel/src/crypto/ecdh_extra/ecdh_extra.c', - 'third_party/boringssl-with-bazel/src/crypto/ecdsa_extra/ecdsa_asn1.c', - 'third_party/boringssl-with-bazel/src/crypto/engine/engine.c', - 'third_party/boringssl-with-bazel/src/crypto/err/err.c', - 'third_party/boringssl-with-bazel/src/crypto/evp/digestsign.c', - 'third_party/boringssl-with-bazel/src/crypto/evp/evp.c', - 'third_party/boringssl-with-bazel/src/crypto/evp/evp_asn1.c', - 'third_party/boringssl-with-bazel/src/crypto/evp/evp_ctx.c', - 'third_party/boringssl-with-bazel/src/crypto/evp/p_dsa_asn1.c', - 'third_party/boringssl-with-bazel/src/crypto/evp/p_ec.c', - 'third_party/boringssl-with-bazel/src/crypto/evp/p_ec_asn1.c', - 'third_party/boringssl-with-bazel/src/crypto/evp/p_ed25519.c', - 'third_party/boringssl-with-bazel/src/crypto/evp/p_ed25519_asn1.c', - 'third_party/boringssl-with-bazel/src/crypto/evp/p_rsa.c', - 'third_party/boringssl-with-bazel/src/crypto/evp/p_rsa_asn1.c', - 'third_party/boringssl-with-bazel/src/crypto/evp/p_x25519.c', - 'third_party/boringssl-with-bazel/src/crypto/evp/p_x25519_asn1.c', - 'third_party/boringssl-with-bazel/src/crypto/evp/pbkdf.c', - 'third_party/boringssl-with-bazel/src/crypto/evp/print.c', - 'third_party/boringssl-with-bazel/src/crypto/evp/scrypt.c', - 'third_party/boringssl-with-bazel/src/crypto/evp/sign.c', - 'third_party/boringssl-with-bazel/src/crypto/ex_data.c', - 'third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c', - 'third_party/boringssl-with-bazel/src/crypto/fipsmodule/fips_shared_support.c', - 'third_party/boringssl-with-bazel/src/crypto/fipsmodule/is_fips.c', - 'third_party/boringssl-with-bazel/src/crypto/hkdf/hkdf.c', - 'third_party/boringssl-with-bazel/src/crypto/hrss/hrss.c', - 'third_party/boringssl-with-bazel/src/crypto/lhash/lhash.c', - 'third_party/boringssl-with-bazel/src/crypto/mem.c', - 'third_party/boringssl-with-bazel/src/crypto/obj/obj.c', - 'third_party/boringssl-with-bazel/src/crypto/obj/obj_xref.c', - 'third_party/boringssl-with-bazel/src/crypto/pem/pem_all.c', - 'third_party/boringssl-with-bazel/src/crypto/pem/pem_info.c', - 'third_party/boringssl-with-bazel/src/crypto/pem/pem_lib.c', - 'third_party/boringssl-with-bazel/src/crypto/pem/pem_oth.c', - 'third_party/boringssl-with-bazel/src/crypto/pem/pem_pk8.c', - 'third_party/boringssl-with-bazel/src/crypto/pem/pem_pkey.c', - 'third_party/boringssl-with-bazel/src/crypto/pem/pem_x509.c', - 'third_party/boringssl-with-bazel/src/crypto/pem/pem_xaux.c', - 'third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7.c', - 'third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7_x509.c', - 'third_party/boringssl-with-bazel/src/crypto/pkcs8/p5_pbev2.c', - 'third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8.c', - 'third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c', - 'third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305.c', - 'third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_arm.c', - 'third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_vec.c', - 'third_party/boringssl-with-bazel/src/crypto/pool/pool.c', - 'third_party/boringssl-with-bazel/src/crypto/rand_extra/deterministic.c', - 'third_party/boringssl-with-bazel/src/crypto/rand_extra/forkunsafe.c', - 'third_party/boringssl-with-bazel/src/crypto/rand_extra/fuchsia.c', - 'third_party/boringssl-with-bazel/src/crypto/rand_extra/rand_extra.c', - 'third_party/boringssl-with-bazel/src/crypto/rand_extra/windows.c', - 'third_party/boringssl-with-bazel/src/crypto/rc4/rc4.c', - 'third_party/boringssl-with-bazel/src/crypto/refcount_c11.c', - 'third_party/boringssl-with-bazel/src/crypto/refcount_lock.c', - 'third_party/boringssl-with-bazel/src/crypto/rsa_extra/rsa_asn1.c', - 'third_party/boringssl-with-bazel/src/crypto/rsa_extra/rsa_print.c', - 'third_party/boringssl-with-bazel/src/crypto/siphash/siphash.c', - 'third_party/boringssl-with-bazel/src/crypto/stack/stack.c', - 'third_party/boringssl-with-bazel/src/crypto/thread.c', - 'third_party/boringssl-with-bazel/src/crypto/thread_none.c', - 'third_party/boringssl-with-bazel/src/crypto/thread_pthread.c', - 'third_party/boringssl-with-bazel/src/crypto/thread_win.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/a_digest.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/a_sign.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/a_strex.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/a_verify.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/algorithm.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/asn1_gen.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/by_dir.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/by_file.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/i2d_pr.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/rsa_pss.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/t_crl.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/t_req.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/t_x509.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/t_x509a.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/x509.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/x509_att.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/x509_d2.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/x509_def.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/x509_ext.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/x509_lu.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/x509_obj.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/x509_r2x.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/x509_req.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/x509_trs.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/x509_txt.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/x509_v3.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/x509_vpm.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/x509cset.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/x509name.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/x509rset.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/x509spki.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/x_algor.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/x_all.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/x_attrib.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/x_exten.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/x_info.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/x_name.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/x_pkey.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/x_pubkey.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/x_req.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/x_sig.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/x_spki.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/x_val.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/x_x509a.c', - 'third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_cache.c', - 'third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_data.c', - 'third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_lib.c', - 'third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_map.c', - 'third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_node.c', - 'third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_tree.c', - 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_akey.c', - 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_akeya.c', - 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_alt.c', - 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_bcons.c', - 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_bitst.c', - 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_conf.c', - 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c', - 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_crld.c', - 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_enum.c', - 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_extku.c', - 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_genn.c', - 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ia5.c', - 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_info.c', - 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_int.c', - 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_lib.c', - 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ncons.c', - 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ocsp.c', - 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pci.c', - 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pcia.c', - 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pcons.c', - 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pku.c', - 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pmaps.c', - 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_prn.c', - 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c', - 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_skey.c', - 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_sxnet.c', - 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_utl.c', - 'third_party/boringssl-with-bazel/src/ssl/bio_ssl.cc', - 'third_party/boringssl-with-bazel/src/ssl/d1_both.cc', - 'third_party/boringssl-with-bazel/src/ssl/d1_lib.cc', - 'third_party/boringssl-with-bazel/src/ssl/d1_pkt.cc', - 'third_party/boringssl-with-bazel/src/ssl/d1_srtp.cc', - 'third_party/boringssl-with-bazel/src/ssl/dtls_method.cc', - 'third_party/boringssl-with-bazel/src/ssl/dtls_record.cc', - 'third_party/boringssl-with-bazel/src/ssl/handoff.cc', - 'third_party/boringssl-with-bazel/src/ssl/handshake.cc', - 'third_party/boringssl-with-bazel/src/ssl/handshake_client.cc', - 'third_party/boringssl-with-bazel/src/ssl/handshake_server.cc', - 'third_party/boringssl-with-bazel/src/ssl/s3_both.cc', - 'third_party/boringssl-with-bazel/src/ssl/s3_lib.cc', - 'third_party/boringssl-with-bazel/src/ssl/s3_pkt.cc', - 'third_party/boringssl-with-bazel/src/ssl/ssl_aead_ctx.cc', - 'third_party/boringssl-with-bazel/src/ssl/ssl_asn1.cc', - 'third_party/boringssl-with-bazel/src/ssl/ssl_buffer.cc', - 'third_party/boringssl-with-bazel/src/ssl/ssl_cert.cc', - 'third_party/boringssl-with-bazel/src/ssl/ssl_cipher.cc', - 'third_party/boringssl-with-bazel/src/ssl/ssl_file.cc', - 'third_party/boringssl-with-bazel/src/ssl/ssl_key_share.cc', - 'third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc', - 'third_party/boringssl-with-bazel/src/ssl/ssl_privkey.cc', - 'third_party/boringssl-with-bazel/src/ssl/ssl_session.cc', - 'third_party/boringssl-with-bazel/src/ssl/ssl_stat.cc', - 'third_party/boringssl-with-bazel/src/ssl/ssl_transcript.cc', - 'third_party/boringssl-with-bazel/src/ssl/ssl_versions.cc', - 'third_party/boringssl-with-bazel/src/ssl/ssl_x509.cc', - 'third_party/boringssl-with-bazel/src/ssl/t1_enc.cc', - 'third_party/boringssl-with-bazel/src/ssl/t1_lib.cc', - 'third_party/boringssl-with-bazel/src/ssl/tls13_both.cc', - 'third_party/boringssl-with-bazel/src/ssl/tls13_client.cc', - 'third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc', - 'third_party/boringssl-with-bazel/src/ssl/tls13_server.cc', - 'third_party/boringssl-with-bazel/src/ssl/tls_method.cc', - 'third_party/boringssl-with-bazel/src/ssl/tls_record.cc', - 'third_party/boringssl-with-bazel/src/third_party/fiat/curve25519.c', - ], - }, - { - 'target_name': 'boringssl_test_util', - 'type': 'static_library', - 'dependencies': [ - ], - 'sources': [ - 'third_party/boringssl-with-bazel/src/crypto/test/file_test.cc', - 'third_party/boringssl-with-bazel/src/crypto/test/malloc.cc', - 'third_party/boringssl-with-bazel/src/crypto/test/test_util.cc', - 'third_party/boringssl-with-bazel/src/crypto/test/wycheproof_util.cc', - ], - }, { 'target_name': 'benchmark', 'type': 'static_library', 'dependencies': [ ], 'sources': [ - 'third_party/benchmark/src/benchmark.cc', - 'third_party/benchmark/src/benchmark_api_internal.cc', - 'third_party/benchmark/src/benchmark_main.cc', - 'third_party/benchmark/src/benchmark_name.cc', - 'third_party/benchmark/src/benchmark_register.cc', - 'third_party/benchmark/src/benchmark_runner.cc', - 'third_party/benchmark/src/colorprint.cc', - 'third_party/benchmark/src/commandlineflags.cc', - 'third_party/benchmark/src/complexity.cc', - 'third_party/benchmark/src/console_reporter.cc', - 'third_party/benchmark/src/counter.cc', - 'third_party/benchmark/src/csv_reporter.cc', - 'third_party/benchmark/src/json_reporter.cc', - 'third_party/benchmark/src/reporter.cc', - 'third_party/benchmark/src/sleep.cc', - 'third_party/benchmark/src/statistics.cc', - 'third_party/benchmark/src/string_util.cc', - 'third_party/benchmark/src/sysinfo.cc', - 'third_party/benchmark/src/timers.cc', ], }, { @@ -1834,28 +1533,5 @@ 'third_party/upb/upb/upb.c', ], }, - { - 'target_name': 'z', - 'type': 'static_library', - 'dependencies': [ - ], - 'sources': [ - 'third_party/zlib/adler32.c', - 'third_party/zlib/compress.c', - 'third_party/zlib/crc32.c', - 'third_party/zlib/deflate.c', - 'third_party/zlib/gzclose.c', - 'third_party/zlib/gzlib.c', - 'third_party/zlib/gzread.c', - 'third_party/zlib/gzwrite.c', - 'third_party/zlib/infback.c', - 'third_party/zlib/inffast.c', - 'third_party/zlib/inflate.c', - 'third_party/zlib/inftrees.c', - 'third_party/zlib/trees.c', - 'third_party/zlib/uncompr.c', - 'third_party/zlib/zutil.c', - ], - }, ] } diff --git a/package.xml b/package.xml index 06d1669ec48..c9e4b57e214 100644 --- a/package.xml +++ b/package.xml @@ -28,1896 +28,4 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 5.5.0 - - - 1.4.0 - - - - grpc - - - - - 0.5.0 - 0.5.0 - - - alpha - alpha - - 2015-06-16 - BSD - -First alpha release - - - - - 0.5.1 - 0.5.1 - - - alpha - alpha - - 2015-07-09 - BSD - -Update to wrap gRPC C Core version 0.10.0 - - - - - 0.6.0 - 0.6.0 - - - beta - beta - - 2015-09-24 - BSD - -- support per message compression disable -- expose per-call host override option -- expose connectivity API -- expose channel target and call peer -- add user-agent -- update to wrap gRPC C core library beta version 0.11.0 - - - - - 0.6.1 - 0.6.0 - - - beta - beta - - 2015-10-21 - BSD - -- fixed undefined constant fatal error when run with apache/nginx #2275 - - - - - 0.7.0 - 0.7.0 - - - beta - beta - - 2016-01-13 - BSD - -- Breaking change to Credentials class (removed) #3765 -- Replaced by ChannelCredentials and CallCredentials class #3765 -- New plugin based metadata auth API #4394 -- Explicit ChannelCredentials::createInsecure() call - - - - - 0.8.0 - 0.8.0 - - - beta - beta - - 2016-02-24 - BSD - -- Simplify gRPC PHP installation #4517 -- Wrap gRPC core library version 0.13 - - - - - 0.8.1 - 0.8.1 - - - beta - beta - - 2016-03-01 - BSD - -- Increase unit test code coverage #5225 - - - - - 0.14.0 - 0.14.0 - - - beta - beta - - 2016-04-19 - BSD - -- wrap grpc C core version 0.14.0 -- destroy grpc_byte_buffer after startBatch #6096 - - - - - 0.15.0 - 0.15.0 - - - beta - beta - - 2016-05-18 - BSD - -- Updated functions with TSRM macros for ZTS support #6607 -- Load default roots.pem via grpc_set_ssl_roots_override_callback #6848 - - - - - 1.0.0RC1 - 1.0.0RC1 - - - stable - stable - - 2016-07-13 - BSD - -- GA release -- Fix shutdown hang problem #4017 - - - - - 1.0.0RC2 - 1.0.0RC2 - - - stable - stable - - 2016-07-21 - BSD - -- PHP7 Support #7464 - - - - - 1.0.0RC3 - 1.0.0RC3 - - - stable - stable - - 2016-07-28 - BSD - -- PHP7 Support continued, reduce code duplication #7543 - - - - - 1.0.0RC4 - 1.0.0RC4 - - - stable - stable - - 2016-08-09 - BSD - -- Fixed Ubuntu compile error #7571, #7642 - - - - - 1.0.0 - 1.0.0 - - - stable - stable - - 2016-08-18 - BSD - -- gRPC 1.0.0 release - - - - - 1.0.1RC1 - 1.0.1RC1 - - - beta - beta - - 2016-10-06 - BSD - -- Reject metadata keys which are not legal #7881 - - - - - 1.0.1 - 1.0.1 - - - stable - stable - - 2016-10-27 - BSD - -- Reject metadata keys which are not legal #7881 - - - - - 1.1.0RC1 - 1.1.0RC1 - - - beta - beta - - 2017-01-13 - BSD - -- PHP Proto3 adoption #8179 -- Various bug fixes - - - - - 1.1.0 - 1.1.0 - - - stable - stable - - 2017-01-31 - BSD - -- PHP Proto3 adoption #8179 -- Various bug fixes - - - - - 1.2.0RC1 - 1.2.0RC1 - - - beta - beta - - 2017-03-01 - BSD - -- Added arg info macros #9751 -- Updated codegen to be consistent with protobuf #9492 - - - - - 1.2.0 - 1.2.0 - - - stable - stable - - 2017-03-20 - BSD - -- Added arg info macros #9751 -- Updated codegen to be consistent with protobuf #9492 - - - - + \ No newline at end of file diff --git a/src/core/ext/transport/chttp2/transport/chttp2_transport.cc b/src/core/ext/transport/chttp2/transport/chttp2_transport.cc index cc03a406903..4fa6a7710e2 100644 --- a/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +++ b/src/core/ext/transport/chttp2/transport/chttp2_transport.cc @@ -1207,7 +1207,12 @@ void grpc_chttp2_complete_closure_step(grpc_chttp2_transport* t, desc, errstr, write_state_name(t->write_state)); } if (error != GRPC_ERROR_NONE) { - if (closure->error_data.error == GRPC_ERROR_NONE) { + // The surface layer treats GRPC_ERROR_EOS specially and does not cancel + // calls with batches that failed with GRPC_ERROR_EOS. The transport layer + // uses GRPC_ERROR_EOS specifically for send ops that failed due to the + // stream being closed for writes. + if (closure->error_data.error == GRPC_ERROR_NONE && + error != GRPC_ERROR_EOS) { closure->error_data.error = GRPC_ERROR_CREATE_FROM_STATIC_STRING( "Error in HTTP transport completing operation"); closure->error_data.error = grpc_error_set_str( @@ -1484,13 +1489,9 @@ static void perform_stream_op_locked(void* stream_op, on_complete->next_data.scratch |= CLOSURE_BARRIER_MAY_COVER_WRITE; s->fetching_send_message_finished = add_closure_barrier(op->on_complete); if (s->write_closed) { - op->payload->send_message.stream_write_closed = true; - // We should NOT return an error here, so as to avoid a cancel OP being - // started. The surface layer will notice that the stream has been closed - // for writes and fail the send message op. op->payload->send_message.send_message.reset(); grpc_chttp2_complete_closure_step( - t, s, &s->fetching_send_message_finished, GRPC_ERROR_NONE, + t, s, &s->fetching_send_message_finished, GRPC_ERROR_EOS, "fetching_send_message_finished"); } else { GPR_ASSERT(s->fetching_send_message == nullptr); diff --git a/src/core/ext/transport/inproc/inproc_transport.cc b/src/core/ext/transport/inproc/inproc_transport.cc index 7b24347c073..f2ce18c574b 100644 --- a/src/core/ext/transport/inproc/inproc_transport.cc +++ b/src/core/ext/transport/inproc/inproc_transport.cc @@ -496,6 +496,7 @@ void fail_helper_locked(inproc_stream* s, grpc_error* error) { } if (s->send_message_op) { s->send_message_op->payload->send_message.send_message.reset(); + gpr_log(GPR_ERROR, "here"); complete_if_batch_end_locked( s, error, s->send_message_op, "fail_helper scheduling send-message-on-complete"); @@ -615,6 +616,7 @@ void op_state_machine_locked(inproc_stream* s, grpc_error* error) { } else if (!s->t->is_client && s->trailing_md_sent) { // A server send will never be matched if the server already sent status s->send_message_op->payload->send_message.send_message.reset(); + gpr_log(GPR_ERROR, "here"); complete_if_batch_end_locked( s, GRPC_ERROR_NONE, s->send_message_op, "op_state_machine scheduling send-message-on-complete"); @@ -765,7 +767,7 @@ void op_state_machine_locked(inproc_stream* s, grpc_error* error) { // any outstanding send_message op s->send_message_op->payload->send_message.send_message.reset(); complete_if_batch_end_locked( - s, new_err, s->send_message_op, + s, GRPC_ERROR_EOS, s->send_message_op, "op_state_machine scheduling send-message-on-complete"); s->send_message_op = nullptr; } diff --git a/src/core/lib/iomgr/error.cc b/src/core/lib/iomgr/error.cc index dedc8376578..81b6b519dce 100644 --- a/src/core/lib/iomgr/error.cc +++ b/src/core/lib/iomgr/error.cc @@ -405,6 +405,9 @@ static grpc_error* copy_error_and_unref(grpc_error* in) { internal_set_str(&out, GRPC_ERROR_STR_DESCRIPTION, grpc_slice_from_static_string("cancelled")); internal_set_int(&out, GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_CANCELLED); + } else if (in == GRPC_ERROR_EOS) { + internal_set_str(&out, GRPC_ERROR_STR_DESCRIPTION, + grpc_slice_from_static_string("end of stream")); } } else if (gpr_ref_is_unique(&in->atomics.refs)) { out = in; @@ -458,8 +461,10 @@ const special_error_status_map error_status_map[] = { {GRPC_STATUS_RESOURCE_EXHAUSTED, "Out of memory", strlen("Out of memory")}, // GRPC_ERROR_OOM {GRPC_STATUS_INVALID_ARGUMENT, "", 0}, // GRPC_ERROR_RESERVED_2 - {GRPC_STATUS_CANCELLED, "Cancelled", - strlen("Cancelled")}, // GRPC_ERROR_CANCELLED + {GRPC_STATUS_CANCELLED, "Cancelled", strlen("Cancelled")}, + {GRPC_STATUS_INVALID_ARGUMENT, "", 0}, + {GRPC_STATUS_UNAVAILABLE, "End of stream", + strlen("End of stream")} // GRPC_ERROR_EOS }; bool grpc_error_get_int(grpc_error* err, grpc_error_ints which, intptr_t* p) { @@ -531,6 +536,7 @@ grpc_error* grpc_error_add_child(grpc_error* src, grpc_error* child) { static const char* no_error_string = "\"No Error\""; static const char* oom_error_string = "\"Out of memory\""; static const char* cancelled_error_string = "\"Cancelled\""; +static const char* eos_error_string = "\"End of stream\""; typedef struct { char* key; @@ -745,6 +751,7 @@ const char* grpc_error_string(grpc_error* err) { if (err == GRPC_ERROR_NONE) return no_error_string; if (err == GRPC_ERROR_OOM) return oom_error_string; if (err == GRPC_ERROR_CANCELLED) return cancelled_error_string; + if (err == GRPC_ERROR_EOS) return eos_error_string; void* p = (void*)gpr_atm_acq_load(&err->atomics.error_string); if (p != nullptr) { diff --git a/src/core/lib/iomgr/error.h b/src/core/lib/iomgr/error.h index 5c79aa78ae7..35b9b8c3958 100644 --- a/src/core/lib/iomgr/error.h +++ b/src/core/lib/iomgr/error.h @@ -127,7 +127,11 @@ typedef enum { #define GRPC_ERROR_OOM ((grpc_error*)2) #define GRPC_ERROR_RESERVED_2 ((grpc_error*)3) #define GRPC_ERROR_CANCELLED ((grpc_error*)4) -#define GRPC_ERROR_SPECIAL_MAX GRPC_ERROR_CANCELLED +#define GRPC_ERROR_RESERVED_3 ((grpc_error*)5) +// GRPC_ERROR_EOS is used only by transports for send ops that failed because +// the stream was closed for writes. +#define GRPC_ERROR_EOS ((grpc_error*)6) +#define GRPC_ERROR_SPECIAL_MAX GRPC_ERROR_EOS inline bool grpc_error_is_special(struct grpc_error* err) { return err <= GRPC_ERROR_SPECIAL_MAX; diff --git a/src/core/lib/surface/call.cc b/src/core/lib/surface/call.cc index fcebe9bc410..52d35b97cd4 100644 --- a/src/core/lib/surface/call.cc +++ b/src/core/lib/surface/call.cc @@ -1178,12 +1178,6 @@ static void post_batch_completion(batch_control* bctl) { &call->metadata_batch[0 /* is_receiving */][0 /* is_trailing */]); } if (bctl->op.send_message) { - if (bctl->op.payload->send_message.stream_write_closed && - error == GRPC_ERROR_NONE) { - error = grpc_error_add_child( - error, GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "Attempt to send message after stream was closed.")); - } call->sending_message = false; } if (bctl->op.send_trailing_metadata) { @@ -1538,7 +1532,12 @@ static void finish_batch(void* bctlp, grpc_error* error) { gpr_atm_rel_store(&bctl->batch_error, reinterpret_cast(GRPC_ERROR_REF(error))); } - if (error != GRPC_ERROR_NONE) { + // If the batch had an error, we should normally fail the call. If the batch + // ended with GRPC_ERROR_EOS instead, we should not cancel the call because we + // do not want to overwrite the status that will propagated through the + // recv_trailing_metadata filter. + if (error != GRPC_ERROR_NONE && error != GRPC_ERROR_EOS) { + gpr_log(GPR_ERROR, "got an error %s. cancelling", grpc_error_string(error)); cancel_with_error(call, GRPC_ERROR_REF(error)); } finish_batch_step(bctl); diff --git a/src/core/lib/transport/transport.h b/src/core/lib/transport/transport.h index 18374511cde..1ef31d79d2b 100644 --- a/src/core/lib/transport/transport.h +++ b/src/core/lib/transport/transport.h @@ -250,18 +250,6 @@ struct grpc_transport_stream_op_batch_payload { // The batch's on_complete will not be called until after the byte // stream is orphaned. grpc_core::OrphanablePtr send_message; - // Set by the transport if the stream has been closed for writes. If this - // is set and send message op is present, we set the operation to be a - // failure without sending a cancel OP down the stack. This is so that the - // status of the call does not get overwritten by the Cancel OP, which would - // be especially problematic if we had received a valid status from the - // server. - // For send_initial_metadata, it is fine for the status to be overwritten - // because at that point, the client will not have received a status. - // For send_trailing_metadata, we might overwrite the status if we have - // non-zero metadata to send. This is fine because the API does not allow - // the client to send trailing metadata. - bool stream_write_closed = false; } send_message; struct { diff --git a/src/objective-c/BoringSSL-GRPC.podspec b/src/objective-c/BoringSSL-GRPC.podspec index cd391d25ec6..f3edaf8666e 100644 --- a/src/objective-c/BoringSSL-GRPC.podspec +++ b/src/objective-c/BoringSSL-GRPC.podspec @@ -76,7 +76,7 @@ Pod::Spec.new do |s| s.source = { :git => 'https://github.com/google/boringssl.git', - :commit => "1c2769383f027befac5b75b6cedd25daf3bf4dcf", + :commit => "0e00500caa5e1e303bc87762d685a9776d41d16d", } s.ios.deployment_target = '7.0' diff --git a/src/python/grpcio/grpc_core_dependencies.py b/src/python/grpcio/grpc_core_dependencies.py index 6c2dfed4ae3..e3bece3f6fc 100644 --- a/src/python/grpcio/grpc_core_dependencies.py +++ b/src/python/grpcio/grpc_core_dependencies.py @@ -512,270 +512,6 @@ CORE_SOURCE_FILES = [ 'third_party/address_sorting/address_sorting.c', 'third_party/address_sorting/address_sorting_posix.c', 'third_party/address_sorting/address_sorting_windows.c', - 'third_party/boringssl-with-bazel/err_data.c', - 'third_party/boringssl-with-bazel/src/crypto/asn1/a_bitstr.c', - 'third_party/boringssl-with-bazel/src/crypto/asn1/a_bool.c', - 'third_party/boringssl-with-bazel/src/crypto/asn1/a_d2i_fp.c', - 'third_party/boringssl-with-bazel/src/crypto/asn1/a_dup.c', - 'third_party/boringssl-with-bazel/src/crypto/asn1/a_enum.c', - 'third_party/boringssl-with-bazel/src/crypto/asn1/a_gentm.c', - 'third_party/boringssl-with-bazel/src/crypto/asn1/a_i2d_fp.c', - 'third_party/boringssl-with-bazel/src/crypto/asn1/a_int.c', - 'third_party/boringssl-with-bazel/src/crypto/asn1/a_mbstr.c', - 'third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c', - 'third_party/boringssl-with-bazel/src/crypto/asn1/a_octet.c', - 'third_party/boringssl-with-bazel/src/crypto/asn1/a_print.c', - 'third_party/boringssl-with-bazel/src/crypto/asn1/a_strnid.c', - 'third_party/boringssl-with-bazel/src/crypto/asn1/a_time.c', - 'third_party/boringssl-with-bazel/src/crypto/asn1/a_type.c', - 'third_party/boringssl-with-bazel/src/crypto/asn1/a_utctm.c', - 'third_party/boringssl-with-bazel/src/crypto/asn1/a_utf8.c', - 'third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c', - 'third_party/boringssl-with-bazel/src/crypto/asn1/asn1_par.c', - 'third_party/boringssl-with-bazel/src/crypto/asn1/asn_pack.c', - 'third_party/boringssl-with-bazel/src/crypto/asn1/f_enum.c', - 'third_party/boringssl-with-bazel/src/crypto/asn1/f_int.c', - 'third_party/boringssl-with-bazel/src/crypto/asn1/f_string.c', - 'third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.c', - 'third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c', - 'third_party/boringssl-with-bazel/src/crypto/asn1/tasn_fre.c', - 'third_party/boringssl-with-bazel/src/crypto/asn1/tasn_new.c', - 'third_party/boringssl-with-bazel/src/crypto/asn1/tasn_typ.c', - 'third_party/boringssl-with-bazel/src/crypto/asn1/tasn_utl.c', - 'third_party/boringssl-with-bazel/src/crypto/asn1/time_support.c', - 'third_party/boringssl-with-bazel/src/crypto/base64/base64.c', - 'third_party/boringssl-with-bazel/src/crypto/bio/bio.c', - 'third_party/boringssl-with-bazel/src/crypto/bio/bio_mem.c', - 'third_party/boringssl-with-bazel/src/crypto/bio/connect.c', - 'third_party/boringssl-with-bazel/src/crypto/bio/fd.c', - 'third_party/boringssl-with-bazel/src/crypto/bio/file.c', - 'third_party/boringssl-with-bazel/src/crypto/bio/hexdump.c', - 'third_party/boringssl-with-bazel/src/crypto/bio/pair.c', - 'third_party/boringssl-with-bazel/src/crypto/bio/printf.c', - 'third_party/boringssl-with-bazel/src/crypto/bio/socket.c', - 'third_party/boringssl-with-bazel/src/crypto/bio/socket_helper.c', - 'third_party/boringssl-with-bazel/src/crypto/bn_extra/bn_asn1.c', - 'third_party/boringssl-with-bazel/src/crypto/bn_extra/convert.c', - 'third_party/boringssl-with-bazel/src/crypto/buf/buf.c', - 'third_party/boringssl-with-bazel/src/crypto/bytestring/asn1_compat.c', - 'third_party/boringssl-with-bazel/src/crypto/bytestring/ber.c', - 'third_party/boringssl-with-bazel/src/crypto/bytestring/cbb.c', - 'third_party/boringssl-with-bazel/src/crypto/bytestring/cbs.c', - 'third_party/boringssl-with-bazel/src/crypto/bytestring/unicode.c', - 'third_party/boringssl-with-bazel/src/crypto/chacha/chacha.c', - 'third_party/boringssl-with-bazel/src/crypto/cipher_extra/cipher_extra.c', - 'third_party/boringssl-with-bazel/src/crypto/cipher_extra/derive_key.c', - 'third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_aesccm.c', - 'third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_aesctrhmac.c', - 'third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_aesgcmsiv.c', - 'third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_chacha20poly1305.c', - 'third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_null.c', - 'third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_rc2.c', - 'third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_rc4.c', - 'third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_tls.c', - 'third_party/boringssl-with-bazel/src/crypto/cipher_extra/tls_cbc.c', - 'third_party/boringssl-with-bazel/src/crypto/cmac/cmac.c', - 'third_party/boringssl-with-bazel/src/crypto/conf/conf.c', - 'third_party/boringssl-with-bazel/src/crypto/cpu-aarch64-fuchsia.c', - 'third_party/boringssl-with-bazel/src/crypto/cpu-aarch64-linux.c', - 'third_party/boringssl-with-bazel/src/crypto/cpu-arm-linux.c', - 'third_party/boringssl-with-bazel/src/crypto/cpu-arm.c', - 'third_party/boringssl-with-bazel/src/crypto/cpu-intel.c', - 'third_party/boringssl-with-bazel/src/crypto/cpu-ppc64le.c', - 'third_party/boringssl-with-bazel/src/crypto/crypto.c', - 'third_party/boringssl-with-bazel/src/crypto/curve25519/spake25519.c', - 'third_party/boringssl-with-bazel/src/crypto/dh/check.c', - 'third_party/boringssl-with-bazel/src/crypto/dh/dh.c', - 'third_party/boringssl-with-bazel/src/crypto/dh/dh_asn1.c', - 'third_party/boringssl-with-bazel/src/crypto/dh/params.c', - 'third_party/boringssl-with-bazel/src/crypto/digest_extra/digest_extra.c', - 'third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c', - 'third_party/boringssl-with-bazel/src/crypto/dsa/dsa_asn1.c', - 'third_party/boringssl-with-bazel/src/crypto/ec_extra/ec_asn1.c', - 'third_party/boringssl-with-bazel/src/crypto/ec_extra/ec_derive.c', - 'third_party/boringssl-with-bazel/src/crypto/ecdh_extra/ecdh_extra.c', - 'third_party/boringssl-with-bazel/src/crypto/ecdsa_extra/ecdsa_asn1.c', - 'third_party/boringssl-with-bazel/src/crypto/engine/engine.c', - 'third_party/boringssl-with-bazel/src/crypto/err/err.c', - 'third_party/boringssl-with-bazel/src/crypto/evp/digestsign.c', - 'third_party/boringssl-with-bazel/src/crypto/evp/evp.c', - 'third_party/boringssl-with-bazel/src/crypto/evp/evp_asn1.c', - 'third_party/boringssl-with-bazel/src/crypto/evp/evp_ctx.c', - 'third_party/boringssl-with-bazel/src/crypto/evp/p_dsa_asn1.c', - 'third_party/boringssl-with-bazel/src/crypto/evp/p_ec.c', - 'third_party/boringssl-with-bazel/src/crypto/evp/p_ec_asn1.c', - 'third_party/boringssl-with-bazel/src/crypto/evp/p_ed25519.c', - 'third_party/boringssl-with-bazel/src/crypto/evp/p_ed25519_asn1.c', - 'third_party/boringssl-with-bazel/src/crypto/evp/p_rsa.c', - 'third_party/boringssl-with-bazel/src/crypto/evp/p_rsa_asn1.c', - 'third_party/boringssl-with-bazel/src/crypto/evp/p_x25519.c', - 'third_party/boringssl-with-bazel/src/crypto/evp/p_x25519_asn1.c', - 'third_party/boringssl-with-bazel/src/crypto/evp/pbkdf.c', - 'third_party/boringssl-with-bazel/src/crypto/evp/print.c', - 'third_party/boringssl-with-bazel/src/crypto/evp/scrypt.c', - 'third_party/boringssl-with-bazel/src/crypto/evp/sign.c', - 'third_party/boringssl-with-bazel/src/crypto/ex_data.c', - 'third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c', - 'third_party/boringssl-with-bazel/src/crypto/fipsmodule/fips_shared_support.c', - 'third_party/boringssl-with-bazel/src/crypto/fipsmodule/is_fips.c', - 'third_party/boringssl-with-bazel/src/crypto/hkdf/hkdf.c', - 'third_party/boringssl-with-bazel/src/crypto/hrss/hrss.c', - 'third_party/boringssl-with-bazel/src/crypto/lhash/lhash.c', - 'third_party/boringssl-with-bazel/src/crypto/mem.c', - 'third_party/boringssl-with-bazel/src/crypto/obj/obj.c', - 'third_party/boringssl-with-bazel/src/crypto/obj/obj_xref.c', - 'third_party/boringssl-with-bazel/src/crypto/pem/pem_all.c', - 'third_party/boringssl-with-bazel/src/crypto/pem/pem_info.c', - 'third_party/boringssl-with-bazel/src/crypto/pem/pem_lib.c', - 'third_party/boringssl-with-bazel/src/crypto/pem/pem_oth.c', - 'third_party/boringssl-with-bazel/src/crypto/pem/pem_pk8.c', - 'third_party/boringssl-with-bazel/src/crypto/pem/pem_pkey.c', - 'third_party/boringssl-with-bazel/src/crypto/pem/pem_x509.c', - 'third_party/boringssl-with-bazel/src/crypto/pem/pem_xaux.c', - 'third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7.c', - 'third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7_x509.c', - 'third_party/boringssl-with-bazel/src/crypto/pkcs8/p5_pbev2.c', - 'third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8.c', - 'third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c', - 'third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305.c', - 'third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_arm.c', - 'third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_vec.c', - 'third_party/boringssl-with-bazel/src/crypto/pool/pool.c', - 'third_party/boringssl-with-bazel/src/crypto/rand_extra/deterministic.c', - 'third_party/boringssl-with-bazel/src/crypto/rand_extra/forkunsafe.c', - 'third_party/boringssl-with-bazel/src/crypto/rand_extra/fuchsia.c', - 'third_party/boringssl-with-bazel/src/crypto/rand_extra/rand_extra.c', - 'third_party/boringssl-with-bazel/src/crypto/rand_extra/windows.c', - 'third_party/boringssl-with-bazel/src/crypto/rc4/rc4.c', - 'third_party/boringssl-with-bazel/src/crypto/refcount_c11.c', - 'third_party/boringssl-with-bazel/src/crypto/refcount_lock.c', - 'third_party/boringssl-with-bazel/src/crypto/rsa_extra/rsa_asn1.c', - 'third_party/boringssl-with-bazel/src/crypto/rsa_extra/rsa_print.c', - 'third_party/boringssl-with-bazel/src/crypto/siphash/siphash.c', - 'third_party/boringssl-with-bazel/src/crypto/stack/stack.c', - 'third_party/boringssl-with-bazel/src/crypto/thread.c', - 'third_party/boringssl-with-bazel/src/crypto/thread_none.c', - 'third_party/boringssl-with-bazel/src/crypto/thread_pthread.c', - 'third_party/boringssl-with-bazel/src/crypto/thread_win.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/a_digest.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/a_sign.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/a_strex.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/a_verify.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/algorithm.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/asn1_gen.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/by_dir.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/by_file.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/i2d_pr.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/rsa_pss.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/t_crl.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/t_req.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/t_x509.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/t_x509a.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/x509.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/x509_att.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/x509_d2.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/x509_def.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/x509_ext.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/x509_lu.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/x509_obj.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/x509_r2x.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/x509_req.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/x509_trs.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/x509_txt.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/x509_v3.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/x509_vpm.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/x509cset.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/x509name.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/x509rset.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/x509spki.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/x_algor.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/x_all.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/x_attrib.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/x_exten.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/x_info.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/x_name.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/x_pkey.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/x_pubkey.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/x_req.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/x_sig.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/x_spki.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/x_val.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/x_x509a.c', - 'third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_cache.c', - 'third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_data.c', - 'third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_lib.c', - 'third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_map.c', - 'third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_node.c', - 'third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_tree.c', - 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_akey.c', - 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_akeya.c', - 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_alt.c', - 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_bcons.c', - 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_bitst.c', - 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_conf.c', - 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c', - 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_crld.c', - 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_enum.c', - 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_extku.c', - 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_genn.c', - 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ia5.c', - 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_info.c', - 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_int.c', - 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_lib.c', - 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ncons.c', - 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ocsp.c', - 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pci.c', - 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pcia.c', - 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pcons.c', - 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pku.c', - 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pmaps.c', - 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_prn.c', - 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c', - 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_skey.c', - 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_sxnet.c', - 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_utl.c', - 'third_party/boringssl-with-bazel/src/ssl/bio_ssl.cc', - 'third_party/boringssl-with-bazel/src/ssl/d1_both.cc', - 'third_party/boringssl-with-bazel/src/ssl/d1_lib.cc', - 'third_party/boringssl-with-bazel/src/ssl/d1_pkt.cc', - 'third_party/boringssl-with-bazel/src/ssl/d1_srtp.cc', - 'third_party/boringssl-with-bazel/src/ssl/dtls_method.cc', - 'third_party/boringssl-with-bazel/src/ssl/dtls_record.cc', - 'third_party/boringssl-with-bazel/src/ssl/handoff.cc', - 'third_party/boringssl-with-bazel/src/ssl/handshake.cc', - 'third_party/boringssl-with-bazel/src/ssl/handshake_client.cc', - 'third_party/boringssl-with-bazel/src/ssl/handshake_server.cc', - 'third_party/boringssl-with-bazel/src/ssl/s3_both.cc', - 'third_party/boringssl-with-bazel/src/ssl/s3_lib.cc', - 'third_party/boringssl-with-bazel/src/ssl/s3_pkt.cc', - 'third_party/boringssl-with-bazel/src/ssl/ssl_aead_ctx.cc', - 'third_party/boringssl-with-bazel/src/ssl/ssl_asn1.cc', - 'third_party/boringssl-with-bazel/src/ssl/ssl_buffer.cc', - 'third_party/boringssl-with-bazel/src/ssl/ssl_cert.cc', - 'third_party/boringssl-with-bazel/src/ssl/ssl_cipher.cc', - 'third_party/boringssl-with-bazel/src/ssl/ssl_file.cc', - 'third_party/boringssl-with-bazel/src/ssl/ssl_key_share.cc', - 'third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc', - 'third_party/boringssl-with-bazel/src/ssl/ssl_privkey.cc', - 'third_party/boringssl-with-bazel/src/ssl/ssl_session.cc', - 'third_party/boringssl-with-bazel/src/ssl/ssl_stat.cc', - 'third_party/boringssl-with-bazel/src/ssl/ssl_transcript.cc', - 'third_party/boringssl-with-bazel/src/ssl/ssl_versions.cc', - 'third_party/boringssl-with-bazel/src/ssl/ssl_x509.cc', - 'third_party/boringssl-with-bazel/src/ssl/t1_enc.cc', - 'third_party/boringssl-with-bazel/src/ssl/t1_lib.cc', - 'third_party/boringssl-with-bazel/src/ssl/tls13_both.cc', - 'third_party/boringssl-with-bazel/src/ssl/tls13_client.cc', - 'third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc', - 'third_party/boringssl-with-bazel/src/ssl/tls13_server.cc', - 'third_party/boringssl-with-bazel/src/ssl/tls_method.cc', - 'third_party/boringssl-with-bazel/src/ssl/tls_record.cc', - 'third_party/boringssl-with-bazel/src/third_party/fiat/curve25519.c', 'third_party/cares/cares/ares__close_sockets.c', 'third_party/cares/cares/ares__get_hostent.c', 'third_party/cares/cares/ares__read_line.c', @@ -832,19 +568,4 @@ CORE_SOURCE_FILES = [ 'third_party/upb/upb/port.c', 'third_party/upb/upb/table.c', 'third_party/upb/upb/upb.c', - 'third_party/zlib/adler32.c', - 'third_party/zlib/compress.c', - 'third_party/zlib/crc32.c', - 'third_party/zlib/deflate.c', - 'third_party/zlib/gzclose.c', - 'third_party/zlib/gzlib.c', - 'third_party/zlib/gzread.c', - 'third_party/zlib/gzwrite.c', - 'third_party/zlib/infback.c', - 'third_party/zlib/inffast.c', - 'third_party/zlib/inflate.c', - 'third_party/zlib/inftrees.c', - 'third_party/zlib/trees.c', - 'third_party/zlib/uncompr.c', - 'third_party/zlib/zutil.c', ] diff --git a/test/core/end2end/cq_verifier.cc b/test/core/end2end/cq_verifier.cc index f7e64effcd4..9aaa167492b 100644 --- a/test/core/end2end/cq_verifier.cc +++ b/test/core/end2end/cq_verifier.cc @@ -50,6 +50,7 @@ typedef struct expectation { int line; grpc_completion_type type; void* tag; + bool check_success; int success; } expectation; @@ -226,7 +227,7 @@ static void verify_matches(expectation* e, grpc_event* ev) { GPR_ASSERT(e->type == ev->type); switch (e->type) { case GRPC_OP_COMPLETE: - if (e->success != ev->success) { + if (e->check_success && e->success != ev->success) { gpr_strvec expected; gpr_strvec_init(&expected); expectation_to_strvec(&expected, e); @@ -305,12 +306,14 @@ void cq_verify_empty_timeout(cq_verifier* v, int timeout_sec) { void cq_verify_empty(cq_verifier* v) { cq_verify_empty_timeout(v, 1); } static void add(cq_verifier* v, const char* file, int line, - grpc_completion_type type, void* tag, bool success) { + grpc_completion_type type, void* tag, bool check_success, + bool success) { expectation* e = static_cast(gpr_malloc(sizeof(expectation))); e->type = type; e->file = file; e->line = line; e->tag = tag; + e->check_success = check_success; e->success = success; e->next = v->first_expectation; v->first_expectation = e; @@ -318,5 +321,10 @@ static void add(cq_verifier* v, const char* file, int line, void cq_expect_completion(cq_verifier* v, const char* file, int line, void* tag, bool success) { - add(v, file, line, GRPC_OP_COMPLETE, tag, success); + add(v, file, line, GRPC_OP_COMPLETE, tag, true, success); +} + +void cq_expect_completion_any_status(cq_verifier* v, const char* file, int line, + void* tag) { + add(v, file, line, GRPC_OP_COMPLETE, tag, false, false); } diff --git a/test/core/end2end/cq_verifier.h b/test/core/end2end/cq_verifier.h index 959f849cb11..f5f2a9f7a33 100644 --- a/test/core/end2end/cq_verifier.h +++ b/test/core/end2end/cq_verifier.h @@ -49,8 +49,12 @@ void cq_verify_empty_timeout(cq_verifier* v, int timeout_sec); the event. */ void cq_expect_completion(cq_verifier* v, const char* file, int line, void* tag, bool success); +void cq_expect_completion_any_status(cq_verifier* v, const char* file, int line, + void* tag); #define CQ_EXPECT_COMPLETION(v, tag, success) \ cq_expect_completion(v, __FILE__, __LINE__, tag, success) +#define CQ_EXPECT_COMPLETION_ANY_STATUS(v, tag) \ + cq_expect_completion_any_status(v, __FILE__, __LINE__, tag) int byte_buffer_eq_slice(grpc_byte_buffer* bb, grpc_slice b); int byte_buffer_eq_string(grpc_byte_buffer* byte_buffer, const char* string); diff --git a/test/core/end2end/end2end_nosec_tests.cc b/test/core/end2end/end2end_nosec_tests.cc index e01e6ad0104..f5c9c5ca294 100644 --- a/test/core/end2end/end2end_nosec_tests.cc +++ b/test/core/end2end/end2end_nosec_tests.cc @@ -55,6 +55,8 @@ extern void cancel_with_status(grpc_end2end_test_config config); extern void cancel_with_status_pre_init(void); extern void channelz(grpc_end2end_test_config config); extern void channelz_pre_init(void); +extern void client_streaming(grpc_end2end_test_config config); +extern void client_streaming_pre_init(void); extern void compressed_payload(grpc_end2end_test_config config); extern void compressed_payload_pre_init(void); extern void connectivity(grpc_end2end_test_config config); @@ -200,6 +202,7 @@ void grpc_end2end_tests_pre_init(void) { cancel_in_a_vacuum_pre_init(); cancel_with_status_pre_init(); channelz_pre_init(); + client_streaming_pre_init(); compressed_payload_pre_init(); connectivity_pre_init(); default_host_pre_init(); @@ -286,6 +289,7 @@ void grpc_end2end_tests(int argc, char **argv, cancel_in_a_vacuum(config); cancel_with_status(config); channelz(config); + client_streaming(config); compressed_payload(config); connectivity(config); default_host(config); @@ -406,6 +410,10 @@ void grpc_end2end_tests(int argc, char **argv, channelz(config); continue; } + if (0 == strcmp("client_streaming", argv[i])) { + client_streaming(config); + continue; + } if (0 == strcmp("compressed_payload", argv[i])) { compressed_payload(config); continue; diff --git a/test/core/end2end/end2end_tests.cc b/test/core/end2end/end2end_tests.cc index 76fb046b367..3d81b61eb85 100644 --- a/test/core/end2end/end2end_tests.cc +++ b/test/core/end2end/end2end_tests.cc @@ -57,6 +57,8 @@ extern void cancel_with_status(grpc_end2end_test_config config); extern void cancel_with_status_pre_init(void); extern void channelz(grpc_end2end_test_config config); extern void channelz_pre_init(void); +extern void client_streaming(grpc_end2end_test_config config); +extern void client_streaming_pre_init(void); extern void compressed_payload(grpc_end2end_test_config config); extern void compressed_payload_pre_init(void); extern void connectivity(grpc_end2end_test_config config); @@ -203,6 +205,7 @@ void grpc_end2end_tests_pre_init(void) { cancel_in_a_vacuum_pre_init(); cancel_with_status_pre_init(); channelz_pre_init(); + client_streaming_pre_init(); compressed_payload_pre_init(); connectivity_pre_init(); default_host_pre_init(); @@ -290,6 +293,7 @@ void grpc_end2end_tests(int argc, char **argv, cancel_in_a_vacuum(config); cancel_with_status(config); channelz(config); + client_streaming(config); compressed_payload(config); connectivity(config); default_host(config); @@ -414,6 +418,10 @@ void grpc_end2end_tests(int argc, char **argv, channelz(config); continue; } + if (0 == strcmp("client_streaming", argv[i])) { + client_streaming(config); + continue; + } if (0 == strcmp("compressed_payload", argv[i])) { compressed_payload(config); continue; diff --git a/test/core/end2end/generate_tests.bzl b/test/core/end2end/generate_tests.bzl index 3c1817ff82b..14686682076 100755 --- a/test/core/end2end/generate_tests.bzl +++ b/test/core/end2end/generate_tests.bzl @@ -226,6 +226,7 @@ END2END_TESTS = { proxyable = False, ), "channelz": _test_options(), + "client_streaming": _test_options(), "default_host": _test_options( needs_fullstack = True, needs_dns = True, @@ -455,7 +456,7 @@ def grpc_end2end_tests(): test_short_name = str(t) if not topt.short_name else topt.short_name native.sh_test( - name = "%s_test@%s" % (f, test_short_name), + name = "%s_test_%s" % (f, test_short_name), data = [":%s_test" % f], srcs = ["end2end_test.sh"], args = [ @@ -468,7 +469,7 @@ def grpc_end2end_tests(): for poller in POLLERS: native.sh_test( - name = "%s_test@%s@poller=%s" % (f, test_short_name, poller), + name = "%s_test_gc%s@poller=%s" % (f, test_short_name, poller), data = [":%s_test" % f], srcs = ["end2end_test.sh"], args = [ @@ -533,7 +534,7 @@ def grpc_end2end_nosec_tests(): test_short_name = str(t) if not topt.short_name else topt.short_name native.sh_test( - name = "%s_nosec_test@%s" % (f, test_short_name), + name = "%s_nosec_test_%s" % (f, test_short_name), data = [":%s_nosec_test" % f], srcs = ["end2end_test.sh"], args = [ @@ -546,7 +547,7 @@ def grpc_end2end_nosec_tests(): for poller in POLLERS: native.sh_test( - name = "%s_nosec_test@%s@poller=%s" % (f, test_short_name, poller), + name = "%s_nosec_test_%s_poller=%s" % (f, test_short_name, poller), data = [":%s_nosec_test" % f], srcs = ["end2end_test.sh"], args = [ diff --git a/test/core/end2end/tests/client_streaming.cc b/test/core/end2end/tests/client_streaming.cc new file mode 100644 index 00000000000..15b5bdcf8f3 --- /dev/null +++ b/test/core/end2end/tests/client_streaming.cc @@ -0,0 +1,273 @@ +/* + * + * Copyright 2019 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include "test/core/end2end/end2end_tests.h" + +#include +#include + +#include +#include +#include +#include +#include "test/core/end2end/cq_verifier.h" + +static void* tag(intptr_t t) { return (void*)t; } + +static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config, + const char* test_name, + grpc_channel_args* client_args, + grpc_channel_args* server_args) { + grpc_end2end_test_fixture f; + gpr_log(GPR_INFO, "Running test: %s/%s", test_name, config.name); + f = config.create_fixture(client_args, server_args); + config.init_server(&f, server_args); + config.init_client(&f, client_args); + return f; +} + +static gpr_timespec n_seconds_from_now(int n) { + return grpc_timeout_seconds_to_deadline(n); +} + +static gpr_timespec five_seconds_from_now(void) { + return n_seconds_from_now(5); +} + +static void drain_cq(grpc_completion_queue* cq) { + grpc_event ev; + do { + ev = grpc_completion_queue_next(cq, five_seconds_from_now(), nullptr); + } while (ev.type != GRPC_QUEUE_SHUTDOWN); +} + +static void shutdown_server(grpc_end2end_test_fixture* f) { + if (!f->server) return; + grpc_server_shutdown_and_notify(f->server, f->shutdown_cq, tag(1000)); + GPR_ASSERT(grpc_completion_queue_pluck(f->shutdown_cq, tag(1000), + grpc_timeout_seconds_to_deadline(5), + nullptr) + .type == GRPC_OP_COMPLETE); + grpc_server_destroy(f->server); + f->server = nullptr; +} + +static void shutdown_client(grpc_end2end_test_fixture* f) { + if (!f->client) return; + grpc_channel_destroy(f->client); + f->client = nullptr; +} + +static void end_test(grpc_end2end_test_fixture* f) { + shutdown_server(f); + shutdown_client(f); + + grpc_completion_queue_shutdown(f->cq); + drain_cq(f->cq); + grpc_completion_queue_destroy(f->cq); + grpc_completion_queue_destroy(f->shutdown_cq); +} + +/* Client streaming test where the client sends a bunch of messages and the + * server reads them. After reading some messages, the server sends the status. + * Client writes fail after that due to the end of stream and the client + * subsequently requests and receives the status. */ +static void test_client_streaming(grpc_end2end_test_config config, + int messages) { + grpc_end2end_test_fixture f = + begin_test(config, "test_client_streaming", nullptr, nullptr); + grpc_call* c; + grpc_call* s; + cq_verifier* cqv = cq_verifier_create(f.cq); + grpc_op ops[6]; + grpc_op* op; + grpc_metadata_array initial_metadata_recv; + grpc_metadata_array trailing_metadata_recv; + grpc_metadata_array request_metadata_recv; + grpc_call_details call_details; + grpc_status_code status; + grpc_call_error error; + grpc_slice details; + grpc_byte_buffer* request_payload_recv = nullptr; + grpc_byte_buffer* request_payload = nullptr; + int i; + grpc_slice request_payload_slice = + grpc_slice_from_copied_string("hello world"); + + gpr_timespec deadline = five_seconds_from_now(); + c = grpc_channel_create_call(f.client, nullptr, GRPC_PROPAGATE_DEFAULTS, f.cq, + grpc_slice_from_static_string("/foo"), nullptr, + deadline, nullptr); + GPR_ASSERT(c); + + grpc_metadata_array_init(&initial_metadata_recv); + grpc_metadata_array_init(&trailing_metadata_recv); + grpc_metadata_array_init(&request_metadata_recv); + grpc_call_details_init(&call_details); + + memset(ops, 0, sizeof(ops)); + op = ops; + op->op = GRPC_OP_SEND_INITIAL_METADATA; + op->data.send_initial_metadata.count = 0; + op->flags = 0; + op->reserved = nullptr; + op++; + op->op = GRPC_OP_RECV_INITIAL_METADATA; + op->data.recv_initial_metadata.recv_initial_metadata = &initial_metadata_recv; + op->flags = 0; + op->reserved = nullptr; + op++; + error = grpc_call_start_batch(c, ops, static_cast(op - ops), tag(1), + nullptr); + GPR_ASSERT(GRPC_CALL_OK == error); + + error = + grpc_server_request_call(f.server, &s, &call_details, + &request_metadata_recv, f.cq, f.cq, tag(100)); + GPR_ASSERT(GRPC_CALL_OK == error); + CQ_EXPECT_COMPLETION(cqv, tag(100), 1); + cq_verify(cqv); + + memset(ops, 0, sizeof(ops)); + op = ops; + op->op = GRPC_OP_SEND_INITIAL_METADATA; + op->data.send_initial_metadata.count = 0; + op->flags = 0; + op->reserved = nullptr; + op++; + error = grpc_call_start_batch(s, ops, static_cast(op - ops), tag(101), + nullptr); + GPR_ASSERT(GRPC_CALL_OK == error); + + CQ_EXPECT_COMPLETION(cqv, tag(101), 1); + CQ_EXPECT_COMPLETION(cqv, tag(1), 1); + cq_verify(cqv); + + // Client writes bunch of messages and server reads them + for (i = 0; i < messages; i++) { + request_payload = grpc_raw_byte_buffer_create(&request_payload_slice, 1); + memset(ops, 0, sizeof(ops)); + op = ops; + op->op = GRPC_OP_SEND_MESSAGE; + op->data.send_message.send_message = request_payload; + op->flags = 0; + op->reserved = nullptr; + op++; + error = grpc_call_start_batch(c, ops, static_cast(op - ops), + tag(103), nullptr); + GPR_ASSERT(GRPC_CALL_OK == error); + grpc_byte_buffer_destroy(request_payload); + + memset(ops, 0, sizeof(ops)); + op = ops; + op->op = GRPC_OP_RECV_MESSAGE; + op->data.recv_message.recv_message = &request_payload_recv; + op->flags = 0; + op->reserved = nullptr; + op++; + error = grpc_call_start_batch(s, ops, static_cast(op - ops), + tag(102), nullptr); + GPR_ASSERT(GRPC_CALL_OK == error); + CQ_EXPECT_COMPLETION(cqv, tag(102), 1); + CQ_EXPECT_COMPLETION(cqv, tag(103), 1); + cq_verify(cqv); + GPR_ASSERT(byte_buffer_eq_string(request_payload_recv, "hello world")); + grpc_byte_buffer_destroy(request_payload_recv); + } + + // Server sends status denoting end of stream + memset(ops, 0, sizeof(ops)); + op = ops; + op->op = GRPC_OP_SEND_STATUS_FROM_SERVER; + op->data.send_status_from_server.trailing_metadata_count = 0; + op->data.send_status_from_server.status = GRPC_STATUS_UNIMPLEMENTED; + grpc_slice status_details = grpc_slice_from_static_string("xyz"); + op->data.send_status_from_server.status_details = &status_details; + op->flags = 0; + op->reserved = nullptr; + op++; + error = grpc_call_start_batch(s, ops, static_cast(op - ops), tag(104), + nullptr); + GPR_ASSERT(GRPC_CALL_OK == error); + CQ_EXPECT_COMPLETION(cqv, tag(104), 1); + cq_verify(cqv); + // Do an empty verify to make sure that the client receives the status + cq_verify_empty(cqv); + + // Client tries sending another message which should fail + request_payload = grpc_raw_byte_buffer_create(&request_payload_slice, 1); + memset(ops, 0, sizeof(ops)); + op = ops; + op->op = GRPC_OP_SEND_MESSAGE; + op->data.send_message.send_message = request_payload; + op->flags = 0; + op->reserved = nullptr; + op++; + error = grpc_call_start_batch(c, ops, static_cast(op - ops), tag(103), + nullptr); + GPR_ASSERT(GRPC_CALL_OK == error); + grpc_byte_buffer_destroy(request_payload); + CQ_EXPECT_COMPLETION(cqv, tag(103), 0); + cq_verify(cqv); + + // Client sends close and requests status + memset(ops, 0, sizeof(ops)); + op = ops; + op->op = GRPC_OP_SEND_CLOSE_FROM_CLIENT; + op->flags = 0; + op->reserved = nullptr; + op++; + op->op = GRPC_OP_RECV_STATUS_ON_CLIENT; + op->data.recv_status_on_client.trailing_metadata = &trailing_metadata_recv; + op->data.recv_status_on_client.status = &status; + op->data.recv_status_on_client.status_details = &details; + op->flags = 0; + op->reserved = nullptr; + op++; + error = grpc_call_start_batch(c, ops, static_cast(op - ops), tag(3), + nullptr); + GPR_ASSERT(GRPC_CALL_OK == error); + CQ_EXPECT_COMPLETION(cqv, tag(3), 1); + cq_verify(cqv); + GPR_ASSERT(status == GRPC_STATUS_UNIMPLEMENTED); + GPR_ASSERT(0 == grpc_slice_str_cmp(details, "xyz")); + + grpc_slice_unref(request_payload_slice); + + grpc_call_unref(c); + grpc_call_unref(s); + + cq_verifier_destroy(cqv); + + grpc_metadata_array_destroy(&initial_metadata_recv); + grpc_metadata_array_destroy(&trailing_metadata_recv); + grpc_metadata_array_destroy(&request_metadata_recv); + grpc_call_details_destroy(&call_details); + grpc_slice_unref(details); + + end_test(&f); + config.tear_down_data(&f); +} + +void client_streaming(grpc_end2end_test_config config) { + for (int i = 0; i < 10; i++) { + test_client_streaming(config, i); + } +} + +void client_streaming_pre_init(void) {} \ No newline at end of file diff --git a/test/core/end2end/tests/streaming_error_response.cc b/test/core/end2end/tests/streaming_error_response.cc index 713975a33f1..ac783611a7b 100644 --- a/test/core/end2end/tests/streaming_error_response.cc +++ b/test/core/end2end/tests/streaming_error_response.cc @@ -88,7 +88,7 @@ static void end_test(grpc_end2end_test_fixture* f) { grpc_completion_queue_destroy(f->shutdown_cq); } -/* Client sends a request with payload, server reads then returns status. */ +// Client sends a request with payload, server reads then returns status. static void test(grpc_end2end_test_config config, bool request_status_early, bool recv_message_separately) { grpc_call* c; @@ -200,8 +200,12 @@ static void test(grpc_end2end_test_config config, bool request_status_early, error = grpc_call_start_batch(s, ops, static_cast(op - ops), tag(103), nullptr); GPR_ASSERT(GRPC_CALL_OK == error); - - CQ_EXPECT_COMPLETION(cqv, tag(103), 1); + // The success of the op depends on whether the payload is written before the + // transport sees the end of stream. If the stream has been write closed + // before the write completes, it would fail, otherwise it would succeed. + // Since this behavior is dependent on the transport implementation, we allow + // any success status with this op. + CQ_EXPECT_COMPLETION_ANY_STATUS(cqv, tag(103)); if (!request_status_early) { memset(ops, 0, sizeof(ops)); diff --git a/tools/run_tests/generated/tests.json b/tools/run_tests/generated/tests.json index b09efd61926..ab92e671caa 100644 --- a/tools/run_tests/generated/tests.json +++ b/tools/run_tests/generated/tests.json @@ -5997,58 +5997,6 @@ ], "uses_polling": true }, - { - "args": [], - "boringssl": true, - "ci_platforms": [ - "linux", - "mac", - "posix", - "windows" - ], - "cpu_cost": 1.0, - "defaults": "boringssl", - "exclude_configs": [ - "asan", - "ubsan" - ], - "flaky": false, - "gtest": true, - "language": "c++", - "name": "boringssl_ssl_test", - "platforms": [ - "linux", - "mac", - "posix", - "windows" - ] - }, - { - "args": [], - "boringssl": true, - "ci_platforms": [ - "linux", - "mac", - "posix", - "windows" - ], - "cpu_cost": 1.0, - "defaults": "boringssl", - "exclude_configs": [ - "asan", - "ubsan" - ], - "flaky": false, - "gtest": true, - "language": "c++", - "name": "boringssl_crypto_test", - "platforms": [ - "linux", - "mac", - "posix", - "windows" - ] - }, { "args": [ "test/core/security/corpus/alts_credentials_corpus/0149b46b88d583e05be0fb1423d10f2a14d36c48" From e26ec7742384c14b97190e35aed6eb824d7b9fc1 Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Tue, 14 Apr 2020 18:23:00 -0700 Subject: [PATCH 488/758] revert auto changes --- CMakeLists.txt | 2 - Makefile | 674 ++++++- build_autogenerated.yaml | 2 - config.m4 | 945 +++++++++ config.w32 | 1024 ++++++++++ gRPC-Core.podspec | 1 - grpc.gemspec | 1615 ++++++++++++++++ grpc.gyp | 328 +++- package.xml | 1894 ++++++++++++++++++- src/objective-c/BoringSSL-GRPC.podspec | 2 +- src/python/grpcio/grpc_core_dependencies.py | 279 +++ tools/run_tests/generated/tests.json | 52 + 12 files changed, 6805 insertions(+), 13 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2f2bcd6fb70..27bf340b65a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -919,7 +919,6 @@ add_library(end2end_nosec_tests test/core/end2end/tests/cancel_in_a_vacuum.cc test/core/end2end/tests/cancel_with_status.cc test/core/end2end/tests/channelz.cc - test/core/end2end/tests/client_streaming.cc test/core/end2end/tests/compressed_payload.cc test/core/end2end/tests/connectivity.cc test/core/end2end/tests/default_host.cc @@ -1051,7 +1050,6 @@ add_library(end2end_tests test/core/end2end/tests/cancel_in_a_vacuum.cc test/core/end2end/tests/cancel_with_status.cc test/core/end2end/tests/channelz.cc - test/core/end2end/tests/client_streaming.cc test/core/end2end/tests/compressed_payload.cc test/core/end2end/tests/connectivity.cc test/core/end2end/tests/default_host.cc diff --git a/Makefile b/Makefile index 6f1310cf8e6..d6c8cd19efa 100644 --- a/Makefile +++ b/Makefile @@ -1308,6 +1308,8 @@ xds_bootstrap_test: $(BINDIR)/$(CONFIG)/xds_bootstrap_test xds_end2end_test: $(BINDIR)/$(CONFIG)/xds_end2end_test xds_interop_client: $(BINDIR)/$(CONFIG)/xds_interop_client xds_interop_server: $(BINDIR)/$(CONFIG)/xds_interop_server +boringssl_ssl_test: $(BINDIR)/$(CONFIG)/boringssl_ssl_test +boringssl_crypto_test: $(BINDIR)/$(CONFIG)/boringssl_crypto_test alts_credentials_fuzzer_one_entry: $(BINDIR)/$(CONFIG)/alts_credentials_fuzzer_one_entry client_fuzzer_one_entry: $(BINDIR)/$(CONFIG)/client_fuzzer_one_entry hpack_parser_fuzzer_test_one_entry: $(BINDIR)/$(CONFIG)/hpack_parser_fuzzer_test_one_entry @@ -1365,7 +1367,7 @@ plugins: $(PROTOC_PLUGINS) privatelibs: privatelibs_c privatelibs_cxx -privatelibs_c: $(LIBDIR)/$(CONFIG)/libend2end_nosec_tests.a $(LIBDIR)/$(CONFIG)/libend2end_tests.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libares.a +privatelibs_c: $(LIBDIR)/$(CONFIG)/libend2end_nosec_tests.a $(LIBDIR)/$(CONFIG)/libend2end_tests.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libz.a $(LIBDIR)/$(CONFIG)/libares.a pc_c: $(LIBDIR)/$(CONFIG)/pkgconfig/grpc.pc $(LIBDIR)/$(CONFIG)/pkgconfig/gpr.pc pc_c_unsecure: $(LIBDIR)/$(CONFIG)/pkgconfig/grpc_unsecure.pc $(LIBDIR)/$(CONFIG)/pkgconfig/gpr.pc @@ -1375,7 +1377,7 @@ pc_cxx: $(LIBDIR)/$(CONFIG)/pkgconfig/grpc++.pc pc_cxx_unsecure: $(LIBDIR)/$(CONFIG)/pkgconfig/grpc++_unsecure.pc ifeq ($(EMBED_OPENSSL),true) -privatelibs_cxx: $(LIBDIR)/$(CONFIG)/libgrpc++_test.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libbenchmark.a +privatelibs_cxx: $(LIBDIR)/$(CONFIG)/libgrpc++_test.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libbenchmark.a else privatelibs_cxx: $(LIBDIR)/$(CONFIG)/libgrpc++_test.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libbenchmark.a endif @@ -1666,6 +1668,8 @@ buildtests_cxx: privatelibs_cxx \ $(BINDIR)/$(CONFIG)/xds_end2end_test \ $(BINDIR)/$(CONFIG)/xds_interop_client \ $(BINDIR)/$(CONFIG)/xds_interop_server \ + $(BINDIR)/$(CONFIG)/boringssl_ssl_test \ + $(BINDIR)/$(CONFIG)/boringssl_crypto_test \ $(BINDIR)/$(CONFIG)/alts_credentials_fuzzer_one_entry \ $(BINDIR)/$(CONFIG)/client_fuzzer_one_entry \ $(BINDIR)/$(CONFIG)/hpack_parser_fuzzer_test_one_entry \ @@ -3286,7 +3290,6 @@ LIBEND2END_NOSEC_TESTS_SRC = \ test/core/end2end/tests/cancel_in_a_vacuum.cc \ test/core/end2end/tests/cancel_with_status.cc \ test/core/end2end/tests/channelz.cc \ - test/core/end2end/tests/client_streaming.cc \ test/core/end2end/tests/compressed_payload.cc \ test/core/end2end/tests/connectivity.cc \ test/core/end2end/tests/default_host.cc \ @@ -3399,7 +3402,6 @@ LIBEND2END_TESTS_SRC = \ test/core/end2end/tests/cancel_in_a_vacuum.cc \ test/core/end2end/tests/cancel_with_status.cc \ test/core/end2end/tests/channelz.cc \ - test/core/end2end/tests/client_streaming.cc \ test/core/end2end/tests/compressed_payload.cc \ test/core/end2end/tests/connectivity.cc \ test/core/end2end/tests/default_host.cc \ @@ -5823,7 +5825,359 @@ $(OBJDIR)/$(CONFIG)/src/cpp/server/channelz/channelz_service.o: $(GENDIR)/src/pr $(OBJDIR)/$(CONFIG)/src/cpp/server/channelz/channelz_service_plugin.o: $(GENDIR)/src/proto/grpc/channelz/channelz.pb.cc $(GENDIR)/src/proto/grpc/channelz/channelz.grpc.pb.cc +LIBBORINGSSL_SRC = \ + third_party/boringssl-with-bazel/err_data.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_bitstr.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_bool.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_d2i_fp.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_dup.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_enum.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_gentm.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_i2d_fp.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_int.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_mbstr.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_octet.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_print.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_strnid.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_time.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_type.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_utctm.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_utf8.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/asn1_par.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/asn_pack.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/f_enum.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/f_int.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/f_string.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/tasn_fre.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/tasn_new.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/tasn_typ.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/tasn_utl.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/time_support.c \ + third_party/boringssl-with-bazel/src/crypto/base64/base64.c \ + third_party/boringssl-with-bazel/src/crypto/bio/bio.c \ + third_party/boringssl-with-bazel/src/crypto/bio/bio_mem.c \ + third_party/boringssl-with-bazel/src/crypto/bio/connect.c \ + third_party/boringssl-with-bazel/src/crypto/bio/fd.c \ + third_party/boringssl-with-bazel/src/crypto/bio/file.c \ + third_party/boringssl-with-bazel/src/crypto/bio/hexdump.c \ + third_party/boringssl-with-bazel/src/crypto/bio/pair.c \ + third_party/boringssl-with-bazel/src/crypto/bio/printf.c \ + third_party/boringssl-with-bazel/src/crypto/bio/socket.c \ + third_party/boringssl-with-bazel/src/crypto/bio/socket_helper.c \ + third_party/boringssl-with-bazel/src/crypto/bn_extra/bn_asn1.c \ + third_party/boringssl-with-bazel/src/crypto/bn_extra/convert.c \ + third_party/boringssl-with-bazel/src/crypto/buf/buf.c \ + third_party/boringssl-with-bazel/src/crypto/bytestring/asn1_compat.c \ + third_party/boringssl-with-bazel/src/crypto/bytestring/ber.c \ + third_party/boringssl-with-bazel/src/crypto/bytestring/cbb.c \ + third_party/boringssl-with-bazel/src/crypto/bytestring/cbs.c \ + third_party/boringssl-with-bazel/src/crypto/bytestring/unicode.c \ + third_party/boringssl-with-bazel/src/crypto/chacha/chacha.c \ + third_party/boringssl-with-bazel/src/crypto/cipher_extra/cipher_extra.c \ + third_party/boringssl-with-bazel/src/crypto/cipher_extra/derive_key.c \ + third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_aesccm.c \ + third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_aesctrhmac.c \ + third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_aesgcmsiv.c \ + third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_chacha20poly1305.c \ + third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_null.c \ + third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_rc2.c \ + third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_rc4.c \ + third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_tls.c \ + third_party/boringssl-with-bazel/src/crypto/cipher_extra/tls_cbc.c \ + third_party/boringssl-with-bazel/src/crypto/cmac/cmac.c \ + third_party/boringssl-with-bazel/src/crypto/conf/conf.c \ + third_party/boringssl-with-bazel/src/crypto/cpu-aarch64-fuchsia.c \ + third_party/boringssl-with-bazel/src/crypto/cpu-aarch64-linux.c \ + third_party/boringssl-with-bazel/src/crypto/cpu-arm-linux.c \ + third_party/boringssl-with-bazel/src/crypto/cpu-arm.c \ + third_party/boringssl-with-bazel/src/crypto/cpu-intel.c \ + third_party/boringssl-with-bazel/src/crypto/cpu-ppc64le.c \ + third_party/boringssl-with-bazel/src/crypto/crypto.c \ + third_party/boringssl-with-bazel/src/crypto/curve25519/spake25519.c \ + third_party/boringssl-with-bazel/src/crypto/dh/check.c \ + third_party/boringssl-with-bazel/src/crypto/dh/dh.c \ + third_party/boringssl-with-bazel/src/crypto/dh/dh_asn1.c \ + third_party/boringssl-with-bazel/src/crypto/dh/params.c \ + third_party/boringssl-with-bazel/src/crypto/digest_extra/digest_extra.c \ + third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c \ + third_party/boringssl-with-bazel/src/crypto/dsa/dsa_asn1.c \ + third_party/boringssl-with-bazel/src/crypto/ec_extra/ec_asn1.c \ + third_party/boringssl-with-bazel/src/crypto/ec_extra/ec_derive.c \ + third_party/boringssl-with-bazel/src/crypto/ecdh_extra/ecdh_extra.c \ + third_party/boringssl-with-bazel/src/crypto/ecdsa_extra/ecdsa_asn1.c \ + third_party/boringssl-with-bazel/src/crypto/engine/engine.c \ + third_party/boringssl-with-bazel/src/crypto/err/err.c \ + third_party/boringssl-with-bazel/src/crypto/evp/digestsign.c \ + third_party/boringssl-with-bazel/src/crypto/evp/evp.c \ + third_party/boringssl-with-bazel/src/crypto/evp/evp_asn1.c \ + third_party/boringssl-with-bazel/src/crypto/evp/evp_ctx.c \ + third_party/boringssl-with-bazel/src/crypto/evp/p_dsa_asn1.c \ + third_party/boringssl-with-bazel/src/crypto/evp/p_ec.c \ + third_party/boringssl-with-bazel/src/crypto/evp/p_ec_asn1.c \ + third_party/boringssl-with-bazel/src/crypto/evp/p_ed25519.c \ + third_party/boringssl-with-bazel/src/crypto/evp/p_ed25519_asn1.c \ + third_party/boringssl-with-bazel/src/crypto/evp/p_rsa.c \ + third_party/boringssl-with-bazel/src/crypto/evp/p_rsa_asn1.c \ + third_party/boringssl-with-bazel/src/crypto/evp/p_x25519.c \ + third_party/boringssl-with-bazel/src/crypto/evp/p_x25519_asn1.c \ + third_party/boringssl-with-bazel/src/crypto/evp/pbkdf.c \ + third_party/boringssl-with-bazel/src/crypto/evp/print.c \ + third_party/boringssl-with-bazel/src/crypto/evp/scrypt.c \ + third_party/boringssl-with-bazel/src/crypto/evp/sign.c \ + third_party/boringssl-with-bazel/src/crypto/ex_data.c \ + third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c \ + third_party/boringssl-with-bazel/src/crypto/fipsmodule/fips_shared_support.c \ + third_party/boringssl-with-bazel/src/crypto/fipsmodule/is_fips.c \ + third_party/boringssl-with-bazel/src/crypto/hkdf/hkdf.c \ + third_party/boringssl-with-bazel/src/crypto/hrss/hrss.c \ + third_party/boringssl-with-bazel/src/crypto/lhash/lhash.c \ + third_party/boringssl-with-bazel/src/crypto/mem.c \ + third_party/boringssl-with-bazel/src/crypto/obj/obj.c \ + third_party/boringssl-with-bazel/src/crypto/obj/obj_xref.c \ + third_party/boringssl-with-bazel/src/crypto/pem/pem_all.c \ + third_party/boringssl-with-bazel/src/crypto/pem/pem_info.c \ + third_party/boringssl-with-bazel/src/crypto/pem/pem_lib.c \ + third_party/boringssl-with-bazel/src/crypto/pem/pem_oth.c \ + third_party/boringssl-with-bazel/src/crypto/pem/pem_pk8.c \ + third_party/boringssl-with-bazel/src/crypto/pem/pem_pkey.c \ + third_party/boringssl-with-bazel/src/crypto/pem/pem_x509.c \ + third_party/boringssl-with-bazel/src/crypto/pem/pem_xaux.c \ + third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7.c \ + third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7_x509.c \ + third_party/boringssl-with-bazel/src/crypto/pkcs8/p5_pbev2.c \ + third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8.c \ + third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c \ + third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305.c \ + third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_arm.c \ + third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_vec.c \ + third_party/boringssl-with-bazel/src/crypto/pool/pool.c \ + third_party/boringssl-with-bazel/src/crypto/rand_extra/deterministic.c \ + third_party/boringssl-with-bazel/src/crypto/rand_extra/forkunsafe.c \ + third_party/boringssl-with-bazel/src/crypto/rand_extra/fuchsia.c \ + third_party/boringssl-with-bazel/src/crypto/rand_extra/rand_extra.c \ + third_party/boringssl-with-bazel/src/crypto/rand_extra/windows.c \ + third_party/boringssl-with-bazel/src/crypto/rc4/rc4.c \ + third_party/boringssl-with-bazel/src/crypto/refcount_c11.c \ + third_party/boringssl-with-bazel/src/crypto/refcount_lock.c \ + third_party/boringssl-with-bazel/src/crypto/rsa_extra/rsa_asn1.c \ + third_party/boringssl-with-bazel/src/crypto/rsa_extra/rsa_print.c \ + third_party/boringssl-with-bazel/src/crypto/siphash/siphash.c \ + third_party/boringssl-with-bazel/src/crypto/stack/stack.c \ + third_party/boringssl-with-bazel/src/crypto/thread.c \ + third_party/boringssl-with-bazel/src/crypto/thread_none.c \ + third_party/boringssl-with-bazel/src/crypto/thread_pthread.c \ + third_party/boringssl-with-bazel/src/crypto/thread_win.c \ + third_party/boringssl-with-bazel/src/crypto/x509/a_digest.c \ + third_party/boringssl-with-bazel/src/crypto/x509/a_sign.c \ + third_party/boringssl-with-bazel/src/crypto/x509/a_strex.c \ + third_party/boringssl-with-bazel/src/crypto/x509/a_verify.c \ + third_party/boringssl-with-bazel/src/crypto/x509/algorithm.c \ + third_party/boringssl-with-bazel/src/crypto/x509/asn1_gen.c \ + third_party/boringssl-with-bazel/src/crypto/x509/by_dir.c \ + third_party/boringssl-with-bazel/src/crypto/x509/by_file.c \ + third_party/boringssl-with-bazel/src/crypto/x509/i2d_pr.c \ + third_party/boringssl-with-bazel/src/crypto/x509/rsa_pss.c \ + third_party/boringssl-with-bazel/src/crypto/x509/t_crl.c \ + third_party/boringssl-with-bazel/src/crypto/x509/t_req.c \ + third_party/boringssl-with-bazel/src/crypto/x509/t_x509.c \ + third_party/boringssl-with-bazel/src/crypto/x509/t_x509a.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_att.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_d2.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_def.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_ext.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_lu.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_obj.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_r2x.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_req.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_trs.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_txt.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_v3.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_vpm.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509cset.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509name.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509rset.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509spki.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x_algor.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x_all.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x_attrib.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x_exten.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x_info.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x_name.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x_pkey.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x_pubkey.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x_req.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x_sig.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x_spki.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x_val.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x_x509a.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_cache.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_data.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_lib.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_map.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_node.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_tree.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_akey.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_akeya.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_alt.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_bcons.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_bitst.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_conf.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_crld.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_enum.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_extku.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_genn.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ia5.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_info.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_int.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_lib.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ncons.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ocsp.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pci.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pcia.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pcons.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pku.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pmaps.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_prn.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_skey.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_sxnet.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_utl.c \ + third_party/boringssl-with-bazel/src/ssl/bio_ssl.cc \ + third_party/boringssl-with-bazel/src/ssl/d1_both.cc \ + third_party/boringssl-with-bazel/src/ssl/d1_lib.cc \ + third_party/boringssl-with-bazel/src/ssl/d1_pkt.cc \ + third_party/boringssl-with-bazel/src/ssl/d1_srtp.cc \ + third_party/boringssl-with-bazel/src/ssl/dtls_method.cc \ + third_party/boringssl-with-bazel/src/ssl/dtls_record.cc \ + third_party/boringssl-with-bazel/src/ssl/handoff.cc \ + third_party/boringssl-with-bazel/src/ssl/handshake.cc \ + third_party/boringssl-with-bazel/src/ssl/handshake_client.cc \ + third_party/boringssl-with-bazel/src/ssl/handshake_server.cc \ + third_party/boringssl-with-bazel/src/ssl/s3_both.cc \ + third_party/boringssl-with-bazel/src/ssl/s3_lib.cc \ + third_party/boringssl-with-bazel/src/ssl/s3_pkt.cc \ + third_party/boringssl-with-bazel/src/ssl/ssl_aead_ctx.cc \ + third_party/boringssl-with-bazel/src/ssl/ssl_asn1.cc \ + third_party/boringssl-with-bazel/src/ssl/ssl_buffer.cc \ + third_party/boringssl-with-bazel/src/ssl/ssl_cert.cc \ + third_party/boringssl-with-bazel/src/ssl/ssl_cipher.cc \ + third_party/boringssl-with-bazel/src/ssl/ssl_file.cc \ + third_party/boringssl-with-bazel/src/ssl/ssl_key_share.cc \ + third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc \ + third_party/boringssl-with-bazel/src/ssl/ssl_privkey.cc \ + third_party/boringssl-with-bazel/src/ssl/ssl_session.cc \ + third_party/boringssl-with-bazel/src/ssl/ssl_stat.cc \ + third_party/boringssl-with-bazel/src/ssl/ssl_transcript.cc \ + third_party/boringssl-with-bazel/src/ssl/ssl_versions.cc \ + third_party/boringssl-with-bazel/src/ssl/ssl_x509.cc \ + third_party/boringssl-with-bazel/src/ssl/t1_enc.cc \ + third_party/boringssl-with-bazel/src/ssl/t1_lib.cc \ + third_party/boringssl-with-bazel/src/ssl/tls13_both.cc \ + third_party/boringssl-with-bazel/src/ssl/tls13_client.cc \ + third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc \ + third_party/boringssl-with-bazel/src/ssl/tls13_server.cc \ + third_party/boringssl-with-bazel/src/ssl/tls_method.cc \ + third_party/boringssl-with-bazel/src/ssl/tls_record.cc \ + third_party/boringssl-with-bazel/src/third_party/fiat/curve25519.c \ + +PUBLIC_HEADERS_C += \ + +LIBBORINGSSL_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBBORINGSSL_SRC)))) + +$(LIBBORINGSSL_OBJS): CPPFLAGS += -Ithird_party/boringssl-with-bazel/src/include -fvisibility=hidden -DOPENSSL_NO_ASM -D_GNU_SOURCE -DWIN32_LEAN_AND_MEAN -D_HAS_EXCEPTIONS=0 -DNOMINMAX +$(LIBBORINGSSL_OBJS): CXXFLAGS += -fno-exceptions +$(LIBBORINGSSL_OBJS): CFLAGS += -g + +$(LIBDIR)/$(CONFIG)/libboringssl.a: $(ZLIB_DEP) $(CARES_DEP) $(ADDRESS_SORTING_DEP) $(UPB_DEP) $(GRPC_ABSEIL_DEP) $(LIBBORINGSSL_OBJS) + $(E) "[AR] Creating $@" + $(Q) mkdir -p `dirname $@` + $(Q) rm -f $(LIBDIR)/$(CONFIG)/libboringssl.a + $(Q) $(AR) $(AROPTS) $(LIBDIR)/$(CONFIG)/libboringssl.a $(LIBBORINGSSL_OBJS) +ifeq ($(SYSTEM),Darwin) + $(Q) ranlib -no_warning_for_no_symbols $(LIBDIR)/$(CONFIG)/libboringssl.a +endif + + + + +ifneq ($(NO_DEPS),true) +-include $(LIBBORINGSSL_OBJS:.o=.dep) +endif + + +LIBBORINGSSL_TEST_UTIL_SRC = \ + third_party/boringssl-with-bazel/src/crypto/test/file_test.cc \ + third_party/boringssl-with-bazel/src/crypto/test/malloc.cc \ + third_party/boringssl-with-bazel/src/crypto/test/test_util.cc \ + third_party/boringssl-with-bazel/src/crypto/test/wycheproof_util.cc \ + +PUBLIC_HEADERS_CXX += \ + +LIBBORINGSSL_TEST_UTIL_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBBORINGSSL_TEST_UTIL_SRC)))) + +$(LIBBORINGSSL_TEST_UTIL_OBJS): CPPFLAGS += -Ithird_party/boringssl-with-bazel/src/include -fvisibility=hidden -DOPENSSL_NO_ASM -D_GNU_SOURCE -DWIN32_LEAN_AND_MEAN -D_HAS_EXCEPTIONS=0 -DNOMINMAX +$(LIBBORINGSSL_TEST_UTIL_OBJS): CXXFLAGS += -fno-exceptions +$(LIBBORINGSSL_TEST_UTIL_OBJS): CFLAGS += -g + +ifeq ($(NO_PROTOBUF),true) + +# You can't build a C++ library if you don't have protobuf - a bit overreached, but still okay. + +$(LIBDIR)/$(CONFIG)/libboringssl_test_util.a: protobuf_dep_error + + +else + +$(LIBDIR)/$(CONFIG)/libboringssl_test_util.a: $(ZLIB_DEP) $(CARES_DEP) $(ADDRESS_SORTING_DEP) $(UPB_DEP) $(GRPC_ABSEIL_DEP) $(PROTOBUF_DEP) $(LIBBORINGSSL_TEST_UTIL_OBJS) + $(E) "[AR] Creating $@" + $(Q) mkdir -p `dirname $@` + $(Q) rm -f $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a + $(Q) $(AR) $(AROPTS) $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBBORINGSSL_TEST_UTIL_OBJS) +ifeq ($(SYSTEM),Darwin) + $(Q) ranlib -no_warning_for_no_symbols $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a +endif + + + + +endif + +ifneq ($(NO_DEPS),true) +-include $(LIBBORINGSSL_TEST_UTIL_OBJS:.o=.dep) +endif + + LIBBENCHMARK_SRC = \ + third_party/benchmark/src/benchmark.cc \ + third_party/benchmark/src/benchmark_api_internal.cc \ + third_party/benchmark/src/benchmark_main.cc \ + third_party/benchmark/src/benchmark_name.cc \ + third_party/benchmark/src/benchmark_register.cc \ + third_party/benchmark/src/benchmark_runner.cc \ + third_party/benchmark/src/colorprint.cc \ + third_party/benchmark/src/commandlineflags.cc \ + third_party/benchmark/src/complexity.cc \ + third_party/benchmark/src/console_reporter.cc \ + third_party/benchmark/src/counter.cc \ + third_party/benchmark/src/csv_reporter.cc \ + third_party/benchmark/src/json_reporter.cc \ + third_party/benchmark/src/reporter.cc \ + third_party/benchmark/src/sleep.cc \ + third_party/benchmark/src/statistics.cc \ + third_party/benchmark/src/string_util.cc \ + third_party/benchmark/src/sysinfo.cc \ + third_party/benchmark/src/timers.cc \ PUBLIC_HEADERS_CXX += \ @@ -5906,6 +6260,46 @@ ifneq ($(NO_DEPS),true) endif +LIBZ_SRC = \ + third_party/zlib/adler32.c \ + third_party/zlib/compress.c \ + third_party/zlib/crc32.c \ + third_party/zlib/deflate.c \ + third_party/zlib/gzclose.c \ + third_party/zlib/gzlib.c \ + third_party/zlib/gzread.c \ + third_party/zlib/gzwrite.c \ + third_party/zlib/infback.c \ + third_party/zlib/inffast.c \ + third_party/zlib/inflate.c \ + third_party/zlib/inftrees.c \ + third_party/zlib/trees.c \ + third_party/zlib/uncompr.c \ + third_party/zlib/zutil.c \ + +PUBLIC_HEADERS_C += \ + +LIBZ_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBZ_SRC)))) + +$(LIBZ_OBJS): CFLAGS += -fvisibility=hidden + +$(LIBDIR)/$(CONFIG)/libz.a: $(LIBZ_OBJS) + $(E) "[AR] Creating $@" + $(Q) mkdir -p `dirname $@` + $(Q) rm -f $(LIBDIR)/$(CONFIG)/libz.a + $(Q) $(AR) $(AROPTS) $(LIBDIR)/$(CONFIG)/libz.a $(LIBZ_OBJS) +ifeq ($(SYSTEM),Darwin) + $(Q) ranlib -no_warning_for_no_symbols $(LIBDIR)/$(CONFIG)/libz.a +endif + + + + +ifneq ($(NO_DEPS),true) +-include $(LIBZ_OBJS:.o=.dep) +endif + + LIBARES_SRC = \ third_party/cares/cares/ares__close_sockets.c \ third_party/cares/cares/ares__get_hostent.c \ @@ -18811,6 +19205,278 @@ endif $(OBJDIR)/$(CONFIG)/test/cpp/interop/xds_interop_server.o: $(GENDIR)/src/proto/grpc/testing/empty.pb.cc $(GENDIR)/src/proto/grpc/testing/empty.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.pb.cc $(GENDIR)/src/proto/grpc/testing/messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/test.pb.cc $(GENDIR)/src/proto/grpc/testing/test.grpc.pb.cc +BORINGSSL_SSL_TEST_SRC = \ + third_party/boringssl-with-bazel/src/crypto/test/abi_test.cc \ + third_party/boringssl-with-bazel/src/crypto/test/gtest_main.cc \ + third_party/boringssl-with-bazel/src/ssl/span_test.cc \ + third_party/boringssl-with-bazel/src/ssl/ssl_c_test.c \ + third_party/boringssl-with-bazel/src/ssl/ssl_test.cc \ + +BORINGSSL_SSL_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(BORINGSSL_SSL_TEST_SRC)))) + +# boringssl needs an override to ensure that it does not include +# system openssl headers regardless of other configuration +# we do so here with a target specific variable assignment +$(BORINGSSL_SSL_TEST_OBJS): CFLAGS := -Ithird_party/boringssl-with-bazel/src/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value $(NO_W_EXTRA_SEMI) +$(BORINGSSL_SSL_TEST_OBJS): CXXFLAGS := -Ithird_party/boringssl-with-bazel/src/include $(CXXFLAGS) +$(BORINGSSL_SSL_TEST_OBJS): CPPFLAGS += -DOPENSSL_NO_ASM -D_GNU_SOURCE + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/boringssl_ssl_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/boringssl_ssl_test: $(PROTOBUF_DEP) $(BORINGSSL_SSL_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(BORINGSSL_SSL_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/boringssl_ssl_test + +endif + +$(BORINGSSL_SSL_TEST_OBJS): CPPFLAGS += -Ithird_party/boringssl-with-bazel/src/include -fvisibility=hidden -DOPENSSL_NO_ASM -D_GNU_SOURCE -DWIN32_LEAN_AND_MEAN -D_HAS_EXCEPTIONS=0 -DNOMINMAX +$(BORINGSSL_SSL_TEST_OBJS): CXXFLAGS += -fno-exceptions +$(BORINGSSL_SSL_TEST_OBJS): CFLAGS += -g +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/test/abi_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/test/gtest_main.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/ssl/span_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/ssl/ssl_c_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/ssl/ssl_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +deps_boringssl_ssl_test: $(BORINGSSL_SSL_TEST_OBJS:.o=.dep) + +ifneq ($(NO_DEPS),true) +-include $(BORINGSSL_SSL_TEST_OBJS:.o=.dep) +endif + + +BORINGSSL_CRYPTO_TEST_SRC = \ + third_party/boringssl-with-bazel/crypto_test_data.cc \ + third_party/boringssl-with-bazel/src/crypto/abi_self_test.cc \ + third_party/boringssl-with-bazel/src/crypto/asn1/asn1_test.cc \ + third_party/boringssl-with-bazel/src/crypto/base64/base64_test.cc \ + third_party/boringssl-with-bazel/src/crypto/bio/bio_test.cc \ + third_party/boringssl-with-bazel/src/crypto/buf/buf_test.cc \ + third_party/boringssl-with-bazel/src/crypto/bytestring/bytestring_test.cc \ + third_party/boringssl-with-bazel/src/crypto/chacha/chacha_test.cc \ + third_party/boringssl-with-bazel/src/crypto/cipher_extra/aead_test.cc \ + third_party/boringssl-with-bazel/src/crypto/cipher_extra/cipher_test.cc \ + third_party/boringssl-with-bazel/src/crypto/cmac/cmac_test.cc \ + third_party/boringssl-with-bazel/src/crypto/compiler_test.cc \ + third_party/boringssl-with-bazel/src/crypto/constant_time_test.cc \ + third_party/boringssl-with-bazel/src/crypto/cpu-arm-linux_test.cc \ + third_party/boringssl-with-bazel/src/crypto/curve25519/ed25519_test.cc \ + third_party/boringssl-with-bazel/src/crypto/curve25519/spake25519_test.cc \ + third_party/boringssl-with-bazel/src/crypto/curve25519/x25519_test.cc \ + third_party/boringssl-with-bazel/src/crypto/dh/dh_test.cc \ + third_party/boringssl-with-bazel/src/crypto/digest_extra/digest_test.cc \ + third_party/boringssl-with-bazel/src/crypto/dsa/dsa_test.cc \ + third_party/boringssl-with-bazel/src/crypto/ecdh_extra/ecdh_test.cc \ + third_party/boringssl-with-bazel/src/crypto/err/err_test.cc \ + third_party/boringssl-with-bazel/src/crypto/evp/evp_extra_test.cc \ + third_party/boringssl-with-bazel/src/crypto/evp/evp_test.cc \ + third_party/boringssl-with-bazel/src/crypto/evp/pbkdf_test.cc \ + third_party/boringssl-with-bazel/src/crypto/evp/scrypt_test.cc \ + third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/aes_test.cc \ + third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/bn_test.cc \ + third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_test.cc \ + third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256-x86_64_test.cc \ + third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa_test.cc \ + third_party/boringssl-with-bazel/src/crypto/fipsmodule/md5/md5_test.cc \ + third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm_test.cc \ + third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/ctrdrbg_test.cc \ + third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha_test.cc \ + third_party/boringssl-with-bazel/src/crypto/hkdf/hkdf_test.cc \ + third_party/boringssl-with-bazel/src/crypto/hmac_extra/hmac_test.cc \ + third_party/boringssl-with-bazel/src/crypto/hrss/hrss_test.cc \ + third_party/boringssl-with-bazel/src/crypto/impl_dispatch_test.cc \ + third_party/boringssl-with-bazel/src/crypto/lhash/lhash_test.cc \ + third_party/boringssl-with-bazel/src/crypto/obj/obj_test.cc \ + third_party/boringssl-with-bazel/src/crypto/pem/pem_test.cc \ + third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7_test.cc \ + third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs12_test.cc \ + third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_test.cc \ + third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_test.cc \ + third_party/boringssl-with-bazel/src/crypto/pool/pool_test.cc \ + third_party/boringssl-with-bazel/src/crypto/rand_extra/rand_test.cc \ + third_party/boringssl-with-bazel/src/crypto/refcount_test.cc \ + third_party/boringssl-with-bazel/src/crypto/rsa_extra/rsa_test.cc \ + third_party/boringssl-with-bazel/src/crypto/self_test.cc \ + third_party/boringssl-with-bazel/src/crypto/siphash/siphash_test.cc \ + third_party/boringssl-with-bazel/src/crypto/stack/stack_test.cc \ + third_party/boringssl-with-bazel/src/crypto/test/abi_test.cc \ + third_party/boringssl-with-bazel/src/crypto/test/file_test_gtest.cc \ + third_party/boringssl-with-bazel/src/crypto/test/gtest_main.cc \ + third_party/boringssl-with-bazel/src/crypto/thread_test.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_test.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_time_test.cc \ + third_party/boringssl-with-bazel/src/crypto/x509v3/tab_test.cc \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3name_test.cc \ + +BORINGSSL_CRYPTO_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(BORINGSSL_CRYPTO_TEST_SRC)))) + +# boringssl needs an override to ensure that it does not include +# system openssl headers regardless of other configuration +# we do so here with a target specific variable assignment +$(BORINGSSL_CRYPTO_TEST_OBJS): CFLAGS := -Ithird_party/boringssl-with-bazel/src/include $(CFLAGS) -Wno-sign-conversion -Wno-conversion -Wno-unused-value $(NO_W_EXTRA_SEMI) +$(BORINGSSL_CRYPTO_TEST_OBJS): CXXFLAGS := -Ithird_party/boringssl-with-bazel/src/include $(CXXFLAGS) +$(BORINGSSL_CRYPTO_TEST_OBJS): CPPFLAGS += -DOPENSSL_NO_ASM -D_GNU_SOURCE + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. + +$(BINDIR)/$(CONFIG)/boringssl_crypto_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/boringssl_crypto_test: $(PROTOBUF_DEP) $(BORINGSSL_CRYPTO_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(BORINGSSL_CRYPTO_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/boringssl_crypto_test + +endif + +$(BORINGSSL_CRYPTO_TEST_OBJS): CPPFLAGS += -Ithird_party/boringssl-with-bazel/src/include -fvisibility=hidden -DOPENSSL_NO_ASM -D_GNU_SOURCE -DWIN32_LEAN_AND_MEAN -D_HAS_EXCEPTIONS=0 -DNOMINMAX +$(BORINGSSL_CRYPTO_TEST_OBJS): CXXFLAGS += -fno-exceptions +$(BORINGSSL_CRYPTO_TEST_OBJS): CFLAGS += -g +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/crypto_test_data.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/abi_self_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/base64/base64_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/bio/bio_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/buf/buf_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/bytestring/bytestring_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/chacha/chacha_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/cipher_extra/aead_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/cipher_extra/cipher_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/cmac/cmac_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/compiler_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/constant_time_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/cpu-arm-linux_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/curve25519/ed25519_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/curve25519/spake25519_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/curve25519/x25519_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/dh/dh_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/digest_extra/digest_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/dsa/dsa_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/ecdh_extra/ecdh_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/err/err_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/evp/evp_extra_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/evp/evp_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/evp/pbkdf_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/evp/scrypt_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/aes_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/bn_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256-x86_64_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md5/md5_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/ctrdrbg_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/hkdf/hkdf_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/hmac_extra/hmac_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/hrss/hrss_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/impl_dispatch_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/lhash/lhash_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/obj/obj_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/pem/pem_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs12_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/pool/pool_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/rand_extra/rand_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/refcount_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/rsa_extra/rsa_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/self_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/siphash/siphash_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/stack/stack_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/test/abi_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/test/file_test_gtest.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/test/gtest_main.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/thread_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/x509/x509_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/x509/x509_time_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/x509v3/tab_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +$(OBJDIR)/$(CONFIG)/third_party/boringssl-with-bazel/src/crypto/x509v3/v3name_test.o: $(LIBDIR)/$(CONFIG)/libboringssl_test_util.a $(LIBDIR)/$(CONFIG)/libboringssl.a + +deps_boringssl_crypto_test: $(BORINGSSL_CRYPTO_TEST_OBJS:.o=.dep) + +ifneq ($(NO_DEPS),true) +-include $(BORINGSSL_CRYPTO_TEST_OBJS:.o=.dep) +endif + + ALTS_CREDENTIALS_FUZZER_ONE_ENTRY_SRC = \ test/core/security/alts_credentials_fuzzer.cc \ test/core/util/one_corpus_entry_fuzzer.cc \ diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml index af53ae25dc9..30dba593d4f 100644 --- a/build_autogenerated.yaml +++ b/build_autogenerated.yaml @@ -49,7 +49,6 @@ libs: - test/core/end2end/tests/cancel_in_a_vacuum.cc - test/core/end2end/tests/cancel_with_status.cc - test/core/end2end/tests/channelz.cc - - test/core/end2end/tests/client_streaming.cc - test/core/end2end/tests/compressed_payload.cc - test/core/end2end/tests/connectivity.cc - test/core/end2end/tests/default_host.cc @@ -158,7 +157,6 @@ libs: - test/core/end2end/tests/cancel_in_a_vacuum.cc - test/core/end2end/tests/cancel_with_status.cc - test/core/end2end/tests/channelz.cc - - test/core/end2end/tests/client_streaming.cc - test/core/end2end/tests/compressed_payload.cc - test/core/end2end/tests/connectivity.cc - test/core/end2end/tests/default_host.cc diff --git a/config.m4 b/config.m4 index 52ba2ef06ef..6b450315f4f 100644 --- a/config.m4 +++ b/config.m4 @@ -35,3 +35,948 @@ if test "$PHP_GRPC" != "no"; then esac PHP_SUBST(GRPC_SHARED_LIBADD) + + PHP_NEW_EXTENSION(grpc, + src/core/ext/filters/census/grpc_context.cc \ + src/core/ext/filters/client_channel/backend_metric.cc \ + src/core/ext/filters/client_channel/backup_poller.cc \ + src/core/ext/filters/client_channel/channel_connectivity.cc \ + src/core/ext/filters/client_channel/client_channel.cc \ + src/core/ext/filters/client_channel/client_channel_channelz.cc \ + src/core/ext/filters/client_channel/client_channel_factory.cc \ + src/core/ext/filters/client_channel/client_channel_plugin.cc \ + src/core/ext/filters/client_channel/global_subchannel_pool.cc \ + src/core/ext/filters/client_channel/health/health_check_client.cc \ + src/core/ext/filters/client_channel/http_connect_handshaker.cc \ + src/core/ext/filters/client_channel/http_proxy.cc \ + src/core/ext/filters/client_channel/lb_policy.cc \ + src/core/ext/filters/client_channel/lb_policy/address_filtering.cc \ + src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc \ + src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc \ + src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc \ + src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc \ + src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc \ + src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc \ + src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc \ + src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc \ + src/core/ext/filters/client_channel/lb_policy/priority/priority.cc \ + src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc \ + src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc \ + src/core/ext/filters/client_channel/lb_policy/xds/cds.cc \ + src/core/ext/filters/client_channel/lb_policy/xds/eds.cc \ + src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc \ + src/core/ext/filters/client_channel/lb_policy_registry.cc \ + src/core/ext/filters/client_channel/local_subchannel_pool.cc \ + src/core/ext/filters/client_channel/parse_address.cc \ + src/core/ext/filters/client_channel/proxy_mapper_registry.cc \ + src/core/ext/filters/client_channel/resolver.cc \ + src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc \ + src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc \ + src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc \ + src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc \ + src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc \ + src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc \ + src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc \ + src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_libuv.cc \ + src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_posix.cc \ + src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc \ + src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.cc \ + src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc \ + src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc \ + src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc \ + src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc \ + src/core/ext/filters/client_channel/resolver_registry.cc \ + src/core/ext/filters/client_channel/resolver_result_parsing.cc \ + src/core/ext/filters/client_channel/resolving_lb_policy.cc \ + src/core/ext/filters/client_channel/retry_throttle.cc \ + src/core/ext/filters/client_channel/server_address.cc \ + src/core/ext/filters/client_channel/service_config.cc \ + src/core/ext/filters/client_channel/subchannel.cc \ + src/core/ext/filters/client_channel/subchannel_pool_interface.cc \ + src/core/ext/filters/client_channel/xds/xds_api.cc \ + src/core/ext/filters/client_channel/xds/xds_bootstrap.cc \ + src/core/ext/filters/client_channel/xds/xds_channel_secure.cc \ + src/core/ext/filters/client_channel/xds/xds_client.cc \ + src/core/ext/filters/client_channel/xds/xds_client_stats.cc \ + src/core/ext/filters/client_idle/client_idle_filter.cc \ + src/core/ext/filters/deadline/deadline_filter.cc \ + src/core/ext/filters/http/client/http_client_filter.cc \ + src/core/ext/filters/http/client_authority_filter.cc \ + src/core/ext/filters/http/http_filters_plugin.cc \ + src/core/ext/filters/http/message_compress/message_compress_filter.cc \ + src/core/ext/filters/http/server/http_server_filter.cc \ + src/core/ext/filters/max_age/max_age_filter.cc \ + src/core/ext/filters/message_size/message_size_filter.cc \ + src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc \ + src/core/ext/filters/workarounds/workaround_utils.cc \ + src/core/ext/transport/chttp2/alpn/alpn.cc \ + src/core/ext/transport/chttp2/client/authority.cc \ + src/core/ext/transport/chttp2/client/chttp2_connector.cc \ + src/core/ext/transport/chttp2/client/insecure/channel_create.cc \ + src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc \ + src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc \ + src/core/ext/transport/chttp2/server/chttp2_server.cc \ + src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc \ + src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc \ + src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc \ + src/core/ext/transport/chttp2/transport/bin_decoder.cc \ + src/core/ext/transport/chttp2/transport/bin_encoder.cc \ + src/core/ext/transport/chttp2/transport/chttp2_plugin.cc \ + src/core/ext/transport/chttp2/transport/chttp2_transport.cc \ + src/core/ext/transport/chttp2/transport/context_list.cc \ + src/core/ext/transport/chttp2/transport/flow_control.cc \ + src/core/ext/transport/chttp2/transport/frame_data.cc \ + src/core/ext/transport/chttp2/transport/frame_goaway.cc \ + src/core/ext/transport/chttp2/transport/frame_ping.cc \ + src/core/ext/transport/chttp2/transport/frame_rst_stream.cc \ + src/core/ext/transport/chttp2/transport/frame_settings.cc \ + src/core/ext/transport/chttp2/transport/frame_window_update.cc \ + src/core/ext/transport/chttp2/transport/hpack_encoder.cc \ + src/core/ext/transport/chttp2/transport/hpack_parser.cc \ + src/core/ext/transport/chttp2/transport/hpack_table.cc \ + src/core/ext/transport/chttp2/transport/http2_settings.cc \ + src/core/ext/transport/chttp2/transport/huffsyms.cc \ + src/core/ext/transport/chttp2/transport/incoming_metadata.cc \ + src/core/ext/transport/chttp2/transport/parsing.cc \ + src/core/ext/transport/chttp2/transport/stream_lists.cc \ + src/core/ext/transport/chttp2/transport/stream_map.cc \ + src/core/ext/transport/chttp2/transport/varint.cc \ + src/core/ext/transport/chttp2/transport/writing.cc \ + src/core/ext/transport/inproc/inproc_plugin.cc \ + src/core/ext/transport/inproc/inproc_transport.cc \ + src/core/ext/upb-generated/envoy/annotations/deprecation.upb.c \ + src/core/ext/upb-generated/envoy/annotations/resource.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/cds.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/cluster.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/core/address.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/eds.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/lds.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/listener.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/rds.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/route.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/route/route.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/srds.upb.c \ + src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.c \ + src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.c \ + src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.c \ + src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.c \ + src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.c \ + src/core/ext/upb-generated/envoy/type/http.upb.c \ + src/core/ext/upb-generated/envoy/type/matcher/regex.upb.c \ + src/core/ext/upb-generated/envoy/type/matcher/string.upb.c \ + src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.c \ + src/core/ext/upb-generated/envoy/type/percent.upb.c \ + src/core/ext/upb-generated/envoy/type/range.upb.c \ + src/core/ext/upb-generated/envoy/type/semantic_version.upb.c \ + src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.c \ + src/core/ext/upb-generated/gogoproto/gogo.upb.c \ + src/core/ext/upb-generated/google/api/annotations.upb.c \ + src/core/ext/upb-generated/google/api/http.upb.c \ + src/core/ext/upb-generated/google/protobuf/any.upb.c \ + src/core/ext/upb-generated/google/protobuf/descriptor.upb.c \ + src/core/ext/upb-generated/google/protobuf/duration.upb.c \ + src/core/ext/upb-generated/google/protobuf/empty.upb.c \ + src/core/ext/upb-generated/google/protobuf/struct.upb.c \ + src/core/ext/upb-generated/google/protobuf/timestamp.upb.c \ + src/core/ext/upb-generated/google/protobuf/wrappers.upb.c \ + src/core/ext/upb-generated/google/rpc/status.upb.c \ + src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c \ + src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c \ + src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c \ + src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c \ + src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c \ + src/core/ext/upb-generated/udpa/annotations/migrate.upb.c \ + src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c \ + src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c \ + src/core/ext/upb-generated/validate/validate.upb.c \ + src/core/lib/avl/avl.cc \ + src/core/lib/backoff/backoff.cc \ + src/core/lib/channel/channel_args.cc \ + src/core/lib/channel/channel_stack.cc \ + src/core/lib/channel/channel_stack_builder.cc \ + src/core/lib/channel/channel_trace.cc \ + src/core/lib/channel/channelz.cc \ + src/core/lib/channel/channelz_registry.cc \ + src/core/lib/channel/connected_channel.cc \ + src/core/lib/channel/handshaker.cc \ + src/core/lib/channel/handshaker_registry.cc \ + src/core/lib/channel/status_util.cc \ + src/core/lib/compression/compression.cc \ + src/core/lib/compression/compression_args.cc \ + src/core/lib/compression/compression_internal.cc \ + src/core/lib/compression/message_compress.cc \ + src/core/lib/compression/stream_compression.cc \ + src/core/lib/compression/stream_compression_gzip.cc \ + src/core/lib/compression/stream_compression_identity.cc \ + src/core/lib/debug/stats.cc \ + src/core/lib/debug/stats_data.cc \ + src/core/lib/debug/trace.cc \ + src/core/lib/gpr/alloc.cc \ + src/core/lib/gpr/atm.cc \ + src/core/lib/gpr/cpu_iphone.cc \ + src/core/lib/gpr/cpu_linux.cc \ + src/core/lib/gpr/cpu_posix.cc \ + src/core/lib/gpr/cpu_windows.cc \ + src/core/lib/gpr/env_linux.cc \ + src/core/lib/gpr/env_posix.cc \ + src/core/lib/gpr/env_windows.cc \ + src/core/lib/gpr/log.cc \ + src/core/lib/gpr/log_android.cc \ + src/core/lib/gpr/log_linux.cc \ + src/core/lib/gpr/log_posix.cc \ + src/core/lib/gpr/log_windows.cc \ + src/core/lib/gpr/murmur_hash.cc \ + src/core/lib/gpr/string.cc \ + src/core/lib/gpr/string_posix.cc \ + src/core/lib/gpr/string_util_windows.cc \ + src/core/lib/gpr/string_windows.cc \ + src/core/lib/gpr/sync.cc \ + src/core/lib/gpr/sync_abseil.cc \ + src/core/lib/gpr/sync_posix.cc \ + src/core/lib/gpr/sync_windows.cc \ + src/core/lib/gpr/time.cc \ + src/core/lib/gpr/time_posix.cc \ + src/core/lib/gpr/time_precise.cc \ + src/core/lib/gpr/time_windows.cc \ + src/core/lib/gpr/tls_pthread.cc \ + src/core/lib/gpr/tmpfile_msys.cc \ + src/core/lib/gpr/tmpfile_posix.cc \ + src/core/lib/gpr/tmpfile_windows.cc \ + src/core/lib/gpr/wrap_memcpy.cc \ + src/core/lib/gprpp/arena.cc \ + src/core/lib/gprpp/fork.cc \ + src/core/lib/gprpp/global_config_env.cc \ + src/core/lib/gprpp/host_port.cc \ + src/core/lib/gprpp/mpscq.cc \ + src/core/lib/gprpp/thd_posix.cc \ + src/core/lib/gprpp/thd_windows.cc \ + src/core/lib/http/format_request.cc \ + src/core/lib/http/httpcli.cc \ + src/core/lib/http/httpcli_security_connector.cc \ + src/core/lib/http/parser.cc \ + src/core/lib/iomgr/buffer_list.cc \ + src/core/lib/iomgr/call_combiner.cc \ + src/core/lib/iomgr/cfstream_handle.cc \ + src/core/lib/iomgr/combiner.cc \ + src/core/lib/iomgr/dualstack_socket_posix.cc \ + src/core/lib/iomgr/endpoint.cc \ + src/core/lib/iomgr/endpoint_cfstream.cc \ + src/core/lib/iomgr/endpoint_pair_posix.cc \ + src/core/lib/iomgr/endpoint_pair_uv.cc \ + src/core/lib/iomgr/endpoint_pair_windows.cc \ + src/core/lib/iomgr/error.cc \ + src/core/lib/iomgr/error_cfstream.cc \ + src/core/lib/iomgr/ev_epoll1_linux.cc \ + src/core/lib/iomgr/ev_epollex_linux.cc \ + src/core/lib/iomgr/ev_poll_posix.cc \ + src/core/lib/iomgr/ev_posix.cc \ + src/core/lib/iomgr/ev_windows.cc \ + src/core/lib/iomgr/exec_ctx.cc \ + src/core/lib/iomgr/executor.cc \ + src/core/lib/iomgr/executor/mpmcqueue.cc \ + src/core/lib/iomgr/executor/threadpool.cc \ + src/core/lib/iomgr/fork_posix.cc \ + src/core/lib/iomgr/fork_windows.cc \ + src/core/lib/iomgr/gethostname_fallback.cc \ + src/core/lib/iomgr/gethostname_host_name_max.cc \ + src/core/lib/iomgr/gethostname_sysconf.cc \ + src/core/lib/iomgr/grpc_if_nametoindex_posix.cc \ + src/core/lib/iomgr/grpc_if_nametoindex_unsupported.cc \ + src/core/lib/iomgr/internal_errqueue.cc \ + src/core/lib/iomgr/iocp_windows.cc \ + src/core/lib/iomgr/iomgr.cc \ + src/core/lib/iomgr/iomgr_custom.cc \ + src/core/lib/iomgr/iomgr_internal.cc \ + src/core/lib/iomgr/iomgr_posix.cc \ + src/core/lib/iomgr/iomgr_posix_cfstream.cc \ + src/core/lib/iomgr/iomgr_uv.cc \ + src/core/lib/iomgr/iomgr_windows.cc \ + src/core/lib/iomgr/is_epollexclusive_available.cc \ + src/core/lib/iomgr/load_file.cc \ + src/core/lib/iomgr/lockfree_event.cc \ + src/core/lib/iomgr/poller/eventmanager_libuv.cc \ + src/core/lib/iomgr/polling_entity.cc \ + src/core/lib/iomgr/pollset.cc \ + src/core/lib/iomgr/pollset_custom.cc \ + src/core/lib/iomgr/pollset_set.cc \ + src/core/lib/iomgr/pollset_set_custom.cc \ + src/core/lib/iomgr/pollset_set_windows.cc \ + src/core/lib/iomgr/pollset_uv.cc \ + src/core/lib/iomgr/pollset_windows.cc \ + src/core/lib/iomgr/resolve_address.cc \ + src/core/lib/iomgr/resolve_address_custom.cc \ + src/core/lib/iomgr/resolve_address_posix.cc \ + src/core/lib/iomgr/resolve_address_windows.cc \ + src/core/lib/iomgr/resource_quota.cc \ + src/core/lib/iomgr/sockaddr_utils.cc \ + src/core/lib/iomgr/socket_factory_posix.cc \ + src/core/lib/iomgr/socket_mutator.cc \ + src/core/lib/iomgr/socket_utils_common_posix.cc \ + src/core/lib/iomgr/socket_utils_linux.cc \ + src/core/lib/iomgr/socket_utils_posix.cc \ + src/core/lib/iomgr/socket_utils_uv.cc \ + src/core/lib/iomgr/socket_utils_windows.cc \ + src/core/lib/iomgr/socket_windows.cc \ + src/core/lib/iomgr/tcp_client.cc \ + src/core/lib/iomgr/tcp_client_cfstream.cc \ + src/core/lib/iomgr/tcp_client_custom.cc \ + src/core/lib/iomgr/tcp_client_posix.cc \ + src/core/lib/iomgr/tcp_client_windows.cc \ + src/core/lib/iomgr/tcp_custom.cc \ + src/core/lib/iomgr/tcp_posix.cc \ + src/core/lib/iomgr/tcp_server.cc \ + src/core/lib/iomgr/tcp_server_custom.cc \ + src/core/lib/iomgr/tcp_server_posix.cc \ + src/core/lib/iomgr/tcp_server_utils_posix_common.cc \ + src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc \ + src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.cc \ + src/core/lib/iomgr/tcp_server_windows.cc \ + src/core/lib/iomgr/tcp_uv.cc \ + src/core/lib/iomgr/tcp_windows.cc \ + src/core/lib/iomgr/time_averaged_stats.cc \ + src/core/lib/iomgr/timer.cc \ + src/core/lib/iomgr/timer_custom.cc \ + src/core/lib/iomgr/timer_generic.cc \ + src/core/lib/iomgr/timer_heap.cc \ + src/core/lib/iomgr/timer_manager.cc \ + src/core/lib/iomgr/timer_uv.cc \ + src/core/lib/iomgr/udp_server.cc \ + src/core/lib/iomgr/unix_sockets_posix.cc \ + src/core/lib/iomgr/unix_sockets_posix_noop.cc \ + src/core/lib/iomgr/wakeup_fd_eventfd.cc \ + src/core/lib/iomgr/wakeup_fd_nospecial.cc \ + src/core/lib/iomgr/wakeup_fd_pipe.cc \ + src/core/lib/iomgr/wakeup_fd_posix.cc \ + src/core/lib/iomgr/work_serializer.cc \ + src/core/lib/json/json_reader.cc \ + src/core/lib/json/json_writer.cc \ + src/core/lib/profiling/basic_timers.cc \ + src/core/lib/profiling/stap_timers.cc \ + src/core/lib/security/context/security_context.cc \ + src/core/lib/security/credentials/alts/alts_credentials.cc \ + src/core/lib/security/credentials/alts/check_gcp_environment.cc \ + src/core/lib/security/credentials/alts/check_gcp_environment_linux.cc \ + src/core/lib/security/credentials/alts/check_gcp_environment_no_op.cc \ + src/core/lib/security/credentials/alts/check_gcp_environment_windows.cc \ + src/core/lib/security/credentials/alts/grpc_alts_credentials_client_options.cc \ + src/core/lib/security/credentials/alts/grpc_alts_credentials_options.cc \ + src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc \ + src/core/lib/security/credentials/composite/composite_credentials.cc \ + src/core/lib/security/credentials/credentials.cc \ + src/core/lib/security/credentials/credentials_metadata.cc \ + src/core/lib/security/credentials/fake/fake_credentials.cc \ + src/core/lib/security/credentials/google_default/credentials_generic.cc \ + src/core/lib/security/credentials/google_default/google_default_credentials.cc \ + src/core/lib/security/credentials/iam/iam_credentials.cc \ + src/core/lib/security/credentials/jwt/json_token.cc \ + src/core/lib/security/credentials/jwt/jwt_credentials.cc \ + src/core/lib/security/credentials/jwt/jwt_verifier.cc \ + src/core/lib/security/credentials/local/local_credentials.cc \ + src/core/lib/security/credentials/oauth2/oauth2_credentials.cc \ + src/core/lib/security/credentials/plugin/plugin_credentials.cc \ + src/core/lib/security/credentials/ssl/ssl_credentials.cc \ + src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc \ + src/core/lib/security/credentials/tls/tls_credentials.cc \ + src/core/lib/security/security_connector/alts/alts_security_connector.cc \ + src/core/lib/security/security_connector/fake/fake_security_connector.cc \ + src/core/lib/security/security_connector/load_system_roots_fallback.cc \ + src/core/lib/security/security_connector/load_system_roots_linux.cc \ + src/core/lib/security/security_connector/local/local_security_connector.cc \ + src/core/lib/security/security_connector/security_connector.cc \ + src/core/lib/security/security_connector/ssl/ssl_security_connector.cc \ + src/core/lib/security/security_connector/ssl_utils.cc \ + src/core/lib/security/security_connector/ssl_utils_config.cc \ + src/core/lib/security/security_connector/tls/tls_security_connector.cc \ + src/core/lib/security/transport/client_auth_filter.cc \ + src/core/lib/security/transport/secure_endpoint.cc \ + src/core/lib/security/transport/security_handshaker.cc \ + src/core/lib/security/transport/server_auth_filter.cc \ + src/core/lib/security/transport/target_authority_table.cc \ + src/core/lib/security/transport/tsi_error.cc \ + src/core/lib/security/util/json_util.cc \ + src/core/lib/slice/b64.cc \ + src/core/lib/slice/percent_encoding.cc \ + src/core/lib/slice/slice.cc \ + src/core/lib/slice/slice_buffer.cc \ + src/core/lib/slice/slice_intern.cc \ + src/core/lib/slice/slice_string_helpers.cc \ + src/core/lib/surface/api_trace.cc \ + src/core/lib/surface/byte_buffer.cc \ + src/core/lib/surface/byte_buffer_reader.cc \ + src/core/lib/surface/call.cc \ + src/core/lib/surface/call_details.cc \ + src/core/lib/surface/call_log_batch.cc \ + src/core/lib/surface/channel.cc \ + src/core/lib/surface/channel_init.cc \ + src/core/lib/surface/channel_ping.cc \ + src/core/lib/surface/channel_stack_type.cc \ + src/core/lib/surface/completion_queue.cc \ + src/core/lib/surface/completion_queue_factory.cc \ + src/core/lib/surface/event_string.cc \ + src/core/lib/surface/init.cc \ + src/core/lib/surface/init_secure.cc \ + src/core/lib/surface/lame_client.cc \ + src/core/lib/surface/metadata_array.cc \ + src/core/lib/surface/server.cc \ + src/core/lib/surface/validate_metadata.cc \ + src/core/lib/surface/version.cc \ + src/core/lib/transport/bdp_estimator.cc \ + src/core/lib/transport/byte_stream.cc \ + src/core/lib/transport/connectivity_state.cc \ + src/core/lib/transport/error_utils.cc \ + src/core/lib/transport/metadata.cc \ + src/core/lib/transport/metadata_batch.cc \ + src/core/lib/transport/pid_controller.cc \ + src/core/lib/transport/static_metadata.cc \ + src/core/lib/transport/status_conversion.cc \ + src/core/lib/transport/status_metadata.cc \ + src/core/lib/transport/timeout_encoding.cc \ + src/core/lib/transport/transport.cc \ + src/core/lib/transport/transport_op_string.cc \ + src/core/lib/uri/uri_parser.cc \ + src/core/plugin_registry/grpc_plugin_registry.cc \ + src/core/tsi/alts/crypt/aes_gcm.cc \ + src/core/tsi/alts/crypt/gsec.cc \ + src/core/tsi/alts/frame_protector/alts_counter.cc \ + src/core/tsi/alts/frame_protector/alts_crypter.cc \ + src/core/tsi/alts/frame_protector/alts_frame_protector.cc \ + src/core/tsi/alts/frame_protector/alts_record_protocol_crypter_common.cc \ + src/core/tsi/alts/frame_protector/alts_seal_privacy_integrity_crypter.cc \ + src/core/tsi/alts/frame_protector/alts_unseal_privacy_integrity_crypter.cc \ + src/core/tsi/alts/frame_protector/frame_handler.cc \ + src/core/tsi/alts/handshaker/alts_handshaker_client.cc \ + src/core/tsi/alts/handshaker/alts_shared_resource.cc \ + src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc \ + src/core/tsi/alts/handshaker/alts_tsi_utils.cc \ + src/core/tsi/alts/handshaker/transport_security_common_api.cc \ + src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc \ + src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.cc \ + src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc \ + src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.cc \ + src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc \ + src/core/tsi/fake_transport_security.cc \ + src/core/tsi/local_transport_security.cc \ + src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc \ + src/core/tsi/ssl/session_cache/ssl_session_cache.cc \ + src/core/tsi/ssl/session_cache/ssl_session_openssl.cc \ + src/core/tsi/ssl_transport_security.cc \ + src/core/tsi/transport_security.cc \ + src/core/tsi/transport_security_grpc.cc \ + src/php/ext/grpc/byte_buffer.c \ + src/php/ext/grpc/call.c \ + src/php/ext/grpc/call_credentials.c \ + src/php/ext/grpc/channel.c \ + src/php/ext/grpc/channel_credentials.c \ + src/php/ext/grpc/completion_queue.c \ + src/php/ext/grpc/php_grpc.c \ + src/php/ext/grpc/server.c \ + src/php/ext/grpc/server_credentials.c \ + src/php/ext/grpc/timeval.c \ + third_party/abseil-cpp/absl/base/dynamic_annotations.cc \ + third_party/abseil-cpp/absl/base/internal/cycleclock.cc \ + third_party/abseil-cpp/absl/base/internal/raw_logging.cc \ + third_party/abseil-cpp/absl/base/internal/spinlock.cc \ + third_party/abseil-cpp/absl/base/internal/spinlock_wait.cc \ + third_party/abseil-cpp/absl/base/internal/sysinfo.cc \ + third_party/abseil-cpp/absl/base/internal/thread_identity.cc \ + third_party/abseil-cpp/absl/base/internal/throw_delegate.cc \ + third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc \ + third_party/abseil-cpp/absl/base/log_severity.cc \ + third_party/abseil-cpp/absl/numeric/int128.cc \ + third_party/abseil-cpp/absl/strings/ascii.cc \ + third_party/abseil-cpp/absl/strings/charconv.cc \ + third_party/abseil-cpp/absl/strings/escaping.cc \ + third_party/abseil-cpp/absl/strings/internal/charconv_bigint.cc \ + third_party/abseil-cpp/absl/strings/internal/charconv_parse.cc \ + third_party/abseil-cpp/absl/strings/internal/escaping.cc \ + third_party/abseil-cpp/absl/strings/internal/memutil.cc \ + third_party/abseil-cpp/absl/strings/internal/ostringstream.cc \ + third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc \ + third_party/abseil-cpp/absl/strings/internal/str_format/bind.cc \ + third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc \ + third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc \ + third_party/abseil-cpp/absl/strings/internal/str_format/output.cc \ + third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc \ + third_party/abseil-cpp/absl/strings/internal/utf8.cc \ + third_party/abseil-cpp/absl/strings/match.cc \ + third_party/abseil-cpp/absl/strings/numbers.cc \ + third_party/abseil-cpp/absl/strings/str_cat.cc \ + third_party/abseil-cpp/absl/strings/str_replace.cc \ + third_party/abseil-cpp/absl/strings/str_split.cc \ + third_party/abseil-cpp/absl/strings/string_view.cc \ + third_party/abseil-cpp/absl/strings/substitute.cc \ + third_party/abseil-cpp/absl/time/civil_time.cc \ + third_party/abseil-cpp/absl/time/clock.cc \ + third_party/abseil-cpp/absl/time/duration.cc \ + third_party/abseil-cpp/absl/time/format.cc \ + third_party/abseil-cpp/absl/time/internal/cctz/src/civil_time_detail.cc \ + third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_fixed.cc \ + third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc \ + third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_if.cc \ + third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.cc \ + third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.cc \ + third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.cc \ + third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc \ + third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_posix.cc \ + third_party/abseil-cpp/absl/time/internal/cctz/src/zone_info_source.cc \ + third_party/abseil-cpp/absl/time/time.cc \ + third_party/abseil-cpp/absl/types/bad_optional_access.cc \ + third_party/address_sorting/address_sorting.c \ + third_party/address_sorting/address_sorting_posix.c \ + third_party/address_sorting/address_sorting_windows.c \ + third_party/boringssl-with-bazel/err_data.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_bitstr.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_bool.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_d2i_fp.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_dup.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_enum.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_gentm.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_i2d_fp.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_int.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_mbstr.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_octet.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_print.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_strnid.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_time.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_type.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_utctm.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_utf8.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/asn1_par.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/asn_pack.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/f_enum.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/f_int.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/f_string.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/tasn_fre.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/tasn_new.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/tasn_typ.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/tasn_utl.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/time_support.c \ + third_party/boringssl-with-bazel/src/crypto/base64/base64.c \ + third_party/boringssl-with-bazel/src/crypto/bio/bio.c \ + third_party/boringssl-with-bazel/src/crypto/bio/bio_mem.c \ + third_party/boringssl-with-bazel/src/crypto/bio/connect.c \ + third_party/boringssl-with-bazel/src/crypto/bio/fd.c \ + third_party/boringssl-with-bazel/src/crypto/bio/file.c \ + third_party/boringssl-with-bazel/src/crypto/bio/hexdump.c \ + third_party/boringssl-with-bazel/src/crypto/bio/pair.c \ + third_party/boringssl-with-bazel/src/crypto/bio/printf.c \ + third_party/boringssl-with-bazel/src/crypto/bio/socket.c \ + third_party/boringssl-with-bazel/src/crypto/bio/socket_helper.c \ + third_party/boringssl-with-bazel/src/crypto/bn_extra/bn_asn1.c \ + third_party/boringssl-with-bazel/src/crypto/bn_extra/convert.c \ + third_party/boringssl-with-bazel/src/crypto/buf/buf.c \ + third_party/boringssl-with-bazel/src/crypto/bytestring/asn1_compat.c \ + third_party/boringssl-with-bazel/src/crypto/bytestring/ber.c \ + third_party/boringssl-with-bazel/src/crypto/bytestring/cbb.c \ + third_party/boringssl-with-bazel/src/crypto/bytestring/cbs.c \ + third_party/boringssl-with-bazel/src/crypto/bytestring/unicode.c \ + third_party/boringssl-with-bazel/src/crypto/chacha/chacha.c \ + third_party/boringssl-with-bazel/src/crypto/cipher_extra/cipher_extra.c \ + third_party/boringssl-with-bazel/src/crypto/cipher_extra/derive_key.c \ + third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_aesccm.c \ + third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_aesctrhmac.c \ + third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_aesgcmsiv.c \ + third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_chacha20poly1305.c \ + third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_null.c \ + third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_rc2.c \ + third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_rc4.c \ + third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_tls.c \ + third_party/boringssl-with-bazel/src/crypto/cipher_extra/tls_cbc.c \ + third_party/boringssl-with-bazel/src/crypto/cmac/cmac.c \ + third_party/boringssl-with-bazel/src/crypto/conf/conf.c \ + third_party/boringssl-with-bazel/src/crypto/cpu-aarch64-fuchsia.c \ + third_party/boringssl-with-bazel/src/crypto/cpu-aarch64-linux.c \ + third_party/boringssl-with-bazel/src/crypto/cpu-arm-linux.c \ + third_party/boringssl-with-bazel/src/crypto/cpu-arm.c \ + third_party/boringssl-with-bazel/src/crypto/cpu-intel.c \ + third_party/boringssl-with-bazel/src/crypto/cpu-ppc64le.c \ + third_party/boringssl-with-bazel/src/crypto/crypto.c \ + third_party/boringssl-with-bazel/src/crypto/curve25519/spake25519.c \ + third_party/boringssl-with-bazel/src/crypto/dh/check.c \ + third_party/boringssl-with-bazel/src/crypto/dh/dh.c \ + third_party/boringssl-with-bazel/src/crypto/dh/dh_asn1.c \ + third_party/boringssl-with-bazel/src/crypto/dh/params.c \ + third_party/boringssl-with-bazel/src/crypto/digest_extra/digest_extra.c \ + third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c \ + third_party/boringssl-with-bazel/src/crypto/dsa/dsa_asn1.c \ + third_party/boringssl-with-bazel/src/crypto/ec_extra/ec_asn1.c \ + third_party/boringssl-with-bazel/src/crypto/ec_extra/ec_derive.c \ + third_party/boringssl-with-bazel/src/crypto/ecdh_extra/ecdh_extra.c \ + third_party/boringssl-with-bazel/src/crypto/ecdsa_extra/ecdsa_asn1.c \ + third_party/boringssl-with-bazel/src/crypto/engine/engine.c \ + third_party/boringssl-with-bazel/src/crypto/err/err.c \ + third_party/boringssl-with-bazel/src/crypto/evp/digestsign.c \ + third_party/boringssl-with-bazel/src/crypto/evp/evp.c \ + third_party/boringssl-with-bazel/src/crypto/evp/evp_asn1.c \ + third_party/boringssl-with-bazel/src/crypto/evp/evp_ctx.c \ + third_party/boringssl-with-bazel/src/crypto/evp/p_dsa_asn1.c \ + third_party/boringssl-with-bazel/src/crypto/evp/p_ec.c \ + third_party/boringssl-with-bazel/src/crypto/evp/p_ec_asn1.c \ + third_party/boringssl-with-bazel/src/crypto/evp/p_ed25519.c \ + third_party/boringssl-with-bazel/src/crypto/evp/p_ed25519_asn1.c \ + third_party/boringssl-with-bazel/src/crypto/evp/p_rsa.c \ + third_party/boringssl-with-bazel/src/crypto/evp/p_rsa_asn1.c \ + third_party/boringssl-with-bazel/src/crypto/evp/p_x25519.c \ + third_party/boringssl-with-bazel/src/crypto/evp/p_x25519_asn1.c \ + third_party/boringssl-with-bazel/src/crypto/evp/pbkdf.c \ + third_party/boringssl-with-bazel/src/crypto/evp/print.c \ + third_party/boringssl-with-bazel/src/crypto/evp/scrypt.c \ + third_party/boringssl-with-bazel/src/crypto/evp/sign.c \ + third_party/boringssl-with-bazel/src/crypto/ex_data.c \ + third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c \ + third_party/boringssl-with-bazel/src/crypto/fipsmodule/fips_shared_support.c \ + third_party/boringssl-with-bazel/src/crypto/fipsmodule/is_fips.c \ + third_party/boringssl-with-bazel/src/crypto/hkdf/hkdf.c \ + third_party/boringssl-with-bazel/src/crypto/hrss/hrss.c \ + third_party/boringssl-with-bazel/src/crypto/lhash/lhash.c \ + third_party/boringssl-with-bazel/src/crypto/mem.c \ + third_party/boringssl-with-bazel/src/crypto/obj/obj.c \ + third_party/boringssl-with-bazel/src/crypto/obj/obj_xref.c \ + third_party/boringssl-with-bazel/src/crypto/pem/pem_all.c \ + third_party/boringssl-with-bazel/src/crypto/pem/pem_info.c \ + third_party/boringssl-with-bazel/src/crypto/pem/pem_lib.c \ + third_party/boringssl-with-bazel/src/crypto/pem/pem_oth.c \ + third_party/boringssl-with-bazel/src/crypto/pem/pem_pk8.c \ + third_party/boringssl-with-bazel/src/crypto/pem/pem_pkey.c \ + third_party/boringssl-with-bazel/src/crypto/pem/pem_x509.c \ + third_party/boringssl-with-bazel/src/crypto/pem/pem_xaux.c \ + third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7.c \ + third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7_x509.c \ + third_party/boringssl-with-bazel/src/crypto/pkcs8/p5_pbev2.c \ + third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8.c \ + third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c \ + third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305.c \ + third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_arm.c \ + third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_vec.c \ + third_party/boringssl-with-bazel/src/crypto/pool/pool.c \ + third_party/boringssl-with-bazel/src/crypto/rand_extra/deterministic.c \ + third_party/boringssl-with-bazel/src/crypto/rand_extra/forkunsafe.c \ + third_party/boringssl-with-bazel/src/crypto/rand_extra/fuchsia.c \ + third_party/boringssl-with-bazel/src/crypto/rand_extra/rand_extra.c \ + third_party/boringssl-with-bazel/src/crypto/rand_extra/windows.c \ + third_party/boringssl-with-bazel/src/crypto/rc4/rc4.c \ + third_party/boringssl-with-bazel/src/crypto/refcount_c11.c \ + third_party/boringssl-with-bazel/src/crypto/refcount_lock.c \ + third_party/boringssl-with-bazel/src/crypto/rsa_extra/rsa_asn1.c \ + third_party/boringssl-with-bazel/src/crypto/rsa_extra/rsa_print.c \ + third_party/boringssl-with-bazel/src/crypto/siphash/siphash.c \ + third_party/boringssl-with-bazel/src/crypto/stack/stack.c \ + third_party/boringssl-with-bazel/src/crypto/thread.c \ + third_party/boringssl-with-bazel/src/crypto/thread_none.c \ + third_party/boringssl-with-bazel/src/crypto/thread_pthread.c \ + third_party/boringssl-with-bazel/src/crypto/thread_win.c \ + third_party/boringssl-with-bazel/src/crypto/x509/a_digest.c \ + third_party/boringssl-with-bazel/src/crypto/x509/a_sign.c \ + third_party/boringssl-with-bazel/src/crypto/x509/a_strex.c \ + third_party/boringssl-with-bazel/src/crypto/x509/a_verify.c \ + third_party/boringssl-with-bazel/src/crypto/x509/algorithm.c \ + third_party/boringssl-with-bazel/src/crypto/x509/asn1_gen.c \ + third_party/boringssl-with-bazel/src/crypto/x509/by_dir.c \ + third_party/boringssl-with-bazel/src/crypto/x509/by_file.c \ + third_party/boringssl-with-bazel/src/crypto/x509/i2d_pr.c \ + third_party/boringssl-with-bazel/src/crypto/x509/rsa_pss.c \ + third_party/boringssl-with-bazel/src/crypto/x509/t_crl.c \ + third_party/boringssl-with-bazel/src/crypto/x509/t_req.c \ + third_party/boringssl-with-bazel/src/crypto/x509/t_x509.c \ + third_party/boringssl-with-bazel/src/crypto/x509/t_x509a.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_att.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_d2.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_def.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_ext.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_lu.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_obj.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_r2x.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_req.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_trs.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_txt.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_v3.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_vpm.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509cset.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509name.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509rset.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x509spki.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x_algor.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x_all.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x_attrib.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x_exten.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x_info.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x_name.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x_pkey.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x_pubkey.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x_req.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x_sig.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x_spki.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x_val.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c \ + third_party/boringssl-with-bazel/src/crypto/x509/x_x509a.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_cache.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_data.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_lib.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_map.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_node.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_tree.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_akey.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_akeya.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_alt.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_bcons.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_bitst.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_conf.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_crld.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_enum.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_extku.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_genn.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ia5.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_info.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_int.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_lib.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ncons.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ocsp.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pci.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pcia.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pcons.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pku.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pmaps.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_prn.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_skey.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_sxnet.c \ + third_party/boringssl-with-bazel/src/crypto/x509v3/v3_utl.c \ + third_party/boringssl-with-bazel/src/ssl/bio_ssl.cc \ + third_party/boringssl-with-bazel/src/ssl/d1_both.cc \ + third_party/boringssl-with-bazel/src/ssl/d1_lib.cc \ + third_party/boringssl-with-bazel/src/ssl/d1_pkt.cc \ + third_party/boringssl-with-bazel/src/ssl/d1_srtp.cc \ + third_party/boringssl-with-bazel/src/ssl/dtls_method.cc \ + third_party/boringssl-with-bazel/src/ssl/dtls_record.cc \ + third_party/boringssl-with-bazel/src/ssl/handoff.cc \ + third_party/boringssl-with-bazel/src/ssl/handshake.cc \ + third_party/boringssl-with-bazel/src/ssl/handshake_client.cc \ + third_party/boringssl-with-bazel/src/ssl/handshake_server.cc \ + third_party/boringssl-with-bazel/src/ssl/s3_both.cc \ + third_party/boringssl-with-bazel/src/ssl/s3_lib.cc \ + third_party/boringssl-with-bazel/src/ssl/s3_pkt.cc \ + third_party/boringssl-with-bazel/src/ssl/ssl_aead_ctx.cc \ + third_party/boringssl-with-bazel/src/ssl/ssl_asn1.cc \ + third_party/boringssl-with-bazel/src/ssl/ssl_buffer.cc \ + third_party/boringssl-with-bazel/src/ssl/ssl_cert.cc \ + third_party/boringssl-with-bazel/src/ssl/ssl_cipher.cc \ + third_party/boringssl-with-bazel/src/ssl/ssl_file.cc \ + third_party/boringssl-with-bazel/src/ssl/ssl_key_share.cc \ + third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc \ + third_party/boringssl-with-bazel/src/ssl/ssl_privkey.cc \ + third_party/boringssl-with-bazel/src/ssl/ssl_session.cc \ + third_party/boringssl-with-bazel/src/ssl/ssl_stat.cc \ + third_party/boringssl-with-bazel/src/ssl/ssl_transcript.cc \ + third_party/boringssl-with-bazel/src/ssl/ssl_versions.cc \ + third_party/boringssl-with-bazel/src/ssl/ssl_x509.cc \ + third_party/boringssl-with-bazel/src/ssl/t1_enc.cc \ + third_party/boringssl-with-bazel/src/ssl/t1_lib.cc \ + third_party/boringssl-with-bazel/src/ssl/tls13_both.cc \ + third_party/boringssl-with-bazel/src/ssl/tls13_client.cc \ + third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc \ + third_party/boringssl-with-bazel/src/ssl/tls13_server.cc \ + third_party/boringssl-with-bazel/src/ssl/tls_method.cc \ + third_party/boringssl-with-bazel/src/ssl/tls_record.cc \ + third_party/boringssl-with-bazel/src/third_party/fiat/curve25519.c \ + third_party/upb/upb/decode.c \ + third_party/upb/upb/encode.c \ + third_party/upb/upb/msg.c \ + third_party/upb/upb/port.c \ + third_party/upb/upb/table.c \ + third_party/upb/upb/upb.c \ + , $ext_shared, , -fvisibility=hidden \ + -DOPENSSL_NO_ASM -D_GNU_SOURCE -DWIN32_LEAN_AND_MEAN \ + -D_HAS_EXCEPTIONS=0 -DNOMINMAX -DGRPC_ARES=0 \ + -DGRPC_POSIX_FORK_ALLOW_PTHREAD_ATFORK=1) + + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/census) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel/health) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel/lb_policy) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel/lb_policy/grpclb) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel/lb_policy/pick_first) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel/lb_policy/priority) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel/lb_policy/round_robin) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel/lb_policy/weighted_target) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel/lb_policy/xds) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel/resolver/dns) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel/resolver/dns/c_ares) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel/resolver/dns/native) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel/resolver/fake) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel/resolver/sockaddr) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel/resolver/xds) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_channel/xds) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/client_idle) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/deadline) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/http) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/http/client) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/http/message_compress) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/http/server) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/max_age) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/message_size) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/workarounds) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/transport/chttp2/alpn) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/transport/chttp2/client) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/transport/chttp2/client/insecure) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/transport/chttp2/client/secure) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/transport/chttp2/server) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/transport/chttp2/server/insecure) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/transport/chttp2/server/secure) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/transport/chttp2/transport) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/transport/inproc) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/annotations) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/api/v2) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/api/v2/auth) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/api/v2/cluster) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/api/v2/core) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/api/v2/endpoint) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/api/v2/listener) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/api/v2/route) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/config/filter/accesslog/v2) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/config/listener/v2) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/service/discovery/v2) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/service/load_stats/v2) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/type) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/type/matcher) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/type/metadata/v2) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/type/tracing/v2) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/gogoproto) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/google/api) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/google/protobuf) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/google/rpc) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/src/proto/grpc/gcp) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/src/proto/grpc/health/v1) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/src/proto/grpc/lb/v1) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/udpa/annotations) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/udpa/data/orca/v1) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/validate) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/avl) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/backoff) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/channel) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/compression) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/debug) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/gpr) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/gprpp) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/http) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/iomgr) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/iomgr/executor) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/iomgr/poller) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/json) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/profiling) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/context) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/credentials) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/credentials/alts) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/credentials/composite) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/credentials/fake) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/credentials/google_default) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/credentials/iam) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/credentials/jwt) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/credentials/local) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/credentials/oauth2) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/credentials/plugin) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/credentials/ssl) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/credentials/tls) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/security_connector) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/security_connector/alts) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/security_connector/fake) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/security_connector/local) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/security_connector/ssl) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/security_connector/tls) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/transport) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/util) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/slice) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/surface) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/transport) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/uri) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/plugin_registry) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/tsi) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/tsi/alts/crypt) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/tsi/alts/frame_protector) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/tsi/alts/handshaker) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/tsi/alts/zero_copy_frame_protector) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/tsi/ssl/session_cache) + PHP_ADD_BUILD_DIR($ext_builddir/src/php/ext/grpc) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/abseil-cpp/absl/base) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/abseil-cpp/absl/base/internal) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/abseil-cpp/absl/numeric) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/abseil-cpp/absl/strings) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/abseil-cpp/absl/strings/internal) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/abseil-cpp/absl/strings/internal/str_format) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/abseil-cpp/absl/time) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/abseil-cpp/absl/time/internal/cctz/src) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/abseil-cpp/absl/types) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/address_sorting) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/asn1) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/base64) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/bio) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/bn_extra) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/buf) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/bytestring) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/chacha) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/cipher_extra) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/cmac) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/conf) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/curve25519) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/dh) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/digest_extra) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/dsa) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/ec_extra) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/ecdh_extra) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/ecdsa_extra) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/engine) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/err) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/evp) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/fipsmodule) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/hkdf) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/hrss) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/lhash) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/obj) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/pem) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/pkcs7) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/pkcs8) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/poly1305) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/pool) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/rand_extra) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/rc4) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/rsa_extra) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/siphash) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/stack) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/x509) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/x509v3) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/ssl) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/third_party/fiat) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/upb/upb) +fi diff --git a/config.w32 b/config.w32 index 8e5ff6d2f1a..59cdbdb1ce4 100644 --- a/config.w32 +++ b/config.w32 @@ -4,3 +4,1027 @@ ARG_WITH("grpc", "grpc support", "no"); if (PHP_GRPC != "no") { + + EXTENSION("grpc", + "src\\core\\ext\\filters\\census\\grpc_context.cc " + + "src\\core\\ext\\filters\\client_channel\\backend_metric.cc " + + "src\\core\\ext\\filters\\client_channel\\backup_poller.cc " + + "src\\core\\ext\\filters\\client_channel\\channel_connectivity.cc " + + "src\\core\\ext\\filters\\client_channel\\client_channel.cc " + + "src\\core\\ext\\filters\\client_channel\\client_channel_channelz.cc " + + "src\\core\\ext\\filters\\client_channel\\client_channel_factory.cc " + + "src\\core\\ext\\filters\\client_channel\\client_channel_plugin.cc " + + "src\\core\\ext\\filters\\client_channel\\global_subchannel_pool.cc " + + "src\\core\\ext\\filters\\client_channel\\health\\health_check_client.cc " + + "src\\core\\ext\\filters\\client_channel\\http_connect_handshaker.cc " + + "src\\core\\ext\\filters\\client_channel\\http_proxy.cc " + + "src\\core\\ext\\filters\\client_channel\\lb_policy.cc " + + "src\\core\\ext\\filters\\client_channel\\lb_policy\\address_filtering.cc " + + "src\\core\\ext\\filters\\client_channel\\lb_policy\\child_policy_handler.cc " + + "src\\core\\ext\\filters\\client_channel\\lb_policy\\grpclb\\client_load_reporting_filter.cc " + + "src\\core\\ext\\filters\\client_channel\\lb_policy\\grpclb\\grpclb.cc " + + "src\\core\\ext\\filters\\client_channel\\lb_policy\\grpclb\\grpclb_balancer_addresses.cc " + + "src\\core\\ext\\filters\\client_channel\\lb_policy\\grpclb\\grpclb_channel_secure.cc " + + "src\\core\\ext\\filters\\client_channel\\lb_policy\\grpclb\\grpclb_client_stats.cc " + + "src\\core\\ext\\filters\\client_channel\\lb_policy\\grpclb\\load_balancer_api.cc " + + "src\\core\\ext\\filters\\client_channel\\lb_policy\\pick_first\\pick_first.cc " + + "src\\core\\ext\\filters\\client_channel\\lb_policy\\priority\\priority.cc " + + "src\\core\\ext\\filters\\client_channel\\lb_policy\\round_robin\\round_robin.cc " + + "src\\core\\ext\\filters\\client_channel\\lb_policy\\weighted_target\\weighted_target.cc " + + "src\\core\\ext\\filters\\client_channel\\lb_policy\\xds\\cds.cc " + + "src\\core\\ext\\filters\\client_channel\\lb_policy\\xds\\eds.cc " + + "src\\core\\ext\\filters\\client_channel\\lb_policy\\xds\\lrs.cc " + + "src\\core\\ext\\filters\\client_channel\\lb_policy_registry.cc " + + "src\\core\\ext\\filters\\client_channel\\local_subchannel_pool.cc " + + "src\\core\\ext\\filters\\client_channel\\parse_address.cc " + + "src\\core\\ext\\filters\\client_channel\\proxy_mapper_registry.cc " + + "src\\core\\ext\\filters\\client_channel\\resolver.cc " + + "src\\core\\ext\\filters\\client_channel\\resolver\\dns\\c_ares\\dns_resolver_ares.cc " + + "src\\core\\ext\\filters\\client_channel\\resolver\\dns\\c_ares\\grpc_ares_ev_driver.cc " + + "src\\core\\ext\\filters\\client_channel\\resolver\\dns\\c_ares\\grpc_ares_ev_driver_libuv.cc " + + "src\\core\\ext\\filters\\client_channel\\resolver\\dns\\c_ares\\grpc_ares_ev_driver_posix.cc " + + "src\\core\\ext\\filters\\client_channel\\resolver\\dns\\c_ares\\grpc_ares_ev_driver_windows.cc " + + "src\\core\\ext\\filters\\client_channel\\resolver\\dns\\c_ares\\grpc_ares_wrapper.cc " + + "src\\core\\ext\\filters\\client_channel\\resolver\\dns\\c_ares\\grpc_ares_wrapper_fallback.cc " + + "src\\core\\ext\\filters\\client_channel\\resolver\\dns\\c_ares\\grpc_ares_wrapper_libuv.cc " + + "src\\core\\ext\\filters\\client_channel\\resolver\\dns\\c_ares\\grpc_ares_wrapper_posix.cc " + + "src\\core\\ext\\filters\\client_channel\\resolver\\dns\\c_ares\\grpc_ares_wrapper_windows.cc " + + "src\\core\\ext\\filters\\client_channel\\resolver\\dns\\dns_resolver_selection.cc " + + "src\\core\\ext\\filters\\client_channel\\resolver\\dns\\native\\dns_resolver.cc " + + "src\\core\\ext\\filters\\client_channel\\resolver\\fake\\fake_resolver.cc " + + "src\\core\\ext\\filters\\client_channel\\resolver\\sockaddr\\sockaddr_resolver.cc " + + "src\\core\\ext\\filters\\client_channel\\resolver\\xds\\xds_resolver.cc " + + "src\\core\\ext\\filters\\client_channel\\resolver_registry.cc " + + "src\\core\\ext\\filters\\client_channel\\resolver_result_parsing.cc " + + "src\\core\\ext\\filters\\client_channel\\resolving_lb_policy.cc " + + "src\\core\\ext\\filters\\client_channel\\retry_throttle.cc " + + "src\\core\\ext\\filters\\client_channel\\server_address.cc " + + "src\\core\\ext\\filters\\client_channel\\service_config.cc " + + "src\\core\\ext\\filters\\client_channel\\subchannel.cc " + + "src\\core\\ext\\filters\\client_channel\\subchannel_pool_interface.cc " + + "src\\core\\ext\\filters\\client_channel\\xds\\xds_api.cc " + + "src\\core\\ext\\filters\\client_channel\\xds\\xds_bootstrap.cc " + + "src\\core\\ext\\filters\\client_channel\\xds\\xds_channel_secure.cc " + + "src\\core\\ext\\filters\\client_channel\\xds\\xds_client.cc " + + "src\\core\\ext\\filters\\client_channel\\xds\\xds_client_stats.cc " + + "src\\core\\ext\\filters\\client_idle\\client_idle_filter.cc " + + "src\\core\\ext\\filters\\deadline\\deadline_filter.cc " + + "src\\core\\ext\\filters\\http\\client\\http_client_filter.cc " + + "src\\core\\ext\\filters\\http\\client_authority_filter.cc " + + "src\\core\\ext\\filters\\http\\http_filters_plugin.cc " + + "src\\core\\ext\\filters\\http\\message_compress\\message_compress_filter.cc " + + "src\\core\\ext\\filters\\http\\server\\http_server_filter.cc " + + "src\\core\\ext\\filters\\max_age\\max_age_filter.cc " + + "src\\core\\ext\\filters\\message_size\\message_size_filter.cc " + + "src\\core\\ext\\filters\\workarounds\\workaround_cronet_compression_filter.cc " + + "src\\core\\ext\\filters\\workarounds\\workaround_utils.cc " + + "src\\core\\ext\\transport\\chttp2\\alpn\\alpn.cc " + + "src\\core\\ext\\transport\\chttp2\\client\\authority.cc " + + "src\\core\\ext\\transport\\chttp2\\client\\chttp2_connector.cc " + + "src\\core\\ext\\transport\\chttp2\\client\\insecure\\channel_create.cc " + + "src\\core\\ext\\transport\\chttp2\\client\\insecure\\channel_create_posix.cc " + + "src\\core\\ext\\transport\\chttp2\\client\\secure\\secure_channel_create.cc " + + "src\\core\\ext\\transport\\chttp2\\server\\chttp2_server.cc " + + "src\\core\\ext\\transport\\chttp2\\server\\insecure\\server_chttp2.cc " + + "src\\core\\ext\\transport\\chttp2\\server\\insecure\\server_chttp2_posix.cc " + + "src\\core\\ext\\transport\\chttp2\\server\\secure\\server_secure_chttp2.cc " + + "src\\core\\ext\\transport\\chttp2\\transport\\bin_decoder.cc " + + "src\\core\\ext\\transport\\chttp2\\transport\\bin_encoder.cc " + + "src\\core\\ext\\transport\\chttp2\\transport\\chttp2_plugin.cc " + + "src\\core\\ext\\transport\\chttp2\\transport\\chttp2_transport.cc " + + "src\\core\\ext\\transport\\chttp2\\transport\\context_list.cc " + + "src\\core\\ext\\transport\\chttp2\\transport\\flow_control.cc " + + "src\\core\\ext\\transport\\chttp2\\transport\\frame_data.cc " + + "src\\core\\ext\\transport\\chttp2\\transport\\frame_goaway.cc " + + "src\\core\\ext\\transport\\chttp2\\transport\\frame_ping.cc " + + "src\\core\\ext\\transport\\chttp2\\transport\\frame_rst_stream.cc " + + "src\\core\\ext\\transport\\chttp2\\transport\\frame_settings.cc " + + "src\\core\\ext\\transport\\chttp2\\transport\\frame_window_update.cc " + + "src\\core\\ext\\transport\\chttp2\\transport\\hpack_encoder.cc " + + "src\\core\\ext\\transport\\chttp2\\transport\\hpack_parser.cc " + + "src\\core\\ext\\transport\\chttp2\\transport\\hpack_table.cc " + + "src\\core\\ext\\transport\\chttp2\\transport\\http2_settings.cc " + + "src\\core\\ext\\transport\\chttp2\\transport\\huffsyms.cc " + + "src\\core\\ext\\transport\\chttp2\\transport\\incoming_metadata.cc " + + "src\\core\\ext\\transport\\chttp2\\transport\\parsing.cc " + + "src\\core\\ext\\transport\\chttp2\\transport\\stream_lists.cc " + + "src\\core\\ext\\transport\\chttp2\\transport\\stream_map.cc " + + "src\\core\\ext\\transport\\chttp2\\transport\\varint.cc " + + "src\\core\\ext\\transport\\chttp2\\transport\\writing.cc " + + "src\\core\\ext\\transport\\inproc\\inproc_plugin.cc " + + "src\\core\\ext\\transport\\inproc\\inproc_transport.cc " + + "src\\core\\ext\\upb-generated\\envoy\\annotations\\deprecation.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\annotations\\resource.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\auth\\cert.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\cds.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\cluster.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\cluster\\circuit_breaker.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\cluster\\filter.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\cluster\\outlier_detection.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\core\\address.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\core\\base.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\core\\config_source.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\core\\grpc_service.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\core\\health_check.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\core\\http_uri.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\core\\protocol.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\discovery.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\eds.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\endpoint.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\endpoint\\endpoint.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\endpoint\\endpoint_components.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\endpoint\\load_report.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\lds.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\listener.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\listener\\listener.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\listener\\listener_components.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\listener\\udp_listener_config.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\rds.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\route.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\route\\route.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\route\\route_components.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\scoped_route.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\srds.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\config\\filter\\accesslog\\v2\\accesslog.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\config\\filter\\network\\http_connection_manager\\v2\\http_connection_manager.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\config\\listener\\v2\\api_listener.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\service\\discovery\\v2\\ads.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\service\\load_stats\\v2\\lrs.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\type\\http.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\type\\matcher\\regex.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\type\\matcher\\string.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\type\\metadata\\v2\\metadata.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\type\\percent.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\type\\range.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\type\\semantic_version.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\type\\tracing\\v2\\custom_tag.upb.c " + + "src\\core\\ext\\upb-generated\\gogoproto\\gogo.upb.c " + + "src\\core\\ext\\upb-generated\\google\\api\\annotations.upb.c " + + "src\\core\\ext\\upb-generated\\google\\api\\http.upb.c " + + "src\\core\\ext\\upb-generated\\google\\protobuf\\any.upb.c " + + "src\\core\\ext\\upb-generated\\google\\protobuf\\descriptor.upb.c " + + "src\\core\\ext\\upb-generated\\google\\protobuf\\duration.upb.c " + + "src\\core\\ext\\upb-generated\\google\\protobuf\\empty.upb.c " + + "src\\core\\ext\\upb-generated\\google\\protobuf\\struct.upb.c " + + "src\\core\\ext\\upb-generated\\google\\protobuf\\timestamp.upb.c " + + "src\\core\\ext\\upb-generated\\google\\protobuf\\wrappers.upb.c " + + "src\\core\\ext\\upb-generated\\google\\rpc\\status.upb.c " + + "src\\core\\ext\\upb-generated\\src\\proto\\grpc\\gcp\\altscontext.upb.c " + + "src\\core\\ext\\upb-generated\\src\\proto\\grpc\\gcp\\handshaker.upb.c " + + "src\\core\\ext\\upb-generated\\src\\proto\\grpc\\gcp\\transport_security_common.upb.c " + + "src\\core\\ext\\upb-generated\\src\\proto\\grpc\\health\\v1\\health.upb.c " + + "src\\core\\ext\\upb-generated\\src\\proto\\grpc\\lb\\v1\\load_balancer.upb.c " + + "src\\core\\ext\\upb-generated\\udpa\\annotations\\migrate.upb.c " + + "src\\core\\ext\\upb-generated\\udpa\\annotations\\sensitive.upb.c " + + "src\\core\\ext\\upb-generated\\udpa\\data\\orca\\v1\\orca_load_report.upb.c " + + "src\\core\\ext\\upb-generated\\validate\\validate.upb.c " + + "src\\core\\lib\\avl\\avl.cc " + + "src\\core\\lib\\backoff\\backoff.cc " + + "src\\core\\lib\\channel\\channel_args.cc " + + "src\\core\\lib\\channel\\channel_stack.cc " + + "src\\core\\lib\\channel\\channel_stack_builder.cc " + + "src\\core\\lib\\channel\\channel_trace.cc " + + "src\\core\\lib\\channel\\channelz.cc " + + "src\\core\\lib\\channel\\channelz_registry.cc " + + "src\\core\\lib\\channel\\connected_channel.cc " + + "src\\core\\lib\\channel\\handshaker.cc " + + "src\\core\\lib\\channel\\handshaker_registry.cc " + + "src\\core\\lib\\channel\\status_util.cc " + + "src\\core\\lib\\compression\\compression.cc " + + "src\\core\\lib\\compression\\compression_args.cc " + + "src\\core\\lib\\compression\\compression_internal.cc " + + "src\\core\\lib\\compression\\message_compress.cc " + + "src\\core\\lib\\compression\\stream_compression.cc " + + "src\\core\\lib\\compression\\stream_compression_gzip.cc " + + "src\\core\\lib\\compression\\stream_compression_identity.cc " + + "src\\core\\lib\\debug\\stats.cc " + + "src\\core\\lib\\debug\\stats_data.cc " + + "src\\core\\lib\\debug\\trace.cc " + + "src\\core\\lib\\gpr\\alloc.cc " + + "src\\core\\lib\\gpr\\atm.cc " + + "src\\core\\lib\\gpr\\cpu_iphone.cc " + + "src\\core\\lib\\gpr\\cpu_linux.cc " + + "src\\core\\lib\\gpr\\cpu_posix.cc " + + "src\\core\\lib\\gpr\\cpu_windows.cc " + + "src\\core\\lib\\gpr\\env_linux.cc " + + "src\\core\\lib\\gpr\\env_posix.cc " + + "src\\core\\lib\\gpr\\env_windows.cc " + + "src\\core\\lib\\gpr\\log.cc " + + "src\\core\\lib\\gpr\\log_android.cc " + + "src\\core\\lib\\gpr\\log_linux.cc " + + "src\\core\\lib\\gpr\\log_posix.cc " + + "src\\core\\lib\\gpr\\log_windows.cc " + + "src\\core\\lib\\gpr\\murmur_hash.cc " + + "src\\core\\lib\\gpr\\string.cc " + + "src\\core\\lib\\gpr\\string_posix.cc " + + "src\\core\\lib\\gpr\\string_util_windows.cc " + + "src\\core\\lib\\gpr\\string_windows.cc " + + "src\\core\\lib\\gpr\\sync.cc " + + "src\\core\\lib\\gpr\\sync_abseil.cc " + + "src\\core\\lib\\gpr\\sync_posix.cc " + + "src\\core\\lib\\gpr\\sync_windows.cc " + + "src\\core\\lib\\gpr\\time.cc " + + "src\\core\\lib\\gpr\\time_posix.cc " + + "src\\core\\lib\\gpr\\time_precise.cc " + + "src\\core\\lib\\gpr\\time_windows.cc " + + "src\\core\\lib\\gpr\\tls_pthread.cc " + + "src\\core\\lib\\gpr\\tmpfile_msys.cc " + + "src\\core\\lib\\gpr\\tmpfile_posix.cc " + + "src\\core\\lib\\gpr\\tmpfile_windows.cc " + + "src\\core\\lib\\gpr\\wrap_memcpy.cc " + + "src\\core\\lib\\gprpp\\arena.cc " + + "src\\core\\lib\\gprpp\\fork.cc " + + "src\\core\\lib\\gprpp\\global_config_env.cc " + + "src\\core\\lib\\gprpp\\host_port.cc " + + "src\\core\\lib\\gprpp\\mpscq.cc " + + "src\\core\\lib\\gprpp\\thd_posix.cc " + + "src\\core\\lib\\gprpp\\thd_windows.cc " + + "src\\core\\lib\\http\\format_request.cc " + + "src\\core\\lib\\http\\httpcli.cc " + + "src\\core\\lib\\http\\httpcli_security_connector.cc " + + "src\\core\\lib\\http\\parser.cc " + + "src\\core\\lib\\iomgr\\buffer_list.cc " + + "src\\core\\lib\\iomgr\\call_combiner.cc " + + "src\\core\\lib\\iomgr\\cfstream_handle.cc " + + "src\\core\\lib\\iomgr\\combiner.cc " + + "src\\core\\lib\\iomgr\\dualstack_socket_posix.cc " + + "src\\core\\lib\\iomgr\\endpoint.cc " + + "src\\core\\lib\\iomgr\\endpoint_cfstream.cc " + + "src\\core\\lib\\iomgr\\endpoint_pair_posix.cc " + + "src\\core\\lib\\iomgr\\endpoint_pair_uv.cc " + + "src\\core\\lib\\iomgr\\endpoint_pair_windows.cc " + + "src\\core\\lib\\iomgr\\error.cc " + + "src\\core\\lib\\iomgr\\error_cfstream.cc " + + "src\\core\\lib\\iomgr\\ev_epoll1_linux.cc " + + "src\\core\\lib\\iomgr\\ev_epollex_linux.cc " + + "src\\core\\lib\\iomgr\\ev_poll_posix.cc " + + "src\\core\\lib\\iomgr\\ev_posix.cc " + + "src\\core\\lib\\iomgr\\ev_windows.cc " + + "src\\core\\lib\\iomgr\\exec_ctx.cc " + + "src\\core\\lib\\iomgr\\executor.cc " + + "src\\core\\lib\\iomgr\\executor\\mpmcqueue.cc " + + "src\\core\\lib\\iomgr\\executor\\threadpool.cc " + + "src\\core\\lib\\iomgr\\fork_posix.cc " + + "src\\core\\lib\\iomgr\\fork_windows.cc " + + "src\\core\\lib\\iomgr\\gethostname_fallback.cc " + + "src\\core\\lib\\iomgr\\gethostname_host_name_max.cc " + + "src\\core\\lib\\iomgr\\gethostname_sysconf.cc " + + "src\\core\\lib\\iomgr\\grpc_if_nametoindex_posix.cc " + + "src\\core\\lib\\iomgr\\grpc_if_nametoindex_unsupported.cc " + + "src\\core\\lib\\iomgr\\internal_errqueue.cc " + + "src\\core\\lib\\iomgr\\iocp_windows.cc " + + "src\\core\\lib\\iomgr\\iomgr.cc " + + "src\\core\\lib\\iomgr\\iomgr_custom.cc " + + "src\\core\\lib\\iomgr\\iomgr_internal.cc " + + "src\\core\\lib\\iomgr\\iomgr_posix.cc " + + "src\\core\\lib\\iomgr\\iomgr_posix_cfstream.cc " + + "src\\core\\lib\\iomgr\\iomgr_uv.cc " + + "src\\core\\lib\\iomgr\\iomgr_windows.cc " + + "src\\core\\lib\\iomgr\\is_epollexclusive_available.cc " + + "src\\core\\lib\\iomgr\\load_file.cc " + + "src\\core\\lib\\iomgr\\lockfree_event.cc " + + "src\\core\\lib\\iomgr\\poller\\eventmanager_libuv.cc " + + "src\\core\\lib\\iomgr\\polling_entity.cc " + + "src\\core\\lib\\iomgr\\pollset.cc " + + "src\\core\\lib\\iomgr\\pollset_custom.cc " + + "src\\core\\lib\\iomgr\\pollset_set.cc " + + "src\\core\\lib\\iomgr\\pollset_set_custom.cc " + + "src\\core\\lib\\iomgr\\pollset_set_windows.cc " + + "src\\core\\lib\\iomgr\\pollset_uv.cc " + + "src\\core\\lib\\iomgr\\pollset_windows.cc " + + "src\\core\\lib\\iomgr\\resolve_address.cc " + + "src\\core\\lib\\iomgr\\resolve_address_custom.cc " + + "src\\core\\lib\\iomgr\\resolve_address_posix.cc " + + "src\\core\\lib\\iomgr\\resolve_address_windows.cc " + + "src\\core\\lib\\iomgr\\resource_quota.cc " + + "src\\core\\lib\\iomgr\\sockaddr_utils.cc " + + "src\\core\\lib\\iomgr\\socket_factory_posix.cc " + + "src\\core\\lib\\iomgr\\socket_mutator.cc " + + "src\\core\\lib\\iomgr\\socket_utils_common_posix.cc " + + "src\\core\\lib\\iomgr\\socket_utils_linux.cc " + + "src\\core\\lib\\iomgr\\socket_utils_posix.cc " + + "src\\core\\lib\\iomgr\\socket_utils_uv.cc " + + "src\\core\\lib\\iomgr\\socket_utils_windows.cc " + + "src\\core\\lib\\iomgr\\socket_windows.cc " + + "src\\core\\lib\\iomgr\\tcp_client.cc " + + "src\\core\\lib\\iomgr\\tcp_client_cfstream.cc " + + "src\\core\\lib\\iomgr\\tcp_client_custom.cc " + + "src\\core\\lib\\iomgr\\tcp_client_posix.cc " + + "src\\core\\lib\\iomgr\\tcp_client_windows.cc " + + "src\\core\\lib\\iomgr\\tcp_custom.cc " + + "src\\core\\lib\\iomgr\\tcp_posix.cc " + + "src\\core\\lib\\iomgr\\tcp_server.cc " + + "src\\core\\lib\\iomgr\\tcp_server_custom.cc " + + "src\\core\\lib\\iomgr\\tcp_server_posix.cc " + + "src\\core\\lib\\iomgr\\tcp_server_utils_posix_common.cc " + + "src\\core\\lib\\iomgr\\tcp_server_utils_posix_ifaddrs.cc " + + "src\\core\\lib\\iomgr\\tcp_server_utils_posix_noifaddrs.cc " + + "src\\core\\lib\\iomgr\\tcp_server_windows.cc " + + "src\\core\\lib\\iomgr\\tcp_uv.cc " + + "src\\core\\lib\\iomgr\\tcp_windows.cc " + + "src\\core\\lib\\iomgr\\time_averaged_stats.cc " + + "src\\core\\lib\\iomgr\\timer.cc " + + "src\\core\\lib\\iomgr\\timer_custom.cc " + + "src\\core\\lib\\iomgr\\timer_generic.cc " + + "src\\core\\lib\\iomgr\\timer_heap.cc " + + "src\\core\\lib\\iomgr\\timer_manager.cc " + + "src\\core\\lib\\iomgr\\timer_uv.cc " + + "src\\core\\lib\\iomgr\\udp_server.cc " + + "src\\core\\lib\\iomgr\\unix_sockets_posix.cc " + + "src\\core\\lib\\iomgr\\unix_sockets_posix_noop.cc " + + "src\\core\\lib\\iomgr\\wakeup_fd_eventfd.cc " + + "src\\core\\lib\\iomgr\\wakeup_fd_nospecial.cc " + + "src\\core\\lib\\iomgr\\wakeup_fd_pipe.cc " + + "src\\core\\lib\\iomgr\\wakeup_fd_posix.cc " + + "src\\core\\lib\\iomgr\\work_serializer.cc " + + "src\\core\\lib\\json\\json_reader.cc " + + "src\\core\\lib\\json\\json_writer.cc " + + "src\\core\\lib\\profiling\\basic_timers.cc " + + "src\\core\\lib\\profiling\\stap_timers.cc " + + "src\\core\\lib\\security\\context\\security_context.cc " + + "src\\core\\lib\\security\\credentials\\alts\\alts_credentials.cc " + + "src\\core\\lib\\security\\credentials\\alts\\check_gcp_environment.cc " + + "src\\core\\lib\\security\\credentials\\alts\\check_gcp_environment_linux.cc " + + "src\\core\\lib\\security\\credentials\\alts\\check_gcp_environment_no_op.cc " + + "src\\core\\lib\\security\\credentials\\alts\\check_gcp_environment_windows.cc " + + "src\\core\\lib\\security\\credentials\\alts\\grpc_alts_credentials_client_options.cc " + + "src\\core\\lib\\security\\credentials\\alts\\grpc_alts_credentials_options.cc " + + "src\\core\\lib\\security\\credentials\\alts\\grpc_alts_credentials_server_options.cc " + + "src\\core\\lib\\security\\credentials\\composite\\composite_credentials.cc " + + "src\\core\\lib\\security\\credentials\\credentials.cc " + + "src\\core\\lib\\security\\credentials\\credentials_metadata.cc " + + "src\\core\\lib\\security\\credentials\\fake\\fake_credentials.cc " + + "src\\core\\lib\\security\\credentials\\google_default\\credentials_generic.cc " + + "src\\core\\lib\\security\\credentials\\google_default\\google_default_credentials.cc " + + "src\\core\\lib\\security\\credentials\\iam\\iam_credentials.cc " + + "src\\core\\lib\\security\\credentials\\jwt\\json_token.cc " + + "src\\core\\lib\\security\\credentials\\jwt\\jwt_credentials.cc " + + "src\\core\\lib\\security\\credentials\\jwt\\jwt_verifier.cc " + + "src\\core\\lib\\security\\credentials\\local\\local_credentials.cc " + + "src\\core\\lib\\security\\credentials\\oauth2\\oauth2_credentials.cc " + + "src\\core\\lib\\security\\credentials\\plugin\\plugin_credentials.cc " + + "src\\core\\lib\\security\\credentials\\ssl\\ssl_credentials.cc " + + "src\\core\\lib\\security\\credentials\\tls\\grpc_tls_credentials_options.cc " + + "src\\core\\lib\\security\\credentials\\tls\\tls_credentials.cc " + + "src\\core\\lib\\security\\security_connector\\alts\\alts_security_connector.cc " + + "src\\core\\lib\\security\\security_connector\\fake\\fake_security_connector.cc " + + "src\\core\\lib\\security\\security_connector\\load_system_roots_fallback.cc " + + "src\\core\\lib\\security\\security_connector\\load_system_roots_linux.cc " + + "src\\core\\lib\\security\\security_connector\\local\\local_security_connector.cc " + + "src\\core\\lib\\security\\security_connector\\security_connector.cc " + + "src\\core\\lib\\security\\security_connector\\ssl\\ssl_security_connector.cc " + + "src\\core\\lib\\security\\security_connector\\ssl_utils.cc " + + "src\\core\\lib\\security\\security_connector\\ssl_utils_config.cc " + + "src\\core\\lib\\security\\security_connector\\tls\\tls_security_connector.cc " + + "src\\core\\lib\\security\\transport\\client_auth_filter.cc " + + "src\\core\\lib\\security\\transport\\secure_endpoint.cc " + + "src\\core\\lib\\security\\transport\\security_handshaker.cc " + + "src\\core\\lib\\security\\transport\\server_auth_filter.cc " + + "src\\core\\lib\\security\\transport\\target_authority_table.cc " + + "src\\core\\lib\\security\\transport\\tsi_error.cc " + + "src\\core\\lib\\security\\util\\json_util.cc " + + "src\\core\\lib\\slice\\b64.cc " + + "src\\core\\lib\\slice\\percent_encoding.cc " + + "src\\core\\lib\\slice\\slice.cc " + + "src\\core\\lib\\slice\\slice_buffer.cc " + + "src\\core\\lib\\slice\\slice_intern.cc " + + "src\\core\\lib\\slice\\slice_string_helpers.cc " + + "src\\core\\lib\\surface\\api_trace.cc " + + "src\\core\\lib\\surface\\byte_buffer.cc " + + "src\\core\\lib\\surface\\byte_buffer_reader.cc " + + "src\\core\\lib\\surface\\call.cc " + + "src\\core\\lib\\surface\\call_details.cc " + + "src\\core\\lib\\surface\\call_log_batch.cc " + + "src\\core\\lib\\surface\\channel.cc " + + "src\\core\\lib\\surface\\channel_init.cc " + + "src\\core\\lib\\surface\\channel_ping.cc " + + "src\\core\\lib\\surface\\channel_stack_type.cc " + + "src\\core\\lib\\surface\\completion_queue.cc " + + "src\\core\\lib\\surface\\completion_queue_factory.cc " + + "src\\core\\lib\\surface\\event_string.cc " + + "src\\core\\lib\\surface\\init.cc " + + "src\\core\\lib\\surface\\init_secure.cc " + + "src\\core\\lib\\surface\\lame_client.cc " + + "src\\core\\lib\\surface\\metadata_array.cc " + + "src\\core\\lib\\surface\\server.cc " + + "src\\core\\lib\\surface\\validate_metadata.cc " + + "src\\core\\lib\\surface\\version.cc " + + "src\\core\\lib\\transport\\bdp_estimator.cc " + + "src\\core\\lib\\transport\\byte_stream.cc " + + "src\\core\\lib\\transport\\connectivity_state.cc " + + "src\\core\\lib\\transport\\error_utils.cc " + + "src\\core\\lib\\transport\\metadata.cc " + + "src\\core\\lib\\transport\\metadata_batch.cc " + + "src\\core\\lib\\transport\\pid_controller.cc " + + "src\\core\\lib\\transport\\static_metadata.cc " + + "src\\core\\lib\\transport\\status_conversion.cc " + + "src\\core\\lib\\transport\\status_metadata.cc " + + "src\\core\\lib\\transport\\timeout_encoding.cc " + + "src\\core\\lib\\transport\\transport.cc " + + "src\\core\\lib\\transport\\transport_op_string.cc " + + "src\\core\\lib\\uri\\uri_parser.cc " + + "src\\core\\plugin_registry\\grpc_plugin_registry.cc " + + "src\\core\\tsi\\alts\\crypt\\aes_gcm.cc " + + "src\\core\\tsi\\alts\\crypt\\gsec.cc " + + "src\\core\\tsi\\alts\\frame_protector\\alts_counter.cc " + + "src\\core\\tsi\\alts\\frame_protector\\alts_crypter.cc " + + "src\\core\\tsi\\alts\\frame_protector\\alts_frame_protector.cc " + + "src\\core\\tsi\\alts\\frame_protector\\alts_record_protocol_crypter_common.cc " + + "src\\core\\tsi\\alts\\frame_protector\\alts_seal_privacy_integrity_crypter.cc " + + "src\\core\\tsi\\alts\\frame_protector\\alts_unseal_privacy_integrity_crypter.cc " + + "src\\core\\tsi\\alts\\frame_protector\\frame_handler.cc " + + "src\\core\\tsi\\alts\\handshaker\\alts_handshaker_client.cc " + + "src\\core\\tsi\\alts\\handshaker\\alts_shared_resource.cc " + + "src\\core\\tsi\\alts\\handshaker\\alts_tsi_handshaker.cc " + + "src\\core\\tsi\\alts\\handshaker\\alts_tsi_utils.cc " + + "src\\core\\tsi\\alts\\handshaker\\transport_security_common_api.cc " + + "src\\core\\tsi\\alts\\zero_copy_frame_protector\\alts_grpc_integrity_only_record_protocol.cc " + + "src\\core\\tsi\\alts\\zero_copy_frame_protector\\alts_grpc_privacy_integrity_record_protocol.cc " + + "src\\core\\tsi\\alts\\zero_copy_frame_protector\\alts_grpc_record_protocol_common.cc " + + "src\\core\\tsi\\alts\\zero_copy_frame_protector\\alts_iovec_record_protocol.cc " + + "src\\core\\tsi\\alts\\zero_copy_frame_protector\\alts_zero_copy_grpc_protector.cc " + + "src\\core\\tsi\\fake_transport_security.cc " + + "src\\core\\tsi\\local_transport_security.cc " + + "src\\core\\tsi\\ssl\\session_cache\\ssl_session_boringssl.cc " + + "src\\core\\tsi\\ssl\\session_cache\\ssl_session_cache.cc " + + "src\\core\\tsi\\ssl\\session_cache\\ssl_session_openssl.cc " + + "src\\core\\tsi\\ssl_transport_security.cc " + + "src\\core\\tsi\\transport_security.cc " + + "src\\core\\tsi\\transport_security_grpc.cc " + + "src\\php\\ext\\grpc\\byte_buffer.c " + + "src\\php\\ext\\grpc\\call.c " + + "src\\php\\ext\\grpc\\call_credentials.c " + + "src\\php\\ext\\grpc\\channel.c " + + "src\\php\\ext\\grpc\\channel_credentials.c " + + "src\\php\\ext\\grpc\\completion_queue.c " + + "src\\php\\ext\\grpc\\php_grpc.c " + + "src\\php\\ext\\grpc\\server.c " + + "src\\php\\ext\\grpc\\server_credentials.c " + + "src\\php\\ext\\grpc\\timeval.c " + + "third_party\\abseil-cpp\\absl\\base\\dynamic_annotations.cc " + + "third_party\\abseil-cpp\\absl\\base\\internal\\cycleclock.cc " + + "third_party\\abseil-cpp\\absl\\base\\internal\\raw_logging.cc " + + "third_party\\abseil-cpp\\absl\\base\\internal\\spinlock.cc " + + "third_party\\abseil-cpp\\absl\\base\\internal\\spinlock_wait.cc " + + "third_party\\abseil-cpp\\absl\\base\\internal\\sysinfo.cc " + + "third_party\\abseil-cpp\\absl\\base\\internal\\thread_identity.cc " + + "third_party\\abseil-cpp\\absl\\base\\internal\\throw_delegate.cc " + + "third_party\\abseil-cpp\\absl\\base\\internal\\unscaledcycleclock.cc " + + "third_party\\abseil-cpp\\absl\\base\\log_severity.cc " + + "third_party\\abseil-cpp\\absl\\numeric\\int128.cc " + + "third_party\\abseil-cpp\\absl\\strings\\ascii.cc " + + "third_party\\abseil-cpp\\absl\\strings\\charconv.cc " + + "third_party\\abseil-cpp\\absl\\strings\\escaping.cc " + + "third_party\\abseil-cpp\\absl\\strings\\internal\\charconv_bigint.cc " + + "third_party\\abseil-cpp\\absl\\strings\\internal\\charconv_parse.cc " + + "third_party\\abseil-cpp\\absl\\strings\\internal\\escaping.cc " + + "third_party\\abseil-cpp\\absl\\strings\\internal\\memutil.cc " + + "third_party\\abseil-cpp\\absl\\strings\\internal\\ostringstream.cc " + + "third_party\\abseil-cpp\\absl\\strings\\internal\\str_format\\arg.cc " + + "third_party\\abseil-cpp\\absl\\strings\\internal\\str_format\\bind.cc " + + "third_party\\abseil-cpp\\absl\\strings\\internal\\str_format\\extension.cc " + + "third_party\\abseil-cpp\\absl\\strings\\internal\\str_format\\float_conversion.cc " + + "third_party\\abseil-cpp\\absl\\strings\\internal\\str_format\\output.cc " + + "third_party\\abseil-cpp\\absl\\strings\\internal\\str_format\\parser.cc " + + "third_party\\abseil-cpp\\absl\\strings\\internal\\utf8.cc " + + "third_party\\abseil-cpp\\absl\\strings\\match.cc " + + "third_party\\abseil-cpp\\absl\\strings\\numbers.cc " + + "third_party\\abseil-cpp\\absl\\strings\\str_cat.cc " + + "third_party\\abseil-cpp\\absl\\strings\\str_replace.cc " + + "third_party\\abseil-cpp\\absl\\strings\\str_split.cc " + + "third_party\\abseil-cpp\\absl\\strings\\string_view.cc " + + "third_party\\abseil-cpp\\absl\\strings\\substitute.cc " + + "third_party\\abseil-cpp\\absl\\time\\civil_time.cc " + + "third_party\\abseil-cpp\\absl\\time\\clock.cc " + + "third_party\\abseil-cpp\\absl\\time\\duration.cc " + + "third_party\\abseil-cpp\\absl\\time\\format.cc " + + "third_party\\abseil-cpp\\absl\\time\\internal\\cctz\\src\\civil_time_detail.cc " + + "third_party\\abseil-cpp\\absl\\time\\internal\\cctz\\src\\time_zone_fixed.cc " + + "third_party\\abseil-cpp\\absl\\time\\internal\\cctz\\src\\time_zone_format.cc " + + "third_party\\abseil-cpp\\absl\\time\\internal\\cctz\\src\\time_zone_if.cc " + + "third_party\\abseil-cpp\\absl\\time\\internal\\cctz\\src\\time_zone_impl.cc " + + "third_party\\abseil-cpp\\absl\\time\\internal\\cctz\\src\\time_zone_info.cc " + + "third_party\\abseil-cpp\\absl\\time\\internal\\cctz\\src\\time_zone_libc.cc " + + "third_party\\abseil-cpp\\absl\\time\\internal\\cctz\\src\\time_zone_lookup.cc " + + "third_party\\abseil-cpp\\absl\\time\\internal\\cctz\\src\\time_zone_posix.cc " + + "third_party\\abseil-cpp\\absl\\time\\internal\\cctz\\src\\zone_info_source.cc " + + "third_party\\abseil-cpp\\absl\\time\\time.cc " + + "third_party\\abseil-cpp\\absl\\types\\bad_optional_access.cc " + + "third_party\\address_sorting\\address_sorting.c " + + "third_party\\address_sorting\\address_sorting_posix.c " + + "third_party\\address_sorting\\address_sorting_windows.c " + + "third_party\\boringssl-with-bazel\\err_data.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\a_bitstr.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\a_bool.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\a_d2i_fp.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\a_dup.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\a_enum.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\a_gentm.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\a_i2d_fp.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\a_int.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\a_mbstr.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\a_object.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\a_octet.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\a_print.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\a_strnid.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\a_time.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\a_type.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\a_utctm.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\a_utf8.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\asn1_lib.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\asn1_par.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\asn_pack.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\f_enum.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\f_int.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\f_string.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\tasn_dec.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\tasn_enc.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\tasn_fre.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\tasn_new.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\tasn_typ.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\tasn_utl.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\time_support.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\base64\\base64.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\bio\\bio.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\bio\\bio_mem.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\bio\\connect.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\bio\\fd.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\bio\\file.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\bio\\hexdump.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\bio\\pair.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\bio\\printf.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\bio\\socket.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\bio\\socket_helper.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\bn_extra\\bn_asn1.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\bn_extra\\convert.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\buf\\buf.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\bytestring\\asn1_compat.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\bytestring\\ber.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\bytestring\\cbb.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\bytestring\\cbs.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\bytestring\\unicode.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\chacha\\chacha.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\cipher_extra\\cipher_extra.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\cipher_extra\\derive_key.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\cipher_extra\\e_aesccm.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\cipher_extra\\e_aesctrhmac.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\cipher_extra\\e_aesgcmsiv.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\cipher_extra\\e_chacha20poly1305.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\cipher_extra\\e_null.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\cipher_extra\\e_rc2.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\cipher_extra\\e_rc4.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\cipher_extra\\e_tls.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\cipher_extra\\tls_cbc.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\cmac\\cmac.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\conf\\conf.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\cpu-aarch64-fuchsia.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\cpu-aarch64-linux.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\cpu-arm-linux.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\cpu-arm.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\cpu-intel.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\cpu-ppc64le.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\crypto.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\curve25519\\spake25519.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\dh\\check.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\dh\\dh.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\dh\\dh_asn1.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\dh\\params.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\digest_extra\\digest_extra.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\dsa\\dsa.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\dsa\\dsa_asn1.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\ec_extra\\ec_asn1.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\ec_extra\\ec_derive.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\ecdh_extra\\ecdh_extra.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\ecdsa_extra\\ecdsa_asn1.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\engine\\engine.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\err\\err.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\digestsign.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\evp.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\evp_asn1.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\evp_ctx.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\p_dsa_asn1.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\p_ec.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\p_ec_asn1.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\p_ed25519.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\p_ed25519_asn1.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\p_rsa.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\p_rsa_asn1.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\p_x25519.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\p_x25519_asn1.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\pbkdf.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\print.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\scrypt.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\sign.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\ex_data.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\fipsmodule\\bcm.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\fipsmodule\\fips_shared_support.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\fipsmodule\\is_fips.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\hkdf\\hkdf.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\hrss\\hrss.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\lhash\\lhash.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\mem.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\obj\\obj.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\obj\\obj_xref.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\pem\\pem_all.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\pem\\pem_info.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\pem\\pem_lib.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\pem\\pem_oth.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\pem\\pem_pk8.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\pem\\pem_pkey.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\pem\\pem_x509.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\pem\\pem_xaux.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\pkcs7\\pkcs7.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\pkcs7\\pkcs7_x509.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\pkcs8\\p5_pbev2.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\pkcs8\\pkcs8.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\pkcs8\\pkcs8_x509.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\poly1305\\poly1305.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\poly1305\\poly1305_arm.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\poly1305\\poly1305_vec.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\pool\\pool.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\rand_extra\\deterministic.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\rand_extra\\forkunsafe.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\rand_extra\\fuchsia.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\rand_extra\\rand_extra.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\rand_extra\\windows.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\rc4\\rc4.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\refcount_c11.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\refcount_lock.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\rsa_extra\\rsa_asn1.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\rsa_extra\\rsa_print.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\siphash\\siphash.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\stack\\stack.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\thread.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\thread_none.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\thread_pthread.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\thread_win.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\a_digest.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\a_sign.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\a_strex.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\a_verify.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\algorithm.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\asn1_gen.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\by_dir.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\by_file.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\i2d_pr.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\rsa_pss.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\t_crl.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\t_req.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\t_x509.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\t_x509a.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509_att.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509_cmp.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509_d2.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509_def.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509_ext.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509_lu.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509_obj.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509_r2x.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509_req.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509_set.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509_trs.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509_txt.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509_v3.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509_vfy.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509_vpm.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509cset.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509name.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509rset.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509spki.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x_algor.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x_all.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x_attrib.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x_crl.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x_exten.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x_info.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x_name.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x_pkey.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x_pubkey.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x_req.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x_sig.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x_spki.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x_val.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x_x509.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x_x509a.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\pcy_cache.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\pcy_data.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\pcy_lib.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\pcy_map.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\pcy_node.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\pcy_tree.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_akey.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_akeya.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_alt.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_bcons.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_bitst.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_conf.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_cpols.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_crld.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_enum.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_extku.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_genn.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_ia5.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_info.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_int.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_lib.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_ncons.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_ocsp.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_pci.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_pcia.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_pcons.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_pku.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_pmaps.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_prn.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_purp.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_skey.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_sxnet.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509v3\\v3_utl.c " + + "third_party\\boringssl-with-bazel\\src\\ssl\\bio_ssl.cc " + + "third_party\\boringssl-with-bazel\\src\\ssl\\d1_both.cc " + + "third_party\\boringssl-with-bazel\\src\\ssl\\d1_lib.cc " + + "third_party\\boringssl-with-bazel\\src\\ssl\\d1_pkt.cc " + + "third_party\\boringssl-with-bazel\\src\\ssl\\d1_srtp.cc " + + "third_party\\boringssl-with-bazel\\src\\ssl\\dtls_method.cc " + + "third_party\\boringssl-with-bazel\\src\\ssl\\dtls_record.cc " + + "third_party\\boringssl-with-bazel\\src\\ssl\\handoff.cc " + + "third_party\\boringssl-with-bazel\\src\\ssl\\handshake.cc " + + "third_party\\boringssl-with-bazel\\src\\ssl\\handshake_client.cc " + + "third_party\\boringssl-with-bazel\\src\\ssl\\handshake_server.cc " + + "third_party\\boringssl-with-bazel\\src\\ssl\\s3_both.cc " + + "third_party\\boringssl-with-bazel\\src\\ssl\\s3_lib.cc " + + "third_party\\boringssl-with-bazel\\src\\ssl\\s3_pkt.cc " + + "third_party\\boringssl-with-bazel\\src\\ssl\\ssl_aead_ctx.cc " + + "third_party\\boringssl-with-bazel\\src\\ssl\\ssl_asn1.cc " + + "third_party\\boringssl-with-bazel\\src\\ssl\\ssl_buffer.cc " + + "third_party\\boringssl-with-bazel\\src\\ssl\\ssl_cert.cc " + + "third_party\\boringssl-with-bazel\\src\\ssl\\ssl_cipher.cc " + + "third_party\\boringssl-with-bazel\\src\\ssl\\ssl_file.cc " + + "third_party\\boringssl-with-bazel\\src\\ssl\\ssl_key_share.cc " + + "third_party\\boringssl-with-bazel\\src\\ssl\\ssl_lib.cc " + + "third_party\\boringssl-with-bazel\\src\\ssl\\ssl_privkey.cc " + + "third_party\\boringssl-with-bazel\\src\\ssl\\ssl_session.cc " + + "third_party\\boringssl-with-bazel\\src\\ssl\\ssl_stat.cc " + + "third_party\\boringssl-with-bazel\\src\\ssl\\ssl_transcript.cc " + + "third_party\\boringssl-with-bazel\\src\\ssl\\ssl_versions.cc " + + "third_party\\boringssl-with-bazel\\src\\ssl\\ssl_x509.cc " + + "third_party\\boringssl-with-bazel\\src\\ssl\\t1_enc.cc " + + "third_party\\boringssl-with-bazel\\src\\ssl\\t1_lib.cc " + + "third_party\\boringssl-with-bazel\\src\\ssl\\tls13_both.cc " + + "third_party\\boringssl-with-bazel\\src\\ssl\\tls13_client.cc " + + "third_party\\boringssl-with-bazel\\src\\ssl\\tls13_enc.cc " + + "third_party\\boringssl-with-bazel\\src\\ssl\\tls13_server.cc " + + "third_party\\boringssl-with-bazel\\src\\ssl\\tls_method.cc " + + "third_party\\boringssl-with-bazel\\src\\ssl\\tls_record.cc " + + "third_party\\boringssl-with-bazel\\src\\third_party\\fiat\\curve25519.c " + + "third_party\\upb\\upb\\decode.c " + + "third_party\\upb\\upb\\encode.c " + + "third_party\\upb\\upb\\msg.c " + + "third_party\\upb\\upb\\port.c " + + "third_party\\upb\\upb\\table.c " + + "third_party\\upb\\upb\\upb.c " + + "third_party\\zlib\\adler32.c " + + "third_party\\zlib\\compress.c " + + "third_party\\zlib\\crc32.c " + + "third_party\\zlib\\deflate.c " + + "third_party\\zlib\\gzclose.c " + + "third_party\\zlib\\gzlib.c " + + "third_party\\zlib\\gzread.c " + + "third_party\\zlib\\gzwrite.c " + + "third_party\\zlib\\infback.c " + + "third_party\\zlib\\inffast.c " + + "third_party\\zlib\\inflate.c " + + "third_party\\zlib\\inftrees.c " + + "third_party\\zlib\\trees.c " + + "third_party\\zlib\\uncompr.c " + + "third_party\\zlib\\zutil.c " + + "" + , null, + "/DOPENSSL_NO_ASM /D_GNU_SOURCE /DWIN32_LEAN_AND_MEAN "+ + "/D_HAS_EXCEPTIONS=0 /DNOMINMAX /DGRPC_ARES=0 /D_WIN32_WINNT=0x600 "+ + "/I"+configure_module_dirname+" "+ + "/I"+configure_module_dirname+"\\include "+ + "/I"+configure_module_dirname+"\\src\\core\\ext\\upb-generated "+ + "/I"+configure_module_dirname+"\\src\\php\\ext\\grpc "+ + "/I"+configure_module_dirname+"\\third_party\\abseil-cpp "+ + "/I"+configure_module_dirname+"\\third_party\\address_sorting\\include "+ + "/I"+configure_module_dirname+"\\third_party\\boringssl\\include "+ + "/I"+configure_module_dirname+"\\third_party\\upb "+ + "/I"+configure_module_dirname+"\\third_party\\zlib "); + + base_dir = get_define('BUILD_DIR'); + FSO.CreateFolder(base_dir+"\\ext"); + FSO.CreateFolder(base_dir+"\\ext\\grpc"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\census"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_channel"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_channel\\health"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_channel\\lb_policy"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_channel\\lb_policy\\grpclb"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_channel\\lb_policy\\pick_first"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_channel\\lb_policy\\priority"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_channel\\lb_policy\\round_robin"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_channel\\lb_policy\\weighted_target"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_channel\\lb_policy\\xds"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_channel\\resolver"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_channel\\resolver\\dns"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_channel\\resolver\\dns\\c_ares"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_channel\\resolver\\dns\\native"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_channel\\resolver\\fake"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_channel\\resolver\\sockaddr"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_channel\\resolver\\xds"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_channel\\xds"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\client_idle"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\deadline"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\http"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\http\\client"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\http\\message_compress"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\http\\server"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\max_age"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\message_size"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\workarounds"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\transport"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\transport\\chttp2"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\transport\\chttp2\\alpn"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\transport\\chttp2\\client"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\transport\\chttp2\\client\\insecure"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\transport\\chttp2\\client\\secure"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\transport\\chttp2\\server"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\transport\\chttp2\\server\\insecure"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\transport\\chttp2\\server\\secure"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\transport\\chttp2\\transport"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\transport\\inproc"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\annotations"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\api"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\api\\v2"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\api\\v2\\auth"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\api\\v2\\cluster"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\api\\v2\\core"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\api\\v2\\endpoint"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\api\\v2\\listener"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\api\\v2\\route"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\config"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\config\\filter"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\config\\filter\\accesslog"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\config\\filter\\accesslog\\v2"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\config\\filter\\network"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\config\\filter\\network\\http_connection_manager"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\config\\filter\\network\\http_connection_manager\\v2"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\config\\listener"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\config\\listener\\v2"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\service"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\service\\discovery"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\service\\discovery\\v2"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\service\\load_stats"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\service\\load_stats\\v2"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\type"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\type\\matcher"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\type\\metadata"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\type\\metadata\\v2"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\type\\tracing"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\type\\tracing\\v2"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\gogoproto"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\google"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\google\\api"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\google\\protobuf"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\google\\rpc"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\src"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\src\\proto"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\src\\proto\\grpc"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\src\\proto\\grpc\\gcp"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\src\\proto\\grpc\\health"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\src\\proto\\grpc\\health\\v1"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\src\\proto\\grpc\\lb"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\src\\proto\\grpc\\lb\\v1"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\udpa"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\udpa\\annotations"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\udpa\\data"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\udpa\\data\\orca"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\udpa\\data\\orca\\v1"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\validate"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\avl"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\backoff"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\channel"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\compression"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\debug"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\gpr"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\gprpp"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\http"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\iomgr"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\iomgr\\executor"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\iomgr\\poller"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\json"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\profiling"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\context"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\credentials"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\credentials\\alts"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\credentials\\composite"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\credentials\\fake"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\credentials\\google_default"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\credentials\\iam"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\credentials\\jwt"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\credentials\\local"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\credentials\\oauth2"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\credentials\\plugin"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\credentials\\ssl"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\credentials\\tls"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\security_connector"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\security_connector\\alts"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\security_connector\\fake"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\security_connector\\local"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\security_connector\\ssl"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\security_connector\\tls"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\transport"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\util"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\slice"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\surface"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\transport"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\uri"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\plugin_registry"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\tsi"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\tsi\\alts"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\tsi\\alts\\crypt"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\tsi\\alts\\frame_protector"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\tsi\\alts\\handshaker"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\tsi\\alts\\zero_copy_frame_protector"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\tsi\\ssl"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\tsi\\ssl\\session_cache"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\php"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\php\\ext"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\php\\ext\\grpc"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\abseil-cpp"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\abseil-cpp\\absl"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\abseil-cpp\\absl\\base"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\abseil-cpp\\absl\\base\\internal"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\abseil-cpp\\absl\\numeric"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\abseil-cpp\\absl\\strings"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\abseil-cpp\\absl\\strings\\internal"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\abseil-cpp\\absl\\strings\\internal\\str_format"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\abseil-cpp\\absl\\time"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\abseil-cpp\\absl\\time\\internal"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\abseil-cpp\\absl\\time\\internal\\cctz"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\abseil-cpp\\absl\\time\\internal\\cctz\\src"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\abseil-cpp\\absl\\types"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\address_sorting"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\asn1"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\base64"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\bio"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\bn_extra"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\buf"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\bytestring"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\chacha"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\cipher_extra"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\cmac"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\conf"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\curve25519"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\dh"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\digest_extra"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\dsa"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\ec_extra"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\ecdh_extra"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\ecdsa_extra"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\engine"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\err"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\evp"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\fipsmodule"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\hkdf"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\hrss"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\lhash"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\obj"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\pem"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\pkcs7"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\pkcs8"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\poly1305"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\pool"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\rand_extra"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\rc4"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\rsa_extra"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\siphash"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\stack"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\x509"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\x509v3"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\ssl"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\third_party"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\third_party\\fiat"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\upb"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\upb\\upb"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\zlib"); + _build_dirs = new Array(); + for (i = 0; i < build_dirs.length; i++) { + if (build_dirs[i].indexOf('grpc') == -1) { + _build_dirs[_build_dirs.length] = build_dirs[i]; + } + } + build_dirs = _build_dirs; +} diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec index fda497e531d..749e77b3fa7 100644 --- a/gRPC-Core.podspec +++ b/gRPC-Core.podspec @@ -1482,7 +1482,6 @@ Pod::Spec.new do |s| 'test/core/end2end/tests/cancel_test_helpers.h', 'test/core/end2end/tests/cancel_with_status.cc', 'test/core/end2end/tests/channelz.cc', - 'test/core/end2end/tests/client_streaming.cc', 'test/core/end2end/tests/compressed_payload.cc', 'test/core/end2end/tests/connectivity.cc', 'test/core/end2end/tests/default_host.cc', diff --git a/grpc.gemspec b/grpc.gemspec index 15d5beecb3f..29e5d3d436b 100644 --- a/grpc.gemspec +++ b/grpc.gemspec @@ -48,3 +48,1618 @@ Gem::Specification.new do |s| s.add_development_dependency 'googleauth', '>= 0.5.1', '< 0.10' s.extensions = %w(src/ruby/ext/grpc/extconf.rb) + + s.files += %w( include/grpc/byte_buffer.h ) + s.files += %w( include/grpc/byte_buffer_reader.h ) + s.files += %w( include/grpc/census.h ) + s.files += %w( include/grpc/compression.h ) + s.files += %w( include/grpc/fork.h ) + s.files += %w( include/grpc/grpc.h ) + s.files += %w( include/grpc/grpc_posix.h ) + s.files += %w( include/grpc/grpc_security.h ) + s.files += %w( include/grpc/grpc_security_constants.h ) + s.files += %w( include/grpc/impl/codegen/atm.h ) + s.files += %w( include/grpc/impl/codegen/atm_gcc_atomic.h ) + s.files += %w( include/grpc/impl/codegen/atm_gcc_sync.h ) + s.files += %w( include/grpc/impl/codegen/atm_windows.h ) + s.files += %w( include/grpc/impl/codegen/byte_buffer.h ) + s.files += %w( include/grpc/impl/codegen/byte_buffer_reader.h ) + s.files += %w( include/grpc/impl/codegen/compression_types.h ) + s.files += %w( include/grpc/impl/codegen/connectivity_state.h ) + s.files += %w( include/grpc/impl/codegen/fork.h ) + s.files += %w( include/grpc/impl/codegen/gpr_slice.h ) + s.files += %w( include/grpc/impl/codegen/gpr_types.h ) + s.files += %w( include/grpc/impl/codegen/grpc_types.h ) + s.files += %w( include/grpc/impl/codegen/log.h ) + s.files += %w( include/grpc/impl/codegen/port_platform.h ) + s.files += %w( include/grpc/impl/codegen/propagation_bits.h ) + s.files += %w( include/grpc/impl/codegen/slice.h ) + s.files += %w( include/grpc/impl/codegen/status.h ) + s.files += %w( include/grpc/impl/codegen/sync.h ) + s.files += %w( include/grpc/impl/codegen/sync_abseil.h ) + s.files += %w( include/grpc/impl/codegen/sync_custom.h ) + s.files += %w( include/grpc/impl/codegen/sync_generic.h ) + s.files += %w( include/grpc/impl/codegen/sync_posix.h ) + s.files += %w( include/grpc/impl/codegen/sync_windows.h ) + s.files += %w( include/grpc/load_reporting.h ) + s.files += %w( include/grpc/slice.h ) + s.files += %w( include/grpc/slice_buffer.h ) + s.files += %w( include/grpc/status.h ) + s.files += %w( include/grpc/support/alloc.h ) + s.files += %w( include/grpc/support/atm.h ) + s.files += %w( include/grpc/support/atm_gcc_atomic.h ) + s.files += %w( include/grpc/support/atm_gcc_sync.h ) + s.files += %w( include/grpc/support/atm_windows.h ) + s.files += %w( include/grpc/support/cpu.h ) + s.files += %w( include/grpc/support/log.h ) + s.files += %w( include/grpc/support/log_windows.h ) + s.files += %w( include/grpc/support/port_platform.h ) + s.files += %w( include/grpc/support/string_util.h ) + s.files += %w( include/grpc/support/sync.h ) + s.files += %w( include/grpc/support/sync_abseil.h ) + s.files += %w( include/grpc/support/sync_custom.h ) + s.files += %w( include/grpc/support/sync_generic.h ) + s.files += %w( include/grpc/support/sync_posix.h ) + s.files += %w( include/grpc/support/sync_windows.h ) + s.files += %w( include/grpc/support/thd_id.h ) + s.files += %w( include/grpc/support/time.h ) + s.files += %w( include/grpc/support/workaround_list.h ) + s.files += %w( src/core/ext/filters/census/grpc_context.cc ) + s.files += %w( src/core/ext/filters/client_channel/backend_metric.cc ) + s.files += %w( src/core/ext/filters/client_channel/backend_metric.h ) + s.files += %w( src/core/ext/filters/client_channel/backup_poller.cc ) + s.files += %w( src/core/ext/filters/client_channel/backup_poller.h ) + s.files += %w( src/core/ext/filters/client_channel/channel_connectivity.cc ) + s.files += %w( src/core/ext/filters/client_channel/client_channel.cc ) + s.files += %w( src/core/ext/filters/client_channel/client_channel.h ) + s.files += %w( src/core/ext/filters/client_channel/client_channel_channelz.cc ) + s.files += %w( src/core/ext/filters/client_channel/client_channel_channelz.h ) + s.files += %w( src/core/ext/filters/client_channel/client_channel_factory.cc ) + s.files += %w( src/core/ext/filters/client_channel/client_channel_factory.h ) + s.files += %w( src/core/ext/filters/client_channel/client_channel_plugin.cc ) + s.files += %w( src/core/ext/filters/client_channel/connector.h ) + s.files += %w( src/core/ext/filters/client_channel/global_subchannel_pool.cc ) + s.files += %w( src/core/ext/filters/client_channel/global_subchannel_pool.h ) + s.files += %w( src/core/ext/filters/client_channel/health/health_check_client.cc ) + s.files += %w( src/core/ext/filters/client_channel/health/health_check_client.h ) + s.files += %w( src/core/ext/filters/client_channel/http_connect_handshaker.cc ) + s.files += %w( src/core/ext/filters/client_channel/http_connect_handshaker.h ) + s.files += %w( src/core/ext/filters/client_channel/http_proxy.cc ) + s.files += %w( src/core/ext/filters/client_channel/http_proxy.h ) + s.files += %w( src/core/ext/filters/client_channel/lb_policy.cc ) + s.files += %w( src/core/ext/filters/client_channel/lb_policy.h ) + s.files += %w( src/core/ext/filters/client_channel/lb_policy/address_filtering.cc ) + s.files += %w( src/core/ext/filters/client_channel/lb_policy/address_filtering.h ) + s.files += %w( src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc ) + s.files += %w( src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h ) + s.files += %w( src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc ) + s.files += %w( src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h ) + s.files += %w( src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc ) + s.files += %w( src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h ) + s.files += %w( src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc ) + s.files += %w( src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h ) + s.files += %w( src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h ) + s.files += %w( src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc ) + s.files += %w( src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc ) + s.files += %w( src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h ) + s.files += %w( src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc ) + s.files += %w( src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h ) + s.files += %w( src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc ) + s.files += %w( src/core/ext/filters/client_channel/lb_policy/priority/priority.cc ) + s.files += %w( src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc ) + s.files += %w( src/core/ext/filters/client_channel/lb_policy/subchannel_list.h ) + s.files += %w( src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc ) + s.files += %w( src/core/ext/filters/client_channel/lb_policy/xds/cds.cc ) + s.files += %w( src/core/ext/filters/client_channel/lb_policy/xds/eds.cc ) + s.files += %w( src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc ) + s.files += %w( src/core/ext/filters/client_channel/lb_policy/xds/xds.h ) + s.files += %w( src/core/ext/filters/client_channel/lb_policy_factory.h ) + s.files += %w( src/core/ext/filters/client_channel/lb_policy_registry.cc ) + s.files += %w( src/core/ext/filters/client_channel/lb_policy_registry.h ) + s.files += %w( src/core/ext/filters/client_channel/local_subchannel_pool.cc ) + s.files += %w( src/core/ext/filters/client_channel/local_subchannel_pool.h ) + s.files += %w( src/core/ext/filters/client_channel/parse_address.cc ) + s.files += %w( src/core/ext/filters/client_channel/parse_address.h ) + s.files += %w( src/core/ext/filters/client_channel/proxy_mapper.h ) + s.files += %w( src/core/ext/filters/client_channel/proxy_mapper_registry.cc ) + s.files += %w( src/core/ext/filters/client_channel/proxy_mapper_registry.h ) + s.files += %w( src/core/ext/filters/client_channel/resolver.cc ) + s.files += %w( src/core/ext/filters/client_channel/resolver.h ) + s.files += %w( src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc ) + s.files += %w( src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc ) + s.files += %w( src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h ) + s.files += %w( src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc ) + s.files += %w( src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc ) + s.files += %w( src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc ) + s.files += %w( src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc ) + s.files += %w( src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h ) + s.files += %w( src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc ) + s.files += %w( src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_libuv.cc ) + s.files += %w( src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_posix.cc ) + s.files += %w( src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc ) + s.files += %w( src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.cc ) + s.files += %w( src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.h ) + s.files += %w( src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc ) + s.files += %w( src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc ) + s.files += %w( src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h ) + s.files += %w( src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc ) + s.files += %w( src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc ) + s.files += %w( src/core/ext/filters/client_channel/resolver_factory.h ) + s.files += %w( src/core/ext/filters/client_channel/resolver_registry.cc ) + s.files += %w( src/core/ext/filters/client_channel/resolver_registry.h ) + s.files += %w( src/core/ext/filters/client_channel/resolver_result_parsing.cc ) + s.files += %w( src/core/ext/filters/client_channel/resolver_result_parsing.h ) + s.files += %w( src/core/ext/filters/client_channel/resolving_lb_policy.cc ) + s.files += %w( src/core/ext/filters/client_channel/resolving_lb_policy.h ) + s.files += %w( src/core/ext/filters/client_channel/retry_throttle.cc ) + s.files += %w( src/core/ext/filters/client_channel/retry_throttle.h ) + s.files += %w( src/core/ext/filters/client_channel/server_address.cc ) + s.files += %w( src/core/ext/filters/client_channel/server_address.h ) + s.files += %w( src/core/ext/filters/client_channel/service_config.cc ) + s.files += %w( src/core/ext/filters/client_channel/service_config.h ) + s.files += %w( src/core/ext/filters/client_channel/subchannel.cc ) + s.files += %w( src/core/ext/filters/client_channel/subchannel.h ) + s.files += %w( src/core/ext/filters/client_channel/subchannel_interface.h ) + s.files += %w( src/core/ext/filters/client_channel/subchannel_pool_interface.cc ) + s.files += %w( src/core/ext/filters/client_channel/subchannel_pool_interface.h ) + s.files += %w( src/core/ext/filters/client_channel/xds/xds_api.cc ) + s.files += %w( src/core/ext/filters/client_channel/xds/xds_api.h ) + s.files += %w( src/core/ext/filters/client_channel/xds/xds_bootstrap.cc ) + s.files += %w( src/core/ext/filters/client_channel/xds/xds_bootstrap.h ) + s.files += %w( src/core/ext/filters/client_channel/xds/xds_channel.h ) + s.files += %w( src/core/ext/filters/client_channel/xds/xds_channel_args.h ) + s.files += %w( src/core/ext/filters/client_channel/xds/xds_channel_secure.cc ) + s.files += %w( src/core/ext/filters/client_channel/xds/xds_client.cc ) + s.files += %w( src/core/ext/filters/client_channel/xds/xds_client.h ) + s.files += %w( src/core/ext/filters/client_channel/xds/xds_client_stats.cc ) + s.files += %w( src/core/ext/filters/client_channel/xds/xds_client_stats.h ) + s.files += %w( src/core/ext/filters/client_idle/client_idle_filter.cc ) + s.files += %w( src/core/ext/filters/deadline/deadline_filter.cc ) + s.files += %w( src/core/ext/filters/deadline/deadline_filter.h ) + s.files += %w( src/core/ext/filters/http/client/http_client_filter.cc ) + s.files += %w( src/core/ext/filters/http/client/http_client_filter.h ) + s.files += %w( src/core/ext/filters/http/client_authority_filter.cc ) + s.files += %w( src/core/ext/filters/http/client_authority_filter.h ) + s.files += %w( src/core/ext/filters/http/http_filters_plugin.cc ) + s.files += %w( src/core/ext/filters/http/message_compress/message_compress_filter.cc ) + s.files += %w( src/core/ext/filters/http/message_compress/message_compress_filter.h ) + s.files += %w( src/core/ext/filters/http/server/http_server_filter.cc ) + s.files += %w( src/core/ext/filters/http/server/http_server_filter.h ) + s.files += %w( src/core/ext/filters/max_age/max_age_filter.cc ) + s.files += %w( src/core/ext/filters/max_age/max_age_filter.h ) + s.files += %w( src/core/ext/filters/message_size/message_size_filter.cc ) + s.files += %w( src/core/ext/filters/message_size/message_size_filter.h ) + s.files += %w( src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc ) + s.files += %w( src/core/ext/filters/workarounds/workaround_cronet_compression_filter.h ) + s.files += %w( src/core/ext/filters/workarounds/workaround_utils.cc ) + s.files += %w( src/core/ext/filters/workarounds/workaround_utils.h ) + s.files += %w( src/core/ext/transport/chttp2/alpn/alpn.cc ) + s.files += %w( src/core/ext/transport/chttp2/alpn/alpn.h ) + s.files += %w( src/core/ext/transport/chttp2/client/authority.cc ) + s.files += %w( src/core/ext/transport/chttp2/client/authority.h ) + s.files += %w( src/core/ext/transport/chttp2/client/chttp2_connector.cc ) + s.files += %w( src/core/ext/transport/chttp2/client/chttp2_connector.h ) + s.files += %w( src/core/ext/transport/chttp2/client/insecure/channel_create.cc ) + s.files += %w( src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc ) + s.files += %w( src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc ) + s.files += %w( src/core/ext/transport/chttp2/server/chttp2_server.cc ) + s.files += %w( src/core/ext/transport/chttp2/server/chttp2_server.h ) + s.files += %w( src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc ) + s.files += %w( src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc ) + s.files += %w( src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc ) + s.files += %w( src/core/ext/transport/chttp2/transport/bin_decoder.cc ) + s.files += %w( src/core/ext/transport/chttp2/transport/bin_decoder.h ) + s.files += %w( src/core/ext/transport/chttp2/transport/bin_encoder.cc ) + s.files += %w( src/core/ext/transport/chttp2/transport/bin_encoder.h ) + s.files += %w( src/core/ext/transport/chttp2/transport/chttp2_plugin.cc ) + s.files += %w( src/core/ext/transport/chttp2/transport/chttp2_transport.cc ) + s.files += %w( src/core/ext/transport/chttp2/transport/chttp2_transport.h ) + s.files += %w( src/core/ext/transport/chttp2/transport/context_list.cc ) + s.files += %w( src/core/ext/transport/chttp2/transport/context_list.h ) + s.files += %w( src/core/ext/transport/chttp2/transport/flow_control.cc ) + s.files += %w( src/core/ext/transport/chttp2/transport/flow_control.h ) + s.files += %w( src/core/ext/transport/chttp2/transport/frame.h ) + s.files += %w( src/core/ext/transport/chttp2/transport/frame_data.cc ) + s.files += %w( src/core/ext/transport/chttp2/transport/frame_data.h ) + s.files += %w( src/core/ext/transport/chttp2/transport/frame_goaway.cc ) + s.files += %w( src/core/ext/transport/chttp2/transport/frame_goaway.h ) + s.files += %w( src/core/ext/transport/chttp2/transport/frame_ping.cc ) + s.files += %w( src/core/ext/transport/chttp2/transport/frame_ping.h ) + s.files += %w( src/core/ext/transport/chttp2/transport/frame_rst_stream.cc ) + s.files += %w( src/core/ext/transport/chttp2/transport/frame_rst_stream.h ) + s.files += %w( src/core/ext/transport/chttp2/transport/frame_settings.cc ) + s.files += %w( src/core/ext/transport/chttp2/transport/frame_settings.h ) + s.files += %w( src/core/ext/transport/chttp2/transport/frame_window_update.cc ) + s.files += %w( src/core/ext/transport/chttp2/transport/frame_window_update.h ) + s.files += %w( src/core/ext/transport/chttp2/transport/hpack_encoder.cc ) + s.files += %w( src/core/ext/transport/chttp2/transport/hpack_encoder.h ) + s.files += %w( src/core/ext/transport/chttp2/transport/hpack_parser.cc ) + s.files += %w( src/core/ext/transport/chttp2/transport/hpack_parser.h ) + s.files += %w( src/core/ext/transport/chttp2/transport/hpack_table.cc ) + s.files += %w( src/core/ext/transport/chttp2/transport/hpack_table.h ) + s.files += %w( src/core/ext/transport/chttp2/transport/http2_settings.cc ) + s.files += %w( src/core/ext/transport/chttp2/transport/http2_settings.h ) + s.files += %w( src/core/ext/transport/chttp2/transport/huffsyms.cc ) + s.files += %w( src/core/ext/transport/chttp2/transport/huffsyms.h ) + s.files += %w( src/core/ext/transport/chttp2/transport/incoming_metadata.cc ) + s.files += %w( src/core/ext/transport/chttp2/transport/incoming_metadata.h ) + s.files += %w( src/core/ext/transport/chttp2/transport/internal.h ) + s.files += %w( src/core/ext/transport/chttp2/transport/parsing.cc ) + s.files += %w( src/core/ext/transport/chttp2/transport/stream_lists.cc ) + s.files += %w( src/core/ext/transport/chttp2/transport/stream_map.cc ) + s.files += %w( src/core/ext/transport/chttp2/transport/stream_map.h ) + s.files += %w( src/core/ext/transport/chttp2/transport/varint.cc ) + s.files += %w( src/core/ext/transport/chttp2/transport/varint.h ) + s.files += %w( src/core/ext/transport/chttp2/transport/writing.cc ) + s.files += %w( src/core/ext/transport/inproc/inproc_plugin.cc ) + s.files += %w( src/core/ext/transport/inproc/inproc_transport.cc ) + s.files += %w( src/core/ext/transport/inproc/inproc_transport.h ) + s.files += %w( src/core/ext/upb-generated/envoy/annotations/deprecation.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/annotations/resource.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/annotations/resource.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/cds.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/cds.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/cluster.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/cluster.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/address.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/address.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/base.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/discovery.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/eds.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/eds.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/lds.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/lds.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/listener.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/listener.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/rds.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/rds.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/route.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/route.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/route/route.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/route/route.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/srds.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/srds.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/type/http.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/type/http.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/type/matcher/regex.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/type/matcher/regex.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/type/matcher/string.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/type/matcher/string.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/type/percent.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/type/percent.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/type/range.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/type/range.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/type/semantic_version.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/type/semantic_version.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.h ) + s.files += %w( src/core/ext/upb-generated/gogoproto/gogo.upb.c ) + s.files += %w( src/core/ext/upb-generated/gogoproto/gogo.upb.h ) + s.files += %w( src/core/ext/upb-generated/google/api/annotations.upb.c ) + s.files += %w( src/core/ext/upb-generated/google/api/annotations.upb.h ) + s.files += %w( src/core/ext/upb-generated/google/api/http.upb.c ) + s.files += %w( src/core/ext/upb-generated/google/api/http.upb.h ) + s.files += %w( src/core/ext/upb-generated/google/protobuf/any.upb.c ) + s.files += %w( src/core/ext/upb-generated/google/protobuf/any.upb.h ) + s.files += %w( src/core/ext/upb-generated/google/protobuf/descriptor.upb.c ) + s.files += %w( src/core/ext/upb-generated/google/protobuf/descriptor.upb.h ) + s.files += %w( src/core/ext/upb-generated/google/protobuf/duration.upb.c ) + s.files += %w( src/core/ext/upb-generated/google/protobuf/duration.upb.h ) + s.files += %w( src/core/ext/upb-generated/google/protobuf/empty.upb.c ) + s.files += %w( src/core/ext/upb-generated/google/protobuf/empty.upb.h ) + s.files += %w( src/core/ext/upb-generated/google/protobuf/struct.upb.c ) + s.files += %w( src/core/ext/upb-generated/google/protobuf/struct.upb.h ) + s.files += %w( src/core/ext/upb-generated/google/protobuf/timestamp.upb.c ) + s.files += %w( src/core/ext/upb-generated/google/protobuf/timestamp.upb.h ) + s.files += %w( src/core/ext/upb-generated/google/protobuf/wrappers.upb.c ) + s.files += %w( src/core/ext/upb-generated/google/protobuf/wrappers.upb.h ) + s.files += %w( src/core/ext/upb-generated/google/rpc/status.upb.c ) + s.files += %w( src/core/ext/upb-generated/google/rpc/status.upb.h ) + s.files += %w( src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c ) + s.files += %w( src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h ) + s.files += %w( src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c ) + s.files += %w( src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h ) + s.files += %w( src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c ) + s.files += %w( src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h ) + s.files += %w( src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c ) + s.files += %w( src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h ) + s.files += %w( src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c ) + s.files += %w( src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h ) + s.files += %w( src/core/ext/upb-generated/udpa/annotations/migrate.upb.c ) + s.files += %w( src/core/ext/upb-generated/udpa/annotations/migrate.upb.h ) + s.files += %w( src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c ) + s.files += %w( src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h ) + s.files += %w( src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c ) + s.files += %w( src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h ) + s.files += %w( src/core/ext/upb-generated/validate/validate.upb.c ) + s.files += %w( src/core/ext/upb-generated/validate/validate.upb.h ) + s.files += %w( src/core/lib/avl/avl.cc ) + s.files += %w( src/core/lib/avl/avl.h ) + s.files += %w( src/core/lib/backoff/backoff.cc ) + s.files += %w( src/core/lib/backoff/backoff.h ) + s.files += %w( src/core/lib/channel/channel_args.cc ) + s.files += %w( src/core/lib/channel/channel_args.h ) + s.files += %w( src/core/lib/channel/channel_stack.cc ) + s.files += %w( src/core/lib/channel/channel_stack.h ) + s.files += %w( src/core/lib/channel/channel_stack_builder.cc ) + s.files += %w( src/core/lib/channel/channel_stack_builder.h ) + s.files += %w( src/core/lib/channel/channel_trace.cc ) + s.files += %w( src/core/lib/channel/channel_trace.h ) + s.files += %w( src/core/lib/channel/channelz.cc ) + s.files += %w( src/core/lib/channel/channelz.h ) + s.files += %w( src/core/lib/channel/channelz_registry.cc ) + s.files += %w( src/core/lib/channel/channelz_registry.h ) + s.files += %w( src/core/lib/channel/connected_channel.cc ) + s.files += %w( src/core/lib/channel/connected_channel.h ) + s.files += %w( src/core/lib/channel/context.h ) + s.files += %w( src/core/lib/channel/handshaker.cc ) + s.files += %w( src/core/lib/channel/handshaker.h ) + s.files += %w( src/core/lib/channel/handshaker_factory.h ) + s.files += %w( src/core/lib/channel/handshaker_registry.cc ) + s.files += %w( src/core/lib/channel/handshaker_registry.h ) + s.files += %w( src/core/lib/channel/status_util.cc ) + s.files += %w( src/core/lib/channel/status_util.h ) + s.files += %w( src/core/lib/compression/algorithm_metadata.h ) + s.files += %w( src/core/lib/compression/compression.cc ) + s.files += %w( src/core/lib/compression/compression_args.cc ) + s.files += %w( src/core/lib/compression/compression_args.h ) + s.files += %w( src/core/lib/compression/compression_internal.cc ) + s.files += %w( src/core/lib/compression/compression_internal.h ) + s.files += %w( src/core/lib/compression/message_compress.cc ) + s.files += %w( src/core/lib/compression/message_compress.h ) + s.files += %w( src/core/lib/compression/stream_compression.cc ) + s.files += %w( src/core/lib/compression/stream_compression.h ) + s.files += %w( src/core/lib/compression/stream_compression_gzip.cc ) + s.files += %w( src/core/lib/compression/stream_compression_gzip.h ) + s.files += %w( src/core/lib/compression/stream_compression_identity.cc ) + s.files += %w( src/core/lib/compression/stream_compression_identity.h ) + s.files += %w( src/core/lib/debug/stats.cc ) + s.files += %w( src/core/lib/debug/stats.h ) + s.files += %w( src/core/lib/debug/stats_data.cc ) + s.files += %w( src/core/lib/debug/stats_data.h ) + s.files += %w( src/core/lib/debug/trace.cc ) + s.files += %w( src/core/lib/debug/trace.h ) + s.files += %w( src/core/lib/gpr/alloc.cc ) + s.files += %w( src/core/lib/gpr/alloc.h ) + s.files += %w( src/core/lib/gpr/arena.h ) + s.files += %w( src/core/lib/gpr/atm.cc ) + s.files += %w( src/core/lib/gpr/cpu_iphone.cc ) + s.files += %w( src/core/lib/gpr/cpu_linux.cc ) + s.files += %w( src/core/lib/gpr/cpu_posix.cc ) + s.files += %w( src/core/lib/gpr/cpu_windows.cc ) + s.files += %w( src/core/lib/gpr/env.h ) + s.files += %w( src/core/lib/gpr/env_linux.cc ) + s.files += %w( src/core/lib/gpr/env_posix.cc ) + s.files += %w( src/core/lib/gpr/env_windows.cc ) + s.files += %w( src/core/lib/gpr/log.cc ) + s.files += %w( src/core/lib/gpr/log_android.cc ) + s.files += %w( src/core/lib/gpr/log_linux.cc ) + s.files += %w( src/core/lib/gpr/log_posix.cc ) + s.files += %w( src/core/lib/gpr/log_windows.cc ) + s.files += %w( src/core/lib/gpr/murmur_hash.cc ) + s.files += %w( src/core/lib/gpr/murmur_hash.h ) + s.files += %w( src/core/lib/gpr/spinlock.h ) + s.files += %w( src/core/lib/gpr/string.cc ) + s.files += %w( src/core/lib/gpr/string.h ) + s.files += %w( src/core/lib/gpr/string_posix.cc ) + s.files += %w( src/core/lib/gpr/string_util_windows.cc ) + s.files += %w( src/core/lib/gpr/string_windows.cc ) + s.files += %w( src/core/lib/gpr/string_windows.h ) + s.files += %w( src/core/lib/gpr/sync.cc ) + s.files += %w( src/core/lib/gpr/sync_abseil.cc ) + s.files += %w( src/core/lib/gpr/sync_posix.cc ) + s.files += %w( src/core/lib/gpr/sync_windows.cc ) + s.files += %w( src/core/lib/gpr/time.cc ) + s.files += %w( src/core/lib/gpr/time_posix.cc ) + s.files += %w( src/core/lib/gpr/time_precise.cc ) + s.files += %w( src/core/lib/gpr/time_precise.h ) + s.files += %w( src/core/lib/gpr/time_windows.cc ) + s.files += %w( src/core/lib/gpr/tls.h ) + s.files += %w( src/core/lib/gpr/tls_gcc.h ) + s.files += %w( src/core/lib/gpr/tls_msvc.h ) + s.files += %w( src/core/lib/gpr/tls_pthread.cc ) + s.files += %w( src/core/lib/gpr/tls_pthread.h ) + s.files += %w( src/core/lib/gpr/tmpfile.h ) + s.files += %w( src/core/lib/gpr/tmpfile_msys.cc ) + s.files += %w( src/core/lib/gpr/tmpfile_posix.cc ) + s.files += %w( src/core/lib/gpr/tmpfile_windows.cc ) + s.files += %w( src/core/lib/gpr/useful.h ) + s.files += %w( src/core/lib/gpr/wrap_memcpy.cc ) + s.files += %w( src/core/lib/gprpp/arena.cc ) + s.files += %w( src/core/lib/gprpp/arena.h ) + s.files += %w( src/core/lib/gprpp/atomic.h ) + s.files += %w( src/core/lib/gprpp/debug_location.h ) + s.files += %w( src/core/lib/gprpp/fork.cc ) + s.files += %w( src/core/lib/gprpp/fork.h ) + s.files += %w( src/core/lib/gprpp/global_config.h ) + s.files += %w( src/core/lib/gprpp/global_config_custom.h ) + s.files += %w( src/core/lib/gprpp/global_config_env.cc ) + s.files += %w( src/core/lib/gprpp/global_config_env.h ) + s.files += %w( src/core/lib/gprpp/global_config_generic.h ) + s.files += %w( src/core/lib/gprpp/host_port.cc ) + s.files += %w( src/core/lib/gprpp/host_port.h ) + s.files += %w( src/core/lib/gprpp/inlined_vector.h ) + s.files += %w( src/core/lib/gprpp/manual_constructor.h ) + s.files += %w( src/core/lib/gprpp/map.h ) + s.files += %w( src/core/lib/gprpp/memory.h ) + s.files += %w( src/core/lib/gprpp/mpscq.cc ) + s.files += %w( src/core/lib/gprpp/mpscq.h ) + s.files += %w( src/core/lib/gprpp/optional.h ) + s.files += %w( src/core/lib/gprpp/orphanable.h ) + s.files += %w( src/core/lib/gprpp/ref_counted.h ) + s.files += %w( src/core/lib/gprpp/ref_counted_ptr.h ) + s.files += %w( src/core/lib/gprpp/string_view.h ) + s.files += %w( src/core/lib/gprpp/sync.h ) + s.files += %w( src/core/lib/gprpp/thd.h ) + s.files += %w( src/core/lib/gprpp/thd_posix.cc ) + s.files += %w( src/core/lib/gprpp/thd_windows.cc ) + s.files += %w( src/core/lib/http/format_request.cc ) + s.files += %w( src/core/lib/http/format_request.h ) + s.files += %w( src/core/lib/http/httpcli.cc ) + s.files += %w( src/core/lib/http/httpcli.h ) + s.files += %w( src/core/lib/http/httpcli_security_connector.cc ) + s.files += %w( src/core/lib/http/parser.cc ) + s.files += %w( src/core/lib/http/parser.h ) + s.files += %w( src/core/lib/iomgr/block_annotate.h ) + s.files += %w( src/core/lib/iomgr/buffer_list.cc ) + s.files += %w( src/core/lib/iomgr/buffer_list.h ) + s.files += %w( src/core/lib/iomgr/call_combiner.cc ) + s.files += %w( src/core/lib/iomgr/call_combiner.h ) + s.files += %w( src/core/lib/iomgr/cfstream_handle.cc ) + s.files += %w( src/core/lib/iomgr/cfstream_handle.h ) + s.files += %w( src/core/lib/iomgr/closure.h ) + s.files += %w( src/core/lib/iomgr/combiner.cc ) + s.files += %w( src/core/lib/iomgr/combiner.h ) + s.files += %w( src/core/lib/iomgr/dualstack_socket_posix.cc ) + s.files += %w( src/core/lib/iomgr/dynamic_annotations.h ) + s.files += %w( src/core/lib/iomgr/endpoint.cc ) + s.files += %w( src/core/lib/iomgr/endpoint.h ) + s.files += %w( src/core/lib/iomgr/endpoint_cfstream.cc ) + s.files += %w( src/core/lib/iomgr/endpoint_cfstream.h ) + s.files += %w( src/core/lib/iomgr/endpoint_pair.h ) + s.files += %w( src/core/lib/iomgr/endpoint_pair_posix.cc ) + s.files += %w( src/core/lib/iomgr/endpoint_pair_uv.cc ) + s.files += %w( src/core/lib/iomgr/endpoint_pair_windows.cc ) + s.files += %w( src/core/lib/iomgr/error.cc ) + s.files += %w( src/core/lib/iomgr/error.h ) + s.files += %w( src/core/lib/iomgr/error_cfstream.cc ) + s.files += %w( src/core/lib/iomgr/error_cfstream.h ) + s.files += %w( src/core/lib/iomgr/error_internal.h ) + s.files += %w( src/core/lib/iomgr/ev_epoll1_linux.cc ) + s.files += %w( src/core/lib/iomgr/ev_epoll1_linux.h ) + s.files += %w( src/core/lib/iomgr/ev_epollex_linux.cc ) + s.files += %w( src/core/lib/iomgr/ev_epollex_linux.h ) + s.files += %w( src/core/lib/iomgr/ev_poll_posix.cc ) + s.files += %w( src/core/lib/iomgr/ev_poll_posix.h ) + s.files += %w( src/core/lib/iomgr/ev_posix.cc ) + s.files += %w( src/core/lib/iomgr/ev_posix.h ) + s.files += %w( src/core/lib/iomgr/ev_windows.cc ) + s.files += %w( src/core/lib/iomgr/exec_ctx.cc ) + s.files += %w( src/core/lib/iomgr/exec_ctx.h ) + s.files += %w( src/core/lib/iomgr/executor.cc ) + s.files += %w( src/core/lib/iomgr/executor.h ) + s.files += %w( src/core/lib/iomgr/executor/mpmcqueue.cc ) + s.files += %w( src/core/lib/iomgr/executor/mpmcqueue.h ) + s.files += %w( src/core/lib/iomgr/executor/threadpool.cc ) + s.files += %w( src/core/lib/iomgr/executor/threadpool.h ) + s.files += %w( src/core/lib/iomgr/fork_posix.cc ) + s.files += %w( src/core/lib/iomgr/fork_windows.cc ) + s.files += %w( src/core/lib/iomgr/gethostname.h ) + s.files += %w( src/core/lib/iomgr/gethostname_fallback.cc ) + s.files += %w( src/core/lib/iomgr/gethostname_host_name_max.cc ) + s.files += %w( src/core/lib/iomgr/gethostname_sysconf.cc ) + s.files += %w( src/core/lib/iomgr/grpc_if_nametoindex.h ) + s.files += %w( src/core/lib/iomgr/grpc_if_nametoindex_posix.cc ) + s.files += %w( src/core/lib/iomgr/grpc_if_nametoindex_unsupported.cc ) + s.files += %w( src/core/lib/iomgr/internal_errqueue.cc ) + s.files += %w( src/core/lib/iomgr/internal_errqueue.h ) + s.files += %w( src/core/lib/iomgr/iocp_windows.cc ) + s.files += %w( src/core/lib/iomgr/iocp_windows.h ) + s.files += %w( src/core/lib/iomgr/iomgr.cc ) + s.files += %w( src/core/lib/iomgr/iomgr.h ) + s.files += %w( src/core/lib/iomgr/iomgr_custom.cc ) + s.files += %w( src/core/lib/iomgr/iomgr_custom.h ) + s.files += %w( src/core/lib/iomgr/iomgr_internal.cc ) + s.files += %w( src/core/lib/iomgr/iomgr_internal.h ) + s.files += %w( src/core/lib/iomgr/iomgr_posix.cc ) + s.files += %w( src/core/lib/iomgr/iomgr_posix.h ) + s.files += %w( src/core/lib/iomgr/iomgr_posix_cfstream.cc ) + s.files += %w( src/core/lib/iomgr/iomgr_uv.cc ) + s.files += %w( src/core/lib/iomgr/iomgr_windows.cc ) + s.files += %w( src/core/lib/iomgr/is_epollexclusive_available.cc ) + s.files += %w( src/core/lib/iomgr/is_epollexclusive_available.h ) + s.files += %w( src/core/lib/iomgr/load_file.cc ) + s.files += %w( src/core/lib/iomgr/load_file.h ) + s.files += %w( src/core/lib/iomgr/lockfree_event.cc ) + s.files += %w( src/core/lib/iomgr/lockfree_event.h ) + s.files += %w( src/core/lib/iomgr/nameser.h ) + s.files += %w( src/core/lib/iomgr/poller/eventmanager_libuv.cc ) + s.files += %w( src/core/lib/iomgr/poller/eventmanager_libuv.h ) + s.files += %w( src/core/lib/iomgr/polling_entity.cc ) + s.files += %w( src/core/lib/iomgr/polling_entity.h ) + s.files += %w( src/core/lib/iomgr/pollset.cc ) + s.files += %w( src/core/lib/iomgr/pollset.h ) + s.files += %w( src/core/lib/iomgr/pollset_custom.cc ) + s.files += %w( src/core/lib/iomgr/pollset_custom.h ) + s.files += %w( src/core/lib/iomgr/pollset_set.cc ) + s.files += %w( src/core/lib/iomgr/pollset_set.h ) + s.files += %w( src/core/lib/iomgr/pollset_set_custom.cc ) + s.files += %w( src/core/lib/iomgr/pollset_set_custom.h ) + s.files += %w( src/core/lib/iomgr/pollset_set_windows.cc ) + s.files += %w( src/core/lib/iomgr/pollset_set_windows.h ) + s.files += %w( src/core/lib/iomgr/pollset_uv.cc ) + s.files += %w( src/core/lib/iomgr/pollset_uv.h ) + s.files += %w( src/core/lib/iomgr/pollset_windows.cc ) + s.files += %w( src/core/lib/iomgr/pollset_windows.h ) + s.files += %w( src/core/lib/iomgr/port.h ) + s.files += %w( src/core/lib/iomgr/python_util.h ) + s.files += %w( src/core/lib/iomgr/resolve_address.cc ) + s.files += %w( src/core/lib/iomgr/resolve_address.h ) + s.files += %w( src/core/lib/iomgr/resolve_address_custom.cc ) + s.files += %w( src/core/lib/iomgr/resolve_address_custom.h ) + s.files += %w( src/core/lib/iomgr/resolve_address_posix.cc ) + s.files += %w( src/core/lib/iomgr/resolve_address_windows.cc ) + s.files += %w( src/core/lib/iomgr/resource_quota.cc ) + s.files += %w( src/core/lib/iomgr/resource_quota.h ) + s.files += %w( src/core/lib/iomgr/sockaddr.h ) + s.files += %w( src/core/lib/iomgr/sockaddr_custom.h ) + s.files += %w( src/core/lib/iomgr/sockaddr_posix.h ) + s.files += %w( src/core/lib/iomgr/sockaddr_utils.cc ) + s.files += %w( src/core/lib/iomgr/sockaddr_utils.h ) + s.files += %w( src/core/lib/iomgr/sockaddr_windows.h ) + s.files += %w( src/core/lib/iomgr/socket_factory_posix.cc ) + s.files += %w( src/core/lib/iomgr/socket_factory_posix.h ) + s.files += %w( src/core/lib/iomgr/socket_mutator.cc ) + s.files += %w( src/core/lib/iomgr/socket_mutator.h ) + s.files += %w( src/core/lib/iomgr/socket_utils.h ) + s.files += %w( src/core/lib/iomgr/socket_utils_common_posix.cc ) + s.files += %w( src/core/lib/iomgr/socket_utils_linux.cc ) + s.files += %w( src/core/lib/iomgr/socket_utils_posix.cc ) + s.files += %w( src/core/lib/iomgr/socket_utils_posix.h ) + s.files += %w( src/core/lib/iomgr/socket_utils_uv.cc ) + s.files += %w( src/core/lib/iomgr/socket_utils_windows.cc ) + s.files += %w( src/core/lib/iomgr/socket_windows.cc ) + s.files += %w( src/core/lib/iomgr/socket_windows.h ) + s.files += %w( src/core/lib/iomgr/sys_epoll_wrapper.h ) + s.files += %w( src/core/lib/iomgr/tcp_client.cc ) + s.files += %w( src/core/lib/iomgr/tcp_client.h ) + s.files += %w( src/core/lib/iomgr/tcp_client_cfstream.cc ) + s.files += %w( src/core/lib/iomgr/tcp_client_custom.cc ) + s.files += %w( src/core/lib/iomgr/tcp_client_posix.cc ) + s.files += %w( src/core/lib/iomgr/tcp_client_posix.h ) + s.files += %w( src/core/lib/iomgr/tcp_client_windows.cc ) + s.files += %w( src/core/lib/iomgr/tcp_custom.cc ) + s.files += %w( src/core/lib/iomgr/tcp_custom.h ) + s.files += %w( src/core/lib/iomgr/tcp_posix.cc ) + s.files += %w( src/core/lib/iomgr/tcp_posix.h ) + s.files += %w( src/core/lib/iomgr/tcp_server.cc ) + s.files += %w( src/core/lib/iomgr/tcp_server.h ) + s.files += %w( src/core/lib/iomgr/tcp_server_custom.cc ) + s.files += %w( src/core/lib/iomgr/tcp_server_posix.cc ) + s.files += %w( src/core/lib/iomgr/tcp_server_utils_posix.h ) + s.files += %w( src/core/lib/iomgr/tcp_server_utils_posix_common.cc ) + s.files += %w( src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc ) + s.files += %w( src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.cc ) + s.files += %w( src/core/lib/iomgr/tcp_server_windows.cc ) + s.files += %w( src/core/lib/iomgr/tcp_uv.cc ) + s.files += %w( src/core/lib/iomgr/tcp_windows.cc ) + s.files += %w( src/core/lib/iomgr/tcp_windows.h ) + s.files += %w( src/core/lib/iomgr/time_averaged_stats.cc ) + s.files += %w( src/core/lib/iomgr/time_averaged_stats.h ) + s.files += %w( src/core/lib/iomgr/timer.cc ) + s.files += %w( src/core/lib/iomgr/timer.h ) + s.files += %w( src/core/lib/iomgr/timer_custom.cc ) + s.files += %w( src/core/lib/iomgr/timer_custom.h ) + s.files += %w( src/core/lib/iomgr/timer_generic.cc ) + s.files += %w( src/core/lib/iomgr/timer_generic.h ) + s.files += %w( src/core/lib/iomgr/timer_heap.cc ) + s.files += %w( src/core/lib/iomgr/timer_heap.h ) + s.files += %w( src/core/lib/iomgr/timer_manager.cc ) + s.files += %w( src/core/lib/iomgr/timer_manager.h ) + s.files += %w( src/core/lib/iomgr/timer_uv.cc ) + s.files += %w( src/core/lib/iomgr/udp_server.cc ) + s.files += %w( src/core/lib/iomgr/udp_server.h ) + s.files += %w( src/core/lib/iomgr/unix_sockets_posix.cc ) + s.files += %w( src/core/lib/iomgr/unix_sockets_posix.h ) + s.files += %w( src/core/lib/iomgr/unix_sockets_posix_noop.cc ) + s.files += %w( src/core/lib/iomgr/wakeup_fd_eventfd.cc ) + s.files += %w( src/core/lib/iomgr/wakeup_fd_nospecial.cc ) + s.files += %w( src/core/lib/iomgr/wakeup_fd_pipe.cc ) + s.files += %w( src/core/lib/iomgr/wakeup_fd_pipe.h ) + s.files += %w( src/core/lib/iomgr/wakeup_fd_posix.cc ) + s.files += %w( src/core/lib/iomgr/wakeup_fd_posix.h ) + s.files += %w( src/core/lib/iomgr/work_serializer.cc ) + s.files += %w( src/core/lib/iomgr/work_serializer.h ) + s.files += %w( src/core/lib/json/json.h ) + s.files += %w( src/core/lib/json/json_reader.cc ) + s.files += %w( src/core/lib/json/json_writer.cc ) + s.files += %w( src/core/lib/profiling/basic_timers.cc ) + s.files += %w( src/core/lib/profiling/stap_timers.cc ) + s.files += %w( src/core/lib/profiling/timers.h ) + s.files += %w( src/core/lib/security/context/security_context.cc ) + s.files += %w( src/core/lib/security/context/security_context.h ) + s.files += %w( src/core/lib/security/credentials/alts/alts_credentials.cc ) + s.files += %w( src/core/lib/security/credentials/alts/alts_credentials.h ) + s.files += %w( src/core/lib/security/credentials/alts/check_gcp_environment.cc ) + s.files += %w( src/core/lib/security/credentials/alts/check_gcp_environment.h ) + s.files += %w( src/core/lib/security/credentials/alts/check_gcp_environment_linux.cc ) + s.files += %w( src/core/lib/security/credentials/alts/check_gcp_environment_no_op.cc ) + s.files += %w( src/core/lib/security/credentials/alts/check_gcp_environment_windows.cc ) + s.files += %w( src/core/lib/security/credentials/alts/grpc_alts_credentials_client_options.cc ) + s.files += %w( src/core/lib/security/credentials/alts/grpc_alts_credentials_options.cc ) + s.files += %w( src/core/lib/security/credentials/alts/grpc_alts_credentials_options.h ) + s.files += %w( src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc ) + s.files += %w( src/core/lib/security/credentials/composite/composite_credentials.cc ) + s.files += %w( src/core/lib/security/credentials/composite/composite_credentials.h ) + s.files += %w( src/core/lib/security/credentials/credentials.cc ) + s.files += %w( src/core/lib/security/credentials/credentials.h ) + s.files += %w( src/core/lib/security/credentials/credentials_metadata.cc ) + s.files += %w( src/core/lib/security/credentials/fake/fake_credentials.cc ) + s.files += %w( src/core/lib/security/credentials/fake/fake_credentials.h ) + s.files += %w( src/core/lib/security/credentials/google_default/credentials_generic.cc ) + s.files += %w( src/core/lib/security/credentials/google_default/google_default_credentials.cc ) + s.files += %w( src/core/lib/security/credentials/google_default/google_default_credentials.h ) + s.files += %w( src/core/lib/security/credentials/iam/iam_credentials.cc ) + s.files += %w( src/core/lib/security/credentials/iam/iam_credentials.h ) + s.files += %w( src/core/lib/security/credentials/jwt/json_token.cc ) + s.files += %w( src/core/lib/security/credentials/jwt/json_token.h ) + s.files += %w( src/core/lib/security/credentials/jwt/jwt_credentials.cc ) + s.files += %w( src/core/lib/security/credentials/jwt/jwt_credentials.h ) + s.files += %w( src/core/lib/security/credentials/jwt/jwt_verifier.cc ) + s.files += %w( src/core/lib/security/credentials/jwt/jwt_verifier.h ) + s.files += %w( src/core/lib/security/credentials/local/local_credentials.cc ) + s.files += %w( src/core/lib/security/credentials/local/local_credentials.h ) + s.files += %w( src/core/lib/security/credentials/oauth2/oauth2_credentials.cc ) + s.files += %w( src/core/lib/security/credentials/oauth2/oauth2_credentials.h ) + s.files += %w( src/core/lib/security/credentials/plugin/plugin_credentials.cc ) + s.files += %w( src/core/lib/security/credentials/plugin/plugin_credentials.h ) + s.files += %w( src/core/lib/security/credentials/ssl/ssl_credentials.cc ) + s.files += %w( src/core/lib/security/credentials/ssl/ssl_credentials.h ) + s.files += %w( src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc ) + s.files += %w( src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h ) + s.files += %w( src/core/lib/security/credentials/tls/tls_credentials.cc ) + s.files += %w( src/core/lib/security/credentials/tls/tls_credentials.h ) + s.files += %w( src/core/lib/security/security_connector/alts/alts_security_connector.cc ) + s.files += %w( src/core/lib/security/security_connector/alts/alts_security_connector.h ) + s.files += %w( src/core/lib/security/security_connector/fake/fake_security_connector.cc ) + s.files += %w( src/core/lib/security/security_connector/fake/fake_security_connector.h ) + s.files += %w( src/core/lib/security/security_connector/load_system_roots.h ) + s.files += %w( src/core/lib/security/security_connector/load_system_roots_fallback.cc ) + s.files += %w( src/core/lib/security/security_connector/load_system_roots_linux.cc ) + s.files += %w( src/core/lib/security/security_connector/load_system_roots_linux.h ) + s.files += %w( src/core/lib/security/security_connector/local/local_security_connector.cc ) + s.files += %w( src/core/lib/security/security_connector/local/local_security_connector.h ) + s.files += %w( src/core/lib/security/security_connector/security_connector.cc ) + s.files += %w( src/core/lib/security/security_connector/security_connector.h ) + s.files += %w( src/core/lib/security/security_connector/ssl/ssl_security_connector.cc ) + s.files += %w( src/core/lib/security/security_connector/ssl/ssl_security_connector.h ) + s.files += %w( src/core/lib/security/security_connector/ssl_utils.cc ) + s.files += %w( src/core/lib/security/security_connector/ssl_utils.h ) + s.files += %w( src/core/lib/security/security_connector/ssl_utils_config.cc ) + s.files += %w( src/core/lib/security/security_connector/ssl_utils_config.h ) + s.files += %w( src/core/lib/security/security_connector/tls/tls_security_connector.cc ) + s.files += %w( src/core/lib/security/security_connector/tls/tls_security_connector.h ) + s.files += %w( src/core/lib/security/transport/auth_filters.h ) + s.files += %w( src/core/lib/security/transport/client_auth_filter.cc ) + s.files += %w( src/core/lib/security/transport/secure_endpoint.cc ) + s.files += %w( src/core/lib/security/transport/secure_endpoint.h ) + s.files += %w( src/core/lib/security/transport/security_handshaker.cc ) + s.files += %w( src/core/lib/security/transport/security_handshaker.h ) + s.files += %w( src/core/lib/security/transport/server_auth_filter.cc ) + s.files += %w( src/core/lib/security/transport/target_authority_table.cc ) + s.files += %w( src/core/lib/security/transport/target_authority_table.h ) + s.files += %w( src/core/lib/security/transport/tsi_error.cc ) + s.files += %w( src/core/lib/security/transport/tsi_error.h ) + s.files += %w( src/core/lib/security/util/json_util.cc ) + s.files += %w( src/core/lib/security/util/json_util.h ) + s.files += %w( src/core/lib/slice/b64.cc ) + s.files += %w( src/core/lib/slice/b64.h ) + s.files += %w( src/core/lib/slice/percent_encoding.cc ) + s.files += %w( src/core/lib/slice/percent_encoding.h ) + s.files += %w( src/core/lib/slice/slice.cc ) + s.files += %w( src/core/lib/slice/slice_buffer.cc ) + s.files += %w( src/core/lib/slice/slice_hash_table.h ) + s.files += %w( src/core/lib/slice/slice_intern.cc ) + s.files += %w( src/core/lib/slice/slice_internal.h ) + s.files += %w( src/core/lib/slice/slice_string_helpers.cc ) + s.files += %w( src/core/lib/slice/slice_string_helpers.h ) + s.files += %w( src/core/lib/slice/slice_utils.h ) + s.files += %w( src/core/lib/slice/slice_weak_hash_table.h ) + s.files += %w( src/core/lib/surface/api_trace.cc ) + s.files += %w( src/core/lib/surface/api_trace.h ) + s.files += %w( src/core/lib/surface/byte_buffer.cc ) + s.files += %w( src/core/lib/surface/byte_buffer_reader.cc ) + s.files += %w( src/core/lib/surface/call.cc ) + s.files += %w( src/core/lib/surface/call.h ) + s.files += %w( src/core/lib/surface/call_details.cc ) + s.files += %w( src/core/lib/surface/call_log_batch.cc ) + s.files += %w( src/core/lib/surface/call_test_only.h ) + s.files += %w( src/core/lib/surface/channel.cc ) + s.files += %w( src/core/lib/surface/channel.h ) + s.files += %w( src/core/lib/surface/channel_init.cc ) + s.files += %w( src/core/lib/surface/channel_init.h ) + s.files += %w( src/core/lib/surface/channel_ping.cc ) + s.files += %w( src/core/lib/surface/channel_stack_type.cc ) + s.files += %w( src/core/lib/surface/channel_stack_type.h ) + s.files += %w( src/core/lib/surface/completion_queue.cc ) + s.files += %w( src/core/lib/surface/completion_queue.h ) + s.files += %w( src/core/lib/surface/completion_queue_factory.cc ) + s.files += %w( src/core/lib/surface/completion_queue_factory.h ) + s.files += %w( src/core/lib/surface/event_string.cc ) + s.files += %w( src/core/lib/surface/event_string.h ) + s.files += %w( src/core/lib/surface/init.cc ) + s.files += %w( src/core/lib/surface/init.h ) + s.files += %w( src/core/lib/surface/init_secure.cc ) + s.files += %w( src/core/lib/surface/lame_client.cc ) + s.files += %w( src/core/lib/surface/lame_client.h ) + s.files += %w( src/core/lib/surface/metadata_array.cc ) + s.files += %w( src/core/lib/surface/server.cc ) + s.files += %w( src/core/lib/surface/server.h ) + s.files += %w( src/core/lib/surface/validate_metadata.cc ) + s.files += %w( src/core/lib/surface/validate_metadata.h ) + s.files += %w( src/core/lib/surface/version.cc ) + s.files += %w( src/core/lib/transport/bdp_estimator.cc ) + s.files += %w( src/core/lib/transport/bdp_estimator.h ) + s.files += %w( src/core/lib/transport/byte_stream.cc ) + s.files += %w( src/core/lib/transport/byte_stream.h ) + s.files += %w( src/core/lib/transport/connectivity_state.cc ) + s.files += %w( src/core/lib/transport/connectivity_state.h ) + s.files += %w( src/core/lib/transport/error_utils.cc ) + s.files += %w( src/core/lib/transport/error_utils.h ) + s.files += %w( src/core/lib/transport/http2_errors.h ) + s.files += %w( src/core/lib/transport/metadata.cc ) + s.files += %w( src/core/lib/transport/metadata.h ) + s.files += %w( src/core/lib/transport/metadata_batch.cc ) + s.files += %w( src/core/lib/transport/metadata_batch.h ) + s.files += %w( src/core/lib/transport/pid_controller.cc ) + s.files += %w( src/core/lib/transport/pid_controller.h ) + s.files += %w( src/core/lib/transport/static_metadata.cc ) + s.files += %w( src/core/lib/transport/static_metadata.h ) + s.files += %w( src/core/lib/transport/status_conversion.cc ) + s.files += %w( src/core/lib/transport/status_conversion.h ) + s.files += %w( src/core/lib/transport/status_metadata.cc ) + s.files += %w( src/core/lib/transport/status_metadata.h ) + s.files += %w( src/core/lib/transport/timeout_encoding.cc ) + s.files += %w( src/core/lib/transport/timeout_encoding.h ) + s.files += %w( src/core/lib/transport/transport.cc ) + s.files += %w( src/core/lib/transport/transport.h ) + s.files += %w( src/core/lib/transport/transport_impl.h ) + s.files += %w( src/core/lib/transport/transport_op_string.cc ) + s.files += %w( src/core/lib/uri/uri_parser.cc ) + s.files += %w( src/core/lib/uri/uri_parser.h ) + s.files += %w( src/core/plugin_registry/grpc_plugin_registry.cc ) + s.files += %w( src/core/tsi/alts/crypt/aes_gcm.cc ) + s.files += %w( src/core/tsi/alts/crypt/gsec.cc ) + s.files += %w( src/core/tsi/alts/crypt/gsec.h ) + s.files += %w( src/core/tsi/alts/frame_protector/alts_counter.cc ) + s.files += %w( src/core/tsi/alts/frame_protector/alts_counter.h ) + s.files += %w( src/core/tsi/alts/frame_protector/alts_crypter.cc ) + s.files += %w( src/core/tsi/alts/frame_protector/alts_crypter.h ) + s.files += %w( src/core/tsi/alts/frame_protector/alts_frame_protector.cc ) + s.files += %w( src/core/tsi/alts/frame_protector/alts_frame_protector.h ) + s.files += %w( src/core/tsi/alts/frame_protector/alts_record_protocol_crypter_common.cc ) + s.files += %w( src/core/tsi/alts/frame_protector/alts_record_protocol_crypter_common.h ) + s.files += %w( src/core/tsi/alts/frame_protector/alts_seal_privacy_integrity_crypter.cc ) + s.files += %w( src/core/tsi/alts/frame_protector/alts_unseal_privacy_integrity_crypter.cc ) + s.files += %w( src/core/tsi/alts/frame_protector/frame_handler.cc ) + s.files += %w( src/core/tsi/alts/frame_protector/frame_handler.h ) + s.files += %w( src/core/tsi/alts/handshaker/alts_handshaker_client.cc ) + s.files += %w( src/core/tsi/alts/handshaker/alts_handshaker_client.h ) + s.files += %w( src/core/tsi/alts/handshaker/alts_shared_resource.cc ) + s.files += %w( src/core/tsi/alts/handshaker/alts_shared_resource.h ) + s.files += %w( src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc ) + s.files += %w( src/core/tsi/alts/handshaker/alts_tsi_handshaker.h ) + s.files += %w( src/core/tsi/alts/handshaker/alts_tsi_handshaker_private.h ) + s.files += %w( src/core/tsi/alts/handshaker/alts_tsi_utils.cc ) + s.files += %w( src/core/tsi/alts/handshaker/alts_tsi_utils.h ) + s.files += %w( src/core/tsi/alts/handshaker/transport_security_common_api.cc ) + s.files += %w( src/core/tsi/alts/handshaker/transport_security_common_api.h ) + s.files += %w( src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc ) + s.files += %w( src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.h ) + s.files += %w( src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.cc ) + s.files += %w( src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.h ) + s.files += %w( src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol.h ) + s.files += %w( src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc ) + s.files += %w( src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.h ) + s.files += %w( src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.cc ) + s.files += %w( src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.h ) + s.files += %w( src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc ) + s.files += %w( src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.h ) + s.files += %w( src/core/tsi/fake_transport_security.cc ) + s.files += %w( src/core/tsi/fake_transport_security.h ) + s.files += %w( src/core/tsi/grpc_shadow_boringssl.h ) + s.files += %w( src/core/tsi/local_transport_security.cc ) + s.files += %w( src/core/tsi/local_transport_security.h ) + s.files += %w( src/core/tsi/ssl/session_cache/ssl_session.h ) + s.files += %w( src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc ) + s.files += %w( src/core/tsi/ssl/session_cache/ssl_session_cache.cc ) + s.files += %w( src/core/tsi/ssl/session_cache/ssl_session_cache.h ) + s.files += %w( src/core/tsi/ssl/session_cache/ssl_session_openssl.cc ) + s.files += %w( src/core/tsi/ssl_transport_security.cc ) + s.files += %w( src/core/tsi/ssl_transport_security.h ) + s.files += %w( src/core/tsi/ssl_types.h ) + s.files += %w( src/core/tsi/transport_security.cc ) + s.files += %w( src/core/tsi/transport_security.h ) + s.files += %w( src/core/tsi/transport_security_grpc.cc ) + s.files += %w( src/core/tsi/transport_security_grpc.h ) + s.files += %w( src/core/tsi/transport_security_interface.h ) + s.files += %w( third_party/abseil-cpp/absl/algorithm/algorithm.h ) + s.files += %w( third_party/abseil-cpp/absl/base/attributes.h ) + s.files += %w( third_party/abseil-cpp/absl/base/call_once.h ) + s.files += %w( third_party/abseil-cpp/absl/base/casts.h ) + s.files += %w( third_party/abseil-cpp/absl/base/config.h ) + s.files += %w( third_party/abseil-cpp/absl/base/const_init.h ) + s.files += %w( third_party/abseil-cpp/absl/base/dynamic_annotations.cc ) + s.files += %w( third_party/abseil-cpp/absl/base/dynamic_annotations.h ) + s.files += %w( third_party/abseil-cpp/absl/base/internal/atomic_hook.h ) + s.files += %w( third_party/abseil-cpp/absl/base/internal/bits.h ) + s.files += %w( third_party/abseil-cpp/absl/base/internal/cycleclock.cc ) + s.files += %w( third_party/abseil-cpp/absl/base/internal/cycleclock.h ) + s.files += %w( third_party/abseil-cpp/absl/base/internal/endian.h ) + s.files += %w( third_party/abseil-cpp/absl/base/internal/errno_saver.h ) + s.files += %w( third_party/abseil-cpp/absl/base/internal/hide_ptr.h ) + s.files += %w( third_party/abseil-cpp/absl/base/internal/identity.h ) + s.files += %w( third_party/abseil-cpp/absl/base/internal/inline_variable.h ) + s.files += %w( third_party/abseil-cpp/absl/base/internal/invoke.h ) + s.files += %w( third_party/abseil-cpp/absl/base/internal/low_level_scheduling.h ) + s.files += %w( third_party/abseil-cpp/absl/base/internal/per_thread_tls.h ) + s.files += %w( third_party/abseil-cpp/absl/base/internal/raw_logging.cc ) + s.files += %w( third_party/abseil-cpp/absl/base/internal/raw_logging.h ) + s.files += %w( third_party/abseil-cpp/absl/base/internal/scheduling_mode.h ) + s.files += %w( third_party/abseil-cpp/absl/base/internal/spinlock.cc ) + s.files += %w( third_party/abseil-cpp/absl/base/internal/spinlock.h ) + s.files += %w( third_party/abseil-cpp/absl/base/internal/spinlock_akaros.inc ) + s.files += %w( third_party/abseil-cpp/absl/base/internal/spinlock_linux.inc ) + s.files += %w( third_party/abseil-cpp/absl/base/internal/spinlock_posix.inc ) + s.files += %w( third_party/abseil-cpp/absl/base/internal/spinlock_wait.cc ) + s.files += %w( third_party/abseil-cpp/absl/base/internal/spinlock_wait.h ) + s.files += %w( third_party/abseil-cpp/absl/base/internal/spinlock_win32.inc ) + s.files += %w( third_party/abseil-cpp/absl/base/internal/sysinfo.cc ) + s.files += %w( third_party/abseil-cpp/absl/base/internal/sysinfo.h ) + s.files += %w( third_party/abseil-cpp/absl/base/internal/thread_annotations.h ) + s.files += %w( third_party/abseil-cpp/absl/base/internal/thread_identity.cc ) + s.files += %w( third_party/abseil-cpp/absl/base/internal/thread_identity.h ) + s.files += %w( third_party/abseil-cpp/absl/base/internal/throw_delegate.cc ) + s.files += %w( third_party/abseil-cpp/absl/base/internal/throw_delegate.h ) + s.files += %w( third_party/abseil-cpp/absl/base/internal/tsan_mutex_interface.h ) + s.files += %w( third_party/abseil-cpp/absl/base/internal/unaligned_access.h ) + s.files += %w( third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc ) + s.files += %w( third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h ) + s.files += %w( third_party/abseil-cpp/absl/base/log_severity.cc ) + s.files += %w( third_party/abseil-cpp/absl/base/log_severity.h ) + s.files += %w( third_party/abseil-cpp/absl/base/macros.h ) + s.files += %w( third_party/abseil-cpp/absl/base/optimization.h ) + s.files += %w( third_party/abseil-cpp/absl/base/options.h ) + s.files += %w( third_party/abseil-cpp/absl/base/policy_checks.h ) + s.files += %w( third_party/abseil-cpp/absl/base/port.h ) + s.files += %w( third_party/abseil-cpp/absl/base/thread_annotations.h ) + s.files += %w( third_party/abseil-cpp/absl/container/inlined_vector.h ) + s.files += %w( third_party/abseil-cpp/absl/container/internal/compressed_tuple.h ) + s.files += %w( third_party/abseil-cpp/absl/container/internal/inlined_vector.h ) + s.files += %w( third_party/abseil-cpp/absl/memory/memory.h ) + s.files += %w( third_party/abseil-cpp/absl/meta/type_traits.h ) + s.files += %w( third_party/abseil-cpp/absl/numeric/int128.cc ) + s.files += %w( third_party/abseil-cpp/absl/numeric/int128.h ) + s.files += %w( third_party/abseil-cpp/absl/numeric/int128_have_intrinsic.inc ) + s.files += %w( third_party/abseil-cpp/absl/numeric/int128_no_intrinsic.inc ) + s.files += %w( third_party/abseil-cpp/absl/strings/ascii.cc ) + s.files += %w( third_party/abseil-cpp/absl/strings/ascii.h ) + s.files += %w( third_party/abseil-cpp/absl/strings/charconv.cc ) + s.files += %w( third_party/abseil-cpp/absl/strings/charconv.h ) + s.files += %w( third_party/abseil-cpp/absl/strings/escaping.cc ) + s.files += %w( third_party/abseil-cpp/absl/strings/escaping.h ) + s.files += %w( third_party/abseil-cpp/absl/strings/internal/char_map.h ) + s.files += %w( third_party/abseil-cpp/absl/strings/internal/charconv_bigint.cc ) + s.files += %w( third_party/abseil-cpp/absl/strings/internal/charconv_bigint.h ) + s.files += %w( third_party/abseil-cpp/absl/strings/internal/charconv_parse.cc ) + s.files += %w( third_party/abseil-cpp/absl/strings/internal/charconv_parse.h ) + s.files += %w( third_party/abseil-cpp/absl/strings/internal/escaping.cc ) + s.files += %w( third_party/abseil-cpp/absl/strings/internal/escaping.h ) + s.files += %w( third_party/abseil-cpp/absl/strings/internal/memutil.cc ) + s.files += %w( third_party/abseil-cpp/absl/strings/internal/memutil.h ) + s.files += %w( third_party/abseil-cpp/absl/strings/internal/ostringstream.cc ) + s.files += %w( third_party/abseil-cpp/absl/strings/internal/ostringstream.h ) + s.files += %w( third_party/abseil-cpp/absl/strings/internal/resize_uninitialized.h ) + s.files += %w( third_party/abseil-cpp/absl/strings/internal/stl_type_traits.h ) + s.files += %w( third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc ) + s.files += %w( third_party/abseil-cpp/absl/strings/internal/str_format/arg.h ) + s.files += %w( third_party/abseil-cpp/absl/strings/internal/str_format/bind.cc ) + s.files += %w( third_party/abseil-cpp/absl/strings/internal/str_format/bind.h ) + s.files += %w( third_party/abseil-cpp/absl/strings/internal/str_format/checker.h ) + s.files += %w( third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc ) + s.files += %w( third_party/abseil-cpp/absl/strings/internal/str_format/extension.h ) + s.files += %w( third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc ) + s.files += %w( third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.h ) + s.files += %w( third_party/abseil-cpp/absl/strings/internal/str_format/output.cc ) + s.files += %w( third_party/abseil-cpp/absl/strings/internal/str_format/output.h ) + s.files += %w( third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc ) + s.files += %w( third_party/abseil-cpp/absl/strings/internal/str_format/parser.h ) + s.files += %w( third_party/abseil-cpp/absl/strings/internal/str_join_internal.h ) + s.files += %w( third_party/abseil-cpp/absl/strings/internal/str_split_internal.h ) + s.files += %w( third_party/abseil-cpp/absl/strings/internal/utf8.cc ) + s.files += %w( third_party/abseil-cpp/absl/strings/internal/utf8.h ) + s.files += %w( third_party/abseil-cpp/absl/strings/match.cc ) + s.files += %w( third_party/abseil-cpp/absl/strings/match.h ) + s.files += %w( third_party/abseil-cpp/absl/strings/numbers.cc ) + s.files += %w( third_party/abseil-cpp/absl/strings/numbers.h ) + s.files += %w( third_party/abseil-cpp/absl/strings/str_cat.cc ) + s.files += %w( third_party/abseil-cpp/absl/strings/str_cat.h ) + s.files += %w( third_party/abseil-cpp/absl/strings/str_format.h ) + s.files += %w( third_party/abseil-cpp/absl/strings/str_join.h ) + s.files += %w( third_party/abseil-cpp/absl/strings/str_replace.cc ) + s.files += %w( third_party/abseil-cpp/absl/strings/str_replace.h ) + s.files += %w( third_party/abseil-cpp/absl/strings/str_split.cc ) + s.files += %w( third_party/abseil-cpp/absl/strings/str_split.h ) + s.files += %w( third_party/abseil-cpp/absl/strings/string_view.cc ) + s.files += %w( third_party/abseil-cpp/absl/strings/string_view.h ) + s.files += %w( third_party/abseil-cpp/absl/strings/strip.h ) + s.files += %w( third_party/abseil-cpp/absl/strings/substitute.cc ) + s.files += %w( third_party/abseil-cpp/absl/strings/substitute.h ) + s.files += %w( third_party/abseil-cpp/absl/time/civil_time.cc ) + s.files += %w( third_party/abseil-cpp/absl/time/civil_time.h ) + s.files += %w( third_party/abseil-cpp/absl/time/clock.cc ) + s.files += %w( third_party/abseil-cpp/absl/time/clock.h ) + s.files += %w( third_party/abseil-cpp/absl/time/duration.cc ) + s.files += %w( third_party/abseil-cpp/absl/time/format.cc ) + s.files += %w( third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time.h ) + s.files += %w( third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h ) + s.files += %w( third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h ) + s.files += %w( third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/zone_info_source.h ) + s.files += %w( third_party/abseil-cpp/absl/time/internal/cctz/src/civil_time_detail.cc ) + s.files += %w( third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_fixed.cc ) + s.files += %w( third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_fixed.h ) + s.files += %w( third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc ) + s.files += %w( third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_if.cc ) + s.files += %w( third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_if.h ) + s.files += %w( third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.cc ) + s.files += %w( third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.h ) + s.files += %w( third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.cc ) + s.files += %w( third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.h ) + s.files += %w( third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.cc ) + s.files += %w( third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.h ) + s.files += %w( third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc ) + s.files += %w( third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_posix.cc ) + s.files += %w( third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_posix.h ) + s.files += %w( third_party/abseil-cpp/absl/time/internal/cctz/src/tzfile.h ) + s.files += %w( third_party/abseil-cpp/absl/time/internal/cctz/src/zone_info_source.cc ) + s.files += %w( third_party/abseil-cpp/absl/time/internal/get_current_time_chrono.inc ) + s.files += %w( third_party/abseil-cpp/absl/time/internal/get_current_time_posix.inc ) + s.files += %w( third_party/abseil-cpp/absl/time/time.cc ) + s.files += %w( third_party/abseil-cpp/absl/time/time.h ) + s.files += %w( third_party/abseil-cpp/absl/types/bad_optional_access.cc ) + s.files += %w( third_party/abseil-cpp/absl/types/bad_optional_access.h ) + s.files += %w( third_party/abseil-cpp/absl/types/internal/optional.h ) + s.files += %w( third_party/abseil-cpp/absl/types/internal/span.h ) + s.files += %w( third_party/abseil-cpp/absl/types/optional.h ) + s.files += %w( third_party/abseil-cpp/absl/types/span.h ) + s.files += %w( third_party/abseil-cpp/absl/utility/utility.h ) + s.files += %w( third_party/address_sorting/address_sorting.c ) + s.files += %w( third_party/address_sorting/address_sorting_internal.h ) + s.files += %w( third_party/address_sorting/address_sorting_posix.c ) + s.files += %w( third_party/address_sorting/address_sorting_windows.c ) + s.files += %w( third_party/address_sorting/include/address_sorting/address_sorting.h ) + s.files += %w( third_party/boringssl-with-bazel/err_data.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/a_bitstr.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/a_bool.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/a_d2i_fp.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/a_dup.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/a_enum.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/a_gentm.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/a_i2d_fp.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/a_int.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/a_mbstr.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/a_octet.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/a_print.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/a_strnid.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/a_time.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/a_type.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/a_utctm.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/a_utf8.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/asn1_locl.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/asn1_par.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/asn_pack.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/f_enum.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/f_int.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/f_string.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/tasn_fre.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/tasn_new.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/tasn_typ.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/tasn_utl.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/time_support.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/base64/base64.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/bio/bio.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/bio/bio_mem.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/bio/connect.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/bio/fd.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/bio/file.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/bio/hexdump.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/bio/internal.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/bio/pair.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/bio/printf.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/bio/socket.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/bio/socket_helper.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/bn_extra/bn_asn1.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/bn_extra/convert.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/buf/buf.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/bytestring/asn1_compat.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/bytestring/ber.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/bytestring/cbb.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/bytestring/cbs.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/bytestring/internal.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/bytestring/unicode.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/chacha/chacha.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/chacha/internal.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/cipher_extra/cipher_extra.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/cipher_extra/derive_key.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_aesccm.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_aesctrhmac.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_aesgcmsiv.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_chacha20poly1305.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_null.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_rc2.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_rc4.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_tls.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/cipher_extra/internal.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/cipher_extra/tls_cbc.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/cmac/cmac.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/conf/conf.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/conf/conf_def.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/conf/internal.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/cpu-aarch64-fuchsia.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/cpu-aarch64-linux.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/cpu-arm-linux.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/cpu-arm-linux.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/cpu-arm.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/cpu-intel.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/cpu-ppc64le.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/crypto.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/curve25519/spake25519.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/dh/check.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/dh/dh.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/dh/dh_asn1.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/dh/params.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/digest_extra/digest_extra.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/dsa/dsa_asn1.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/ec_extra/ec_asn1.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/ec_extra/ec_derive.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/ecdh_extra/ecdh_extra.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/ecdsa_extra/ecdsa_asn1.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/engine/engine.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/err/err.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/err/internal.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/digestsign.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/evp.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/evp_asn1.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/evp_ctx.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/internal.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/p_dsa_asn1.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/p_ec.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/p_ec_asn1.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/p_ed25519.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/p_ed25519_asn1.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/p_rsa.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/p_rsa_asn1.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/p_x25519.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/p_x25519_asn1.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/pbkdf.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/print.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/scrypt.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/sign.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/ex_data.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/aes.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/aes_nohw.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/internal.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/key_wrap.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/mode_wrappers.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/add.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/asm/x86_64-gcc.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/bn.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/bytes.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/cmp.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/ctx.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/div.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/div_extra.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/exponentiation.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/gcd.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/gcd_extra.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/generic.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/jacobi.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/montgomery.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/montgomery_inv.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/mul.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/prime.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/random.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/rsaz_exp.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/rsaz_exp.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/shift.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/sqrt.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/aead.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/cipher.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/e_aes.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/e_des.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/internal.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/delocate.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/des/des.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/des/internal.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/digest.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/digests.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/internal.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/md32_common.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_key.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_montgomery.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/felem.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/internal.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/oct.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p224-64.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256-x86_64-table.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256-x86_64.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256-x86_64.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/scalar.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple_mul.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/util.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/wnaf.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdh/ecdh.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/fips_shared_support.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/hmac/hmac.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/is_fips.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/md4/md4.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/md5/internal.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/md5/md5.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/cbc.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/cfb.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/ctr.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm_nohw.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/internal.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/ofb.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/polyval.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/ctrdrbg.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/internal.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/rand.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/urandom.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/blinding.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/internal.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/padding.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/internal.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha1-altivec.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha1.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha256.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha512.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/tls/internal.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/tls/kdf.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/hkdf/hkdf.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/hrss/hrss.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/hrss/internal.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/internal.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/lhash/lhash.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/mem.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/obj/obj.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/obj/obj_dat.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/obj/obj_xref.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/pem/pem_all.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/pem/pem_info.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/pem/pem_lib.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/pem/pem_oth.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/pem/pem_pk8.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/pem/pem_pkey.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/pem/pem_x509.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/pem/pem_xaux.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/pkcs7/internal.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7_x509.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/pkcs8/internal.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/pkcs8/p5_pbev2.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/poly1305/internal.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_arm.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_vec.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/pool/internal.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/pool/pool.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/rand_extra/deterministic.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/rand_extra/forkunsafe.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/rand_extra/fuchsia.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/rand_extra/rand_extra.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/rand_extra/windows.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/rc4/rc4.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/refcount_c11.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/refcount_lock.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/rsa_extra/rsa_asn1.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/rsa_extra/rsa_print.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/siphash/siphash.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/stack/stack.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/thread.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/thread_none.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/thread_pthread.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/thread_win.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/a_digest.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/a_sign.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/a_strex.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/a_verify.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/algorithm.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/asn1_gen.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/by_dir.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/by_file.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/charmap.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/i2d_pr.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/internal.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/rsa_pss.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/t_crl.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/t_req.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/t_x509.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/t_x509a.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/vpm_int.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509_att.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509_d2.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509_def.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509_ext.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509_lu.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509_obj.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509_r2x.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509_req.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509_trs.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509_txt.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509_v3.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509_vpm.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509cset.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509name.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509rset.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509spki.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x_algor.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x_all.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x_attrib.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x_exten.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x_info.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x_name.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x_pkey.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x_pubkey.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x_req.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x_sig.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x_spki.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x_val.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x_x509a.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/ext_dat.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/internal.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_cache.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_data.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_int.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_lib.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_map.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_node.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_tree.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_akey.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_akeya.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_alt.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_bcons.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_bitst.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_conf.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_crld.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_enum.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_extku.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_genn.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ia5.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_info.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_int.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_lib.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ncons.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ocsp.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pci.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pcia.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pcons.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pku.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pmaps.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_prn.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_skey.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_sxnet.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509v3/v3_utl.c ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/aead.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/aes.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/arm_arch.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/asn1.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/asn1_mac.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/asn1t.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/base.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/base64.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/bio.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/blowfish.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/bn.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/buf.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/buffer.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/bytestring.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/cast.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/chacha.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/cipher.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/cmac.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/conf.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/cpu.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/crypto.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/curve25519.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/des.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/dh.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/digest.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/dsa.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/dtls1.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/e_os2.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/ec.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/ec_key.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/ecdh.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/ecdsa.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/engine.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/err.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/evp.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/ex_data.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/hkdf.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/hmac.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/hrss.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/is_boringssl.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/lhash.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/md4.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/md5.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/mem.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/nid.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/obj.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/obj_mac.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/objects.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/opensslconf.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/opensslv.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/ossl_typ.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/pem.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/pkcs12.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/pkcs7.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/pkcs8.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/poly1305.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/pool.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/rand.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/rc4.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/ripemd.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/rsa.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/safestack.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/sha.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/siphash.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/span.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/srtp.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/ssl.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/ssl3.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/stack.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/thread.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/tls1.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/type_check.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/x509.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/x509_vfy.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/x509v3.h ) + s.files += %w( third_party/boringssl-with-bazel/src/ssl/bio_ssl.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/ssl/d1_both.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/ssl/d1_lib.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/ssl/d1_pkt.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/ssl/d1_srtp.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/ssl/dtls_method.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/ssl/dtls_record.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/ssl/handoff.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/ssl/handshake.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/ssl/handshake_client.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/ssl/handshake_server.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/ssl/internal.h ) + s.files += %w( third_party/boringssl-with-bazel/src/ssl/s3_both.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/ssl/s3_lib.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/ssl/s3_pkt.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/ssl/ssl_aead_ctx.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/ssl/ssl_asn1.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/ssl/ssl_buffer.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/ssl/ssl_cert.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/ssl/ssl_cipher.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/ssl/ssl_file.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/ssl/ssl_key_share.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/ssl/ssl_privkey.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/ssl/ssl_session.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/ssl/ssl_stat.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/ssl/ssl_transcript.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/ssl/ssl_versions.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/ssl/ssl_x509.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/ssl/t1_enc.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/ssl/t1_lib.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/ssl/tls13_both.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/ssl/tls13_client.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/ssl/tls13_server.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/ssl/tls_method.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/ssl/tls_record.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/third_party/fiat/curve25519.c ) + s.files += %w( third_party/boringssl-with-bazel/src/third_party/fiat/curve25519_32.h ) + s.files += %w( third_party/boringssl-with-bazel/src/third_party/fiat/curve25519_64.h ) + s.files += %w( third_party/boringssl-with-bazel/src/third_party/fiat/curve25519_tables.h ) + s.files += %w( third_party/boringssl-with-bazel/src/third_party/fiat/internal.h ) + s.files += %w( third_party/boringssl-with-bazel/src/third_party/fiat/p256.c ) + s.files += %w( third_party/boringssl-with-bazel/src/third_party/fiat/p256_32.h ) + s.files += %w( third_party/boringssl-with-bazel/src/third_party/fiat/p256_64.h ) + s.files += %w( third_party/cares/ares_build.h ) + s.files += %w( third_party/cares/cares/ares.h ) + s.files += %w( third_party/cares/cares/ares__close_sockets.c ) + s.files += %w( third_party/cares/cares/ares__get_hostent.c ) + s.files += %w( third_party/cares/cares/ares__read_line.c ) + s.files += %w( third_party/cares/cares/ares__timeval.c ) + s.files += %w( third_party/cares/cares/ares_cancel.c ) + s.files += %w( third_party/cares/cares/ares_create_query.c ) + s.files += %w( third_party/cares/cares/ares_data.c ) + s.files += %w( third_party/cares/cares/ares_data.h ) + s.files += %w( third_party/cares/cares/ares_destroy.c ) + s.files += %w( third_party/cares/cares/ares_dns.h ) + s.files += %w( third_party/cares/cares/ares_expand_name.c ) + s.files += %w( third_party/cares/cares/ares_expand_string.c ) + s.files += %w( third_party/cares/cares/ares_fds.c ) + s.files += %w( third_party/cares/cares/ares_free_hostent.c ) + s.files += %w( third_party/cares/cares/ares_free_string.c ) + s.files += %w( third_party/cares/cares/ares_getenv.c ) + s.files += %w( third_party/cares/cares/ares_getenv.h ) + s.files += %w( third_party/cares/cares/ares_gethostbyaddr.c ) + s.files += %w( third_party/cares/cares/ares_gethostbyname.c ) + s.files += %w( third_party/cares/cares/ares_getnameinfo.c ) + s.files += %w( third_party/cares/cares/ares_getopt.c ) + s.files += %w( third_party/cares/cares/ares_getopt.h ) + s.files += %w( third_party/cares/cares/ares_getsock.c ) + s.files += %w( third_party/cares/cares/ares_inet_net_pton.h ) + s.files += %w( third_party/cares/cares/ares_init.c ) + s.files += %w( third_party/cares/cares/ares_iphlpapi.h ) + s.files += %w( third_party/cares/cares/ares_ipv6.h ) + s.files += %w( third_party/cares/cares/ares_library_init.c ) + s.files += %w( third_party/cares/cares/ares_library_init.h ) + s.files += %w( third_party/cares/cares/ares_llist.c ) + s.files += %w( third_party/cares/cares/ares_llist.h ) + s.files += %w( third_party/cares/cares/ares_mkquery.c ) + s.files += %w( third_party/cares/cares/ares_nowarn.c ) + s.files += %w( third_party/cares/cares/ares_nowarn.h ) + s.files += %w( third_party/cares/cares/ares_options.c ) + s.files += %w( third_party/cares/cares/ares_parse_a_reply.c ) + s.files += %w( third_party/cares/cares/ares_parse_aaaa_reply.c ) + s.files += %w( third_party/cares/cares/ares_parse_mx_reply.c ) + s.files += %w( third_party/cares/cares/ares_parse_naptr_reply.c ) + s.files += %w( third_party/cares/cares/ares_parse_ns_reply.c ) + s.files += %w( third_party/cares/cares/ares_parse_ptr_reply.c ) + s.files += %w( third_party/cares/cares/ares_parse_soa_reply.c ) + s.files += %w( third_party/cares/cares/ares_parse_srv_reply.c ) + s.files += %w( third_party/cares/cares/ares_parse_txt_reply.c ) + s.files += %w( third_party/cares/cares/ares_platform.c ) + s.files += %w( third_party/cares/cares/ares_platform.h ) + s.files += %w( third_party/cares/cares/ares_private.h ) + s.files += %w( third_party/cares/cares/ares_process.c ) + s.files += %w( third_party/cares/cares/ares_query.c ) + s.files += %w( third_party/cares/cares/ares_rules.h ) + s.files += %w( third_party/cares/cares/ares_search.c ) + s.files += %w( third_party/cares/cares/ares_send.c ) + s.files += %w( third_party/cares/cares/ares_setup.h ) + s.files += %w( third_party/cares/cares/ares_strcasecmp.c ) + s.files += %w( third_party/cares/cares/ares_strcasecmp.h ) + s.files += %w( third_party/cares/cares/ares_strdup.c ) + s.files += %w( third_party/cares/cares/ares_strdup.h ) + s.files += %w( third_party/cares/cares/ares_strerror.c ) + s.files += %w( third_party/cares/cares/ares_strsplit.c ) + s.files += %w( third_party/cares/cares/ares_strsplit.h ) + s.files += %w( third_party/cares/cares/ares_timeout.c ) + s.files += %w( third_party/cares/cares/ares_version.c ) + s.files += %w( third_party/cares/cares/ares_version.h ) + s.files += %w( third_party/cares/cares/ares_writev.c ) + s.files += %w( third_party/cares/cares/bitncmp.c ) + s.files += %w( third_party/cares/cares/bitncmp.h ) + s.files += %w( third_party/cares/cares/config-win32.h ) + s.files += %w( third_party/cares/cares/inet_net_pton.c ) + s.files += %w( third_party/cares/cares/inet_ntop.c ) + s.files += %w( third_party/cares/cares/setup_once.h ) + s.files += %w( third_party/cares/cares/windows_port.c ) + s.files += %w( third_party/cares/config_darwin/ares_config.h ) + s.files += %w( third_party/cares/config_freebsd/ares_config.h ) + s.files += %w( third_party/cares/config_linux/ares_config.h ) + s.files += %w( third_party/cares/config_openbsd/ares_config.h ) + s.files += %w( third_party/upb/upb/decode.c ) + s.files += %w( third_party/upb/upb/decode.h ) + s.files += %w( third_party/upb/upb/encode.c ) + s.files += %w( third_party/upb/upb/encode.h ) + s.files += %w( third_party/upb/upb/generated_util.h ) + s.files += %w( third_party/upb/upb/msg.c ) + s.files += %w( third_party/upb/upb/msg.h ) + s.files += %w( third_party/upb/upb/port.c ) + s.files += %w( third_party/upb/upb/port_def.inc ) + s.files += %w( third_party/upb/upb/port_undef.inc ) + s.files += %w( third_party/upb/upb/table.c ) + s.files += %w( third_party/upb/upb/table.int.h ) + s.files += %w( third_party/upb/upb/upb.c ) + s.files += %w( third_party/upb/upb/upb.h ) + s.files += %w( third_party/zlib/adler32.c ) + s.files += %w( third_party/zlib/compress.c ) + s.files += %w( third_party/zlib/crc32.c ) + s.files += %w( third_party/zlib/crc32.h ) + s.files += %w( third_party/zlib/deflate.c ) + s.files += %w( third_party/zlib/deflate.h ) + s.files += %w( third_party/zlib/gzclose.c ) + s.files += %w( third_party/zlib/gzguts.h ) + s.files += %w( third_party/zlib/gzlib.c ) + s.files += %w( third_party/zlib/gzread.c ) + s.files += %w( third_party/zlib/gzwrite.c ) + s.files += %w( third_party/zlib/infback.c ) + s.files += %w( third_party/zlib/inffast.c ) + s.files += %w( third_party/zlib/inffast.h ) + s.files += %w( third_party/zlib/inffixed.h ) + s.files += %w( third_party/zlib/inflate.c ) + s.files += %w( third_party/zlib/inflate.h ) + s.files += %w( third_party/zlib/inftrees.c ) + s.files += %w( third_party/zlib/inftrees.h ) + s.files += %w( third_party/zlib/trees.c ) + s.files += %w( third_party/zlib/trees.h ) + s.files += %w( third_party/zlib/uncompr.c ) + s.files += %w( third_party/zlib/zconf.h ) + s.files += %w( third_party/zlib/zlib.h ) + s.files += %w( third_party/zlib/zutil.c ) + s.files += %w( third_party/zlib/zutil.h ) +end diff --git a/grpc.gyp b/grpc.gyp index 18fb037d0be..a62c034d65a 100644 --- a/grpc.gyp +++ b/grpc.gyp @@ -198,7 +198,6 @@ 'test/core/end2end/tests/cancel_in_a_vacuum.cc', 'test/core/end2end/tests/cancel_with_status.cc', 'test/core/end2end/tests/channelz.cc', - 'test/core/end2end/tests/client_streaming.cc', 'test/core/end2end/tests/compressed_payload.cc', 'test/core/end2end/tests/connectivity.cc', 'test/core/end2end/tests/default_host.cc', @@ -300,7 +299,6 @@ 'test/core/end2end/tests/cancel_in_a_vacuum.cc', 'test/core/end2end/tests/cancel_with_status.cc', 'test/core/end2end/tests/channelz.cc', - 'test/core/end2end/tests/client_streaming.cc', 'test/core/end2end/tests/compressed_payload.cc', 'test/core/end2end/tests/connectivity.cc', 'test/core/end2end/tests/default_host.cc', @@ -1511,12 +1509,315 @@ 'src/cpp/server/channelz/channelz_service_plugin.cc', ], }, + { + 'target_name': 'boringssl', + 'type': 'static_library', + 'dependencies': [ + ], + 'sources': [ + 'third_party/boringssl-with-bazel/err_data.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/a_bitstr.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/a_bool.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/a_d2i_fp.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/a_dup.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/a_enum.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/a_gentm.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/a_i2d_fp.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/a_int.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/a_mbstr.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/a_octet.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/a_print.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/a_strnid.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/a_time.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/a_type.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/a_utctm.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/a_utf8.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/asn1_par.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/asn_pack.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/f_enum.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/f_int.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/f_string.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/tasn_fre.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/tasn_new.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/tasn_typ.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/tasn_utl.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/time_support.c', + 'third_party/boringssl-with-bazel/src/crypto/base64/base64.c', + 'third_party/boringssl-with-bazel/src/crypto/bio/bio.c', + 'third_party/boringssl-with-bazel/src/crypto/bio/bio_mem.c', + 'third_party/boringssl-with-bazel/src/crypto/bio/connect.c', + 'third_party/boringssl-with-bazel/src/crypto/bio/fd.c', + 'third_party/boringssl-with-bazel/src/crypto/bio/file.c', + 'third_party/boringssl-with-bazel/src/crypto/bio/hexdump.c', + 'third_party/boringssl-with-bazel/src/crypto/bio/pair.c', + 'third_party/boringssl-with-bazel/src/crypto/bio/printf.c', + 'third_party/boringssl-with-bazel/src/crypto/bio/socket.c', + 'third_party/boringssl-with-bazel/src/crypto/bio/socket_helper.c', + 'third_party/boringssl-with-bazel/src/crypto/bn_extra/bn_asn1.c', + 'third_party/boringssl-with-bazel/src/crypto/bn_extra/convert.c', + 'third_party/boringssl-with-bazel/src/crypto/buf/buf.c', + 'third_party/boringssl-with-bazel/src/crypto/bytestring/asn1_compat.c', + 'third_party/boringssl-with-bazel/src/crypto/bytestring/ber.c', + 'third_party/boringssl-with-bazel/src/crypto/bytestring/cbb.c', + 'third_party/boringssl-with-bazel/src/crypto/bytestring/cbs.c', + 'third_party/boringssl-with-bazel/src/crypto/bytestring/unicode.c', + 'third_party/boringssl-with-bazel/src/crypto/chacha/chacha.c', + 'third_party/boringssl-with-bazel/src/crypto/cipher_extra/cipher_extra.c', + 'third_party/boringssl-with-bazel/src/crypto/cipher_extra/derive_key.c', + 'third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_aesccm.c', + 'third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_aesctrhmac.c', + 'third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_aesgcmsiv.c', + 'third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_chacha20poly1305.c', + 'third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_null.c', + 'third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_rc2.c', + 'third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_rc4.c', + 'third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_tls.c', + 'third_party/boringssl-with-bazel/src/crypto/cipher_extra/tls_cbc.c', + 'third_party/boringssl-with-bazel/src/crypto/cmac/cmac.c', + 'third_party/boringssl-with-bazel/src/crypto/conf/conf.c', + 'third_party/boringssl-with-bazel/src/crypto/cpu-aarch64-fuchsia.c', + 'third_party/boringssl-with-bazel/src/crypto/cpu-aarch64-linux.c', + 'third_party/boringssl-with-bazel/src/crypto/cpu-arm-linux.c', + 'third_party/boringssl-with-bazel/src/crypto/cpu-arm.c', + 'third_party/boringssl-with-bazel/src/crypto/cpu-intel.c', + 'third_party/boringssl-with-bazel/src/crypto/cpu-ppc64le.c', + 'third_party/boringssl-with-bazel/src/crypto/crypto.c', + 'third_party/boringssl-with-bazel/src/crypto/curve25519/spake25519.c', + 'third_party/boringssl-with-bazel/src/crypto/dh/check.c', + 'third_party/boringssl-with-bazel/src/crypto/dh/dh.c', + 'third_party/boringssl-with-bazel/src/crypto/dh/dh_asn1.c', + 'third_party/boringssl-with-bazel/src/crypto/dh/params.c', + 'third_party/boringssl-with-bazel/src/crypto/digest_extra/digest_extra.c', + 'third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c', + 'third_party/boringssl-with-bazel/src/crypto/dsa/dsa_asn1.c', + 'third_party/boringssl-with-bazel/src/crypto/ec_extra/ec_asn1.c', + 'third_party/boringssl-with-bazel/src/crypto/ec_extra/ec_derive.c', + 'third_party/boringssl-with-bazel/src/crypto/ecdh_extra/ecdh_extra.c', + 'third_party/boringssl-with-bazel/src/crypto/ecdsa_extra/ecdsa_asn1.c', + 'third_party/boringssl-with-bazel/src/crypto/engine/engine.c', + 'third_party/boringssl-with-bazel/src/crypto/err/err.c', + 'third_party/boringssl-with-bazel/src/crypto/evp/digestsign.c', + 'third_party/boringssl-with-bazel/src/crypto/evp/evp.c', + 'third_party/boringssl-with-bazel/src/crypto/evp/evp_asn1.c', + 'third_party/boringssl-with-bazel/src/crypto/evp/evp_ctx.c', + 'third_party/boringssl-with-bazel/src/crypto/evp/p_dsa_asn1.c', + 'third_party/boringssl-with-bazel/src/crypto/evp/p_ec.c', + 'third_party/boringssl-with-bazel/src/crypto/evp/p_ec_asn1.c', + 'third_party/boringssl-with-bazel/src/crypto/evp/p_ed25519.c', + 'third_party/boringssl-with-bazel/src/crypto/evp/p_ed25519_asn1.c', + 'third_party/boringssl-with-bazel/src/crypto/evp/p_rsa.c', + 'third_party/boringssl-with-bazel/src/crypto/evp/p_rsa_asn1.c', + 'third_party/boringssl-with-bazel/src/crypto/evp/p_x25519.c', + 'third_party/boringssl-with-bazel/src/crypto/evp/p_x25519_asn1.c', + 'third_party/boringssl-with-bazel/src/crypto/evp/pbkdf.c', + 'third_party/boringssl-with-bazel/src/crypto/evp/print.c', + 'third_party/boringssl-with-bazel/src/crypto/evp/scrypt.c', + 'third_party/boringssl-with-bazel/src/crypto/evp/sign.c', + 'third_party/boringssl-with-bazel/src/crypto/ex_data.c', + 'third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c', + 'third_party/boringssl-with-bazel/src/crypto/fipsmodule/fips_shared_support.c', + 'third_party/boringssl-with-bazel/src/crypto/fipsmodule/is_fips.c', + 'third_party/boringssl-with-bazel/src/crypto/hkdf/hkdf.c', + 'third_party/boringssl-with-bazel/src/crypto/hrss/hrss.c', + 'third_party/boringssl-with-bazel/src/crypto/lhash/lhash.c', + 'third_party/boringssl-with-bazel/src/crypto/mem.c', + 'third_party/boringssl-with-bazel/src/crypto/obj/obj.c', + 'third_party/boringssl-with-bazel/src/crypto/obj/obj_xref.c', + 'third_party/boringssl-with-bazel/src/crypto/pem/pem_all.c', + 'third_party/boringssl-with-bazel/src/crypto/pem/pem_info.c', + 'third_party/boringssl-with-bazel/src/crypto/pem/pem_lib.c', + 'third_party/boringssl-with-bazel/src/crypto/pem/pem_oth.c', + 'third_party/boringssl-with-bazel/src/crypto/pem/pem_pk8.c', + 'third_party/boringssl-with-bazel/src/crypto/pem/pem_pkey.c', + 'third_party/boringssl-with-bazel/src/crypto/pem/pem_x509.c', + 'third_party/boringssl-with-bazel/src/crypto/pem/pem_xaux.c', + 'third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7.c', + 'third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7_x509.c', + 'third_party/boringssl-with-bazel/src/crypto/pkcs8/p5_pbev2.c', + 'third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8.c', + 'third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c', + 'third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305.c', + 'third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_arm.c', + 'third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_vec.c', + 'third_party/boringssl-with-bazel/src/crypto/pool/pool.c', + 'third_party/boringssl-with-bazel/src/crypto/rand_extra/deterministic.c', + 'third_party/boringssl-with-bazel/src/crypto/rand_extra/forkunsafe.c', + 'third_party/boringssl-with-bazel/src/crypto/rand_extra/fuchsia.c', + 'third_party/boringssl-with-bazel/src/crypto/rand_extra/rand_extra.c', + 'third_party/boringssl-with-bazel/src/crypto/rand_extra/windows.c', + 'third_party/boringssl-with-bazel/src/crypto/rc4/rc4.c', + 'third_party/boringssl-with-bazel/src/crypto/refcount_c11.c', + 'third_party/boringssl-with-bazel/src/crypto/refcount_lock.c', + 'third_party/boringssl-with-bazel/src/crypto/rsa_extra/rsa_asn1.c', + 'third_party/boringssl-with-bazel/src/crypto/rsa_extra/rsa_print.c', + 'third_party/boringssl-with-bazel/src/crypto/siphash/siphash.c', + 'third_party/boringssl-with-bazel/src/crypto/stack/stack.c', + 'third_party/boringssl-with-bazel/src/crypto/thread.c', + 'third_party/boringssl-with-bazel/src/crypto/thread_none.c', + 'third_party/boringssl-with-bazel/src/crypto/thread_pthread.c', + 'third_party/boringssl-with-bazel/src/crypto/thread_win.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/a_digest.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/a_sign.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/a_strex.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/a_verify.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/algorithm.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/asn1_gen.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/by_dir.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/by_file.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/i2d_pr.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/rsa_pss.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/t_crl.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/t_req.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/t_x509.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/t_x509a.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509_att.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509_d2.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509_def.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509_ext.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509_lu.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509_obj.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509_r2x.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509_req.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509_trs.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509_txt.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509_v3.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509_vpm.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509cset.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509name.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509rset.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509spki.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x_algor.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x_all.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x_attrib.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x_exten.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x_info.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x_name.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x_pkey.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x_pubkey.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x_req.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x_sig.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x_spki.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x_val.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x_x509a.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_cache.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_data.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_lib.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_map.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_node.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_tree.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_akey.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_akeya.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_alt.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_bcons.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_bitst.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_conf.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_crld.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_enum.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_extku.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_genn.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ia5.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_info.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_int.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_lib.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ncons.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ocsp.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pci.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pcia.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pcons.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pku.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pmaps.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_prn.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_skey.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_sxnet.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_utl.c', + 'third_party/boringssl-with-bazel/src/ssl/bio_ssl.cc', + 'third_party/boringssl-with-bazel/src/ssl/d1_both.cc', + 'third_party/boringssl-with-bazel/src/ssl/d1_lib.cc', + 'third_party/boringssl-with-bazel/src/ssl/d1_pkt.cc', + 'third_party/boringssl-with-bazel/src/ssl/d1_srtp.cc', + 'third_party/boringssl-with-bazel/src/ssl/dtls_method.cc', + 'third_party/boringssl-with-bazel/src/ssl/dtls_record.cc', + 'third_party/boringssl-with-bazel/src/ssl/handoff.cc', + 'third_party/boringssl-with-bazel/src/ssl/handshake.cc', + 'third_party/boringssl-with-bazel/src/ssl/handshake_client.cc', + 'third_party/boringssl-with-bazel/src/ssl/handshake_server.cc', + 'third_party/boringssl-with-bazel/src/ssl/s3_both.cc', + 'third_party/boringssl-with-bazel/src/ssl/s3_lib.cc', + 'third_party/boringssl-with-bazel/src/ssl/s3_pkt.cc', + 'third_party/boringssl-with-bazel/src/ssl/ssl_aead_ctx.cc', + 'third_party/boringssl-with-bazel/src/ssl/ssl_asn1.cc', + 'third_party/boringssl-with-bazel/src/ssl/ssl_buffer.cc', + 'third_party/boringssl-with-bazel/src/ssl/ssl_cert.cc', + 'third_party/boringssl-with-bazel/src/ssl/ssl_cipher.cc', + 'third_party/boringssl-with-bazel/src/ssl/ssl_file.cc', + 'third_party/boringssl-with-bazel/src/ssl/ssl_key_share.cc', + 'third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc', + 'third_party/boringssl-with-bazel/src/ssl/ssl_privkey.cc', + 'third_party/boringssl-with-bazel/src/ssl/ssl_session.cc', + 'third_party/boringssl-with-bazel/src/ssl/ssl_stat.cc', + 'third_party/boringssl-with-bazel/src/ssl/ssl_transcript.cc', + 'third_party/boringssl-with-bazel/src/ssl/ssl_versions.cc', + 'third_party/boringssl-with-bazel/src/ssl/ssl_x509.cc', + 'third_party/boringssl-with-bazel/src/ssl/t1_enc.cc', + 'third_party/boringssl-with-bazel/src/ssl/t1_lib.cc', + 'third_party/boringssl-with-bazel/src/ssl/tls13_both.cc', + 'third_party/boringssl-with-bazel/src/ssl/tls13_client.cc', + 'third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc', + 'third_party/boringssl-with-bazel/src/ssl/tls13_server.cc', + 'third_party/boringssl-with-bazel/src/ssl/tls_method.cc', + 'third_party/boringssl-with-bazel/src/ssl/tls_record.cc', + 'third_party/boringssl-with-bazel/src/third_party/fiat/curve25519.c', + ], + }, + { + 'target_name': 'boringssl_test_util', + 'type': 'static_library', + 'dependencies': [ + ], + 'sources': [ + 'third_party/boringssl-with-bazel/src/crypto/test/file_test.cc', + 'third_party/boringssl-with-bazel/src/crypto/test/malloc.cc', + 'third_party/boringssl-with-bazel/src/crypto/test/test_util.cc', + 'third_party/boringssl-with-bazel/src/crypto/test/wycheproof_util.cc', + ], + }, { 'target_name': 'benchmark', 'type': 'static_library', 'dependencies': [ ], 'sources': [ + 'third_party/benchmark/src/benchmark.cc', + 'third_party/benchmark/src/benchmark_api_internal.cc', + 'third_party/benchmark/src/benchmark_main.cc', + 'third_party/benchmark/src/benchmark_name.cc', + 'third_party/benchmark/src/benchmark_register.cc', + 'third_party/benchmark/src/benchmark_runner.cc', + 'third_party/benchmark/src/colorprint.cc', + 'third_party/benchmark/src/commandlineflags.cc', + 'third_party/benchmark/src/complexity.cc', + 'third_party/benchmark/src/console_reporter.cc', + 'third_party/benchmark/src/counter.cc', + 'third_party/benchmark/src/csv_reporter.cc', + 'third_party/benchmark/src/json_reporter.cc', + 'third_party/benchmark/src/reporter.cc', + 'third_party/benchmark/src/sleep.cc', + 'third_party/benchmark/src/statistics.cc', + 'third_party/benchmark/src/string_util.cc', + 'third_party/benchmark/src/sysinfo.cc', + 'third_party/benchmark/src/timers.cc', ], }, { @@ -1533,5 +1834,28 @@ 'third_party/upb/upb/upb.c', ], }, + { + 'target_name': 'z', + 'type': 'static_library', + 'dependencies': [ + ], + 'sources': [ + 'third_party/zlib/adler32.c', + 'third_party/zlib/compress.c', + 'third_party/zlib/crc32.c', + 'third_party/zlib/deflate.c', + 'third_party/zlib/gzclose.c', + 'third_party/zlib/gzlib.c', + 'third_party/zlib/gzread.c', + 'third_party/zlib/gzwrite.c', + 'third_party/zlib/infback.c', + 'third_party/zlib/inffast.c', + 'third_party/zlib/inflate.c', + 'third_party/zlib/inftrees.c', + 'third_party/zlib/trees.c', + 'third_party/zlib/uncompr.c', + 'third_party/zlib/zutil.c', + ], + }, ] } diff --git a/package.xml b/package.xml index c9e4b57e214..06d1669ec48 100644 --- a/package.xml +++ b/package.xml @@ -28,4 +28,1896 @@ - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5.5.0 + + + 1.4.0 + + + + grpc + + + + + 0.5.0 + 0.5.0 + + + alpha + alpha + + 2015-06-16 + BSD + +First alpha release + + + + + 0.5.1 + 0.5.1 + + + alpha + alpha + + 2015-07-09 + BSD + +Update to wrap gRPC C Core version 0.10.0 + + + + + 0.6.0 + 0.6.0 + + + beta + beta + + 2015-09-24 + BSD + +- support per message compression disable +- expose per-call host override option +- expose connectivity API +- expose channel target and call peer +- add user-agent +- update to wrap gRPC C core library beta version 0.11.0 + + + + + 0.6.1 + 0.6.0 + + + beta + beta + + 2015-10-21 + BSD + +- fixed undefined constant fatal error when run with apache/nginx #2275 + + + + + 0.7.0 + 0.7.0 + + + beta + beta + + 2016-01-13 + BSD + +- Breaking change to Credentials class (removed) #3765 +- Replaced by ChannelCredentials and CallCredentials class #3765 +- New plugin based metadata auth API #4394 +- Explicit ChannelCredentials::createInsecure() call + + + + + 0.8.0 + 0.8.0 + + + beta + beta + + 2016-02-24 + BSD + +- Simplify gRPC PHP installation #4517 +- Wrap gRPC core library version 0.13 + + + + + 0.8.1 + 0.8.1 + + + beta + beta + + 2016-03-01 + BSD + +- Increase unit test code coverage #5225 + + + + + 0.14.0 + 0.14.0 + + + beta + beta + + 2016-04-19 + BSD + +- wrap grpc C core version 0.14.0 +- destroy grpc_byte_buffer after startBatch #6096 + + + + + 0.15.0 + 0.15.0 + + + beta + beta + + 2016-05-18 + BSD + +- Updated functions with TSRM macros for ZTS support #6607 +- Load default roots.pem via grpc_set_ssl_roots_override_callback #6848 + + + + + 1.0.0RC1 + 1.0.0RC1 + + + stable + stable + + 2016-07-13 + BSD + +- GA release +- Fix shutdown hang problem #4017 + + + + + 1.0.0RC2 + 1.0.0RC2 + + + stable + stable + + 2016-07-21 + BSD + +- PHP7 Support #7464 + + + + + 1.0.0RC3 + 1.0.0RC3 + + + stable + stable + + 2016-07-28 + BSD + +- PHP7 Support continued, reduce code duplication #7543 + + + + + 1.0.0RC4 + 1.0.0RC4 + + + stable + stable + + 2016-08-09 + BSD + +- Fixed Ubuntu compile error #7571, #7642 + + + + + 1.0.0 + 1.0.0 + + + stable + stable + + 2016-08-18 + BSD + +- gRPC 1.0.0 release + + + + + 1.0.1RC1 + 1.0.1RC1 + + + beta + beta + + 2016-10-06 + BSD + +- Reject metadata keys which are not legal #7881 + + + + + 1.0.1 + 1.0.1 + + + stable + stable + + 2016-10-27 + BSD + +- Reject metadata keys which are not legal #7881 + + + + + 1.1.0RC1 + 1.1.0RC1 + + + beta + beta + + 2017-01-13 + BSD + +- PHP Proto3 adoption #8179 +- Various bug fixes + + + + + 1.1.0 + 1.1.0 + + + stable + stable + + 2017-01-31 + BSD + +- PHP Proto3 adoption #8179 +- Various bug fixes + + + + + 1.2.0RC1 + 1.2.0RC1 + + + beta + beta + + 2017-03-01 + BSD + +- Added arg info macros #9751 +- Updated codegen to be consistent with protobuf #9492 + + + + + 1.2.0 + 1.2.0 + + + stable + stable + + 2017-03-20 + BSD + +- Added arg info macros #9751 +- Updated codegen to be consistent with protobuf #9492 + + + + diff --git a/src/objective-c/BoringSSL-GRPC.podspec b/src/objective-c/BoringSSL-GRPC.podspec index f3edaf8666e..cd391d25ec6 100644 --- a/src/objective-c/BoringSSL-GRPC.podspec +++ b/src/objective-c/BoringSSL-GRPC.podspec @@ -76,7 +76,7 @@ Pod::Spec.new do |s| s.source = { :git => 'https://github.com/google/boringssl.git', - :commit => "0e00500caa5e1e303bc87762d685a9776d41d16d", + :commit => "1c2769383f027befac5b75b6cedd25daf3bf4dcf", } s.ios.deployment_target = '7.0' diff --git a/src/python/grpcio/grpc_core_dependencies.py b/src/python/grpcio/grpc_core_dependencies.py index e3bece3f6fc..6c2dfed4ae3 100644 --- a/src/python/grpcio/grpc_core_dependencies.py +++ b/src/python/grpcio/grpc_core_dependencies.py @@ -512,6 +512,270 @@ CORE_SOURCE_FILES = [ 'third_party/address_sorting/address_sorting.c', 'third_party/address_sorting/address_sorting_posix.c', 'third_party/address_sorting/address_sorting_windows.c', + 'third_party/boringssl-with-bazel/err_data.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/a_bitstr.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/a_bool.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/a_d2i_fp.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/a_dup.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/a_enum.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/a_gentm.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/a_i2d_fp.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/a_int.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/a_mbstr.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/a_octet.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/a_print.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/a_strnid.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/a_time.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/a_type.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/a_utctm.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/a_utf8.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/asn1_par.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/asn_pack.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/f_enum.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/f_int.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/f_string.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/tasn_fre.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/tasn_new.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/tasn_typ.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/tasn_utl.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/time_support.c', + 'third_party/boringssl-with-bazel/src/crypto/base64/base64.c', + 'third_party/boringssl-with-bazel/src/crypto/bio/bio.c', + 'third_party/boringssl-with-bazel/src/crypto/bio/bio_mem.c', + 'third_party/boringssl-with-bazel/src/crypto/bio/connect.c', + 'third_party/boringssl-with-bazel/src/crypto/bio/fd.c', + 'third_party/boringssl-with-bazel/src/crypto/bio/file.c', + 'third_party/boringssl-with-bazel/src/crypto/bio/hexdump.c', + 'third_party/boringssl-with-bazel/src/crypto/bio/pair.c', + 'third_party/boringssl-with-bazel/src/crypto/bio/printf.c', + 'third_party/boringssl-with-bazel/src/crypto/bio/socket.c', + 'third_party/boringssl-with-bazel/src/crypto/bio/socket_helper.c', + 'third_party/boringssl-with-bazel/src/crypto/bn_extra/bn_asn1.c', + 'third_party/boringssl-with-bazel/src/crypto/bn_extra/convert.c', + 'third_party/boringssl-with-bazel/src/crypto/buf/buf.c', + 'third_party/boringssl-with-bazel/src/crypto/bytestring/asn1_compat.c', + 'third_party/boringssl-with-bazel/src/crypto/bytestring/ber.c', + 'third_party/boringssl-with-bazel/src/crypto/bytestring/cbb.c', + 'third_party/boringssl-with-bazel/src/crypto/bytestring/cbs.c', + 'third_party/boringssl-with-bazel/src/crypto/bytestring/unicode.c', + 'third_party/boringssl-with-bazel/src/crypto/chacha/chacha.c', + 'third_party/boringssl-with-bazel/src/crypto/cipher_extra/cipher_extra.c', + 'third_party/boringssl-with-bazel/src/crypto/cipher_extra/derive_key.c', + 'third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_aesccm.c', + 'third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_aesctrhmac.c', + 'third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_aesgcmsiv.c', + 'third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_chacha20poly1305.c', + 'third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_null.c', + 'third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_rc2.c', + 'third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_rc4.c', + 'third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_tls.c', + 'third_party/boringssl-with-bazel/src/crypto/cipher_extra/tls_cbc.c', + 'third_party/boringssl-with-bazel/src/crypto/cmac/cmac.c', + 'third_party/boringssl-with-bazel/src/crypto/conf/conf.c', + 'third_party/boringssl-with-bazel/src/crypto/cpu-aarch64-fuchsia.c', + 'third_party/boringssl-with-bazel/src/crypto/cpu-aarch64-linux.c', + 'third_party/boringssl-with-bazel/src/crypto/cpu-arm-linux.c', + 'third_party/boringssl-with-bazel/src/crypto/cpu-arm.c', + 'third_party/boringssl-with-bazel/src/crypto/cpu-intel.c', + 'third_party/boringssl-with-bazel/src/crypto/cpu-ppc64le.c', + 'third_party/boringssl-with-bazel/src/crypto/crypto.c', + 'third_party/boringssl-with-bazel/src/crypto/curve25519/spake25519.c', + 'third_party/boringssl-with-bazel/src/crypto/dh/check.c', + 'third_party/boringssl-with-bazel/src/crypto/dh/dh.c', + 'third_party/boringssl-with-bazel/src/crypto/dh/dh_asn1.c', + 'third_party/boringssl-with-bazel/src/crypto/dh/params.c', + 'third_party/boringssl-with-bazel/src/crypto/digest_extra/digest_extra.c', + 'third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c', + 'third_party/boringssl-with-bazel/src/crypto/dsa/dsa_asn1.c', + 'third_party/boringssl-with-bazel/src/crypto/ec_extra/ec_asn1.c', + 'third_party/boringssl-with-bazel/src/crypto/ec_extra/ec_derive.c', + 'third_party/boringssl-with-bazel/src/crypto/ecdh_extra/ecdh_extra.c', + 'third_party/boringssl-with-bazel/src/crypto/ecdsa_extra/ecdsa_asn1.c', + 'third_party/boringssl-with-bazel/src/crypto/engine/engine.c', + 'third_party/boringssl-with-bazel/src/crypto/err/err.c', + 'third_party/boringssl-with-bazel/src/crypto/evp/digestsign.c', + 'third_party/boringssl-with-bazel/src/crypto/evp/evp.c', + 'third_party/boringssl-with-bazel/src/crypto/evp/evp_asn1.c', + 'third_party/boringssl-with-bazel/src/crypto/evp/evp_ctx.c', + 'third_party/boringssl-with-bazel/src/crypto/evp/p_dsa_asn1.c', + 'third_party/boringssl-with-bazel/src/crypto/evp/p_ec.c', + 'third_party/boringssl-with-bazel/src/crypto/evp/p_ec_asn1.c', + 'third_party/boringssl-with-bazel/src/crypto/evp/p_ed25519.c', + 'third_party/boringssl-with-bazel/src/crypto/evp/p_ed25519_asn1.c', + 'third_party/boringssl-with-bazel/src/crypto/evp/p_rsa.c', + 'third_party/boringssl-with-bazel/src/crypto/evp/p_rsa_asn1.c', + 'third_party/boringssl-with-bazel/src/crypto/evp/p_x25519.c', + 'third_party/boringssl-with-bazel/src/crypto/evp/p_x25519_asn1.c', + 'third_party/boringssl-with-bazel/src/crypto/evp/pbkdf.c', + 'third_party/boringssl-with-bazel/src/crypto/evp/print.c', + 'third_party/boringssl-with-bazel/src/crypto/evp/scrypt.c', + 'third_party/boringssl-with-bazel/src/crypto/evp/sign.c', + 'third_party/boringssl-with-bazel/src/crypto/ex_data.c', + 'third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c', + 'third_party/boringssl-with-bazel/src/crypto/fipsmodule/fips_shared_support.c', + 'third_party/boringssl-with-bazel/src/crypto/fipsmodule/is_fips.c', + 'third_party/boringssl-with-bazel/src/crypto/hkdf/hkdf.c', + 'third_party/boringssl-with-bazel/src/crypto/hrss/hrss.c', + 'third_party/boringssl-with-bazel/src/crypto/lhash/lhash.c', + 'third_party/boringssl-with-bazel/src/crypto/mem.c', + 'third_party/boringssl-with-bazel/src/crypto/obj/obj.c', + 'third_party/boringssl-with-bazel/src/crypto/obj/obj_xref.c', + 'third_party/boringssl-with-bazel/src/crypto/pem/pem_all.c', + 'third_party/boringssl-with-bazel/src/crypto/pem/pem_info.c', + 'third_party/boringssl-with-bazel/src/crypto/pem/pem_lib.c', + 'third_party/boringssl-with-bazel/src/crypto/pem/pem_oth.c', + 'third_party/boringssl-with-bazel/src/crypto/pem/pem_pk8.c', + 'third_party/boringssl-with-bazel/src/crypto/pem/pem_pkey.c', + 'third_party/boringssl-with-bazel/src/crypto/pem/pem_x509.c', + 'third_party/boringssl-with-bazel/src/crypto/pem/pem_xaux.c', + 'third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7.c', + 'third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7_x509.c', + 'third_party/boringssl-with-bazel/src/crypto/pkcs8/p5_pbev2.c', + 'third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8.c', + 'third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c', + 'third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305.c', + 'third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_arm.c', + 'third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_vec.c', + 'third_party/boringssl-with-bazel/src/crypto/pool/pool.c', + 'third_party/boringssl-with-bazel/src/crypto/rand_extra/deterministic.c', + 'third_party/boringssl-with-bazel/src/crypto/rand_extra/forkunsafe.c', + 'third_party/boringssl-with-bazel/src/crypto/rand_extra/fuchsia.c', + 'third_party/boringssl-with-bazel/src/crypto/rand_extra/rand_extra.c', + 'third_party/boringssl-with-bazel/src/crypto/rand_extra/windows.c', + 'third_party/boringssl-with-bazel/src/crypto/rc4/rc4.c', + 'third_party/boringssl-with-bazel/src/crypto/refcount_c11.c', + 'third_party/boringssl-with-bazel/src/crypto/refcount_lock.c', + 'third_party/boringssl-with-bazel/src/crypto/rsa_extra/rsa_asn1.c', + 'third_party/boringssl-with-bazel/src/crypto/rsa_extra/rsa_print.c', + 'third_party/boringssl-with-bazel/src/crypto/siphash/siphash.c', + 'third_party/boringssl-with-bazel/src/crypto/stack/stack.c', + 'third_party/boringssl-with-bazel/src/crypto/thread.c', + 'third_party/boringssl-with-bazel/src/crypto/thread_none.c', + 'third_party/boringssl-with-bazel/src/crypto/thread_pthread.c', + 'third_party/boringssl-with-bazel/src/crypto/thread_win.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/a_digest.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/a_sign.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/a_strex.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/a_verify.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/algorithm.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/asn1_gen.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/by_dir.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/by_file.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/i2d_pr.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/rsa_pss.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/t_crl.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/t_req.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/t_x509.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/t_x509a.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509_att.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509_d2.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509_def.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509_ext.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509_lu.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509_obj.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509_r2x.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509_req.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509_trs.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509_txt.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509_v3.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509_vpm.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509cset.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509name.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509rset.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509spki.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x_algor.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x_all.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x_attrib.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x_exten.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x_info.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x_name.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x_pkey.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x_pubkey.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x_req.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x_sig.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x_spki.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x_val.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c', + 'third_party/boringssl-with-bazel/src/crypto/x509/x_x509a.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_cache.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_data.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_lib.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_map.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_node.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_tree.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_akey.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_akeya.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_alt.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_bcons.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_bitst.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_conf.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_crld.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_enum.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_extku.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_genn.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ia5.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_info.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_int.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_lib.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ncons.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ocsp.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pci.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pcia.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pcons.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pku.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pmaps.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_prn.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_skey.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_sxnet.c', + 'third_party/boringssl-with-bazel/src/crypto/x509v3/v3_utl.c', + 'third_party/boringssl-with-bazel/src/ssl/bio_ssl.cc', + 'third_party/boringssl-with-bazel/src/ssl/d1_both.cc', + 'third_party/boringssl-with-bazel/src/ssl/d1_lib.cc', + 'third_party/boringssl-with-bazel/src/ssl/d1_pkt.cc', + 'third_party/boringssl-with-bazel/src/ssl/d1_srtp.cc', + 'third_party/boringssl-with-bazel/src/ssl/dtls_method.cc', + 'third_party/boringssl-with-bazel/src/ssl/dtls_record.cc', + 'third_party/boringssl-with-bazel/src/ssl/handoff.cc', + 'third_party/boringssl-with-bazel/src/ssl/handshake.cc', + 'third_party/boringssl-with-bazel/src/ssl/handshake_client.cc', + 'third_party/boringssl-with-bazel/src/ssl/handshake_server.cc', + 'third_party/boringssl-with-bazel/src/ssl/s3_both.cc', + 'third_party/boringssl-with-bazel/src/ssl/s3_lib.cc', + 'third_party/boringssl-with-bazel/src/ssl/s3_pkt.cc', + 'third_party/boringssl-with-bazel/src/ssl/ssl_aead_ctx.cc', + 'third_party/boringssl-with-bazel/src/ssl/ssl_asn1.cc', + 'third_party/boringssl-with-bazel/src/ssl/ssl_buffer.cc', + 'third_party/boringssl-with-bazel/src/ssl/ssl_cert.cc', + 'third_party/boringssl-with-bazel/src/ssl/ssl_cipher.cc', + 'third_party/boringssl-with-bazel/src/ssl/ssl_file.cc', + 'third_party/boringssl-with-bazel/src/ssl/ssl_key_share.cc', + 'third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc', + 'third_party/boringssl-with-bazel/src/ssl/ssl_privkey.cc', + 'third_party/boringssl-with-bazel/src/ssl/ssl_session.cc', + 'third_party/boringssl-with-bazel/src/ssl/ssl_stat.cc', + 'third_party/boringssl-with-bazel/src/ssl/ssl_transcript.cc', + 'third_party/boringssl-with-bazel/src/ssl/ssl_versions.cc', + 'third_party/boringssl-with-bazel/src/ssl/ssl_x509.cc', + 'third_party/boringssl-with-bazel/src/ssl/t1_enc.cc', + 'third_party/boringssl-with-bazel/src/ssl/t1_lib.cc', + 'third_party/boringssl-with-bazel/src/ssl/tls13_both.cc', + 'third_party/boringssl-with-bazel/src/ssl/tls13_client.cc', + 'third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc', + 'third_party/boringssl-with-bazel/src/ssl/tls13_server.cc', + 'third_party/boringssl-with-bazel/src/ssl/tls_method.cc', + 'third_party/boringssl-with-bazel/src/ssl/tls_record.cc', + 'third_party/boringssl-with-bazel/src/third_party/fiat/curve25519.c', 'third_party/cares/cares/ares__close_sockets.c', 'third_party/cares/cares/ares__get_hostent.c', 'third_party/cares/cares/ares__read_line.c', @@ -568,4 +832,19 @@ CORE_SOURCE_FILES = [ 'third_party/upb/upb/port.c', 'third_party/upb/upb/table.c', 'third_party/upb/upb/upb.c', + 'third_party/zlib/adler32.c', + 'third_party/zlib/compress.c', + 'third_party/zlib/crc32.c', + 'third_party/zlib/deflate.c', + 'third_party/zlib/gzclose.c', + 'third_party/zlib/gzlib.c', + 'third_party/zlib/gzread.c', + 'third_party/zlib/gzwrite.c', + 'third_party/zlib/infback.c', + 'third_party/zlib/inffast.c', + 'third_party/zlib/inflate.c', + 'third_party/zlib/inftrees.c', + 'third_party/zlib/trees.c', + 'third_party/zlib/uncompr.c', + 'third_party/zlib/zutil.c', ] diff --git a/tools/run_tests/generated/tests.json b/tools/run_tests/generated/tests.json index ab92e671caa..b09efd61926 100644 --- a/tools/run_tests/generated/tests.json +++ b/tools/run_tests/generated/tests.json @@ -5997,6 +5997,58 @@ ], "uses_polling": true }, + { + "args": [], + "boringssl": true, + "ci_platforms": [ + "linux", + "mac", + "posix", + "windows" + ], + "cpu_cost": 1.0, + "defaults": "boringssl", + "exclude_configs": [ + "asan", + "ubsan" + ], + "flaky": false, + "gtest": true, + "language": "c++", + "name": "boringssl_ssl_test", + "platforms": [ + "linux", + "mac", + "posix", + "windows" + ] + }, + { + "args": [], + "boringssl": true, + "ci_platforms": [ + "linux", + "mac", + "posix", + "windows" + ], + "cpu_cost": 1.0, + "defaults": "boringssl", + "exclude_configs": [ + "asan", + "ubsan" + ], + "flaky": false, + "gtest": true, + "language": "c++", + "name": "boringssl_crypto_test", + "platforms": [ + "linux", + "mac", + "posix", + "windows" + ] + }, { "args": [ "test/core/security/corpus/alts_credentials_corpus/0149b46b88d583e05be0fb1423d10f2a14d36c48" From 4fe2f945f11792f395d55ed0048a30bf26738e4e Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Tue, 14 Apr 2020 18:24:06 -0700 Subject: [PATCH 489/758] Add new line --- test/core/end2end/tests/client_streaming.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/core/end2end/tests/client_streaming.cc b/test/core/end2end/tests/client_streaming.cc index 15b5bdcf8f3..734be729b2f 100644 --- a/test/core/end2end/tests/client_streaming.cc +++ b/test/core/end2end/tests/client_streaming.cc @@ -270,4 +270,4 @@ void client_streaming(grpc_end2end_test_config config) { } } -void client_streaming_pre_init(void) {} \ No newline at end of file +void client_streaming_pre_init(void) {} From cb4bc115a92e56ca008e1c0edd08bda0a331c8ba Mon Sep 17 00:00:00 2001 From: LIU JIAN Date: Wed, 15 Apr 2020 10:47:41 +0800 Subject: [PATCH 490/758] Update php_generator.cc Add type annotations to make the IDE more friendly --- src/compiler/php_generator.cc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/compiler/php_generator.cc b/src/compiler/php_generator.cc index ca084cccbdf..ddeb2bc7a96 100644 --- a/src/compiler/php_generator.cc +++ b/src/compiler/php_generator.cc @@ -80,7 +80,8 @@ void PrintMethod(const MethodDescriptor* method, Printer* out) { if (method->client_streaming()) { out->Print(vars, " * @param array $$metadata metadata\n" - " * @param array $$options call options\n */\n" + " * @param array $$options call options\n" + " * @return \\$output_type_id$\n */\n" "public function $name$($$metadata = [], " "$$options = []) {\n"); out->Indent(); @@ -98,7 +99,8 @@ void PrintMethod(const MethodDescriptor* method, Printer* out) { out->Print(vars, " * @param \\$input_type_id$ $$argument input argument\n" " * @param array $$metadata metadata\n" - " * @param array $$options call options\n */\n" + " * @param array $$options call options\n" + " * @return \\$output_type_id$\n */\n" "public function $name$(\\$input_type_id$ $$argument,\n" " $$metadata = [], $$options = []) {\n"); out->Indent(); From 0bd9e89d0510e784f12d929e5691cdcc32e52c0c Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Tue, 14 Apr 2020 20:23:14 -0700 Subject: [PATCH 491/758] Regenerate projects --- CMakeLists.txt | 2 ++ Makefile | 2 ++ build_autogenerated.yaml | 2 ++ gRPC-Core.podspec | 1 + grpc.gyp | 2 ++ 5 files changed, 9 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 27bf340b65a..2f2bcd6fb70 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -919,6 +919,7 @@ add_library(end2end_nosec_tests test/core/end2end/tests/cancel_in_a_vacuum.cc test/core/end2end/tests/cancel_with_status.cc test/core/end2end/tests/channelz.cc + test/core/end2end/tests/client_streaming.cc test/core/end2end/tests/compressed_payload.cc test/core/end2end/tests/connectivity.cc test/core/end2end/tests/default_host.cc @@ -1050,6 +1051,7 @@ add_library(end2end_tests test/core/end2end/tests/cancel_in_a_vacuum.cc test/core/end2end/tests/cancel_with_status.cc test/core/end2end/tests/channelz.cc + test/core/end2end/tests/client_streaming.cc test/core/end2end/tests/compressed_payload.cc test/core/end2end/tests/connectivity.cc test/core/end2end/tests/default_host.cc diff --git a/Makefile b/Makefile index d6c8cd19efa..2ade8f73fa4 100644 --- a/Makefile +++ b/Makefile @@ -3290,6 +3290,7 @@ LIBEND2END_NOSEC_TESTS_SRC = \ test/core/end2end/tests/cancel_in_a_vacuum.cc \ test/core/end2end/tests/cancel_with_status.cc \ test/core/end2end/tests/channelz.cc \ + test/core/end2end/tests/client_streaming.cc \ test/core/end2end/tests/compressed_payload.cc \ test/core/end2end/tests/connectivity.cc \ test/core/end2end/tests/default_host.cc \ @@ -3402,6 +3403,7 @@ LIBEND2END_TESTS_SRC = \ test/core/end2end/tests/cancel_in_a_vacuum.cc \ test/core/end2end/tests/cancel_with_status.cc \ test/core/end2end/tests/channelz.cc \ + test/core/end2end/tests/client_streaming.cc \ test/core/end2end/tests/compressed_payload.cc \ test/core/end2end/tests/connectivity.cc \ test/core/end2end/tests/default_host.cc \ diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml index 30dba593d4f..af53ae25dc9 100644 --- a/build_autogenerated.yaml +++ b/build_autogenerated.yaml @@ -49,6 +49,7 @@ libs: - test/core/end2end/tests/cancel_in_a_vacuum.cc - test/core/end2end/tests/cancel_with_status.cc - test/core/end2end/tests/channelz.cc + - test/core/end2end/tests/client_streaming.cc - test/core/end2end/tests/compressed_payload.cc - test/core/end2end/tests/connectivity.cc - test/core/end2end/tests/default_host.cc @@ -157,6 +158,7 @@ libs: - test/core/end2end/tests/cancel_in_a_vacuum.cc - test/core/end2end/tests/cancel_with_status.cc - test/core/end2end/tests/channelz.cc + - test/core/end2end/tests/client_streaming.cc - test/core/end2end/tests/compressed_payload.cc - test/core/end2end/tests/connectivity.cc - test/core/end2end/tests/default_host.cc diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec index 749e77b3fa7..fda497e531d 100644 --- a/gRPC-Core.podspec +++ b/gRPC-Core.podspec @@ -1482,6 +1482,7 @@ Pod::Spec.new do |s| 'test/core/end2end/tests/cancel_test_helpers.h', 'test/core/end2end/tests/cancel_with_status.cc', 'test/core/end2end/tests/channelz.cc', + 'test/core/end2end/tests/client_streaming.cc', 'test/core/end2end/tests/compressed_payload.cc', 'test/core/end2end/tests/connectivity.cc', 'test/core/end2end/tests/default_host.cc', diff --git a/grpc.gyp b/grpc.gyp index a62c034d65a..037fc0421d8 100644 --- a/grpc.gyp +++ b/grpc.gyp @@ -198,6 +198,7 @@ 'test/core/end2end/tests/cancel_in_a_vacuum.cc', 'test/core/end2end/tests/cancel_with_status.cc', 'test/core/end2end/tests/channelz.cc', + 'test/core/end2end/tests/client_streaming.cc', 'test/core/end2end/tests/compressed_payload.cc', 'test/core/end2end/tests/connectivity.cc', 'test/core/end2end/tests/default_host.cc', @@ -299,6 +300,7 @@ 'test/core/end2end/tests/cancel_in_a_vacuum.cc', 'test/core/end2end/tests/cancel_with_status.cc', 'test/core/end2end/tests/channelz.cc', + 'test/core/end2end/tests/client_streaming.cc', 'test/core/end2end/tests/compressed_payload.cc', 'test/core/end2end/tests/connectivity.cc', 'test/core/end2end/tests/default_host.cc', From 2c82136658faea19bd952dbf88d74acad1f3a4ec Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Tue, 14 Apr 2020 20:28:43 -0700 Subject: [PATCH 492/758] use the correct copyright --- test/core/end2end/tests/client_streaming.cc | 34 ++++++++++----------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/test/core/end2end/tests/client_streaming.cc b/test/core/end2end/tests/client_streaming.cc index 734be729b2f..b81eef2297e 100644 --- a/test/core/end2end/tests/client_streaming.cc +++ b/test/core/end2end/tests/client_streaming.cc @@ -1,20 +1,20 @@ -/* - * - * Copyright 2019 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ +// +// +// Copyright 2020 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// #include "test/core/end2end/end2end_tests.h" From ef8259da5a9f8071c5c1678eeadf619385230b80 Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Tue, 14 Apr 2020 20:30:09 -0700 Subject: [PATCH 493/758] Revert debugging changes --- test/core/end2end/generate_tests.bzl | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/test/core/end2end/generate_tests.bzl b/test/core/end2end/generate_tests.bzl index 03ff6642ccc..83a2541a14b 100755 --- a/test/core/end2end/generate_tests.bzl +++ b/test/core/end2end/generate_tests.bzl @@ -219,6 +219,7 @@ END2END_TESTS = { "cancel_before_invoke": _test_options(), "cancel_in_a_vacuum": _test_options(), "cancel_with_status": _test_options(), + "client_streaming": _test_options(), "compressed_payload": _test_options(proxyable = False, exclude_inproc = True), "connectivity": _test_options( needs_fullstack = True, @@ -226,7 +227,6 @@ END2END_TESTS = { proxyable = False, ), "channelz": _test_options(), - "client_streaming": _test_options(), "default_host": _test_options( needs_fullstack = True, needs_dns = True, @@ -454,7 +454,7 @@ def grpc_end2end_tests(): test_short_name = str(t) if not topt.short_name else topt.short_name native.sh_test( - name = "%s_test_%s" % (f, test_short_name), + name = "%s_test@%s" % (f, test_short_name), data = [":%s_test" % f], srcs = ["end2end_test.sh"], args = [ @@ -467,7 +467,7 @@ def grpc_end2end_tests(): for poller in POLLERS: native.sh_test( - name = "%s_test_gc%s@poller=%s" % (f, test_short_name, poller), + name = "%s_test@%s@poller=%s" % (f, test_short_name, poller), data = [":%s_test" % f], srcs = ["end2end_test.sh"], args = [ @@ -530,7 +530,7 @@ def grpc_end2end_nosec_tests(): test_short_name = str(t) if not topt.short_name else topt.short_name native.sh_test( - name = "%s_nosec_test_%s" % (f, test_short_name), + name = "%s_nosec_test@%s" % (f, test_short_name), data = [":%s_nosec_test" % f], srcs = ["end2end_test.sh"], args = [ @@ -543,7 +543,7 @@ def grpc_end2end_nosec_tests(): for poller in POLLERS: native.sh_test( - name = "%s_nosec_test_%s_poller=%s" % (f, test_short_name, poller), + name = "%s_nosec_test@%s@poller=%s" % (f, test_short_name, poller), data = [":%s_nosec_test" % f], srcs = ["end2end_test.sh"], args = [ From 71378a1a2f24f711179b8431f435b5fb8ae4364f Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Tue, 14 Apr 2020 20:32:29 -0700 Subject: [PATCH 494/758] update comment --- src/core/lib/surface/call.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/core/lib/surface/call.cc b/src/core/lib/surface/call.cc index 52d35b97cd4..d4ef71afd5f 100644 --- a/src/core/lib/surface/call.cc +++ b/src/core/lib/surface/call.cc @@ -1533,9 +1533,9 @@ static void finish_batch(void* bctlp, grpc_error* error) { reinterpret_cast(GRPC_ERROR_REF(error))); } // If the batch had an error, we should normally fail the call. If the batch - // ended with GRPC_ERROR_EOS instead, we should not cancel the call because we - // do not want to overwrite the status that will propagated through the - // recv_trailing_metadata filter. + // ended with GRPC_ERROR_EOS, we should not cancel the call because we + // do not want to overwrite the status that will be propagated through the + // recv_trailing_metadata callback. if (error != GRPC_ERROR_NONE && error != GRPC_ERROR_EOS) { gpr_log(GPR_ERROR, "got an error %s. cancelling", grpc_error_string(error)); cancel_with_error(call, GRPC_ERROR_REF(error)); From b1a75b722c1c7ebf40d9e0e5b9db15af974102e8 Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Tue, 14 Apr 2020 20:38:48 -0700 Subject: [PATCH 495/758] Update comment --- src/core/lib/iomgr/error.cc | 5 +++-- test/core/end2end/tests/client_streaming.cc | 8 ++++---- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/core/lib/iomgr/error.cc b/src/core/lib/iomgr/error.cc index 81b6b519dce..6108cc37dd1 100644 --- a/src/core/lib/iomgr/error.cc +++ b/src/core/lib/iomgr/error.cc @@ -461,8 +461,9 @@ const special_error_status_map error_status_map[] = { {GRPC_STATUS_RESOURCE_EXHAUSTED, "Out of memory", strlen("Out of memory")}, // GRPC_ERROR_OOM {GRPC_STATUS_INVALID_ARGUMENT, "", 0}, // GRPC_ERROR_RESERVED_2 - {GRPC_STATUS_CANCELLED, "Cancelled", strlen("Cancelled")}, - {GRPC_STATUS_INVALID_ARGUMENT, "", 0}, + {GRPC_STATUS_CANCELLED, "Cancelled", + strlen("Cancelled")}, // GRPC_ERROR_CANCELLED + {GRPC_STATUS_INVALID_ARGUMENT, "", 0}, // GRPC_ERROR_RESERVED_3 {GRPC_STATUS_UNAVAILABLE, "End of stream", strlen("End of stream")} // GRPC_ERROR_EOS }; diff --git a/test/core/end2end/tests/client_streaming.cc b/test/core/end2end/tests/client_streaming.cc index b81eef2297e..e3f8868ed16 100644 --- a/test/core/end2end/tests/client_streaming.cc +++ b/test/core/end2end/tests/client_streaming.cc @@ -83,10 +83,10 @@ static void end_test(grpc_end2end_test_fixture* f) { grpc_completion_queue_destroy(f->shutdown_cq); } -/* Client streaming test where the client sends a bunch of messages and the - * server reads them. After reading some messages, the server sends the status. - * Client writes fail after that due to the end of stream and the client - * subsequently requests and receives the status. */ +// Client streaming test where the client sends a bunch of messages and the +// server reads them. After reading some messages, the server sends the status. +// Client writes fail after that due to the end of stream and the client +// subsequently requests and receives the status. static void test_client_streaming(grpc_end2end_test_config config, int messages) { grpc_end2end_test_fixture f = From 2d29269f8ccb903343c03921c1d164bfbf0b401e Mon Sep 17 00:00:00 2001 From: Vijay Pai Date: Tue, 14 Apr 2020 13:56:52 -0700 Subject: [PATCH 496/758] Make proper use of anonymous namespace --- src/core/lib/surface/server.cc | 363 ++++++++++++++++----------------- 1 file changed, 178 insertions(+), 185 deletions(-) diff --git a/src/core/lib/surface/server.cc b/src/core/lib/surface/server.cc index 08b15ac001a..b4825489291 100644 --- a/src/core/lib/surface/server.cc +++ b/src/core/lib/surface/server.cc @@ -52,11 +52,11 @@ grpc_core::TraceFlag grpc_server_channel_trace(false, "server_channel"); using grpc_core::LockedMultiProducerSingleConsumerQueue; -static void server_on_recv_initial_metadata(void* ptr, grpc_error* error); -static void server_recv_trailing_metadata_ready(void* user_data, - grpc_error* error); - namespace { + +void server_on_recv_initial_metadata(void* ptr, grpc_error* error); +void server_recv_trailing_metadata_ready(void* user_data, grpc_error* error); + struct listener { void* arg; void (*start)(grpc_server* server, void* arg, grpc_pollset** pollsets, @@ -117,13 +117,13 @@ struct channel_data { intptr_t channelz_socket_uuid; }; -typedef struct shutdown_tag { +struct shutdown_tag { void* tag; grpc_completion_queue* cq; grpc_cq_completion completion; -} shutdown_tag; +}; -typedef enum { +enum call_state { /* waiting for metadata */ NOT_STARTED, /* initial metadata read, not flow controlled in yet */ @@ -132,9 +132,9 @@ typedef enum { ACTIVATED, /* cancelled before being queued */ ZOMBIED -} call_state; +}; -typedef struct request_matcher request_matcher; +struct request_matcher; struct call_data { call_data(grpc_call_element* elem, const grpc_call_element_args& args) @@ -144,7 +144,7 @@ struct call_data { ::server_on_recv_initial_metadata, elem, grpc_schedule_on_exec_ctx); GRPC_CLOSURE_INIT(&recv_trailing_metadata_ready, - server_recv_trailing_metadata_ready, elem, + ::server_recv_trailing_metadata_ready, elem, grpc_schedule_on_exec_ctx); } ~call_data() { @@ -213,10 +213,10 @@ struct registered_method { registered_method* next; }; -typedef struct { +struct channel_broadcaster { grpc_channel** channels; size_t num_channels; -} channel_broadcaster; +}; } // namespace struct grpc_server { @@ -269,19 +269,20 @@ struct grpc_server { #define SERVER_FROM_CALL_ELEM(elem) \ (((channel_data*)(elem)->channel_data)->server) -static void publish_new_rpc(void* calld, grpc_error* error); -static void fail_call(grpc_server* server, size_t cq_idx, requested_call* rc, - grpc_error* error); +namespace { +void publish_new_rpc(void* calld, grpc_error* error); +void fail_call(grpc_server* server, size_t cq_idx, requested_call* rc, + grpc_error* error); /* Before calling maybe_finish_shutdown, we must hold mu_global and not hold mu_call */ -static void maybe_finish_shutdown(grpc_server* server); +void maybe_finish_shutdown(grpc_server* server); /* * channel broadcaster */ /* assumes server locked */ -static void channel_broadcaster_init(grpc_server* s, channel_broadcaster* cb) { +void channel_broadcaster_init(grpc_server* s, channel_broadcaster* cb) { channel_data* c; size_t count = 0; for (c = s->root_channel_data.next; c != &s->root_channel_data; c = c->next) { @@ -302,15 +303,15 @@ struct shutdown_cleanup_args { grpc_slice slice; }; -static void shutdown_cleanup(void* arg, grpc_error* /*error*/) { +void shutdown_cleanup(void* arg, grpc_error* /*error*/) { struct shutdown_cleanup_args* a = static_cast(arg); grpc_slice_unref_internal(a->slice); gpr_free(a); } -static void send_shutdown(grpc_channel* channel, bool send_goaway, - grpc_error* send_disconnect) { +void send_shutdown(grpc_channel* channel, bool send_goaway, + grpc_error* send_disconnect) { struct shutdown_cleanup_args* sc = static_cast(gpr_malloc(sizeof(*sc))); GRPC_CLOSURE_INIT(&sc->closure, shutdown_cleanup, sc, @@ -331,9 +332,8 @@ static void send_shutdown(grpc_channel* channel, bool send_goaway, elem->filter->start_transport_op(elem, op); } -static void channel_broadcaster_shutdown(channel_broadcaster* cb, - bool send_goaway, - grpc_error* force_disconnect) { +void channel_broadcaster_shutdown(channel_broadcaster* cb, bool send_goaway, + grpc_error* force_disconnect) { size_t i; for (i = 0; i < cb->num_channels; i++) { @@ -349,7 +349,7 @@ static void channel_broadcaster_shutdown(channel_broadcaster* cb, * request_matcher */ -static void request_matcher_init(request_matcher* rm, grpc_server* server) { +void request_matcher_init(request_matcher* rm, grpc_server* server) { rm->server = server; rm->pending_head = rm->pending_tail = nullptr; rm->requests_per_cq = static_cast( @@ -359,7 +359,7 @@ static void request_matcher_init(request_matcher* rm, grpc_server* server) { } } -static void request_matcher_destroy(request_matcher* rm) { +void request_matcher_destroy(request_matcher* rm) { for (size_t i = 0; i < rm->server->cq_count; i++) { GPR_ASSERT(rm->requests_per_cq[i].Pop() == nullptr); rm->requests_per_cq[i].~LockedMultiProducerSingleConsumerQueue(); @@ -367,12 +367,12 @@ static void request_matcher_destroy(request_matcher* rm) { gpr_free(rm->requests_per_cq); } -static void kill_zombie(void* elem, grpc_error* /*error*/) { +void kill_zombie(void* elem, grpc_error* /*error*/) { grpc_call_unref( grpc_call_from_top_element(static_cast(elem))); } -static void request_matcher_zombify_all_pending_calls(request_matcher* rm) { +void request_matcher_zombify_all_pending_calls(request_matcher* rm) { while (rm->pending_head) { call_data* calld = rm->pending_head; rm->pending_head = calld->pending_next; @@ -386,9 +386,8 @@ static void request_matcher_zombify_all_pending_calls(request_matcher* rm) { } } -static void request_matcher_kill_requests(grpc_server* server, - request_matcher* rm, - grpc_error* error) { +void request_matcher_kill_requests(grpc_server* server, request_matcher* rm, + grpc_error* error) { requested_call* rc; for (size_t i = 0; i < server->cq_count; i++) { while ((rc = reinterpret_cast( @@ -403,9 +402,9 @@ static void request_matcher_kill_requests(grpc_server* server, * server proper */ -static void server_ref(grpc_server* server) { server->internal_refcount.Ref(); } +void server_ref(grpc_server* server) { server->internal_refcount.Ref(); } -static void server_delete(grpc_server* server) { +void server_delete(grpc_server* server) { registered_method* rm; size_t i; server->channelz_server.reset(); @@ -434,30 +433,28 @@ static void server_delete(grpc_server* server) { gpr_free(server); } -static void server_unref(grpc_server* server) { +void server_unref(grpc_server* server) { if (GPR_UNLIKELY(server->internal_refcount.Unref())) { server_delete(server); } } -static int is_channel_orphaned(channel_data* chand) { - return chand->next == chand; -} +int is_channel_orphaned(channel_data* chand) { return chand->next == chand; } -static void orphan_channel(channel_data* chand) { +void orphan_channel(channel_data* chand) { chand->next->prev = chand->prev; chand->prev->next = chand->next; chand->next = chand->prev = chand; } -static void finish_destroy_channel(void* cd, grpc_error* /*error*/) { +void finish_destroy_channel(void* cd, grpc_error* /*error*/) { channel_data* chand = static_cast(cd); grpc_server* server = chand->server; GRPC_CHANNEL_INTERNAL_UNREF(chand->channel, "server"); server_unref(server); } -static void destroy_channel(channel_data* chand) { +void destroy_channel(channel_data* chand) { if (is_channel_orphaned(chand)) return; GPR_ASSERT(chand->server != nullptr); orphan_channel(chand); @@ -478,12 +475,10 @@ static void destroy_channel(channel_data* chand) { op); } -static void done_request_event(void* req, grpc_cq_completion* /*c*/) { - gpr_free(req); -} +void done_request_event(void* req, grpc_cq_completion* /*c*/) { gpr_free(req); } -static void publish_call(grpc_server* server, call_data* calld, size_t cq_idx, - requested_call* rc) { +void publish_call(grpc_server* server, call_data* calld, size_t cq_idx, + requested_call* rc) { grpc_call_set_completion_queue(calld->call, rc->cq_bound_to_call); grpc_call* call = calld->call; *rc->call = call; @@ -515,7 +510,7 @@ static void publish_call(grpc_server* server, call_data* calld, size_t cq_idx, rc, &rc->completion, true); } -static void publish_new_rpc(void* arg, grpc_error* error) { +void publish_new_rpc(void* arg, grpc_error* error) { grpc_call_element* call_elem = static_cast(arg); call_data* calld = static_cast(call_elem->call_data); channel_data* chand = static_cast(call_elem->channel_data); @@ -580,7 +575,7 @@ static void publish_new_rpc(void* arg, grpc_error* error) { gpr_mu_unlock(&server->mu_call); } -static void finish_start_new_rpc( +void finish_start_new_rpc( grpc_server* server, grpc_call_element* elem, request_matcher* rm, grpc_server_register_method_payload_handling payload_handling) { call_data* calld = static_cast(elem->call_data); @@ -614,7 +609,7 @@ static void finish_start_new_rpc( } } -static void start_new_rpc(grpc_call_element* elem) { +void start_new_rpc(grpc_call_element* elem) { channel_data* chand = static_cast(elem->channel_data); call_data* calld = static_cast(elem->call_data); grpc_server* server = chand->server; @@ -665,7 +660,7 @@ static void start_new_rpc(grpc_call_element* elem) { GRPC_SRM_PAYLOAD_NONE); } -static int num_listeners(grpc_server* server) { +int num_listeners(grpc_server* server) { listener* l; int n = 0; for (l = server->listeners; l; l = l->next) { @@ -674,12 +669,11 @@ static int num_listeners(grpc_server* server) { return n; } -static void done_shutdown_event(void* server, - grpc_cq_completion* /*completion*/) { +void done_shutdown_event(void* server, grpc_cq_completion* /*completion*/) { server_unref(static_cast(server)); } -static int num_channels(grpc_server* server) { +int num_channels(grpc_server* server) { channel_data* chand; int n = 0; for (chand = server->root_channel_data.next; @@ -689,7 +683,7 @@ static int num_channels(grpc_server* server) { return n; } -static void kill_pending_work_locked(grpc_server* server, grpc_error* error) { +void kill_pending_work_locked(grpc_server* server, grpc_error* error) { if (server->started) { request_matcher_kill_requests(server, &server->unregistered_request_matcher, GRPC_ERROR_REF(error)); @@ -705,7 +699,7 @@ static void kill_pending_work_locked(grpc_server* server, grpc_error* error) { GRPC_ERROR_UNREF(error); } -static void maybe_finish_shutdown(grpc_server* server) { +void maybe_finish_shutdown(grpc_server* server) { size_t i; if (!gpr_atm_acq_load(&server->shutdown_flag) || server->shutdown_published) { return; @@ -740,7 +734,7 @@ static void maybe_finish_shutdown(grpc_server* server) { } } -static void server_on_recv_initial_metadata(void* ptr, grpc_error* error) { +void server_on_recv_initial_metadata(void* ptr, grpc_error* error) { grpc_call_element* elem = static_cast(ptr); call_data* calld = static_cast(elem->call_data); grpc_millis op_deadline; @@ -786,8 +780,7 @@ static void server_on_recv_initial_metadata(void* ptr, grpc_error* error) { grpc_core::Closure::Run(DEBUG_LOCATION, closure, error); } -static void server_recv_trailing_metadata_ready(void* user_data, - grpc_error* error) { +void server_recv_trailing_metadata_ready(void* user_data, grpc_error* error) { grpc_call_element* elem = static_cast(user_data); call_data* calld = static_cast(elem->call_data); if (calld->on_done_recv_initial_metadata != nullptr) { @@ -808,8 +801,8 @@ static void server_recv_trailing_metadata_ready(void* user_data, calld->original_recv_trailing_metadata_ready, error); } -static void server_mutate_op(grpc_call_element* elem, - grpc_transport_stream_op_batch* op) { +void server_mutate_op(grpc_call_element* elem, + grpc_transport_stream_op_batch* op) { call_data* calld = static_cast(elem->call_data); if (op->recv_initial_metadata) { @@ -831,13 +824,13 @@ static void server_mutate_op(grpc_call_element* elem, } } -static void server_start_transport_stream_op_batch( +void server_start_transport_stream_op_batch( grpc_call_element* elem, grpc_transport_stream_op_batch* op) { server_mutate_op(elem, op); grpc_call_next_op(elem, op); } -static void got_initial_metadata(void* ptr, grpc_error* error) { +void got_initial_metadata(void* ptr, grpc_error* error) { grpc_call_element* elem = static_cast(ptr); call_data* calld = static_cast(elem->call_data); if (error == GRPC_ERROR_NONE) { @@ -855,8 +848,8 @@ static void got_initial_metadata(void* ptr, grpc_error* error) { } } -static void accept_stream(void* cd, grpc_transport* /*transport*/, - const void* transport_server_data) { +void accept_stream(void* cd, grpc_transport* /*transport*/, + const void* transport_server_data) { channel_data* chand = static_cast(cd); /* create a call */ grpc_call_create_args args; @@ -891,25 +884,25 @@ static void accept_stream(void* cd, grpc_transport* /*transport*/, grpc_call_start_batch_and_execute(call, &op, 1, &calld->got_initial_metadata); } -static grpc_error* server_init_call_elem(grpc_call_element* elem, - const grpc_call_element_args* args) { +grpc_error* server_init_call_elem(grpc_call_element* elem, + const grpc_call_element_args* args) { channel_data* chand = static_cast(elem->channel_data); server_ref(chand->server); new (elem->call_data) call_data(elem, *args); return GRPC_ERROR_NONE; } -static void server_destroy_call_elem(grpc_call_element* elem, - const grpc_call_final_info* /*final_info*/, - grpc_closure* /*ignored*/) { +void server_destroy_call_elem(grpc_call_element* elem, + const grpc_call_final_info* /*final_info*/, + grpc_closure* /*ignored*/) { call_data* calld = static_cast(elem->call_data); calld->~call_data(); channel_data* chand = static_cast(elem->channel_data); server_unref(chand->server); } -static grpc_error* server_init_channel_elem(grpc_channel_element* elem, - grpc_channel_element_args* args) { +grpc_error* server_init_channel_elem(grpc_channel_element* elem, + grpc_channel_element_args* args) { channel_data* chand = static_cast(elem->channel_data); GPR_ASSERT(args->is_first); GPR_ASSERT(!args->is_last); @@ -920,7 +913,7 @@ static grpc_error* server_init_channel_elem(grpc_channel_element* elem, return GRPC_ERROR_NONE; } -static void server_destroy_channel_elem(grpc_channel_element* elem) { +void server_destroy_channel_elem(grpc_channel_element* elem) { size_t i; channel_data* chand = static_cast(elem->channel_data); if (chand->registered_methods) { @@ -954,6 +947,121 @@ static void server_destroy_channel_elem(grpc_channel_element* elem) { } } +void register_completion_queue(grpc_server* server, grpc_completion_queue* cq, + void* reserved) { + size_t i, n; + GPR_ASSERT(!reserved); + for (i = 0; i < server->cq_count; i++) { + if (server->cqs[i] == cq) return; + } + + GRPC_CQ_INTERNAL_REF(cq, "server"); + n = server->cq_count++; + server->cqs = static_cast(gpr_realloc( + server->cqs, server->cq_count * sizeof(grpc_completion_queue*))); + server->cqs[n] = cq; +} + +int streq(const char* a, const char* b) { + if (a == nullptr && b == nullptr) return 1; + if (a == nullptr) return 0; + if (b == nullptr) return 0; + return 0 == strcmp(a, b); +} + +class ConnectivityWatcher + : public grpc_core::AsyncConnectivityStateWatcherInterface { + public: + explicit ConnectivityWatcher(channel_data* chand) : chand_(chand) { + GRPC_CHANNEL_INTERNAL_REF(chand_->channel, "connectivity"); + } + + ~ConnectivityWatcher() { + GRPC_CHANNEL_INTERNAL_UNREF(chand_->channel, "connectivity"); + } + + private: + void OnConnectivityStateChange(grpc_connectivity_state new_state) override { + // Don't do anything until we are being shut down. + if (new_state != GRPC_CHANNEL_SHUTDOWN) return; + // Shut down channel. + grpc_server* server = chand_->server; + gpr_mu_lock(&server->mu_global); + destroy_channel(chand_); + gpr_mu_unlock(&server->mu_global); + } + + channel_data* chand_; +}; + +void done_published_shutdown(void* done_arg, grpc_cq_completion* storage) { + (void)done_arg; + gpr_free(storage); +} + +void listener_destroy_done(void* s, grpc_error* /*error*/) { + grpc_server* server = static_cast(s); + gpr_mu_lock(&server->mu_global); + server->listeners_destroyed++; + maybe_finish_shutdown(server); + gpr_mu_unlock(&server->mu_global); +} + +grpc_call_error queue_call_request(grpc_server* server, size_t cq_idx, + requested_call* rc) { + call_data* calld = nullptr; + request_matcher* rm = nullptr; + if (gpr_atm_acq_load(&server->shutdown_flag)) { + fail_call(server, cq_idx, rc, + GRPC_ERROR_CREATE_FROM_STATIC_STRING("Server Shutdown")); + return GRPC_CALL_OK; + } + switch (rc->type) { + case BATCH_CALL: + rm = &server->unregistered_request_matcher; + break; + case REGISTERED_CALL: + rm = &rc->data.registered.method->matcher; + break; + } + if (rm->requests_per_cq[cq_idx].Push(rc->mpscq_node.get())) { + /* this was the first queued request: we need to lock and start + matching calls */ + gpr_mu_lock(&server->mu_call); + while ((calld = rm->pending_head) != nullptr) { + rc = reinterpret_cast(rm->requests_per_cq[cq_idx].Pop()); + if (rc == nullptr) break; + rm->pending_head = calld->pending_next; + gpr_mu_unlock(&server->mu_call); + if (!gpr_atm_full_cas(&calld->state, PENDING, ACTIVATED)) { + // Zombied Call + GRPC_CLOSURE_INIT( + &calld->kill_zombie_closure, kill_zombie, + grpc_call_stack_element(grpc_call_get_call_stack(calld->call), 0), + grpc_schedule_on_exec_ctx); + grpc_core::ExecCtx::Run(DEBUG_LOCATION, &calld->kill_zombie_closure, + GRPC_ERROR_NONE); + } else { + publish_call(server, calld, cq_idx, rc); + } + gpr_mu_lock(&server->mu_call); + } + gpr_mu_unlock(&server->mu_call); + } + return GRPC_CALL_OK; +} + +void fail_call(grpc_server* server, size_t cq_idx, requested_call* rc, + grpc_error* error) { + *rc->call = nullptr; + rc->initial_metadata->count = 0; + GPR_ASSERT(error != GRPC_ERROR_NONE); + + grpc_cq_end_op(server->cqs[cq_idx], rc->tag, error, done_request_event, rc, + &rc->completion); +} +} // namespace + const grpc_channel_filter grpc_server_top_filter = { server_start_transport_stream_op_batch, grpc_channel_next_op, @@ -968,22 +1076,6 @@ const grpc_channel_filter grpc_server_top_filter = { "server", }; -static void register_completion_queue(grpc_server* server, - grpc_completion_queue* cq, - void* reserved) { - size_t i, n; - GPR_ASSERT(!reserved); - for (i = 0; i < server->cq_count; i++) { - if (server->cqs[i] == cq) return; - } - - GRPC_CQ_INTERNAL_REF(cq, "server"); - n = server->cq_count++; - server->cqs = static_cast(gpr_realloc( - server->cqs, server->cq_count * sizeof(grpc_completion_queue*))); - server->cqs[n] = cq; -} - void grpc_server_register_completion_queue(grpc_server* server, grpc_completion_queue* cq, void* reserved) { @@ -1049,13 +1141,6 @@ grpc_server* grpc_server_create(const grpc_channel_args* args, void* reserved) { return server; } -static int streq(const char* a, const char* b) { - if (a == nullptr && b == nullptr) return 1; - if (a == nullptr) return 0; - if (b == nullptr) return 0; - return 0 == strcmp(a, b); -} - void* grpc_server_register_method( grpc_server* server, const char* method, const char* host, grpc_server_register_method_payload_handling payload_handling, @@ -1133,31 +1218,6 @@ void grpc_server_get_pollsets(grpc_server* server, grpc_pollset*** pollsets, *pollsets = server->pollsets; } -class ConnectivityWatcher - : public grpc_core::AsyncConnectivityStateWatcherInterface { - public: - explicit ConnectivityWatcher(channel_data* chand) : chand_(chand) { - GRPC_CHANNEL_INTERNAL_REF(chand_->channel, "connectivity"); - } - - ~ConnectivityWatcher() { - GRPC_CHANNEL_INTERNAL_UNREF(chand_->channel, "connectivity"); - } - - private: - void OnConnectivityStateChange(grpc_connectivity_state new_state) override { - // Don't do anything until we are being shut down. - if (new_state != GRPC_CHANNEL_SHUTDOWN) return; - // Shut down channel. - grpc_server* server = chand_->server; - gpr_mu_lock(&server->mu_global); - destroy_channel(chand_); - gpr_mu_unlock(&server->mu_global); - } - - channel_data* chand_; -}; - void grpc_server_setup_transport( grpc_server* s, grpc_transport* transport, grpc_pollset* accepting_pollset, const grpc_channel_args* args, @@ -1257,19 +1317,6 @@ void grpc_server_setup_transport( grpc_transport_perform_op(transport, op); } -void done_published_shutdown(void* done_arg, grpc_cq_completion* storage) { - (void)done_arg; - gpr_free(storage); -} - -static void listener_destroy_done(void* s, grpc_error* /*error*/) { - grpc_server* server = static_cast(s); - gpr_mu_lock(&server->mu_global); - server->listeners_destroyed++; - maybe_finish_shutdown(server); - gpr_mu_unlock(&server->mu_global); -} - /* - Kills all pending requests-for-incoming-RPC-calls (i.e the requests made via grpc_server_request_call and grpc_server_request_registered call will now be @@ -1419,50 +1466,6 @@ void grpc_server_add_listener( server->listeners = l; } -static grpc_call_error queue_call_request(grpc_server* server, size_t cq_idx, - requested_call* rc) { - call_data* calld = nullptr; - request_matcher* rm = nullptr; - if (gpr_atm_acq_load(&server->shutdown_flag)) { - fail_call(server, cq_idx, rc, - GRPC_ERROR_CREATE_FROM_STATIC_STRING("Server Shutdown")); - return GRPC_CALL_OK; - } - switch (rc->type) { - case BATCH_CALL: - rm = &server->unregistered_request_matcher; - break; - case REGISTERED_CALL: - rm = &rc->data.registered.method->matcher; - break; - } - if (rm->requests_per_cq[cq_idx].Push(rc->mpscq_node.get())) { - /* this was the first queued request: we need to lock and start - matching calls */ - gpr_mu_lock(&server->mu_call); - while ((calld = rm->pending_head) != nullptr) { - rc = reinterpret_cast(rm->requests_per_cq[cq_idx].Pop()); - if (rc == nullptr) break; - rm->pending_head = calld->pending_next; - gpr_mu_unlock(&server->mu_call); - if (!gpr_atm_full_cas(&calld->state, PENDING, ACTIVATED)) { - // Zombied Call - GRPC_CLOSURE_INIT( - &calld->kill_zombie_closure, kill_zombie, - grpc_call_stack_element(grpc_call_get_call_stack(calld->call), 0), - grpc_schedule_on_exec_ctx); - grpc_core::ExecCtx::Run(DEBUG_LOCATION, &calld->kill_zombie_closure, - GRPC_ERROR_NONE); - } else { - publish_call(server, calld, cq_idx, rc); - } - gpr_mu_lock(&server->mu_call); - } - gpr_mu_unlock(&server->mu_call); - } - return GRPC_CALL_OK; -} - grpc_call_error grpc_server_request_call( grpc_server* server, grpc_call** call, grpc_call_details* details, grpc_metadata_array* initial_metadata, @@ -1563,16 +1566,6 @@ grpc_call_error grpc_server_request_registered_call( return queue_call_request(server, cq_idx, rc); } -static void fail_call(grpc_server* server, size_t cq_idx, requested_call* rc, - grpc_error* error) { - *rc->call = nullptr; - rc->initial_metadata->count = 0; - GPR_ASSERT(error != GRPC_ERROR_NONE); - - grpc_cq_end_op(server->cqs[cq_idx], rc->tag, error, done_request_event, rc, - &rc->completion); -} - const grpc_channel_args* grpc_server_get_channel_args(grpc_server* server) { return server->channel_args; } From 5dfa78b55fb1786827954a0a81abd87b1c0f0c57 Mon Sep 17 00:00:00 2001 From: ZhenLian Date: Tue, 14 Apr 2020 23:49:32 -0700 Subject: [PATCH 497/758] [No Review] test MacOS test behaviors --- CMakeLists.txt | 4 ---- Makefile | 12 ------------ build_autogenerated.yaml | 7 +------ test/core/surface/BUILD | 4 +++- .../num_external_connectivity_watchers_test.cc | 10 +++++++++- 5 files changed, 13 insertions(+), 24 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 27bf340b65a..4fc05f7c174 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6344,10 +6344,6 @@ endif() if(gRPC_BUILD_TESTS) add_executable(num_external_connectivity_watchers_test - test/core/end2end/data/client_certs.cc - test/core/end2end/data/server1_cert.cc - test/core/end2end/data/server1_key.cc - test/core/end2end/data/test_root_cert.cc test/core/surface/num_external_connectivity_watchers_test.cc ) diff --git a/Makefile b/Makefile index d1a58c87a8b..609c55be2a8 100644 --- a/Makefile +++ b/Makefile @@ -9538,10 +9538,6 @@ endif NUM_EXTERNAL_CONNECTIVITY_WATCHERS_TEST_SRC = \ - test/core/end2end/data/client_certs.cc \ - test/core/end2end/data/server1_cert.cc \ - test/core/end2end/data/server1_key.cc \ - test/core/end2end/data/test_root_cert.cc \ test/core/surface/num_external_connectivity_watchers_test.cc \ NUM_EXTERNAL_CONNECTIVITY_WATCHERS_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(NUM_EXTERNAL_CONNECTIVITY_WATCHERS_TEST_SRC)))) @@ -9562,14 +9558,6 @@ $(BINDIR)/$(CONFIG)/num_external_connectivity_watchers_test: $(NUM_EXTERNAL_CONN endif -$(OBJDIR)/$(CONFIG)/test/core/end2end/data/client_certs.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a - -$(OBJDIR)/$(CONFIG)/test/core/end2end/data/server1_cert.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a - -$(OBJDIR)/$(CONFIG)/test/core/end2end/data/server1_key.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a - -$(OBJDIR)/$(CONFIG)/test/core/end2end/data/test_root_cert.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a - $(OBJDIR)/$(CONFIG)/test/core/surface/num_external_connectivity_watchers_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a deps_num_external_connectivity_watchers_test: $(NUM_EXTERNAL_CONNECTIVITY_WATCHERS_TEST_OBJS:.o=.dep) diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml index 69e0b124799..6470b6aec33 100644 --- a/build_autogenerated.yaml +++ b/build_autogenerated.yaml @@ -3881,13 +3881,8 @@ targets: - name: num_external_connectivity_watchers_test build: test language: c - headers: - - test/core/end2end/data/ssl_test_data.h + headers: [] src: - - test/core/end2end/data/client_certs.cc - - test/core/end2end/data/server1_cert.cc - - test/core/end2end/data/server1_key.cc - - test/core/end2end/data/test_root_cert.cc - test/core/surface/num_external_connectivity_watchers_test.cc deps: - grpc_test_util diff --git a/test/core/surface/BUILD b/test/core/surface/BUILD index 37a371dc4e8..364988c2ef5 100644 --- a/test/core/surface/BUILD +++ b/test/core/surface/BUILD @@ -102,11 +102,13 @@ grpc_cc_test( grpc_cc_test( name = "num_external_connectivity_watchers_test", srcs = ["num_external_connectivity_watchers_test.cc"], + data = [ + "//src/core/tsi/test_creds:ca.pem", + ], language = "C++", deps = [ "//:gpr", "//:grpc", - "//test/core/end2end:ssl_test_data", "//test/core/util:grpc_test_util", ], ) diff --git a/test/core/surface/num_external_connectivity_watchers_test.cc b/test/core/surface/num_external_connectivity_watchers_test.cc index 2c9b0d9aaed..541e9abda0f 100644 --- a/test/core/surface/num_external_connectivity_watchers_test.cc +++ b/test/core/surface/num_external_connectivity_watchers_test.cc @@ -26,10 +26,12 @@ #include "src/core/lib/gprpp/memory.h" #include "src/core/lib/gprpp/thd.h" #include "src/core/lib/iomgr/exec_ctx.h" -#include "test/core/end2end/data/ssl_test_data.h" +#include "src/core/lib/iomgr/load_file.h" #include "test/core/util/port.h" #include "test/core/util/test_config.h" +#define CA_CERT_PATH "src/core/tsi/test_creds/ca.pem" + typedef struct test_fixture { const char* name; grpc_channel* (*create_channel)(const char* addr); @@ -162,8 +164,14 @@ static const test_fixture insecure_test = { }; static grpc_channel* secure_test_create_channel(const char* addr) { + grpc_slice ca_slice; + GPR_ASSERT(GRPC_LOG_IF_ERROR("load_file", + grpc_load_file(CA_CERT_PATH, 1, &ca_slice))); + const char* test_root_cert = + reinterpret_cast GRPC_SLICE_START_PTR(ca_slice); grpc_channel_credentials* ssl_creds = grpc_ssl_credentials_create(test_root_cert, nullptr, nullptr, nullptr); + grpc_slice_unref(ca_slice); grpc_arg ssl_name_override = { GRPC_ARG_STRING, const_cast(GRPC_SSL_TARGET_NAME_OVERRIDE_ARG), From a8973db224613f548a7b6abe16eee1948ceaf304 Mon Sep 17 00:00:00 2001 From: Vijay Pai Date: Wed, 15 Apr 2020 00:18:57 -0700 Subject: [PATCH 498/758] Remove unneeded fields of requested_call --- src/core/lib/surface/server.cc | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/core/lib/surface/server.cc b/src/core/lib/surface/server.cc index 08b15ac001a..efeda24c008 100644 --- a/src/core/lib/surface/server.cc +++ b/src/core/lib/surface/server.cc @@ -76,9 +76,7 @@ struct requested_call { grpc_core::MultiProducerSingleConsumerQueue::Node> mpscq_node; requested_call_type type; - size_t cq_idx; void* tag; - grpc_server* server; grpc_completion_queue* cq_bound_to_call; grpc_call** call; grpc_cq_completion completion; @@ -1497,9 +1495,7 @@ grpc_call_error grpc_server_request_call( goto done; } details->reserved = nullptr; - rc->cq_idx = cq_idx; rc->type = BATCH_CALL; - rc->server = server; rc->tag = tag; rc->cq_bound_to_call = cq_bound_to_call; rc->call = call; @@ -1550,9 +1546,7 @@ grpc_call_error grpc_server_request_registered_call( gpr_free(rc); return GRPC_CALL_ERROR_COMPLETION_QUEUE_SHUTDOWN; } - rc->cq_idx = cq_idx; rc->type = REGISTERED_CALL; - rc->server = server; rc->tag = tag; rc->cq_bound_to_call = cq_bound_to_call; rc->call = call; From de26b12e24f9bc33e00ab1d933716e26193cc4f0 Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Wed, 15 Apr 2020 03:09:20 -0400 Subject: [PATCH 499/758] try fixing objC user-agent string tests --- src/objective-c/tests/UnitTests/APIv2Tests.m | 7 +------ src/objective-c/tests/UnitTests/GRPCClientTests.m | 5 +---- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/src/objective-c/tests/UnitTests/APIv2Tests.m b/src/objective-c/tests/UnitTests/APIv2Tests.m index 418f3e0e3e3..f46dc67a01b 100644 --- a/src/objective-c/tests/UnitTests/APIv2Tests.m +++ b/src/objective-c/tests/UnitTests/APIv2Tests.m @@ -235,12 +235,7 @@ static const NSTimeInterval kInvertedTimeout = 2; expectedUserAgent = [expectedUserAgent stringByAppendingString:@" ("]; expectedUserAgent = [expectedUserAgent stringByAppendingString:@GPR_PLATFORM_STRING]; - expectedUserAgent = - [expectedUserAgent stringByAppendingString:@"; chttp2; "]; - expectedUserAgent = [expectedUserAgent - stringByAppendingString:[NSString - stringWithUTF8String:grpc_g_stands_for()]]; - expectedUserAgent = [expectedUserAgent stringByAppendingString:@")"]; + expectedUserAgent = [expectedUserAgent stringByAppendingString:@"; chttp2)"]; XCTAssertEqualObjects(userAgent, expectedUserAgent); NSError *error = nil; diff --git a/src/objective-c/tests/UnitTests/GRPCClientTests.m b/src/objective-c/tests/UnitTests/GRPCClientTests.m index 82d01d4f778..978b7182c6c 100644 --- a/src/objective-c/tests/UnitTests/GRPCClientTests.m +++ b/src/objective-c/tests/UnitTests/GRPCClientTests.m @@ -307,10 +307,7 @@ static GRPCProtoMethod *kFullDuplexCallMethod; expectedUserAgent = [expectedUserAgent stringByAppendingString:GRPC_C_VERSION_STRING]; expectedUserAgent = [expectedUserAgent stringByAppendingString:@" ("]; expectedUserAgent = [expectedUserAgent stringByAppendingString:@GPR_PLATFORM_STRING]; - expectedUserAgent = [expectedUserAgent stringByAppendingString:@"; chttp2; "]; - expectedUserAgent = [expectedUserAgent - stringByAppendingString:[NSString stringWithUTF8String:grpc_g_stands_for()]]; - expectedUserAgent = [expectedUserAgent stringByAppendingString:@")"]; + expectedUserAgent = [expectedUserAgent stringByAppendingString:@"; chttp2)"]; XCTAssertEqualObjects(userAgent, expectedUserAgent); // Change in format of user-agent field in a direction that does not match the regex will From bf6e534714b21468ba6539f3db87d9fccf734fe6 Mon Sep 17 00:00:00 2001 From: "Mark D. Roth" Date: Wed, 15 Apr 2020 09:24:55 -0700 Subject: [PATCH 500/758] Accept either "" or "/" as the prefix for the default route. --- .../ext/filters/client_channel/xds/xds_api.cc | 5 +++-- test/cpp/end2end/xds_end2end_test.cc | 20 +++++++++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/core/ext/filters/client_channel/xds/xds_api.cc b/src/core/ext/filters/client_channel/xds/xds_api.cc index 4cf5d8c26a2..3898fe4d5f1 100644 --- a/src/core/ext/filters/client_channel/xds/xds_api.cc +++ b/src/core/ext/filters/client_channel/xds/xds_api.cc @@ -1022,8 +1022,9 @@ grpc_error* RouteConfigParse( "No prefix field found in RouteMatch."); } const upb_strview prefix = envoy_api_v2_route_RouteMatch_prefix(match); - if (!upb_strview_eql(prefix, upb_strview_makez(""))) { - return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Prefix is not empty string."); + if (!upb_strview_eql(prefix, upb_strview_makez("")) && + !upb_strview_eql(prefix, upb_strview_makez("/"))) { + return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Prefix is not \"\" or \"/\"."); } if (!envoy_api_v2_route_Route_has_route(route)) { return GRPC_ERROR_CREATE_FROM_STATIC_STRING( diff --git a/test/cpp/end2end/xds_end2end_test.cc b/test/cpp/end2end/xds_end2end_test.cc index 809ee59ee3d..7c03070190f 100644 --- a/test/cpp/end2end/xds_end2end_test.cc +++ b/test/cpp/end2end/xds_end2end_test.cc @@ -1799,6 +1799,26 @@ TEST_P(XdsResolverOnlyTest, RestartsRequestsUponReconnection) { EXPECT_EQ(0, std::get<1>(counts)); } +TEST_P(XdsResolverOnlyTest, DefaultRouteSpecifiesSlashPrefix) { + RouteConfiguration route_config = + balancers_[0]->ads_service()->default_route_config(); + route_config.mutable_virtual_hosts(0) + ->mutable_routes(0) + ->mutable_match() + ->set_prefix("/"); + balancers_[0]->ads_service()->SetLdsResource( + AdsServiceImpl::BuildListener(route_config), kDefaultResourceName); + SetNextResolution({}); + SetNextResolutionForLbChannelAllBalancers(); + AdsServiceImpl::EdsResourceArgs args({ + {"locality0", GetBackendPorts()}, + }); + balancers_[0]->ads_service()->SetEdsResource( + AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); + // We need to wait for all backends to come online. + WaitForAllBackends(); +} + class XdsResolverLoadReportingOnlyTest : public XdsEnd2endTest { public: XdsResolverLoadReportingOnlyTest() : XdsEnd2endTest(4, 1, 3) {} From b96895bf9d90ec9e5ccca8e7237e114d865d6562 Mon Sep 17 00:00:00 2001 From: Muxi Yan Date: Tue, 24 Mar 2020 10:13:57 -0700 Subject: [PATCH 501/758] Add apple_ev iomgr --- BUILD | 3 +- BUILD.gn | 2 + CMakeLists.txt | 2 + Makefile | 2 + build_autogenerated.yaml | 4 + config.m4 | 1 + config.w32 | 1 + gRPC-C++.podspec | 2 + gRPC-Core.podspec | 3 + grpc.gemspec | 2 + grpc.gyp | 2 + package.xml | 2 + src/core/lib/iomgr/cfstream_handle.cc | 5 +- src/core/lib/iomgr/ev_apple.cc | 356 ++++++++++++++++++ src/core/lib/iomgr/ev_apple.h | 43 +++ src/core/lib/iomgr/iomgr_posix_cfstream.cc | 104 ++++- src/core/lib/iomgr/pollset_set_custom.cc | 20 +- src/core/lib/iomgr/port.h | 1 + .../xcschemes/InteropTests.xcscheme | 9 +- .../xcshareddata/xcschemes/MacTests.xcscheme | 9 +- .../xcshareddata/xcschemes/PerfTests.xcscheme | 9 +- .../xcshareddata/xcschemes/TvTests.xcscheme | 9 +- .../xcshareddata/xcschemes/UnitTests.xcscheme | 9 +- src/python/grpcio/grpc_core_dependencies.py | 1 + test/cpp/ios/Podfile | 2 +- tools/doxygen/Doxyfile.c++.internal | 2 + tools/doxygen/Doxyfile.core.internal | 2 + 27 files changed, 563 insertions(+), 44 deletions(-) create mode 100644 src/core/lib/iomgr/ev_apple.cc create mode 100644 src/core/lib/iomgr/ev_apple.h diff --git a/BUILD b/BUILD index 8fe2d6d2e15..eede3816ac1 100644 --- a/BUILD +++ b/BUILD @@ -722,6 +722,7 @@ grpc_cc_library( "src/core/lib/iomgr/endpoint_pair_windows.cc", "src/core/lib/iomgr/error.cc", "src/core/lib/iomgr/error_cfstream.cc", + "src/core/lib/iomgr/ev_apple.cc", "src/core/lib/iomgr/ev_epoll1_linux.cc", "src/core/lib/iomgr/ev_epollex_linux.cc", "src/core/lib/iomgr/ev_poll_posix.cc", @@ -883,6 +884,7 @@ grpc_cc_library( "src/core/lib/iomgr/error.h", "src/core/lib/iomgr/error_cfstream.h", "src/core/lib/iomgr/error_internal.h", + "src/core/lib/iomgr/ev_apple.h", "src/core/lib/iomgr/ev_epoll1_linux.h", "src/core/lib/iomgr/ev_epollex_linux.h", "src/core/lib/iomgr/ev_poll_posix.h", @@ -987,7 +989,6 @@ grpc_cc_library( ], language = "c++", public_hdrs = GRPC_PUBLIC_HDRS, - use_cfstream = True, deps = [ "eventmanager_libuv", "gpr_base", diff --git a/BUILD.gn b/BUILD.gn index ee40a4db057..60361c2efb2 100644 --- a/BUILD.gn +++ b/BUILD.gn @@ -597,6 +597,8 @@ config("grpc_config") { "src/core/lib/iomgr/error_cfstream.cc", "src/core/lib/iomgr/error_cfstream.h", "src/core/lib/iomgr/error_internal.h", + "src/core/lib/iomgr/ev_apple.cc", + "src/core/lib/iomgr/ev_apple.h", "src/core/lib/iomgr/ev_epoll1_linux.cc", "src/core/lib/iomgr/ev_epoll1_linux.h", "src/core/lib/iomgr/ev_epollex_linux.cc", diff --git a/CMakeLists.txt b/CMakeLists.txt index cac83849d08..e8aae3afd09 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1503,6 +1503,7 @@ add_library(grpc src/core/lib/iomgr/endpoint_pair_windows.cc src/core/lib/iomgr/error.cc src/core/lib/iomgr/error_cfstream.cc + src/core/lib/iomgr/ev_apple.cc src/core/lib/iomgr/ev_epoll1_linux.cc src/core/lib/iomgr/ev_epollex_linux.cc src/core/lib/iomgr/ev_poll_posix.cc @@ -2150,6 +2151,7 @@ add_library(grpc_unsecure src/core/lib/iomgr/endpoint_pair_windows.cc src/core/lib/iomgr/error.cc src/core/lib/iomgr/error_cfstream.cc + src/core/lib/iomgr/ev_apple.cc src/core/lib/iomgr/ev_epoll1_linux.cc src/core/lib/iomgr/ev_epollex_linux.cc src/core/lib/iomgr/ev_poll_posix.cc diff --git a/Makefile b/Makefile index 243053da687..173b2ba50a0 100644 --- a/Makefile +++ b/Makefile @@ -3848,6 +3848,7 @@ LIBGRPC_SRC = \ src/core/lib/iomgr/endpoint_pair_windows.cc \ src/core/lib/iomgr/error.cc \ src/core/lib/iomgr/error_cfstream.cc \ + src/core/lib/iomgr/ev_apple.cc \ src/core/lib/iomgr/ev_epoll1_linux.cc \ src/core/lib/iomgr/ev_epollex_linux.cc \ src/core/lib/iomgr/ev_poll_posix.cc \ @@ -4470,6 +4471,7 @@ LIBGRPC_UNSECURE_SRC = \ src/core/lib/iomgr/endpoint_pair_windows.cc \ src/core/lib/iomgr/error.cc \ src/core/lib/iomgr/error_cfstream.cc \ + src/core/lib/iomgr/ev_apple.cc \ src/core/lib/iomgr/ev_epoll1_linux.cc \ src/core/lib/iomgr/ev_epollex_linux.cc \ src/core/lib/iomgr/ev_poll_posix.cc \ diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml index db915e77dcc..7c54b8d3aaf 100644 --- a/build_autogenerated.yaml +++ b/build_autogenerated.yaml @@ -564,6 +564,7 @@ libs: - src/core/lib/iomgr/error.h - src/core/lib/iomgr/error_cfstream.h - src/core/lib/iomgr/error_internal.h + - src/core/lib/iomgr/ev_apple.h - src/core/lib/iomgr/ev_epoll1_linux.h - src/core/lib/iomgr/ev_epollex_linux.h - src/core/lib/iomgr/ev_poll_posix.h @@ -931,6 +932,7 @@ libs: - src/core/lib/iomgr/endpoint_pair_windows.cc - src/core/lib/iomgr/error.cc - src/core/lib/iomgr/error_cfstream.cc + - src/core/lib/iomgr/ev_apple.cc - src/core/lib/iomgr/ev_epoll1_linux.cc - src/core/lib/iomgr/ev_epollex_linux.cc - src/core/lib/iomgr/ev_poll_posix.cc @@ -1455,6 +1457,7 @@ libs: - src/core/lib/iomgr/error.h - src/core/lib/iomgr/error_cfstream.h - src/core/lib/iomgr/error_internal.h + - src/core/lib/iomgr/ev_apple.h - src/core/lib/iomgr/ev_epoll1_linux.h - src/core/lib/iomgr/ev_epollex_linux.h - src/core/lib/iomgr/ev_poll_posix.h @@ -1754,6 +1757,7 @@ libs: - src/core/lib/iomgr/endpoint_pair_windows.cc - src/core/lib/iomgr/error.cc - src/core/lib/iomgr/error_cfstream.cc + - src/core/lib/iomgr/ev_apple.cc - src/core/lib/iomgr/ev_epoll1_linux.cc - src/core/lib/iomgr/ev_epollex_linux.cc - src/core/lib/iomgr/ev_poll_posix.cc diff --git a/config.m4 b/config.m4 index 7a38e36cd71..2a7c0d562d3 100644 --- a/config.m4 +++ b/config.m4 @@ -281,6 +281,7 @@ if test "$PHP_GRPC" != "no"; then src/core/lib/iomgr/endpoint_pair_windows.cc \ src/core/lib/iomgr/error.cc \ src/core/lib/iomgr/error_cfstream.cc \ + src/core/lib/iomgr/ev_apple.cc \ src/core/lib/iomgr/ev_epoll1_linux.cc \ src/core/lib/iomgr/ev_epollex_linux.cc \ src/core/lib/iomgr/ev_poll_posix.cc \ diff --git a/config.w32 b/config.w32 index 089504a1841..d962852984e 100644 --- a/config.w32 +++ b/config.w32 @@ -250,6 +250,7 @@ if (PHP_GRPC != "no") { "src\\core\\lib\\iomgr\\endpoint_pair_windows.cc " + "src\\core\\lib\\iomgr\\error.cc " + "src\\core\\lib\\iomgr\\error_cfstream.cc " + + "src\\core\\lib\\iomgr\\ev_apple.cc " + "src\\core\\lib\\iomgr\\ev_epoll1_linux.cc " + "src\\core\\lib\\iomgr\\ev_epollex_linux.cc " + "src\\core\\lib\\iomgr\\ev_poll_posix.cc " + diff --git a/gRPC-C++.podspec b/gRPC-C++.podspec index 06a5a2762b9..d7b18c0e062 100644 --- a/gRPC-C++.podspec +++ b/gRPC-C++.podspec @@ -443,6 +443,7 @@ Pod::Spec.new do |s| 'src/core/lib/iomgr/error.h', 'src/core/lib/iomgr/error_cfstream.h', 'src/core/lib/iomgr/error_internal.h', + 'src/core/lib/iomgr/ev_apple.h', 'src/core/lib/iomgr/ev_epoll1_linux.h', 'src/core/lib/iomgr/ev_epollex_linux.h', 'src/core/lib/iomgr/ev_poll_posix.h', @@ -892,6 +893,7 @@ Pod::Spec.new do |s| 'src/core/lib/iomgr/error.h', 'src/core/lib/iomgr/error_cfstream.h', 'src/core/lib/iomgr/error_internal.h', + 'src/core/lib/iomgr/ev_apple.h', 'src/core/lib/iomgr/ev_epoll1_linux.h', 'src/core/lib/iomgr/ev_epollex_linux.h', 'src/core/lib/iomgr/ev_poll_posix.h', diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec index f842a3ae677..014da4e5ac1 100644 --- a/gRPC-Core.podspec +++ b/gRPC-Core.podspec @@ -647,6 +647,8 @@ Pod::Spec.new do |s| 'src/core/lib/iomgr/error_cfstream.cc', 'src/core/lib/iomgr/error_cfstream.h', 'src/core/lib/iomgr/error_internal.h', + 'src/core/lib/iomgr/ev_apple.cc', + 'src/core/lib/iomgr/ev_apple.h', 'src/core/lib/iomgr/ev_epoll1_linux.cc', 'src/core/lib/iomgr/ev_epoll1_linux.h', 'src/core/lib/iomgr/ev_epollex_linux.cc', @@ -1240,6 +1242,7 @@ Pod::Spec.new do |s| 'src/core/lib/iomgr/error.h', 'src/core/lib/iomgr/error_cfstream.h', 'src/core/lib/iomgr/error_internal.h', + 'src/core/lib/iomgr/ev_apple.h', 'src/core/lib/iomgr/ev_epoll1_linux.h', 'src/core/lib/iomgr/ev_epollex_linux.h', 'src/core/lib/iomgr/ev_poll_posix.h', diff --git a/grpc.gemspec b/grpc.gemspec index cf0b389f50a..dc3c62ef4d6 100644 --- a/grpc.gemspec +++ b/grpc.gemspec @@ -569,6 +569,8 @@ Gem::Specification.new do |s| s.files += %w( src/core/lib/iomgr/error_cfstream.cc ) s.files += %w( src/core/lib/iomgr/error_cfstream.h ) s.files += %w( src/core/lib/iomgr/error_internal.h ) + s.files += %w( src/core/lib/iomgr/ev_apple.cc ) + s.files += %w( src/core/lib/iomgr/ev_apple.h ) s.files += %w( src/core/lib/iomgr/ev_epoll1_linux.cc ) s.files += %w( src/core/lib/iomgr/ev_epoll1_linux.h ) s.files += %w( src/core/lib/iomgr/ev_epollex_linux.cc ) diff --git a/grpc.gyp b/grpc.gyp index c32c0dca814..c6ea33db03b 100644 --- a/grpc.gyp +++ b/grpc.gyp @@ -634,6 +634,7 @@ 'src/core/lib/iomgr/endpoint_pair_windows.cc', 'src/core/lib/iomgr/error.cc', 'src/core/lib/iomgr/error_cfstream.cc', + 'src/core/lib/iomgr/ev_apple.cc', 'src/core/lib/iomgr/ev_epoll1_linux.cc', 'src/core/lib/iomgr/ev_epollex_linux.cc', 'src/core/lib/iomgr/ev_poll_posix.cc', @@ -1117,6 +1118,7 @@ 'src/core/lib/iomgr/endpoint_pair_windows.cc', 'src/core/lib/iomgr/error.cc', 'src/core/lib/iomgr/error_cfstream.cc', + 'src/core/lib/iomgr/ev_apple.cc', 'src/core/lib/iomgr/ev_epoll1_linux.cc', 'src/core/lib/iomgr/ev_epollex_linux.cc', 'src/core/lib/iomgr/ev_poll_posix.cc', diff --git a/package.xml b/package.xml index d9d5d1516d8..20f00c3109d 100644 --- a/package.xml +++ b/package.xml @@ -549,6 +549,8 @@ + + diff --git a/src/core/lib/iomgr/cfstream_handle.cc b/src/core/lib/iomgr/cfstream_handle.cc index 40fb3779651..7a78ccd8769 100644 --- a/src/core/lib/iomgr/cfstream_handle.cc +++ b/src/core/lib/iomgr/cfstream_handle.cc @@ -32,6 +32,7 @@ #include "src/core/lib/debug/trace.h" #include "src/core/lib/iomgr/closure.h" #include "src/core/lib/iomgr/error_cfstream.h" +#include "src/core/lib/iomgr/ev_apple.h" #include "src/core/lib/iomgr/exec_ctx.h" extern grpc_core::TraceFlag grpc_tcp_trace; @@ -147,8 +148,8 @@ CFStreamHandle::CFStreamHandle(CFReadStreamRef read_stream, kCFStreamEventOpenCompleted | kCFStreamEventCanAcceptBytes | kCFStreamEventErrorOccurred | kCFStreamEventEndEncountered, CFStreamHandle::WriteCallback, &ctx); - CFReadStreamSetDispatchQueue(read_stream, dispatch_queue_); - CFWriteStreamSetDispatchQueue(write_stream, dispatch_queue_); + grpc_apple_register_read_stream(read_stream, dispatch_queue_); + grpc_apple_register_write_stream(write_stream, dispatch_queue_); } CFStreamHandle::~CFStreamHandle() { diff --git a/src/core/lib/iomgr/ev_apple.cc b/src/core/lib/iomgr/ev_apple.cc new file mode 100644 index 00000000000..d1525828865 --- /dev/null +++ b/src/core/lib/iomgr/ev_apple.cc @@ -0,0 +1,356 @@ +/* + * + * Copyright 2020 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +/// Event engine based on Apple's CFRunLoop API family. If the CFRunLoop engine +/// is enabled (see iomgr_posix_cfstream.cc), a global thread is started to +/// handle and trigger all the CFStream events. The CFStream streams register +/// themselves with the run loop with functions grpc_apple_register_read_stream +/// and grpc_apple_register_read_stream. Pollsets are dummy and block on a +/// condition variable in pollset_work(). + +#include + +#include "src/core/lib/iomgr/port.h" + +#ifdef GRPC_APPLE_EV + +#include + +#include + +#include "src/core/lib/gprpp/thd.h" +#include "src/core/lib/iomgr/ev_apple.h" + +grpc_core::DebugOnlyTraceFlag grpc_apple_polling_trace(false, "apple_polling"); + +#ifndef NDEBUG +#define GRPC_POLLING_TRACE(format, ...) \ + if (GRPC_TRACE_FLAG_ENABLED(grpc_apple_polling_trace)) { \ + gpr_log(GPR_DEBUG, "(polling) " format, __VA_ARGS__); \ + } +#else +#define GRPC_POLLING_TRACE(...) +#endif // NDEBUG + +#define GRPC_POLLSET_KICK_BROADCAST ((grpc_pollset_worker*)1) + +struct GlobalRunLoopContext { + grpc_core::CondVar init_cv; + grpc_core::CondVar input_source_cv; + + grpc_core::Mutex mu; + + // Whether an input source registration is pending. Protected by mu. + bool input_source_registered = false; + + // The reference to the global run loop object. Protected by mu. + CFRunLoopRef run_loop; + + // Whether the pollset has been globally shut down. Protected by mu. + bool is_shutdown = false; +}; + +struct GrpcAppleWorker { + // The condition varible to kick the worker. Works with the pollset's lock + // (GrpcApplePollset.mu). + grpc_core::CondVar cv; + + // Whether the worker is kicked. Protected by the pollset's lock + // (GrpcApplePollset.mu). + bool kicked = false; +}; + +struct GrpcApplePollset { + grpc_core::Mutex mu; + + // Tracks the current workers in the pollset. Protected by mu. + std::list workers; + + // Whether the pollset is shut down. Protected by mu. + bool is_shutdown = false; + + // Closure to call when shutdown is done. Protected by mu. + grpc_closure* shutdown_closure; + + // Whether there's an outstanding kick that was not processed. Protected by + // mu. + bool kicked_without_poller = false; +}; + +static GlobalRunLoopContext* gGlobalRunLoopContext = nullptr; +static grpc_core::Thread* gGlobalRunLoopThread = nullptr; + +/// Register the stream with the dispatch queue. Callbacks of the stream will be +/// issued to the dispatch queue when a network event happens and will be +/// managed by Grand Central Dispatch. +static void grpc_apple_register_read_stream_queue( + CFReadStreamRef read_stream, dispatch_queue_t dispatch_queue) { + CFReadStreamSetDispatchQueue(read_stream, dispatch_queue); +} + +/// Register the stream with the dispatch queue. Callbacks of the stream will be +/// issued to the dispatch queue when a network event happens and will be +/// managed by Grand Central Dispatch. +static void grpc_apple_register_write_stream_queue( + CFWriteStreamRef write_stream, dispatch_queue_t dispatch_queue) { + CFWriteStreamSetDispatchQueue(write_stream, dispatch_queue); +} + +/// Register the stream with the global run loop. Callbacks of the stream will +/// be issued to the run loop when a network event happens and will be driven by +/// the global run loop thread gGlobalRunLoopThread. +static void grpc_apple_register_read_stream_run_loop( + CFReadStreamRef read_stream, dispatch_queue_t dispatch_queue) { + GRPC_POLLING_TRACE("Register read stream: %p", read_stream); + grpc_core::MutexLock lock(&gGlobalRunLoopContext->mu); + CFReadStreamScheduleWithRunLoop(read_stream, gGlobalRunLoopContext->run_loop, + kCFRunLoopDefaultMode); + gGlobalRunLoopContext->input_source_registered = true; + gGlobalRunLoopContext->input_source_cv.Signal(); +} + +/// Register the stream with the global run loop. Callbacks of the stream will +/// be issued to the run loop when a network event happens, and will be driven +/// by the global run loop thread gGlobalRunLoopThread. +static void grpc_apple_register_write_stream_run_loop( + CFWriteStreamRef write_stream, dispatch_queue_t dispatch_queue) { + GRPC_POLLING_TRACE("Register write stream: %p", write_stream); + grpc_core::MutexLock lock(&gGlobalRunLoopContext->mu); + CFWriteStreamScheduleWithRunLoop( + write_stream, gGlobalRunLoopContext->run_loop, kCFRunLoopDefaultMode); + gGlobalRunLoopContext->input_source_registered = true; + gGlobalRunLoopContext->input_source_cv.Signal(); +} + +/// The default implementation of stream registration is to register the stream +/// to a dispatch queue. However, if the CFRunLoop based pollset is enabled (by +/// macro and environment variable, see docs in iomgr_posix_cfstream.cc), the +/// CFStream streams are registered with the global run loop instead (see +/// pollset_global_init below). +static void (*grpc_apple_register_read_stream_impl)( + CFReadStreamRef, dispatch_queue_t) = grpc_apple_register_read_stream_queue; +static void (*grpc_apple_register_write_stream_impl)(CFWriteStreamRef, + dispatch_queue_t) = + grpc_apple_register_write_stream_queue; + +void grpc_apple_register_read_stream(CFReadStreamRef read_stream, + dispatch_queue_t dispatch_queue) { + grpc_apple_register_read_stream_impl(read_stream, dispatch_queue); +} + +void grpc_apple_register_write_stream(CFWriteStreamRef write_stream, + dispatch_queue_t dispatch_queue) { + grpc_apple_register_write_stream_impl(write_stream, dispatch_queue); +} + +/// Drive the run loop in a global singleton thread until the global run loop is +/// shutdown. +static void GlobalRunLoopFunc(void* arg) { + grpc_core::ReleasableMutexLock lock(&gGlobalRunLoopContext->mu); + gGlobalRunLoopContext->run_loop = CFRunLoopGetCurrent(); + gGlobalRunLoopContext->init_cv.Signal(); + + while (!gGlobalRunLoopContext->is_shutdown) { + // CFRunLoopRun() will return immediately if no stream is registered on it. + // So we wait on a conditional variable until a stream is registered; + // otherwise we'll be running a spinning loop. + while (!gGlobalRunLoopContext->input_source_registered) { + gGlobalRunLoopContext->input_source_cv.Wait(&gGlobalRunLoopContext->mu); + } + gGlobalRunLoopContext->input_source_registered = false; + lock.Unlock(); + CFRunLoopRun(); + lock.Lock(); + } + lock.Unlock(); +} + +// pollset implementation + +static void pollset_global_init(void) { + gGlobalRunLoopContext = new GlobalRunLoopContext; + + grpc_apple_register_read_stream_impl = + grpc_apple_register_read_stream_run_loop; + grpc_apple_register_write_stream_impl = + grpc_apple_register_write_stream_run_loop; + + grpc_core::MutexLock lock(&gGlobalRunLoopContext->mu); + gGlobalRunLoopThread = + new grpc_core::Thread("apple_ev", GlobalRunLoopFunc, nullptr); + gGlobalRunLoopThread->Start(); + while (gGlobalRunLoopContext->run_loop == NULL) + gGlobalRunLoopContext->init_cv.Wait(&gGlobalRunLoopContext->mu); +} + +static void pollset_global_shutdown(void) { + { + grpc_core::MutexLock lock(&gGlobalRunLoopContext->mu); + gGlobalRunLoopContext->is_shutdown = true; + CFRunLoopStop(gGlobalRunLoopContext->run_loop); + } + gGlobalRunLoopThread->Join(); + delete gGlobalRunLoopThread; + delete gGlobalRunLoopContext; +} + +/// The caller must acquire the lock GrpcApplePollset.mu before calling this +/// function. The lock may be temporarily released when waiting on the condition +/// variable but will be re-acquired before the function returns. +/// +/// The Apple pollset simply waits on a condition variable until it is kicked. +/// The network events are handled in the global run loop thread. Processing of +/// these events will eventually trigger the kick. +static grpc_error* pollset_work(grpc_pollset* pollset, + grpc_pollset_worker** worker, + grpc_millis deadline) { + GRPC_POLLING_TRACE("pollset work: %p, worker: %p, deadline: %" PRIu64, + pollset, worker, deadline); + GrpcApplePollset* apple_pollset = + reinterpret_cast(pollset); + GrpcAppleWorker actual_worker; + if (worker) { + *worker = reinterpret_cast(&actual_worker); + } + + if (apple_pollset->kicked_without_poller) { + // Process the outstanding kick and reset the flag. Do not block. + apple_pollset->kicked_without_poller = false; + } else { + // Block until kicked, timed out, or the pollset shuts down. + apple_pollset->workers.push_front(&actual_worker); + auto it = apple_pollset->workers.begin(); + + while (!actual_worker.kicked && !apple_pollset->is_shutdown) { + if (actual_worker.cv.Wait( + &apple_pollset->mu, + grpc_millis_to_timespec(deadline, GPR_CLOCK_REALTIME))) { + // timed out + break; + } + } + + apple_pollset->workers.erase(it); + + // If the pollset is shut down asynchronously and this is the last pending + // worker, the shutdown process is complete at this moment and the shutdown + // callback will be called. + if (apple_pollset->is_shutdown && apple_pollset->workers.empty()) { + grpc_core::ExecCtx::Run(DEBUG_LOCATION, apple_pollset->shutdown_closure, + GRPC_ERROR_NONE); + } + } + + return GRPC_ERROR_NONE; +} + +/// Kick a specific worker. The caller must acquire the lock GrpcApplePollset.mu +/// before calling this function. +static void kick_worker(GrpcAppleWorker* worker) { + worker->kicked = true; + worker->cv.Signal(); +} + +/// The caller must acquire the lock GrpcApplePollset.mu before calling this +/// function. The kick action simply signals the condition variable of the +/// worker. +static grpc_error* pollset_kick(grpc_pollset* pollset, + grpc_pollset_worker* specific_worker) { + GrpcApplePollset* apple_pollset = + reinterpret_cast(pollset); + + GRPC_POLLING_TRACE("pollset kick: %p, worker:%p", pollset, specific_worker); + + if (specific_worker == nullptr) { + if (apple_pollset->workers.empty()) { + apple_pollset->kicked_without_poller = true; + } else { + GrpcAppleWorker* actual_worker = apple_pollset->workers.front(); + kick_worker(actual_worker); + } + } else if (specific_worker == GRPC_POLLSET_KICK_BROADCAST) { + for (auto& actual_worker : apple_pollset->workers) { + kick_worker(actual_worker); + } + } else { + GrpcAppleWorker* actual_worker = + reinterpret_cast(specific_worker); + kick_worker(actual_worker); + } + + return GRPC_ERROR_NONE; +} + +static void pollset_init(grpc_pollset* pollset, gpr_mu** mu) { + GRPC_POLLING_TRACE("pollset init: %p", pollset); + GrpcApplePollset* apple_pollset = new (pollset) GrpcApplePollset(); + *mu = apple_pollset->mu.get(); +} + +/// The caller must acquire the lock GrpcApplePollset.mu before calling this +/// function. +static void pollset_shutdown(grpc_pollset* pollset, grpc_closure* closure) { + GRPC_POLLING_TRACE("pollset shutdown: %p", pollset); + + GrpcApplePollset* apple_pollset = + reinterpret_cast(pollset); + apple_pollset->is_shutdown = true; + pollset_kick(pollset, GRPC_POLLSET_KICK_BROADCAST); + + // If there is any worker blocked, shutdown will be done asynchronously. + if (apple_pollset->workers.empty()) { + grpc_core::ExecCtx::Run(DEBUG_LOCATION, closure, GRPC_ERROR_NONE); + } else { + apple_pollset->shutdown_closure = closure; + } +} + +static void pollset_destroy(grpc_pollset* pollset) { + GRPC_POLLING_TRACE("pollset destroy: %p", pollset); + GrpcApplePollset* apple_pollset = + reinterpret_cast(pollset); + apple_pollset->~GrpcApplePollset(); +} + +size_t pollset_size(void) { return sizeof(GrpcApplePollset); } + +grpc_pollset_vtable grpc_apple_pollset_vtable = { + pollset_global_init, pollset_global_shutdown, + pollset_init, pollset_shutdown, + pollset_destroy, pollset_work, + pollset_kick, pollset_size}; + +// pollset_set implementation + +grpc_pollset_set* pollset_set_create(void) { return nullptr; } +void pollset_set_destroy(grpc_pollset_set* pollset_set) {} +void pollset_set_add_pollset(grpc_pollset_set* pollset_set, + grpc_pollset* pollset) {} +void pollset_set_del_pollset(grpc_pollset_set* pollset_set, + grpc_pollset* pollset) {} +void pollset_set_add_pollset_set(grpc_pollset_set* bag, + grpc_pollset_set* item) {} +void pollset_set_del_pollset_set(grpc_pollset_set* bag, + grpc_pollset_set* item) {} + +grpc_pollset_set_vtable grpc_apple_pollset_set_vtable = { + pollset_set_create, pollset_set_destroy, + pollset_set_add_pollset, pollset_set_del_pollset, + pollset_set_add_pollset_set, pollset_set_del_pollset_set}; + +#endif diff --git a/src/core/lib/iomgr/ev_apple.h b/src/core/lib/iomgr/ev_apple.h new file mode 100644 index 00000000000..a05f91ce15f --- /dev/null +++ b/src/core/lib/iomgr/ev_apple.h @@ -0,0 +1,43 @@ +/* + * + * Copyright 2020 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPC_CORE_LIB_IOMGR_EV_APPLE_H +#define GRPC_CORE_LIB_IOMGR_EV_APPLE_H + +#include + +#ifdef GRPC_APPLE_EV + +#include + +#include "src/core/lib/iomgr/pollset.h" +#include "src/core/lib/iomgr/pollset_set.h" + +void grpc_apple_register_read_stream(CFReadStreamRef read_stream, + dispatch_queue_t dispatch_queue); + +void grpc_apple_register_write_stream(CFWriteStreamRef write_stream, + dispatch_queue_t dispatch_queue); + +extern grpc_pollset_vtable grpc_apple_pollset_vtable; + +extern grpc_pollset_set_vtable grpc_apple_pollset_set_vtable; + +#endif + +#endif diff --git a/src/core/lib/iomgr/iomgr_posix_cfstream.cc b/src/core/lib/iomgr/iomgr_posix_cfstream.cc index 72b2ae5eb00..24f9f4101b2 100644 --- a/src/core/lib/iomgr/iomgr_posix_cfstream.cc +++ b/src/core/lib/iomgr/iomgr_posix_cfstream.cc @@ -16,6 +16,20 @@ * */ +/// CFStream is build-enabled on iOS by default and disabled by default on other +/// platforms (see port_platform.h). To enable CFStream build on another +/// platform, the users need to define macro "GRPC_CFSTREAM=1" when building +/// gRPC. +/// +/// When CFStream is to be built (either by default on iOS or by macro on other +/// platforms), the users can disable CFStream with environment variable +/// "grpc_cfstream=0". This will let gRPC to fallback to use POSIX sockets. In +/// addition, the users may choose to use an alternative CFRunLoop based pollset +/// "ev_apple" by setting environment variable "grpc_cfstream_run_loop=1". This +/// pollset resolves a bug from Apple when CFStream streams dispatch events to +/// dispatch queues. The caveat of this pollset is that users may not be able to +/// run a gRPC server in the same process. + #include #include "src/core/lib/iomgr/port.h" @@ -23,6 +37,7 @@ #ifdef GRPC_CFSTREAM_IOMGR #include "src/core/lib/debug/trace.h" +#include "src/core/lib/iomgr/ev_apple.h" #include "src/core/lib/iomgr/ev_posix.h" #include "src/core/lib/iomgr/iomgr_internal.h" #include "src/core/lib/iomgr/iomgr_posix.h" @@ -33,6 +48,7 @@ #include "src/core/lib/iomgr/timer.h" static const char* grpc_cfstream_env_var = "grpc_cfstream"; +static const char* grpc_cfstream_run_loop_env_var = "GRPC_CFSTREAM_RUN_LOOP"; extern grpc_tcp_server_vtable grpc_posix_tcp_server_vtable; extern grpc_tcp_client_vtable grpc_posix_tcp_client_vtable; @@ -42,6 +58,33 @@ extern grpc_pollset_vtable grpc_posix_pollset_vtable; extern grpc_pollset_set_vtable grpc_posix_pollset_set_vtable; extern grpc_address_resolver_vtable grpc_posix_resolver_vtable; +static void apple_iomgr_platform_init(void) { grpc_pollset_global_init(); } + +static void apple_iomgr_platform_flush(void) {} + +static void apple_iomgr_platform_shutdown(void) { + grpc_pollset_global_shutdown(); +} + +static void apple_iomgr_platform_shutdown_background_closure(void) {} + +static bool apple_iomgr_platform_is_any_background_poller_thread(void) { + return false; +} + +static bool apple_iomgr_platform_add_closure_to_background_poller( + grpc_closure* closure, grpc_error* error) { + return false; +} + +static grpc_iomgr_platform_vtable apple_vtable = { + apple_iomgr_platform_init, + apple_iomgr_platform_flush, + apple_iomgr_platform_shutdown, + apple_iomgr_platform_shutdown_background_closure, + apple_iomgr_platform_is_any_background_poller_thread, + apple_iomgr_platform_add_closure_to_background_poller}; + static void iomgr_platform_init(void) { grpc_wakeup_fd_global_init(); grpc_event_engine_init(); @@ -76,32 +119,53 @@ static grpc_iomgr_platform_vtable vtable = { iomgr_platform_add_closure_to_background_poller}; void grpc_set_default_iomgr_platform() { - char* enable_cfstream = getenv(grpc_cfstream_env_var); - grpc_tcp_client_vtable* client_vtable = &grpc_posix_tcp_client_vtable; - // CFStream is enabled by default on iOS, and disabled by default on other - // platforms. Defaults can be overriden by setting the grpc_cfstream - // environment variable. -#if TARGET_OS_IPHONE - if (enable_cfstream == nullptr || enable_cfstream[0] == '1') { - client_vtable = &grpc_cfstream_client_vtable; + char* enable_cfstream_str = getenv(grpc_cfstream_env_var); + bool enable_cfstream = + enable_cfstream_str == nullptr || enable_cfstream_str[0] != '0'; + char* enable_cfstream_run_loop_str = getenv(grpc_cfstream_run_loop_env_var); + // CFStream run-loop is disabled by default. The user has to enable it + // explicitly with environment variable. + bool enable_cfstream_run_loop = enable_cfstream_run_loop_str != nullptr && + enable_cfstream_run_loop_str[0] == '1'; + if (!enable_cfstream) { + // Use POSIX sockets for both client and server + grpc_set_tcp_client_impl(&grpc_posix_tcp_client_vtable); + grpc_set_tcp_server_impl(&grpc_posix_tcp_server_vtable); + grpc_set_pollset_vtable(&grpc_posix_pollset_vtable); + grpc_set_pollset_set_vtable(&grpc_posix_pollset_set_vtable); + grpc_set_iomgr_platform_vtable(&vtable); + } else if (enable_cfstream && !enable_cfstream_run_loop) { + // Use CFStream with dispatch queue for client; use POSIX sockets for server + grpc_set_tcp_client_impl(&grpc_cfstream_client_vtable); + grpc_set_tcp_server_impl(&grpc_posix_tcp_server_vtable); + grpc_set_pollset_vtable(&grpc_posix_pollset_vtable); + grpc_set_pollset_set_vtable(&grpc_posix_pollset_set_vtable); + grpc_set_iomgr_platform_vtable(&vtable); + } else { + // Use CFStream with CFRunLoop for client; server not supported + grpc_set_tcp_client_impl(&grpc_cfstream_client_vtable); + grpc_set_pollset_vtable(&grpc_apple_pollset_vtable); + grpc_set_pollset_set_vtable(&grpc_apple_pollset_set_vtable); + grpc_set_iomgr_platform_vtable(&apple_vtable); } -#else - if (enable_cfstream != nullptr && enable_cfstream[0] == '1') { - client_vtable = &grpc_cfstream_client_vtable; - } -#endif - - grpc_set_tcp_client_impl(client_vtable); - grpc_set_tcp_server_impl(&grpc_posix_tcp_server_vtable); grpc_set_timer_impl(&grpc_generic_timer_vtable); - grpc_set_pollset_vtable(&grpc_posix_pollset_vtable); - grpc_set_pollset_set_vtable(&grpc_posix_pollset_set_vtable); grpc_set_resolver_impl(&grpc_posix_resolver_vtable); - grpc_set_iomgr_platform_vtable(&vtable); } bool grpc_iomgr_run_in_background() { - return grpc_event_engine_run_in_background(); + char* enable_cfstream_str = getenv(grpc_cfstream_env_var); + bool enable_cfstream = + enable_cfstream_str == nullptr || enable_cfstream_str[0] != '0'; + char* enable_cfstream_run_loop_str = getenv(grpc_cfstream_run_loop_env_var); + // CFStream run-loop is disabled by default. The user has to enable it + // explicitly with environment variable. + bool enable_cfstream_run_loop = enable_cfstream_run_loop_str != nullptr && + enable_cfstream_run_loop_str[0] == '1'; + if (enable_cfstream && enable_cfstream_run_loop) { + return false; + } else { + return grpc_event_engine_run_in_background(); + } } #endif /* GRPC_CFSTREAM_IOMGR */ diff --git a/src/core/lib/iomgr/pollset_set_custom.cc b/src/core/lib/iomgr/pollset_set_custom.cc index 099388f7c5b..2c1df608197 100644 --- a/src/core/lib/iomgr/pollset_set_custom.cc +++ b/src/core/lib/iomgr/pollset_set_custom.cc @@ -22,23 +22,23 @@ #include "src/core/lib/iomgr/pollset_set.h" -grpc_pollset_set* pollset_set_create(void) { +static grpc_pollset_set* pollset_set_create(void) { return (grpc_pollset_set*)((intptr_t)0xdeafbeef); } -void pollset_set_destroy(grpc_pollset_set* /*pollset_set*/) {} +static void pollset_set_destroy(grpc_pollset_set* /*pollset_set*/) {} -void pollset_set_add_pollset(grpc_pollset_set* /*pollset_set*/, - grpc_pollset* /*pollset*/) {} +static void pollset_set_add_pollset(grpc_pollset_set* /*pollset_set*/, + grpc_pollset* /*pollset*/) {} -void pollset_set_del_pollset(grpc_pollset_set* /*pollset_set*/, - grpc_pollset* /*pollset*/) {} +static void pollset_set_del_pollset(grpc_pollset_set* /*pollset_set*/, + grpc_pollset* /*pollset*/) {} -void pollset_set_add_pollset_set(grpc_pollset_set* /*bag*/, - grpc_pollset_set* /*item*/) {} +static void pollset_set_add_pollset_set(grpc_pollset_set* /*bag*/, + grpc_pollset_set* /*item*/) {} -void pollset_set_del_pollset_set(grpc_pollset_set* /*bag*/, - grpc_pollset_set* /*item*/) {} +static void pollset_set_del_pollset_set(grpc_pollset_set* /*bag*/, + grpc_pollset_set* /*item*/) {} static grpc_pollset_set_vtable vtable = { pollset_set_create, pollset_set_destroy, diff --git a/src/core/lib/iomgr/port.h b/src/core/lib/iomgr/port.h index 1d2e9506451..211423e643d 100644 --- a/src/core/lib/iomgr/port.h +++ b/src/core/lib/iomgr/port.h @@ -129,6 +129,7 @@ #define GRPC_CFSTREAM_IOMGR 1 #define GRPC_CFSTREAM_CLIENT 1 #define GRPC_CFSTREAM_ENDPOINT 1 +#define GRPC_APPLE_EV 1 #define GRPC_POSIX_SOCKET_ARES_EV_DRIVER 1 #define GRPC_POSIX_SOCKET_EV 1 #define GRPC_POSIX_SOCKET_EV_EPOLL1 1 diff --git a/src/objective-c/tests/Tests.xcodeproj/xcshareddata/xcschemes/InteropTests.xcscheme b/src/objective-c/tests/Tests.xcodeproj/xcshareddata/xcschemes/InteropTests.xcscheme index cbde360a338..d4557937965 100644 --- a/src/objective-c/tests/Tests.xcodeproj/xcshareddata/xcschemes/InteropTests.xcscheme +++ b/src/objective-c/tests/Tests.xcodeproj/xcshareddata/xcschemes/InteropTests.xcscheme @@ -66,8 +66,13 @@ ReferencedContainer = "container:Tests.xcodeproj"> - - + + + + - - + + + + - - + + + + - - + + + + - - + + + + Date: Wed, 15 Apr 2020 18:13:04 +0000 Subject: [PATCH 502/758] address review comments --- examples/BUILD | 32 ------------ examples/python/data_transmission/BUILD | 49 +++++++++++++++++++ .../python/data_transmission/alts_client.py | 2 - .../python/data_transmission/alts_server.py | 2 - .../grpc/_cython/_cygrpc/credentials.pyx.pxi | 4 +- src/python/grpcio_tests/commands.py | 1 - .../grpcio_tests/tests/interop/client.py | 4 +- .../tests/unit/_alts_credentials_test.py | 11 +++-- 8 files changed, 59 insertions(+), 46 deletions(-) create mode 100644 examples/python/data_transmission/BUILD diff --git a/examples/BUILD b/examples/BUILD index 057940abd3a..5dbde0febe4 100644 --- a/examples/BUILD +++ b/examples/BUILD @@ -245,35 +245,3 @@ proto_library( name = "route_guide_proto", srcs = ["protos/route_guide.proto"], ) - -py_binary( - name = "data_transmission_server", - python_version = "PY3", - srcs_version = "PY2AND3", - main = "alts_server.py", - srcs = [ - "python/data_transmission/alts_server.py", - "python/data_transmission/demo_pb2.py", - "python/data_transmission/demo_pb2_grpc.py", - "python/data_transmission/server.py", - ], - deps = [ - "//src/python/grpcio/grpc:grpcio", - ], -) - -py_binary( - name = "data_transmission_client", - python_version = "PY3", - srcs_version = "PY2AND3", - main = "alts_client.py", - srcs = [ - "python/data_transmission/alts_client.py", - "python/data_transmission/client.py", - "python/data_transmission/demo_pb2.py", - "python/data_transmission/demo_pb2_grpc.py", - ], - deps = [ - "//src/python/grpcio/grpc:grpcio", - ], -) diff --git a/examples/python/data_transmission/BUILD b/examples/python/data_transmission/BUILD new file mode 100644 index 00000000000..528cd325a1b --- /dev/null +++ b/examples/python/data_transmission/BUILD @@ -0,0 +1,49 @@ +# Copyright 2017 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +licenses(["notice"]) # 3-clause BSD + +load("@grpc_python_dependencies//:requirements.bzl", "requirement") + +py_binary( + name = "alts_server", + python_version = "PY3", + srcs_version = "PY2AND3", + main = "alts_server.py", + srcs = [ + "alts_server.py", + "demo_pb2.py", + "demo_pb2_grpc.py", + "server.py", + ], + deps = [ + "//src/python/grpcio/grpc:grpcio", + ], +) + +py_binary( + name = "alts_client", + python_version = "PY3", + srcs_version = "PY2AND3", + main = "alts_client.py", + srcs = [ + "alts_client.py", + "client.py", + "demo_pb2.py", + "demo_pb2_grpc.py", + ], + deps = [ + "//src/python/grpcio/grpc:grpcio", + ], +) diff --git a/examples/python/data_transmission/alts_client.py b/examples/python/data_transmission/alts_client.py index a1dc8ec558e..e3ddb281930 100644 --- a/examples/python/data_transmission/alts_client.py +++ b/examples/python/data_transmission/alts_client.py @@ -13,12 +13,10 @@ # limitations under the License. """The example of using ALTS credentials to setup gRPC client.""" -import time import grpc import client import demo_pb2_grpc -import demo_pb2 SERVER_ADDRESS = "localhost:23333" diff --git a/examples/python/data_transmission/alts_server.py b/examples/python/data_transmission/alts_server.py index 29a8417152e..e91a1545377 100644 --- a/examples/python/data_transmission/alts_server.py +++ b/examples/python/data_transmission/alts_server.py @@ -13,12 +13,10 @@ # limitations under the License. """The example of using ALTS credentials to setup gRPC server in python.""" -from threading import Thread from concurrent import futures import grpc import demo_pb2_grpc -import demo_pb2 import server SERVER_ADDRESS = 'localhost:23333' diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi index e7ed15cd16b..d3d0f758b16 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi @@ -355,7 +355,7 @@ def server_credentials_local(grpc_local_connect_type local_connect_type): cdef class ALTSChannelCredentials(ChannelCredentials): - def __cinit__(self, service_accounts): + def __cinit__(self, list service_accounts): self.c_options = grpc_alts_credentials_client_options_create() for account in service_accounts: grpc_alts_credentials_client_options_add_target_service_account(self.c_options, account) @@ -368,7 +368,7 @@ cdef class ALTSChannelCredentials(ChannelCredentials): return grpc_alts_credentials_create(self.c_options) -def channel_credentials_alts(service_accounts): +def channel_credentials_alts(list service_accounts): return ALTSChannelCredentials(service_accounts) diff --git a/src/python/grpcio_tests/commands.py b/src/python/grpcio_tests/commands.py index 4a7af822b69..f7cd7c6b8a1 100644 --- a/src/python/grpcio_tests/commands.py +++ b/src/python/grpcio_tests/commands.py @@ -220,7 +220,6 @@ class TestGevent(setuptools.Command): 'unit._cython._channel_test.ChannelTest.test_negative_deadline_connectivity', # TODO(https://github.com/grpc/grpc/issues/15411) enable this test 'unit._local_credentials_test.LocalCredentialsTest', - 'unit._alts_credentials_test.ALTSCredentialsTest', 'testing._time_test.StrictRealTimeTest', ) BANNED_WINDOWS_TESTS = ( diff --git a/src/python/grpcio_tests/tests/interop/client.py b/src/python/grpcio_tests/tests/interop/client.py index 03f6113a88c..04b82c0b401 100644 --- a/src/python/grpcio_tests/tests/interop/client.py +++ b/src/python/grpcio_tests/tests/interop/client.py @@ -106,8 +106,8 @@ def get_secure_channel_parameters(args): 'grpc.ssl_target_name_override', args.server_host_override, ),) - else args.use_alts: - channel_credentials = grpc.alts_channel_credentials(['svc_account1@gmail.com']) + elif args.use_alts: + channel_credentials = grpc.alts_channel_credentials() return channel_credentials, channel_opts diff --git a/src/python/grpcio_tests/tests/unit/_alts_credentials_test.py b/src/python/grpcio_tests/tests/unit/_alts_credentials_test.py index a6809c02a1a..07a3c849c8b 100644 --- a/src/python/grpcio_tests/tests/unit/_alts_credentials_test.py +++ b/src/python/grpcio_tests/tests/unit/_alts_credentials_test.py @@ -19,6 +19,9 @@ from concurrent.futures import ThreadPoolExecutor import grpc +REQUEST = b'abc' + + class _GenericHandler(grpc.GenericRpcHandler): def service(self, handler_call_details): @@ -33,11 +36,9 @@ class ALTSCredentialsTest(unittest.TestCase): server.add_generic_rpc_handlers((_GenericHandler(),)) return server - @unittest.skipIf(os.name == 'nt', - 'TODO(https://github.com/grpc/grpc/issues/20078)') def test_alts(self): server_addr = 'localhost:{}' - channel_creds = grpc.alts_channel_credentials(['svcacct@server.com']) + channel_creds = grpc.alts_channel_credentials([]) server_creds = grpc.alts_server_credentials() server = self._create_server() @@ -46,8 +47,8 @@ class ALTSCredentialsTest(unittest.TestCase): with grpc.secure_channel(server_addr.format(port), channel_creds) as channel: self.assertEqual( - b'abc', - channel.unary_unary('/test/method')(b'abc', + REQUEST, + channel.unary_unary('/test/method')(REQUEST, wait_for_ready=True)) server.stop(None) From 17d75dde698bde5e505ac23e5a69d227b030ce8c Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Wed, 15 Apr 2020 12:45:29 -0700 Subject: [PATCH 503/758] Simplify logic around send message operation --- src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi index e9a69513523..abd1543572f 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi @@ -265,17 +265,18 @@ async def _finish_handler_with_unary_response(RPCState rpc_state, # Serializes the response message cdef bytes response_raw - cdef SendMessageOperation send_message_op if rpc_state.status_code == StatusCode.ok: response_raw = serialize( response_serializer, response_message, ) - send_message_op = SendMessageOperation(response_raw, rpc_state.get_write_flag()) + else: + response_raw = b'' # Assembles the batch operations cdef tuple finish_ops finish_ops = ( + SendMessageOperation(response_raw, rpc_state.get_write_flag()), SendStatusFromServerOperation( rpc_state.trailing_metadata, rpc_state.status_code, @@ -283,8 +284,6 @@ async def _finish_handler_with_unary_response(RPCState rpc_state, _EMPTY_FLAGS, ), ) - if rpc_state.status_code == StatusCode.ok: - finish_ops += (send_message_op,) if not rpc_state.metadata_sent: finish_ops = prepend_send_initial_metadata_op( finish_ops, From 71aef940c33b8751a6847da882c0e08b4d7c7013 Mon Sep 17 00:00:00 2001 From: Donna Dionne Date: Wed, 15 Apr 2020 13:09:03 -0700 Subject: [PATCH 504/758] Code review comments: added invalid config tests and restructured testing code. --- .../lb_policy/xds/xds_routing.cc | 3 + .../ext/filters/client_channel/xds/xds_api.cc | 19 + test/cpp/end2end/test_service_impl.cc | 30 +- test/cpp/end2end/test_service_impl.h | 48 +-- test/cpp/end2end/xds_end2end_test.cc | 337 +++++++++++------- 5 files changed, 274 insertions(+), 163 deletions(-) diff --git a/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc b/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc index 473870eacac..34aa788ad89 100644 --- a/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc +++ b/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc @@ -215,6 +215,9 @@ class XdsRoutingLb : public LoadBalancingPolicy { XdsRoutingLb::PickResult XdsRoutingLb::RoutePicker::Pick(PickArgs args) { absl::string_view path; + // TODO(roth): Using const auto& here trigger a warning in a macos or windows + // build: + //*(args.initial_metadata) is returning values not references. for (const auto p : *(args.initial_metadata)) { if (p.first == ":path") { path = p.second; diff --git a/src/core/ext/filters/client_channel/xds/xds_api.cc b/src/core/ext/filters/client_channel/xds/xds_api.cc index eba5e25e6bf..932ad12b626 100644 --- a/src/core/ext/filters/client_channel/xds/xds_api.cc +++ b/src/core/ext/filters/client_channel/xds/xds_api.cc @@ -1024,11 +1024,20 @@ grpc_error* RouteConfigParse( if (envoy_api_v2_route_RouteMatch_has_prefix(match)) { upb_strview prefix = envoy_api_v2_route_RouteMatch_prefix(match); if (prefix.size > 0) { + if (prefix.data[0] != '/') { + return GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "Prefix is not starting with a /"); + } std::vector prefix_elements = absl::StrSplit( absl::string_view(prefix.data, prefix.size).substr(1), '/'); if (prefix_elements.size() != 2) { return GRPC_ERROR_CREATE_FROM_STATIC_STRING( "Prefix not in the required format of /service/"); + } else if (!prefix_elements[1].empty()) { + return GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "Prefix is not ending with a /"); + } else if (prefix_elements[0].empty()) { + return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Prefix cannot be empty"); } rds_route.service = std::string(prefix_elements[0]); } @@ -1038,11 +1047,21 @@ grpc_error* RouteConfigParse( return GRPC_ERROR_CREATE_FROM_STATIC_STRING( "Path if set cannot be empty"); } + if (path.data[0] != '/') { + return GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "Path is not starting with a /"); + } std::vector path_elements = absl::StrSplit( absl::string_view(path.data, path.size).substr(1), '/'); if (path_elements.size() != 2) { return GRPC_ERROR_CREATE_FROM_STATIC_STRING( "Path not in the required format of /service/method"); + } else if (path_elements[0].empty()) { + return GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "Path service name cannot be empty"); + } else if (path_elements[1].empty()) { + return GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "Path method name cannot be empty"); } rds_route.service = std::string(path_elements[0]); rds_route.method = std::string(path_elements[1]); diff --git a/test/cpp/end2end/test_service_impl.cc b/test/cpp/end2end/test_service_impl.cc index 6517c5d6cc1..98f3cf44bec 100644 --- a/test/cpp/end2end/test_service_impl.cc +++ b/test/cpp/end2end/test_service_impl.cc @@ -132,7 +132,7 @@ experimental::ServerUnaryReactor* CallbackTestServiceImpl::Echo( error.error_message(), error.binary_error_details())); return; } - int server_try_cancel = GetIntValueFromMetadata( + int server_try_cancel = internal::GetIntValueFromMetadata( kServerTryCancelRequest, ctx_->client_metadata(), DO_NOT_CANCEL); if (server_try_cancel != DO_NOT_CANCEL) { // Since this is a unary RPC, by the time this server handler is called, @@ -147,7 +147,7 @@ experimental::ServerUnaryReactor* CallbackTestServiceImpl::Echo( } gpr_log(GPR_DEBUG, "Request message was %s", req_->message().c_str()); resp_->set_message(req_->message()); - MaybeEchoDeadline(ctx_, req_, resp_); + internal::MaybeEchoDeadline(ctx_, req_, resp_); if (service_->host_) { resp_->mutable_param()->set_host(*service_->host_); } @@ -201,9 +201,9 @@ experimental::ServerUnaryReactor* CallbackTestServiceImpl::Echo( if (req_->has_param() && (req_->param().expected_client_identity().length() > 0 || req_->param().check_auth_context())) { - CheckServerAuthContext(ctx_, - req_->param().expected_transport_security_type(), - req_->param().expected_client_identity()); + internal::CheckServerAuthContext( + ctx_, req_->param().expected_transport_security_type(), + req_->param().expected_client_identity()); } if (req_->has_param() && req_->param().response_message_length() > 0) { resp_->set_message( @@ -247,9 +247,9 @@ CallbackTestServiceImpl::CheckClientInitialMetadata( class Reactor : public ::grpc::experimental::ServerUnaryReactor { public: explicit Reactor(experimental::CallbackServerContext* ctx) { - EXPECT_EQ(MetadataMatchCount(ctx->client_metadata(), - kCheckClientInitialMetadataKey, - kCheckClientInitialMetadataVal), + EXPECT_EQ(internal::MetadataMatchCount(ctx->client_metadata(), + kCheckClientInitialMetadataKey, + kCheckClientInitialMetadataVal), 1); EXPECT_EQ(ctx->client_metadata().count(kCheckClientInitialMetadataKey), 1u); @@ -272,7 +272,7 @@ CallbackTestServiceImpl::RequestStream( // is cancelled while the server is reading messages from the client // CANCEL_AFTER_PROCESSING: The RPC is cancelled after the server reads // all the messages from the client - int server_try_cancel = GetIntValueFromMetadata( + int server_try_cancel = internal::GetIntValueFromMetadata( kServerTryCancelRequest, context->client_metadata(), DO_NOT_CANCEL); if (server_try_cancel == CANCEL_BEFORE_PROCESSING) { ServerTryCancelNonblocking(context); @@ -358,7 +358,7 @@ CallbackTestServiceImpl::ResponseStream( // is cancelled while the server is reading messages from the client // CANCEL_AFTER_PROCESSING: The RPC is cancelled after the server reads // all the messages from the client - int server_try_cancel = GetIntValueFromMetadata( + int server_try_cancel = internal::GetIntValueFromMetadata( kServerTryCancelRequest, context->client_metadata(), DO_NOT_CANCEL); if (server_try_cancel == CANCEL_BEFORE_PROCESSING) { ServerTryCancelNonblocking(context); @@ -370,9 +370,9 @@ CallbackTestServiceImpl::ResponseStream( Reactor(experimental::CallbackServerContext* ctx, const EchoRequest* request, int server_try_cancel) : ctx_(ctx), request_(request), server_try_cancel_(server_try_cancel) { - server_coalescing_api_ = GetIntValueFromMetadata( + server_coalescing_api_ = internal::GetIntValueFromMetadata( kServerUseCoalescingApi, ctx->client_metadata(), 0); - server_responses_to_send_ = GetIntValueFromMetadata( + server_responses_to_send_ = internal::GetIntValueFromMetadata( kServerResponseStreamsToSend, ctx->client_metadata(), kServerDefaultResponseStreamsToSend); if (server_try_cancel_ == CANCEL_DURING_PROCESSING) { @@ -457,10 +457,10 @@ CallbackTestServiceImpl::BidiStream( // is cancelled while the server is reading messages from the client // CANCEL_AFTER_PROCESSING: The RPC is cancelled after the server reads // all the messages from the client - server_try_cancel_ = GetIntValueFromMetadata( + server_try_cancel_ = internal::GetIntValueFromMetadata( kServerTryCancelRequest, ctx->client_metadata(), DO_NOT_CANCEL); - server_write_last_ = GetIntValueFromMetadata(kServerFinishAfterNReads, - ctx->client_metadata(), 0); + server_write_last_ = internal::GetIntValueFromMetadata( + kServerFinishAfterNReads, ctx->client_metadata(), 0); if (server_try_cancel_ == CANCEL_BEFORE_PROCESSING) { ServerTryCancelNonblocking(ctx); } else { diff --git a/test/cpp/end2end/test_service_impl.h b/test/cpp/end2end/test_service_impl.h index ed42b1401bf..3210d5ec25f 100644 --- a/test/cpp/end2end/test_service_impl.h +++ b/test/cpp/end2end/test_service_impl.h @@ -57,7 +57,7 @@ typedef enum { CANCEL_AFTER_PROCESSING } ServerTryCancelRequestPhase; -namespace { +namespace internal { // When echo_deadline is requested, deadline seen in the ServerContext is set in // the response in seconds. void MaybeEchoDeadline(experimental::ServerContextBase* context, @@ -137,7 +137,7 @@ void ServerTryCancel(ServerContext* context) { gpr_time_from_micros(1000, GPR_TIMESPAN))); } } -} // namespace +} // namespace internal class TestServiceSignaller { public: @@ -200,19 +200,19 @@ class TestMultipleServiceImpl : public RpcService { return Status(static_cast(error.code()), error.error_message(), error.binary_error_details()); } - int server_try_cancel = GetIntValueFromMetadata( + int server_try_cancel = internal::GetIntValueFromMetadata( kServerTryCancelRequest, context->client_metadata(), DO_NOT_CANCEL); if (server_try_cancel > DO_NOT_CANCEL) { // Since this is a unary RPC, by the time this server handler is called, // the 'request' message is already read from the client. So the scenarios // in server_try_cancel don't make much sense. Just cancel the RPC as long // as server_try_cancel is not DO_NOT_CANCEL - ServerTryCancel(context); + internal::ServerTryCancel(context); return Status::CANCELLED; } response->set_message(request->message()); - MaybeEchoDeadline(context, request, response); + internal::MaybeEchoDeadline(context, request, response); if (host_) { response->mutable_param()->set_host(*host_); } @@ -269,7 +269,7 @@ class TestMultipleServiceImpl : public RpcService { if (request->has_param() && (request->param().expected_client_identity().length() > 0 || request->param().check_auth_context())) { - CheckServerAuthContext( + internal::CheckServerAuthContext( context, request->param().expected_transport_security_type(), request->param().expected_client_identity()); } @@ -297,9 +297,9 @@ class TestMultipleServiceImpl : public RpcService { Status CheckClientInitialMetadata(ServerContext* context, const SimpleRequest* /*request*/, SimpleResponse* /*response*/) { - EXPECT_EQ(MetadataMatchCount(context->client_metadata(), - kCheckClientInitialMetadataKey, - kCheckClientInitialMetadataVal), + EXPECT_EQ(internal::MetadataMatchCount(context->client_metadata(), + kCheckClientInitialMetadataKey, + kCheckClientInitialMetadataVal), 1); EXPECT_EQ(1u, context->client_metadata().count(kCheckClientInitialMetadataKey)); @@ -319,21 +319,21 @@ class TestMultipleServiceImpl : public RpcService { // reading messages from the client // CANCEL_AFTER_PROCESSING: The RPC is cancelled after the server reads // all the messages from the client - int server_try_cancel = GetIntValueFromMetadata( + int server_try_cancel = internal::GetIntValueFromMetadata( kServerTryCancelRequest, context->client_metadata(), DO_NOT_CANCEL); EchoRequest request; response->set_message(""); if (server_try_cancel == CANCEL_BEFORE_PROCESSING) { - ServerTryCancel(context); + internal::ServerTryCancel(context); return Status::CANCELLED; } std::thread* server_try_cancel_thd = nullptr; if (server_try_cancel == CANCEL_DURING_PROCESSING) { server_try_cancel_thd = - new std::thread([context] { ServerTryCancel(context); }); + new std::thread([context] { internal::ServerTryCancel(context); }); } int num_msgs_read = 0; @@ -349,7 +349,7 @@ class TestMultipleServiceImpl : public RpcService { } if (server_try_cancel == CANCEL_AFTER_PROCESSING) { - ServerTryCancel(context); + internal::ServerTryCancel(context); return Status::CANCELLED; } @@ -368,18 +368,18 @@ class TestMultipleServiceImpl : public RpcService { // writing messages to the client // CANCEL_AFTER_PROCESSING: The RPC is cancelled after the server writes // all the messages to the client - int server_try_cancel = GetIntValueFromMetadata( + int server_try_cancel = internal::GetIntValueFromMetadata( kServerTryCancelRequest, context->client_metadata(), DO_NOT_CANCEL); - int server_coalescing_api = GetIntValueFromMetadata( + int server_coalescing_api = internal::GetIntValueFromMetadata( kServerUseCoalescingApi, context->client_metadata(), 0); - int server_responses_to_send = GetIntValueFromMetadata( + int server_responses_to_send = internal::GetIntValueFromMetadata( kServerResponseStreamsToSend, context->client_metadata(), kServerDefaultResponseStreamsToSend); if (server_try_cancel == CANCEL_BEFORE_PROCESSING) { - ServerTryCancel(context); + internal::ServerTryCancel(context); return Status::CANCELLED; } @@ -387,7 +387,7 @@ class TestMultipleServiceImpl : public RpcService { std::thread* server_try_cancel_thd = nullptr; if (server_try_cancel == CANCEL_DURING_PROCESSING) { server_try_cancel_thd = - new std::thread([context] { ServerTryCancel(context); }); + new std::thread([context] { internal::ServerTryCancel(context); }); } for (int i = 0; i < server_responses_to_send; i++) { @@ -406,7 +406,7 @@ class TestMultipleServiceImpl : public RpcService { } if (server_try_cancel == CANCEL_AFTER_PROCESSING) { - ServerTryCancel(context); + internal::ServerTryCancel(context); return Status::CANCELLED; } @@ -423,26 +423,26 @@ class TestMultipleServiceImpl : public RpcService { // reading/writing messages from/to the client // CANCEL_AFTER_PROCESSING: The RPC is cancelled after the server // reads/writes all messages from/to the client - int server_try_cancel = GetIntValueFromMetadata( + int server_try_cancel = internal::GetIntValueFromMetadata( kServerTryCancelRequest, context->client_metadata(), DO_NOT_CANCEL); EchoRequest request; EchoResponse response; if (server_try_cancel == CANCEL_BEFORE_PROCESSING) { - ServerTryCancel(context); + internal::ServerTryCancel(context); return Status::CANCELLED; } std::thread* server_try_cancel_thd = nullptr; if (server_try_cancel == CANCEL_DURING_PROCESSING) { server_try_cancel_thd = - new std::thread([context] { ServerTryCancel(context); }); + new std::thread([context] { internal::ServerTryCancel(context); }); } // kServerFinishAfterNReads suggests after how many reads, the server should // write the last message and send status (coalesced using WriteLast) - int server_write_last = GetIntValueFromMetadata( + int server_write_last = internal::GetIntValueFromMetadata( kServerFinishAfterNReads, context->client_metadata(), 0); int read_counts = 0; @@ -464,7 +464,7 @@ class TestMultipleServiceImpl : public RpcService { } if (server_try_cancel == CANCEL_AFTER_PROCESSING) { - ServerTryCancel(context); + internal::ServerTryCancel(context); return Status::CANCELLED; } diff --git a/test/cpp/end2end/xds_end2end_test.cc b/test/cpp/end2end/xds_end2end_test.cc index f60ece08866..6d957a77006 100644 --- a/test/cpp/end2end/xds_end2end_test.cc +++ b/test/cpp/end2end/xds_end2end_test.cc @@ -1359,121 +1359,103 @@ class XdsEnd2endTest : public ::testing::TestWithParam { return backend_ports; } - enum RpcServiceMethod { - TEST_ECHO, - TEST_ECHO1, - TEST_ECHO2, - TEST1_ECHO, - TEST1_ECHO1, - TEST1_ECHO2, - TEST2_ECHO, - TEST2_ECHO1, - TEST2_ECHO2, + enum RpcService { + SERVICE_ECHO, + SERVICE_ECHO1, + SERVICE_ECHO2, + }; + + enum RpcMethod { + METHOD_ECHO, + METHOD_ECHO1, + METHOD_ECHO2, }; struct RpcOptions { - RpcServiceMethod service_method = TEST_ECHO; - EchoResponse* response = nullptr; + RpcService service = SERVICE_ECHO; + RpcMethod method = METHOD_ECHO; int timeout_ms = 1000; bool wait_for_ready = false; bool server_fail = false; - int times = 1; + + RpcOptions() {} + + RpcOptions& set_rpc_service(RpcService rpc_service) { + service = rpc_service; + return *this; + } + + RpcOptions& set_rpc_method(RpcMethod rpc_method) { + method = rpc_method; + return *this; + } + + RpcOptions& set_timeout_ms(int rpc_timeout_ms) { + timeout_ms = rpc_timeout_ms; + return *this; + } + + RpcOptions& set_wait_for_ready(bool rpc_wait_for_ready) { + wait_for_ready = rpc_wait_for_ready; + return *this; + } + + RpcOptions& set_server_fail(bool rpc_server_fail) { + server_fail = rpc_server_fail; + return *this; + } }; // TODO@donnadionne: Will replace SendRpc in all tests. - Status SendRpcNew(const RpcOptions& rpc_options, - EchoResponse* response = nullptr) { - const bool local_response = (response == nullptr); - if (local_response) response = new EchoResponse; - EchoRequest request; - request.set_message(kRequestMessage_); - if (rpc_options.server_fail) { - request.mutable_param()->mutable_expected_error()->set_code( - GRPC_STATUS_FAILED_PRECONDITION); - } + template + Status SendRpcMethod(Stub* stub, const RpcOptions& rpc_options, + EchoRequest& request, EchoResponse* response) { ClientContext context; context.set_deadline( grpc_timeout_milliseconds_to_deadline(rpc_options.timeout_ms)); if (rpc_options.wait_for_ready) context.set_wait_for_ready(true); - Status status; - switch (rpc_options.service_method) { - case TEST_ECHO: - status = stub_->Echo(&context, request, response); - break; - case TEST_ECHO1: - status = stub_->Echo1(&context, request, response); - break; - case TEST_ECHO2: - status = stub_->Echo2(&context, request, response); - break; - case TEST1_ECHO: - status = stub1_->Echo(&context, request, response); - break; - case TEST1_ECHO1: - status = stub1_->Echo1(&context, request, response); - break; - case TEST1_ECHO2: - status = stub1_->Echo2(&context, request, response); - break; - case TEST2_ECHO: - status = stub2_->Echo(&context, request, response); - break; - case TEST2_ECHO1: - status = stub2_->Echo1(&context, request, response); - break; - case TEST2_ECHO2: - status = stub2_->Echo2(&context, request, response); - break; + switch (rpc_options.method) { + case METHOD_ECHO: + return (*stub)->Echo(&context, request, response); + case METHOD_ECHO1: + return (*stub)->Echo1(&context, request, response); + case METHOD_ECHO2: + return (*stub)->Echo2(&context, request, response); } - if (local_response) delete response; - return status; } - // TODO@donnadionne: Will replace ChedkRpcSendOk in all tests. - void CheckRpcSendOkNew(const RpcOptions& rpc_options) { - for (size_t i = 0; i < rpc_options.times; ++i) { - EchoResponse response; - const Status status = SendRpcNew(rpc_options, &response); - EXPECT_TRUE(status.ok()) << "code=" << status.error_code() - << " message=" << status.error_message(); - EXPECT_EQ(response.message(), kRequestMessage_); - } - } - - Status SendRpc(const string& method_name = "Echo", - EchoResponse* response = nullptr, int timeout_ms = 1000, - bool wait_for_ready = false, bool server_fail = false) { + Status SendRpc(const RpcOptions& rpc_options = RpcOptions(), + EchoResponse* response = nullptr) { const bool local_response = (response == nullptr); if (local_response) response = new EchoResponse; EchoRequest request; request.set_message(kRequestMessage_); - if (server_fail) { + if (rpc_options.server_fail) { request.mutable_param()->mutable_expected_error()->set_code( GRPC_STATUS_FAILED_PRECONDITION); } - ClientContext context; - context.set_deadline(grpc_timeout_milliseconds_to_deadline(timeout_ms)); - if (wait_for_ready) context.set_wait_for_ready(true); Status status; - if (method_name == "Echo") { - status = stub_->Echo(&context, request, response); - } else if (method_name == "Echo1") { - status = stub1_->Echo1(&context, request, response); - } else if (method_name == "Echo2") { - status = stub2_->Echo2(&context, request, response); + switch (rpc_options.service) { + case SERVICE_ECHO: + status = SendRpcMethod(&stub_, rpc_options, request, response); + break; + case SERVICE_ECHO1: + status = SendRpcMethod(&stub1_, rpc_options, request, response); + break; + case SERVICE_ECHO2: + status = SendRpcMethod(&stub2_, rpc_options, request, response); + break; } if (local_response) delete response; return status; } + // TODO@donnadionne: Will replace ChedkRpcSendOk in all tests. void CheckRpcSendOk(const size_t times = 1, - const string& method_name = "Echo", - const int timeout_ms = 1000, - bool wait_for_ready = false) { + const RpcOptions& rpc_options = RpcOptions()) { for (size_t i = 0; i < times; ++i) { EchoResponse response; - const Status status = - SendRpc(method_name, &response, timeout_ms, wait_for_ready); + const Status status = SendRpc(rpc_options, &response); EXPECT_TRUE(status.ok()) << "code=" << status.error_code() << " message=" << status.error_message(); EXPECT_EQ(response.message(), kRequestMessage_); @@ -1482,7 +1464,7 @@ class XdsEnd2endTest : public ::testing::TestWithParam { void CheckRpcSendFailure(const size_t times = 1, bool server_fail = false) { for (size_t i = 0; i < times; ++i) { - const Status status = SendRpc("Echo", nullptr, 1000, false, server_fail); + const Status status = SendRpc(RpcOptions().set_server_fail(server_fail)); EXPECT_FALSE(status.ok()); } } @@ -1778,7 +1760,8 @@ TEST_P(BasicTest, InitiallyEmptyServerlist) { kDefaultResourceName)); const auto t0 = system_clock::now(); // Client will block: LB will initially send empty serverlist. - CheckRpcSendOk(1, "Echo", kCallDeadlineMs, true /* wait_for_ready */); + CheckRpcSendOk( + 1, RpcOptions().set_timeout_ms(kCallDeadlineMs).set_wait_for_ready(true)); const auto ellapsed_ms = std::chrono::duration_cast( system_clock::now() - t0); @@ -1826,8 +1809,7 @@ TEST_P(BasicTest, BackendsRestart) { CheckRpcSendFailure(); // Restart all backends. RPCs should start succeeding again. StartAllBackends(); - CheckRpcSendOk(1 /* times */, "Echo", 2000 /* timeout_ms */, - true /* wait_for_ready */); + CheckRpcSendOk(1, RpcOptions().set_timeout_ms(2000).set_wait_for_ready(true)); } using XdsResolverOnlyTest = BasicTest; @@ -2232,15 +2214,126 @@ TEST_P(LdsTest, RouteMatchHasNonemptyPrefix) { AdsServiceImpl::NACKED); } -// Tests that LDS client should send a NACK if route match has empty path -// as the only route (default) in the LDS response. -TEST_P(LdsTest, RouteMatchHasEmptyPath) { +// Tests that LDS client should send a NACK if route match has a prefix +// not in the format "/service/": missing / or did not end with /. +TEST_P(LdsTest, RouteMatchHasInvalidPrefix) { + ResetStub(/*failover_timeout=*/0, + /*expected_targets=*/"", + /*xds_resource_does_not_exist_timeout*/ 0, + /*xds_routing_enabled=*/true); + RouteConfiguration route_config = + balancers_[0]->ads_service()->default_route_config(); + auto* route1 = route_config.mutable_virtual_hosts(0)->mutable_routes(0); + // Invalid case 1: no / + route1->mutable_match()->set_prefix("grpc.testing.EchoTest1Service"); + auto* default_route = route_config.mutable_virtual_hosts(0)->add_routes(); + default_route->mutable_match()->set_prefix(""); + default_route->mutable_route()->set_cluster(kDefaultResourceName); + balancers_[0]->ads_service()->SetLdsResource( + AdsServiceImpl::BuildListener(route_config), kDefaultResourceName); + SetNextResolution({}); + SetNextResolutionForLbChannelAllBalancers(); + CheckRpcSendFailure(); + EXPECT_EQ(balancers_[0]->ads_service()->lds_response_state(), + AdsServiceImpl::NACKED); + // Invalid case 2: missing / at the end + route1->mutable_match()->set_prefix("/grpc.testing.EchoTest1Service"); + balancers_[0]->ads_service()->SetLdsResource( + AdsServiceImpl::BuildListener(route_config), kDefaultResourceName); + SetNextResolution({}); + SetNextResolutionForLbChannelAllBalancers(); + CheckRpcSendFailure(); + EXPECT_EQ(balancers_[0]->ads_service()->lds_response_state(), + AdsServiceImpl::NACKED); + // Invalid case 3: missing / at the beginning + route1->mutable_match()->set_prefix("grpc.testing.EchoTest1Service/"); + balancers_[0]->ads_service()->SetLdsResource( + AdsServiceImpl::BuildListener(route_config), kDefaultResourceName); + SetNextResolution({}); + SetNextResolutionForLbChannelAllBalancers(); + CheckRpcSendFailure(); + EXPECT_EQ(balancers_[0]->ads_service()->lds_response_state(), + AdsServiceImpl::NACKED); + // Invalid case 4: extra content outside of "/service/" + route1->mutable_match()->set_prefix("/grpc.testing.EchoTest1Service/Echo1"); + balancers_[0]->ads_service()->SetLdsResource( + AdsServiceImpl::BuildListener(route_config), kDefaultResourceName); + SetNextResolution({}); + SetNextResolutionForLbChannelAllBalancers(); + CheckRpcSendFailure(); + EXPECT_EQ(balancers_[0]->ads_service()->lds_response_state(), + AdsServiceImpl::NACKED); + // Invalid case 5: empty prefix "//" + route1->mutable_match()->set_prefix("//"); + balancers_[0]->ads_service()->SetLdsResource( + AdsServiceImpl::BuildListener(route_config), kDefaultResourceName); + SetNextResolution({}); + SetNextResolutionForLbChannelAllBalancers(); + CheckRpcSendFailure(); + EXPECT_EQ(balancers_[0]->ads_service()->lds_response_state(), + AdsServiceImpl::NACKED); +} + +// Tests that LDS client should send a NACK if route match has path +// not in the format of "/service/method" +TEST_P(LdsTest, RouteMatchHasInvalidPath) { + ResetStub(/*failover_timeout=*/0, + /*expected_targets=*/"", + /*xds_resource_does_not_exist_timeout*/ 0, + /*xds_routing_enabled=*/true); RouteConfiguration route_config = balancers_[0]->ads_service()->default_route_config(); auto* route1 = route_config.mutable_virtual_hosts(0)->mutable_routes(0); - route1->mutable_match()->set_path(""); auto* default_route = route_config.mutable_virtual_hosts(0)->add_routes(); default_route->mutable_match()->set_prefix(""); + default_route->mutable_route()->set_cluster(kDefaultResourceName); + // Invalid case 1: empty path + route1->mutable_match()->set_path(""); + balancers_[0]->ads_service()->SetLdsResource( + AdsServiceImpl::BuildListener(route_config), kDefaultResourceName); + SetNextResolution({}); + SetNextResolutionForLbChannelAllBalancers(); + CheckRpcSendFailure(); + EXPECT_EQ(balancers_[0]->ads_service()->lds_response_state(), + AdsServiceImpl::NACKED); + // Invalid case 2: missing / at the beginning + route1->mutable_match()->set_path("grpc.testing.EchoTest1Service/Echo1"); + balancers_[0]->ads_service()->SetLdsResource( + AdsServiceImpl::BuildListener(route_config), kDefaultResourceName); + SetNextResolution({}); + SetNextResolutionForLbChannelAllBalancers(); + CheckRpcSendFailure(); + EXPECT_EQ(balancers_[0]->ads_service()->lds_response_state(), + AdsServiceImpl::NACKED); + // Invalid case 3: extra / at the end + route1->mutable_match()->set_path("/grpc.testing.EchoTest1Service/Echo1/"); + balancers_[0]->ads_service()->SetLdsResource( + AdsServiceImpl::BuildListener(route_config), kDefaultResourceName); + SetNextResolution({}); + SetNextResolutionForLbChannelAllBalancers(); + CheckRpcSendFailure(); + EXPECT_EQ(balancers_[0]->ads_service()->lds_response_state(), + AdsServiceImpl::NACKED); + // Invalid case 4: missinga / in the middle + route1->mutable_match()->set_path("/grpc.testing.EchoTest1Service.Echo1"); + balancers_[0]->ads_service()->SetLdsResource( + AdsServiceImpl::BuildListener(route_config), kDefaultResourceName); + SetNextResolution({}); + SetNextResolutionForLbChannelAllBalancers(); + CheckRpcSendFailure(); + EXPECT_EQ(balancers_[0]->ads_service()->lds_response_state(), + AdsServiceImpl::NACKED); + // Invalid case 5: empty service "//Echo1" + route1->mutable_match()->set_path("//Echo1"); + balancers_[0]->ads_service()->SetLdsResource( + AdsServiceImpl::BuildListener(route_config), kDefaultResourceName); + SetNextResolution({}); + SetNextResolutionForLbChannelAllBalancers(); + CheckRpcSendFailure(); + EXPECT_EQ(balancers_[0]->ads_service()->lds_response_state(), + AdsServiceImpl::NACKED); + // Invalid case 5: empty method "/grpc.testing.EchoTest1Service/" + route1->mutable_match()->set_path("/grpc.testing.EchoTest1Service/"); balancers_[0]->ads_service()->SetLdsResource( AdsServiceImpl::BuildListener(route_config), kDefaultResourceName); SetNextResolution({}); @@ -2350,17 +2443,15 @@ TEST_P(LdsTest, XdsRoutingPathMatching) { balancers_[0]->ads_service()->BuildListener(new_route_config); balancers_[0]->ads_service()->SetLdsResource(listener, kDefaultResourceName); WaitForAllBackends(0, 2); - RpcOptions rpc_options; - rpc_options.times = kNumEchoRpcs; - rpc_options.service_method = TEST_ECHO; - rpc_options.wait_for_ready = true; - CheckRpcSendOkNew(rpc_options); - rpc_options.times = kNumEcho1Rpcs; - rpc_options.service_method = TEST1_ECHO1; - CheckRpcSendOkNew(rpc_options); - rpc_options.times = kNumEcho2Rpcs; - rpc_options.service_method = TEST2_ECHO2; - CheckRpcSendOkNew(rpc_options); + CheckRpcSendOk(kNumEchoRpcs, RpcOptions().set_wait_for_ready(true)); + CheckRpcSendOk(kNumEcho1Rpcs, RpcOptions() + .set_rpc_service(SERVICE_ECHO1) + .set_rpc_method(METHOD_ECHO1) + .set_wait_for_ready(true)); + CheckRpcSendOk(kNumEcho2Rpcs, RpcOptions() + .set_rpc_service(SERVICE_ECHO2) + .set_rpc_method(METHOD_ECHO2) + .set_wait_for_ready(true)); // Make sure RPCs all go to the correct backend. for (size_t i = 0; i < 2; ++i) { EXPECT_EQ(kNumEchoRpcs / 2, @@ -2429,17 +2520,15 @@ TEST_P(LdsTest, XdsRoutingPrefixMatching) { balancers_[0]->ads_service()->BuildListener(new_route_config); balancers_[0]->ads_service()->SetLdsResource(listener, kDefaultResourceName); WaitForAllBackends(0, 2); - RpcOptions rpc_options; - rpc_options.times = kNumEchoRpcs; - rpc_options.service_method = TEST_ECHO; - rpc_options.wait_for_ready = true; - CheckRpcSendOkNew(rpc_options); - rpc_options.times = kNumEcho1Rpcs; - rpc_options.service_method = TEST1_ECHO1; - CheckRpcSendOkNew(rpc_options); - rpc_options.times = kNumEcho2Rpcs; - rpc_options.service_method = TEST2_ECHO2; - CheckRpcSendOkNew(rpc_options); + CheckRpcSendOk(kNumEchoRpcs, RpcOptions().set_wait_for_ready(true)); + CheckRpcSendOk(kNumEcho1Rpcs, RpcOptions() + .set_rpc_service(SERVICE_ECHO1) + .set_rpc_method(METHOD_ECHO1) + .set_wait_for_ready(true)); + CheckRpcSendOk(kNumEcho2Rpcs, RpcOptions() + .set_rpc_service(SERVICE_ECHO2) + .set_rpc_method(METHOD_ECHO2) + .set_wait_for_ready(true)); // Make sure RPCs all go to the correct backend. for (size_t i = 0; i < 2; ++i) { EXPECT_EQ(kNumEchoRpcs / 2, @@ -2773,7 +2862,7 @@ TEST_P(LocalityMapTest, NoLocalities) { // Tests that the locality map can work properly even when it contains a large // number of localities. -TEST_P(LocalityMapTest, StressTest) { +/*TEST_P(LocalityMapTest, StressTest) { SetNextResolution({}); SetNextResolutionForLbChannelAllBalancers(); const size_t kNumLocalities = 100; @@ -2797,13 +2886,13 @@ TEST_P(LocalityMapTest, StressTest) { AdsServiceImpl::BuildEdsResource(args), 60 * 1000, kDefaultResourceName)); // Wait until backend 0 is ready, before which kNumLocalities localities are // received and handled by the xds policy. - WaitForBackend(0, /*reset_counters=*/false); + WaitForBackend(0, /*reset_counters=*false); EXPECT_EQ(0U, backends_[1]->backend_service()->request_count()); // Wait until backend 1 is ready, before which kNumLocalities localities are // removed by the xds policy. WaitForBackend(1); delayed_resource_setter.join(); -} +}*/ // Tests that the localities in a locality map are picked correctly after update // (addition, modification, deletion). @@ -3149,7 +3238,7 @@ TEST_P(DropTest, Vanilla) { size_t num_drops = 0; for (size_t i = 0; i < kNumRpcs; ++i) { EchoResponse response; - const Status status = SendRpc("Echo", &response); + const Status status = SendRpc(RpcOptions(), &response); if (!status.ok() && status.error_message() == "Call dropped by load balancing policy") { ++num_drops; @@ -3189,7 +3278,7 @@ TEST_P(DropTest, DropPerHundred) { size_t num_drops = 0; for (size_t i = 0; i < kNumRpcs; ++i) { EchoResponse response; - const Status status = SendRpc("Echo", &response); + const Status status = SendRpc(RpcOptions(), &response); if (!status.ok() && status.error_message() == "Call dropped by load balancing policy") { ++num_drops; @@ -3228,7 +3317,7 @@ TEST_P(DropTest, DropPerTenThousand) { size_t num_drops = 0; for (size_t i = 0; i < kNumRpcs; ++i) { EchoResponse response; - const Status status = SendRpc("Echo", &response); + const Status status = SendRpc(RpcOptions(), &response); if (!status.ok() && status.error_message() == "Call dropped by load balancing policy") { ++num_drops; @@ -3271,7 +3360,7 @@ TEST_P(DropTest, Update) { gpr_log(GPR_INFO, "========= BEFORE FIRST BATCH =========="); for (size_t i = 0; i < kNumRpcs; ++i) { EchoResponse response; - const Status status = SendRpc("Echo", &response); + const Status status = SendRpc(RpcOptions(), &response); if (!status.ok() && status.error_message() == "Call dropped by load balancing policy") { ++num_drops; @@ -3303,7 +3392,7 @@ TEST_P(DropTest, Update) { size_t num_rpcs = kNumRpcs; while (seen_drop_rate < kDropRateThreshold) { EchoResponse response; - const Status status = SendRpc("Echo", &response); + const Status status = SendRpc(RpcOptions(), &response); ++num_rpcs; if (!status.ok() && status.error_message() == "Call dropped by load balancing policy") { @@ -3320,7 +3409,7 @@ TEST_P(DropTest, Update) { gpr_log(GPR_INFO, "========= BEFORE SECOND BATCH =========="); for (size_t i = 0; i < kNumRpcs; ++i) { EchoResponse response; - const Status status = SendRpc("Echo", &response); + const Status status = SendRpc(RpcOptions(), &response); if (!status.ok() && status.error_message() == "Call dropped by load balancing policy") { ++num_drops; @@ -3357,7 +3446,7 @@ TEST_P(DropTest, DropAll) { // Send kNumRpcs RPCs and all of them are dropped. for (size_t i = 0; i < kNumRpcs; ++i) { EchoResponse response; - const Status status = SendRpc("Echo", &response); + const Status status = SendRpc(RpcOptions(), &response); EXPECT_EQ(status.error_code(), StatusCode::UNAVAILABLE); EXPECT_EQ(status.error_message(), "Call dropped by load balancing policy"); } @@ -3752,7 +3841,7 @@ TEST_P(ClientLoadReportingWithDropTest, Vanilla) { // Send kNumRpcs RPCs and count the drops. for (size_t i = 0; i < kNumRpcs; ++i) { EchoResponse response; - const Status status = SendRpc("Echo", &response); + const Status status = SendRpc(RpcOptions(), &response); if (!status.ok() && status.error_message() == "Call dropped by load balancing policy") { ++num_drops; From 37755c482b98fe306f3911046b03c55c9bf882c8 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Wed, 15 Apr 2020 13:39:27 -0700 Subject: [PATCH 505/758] Avoid docstring duplication --- .../grpc_reflection/v1alpha/reflection.py | 28 +++++++++---------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/src/python/grpcio_reflection/grpc_reflection/v1alpha/reflection.py b/src/python/grpcio_reflection/grpc_reflection/v1alpha/reflection.py index 57e4d098e9f..219f10ab61c 100644 --- a/src/python/grpcio_reflection/grpc_reflection/v1alpha/reflection.py +++ b/src/python/grpcio_reflection/grpc_reflection/v1alpha/reflection.py @@ -54,19 +54,20 @@ class ReflectionServicer(BaseReflectionServicer): )) +_enable_server_reflection_doc = """Enables server reflection on a server. + +Args: + service_names: Iterable of fully-qualified service names available. + server: grpc.Server to which reflection service will be added. + pool: DescriptorPool object to use (descriptor_pool.Default() if None). +""" + if sys.version_info[0] >= 3 and sys.version_info[1] >= 6: # Exposes AsyncReflectionServicer as public API. from . import _async as aio - from grpc.experimental import aio as grpc_aio + from grpc.experimental import aio as grpc_aio # pylint: disable=ungrouped-imports def enable_server_reflection(service_names, server, pool=None): - """Enables server reflection on a server. - - Args: - service_names: Iterable of fully-qualified service names available. - server: grpc.Server to which reflection service will be added. - pool: DescriptorPool object to use (descriptor_pool.Default() if None). - """ if isinstance(server, grpc_aio.Server): _reflection_pb2_grpc.add_ServerReflectionServicer_to_server( aio.ReflectionServicer(service_names, pool=pool), server) @@ -74,6 +75,8 @@ if sys.version_info[0] >= 3 and sys.version_info[1] >= 6: _reflection_pb2_grpc.add_ServerReflectionServicer_to_server( ReflectionServicer(service_names, pool=pool), server) + enable_server_reflection.__doc__ = _enable_server_reflection_doc + __all__ = [ "SERVICE_NAME", "ReflectionServicer", @@ -83,16 +86,11 @@ if sys.version_info[0] >= 3 and sys.version_info[1] >= 6: else: def enable_server_reflection(service_names, server, pool=None): - """Enables server reflection on a server. - - Args: - service_names: Iterable of fully-qualified service names available. - server: grpc.Server to which reflection service will be added. - pool: DescriptorPool object to use (descriptor_pool.Default() if None). - """ _reflection_pb2_grpc.add_ServerReflectionServicer_to_server( ReflectionServicer(service_names, pool=pool), server) + enable_server_reflection.__doc__ = _enable_server_reflection_doc + __all__ = [ "SERVICE_NAME", "ReflectionServicer", From 6e0ac50b09ae38f43f491a2fd610c818ab4f84f3 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Wed, 15 Apr 2020 14:04:52 -0700 Subject: [PATCH 506/758] Improve the documentation for serializer and deserializer --- doc/python/sphinx/glossary.rst | 13 +++++++ src/python/grpcio/grpc/__init__.py | 36 +++++++++---------- src/python/grpcio/grpc/_simple_stubs.py | 16 ++++----- .../grpc/experimental/aio/_base_channel.py | 16 ++++----- 4 files changed, 47 insertions(+), 34 deletions(-) diff --git a/doc/python/sphinx/glossary.rst b/doc/python/sphinx/glossary.rst index dee5d161439..cae5f4a32e3 100644 --- a/doc/python/sphinx/glossary.rst +++ b/doc/python/sphinx/glossary.rst @@ -14,3 +14,16 @@ Glossary metadata A sequence of metadatum. + + serializer + A callable function that encodes an object into bytes. Applications are + allowed to provide any customized serializer, so there isn't a restriction + for the input object (i.e. even ``None``). On the server-side, the + serializer is invoked with server handler's return value; on the + client-side, the serializer is invoked with outbound message objects. + + deserializer + A callable function that decodes bytes into an object. Same as serializer, + the returned object doesn't have restrictions (i.e. ``None`` allowed). The + deserializer is invoked with inbound message bytes on both the server side + and the client-side. diff --git a/src/python/grpcio/grpc/__init__.py b/src/python/grpcio/grpc/__init__.py index 9e349c5b023..ff799cd07e9 100644 --- a/src/python/grpcio/grpc/__init__.py +++ b/src/python/grpcio/grpc/__init__.py @@ -994,9 +994,9 @@ class Channel(six.with_metaclass(abc.ABCMeta)): Args: method: The name of the RPC method. - request_serializer: Optional behaviour for serializing the request + request_serializer: Optional :term:`serializer` for serializing the request message. Request goes unserialized in case None is passed. - response_deserializer: Optional behaviour for deserializing the + response_deserializer: Optional :term:`deserializer` for deserializing the response message. Response goes undeserialized in case None is passed. @@ -1014,9 +1014,9 @@ class Channel(six.with_metaclass(abc.ABCMeta)): Args: method: The name of the RPC method. - request_serializer: Optional behaviour for serializing the request + request_serializer: Optional :term:`serializer` for serializing the request message. Request goes unserialized in case None is passed. - response_deserializer: Optional behaviour for deserializing the + response_deserializer: Optional :term:`deserializer` for deserializing the response message. Response goes undeserialized in case None is passed. @@ -1034,9 +1034,9 @@ class Channel(six.with_metaclass(abc.ABCMeta)): Args: method: The name of the RPC method. - request_serializer: Optional behaviour for serializing the request + request_serializer: Optional :term:`serializer` for serializing the request message. Request goes unserialized in case None is passed. - response_deserializer: Optional behaviour for deserializing the + response_deserializer: Optional :term:`deserializer` for deserializing the response message. Response goes undeserialized in case None is passed. @@ -1054,9 +1054,9 @@ class Channel(six.with_metaclass(abc.ABCMeta)): Args: method: The name of the RPC method. - request_serializer: Optional behaviour for serializing the request + request_serializer: Optional :term:`serializer` for serializing the request message. Request goes unserialized in case None is passed. - response_deserializer: Optional behaviour for deserializing the + response_deserializer: Optional :term:`deserializer` for deserializing the response message. Response goes undeserialized in case None is passed. @@ -1271,11 +1271,11 @@ class RpcMethodHandler(six.with_metaclass(abc.ABCMeta)): or any arbitrary number of request messages. response_streaming: Whether the RPC supports exactly one response message or any arbitrary number of response messages. - request_deserializer: A callable behavior that accepts a byte string and + request_deserializer: A callable :term:`deserializer` that accepts a byte string and returns an object suitable to be passed to this object's business logic, or None to indicate that this object's business logic should be passed the raw request bytes. - response_serializer: A callable behavior that accepts an object produced + response_serializer: A callable :term:`serializer` that accepts an object produced by this object's business logic and returns a byte string, or None to indicate that the byte strings produced by this object's business logic should be transmitted on the wire as they are. @@ -1496,8 +1496,8 @@ def unary_unary_rpc_method_handler(behavior, Args: behavior: The implementation of an RPC that accepts one request and returns one response. - request_deserializer: An optional behavior for request deserialization. - response_serializer: An optional behavior for response serialization. + request_deserializer: An optional :term:`deserializer` for request deserialization. + response_serializer: An optional :term:`serializer` for response serialization. Returns: An RpcMethodHandler object that is typically used by grpc.Server. @@ -1516,8 +1516,8 @@ def unary_stream_rpc_method_handler(behavior, Args: behavior: The implementation of an RPC that accepts one request and returns an iterator of response values. - request_deserializer: An optional behavior for request deserialization. - response_serializer: An optional behavior for response serialization. + request_deserializer: An optional :term:`deserializer` for request deserialization. + response_serializer: An optional :term:`serializer` for response serialization. Returns: An RpcMethodHandler object that is typically used by grpc.Server. @@ -1536,8 +1536,8 @@ def stream_unary_rpc_method_handler(behavior, Args: behavior: The implementation of an RPC that accepts an iterator of request values and returns a single response value. - request_deserializer: An optional behavior for request deserialization. - response_serializer: An optional behavior for response serialization. + request_deserializer: An optional :term:`deserializer` for request deserialization. + response_serializer: An optional :term:`serializer` for response serialization. Returns: An RpcMethodHandler object that is typically used by grpc.Server. @@ -1556,8 +1556,8 @@ def stream_stream_rpc_method_handler(behavior, Args: behavior: The implementation of an RPC that accepts an iterator of request values and returns an iterator of response values. - request_deserializer: An optional behavior for request deserialization. - response_serializer: An optional behavior for response serialization. + request_deserializer: An optional :term:`deserializer` for request deserialization. + response_serializer: An optional :term:`serializer` for response serialization. Returns: An RpcMethodHandler object that is typically used by grpc.Server. diff --git a/src/python/grpcio/grpc/_simple_stubs.py b/src/python/grpcio/grpc/_simple_stubs.py index 44308657d58..39535527ef5 100644 --- a/src/python/grpcio/grpc/_simple_stubs.py +++ b/src/python/grpcio/grpc/_simple_stubs.py @@ -192,9 +192,9 @@ def unary_unary( request: An iterator that yields request values for the RPC. target: The server address. method: The name of the RPC method. - request_serializer: Optional behaviour for serializing the request + request_serializer: Optional :term:`serializer` for serializing the request message. Request goes unserialized in case None is passed. - response_deserializer: Optional behaviour for deserializing the response + response_deserializer: Optional :term:`deserializer` for deserializing the response message. Response goes undeserialized in case None is passed. options: An optional list of key-value pairs (channel args in gRPC Core runtime) to configure the channel. @@ -263,9 +263,9 @@ def unary_stream( request: An iterator that yields request values for the RPC. target: The server address. method: The name of the RPC method. - request_serializer: Optional behaviour for serializing the request + request_serializer: Optional :term:`serializer` for serializing the request message. Request goes unserialized in case None is passed. - response_deserializer: Optional behaviour for deserializing the response + response_deserializer: Optional :term:`deserializer` for deserializing the response message. Response goes undeserialized in case None is passed. options: An optional list of key-value pairs (channel args in gRPC Core runtime) to configure the channel. @@ -333,9 +333,9 @@ def stream_unary( request_iterator: An iterator that yields request values for the RPC. target: The server address. method: The name of the RPC method. - request_serializer: Optional behaviour for serializing the request + request_serializer: Optional :term:`serializer` for serializing the request message. Request goes unserialized in case None is passed. - response_deserializer: Optional behaviour for deserializing the response + response_deserializer: Optional :term:`deserializer` for deserializing the response message. Response goes undeserialized in case None is passed. options: An optional list of key-value pairs (channel args in gRPC Core runtime) to configure the channel. @@ -403,9 +403,9 @@ def stream_stream( request_iterator: An iterator that yields request values for the RPC. target: The server address. method: The name of the RPC method. - request_serializer: Optional behaviour for serializing the request + request_serializer: Optional :term:`serializer` for serializing the request message. Request goes unserialized in case None is passed. - response_deserializer: Optional behaviour for deserializing the response + response_deserializer: Optional :term:`deserializer` for deserializing the response message. Response goes undeserialized in case None is passed. options: An optional list of key-value pairs (channel args in gRPC Core runtime) to configure the channel. diff --git a/src/python/grpcio/grpc/experimental/aio/_base_channel.py b/src/python/grpcio/grpc/experimental/aio/_base_channel.py index 11744f0882a..b6c946a4367 100644 --- a/src/python/grpcio/grpc/experimental/aio/_base_channel.py +++ b/src/python/grpcio/grpc/experimental/aio/_base_channel.py @@ -274,9 +274,9 @@ class Channel(abc.ABC): Args: method: The name of the RPC method. - request_serializer: Optional behaviour for serializing the request + request_serializer: Optional :term:`serializer` for serializing the request message. Request goes unserialized in case None is passed. - response_deserializer: Optional behaviour for deserializing the + response_deserializer: Optional :term:`deserializer` for deserializing the response message. Response goes undeserialized in case None is passed. @@ -295,9 +295,9 @@ class Channel(abc.ABC): Args: method: The name of the RPC method. - request_serializer: Optional behaviour for serializing the request + request_serializer: Optional :term:`serializer` for serializing the request message. Request goes unserialized in case None is passed. - response_deserializer: Optional behaviour for deserializing the + response_deserializer: Optional :term:`deserializer` for deserializing the response message. Response goes undeserialized in case None is passed. @@ -316,9 +316,9 @@ class Channel(abc.ABC): Args: method: The name of the RPC method. - request_serializer: Optional behaviour for serializing the request + request_serializer: Optional :term:`serializer` for serializing the request message. Request goes unserialized in case None is passed. - response_deserializer: Optional behaviour for deserializing the + response_deserializer: Optional :term:`deserializer` for deserializing the response message. Response goes undeserialized in case None is passed. @@ -337,9 +337,9 @@ class Channel(abc.ABC): Args: method: The name of the RPC method. - request_serializer: Optional behaviour for serializing the request + request_serializer: Optional :term:`serializer` for serializing the request message. Request goes unserialized in case None is passed. - response_deserializer: Optional behaviour for deserializing the + response_deserializer: Optional :term:`deserializer` for deserializing the response message. Response goes undeserialized in case None is passed. From c61c8255dba9487d8b13fd95be0ab48c44d9125c Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Wed, 15 Apr 2020 14:16:14 -0700 Subject: [PATCH 507/758] Remove debugging comments --- src/core/ext/transport/inproc/inproc_transport.cc | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/core/ext/transport/inproc/inproc_transport.cc b/src/core/ext/transport/inproc/inproc_transport.cc index f2ce18c574b..277e01af4b7 100644 --- a/src/core/ext/transport/inproc/inproc_transport.cc +++ b/src/core/ext/transport/inproc/inproc_transport.cc @@ -496,7 +496,6 @@ void fail_helper_locked(inproc_stream* s, grpc_error* error) { } if (s->send_message_op) { s->send_message_op->payload->send_message.send_message.reset(); - gpr_log(GPR_ERROR, "here"); complete_if_batch_end_locked( s, error, s->send_message_op, "fail_helper scheduling send-message-on-complete"); @@ -616,7 +615,6 @@ void op_state_machine_locked(inproc_stream* s, grpc_error* error) { } else if (!s->t->is_client && s->trailing_md_sent) { // A server send will never be matched if the server already sent status s->send_message_op->payload->send_message.send_message.reset(); - gpr_log(GPR_ERROR, "here"); complete_if_batch_end_locked( s, GRPC_ERROR_NONE, s->send_message_op, "op_state_machine scheduling send-message-on-complete"); From 7189d7ca6293965045df7333063e2bb124258e0b Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Wed, 15 Apr 2020 14:30:13 -0700 Subject: [PATCH 508/758] Remove unnecessary access specifier --- .../filters/http/message_decompress/message_decompress_filter.cc | 1 - 1 file changed, 1 deletion(-) diff --git a/src/core/ext/filters/http/message_decompress/message_decompress_filter.cc b/src/core/ext/filters/http/message_decompress/message_decompress_filter.cc index 65fba4146ae..18a411d723b 100644 --- a/src/core/ext/filters/http/message_decompress/message_decompress_filter.cc +++ b/src/core/ext/filters/http/message_decompress/message_decompress_filter.cc @@ -63,7 +63,6 @@ class CallData { ~CallData() { grpc_slice_buffer_destroy_internal(&recv_slices_); } - public: void DecompressStartTransportStreamOpBatch( grpc_call_element* elem, grpc_transport_stream_op_batch* batch); From 42bd1068980b7948620620c1e3985f8005a01ab8 Mon Sep 17 00:00:00 2001 From: Taras Galkovskyi Date: Wed, 15 Apr 2020 22:14:08 +0000 Subject: [PATCH 509/758] updating comments to make clear that ALTS is only supported on GCP --- examples/python/data_transmission/alts_client.py | 4 +++- examples/python/data_transmission/alts_server.py | 4 +++- src/python/grpcio/grpc/__init__.py | 14 ++++++++++++-- 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/examples/python/data_transmission/alts_client.py b/examples/python/data_transmission/alts_client.py index e3ddb281930..0bfcede9465 100644 --- a/examples/python/data_transmission/alts_client.py +++ b/examples/python/data_transmission/alts_client.py @@ -11,7 +11,9 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -"""The example of using ALTS credentials to setup gRPC client.""" +"""The example of using ALTS credentials to setup gRPC client. + +The example would only successfully run in GCP environment.""" import grpc diff --git a/examples/python/data_transmission/alts_server.py b/examples/python/data_transmission/alts_server.py index e91a1545377..4f7b84d9ca6 100644 --- a/examples/python/data_transmission/alts_server.py +++ b/examples/python/data_transmission/alts_server.py @@ -11,7 +11,9 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -"""The example of using ALTS credentials to setup gRPC server in python.""" +"""The example of using ALTS credentials to setup gRPC server in python. + +The example would only successfully run in GCP environment.""" from concurrent import futures diff --git a/src/python/grpcio/grpc/__init__.py b/src/python/grpcio/grpc/__init__.py index ac17c53d6e9..7d5d85f26ef 100644 --- a/src/python/grpcio/grpc/__init__.py +++ b/src/python/grpcio/grpc/__init__.py @@ -1837,9 +1837,16 @@ def alts_channel_credentials(service_accounts=[]): """Creates a ChannelCredentials for use with an ALTS-enabled Channel. This is an EXPERIMENTAL API. + ALTS credentials API can only be used in GCP environment as it relies on + handshaker service being available. For more info about ALTS see + https://cloud.google.com/security/encryption-in-transit/application-layer-transport-security Args: - service_accounts: list of strings, target service accounts + service_accounts: A list of server identities accepted by the client. + If target service accounts are provided and none of them matches the + peer identity of the server, handshake will fail. The arg can be empty + if the client does not have any information about trusted server + identity. Returns: A ChannelCredentials for use with an ALTS-enabled Channel """ @@ -1847,9 +1854,12 @@ def alts_channel_credentials(service_accounts=[]): def alts_server_credentials(): - """Creates a ServerCredentials for use with an ALTS-enabled connections. + """Creates a ServerCredentials for use with an ALTS-enabled connection. This is an EXPERIMENTAL API. + ALTS credentials API can only be used in GCP environment as it relies on + handshaker service being available. For more info about ALTS see + https://cloud.google.com/security/encryption-in-transit/application-layer-transport-security Returns: A ServerCredentials for use with an ALTS-enabled Server From 51e38fa508d93b62b105ddfc67c2efb3359d4204 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Wed, 15 Apr 2020 15:26:07 -0700 Subject: [PATCH 510/758] Allow "None" as response message with none-OK status --- .../grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi | 12 ++++-------- .../grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi | 5 ++++- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi index abd1543572f..7070c0b4d4d 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi @@ -264,14 +264,10 @@ async def _finish_handler_with_unary_response(RPCState rpc_state, rpc_state.raise_for_termination() # Serializes the response message - cdef bytes response_raw - if rpc_state.status_code == StatusCode.ok: - response_raw = serialize( - response_serializer, - response_message, - ) - else: - response_raw = b'' + cdef bytes response_raw = serialize( + response_serializer, + response_message, + ) # Assembles the batch operations cdef tuple finish_ops diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi index c8a390106a8..3f3fd75407c 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/operation.pyx.pxi @@ -49,7 +49,10 @@ cdef class SendInitialMetadataOperation(Operation): cdef class SendMessageOperation(Operation): def __cinit__(self, bytes message, int flags): - self._message = message + if message is None: + self._message = b'' + else: + self._message = message self._flags = flags def type(self): From 9503b68a8b259b1c43fd5ad535576d99b17c05ca Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Wed, 15 Apr 2020 16:13:12 -0700 Subject: [PATCH 511/758] Discards response message with non-OK status --- .../grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi index 7070c0b4d4d..0e407172806 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi @@ -264,10 +264,15 @@ async def _finish_handler_with_unary_response(RPCState rpc_state, rpc_state.raise_for_termination() # Serializes the response message - cdef bytes response_raw = serialize( - response_serializer, - response_message, - ) + cdef bytes response_raw + if rpc_state.status_code == StatusCode.ok: + response_raw = serialize( + response_serializer, + response_message, + ) + else: + # Discards the response message if the status code is non-OK. + response_raw = b'' # Assembles the batch operations cdef tuple finish_ops From 63573b0515338ab590c643e4a71d0f05f4e26eec Mon Sep 17 00:00:00 2001 From: Donna Dionne Date: Wed, 15 Apr 2020 17:33:31 -0700 Subject: [PATCH 512/758] Fixing a flaky test. --- test/cpp/end2end/xds_end2end_test.cc | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/test/cpp/end2end/xds_end2end_test.cc b/test/cpp/end2end/xds_end2end_test.cc index 6d957a77006..c39712dc2ed 100644 --- a/test/cpp/end2end/xds_end2end_test.cc +++ b/test/cpp/end2end/xds_end2end_test.cc @@ -2219,7 +2219,7 @@ TEST_P(LdsTest, RouteMatchHasNonemptyPrefix) { TEST_P(LdsTest, RouteMatchHasInvalidPrefix) { ResetStub(/*failover_timeout=*/0, /*expected_targets=*/"", - /*xds_resource_does_not_exist_timeout*/ 0, + /*xds_resource_does_not_exist_timeout*/ 30000, /*xds_routing_enabled=*/true); RouteConfiguration route_config = balancers_[0]->ads_service()->default_route_config(); @@ -2279,7 +2279,7 @@ TEST_P(LdsTest, RouteMatchHasInvalidPrefix) { TEST_P(LdsTest, RouteMatchHasInvalidPath) { ResetStub(/*failover_timeout=*/0, /*expected_targets=*/"", - /*xds_resource_does_not_exist_timeout*/ 0, + /*xds_resource_does_not_exist_timeout*/ 30000, /*xds_routing_enabled=*/true); RouteConfiguration route_config = balancers_[0]->ads_service()->default_route_config(); @@ -2862,7 +2862,7 @@ TEST_P(LocalityMapTest, NoLocalities) { // Tests that the locality map can work properly even when it contains a large // number of localities. -/*TEST_P(LocalityMapTest, StressTest) { +TEST_P(LocalityMapTest, StressTest) { SetNextResolution({}); SetNextResolutionForLbChannelAllBalancers(); const size_t kNumLocalities = 100; @@ -2886,13 +2886,13 @@ TEST_P(LocalityMapTest, NoLocalities) { AdsServiceImpl::BuildEdsResource(args), 60 * 1000, kDefaultResourceName)); // Wait until backend 0 is ready, before which kNumLocalities localities are // received and handled by the xds policy. - WaitForBackend(0, /*reset_counters=*false); + WaitForBackend(0, /*reset_counters=*/false); EXPECT_EQ(0U, backends_[1]->backend_service()->request_count()); // Wait until backend 1 is ready, before which kNumLocalities localities are // removed by the xds policy. WaitForBackend(1); delayed_resource_setter.join(); -}*/ +} // Tests that the localities in a locality map are picked correctly after update // (addition, modification, deletion). From 0e0db09613125ced4f0d0e1b822572e38017d074 Mon Sep 17 00:00:00 2001 From: Muxi Yan Date: Thu, 16 Apr 2020 08:54:07 -0700 Subject: [PATCH 513/758] Revert "Introduce CFRunLoop based iomgr" --- BUILD | 3 +- BUILD.gn | 2 - CMakeLists.txt | 2 - Makefile | 2 - build_autogenerated.yaml | 4 - config.m4 | 1 - config.w32 | 1 - gRPC-C++.podspec | 2 - gRPC-Core.podspec | 3 - grpc.gemspec | 2 - grpc.gyp | 2 - package.xml | 2 - src/core/lib/iomgr/cfstream_handle.cc | 5 +- src/core/lib/iomgr/ev_apple.cc | 356 ------------------ src/core/lib/iomgr/ev_apple.h | 43 --- src/core/lib/iomgr/iomgr_posix_cfstream.cc | 104 +---- src/core/lib/iomgr/pollset_set_custom.cc | 20 +- src/core/lib/iomgr/port.h | 1 - .../xcschemes/InteropTests.xcscheme | 9 +- .../xcshareddata/xcschemes/MacTests.xcscheme | 9 +- .../xcshareddata/xcschemes/PerfTests.xcscheme | 9 +- .../xcshareddata/xcschemes/TvTests.xcscheme | 9 +- .../xcshareddata/xcschemes/UnitTests.xcscheme | 9 +- src/python/grpcio/grpc_core_dependencies.py | 1 - test/cpp/ios/Podfile | 2 +- tools/doxygen/Doxyfile.c++.internal | 2 - tools/doxygen/Doxyfile.core.internal | 2 - 27 files changed, 44 insertions(+), 563 deletions(-) delete mode 100644 src/core/lib/iomgr/ev_apple.cc delete mode 100644 src/core/lib/iomgr/ev_apple.h diff --git a/BUILD b/BUILD index 98622fd7ecc..81de8203a03 100644 --- a/BUILD +++ b/BUILD @@ -724,7 +724,6 @@ grpc_cc_library( "src/core/lib/iomgr/endpoint_pair_windows.cc", "src/core/lib/iomgr/error.cc", "src/core/lib/iomgr/error_cfstream.cc", - "src/core/lib/iomgr/ev_apple.cc", "src/core/lib/iomgr/ev_epoll1_linux.cc", "src/core/lib/iomgr/ev_epollex_linux.cc", "src/core/lib/iomgr/ev_poll_posix.cc", @@ -886,7 +885,6 @@ grpc_cc_library( "src/core/lib/iomgr/error.h", "src/core/lib/iomgr/error_cfstream.h", "src/core/lib/iomgr/error_internal.h", - "src/core/lib/iomgr/ev_apple.h", "src/core/lib/iomgr/ev_epoll1_linux.h", "src/core/lib/iomgr/ev_epollex_linux.h", "src/core/lib/iomgr/ev_poll_posix.h", @@ -991,6 +989,7 @@ grpc_cc_library( ], language = "c++", public_hdrs = GRPC_PUBLIC_HDRS, + use_cfstream = True, deps = [ "eventmanager_libuv", "gpr_base", diff --git a/BUILD.gn b/BUILD.gn index bc56c6e571f..129ad2b2639 100644 --- a/BUILD.gn +++ b/BUILD.gn @@ -604,8 +604,6 @@ config("grpc_config") { "src/core/lib/iomgr/error_cfstream.cc", "src/core/lib/iomgr/error_cfstream.h", "src/core/lib/iomgr/error_internal.h", - "src/core/lib/iomgr/ev_apple.cc", - "src/core/lib/iomgr/ev_apple.h", "src/core/lib/iomgr/ev_epoll1_linux.cc", "src/core/lib/iomgr/ev_epoll1_linux.h", "src/core/lib/iomgr/ev_epollex_linux.cc", diff --git a/CMakeLists.txt b/CMakeLists.txt index 7c2ed457f9d..4fc05f7c174 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1512,7 +1512,6 @@ add_library(grpc src/core/lib/iomgr/endpoint_pair_windows.cc src/core/lib/iomgr/error.cc src/core/lib/iomgr/error_cfstream.cc - src/core/lib/iomgr/ev_apple.cc src/core/lib/iomgr/ev_epoll1_linux.cc src/core/lib/iomgr/ev_epollex_linux.cc src/core/lib/iomgr/ev_poll_posix.cc @@ -2166,7 +2165,6 @@ add_library(grpc_unsecure src/core/lib/iomgr/endpoint_pair_windows.cc src/core/lib/iomgr/error.cc src/core/lib/iomgr/error_cfstream.cc - src/core/lib/iomgr/ev_apple.cc src/core/lib/iomgr/ev_epoll1_linux.cc src/core/lib/iomgr/ev_epollex_linux.cc src/core/lib/iomgr/ev_poll_posix.cc diff --git a/Makefile b/Makefile index 3c196a328e9..92ac929d3bc 100644 --- a/Makefile +++ b/Makefile @@ -3837,7 +3837,6 @@ LIBGRPC_SRC = \ src/core/lib/iomgr/endpoint_pair_windows.cc \ src/core/lib/iomgr/error.cc \ src/core/lib/iomgr/error_cfstream.cc \ - src/core/lib/iomgr/ev_apple.cc \ src/core/lib/iomgr/ev_epoll1_linux.cc \ src/core/lib/iomgr/ev_epollex_linux.cc \ src/core/lib/iomgr/ev_poll_posix.cc \ @@ -4465,7 +4464,6 @@ LIBGRPC_UNSECURE_SRC = \ src/core/lib/iomgr/endpoint_pair_windows.cc \ src/core/lib/iomgr/error.cc \ src/core/lib/iomgr/error_cfstream.cc \ - src/core/lib/iomgr/ev_apple.cc \ src/core/lib/iomgr/ev_epoll1_linux.cc \ src/core/lib/iomgr/ev_epollex_linux.cc \ src/core/lib/iomgr/ev_poll_posix.cc \ diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml index 0747c4a079b..0f98d3a24ae 100644 --- a/build_autogenerated.yaml +++ b/build_autogenerated.yaml @@ -566,7 +566,6 @@ libs: - src/core/lib/iomgr/error.h - src/core/lib/iomgr/error_cfstream.h - src/core/lib/iomgr/error_internal.h - - src/core/lib/iomgr/ev_apple.h - src/core/lib/iomgr/ev_epoll1_linux.h - src/core/lib/iomgr/ev_epollex_linux.h - src/core/lib/iomgr/ev_poll_posix.h @@ -939,7 +938,6 @@ libs: - src/core/lib/iomgr/endpoint_pair_windows.cc - src/core/lib/iomgr/error.cc - src/core/lib/iomgr/error_cfstream.cc - - src/core/lib/iomgr/ev_apple.cc - src/core/lib/iomgr/ev_epoll1_linux.cc - src/core/lib/iomgr/ev_epollex_linux.cc - src/core/lib/iomgr/ev_poll_posix.cc @@ -1467,7 +1465,6 @@ libs: - src/core/lib/iomgr/error.h - src/core/lib/iomgr/error_cfstream.h - src/core/lib/iomgr/error_internal.h - - src/core/lib/iomgr/ev_apple.h - src/core/lib/iomgr/ev_epoll1_linux.h - src/core/lib/iomgr/ev_epollex_linux.h - src/core/lib/iomgr/ev_poll_posix.h @@ -1772,7 +1769,6 @@ libs: - src/core/lib/iomgr/endpoint_pair_windows.cc - src/core/lib/iomgr/error.cc - src/core/lib/iomgr/error_cfstream.cc - - src/core/lib/iomgr/ev_apple.cc - src/core/lib/iomgr/ev_epoll1_linux.cc - src/core/lib/iomgr/ev_epollex_linux.cc - src/core/lib/iomgr/ev_poll_posix.cc diff --git a/config.m4 b/config.m4 index b4013a02fbd..6b450315f4f 100644 --- a/config.m4 +++ b/config.m4 @@ -286,7 +286,6 @@ if test "$PHP_GRPC" != "no"; then src/core/lib/iomgr/endpoint_pair_windows.cc \ src/core/lib/iomgr/error.cc \ src/core/lib/iomgr/error_cfstream.cc \ - src/core/lib/iomgr/ev_apple.cc \ src/core/lib/iomgr/ev_epoll1_linux.cc \ src/core/lib/iomgr/ev_epollex_linux.cc \ src/core/lib/iomgr/ev_poll_posix.cc \ diff --git a/config.w32 b/config.w32 index c0b062aafea..59cdbdb1ce4 100644 --- a/config.w32 +++ b/config.w32 @@ -255,7 +255,6 @@ if (PHP_GRPC != "no") { "src\\core\\lib\\iomgr\\endpoint_pair_windows.cc " + "src\\core\\lib\\iomgr\\error.cc " + "src\\core\\lib\\iomgr\\error_cfstream.cc " + - "src\\core\\lib\\iomgr\\ev_apple.cc " + "src\\core\\lib\\iomgr\\ev_epoll1_linux.cc " + "src\\core\\lib\\iomgr\\ev_epollex_linux.cc " + "src\\core\\lib\\iomgr\\ev_poll_posix.cc " + diff --git a/gRPC-C++.podspec b/gRPC-C++.podspec index 7d546034f95..77980999b59 100644 --- a/gRPC-C++.podspec +++ b/gRPC-C++.podspec @@ -445,7 +445,6 @@ Pod::Spec.new do |s| 'src/core/lib/iomgr/error.h', 'src/core/lib/iomgr/error_cfstream.h', 'src/core/lib/iomgr/error_internal.h', - 'src/core/lib/iomgr/ev_apple.h', 'src/core/lib/iomgr/ev_epoll1_linux.h', 'src/core/lib/iomgr/ev_epollex_linux.h', 'src/core/lib/iomgr/ev_poll_posix.h', @@ -897,7 +896,6 @@ Pod::Spec.new do |s| 'src/core/lib/iomgr/error.h', 'src/core/lib/iomgr/error_cfstream.h', 'src/core/lib/iomgr/error_internal.h', - 'src/core/lib/iomgr/ev_apple.h', 'src/core/lib/iomgr/ev_epoll1_linux.h', 'src/core/lib/iomgr/ev_epollex_linux.h', 'src/core/lib/iomgr/ev_poll_posix.h', diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec index 056c7f8a6fd..749e77b3fa7 100644 --- a/gRPC-Core.podspec +++ b/gRPC-Core.podspec @@ -654,8 +654,6 @@ Pod::Spec.new do |s| 'src/core/lib/iomgr/error_cfstream.cc', 'src/core/lib/iomgr/error_cfstream.h', 'src/core/lib/iomgr/error_internal.h', - 'src/core/lib/iomgr/ev_apple.cc', - 'src/core/lib/iomgr/ev_apple.h', 'src/core/lib/iomgr/ev_epoll1_linux.cc', 'src/core/lib/iomgr/ev_epoll1_linux.h', 'src/core/lib/iomgr/ev_epollex_linux.cc', @@ -1251,7 +1249,6 @@ Pod::Spec.new do |s| 'src/core/lib/iomgr/error.h', 'src/core/lib/iomgr/error_cfstream.h', 'src/core/lib/iomgr/error_internal.h', - 'src/core/lib/iomgr/ev_apple.h', 'src/core/lib/iomgr/ev_epoll1_linux.h', 'src/core/lib/iomgr/ev_epollex_linux.h', 'src/core/lib/iomgr/ev_poll_posix.h', diff --git a/grpc.gemspec b/grpc.gemspec index 3dcf652466f..29e5d3d436b 100644 --- a/grpc.gemspec +++ b/grpc.gemspec @@ -576,8 +576,6 @@ Gem::Specification.new do |s| s.files += %w( src/core/lib/iomgr/error_cfstream.cc ) s.files += %w( src/core/lib/iomgr/error_cfstream.h ) s.files += %w( src/core/lib/iomgr/error_internal.h ) - s.files += %w( src/core/lib/iomgr/ev_apple.cc ) - s.files += %w( src/core/lib/iomgr/ev_apple.h ) s.files += %w( src/core/lib/iomgr/ev_epoll1_linux.cc ) s.files += %w( src/core/lib/iomgr/ev_epoll1_linux.h ) s.files += %w( src/core/lib/iomgr/ev_epollex_linux.cc ) diff --git a/grpc.gyp b/grpc.gyp index ce39a8ed214..a62c034d65a 100644 --- a/grpc.gyp +++ b/grpc.gyp @@ -640,7 +640,6 @@ 'src/core/lib/iomgr/endpoint_pair_windows.cc', 'src/core/lib/iomgr/error.cc', 'src/core/lib/iomgr/error_cfstream.cc', - 'src/core/lib/iomgr/ev_apple.cc', 'src/core/lib/iomgr/ev_epoll1_linux.cc', 'src/core/lib/iomgr/ev_epollex_linux.cc', 'src/core/lib/iomgr/ev_poll_posix.cc', @@ -1130,7 +1129,6 @@ 'src/core/lib/iomgr/endpoint_pair_windows.cc', 'src/core/lib/iomgr/error.cc', 'src/core/lib/iomgr/error_cfstream.cc', - 'src/core/lib/iomgr/ev_apple.cc', 'src/core/lib/iomgr/ev_epoll1_linux.cc', 'src/core/lib/iomgr/ev_epollex_linux.cc', 'src/core/lib/iomgr/ev_poll_posix.cc', diff --git a/package.xml b/package.xml index a8430464cf7..06d1669ec48 100644 --- a/package.xml +++ b/package.xml @@ -556,8 +556,6 @@ - - diff --git a/src/core/lib/iomgr/cfstream_handle.cc b/src/core/lib/iomgr/cfstream_handle.cc index 7a78ccd8769..40fb3779651 100644 --- a/src/core/lib/iomgr/cfstream_handle.cc +++ b/src/core/lib/iomgr/cfstream_handle.cc @@ -32,7 +32,6 @@ #include "src/core/lib/debug/trace.h" #include "src/core/lib/iomgr/closure.h" #include "src/core/lib/iomgr/error_cfstream.h" -#include "src/core/lib/iomgr/ev_apple.h" #include "src/core/lib/iomgr/exec_ctx.h" extern grpc_core::TraceFlag grpc_tcp_trace; @@ -148,8 +147,8 @@ CFStreamHandle::CFStreamHandle(CFReadStreamRef read_stream, kCFStreamEventOpenCompleted | kCFStreamEventCanAcceptBytes | kCFStreamEventErrorOccurred | kCFStreamEventEndEncountered, CFStreamHandle::WriteCallback, &ctx); - grpc_apple_register_read_stream(read_stream, dispatch_queue_); - grpc_apple_register_write_stream(write_stream, dispatch_queue_); + CFReadStreamSetDispatchQueue(read_stream, dispatch_queue_); + CFWriteStreamSetDispatchQueue(write_stream, dispatch_queue_); } CFStreamHandle::~CFStreamHandle() { diff --git a/src/core/lib/iomgr/ev_apple.cc b/src/core/lib/iomgr/ev_apple.cc deleted file mode 100644 index d1525828865..00000000000 --- a/src/core/lib/iomgr/ev_apple.cc +++ /dev/null @@ -1,356 +0,0 @@ -/* - * - * Copyright 2020 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -/// Event engine based on Apple's CFRunLoop API family. If the CFRunLoop engine -/// is enabled (see iomgr_posix_cfstream.cc), a global thread is started to -/// handle and trigger all the CFStream events. The CFStream streams register -/// themselves with the run loop with functions grpc_apple_register_read_stream -/// and grpc_apple_register_read_stream. Pollsets are dummy and block on a -/// condition variable in pollset_work(). - -#include - -#include "src/core/lib/iomgr/port.h" - -#ifdef GRPC_APPLE_EV - -#include - -#include - -#include "src/core/lib/gprpp/thd.h" -#include "src/core/lib/iomgr/ev_apple.h" - -grpc_core::DebugOnlyTraceFlag grpc_apple_polling_trace(false, "apple_polling"); - -#ifndef NDEBUG -#define GRPC_POLLING_TRACE(format, ...) \ - if (GRPC_TRACE_FLAG_ENABLED(grpc_apple_polling_trace)) { \ - gpr_log(GPR_DEBUG, "(polling) " format, __VA_ARGS__); \ - } -#else -#define GRPC_POLLING_TRACE(...) -#endif // NDEBUG - -#define GRPC_POLLSET_KICK_BROADCAST ((grpc_pollset_worker*)1) - -struct GlobalRunLoopContext { - grpc_core::CondVar init_cv; - grpc_core::CondVar input_source_cv; - - grpc_core::Mutex mu; - - // Whether an input source registration is pending. Protected by mu. - bool input_source_registered = false; - - // The reference to the global run loop object. Protected by mu. - CFRunLoopRef run_loop; - - // Whether the pollset has been globally shut down. Protected by mu. - bool is_shutdown = false; -}; - -struct GrpcAppleWorker { - // The condition varible to kick the worker. Works with the pollset's lock - // (GrpcApplePollset.mu). - grpc_core::CondVar cv; - - // Whether the worker is kicked. Protected by the pollset's lock - // (GrpcApplePollset.mu). - bool kicked = false; -}; - -struct GrpcApplePollset { - grpc_core::Mutex mu; - - // Tracks the current workers in the pollset. Protected by mu. - std::list workers; - - // Whether the pollset is shut down. Protected by mu. - bool is_shutdown = false; - - // Closure to call when shutdown is done. Protected by mu. - grpc_closure* shutdown_closure; - - // Whether there's an outstanding kick that was not processed. Protected by - // mu. - bool kicked_without_poller = false; -}; - -static GlobalRunLoopContext* gGlobalRunLoopContext = nullptr; -static grpc_core::Thread* gGlobalRunLoopThread = nullptr; - -/// Register the stream with the dispatch queue. Callbacks of the stream will be -/// issued to the dispatch queue when a network event happens and will be -/// managed by Grand Central Dispatch. -static void grpc_apple_register_read_stream_queue( - CFReadStreamRef read_stream, dispatch_queue_t dispatch_queue) { - CFReadStreamSetDispatchQueue(read_stream, dispatch_queue); -} - -/// Register the stream with the dispatch queue. Callbacks of the stream will be -/// issued to the dispatch queue when a network event happens and will be -/// managed by Grand Central Dispatch. -static void grpc_apple_register_write_stream_queue( - CFWriteStreamRef write_stream, dispatch_queue_t dispatch_queue) { - CFWriteStreamSetDispatchQueue(write_stream, dispatch_queue); -} - -/// Register the stream with the global run loop. Callbacks of the stream will -/// be issued to the run loop when a network event happens and will be driven by -/// the global run loop thread gGlobalRunLoopThread. -static void grpc_apple_register_read_stream_run_loop( - CFReadStreamRef read_stream, dispatch_queue_t dispatch_queue) { - GRPC_POLLING_TRACE("Register read stream: %p", read_stream); - grpc_core::MutexLock lock(&gGlobalRunLoopContext->mu); - CFReadStreamScheduleWithRunLoop(read_stream, gGlobalRunLoopContext->run_loop, - kCFRunLoopDefaultMode); - gGlobalRunLoopContext->input_source_registered = true; - gGlobalRunLoopContext->input_source_cv.Signal(); -} - -/// Register the stream with the global run loop. Callbacks of the stream will -/// be issued to the run loop when a network event happens, and will be driven -/// by the global run loop thread gGlobalRunLoopThread. -static void grpc_apple_register_write_stream_run_loop( - CFWriteStreamRef write_stream, dispatch_queue_t dispatch_queue) { - GRPC_POLLING_TRACE("Register write stream: %p", write_stream); - grpc_core::MutexLock lock(&gGlobalRunLoopContext->mu); - CFWriteStreamScheduleWithRunLoop( - write_stream, gGlobalRunLoopContext->run_loop, kCFRunLoopDefaultMode); - gGlobalRunLoopContext->input_source_registered = true; - gGlobalRunLoopContext->input_source_cv.Signal(); -} - -/// The default implementation of stream registration is to register the stream -/// to a dispatch queue. However, if the CFRunLoop based pollset is enabled (by -/// macro and environment variable, see docs in iomgr_posix_cfstream.cc), the -/// CFStream streams are registered with the global run loop instead (see -/// pollset_global_init below). -static void (*grpc_apple_register_read_stream_impl)( - CFReadStreamRef, dispatch_queue_t) = grpc_apple_register_read_stream_queue; -static void (*grpc_apple_register_write_stream_impl)(CFWriteStreamRef, - dispatch_queue_t) = - grpc_apple_register_write_stream_queue; - -void grpc_apple_register_read_stream(CFReadStreamRef read_stream, - dispatch_queue_t dispatch_queue) { - grpc_apple_register_read_stream_impl(read_stream, dispatch_queue); -} - -void grpc_apple_register_write_stream(CFWriteStreamRef write_stream, - dispatch_queue_t dispatch_queue) { - grpc_apple_register_write_stream_impl(write_stream, dispatch_queue); -} - -/// Drive the run loop in a global singleton thread until the global run loop is -/// shutdown. -static void GlobalRunLoopFunc(void* arg) { - grpc_core::ReleasableMutexLock lock(&gGlobalRunLoopContext->mu); - gGlobalRunLoopContext->run_loop = CFRunLoopGetCurrent(); - gGlobalRunLoopContext->init_cv.Signal(); - - while (!gGlobalRunLoopContext->is_shutdown) { - // CFRunLoopRun() will return immediately if no stream is registered on it. - // So we wait on a conditional variable until a stream is registered; - // otherwise we'll be running a spinning loop. - while (!gGlobalRunLoopContext->input_source_registered) { - gGlobalRunLoopContext->input_source_cv.Wait(&gGlobalRunLoopContext->mu); - } - gGlobalRunLoopContext->input_source_registered = false; - lock.Unlock(); - CFRunLoopRun(); - lock.Lock(); - } - lock.Unlock(); -} - -// pollset implementation - -static void pollset_global_init(void) { - gGlobalRunLoopContext = new GlobalRunLoopContext; - - grpc_apple_register_read_stream_impl = - grpc_apple_register_read_stream_run_loop; - grpc_apple_register_write_stream_impl = - grpc_apple_register_write_stream_run_loop; - - grpc_core::MutexLock lock(&gGlobalRunLoopContext->mu); - gGlobalRunLoopThread = - new grpc_core::Thread("apple_ev", GlobalRunLoopFunc, nullptr); - gGlobalRunLoopThread->Start(); - while (gGlobalRunLoopContext->run_loop == NULL) - gGlobalRunLoopContext->init_cv.Wait(&gGlobalRunLoopContext->mu); -} - -static void pollset_global_shutdown(void) { - { - grpc_core::MutexLock lock(&gGlobalRunLoopContext->mu); - gGlobalRunLoopContext->is_shutdown = true; - CFRunLoopStop(gGlobalRunLoopContext->run_loop); - } - gGlobalRunLoopThread->Join(); - delete gGlobalRunLoopThread; - delete gGlobalRunLoopContext; -} - -/// The caller must acquire the lock GrpcApplePollset.mu before calling this -/// function. The lock may be temporarily released when waiting on the condition -/// variable but will be re-acquired before the function returns. -/// -/// The Apple pollset simply waits on a condition variable until it is kicked. -/// The network events are handled in the global run loop thread. Processing of -/// these events will eventually trigger the kick. -static grpc_error* pollset_work(grpc_pollset* pollset, - grpc_pollset_worker** worker, - grpc_millis deadline) { - GRPC_POLLING_TRACE("pollset work: %p, worker: %p, deadline: %" PRIu64, - pollset, worker, deadline); - GrpcApplePollset* apple_pollset = - reinterpret_cast(pollset); - GrpcAppleWorker actual_worker; - if (worker) { - *worker = reinterpret_cast(&actual_worker); - } - - if (apple_pollset->kicked_without_poller) { - // Process the outstanding kick and reset the flag. Do not block. - apple_pollset->kicked_without_poller = false; - } else { - // Block until kicked, timed out, or the pollset shuts down. - apple_pollset->workers.push_front(&actual_worker); - auto it = apple_pollset->workers.begin(); - - while (!actual_worker.kicked && !apple_pollset->is_shutdown) { - if (actual_worker.cv.Wait( - &apple_pollset->mu, - grpc_millis_to_timespec(deadline, GPR_CLOCK_REALTIME))) { - // timed out - break; - } - } - - apple_pollset->workers.erase(it); - - // If the pollset is shut down asynchronously and this is the last pending - // worker, the shutdown process is complete at this moment and the shutdown - // callback will be called. - if (apple_pollset->is_shutdown && apple_pollset->workers.empty()) { - grpc_core::ExecCtx::Run(DEBUG_LOCATION, apple_pollset->shutdown_closure, - GRPC_ERROR_NONE); - } - } - - return GRPC_ERROR_NONE; -} - -/// Kick a specific worker. The caller must acquire the lock GrpcApplePollset.mu -/// before calling this function. -static void kick_worker(GrpcAppleWorker* worker) { - worker->kicked = true; - worker->cv.Signal(); -} - -/// The caller must acquire the lock GrpcApplePollset.mu before calling this -/// function. The kick action simply signals the condition variable of the -/// worker. -static grpc_error* pollset_kick(grpc_pollset* pollset, - grpc_pollset_worker* specific_worker) { - GrpcApplePollset* apple_pollset = - reinterpret_cast(pollset); - - GRPC_POLLING_TRACE("pollset kick: %p, worker:%p", pollset, specific_worker); - - if (specific_worker == nullptr) { - if (apple_pollset->workers.empty()) { - apple_pollset->kicked_without_poller = true; - } else { - GrpcAppleWorker* actual_worker = apple_pollset->workers.front(); - kick_worker(actual_worker); - } - } else if (specific_worker == GRPC_POLLSET_KICK_BROADCAST) { - for (auto& actual_worker : apple_pollset->workers) { - kick_worker(actual_worker); - } - } else { - GrpcAppleWorker* actual_worker = - reinterpret_cast(specific_worker); - kick_worker(actual_worker); - } - - return GRPC_ERROR_NONE; -} - -static void pollset_init(grpc_pollset* pollset, gpr_mu** mu) { - GRPC_POLLING_TRACE("pollset init: %p", pollset); - GrpcApplePollset* apple_pollset = new (pollset) GrpcApplePollset(); - *mu = apple_pollset->mu.get(); -} - -/// The caller must acquire the lock GrpcApplePollset.mu before calling this -/// function. -static void pollset_shutdown(grpc_pollset* pollset, grpc_closure* closure) { - GRPC_POLLING_TRACE("pollset shutdown: %p", pollset); - - GrpcApplePollset* apple_pollset = - reinterpret_cast(pollset); - apple_pollset->is_shutdown = true; - pollset_kick(pollset, GRPC_POLLSET_KICK_BROADCAST); - - // If there is any worker blocked, shutdown will be done asynchronously. - if (apple_pollset->workers.empty()) { - grpc_core::ExecCtx::Run(DEBUG_LOCATION, closure, GRPC_ERROR_NONE); - } else { - apple_pollset->shutdown_closure = closure; - } -} - -static void pollset_destroy(grpc_pollset* pollset) { - GRPC_POLLING_TRACE("pollset destroy: %p", pollset); - GrpcApplePollset* apple_pollset = - reinterpret_cast(pollset); - apple_pollset->~GrpcApplePollset(); -} - -size_t pollset_size(void) { return sizeof(GrpcApplePollset); } - -grpc_pollset_vtable grpc_apple_pollset_vtable = { - pollset_global_init, pollset_global_shutdown, - pollset_init, pollset_shutdown, - pollset_destroy, pollset_work, - pollset_kick, pollset_size}; - -// pollset_set implementation - -grpc_pollset_set* pollset_set_create(void) { return nullptr; } -void pollset_set_destroy(grpc_pollset_set* pollset_set) {} -void pollset_set_add_pollset(grpc_pollset_set* pollset_set, - grpc_pollset* pollset) {} -void pollset_set_del_pollset(grpc_pollset_set* pollset_set, - grpc_pollset* pollset) {} -void pollset_set_add_pollset_set(grpc_pollset_set* bag, - grpc_pollset_set* item) {} -void pollset_set_del_pollset_set(grpc_pollset_set* bag, - grpc_pollset_set* item) {} - -grpc_pollset_set_vtable grpc_apple_pollset_set_vtable = { - pollset_set_create, pollset_set_destroy, - pollset_set_add_pollset, pollset_set_del_pollset, - pollset_set_add_pollset_set, pollset_set_del_pollset_set}; - -#endif diff --git a/src/core/lib/iomgr/ev_apple.h b/src/core/lib/iomgr/ev_apple.h deleted file mode 100644 index a05f91ce15f..00000000000 --- a/src/core/lib/iomgr/ev_apple.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * - * Copyright 2020 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef GRPC_CORE_LIB_IOMGR_EV_APPLE_H -#define GRPC_CORE_LIB_IOMGR_EV_APPLE_H - -#include - -#ifdef GRPC_APPLE_EV - -#include - -#include "src/core/lib/iomgr/pollset.h" -#include "src/core/lib/iomgr/pollset_set.h" - -void grpc_apple_register_read_stream(CFReadStreamRef read_stream, - dispatch_queue_t dispatch_queue); - -void grpc_apple_register_write_stream(CFWriteStreamRef write_stream, - dispatch_queue_t dispatch_queue); - -extern grpc_pollset_vtable grpc_apple_pollset_vtable; - -extern grpc_pollset_set_vtable grpc_apple_pollset_set_vtable; - -#endif - -#endif diff --git a/src/core/lib/iomgr/iomgr_posix_cfstream.cc b/src/core/lib/iomgr/iomgr_posix_cfstream.cc index 24f9f4101b2..72b2ae5eb00 100644 --- a/src/core/lib/iomgr/iomgr_posix_cfstream.cc +++ b/src/core/lib/iomgr/iomgr_posix_cfstream.cc @@ -16,20 +16,6 @@ * */ -/// CFStream is build-enabled on iOS by default and disabled by default on other -/// platforms (see port_platform.h). To enable CFStream build on another -/// platform, the users need to define macro "GRPC_CFSTREAM=1" when building -/// gRPC. -/// -/// When CFStream is to be built (either by default on iOS or by macro on other -/// platforms), the users can disable CFStream with environment variable -/// "grpc_cfstream=0". This will let gRPC to fallback to use POSIX sockets. In -/// addition, the users may choose to use an alternative CFRunLoop based pollset -/// "ev_apple" by setting environment variable "grpc_cfstream_run_loop=1". This -/// pollset resolves a bug from Apple when CFStream streams dispatch events to -/// dispatch queues. The caveat of this pollset is that users may not be able to -/// run a gRPC server in the same process. - #include #include "src/core/lib/iomgr/port.h" @@ -37,7 +23,6 @@ #ifdef GRPC_CFSTREAM_IOMGR #include "src/core/lib/debug/trace.h" -#include "src/core/lib/iomgr/ev_apple.h" #include "src/core/lib/iomgr/ev_posix.h" #include "src/core/lib/iomgr/iomgr_internal.h" #include "src/core/lib/iomgr/iomgr_posix.h" @@ -48,7 +33,6 @@ #include "src/core/lib/iomgr/timer.h" static const char* grpc_cfstream_env_var = "grpc_cfstream"; -static const char* grpc_cfstream_run_loop_env_var = "GRPC_CFSTREAM_RUN_LOOP"; extern grpc_tcp_server_vtable grpc_posix_tcp_server_vtable; extern grpc_tcp_client_vtable grpc_posix_tcp_client_vtable; @@ -58,33 +42,6 @@ extern grpc_pollset_vtable grpc_posix_pollset_vtable; extern grpc_pollset_set_vtable grpc_posix_pollset_set_vtable; extern grpc_address_resolver_vtable grpc_posix_resolver_vtable; -static void apple_iomgr_platform_init(void) { grpc_pollset_global_init(); } - -static void apple_iomgr_platform_flush(void) {} - -static void apple_iomgr_platform_shutdown(void) { - grpc_pollset_global_shutdown(); -} - -static void apple_iomgr_platform_shutdown_background_closure(void) {} - -static bool apple_iomgr_platform_is_any_background_poller_thread(void) { - return false; -} - -static bool apple_iomgr_platform_add_closure_to_background_poller( - grpc_closure* closure, grpc_error* error) { - return false; -} - -static grpc_iomgr_platform_vtable apple_vtable = { - apple_iomgr_platform_init, - apple_iomgr_platform_flush, - apple_iomgr_platform_shutdown, - apple_iomgr_platform_shutdown_background_closure, - apple_iomgr_platform_is_any_background_poller_thread, - apple_iomgr_platform_add_closure_to_background_poller}; - static void iomgr_platform_init(void) { grpc_wakeup_fd_global_init(); grpc_event_engine_init(); @@ -119,53 +76,32 @@ static grpc_iomgr_platform_vtable vtable = { iomgr_platform_add_closure_to_background_poller}; void grpc_set_default_iomgr_platform() { - char* enable_cfstream_str = getenv(grpc_cfstream_env_var); - bool enable_cfstream = - enable_cfstream_str == nullptr || enable_cfstream_str[0] != '0'; - char* enable_cfstream_run_loop_str = getenv(grpc_cfstream_run_loop_env_var); - // CFStream run-loop is disabled by default. The user has to enable it - // explicitly with environment variable. - bool enable_cfstream_run_loop = enable_cfstream_run_loop_str != nullptr && - enable_cfstream_run_loop_str[0] == '1'; - if (!enable_cfstream) { - // Use POSIX sockets for both client and server - grpc_set_tcp_client_impl(&grpc_posix_tcp_client_vtable); - grpc_set_tcp_server_impl(&grpc_posix_tcp_server_vtable); - grpc_set_pollset_vtable(&grpc_posix_pollset_vtable); - grpc_set_pollset_set_vtable(&grpc_posix_pollset_set_vtable); - grpc_set_iomgr_platform_vtable(&vtable); - } else if (enable_cfstream && !enable_cfstream_run_loop) { - // Use CFStream with dispatch queue for client; use POSIX sockets for server - grpc_set_tcp_client_impl(&grpc_cfstream_client_vtable); - grpc_set_tcp_server_impl(&grpc_posix_tcp_server_vtable); - grpc_set_pollset_vtable(&grpc_posix_pollset_vtable); - grpc_set_pollset_set_vtable(&grpc_posix_pollset_set_vtable); - grpc_set_iomgr_platform_vtable(&vtable); - } else { - // Use CFStream with CFRunLoop for client; server not supported - grpc_set_tcp_client_impl(&grpc_cfstream_client_vtable); - grpc_set_pollset_vtable(&grpc_apple_pollset_vtable); - grpc_set_pollset_set_vtable(&grpc_apple_pollset_set_vtable); - grpc_set_iomgr_platform_vtable(&apple_vtable); + char* enable_cfstream = getenv(grpc_cfstream_env_var); + grpc_tcp_client_vtable* client_vtable = &grpc_posix_tcp_client_vtable; + // CFStream is enabled by default on iOS, and disabled by default on other + // platforms. Defaults can be overriden by setting the grpc_cfstream + // environment variable. +#if TARGET_OS_IPHONE + if (enable_cfstream == nullptr || enable_cfstream[0] == '1') { + client_vtable = &grpc_cfstream_client_vtable; } +#else + if (enable_cfstream != nullptr && enable_cfstream[0] == '1') { + client_vtable = &grpc_cfstream_client_vtable; + } +#endif + + grpc_set_tcp_client_impl(client_vtable); + grpc_set_tcp_server_impl(&grpc_posix_tcp_server_vtable); grpc_set_timer_impl(&grpc_generic_timer_vtable); + grpc_set_pollset_vtable(&grpc_posix_pollset_vtable); + grpc_set_pollset_set_vtable(&grpc_posix_pollset_set_vtable); grpc_set_resolver_impl(&grpc_posix_resolver_vtable); + grpc_set_iomgr_platform_vtable(&vtable); } bool grpc_iomgr_run_in_background() { - char* enable_cfstream_str = getenv(grpc_cfstream_env_var); - bool enable_cfstream = - enable_cfstream_str == nullptr || enable_cfstream_str[0] != '0'; - char* enable_cfstream_run_loop_str = getenv(grpc_cfstream_run_loop_env_var); - // CFStream run-loop is disabled by default. The user has to enable it - // explicitly with environment variable. - bool enable_cfstream_run_loop = enable_cfstream_run_loop_str != nullptr && - enable_cfstream_run_loop_str[0] == '1'; - if (enable_cfstream && enable_cfstream_run_loop) { - return false; - } else { - return grpc_event_engine_run_in_background(); - } + return grpc_event_engine_run_in_background(); } #endif /* GRPC_CFSTREAM_IOMGR */ diff --git a/src/core/lib/iomgr/pollset_set_custom.cc b/src/core/lib/iomgr/pollset_set_custom.cc index 2c1df608197..099388f7c5b 100644 --- a/src/core/lib/iomgr/pollset_set_custom.cc +++ b/src/core/lib/iomgr/pollset_set_custom.cc @@ -22,23 +22,23 @@ #include "src/core/lib/iomgr/pollset_set.h" -static grpc_pollset_set* pollset_set_create(void) { +grpc_pollset_set* pollset_set_create(void) { return (grpc_pollset_set*)((intptr_t)0xdeafbeef); } -static void pollset_set_destroy(grpc_pollset_set* /*pollset_set*/) {} +void pollset_set_destroy(grpc_pollset_set* /*pollset_set*/) {} -static void pollset_set_add_pollset(grpc_pollset_set* /*pollset_set*/, - grpc_pollset* /*pollset*/) {} +void pollset_set_add_pollset(grpc_pollset_set* /*pollset_set*/, + grpc_pollset* /*pollset*/) {} -static void pollset_set_del_pollset(grpc_pollset_set* /*pollset_set*/, - grpc_pollset* /*pollset*/) {} +void pollset_set_del_pollset(grpc_pollset_set* /*pollset_set*/, + grpc_pollset* /*pollset*/) {} -static void pollset_set_add_pollset_set(grpc_pollset_set* /*bag*/, - grpc_pollset_set* /*item*/) {} +void pollset_set_add_pollset_set(grpc_pollset_set* /*bag*/, + grpc_pollset_set* /*item*/) {} -static void pollset_set_del_pollset_set(grpc_pollset_set* /*bag*/, - grpc_pollset_set* /*item*/) {} +void pollset_set_del_pollset_set(grpc_pollset_set* /*bag*/, + grpc_pollset_set* /*item*/) {} static grpc_pollset_set_vtable vtable = { pollset_set_create, pollset_set_destroy, diff --git a/src/core/lib/iomgr/port.h b/src/core/lib/iomgr/port.h index 211423e643d..1d2e9506451 100644 --- a/src/core/lib/iomgr/port.h +++ b/src/core/lib/iomgr/port.h @@ -129,7 +129,6 @@ #define GRPC_CFSTREAM_IOMGR 1 #define GRPC_CFSTREAM_CLIENT 1 #define GRPC_CFSTREAM_ENDPOINT 1 -#define GRPC_APPLE_EV 1 #define GRPC_POSIX_SOCKET_ARES_EV_DRIVER 1 #define GRPC_POSIX_SOCKET_EV 1 #define GRPC_POSIX_SOCKET_EV_EPOLL1 1 diff --git a/src/objective-c/tests/Tests.xcodeproj/xcshareddata/xcschemes/InteropTests.xcscheme b/src/objective-c/tests/Tests.xcodeproj/xcshareddata/xcschemes/InteropTests.xcscheme index d4557937965..cbde360a338 100644 --- a/src/objective-c/tests/Tests.xcodeproj/xcshareddata/xcschemes/InteropTests.xcscheme +++ b/src/objective-c/tests/Tests.xcodeproj/xcshareddata/xcschemes/InteropTests.xcscheme @@ -66,13 +66,8 @@ ReferencedContainer = "container:Tests.xcodeproj"> - - - - + + - - - - + + - - - - + + - - - - + + - - - - + + Date: Thu, 16 Apr 2020 11:37:53 -0700 Subject: [PATCH 514/758] Reviewer comments --- BUILD | 2 +- include/grpc/impl/codegen/grpc_types.h | 4 ++-- .../message_decompress_filter.cc | 2 +- .../message_decompress_filter.h | 6 ++--- test/core/end2end/tests/compressed_payload.cc | 22 +++++++++---------- .../tests/workaround_cronet_compression.cc | 9 ++++---- 6 files changed, 22 insertions(+), 23 deletions(-) rename src/core/ext/filters/http/{message_decompress => message_compress}/message_decompress_filter.cc (99%) rename src/core/ext/filters/http/{message_decompress => message_compress}/message_decompress_filter.h (75%) diff --git a/BUILD b/BUILD index 00cbedae6e7..c6269910057 100644 --- a/BUILD +++ b/BUILD @@ -1193,7 +1193,7 @@ grpc_cc_library( "src/core/ext/filters/http/client/http_client_filter.cc", "src/core/ext/filters/http/http_filters_plugin.cc", "src/core/ext/filters/http/message_compress/message_compress_filter.cc", - "src/core/ext/filters/http/message_decompress/message_decompress_filter.cc", + "src/core/ext/filters/http/message_compress/message_decompress_filter.cc", "src/core/ext/filters/http/server/http_server_filter.cc", ], hdrs = [ diff --git a/include/grpc/impl/codegen/grpc_types.h b/include/grpc/impl/codegen/grpc_types.h index 91df2508a6f..3f52b17c167 100644 --- a/include/grpc/impl/codegen/grpc_types.h +++ b/include/grpc/impl/codegen/grpc_types.h @@ -177,8 +177,8 @@ typedef struct { /** Experimental Arg. Enable/disable support for per-message decompression. Defaults to 1. If disabled, decompression will not be performed and the application will see the compressed message in the byte buffer. */ -#define GRPC_ARG_ENABLE_PER_MESSAGE_DECOMPRESSION_INSIDE_CORE \ - "grpc.per_message_decompression_inside_core" +#define GRPC_ARG_ENABLE_PER_MESSAGE_DECOMPRESSION \ + "grpc.per_message_decompression" /** Enable/disable support for deadline checking. Defaults to 1, unless GRPC_ARG_MINIMAL_STACK is enabled, in which case it defaults to 0 */ #define GRPC_ARG_ENABLE_DEADLINE_CHECKS "grpc.enable_deadline_checking" diff --git a/src/core/ext/filters/http/message_decompress/message_decompress_filter.cc b/src/core/ext/filters/http/message_compress/message_decompress_filter.cc similarity index 99% rename from src/core/ext/filters/http/message_decompress/message_decompress_filter.cc rename to src/core/ext/filters/http/message_compress/message_decompress_filter.cc index 18a411d723b..d12f4013bb2 100644 --- a/src/core/ext/filters/http/message_decompress/message_decompress_filter.cc +++ b/src/core/ext/filters/http/message_compress/message_decompress_filter.cc @@ -27,7 +27,7 @@ #include #include -#include "src/core/ext/filters/http/message_decompress/message_decompress_filter.h" +#include "src/core/ext/filters/http/message_compress/message_decompress_filter.h" #include "src/core/lib/channel/channel_args.h" #include "src/core/lib/compression/algorithm_metadata.h" #include "src/core/lib/compression/compression_args.h" diff --git a/src/core/ext/filters/http/message_decompress/message_decompress_filter.h b/src/core/ext/filters/http/message_compress/message_decompress_filter.h similarity index 75% rename from src/core/ext/filters/http/message_decompress/message_decompress_filter.h rename to src/core/ext/filters/http/message_compress/message_decompress_filter.h index 1dac6be01a1..7d567bf08a2 100644 --- a/src/core/ext/filters/http/message_decompress/message_decompress_filter.h +++ b/src/core/ext/filters/http/message_compress/message_decompress_filter.h @@ -16,8 +16,8 @@ // // -#ifndef GRPC_CORE_EXT_FILTERS_HTTP_MESSAGE_DECOMPRESS_MESSAGE_DECOMPRESS_FILTER_H -#define GRPC_CORE_EXT_FILTERS_HTTP_MESSAGE_DECOMPRESS_MESSAGE_DECOMPRESS_FILTER_H +#ifndef GRPC_CORE_EXT_FILTERS_HTTP_MESSAGE_COMPRESS_MESSAGE_DECOMPRESS_FILTER_H +#define GRPC_CORE_EXT_FILTERS_HTTP_MESSAGE_COMPRESS_MESSAGE_DECOMPRESS_FILTER_H #include @@ -25,5 +25,5 @@ extern const grpc_channel_filter grpc_message_decompress_filter; -#endif /* GRPC_CORE_EXT_FILTERS_HTTP_MESSAGE_DECOMPRESS_MESSAGE_DECOMPRESS_FILTER_H \ +#endif /* GRPC_CORE_EXT_FILTERS_HTTP_MESSAGE_COMPRESS_MESSAGE_DECOMPRESS_FILTER_H \ */ diff --git a/test/core/end2end/tests/compressed_payload.cc b/test/core/end2end/tests/compressed_payload.cc index 6441c1c9633..48286485aee 100644 --- a/test/core/end2end/tests/compressed_payload.cc +++ b/test/core/end2end/tests/compressed_payload.cc @@ -41,9 +41,12 @@ static void* tag(intptr_t t) { return (void*)t; } static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config, const char* test_name, grpc_channel_args* client_args, - grpc_channel_args* server_args) { + grpc_channel_args* server_args, + bool decompress_in_core) { grpc_end2end_test_fixture f; - gpr_log(GPR_INFO, "Running test: %s/%s", test_name, config.name); + gpr_log(GPR_INFO, "Running test: %s%s/%s", + decompress_in_core ? "" : "_with_decompression_disabled", test_name, + config.name); f = config.create_fixture(client_args, server_args); config.init_server(&f, server_args); config.init_client(&f, client_args); @@ -134,9 +137,7 @@ static void request_for_disabled_algorithm( if (!decompress_in_core) { grpc_arg disable_decompression_in_core_arg = grpc_channel_arg_integer_create( - const_cast( - GRPC_ARG_ENABLE_PER_MESSAGE_DECOMPRESSION_INSIDE_CORE), - 0); + const_cast(GRPC_ARG_ENABLE_PER_MESSAGE_DECOMPRESSION), 0); grpc_channel_args* old_client_args = client_args; grpc_channel_args* old_server_args = server_args; client_args = grpc_channel_args_copy_and_add( @@ -147,7 +148,8 @@ static void request_for_disabled_algorithm( grpc_channel_args_destroy(old_server_args); } - f = begin_test(config, test_name, client_args, server_args); + f = begin_test(config, test_name, client_args, server_args, + decompress_in_core); cqv = cq_verifier_create(f.cq); gpr_timespec deadline = five_seconds_from_now(); @@ -323,9 +325,7 @@ static void request_with_payload_template_inner( if (!decompress_in_core) { grpc_arg disable_decompression_in_core_arg = grpc_channel_arg_integer_create( - const_cast( - GRPC_ARG_ENABLE_PER_MESSAGE_DECOMPRESSION_INSIDE_CORE), - 0); + const_cast(GRPC_ARG_ENABLE_PER_MESSAGE_DECOMPRESSION), 0); grpc_channel_args* old_client_args = client_args; grpc_channel_args* old_server_args = server_args; client_args = grpc_channel_args_copy_and_add( @@ -335,7 +335,8 @@ static void request_with_payload_template_inner( grpc_channel_args_destroy(old_client_args); grpc_channel_args_destroy(old_server_args); } - f = begin_test(config, test_name, client_args, server_args); + f = begin_test(config, test_name, client_args, server_args, + decompress_in_core); cqv = cq_verifier_create(f.cq); gpr_timespec deadline = five_seconds_from_now(); @@ -491,7 +492,6 @@ static void request_with_payload_template_inner( cq_verify(cqv); GPR_ASSERT(response_payload_recv->type == GRPC_BB_RAW); - gpr_log(GPR_ERROR, "%d", decompress_in_core); GPR_ASSERT(byte_buffer_eq_string(response_payload_recv, response_str)); if (server_compression_level > GRPC_COMPRESS_LEVEL_NONE) { const grpc_compression_algorithm algo_for_server_level = diff --git a/test/core/end2end/tests/workaround_cronet_compression.cc b/test/core/end2end/tests/workaround_cronet_compression.cc index 595562b2d82..5ffb477aebc 100644 --- a/test/core/end2end/tests/workaround_cronet_compression.cc +++ b/test/core/end2end/tests/workaround_cronet_compression.cc @@ -143,9 +143,7 @@ static void request_with_payload_template( if (!decompress_in_core) { grpc_arg disable_decompression_in_core_arg = grpc_channel_arg_integer_create( - const_cast( - GRPC_ARG_ENABLE_PER_MESSAGE_DECOMPRESSION_INSIDE_CORE), - 0); + const_cast(GRPC_ARG_ENABLE_PER_MESSAGE_DECOMPRESSION), 0); grpc_channel_args* old_client_args = client_args; grpc_channel_args* old_server_args = server_args; client_args = grpc_channel_args_copy_and_add( @@ -401,8 +399,9 @@ static void test_workaround_cronet_compression( /* ignored */ GRPC_COMPRESS_LEVEL_NONE, workaround_configs[i].user_agent_override, true); request_with_payload_template( - config, "test_invoke_request_with_compressed_payload", 0, - GRPC_COMPRESS_GZIP, GRPC_COMPRESS_GZIP, GRPC_COMPRESS_GZIP, + config, + "test_invoke_request_with_compressed_payload_with_compression_disabled", + 0, GRPC_COMPRESS_GZIP, GRPC_COMPRESS_GZIP, GRPC_COMPRESS_GZIP, workaround_configs[i].expected_algorithm_from_server, nullptr, false, /* ignored */ GRPC_COMPRESS_LEVEL_NONE, workaround_configs[i].user_agent_override, false); From e24bb3a6ef9a377bee6ff5cf9af9db7112c47588 Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Thu, 16 Apr 2020 11:46:29 -0700 Subject: [PATCH 515/758] Regenerate projects --- BUILD.gn | 2 +- CMakeLists.txt | 4 ++-- Makefile | 4 ++-- build_autogenerated.yaml | 4 ++-- config.m4 | 3 +-- config.w32 | 3 +-- gRPC-Core.podspec | 2 +- grpc.gemspec | 2 +- grpc.gyp | 4 ++-- package.xml | 2 +- src/python/grpcio/grpc_core_dependencies.py | 2 +- tools/doxygen/Doxyfile.c++.internal | 2 +- tools/doxygen/Doxyfile.core.internal | 2 +- 13 files changed, 17 insertions(+), 19 deletions(-) diff --git a/BUILD.gn b/BUILD.gn index 94ba02bed75..e4bd155c305 100644 --- a/BUILD.gn +++ b/BUILD.gn @@ -318,7 +318,7 @@ config("grpc_config") { "src/core/ext/filters/http/http_filters_plugin.cc", "src/core/ext/filters/http/message_compress/message_compress_filter.cc", "src/core/ext/filters/http/message_compress/message_compress_filter.h", - "src/core/ext/filters/http/message_decompress/message_decompress_filter.cc", + "src/core/ext/filters/http/message_compress/message_decompress_filter.cc", "src/core/ext/filters/http/message_decompress/message_decompress_filter.h", "src/core/ext/filters/http/server/http_server_filter.cc", "src/core/ext/filters/http/server/http_server_filter.h", diff --git a/CMakeLists.txt b/CMakeLists.txt index bcd98a9dd73..66995e5bfae 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1369,7 +1369,7 @@ add_library(grpc src/core/ext/filters/http/client_authority_filter.cc src/core/ext/filters/http/http_filters_plugin.cc src/core/ext/filters/http/message_compress/message_compress_filter.cc - src/core/ext/filters/http/message_decompress/message_decompress_filter.cc + src/core/ext/filters/http/message_compress/message_decompress_filter.cc src/core/ext/filters/http/server/http_server_filter.cc src/core/ext/filters/max_age/max_age_filter.cc src/core/ext/filters/message_size/message_size_filter.cc @@ -2029,7 +2029,7 @@ add_library(grpc_unsecure src/core/ext/filters/http/client_authority_filter.cc src/core/ext/filters/http/http_filters_plugin.cc src/core/ext/filters/http/message_compress/message_compress_filter.cc - src/core/ext/filters/http/message_decompress/message_decompress_filter.cc + src/core/ext/filters/http/message_compress/message_decompress_filter.cc src/core/ext/filters/http/server/http_server_filter.cc src/core/ext/filters/max_age/max_age_filter.cc src/core/ext/filters/message_size/message_size_filter.cc diff --git a/Makefile b/Makefile index b99620e7207..591c92bc016 100644 --- a/Makefile +++ b/Makefile @@ -3694,7 +3694,7 @@ LIBGRPC_SRC = \ src/core/ext/filters/http/client_authority_filter.cc \ src/core/ext/filters/http/http_filters_plugin.cc \ src/core/ext/filters/http/message_compress/message_compress_filter.cc \ - src/core/ext/filters/http/message_decompress/message_decompress_filter.cc \ + src/core/ext/filters/http/message_compress/message_decompress_filter.cc \ src/core/ext/filters/http/server/http_server_filter.cc \ src/core/ext/filters/max_age/max_age_filter.cc \ src/core/ext/filters/message_size/message_size_filter.cc \ @@ -4328,7 +4328,7 @@ LIBGRPC_UNSECURE_SRC = \ src/core/ext/filters/http/client_authority_filter.cc \ src/core/ext/filters/http/http_filters_plugin.cc \ src/core/ext/filters/http/message_compress/message_compress_filter.cc \ - src/core/ext/filters/http/message_decompress/message_decompress_filter.cc \ + src/core/ext/filters/http/message_compress/message_decompress_filter.cc \ src/core/ext/filters/http/server/http_server_filter.cc \ src/core/ext/filters/max_age/max_age_filter.cc \ src/core/ext/filters/message_size/message_size_filter.cc \ diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml index e7fc808d798..5e4a04fa25c 100644 --- a/build_autogenerated.yaml +++ b/build_autogenerated.yaml @@ -796,7 +796,7 @@ libs: - src/core/ext/filters/http/client_authority_filter.cc - src/core/ext/filters/http/http_filters_plugin.cc - src/core/ext/filters/http/message_compress/message_compress_filter.cc - - src/core/ext/filters/http/message_decompress/message_decompress_filter.cc + - src/core/ext/filters/http/message_compress/message_decompress_filter.cc - src/core/ext/filters/http/server/http_server_filter.cc - src/core/ext/filters/max_age/max_age_filter.cc - src/core/ext/filters/message_size/message_size_filter.cc @@ -1635,7 +1635,7 @@ libs: - src/core/ext/filters/http/client_authority_filter.cc - src/core/ext/filters/http/http_filters_plugin.cc - src/core/ext/filters/http/message_compress/message_compress_filter.cc - - src/core/ext/filters/http/message_decompress/message_decompress_filter.cc + - src/core/ext/filters/http/message_compress/message_decompress_filter.cc - src/core/ext/filters/http/server/http_server_filter.cc - src/core/ext/filters/max_age/max_age_filter.cc - src/core/ext/filters/message_size/message_size_filter.cc diff --git a/config.m4 b/config.m4 index 4a252459015..08e8d159803 100644 --- a/config.m4 +++ b/config.m4 @@ -104,7 +104,7 @@ if test "$PHP_GRPC" != "no"; then src/core/ext/filters/http/client_authority_filter.cc \ src/core/ext/filters/http/http_filters_plugin.cc \ src/core/ext/filters/http/message_compress/message_compress_filter.cc \ - src/core/ext/filters/http/message_decompress/message_decompress_filter.cc \ + src/core/ext/filters/http/message_compress/message_decompress_filter.cc \ src/core/ext/filters/http/server/http_server_filter.cc \ src/core/ext/filters/max_age/max_age_filter.cc \ src/core/ext/filters/message_size/message_size_filter.cc \ @@ -842,7 +842,6 @@ if test "$PHP_GRPC" != "no"; then PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/http) PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/http/client) PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/http/message_compress) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/http/message_decompress) PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/http/server) PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/max_age) PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/message_size) diff --git a/config.w32 b/config.w32 index afdf09c9c39..557bfc033fb 100644 --- a/config.w32 +++ b/config.w32 @@ -73,7 +73,7 @@ if (PHP_GRPC != "no") { "src\\core\\ext\\filters\\http\\client_authority_filter.cc " + "src\\core\\ext\\filters\\http\\http_filters_plugin.cc " + "src\\core\\ext\\filters\\http\\message_compress\\message_compress_filter.cc " + - "src\\core\\ext\\filters\\http\\message_decompress\\message_decompress_filter.cc " + + "src\\core\\ext\\filters\\http\\message_compress\\message_decompress_filter.cc " + "src\\core\\ext\\filters\\http\\server\\http_server_filter.cc " + "src\\core\\ext\\filters\\max_age\\max_age_filter.cc " + "src\\core\\ext\\filters\\message_size\\message_size_filter.cc " + @@ -843,7 +843,6 @@ if (PHP_GRPC != "no") { FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\http"); FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\http\\client"); FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\http\\message_compress"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\http\\message_decompress"); FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\http\\server"); FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\max_age"); FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\message_size"); diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec index b75f502128d..085ab89b070 100644 --- a/gRPC-Core.podspec +++ b/gRPC-Core.podspec @@ -301,7 +301,7 @@ Pod::Spec.new do |s| 'src/core/ext/filters/http/http_filters_plugin.cc', 'src/core/ext/filters/http/message_compress/message_compress_filter.cc', 'src/core/ext/filters/http/message_compress/message_compress_filter.h', - 'src/core/ext/filters/http/message_decompress/message_decompress_filter.cc', + 'src/core/ext/filters/http/message_compress/message_decompress_filter.cc', 'src/core/ext/filters/http/message_decompress/message_decompress_filter.h', 'src/core/ext/filters/http/server/http_server_filter.cc', 'src/core/ext/filters/http/server/http_server_filter.h', diff --git a/grpc.gemspec b/grpc.gemspec index e902a7c29fc..e04a46e289a 100644 --- a/grpc.gemspec +++ b/grpc.gemspec @@ -223,7 +223,7 @@ Gem::Specification.new do |s| s.files += %w( src/core/ext/filters/http/http_filters_plugin.cc ) s.files += %w( src/core/ext/filters/http/message_compress/message_compress_filter.cc ) s.files += %w( src/core/ext/filters/http/message_compress/message_compress_filter.h ) - s.files += %w( src/core/ext/filters/http/message_decompress/message_decompress_filter.cc ) + s.files += %w( src/core/ext/filters/http/message_compress/message_decompress_filter.cc ) s.files += %w( src/core/ext/filters/http/message_decompress/message_decompress_filter.h ) s.files += %w( src/core/ext/filters/http/server/http_server_filter.cc ) s.files += %w( src/core/ext/filters/http/server/http_server_filter.h ) diff --git a/grpc.gyp b/grpc.gyp index 458eae5e114..c43d6459f8e 100644 --- a/grpc.gyp +++ b/grpc.gyp @@ -497,7 +497,7 @@ 'src/core/ext/filters/http/client_authority_filter.cc', 'src/core/ext/filters/http/http_filters_plugin.cc', 'src/core/ext/filters/http/message_compress/message_compress_filter.cc', - 'src/core/ext/filters/http/message_decompress/message_decompress_filter.cc', + 'src/core/ext/filters/http/message_compress/message_decompress_filter.cc', 'src/core/ext/filters/http/server/http_server_filter.cc', 'src/core/ext/filters/max_age/max_age_filter.cc', 'src/core/ext/filters/message_size/message_size_filter.cc', @@ -993,7 +993,7 @@ 'src/core/ext/filters/http/client_authority_filter.cc', 'src/core/ext/filters/http/http_filters_plugin.cc', 'src/core/ext/filters/http/message_compress/message_compress_filter.cc', - 'src/core/ext/filters/http/message_decompress/message_decompress_filter.cc', + 'src/core/ext/filters/http/message_compress/message_decompress_filter.cc', 'src/core/ext/filters/http/server/http_server_filter.cc', 'src/core/ext/filters/max_age/max_age_filter.cc', 'src/core/ext/filters/message_size/message_size_filter.cc', diff --git a/package.xml b/package.xml index 5391f709cd3..f21a8d2ea3d 100644 --- a/package.xml +++ b/package.xml @@ -203,7 +203,7 @@ - + diff --git a/src/python/grpcio/grpc_core_dependencies.py b/src/python/grpcio/grpc_core_dependencies.py index 607eb74c354..4b310cc2b9c 100644 --- a/src/python/grpcio/grpc_core_dependencies.py +++ b/src/python/grpcio/grpc_core_dependencies.py @@ -82,7 +82,7 @@ CORE_SOURCE_FILES = [ 'src/core/ext/filters/http/client_authority_filter.cc', 'src/core/ext/filters/http/http_filters_plugin.cc', 'src/core/ext/filters/http/message_compress/message_compress_filter.cc', - 'src/core/ext/filters/http/message_decompress/message_decompress_filter.cc', + 'src/core/ext/filters/http/message_compress/message_decompress_filter.cc', 'src/core/ext/filters/http/server/http_server_filter.cc', 'src/core/ext/filters/max_age/max_age_filter.cc', 'src/core/ext/filters/message_size/message_size_filter.cc', diff --git a/tools/doxygen/Doxyfile.c++.internal b/tools/doxygen/Doxyfile.c++.internal index 3e9f42468a0..b1f47a8ca7c 100644 --- a/tools/doxygen/Doxyfile.c++.internal +++ b/tools/doxygen/Doxyfile.c++.internal @@ -1186,7 +1186,7 @@ src/core/ext/filters/http/client_authority_filter.h \ src/core/ext/filters/http/http_filters_plugin.cc \ src/core/ext/filters/http/message_compress/message_compress_filter.cc \ src/core/ext/filters/http/message_compress/message_compress_filter.h \ -src/core/ext/filters/http/message_decompress/message_decompress_filter.cc \ +src/core/ext/filters/http/message_compress/message_decompress_filter.cc \ src/core/ext/filters/http/message_decompress/message_decompress_filter.h \ src/core/ext/filters/http/server/http_server_filter.cc \ src/core/ext/filters/http/server/http_server_filter.h \ diff --git a/tools/doxygen/Doxyfile.core.internal b/tools/doxygen/Doxyfile.core.internal index 8b6f9a7cb3c..efe79d4f074 100644 --- a/tools/doxygen/Doxyfile.core.internal +++ b/tools/doxygen/Doxyfile.core.internal @@ -986,7 +986,7 @@ src/core/ext/filters/http/client_authority_filter.h \ src/core/ext/filters/http/http_filters_plugin.cc \ src/core/ext/filters/http/message_compress/message_compress_filter.cc \ src/core/ext/filters/http/message_compress/message_compress_filter.h \ -src/core/ext/filters/http/message_decompress/message_decompress_filter.cc \ +src/core/ext/filters/http/message_compress/message_decompress_filter.cc \ src/core/ext/filters/http/message_decompress/message_decompress_filter.h \ src/core/ext/filters/http/server/http_server_filter.cc \ src/core/ext/filters/http/server/http_server_filter.h \ From eac197b20e70e746f6a2474ece07102d25232835 Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Thu, 16 Apr 2020 11:54:27 -0700 Subject: [PATCH 516/758] Fix errors and regenerate projects --- BUILD | 2 +- BUILD.gn | 2 +- build_autogenerated.yaml | 4 ++-- gRPC-C++.podspec | 4 ++-- gRPC-Core.podspec | 4 ++-- grpc.gemspec | 2 +- package.xml | 2 +- src/core/ext/filters/http/http_filters_plugin.cc | 5 ++--- tools/doxygen/Doxyfile.c++.internal | 2 +- tools/doxygen/Doxyfile.core.internal | 2 +- 10 files changed, 14 insertions(+), 15 deletions(-) diff --git a/BUILD b/BUILD index c6269910057..9dcca83cace 100644 --- a/BUILD +++ b/BUILD @@ -1199,7 +1199,7 @@ grpc_cc_library( hdrs = [ "src/core/ext/filters/http/client/http_client_filter.h", "src/core/ext/filters/http/message_compress/message_compress_filter.h", - "src/core/ext/filters/http/message_decompress/message_decompress_filter.h", + "src/core/ext/filters/http/message_compress/message_decompress_filter.h", "src/core/ext/filters/http/server/http_server_filter.h", ], language = "c++", diff --git a/BUILD.gn b/BUILD.gn index e4bd155c305..f1536af4463 100644 --- a/BUILD.gn +++ b/BUILD.gn @@ -319,7 +319,7 @@ config("grpc_config") { "src/core/ext/filters/http/message_compress/message_compress_filter.cc", "src/core/ext/filters/http/message_compress/message_compress_filter.h", "src/core/ext/filters/http/message_compress/message_decompress_filter.cc", - "src/core/ext/filters/http/message_decompress/message_decompress_filter.h", + "src/core/ext/filters/http/message_compress/message_decompress_filter.h", "src/core/ext/filters/http/server/http_server_filter.cc", "src/core/ext/filters/http/server/http_server_filter.h", "src/core/ext/filters/max_age/max_age_filter.cc", diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml index 5e4a04fa25c..5b7e073cbda 100644 --- a/build_autogenerated.yaml +++ b/build_autogenerated.yaml @@ -423,7 +423,7 @@ libs: - src/core/ext/filters/http/client/http_client_filter.h - src/core/ext/filters/http/client_authority_filter.h - src/core/ext/filters/http/message_compress/message_compress_filter.h - - src/core/ext/filters/http/message_decompress/message_decompress_filter.h + - src/core/ext/filters/http/message_compress/message_decompress_filter.h - src/core/ext/filters/http/server/http_server_filter.h - src/core/ext/filters/max_age/max_age_filter.h - src/core/ext/filters/message_size/message_size_filter.h @@ -1327,7 +1327,7 @@ libs: - src/core/ext/filters/http/client/http_client_filter.h - src/core/ext/filters/http/client_authority_filter.h - src/core/ext/filters/http/message_compress/message_compress_filter.h - - src/core/ext/filters/http/message_decompress/message_decompress_filter.h + - src/core/ext/filters/http/message_compress/message_decompress_filter.h - src/core/ext/filters/http/server/http_server_filter.h - src/core/ext/filters/max_age/max_age_filter.h - src/core/ext/filters/message_size/message_size_filter.h diff --git a/gRPC-C++.podspec b/gRPC-C++.podspec index bda48ecdd6d..6393cfb5217 100644 --- a/gRPC-C++.podspec +++ b/gRPC-C++.podspec @@ -274,7 +274,7 @@ Pod::Spec.new do |s| 'src/core/ext/filters/http/client/http_client_filter.h', 'src/core/ext/filters/http/client_authority_filter.h', 'src/core/ext/filters/http/message_compress/message_compress_filter.h', - 'src/core/ext/filters/http/message_decompress/message_decompress_filter.h', + 'src/core/ext/filters/http/message_compress/message_decompress_filter.h', 'src/core/ext/filters/http/server/http_server_filter.h', 'src/core/ext/filters/max_age/max_age_filter.h', 'src/core/ext/filters/message_size/message_size_filter.h', @@ -726,7 +726,7 @@ Pod::Spec.new do |s| 'src/core/ext/filters/http/client/http_client_filter.h', 'src/core/ext/filters/http/client_authority_filter.h', 'src/core/ext/filters/http/message_compress/message_compress_filter.h', - 'src/core/ext/filters/http/message_decompress/message_decompress_filter.h', + 'src/core/ext/filters/http/message_compress/message_decompress_filter.h', 'src/core/ext/filters/http/server/http_server_filter.h', 'src/core/ext/filters/max_age/max_age_filter.h', 'src/core/ext/filters/message_size/message_size_filter.h', diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec index 085ab89b070..ed08bfd08c5 100644 --- a/gRPC-Core.podspec +++ b/gRPC-Core.podspec @@ -302,7 +302,7 @@ Pod::Spec.new do |s| 'src/core/ext/filters/http/message_compress/message_compress_filter.cc', 'src/core/ext/filters/http/message_compress/message_compress_filter.h', 'src/core/ext/filters/http/message_compress/message_decompress_filter.cc', - 'src/core/ext/filters/http/message_decompress/message_decompress_filter.h', + 'src/core/ext/filters/http/message_compress/message_decompress_filter.h', 'src/core/ext/filters/http/server/http_server_filter.cc', 'src/core/ext/filters/http/server/http_server_filter.h', 'src/core/ext/filters/max_age/max_age_filter.cc', @@ -1080,7 +1080,7 @@ Pod::Spec.new do |s| 'src/core/ext/filters/http/client/http_client_filter.h', 'src/core/ext/filters/http/client_authority_filter.h', 'src/core/ext/filters/http/message_compress/message_compress_filter.h', - 'src/core/ext/filters/http/message_decompress/message_decompress_filter.h', + 'src/core/ext/filters/http/message_compress/message_decompress_filter.h', 'src/core/ext/filters/http/server/http_server_filter.h', 'src/core/ext/filters/max_age/max_age_filter.h', 'src/core/ext/filters/message_size/message_size_filter.h', diff --git a/grpc.gemspec b/grpc.gemspec index e04a46e289a..8de1b7ec83a 100644 --- a/grpc.gemspec +++ b/grpc.gemspec @@ -224,7 +224,7 @@ Gem::Specification.new do |s| s.files += %w( src/core/ext/filters/http/message_compress/message_compress_filter.cc ) s.files += %w( src/core/ext/filters/http/message_compress/message_compress_filter.h ) s.files += %w( src/core/ext/filters/http/message_compress/message_decompress_filter.cc ) - s.files += %w( src/core/ext/filters/http/message_decompress/message_decompress_filter.h ) + s.files += %w( src/core/ext/filters/http/message_compress/message_decompress_filter.h ) s.files += %w( src/core/ext/filters/http/server/http_server_filter.cc ) s.files += %w( src/core/ext/filters/http/server/http_server_filter.h ) s.files += %w( src/core/ext/filters/max_age/max_age_filter.cc ) diff --git a/package.xml b/package.xml index f21a8d2ea3d..3481a55289b 100644 --- a/package.xml +++ b/package.xml @@ -204,7 +204,7 @@ - + diff --git a/src/core/ext/filters/http/http_filters_plugin.cc b/src/core/ext/filters/http/http_filters_plugin.cc index e7024a2b61b..4094ffa8a03 100644 --- a/src/core/ext/filters/http/http_filters_plugin.cc +++ b/src/core/ext/filters/http/http_filters_plugin.cc @@ -22,7 +22,7 @@ #include "src/core/ext/filters/http/client/http_client_filter.h" #include "src/core/ext/filters/http/message_compress/message_compress_filter.h" -#include "src/core/ext/filters/http/message_decompress/message_decompress_filter.h" +#include "src/core/ext/filters/http/message_compress/message_decompress_filter.h" #include "src/core/ext/filters/http/server/http_server_filter.h" #include "src/core/lib/channel/channel_stack_builder.h" #include "src/core/lib/surface/call.h" @@ -38,8 +38,7 @@ static optional_filter compress_filter = { &grpc_message_compress_filter, GRPC_ARG_ENABLE_PER_MESSAGE_COMPRESSION}; static optional_filter decompress_filter = { - &grpc_message_decompress_filter, - GRPC_ARG_ENABLE_PER_MESSAGE_DECOMPRESSION_INSIDE_CORE}; + &grpc_message_decompress_filter, GRPC_ARG_ENABLE_PER_MESSAGE_DECOMPRESSION}; static bool is_building_http_like_transport( grpc_channel_stack_builder* builder) { diff --git a/tools/doxygen/Doxyfile.c++.internal b/tools/doxygen/Doxyfile.c++.internal index b1f47a8ca7c..a9d06ac2015 100644 --- a/tools/doxygen/Doxyfile.c++.internal +++ b/tools/doxygen/Doxyfile.c++.internal @@ -1187,7 +1187,7 @@ src/core/ext/filters/http/http_filters_plugin.cc \ src/core/ext/filters/http/message_compress/message_compress_filter.cc \ src/core/ext/filters/http/message_compress/message_compress_filter.h \ src/core/ext/filters/http/message_compress/message_decompress_filter.cc \ -src/core/ext/filters/http/message_decompress/message_decompress_filter.h \ +src/core/ext/filters/http/message_compress/message_decompress_filter.h \ src/core/ext/filters/http/server/http_server_filter.cc \ src/core/ext/filters/http/server/http_server_filter.h \ src/core/ext/filters/max_age/max_age_filter.cc \ diff --git a/tools/doxygen/Doxyfile.core.internal b/tools/doxygen/Doxyfile.core.internal index efe79d4f074..ef9d14d18b7 100644 --- a/tools/doxygen/Doxyfile.core.internal +++ b/tools/doxygen/Doxyfile.core.internal @@ -987,7 +987,7 @@ src/core/ext/filters/http/http_filters_plugin.cc \ src/core/ext/filters/http/message_compress/message_compress_filter.cc \ src/core/ext/filters/http/message_compress/message_compress_filter.h \ src/core/ext/filters/http/message_compress/message_decompress_filter.cc \ -src/core/ext/filters/http/message_decompress/message_decompress_filter.h \ +src/core/ext/filters/http/message_compress/message_decompress_filter.h \ src/core/ext/filters/http/server/http_server_filter.cc \ src/core/ext/filters/http/server/http_server_filter.h \ src/core/ext/filters/max_age/max_age_filter.cc \ From 930aa868ea2195a9e1bc85d66af5bc641f05d879 Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Thu, 16 Apr 2020 11:59:52 -0700 Subject: [PATCH 517/758] Fix ordering --- test/core/end2end/tests/compressed_payload.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/core/end2end/tests/compressed_payload.cc b/test/core/end2end/tests/compressed_payload.cc index 48286485aee..5400a425219 100644 --- a/test/core/end2end/tests/compressed_payload.cc +++ b/test/core/end2end/tests/compressed_payload.cc @@ -44,8 +44,8 @@ static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config, grpc_channel_args* server_args, bool decompress_in_core) { grpc_end2end_test_fixture f; - gpr_log(GPR_INFO, "Running test: %s%s/%s", - decompress_in_core ? "" : "_with_decompression_disabled", test_name, + gpr_log(GPR_INFO, "Running test: %s%s/%s", test_name, + decompress_in_core ? "" : "_with_decompression_disabled", config.name); f = config.create_fixture(client_args, server_args); config.init_server(&f, server_args); From 8bab28db0818bcc3c91e89c7aeb82f54f6135827 Mon Sep 17 00:00:00 2001 From: Donna Dionne Date: Thu, 16 Apr 2020 12:20:57 -0700 Subject: [PATCH 518/758] Rearrange test_service_impl.h/cc to fix build failures. --- test/cpp/end2end/BUILD | 15 +---- test/cpp/end2end/test_service_impl.cc | 96 ++++++++++++++++++++++++--- test/cpp/end2end/test_service_impl.h | 66 ++---------------- 3 files changed, 96 insertions(+), 81 deletions(-) diff --git a/test/cpp/end2end/BUILD b/test/cpp/end2end/BUILD index bb6be0c4f02..a20128dcc2d 100644 --- a/test/cpp/end2end/BUILD +++ b/test/cpp/end2end/BUILD @@ -35,19 +35,6 @@ grpc_cc_library( ], ) -grpc_cc_library( - name = "test_multiple_service_impl", - testonly = True, - hdrs = ["test_service_impl.h"], - external_deps = [ - "gtest", - ], - deps = [ - "//src/proto/grpc/testing:echo_proto", - "//test/cpp/util:test_util", - ], -) - grpc_cc_library( name = "test_health_check_service_impl", testonly = True, @@ -525,7 +512,7 @@ grpc_cc_test( "no_windows", ], # TODO(jtattermusch): fix test on windows deps = [ - ":test_multiple_service_impl", + ":test_service_impl", "//:gpr", "//:grpc", "//:grpc++", diff --git a/test/cpp/end2end/test_service_impl.cc b/test/cpp/end2end/test_service_impl.cc index 98f3cf44bec..12928c70b48 100644 --- a/test/cpp/end2end/test_service_impl.cc +++ b/test/cpp/end2end/test_service_impl.cc @@ -34,7 +34,87 @@ using std::chrono::system_clock; namespace grpc { namespace testing { -namespace { +namespace internal { + +// When echo_deadline is requested, deadline seen in the ServerContext is set in +// the response in seconds. +void MaybeEchoDeadline(experimental::ServerContextBase* context, + const EchoRequest* request, EchoResponse* response) { + if (request->has_param() && request->param().echo_deadline()) { + gpr_timespec deadline = gpr_inf_future(GPR_CLOCK_REALTIME); + if (context->deadline() != system_clock::time_point::max()) { + Timepoint2Timespec(context->deadline(), &deadline); + } + response->mutable_param()->set_request_deadline(deadline.tv_sec); + } +} + +void CheckServerAuthContext( + const experimental::ServerContextBase* context, + const grpc::string& expected_transport_security_type, + const grpc::string& expected_client_identity) { + std::shared_ptr auth_ctx = context->auth_context(); + std::vector tst = + auth_ctx->FindPropertyValues("transport_security_type"); + EXPECT_EQ(1u, tst.size()); + EXPECT_EQ(expected_transport_security_type, ToString(tst[0])); + if (expected_client_identity.empty()) { + EXPECT_TRUE(auth_ctx->GetPeerIdentityPropertyName().empty()); + EXPECT_TRUE(auth_ctx->GetPeerIdentity().empty()); + EXPECT_FALSE(auth_ctx->IsPeerAuthenticated()); + } else { + auto identity = auth_ctx->GetPeerIdentity(); + EXPECT_TRUE(auth_ctx->IsPeerAuthenticated()); + EXPECT_EQ(1u, identity.size()); + EXPECT_EQ(expected_client_identity, identity[0]); + } +} + +// Returns the number of pairs in metadata that exactly match the given +// key-value pair. Returns -1 if the pair wasn't found. +int MetadataMatchCount( + const std::multimap& metadata, + const grpc::string& key, const grpc::string& value) { + int count = 0; + for (const auto& metadatum : metadata) { + if (ToString(metadatum.first) == key && + ToString(metadatum.second) == value) { + count++; + } + } + return count; +} + +int GetIntValueFromMetadataHelper( + const char* key, + const std::multimap& metadata, + int default_value) { + if (metadata.find(key) != metadata.end()) { + std::istringstream iss(ToString(metadata.find(key)->second)); + iss >> default_value; + gpr_log(GPR_INFO, "%s : %d", key, default_value); + } + + return default_value; +} + +int GetIntValueFromMetadata( + const char* key, + const std::multimap& metadata, + int default_value) { + return GetIntValueFromMetadataHelper(key, metadata, default_value); +} + +void ServerTryCancel(ServerContext* context) { + EXPECT_FALSE(context->IsCancelled()); + context->TryCancel(); + gpr_log(GPR_INFO, "Server called TryCancel() to cancel the request"); + // Now wait until it's really canceled + while (!context->IsCancelled()) { + gpr_sleep_until(gpr_time_add(gpr_now(GPR_CLOCK_REALTIME), + gpr_time_from_micros(1000, GPR_TIMESPAN))); + } +} void ServerTryCancelNonblocking(experimental::CallbackServerContext* context) { EXPECT_FALSE(context->IsCancelled()); @@ -43,7 +123,7 @@ void ServerTryCancelNonblocking(experimental::CallbackServerContext* context) { "Server called TryCancelNonblocking() to cancel the request"); } -} // namespace +} // namespace internal experimental::ServerUnaryReactor* CallbackTestServiceImpl::Echo( experimental::CallbackServerContext* context, const EchoRequest* request, @@ -275,7 +355,7 @@ CallbackTestServiceImpl::RequestStream( int server_try_cancel = internal::GetIntValueFromMetadata( kServerTryCancelRequest, context->client_metadata(), DO_NOT_CANCEL); if (server_try_cancel == CANCEL_BEFORE_PROCESSING) { - ServerTryCancelNonblocking(context); + internal::ServerTryCancelNonblocking(context); // Don't need to provide a reactor since the RPC is canceled return nullptr; } @@ -316,7 +396,7 @@ CallbackTestServiceImpl::RequestStream( return; } if (server_try_cancel_ == CANCEL_AFTER_PROCESSING) { - ServerTryCancelNonblocking(ctx_); + internal::ServerTryCancelNonblocking(ctx_); return; } FinishOnce(Status::OK); @@ -361,7 +441,7 @@ CallbackTestServiceImpl::ResponseStream( int server_try_cancel = internal::GetIntValueFromMetadata( kServerTryCancelRequest, context->client_metadata(), DO_NOT_CANCEL); if (server_try_cancel == CANCEL_BEFORE_PROCESSING) { - ServerTryCancelNonblocking(context); + internal::ServerTryCancelNonblocking(context); } class Reactor @@ -399,7 +479,7 @@ CallbackTestServiceImpl::ResponseStream( } else if (server_try_cancel_ == CANCEL_DURING_PROCESSING) { // Let OnCancel recover this } else if (server_try_cancel_ == CANCEL_AFTER_PROCESSING) { - ServerTryCancelNonblocking(ctx_); + internal::ServerTryCancelNonblocking(ctx_); } else { FinishOnce(Status::OK); } @@ -462,7 +542,7 @@ CallbackTestServiceImpl::BidiStream( server_write_last_ = internal::GetIntValueFromMetadata( kServerFinishAfterNReads, ctx->client_metadata(), 0); if (server_try_cancel_ == CANCEL_BEFORE_PROCESSING) { - ServerTryCancelNonblocking(ctx); + internal::ServerTryCancelNonblocking(ctx); } else { if (server_try_cancel_ == CANCEL_DURING_PROCESSING) { ctx->TryCancel(); @@ -502,7 +582,7 @@ CallbackTestServiceImpl::BidiStream( if (server_try_cancel_ == CANCEL_DURING_PROCESSING) { // Let OnCancel handle this } else if (server_try_cancel_ == CANCEL_AFTER_PROCESSING) { - ServerTryCancelNonblocking(ctx_); + internal::ServerTryCancelNonblocking(ctx_); } else { FinishOnce(Status::OK); } diff --git a/test/cpp/end2end/test_service_impl.h b/test/cpp/end2end/test_service_impl.h index 3210d5ec25f..d890bdbaff0 100644 --- a/test/cpp/end2end/test_service_impl.h +++ b/test/cpp/end2end/test_service_impl.h @@ -61,82 +61,30 @@ namespace internal { // When echo_deadline is requested, deadline seen in the ServerContext is set in // the response in seconds. void MaybeEchoDeadline(experimental::ServerContextBase* context, - const EchoRequest* request, EchoResponse* response) { - if (request->has_param() && request->param().echo_deadline()) { - gpr_timespec deadline = gpr_inf_future(GPR_CLOCK_REALTIME); - if (context->deadline() != system_clock::time_point::max()) { - Timepoint2Timespec(context->deadline(), &deadline); - } - response->mutable_param()->set_request_deadline(deadline.tv_sec); - } -} + const EchoRequest* request, EchoResponse* response); void CheckServerAuthContext( const experimental::ServerContextBase* context, const grpc::string& expected_transport_security_type, - const grpc::string& expected_client_identity) { - std::shared_ptr auth_ctx = context->auth_context(); - std::vector tst = - auth_ctx->FindPropertyValues("transport_security_type"); - EXPECT_EQ(1u, tst.size()); - EXPECT_EQ(expected_transport_security_type, ToString(tst[0])); - if (expected_client_identity.empty()) { - EXPECT_TRUE(auth_ctx->GetPeerIdentityPropertyName().empty()); - EXPECT_TRUE(auth_ctx->GetPeerIdentity().empty()); - EXPECT_FALSE(auth_ctx->IsPeerAuthenticated()); - } else { - auto identity = auth_ctx->GetPeerIdentity(); - EXPECT_TRUE(auth_ctx->IsPeerAuthenticated()); - EXPECT_EQ(1u, identity.size()); - EXPECT_EQ(expected_client_identity, identity[0]); - } -} + const grpc::string& expected_client_identity); // Returns the number of pairs in metadata that exactly match the given // key-value pair. Returns -1 if the pair wasn't found. int MetadataMatchCount( const std::multimap& metadata, - const grpc::string& key, const grpc::string& value) { - int count = 0; - for (const auto& metadatum : metadata) { - if (ToString(metadatum.first) == key && - ToString(metadatum.second) == value) { - count++; - } - } - return count; -} + const grpc::string& key, const grpc::string& value); int GetIntValueFromMetadataHelper( const char* key, const std::multimap& metadata, - int default_value) { - if (metadata.find(key) != metadata.end()) { - std::istringstream iss(ToString(metadata.find(key)->second)); - iss >> default_value; - gpr_log(GPR_INFO, "%s : %d", key, default_value); - } - - return default_value; -} + int default_value); int GetIntValueFromMetadata( const char* key, const std::multimap& metadata, - int default_value) { - return GetIntValueFromMetadataHelper(key, metadata, default_value); -} - -void ServerTryCancel(ServerContext* context) { - EXPECT_FALSE(context->IsCancelled()); - context->TryCancel(); - gpr_log(GPR_INFO, "Server called TryCancel() to cancel the request"); - // Now wait until it's really canceled - while (!context->IsCancelled()) { - gpr_sleep_until(gpr_time_add(gpr_now(GPR_CLOCK_REALTIME), - gpr_time_from_micros(1000, GPR_TIMESPAN))); - } -} + int default_value); + +void ServerTryCancel(ServerContext* context); } // namespace internal class TestServiceSignaller { From eb7779c20c4ddfaa9cea55ca60fb48fb375b22a5 Mon Sep 17 00:00:00 2001 From: Muxi Yan Date: Thu, 16 Apr 2020 13:07:55 -0700 Subject: [PATCH 519/758] Revert "Revert "Introduce CFRunLoop based iomgr"" --- BUILD | 3 +- BUILD.gn | 2 + CMakeLists.txt | 2 + Makefile | 2 + build_autogenerated.yaml | 4 + config.m4 | 1 + config.w32 | 1 + gRPC-C++.podspec | 2 + gRPC-Core.podspec | 3 + grpc.gemspec | 2 + grpc.gyp | 2 + package.xml | 2 + src/core/lib/iomgr/cfstream_handle.cc | 5 +- src/core/lib/iomgr/ev_apple.cc | 356 ++++++++++++++++++ src/core/lib/iomgr/ev_apple.h | 43 +++ src/core/lib/iomgr/iomgr_posix_cfstream.cc | 104 ++++- src/core/lib/iomgr/pollset_set_custom.cc | 20 +- src/core/lib/iomgr/port.h | 1 + .../xcschemes/InteropTests.xcscheme | 9 +- .../xcshareddata/xcschemes/MacTests.xcscheme | 9 +- .../xcshareddata/xcschemes/PerfTests.xcscheme | 9 +- .../xcshareddata/xcschemes/TvTests.xcscheme | 9 +- .../xcshareddata/xcschemes/UnitTests.xcscheme | 9 +- src/python/grpcio/grpc_core_dependencies.py | 1 + test/cpp/ios/Podfile | 2 +- tools/doxygen/Doxyfile.c++.internal | 2 + tools/doxygen/Doxyfile.core.internal | 2 + 27 files changed, 563 insertions(+), 44 deletions(-) create mode 100644 src/core/lib/iomgr/ev_apple.cc create mode 100644 src/core/lib/iomgr/ev_apple.h diff --git a/BUILD b/BUILD index 81de8203a03..98622fd7ecc 100644 --- a/BUILD +++ b/BUILD @@ -724,6 +724,7 @@ grpc_cc_library( "src/core/lib/iomgr/endpoint_pair_windows.cc", "src/core/lib/iomgr/error.cc", "src/core/lib/iomgr/error_cfstream.cc", + "src/core/lib/iomgr/ev_apple.cc", "src/core/lib/iomgr/ev_epoll1_linux.cc", "src/core/lib/iomgr/ev_epollex_linux.cc", "src/core/lib/iomgr/ev_poll_posix.cc", @@ -885,6 +886,7 @@ grpc_cc_library( "src/core/lib/iomgr/error.h", "src/core/lib/iomgr/error_cfstream.h", "src/core/lib/iomgr/error_internal.h", + "src/core/lib/iomgr/ev_apple.h", "src/core/lib/iomgr/ev_epoll1_linux.h", "src/core/lib/iomgr/ev_epollex_linux.h", "src/core/lib/iomgr/ev_poll_posix.h", @@ -989,7 +991,6 @@ grpc_cc_library( ], language = "c++", public_hdrs = GRPC_PUBLIC_HDRS, - use_cfstream = True, deps = [ "eventmanager_libuv", "gpr_base", diff --git a/BUILD.gn b/BUILD.gn index 129ad2b2639..bc56c6e571f 100644 --- a/BUILD.gn +++ b/BUILD.gn @@ -604,6 +604,8 @@ config("grpc_config") { "src/core/lib/iomgr/error_cfstream.cc", "src/core/lib/iomgr/error_cfstream.h", "src/core/lib/iomgr/error_internal.h", + "src/core/lib/iomgr/ev_apple.cc", + "src/core/lib/iomgr/ev_apple.h", "src/core/lib/iomgr/ev_epoll1_linux.cc", "src/core/lib/iomgr/ev_epoll1_linux.h", "src/core/lib/iomgr/ev_epollex_linux.cc", diff --git a/CMakeLists.txt b/CMakeLists.txt index 4fc05f7c174..7c2ed457f9d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1512,6 +1512,7 @@ add_library(grpc src/core/lib/iomgr/endpoint_pair_windows.cc src/core/lib/iomgr/error.cc src/core/lib/iomgr/error_cfstream.cc + src/core/lib/iomgr/ev_apple.cc src/core/lib/iomgr/ev_epoll1_linux.cc src/core/lib/iomgr/ev_epollex_linux.cc src/core/lib/iomgr/ev_poll_posix.cc @@ -2165,6 +2166,7 @@ add_library(grpc_unsecure src/core/lib/iomgr/endpoint_pair_windows.cc src/core/lib/iomgr/error.cc src/core/lib/iomgr/error_cfstream.cc + src/core/lib/iomgr/ev_apple.cc src/core/lib/iomgr/ev_epoll1_linux.cc src/core/lib/iomgr/ev_epollex_linux.cc src/core/lib/iomgr/ev_poll_posix.cc diff --git a/Makefile b/Makefile index 92ac929d3bc..3c196a328e9 100644 --- a/Makefile +++ b/Makefile @@ -3837,6 +3837,7 @@ LIBGRPC_SRC = \ src/core/lib/iomgr/endpoint_pair_windows.cc \ src/core/lib/iomgr/error.cc \ src/core/lib/iomgr/error_cfstream.cc \ + src/core/lib/iomgr/ev_apple.cc \ src/core/lib/iomgr/ev_epoll1_linux.cc \ src/core/lib/iomgr/ev_epollex_linux.cc \ src/core/lib/iomgr/ev_poll_posix.cc \ @@ -4464,6 +4465,7 @@ LIBGRPC_UNSECURE_SRC = \ src/core/lib/iomgr/endpoint_pair_windows.cc \ src/core/lib/iomgr/error.cc \ src/core/lib/iomgr/error_cfstream.cc \ + src/core/lib/iomgr/ev_apple.cc \ src/core/lib/iomgr/ev_epoll1_linux.cc \ src/core/lib/iomgr/ev_epollex_linux.cc \ src/core/lib/iomgr/ev_poll_posix.cc \ diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml index 0f98d3a24ae..0747c4a079b 100644 --- a/build_autogenerated.yaml +++ b/build_autogenerated.yaml @@ -566,6 +566,7 @@ libs: - src/core/lib/iomgr/error.h - src/core/lib/iomgr/error_cfstream.h - src/core/lib/iomgr/error_internal.h + - src/core/lib/iomgr/ev_apple.h - src/core/lib/iomgr/ev_epoll1_linux.h - src/core/lib/iomgr/ev_epollex_linux.h - src/core/lib/iomgr/ev_poll_posix.h @@ -938,6 +939,7 @@ libs: - src/core/lib/iomgr/endpoint_pair_windows.cc - src/core/lib/iomgr/error.cc - src/core/lib/iomgr/error_cfstream.cc + - src/core/lib/iomgr/ev_apple.cc - src/core/lib/iomgr/ev_epoll1_linux.cc - src/core/lib/iomgr/ev_epollex_linux.cc - src/core/lib/iomgr/ev_poll_posix.cc @@ -1465,6 +1467,7 @@ libs: - src/core/lib/iomgr/error.h - src/core/lib/iomgr/error_cfstream.h - src/core/lib/iomgr/error_internal.h + - src/core/lib/iomgr/ev_apple.h - src/core/lib/iomgr/ev_epoll1_linux.h - src/core/lib/iomgr/ev_epollex_linux.h - src/core/lib/iomgr/ev_poll_posix.h @@ -1769,6 +1772,7 @@ libs: - src/core/lib/iomgr/endpoint_pair_windows.cc - src/core/lib/iomgr/error.cc - src/core/lib/iomgr/error_cfstream.cc + - src/core/lib/iomgr/ev_apple.cc - src/core/lib/iomgr/ev_epoll1_linux.cc - src/core/lib/iomgr/ev_epollex_linux.cc - src/core/lib/iomgr/ev_poll_posix.cc diff --git a/config.m4 b/config.m4 index 6b450315f4f..b4013a02fbd 100644 --- a/config.m4 +++ b/config.m4 @@ -286,6 +286,7 @@ if test "$PHP_GRPC" != "no"; then src/core/lib/iomgr/endpoint_pair_windows.cc \ src/core/lib/iomgr/error.cc \ src/core/lib/iomgr/error_cfstream.cc \ + src/core/lib/iomgr/ev_apple.cc \ src/core/lib/iomgr/ev_epoll1_linux.cc \ src/core/lib/iomgr/ev_epollex_linux.cc \ src/core/lib/iomgr/ev_poll_posix.cc \ diff --git a/config.w32 b/config.w32 index 59cdbdb1ce4..c0b062aafea 100644 --- a/config.w32 +++ b/config.w32 @@ -255,6 +255,7 @@ if (PHP_GRPC != "no") { "src\\core\\lib\\iomgr\\endpoint_pair_windows.cc " + "src\\core\\lib\\iomgr\\error.cc " + "src\\core\\lib\\iomgr\\error_cfstream.cc " + + "src\\core\\lib\\iomgr\\ev_apple.cc " + "src\\core\\lib\\iomgr\\ev_epoll1_linux.cc " + "src\\core\\lib\\iomgr\\ev_epollex_linux.cc " + "src\\core\\lib\\iomgr\\ev_poll_posix.cc " + diff --git a/gRPC-C++.podspec b/gRPC-C++.podspec index 77980999b59..7d546034f95 100644 --- a/gRPC-C++.podspec +++ b/gRPC-C++.podspec @@ -445,6 +445,7 @@ Pod::Spec.new do |s| 'src/core/lib/iomgr/error.h', 'src/core/lib/iomgr/error_cfstream.h', 'src/core/lib/iomgr/error_internal.h', + 'src/core/lib/iomgr/ev_apple.h', 'src/core/lib/iomgr/ev_epoll1_linux.h', 'src/core/lib/iomgr/ev_epollex_linux.h', 'src/core/lib/iomgr/ev_poll_posix.h', @@ -896,6 +897,7 @@ Pod::Spec.new do |s| 'src/core/lib/iomgr/error.h', 'src/core/lib/iomgr/error_cfstream.h', 'src/core/lib/iomgr/error_internal.h', + 'src/core/lib/iomgr/ev_apple.h', 'src/core/lib/iomgr/ev_epoll1_linux.h', 'src/core/lib/iomgr/ev_epollex_linux.h', 'src/core/lib/iomgr/ev_poll_posix.h', diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec index 749e77b3fa7..056c7f8a6fd 100644 --- a/gRPC-Core.podspec +++ b/gRPC-Core.podspec @@ -654,6 +654,8 @@ Pod::Spec.new do |s| 'src/core/lib/iomgr/error_cfstream.cc', 'src/core/lib/iomgr/error_cfstream.h', 'src/core/lib/iomgr/error_internal.h', + 'src/core/lib/iomgr/ev_apple.cc', + 'src/core/lib/iomgr/ev_apple.h', 'src/core/lib/iomgr/ev_epoll1_linux.cc', 'src/core/lib/iomgr/ev_epoll1_linux.h', 'src/core/lib/iomgr/ev_epollex_linux.cc', @@ -1249,6 +1251,7 @@ Pod::Spec.new do |s| 'src/core/lib/iomgr/error.h', 'src/core/lib/iomgr/error_cfstream.h', 'src/core/lib/iomgr/error_internal.h', + 'src/core/lib/iomgr/ev_apple.h', 'src/core/lib/iomgr/ev_epoll1_linux.h', 'src/core/lib/iomgr/ev_epollex_linux.h', 'src/core/lib/iomgr/ev_poll_posix.h', diff --git a/grpc.gemspec b/grpc.gemspec index 29e5d3d436b..3dcf652466f 100644 --- a/grpc.gemspec +++ b/grpc.gemspec @@ -576,6 +576,8 @@ Gem::Specification.new do |s| s.files += %w( src/core/lib/iomgr/error_cfstream.cc ) s.files += %w( src/core/lib/iomgr/error_cfstream.h ) s.files += %w( src/core/lib/iomgr/error_internal.h ) + s.files += %w( src/core/lib/iomgr/ev_apple.cc ) + s.files += %w( src/core/lib/iomgr/ev_apple.h ) s.files += %w( src/core/lib/iomgr/ev_epoll1_linux.cc ) s.files += %w( src/core/lib/iomgr/ev_epoll1_linux.h ) s.files += %w( src/core/lib/iomgr/ev_epollex_linux.cc ) diff --git a/grpc.gyp b/grpc.gyp index a62c034d65a..ce39a8ed214 100644 --- a/grpc.gyp +++ b/grpc.gyp @@ -640,6 +640,7 @@ 'src/core/lib/iomgr/endpoint_pair_windows.cc', 'src/core/lib/iomgr/error.cc', 'src/core/lib/iomgr/error_cfstream.cc', + 'src/core/lib/iomgr/ev_apple.cc', 'src/core/lib/iomgr/ev_epoll1_linux.cc', 'src/core/lib/iomgr/ev_epollex_linux.cc', 'src/core/lib/iomgr/ev_poll_posix.cc', @@ -1129,6 +1130,7 @@ 'src/core/lib/iomgr/endpoint_pair_windows.cc', 'src/core/lib/iomgr/error.cc', 'src/core/lib/iomgr/error_cfstream.cc', + 'src/core/lib/iomgr/ev_apple.cc', 'src/core/lib/iomgr/ev_epoll1_linux.cc', 'src/core/lib/iomgr/ev_epollex_linux.cc', 'src/core/lib/iomgr/ev_poll_posix.cc', diff --git a/package.xml b/package.xml index 06d1669ec48..a8430464cf7 100644 --- a/package.xml +++ b/package.xml @@ -556,6 +556,8 @@ + + diff --git a/src/core/lib/iomgr/cfstream_handle.cc b/src/core/lib/iomgr/cfstream_handle.cc index 40fb3779651..7a78ccd8769 100644 --- a/src/core/lib/iomgr/cfstream_handle.cc +++ b/src/core/lib/iomgr/cfstream_handle.cc @@ -32,6 +32,7 @@ #include "src/core/lib/debug/trace.h" #include "src/core/lib/iomgr/closure.h" #include "src/core/lib/iomgr/error_cfstream.h" +#include "src/core/lib/iomgr/ev_apple.h" #include "src/core/lib/iomgr/exec_ctx.h" extern grpc_core::TraceFlag grpc_tcp_trace; @@ -147,8 +148,8 @@ CFStreamHandle::CFStreamHandle(CFReadStreamRef read_stream, kCFStreamEventOpenCompleted | kCFStreamEventCanAcceptBytes | kCFStreamEventErrorOccurred | kCFStreamEventEndEncountered, CFStreamHandle::WriteCallback, &ctx); - CFReadStreamSetDispatchQueue(read_stream, dispatch_queue_); - CFWriteStreamSetDispatchQueue(write_stream, dispatch_queue_); + grpc_apple_register_read_stream(read_stream, dispatch_queue_); + grpc_apple_register_write_stream(write_stream, dispatch_queue_); } CFStreamHandle::~CFStreamHandle() { diff --git a/src/core/lib/iomgr/ev_apple.cc b/src/core/lib/iomgr/ev_apple.cc new file mode 100644 index 00000000000..d1525828865 --- /dev/null +++ b/src/core/lib/iomgr/ev_apple.cc @@ -0,0 +1,356 @@ +/* + * + * Copyright 2020 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +/// Event engine based on Apple's CFRunLoop API family. If the CFRunLoop engine +/// is enabled (see iomgr_posix_cfstream.cc), a global thread is started to +/// handle and trigger all the CFStream events. The CFStream streams register +/// themselves with the run loop with functions grpc_apple_register_read_stream +/// and grpc_apple_register_read_stream. Pollsets are dummy and block on a +/// condition variable in pollset_work(). + +#include + +#include "src/core/lib/iomgr/port.h" + +#ifdef GRPC_APPLE_EV + +#include + +#include + +#include "src/core/lib/gprpp/thd.h" +#include "src/core/lib/iomgr/ev_apple.h" + +grpc_core::DebugOnlyTraceFlag grpc_apple_polling_trace(false, "apple_polling"); + +#ifndef NDEBUG +#define GRPC_POLLING_TRACE(format, ...) \ + if (GRPC_TRACE_FLAG_ENABLED(grpc_apple_polling_trace)) { \ + gpr_log(GPR_DEBUG, "(polling) " format, __VA_ARGS__); \ + } +#else +#define GRPC_POLLING_TRACE(...) +#endif // NDEBUG + +#define GRPC_POLLSET_KICK_BROADCAST ((grpc_pollset_worker*)1) + +struct GlobalRunLoopContext { + grpc_core::CondVar init_cv; + grpc_core::CondVar input_source_cv; + + grpc_core::Mutex mu; + + // Whether an input source registration is pending. Protected by mu. + bool input_source_registered = false; + + // The reference to the global run loop object. Protected by mu. + CFRunLoopRef run_loop; + + // Whether the pollset has been globally shut down. Protected by mu. + bool is_shutdown = false; +}; + +struct GrpcAppleWorker { + // The condition varible to kick the worker. Works with the pollset's lock + // (GrpcApplePollset.mu). + grpc_core::CondVar cv; + + // Whether the worker is kicked. Protected by the pollset's lock + // (GrpcApplePollset.mu). + bool kicked = false; +}; + +struct GrpcApplePollset { + grpc_core::Mutex mu; + + // Tracks the current workers in the pollset. Protected by mu. + std::list workers; + + // Whether the pollset is shut down. Protected by mu. + bool is_shutdown = false; + + // Closure to call when shutdown is done. Protected by mu. + grpc_closure* shutdown_closure; + + // Whether there's an outstanding kick that was not processed. Protected by + // mu. + bool kicked_without_poller = false; +}; + +static GlobalRunLoopContext* gGlobalRunLoopContext = nullptr; +static grpc_core::Thread* gGlobalRunLoopThread = nullptr; + +/// Register the stream with the dispatch queue. Callbacks of the stream will be +/// issued to the dispatch queue when a network event happens and will be +/// managed by Grand Central Dispatch. +static void grpc_apple_register_read_stream_queue( + CFReadStreamRef read_stream, dispatch_queue_t dispatch_queue) { + CFReadStreamSetDispatchQueue(read_stream, dispatch_queue); +} + +/// Register the stream with the dispatch queue. Callbacks of the stream will be +/// issued to the dispatch queue when a network event happens and will be +/// managed by Grand Central Dispatch. +static void grpc_apple_register_write_stream_queue( + CFWriteStreamRef write_stream, dispatch_queue_t dispatch_queue) { + CFWriteStreamSetDispatchQueue(write_stream, dispatch_queue); +} + +/// Register the stream with the global run loop. Callbacks of the stream will +/// be issued to the run loop when a network event happens and will be driven by +/// the global run loop thread gGlobalRunLoopThread. +static void grpc_apple_register_read_stream_run_loop( + CFReadStreamRef read_stream, dispatch_queue_t dispatch_queue) { + GRPC_POLLING_TRACE("Register read stream: %p", read_stream); + grpc_core::MutexLock lock(&gGlobalRunLoopContext->mu); + CFReadStreamScheduleWithRunLoop(read_stream, gGlobalRunLoopContext->run_loop, + kCFRunLoopDefaultMode); + gGlobalRunLoopContext->input_source_registered = true; + gGlobalRunLoopContext->input_source_cv.Signal(); +} + +/// Register the stream with the global run loop. Callbacks of the stream will +/// be issued to the run loop when a network event happens, and will be driven +/// by the global run loop thread gGlobalRunLoopThread. +static void grpc_apple_register_write_stream_run_loop( + CFWriteStreamRef write_stream, dispatch_queue_t dispatch_queue) { + GRPC_POLLING_TRACE("Register write stream: %p", write_stream); + grpc_core::MutexLock lock(&gGlobalRunLoopContext->mu); + CFWriteStreamScheduleWithRunLoop( + write_stream, gGlobalRunLoopContext->run_loop, kCFRunLoopDefaultMode); + gGlobalRunLoopContext->input_source_registered = true; + gGlobalRunLoopContext->input_source_cv.Signal(); +} + +/// The default implementation of stream registration is to register the stream +/// to a dispatch queue. However, if the CFRunLoop based pollset is enabled (by +/// macro and environment variable, see docs in iomgr_posix_cfstream.cc), the +/// CFStream streams are registered with the global run loop instead (see +/// pollset_global_init below). +static void (*grpc_apple_register_read_stream_impl)( + CFReadStreamRef, dispatch_queue_t) = grpc_apple_register_read_stream_queue; +static void (*grpc_apple_register_write_stream_impl)(CFWriteStreamRef, + dispatch_queue_t) = + grpc_apple_register_write_stream_queue; + +void grpc_apple_register_read_stream(CFReadStreamRef read_stream, + dispatch_queue_t dispatch_queue) { + grpc_apple_register_read_stream_impl(read_stream, dispatch_queue); +} + +void grpc_apple_register_write_stream(CFWriteStreamRef write_stream, + dispatch_queue_t dispatch_queue) { + grpc_apple_register_write_stream_impl(write_stream, dispatch_queue); +} + +/// Drive the run loop in a global singleton thread until the global run loop is +/// shutdown. +static void GlobalRunLoopFunc(void* arg) { + grpc_core::ReleasableMutexLock lock(&gGlobalRunLoopContext->mu); + gGlobalRunLoopContext->run_loop = CFRunLoopGetCurrent(); + gGlobalRunLoopContext->init_cv.Signal(); + + while (!gGlobalRunLoopContext->is_shutdown) { + // CFRunLoopRun() will return immediately if no stream is registered on it. + // So we wait on a conditional variable until a stream is registered; + // otherwise we'll be running a spinning loop. + while (!gGlobalRunLoopContext->input_source_registered) { + gGlobalRunLoopContext->input_source_cv.Wait(&gGlobalRunLoopContext->mu); + } + gGlobalRunLoopContext->input_source_registered = false; + lock.Unlock(); + CFRunLoopRun(); + lock.Lock(); + } + lock.Unlock(); +} + +// pollset implementation + +static void pollset_global_init(void) { + gGlobalRunLoopContext = new GlobalRunLoopContext; + + grpc_apple_register_read_stream_impl = + grpc_apple_register_read_stream_run_loop; + grpc_apple_register_write_stream_impl = + grpc_apple_register_write_stream_run_loop; + + grpc_core::MutexLock lock(&gGlobalRunLoopContext->mu); + gGlobalRunLoopThread = + new grpc_core::Thread("apple_ev", GlobalRunLoopFunc, nullptr); + gGlobalRunLoopThread->Start(); + while (gGlobalRunLoopContext->run_loop == NULL) + gGlobalRunLoopContext->init_cv.Wait(&gGlobalRunLoopContext->mu); +} + +static void pollset_global_shutdown(void) { + { + grpc_core::MutexLock lock(&gGlobalRunLoopContext->mu); + gGlobalRunLoopContext->is_shutdown = true; + CFRunLoopStop(gGlobalRunLoopContext->run_loop); + } + gGlobalRunLoopThread->Join(); + delete gGlobalRunLoopThread; + delete gGlobalRunLoopContext; +} + +/// The caller must acquire the lock GrpcApplePollset.mu before calling this +/// function. The lock may be temporarily released when waiting on the condition +/// variable but will be re-acquired before the function returns. +/// +/// The Apple pollset simply waits on a condition variable until it is kicked. +/// The network events are handled in the global run loop thread. Processing of +/// these events will eventually trigger the kick. +static grpc_error* pollset_work(grpc_pollset* pollset, + grpc_pollset_worker** worker, + grpc_millis deadline) { + GRPC_POLLING_TRACE("pollset work: %p, worker: %p, deadline: %" PRIu64, + pollset, worker, deadline); + GrpcApplePollset* apple_pollset = + reinterpret_cast(pollset); + GrpcAppleWorker actual_worker; + if (worker) { + *worker = reinterpret_cast(&actual_worker); + } + + if (apple_pollset->kicked_without_poller) { + // Process the outstanding kick and reset the flag. Do not block. + apple_pollset->kicked_without_poller = false; + } else { + // Block until kicked, timed out, or the pollset shuts down. + apple_pollset->workers.push_front(&actual_worker); + auto it = apple_pollset->workers.begin(); + + while (!actual_worker.kicked && !apple_pollset->is_shutdown) { + if (actual_worker.cv.Wait( + &apple_pollset->mu, + grpc_millis_to_timespec(deadline, GPR_CLOCK_REALTIME))) { + // timed out + break; + } + } + + apple_pollset->workers.erase(it); + + // If the pollset is shut down asynchronously and this is the last pending + // worker, the shutdown process is complete at this moment and the shutdown + // callback will be called. + if (apple_pollset->is_shutdown && apple_pollset->workers.empty()) { + grpc_core::ExecCtx::Run(DEBUG_LOCATION, apple_pollset->shutdown_closure, + GRPC_ERROR_NONE); + } + } + + return GRPC_ERROR_NONE; +} + +/// Kick a specific worker. The caller must acquire the lock GrpcApplePollset.mu +/// before calling this function. +static void kick_worker(GrpcAppleWorker* worker) { + worker->kicked = true; + worker->cv.Signal(); +} + +/// The caller must acquire the lock GrpcApplePollset.mu before calling this +/// function. The kick action simply signals the condition variable of the +/// worker. +static grpc_error* pollset_kick(grpc_pollset* pollset, + grpc_pollset_worker* specific_worker) { + GrpcApplePollset* apple_pollset = + reinterpret_cast(pollset); + + GRPC_POLLING_TRACE("pollset kick: %p, worker:%p", pollset, specific_worker); + + if (specific_worker == nullptr) { + if (apple_pollset->workers.empty()) { + apple_pollset->kicked_without_poller = true; + } else { + GrpcAppleWorker* actual_worker = apple_pollset->workers.front(); + kick_worker(actual_worker); + } + } else if (specific_worker == GRPC_POLLSET_KICK_BROADCAST) { + for (auto& actual_worker : apple_pollset->workers) { + kick_worker(actual_worker); + } + } else { + GrpcAppleWorker* actual_worker = + reinterpret_cast(specific_worker); + kick_worker(actual_worker); + } + + return GRPC_ERROR_NONE; +} + +static void pollset_init(grpc_pollset* pollset, gpr_mu** mu) { + GRPC_POLLING_TRACE("pollset init: %p", pollset); + GrpcApplePollset* apple_pollset = new (pollset) GrpcApplePollset(); + *mu = apple_pollset->mu.get(); +} + +/// The caller must acquire the lock GrpcApplePollset.mu before calling this +/// function. +static void pollset_shutdown(grpc_pollset* pollset, grpc_closure* closure) { + GRPC_POLLING_TRACE("pollset shutdown: %p", pollset); + + GrpcApplePollset* apple_pollset = + reinterpret_cast(pollset); + apple_pollset->is_shutdown = true; + pollset_kick(pollset, GRPC_POLLSET_KICK_BROADCAST); + + // If there is any worker blocked, shutdown will be done asynchronously. + if (apple_pollset->workers.empty()) { + grpc_core::ExecCtx::Run(DEBUG_LOCATION, closure, GRPC_ERROR_NONE); + } else { + apple_pollset->shutdown_closure = closure; + } +} + +static void pollset_destroy(grpc_pollset* pollset) { + GRPC_POLLING_TRACE("pollset destroy: %p", pollset); + GrpcApplePollset* apple_pollset = + reinterpret_cast(pollset); + apple_pollset->~GrpcApplePollset(); +} + +size_t pollset_size(void) { return sizeof(GrpcApplePollset); } + +grpc_pollset_vtable grpc_apple_pollset_vtable = { + pollset_global_init, pollset_global_shutdown, + pollset_init, pollset_shutdown, + pollset_destroy, pollset_work, + pollset_kick, pollset_size}; + +// pollset_set implementation + +grpc_pollset_set* pollset_set_create(void) { return nullptr; } +void pollset_set_destroy(grpc_pollset_set* pollset_set) {} +void pollset_set_add_pollset(grpc_pollset_set* pollset_set, + grpc_pollset* pollset) {} +void pollset_set_del_pollset(grpc_pollset_set* pollset_set, + grpc_pollset* pollset) {} +void pollset_set_add_pollset_set(grpc_pollset_set* bag, + grpc_pollset_set* item) {} +void pollset_set_del_pollset_set(grpc_pollset_set* bag, + grpc_pollset_set* item) {} + +grpc_pollset_set_vtable grpc_apple_pollset_set_vtable = { + pollset_set_create, pollset_set_destroy, + pollset_set_add_pollset, pollset_set_del_pollset, + pollset_set_add_pollset_set, pollset_set_del_pollset_set}; + +#endif diff --git a/src/core/lib/iomgr/ev_apple.h b/src/core/lib/iomgr/ev_apple.h new file mode 100644 index 00000000000..a05f91ce15f --- /dev/null +++ b/src/core/lib/iomgr/ev_apple.h @@ -0,0 +1,43 @@ +/* + * + * Copyright 2020 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPC_CORE_LIB_IOMGR_EV_APPLE_H +#define GRPC_CORE_LIB_IOMGR_EV_APPLE_H + +#include + +#ifdef GRPC_APPLE_EV + +#include + +#include "src/core/lib/iomgr/pollset.h" +#include "src/core/lib/iomgr/pollset_set.h" + +void grpc_apple_register_read_stream(CFReadStreamRef read_stream, + dispatch_queue_t dispatch_queue); + +void grpc_apple_register_write_stream(CFWriteStreamRef write_stream, + dispatch_queue_t dispatch_queue); + +extern grpc_pollset_vtable grpc_apple_pollset_vtable; + +extern grpc_pollset_set_vtable grpc_apple_pollset_set_vtable; + +#endif + +#endif diff --git a/src/core/lib/iomgr/iomgr_posix_cfstream.cc b/src/core/lib/iomgr/iomgr_posix_cfstream.cc index 72b2ae5eb00..24f9f4101b2 100644 --- a/src/core/lib/iomgr/iomgr_posix_cfstream.cc +++ b/src/core/lib/iomgr/iomgr_posix_cfstream.cc @@ -16,6 +16,20 @@ * */ +/// CFStream is build-enabled on iOS by default and disabled by default on other +/// platforms (see port_platform.h). To enable CFStream build on another +/// platform, the users need to define macro "GRPC_CFSTREAM=1" when building +/// gRPC. +/// +/// When CFStream is to be built (either by default on iOS or by macro on other +/// platforms), the users can disable CFStream with environment variable +/// "grpc_cfstream=0". This will let gRPC to fallback to use POSIX sockets. In +/// addition, the users may choose to use an alternative CFRunLoop based pollset +/// "ev_apple" by setting environment variable "grpc_cfstream_run_loop=1". This +/// pollset resolves a bug from Apple when CFStream streams dispatch events to +/// dispatch queues. The caveat of this pollset is that users may not be able to +/// run a gRPC server in the same process. + #include #include "src/core/lib/iomgr/port.h" @@ -23,6 +37,7 @@ #ifdef GRPC_CFSTREAM_IOMGR #include "src/core/lib/debug/trace.h" +#include "src/core/lib/iomgr/ev_apple.h" #include "src/core/lib/iomgr/ev_posix.h" #include "src/core/lib/iomgr/iomgr_internal.h" #include "src/core/lib/iomgr/iomgr_posix.h" @@ -33,6 +48,7 @@ #include "src/core/lib/iomgr/timer.h" static const char* grpc_cfstream_env_var = "grpc_cfstream"; +static const char* grpc_cfstream_run_loop_env_var = "GRPC_CFSTREAM_RUN_LOOP"; extern grpc_tcp_server_vtable grpc_posix_tcp_server_vtable; extern grpc_tcp_client_vtable grpc_posix_tcp_client_vtable; @@ -42,6 +58,33 @@ extern grpc_pollset_vtable grpc_posix_pollset_vtable; extern grpc_pollset_set_vtable grpc_posix_pollset_set_vtable; extern grpc_address_resolver_vtable grpc_posix_resolver_vtable; +static void apple_iomgr_platform_init(void) { grpc_pollset_global_init(); } + +static void apple_iomgr_platform_flush(void) {} + +static void apple_iomgr_platform_shutdown(void) { + grpc_pollset_global_shutdown(); +} + +static void apple_iomgr_platform_shutdown_background_closure(void) {} + +static bool apple_iomgr_platform_is_any_background_poller_thread(void) { + return false; +} + +static bool apple_iomgr_platform_add_closure_to_background_poller( + grpc_closure* closure, grpc_error* error) { + return false; +} + +static grpc_iomgr_platform_vtable apple_vtable = { + apple_iomgr_platform_init, + apple_iomgr_platform_flush, + apple_iomgr_platform_shutdown, + apple_iomgr_platform_shutdown_background_closure, + apple_iomgr_platform_is_any_background_poller_thread, + apple_iomgr_platform_add_closure_to_background_poller}; + static void iomgr_platform_init(void) { grpc_wakeup_fd_global_init(); grpc_event_engine_init(); @@ -76,32 +119,53 @@ static grpc_iomgr_platform_vtable vtable = { iomgr_platform_add_closure_to_background_poller}; void grpc_set_default_iomgr_platform() { - char* enable_cfstream = getenv(grpc_cfstream_env_var); - grpc_tcp_client_vtable* client_vtable = &grpc_posix_tcp_client_vtable; - // CFStream is enabled by default on iOS, and disabled by default on other - // platforms. Defaults can be overriden by setting the grpc_cfstream - // environment variable. -#if TARGET_OS_IPHONE - if (enable_cfstream == nullptr || enable_cfstream[0] == '1') { - client_vtable = &grpc_cfstream_client_vtable; + char* enable_cfstream_str = getenv(grpc_cfstream_env_var); + bool enable_cfstream = + enable_cfstream_str == nullptr || enable_cfstream_str[0] != '0'; + char* enable_cfstream_run_loop_str = getenv(grpc_cfstream_run_loop_env_var); + // CFStream run-loop is disabled by default. The user has to enable it + // explicitly with environment variable. + bool enable_cfstream_run_loop = enable_cfstream_run_loop_str != nullptr && + enable_cfstream_run_loop_str[0] == '1'; + if (!enable_cfstream) { + // Use POSIX sockets for both client and server + grpc_set_tcp_client_impl(&grpc_posix_tcp_client_vtable); + grpc_set_tcp_server_impl(&grpc_posix_tcp_server_vtable); + grpc_set_pollset_vtable(&grpc_posix_pollset_vtable); + grpc_set_pollset_set_vtable(&grpc_posix_pollset_set_vtable); + grpc_set_iomgr_platform_vtable(&vtable); + } else if (enable_cfstream && !enable_cfstream_run_loop) { + // Use CFStream with dispatch queue for client; use POSIX sockets for server + grpc_set_tcp_client_impl(&grpc_cfstream_client_vtable); + grpc_set_tcp_server_impl(&grpc_posix_tcp_server_vtable); + grpc_set_pollset_vtable(&grpc_posix_pollset_vtable); + grpc_set_pollset_set_vtable(&grpc_posix_pollset_set_vtable); + grpc_set_iomgr_platform_vtable(&vtable); + } else { + // Use CFStream with CFRunLoop for client; server not supported + grpc_set_tcp_client_impl(&grpc_cfstream_client_vtable); + grpc_set_pollset_vtable(&grpc_apple_pollset_vtable); + grpc_set_pollset_set_vtable(&grpc_apple_pollset_set_vtable); + grpc_set_iomgr_platform_vtable(&apple_vtable); } -#else - if (enable_cfstream != nullptr && enable_cfstream[0] == '1') { - client_vtable = &grpc_cfstream_client_vtable; - } -#endif - - grpc_set_tcp_client_impl(client_vtable); - grpc_set_tcp_server_impl(&grpc_posix_tcp_server_vtable); grpc_set_timer_impl(&grpc_generic_timer_vtable); - grpc_set_pollset_vtable(&grpc_posix_pollset_vtable); - grpc_set_pollset_set_vtable(&grpc_posix_pollset_set_vtable); grpc_set_resolver_impl(&grpc_posix_resolver_vtable); - grpc_set_iomgr_platform_vtable(&vtable); } bool grpc_iomgr_run_in_background() { - return grpc_event_engine_run_in_background(); + char* enable_cfstream_str = getenv(grpc_cfstream_env_var); + bool enable_cfstream = + enable_cfstream_str == nullptr || enable_cfstream_str[0] != '0'; + char* enable_cfstream_run_loop_str = getenv(grpc_cfstream_run_loop_env_var); + // CFStream run-loop is disabled by default. The user has to enable it + // explicitly with environment variable. + bool enable_cfstream_run_loop = enable_cfstream_run_loop_str != nullptr && + enable_cfstream_run_loop_str[0] == '1'; + if (enable_cfstream && enable_cfstream_run_loop) { + return false; + } else { + return grpc_event_engine_run_in_background(); + } } #endif /* GRPC_CFSTREAM_IOMGR */ diff --git a/src/core/lib/iomgr/pollset_set_custom.cc b/src/core/lib/iomgr/pollset_set_custom.cc index 099388f7c5b..2c1df608197 100644 --- a/src/core/lib/iomgr/pollset_set_custom.cc +++ b/src/core/lib/iomgr/pollset_set_custom.cc @@ -22,23 +22,23 @@ #include "src/core/lib/iomgr/pollset_set.h" -grpc_pollset_set* pollset_set_create(void) { +static grpc_pollset_set* pollset_set_create(void) { return (grpc_pollset_set*)((intptr_t)0xdeafbeef); } -void pollset_set_destroy(grpc_pollset_set* /*pollset_set*/) {} +static void pollset_set_destroy(grpc_pollset_set* /*pollset_set*/) {} -void pollset_set_add_pollset(grpc_pollset_set* /*pollset_set*/, - grpc_pollset* /*pollset*/) {} +static void pollset_set_add_pollset(grpc_pollset_set* /*pollset_set*/, + grpc_pollset* /*pollset*/) {} -void pollset_set_del_pollset(grpc_pollset_set* /*pollset_set*/, - grpc_pollset* /*pollset*/) {} +static void pollset_set_del_pollset(grpc_pollset_set* /*pollset_set*/, + grpc_pollset* /*pollset*/) {} -void pollset_set_add_pollset_set(grpc_pollset_set* /*bag*/, - grpc_pollset_set* /*item*/) {} +static void pollset_set_add_pollset_set(grpc_pollset_set* /*bag*/, + grpc_pollset_set* /*item*/) {} -void pollset_set_del_pollset_set(grpc_pollset_set* /*bag*/, - grpc_pollset_set* /*item*/) {} +static void pollset_set_del_pollset_set(grpc_pollset_set* /*bag*/, + grpc_pollset_set* /*item*/) {} static grpc_pollset_set_vtable vtable = { pollset_set_create, pollset_set_destroy, diff --git a/src/core/lib/iomgr/port.h b/src/core/lib/iomgr/port.h index 1d2e9506451..211423e643d 100644 --- a/src/core/lib/iomgr/port.h +++ b/src/core/lib/iomgr/port.h @@ -129,6 +129,7 @@ #define GRPC_CFSTREAM_IOMGR 1 #define GRPC_CFSTREAM_CLIENT 1 #define GRPC_CFSTREAM_ENDPOINT 1 +#define GRPC_APPLE_EV 1 #define GRPC_POSIX_SOCKET_ARES_EV_DRIVER 1 #define GRPC_POSIX_SOCKET_EV 1 #define GRPC_POSIX_SOCKET_EV_EPOLL1 1 diff --git a/src/objective-c/tests/Tests.xcodeproj/xcshareddata/xcschemes/InteropTests.xcscheme b/src/objective-c/tests/Tests.xcodeproj/xcshareddata/xcschemes/InteropTests.xcscheme index cbde360a338..d4557937965 100644 --- a/src/objective-c/tests/Tests.xcodeproj/xcshareddata/xcschemes/InteropTests.xcscheme +++ b/src/objective-c/tests/Tests.xcodeproj/xcshareddata/xcschemes/InteropTests.xcscheme @@ -66,8 +66,13 @@ ReferencedContainer = "container:Tests.xcodeproj"> - - + + + + - - + + + + - - + + + + - - + + + + - - + + + + Date: Thu, 16 Apr 2020 13:37:33 -0700 Subject: [PATCH 520/758] Add AsyncIO support to grpcio-status --- .../grpc/_cython/_cygrpc/aio/server.pyx.pxi | 3 + .../grpcio_status/grpc_status/BUILD.bazel | 2 +- .../grpcio_status/grpc_status/_async.py | 56 ++++++ .../grpcio_status/grpc_status/_common.py | 27 +++ .../grpcio_status/grpc_status/rpc_status.py | 36 ++-- .../grpcio_tests/tests_aio/status/BUILD.bazel | 30 +++ .../grpcio_tests/tests_aio/status/__init__.py | 13 ++ .../tests_aio/status/grpc_status_test.py | 175 ++++++++++++++++++ src/python/grpcio_tests/tests_aio/tests.json | 1 + 9 files changed, 326 insertions(+), 17 deletions(-) create mode 100644 src/python/grpcio_status/grpc_status/_async.py create mode 100644 src/python/grpcio_status/grpc_status/_common.py create mode 100644 src/python/grpcio_tests/tests_aio/status/BUILD.bazel create mode 100644 src/python/grpcio_tests/tests_aio/status/__init__.py create mode 100644 src/python/grpcio_tests/tests_aio/status/grpc_status_test.py diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi index 0e407172806..a0d51a14325 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi @@ -189,6 +189,9 @@ cdef class _ServicerContext: raise self._rpc_state.abort_exception + async def abort_with_status(self, object status): + await self.abort(status.code, status.details, status.trailing_metadata) + def set_trailing_metadata(self, tuple metadata): self._rpc_state.trailing_metadata = metadata diff --git a/src/python/grpcio_status/grpc_status/BUILD.bazel b/src/python/grpcio_status/grpc_status/BUILD.bazel index 122a94f411a..a6abdd3ef56 100644 --- a/src/python/grpcio_status/grpc_status/BUILD.bazel +++ b/src/python/grpcio_status/grpc_status/BUILD.bazel @@ -4,7 +4,7 @@ package(default_visibility = ["//visibility:public"]) py_library( name = "grpc_status", - srcs = ["rpc_status.py"], + srcs = glob(["*.py"]), imports = ["../"], deps = [ "//src/python/grpcio/grpc:grpcio", diff --git a/src/python/grpcio_status/grpc_status/_async.py b/src/python/grpcio_status/grpc_status/_async.py new file mode 100644 index 00000000000..a6a6f7ef6ad --- /dev/null +++ b/src/python/grpcio_status/grpc_status/_async.py @@ -0,0 +1,56 @@ +# Copyright 2020 The gRPC Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Reference implementation for status mapping in gRPC Python.""" + +from grpc.experimental import aio + +from google.rpc import status_pb2 + +from ._common import code_to_grpc_status_code, GRPC_DETAILS_METADATA_KEY + + +async def from_call(call: aio.Call): + """Returns a google.rpc.status.Status message from a given grpc.aio.Call. + + This is an EXPERIMENTAL API. + + Args: + call: An grpc.aio.Call instance. + + Returns: + A google.rpc.status.Status message representing the status of the RPC. + """ + code = await call.code() + details = await call.details() + trailing_metadata = await call.trailing_metadata() + if trailing_metadata is None: + return None + for key, value in trailing_metadata: + if key == GRPC_DETAILS_METADATA_KEY: + rich_status = status_pb2.Status.FromString(value) + if code.value[0] != rich_status.code: + raise ValueError( + 'Code in Status proto (%s) doesn\'t match status code (%s)' + % (code_to_grpc_status_code(rich_status.code), code)) + if details != rich_status.message: + raise ValueError( + 'Message in Status proto (%s) doesn\'t match status details (%s)' + % (rich_status.message, details)) + return rich_status + return None + + +__all__ = [ + 'from_call', +] diff --git a/src/python/grpcio_status/grpc_status/_common.py b/src/python/grpcio_status/grpc_status/_common.py new file mode 100644 index 00000000000..4bec0ba1372 --- /dev/null +++ b/src/python/grpcio_status/grpc_status/_common.py @@ -0,0 +1,27 @@ +# Copyright 2020 The gRPC Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Reference implementation for status mapping in gRPC Python.""" + +import grpc + +_CODE_TO_GRPC_CODE_MAPPING = {x.value[0]: x for x in grpc.StatusCode} + +GRPC_DETAILS_METADATA_KEY = 'grpc-status-details-bin' + + +def code_to_grpc_status_code(code): + try: + return _CODE_TO_GRPC_CODE_MAPPING[code] + except KeyError: + raise ValueError('Invalid status code %s' % code) diff --git a/src/python/grpcio_status/grpc_status/rpc_status.py b/src/python/grpcio_status/grpc_status/rpc_status.py index ec78c477694..d2bbbae4343 100644 --- a/src/python/grpcio_status/grpc_status/rpc_status.py +++ b/src/python/grpcio_status/grpc_status/rpc_status.py @@ -14,14 +14,12 @@ """Reference implementation for status mapping in gRPC Python.""" import collections +import sys import grpc from google.rpc import status_pb2 - -_CODE_TO_GRPC_CODE_MAPPING = {x.value[0]: x for x in grpc.StatusCode} - -_GRPC_DETAILS_METADATA_KEY = 'grpc-status-details-bin' +from ._common import code_to_grpc_status_code, GRPC_DETAILS_METADATA_KEY class _Status( @@ -31,13 +29,6 @@ class _Status( pass -def _code_to_grpc_status_code(code): - try: - return _CODE_TO_GRPC_CODE_MAPPING[code] - except KeyError: - raise ValueError('Invalid status code %s' % code) - - def from_call(call): """Returns a google.rpc.status.Status message corresponding to a given grpc.Call. @@ -56,13 +47,12 @@ def from_call(call): if call.trailing_metadata() is None: return None for key, value in call.trailing_metadata(): - if key == _GRPC_DETAILS_METADATA_KEY: + if key == GRPC_DETAILS_METADATA_KEY: rich_status = status_pb2.Status.FromString(value) if call.code().value[0] != rich_status.code: raise ValueError( 'Code in Status proto (%s) doesn\'t match status code (%s)' - % - (_code_to_grpc_status_code(rich_status.code), call.code())) + % (code_to_grpc_status_code(rich_status.code), call.code())) if call.details() != rich_status.message: raise ValueError( 'Message in Status proto (%s) doesn\'t match status details (%s)' @@ -83,7 +73,21 @@ def to_status(status): Returns: A grpc.Status instance representing the input google.rpc.status.Status message. """ - return _Status(code=_code_to_grpc_status_code(status.code), + return _Status(code=code_to_grpc_status_code(status.code), details=status.message, - trailing_metadata=((_GRPC_DETAILS_METADATA_KEY, + trailing_metadata=((GRPC_DETAILS_METADATA_KEY, status.SerializeToString()),)) + + +if sys.version_info[0] >= 3 and sys.version_info[1] >= 6: + from . import _async as aio + __all__ = [ + 'from_call', + 'to_status', + 'aio', + ] +else: + __all__ = [ + 'from_call', + 'to_status', + ] diff --git a/src/python/grpcio_tests/tests_aio/status/BUILD.bazel b/src/python/grpcio_tests/tests_aio/status/BUILD.bazel new file mode 100644 index 00000000000..2fd82f2684c --- /dev/null +++ b/src/python/grpcio_tests/tests_aio/status/BUILD.bazel @@ -0,0 +1,30 @@ +# Copyright 2020 The gRPC Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +load("@grpc_python_dependencies//:requirements.bzl", "requirement") + +py_test( + name = "grpc_status_test", + size = "small", + srcs = ["grpc_status_test.py"], + imports = ["../../"], + python_version = "PY3", + deps = [ + "//src/python/grpcio/grpc:grpcio", + "//src/python/grpcio_status/grpc_status", + "//src/python/grpcio_tests/tests_aio/unit:_test_base", + requirement("protobuf"), + requirement("googleapis-common-protos"), + ], +) diff --git a/src/python/grpcio_tests/tests_aio/status/__init__.py b/src/python/grpcio_tests/tests_aio/status/__init__.py new file mode 100644 index 00000000000..1517f71d093 --- /dev/null +++ b/src/python/grpcio_tests/tests_aio/status/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2020 The gRPC Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/src/python/grpcio_tests/tests_aio/status/grpc_status_test.py b/src/python/grpcio_tests/tests_aio/status/grpc_status_test.py new file mode 100644 index 00000000000..b3b894d1161 --- /dev/null +++ b/src/python/grpcio_tests/tests_aio/status/grpc_status_test.py @@ -0,0 +1,175 @@ +# Copyright 2020 The gRPC Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Tests of grpc_status with gRPC AsyncIO stack.""" + +import logging +import traceback +import unittest + +import grpc +from google.protobuf import any_pb2 +from google.rpc import code_pb2, error_details_pb2, status_pb2 +from grpc.experimental import aio + +from grpc_status import rpc_status +from tests_aio.unit._test_base import AioTestBase + +_STATUS_OK = '/test/StatusOK' +_STATUS_NOT_OK = '/test/StatusNotOk' +_ERROR_DETAILS = '/test/ErrorDetails' +_INCONSISTENT = '/test/Inconsistent' +_INVALID_CODE = '/test/InvalidCode' + +_REQUEST = b'\x00\x00\x00' +_RESPONSE = b'\x01\x01\x01' + +_GRPC_DETAILS_METADATA_KEY = 'grpc-status-details-bin' + +_STATUS_DETAILS = 'This is an error detail' +_STATUS_DETAILS_ANOTHER = 'This is another error detail' + + +async def _ok_unary_unary(request, servicer_context): + return _RESPONSE + + +async def _not_ok_unary_unary(request, servicer_context): + await servicer_context.abort(grpc.StatusCode.INTERNAL, _STATUS_DETAILS) + + +async def _error_details_unary_unary(request, servicer_context): + details = any_pb2.Any() + details.Pack( + error_details_pb2.DebugInfo(stack_entries=traceback.format_stack(), + detail='Intentionally invoked')) + rich_status = status_pb2.Status( + code=code_pb2.INTERNAL, + message=_STATUS_DETAILS, + details=[details], + ) + await servicer_context.abort_with_status(rpc_status.to_status(rich_status)) + + +async def _inconsistent_unary_unary(request, servicer_context): + rich_status = status_pb2.Status( + code=code_pb2.INTERNAL, + message=_STATUS_DETAILS, + ) + servicer_context.set_code(grpc.StatusCode.NOT_FOUND) + servicer_context.set_details(_STATUS_DETAILS_ANOTHER) + # User put inconsistent status information in trailing metadata + servicer_context.set_trailing_metadata( + ((_GRPC_DETAILS_METADATA_KEY, rich_status.SerializeToString()),)) + + +async def _invalid_code_unary_unary(request, servicer_context): + rich_status = status_pb2.Status( + code=42, + message='Invalid code', + ) + await servicer_context.abort_with_status(rpc_status.to_status(rich_status)) + + +class _GenericHandler(grpc.GenericRpcHandler): + + def service(self, handler_call_details): + if handler_call_details.method == _STATUS_OK: + return grpc.unary_unary_rpc_method_handler(_ok_unary_unary) + elif handler_call_details.method == _STATUS_NOT_OK: + return grpc.unary_unary_rpc_method_handler(_not_ok_unary_unary) + elif handler_call_details.method == _ERROR_DETAILS: + return grpc.unary_unary_rpc_method_handler( + _error_details_unary_unary) + elif handler_call_details.method == _INCONSISTENT: + return grpc.unary_unary_rpc_method_handler( + _inconsistent_unary_unary) + elif handler_call_details.method == _INVALID_CODE: + return grpc.unary_unary_rpc_method_handler( + _invalid_code_unary_unary) + else: + return None + + +class StatusTest(AioTestBase): + + async def setUp(self): + self._server = aio.server() + self._server.add_generic_rpc_handlers((_GenericHandler(),)) + port = self._server.add_insecure_port('[::]:0') + await self._server.start() + + self._channel = aio.insecure_channel('localhost:%d' % port) + + async def tearDown(self): + await self._server.stop(None) + await self._channel.close() + + async def test_status_ok(self): + call = self._channel.unary_unary(_STATUS_OK)(_REQUEST) + + # Succeed RPC doesn't have status + status = await rpc_status.aio.from_call(call) + self.assertIs(status, None) + + async def test_status_not_ok(self): + call = self._channel.unary_unary(_STATUS_NOT_OK)(_REQUEST) + with self.assertRaises(aio.AioRpcError) as exception_context: + await call + rpc_error = exception_context.exception + + self.assertEqual(rpc_error.code(), grpc.StatusCode.INTERNAL) + # Failed RPC doesn't automatically generate status + status = await rpc_status.aio.from_call(call) + self.assertIs(status, None) + + async def test_error_details(self): + call = self._channel.unary_unary(_ERROR_DETAILS)(_REQUEST) + with self.assertRaises(aio.AioRpcError) as exception_context: + await call + rpc_error = exception_context.exception + + status = await rpc_status.aio.from_call(call) + self.assertEqual(rpc_error.code(), grpc.StatusCode.INTERNAL) + self.assertEqual(status.code, code_pb2.Code.Value('INTERNAL')) + + # Check if the underlying proto message is intact + self.assertEqual( + status.details[0].Is(error_details_pb2.DebugInfo.DESCRIPTOR), True) + info = error_details_pb2.DebugInfo() + status.details[0].Unpack(info) + self.assertIn('_error_details_unary_unary', info.stack_entries[-1]) + + async def test_code_message_validation(self): + call = self._channel.unary_unary(_INCONSISTENT)(_REQUEST) + with self.assertRaises(aio.AioRpcError) as exception_context: + await call + rpc_error = exception_context.exception + self.assertEqual(rpc_error.code(), grpc.StatusCode.NOT_FOUND) + + # Code/Message validation failed + with self.assertRaises(ValueError): + await rpc_status.aio.from_call(call) + + async def test_invalid_code(self): + with self.assertRaises(aio.AioRpcError) as exception_context: + await self._channel.unary_unary(_INVALID_CODE)(_REQUEST) + rpc_error = exception_context.exception + self.assertEqual(rpc_error.code(), grpc.StatusCode.UNKNOWN) + # Invalid status code exception raised during coversion + self.assertIn('Invalid status code', rpc_error.details()) + + +if __name__ == '__main__': + logging.basicConfig() + unittest.main(verbosity=2) diff --git a/src/python/grpcio_tests/tests_aio/tests.json b/src/python/grpcio_tests/tests_aio/tests.json index f28976e360a..9f9bbfdc660 100644 --- a/src/python/grpcio_tests/tests_aio/tests.json +++ b/src/python/grpcio_tests/tests_aio/tests.json @@ -4,6 +4,7 @@ "interop.local_interop_test.InsecureLocalInteropTest", "interop.local_interop_test.SecureLocalInteropTest", "reflection.reflection_servicer_test.ReflectionServicerTest", + "status.grpc_status_test.StatusTest", "unit._metadata_test.TestTypeMetadata", "unit.abort_test.TestAbort", "unit.aio_rpc_error_test.TestAioRpcError", From fcc41aedc81d60f3092d764a1812981c5745235d Mon Sep 17 00:00:00 2001 From: Donna Dionne Date: Thu, 16 Apr 2020 13:44:53 -0700 Subject: [PATCH 521/758] Fixing build errors. --- Makefile | 5 ++++- src/core/ext/filters/client_channel/xds/xds_api.cc | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 23275ef86cc..29ece2be8e1 100644 --- a/Makefile +++ b/Makefile @@ -19027,6 +19027,7 @@ XDS_END2END_TEST_SRC = \ $(GENDIR)/src/proto/grpc/testing/xds/lds_rds_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/lds_rds_for_test.grpc.pb.cc \ $(GENDIR)/src/proto/grpc/testing/xds/lrs_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/lrs_for_test.grpc.pb.cc \ test/cpp/end2end/xds_end2end_test.cc \ + test/cpp/end2end/test_service_impl.cc \ XDS_END2END_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(XDS_END2END_TEST_SRC)))) ifeq ($(NO_SECURE),true) @@ -19077,6 +19078,8 @@ $(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/xds/lrs_for_test.o: $(LIBDIR)/$(CONF $(OBJDIR)/$(CONFIG)/test/cpp/end2end/xds_end2end_test.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/test_service_impl.o: $(LIBDIR)/$(CONFIG)/libgrpcpp_channelz.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + deps_xds_end2end_test: $(XDS_END2END_TEST_OBJS:.o=.dep) ifneq ($(NO_SECURE),true) @@ -19084,7 +19087,7 @@ ifneq ($(NO_DEPS),true) -include $(XDS_END2END_TEST_OBJS:.o=.dep) endif endif -$(OBJDIR)/$(CONFIG)/test/cpp/end2end/xds_end2end_test.o: $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/ads_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/ads_for_test.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/cds_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/cds_for_test.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/eds_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/eds_for_test.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/lds_rds_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/lds_rds_for_test.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/lrs_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/lrs_for_test.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/xds_end2end_test.o: $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc $(OBJDIR)/$(CONFIG)/test/cpp/end2end/test_service_impl.o: $(GENDIR)/src/proto/grpc/testing/xds/ads_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/ads_for_test.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/cds_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/cds_for_test.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/eds_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/eds_for_test.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/lds_rds_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/lds_rds_for_test.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/lrs_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/lrs_for_test.grpc.pb.cc XDS_INTEROP_CLIENT_SRC = \ diff --git a/src/core/ext/filters/client_channel/xds/xds_api.cc b/src/core/ext/filters/client_channel/xds/xds_api.cc index 54e24aa0c66..eb9fe41c948 100644 --- a/src/core/ext/filters/client_channel/xds/xds_api.cc +++ b/src/core/ext/filters/client_channel/xds/xds_api.cc @@ -1025,7 +1025,7 @@ grpc_error* RouteConfigParse( upb_strview prefix = envoy_api_v2_route_RouteMatch_prefix(match); // Empty prefix "" is accepted. if (prefix.size == 1) { - //Prefix "/" is accepted. + // Prefix "/" is accepted. if (prefix.data[0] != '/') { return GRPC_ERROR_CREATE_FROM_STATIC_STRING( "Prefix is not empty and does starting with a /"); From 39ad034e8890f46a89ac3e52588ad35f5d7d50cc Mon Sep 17 00:00:00 2001 From: Donna Dionne Date: Thu, 16 Apr 2020 14:13:01 -0700 Subject: [PATCH 522/758] Fixing build errors --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 29ece2be8e1..50a3f375b09 100644 --- a/Makefile +++ b/Makefile @@ -19078,7 +19078,7 @@ $(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/xds/lrs_for_test.o: $(LIBDIR)/$(CONF $(OBJDIR)/$(CONFIG)/test/cpp/end2end/xds_end2end_test.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a -$(OBJDIR)/$(CONFIG)/test/cpp/end2end/test_service_impl.o: $(LIBDIR)/$(CONFIG)/libgrpcpp_channelz.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/test_service_impl.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a deps_xds_end2end_test: $(XDS_END2END_TEST_OBJS:.o=.dep) From 22c7d8d0cd0a9e5afdc91f56e40286b78cc748ff Mon Sep 17 00:00:00 2001 From: Donna Dionne Date: Thu, 16 Apr 2020 14:55:22 -0700 Subject: [PATCH 523/758] Fixing build error --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 50a3f375b09..d1345dbfad5 100644 --- a/Makefile +++ b/Makefile @@ -19087,8 +19087,8 @@ ifneq ($(NO_DEPS),true) -include $(XDS_END2END_TEST_OBJS:.o=.dep) endif endif -$(OBJDIR)/$(CONFIG)/test/cpp/end2end/xds_end2end_test.o: $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc $(OBJDIR)/$(CONFIG)/test/cpp/end2end/test_service_impl.o: $(GENDIR)/src/proto/grpc/testing/xds/ads_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/ads_for_test.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/cds_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/cds_for_test.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/eds_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/eds_for_test.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/lds_rds_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/lds_rds_for_test.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/lrs_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/lrs_for_test.grpc.pb.cc - +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/xds_end2end_test.o: $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/ads_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/ads_for_test.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/cds_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/cds_for_test.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/eds_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/eds_for_test.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/lds_rds_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/lds_rds_for_test.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/lrs_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/lrs_for_test.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/test_service_impl.o: $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/ads_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/ads_for_test.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/cds_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/cds_for_test.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/eds_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/eds_for_test.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/lds_rds_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/lds_rds_for_test.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/lrs_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/lrs_for_test.grpc.pb.cc XDS_INTEROP_CLIENT_SRC = \ $(GENDIR)/src/proto/grpc/testing/empty.pb.cc $(GENDIR)/src/proto/grpc/testing/empty.grpc.pb.cc \ From 99c5b647bfe12eeb2382d4f7075688e3a68feda6 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Thu, 16 Apr 2020 15:09:53 -0700 Subject: [PATCH 524/758] Revert "[Aio] Add AsyncIO support to grpcio-reflection" --- .../grpc_reflection/v1alpha/BUILD.bazel | 2 +- .../grpc_reflection/v1alpha/_async.py | 57 ------ .../grpc_reflection/v1alpha/_base.py | 110 ---------- .../grpc_reflection/v1alpha/reflection.py | 137 +++++++++---- .../tests_aio/reflection/BUILD.bazel | 30 --- .../tests_aio/reflection/__init__.py | 13 -- .../reflection/reflection_servicer_test.py | 193 ------------------ src/python/grpcio_tests/tests_aio/tests.json | 1 - 8 files changed, 93 insertions(+), 450 deletions(-) delete mode 100644 src/python/grpcio_reflection/grpc_reflection/v1alpha/_async.py delete mode 100644 src/python/grpcio_reflection/grpc_reflection/v1alpha/_base.py delete mode 100644 src/python/grpcio_tests/tests_aio/reflection/BUILD.bazel delete mode 100644 src/python/grpcio_tests/tests_aio/reflection/__init__.py delete mode 100644 src/python/grpcio_tests/tests_aio/reflection/reflection_servicer_test.py diff --git a/src/python/grpcio_reflection/grpc_reflection/v1alpha/BUILD.bazel b/src/python/grpcio_reflection/grpc_reflection/v1alpha/BUILD.bazel index 6e3d8e01eea..cf30c395c68 100644 --- a/src/python/grpcio_reflection/grpc_reflection/v1alpha/BUILD.bazel +++ b/src/python/grpcio_reflection/grpc_reflection/v1alpha/BUILD.bazel @@ -17,7 +17,7 @@ py_grpc_library( py_library( name = "grpc_reflection", - srcs = glob(["*.py"]), + srcs = ["reflection.py"], imports = ["../../"], deps = [ ":reflection_py_pb2", diff --git a/src/python/grpcio_reflection/grpc_reflection/v1alpha/_async.py b/src/python/grpcio_reflection/grpc_reflection/v1alpha/_async.py deleted file mode 100644 index 6e684a4e5e0..00000000000 --- a/src/python/grpcio_reflection/grpc_reflection/v1alpha/_async.py +++ /dev/null @@ -1,57 +0,0 @@ -# Copyright 2020 gRPC authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""The AsyncIO version of the reflection servicer.""" - -from typing import AsyncIterable - -import grpc - -from grpc_reflection.v1alpha import reflection_pb2 as _reflection_pb2 -from grpc_reflection.v1alpha._base import BaseReflectionServicer - - -class ReflectionServicer(BaseReflectionServicer): - """Servicer handling RPCs for service statuses.""" - - async def ServerReflectionInfo( - self, request_iterator: AsyncIterable[ - _reflection_pb2.ServerReflectionRequest], unused_context - ) -> AsyncIterable[_reflection_pb2.ServerReflectionResponse]: - async for request in request_iterator: - if request.HasField('file_by_filename'): - yield self._file_by_filename(request.file_by_filename) - elif request.HasField('file_containing_symbol'): - yield self._file_containing_symbol( - request.file_containing_symbol) - elif request.HasField('file_containing_extension'): - yield self._file_containing_extension( - request.file_containing_extension.containing_type, - request.file_containing_extension.extension_number) - elif request.HasField('all_extension_numbers_of_type'): - yield self._all_extension_numbers_of_type( - request.all_extension_numbers_of_type) - elif request.HasField('list_services'): - yield self._list_services() - else: - yield _reflection_pb2.ServerReflectionResponse( - error_response=_reflection_pb2.ErrorResponse( - error_code=grpc.StatusCode.INVALID_ARGUMENT.value[0], - error_message=grpc.StatusCode.INVALID_ARGUMENT.value[1]. - encode(), - )) - - -__all__ = [ - "ReflectionServicer", -] diff --git a/src/python/grpcio_reflection/grpc_reflection/v1alpha/_base.py b/src/python/grpcio_reflection/grpc_reflection/v1alpha/_base.py deleted file mode 100644 index 2c9e79c9dd1..00000000000 --- a/src/python/grpcio_reflection/grpc_reflection/v1alpha/_base.py +++ /dev/null @@ -1,110 +0,0 @@ -# Copyright 2020 gRPC authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Base implementation of reflection servicer.""" - -import grpc -from google.protobuf import descriptor_pb2 -from google.protobuf import descriptor_pool - -from grpc_reflection.v1alpha import reflection_pb2 as _reflection_pb2 -from grpc_reflection.v1alpha import reflection_pb2_grpc as _reflection_pb2_grpc - -_POOL = descriptor_pool.Default() - - -def _not_found_error(): - return _reflection_pb2.ServerReflectionResponse( - error_response=_reflection_pb2.ErrorResponse( - error_code=grpc.StatusCode.NOT_FOUND.value[0], - error_message=grpc.StatusCode.NOT_FOUND.value[1].encode(), - )) - - -def _file_descriptor_response(descriptor): - proto = descriptor_pb2.FileDescriptorProto() - descriptor.CopyToProto(proto) - serialized_proto = proto.SerializeToString() - return _reflection_pb2.ServerReflectionResponse( - file_descriptor_response=_reflection_pb2.FileDescriptorResponse( - file_descriptor_proto=(serialized_proto,)),) - - -class BaseReflectionServicer(_reflection_pb2_grpc.ServerReflectionServicer): - """Base class for reflection servicer.""" - - def __init__(self, service_names, pool=None): - """Constructor. - - Args: - service_names: Iterable of fully-qualified service names available. - pool: An optional DescriptorPool instance. - """ - self._service_names = tuple(sorted(service_names)) - self._pool = _POOL if pool is None else pool - - def _file_by_filename(self, filename): - try: - descriptor = self._pool.FindFileByName(filename) - except KeyError: - return _not_found_error() - else: - return _file_descriptor_response(descriptor) - - def _file_containing_symbol(self, fully_qualified_name): - try: - descriptor = self._pool.FindFileContainingSymbol( - fully_qualified_name) - except KeyError: - return _not_found_error() - else: - return _file_descriptor_response(descriptor) - - def _file_containing_extension(self, containing_type, extension_number): - try: - message_descriptor = self._pool.FindMessageTypeByName( - containing_type) - extension_descriptor = self._pool.FindExtensionByNumber( - message_descriptor, extension_number) - descriptor = self._pool.FindFileContainingSymbol( - extension_descriptor.full_name) - except KeyError: - return _not_found_error() - else: - return _file_descriptor_response(descriptor) - - def _all_extension_numbers_of_type(self, containing_type): - try: - message_descriptor = self._pool.FindMessageTypeByName( - containing_type) - extension_numbers = tuple( - sorted(extension.number for extension in - self._pool.FindAllExtensions(message_descriptor))) - except KeyError: - return _not_found_error() - else: - return _reflection_pb2.ServerReflectionResponse( - all_extension_numbers_response=_reflection_pb2. - ExtensionNumberResponse( - base_type_name=message_descriptor.full_name, - extension_number=extension_numbers)) - - def _list_services(self): - return _reflection_pb2.ServerReflectionResponse( - list_services_response=_reflection_pb2.ListServiceResponse(service=[ - _reflection_pb2.ServiceResponse(name=service_name) - for service_name in self._service_names - ])) - - -__all__ = ['BaseReflectionServicer'] diff --git a/src/python/grpcio_reflection/grpc_reflection/v1alpha/reflection.py b/src/python/grpcio_reflection/grpc_reflection/v1alpha/reflection.py index 219f10ab61c..dde291ff740 100644 --- a/src/python/grpcio_reflection/grpc_reflection/v1alpha/reflection.py +++ b/src/python/grpcio_reflection/grpc_reflection/v1alpha/reflection.py @@ -13,21 +13,100 @@ # limitations under the License. """Reference implementation for reflection in gRPC Python.""" -import sys import grpc +from google.protobuf import descriptor_pb2 +from google.protobuf import descriptor_pool from grpc_reflection.v1alpha import reflection_pb2 as _reflection_pb2 from grpc_reflection.v1alpha import reflection_pb2_grpc as _reflection_pb2_grpc -from grpc_reflection.v1alpha._base import BaseReflectionServicer - +_POOL = descriptor_pool.Default() SERVICE_NAME = _reflection_pb2.DESCRIPTOR.services_by_name[ 'ServerReflection'].full_name -class ReflectionServicer(BaseReflectionServicer): +def _not_found_error(): + return _reflection_pb2.ServerReflectionResponse( + error_response=_reflection_pb2.ErrorResponse( + error_code=grpc.StatusCode.NOT_FOUND.value[0], + error_message=grpc.StatusCode.NOT_FOUND.value[1].encode(), + )) + + +def _file_descriptor_response(descriptor): + proto = descriptor_pb2.FileDescriptorProto() + descriptor.CopyToProto(proto) + serialized_proto = proto.SerializeToString() + return _reflection_pb2.ServerReflectionResponse( + file_descriptor_response=_reflection_pb2.FileDescriptorResponse( + file_descriptor_proto=(serialized_proto,)),) + + +class ReflectionServicer(_reflection_pb2_grpc.ServerReflectionServicer): """Servicer handling RPCs for service statuses.""" + def __init__(self, service_names, pool=None): + """Constructor. + + Args: + service_names: Iterable of fully-qualified service names available. + """ + self._service_names = tuple(sorted(service_names)) + self._pool = _POOL if pool is None else pool + + def _file_by_filename(self, filename): + try: + descriptor = self._pool.FindFileByName(filename) + except KeyError: + return _not_found_error() + else: + return _file_descriptor_response(descriptor) + + def _file_containing_symbol(self, fully_qualified_name): + try: + descriptor = self._pool.FindFileContainingSymbol( + fully_qualified_name) + except KeyError: + return _not_found_error() + else: + return _file_descriptor_response(descriptor) + + def _file_containing_extension(self, containing_type, extension_number): + try: + message_descriptor = self._pool.FindMessageTypeByName( + containing_type) + extension_descriptor = self._pool.FindExtensionByNumber( + message_descriptor, extension_number) + descriptor = self._pool.FindFileContainingSymbol( + extension_descriptor.full_name) + except KeyError: + return _not_found_error() + else: + return _file_descriptor_response(descriptor) + + def _all_extension_numbers_of_type(self, containing_type): + try: + message_descriptor = self._pool.FindMessageTypeByName( + containing_type) + extension_numbers = tuple( + sorted(extension.number for extension in + self._pool.FindAllExtensions(message_descriptor))) + except KeyError: + return _not_found_error() + else: + return _reflection_pb2.ServerReflectionResponse( + all_extension_numbers_response=_reflection_pb2. + ExtensionNumberResponse( + base_type_name=message_descriptor.full_name, + extension_number=extension_numbers)) + + def _list_services(self): + return _reflection_pb2.ServerReflectionResponse( + list_services_response=_reflection_pb2.ListServiceResponse(service=[ + _reflection_pb2.ServiceResponse(name=service_name) + for service_name in self._service_names + ])) + def ServerReflectionInfo(self, request_iterator, context): # pylint: disable=unused-argument for request in request_iterator: @@ -54,45 +133,13 @@ class ReflectionServicer(BaseReflectionServicer): )) -_enable_server_reflection_doc = """Enables server reflection on a server. +def enable_server_reflection(service_names, server, pool=None): + """Enables server reflection on a server. -Args: - service_names: Iterable of fully-qualified service names available. - server: grpc.Server to which reflection service will be added. - pool: DescriptorPool object to use (descriptor_pool.Default() if None). -""" - -if sys.version_info[0] >= 3 and sys.version_info[1] >= 6: - # Exposes AsyncReflectionServicer as public API. - from . import _async as aio - from grpc.experimental import aio as grpc_aio # pylint: disable=ungrouped-imports - - def enable_server_reflection(service_names, server, pool=None): - if isinstance(server, grpc_aio.Server): - _reflection_pb2_grpc.add_ServerReflectionServicer_to_server( - aio.ReflectionServicer(service_names, pool=pool), server) - else: - _reflection_pb2_grpc.add_ServerReflectionServicer_to_server( - ReflectionServicer(service_names, pool=pool), server) - - enable_server_reflection.__doc__ = _enable_server_reflection_doc - - __all__ = [ - "SERVICE_NAME", - "ReflectionServicer", - "enable_server_reflection", - "aio", - ] -else: - - def enable_server_reflection(service_names, server, pool=None): - _reflection_pb2_grpc.add_ServerReflectionServicer_to_server( - ReflectionServicer(service_names, pool=pool), server) - - enable_server_reflection.__doc__ = _enable_server_reflection_doc - - __all__ = [ - "SERVICE_NAME", - "ReflectionServicer", - "enable_server_reflection", - ] + Args: + service_names: Iterable of fully-qualified service names available. + server: grpc.Server to which reflection service will be added. + pool: DescriptorPool object to use (descriptor_pool.Default() if None). + """ + _reflection_pb2_grpc.add_ServerReflectionServicer_to_server( + ReflectionServicer(service_names, pool=pool), server) diff --git a/src/python/grpcio_tests/tests_aio/reflection/BUILD.bazel b/src/python/grpcio_tests/tests_aio/reflection/BUILD.bazel deleted file mode 100644 index 88bf8cc903f..00000000000 --- a/src/python/grpcio_tests/tests_aio/reflection/BUILD.bazel +++ /dev/null @@ -1,30 +0,0 @@ -# Copyright 2020 gRPC authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -package(default_testonly = 1) - -py_test( - name = "reflection_servicer_test", - srcs = ["reflection_servicer_test.py"], - imports = ["../../"], - python_version = "PY3", - deps = [ - "//src/proto/grpc/testing:empty_py_pb2", - "//src/proto/grpc/testing/proto2:empty2_extensions_proto", - "//src/proto/grpc/testing/proto2:empty2_proto", - "//src/python/grpcio/grpc:grpcio", - "//src/python/grpcio_reflection/grpc_reflection/v1alpha:grpc_reflection", - "//src/python/grpcio_tests/tests_aio/unit:_test_base", - ], -) diff --git a/src/python/grpcio_tests/tests_aio/reflection/__init__.py b/src/python/grpcio_tests/tests_aio/reflection/__init__.py deleted file mode 100644 index 5772620b602..00000000000 --- a/src/python/grpcio_tests/tests_aio/reflection/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright 2016 gRPC authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. diff --git a/src/python/grpcio_tests/tests_aio/reflection/reflection_servicer_test.py b/src/python/grpcio_tests/tests_aio/reflection/reflection_servicer_test.py deleted file mode 100644 index 11242ed7e5d..00000000000 --- a/src/python/grpcio_tests/tests_aio/reflection/reflection_servicer_test.py +++ /dev/null @@ -1,193 +0,0 @@ -# Copyright 2016 gRPC authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Tests of grpc_reflection.v1alpha.reflection.""" - -import logging -import unittest - -import grpc -from google.protobuf import descriptor_pb2, descriptor_pool -from grpc.experimental import aio - -from grpc_reflection.v1alpha import (reflection, reflection_pb2, - reflection_pb2_grpc) -from src.proto.grpc.testing import empty_pb2 -from src.proto.grpc.testing.proto2 import empty2_extensions_pb2 -from tests_aio.unit._test_base import AioTestBase - -_EMPTY_PROTO_FILE_NAME = 'src/proto/grpc/testing/empty.proto' -_EMPTY_PROTO_SYMBOL_NAME = 'grpc.testing.Empty' -_SERVICE_NAMES = ('Angstrom', 'Bohr', 'Curie', 'Dyson', 'Einstein', 'Feynman', - 'Galilei') -_EMPTY_EXTENSIONS_SYMBOL_NAME = 'grpc.testing.proto2.EmptyWithExtensions' -_EMPTY_EXTENSIONS_NUMBERS = ( - 124, - 125, - 126, - 127, - 128, -) - - -def _file_descriptor_to_proto(descriptor): - proto = descriptor_pb2.FileDescriptorProto() - descriptor.CopyToProto(proto) - return proto.SerializeToString() - - -class ReflectionServicerTest(AioTestBase): - - async def setUp(self): - self._server = aio.server() - reflection.enable_server_reflection(_SERVICE_NAMES, self._server) - port = self._server.add_insecure_port('[::]:0') - await self._server.start() - - self._channel = aio.insecure_channel('localhost:%d' % port) - self._stub = reflection_pb2_grpc.ServerReflectionStub(self._channel) - - async def tearDown(self): - await self._server.stop(None) - await self._channel.close() - - async def test_file_by_name(self): - requests = ( - reflection_pb2.ServerReflectionRequest( - file_by_filename=_EMPTY_PROTO_FILE_NAME), - reflection_pb2.ServerReflectionRequest( - file_by_filename='i-donut-exist'), - ) - responses = [] - async for response in self._stub.ServerReflectionInfo(iter(requests)): - responses.append(response) - expected_responses = ( - reflection_pb2.ServerReflectionResponse( - valid_host='', - file_descriptor_response=reflection_pb2.FileDescriptorResponse( - file_descriptor_proto=( - _file_descriptor_to_proto(empty_pb2.DESCRIPTOR),))), - reflection_pb2.ServerReflectionResponse( - valid_host='', - error_response=reflection_pb2.ErrorResponse( - error_code=grpc.StatusCode.NOT_FOUND.value[0], - error_message=grpc.StatusCode.NOT_FOUND.value[1].encode(), - )), - ) - self.assertSequenceEqual(expected_responses, responses) - - async def test_file_by_symbol(self): - requests = ( - reflection_pb2.ServerReflectionRequest( - file_containing_symbol=_EMPTY_PROTO_SYMBOL_NAME), - reflection_pb2.ServerReflectionRequest( - file_containing_symbol='i.donut.exist.co.uk.org.net.me.name.foo' - ), - ) - responses = [] - async for response in self._stub.ServerReflectionInfo(iter(requests)): - responses.append(response) - expected_responses = ( - reflection_pb2.ServerReflectionResponse( - valid_host='', - file_descriptor_response=reflection_pb2.FileDescriptorResponse( - file_descriptor_proto=( - _file_descriptor_to_proto(empty_pb2.DESCRIPTOR),))), - reflection_pb2.ServerReflectionResponse( - valid_host='', - error_response=reflection_pb2.ErrorResponse( - error_code=grpc.StatusCode.NOT_FOUND.value[0], - error_message=grpc.StatusCode.NOT_FOUND.value[1].encode(), - )), - ) - self.assertSequenceEqual(expected_responses, responses) - - async def test_file_containing_extension(self): - requests = ( - reflection_pb2.ServerReflectionRequest( - file_containing_extension=reflection_pb2.ExtensionRequest( - containing_type=_EMPTY_EXTENSIONS_SYMBOL_NAME, - extension_number=125, - ),), - reflection_pb2.ServerReflectionRequest( - file_containing_extension=reflection_pb2.ExtensionRequest( - containing_type='i.donut.exist.co.uk.org.net.me.name.foo', - extension_number=55, - ),), - ) - responses = [] - async for response in self._stub.ServerReflectionInfo(iter(requests)): - responses.append(response) - expected_responses = ( - reflection_pb2.ServerReflectionResponse( - valid_host='', - file_descriptor_response=reflection_pb2.FileDescriptorResponse( - file_descriptor_proto=(_file_descriptor_to_proto( - empty2_extensions_pb2.DESCRIPTOR),))), - reflection_pb2.ServerReflectionResponse( - valid_host='', - error_response=reflection_pb2.ErrorResponse( - error_code=grpc.StatusCode.NOT_FOUND.value[0], - error_message=grpc.StatusCode.NOT_FOUND.value[1].encode(), - )), - ) - self.assertSequenceEqual(expected_responses, responses) - - async def test_extension_numbers_of_type(self): - requests = ( - reflection_pb2.ServerReflectionRequest( - all_extension_numbers_of_type=_EMPTY_EXTENSIONS_SYMBOL_NAME), - reflection_pb2.ServerReflectionRequest( - all_extension_numbers_of_type='i.donut.exist.co.uk.net.name.foo' - ), - ) - responses = [] - async for response in self._stub.ServerReflectionInfo(iter(requests)): - responses.append(response) - expected_responses = ( - reflection_pb2.ServerReflectionResponse( - valid_host='', - all_extension_numbers_response=reflection_pb2. - ExtensionNumberResponse( - base_type_name=_EMPTY_EXTENSIONS_SYMBOL_NAME, - extension_number=_EMPTY_EXTENSIONS_NUMBERS)), - reflection_pb2.ServerReflectionResponse( - valid_host='', - error_response=reflection_pb2.ErrorResponse( - error_code=grpc.StatusCode.NOT_FOUND.value[0], - error_message=grpc.StatusCode.NOT_FOUND.value[1].encode(), - )), - ) - self.assertSequenceEqual(expected_responses, responses) - - async def test_list_services(self): - requests = (reflection_pb2.ServerReflectionRequest(list_services='',),) - responses = [] - async for response in self._stub.ServerReflectionInfo(iter(requests)): - responses.append(response) - expected_responses = (reflection_pb2.ServerReflectionResponse( - valid_host='', - list_services_response=reflection_pb2.ListServiceResponse( - service=tuple( - reflection_pb2.ServiceResponse(name=name) - for name in _SERVICE_NAMES))),) - self.assertSequenceEqual(expected_responses, responses) - - def test_reflection_service_name(self): - self.assertEqual(reflection.SERVICE_NAME, - 'grpc.reflection.v1alpha.ServerReflection') - - -if __name__ == '__main__': - logging.basicConfig(level=logging.DEBUG) - unittest.main(verbosity=2) diff --git a/src/python/grpcio_tests/tests_aio/tests.json b/src/python/grpcio_tests/tests_aio/tests.json index f28976e360a..71f8733f5f9 100644 --- a/src/python/grpcio_tests/tests_aio/tests.json +++ b/src/python/grpcio_tests/tests_aio/tests.json @@ -3,7 +3,6 @@ "health_check.health_servicer_test.HealthServicerTest", "interop.local_interop_test.InsecureLocalInteropTest", "interop.local_interop_test.SecureLocalInteropTest", - "reflection.reflection_servicer_test.ReflectionServicerTest", "unit._metadata_test.TestTypeMetadata", "unit.abort_test.TestAbort", "unit.aio_rpc_error_test.TestAioRpcError", From aea9bfcbb2505d22236b191337bf6043e65c7f4c Mon Sep 17 00:00:00 2001 From: Donna Dionne Date: Thu, 16 Apr 2020 15:29:26 -0700 Subject: [PATCH 525/758] Last bit of build failures. --- CMakeLists.txt | 1 + Makefile | 9 +++++---- build_autogenerated.yaml | 1 + 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 05396f8cdcc..9c13037f929 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -14450,6 +14450,7 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/lrs_for_test.grpc.pb.cc ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/lrs_for_test.pb.h ${_gRPC_PROTO_GENS_DIR}/src/proto/grpc/testing/xds/lrs_for_test.grpc.pb.h + test/cpp/end2end/test_service_impl.cc test/cpp/end2end/xds_end2end_test.cc third_party/googletest/googletest/src/gtest-all.cc third_party/googletest/googlemock/src/gmock-all.cc diff --git a/Makefile b/Makefile index d1345dbfad5..595d57e4a5a 100644 --- a/Makefile +++ b/Makefile @@ -19026,8 +19026,8 @@ XDS_END2END_TEST_SRC = \ $(GENDIR)/src/proto/grpc/testing/xds/eds_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/eds_for_test.grpc.pb.cc \ $(GENDIR)/src/proto/grpc/testing/xds/lds_rds_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/lds_rds_for_test.grpc.pb.cc \ $(GENDIR)/src/proto/grpc/testing/xds/lrs_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/lrs_for_test.grpc.pb.cc \ - test/cpp/end2end/xds_end2end_test.cc \ test/cpp/end2end/test_service_impl.cc \ + test/cpp/end2end/xds_end2end_test.cc \ XDS_END2END_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(XDS_END2END_TEST_SRC)))) ifeq ($(NO_SECURE),true) @@ -19076,10 +19076,10 @@ $(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/xds/lds_rds_for_test.o: $(LIBDIR)/$( $(OBJDIR)/$(CONFIG)/src/proto/grpc/testing/xds/lrs_for_test.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a -$(OBJDIR)/$(CONFIG)/test/cpp/end2end/xds_end2end_test.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a - $(OBJDIR)/$(CONFIG)/test/cpp/end2end/test_service_impl.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/xds_end2end_test.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a + deps_xds_end2end_test: $(XDS_END2END_TEST_OBJS:.o=.dep) ifneq ($(NO_SECURE),true) @@ -19087,8 +19087,9 @@ ifneq ($(NO_DEPS),true) -include $(XDS_END2END_TEST_OBJS:.o=.dep) endif endif -$(OBJDIR)/$(CONFIG)/test/cpp/end2end/xds_end2end_test.o: $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/ads_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/ads_for_test.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/cds_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/cds_for_test.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/eds_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/eds_for_test.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/lds_rds_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/lds_rds_for_test.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/lrs_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/lrs_for_test.grpc.pb.cc $(OBJDIR)/$(CONFIG)/test/cpp/end2end/test_service_impl.o: $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/ads_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/ads_for_test.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/cds_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/cds_for_test.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/eds_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/eds_for_test.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/lds_rds_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/lds_rds_for_test.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/lrs_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/lrs_for_test.grpc.pb.cc +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/xds_end2end_test.o: $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.pb.cc $(GENDIR)/src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.pb.cc $(GENDIR)/src/proto/grpc/testing/echo.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/echo_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.pb.cc $(GENDIR)/src/proto/grpc/testing/simple_messages.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/ads_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/ads_for_test.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/cds_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/cds_for_test.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/eds_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/eds_for_test.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/lds_rds_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/lds_rds_for_test.grpc.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/lrs_for_test.pb.cc $(GENDIR)/src/proto/grpc/testing/xds/lrs_for_test.grpc.pb.cc + XDS_INTEROP_CLIENT_SRC = \ $(GENDIR)/src/proto/grpc/testing/empty.pb.cc $(GENDIR)/src/proto/grpc/testing/empty.grpc.pb.cc \ diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml index 02b8c925fd9..1cfd5c7b482 100644 --- a/build_autogenerated.yaml +++ b/build_autogenerated.yaml @@ -7558,6 +7558,7 @@ targets: - src/proto/grpc/testing/xds/eds_for_test.proto - src/proto/grpc/testing/xds/lds_rds_for_test.proto - src/proto/grpc/testing/xds/lrs_for_test.proto + - test/cpp/end2end/test_service_impl.cc - test/cpp/end2end/xds_end2end_test.cc deps: - grpc++_test_util From 424e81eaecb776f391fa1bfa5f581c39450ae8e4 Mon Sep 17 00:00:00 2001 From: Donna Dionne Date: Thu, 16 Apr 2020 15:47:26 -0700 Subject: [PATCH 526/758] Code Review comments --- test/cpp/end2end/xds_end2end_test.cc | 186 +++++++++++++++++++++------ 1 file changed, 149 insertions(+), 37 deletions(-) diff --git a/test/cpp/end2end/xds_end2end_test.cc b/test/cpp/end2end/xds_end2end_test.cc index 7e1fa4af6af..6c3cf0dea84 100644 --- a/test/cpp/end2end/xds_end2end_test.cc +++ b/test/cpp/end2end/xds_end2end_test.cc @@ -1406,21 +1406,20 @@ class XdsEnd2endTest : public ::testing::TestWithParam { } }; - // TODO@donnadionne: Will replace SendRpc in all tests. template Status SendRpcMethod(Stub* stub, const RpcOptions& rpc_options, - EchoRequest& request, EchoResponse* response) { - ClientContext context; - context.set_deadline( + ClientContext* context, EchoRequest& request, + EchoResponse* response) { + context->set_deadline( grpc_timeout_milliseconds_to_deadline(rpc_options.timeout_ms)); - if (rpc_options.wait_for_ready) context.set_wait_for_ready(true); + if (rpc_options.wait_for_ready) context->set_wait_for_ready(true); switch (rpc_options.method) { case METHOD_ECHO: - return (*stub)->Echo(&context, request, response); + return (*stub)->Echo(context, request, response); case METHOD_ECHO1: - return (*stub)->Echo1(&context, request, response); + return (*stub)->Echo1(context, request, response); case METHOD_ECHO2: - return (*stub)->Echo2(&context, request, response); + return (*stub)->Echo2(context, request, response); } } @@ -1429,6 +1428,7 @@ class XdsEnd2endTest : public ::testing::TestWithParam { const bool local_response = (response == nullptr); if (local_response) response = new EchoResponse; EchoRequest request; + ClientContext* context = new ClientContext; request.set_message(kRequestMessage_); if (rpc_options.server_fail) { request.mutable_param()->mutable_expected_error()->set_code( @@ -1437,20 +1437,22 @@ class XdsEnd2endTest : public ::testing::TestWithParam { Status status; switch (rpc_options.service) { case SERVICE_ECHO: - status = SendRpcMethod(&stub_, rpc_options, request, response); + status = SendRpcMethod(&stub_, rpc_options, context, request, response); break; case SERVICE_ECHO1: - status = SendRpcMethod(&stub1_, rpc_options, request, response); + status = + SendRpcMethod(&stub1_, rpc_options, context, request, response); break; case SERVICE_ECHO2: - status = SendRpcMethod(&stub2_, rpc_options, request, response); + status = + SendRpcMethod(&stub2_, rpc_options, context, request, response); break; } + delete context; if (local_response) delete response; return status; } - // TODO@donnadionne: Will replace ChedkRpcSendOk in all tests. void CheckRpcSendOk(const size_t times = 1, const RpcOptions& rpc_options = RpcOptions()) { for (size_t i = 0; i < times; ++i) { @@ -2235,16 +2237,15 @@ TEST_P(LdsTest, RouteMatchHasNonemptyPrefix) { } // Tests that LDS client should send a NACK if route match has a prefix -// not in the format "/service/": missing / or did not end with /. -TEST_P(LdsTest, RouteMatchHasInvalidPrefix) { +// string with no "/". +TEST_P(LdsTest, RouteMatchHasInvalidPrefixNonEmptyNoSlash) { ResetStub(/*failover_timeout=*/0, /*expected_targets=*/"", - /*xds_resource_does_not_exist_timeout*/ 30000, + /*xds_resource_does_not_exist_timeout*/ 0, /*xds_routing_enabled=*/true); RouteConfiguration route_config = balancers_[0]->ads_service()->default_route_config(); auto* route1 = route_config.mutable_virtual_hosts(0)->mutable_routes(0); - // Invalid case 1: no / route1->mutable_match()->set_prefix("grpc.testing.EchoTest1Service"); auto* default_route = route_config.mutable_virtual_hosts(0)->add_routes(); default_route->mutable_match()->set_prefix(""); @@ -2256,7 +2257,18 @@ TEST_P(LdsTest, RouteMatchHasInvalidPrefix) { CheckRpcSendFailure(); EXPECT_EQ(balancers_[0]->ads_service()->lds_response_state(), AdsServiceImpl::NACKED); - // Invalid case 2: missing / at the end +} + +// Tests that LDS client should send a NACK if route match has a prefix +// string does not end with "/". +TEST_P(LdsTest, RouteMatchHasInvalidPrefixNoEndingSlash) { + ResetStub(/*failover_timeout=*/0, + /*expected_targets=*/"", + /*xds_resource_does_not_exist_timeout*/ 0, + /*xds_routing_enabled=*/true); + RouteConfiguration route_config = + balancers_[0]->ads_service()->default_route_config(); + auto* route1 = route_config.mutable_virtual_hosts(0)->mutable_routes(0); route1->mutable_match()->set_prefix("/grpc.testing.EchoTest1Service"); balancers_[0]->ads_service()->SetLdsResource( AdsServiceImpl::BuildListener(route_config), kDefaultResourceName); @@ -2265,7 +2277,18 @@ TEST_P(LdsTest, RouteMatchHasInvalidPrefix) { CheckRpcSendFailure(); EXPECT_EQ(balancers_[0]->ads_service()->lds_response_state(), AdsServiceImpl::NACKED); - // Invalid case 3: missing / at the beginning +} + +// Tests that LDS client should send a NACK if route match has a prefix +// string does not start with "/". +TEST_P(LdsTest, RouteMatchHasInvalidPrefixNoLeadingSlash) { + ResetStub(/*failover_timeout=*/0, + /*expected_targets=*/"", + /*xds_resource_does_not_exist_timeout*/ 0, + /*xds_routing_enabled=*/true); + RouteConfiguration route_config = + balancers_[0]->ads_service()->default_route_config(); + auto* route1 = route_config.mutable_virtual_hosts(0)->mutable_routes(0); route1->mutable_match()->set_prefix("grpc.testing.EchoTest1Service/"); balancers_[0]->ads_service()->SetLdsResource( AdsServiceImpl::BuildListener(route_config), kDefaultResourceName); @@ -2274,7 +2297,18 @@ TEST_P(LdsTest, RouteMatchHasInvalidPrefix) { CheckRpcSendFailure(); EXPECT_EQ(balancers_[0]->ads_service()->lds_response_state(), AdsServiceImpl::NACKED); - // Invalid case 4: extra content outside of "/service/" +} + +// Tests that LDS client should send a NACK if route match has a prefix +// string with extra content outside of "/service/". +TEST_P(LdsTest, RouteMatchHasInvalidPrefixExtraContent) { + ResetStub(/*failover_timeout=*/0, + /*expected_targets=*/"", + /*xds_resource_does_not_exist_timeout*/ 0, + /*xds_routing_enabled=*/true); + RouteConfiguration route_config = + balancers_[0]->ads_service()->default_route_config(); + auto* route1 = route_config.mutable_virtual_hosts(0)->mutable_routes(0); route1->mutable_match()->set_prefix("/grpc.testing.EchoTest1Service/Echo1"); balancers_[0]->ads_service()->SetLdsResource( AdsServiceImpl::BuildListener(route_config), kDefaultResourceName); @@ -2283,7 +2317,18 @@ TEST_P(LdsTest, RouteMatchHasInvalidPrefix) { CheckRpcSendFailure(); EXPECT_EQ(balancers_[0]->ads_service()->lds_response_state(), AdsServiceImpl::NACKED); - // Invalid case 5: empty prefix "//" +} + +// Tests that LDS client should send a NACK if route match has a prefix +// string "//". +TEST_P(LdsTest, RouteMatchHasInvalidPrefixNoContent) { + ResetStub(/*failover_timeout=*/0, + /*expected_targets=*/"", + /*xds_resource_does_not_exist_timeout*/ 0, + /*xds_routing_enabled=*/true); + RouteConfiguration route_config = + balancers_[0]->ads_service()->default_route_config(); + auto* route1 = route_config.mutable_virtual_hosts(0)->mutable_routes(0); route1->mutable_match()->set_prefix("//"); balancers_[0]->ads_service()->SetLdsResource( AdsServiceImpl::BuildListener(route_config), kDefaultResourceName); @@ -2295,11 +2340,11 @@ TEST_P(LdsTest, RouteMatchHasInvalidPrefix) { } // Tests that LDS client should send a NACK if route match has path -// not in the format of "/service/method" -TEST_P(LdsTest, RouteMatchHasInvalidPath) { +// but it's empty. +TEST_P(LdsTest, RouteMatchHasInvalidPathEmptyPath) { ResetStub(/*failover_timeout=*/0, /*expected_targets=*/"", - /*xds_resource_does_not_exist_timeout*/ 30000, + /*xds_resource_does_not_exist_timeout*/ 0, /*xds_routing_enabled=*/true); RouteConfiguration route_config = balancers_[0]->ads_service()->default_route_config(); @@ -2307,7 +2352,6 @@ TEST_P(LdsTest, RouteMatchHasInvalidPath) { auto* default_route = route_config.mutable_virtual_hosts(0)->add_routes(); default_route->mutable_match()->set_prefix(""); default_route->mutable_route()->set_cluster(kDefaultResourceName); - // Invalid case 1: empty path route1->mutable_match()->set_path(""); balancers_[0]->ads_service()->SetLdsResource( AdsServiceImpl::BuildListener(route_config), kDefaultResourceName); @@ -2316,7 +2360,21 @@ TEST_P(LdsTest, RouteMatchHasInvalidPath) { CheckRpcSendFailure(); EXPECT_EQ(balancers_[0]->ads_service()->lds_response_state(), AdsServiceImpl::NACKED); - // Invalid case 2: missing / at the beginning +} + +// Tests that LDS client should send a NACK if route match has path +// string does not start with "/". +TEST_P(LdsTest, RouteMatchHasInvalidPathNoLeadingSlash) { + ResetStub(/*failover_timeout=*/0, + /*expected_targets=*/"", + /*xds_resource_does_not_exist_timeout*/ 0, + /*xds_routing_enabled=*/true); + RouteConfiguration route_config = + balancers_[0]->ads_service()->default_route_config(); + auto* route1 = route_config.mutable_virtual_hosts(0)->mutable_routes(0); + auto* default_route = route_config.mutable_virtual_hosts(0)->add_routes(); + default_route->mutable_match()->set_prefix(""); + default_route->mutable_route()->set_cluster(kDefaultResourceName); route1->mutable_match()->set_path("grpc.testing.EchoTest1Service/Echo1"); balancers_[0]->ads_service()->SetLdsResource( AdsServiceImpl::BuildListener(route_config), kDefaultResourceName); @@ -2325,7 +2383,21 @@ TEST_P(LdsTest, RouteMatchHasInvalidPath) { CheckRpcSendFailure(); EXPECT_EQ(balancers_[0]->ads_service()->lds_response_state(), AdsServiceImpl::NACKED); - // Invalid case 3: extra / at the end +} + +// Tests that LDS client should send a NACK if route match has path +// string that ends with "/". +TEST_P(LdsTest, RouteMatchHasInvalidPathEndsWithSlash) { + ResetStub(/*failover_timeout=*/0, + /*expected_targets=*/"", + /*xds_resource_does_not_exist_timeout*/ 0, + /*xds_routing_enabled=*/true); + RouteConfiguration route_config = + balancers_[0]->ads_service()->default_route_config(); + auto* route1 = route_config.mutable_virtual_hosts(0)->mutable_routes(0); + auto* default_route = route_config.mutable_virtual_hosts(0)->add_routes(); + default_route->mutable_match()->set_prefix(""); + default_route->mutable_route()->set_cluster(kDefaultResourceName); route1->mutable_match()->set_path("/grpc.testing.EchoTest1Service/Echo1/"); balancers_[0]->ads_service()->SetLdsResource( AdsServiceImpl::BuildListener(route_config), kDefaultResourceName); @@ -2334,7 +2406,21 @@ TEST_P(LdsTest, RouteMatchHasInvalidPath) { CheckRpcSendFailure(); EXPECT_EQ(balancers_[0]->ads_service()->lds_response_state(), AdsServiceImpl::NACKED); - // Invalid case 4: missinga / in the middle +} + +// Tests that LDS client should send a NACK if route match has path +// string that misses "/" between service and method. +TEST_P(LdsTest, RouteMatchHasInvalidPathMissingMiddleSlash) { + ResetStub(/*failover_timeout=*/0, + /*expected_targets=*/"", + /*xds_resource_does_not_exist_timeout*/ 0, + /*xds_routing_enabled=*/true); + RouteConfiguration route_config = + balancers_[0]->ads_service()->default_route_config(); + auto* route1 = route_config.mutable_virtual_hosts(0)->mutable_routes(0); + auto* default_route = route_config.mutable_virtual_hosts(0)->add_routes(); + default_route->mutable_match()->set_prefix(""); + default_route->mutable_route()->set_cluster(kDefaultResourceName); route1->mutable_match()->set_path("/grpc.testing.EchoTest1Service.Echo1"); balancers_[0]->ads_service()->SetLdsResource( AdsServiceImpl::BuildListener(route_config), kDefaultResourceName); @@ -2343,7 +2429,21 @@ TEST_P(LdsTest, RouteMatchHasInvalidPath) { CheckRpcSendFailure(); EXPECT_EQ(balancers_[0]->ads_service()->lds_response_state(), AdsServiceImpl::NACKED); - // Invalid case 5: empty service "//Echo1" +} + +// Tests that LDS client should send a NACK if route match has path +// string that is missing service. +TEST_P(LdsTest, RouteMatchHasInvalidPathMissingService) { + ResetStub(/*failover_timeout=*/0, + /*expected_targets=*/"", + /*xds_resource_does_not_exist_timeout*/ 0, + /*xds_routing_enabled=*/true); + RouteConfiguration route_config = + balancers_[0]->ads_service()->default_route_config(); + auto* route1 = route_config.mutable_virtual_hosts(0)->mutable_routes(0); + auto* default_route = route_config.mutable_virtual_hosts(0)->add_routes(); + default_route->mutable_match()->set_prefix(""); + default_route->mutable_route()->set_cluster(kDefaultResourceName); route1->mutable_match()->set_path("//Echo1"); balancers_[0]->ads_service()->SetLdsResource( AdsServiceImpl::BuildListener(route_config), kDefaultResourceName); @@ -2352,7 +2452,21 @@ TEST_P(LdsTest, RouteMatchHasInvalidPath) { CheckRpcSendFailure(); EXPECT_EQ(balancers_[0]->ads_service()->lds_response_state(), AdsServiceImpl::NACKED); - // Invalid case 5: empty method "/grpc.testing.EchoTest1Service/" +} + +// Tests that LDS client should send a NACK if route match has path +// string that is missing method. +TEST_P(LdsTest, RouteMatchHasInvalidPathMissingMethod) { + ResetStub(/*failover_timeout=*/0, + /*expected_targets=*/"", + /*xds_resource_does_not_exist_timeout*/ 0, + /*xds_routing_enabled=*/true); + RouteConfiguration route_config = + balancers_[0]->ads_service()->default_route_config(); + auto* route1 = route_config.mutable_virtual_hosts(0)->mutable_routes(0); + auto* default_route = route_config.mutable_virtual_hosts(0)->add_routes(); + default_route->mutable_match()->set_prefix(""); + default_route->mutable_route()->set_cluster(kDefaultResourceName); route1->mutable_match()->set_path("/grpc.testing.EchoTest1Service/"); balancers_[0]->ads_service()->SetLdsResource( AdsServiceImpl::BuildListener(route_config), kDefaultResourceName); @@ -2541,14 +2655,12 @@ TEST_P(LdsTest, XdsRoutingPrefixMatching) { balancers_[0]->ads_service()->SetLdsResource(listener, kDefaultResourceName); WaitForAllBackends(0, 2); CheckRpcSendOk(kNumEchoRpcs, RpcOptions().set_wait_for_ready(true)); - CheckRpcSendOk(kNumEcho1Rpcs, RpcOptions() - .set_rpc_service(SERVICE_ECHO1) - .set_rpc_method(METHOD_ECHO1) - .set_wait_for_ready(true)); - CheckRpcSendOk(kNumEcho2Rpcs, RpcOptions() - .set_rpc_service(SERVICE_ECHO2) - .set_rpc_method(METHOD_ECHO2) - .set_wait_for_ready(true)); + CheckRpcSendOk( + kNumEcho1Rpcs, + RpcOptions().set_rpc_service(SERVICE_ECHO1).set_wait_for_ready(true)); + CheckRpcSendOk( + kNumEcho2Rpcs, + RpcOptions().set_rpc_service(SERVICE_ECHO2).set_wait_for_ready(true)); // Make sure RPCs all go to the correct backend. for (size_t i = 0; i < 2; ++i) { EXPECT_EQ(kNumEchoRpcs / 2, From da94b366eb74ad22b371ae115614c364e4eeb795 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Thu, 16 Apr 2020 15:48:45 -0700 Subject: [PATCH 527/758] Increase timeout for macOS Python tests by 50% --- tools/internal_ci/macos/grpc_basictests_python.cfg | 2 +- tools/internal_ci/macos/pull_request/grpc_basictests_python.cfg | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/internal_ci/macos/grpc_basictests_python.cfg b/tools/internal_ci/macos/grpc_basictests_python.cfg index 77ae336803c..575ddaf82cb 100644 --- a/tools/internal_ci/macos/grpc_basictests_python.cfg +++ b/tools/internal_ci/macos/grpc_basictests_python.cfg @@ -17,7 +17,7 @@ # Location of the continuous shell script in repository. build_file: "grpc/tools/internal_ci/macos/grpc_basictests_python.sh" gfile_resources: "/bigstore/grpc-testing-secrets/gcp_credentials/GrpcTesting-d0eeee2db331.json" -timeout_mins: 60 +timeout_mins: 90 action { define_artifacts { regex: "**/*sponge_log.*" diff --git a/tools/internal_ci/macos/pull_request/grpc_basictests_python.cfg b/tools/internal_ci/macos/pull_request/grpc_basictests_python.cfg index 4a084bf6a71..71f71604ae1 100644 --- a/tools/internal_ci/macos/pull_request/grpc_basictests_python.cfg +++ b/tools/internal_ci/macos/pull_request/grpc_basictests_python.cfg @@ -17,7 +17,7 @@ # Location of the continuous shell script in repository. build_file: "grpc/tools/internal_ci/macos/grpc_basictests_python.sh" gfile_resources: "/bigstore/grpc-testing-secrets/gcp_credentials/GrpcTesting-d0eeee2db331.json" -timeout_mins: 60 +timeout_mins: 90 action { define_artifacts { regex: "**/*sponge_log.*" From 07a51fae6b97c69db60bbbc2007518c920cc319a Mon Sep 17 00:00:00 2001 From: Muxi Yan Date: Thu, 16 Apr 2020 16:48:13 -0700 Subject: [PATCH 528/758] Make argument names consistent --- src/core/lib/surface/server.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/lib/surface/server.cc b/src/core/lib/surface/server.cc index 8d87ea33cb4..f2e9d031188 100644 --- a/src/core/lib/surface/server.cc +++ b/src/core/lib/surface/server.cc @@ -268,7 +268,7 @@ struct grpc_server { (((channel_data*)(elem)->channel_data)->server) namespace { -void publish_new_rpc(void* calld, grpc_error* error); +void publish_new_rpc(void* arg, grpc_error* error); void fail_call(grpc_server* server, size_t cq_idx, requested_call* rc, grpc_error* error); /* Before calling maybe_finish_shutdown, we must hold mu_global and not From 320c91694beac25ad78117245180cb5b1333e98c Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Fri, 17 Apr 2020 12:27:26 +0200 Subject: [PATCH 529/758] Delete a non-longer-useful run_build_statistics.py --- tools/run_tests/run_build_statistics.py | 250 ------------------------ 1 file changed, 250 deletions(-) delete mode 100755 tools/run_tests/run_build_statistics.py diff --git a/tools/run_tests/run_build_statistics.py b/tools/run_tests/run_build_statistics.py deleted file mode 100755 index d88f3db2817..00000000000 --- a/tools/run_tests/run_build_statistics.py +++ /dev/null @@ -1,250 +0,0 @@ -#!/usr/bin/env python -# Copyright 2016 gRPC authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Tool to get build statistics from Jenkins and upload to BigQuery.""" - -from __future__ import print_function - -import argparse -import jenkinsapi -from jenkinsapi.custom_exceptions import JenkinsAPIException -from jenkinsapi.jenkins import Jenkins -import json -import os -import re -import sys -import urllib - -gcp_utils_dir = os.path.abspath( - os.path.join(os.path.dirname(__file__), '../gcp/utils')) -sys.path.append(gcp_utils_dir) -import big_query_utils - -_PROJECT_ID = 'grpc-testing' -_HAS_MATRIX = True -_BUILDS = { - 'gRPC_interop_master': not _HAS_MATRIX, - 'gRPC_master_linux': not _HAS_MATRIX, - 'gRPC_master_macos': not _HAS_MATRIX, - 'gRPC_master_windows': not _HAS_MATRIX, - 'gRPC_performance_master': not _HAS_MATRIX, - 'gRPC_portability_master_linux': not _HAS_MATRIX, - 'gRPC_portability_master_windows': not _HAS_MATRIX, - 'gRPC_master_asanitizer_c': not _HAS_MATRIX, - 'gRPC_master_asanitizer_cpp': not _HAS_MATRIX, - 'gRPC_master_msan_c': not _HAS_MATRIX, - 'gRPC_master_tsanitizer_c': not _HAS_MATRIX, - 'gRPC_master_tsan_cpp': not _HAS_MATRIX, - 'gRPC_interop_pull_requests': not _HAS_MATRIX, - 'gRPC_performance_pull_requests': not _HAS_MATRIX, - 'gRPC_portability_pull_requests_linux': not _HAS_MATRIX, - 'gRPC_portability_pr_win': not _HAS_MATRIX, - 'gRPC_pull_requests_linux': not _HAS_MATRIX, - 'gRPC_pull_requests_macos': not _HAS_MATRIX, - 'gRPC_pr_win': not _HAS_MATRIX, - 'gRPC_pull_requests_asan_c': not _HAS_MATRIX, - 'gRPC_pull_requests_asan_cpp': not _HAS_MATRIX, - 'gRPC_pull_requests_msan_c': not _HAS_MATRIX, - 'gRPC_pull_requests_tsan_c': not _HAS_MATRIX, - 'gRPC_pull_requests_tsan_cpp': not _HAS_MATRIX, -} -_URL_BASE = 'https://grpc-testing.appspot.com/job' - -# This is a dynamic list where known and active issues should be added. -# Fixed ones should be removed. -# Also try not to add multiple messages from the same failure. -_KNOWN_ERRORS = [ - 'Failed to build workspace Tests with scheme AllTests', - 'Build timed out', - 'TIMEOUT: tools/run_tests/pre_build_node.sh', - 'TIMEOUT: tools/run_tests/pre_build_ruby.sh', - 'FATAL: Unable to produce a script file', - 'FAILED: build_docker_c\+\+', - 'cannot find package \"cloud.google.com/go/compute/metadata\"', - 'LLVM ERROR: IO failure on output stream.', - 'MSBUILD : error MSB1009: Project file does not exist.', - 'fatal: git fetch_pack: expected ACK/NAK', - 'Failed to fetch from http://github.com/grpc/grpc.git', - ('hudson.remoting.RemotingSystemException: java.io.IOException: ' - 'Backing channel is disconnected.'), - 'hudson.remoting.ChannelClosedException', - 'Could not initialize class hudson.Util', - 'Too many open files in system', - 'FAILED: bins/tsan/qps_openloop_test GRPC_POLL_STRATEGY=epoll', - 'FAILED: bins/tsan/qps_openloop_test GRPC_POLL_STRATEGY=legacy', - 'FAILED: bins/tsan/qps_openloop_test GRPC_POLL_STRATEGY=poll', - ('tests.bins/asan/h2_proxy_test streaming_error_response ' - 'GRPC_POLL_STRATEGY=legacy'), - 'hudson.plugins.git.GitException', - 'Couldn\'t find any revision to build', - 'org.jenkinsci.plugin.Diskcheck.preCheckout', - 'Something went wrong while deleting Files', -] -_NO_REPORT_FILES_FOUND_ERROR = 'No test report files were found.' -_UNKNOWN_ERROR = 'Unknown error' -_DATASET_ID = 'build_statistics' - - -def _scrape_for_known_errors(html): - error_list = [] - for known_error in _KNOWN_ERRORS: - errors = re.findall(known_error, html) - this_error_count = len(errors) - if this_error_count > 0: - error_list.append({ - 'description': known_error, - 'count': this_error_count - }) - print('====> %d failures due to %s' % - (this_error_count, known_error)) - return error_list - - -def _no_report_files_found(html): - return _NO_REPORT_FILES_FOUND_ERROR in html - - -def _get_last_processed_buildnumber(build_name): - query = 'SELECT max(build_number) FROM [%s:%s.%s];' % ( - _PROJECT_ID, _DATASET_ID, build_name) - query_job = big_query_utils.sync_query_job(bq, _PROJECT_ID, query) - page = bq.jobs().getQueryResults( - pageToken=None, **query_job['jobReference']).execute(num_retries=3) - if page['rows'][0]['f'][0]['v']: - return int(page['rows'][0]['f'][0]['v']) - return 0 - - -def _process_matrix(build, url_base): - matrix_list = [] - for matrix in build.get_matrix_runs(): - matrix_str = re.match('.*\\xc2\\xbb ((?:[^,]+,?)+) #.*', - matrix.name).groups()[0] - matrix_tuple = matrix_str.split(',') - json_url = '%s/config=%s,language=%s,platform=%s/testReport/api/json' % ( - url_base, matrix_tuple[0], matrix_tuple[1], matrix_tuple[2]) - console_url = '%s/config=%s,language=%s,platform=%s/consoleFull' % ( - url_base, matrix_tuple[0], matrix_tuple[1], matrix_tuple[2]) - matrix_dict = { - 'name': matrix_str, - 'duration': matrix.get_duration().total_seconds() - } - matrix_dict.update(_process_build(json_url, console_url)) - matrix_list.append(matrix_dict) - - return matrix_list - - -def _process_build(json_url, console_url): - build_result = {} - error_list = [] - try: - html = urllib.urlopen(json_url).read() - test_result = json.loads(html) - print('====> Parsing result from %s' % json_url) - failure_count = test_result['failCount'] - build_result['pass_count'] = test_result['passCount'] - build_result['failure_count'] = failure_count - # This means Jenkins failure occurred. - build_result['no_report_files_found'] = _no_report_files_found(html) - # Only check errors if Jenkins failure occurred. - if build_result['no_report_files_found']: - error_list = _scrape_for_known_errors(html) - except Exception as e: - print('====> Got exception for %s: %s.' % (json_url, str(e))) - print('====> Parsing errors from %s.' % console_url) - html = urllib.urlopen(console_url).read() - build_result['pass_count'] = 0 - build_result['failure_count'] = 1 - # In this case, the string doesn't exist in the result html but the fact - # that we fail to parse the result html indicates Jenkins failure and hence - # no report files were generated. - build_result['no_report_files_found'] = True - error_list = _scrape_for_known_errors(html) - - if error_list: - build_result['error'] = error_list - elif build_result['no_report_files_found']: - build_result['error'] = [{'description': _UNKNOWN_ERROR, 'count': 1}] - else: - build_result['error'] = [{'description': '', 'count': 0}] - - return build_result - - -# parse command line -argp = argparse.ArgumentParser(description='Get build statistics.') -argp.add_argument('-u', '--username', default='jenkins') -argp.add_argument('-b', - '--builds', - choices=['all'] + sorted(_BUILDS.keys()), - nargs='+', - default=['all']) -args = argp.parse_args() - -J = Jenkins('https://grpc-testing.appspot.com', args.username, 'apiToken') -bq = big_query_utils.create_big_query() - -for build_name in _BUILDS.keys() if 'all' in args.builds else args.builds: - print('====> Build: %s' % build_name) - # Since get_last_completed_build() always fails due to malformatted string - # error, we use get_build_metadata() instead. - job = None - try: - job = J[build_name] - except Exception as e: - print('====> Failed to get build %s: %s.' % (build_name, str(e))) - continue - last_processed_build_number = _get_last_processed_buildnumber(build_name) - last_complete_build_number = job.get_last_completed_buildnumber() - # To avoid processing all builds for a project never looked at. In this case, - # only examine 10 latest builds. - starting_build_number = max(last_processed_build_number + 1, - last_complete_build_number - 9) - for build_number in xrange(starting_build_number, - last_complete_build_number + 1): - print('====> Processing %s build %d.' % (build_name, build_number)) - build = None - try: - build = job.get_build_metadata(build_number) - print('====> Build status: %s.' % build.get_status()) - if build.get_status() == 'ABORTED': - continue - # If any build is still running, stop processing this job. Next time, we - # start from where it was left so that all builds are processed - # sequentially. - if build.is_running(): - print('====> Build %d is still running.' % build_number) - break - except KeyError: - print('====> Build %s is missing. Skip.' % build_number) - continue - build_result = { - 'build_number': build_number, - 'timestamp': str(build.get_timestamp()) - } - url_base = json_url = '%s/%s/%d' % (_URL_BASE, build_name, build_number) - if _BUILDS[build_name]: # The build has matrix, such as gRPC_master. - build_result['matrix'] = _process_matrix(build, url_base) - else: - json_url = '%s/testReport/api/json' % url_base - console_url = '%s/consoleFull' % url_base - build_result['duration'] = build.get_duration().total_seconds() - build_stat = _process_build(json_url, console_url) - build_result.update(build_stat) - rows = [big_query_utils.make_row(build_number, build_result)] - if not big_query_utils.insert_rows(bq, _PROJECT_ID, _DATASET_ID, - build_name, rows): - print('====> Error uploading result to bigquery.') - sys.exit(1) From 2a7f2e8f2ce679c985a85726f5b9b769d1bf7714 Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Fri, 17 Apr 2020 12:37:52 +0200 Subject: [PATCH 530/758] regenerate C# protos --- src/csharp/Grpc.IntegrationTesting/Control.cs | 177 +++++--- .../Grpc.IntegrationTesting/Messages.cs | 403 +++++++++++++++++- src/csharp/Grpc.IntegrationTesting/Test.cs | 5 +- .../Grpc.IntegrationTesting/TestGrpc.cs | 132 ++++++ 4 files changed, 636 insertions(+), 81 deletions(-) diff --git a/src/csharp/Grpc.IntegrationTesting/Control.cs b/src/csharp/Grpc.IntegrationTesting/Control.cs index d3946bfe1f3..a4adfe23a02 100644 --- a/src/csharp/Grpc.IntegrationTesting/Control.cs +++ b/src/csharp/Grpc.IntegrationTesting/Control.cs @@ -34,7 +34,7 @@ namespace Grpc.Testing { "U2VjdXJpdHlQYXJhbXMSEwoLdXNlX3Rlc3RfY2EYASABKAgSHAoUc2VydmVy", "X2hvc3Rfb3ZlcnJpZGUYAiABKAkSEQoJY3JlZF90eXBlGAMgASgJIk0KCkNo", "YW5uZWxBcmcSDAoEbmFtZRgBIAEoCRITCglzdHJfdmFsdWUYAiABKAlIABIT", - "CglpbnRfdmFsdWUYAyABKAVIAEIHCgV2YWx1ZSKiBQoMQ2xpZW50Q29uZmln", + "CglpbnRfdmFsdWUYAyABKAVIAEIHCgV2YWx1ZSK8BQoMQ2xpZW50Q29uZmln", "EhYKDnNlcnZlcl90YXJnZXRzGAEgAygJEi0KC2NsaWVudF90eXBlGAIgASgO", "MhguZ3JwYy50ZXN0aW5nLkNsaWVudFR5cGUSNQoPc2VjdXJpdHlfcGFyYW1z", "GAMgASgLMhwuZ3JwYy50ZXN0aW5nLlNlY3VyaXR5UGFyYW1zEiQKHG91dHN0", @@ -49,60 +49,61 @@ namespace Grpc.Testing { "cmdzGBAgAygLMhguZ3JwYy50ZXN0aW5nLkNoYW5uZWxBcmcSFgoOdGhyZWFk", "c19wZXJfY3EYESABKAUSGwoTbWVzc2FnZXNfcGVyX3N0cmVhbRgSIAEoBRIY", "ChB1c2VfY29hbGVzY2VfYXBpGBMgASgIEjEKKW1lZGlhbl9sYXRlbmN5X2Nv", - "bGxlY3Rpb25faW50ZXJ2YWxfbWlsbGlzGBQgASgFIjgKDENsaWVudFN0YXR1", - "cxIoCgVzdGF0cxgBIAEoCzIZLmdycGMudGVzdGluZy5DbGllbnRTdGF0cyIV", - "CgRNYXJrEg0KBXJlc2V0GAEgASgIImgKCkNsaWVudEFyZ3MSKwoFc2V0dXAY", - "ASABKAsyGi5ncnBjLnRlc3RpbmcuQ2xpZW50Q29uZmlnSAASIgoEbWFyaxgC", - "IAEoCzISLmdycGMudGVzdGluZy5NYXJrSABCCQoHYXJndHlwZSL9AgoMU2Vy", - "dmVyQ29uZmlnEi0KC3NlcnZlcl90eXBlGAEgASgOMhguZ3JwYy50ZXN0aW5n", - "LlNlcnZlclR5cGUSNQoPc2VjdXJpdHlfcGFyYW1zGAIgASgLMhwuZ3JwYy50", - "ZXN0aW5nLlNlY3VyaXR5UGFyYW1zEgwKBHBvcnQYBCABKAUSHAoUYXN5bmNf", - "c2VydmVyX3RocmVhZHMYByABKAUSEgoKY29yZV9saW1pdBgIIAEoBRIzCg5w", - "YXlsb2FkX2NvbmZpZxgJIAEoCzIbLmdycGMudGVzdGluZy5QYXlsb2FkQ29u", - "ZmlnEhEKCWNvcmVfbGlzdBgKIAMoBRIYChBvdGhlcl9zZXJ2ZXJfYXBpGAsg", - "ASgJEhYKDnRocmVhZHNfcGVyX2NxGAwgASgFEhwKE3Jlc291cmNlX3F1b3Rh", - "X3NpemUY6QcgASgFEi8KDGNoYW5uZWxfYXJncxjqByADKAsyGC5ncnBjLnRl", - "c3RpbmcuQ2hhbm5lbEFyZyJoCgpTZXJ2ZXJBcmdzEisKBXNldHVwGAEgASgL", - "MhouZ3JwYy50ZXN0aW5nLlNlcnZlckNvbmZpZ0gAEiIKBG1hcmsYAiABKAsy", - "Ei5ncnBjLnRlc3RpbmcuTWFya0gAQgkKB2FyZ3R5cGUiVQoMU2VydmVyU3Rh", - "dHVzEigKBXN0YXRzGAEgASgLMhkuZ3JwYy50ZXN0aW5nLlNlcnZlclN0YXRz", - "EgwKBHBvcnQYAiABKAUSDQoFY29yZXMYAyABKAUiDQoLQ29yZVJlcXVlc3Qi", - "HQoMQ29yZVJlc3BvbnNlEg0KBWNvcmVzGAEgASgFIgYKBFZvaWQi/QEKCFNj", - "ZW5hcmlvEgwKBG5hbWUYASABKAkSMQoNY2xpZW50X2NvbmZpZxgCIAEoCzIa", - "LmdycGMudGVzdGluZy5DbGllbnRDb25maWcSEwoLbnVtX2NsaWVudHMYAyAB", - "KAUSMQoNc2VydmVyX2NvbmZpZxgEIAEoCzIaLmdycGMudGVzdGluZy5TZXJ2", - "ZXJDb25maWcSEwoLbnVtX3NlcnZlcnMYBSABKAUSFgoOd2FybXVwX3NlY29u", - "ZHMYBiABKAUSGQoRYmVuY2htYXJrX3NlY29uZHMYByABKAUSIAoYc3Bhd25f", - "bG9jYWxfd29ya2VyX2NvdW50GAggASgFIjYKCVNjZW5hcmlvcxIpCglzY2Vu", - "YXJpb3MYASADKAsyFi5ncnBjLnRlc3RpbmcuU2NlbmFyaW8ihAQKFVNjZW5h", - "cmlvUmVzdWx0U3VtbWFyeRILCgNxcHMYASABKAESGwoTcXBzX3Blcl9zZXJ2", - "ZXJfY29yZRgCIAEoARIaChJzZXJ2ZXJfc3lzdGVtX3RpbWUYAyABKAESGAoQ", - "c2VydmVyX3VzZXJfdGltZRgEIAEoARIaChJjbGllbnRfc3lzdGVtX3RpbWUY", - "BSABKAESGAoQY2xpZW50X3VzZXJfdGltZRgGIAEoARISCgpsYXRlbmN5XzUw", - "GAcgASgBEhIKCmxhdGVuY3lfOTAYCCABKAESEgoKbGF0ZW5jeV85NRgJIAEo", - "ARISCgpsYXRlbmN5Xzk5GAogASgBEhMKC2xhdGVuY3lfOTk5GAsgASgBEhgK", - "EHNlcnZlcl9jcHVfdXNhZ2UYDCABKAESJgoec3VjY2Vzc2Z1bF9yZXF1ZXN0", - "c19wZXJfc2Vjb25kGA0gASgBEiIKGmZhaWxlZF9yZXF1ZXN0c19wZXJfc2Vj", - "b25kGA4gASgBEiAKGGNsaWVudF9wb2xsc19wZXJfcmVxdWVzdBgPIAEoARIg", - "ChhzZXJ2ZXJfcG9sbHNfcGVyX3JlcXVlc3QYECABKAESIgoac2VydmVyX3F1", - "ZXJpZXNfcGVyX2NwdV9zZWMYESABKAESIgoaY2xpZW50X3F1ZXJpZXNfcGVy", - "X2NwdV9zZWMYEiABKAEigwMKDlNjZW5hcmlvUmVzdWx0EigKCHNjZW5hcmlv", - "GAEgASgLMhYuZ3JwYy50ZXN0aW5nLlNjZW5hcmlvEi4KCWxhdGVuY2llcxgC", - "IAEoCzIbLmdycGMudGVzdGluZy5IaXN0b2dyYW1EYXRhEi8KDGNsaWVudF9z", - "dGF0cxgDIAMoCzIZLmdycGMudGVzdGluZy5DbGllbnRTdGF0cxIvCgxzZXJ2", - "ZXJfc3RhdHMYBCADKAsyGS5ncnBjLnRlc3RpbmcuU2VydmVyU3RhdHMSFAoM", - "c2VydmVyX2NvcmVzGAUgAygFEjQKB3N1bW1hcnkYBiABKAsyIy5ncnBjLnRl", - "c3RpbmcuU2NlbmFyaW9SZXN1bHRTdW1tYXJ5EhYKDmNsaWVudF9zdWNjZXNz", - "GAcgAygIEhYKDnNlcnZlcl9zdWNjZXNzGAggAygIEjkKD3JlcXVlc3RfcmVz", - "dWx0cxgJIAMoCzIgLmdycGMudGVzdGluZy5SZXF1ZXN0UmVzdWx0Q291bnQq", - "VgoKQ2xpZW50VHlwZRIPCgtTWU5DX0NMSUVOVBAAEhAKDEFTWU5DX0NMSUVO", - "VBABEhAKDE9USEVSX0NMSUVOVBACEhMKD0NBTExCQUNLX0NMSUVOVBADKnAK", - "ClNlcnZlclR5cGUSDwoLU1lOQ19TRVJWRVIQABIQCgxBU1lOQ19TRVJWRVIQ", - "ARIYChRBU1lOQ19HRU5FUklDX1NFUlZFUhACEhAKDE9USEVSX1NFUlZFUhAD", - "EhMKD0NBTExCQUNLX1NFUlZFUhAEKnIKB1JwY1R5cGUSCQoFVU5BUlkQABIN", - "CglTVFJFQU1JTkcQARIZChVTVFJFQU1JTkdfRlJPTV9DTElFTlQQAhIZChVT", - "VFJFQU1JTkdfRlJPTV9TRVJWRVIQAxIXChNTVFJFQU1JTkdfQk9USF9XQVlT", - "EARiBnByb3RvMw==")); + "bGxlY3Rpb25faW50ZXJ2YWxfbWlsbGlzGBQgASgFEhgKEGNsaWVudF9wcm9j", + "ZXNzZXMYFSABKAUiOAoMQ2xpZW50U3RhdHVzEigKBXN0YXRzGAEgASgLMhku", + "Z3JwYy50ZXN0aW5nLkNsaWVudFN0YXRzIhUKBE1hcmsSDQoFcmVzZXQYASAB", + "KAgiaAoKQ2xpZW50QXJncxIrCgVzZXR1cBgBIAEoCzIaLmdycGMudGVzdGlu", + "Zy5DbGllbnRDb25maWdIABIiCgRtYXJrGAIgASgLMhIuZ3JwYy50ZXN0aW5n", + "Lk1hcmtIAEIJCgdhcmd0eXBlIpcDCgxTZXJ2ZXJDb25maWcSLQoLc2VydmVy", + "X3R5cGUYASABKA4yGC5ncnBjLnRlc3RpbmcuU2VydmVyVHlwZRI1Cg9zZWN1", + "cml0eV9wYXJhbXMYAiABKAsyHC5ncnBjLnRlc3RpbmcuU2VjdXJpdHlQYXJh", + "bXMSDAoEcG9ydBgEIAEoBRIcChRhc3luY19zZXJ2ZXJfdGhyZWFkcxgHIAEo", + "BRISCgpjb3JlX2xpbWl0GAggASgFEjMKDnBheWxvYWRfY29uZmlnGAkgASgL", + "MhsuZ3JwYy50ZXN0aW5nLlBheWxvYWRDb25maWcSEQoJY29yZV9saXN0GAog", + "AygFEhgKEG90aGVyX3NlcnZlcl9hcGkYCyABKAkSFgoOdGhyZWFkc19wZXJf", + "Y3EYDCABKAUSHAoTcmVzb3VyY2VfcXVvdGFfc2l6ZRjpByABKAUSLwoMY2hh", + "bm5lbF9hcmdzGOoHIAMoCzIYLmdycGMudGVzdGluZy5DaGFubmVsQXJnEhgK", + "EHNlcnZlcl9wcm9jZXNzZXMYFSABKAUiaAoKU2VydmVyQXJncxIrCgVzZXR1", + "cBgBIAEoCzIaLmdycGMudGVzdGluZy5TZXJ2ZXJDb25maWdIABIiCgRtYXJr", + "GAIgASgLMhIuZ3JwYy50ZXN0aW5nLk1hcmtIAEIJCgdhcmd0eXBlIlUKDFNl", + "cnZlclN0YXR1cxIoCgVzdGF0cxgBIAEoCzIZLmdycGMudGVzdGluZy5TZXJ2", + "ZXJTdGF0cxIMCgRwb3J0GAIgASgFEg0KBWNvcmVzGAMgASgFIg0KC0NvcmVS", + "ZXF1ZXN0Ih0KDENvcmVSZXNwb25zZRINCgVjb3JlcxgBIAEoBSIGCgRWb2lk", + "Iv0BCghTY2VuYXJpbxIMCgRuYW1lGAEgASgJEjEKDWNsaWVudF9jb25maWcY", + "AiABKAsyGi5ncnBjLnRlc3RpbmcuQ2xpZW50Q29uZmlnEhMKC251bV9jbGll", + "bnRzGAMgASgFEjEKDXNlcnZlcl9jb25maWcYBCABKAsyGi5ncnBjLnRlc3Rp", + "bmcuU2VydmVyQ29uZmlnEhMKC251bV9zZXJ2ZXJzGAUgASgFEhYKDndhcm11", + "cF9zZWNvbmRzGAYgASgFEhkKEWJlbmNobWFya19zZWNvbmRzGAcgASgFEiAK", + "GHNwYXduX2xvY2FsX3dvcmtlcl9jb3VudBgIIAEoBSI2CglTY2VuYXJpb3MS", + "KQoJc2NlbmFyaW9zGAEgAygLMhYuZ3JwYy50ZXN0aW5nLlNjZW5hcmlvIoQE", + "ChVTY2VuYXJpb1Jlc3VsdFN1bW1hcnkSCwoDcXBzGAEgASgBEhsKE3Fwc19w", + "ZXJfc2VydmVyX2NvcmUYAiABKAESGgoSc2VydmVyX3N5c3RlbV90aW1lGAMg", + "ASgBEhgKEHNlcnZlcl91c2VyX3RpbWUYBCABKAESGgoSY2xpZW50X3N5c3Rl", + "bV90aW1lGAUgASgBEhgKEGNsaWVudF91c2VyX3RpbWUYBiABKAESEgoKbGF0", + "ZW5jeV81MBgHIAEoARISCgpsYXRlbmN5XzkwGAggASgBEhIKCmxhdGVuY3lf", + "OTUYCSABKAESEgoKbGF0ZW5jeV85ORgKIAEoARITCgtsYXRlbmN5Xzk5ORgL", + "IAEoARIYChBzZXJ2ZXJfY3B1X3VzYWdlGAwgASgBEiYKHnN1Y2Nlc3NmdWxf", + "cmVxdWVzdHNfcGVyX3NlY29uZBgNIAEoARIiChpmYWlsZWRfcmVxdWVzdHNf", + "cGVyX3NlY29uZBgOIAEoARIgChhjbGllbnRfcG9sbHNfcGVyX3JlcXVlc3QY", + "DyABKAESIAoYc2VydmVyX3BvbGxzX3Blcl9yZXF1ZXN0GBAgASgBEiIKGnNl", + "cnZlcl9xdWVyaWVzX3Blcl9jcHVfc2VjGBEgASgBEiIKGmNsaWVudF9xdWVy", + "aWVzX3Blcl9jcHVfc2VjGBIgASgBIoMDCg5TY2VuYXJpb1Jlc3VsdBIoCghz", + "Y2VuYXJpbxgBIAEoCzIWLmdycGMudGVzdGluZy5TY2VuYXJpbxIuCglsYXRl", + "bmNpZXMYAiABKAsyGy5ncnBjLnRlc3RpbmcuSGlzdG9ncmFtRGF0YRIvCgxj", + "bGllbnRfc3RhdHMYAyADKAsyGS5ncnBjLnRlc3RpbmcuQ2xpZW50U3RhdHMS", + "LwoMc2VydmVyX3N0YXRzGAQgAygLMhkuZ3JwYy50ZXN0aW5nLlNlcnZlclN0", + "YXRzEhQKDHNlcnZlcl9jb3JlcxgFIAMoBRI0CgdzdW1tYXJ5GAYgASgLMiMu", + "Z3JwYy50ZXN0aW5nLlNjZW5hcmlvUmVzdWx0U3VtbWFyeRIWCg5jbGllbnRf", + "c3VjY2VzcxgHIAMoCBIWCg5zZXJ2ZXJfc3VjY2VzcxgIIAMoCBI5Cg9yZXF1", + "ZXN0X3Jlc3VsdHMYCSADKAsyIC5ncnBjLnRlc3RpbmcuUmVxdWVzdFJlc3Vs", + "dENvdW50KlYKCkNsaWVudFR5cGUSDwoLU1lOQ19DTElFTlQQABIQCgxBU1lO", + "Q19DTElFTlQQARIQCgxPVEhFUl9DTElFTlQQAhITCg9DQUxMQkFDS19DTElF", + "TlQQAypwCgpTZXJ2ZXJUeXBlEg8KC1NZTkNfU0VSVkVSEAASEAoMQVNZTkNf", + "U0VSVkVSEAESGAoUQVNZTkNfR0VORVJJQ19TRVJWRVIQAhIQCgxPVEhFUl9T", + "RVJWRVIQAxITCg9DQUxMQkFDS19TRVJWRVIQBCpyCgdScGNUeXBlEgkKBVVO", + "QVJZEAASDQoJU1RSRUFNSU5HEAESGQoVU1RSRUFNSU5HX0ZST01fQ0xJRU5U", + "EAISGQoVU1RSRUFNSU5HX0ZST01fU0VSVkVSEAMSFwoTU1RSRUFNSU5HX0JP", + "VEhfV0FZUxAEYgZwcm90bzM=")); descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, new pbr::FileDescriptor[] { global::Grpc.Testing.PayloadsReflection.Descriptor, global::Grpc.Testing.StatsReflection.Descriptor, }, new pbr::GeneratedClrTypeInfo(new[] {typeof(global::Grpc.Testing.ClientType), typeof(global::Grpc.Testing.ServerType), typeof(global::Grpc.Testing.RpcType), }, null, new pbr::GeneratedClrTypeInfo[] { @@ -111,11 +112,11 @@ namespace Grpc.Testing { new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.LoadParams), global::Grpc.Testing.LoadParams.Parser, new[]{ "ClosedLoop", "Poisson" }, new[]{ "Load" }, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.SecurityParams), global::Grpc.Testing.SecurityParams.Parser, new[]{ "UseTestCa", "ServerHostOverride", "CredType" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.ChannelArg), global::Grpc.Testing.ChannelArg.Parser, new[]{ "Name", "StrValue", "IntValue" }, new[]{ "Value" }, null, null, null), - new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.ClientConfig), global::Grpc.Testing.ClientConfig.Parser, new[]{ "ServerTargets", "ClientType", "SecurityParams", "OutstandingRpcsPerChannel", "ClientChannels", "AsyncClientThreads", "RpcType", "LoadParams", "PayloadConfig", "HistogramParams", "CoreList", "CoreLimit", "OtherClientApi", "ChannelArgs", "ThreadsPerCq", "MessagesPerStream", "UseCoalesceApi", "MedianLatencyCollectionIntervalMillis" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.ClientConfig), global::Grpc.Testing.ClientConfig.Parser, new[]{ "ServerTargets", "ClientType", "SecurityParams", "OutstandingRpcsPerChannel", "ClientChannels", "AsyncClientThreads", "RpcType", "LoadParams", "PayloadConfig", "HistogramParams", "CoreList", "CoreLimit", "OtherClientApi", "ChannelArgs", "ThreadsPerCq", "MessagesPerStream", "UseCoalesceApi", "MedianLatencyCollectionIntervalMillis", "ClientProcesses" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.ClientStatus), global::Grpc.Testing.ClientStatus.Parser, new[]{ "Stats" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.Mark), global::Grpc.Testing.Mark.Parser, new[]{ "Reset" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.ClientArgs), global::Grpc.Testing.ClientArgs.Parser, new[]{ "Setup", "Mark" }, new[]{ "Argtype" }, null, null, null), - new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.ServerConfig), global::Grpc.Testing.ServerConfig.Parser, new[]{ "ServerType", "SecurityParams", "Port", "AsyncServerThreads", "CoreLimit", "PayloadConfig", "CoreList", "OtherServerApi", "ThreadsPerCq", "ResourceQuotaSize", "ChannelArgs" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.ServerConfig), global::Grpc.Testing.ServerConfig.Parser, new[]{ "ServerType", "SecurityParams", "Port", "AsyncServerThreads", "CoreLimit", "PayloadConfig", "CoreList", "OtherServerApi", "ThreadsPerCq", "ResourceQuotaSize", "ChannelArgs", "ServerProcesses" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.ServerArgs), global::Grpc.Testing.ServerArgs.Parser, new[]{ "Setup", "Mark" }, new[]{ "Argtype" }, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.ServerStatus), global::Grpc.Testing.ServerStatus.Parser, new[]{ "Stats", "Port", "Cores" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.CoreRequest), global::Grpc.Testing.CoreRequest.Parser, null, null, null, null, null), @@ -1059,6 +1060,7 @@ namespace Grpc.Testing { messagesPerStream_ = other.messagesPerStream_; useCoalesceApi_ = other.useCoalesceApi_; medianLatencyCollectionIntervalMillis_ = other.medianLatencyCollectionIntervalMillis_; + clientProcesses_ = other.clientProcesses_; _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); } @@ -1298,6 +1300,20 @@ namespace Grpc.Testing { } } + /// Field number for the "client_processes" field. + public const int ClientProcessesFieldNumber = 21; + private int clientProcesses_; + /// + /// Number of client processes. 0 indicates no restriction. + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int ClientProcesses { + get { return clientProcesses_; } + set { + clientProcesses_ = value; + } + } + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] public override bool Equals(object other) { return Equals(other as ClientConfig); @@ -1329,6 +1345,7 @@ namespace Grpc.Testing { if (MessagesPerStream != other.MessagesPerStream) return false; if (UseCoalesceApi != other.UseCoalesceApi) return false; if (MedianLatencyCollectionIntervalMillis != other.MedianLatencyCollectionIntervalMillis) return false; + if (ClientProcesses != other.ClientProcesses) return false; return Equals(_unknownFields, other._unknownFields); } @@ -1353,6 +1370,7 @@ namespace Grpc.Testing { if (MessagesPerStream != 0) hash ^= MessagesPerStream.GetHashCode(); if (UseCoalesceApi != false) hash ^= UseCoalesceApi.GetHashCode(); if (MedianLatencyCollectionIntervalMillis != 0) hash ^= MedianLatencyCollectionIntervalMillis.GetHashCode(); + if (ClientProcesses != 0) hash ^= ClientProcesses.GetHashCode(); if (_unknownFields != null) { hash ^= _unknownFields.GetHashCode(); } @@ -1429,6 +1447,10 @@ namespace Grpc.Testing { output.WriteRawTag(160, 1); output.WriteInt32(MedianLatencyCollectionIntervalMillis); } + if (ClientProcesses != 0) { + output.WriteRawTag(168, 1); + output.WriteInt32(ClientProcesses); + } if (_unknownFields != null) { _unknownFields.WriteTo(output); } @@ -1485,6 +1507,9 @@ namespace Grpc.Testing { if (MedianLatencyCollectionIntervalMillis != 0) { size += 2 + pb::CodedOutputStream.ComputeInt32Size(MedianLatencyCollectionIntervalMillis); } + if (ClientProcesses != 0) { + size += 2 + pb::CodedOutputStream.ComputeInt32Size(ClientProcesses); + } if (_unknownFields != null) { size += _unknownFields.CalculateSize(); } @@ -1556,6 +1581,9 @@ namespace Grpc.Testing { if (other.MedianLatencyCollectionIntervalMillis != 0) { MedianLatencyCollectionIntervalMillis = other.MedianLatencyCollectionIntervalMillis; } + if (other.ClientProcesses != 0) { + ClientProcesses = other.ClientProcesses; + } _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); } @@ -1652,6 +1680,10 @@ namespace Grpc.Testing { MedianLatencyCollectionIntervalMillis = input.ReadInt32(); break; } + case 168: { + ClientProcesses = input.ReadInt32(); + break; + } } } } @@ -2168,6 +2200,7 @@ namespace Grpc.Testing { threadsPerCq_ = other.threadsPerCq_; resourceQuotaSize_ = other.resourceQuotaSize_; channelArgs_ = other.channelArgs_.Clone(); + serverProcesses_ = other.serverProcesses_; _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); } @@ -2322,6 +2355,20 @@ namespace Grpc.Testing { get { return channelArgs_; } } + /// Field number for the "server_processes" field. + public const int ServerProcessesFieldNumber = 21; + private int serverProcesses_; + /// + /// Number of server processes. 0 indicates no restriction. + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int ServerProcesses { + get { return serverProcesses_; } + set { + serverProcesses_ = value; + } + } + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] public override bool Equals(object other) { return Equals(other as ServerConfig); @@ -2346,6 +2393,7 @@ namespace Grpc.Testing { if (ThreadsPerCq != other.ThreadsPerCq) return false; if (ResourceQuotaSize != other.ResourceQuotaSize) return false; if(!channelArgs_.Equals(other.channelArgs_)) return false; + if (ServerProcesses != other.ServerProcesses) return false; return Equals(_unknownFields, other._unknownFields); } @@ -2363,6 +2411,7 @@ namespace Grpc.Testing { if (ThreadsPerCq != 0) hash ^= ThreadsPerCq.GetHashCode(); if (ResourceQuotaSize != 0) hash ^= ResourceQuotaSize.GetHashCode(); hash ^= channelArgs_.GetHashCode(); + if (ServerProcesses != 0) hash ^= ServerProcesses.GetHashCode(); if (_unknownFields != null) { hash ^= _unknownFields.GetHashCode(); } @@ -2409,6 +2458,10 @@ namespace Grpc.Testing { output.WriteRawTag(96); output.WriteInt32(ThreadsPerCq); } + if (ServerProcesses != 0) { + output.WriteRawTag(168, 1); + output.WriteInt32(ServerProcesses); + } if (ResourceQuotaSize != 0) { output.WriteRawTag(200, 62); output.WriteInt32(ResourceQuotaSize); @@ -2451,6 +2504,9 @@ namespace Grpc.Testing { size += 2 + pb::CodedOutputStream.ComputeInt32Size(ResourceQuotaSize); } size += channelArgs_.CalculateSize(_repeated_channelArgs_codec); + if (ServerProcesses != 0) { + size += 2 + pb::CodedOutputStream.ComputeInt32Size(ServerProcesses); + } if (_unknownFields != null) { size += _unknownFields.CalculateSize(); } @@ -2497,6 +2553,9 @@ namespace Grpc.Testing { ResourceQuotaSize = other.ResourceQuotaSize; } channelArgs_.Add(other.channelArgs_); + if (other.ServerProcesses != 0) { + ServerProcesses = other.ServerProcesses; + } _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); } @@ -2551,6 +2610,10 @@ namespace Grpc.Testing { ThreadsPerCq = input.ReadInt32(); break; } + case 168: { + ServerProcesses = input.ReadInt32(); + break; + } case 8008: { ResourceQuotaSize = input.ReadInt32(); break; diff --git a/src/csharp/Grpc.IntegrationTesting/Messages.cs b/src/csharp/Grpc.IntegrationTesting/Messages.cs index dee798a9914..6911a44b786 100644 --- a/src/csharp/Grpc.IntegrationTesting/Messages.cs +++ b/src/csharp/Grpc.IntegrationTesting/Messages.cs @@ -37,29 +37,35 @@ namespace Grpc.Testing { "CzIYLmdycGMudGVzdGluZy5FY2hvU3RhdHVzEjIKEWV4cGVjdF9jb21wcmVz", "c2VkGAggASgLMhcuZ3JwYy50ZXN0aW5nLkJvb2xWYWx1ZRIWCg5maWxsX3Nl", "cnZlcl9pZBgJIAEoCBIeChZmaWxsX2dycGNsYl9yb3V0ZV90eXBlGAogASgI", - "IqwBCg5TaW1wbGVSZXNwb25zZRImCgdwYXlsb2FkGAEgASgLMhUuZ3JwYy50", + "Ir4BCg5TaW1wbGVSZXNwb25zZRImCgdwYXlsb2FkGAEgASgLMhUuZ3JwYy50", "ZXN0aW5nLlBheWxvYWQSEAoIdXNlcm5hbWUYAiABKAkSEwoLb2F1dGhfc2Nv", "cGUYAyABKAkSEQoJc2VydmVyX2lkGAQgASgJEjgKEWdycGNsYl9yb3V0ZV90", - "eXBlGAUgASgOMh0uZ3JwYy50ZXN0aW5nLkdycGNsYlJvdXRlVHlwZSJ3ChlT", - "dHJlYW1pbmdJbnB1dENhbGxSZXF1ZXN0EiYKB3BheWxvYWQYASABKAsyFS5n", - "cnBjLnRlc3RpbmcuUGF5bG9hZBIyChFleHBlY3RfY29tcHJlc3NlZBgCIAEo", - "CzIXLmdycGMudGVzdGluZy5Cb29sVmFsdWUiPQoaU3RyZWFtaW5nSW5wdXRD", - "YWxsUmVzcG9uc2USHwoXYWdncmVnYXRlZF9wYXlsb2FkX3NpemUYASABKAUi", - "ZAoSUmVzcG9uc2VQYXJhbWV0ZXJzEgwKBHNpemUYASABKAUSEwoLaW50ZXJ2", - "YWxfdXMYAiABKAUSKwoKY29tcHJlc3NlZBgDIAEoCzIXLmdycGMudGVzdGlu", - "Zy5Cb29sVmFsdWUi6AEKGlN0cmVhbWluZ091dHB1dENhbGxSZXF1ZXN0EjAK", - "DXJlc3BvbnNlX3R5cGUYASABKA4yGS5ncnBjLnRlc3RpbmcuUGF5bG9hZFR5", - "cGUSPQoTcmVzcG9uc2VfcGFyYW1ldGVycxgCIAMoCzIgLmdycGMudGVzdGlu", - "Zy5SZXNwb25zZVBhcmFtZXRlcnMSJgoHcGF5bG9hZBgDIAEoCzIVLmdycGMu", - "dGVzdGluZy5QYXlsb2FkEjEKD3Jlc3BvbnNlX3N0YXR1cxgHIAEoCzIYLmdy", - "cGMudGVzdGluZy5FY2hvU3RhdHVzIkUKG1N0cmVhbWluZ091dHB1dENhbGxS", - "ZXNwb25zZRImCgdwYXlsb2FkGAEgASgLMhUuZ3JwYy50ZXN0aW5nLlBheWxv", - "YWQiMwoPUmVjb25uZWN0UGFyYW1zEiAKGG1heF9yZWNvbm5lY3RfYmFja29m", - "Zl9tcxgBIAEoBSIzCg1SZWNvbm5lY3RJbmZvEg4KBnBhc3NlZBgBIAEoCBIS", - "CgpiYWNrb2ZmX21zGAIgAygFKh8KC1BheWxvYWRUeXBlEhAKDENPTVBSRVNT", - "QUJMRRAAKm8KD0dycGNsYlJvdXRlVHlwZRIdChlHUlBDTEJfUk9VVEVfVFlQ", - "RV9VTktOT1dOEAASHgoaR1JQQ0xCX1JPVVRFX1RZUEVfRkFMTEJBQ0sQARId", - "ChlHUlBDTEJfUk9VVEVfVFlQRV9CQUNLRU5EEAJiBnByb3RvMw==")); + "eXBlGAUgASgOMh0uZ3JwYy50ZXN0aW5nLkdycGNsYlJvdXRlVHlwZRIQCgho", + "b3N0bmFtZRgGIAEoCSJ3ChlTdHJlYW1pbmdJbnB1dENhbGxSZXF1ZXN0EiYK", + "B3BheWxvYWQYASABKAsyFS5ncnBjLnRlc3RpbmcuUGF5bG9hZBIyChFleHBl", + "Y3RfY29tcHJlc3NlZBgCIAEoCzIXLmdycGMudGVzdGluZy5Cb29sVmFsdWUi", + "PQoaU3RyZWFtaW5nSW5wdXRDYWxsUmVzcG9uc2USHwoXYWdncmVnYXRlZF9w", + "YXlsb2FkX3NpemUYASABKAUiZAoSUmVzcG9uc2VQYXJhbWV0ZXJzEgwKBHNp", + "emUYASABKAUSEwoLaW50ZXJ2YWxfdXMYAiABKAUSKwoKY29tcHJlc3NlZBgD", + "IAEoCzIXLmdycGMudGVzdGluZy5Cb29sVmFsdWUi6AEKGlN0cmVhbWluZ091", + "dHB1dENhbGxSZXF1ZXN0EjAKDXJlc3BvbnNlX3R5cGUYASABKA4yGS5ncnBj", + "LnRlc3RpbmcuUGF5bG9hZFR5cGUSPQoTcmVzcG9uc2VfcGFyYW1ldGVycxgC", + "IAMoCzIgLmdycGMudGVzdGluZy5SZXNwb25zZVBhcmFtZXRlcnMSJgoHcGF5", + "bG9hZBgDIAEoCzIVLmdycGMudGVzdGluZy5QYXlsb2FkEjEKD3Jlc3BvbnNl", + "X3N0YXR1cxgHIAEoCzIYLmdycGMudGVzdGluZy5FY2hvU3RhdHVzIkUKG1N0", + "cmVhbWluZ091dHB1dENhbGxSZXNwb25zZRImCgdwYXlsb2FkGAEgASgLMhUu", + "Z3JwYy50ZXN0aW5nLlBheWxvYWQiMwoPUmVjb25uZWN0UGFyYW1zEiAKGG1h", + "eF9yZWNvbm5lY3RfYmFja29mZl9tcxgBIAEoBSIzCg1SZWNvbm5lY3RJbmZv", + "Eg4KBnBhc3NlZBgBIAEoCBISCgpiYWNrb2ZmX21zGAIgAygFIkEKGExvYWRC", + "YWxhbmNlclN0YXRzUmVxdWVzdBIQCghudW1fcnBjcxgBIAEoBRITCgt0aW1l", + "b3V0X3NlYxgCIAEoBSKzAQoZTG9hZEJhbGFuY2VyU3RhdHNSZXNwb25zZRJN", + "CgxycGNzX2J5X3BlZXIYASADKAsyNy5ncnBjLnRlc3RpbmcuTG9hZEJhbGFu", + "Y2VyU3RhdHNSZXNwb25zZS5ScGNzQnlQZWVyRW50cnkSFAoMbnVtX2ZhaWx1", + "cmVzGAIgASgFGjEKD1JwY3NCeVBlZXJFbnRyeRILCgNrZXkYASABKAkSDQoF", + "dmFsdWUYAiABKAU6AjgBKh8KC1BheWxvYWRUeXBlEhAKDENPTVBSRVNTQUJM", + "RRAAKm8KD0dycGNsYlJvdXRlVHlwZRIdChlHUlBDTEJfUk9VVEVfVFlQRV9V", + "TktOT1dOEAASHgoaR1JQQ0xCX1JPVVRFX1RZUEVfRkFMTEJBQ0sQARIdChlH", + "UlBDTEJfUk9VVEVfVFlQRV9CQUNLRU5EEAJiBnByb3RvMw==")); descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, new pbr::FileDescriptor[] { }, new pbr::GeneratedClrTypeInfo(new[] {typeof(global::Grpc.Testing.PayloadType), typeof(global::Grpc.Testing.GrpclbRouteType), }, null, new pbr::GeneratedClrTypeInfo[] { @@ -67,14 +73,16 @@ namespace Grpc.Testing { new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.Payload), global::Grpc.Testing.Payload.Parser, new[]{ "Type", "Body" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.EchoStatus), global::Grpc.Testing.EchoStatus.Parser, new[]{ "Code", "Message" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.SimpleRequest), global::Grpc.Testing.SimpleRequest.Parser, new[]{ "ResponseType", "ResponseSize", "Payload", "FillUsername", "FillOauthScope", "ResponseCompressed", "ResponseStatus", "ExpectCompressed", "FillServerId", "FillGrpclbRouteType" }, null, null, null, null), - new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.SimpleResponse), global::Grpc.Testing.SimpleResponse.Parser, new[]{ "Payload", "Username", "OauthScope", "ServerId", "GrpclbRouteType" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.SimpleResponse), global::Grpc.Testing.SimpleResponse.Parser, new[]{ "Payload", "Username", "OauthScope", "ServerId", "GrpclbRouteType", "Hostname" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.StreamingInputCallRequest), global::Grpc.Testing.StreamingInputCallRequest.Parser, new[]{ "Payload", "ExpectCompressed" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.StreamingInputCallResponse), global::Grpc.Testing.StreamingInputCallResponse.Parser, new[]{ "AggregatedPayloadSize" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.ResponseParameters), global::Grpc.Testing.ResponseParameters.Parser, new[]{ "Size", "IntervalUs", "Compressed" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.StreamingOutputCallRequest), global::Grpc.Testing.StreamingOutputCallRequest.Parser, new[]{ "ResponseType", "ResponseParameters", "Payload", "ResponseStatus" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.StreamingOutputCallResponse), global::Grpc.Testing.StreamingOutputCallResponse.Parser, new[]{ "Payload" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.ReconnectParams), global::Grpc.Testing.ReconnectParams.Parser, new[]{ "MaxReconnectBackoffMs" }, null, null, null, null), - new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.ReconnectInfo), global::Grpc.Testing.ReconnectInfo.Parser, new[]{ "Passed", "BackoffMs" }, null, null, null, null) + new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.ReconnectInfo), global::Grpc.Testing.ReconnectInfo.Parser, new[]{ "Passed", "BackoffMs" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.LoadBalancerStatsRequest), global::Grpc.Testing.LoadBalancerStatsRequest.Parser, new[]{ "NumRpcs", "TimeoutSec" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::Grpc.Testing.LoadBalancerStatsResponse), global::Grpc.Testing.LoadBalancerStatsResponse.Parser, new[]{ "RpcsByPeer", "NumFailures" }, null, null, null, new pbr::GeneratedClrTypeInfo[] { null, }) })); } #endregion @@ -1056,6 +1064,7 @@ namespace Grpc.Testing { oauthScope_ = other.oauthScope_; serverId_ = other.serverId_; grpclbRouteType_ = other.grpclbRouteType_; + hostname_ = other.hostname_; _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); } @@ -1136,6 +1145,20 @@ namespace Grpc.Testing { } } + /// Field number for the "hostname" field. + public const int HostnameFieldNumber = 6; + private string hostname_ = ""; + /// + /// Server hostname. + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public string Hostname { + get { return hostname_; } + set { + hostname_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] public override bool Equals(object other) { return Equals(other as SimpleResponse); @@ -1154,6 +1177,7 @@ namespace Grpc.Testing { if (OauthScope != other.OauthScope) return false; if (ServerId != other.ServerId) return false; if (GrpclbRouteType != other.GrpclbRouteType) return false; + if (Hostname != other.Hostname) return false; return Equals(_unknownFields, other._unknownFields); } @@ -1165,6 +1189,7 @@ namespace Grpc.Testing { if (OauthScope.Length != 0) hash ^= OauthScope.GetHashCode(); if (ServerId.Length != 0) hash ^= ServerId.GetHashCode(); if (GrpclbRouteType != global::Grpc.Testing.GrpclbRouteType.Unknown) hash ^= GrpclbRouteType.GetHashCode(); + if (Hostname.Length != 0) hash ^= Hostname.GetHashCode(); if (_unknownFields != null) { hash ^= _unknownFields.GetHashCode(); } @@ -1198,6 +1223,10 @@ namespace Grpc.Testing { output.WriteRawTag(40); output.WriteEnum((int) GrpclbRouteType); } + if (Hostname.Length != 0) { + output.WriteRawTag(50); + output.WriteString(Hostname); + } if (_unknownFields != null) { _unknownFields.WriteTo(output); } @@ -1221,6 +1250,9 @@ namespace Grpc.Testing { if (GrpclbRouteType != global::Grpc.Testing.GrpclbRouteType.Unknown) { size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) GrpclbRouteType); } + if (Hostname.Length != 0) { + size += 1 + pb::CodedOutputStream.ComputeStringSize(Hostname); + } if (_unknownFields != null) { size += _unknownFields.CalculateSize(); } @@ -1250,6 +1282,9 @@ namespace Grpc.Testing { if (other.GrpclbRouteType != global::Grpc.Testing.GrpclbRouteType.Unknown) { GrpclbRouteType = other.GrpclbRouteType; } + if (other.Hostname.Length != 0) { + Hostname = other.Hostname; + } _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); } @@ -1284,6 +1319,10 @@ namespace Grpc.Testing { GrpclbRouteType = (global::Grpc.Testing.GrpclbRouteType) input.ReadEnum(); break; } + case 50: { + Hostname = input.ReadString(); + break; + } } } } @@ -2477,6 +2516,324 @@ namespace Grpc.Testing { } + public sealed partial class LoadBalancerStatsRequest : pb::IMessage { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new LoadBalancerStatsRequest()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pbr::MessageDescriptor Descriptor { + get { return global::Grpc.Testing.MessagesReflection.Descriptor.MessageTypes[12]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public LoadBalancerStatsRequest() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public LoadBalancerStatsRequest(LoadBalancerStatsRequest other) : this() { + numRpcs_ = other.numRpcs_; + timeoutSec_ = other.timeoutSec_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public LoadBalancerStatsRequest Clone() { + return new LoadBalancerStatsRequest(this); + } + + /// Field number for the "num_rpcs" field. + public const int NumRpcsFieldNumber = 1; + private int numRpcs_; + /// + /// Request stats for the next num_rpcs sent by client. + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int NumRpcs { + get { return numRpcs_; } + set { + numRpcs_ = value; + } + } + + /// Field number for the "timeout_sec" field. + public const int TimeoutSecFieldNumber = 2; + private int timeoutSec_; + /// + /// If num_rpcs have not completed within timeout_sec, return partial results. + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int TimeoutSec { + get { return timeoutSec_; } + set { + timeoutSec_ = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override bool Equals(object other) { + return Equals(other as LoadBalancerStatsRequest); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public bool Equals(LoadBalancerStatsRequest other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + if (NumRpcs != other.NumRpcs) return false; + if (TimeoutSec != other.TimeoutSec) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override int GetHashCode() { + int hash = 1; + if (NumRpcs != 0) hash ^= NumRpcs.GetHashCode(); + if (TimeoutSec != 0) hash ^= TimeoutSec.GetHashCode(); + if (_unknownFields != null) { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void WriteTo(pb::CodedOutputStream output) { + if (NumRpcs != 0) { + output.WriteRawTag(8); + output.WriteInt32(NumRpcs); + } + if (TimeoutSec != 0) { + output.WriteRawTag(16); + output.WriteInt32(TimeoutSec); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int CalculateSize() { + int size = 0; + if (NumRpcs != 0) { + size += 1 + pb::CodedOutputStream.ComputeInt32Size(NumRpcs); + } + if (TimeoutSec != 0) { + size += 1 + pb::CodedOutputStream.ComputeInt32Size(TimeoutSec); + } + if (_unknownFields != null) { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(LoadBalancerStatsRequest other) { + if (other == null) { + return; + } + if (other.NumRpcs != 0) { + NumRpcs = other.NumRpcs; + } + if (other.TimeoutSec != 0) { + TimeoutSec = other.TimeoutSec; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(pb::CodedInputStream input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 8: { + NumRpcs = input.ReadInt32(); + break; + } + case 16: { + TimeoutSec = input.ReadInt32(); + break; + } + } + } + } + + } + + public sealed partial class LoadBalancerStatsResponse : pb::IMessage { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new LoadBalancerStatsResponse()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public static pbr::MessageDescriptor Descriptor { + get { return global::Grpc.Testing.MessagesReflection.Descriptor.MessageTypes[13]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public LoadBalancerStatsResponse() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public LoadBalancerStatsResponse(LoadBalancerStatsResponse other) : this() { + rpcsByPeer_ = other.rpcsByPeer_.Clone(); + numFailures_ = other.numFailures_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public LoadBalancerStatsResponse Clone() { + return new LoadBalancerStatsResponse(this); + } + + /// Field number for the "rpcs_by_peer" field. + public const int RpcsByPeerFieldNumber = 1; + private static readonly pbc::MapField.Codec _map_rpcsByPeer_codec + = new pbc::MapField.Codec(pb::FieldCodec.ForString(10, ""), pb::FieldCodec.ForInt32(16, 0), 10); + private readonly pbc::MapField rpcsByPeer_ = new pbc::MapField(); + /// + /// The number of completed RPCs for each peer. + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public pbc::MapField RpcsByPeer { + get { return rpcsByPeer_; } + } + + /// Field number for the "num_failures" field. + public const int NumFailuresFieldNumber = 2; + private int numFailures_; + /// + /// The number of RPCs that failed to record a remote peer. + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int NumFailures { + get { return numFailures_; } + set { + numFailures_ = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override bool Equals(object other) { + return Equals(other as LoadBalancerStatsResponse); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public bool Equals(LoadBalancerStatsResponse other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + if (!RpcsByPeer.Equals(other.RpcsByPeer)) return false; + if (NumFailures != other.NumFailures) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override int GetHashCode() { + int hash = 1; + hash ^= RpcsByPeer.GetHashCode(); + if (NumFailures != 0) hash ^= NumFailures.GetHashCode(); + if (_unknownFields != null) { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void WriteTo(pb::CodedOutputStream output) { + rpcsByPeer_.WriteTo(output, _map_rpcsByPeer_codec); + if (NumFailures != 0) { + output.WriteRawTag(16); + output.WriteInt32(NumFailures); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public int CalculateSize() { + int size = 0; + size += rpcsByPeer_.CalculateSize(_map_rpcsByPeer_codec); + if (NumFailures != 0) { + size += 1 + pb::CodedOutputStream.ComputeInt32Size(NumFailures); + } + if (_unknownFields != null) { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(LoadBalancerStatsResponse other) { + if (other == null) { + return; + } + rpcsByPeer_.Add(other.rpcsByPeer_); + if (other.NumFailures != 0) { + NumFailures = other.NumFailures; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + public void MergeFrom(pb::CodedInputStream input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 10: { + rpcsByPeer_.AddEntriesFrom(input, _map_rpcsByPeer_codec); + break; + } + case 16: { + NumFailures = input.ReadInt32(); + break; + } + } + } + } + + } + #endregion } diff --git a/src/csharp/Grpc.IntegrationTesting/Test.cs b/src/csharp/Grpc.IntegrationTesting/Test.cs index 8850b7b1bf1..992908f5877 100644 --- a/src/csharp/Grpc.IntegrationTesting/Test.cs +++ b/src/csharp/Grpc.IntegrationTesting/Test.cs @@ -47,7 +47,10 @@ namespace Grpc.Testing { "bmcuRW1wdHkaEy5ncnBjLnRlc3RpbmcuRW1wdHkyiQEKEFJlY29ubmVjdFNl", "cnZpY2USOwoFU3RhcnQSHS5ncnBjLnRlc3RpbmcuUmVjb25uZWN0UGFyYW1z", "GhMuZ3JwYy50ZXN0aW5nLkVtcHR5EjgKBFN0b3ASEy5ncnBjLnRlc3Rpbmcu", - "RW1wdHkaGy5ncnBjLnRlc3RpbmcuUmVjb25uZWN0SW5mb2IGcHJvdG8z")); + "RW1wdHkaGy5ncnBjLnRlc3RpbmcuUmVjb25uZWN0SW5mbzJ/ChhMb2FkQmFs", + "YW5jZXJTdGF0c1NlcnZpY2USYwoOR2V0Q2xpZW50U3RhdHMSJi5ncnBjLnRl", + "c3RpbmcuTG9hZEJhbGFuY2VyU3RhdHNSZXF1ZXN0GicuZ3JwYy50ZXN0aW5n", + "LkxvYWRCYWxhbmNlclN0YXRzUmVzcG9uc2UiAGIGcHJvdG8z")); descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, new pbr::FileDescriptor[] { global::Grpc.Testing.EmptyReflection.Descriptor, global::Grpc.Testing.MessagesReflection.Descriptor, }, new pbr::GeneratedClrTypeInfo(null, null, null)); diff --git a/src/csharp/Grpc.IntegrationTesting/TestGrpc.cs b/src/csharp/Grpc.IntegrationTesting/TestGrpc.cs index f358a6d175c..5f63fd9a5d8 100644 --- a/src/csharp/Grpc.IntegrationTesting/TestGrpc.cs +++ b/src/csharp/Grpc.IntegrationTesting/TestGrpc.cs @@ -818,5 +818,137 @@ namespace Grpc.Testing { } } + /// + /// A service used to obtain stats for verifying LB behavior. + /// + public static partial class LoadBalancerStatsService + { + static readonly string __ServiceName = "grpc.testing.LoadBalancerStatsService"; + + static readonly grpc::Marshaller __Marshaller_grpc_testing_LoadBalancerStatsRequest = grpc::Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Grpc.Testing.LoadBalancerStatsRequest.Parser.ParseFrom); + static readonly grpc::Marshaller __Marshaller_grpc_testing_LoadBalancerStatsResponse = grpc::Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Grpc.Testing.LoadBalancerStatsResponse.Parser.ParseFrom); + + static readonly grpc::Method __Method_GetClientStats = new grpc::Method( + grpc::MethodType.Unary, + __ServiceName, + "GetClientStats", + __Marshaller_grpc_testing_LoadBalancerStatsRequest, + __Marshaller_grpc_testing_LoadBalancerStatsResponse); + + /// Service descriptor + public static global::Google.Protobuf.Reflection.ServiceDescriptor Descriptor + { + get { return global::Grpc.Testing.TestReflection.Descriptor.Services[3]; } + } + + /// Base class for server-side implementations of LoadBalancerStatsService + [grpc::BindServiceMethod(typeof(LoadBalancerStatsService), "BindService")] + public abstract partial class LoadBalancerStatsServiceBase + { + /// + /// Gets the backend distribution for RPCs sent by a test client. + /// + /// The request received from the client. + /// The context of the server-side call handler being invoked. + /// The response to send back to the client (wrapped by a task). + public virtual global::System.Threading.Tasks.Task GetClientStats(global::Grpc.Testing.LoadBalancerStatsRequest request, grpc::ServerCallContext context) + { + throw new grpc::RpcException(new grpc::Status(grpc::StatusCode.Unimplemented, "")); + } + + } + + /// Client for LoadBalancerStatsService + public partial class LoadBalancerStatsServiceClient : grpc::ClientBase + { + /// Creates a new client for LoadBalancerStatsService + /// The channel to use to make remote calls. + public LoadBalancerStatsServiceClient(grpc::ChannelBase channel) : base(channel) + { + } + /// Creates a new client for LoadBalancerStatsService that uses a custom CallInvoker. + /// The callInvoker to use to make remote calls. + public LoadBalancerStatsServiceClient(grpc::CallInvoker callInvoker) : base(callInvoker) + { + } + /// Protected parameterless constructor to allow creation of test doubles. + protected LoadBalancerStatsServiceClient() : base() + { + } + /// Protected constructor to allow creation of configured clients. + /// The client configuration. + protected LoadBalancerStatsServiceClient(ClientBaseConfiguration configuration) : base(configuration) + { + } + + /// + /// Gets the backend distribution for RPCs sent by a test client. + /// + /// The request to send to the server. + /// The initial metadata to send with the call. This parameter is optional. + /// An optional deadline for the call. The call will be cancelled if deadline is hit. + /// An optional token for canceling the call. + /// The response received from the server. + public virtual global::Grpc.Testing.LoadBalancerStatsResponse GetClientStats(global::Grpc.Testing.LoadBalancerStatsRequest request, grpc::Metadata headers = null, global::System.DateTime? deadline = null, global::System.Threading.CancellationToken cancellationToken = default(global::System.Threading.CancellationToken)) + { + return GetClientStats(request, new grpc::CallOptions(headers, deadline, cancellationToken)); + } + /// + /// Gets the backend distribution for RPCs sent by a test client. + /// + /// The request to send to the server. + /// The options for the call. + /// The response received from the server. + public virtual global::Grpc.Testing.LoadBalancerStatsResponse GetClientStats(global::Grpc.Testing.LoadBalancerStatsRequest request, grpc::CallOptions options) + { + return CallInvoker.BlockingUnaryCall(__Method_GetClientStats, null, options, request); + } + /// + /// Gets the backend distribution for RPCs sent by a test client. + /// + /// The request to send to the server. + /// The initial metadata to send with the call. This parameter is optional. + /// An optional deadline for the call. The call will be cancelled if deadline is hit. + /// An optional token for canceling the call. + /// The call object. + public virtual grpc::AsyncUnaryCall GetClientStatsAsync(global::Grpc.Testing.LoadBalancerStatsRequest request, grpc::Metadata headers = null, global::System.DateTime? deadline = null, global::System.Threading.CancellationToken cancellationToken = default(global::System.Threading.CancellationToken)) + { + return GetClientStatsAsync(request, new grpc::CallOptions(headers, deadline, cancellationToken)); + } + /// + /// Gets the backend distribution for RPCs sent by a test client. + /// + /// The request to send to the server. + /// The options for the call. + /// The call object. + public virtual grpc::AsyncUnaryCall GetClientStatsAsync(global::Grpc.Testing.LoadBalancerStatsRequest request, grpc::CallOptions options) + { + return CallInvoker.AsyncUnaryCall(__Method_GetClientStats, null, options, request); + } + /// Creates a new instance of client from given ClientBaseConfiguration. + protected override LoadBalancerStatsServiceClient NewInstance(ClientBaseConfiguration configuration) + { + return new LoadBalancerStatsServiceClient(configuration); + } + } + + /// Creates service definition that can be registered with a server + /// An object implementing the server-side handling logic. + public static grpc::ServerServiceDefinition BindService(LoadBalancerStatsServiceBase serviceImpl) + { + return grpc::ServerServiceDefinition.CreateBuilder() + .AddMethod(__Method_GetClientStats, serviceImpl.GetClientStats).Build(); + } + + /// Register service method with a service binder with or without implementation. Useful when customizing the service binding logic. + /// Note: this method is part of an experimental API that can change or be removed without any prior notice. + /// Service methods will be bound by calling AddMethod on this object. + /// An object implementing the server-side handling logic. + public static void BindService(grpc::ServiceBinderBase serviceBinder, LoadBalancerStatsServiceBase serviceImpl) + { + serviceBinder.AddMethod(__Method_GetClientStats, serviceImpl == null ? null : new grpc::UnaryServerMethod(serviceImpl.GetClientStats)); + } + + } } #endregion From 555804bb94dcac80bfcf04ee63a773a547e77d38 Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Fri, 17 Apr 2020 13:05:17 +0200 Subject: [PATCH 531/758] regenerate ruby protos --- .../pb/src/proto/grpc/testing/messages_pb.rb | 11 +++++++++++ .../src/proto/grpc/testing/test_services_pb.rb | 16 ++++++++++++++++ .../qps/src/proto/grpc/testing/control_pb.rb | 2 ++ .../qps/src/proto/grpc/testing/messages_pb.rb | 11 +++++++++++ 4 files changed, 40 insertions(+) diff --git a/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb b/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb index 4d9a3f1b736..f492ccfa670 100644 --- a/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +++ b/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb @@ -34,6 +34,7 @@ Google::Protobuf::DescriptorPool.generated_pool.build do optional :oauth_scope, :string, 3 optional :server_id, :string, 4 optional :grpclb_route_type, :enum, 5, "grpc.testing.GrpclbRouteType" + optional :hostname, :string, 6 end add_message "grpc.testing.StreamingInputCallRequest" do optional :payload, :message, 1, "grpc.testing.Payload" @@ -63,6 +64,14 @@ Google::Protobuf::DescriptorPool.generated_pool.build do optional :passed, :bool, 1 repeated :backoff_ms, :int32, 2 end + add_message "grpc.testing.LoadBalancerStatsRequest" do + optional :num_rpcs, :int32, 1 + optional :timeout_sec, :int32, 2 + end + add_message "grpc.testing.LoadBalancerStatsResponse" do + map :rpcs_by_peer, :string, :int32, 1 + optional :num_failures, :int32, 2 + end add_enum "grpc.testing.PayloadType" do value :COMPRESSABLE, 0 end @@ -88,6 +97,8 @@ module Grpc StreamingOutputCallResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.StreamingOutputCallResponse").msgclass ReconnectParams = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.ReconnectParams").msgclass ReconnectInfo = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.ReconnectInfo").msgclass + LoadBalancerStatsRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.LoadBalancerStatsRequest").msgclass + LoadBalancerStatsResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.LoadBalancerStatsResponse").msgclass PayloadType = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.PayloadType").enummodule GrpclbRouteType = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.GrpclbRouteType").enummodule end diff --git a/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb b/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb index 123aa902ea3..8138bd0114d 100644 --- a/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb +++ b/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb @@ -96,6 +96,22 @@ module Grpc rpc :Stop, Empty, ReconnectInfo end + Stub = Service.rpc_stub_class + end + module LoadBalancerStatsService + # A service used to obtain stats for verifying LB behavior. + class Service + + include GRPC::GenericService + + self.marshal_class_method = :encode + self.unmarshal_class_method = :decode + self.service_name = 'grpc.testing.LoadBalancerStatsService' + + # Gets the backend distribution for RPCs sent by a test client. + rpc :GetClientStats, LoadBalancerStatsRequest, LoadBalancerStatsResponse + end + Stub = Service.rpc_stub_class end end diff --git a/src/ruby/qps/src/proto/grpc/testing/control_pb.rb b/src/ruby/qps/src/proto/grpc/testing/control_pb.rb index 0449f261eb1..0394c8be2e8 100644 --- a/src/ruby/qps/src/proto/grpc/testing/control_pb.rb +++ b/src/ruby/qps/src/proto/grpc/testing/control_pb.rb @@ -49,6 +49,7 @@ Google::Protobuf::DescriptorPool.generated_pool.build do optional :messages_per_stream, :int32, 18 optional :use_coalesce_api, :bool, 19 optional :median_latency_collection_interval_millis, :int32, 20 + optional :client_processes, :int32, 21 end add_message "grpc.testing.ClientStatus" do optional :stats, :message, 1, "grpc.testing.ClientStats" @@ -74,6 +75,7 @@ Google::Protobuf::DescriptorPool.generated_pool.build do optional :threads_per_cq, :int32, 12 optional :resource_quota_size, :int32, 1001 repeated :channel_args, :message, 1002, "grpc.testing.ChannelArg" + optional :server_processes, :int32, 21 end add_message "grpc.testing.ServerArgs" do oneof :argtype do diff --git a/src/ruby/qps/src/proto/grpc/testing/messages_pb.rb b/src/ruby/qps/src/proto/grpc/testing/messages_pb.rb index 4d9a3f1b736..f492ccfa670 100644 --- a/src/ruby/qps/src/proto/grpc/testing/messages_pb.rb +++ b/src/ruby/qps/src/proto/grpc/testing/messages_pb.rb @@ -34,6 +34,7 @@ Google::Protobuf::DescriptorPool.generated_pool.build do optional :oauth_scope, :string, 3 optional :server_id, :string, 4 optional :grpclb_route_type, :enum, 5, "grpc.testing.GrpclbRouteType" + optional :hostname, :string, 6 end add_message "grpc.testing.StreamingInputCallRequest" do optional :payload, :message, 1, "grpc.testing.Payload" @@ -63,6 +64,14 @@ Google::Protobuf::DescriptorPool.generated_pool.build do optional :passed, :bool, 1 repeated :backoff_ms, :int32, 2 end + add_message "grpc.testing.LoadBalancerStatsRequest" do + optional :num_rpcs, :int32, 1 + optional :timeout_sec, :int32, 2 + end + add_message "grpc.testing.LoadBalancerStatsResponse" do + map :rpcs_by_peer, :string, :int32, 1 + optional :num_failures, :int32, 2 + end add_enum "grpc.testing.PayloadType" do value :COMPRESSABLE, 0 end @@ -88,6 +97,8 @@ module Grpc StreamingOutputCallResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.StreamingOutputCallResponse").msgclass ReconnectParams = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.ReconnectParams").msgclass ReconnectInfo = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.ReconnectInfo").msgclass + LoadBalancerStatsRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.LoadBalancerStatsRequest").msgclass + LoadBalancerStatsResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.LoadBalancerStatsResponse").msgclass PayloadType = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.PayloadType").enummodule GrpclbRouteType = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.GrpclbRouteType").enummodule end From 0432f7f6ca1ded1de8fd365dd074aedbfb28c3c5 Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Fri, 17 Apr 2020 12:52:17 +0200 Subject: [PATCH 532/758] use bazel-built protoc and plugin for generate_proto_*.sh scripts modify scripts --- src/csharp/generate_proto_csharp.sh | 7 +++++-- src/php/bin/generate_proto_php.sh | 13 +++++++++---- src/ruby/pb/generate_proto_ruby.sh | 6 ++++-- 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/src/csharp/generate_proto_csharp.sh b/src/csharp/generate_proto_csharp.sh index e79728ff959..c6ef27e2290 100755 --- a/src/csharp/generate_proto_csharp.sh +++ b/src/csharp/generate_proto_csharp.sh @@ -17,8 +17,11 @@ set +e cd $(dirname $0)/../.. -PROTOC=bins/opt/protobuf/protoc -PLUGIN=protoc-gen-grpc=bins/opt/grpc_csharp_plugin +# protoc and grpc_*_plugin binaries can be obtained by running +# $ bazel build @com_google_protobuf//:protoc //src/compiler:all +PROTOC=bazel-bin/external/com_google_protobuf/protoc +PLUGIN=protoc-gen-grpc=bazel-bin/src/compiler/grpc_csharp_plugin + EXAMPLES_DIR=src/csharp/Grpc.Examples HEALTHCHECK_DIR=src/csharp/Grpc.HealthCheck REFLECTION_DIR=src/csharp/Grpc.Reflection diff --git a/src/php/bin/generate_proto_php.sh b/src/php/bin/generate_proto_php.sh index 42d5b642431..d7c0a593e4a 100755 --- a/src/php/bin/generate_proto_php.sh +++ b/src/php/bin/generate_proto_php.sh @@ -16,10 +16,15 @@ set +e cd $(dirname $0)/../../.. -protoc --proto_path=src/proto/math \ +# protoc and grpc_*_plugin binaries can be obtained by running +# $ bazel build @com_google_protobuf//:protoc //src/compiler:all +PROTOC=bazel-bin/external/com_google_protobuf/protoc +PLUGIN=protoc-gen-grpc=bazel-bin/src/compiler/grpc_php_plugin + +$PROTOC --proto_path=src/proto/math \ --php_out=src/php/tests/generated_code \ --grpc_out=src/php/tests/generated_code \ - --plugin=protoc-gen-grpc=bins/opt/grpc_php_plugin \ + --plugin=$PLUGIN \ src/proto/math/math.proto # replace the Empty message with EmptyMessage @@ -32,10 +37,10 @@ sed 's/grpc\.testing\.Empty/grpc\.testing\.EmptyMessage/g' \ src/proto/grpc/testing/test.proto > $output_file mv $output_file ./src/proto/grpc/testing/test.proto -protoc --proto_path=. \ +$PROTOC --proto_path=. \ --php_out=src/php/tests/interop \ --grpc_out=src/php/tests/interop \ - --plugin=protoc-gen-grpc=bins/opt/grpc_php_plugin \ + --plugin=$PLUGIN \ src/proto/grpc/testing/messages.proto \ src/proto/grpc/testing/empty.proto \ src/proto/grpc/testing/test.proto diff --git a/src/ruby/pb/generate_proto_ruby.sh b/src/ruby/pb/generate_proto_ruby.sh index ec6e2eedd1e..01eccba94da 100755 --- a/src/ruby/pb/generate_proto_ruby.sh +++ b/src/ruby/pb/generate_proto_ruby.sh @@ -17,8 +17,10 @@ set +e cd $(dirname $0)/../../.. -PROTOC=bins/opt/protobuf/protoc -PLUGIN=protoc-gen-grpc=bins/opt/grpc_ruby_plugin +# protoc and grpc_*_plugin binaries can be obtained by running +# $ bazel build @com_google_protobuf//:protoc //src/compiler:all +PROTOC=bazel-bin/external/com_google_protobuf/protoc +PLUGIN=protoc-gen-grpc=bazel-bin/src/compiler/grpc_ruby_plugin $PROTOC -I src/proto src/proto/grpc/health/v1/health.proto \ --grpc_out=src/ruby/pb \ From c91ee5227687695e56299552c6ef854dbe73218f Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Fri, 17 Apr 2020 13:15:49 +0200 Subject: [PATCH 533/758] simplify obj-c run_plugin_tests.sh --- src/objective-c/tests/run_plugin_tests.sh | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/objective-c/tests/run_plugin_tests.sh b/src/objective-c/tests/run_plugin_tests.sh index 760103eb7cd..98f36e18b61 100755 --- a/src/objective-c/tests/run_plugin_tests.sh +++ b/src/objective-c/tests/run_plugin_tests.sh @@ -24,9 +24,8 @@ cd $(dirname $0) ROOT_DIR=../../.. BAZEL=$ROOT_DIR/tools/bazel -BAZEL_EXEC_ROOT=$ROOT_DIR/bazel-out/darwin-fastbuild/bin -PROTOC=$BAZEL_EXEC_ROOT/external/com_google_protobuf/protoc -PLUGIN=$BAZEL_EXEC_ROOT/src/compiler/grpc_objective_c_plugin +PROTOC=bazel-bin/external/com_google_protobuf/protoc +PLUGIN=bazel-bin/src/compiler/grpc_objective_c_plugin [ -f $PROTOC ] && [ -f $PLUGIN ] || { BAZEL build @com_google_protobuf//:protoc //src/compiler:grpc_objective_c_plugin From 5baf2962929a4d886b108ba17b71a0aefff87776 Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Fri, 17 Apr 2020 13:27:21 +0200 Subject: [PATCH 534/758] add link to Protobuf PHP empty.proto issue --- src/php/bin/generate_proto_php.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/src/php/bin/generate_proto_php.sh b/src/php/bin/generate_proto_php.sh index d7c0a593e4a..3265c29c857 100755 --- a/src/php/bin/generate_proto_php.sh +++ b/src/php/bin/generate_proto_php.sh @@ -29,6 +29,7 @@ $PROTOC --proto_path=src/proto/math \ # replace the Empty message with EmptyMessage # because Empty is a PHP reserved word +# See https://github.com/protocolbuffers/protobuf/issues/2124 output_file=$(mktemp) sed 's/message Empty/message EmptyMessage/g' \ src/proto/grpc/testing/empty.proto > $output_file From 30b6b1f0f4655fb0bf242200f458cc3d78610bb6 Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Fri, 17 Apr 2020 19:16:21 +0200 Subject: [PATCH 535/758] address review comments --- src/objective-c/tests/run_plugin_tests.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/objective-c/tests/run_plugin_tests.sh b/src/objective-c/tests/run_plugin_tests.sh index 98f36e18b61..606aea84cf7 100755 --- a/src/objective-c/tests/run_plugin_tests.sh +++ b/src/objective-c/tests/run_plugin_tests.sh @@ -24,8 +24,8 @@ cd $(dirname $0) ROOT_DIR=../../.. BAZEL=$ROOT_DIR/tools/bazel -PROTOC=bazel-bin/external/com_google_protobuf/protoc -PLUGIN=bazel-bin/src/compiler/grpc_objective_c_plugin +PROTOC=$ROOT_DIR/bazel-bin/external/com_google_protobuf/protoc +PLUGIN=$ROOT_DIR/bazel-bin/src/compiler/grpc_objective_c_plugin [ -f $PROTOC ] && [ -f $PLUGIN ] || { BAZEL build @com_google_protobuf//:protoc //src/compiler:grpc_objective_c_plugin From 7db619ba959d1c237ea4f2e54d3b3a13a2a276ec Mon Sep 17 00:00:00 2001 From: Donna Dionne Date: Fri, 17 Apr 2020 11:19:19 -0700 Subject: [PATCH 536/758] Code review comments. --- .../ext/filters/client_channel/xds/xds_api.cc | 43 +++++++++---------- test/cpp/end2end/xds_end2end_test.cc | 16 +++---- 2 files changed, 29 insertions(+), 30 deletions(-) diff --git a/src/core/ext/filters/client_channel/xds/xds_api.cc b/src/core/ext/filters/client_channel/xds/xds_api.cc index eb9fe41c948..4be62a33cd0 100644 --- a/src/core/ext/filters/client_channel/xds/xds_api.cc +++ b/src/core/ext/filters/client_channel/xds/xds_api.cc @@ -1024,29 +1024,28 @@ grpc_error* RouteConfigParse( if (envoy_api_v2_route_RouteMatch_has_prefix(match)) { upb_strview prefix = envoy_api_v2_route_RouteMatch_prefix(match); // Empty prefix "" is accepted. - if (prefix.size == 1) { + if (prefix.size > 0) { // Prefix "/" is accepted. if (prefix.data[0] != '/') { return GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "Prefix is not empty and does starting with a /"); + "Prefix does not start with a /"); } - } else if (prefix.size > 1) { - if (prefix.data[0] != '/') { - return GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "Prefix is not starting with a /"); - } - std::vector prefix_elements = absl::StrSplit( - absl::string_view(prefix.data, prefix.size).substr(1), '/'); - if (prefix_elements.size() != 2) { - return GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "Prefix not in the required format of /service/"); - } else if (!prefix_elements[1].empty()) { - return GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "Prefix is not ending with a /"); - } else if (prefix_elements[0].empty()) { - return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Prefix cannot be empty"); + if (prefix.size > 1) { + std::vector prefix_elements = absl::StrSplit( + absl::string_view(prefix.data, prefix.size).substr(1), + absl::MaxSplits('/', 1)); + if (prefix_elements.size() != 2) { + return GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "Prefix not in the required format of /service/"); + } else if (!prefix_elements[1].empty()) { + return GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "Prefix does not end with a /"); + } else if (prefix_elements[0].empty()) { + return GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "Prefix contains empty service name"); + } + rds_route.service = std::string(prefix_elements[0]); } - rds_route.service = std::string(prefix_elements[0]); } } else if (envoy_api_v2_route_RouteMatch_has_path(match)) { upb_strview path = envoy_api_v2_route_RouteMatch_path(match); @@ -1056,7 +1055,7 @@ grpc_error* RouteConfigParse( } if (path.data[0] != '/') { return GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "Path is not starting with a /"); + "Path does not start with a /"); } std::vector path_elements = absl::StrSplit( absl::string_view(path.data, path.size).substr(1), '/'); @@ -1065,10 +1064,10 @@ grpc_error* RouteConfigParse( "Path not in the required format of /service/method"); } else if (path_elements[0].empty()) { return GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "Path service name cannot be empty"); + "Path contains empty service name"); } else if (path_elements[1].empty()) { return GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "Path method name cannot be empty"); + "Path contains empty method name"); } rds_route.service = std::string(path_elements[0]); rds_route.method = std::string(path_elements[1]); @@ -1092,7 +1091,7 @@ grpc_error* RouteConfigParse( envoy_api_v2_route_RouteAction_cluster(route_action); if (action.size == 0) { return GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "RouteAction has empty cluster."); + "RouteAction contains empty cluster."); } rds_route.cluster_name = std::string(action.data, action.size); rds_update->routes.emplace_back(std::move(rds_route)); diff --git a/test/cpp/end2end/xds_end2end_test.cc b/test/cpp/end2end/xds_end2end_test.cc index 6c3cf0dea84..29e3eb834d9 100644 --- a/test/cpp/end2end/xds_end2end_test.cc +++ b/test/cpp/end2end/xds_end2end_test.cc @@ -1410,9 +1410,6 @@ class XdsEnd2endTest : public ::testing::TestWithParam { Status SendRpcMethod(Stub* stub, const RpcOptions& rpc_options, ClientContext* context, EchoRequest& request, EchoResponse* response) { - context->set_deadline( - grpc_timeout_milliseconds_to_deadline(rpc_options.timeout_ms)); - if (rpc_options.wait_for_ready) context->set_wait_for_ready(true); switch (rpc_options.method) { case METHOD_ECHO: return (*stub)->Echo(context, request, response); @@ -1428,7 +1425,10 @@ class XdsEnd2endTest : public ::testing::TestWithParam { const bool local_response = (response == nullptr); if (local_response) response = new EchoResponse; EchoRequest request; - ClientContext* context = new ClientContext; + ClientContext context; + context.set_deadline( + grpc_timeout_milliseconds_to_deadline(rpc_options.timeout_ms)); + if (rpc_options.wait_for_ready) context.set_wait_for_ready(true); request.set_message(kRequestMessage_); if (rpc_options.server_fail) { request.mutable_param()->mutable_expected_error()->set_code( @@ -1437,18 +1437,18 @@ class XdsEnd2endTest : public ::testing::TestWithParam { Status status; switch (rpc_options.service) { case SERVICE_ECHO: - status = SendRpcMethod(&stub_, rpc_options, context, request, response); + status = + SendRpcMethod(&stub_, rpc_options, &context, request, response); break; case SERVICE_ECHO1: status = - SendRpcMethod(&stub1_, rpc_options, context, request, response); + SendRpcMethod(&stub1_, rpc_options, &context, request, response); break; case SERVICE_ECHO2: status = - SendRpcMethod(&stub2_, rpc_options, context, request, response); + SendRpcMethod(&stub2_, rpc_options, &context, request, response); break; } - delete context; if (local_response) delete response; return status; } From 6597db2089fab5d940316e753fa3f64bf853b2f5 Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Fri, 17 Apr 2020 11:38:10 -0700 Subject: [PATCH 537/758] Reverted to using stream_write_closed --- .../transport/chttp2/transport/chttp2_transport.cc | 13 ++++++------- src/core/ext/transport/inproc/inproc_transport.cc | 3 ++- src/core/lib/iomgr/error.cc | 10 +--------- src/core/lib/iomgr/error.h | 6 +----- src/core/lib/surface/call.cc | 13 +++++++------ src/core/lib/transport/transport.h | 12 ++++++++++++ 6 files changed, 29 insertions(+), 28 deletions(-) diff --git a/src/core/ext/transport/chttp2/transport/chttp2_transport.cc b/src/core/ext/transport/chttp2/transport/chttp2_transport.cc index 4fa6a7710e2..cc03a406903 100644 --- a/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +++ b/src/core/ext/transport/chttp2/transport/chttp2_transport.cc @@ -1207,12 +1207,7 @@ void grpc_chttp2_complete_closure_step(grpc_chttp2_transport* t, desc, errstr, write_state_name(t->write_state)); } if (error != GRPC_ERROR_NONE) { - // The surface layer treats GRPC_ERROR_EOS specially and does not cancel - // calls with batches that failed with GRPC_ERROR_EOS. The transport layer - // uses GRPC_ERROR_EOS specifically for send ops that failed due to the - // stream being closed for writes. - if (closure->error_data.error == GRPC_ERROR_NONE && - error != GRPC_ERROR_EOS) { + if (closure->error_data.error == GRPC_ERROR_NONE) { closure->error_data.error = GRPC_ERROR_CREATE_FROM_STATIC_STRING( "Error in HTTP transport completing operation"); closure->error_data.error = grpc_error_set_str( @@ -1489,9 +1484,13 @@ static void perform_stream_op_locked(void* stream_op, on_complete->next_data.scratch |= CLOSURE_BARRIER_MAY_COVER_WRITE; s->fetching_send_message_finished = add_closure_barrier(op->on_complete); if (s->write_closed) { + op->payload->send_message.stream_write_closed = true; + // We should NOT return an error here, so as to avoid a cancel OP being + // started. The surface layer will notice that the stream has been closed + // for writes and fail the send message op. op->payload->send_message.send_message.reset(); grpc_chttp2_complete_closure_step( - t, s, &s->fetching_send_message_finished, GRPC_ERROR_EOS, + t, s, &s->fetching_send_message_finished, GRPC_ERROR_NONE, "fetching_send_message_finished"); } else { GPR_ASSERT(s->fetching_send_message == nullptr); diff --git a/src/core/ext/transport/inproc/inproc_transport.cc b/src/core/ext/transport/inproc/inproc_transport.cc index 277e01af4b7..5892132418d 100644 --- a/src/core/ext/transport/inproc/inproc_transport.cc +++ b/src/core/ext/transport/inproc/inproc_transport.cc @@ -764,8 +764,9 @@ void op_state_machine_locked(inproc_stream* s, grpc_error* error) { // Nothing further will try to receive from this stream, so finish off // any outstanding send_message op s->send_message_op->payload->send_message.send_message.reset(); + s->send_message_op->payload->send_message.stream_write_closed = true; complete_if_batch_end_locked( - s, GRPC_ERROR_EOS, s->send_message_op, + s, new_err, s->send_message_op, "op_state_machine scheduling send-message-on-complete"); s->send_message_op = nullptr; } diff --git a/src/core/lib/iomgr/error.cc b/src/core/lib/iomgr/error.cc index 6108cc37dd1..dedc8376578 100644 --- a/src/core/lib/iomgr/error.cc +++ b/src/core/lib/iomgr/error.cc @@ -405,9 +405,6 @@ static grpc_error* copy_error_and_unref(grpc_error* in) { internal_set_str(&out, GRPC_ERROR_STR_DESCRIPTION, grpc_slice_from_static_string("cancelled")); internal_set_int(&out, GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_CANCELLED); - } else if (in == GRPC_ERROR_EOS) { - internal_set_str(&out, GRPC_ERROR_STR_DESCRIPTION, - grpc_slice_from_static_string("end of stream")); } } else if (gpr_ref_is_unique(&in->atomics.refs)) { out = in; @@ -462,10 +459,7 @@ const special_error_status_map error_status_map[] = { strlen("Out of memory")}, // GRPC_ERROR_OOM {GRPC_STATUS_INVALID_ARGUMENT, "", 0}, // GRPC_ERROR_RESERVED_2 {GRPC_STATUS_CANCELLED, "Cancelled", - strlen("Cancelled")}, // GRPC_ERROR_CANCELLED - {GRPC_STATUS_INVALID_ARGUMENT, "", 0}, // GRPC_ERROR_RESERVED_3 - {GRPC_STATUS_UNAVAILABLE, "End of stream", - strlen("End of stream")} // GRPC_ERROR_EOS + strlen("Cancelled")}, // GRPC_ERROR_CANCELLED }; bool grpc_error_get_int(grpc_error* err, grpc_error_ints which, intptr_t* p) { @@ -537,7 +531,6 @@ grpc_error* grpc_error_add_child(grpc_error* src, grpc_error* child) { static const char* no_error_string = "\"No Error\""; static const char* oom_error_string = "\"Out of memory\""; static const char* cancelled_error_string = "\"Cancelled\""; -static const char* eos_error_string = "\"End of stream\""; typedef struct { char* key; @@ -752,7 +745,6 @@ const char* grpc_error_string(grpc_error* err) { if (err == GRPC_ERROR_NONE) return no_error_string; if (err == GRPC_ERROR_OOM) return oom_error_string; if (err == GRPC_ERROR_CANCELLED) return cancelled_error_string; - if (err == GRPC_ERROR_EOS) return eos_error_string; void* p = (void*)gpr_atm_acq_load(&err->atomics.error_string); if (p != nullptr) { diff --git a/src/core/lib/iomgr/error.h b/src/core/lib/iomgr/error.h index 35b9b8c3958..5c79aa78ae7 100644 --- a/src/core/lib/iomgr/error.h +++ b/src/core/lib/iomgr/error.h @@ -127,11 +127,7 @@ typedef enum { #define GRPC_ERROR_OOM ((grpc_error*)2) #define GRPC_ERROR_RESERVED_2 ((grpc_error*)3) #define GRPC_ERROR_CANCELLED ((grpc_error*)4) -#define GRPC_ERROR_RESERVED_3 ((grpc_error*)5) -// GRPC_ERROR_EOS is used only by transports for send ops that failed because -// the stream was closed for writes. -#define GRPC_ERROR_EOS ((grpc_error*)6) -#define GRPC_ERROR_SPECIAL_MAX GRPC_ERROR_EOS +#define GRPC_ERROR_SPECIAL_MAX GRPC_ERROR_CANCELLED inline bool grpc_error_is_special(struct grpc_error* err) { return err <= GRPC_ERROR_SPECIAL_MAX; diff --git a/src/core/lib/surface/call.cc b/src/core/lib/surface/call.cc index d4ef71afd5f..fcebe9bc410 100644 --- a/src/core/lib/surface/call.cc +++ b/src/core/lib/surface/call.cc @@ -1178,6 +1178,12 @@ static void post_batch_completion(batch_control* bctl) { &call->metadata_batch[0 /* is_receiving */][0 /* is_trailing */]); } if (bctl->op.send_message) { + if (bctl->op.payload->send_message.stream_write_closed && + error == GRPC_ERROR_NONE) { + error = grpc_error_add_child( + error, GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "Attempt to send message after stream was closed.")); + } call->sending_message = false; } if (bctl->op.send_trailing_metadata) { @@ -1532,12 +1538,7 @@ static void finish_batch(void* bctlp, grpc_error* error) { gpr_atm_rel_store(&bctl->batch_error, reinterpret_cast(GRPC_ERROR_REF(error))); } - // If the batch had an error, we should normally fail the call. If the batch - // ended with GRPC_ERROR_EOS, we should not cancel the call because we - // do not want to overwrite the status that will be propagated through the - // recv_trailing_metadata callback. - if (error != GRPC_ERROR_NONE && error != GRPC_ERROR_EOS) { - gpr_log(GPR_ERROR, "got an error %s. cancelling", grpc_error_string(error)); + if (error != GRPC_ERROR_NONE) { cancel_with_error(call, GRPC_ERROR_REF(error)); } finish_batch_step(bctl); diff --git a/src/core/lib/transport/transport.h b/src/core/lib/transport/transport.h index 1ef31d79d2b..18374511cde 100644 --- a/src/core/lib/transport/transport.h +++ b/src/core/lib/transport/transport.h @@ -250,6 +250,18 @@ struct grpc_transport_stream_op_batch_payload { // The batch's on_complete will not be called until after the byte // stream is orphaned. grpc_core::OrphanablePtr send_message; + // Set by the transport if the stream has been closed for writes. If this + // is set and send message op is present, we set the operation to be a + // failure without sending a cancel OP down the stack. This is so that the + // status of the call does not get overwritten by the Cancel OP, which would + // be especially problematic if we had received a valid status from the + // server. + // For send_initial_metadata, it is fine for the status to be overwritten + // because at that point, the client will not have received a status. + // For send_trailing_metadata, we might overwrite the status if we have + // non-zero metadata to send. This is fine because the API does not allow + // the client to send trailing metadata. + bool stream_write_closed = false; } send_message; struct { From 6be41055b4fe291f6c833675fd06e4340d864280 Mon Sep 17 00:00:00 2001 From: Hannah Shi Date: Fri, 17 Apr 2020 18:50:39 +0000 Subject: [PATCH 538/758] fix of a bit of memory leak --- src/php/ext/grpc/channel.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/php/ext/grpc/channel.c b/src/php/ext/grpc/channel.c index c8060a976c3..059e8333db1 100644 --- a/src/php/ext/grpc/channel.c +++ b/src/php/ext/grpc/channel.c @@ -350,7 +350,6 @@ PHP_METHOD(Channel, __construct) { 1 TSRMLS_CC); return; } else { - Z_ADDREF(*creds_obj); creds = PHP_GRPC_GET_WRAPPED_OBJECT(wrapped_grpc_channel_credentials, creds_obj); } From 1c728b3aea072d76f10af88542f5ec73d6080e2a Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Fri, 17 Apr 2020 13:12:08 -0700 Subject: [PATCH 539/758] Reduce maintenance burden --- .../grpcio_status/grpc_status/rpc_status.py | 16 ++++++---------- .../tests_aio/status/grpc_status_test.py | 4 ++-- 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/src/python/grpcio_status/grpc_status/rpc_status.py b/src/python/grpcio_status/grpc_status/rpc_status.py index d2bbbae4343..f3c94cc5039 100644 --- a/src/python/grpcio_status/grpc_status/rpc_status.py +++ b/src/python/grpcio_status/grpc_status/rpc_status.py @@ -79,15 +79,11 @@ def to_status(status): status.SerializeToString()),)) +__all__ = [ + 'from_call', + 'to_status', +] + if sys.version_info[0] >= 3 and sys.version_info[1] >= 6: from . import _async as aio - __all__ = [ - 'from_call', - 'to_status', - 'aio', - ] -else: - __all__ = [ - 'from_call', - 'to_status', - ] + __all__.append('aio') diff --git a/src/python/grpcio_tests/tests_aio/status/grpc_status_test.py b/src/python/grpcio_tests/tests_aio/status/grpc_status_test.py index b3b894d1161..980cf5a67e7 100644 --- a/src/python/grpcio_tests/tests_aio/status/grpc_status_test.py +++ b/src/python/grpcio_tests/tests_aio/status/grpc_status_test.py @@ -144,8 +144,8 @@ class StatusTest(AioTestBase): self.assertEqual(status.code, code_pb2.Code.Value('INTERNAL')) # Check if the underlying proto message is intact - self.assertEqual( - status.details[0].Is(error_details_pb2.DebugInfo.DESCRIPTOR), True) + self.assertTrue(status.details[0].Is( + error_details_pb2.DebugInfo.DESCRIPTOR)) info = error_details_pb2.DebugInfo() status.details[0].Unpack(info) self.assertIn('_error_details_unary_unary', info.stack_entries[-1]) From 50858050639834cf521b056cd97d246fde2c5c5d Mon Sep 17 00:00:00 2001 From: Vijay Pai Date: Fri, 17 Apr 2020 13:22:11 -0700 Subject: [PATCH 540/758] Remove some excessive logs --- test/cpp/end2end/test_service_impl.cc | 2 -- 1 file changed, 2 deletions(-) diff --git a/test/cpp/end2end/test_service_impl.cc b/test/cpp/end2end/test_service_impl.cc index 12928c70b48..285f8ae4f98 100644 --- a/test/cpp/end2end/test_service_impl.cc +++ b/test/cpp/end2end/test_service_impl.cc @@ -225,7 +225,6 @@ experimental::ServerUnaryReactor* CallbackTestServiceImpl::Echo( FinishWhenCancelledAsync(); return; } - gpr_log(GPR_DEBUG, "Request message was %s", req_->message().c_str()); resp_->set_message(req_->message()); internal::MaybeEchoDeadline(ctx_, req_, resp_); if (service_->host_) { @@ -568,7 +567,6 @@ CallbackTestServiceImpl::BidiStream( void OnReadDone(bool ok) override { if (ok) { num_msgs_read_++; - gpr_log(GPR_INFO, "recv msg %s", request_.message().c_str()); response_.set_message(request_.message()); if (num_msgs_read_ == server_write_last_) { StartWriteLast(&response_, WriteOptions()); From db151dc1680bbaf86dd6a0d9741987c8033745ef Mon Sep 17 00:00:00 2001 From: Vijay Pai Date: Fri, 17 Apr 2020 14:04:11 -0700 Subject: [PATCH 541/758] Virtualize RequestMatcher to enable customized matchers --- src/core/lib/surface/server.cc | 349 +++++++++++++++++++-------------- 1 file changed, 204 insertions(+), 145 deletions(-) diff --git a/src/core/lib/surface/server.cc b/src/core/lib/surface/server.cc index f2e9d031188..998eb6dd4a9 100644 --- a/src/core/lib/surface/server.cc +++ b/src/core/lib/surface/server.cc @@ -132,7 +132,54 @@ enum call_state { ZOMBIED }; -struct request_matcher; +struct call_data; + +// RPCs that come in from the transport must be matched against RPC requests +// from the application. An incoming request from the application can be matched +// to an RPC that has already arrived or can be queued up for later use. +// Likewise, an RPC coming in from the transport can either be matched to a +// request that already arrived from the application or can be queued up for +// later use (marked pending). If there is a match, the request's tag is posted +// on the request's notification CQ. +// +// RequestMatcherInterface is the base class to provide this functionality. +class RequestMatcherInterface { + public: + virtual ~RequestMatcherInterface() {} + + // Unref the calls associated with any incoming RPCs in the pending queue (not + // yet matched to an application-requested RPC). + virtual void ZombifyPending() = 0; + + // Mark all application-requested RPCs failed if they have not been matched to + // an incoming RPC. The error parameter indicates why the RPCs are being + // failed (always server shutdown in all current implementations). + virtual void KillRequests(grpc_error* error) = 0; + + // How many request queues are supported by this matcher. This is an abstract + // concept that essentially maps to gRPC completion queues. + virtual size_t request_queue_count() const = 0; + + // This function is invoked when the application requests a new RPC whose + // information is in the call parameter. The request_queue_index marks the + // queue onto which to place this RPC, and is typically associated with a gRPC + // CQ. If there are pending RPCs waiting to be matched, publish one (match it + // and notify the CQ). + virtual void RequestCallWithPossiblePublish(size_t request_queue_index, + requested_call* call) = 0; + + // This function is invoked on an incoming RPC, represented by the calld + // object. The RequestMatcher will try to match it against an + // application-requested RPC if possible or will place it in the pending queue + // otherwise. To enable some measure of fairness between server CQs, the match + // is done starting at the start_request_queue_index parameter in a cyclic + // order rather than always starting at 0. + virtual void MatchOrQueue(size_t start_request_queue_index, + call_data* calld) = 0; + + // Returns the server associated with this request matcher + virtual grpc_server* server() const = 0; +}; struct call_data { call_data(grpc_call_element* elem, const grpc_call_element_args& args) @@ -175,7 +222,7 @@ struct call_data { grpc_metadata_array initial_metadata = grpc_metadata_array(); // Zero-initialize the C struct. - request_matcher* matcher = nullptr; + RequestMatcherInterface* matcher = nullptr; grpc_byte_buffer* payload = nullptr; grpc_closure got_initial_metadata; @@ -194,20 +241,15 @@ struct call_data { grpc_core::CallCombiner* call_combiner; }; -struct request_matcher { - grpc_server* server; - call_data* pending_head; - call_data* pending_tail; - LockedMultiProducerSingleConsumerQueue* requests_per_cq; -}; - struct registered_method { char* method; char* host; grpc_server_register_method_payload_handling payload_handling; uint32_t flags; /* one request matcher per method */ - request_matcher matcher; + // TODO(vjpai): Move this to a unique_ptr once this has a real + // constructor/destructor + RequestMatcherInterface* matcher = nullptr; registered_method* next; }; @@ -245,7 +287,9 @@ struct grpc_server { registered_method* registered_methods; /** one request matcher for unregistered methods */ - request_matcher unregistered_request_matcher; + // TODO(vjpai): Convert to a std::unique_ptr once grpc_server has a real + // constructor and destructor. + RequestMatcherInterface* unregistered_request_matcher; gpr_atm shutdown_flag; uint8_t shutdown_published; @@ -268,13 +312,19 @@ struct grpc_server { (((channel_data*)(elem)->channel_data)->server) namespace { -void publish_new_rpc(void* arg, grpc_error* error); +void publish_call(grpc_server* server, call_data* calld, size_t cq_idx, + requested_call* rc); void fail_call(grpc_server* server, size_t cq_idx, requested_call* rc, grpc_error* error); /* Before calling maybe_finish_shutdown, we must hold mu_global and not hold mu_call */ void maybe_finish_shutdown(grpc_server* server); +void kill_zombie(void* elem, grpc_error* /*error*/) { + grpc_call_unref( + grpc_call_from_top_element(static_cast(elem))); +} + /* * channel broadcaster */ @@ -347,54 +397,138 @@ void channel_broadcaster_shutdown(channel_broadcaster* cb, bool send_goaway, * request_matcher */ -void request_matcher_init(request_matcher* rm, grpc_server* server) { - rm->server = server; - rm->pending_head = rm->pending_tail = nullptr; - rm->requests_per_cq = static_cast( - gpr_malloc(sizeof(*rm->requests_per_cq) * server->cq_count)); - for (size_t i = 0; i < server->cq_count; i++) { - new (&rm->requests_per_cq[i]) LockedMultiProducerSingleConsumerQueue(); +// The RealRequestMatcher is an implementation of RequestMatcherInterface that +// actually uses all the features of RequestMatcherInterface: expecting the +// application to explicitly request RPCs and then matching those to incoming +// RPCs, along with a slow path by which incoming RPCs are put on a locked +// pending list if they aren't able to be matched to an application request. +class RealRequestMatcher : public RequestMatcherInterface { + public: + explicit RealRequestMatcher(grpc_server* server) + : server_(server), requests_per_cq_(server->cq_count) {} + + ~RealRequestMatcher() override { + for (LockedMultiProducerSingleConsumerQueue& queue : requests_per_cq_) { + GPR_ASSERT(queue.Pop() == nullptr); + } } -} -void request_matcher_destroy(request_matcher* rm) { - for (size_t i = 0; i < rm->server->cq_count; i++) { - GPR_ASSERT(rm->requests_per_cq[i].Pop() == nullptr); - rm->requests_per_cq[i].~LockedMultiProducerSingleConsumerQueue(); + void ZombifyPending() override { + while (pending_head_ != nullptr) { + call_data* calld = pending_head_; + pending_head_ = calld->pending_next; + gpr_atm_no_barrier_store(&calld->state, ZOMBIED); + GRPC_CLOSURE_INIT( + &calld->kill_zombie_closure, kill_zombie, + grpc_call_stack_element(grpc_call_get_call_stack(calld->call), 0), + grpc_schedule_on_exec_ctx); + grpc_core::ExecCtx::Run(DEBUG_LOCATION, &calld->kill_zombie_closure, + GRPC_ERROR_NONE); + } } - gpr_free(rm->requests_per_cq); -} -void kill_zombie(void* elem, grpc_error* /*error*/) { - grpc_call_unref( - grpc_call_from_top_element(static_cast(elem))); -} + void KillRequests(grpc_error* error) override { + for (size_t i = 0; i < requests_per_cq_.size(); i++) { + requested_call* rc; + while ((rc = reinterpret_cast( + requests_per_cq_[i].Pop())) != nullptr) { + fail_call(server_, i, rc, GRPC_ERROR_REF(error)); + } + } + GRPC_ERROR_UNREF(error); + } -void request_matcher_zombify_all_pending_calls(request_matcher* rm) { - while (rm->pending_head) { - call_data* calld = rm->pending_head; - rm->pending_head = calld->pending_next; - gpr_atm_no_barrier_store(&calld->state, ZOMBIED); - GRPC_CLOSURE_INIT( - &calld->kill_zombie_closure, kill_zombie, - grpc_call_stack_element(grpc_call_get_call_stack(calld->call), 0), - grpc_schedule_on_exec_ctx); - grpc_core::ExecCtx::Run(DEBUG_LOCATION, &calld->kill_zombie_closure, - GRPC_ERROR_NONE); + size_t request_queue_count() const override { + return requests_per_cq_.size(); + } + + void RequestCallWithPossiblePublish(size_t request_queue_index, + requested_call* call) override { + if (requests_per_cq_[request_queue_index].Push(call->mpscq_node.get())) { + /* this was the first queued request: we need to lock and start + matching calls */ + gpr_mu_lock(&server_->mu_call); + call_data* calld; + while ((calld = pending_head_) != nullptr) { + requested_call* rc = reinterpret_cast( + requests_per_cq_[request_queue_index].Pop()); + if (rc == nullptr) break; + pending_head_ = calld->pending_next; + gpr_mu_unlock(&server_->mu_call); + if (!gpr_atm_full_cas(&calld->state, PENDING, ACTIVATED)) { + // Zombied Call + GRPC_CLOSURE_INIT( + &calld->kill_zombie_closure, kill_zombie, + grpc_call_stack_element(grpc_call_get_call_stack(calld->call), 0), + grpc_schedule_on_exec_ctx); + grpc_core::ExecCtx::Run(DEBUG_LOCATION, &calld->kill_zombie_closure, + GRPC_ERROR_NONE); + } else { + publish_call(server_, calld, request_queue_index, rc); + } + gpr_mu_lock(&server_->mu_call); + } + gpr_mu_unlock(&server_->mu_call); + } } -} -void request_matcher_kill_requests(grpc_server* server, request_matcher* rm, - grpc_error* error) { - requested_call* rc; - for (size_t i = 0; i < server->cq_count; i++) { - while ((rc = reinterpret_cast( - rm->requests_per_cq[i].Pop())) != nullptr) { - fail_call(server, i, rc, GRPC_ERROR_REF(error)); + void MatchOrQueue(size_t start_request_queue_index, + call_data* calld) override { + for (size_t i = 0; i < requests_per_cq_.size(); i++) { + size_t cq_idx = (start_request_queue_index + i) % requests_per_cq_.size(); + requested_call* rc = + reinterpret_cast(requests_per_cq_[cq_idx].TryPop()); + if (rc == nullptr) { + continue; + } else { + GRPC_STATS_INC_SERVER_CQS_CHECKED(i); + gpr_atm_no_barrier_store(&calld->state, ACTIVATED); + publish_call(server_, calld, cq_idx, rc); + return; /* early out */ + } + } + + /* no cq to take the request found: queue it on the slow list */ + GRPC_STATS_INC_SERVER_SLOWPATH_REQUESTS_QUEUED(); + gpr_mu_lock(&server_->mu_call); + + // We need to ensure that all the queues are empty. We do this under + // the server mu_call lock to ensure that if something is added to + // an empty request queue, it will block until the call is actually + // added to the pending list. + for (size_t i = 0; i < requests_per_cq_.size(); i++) { + size_t cq_idx = (start_request_queue_index + i) % requests_per_cq_.size(); + requested_call* rc = + reinterpret_cast(requests_per_cq_[cq_idx].Pop()); + if (rc == nullptr) { + continue; + } else { + gpr_mu_unlock(&server_->mu_call); + GRPC_STATS_INC_SERVER_CQS_CHECKED(i + requests_per_cq_.size()); + gpr_atm_no_barrier_store(&calld->state, ACTIVATED); + publish_call(server_, calld, cq_idx, rc); + return; /* early out */ + } } + + gpr_atm_no_barrier_store(&calld->state, PENDING); + if (pending_head_ == nullptr) { + pending_tail_ = pending_head_ = calld; + } else { + pending_tail_->pending_next = calld; + pending_tail_ = calld; + } + gpr_mu_unlock(&server_->mu_call); } - GRPC_ERROR_UNREF(error); -} + + grpc_server* server() const override { return server_; } + + private: + grpc_server* const server_; + call_data* pending_head_ = nullptr; + call_data* pending_tail_ = nullptr; + std::vector requests_per_cq_; +}; /* * server proper @@ -412,16 +546,12 @@ void server_delete(grpc_server* server) { gpr_cv_destroy(&server->starting_cv); while ((rm = server->registered_methods) != nullptr) { server->registered_methods = rm->next; - if (server->started) { - request_matcher_destroy(&rm->matcher); - } + delete rm->matcher; gpr_free(rm->method); gpr_free(rm->host); gpr_free(rm); } - if (server->started) { - request_matcher_destroy(&server->unregistered_request_matcher); - } + delete server->unregistered_request_matcher; for (i = 0; i < server->cq_count; i++) { GRPC_CQ_INTERNAL_UNREF(server->cqs[i], "server"); } @@ -512,8 +642,8 @@ void publish_new_rpc(void* arg, grpc_error* error) { grpc_call_element* call_elem = static_cast(arg); call_data* calld = static_cast(call_elem->call_data); channel_data* chand = static_cast(call_elem->channel_data); - request_matcher* rm = calld->matcher; - grpc_server* server = rm->server; + RequestMatcherInterface* rm = calld->matcher; + grpc_server* server = rm->server(); if (error != GRPC_ERROR_NONE || gpr_atm_acq_load(&server->shutdown_flag)) { gpr_atm_no_barrier_store(&calld->state, ZOMBIED); @@ -526,55 +656,11 @@ void publish_new_rpc(void* arg, grpc_error* error) { return; } - for (size_t i = 0; i < server->cq_count; i++) { - size_t cq_idx = (chand->cq_idx + i) % server->cq_count; - requested_call* rc = - reinterpret_cast(rm->requests_per_cq[cq_idx].TryPop()); - if (rc == nullptr) { - continue; - } else { - GRPC_STATS_INC_SERVER_CQS_CHECKED(i); - gpr_atm_no_barrier_store(&calld->state, ACTIVATED); - publish_call(server, calld, cq_idx, rc); - return; /* early out */ - } - } - - /* no cq to take the request found: queue it on the slow list */ - GRPC_STATS_INC_SERVER_SLOWPATH_REQUESTS_QUEUED(); - gpr_mu_lock(&server->mu_call); - - // We need to ensure that all the queues are empty. We do this under - // the server mu_call lock to ensure that if something is added to - // an empty request queue, it will block until the call is actually - // added to the pending list. - for (size_t i = 0; i < server->cq_count; i++) { - size_t cq_idx = (chand->cq_idx + i) % server->cq_count; - requested_call* rc = - reinterpret_cast(rm->requests_per_cq[cq_idx].Pop()); - if (rc == nullptr) { - continue; - } else { - gpr_mu_unlock(&server->mu_call); - GRPC_STATS_INC_SERVER_CQS_CHECKED(i + server->cq_count); - gpr_atm_no_barrier_store(&calld->state, ACTIVATED); - publish_call(server, calld, cq_idx, rc); - return; /* early out */ - } - } - - gpr_atm_no_barrier_store(&calld->state, PENDING); - if (rm->pending_head == nullptr) { - rm->pending_tail = rm->pending_head = calld; - } else { - rm->pending_tail->pending_next = calld; - rm->pending_tail = calld; - } - gpr_mu_unlock(&server->mu_call); + rm->MatchOrQueue(chand->cq_idx, calld); } void finish_start_new_rpc( - grpc_server* server, grpc_call_element* elem, request_matcher* rm, + grpc_server* server, grpc_call_element* elem, RequestMatcherInterface* rm, grpc_server_register_method_payload_handling payload_handling) { call_data* calld = static_cast(elem->call_data); @@ -632,7 +718,7 @@ void start_new_rpc(grpc_call_element* elem) { GRPC_INITIAL_METADATA_IDEMPOTENT_REQUEST)) { continue; } - finish_start_new_rpc(server, elem, &rm->server_registered_method->matcher, + finish_start_new_rpc(server, elem, rm->server_registered_method->matcher, rm->server_registered_method->payload_handling); return; } @@ -649,12 +735,12 @@ void start_new_rpc(grpc_call_element* elem) { GRPC_INITIAL_METADATA_IDEMPOTENT_REQUEST)) { continue; } - finish_start_new_rpc(server, elem, &rm->server_registered_method->matcher, + finish_start_new_rpc(server, elem, rm->server_registered_method->matcher, rm->server_registered_method->payload_handling); return; } } - finish_start_new_rpc(server, elem, &server->unregistered_request_matcher, + finish_start_new_rpc(server, elem, server->unregistered_request_matcher, GRPC_SRM_PAYLOAD_NONE); } @@ -683,15 +769,12 @@ int num_channels(grpc_server* server) { void kill_pending_work_locked(grpc_server* server, grpc_error* error) { if (server->started) { - request_matcher_kill_requests(server, &server->unregistered_request_matcher, - GRPC_ERROR_REF(error)); - request_matcher_zombify_all_pending_calls( - &server->unregistered_request_matcher); + server->unregistered_request_matcher->KillRequests(GRPC_ERROR_REF(error)); + server->unregistered_request_matcher->ZombifyPending(); for (registered_method* rm = server->registered_methods; rm; rm = rm->next) { - request_matcher_kill_requests(server, &rm->matcher, - GRPC_ERROR_REF(error)); - request_matcher_zombify_all_pending_calls(&rm->matcher); + rm->matcher->KillRequests(GRPC_ERROR_REF(error)); + rm->matcher->ZombifyPending(); } } GRPC_ERROR_UNREF(error); @@ -1007,45 +1090,21 @@ void listener_destroy_done(void* s, grpc_error* /*error*/) { grpc_call_error queue_call_request(grpc_server* server, size_t cq_idx, requested_call* rc) { - call_data* calld = nullptr; - request_matcher* rm = nullptr; if (gpr_atm_acq_load(&server->shutdown_flag)) { fail_call(server, cq_idx, rc, GRPC_ERROR_CREATE_FROM_STATIC_STRING("Server Shutdown")); return GRPC_CALL_OK; } + RequestMatcherInterface* rm; switch (rc->type) { case BATCH_CALL: - rm = &server->unregistered_request_matcher; + rm = server->unregistered_request_matcher; break; case REGISTERED_CALL: - rm = &rc->data.registered.method->matcher; + rm = rc->data.registered.method->matcher; break; } - if (rm->requests_per_cq[cq_idx].Push(rc->mpscq_node.get())) { - /* this was the first queued request: we need to lock and start - matching calls */ - gpr_mu_lock(&server->mu_call); - while ((calld = rm->pending_head) != nullptr) { - rc = reinterpret_cast(rm->requests_per_cq[cq_idx].Pop()); - if (rc == nullptr) break; - rm->pending_head = calld->pending_next; - gpr_mu_unlock(&server->mu_call); - if (!gpr_atm_full_cas(&calld->state, PENDING, ACTIVATED)) { - // Zombied Call - GRPC_CLOSURE_INIT( - &calld->kill_zombie_closure, kill_zombie, - grpc_call_stack_element(grpc_call_get_call_stack(calld->call), 0), - grpc_schedule_on_exec_ctx); - grpc_core::ExecCtx::Run(DEBUG_LOCATION, &calld->kill_zombie_closure, - GRPC_ERROR_NONE); - } else { - publish_call(server, calld, cq_idx, rc); - } - gpr_mu_lock(&server->mu_call); - } - gpr_mu_unlock(&server->mu_call); - } + rm->RequestCallWithPossiblePublish(cq_idx, rc); return GRPC_CALL_OK; } @@ -1191,9 +1250,9 @@ void grpc_server_start(grpc_server* server) { grpc_cq_pollset(server->cqs[i]); } } - request_matcher_init(&server->unregistered_request_matcher, server); + server->unregistered_request_matcher = new RealRequestMatcher(server); for (registered_method* rm = server->registered_methods; rm; rm = rm->next) { - request_matcher_init(&rm->matcher, server); + rm->matcher = new RealRequestMatcher(server); } gpr_mu_lock(&server->mu_global); From f64554b698519ca49fb88fd0535c1214bd684182 Mon Sep 17 00:00:00 2001 From: ZhenLian Date: Thu, 16 Apr 2020 13:38:41 -0700 Subject: [PATCH 542/758] [NO Review] grpc_tool_test.cc --- test/cpp/util/BUILD | 3 +++ test/cpp/util/grpc_tool_test.cc | 35 +++++++++++++++++++++++++++------ 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/test/cpp/util/BUILD b/test/cpp/util/BUILD index 3f6d7db15e0..c3695ba0fa6 100644 --- a/test/cpp/util/BUILD +++ b/test/cpp/util/BUILD @@ -180,6 +180,9 @@ grpc_cc_test( "grpc_tool_test.cc", ], data = [ + "//src/core/tsi/test_creds:ca.pem", + "//src/core/tsi/test_creds:server1.key", + "//src/core/tsi/test_creds:server1.pem", "//src/proto/grpc/testing:echo.proto", "//src/proto/grpc/testing:echo_messages.proto", "//src/proto/grpc/testing:simple_messages.proto", diff --git a/test/cpp/util/grpc_tool_test.cc b/test/cpp/util/grpc_tool_test.cc index e44ada46c24..8f121a0c4f4 100644 --- a/test/cpp/util/grpc_tool_test.cc +++ b/test/cpp/util/grpc_tool_test.cc @@ -18,8 +18,6 @@ #include "test/cpp/util/grpc_tool.h" -#include - #include #include #include @@ -32,15 +30,21 @@ #include #include +#include + #include "src/core/lib/gpr/env.h" +#include "src/core/lib/iomgr/load_file.h" #include "src/proto/grpc/testing/echo.grpc.pb.h" #include "src/proto/grpc/testing/echo.pb.h" -#include "test/core/end2end/data/ssl_test_data.h" #include "test/core/util/port.h" #include "test/core/util/test_config.h" #include "test/cpp/util/cli_credentials.h" #include "test/cpp/util/string_ref_helper.h" +#define CA_CERT_PATH "src/core/tsi/test_creds/ca.pem" +#define SERVER_CERT_PATH "src/core/tsi/test_creds/server1.pem" +#define SERVER_KEY_PATH "src/core/tsi/test_creds/server1.key" + using grpc::testing::EchoRequest; using grpc::testing::EchoResponse; @@ -121,8 +125,16 @@ class TestCliCredentials final : public grpc::testing::CliCredentials { if (!secure_) { return InsecureChannelCredentials(); } + grpc_slice ca_slice; + GPR_ASSERT(GRPC_LOG_IF_ERROR("load_file", + grpc_load_file(CA_CERT_PATH, 1, &ca_slice))); + const char* test_root_cert = + reinterpret_cast GRPC_SLICE_START_PTR(ca_slice); SslCredentialsOptions ssl_opts = {test_root_cert, "", ""}; - return grpc::SslCredentials(grpc::SslCredentialsOptions(ssl_opts)); + std::shared_ptr credential_ptr = + grpc::SslCredentials(grpc::SslCredentialsOptions(ssl_opts)); + grpc_slice_unref(ca_slice); + return credential_ptr; } const grpc::string GetCredentialUsage() const override { return ""; } @@ -240,9 +252,18 @@ class GrpcToolTest : public ::testing::Test { // Setup server ServerBuilder builder; std::shared_ptr creds; + grpc_slice cert_slice, key_slice; + GPR_ASSERT(GRPC_LOG_IF_ERROR( + "load_file", grpc_load_file(SERVER_CERT_PATH, 1, &cert_slice))); + GPR_ASSERT(GRPC_LOG_IF_ERROR( + "load_file", grpc_load_file(SERVER_KEY_PATH, 1, &key_slice))); + const char* server_cert = + reinterpret_cast GRPC_SLICE_START_PTR(cert_slice); + const char* server_key = + reinterpret_cast GRPC_SLICE_START_PTR(key_slice); + SslServerCredentialsOptions::PemKeyCertPair pkcp = {server_key, + server_cert}; if (secure) { - SslServerCredentialsOptions::PemKeyCertPair pkcp = {test_server1_key, - test_server1_cert}; SslServerCredentialsOptions ssl_opts; ssl_opts.pem_root_certs = ""; ssl_opts.pem_key_cert_pairs.push_back(pkcp); @@ -253,6 +274,8 @@ class GrpcToolTest : public ::testing::Test { builder.AddListeningPort(server_address.str(), creds); builder.RegisterService(&service_); server_ = builder.BuildAndStart(); + grpc_slice_unref(cert_slice); + grpc_slice_unref(key_slice); return server_address.str(); } From 8bff0722eeba3cc56d0075523246c7b8e47e0826 Mon Sep 17 00:00:00 2001 From: Muxi Yan Date: Fri, 17 Apr 2020 16:53:29 -0700 Subject: [PATCH 543/758] Fix grpc_cfstream test --- tools/internal_ci/macos/grpc_run_bazel_isolated_tests.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/internal_ci/macos/grpc_run_bazel_isolated_tests.sh b/tools/internal_ci/macos/grpc_run_bazel_isolated_tests.sh index 8ca34d19fe3..c785f25b6b3 100644 --- a/tools/internal_ci/macos/grpc_run_bazel_isolated_tests.sh +++ b/tools/internal_ci/macos/grpc_run_bazel_isolated_tests.sh @@ -21,7 +21,7 @@ cd $(dirname $0)/../../.. ./tools/run_tests/start_port_server.py # run cfstream_test separately because it messes with the network -tools/bazel test $RUN_TESTS_FLAGS --spawn_strategy=standalone --genrule_strategy=standalone --test_output=all //test/cpp/end2end:cfstream_test +tools/bazel test $RUN_TESTS_FLAGS --spawn_strategy=standalone --genrule_strategy=standalone --test_output=all --copt="-DGRPC_CFSTREAM=1" //test/cpp/end2end:cfstream_test # Make sure time is in sync before running time_jump_test because the test does # NTP sync before exiting. Bazel gets confused if test end time < start time. From 6ffa02a3891d4389a26cfa8e175f8fa58956908f Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Sat, 18 Apr 2020 18:43:55 +0200 Subject: [PATCH 544/758] do not eat errors when generating protos --- src/csharp/generate_proto_csharp.sh | 2 +- src/php/bin/generate_proto_php.sh | 2 +- src/ruby/pb/generate_proto_ruby.sh | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/csharp/generate_proto_csharp.sh b/src/csharp/generate_proto_csharp.sh index c6ef27e2290..9c731f3924a 100755 --- a/src/csharp/generate_proto_csharp.sh +++ b/src/csharp/generate_proto_csharp.sh @@ -14,7 +14,7 @@ # limitations under the License. # Regenerates gRPC service stubs from proto files. -set +e +set -e cd $(dirname $0)/../.. # protoc and grpc_*_plugin binaries can be obtained by running diff --git a/src/php/bin/generate_proto_php.sh b/src/php/bin/generate_proto_php.sh index 3265c29c857..f09d80e8f85 100755 --- a/src/php/bin/generate_proto_php.sh +++ b/src/php/bin/generate_proto_php.sh @@ -13,7 +13,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -set +e +set -e cd $(dirname $0)/../../.. # protoc and grpc_*_plugin binaries can be obtained by running diff --git a/src/ruby/pb/generate_proto_ruby.sh b/src/ruby/pb/generate_proto_ruby.sh index 01eccba94da..8cbb429259f 100755 --- a/src/ruby/pb/generate_proto_ruby.sh +++ b/src/ruby/pb/generate_proto_ruby.sh @@ -14,7 +14,7 @@ # limitations under the License. # Regenerates gRPC service stubs from proto files. -set +e +set -e cd $(dirname $0)/../../.. # protoc and grpc_*_plugin binaries can be obtained by running From 5156db53db9b9cbaf4547f9a01544c96675c2d77 Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Sat, 18 Apr 2020 18:56:02 +0200 Subject: [PATCH 545/758] revert some generate_proto_php.sh changes, add TODOs --- src/php/bin/generate_proto_php.sh | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/php/bin/generate_proto_php.sh b/src/php/bin/generate_proto_php.sh index f09d80e8f85..0b09b85b415 100755 --- a/src/php/bin/generate_proto_php.sh +++ b/src/php/bin/generate_proto_php.sh @@ -16,20 +16,20 @@ set -e cd $(dirname $0)/../../.. -# protoc and grpc_*_plugin binaries can be obtained by running -# $ bazel build @com_google_protobuf//:protoc //src/compiler:all -PROTOC=bazel-bin/external/com_google_protobuf/protoc -PLUGIN=protoc-gen-grpc=bazel-bin/src/compiler/grpc_php_plugin - -$PROTOC --proto_path=src/proto/math \ +# TODO(jtattermusch): unlike for e.g. ruby and csharp, +# PHP runs the code generator as part of the build, so we cannot +# easily use bazel-built "protoc" and "grpc_php_plugin" binaries. +# TODO(jtattermusch): the generated code for qps tests +# is actually checked into the repository, but for other tests +# (e.g. interop or unit tests) it's not. This should made consistent. +protoc --proto_path=src/proto/math \ --php_out=src/php/tests/generated_code \ --grpc_out=src/php/tests/generated_code \ - --plugin=$PLUGIN \ + --plugin=protoc-gen-grpc=bins/opt/grpc_php_plugin \ src/proto/math/math.proto # replace the Empty message with EmptyMessage # because Empty is a PHP reserved word -# See https://github.com/protocolbuffers/protobuf/issues/2124 output_file=$(mktemp) sed 's/message Empty/message EmptyMessage/g' \ src/proto/grpc/testing/empty.proto > $output_file @@ -38,10 +38,10 @@ sed 's/grpc\.testing\.Empty/grpc\.testing\.EmptyMessage/g' \ src/proto/grpc/testing/test.proto > $output_file mv $output_file ./src/proto/grpc/testing/test.proto -$PROTOC --proto_path=. \ +protoc --proto_path=. \ --php_out=src/php/tests/interop \ --grpc_out=src/php/tests/interop \ - --plugin=$PLUGIN \ + --plugin=protoc-gen-grpc=bins/opt/grpc_php_plugin \ src/proto/grpc/testing/messages.proto \ src/proto/grpc/testing/empty.proto \ src/proto/grpc/testing/test.proto From dd44231a320b564d9b4d2eb2269f7079d723ace1 Mon Sep 17 00:00:00 2001 From: ZhenLian Date: Thu, 16 Apr 2020 16:06:12 -0700 Subject: [PATCH 546/758] [No Review] Test --- test/cpp/util/BUILD | 5 +++ test/cpp/util/test_credentials_provider.cc | 46 +++++++++++++++++----- 2 files changed, 41 insertions(+), 10 deletions(-) diff --git a/test/cpp/util/BUILD b/test/cpp/util/BUILD index 3f6d7db15e0..20460aa03ae 100644 --- a/test/cpp/util/BUILD +++ b/test/cpp/util/BUILD @@ -74,6 +74,11 @@ grpc_cc_library( "create_test_channel.h", "test_credentials_provider.h", ], + data = [ + "//src/core/tsi/test_creds:ca.pem", + "//src/core/tsi/test_creds:server1.key", + "//src/core/tsi/test_creds:server1.pem", + ], external_deps = [ "gflags", "protobuf", diff --git a/test/cpp/util/test_credentials_provider.cc b/test/cpp/util/test_credentials_provider.cc index fd796372c8c..830bccc3614 100644 --- a/test/cpp/util/test_credentials_provider.cc +++ b/test/cpp/util/test_credentials_provider.cc @@ -19,20 +19,24 @@ #include "test/cpp/util/test_credentials_provider.h" +#include +#include +#include +#include + #include #include #include - #include #include -#include -#include -#include -#include - +#include "src/core/lib/iomgr/load_file.h" #include "test/core/end2end/data/ssl_test_data.h" +#define CA_CERT_PATH "src/core/tsi/test_creds/ca.pem" +#define SERVER_CERT_PATH "src/core/tsi/test_creds/server1.pem" +#define SERVER_KEY_PATH "src/core/tsi/test_creds/server1.key" + DEFINE_string(tls_cert_file, "", "The TLS cert file used when --use_tls=true"); DEFINE_string(tls_key_file, "", "The TLS key file used when --use_tls=true"); @@ -90,9 +94,17 @@ class DefaultCredentialsProvider : public CredentialsProvider { grpc::experimental::AltsCredentialsOptions alts_opts; return grpc::experimental::AltsCredentials(alts_opts); } else if (type == grpc::testing::kTlsCredentialsType) { + grpc_slice ca_slice; + GPR_ASSERT(GRPC_LOG_IF_ERROR("load_file", + grpc_load_file(CA_CERT_PATH, 1, &ca_slice))); + const char* test_root_cert = + reinterpret_cast GRPC_SLICE_START_PTR(ca_slice); SslCredentialsOptions ssl_opts = {test_root_cert, "", ""}; args->SetSslTargetNameOverride("foo.test.google.fr"); - return grpc::SslCredentials(ssl_opts); + std::shared_ptr credential_ptr = + grpc::SslCredentials(grpc::SslCredentialsOptions(ssl_opts)); + grpc_slice_unref(ca_slice); + return credential_ptr; } else if (type == grpc::testing::kGoogleDefaultCredentialsType) { return grpc::GoogleDefaultCredentials(); } else { @@ -122,12 +134,26 @@ class DefaultCredentialsProvider : public CredentialsProvider { SslServerCredentialsOptions::PemKeyCertPair pkcp = { custom_server_key_, custom_server_cert_}; ssl_opts.pem_key_cert_pairs.push_back(pkcp); + return SslServerCredentials(ssl_opts); } else { - SslServerCredentialsOptions::PemKeyCertPair pkcp = {test_server1_key, - test_server1_cert}; + grpc_slice cert_slice, key_slice; + GPR_ASSERT(GRPC_LOG_IF_ERROR( + "load_file", grpc_load_file(SERVER_CERT_PATH, 1, &cert_slice))); + GPR_ASSERT(GRPC_LOG_IF_ERROR( + "load_file", grpc_load_file(SERVER_KEY_PATH, 1, &key_slice))); + const char* server_cert = + reinterpret_cast GRPC_SLICE_START_PTR(cert_slice); + const char* server_key = + reinterpret_cast GRPC_SLICE_START_PTR(key_slice); + SslServerCredentialsOptions::PemKeyCertPair pkcp = {server_key, + server_cert}; ssl_opts.pem_key_cert_pairs.push_back(pkcp); + std::shared_ptr credential_ptr = + SslServerCredentials(ssl_opts); + grpc_slice_unref(cert_slice); + grpc_slice_unref(key_slice); + return credential_ptr; } - return SslServerCredentials(ssl_opts); } else { std::unique_lock lock(mu_); auto it(std::find(added_secure_type_names_.begin(), From 2aea5c002ba5c5dc1ce707c5695183f1937b5ddb Mon Sep 17 00:00:00 2001 From: Pau Freixes Date: Mon, 20 Apr 2020 15:38:40 +0200 Subject: [PATCH 547/758] [Aio] Implement the Unary Stream client interceptor Add support for adding intercetpors for the Unary Stream arity at client level. --- .../grpcio/grpc/experimental/aio/__init__.py | 3 +- .../grpcio/grpc/experimental/aio/_call.py | 3 + .../grpcio/grpc/experimental/aio/_channel.py | 73 ++-- .../grpc/experimental/aio/_interceptor.py | 382 +++++++++++++---- .../health_check/health_servicer_test.py | 38 +- src/python/grpcio_tests/tests_aio/tests.json | 5 +- .../grpcio_tests/tests_aio/unit/call_test.py | 24 +- .../client_unary_stream_interceptor_test.py | 404 ++++++++++++++++++ ...=> client_unary_unary_interceptor_test.py} | 0 9 files changed, 809 insertions(+), 123 deletions(-) create mode 100644 src/python/grpcio_tests/tests_aio/unit/client_unary_stream_interceptor_test.py rename src/python/grpcio_tests/tests_aio/unit/{client_interceptor_test.py => client_unary_unary_interceptor_test.py} (100%) diff --git a/src/python/grpcio/grpc/experimental/aio/__init__.py b/src/python/grpcio/grpc/experimental/aio/__init__.py index 634795e7cc3..649d29588d4 100644 --- a/src/python/grpcio/grpc/experimental/aio/__init__.py +++ b/src/python/grpcio/grpc/experimental/aio/__init__.py @@ -31,7 +31,8 @@ from ._base_channel import (Channel, StreamStreamMultiCallable, UnaryUnaryMultiCallable) from ._call import AioRpcError from ._interceptor import (ClientCallDetails, InterceptedUnaryUnaryCall, - UnaryUnaryClientInterceptor, ServerInterceptor) + UnaryUnaryClientInterceptor, + UnaryStreamClientInterceptor, ServerInterceptor) from ._server import server from ._base_server import Server, ServicerContext from ._typing import ChannelArgumentType diff --git a/src/python/grpcio/grpc/experimental/aio/_call.py b/src/python/grpcio/grpc/experimental/aio/_call.py index 3d1d19fd3fa..00778184658 100644 --- a/src/python/grpcio/grpc/experimental/aio/_call.py +++ b/src/python/grpcio/grpc/experimental/aio/_call.py @@ -318,6 +318,9 @@ class _StreamResponseMixin(Call): yield message message = await self._read() + # If the read operation failed, Core should explain why. + await self._raise_for_status() + def __aiter__(self) -> AsyncIterable[ResponseType]: self._update_response_style(_APIStyle.ASYNC_GENERATOR) if self._message_aiter is None: diff --git a/src/python/grpcio/grpc/experimental/aio/_channel.py b/src/python/grpcio/grpc/experimental/aio/_channel.py index 5e669e1a3f5..03d8aa075e0 100644 --- a/src/python/grpcio/grpc/experimental/aio/_channel.py +++ b/src/python/grpcio/grpc/experimental/aio/_channel.py @@ -25,7 +25,9 @@ from . import _base_call, _base_channel from ._call import (StreamStreamCall, StreamUnaryCall, UnaryStreamCall, UnaryUnaryCall) from ._interceptor import (InterceptedUnaryUnaryCall, - UnaryUnaryClientInterceptor) + InterceptedUnaryStreamCall, ClientInterceptor, + UnaryUnaryClientInterceptor, + UnaryStreamClientInterceptor) from ._typing import (ChannelArgumentType, DeserializingFunction, MetadataType, SerializingFunction, RequestIterableType) from ._utils import _timeout_to_deadline @@ -65,7 +67,7 @@ class _BaseMultiCallable: _method: bytes _request_serializer: SerializingFunction _response_deserializer: DeserializingFunction - _interceptors: Optional[Sequence[UnaryUnaryClientInterceptor]] + _interceptors: Sequence[ClientInterceptor] _loop: asyncio.AbstractEventLoop # pylint: disable=too-many-arguments @@ -75,7 +77,7 @@ class _BaseMultiCallable: method: bytes, request_serializer: SerializingFunction, response_deserializer: DeserializingFunction, - interceptors: Optional[Sequence[UnaryUnaryClientInterceptor]], + interceptors: Sequence[ClientInterceptor], loop: asyncio.AbstractEventLoop, ) -> None: self._loop = loop @@ -134,10 +136,17 @@ class UnaryStreamMultiCallable(_BaseMultiCallable, deadline = _timeout_to_deadline(timeout) - call = UnaryStreamCall(request, deadline, metadata, credentials, - wait_for_ready, self._channel, self._method, - self._request_serializer, - self._response_deserializer, self._loop) + if not self._interceptors: + call = UnaryStreamCall(request, deadline, metadata, credentials, + wait_for_ready, self._channel, self._method, + self._request_serializer, + self._response_deserializer, self._loop) + else: + call = InterceptedUnaryStreamCall( + self._interceptors, request, deadline, metadata, credentials, + wait_for_ready, self._channel, self._method, + self._request_serializer, self._response_deserializer, + self._loop) return call @@ -193,12 +202,13 @@ class StreamStreamMultiCallable(_BaseMultiCallable, class Channel(_base_channel.Channel): _loop: asyncio.AbstractEventLoop _channel: cygrpc.AioChannel - _unary_unary_interceptors: Optional[Sequence[UnaryUnaryClientInterceptor]] + _unary_unary_interceptors: Sequence[UnaryUnaryClientInterceptor] + _unary_stream_interceptors: Sequence[UnaryStreamClientInterceptor] def __init__(self, target: str, options: ChannelArgumentType, credentials: Optional[grpc.ChannelCredentials], compression: Optional[grpc.Compression], - interceptors: Optional[Sequence[UnaryUnaryClientInterceptor]]): + interceptors: Optional[Sequence[ClientInterceptor]]): """Constructor. Args: @@ -210,22 +220,32 @@ class Channel(_base_channel.Channel): interceptors: An optional list of interceptors that would be used for intercepting any RPC executed with that channel. """ - if interceptors is None: - self._unary_unary_interceptors = None - else: - self._unary_unary_interceptors = list( - filter( - lambda interceptor: isinstance(interceptor, - UnaryUnaryClientInterceptor), - interceptors)) + self._unary_unary_interceptors = [] + self._unary_stream_interceptors = [] + + if interceptors: + attrs_and_interceptor_classes = [ + (self._unary_unary_interceptors, UnaryUnaryClientInterceptor), + (self._unary_stream_interceptors, UnaryStreamClientInterceptor) + ] + + # pylint: disable=cell-var-from-loop + for attr, interceptor_class in attrs_and_interceptor_classes: + attr.extend( + list( + filter( + lambda interceptor: isinstance( + interceptor, interceptor_class), interceptors))) invalid_interceptors = set(interceptors) - set( - self._unary_unary_interceptors) + self._unary_unary_interceptors) - set( + self._unary_stream_interceptors) if invalid_interceptors: raise ValueError( "Interceptor must be "+\ - "UnaryUnaryClientInterceptors, the following are invalid: {}"\ + "UnaryUnaryClientInterceptors or "+\ + "UnaryStreamClientInterceptors the following are invalid: {}"\ .format(invalid_interceptors)) self._loop = asyncio.get_event_loop() @@ -352,7 +372,9 @@ class Channel(_base_channel.Channel): ) -> UnaryStreamMultiCallable: return UnaryStreamMultiCallable(self._channel, _common.encode(method), request_serializer, - response_deserializer, None, self._loop) + response_deserializer, + self._unary_stream_interceptors, + self._loop) def stream_unary( self, @@ -399,12 +421,11 @@ def insecure_channel( compression, interceptors) -def secure_channel( - target: str, - credentials: grpc.ChannelCredentials, - options: Optional[ChannelArgumentType] = None, - compression: Optional[grpc.Compression] = None, - interceptors: Optional[Sequence[UnaryUnaryClientInterceptor]] = None): +def secure_channel(target: str, + credentials: grpc.ChannelCredentials, + options: Optional[ChannelArgumentType] = None, + compression: Optional[grpc.Compression] = None, + interceptors: Optional[Sequence[ClientInterceptor]] = None): """Creates a secure asynchronous Channel to a server. Args: diff --git a/src/python/grpcio/grpc/experimental/aio/_interceptor.py b/src/python/grpcio/grpc/experimental/aio/_interceptor.py index d4aca3ae0fc..3ce0ddd904d 100644 --- a/src/python/grpcio/grpc/experimental/aio/_interceptor.py +++ b/src/python/grpcio/grpc/experimental/aio/_interceptor.py @@ -16,13 +16,13 @@ import asyncio import collections import functools from abc import ABCMeta, abstractmethod -from typing import Callable, Optional, Iterator, Sequence, Union, Awaitable +from typing import Callable, Optional, Iterator, Sequence, Union, Awaitable, AsyncIterable import grpc from grpc._cython import cygrpc from . import _base_call -from ._call import UnaryUnaryCall, AioRpcError +from ._call import UnaryUnaryCall, UnaryStreamCall, AioRpcError from ._utils import _timeout_to_deadline from ._typing import (RequestType, SerializingFunction, DeserializingFunction, MetadataType, ResponseType, DoneCallbackType) @@ -84,7 +84,11 @@ class ClientCallDetails( wait_for_ready: Optional[bool] -class UnaryUnaryClientInterceptor(metaclass=ABCMeta): +class ClientInterceptor(metaclass=ABCMeta): + """Base class used for all Aio Client Interceptor classes""" + + +class UnaryUnaryClientInterceptor(ClientInterceptor, metaclass=ABCMeta): """Affords intercepting unary-unary invocations.""" @abstractmethod @@ -101,8 +105,8 @@ class UnaryUnaryClientInterceptor(metaclass=ABCMeta): actual RPC on the underlying Channel. It is the interceptor's responsibility to call it if it decides to move the RPC forward. The interceptor can use - `response_future = await continuation(client_call_details, request)` - to continue with the RPC. `continuation` returns the response of the + `call = await continuation(client_call_details, request)` + to continue with the RPC. `continuation` returns the call to the RPC. client_call_details: A ClientCallDetails object describing the outgoing RPC. @@ -117,8 +121,40 @@ class UnaryUnaryClientInterceptor(metaclass=ABCMeta): """ -class InterceptedUnaryUnaryCall(_base_call.UnaryUnaryCall): - """Used for running a `UnaryUnaryCall` wrapped by interceptors. +class UnaryStreamClientInterceptor(ClientInterceptor, metaclass=ABCMeta): + """Affords intercepting unary-stream invocations.""" + + @abstractmethod + async def intercept_unary_stream(self, continuation: Callable[[ + ClientCallDetails, RequestType, AsyncIterable[ResponseType] + ], UnaryStreamCall], client_call_details: ClientCallDetails, + request: RequestType) -> UnaryStreamCall: + """Intercepts a unary-stream invocation asynchronously. + + Args: + continuation: A coroutine that proceeds with the invocation by + executing the next interceptor in chain or invoking the + actual RPC on the underlying Channel. It is the interceptor's + responsibility to call it if it decides to move the RPC forward. + The interceptor can use + `call = await continuation(client_call_details, request, response_iterator))` + to continue with the RPC. `continuation` returns the call to the + RPC. + client_call_details: A ClientCallDetails object describing the + outgoing RPC. + request: The request value for the RPC. + + Returns: + The RPC Call. + + Raises: + AioRpcError: Indicating that the RPC terminated with non-OK status. + asyncio.CancelledError: Indicating that the RPC was canceled. + """ + + +class InterceptedCall: + """Base implementation for all intecepted call arities. Interceptors might have some work to do before the RPC invocation with the capacity of changing the invocation parameters, and some work to do @@ -133,103 +169,67 @@ class InterceptedUnaryUnaryCall(_base_call.UnaryUnaryCall): intercepted call, being at the same time the same call returned to the interceptors. - For most of the methods, like `initial_metadata()` the caller does not need - to wait until the interceptors task is finished, once the RPC is done the - caller will have the freedom for accessing to the results. - - For the `__await__` method is it is proxied to the intercepted call only when - the interceptor task is finished. + As a base class for all of the interceptors implements the logic around + final status, metadata and cancellation. """ - _loop: asyncio.AbstractEventLoop - _channel: cygrpc.AioChannel - _cancelled_before_rpc: bool - _intercepted_call: Optional[_base_call.UnaryUnaryCall] - _intercepted_call_created: asyncio.Event _interceptors_task: asyncio.Task _pending_add_done_callbacks: Sequence[DoneCallbackType] - # pylint: disable=too-many-arguments - def __init__(self, interceptors: Sequence[UnaryUnaryClientInterceptor], - request: RequestType, timeout: Optional[float], - metadata: MetadataType, - credentials: Optional[grpc.CallCredentials], - wait_for_ready: Optional[bool], channel: cygrpc.AioChannel, - method: bytes, request_serializer: SerializingFunction, - response_deserializer: DeserializingFunction, - loop: asyncio.AbstractEventLoop) -> None: - self._channel = channel - self._loop = loop - self._interceptors_task = loop.create_task( - self._invoke(interceptors, method, timeout, metadata, credentials, - wait_for_ready, request, request_serializer, - response_deserializer)) + def __init__(self, interceptors_task: asyncio.Task) -> None: + self._interceptors_task = interceptors_task self._pending_add_done_callbacks = [] self._interceptors_task.add_done_callback( - self._fire_pending_add_done_callbacks) + self._fire_or_add_pending_add_done_callbacks) def __del__(self): self.cancel() - # pylint: disable=too-many-arguments - async def _invoke(self, interceptors: Sequence[UnaryUnaryClientInterceptor], - method: bytes, timeout: Optional[float], - metadata: Optional[MetadataType], - credentials: Optional[grpc.CallCredentials], - wait_for_ready: Optional[bool], request: RequestType, - request_serializer: SerializingFunction, - response_deserializer: DeserializingFunction - ) -> UnaryUnaryCall: - """Run the RPC call wrapped in interceptors""" - - async def _run_interceptor( - interceptors: Iterator[UnaryUnaryClientInterceptor], - client_call_details: ClientCallDetails, - request: RequestType) -> _base_call.UnaryUnaryCall: - - interceptor = next(interceptors, None) - - if interceptor: - continuation = functools.partial(_run_interceptor, interceptors) + def _fire_or_add_pending_add_done_callbacks(self, + interceptors_task: asyncio.Task + ) -> None: - call_or_response = await interceptor.intercept_unary_unary( - continuation, client_call_details, request) - - if isinstance(call_or_response, _base_call.UnaryUnaryCall): - return call_or_response - else: - return UnaryUnaryCallResponse(call_or_response) + if not self._pending_add_done_callbacks: + return - else: - return UnaryUnaryCall( - request, _timeout_to_deadline(client_call_details.timeout), - client_call_details.metadata, - client_call_details.credentials, - client_call_details.wait_for_ready, self._channel, - client_call_details.method, request_serializer, - response_deserializer, self._loop) + fire = False - client_call_details = ClientCallDetails(method, timeout, metadata, - credentials, wait_for_ready) - return await _run_interceptor(iter(interceptors), client_call_details, - request) + try: + call = interceptors_task.result() + if call.done(): + fire = True + except (AioRpcError, asyncio.CancelledError): + fire = True - def _fire_pending_add_done_callbacks(self, - unused_task: asyncio.Task) -> None: for callback in self._pending_add_done_callbacks: - callback(self) + if fire: + callback(self) + else: + callback = functools.partial(self._wrap_add_done_callback, + callback) + call.add_done_callback(callback) self._pending_add_done_callbacks = [] def _wrap_add_done_callback(self, callback: DoneCallbackType, - unused_task: asyncio.Task) -> None: + unused_call: _base_call.Call) -> None: callback(self) def cancel(self) -> bool: - if self._interceptors_task.done(): + if not self._interceptors_task.done(): + # There is no yet the intercepted call available, + # Trying to cancel it by using the generic Asyncio + # cancellation method. + return self._interceptors_task.cancel() + + try: + call = self._interceptors_task.result() + except AioRpcError: + return False + except asyncio.CancelledError: return False - return self._interceptors_task.cancel() + return call.cancel() def cancelled(self) -> bool: if not self._interceptors_task.done(): @@ -270,7 +270,7 @@ class InterceptedUnaryUnaryCall(_base_call.UnaryUnaryCall): callback(self) else: callback = functools.partial(self._wrap_add_done_callback, callback) - call.add_done_callback(self._wrap_add_done_callback) + call.add_done_callback(callback) def time_remaining(self) -> Optional[float]: raise NotImplementedError() @@ -325,14 +325,182 @@ class InterceptedUnaryUnaryCall(_base_call.UnaryUnaryCall): return await call.debug_error_string() + async def wait_for_connection(self) -> None: + call = await self._interceptors_task + return await call.wait_for_connection() + + +class InterceptedUnaryUnaryCall(InterceptedCall, _base_call.UnaryUnaryCall): + """Used for running a `UnaryUnaryCall` wrapped by interceptors. + + For the `__await__` method is it is proxied to the intercepted call only when + the interceptor task is finished. + """ + + _loop: asyncio.AbstractEventLoop + _channel: cygrpc.AioChannel + + # pylint: disable=too-many-arguments + def __init__(self, interceptors: Sequence[UnaryUnaryClientInterceptor], + request: RequestType, timeout: Optional[float], + metadata: MetadataType, + credentials: Optional[grpc.CallCredentials], + wait_for_ready: Optional[bool], channel: cygrpc.AioChannel, + method: bytes, request_serializer: SerializingFunction, + response_deserializer: DeserializingFunction, + loop: asyncio.AbstractEventLoop) -> None: + self._loop = loop + self._channel = channel + interceptors_task = loop.create_task( + self._invoke(interceptors, method, timeout, metadata, credentials, + wait_for_ready, request, request_serializer, + response_deserializer)) + super().__init__(interceptors_task) + + # pylint: disable=too-many-arguments + async def _invoke(self, interceptors: Sequence[UnaryUnaryClientInterceptor], + method: bytes, timeout: Optional[float], + metadata: Optional[MetadataType], + credentials: Optional[grpc.CallCredentials], + wait_for_ready: Optional[bool], request: RequestType, + request_serializer: SerializingFunction, + response_deserializer: DeserializingFunction + ) -> UnaryUnaryCall: + """Run the RPC call wrapped in interceptors""" + + async def _run_interceptor( + interceptors: Iterator[UnaryUnaryClientInterceptor], + client_call_details: ClientCallDetails, + request: RequestType) -> _base_call.UnaryUnaryCall: + + interceptor = next(interceptors, None) + + if interceptor: + continuation = functools.partial(_run_interceptor, interceptors) + + call_or_response = await interceptor.intercept_unary_unary( + continuation, client_call_details, request) + + if isinstance(call_or_response, _base_call.UnaryUnaryCall): + return call_or_response + else: + return UnaryUnaryCallResponse(call_or_response) + + else: + return UnaryUnaryCall( + request, _timeout_to_deadline(client_call_details.timeout), + client_call_details.metadata, + client_call_details.credentials, + client_call_details.wait_for_ready, self._channel, + client_call_details.method, request_serializer, + response_deserializer, self._loop) + + client_call_details = ClientCallDetails(method, timeout, metadata, + credentials, wait_for_ready) + return await _run_interceptor(iter(interceptors), client_call_details, + request) + def __await__(self): call = yield from self._interceptors_task.__await__() response = yield from call.__await__() return response - async def wait_for_connection(self) -> None: + def time_remaining(self) -> Optional[float]: + raise NotImplementedError() + + +class InterceptedUnaryStreamCall(InterceptedCall, _base_call.UnaryStreamCall): + """Used for running a `UnaryStreamCall` wrapped by interceptors.""" + + _loop: asyncio.AbstractEventLoop + _channel: cygrpc.AioChannel + _response_aiter: AsyncIterable[ResponseType] + + # pylint: disable=too-many-arguments + def __init__(self, interceptors: Sequence[UnaryStreamClientInterceptor], + request: RequestType, timeout: Optional[float], + metadata: MetadataType, + credentials: Optional[grpc.CallCredentials], + wait_for_ready: Optional[bool], channel: cygrpc.AioChannel, + method: bytes, request_serializer: SerializingFunction, + response_deserializer: DeserializingFunction, + loop: asyncio.AbstractEventLoop) -> None: + self._loop = loop + self._channel = channel + self._response_aiter = self._wait_for_interceptor_task_response_iterator( + ) + interceptors_task = loop.create_task( + self._invoke(interceptors, method, timeout, metadata, credentials, + wait_for_ready, request, request_serializer, + response_deserializer)) + super().__init__(interceptors_task) + + # pylint: disable=too-many-arguments + async def _invoke(self, interceptors: Sequence[UnaryUnaryClientInterceptor], + method: bytes, timeout: Optional[float], + metadata: Optional[MetadataType], + credentials: Optional[grpc.CallCredentials], + wait_for_ready: Optional[bool], request: RequestType, + request_serializer: SerializingFunction, + response_deserializer: DeserializingFunction + ) -> UnaryStreamCall: + """Run the RPC call wrapped in interceptors""" + + last_returned_call_from_interceptors = [None] + + async def _run_interceptor( + interceptors: Iterator[UnaryStreamClientInterceptor], + client_call_details: ClientCallDetails, + request: RequestType, + ) -> _base_call.UnaryUnaryCall: + + interceptor = next(interceptors, None) + + if interceptor: + continuation = functools.partial(_run_interceptor, interceptors) + + call_or_response_iterator = await interceptor.intercept_unary_stream( + continuation, client_call_details, request) + + if call_or_response_iterator is last_returned_call_from_interceptors[ + 0]: + return call_or_response_iterator + else: + last_returned_call_from_interceptors[ + 0] = UnaryStreamCallResponseIterator( + last_returned_call_from_interceptors[0], + call_or_response_iterator) + return last_returned_call_from_interceptors[0] + else: + last_returned_call_from_interceptors[0] = UnaryStreamCall( + request, _timeout_to_deadline(client_call_details.timeout), + client_call_details.metadata, + client_call_details.credentials, + client_call_details.wait_for_ready, self._channel, + client_call_details.method, request_serializer, + response_deserializer, self._loop) + + return last_returned_call_from_interceptors[0] + + client_call_details = ClientCallDetails(method, timeout, metadata, + credentials, wait_for_ready) + return await _run_interceptor(iter(interceptors), client_call_details, + request) + + async def _wait_for_interceptor_task_response_iterator(self + ) -> ResponseType: call = await self._interceptors_task - return await call.wait_for_connection() + async for response in call: + yield response + + def __aiter__(self) -> AsyncIterable[ResponseType]: + return self._response_aiter + + async def read(self) -> ResponseType: + return await self._response_aiter.asend(None) + + def time_remaining(self) -> Optional[float]: + raise NotImplementedError() class UnaryUnaryCallResponse(_base_call.UnaryUnaryCall): @@ -381,3 +549,53 @@ class UnaryUnaryCallResponse(_base_call.UnaryUnaryCall): async def wait_for_connection(self) -> None: pass + + +class UnaryStreamCallResponseIterator(_base_call.UnaryStreamCall): + """UnaryStreamCall class wich uses an alternative response iterator.""" + _call: _base_call.UnaryStreamCall + _response_iterator: AsyncIterable[ResponseType] + + def __init__(self, call: _base_call.UnaryStreamCall, + response_iterator: AsyncIterable[ResponseType]) -> None: + self._response_iterator = response_iterator + self._call = call + + def cancel(self) -> bool: + return self._call.cancel() + + def cancelled(self) -> bool: + return self._call.cancelled() + + def done(self) -> bool: + return self._call.done() + + def add_done_callback(self, callback) -> None: + self._call.add_done_callback(callback) + + def time_remaining(self) -> Optional[float]: + return self._call.time_remaining() + + async def initial_metadata(self) -> Optional[MetadataType]: + return await self._call.initial_metadata() + + async def trailing_metadata(self) -> Optional[MetadataType]: + return await self._call.trailing_metadata() + + async def code(self) -> grpc.StatusCode: + return await self._call.code() + + async def details(self) -> str: + return await self._call.details() + + async def debug_error_string(self) -> Optional[str]: + return await self._call.debug_error_string() + + def __aiter__(self): + return self._response_iterator.__aiter__() + + async def wait_for_connection(self) -> None: + return await self._call.wait_for_connection() + + async def read(self) -> ResponseType: + return await self._call.read() diff --git a/src/python/grpcio_tests/tests_aio/health_check/health_servicer_test.py b/src/python/grpcio_tests/tests_aio/health_check/health_servicer_test.py index ac6c84b2f54..a539dbf1409 100644 --- a/src/python/grpcio_tests/tests_aio/health_check/health_servicer_test.py +++ b/src/python/grpcio_tests/tests_aio/health_check/health_servicer_test.py @@ -108,7 +108,10 @@ class HealthServicerTest(AioTestBase): (await queue.get()).status) call.cancel() - await task + + with self.assertRaises(asyncio.CancelledError): + await task + self.assertTrue(queue.empty()) async def test_watch_new_service(self): @@ -131,7 +134,10 @@ class HealthServicerTest(AioTestBase): (await queue.get()).status) call.cancel() - await task + + with self.assertRaises(asyncio.CancelledError): + await task + self.assertTrue(queue.empty()) async def test_watch_service_isolation(self): @@ -151,7 +157,10 @@ class HealthServicerTest(AioTestBase): await asyncio.wait_for(queue.get(), test_constants.SHORT_TIMEOUT) call.cancel() - await task + + with self.assertRaises(asyncio.CancelledError): + await task + self.assertTrue(queue.empty()) async def test_two_watchers(self): @@ -177,8 +186,13 @@ class HealthServicerTest(AioTestBase): call1.cancel() call2.cancel() - await task1 - await task2 + + with self.assertRaises(asyncio.CancelledError): + await task1 + + with self.assertRaises(asyncio.CancelledError): + await task2 + self.assertTrue(queue1.empty()) self.assertTrue(queue2.empty()) @@ -194,7 +208,9 @@ class HealthServicerTest(AioTestBase): call.cancel() await self._servicer.set(_WATCH_SERVICE, health_pb2.HealthCheckResponse.SERVING) - await task + + with self.assertRaises(asyncio.CancelledError): + await task # Wait for the serving coroutine to process client cancellation. timeout = time.monotonic() + test_constants.TIME_ALLOWANCE @@ -226,7 +242,10 @@ class HealthServicerTest(AioTestBase): resp.status) call.cancel() - await task + + with self.assertRaises(asyncio.CancelledError): + await task + self.assertTrue(queue.empty()) async def test_no_duplicate_status(self): @@ -251,7 +270,10 @@ class HealthServicerTest(AioTestBase): last_status = status call.cancel() - await task + + with self.assertRaises(asyncio.CancelledError): + await task + self.assertTrue(queue.empty()) diff --git a/src/python/grpcio_tests/tests_aio/tests.json b/src/python/grpcio_tests/tests_aio/tests.json index 71f8733f5f9..0bdd1f72e50 100644 --- a/src/python/grpcio_tests/tests_aio/tests.json +++ b/src/python/grpcio_tests/tests_aio/tests.json @@ -13,8 +13,9 @@ "unit.channel_argument_test.TestChannelArgument", "unit.channel_ready_test.TestChannelReady", "unit.channel_test.TestChannel", - "unit.client_interceptor_test.TestInterceptedUnaryUnaryCall", - "unit.client_interceptor_test.TestUnaryUnaryClientInterceptor", + "unit.client_unary_stream_interceptor_test.TestUnaryStreamClientInterceptor", + "unit.client_unary_unary_interceptor_test.TestInterceptedUnaryUnaryCall", + "unit.client_unary_unary_interceptor_test.TestUnaryUnaryClientInterceptor", "unit.close_channel_test.TestCloseChannel", "unit.compatibility_test.TestCompatibility", "unit.compression_test.TestCompression", diff --git a/src/python/grpcio_tests/tests_aio/unit/call_test.py b/src/python/grpcio_tests/tests_aio/unit/call_test.py index 2548e777783..2dc5e806115 100644 --- a/src/python/grpcio_tests/tests_aio/unit/call_test.py +++ b/src/python/grpcio_tests/tests_aio/unit/call_test.py @@ -217,6 +217,22 @@ class TestUnaryUnaryCall(_MulticallableTestMixin, AioTestBase): class TestUnaryStreamCall(_MulticallableTestMixin, AioTestBase): + async def test_call_rpc_error(self): + async with aio.insecure_channel(UNREACHABLE_TARGET) as channel: + request = messages_pb2.StreamingOutputCallRequest() + stub = test_pb2_grpc.TestServiceStub(channel) + call = stub.StreamingOutputCall(request) + + with self.assertRaises(aio.AioRpcError) as exception_context: + async for response in call: + pass + + self.assertEqual(grpc.StatusCode.UNAVAILABLE, + exception_context.exception.code()) + + self.assertTrue(call.done()) + self.assertEqual(grpc.StatusCode.UNAVAILABLE, await call.code()) + async def test_cancel_unary_stream(self): # Prepares the request request = messages_pb2.StreamingOutputCallRequest() @@ -550,7 +566,6 @@ class TestStreamUnaryCall(_MulticallableTestMixin, AioTestBase): cancel_later_task = self.loop.create_task(cancel_later()) - # No exceptions here with self.assertRaises(asyncio.CancelledError): await call @@ -772,9 +787,10 @@ class TestStreamStreamCall(_MulticallableTestMixin, AioTestBase): cancel_later_task = self.loop.create_task(cancel_later()) - # No exceptions here - async for response in call: - self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) + with self.assertRaises(asyncio.CancelledError): + async for response in call: + self.assertEqual(_RESPONSE_PAYLOAD_SIZE, + len(response.payload.body)) await request_iterator_received_the_exception.wait() diff --git a/src/python/grpcio_tests/tests_aio/unit/client_unary_stream_interceptor_test.py b/src/python/grpcio_tests/tests_aio/unit/client_unary_stream_interceptor_test.py new file mode 100644 index 00000000000..3de4d054469 --- /dev/null +++ b/src/python/grpcio_tests/tests_aio/unit/client_unary_stream_interceptor_test.py @@ -0,0 +1,404 @@ +# Copyright 2019 The gRPC Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import asyncio +import logging +import unittest +import datetime + +import grpc + +from grpc.experimental import aio +from tests_aio.unit._constants import UNREACHABLE_TARGET +from tests_aio.unit._test_server import start_test_server +from tests_aio.unit._test_base import AioTestBase +from tests.unit.framework.common import test_constants +from src.proto.grpc.testing import messages_pb2, test_pb2_grpc + +_SHORT_TIMEOUT_S = datetime.timedelta(seconds=1).total_seconds() + +_LOCAL_CANCEL_DETAILS_EXPECTATION = 'Locally cancelled by application!' +_NUM_STREAM_RESPONSES = 5 +_REQUEST_PAYLOAD_SIZE = 7 +_RESPONSE_PAYLOAD_SIZE = 7 +_RESPONSE_INTERVAL_US = int(_SHORT_TIMEOUT_S * 1000 * 1000) + + +class _ResponseIterator: + + def __init__(self, response_iterator): + self._response_cnt = 0 + self._response_iterator = response_iterator + + async def _forward_responses(self): + async for response in self._response_iterator: + self._response_cnt += 1 + yield response + + def __aiter__(self): + return self._forward_responses() + + @property + def response_cnt(self): + return self._response_cnt + + +def _inject_callbacks(call): + first_callback_ran = asyncio.Event() + + def first_callback(call): + # Validate that all resopnses have been received + # and the call is an end state. + assert call.done() + first_callback_ran.set() + + second_callback_ran = asyncio.Event() + + def second_callback(call): + # Validate that all resopnses have been received + # and the call is an end state. + assert call.done() + second_callback_ran.set() + + call.add_done_callback(first_callback) + call.add_done_callback(second_callback) + + async def validation(): + await asyncio.wait_for( + asyncio.gather(first_callback_ran.wait(), + second_callback_ran.wait()), + test_constants.SHORT_TIMEOUT) + + return validation() + + +class _UnaryStreamInterceptorEmpty(aio.UnaryStreamClientInterceptor): + + async def intercept_unary_stream(self, continuation, client_call_details, + request): + return await continuation(client_call_details, request) + + +class _UnaryStreamInterceptorWith_ResponseIterator( + aio.UnaryStreamClientInterceptor): + + def __init__(self): + self.response_iterator = None + + async def intercept_unary_stream(self, continuation, client_call_details, + request): + call = await continuation(client_call_details, request) + self.response_iterator = _ResponseIterator(call) + return self.response_iterator + + +class TestUnaryStreamClientInterceptor(AioTestBase): + + async def setUp(self): + self._server_target, self._server = await start_test_server() + + async def tearDown(self): + await self._server.stop(None) + + async def test_intercepts(self): + for interceptor_class in (_UnaryStreamInterceptorEmpty, + _UnaryStreamInterceptorWith_ResponseIterator): + + with self.subTest(name=interceptor_class): + interceptor = interceptor_class() + + request = messages_pb2.StreamingOutputCallRequest() + for _ in range(_NUM_STREAM_RESPONSES): + request.response_parameters.append( + messages_pb2.ResponseParameters( + size=_RESPONSE_PAYLOAD_SIZE)) + + channel = aio.insecure_channel(self._server_target, + interceptors=[interceptor]) + stub = test_pb2_grpc.TestServiceStub(channel) + call = stub.StreamingOutputCall(request) + + await call.wait_for_connection() + + response_cnt = 0 + async for response in call: + response_cnt += 1 + self.assertIs(type(response), + messages_pb2.StreamingOutputCallResponse) + self.assertEqual(_RESPONSE_PAYLOAD_SIZE, + len(response.payload.body)) + + self.assertTrue(response_cnt, _NUM_STREAM_RESPONSES) + self.assertEqual(await call.code(), grpc.StatusCode.OK) + self.assertEqual(await call.initial_metadata(), ()) + self.assertEqual(await call.trailing_metadata(), ()) + self.assertEqual(await call.details(), '') + self.assertEqual(await call.debug_error_string(), '') + self.assertEqual(call.cancel(), False) + self.assertEqual(call.cancelled(), False) + self.assertEqual(call.done(), True) + + if interceptor_class == _UnaryStreamInterceptorWith_ResponseIterator: + self.assertTrue(interceptor.response_iterator.response_cnt, + _NUM_STREAM_RESPONSES) + + await channel.close() + + async def test_add_done_callback(self): + for interceptor_class in (_UnaryStreamInterceptorEmpty, + _UnaryStreamInterceptorWith_ResponseIterator): + + with self.subTest(name=interceptor_class): + interceptor = interceptor_class() + + request = messages_pb2.StreamingOutputCallRequest() + for _ in range(_NUM_STREAM_RESPONSES): + request.response_parameters.append( + messages_pb2.ResponseParameters( + size=_RESPONSE_PAYLOAD_SIZE)) + + channel = aio.insecure_channel(self._server_target, + interceptors=[interceptor]) + stub = test_pb2_grpc.TestServiceStub(channel) + call = stub.StreamingOutputCall(request) + + validation = _inject_callbacks(call) + + async for response in call: + pass + + await validation + + await channel.close() + + async def test_add_done_callback_after_connection(self): + for interceptor_class in (_UnaryStreamInterceptorEmpty, + _UnaryStreamInterceptorWith_ResponseIterator): + + with self.subTest(name=interceptor_class): + interceptor = interceptor_class() + + request = messages_pb2.StreamingOutputCallRequest() + for _ in range(_NUM_STREAM_RESPONSES): + request.response_parameters.append( + messages_pb2.ResponseParameters( + size=_RESPONSE_PAYLOAD_SIZE)) + + channel = aio.insecure_channel(self._server_target, + interceptors=[interceptor]) + stub = test_pb2_grpc.TestServiceStub(channel) + call = stub.StreamingOutputCall(request) + + # This ensures that the callbacks will be registered + # with the intercepted call rather than saving in the + # pending state list. + await call.wait_for_connection() + + validation = _inject_callbacks(call) + + async for response in call: + pass + + await validation + + await channel.close() + + async def test_response_iterator_using_read(self): + interceptor = _UnaryStreamInterceptorWith_ResponseIterator() + + channel = aio.insecure_channel(self._server_target, + interceptors=[interceptor]) + stub = test_pb2_grpc.TestServiceStub(channel) + + request = messages_pb2.StreamingOutputCallRequest() + for _ in range(_NUM_STREAM_RESPONSES): + request.response_parameters.append( + messages_pb2.ResponseParameters(size=_RESPONSE_PAYLOAD_SIZE)) + + call = stub.StreamingOutputCall(request) + + response_cnt = 0 + for response in range(_NUM_STREAM_RESPONSES): + response = await call.read() + response_cnt += 1 + self.assertIs(type(response), + messages_pb2.StreamingOutputCallResponse) + self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) + + self.assertTrue(response_cnt, _NUM_STREAM_RESPONSES) + self.assertTrue(interceptor.response_iterator.response_cnt, + _NUM_STREAM_RESPONSES) + self.assertEqual(await call.code(), grpc.StatusCode.OK) + + await channel.close() + + async def test_mulitple_interceptors_response_iterator(self): + for interceptor_class in (_UnaryStreamInterceptorEmpty, + _UnaryStreamInterceptorWith_ResponseIterator): + + with self.subTest(name=interceptor_class): + + interceptors = [interceptor_class(), interceptor_class()] + + channel = aio.insecure_channel(self._server_target, + interceptors=interceptors) + stub = test_pb2_grpc.TestServiceStub(channel) + + request = messages_pb2.StreamingOutputCallRequest() + for _ in range(_NUM_STREAM_RESPONSES): + request.response_parameters.append( + messages_pb2.ResponseParameters( + size=_RESPONSE_PAYLOAD_SIZE)) + + call = stub.StreamingOutputCall(request) + + response_cnt = 0 + async for response in call: + response_cnt += 1 + self.assertIs(type(response), + messages_pb2.StreamingOutputCallResponse) + self.assertEqual(_RESPONSE_PAYLOAD_SIZE, + len(response.payload.body)) + + self.assertTrue(response_cnt, _NUM_STREAM_RESPONSES) + self.assertEqual(await call.code(), grpc.StatusCode.OK) + + await channel.close() + + async def test_intercepts_response_iterator_rpc_error(self): + for interceptor_class in (_UnaryStreamInterceptorEmpty, + _UnaryStreamInterceptorWith_ResponseIterator): + + with self.subTest(name=interceptor_class): + + channel = aio.insecure_channel( + UNREACHABLE_TARGET, interceptors=[interceptor_class()]) + request = messages_pb2.StreamingOutputCallRequest() + stub = test_pb2_grpc.TestServiceStub(channel) + call = stub.StreamingOutputCall(request) + + with self.assertRaises(aio.AioRpcError) as exception_context: + async for response in call: + pass + + self.assertEqual(grpc.StatusCode.UNAVAILABLE, + exception_context.exception.code()) + + self.assertTrue(call.done()) + self.assertEqual(grpc.StatusCode.UNAVAILABLE, await call.code()) + await channel.close() + + async def test_cancel_before_rpc(self): + + interceptor_reached = asyncio.Event() + wait_for_ever = self.loop.create_future() + + class Interceptor(aio.UnaryStreamClientInterceptor): + + async def intercept_unary_stream(self, continuation, + client_call_details, request): + interceptor_reached.set() + await wait_for_ever + + channel = aio.insecure_channel(UNREACHABLE_TARGET, + interceptors=[Interceptor()]) + request = messages_pb2.StreamingOutputCallRequest() + stub = test_pb2_grpc.TestServiceStub(channel) + call = stub.StreamingOutputCall(request) + + self.assertFalse(call.cancelled()) + self.assertFalse(call.done()) + + await interceptor_reached.wait() + self.assertTrue(call.cancel()) + + with self.assertRaises(asyncio.CancelledError): + async for response in call: + pass + + self.assertTrue(call.cancelled()) + self.assertTrue(call.done()) + self.assertEqual(await call.code(), grpc.StatusCode.CANCELLED) + self.assertEqual(await call.details(), + _LOCAL_CANCEL_DETAILS_EXPECTATION) + self.assertEqual(await call.initial_metadata(), None) + self.assertEqual(await call.trailing_metadata(), None) + await channel.close() + + async def test_cancel_after_rpc(self): + + interceptor_reached = asyncio.Event() + wait_for_ever = self.loop.create_future() + + class Interceptor(aio.UnaryStreamClientInterceptor): + + async def intercept_unary_stream(self, continuation, + client_call_details, request): + call = await continuation(client_call_details, request) + interceptor_reached.set() + await wait_for_ever + + channel = aio.insecure_channel(UNREACHABLE_TARGET, + interceptors=[Interceptor()]) + request = messages_pb2.StreamingOutputCallRequest() + stub = test_pb2_grpc.TestServiceStub(channel) + call = stub.StreamingOutputCall(request) + + self.assertFalse(call.cancelled()) + self.assertFalse(call.done()) + + await interceptor_reached.wait() + self.assertTrue(call.cancel()) + + with self.assertRaises(asyncio.CancelledError): + async for response in call: + pass + + self.assertTrue(call.cancelled()) + self.assertTrue(call.done()) + self.assertEqual(await call.code(), grpc.StatusCode.CANCELLED) + self.assertEqual(await call.details(), + _LOCAL_CANCEL_DETAILS_EXPECTATION) + self.assertEqual(await call.initial_metadata(), None) + self.assertEqual(await call.trailing_metadata(), None) + await channel.close() + + async def test_cancel_consuming_response_iterator(self): + request = messages_pb2.StreamingOutputCallRequest() + for _ in range(_NUM_STREAM_RESPONSES): + request.response_parameters.append( + messages_pb2.ResponseParameters( + size=_RESPONSE_PAYLOAD_SIZE, + interval_us=_RESPONSE_INTERVAL_US)) + + channel = aio.insecure_channel( + self._server_target, + interceptors=[_UnaryStreamInterceptorWith_ResponseIterator()]) + stub = test_pb2_grpc.TestServiceStub(channel) + call = stub.StreamingOutputCall(request) + + with self.assertRaises(asyncio.CancelledError): + async for response in call: + call.cancel() + + self.assertTrue(call.cancelled()) + self.assertTrue(call.done()) + self.assertEqual(await call.code(), grpc.StatusCode.CANCELLED) + self.assertEqual(await call.details(), + _LOCAL_CANCEL_DETAILS_EXPECTATION) + await channel.close() + + +if __name__ == '__main__': + logging.basicConfig(level=logging.DEBUG) + unittest.main(verbosity=2) diff --git a/src/python/grpcio_tests/tests_aio/unit/client_interceptor_test.py b/src/python/grpcio_tests/tests_aio/unit/client_unary_unary_interceptor_test.py similarity index 100% rename from src/python/grpcio_tests/tests_aio/unit/client_interceptor_test.py rename to src/python/grpcio_tests/tests_aio/unit/client_unary_unary_interceptor_test.py From 990943e36c18e6bd199c2119868146571fe798c3 Mon Sep 17 00:00:00 2001 From: nanahpang <31627465+nanahpang@users.noreply.github.com> Date: Mon, 20 Apr 2020 10:04:17 -0700 Subject: [PATCH 548/758] Redundant get() call on smart pointer I caught this ClangTide error while doing the import. Applied a quick fix here to follow the go/clang-tidy/checks/readability-redundant-smartptr-get.md. --- .../ext/filters/client_channel/lb_policy/xds/xds_routing.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc b/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc index 34aa788ad89..8cc5aa70261 100644 --- a/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc +++ b/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc @@ -231,7 +231,7 @@ XdsRoutingLb::PickResult XdsRoutingLb::RoutePicker::Pick(PickArgs args) { (path_elements[1] == route.matcher.method || route.matcher.method.empty())) || (route.matcher.service.empty() && route.matcher.method.empty())) { - return route.picker.get()->Pick(args); + return route.picker->Pick(args); } } PickResult result; From 056bd7909176eac9f72203ffc233d989bb85fce2 Mon Sep 17 00:00:00 2001 From: Muxi Yan Date: Mon, 20 Apr 2020 10:44:04 -0700 Subject: [PATCH 549/758] address comments --- src/objective-c/BoringSSL-GRPC.podspec | 468 +++++++++++++++++- .../BoringSSL-GRPC.podspec.template | 34 +- .../generate_boringssl_prefix_header.sh | 8 +- 3 files changed, 492 insertions(+), 18 deletions(-) diff --git a/src/objective-c/BoringSSL-GRPC.podspec b/src/objective-c/BoringSSL-GRPC.podspec index b19433780eb..a6fd9bf42e0 100644 --- a/src/objective-c/BoringSSL-GRPC.podspec +++ b/src/objective-c/BoringSSL-GRPC.podspec @@ -202,7 +202,7 @@ Pod::Spec.new do |s| } EOF - # To avoid symbol conflict with OpenSSL, gRPC needs to rename all the BoringSSL symbols with a + # To avoid symbol conflict with OpenSSL, gRPC needs to rename all the BoringSSL symbols with a # prefix. This is done with BoringSSL's BORINGSSL_PREFIX mechanism # (https://github.com/google/boringssl/blob/75148d7abf12bdd1797fec3c5da9a21963703516/BUILDING.md#building-with-prefixed-symbols). # The required prefix header file boringssl_prefix_symbols.h is not part of BoringSSL repo at @@ -213,12 +213,474 @@ Pod::Spec.new do |s| # /src/boringssl/boringssl_prefix_symbols.h. Here we decode the content and inject the header to # the correct location in BoringSSL. base64 -D < src/include/openssl/boringssl_prefix_symbols.h - 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 + +71T2aoqTbtsjyT3dM0NgQSy2YVATSK73L/+zQQE+bFWwlrpiB0zXUbPsyBJ8osk8z//8+wpLdIqrtPk + bPPW/yPalFVWPAmRR4cq3WU/o+c0TtLqP8TzWVmcfWqOrla3Z9tyv8/q/+/sfHvx26///Hj1cffh4rdN + uou3l5vfLje/btMkubhM4t3Hze6XZLv7t3/7z/88uy4Pb1X29Fyf/d/t/zu7+HB+9Y+zL2X5lKdni2L7 + H/In6lcPabXPhMhkvLo8O4r0HzLa4e0fZ/syyXby/8dF8p9ldZZkoq6yzbFOz+rnTJyJcle/xlV6tpMH + 4+JNuQ7H6lCK9Ow1q+UFVM3/L4/12S5NzyTynFapuvoqLmRC/OPsUJUvWSKTpH6Oa/l/0rN4U76kyrTt + z70o62ybqrNo4x6G8z0dOhzSuDrLirM4zxWZpeJ0deuv87PV/ef1/8yW87PF6uxhef/H4mZ+c/Z/Ziv5 + 7/9zNru7aX40e1x/vV+e3SxW17ezxbfV2ez29kxSy9ndejFfKdf/LNZfz5bzL7OlRO4lJX2D++769vFm + cfelARffHm4XMsogOLv/rBzf5svrr/Ivs0+L28X6exP+82J9N1+t/kM6zu7uz+Z/zO/WZ6uvyqOd2af5 + 2e1i9ul2fvZZ/mt2913pVg/z68Xs9h/yvJfz6/U/pOL0X/JH1/d3q/l/P0qd/M3Zzezb7Is6kYY+/bO5 + sK+z9epexl3Ky1s93q7VZXxe3n87u71fqTM/e1zNZYzZeqZomYbylFf/kNxcnuBSnfdM/u96vbi/Uz4J + yNDr5Uydx938y+3iy/zueq7Y+wZY3y/lbx9XHfOPs9lysVJB7x/Xir5XziYL39/dzZvftKmv0kOeS3MW + 86VMiG+zRvzZvBv/0eT/T/dL6ZSPTzS7uYkelvPPiz/PDrGoU3FWv5ZnMusVdbbL0krIzCMzf1mk8ibU + KovJTL0X6g9KlNXqaVU5rtyd7eNtVZ6lPw9x0WRC+b+sFmdx9XTcS584k49lKR8LFUg+vf/xb/+eyCe7 + SMHT+b/xP842/w88FC3kpS/bH3gd+g/P4rN///ezSP2fzb8N1OI+2kWylIHPYfhj+4d/DMD/MxwiramW + Dhk8N+vbVbTNM5lU0T6VxUMyVeeSlpWhAz0irV7SiqMzSMuqysJoc9ztZHbjuAHejPByHl3wU9alATtT + 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 EOF # We are renaming openssl to openssl_grpc so that there is no conflict with openssl if it exists find . -type f \\( -path '*.h' -or -path '*.cc' -or -path '*.c' \\) -print0 | xargs -0 -L1 sed -E -i'.grpc_back' 's;#include # This file has been automatically generated from a template file. @@ -219,7 +232,7 @@ } EOF - # To avoid symbol conflict with OpenSSL, gRPC needs to rename all the BoringSSL symbols with a + # To avoid symbol conflict with OpenSSL, gRPC needs to rename all the BoringSSL symbols with a # prefix. This is done with BoringSSL's BORINGSSL_PREFIX mechanism # (https://github.com/google/boringssl/blob/75148d7abf12bdd1797fec3c5da9a21963703516/BUILDING.md#building-with-prefixed-symbols). # The required prefix header file boringssl_prefix_symbols.h is not part of BoringSSL repo at @@ -230,12 +243,13 @@ # /src/boringssl/boringssl_prefix_symbols.h. Here we decode the content and inject the header to # the correct location in BoringSSL. base64 -D < src/include/openssl/boringssl_prefix_symbols.h - ${prefix_gz_b64} + % for line in compress_boringssl_prefix_header(): + ${line} + % endfor EOF # We are renaming openssl to openssl_grpc so that there is no conflict with openssl if it exists find . -type f \\( -path '*.h' -or -path '*.cc' -or -path '*.c' \\) -print0 | xargs -0 -L1 sed -E -i'.grpc_back' 's;#include ./symbols.txt go run ../util/read_symbols.go crypto/libcrypto.a >> ./symbols.txt - -# generates boringssl_prefix_symbols.h cmake .. -DBORINGSSL_PREFIX=GRPC -DBORINGSSL_PREFIX_SYMBOLS=symbols.txt make boringssl_prefix_symbols - [ -f symbol_prefix_include/boringssl_prefix_symbols.h ] || { echo "Failed to build boringssl_prefix_symbols.sh" ; exit 1 ; } cd ../../../.. From 7f693a07bb3258ccffd0ec769ae98574ae11da63 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Mon, 20 Apr 2020 11:16:51 -0700 Subject: [PATCH 550/758] Make pylint happy --- src/python/grpcio_status/grpc_status/rpc_status.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/python/grpcio_status/grpc_status/rpc_status.py b/src/python/grpcio_status/grpc_status/rpc_status.py index f3c94cc5039..d0ec08e3a5d 100644 --- a/src/python/grpcio_status/grpc_status/rpc_status.py +++ b/src/python/grpcio_status/grpc_status/rpc_status.py @@ -85,5 +85,5 @@ __all__ = [ ] if sys.version_info[0] >= 3 and sys.version_info[1] >= 6: - from . import _async as aio + from . import _async as aio # pylint: disable=unused-import __all__.append('aio') From b43194c4445b01387957658a2faa60994f1a4a29 Mon Sep 17 00:00:00 2001 From: Donna Dionne Date: Mon, 20 Apr 2020 11:28:23 -0700 Subject: [PATCH 551/758] Fixing grp_log format error. --- src/core/ext/filters/client_channel/xds/xds_client.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/ext/filters/client_channel/xds/xds_client.cc b/src/core/ext/filters/client_channel/xds/xds_client.cc index 2f0657496da..b2cbb5857ea 100644 --- a/src/core/ext/filters/client_channel/xds/xds_client.cc +++ b/src/core/ext/filters/client_channel/xds/xds_client.cc @@ -903,7 +903,7 @@ void XdsClient::ChannelState::AdsCallState::AcceptLdsUpdate( ? lds_update->route_config_name.c_str() : "")); if (lds_update->rds_update.has_value()) { - gpr_log(GPR_INFO, " RouteConfiguration contains %lu routes", + gpr_log(GPR_INFO, " RouteConfiguration contains %" PRIuPTR " routes", lds_update->rds_update.value().routes.size()); for (const auto& route : lds_update->rds_update.value().routes) { gpr_log(GPR_INFO, @@ -966,7 +966,7 @@ void XdsClient::ChannelState::AdsCallState::AcceptRdsUpdate( if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) { gpr_log(GPR_INFO, "[xds_client %p] RDS update received; RouteConfiguration contains " - "%lu routes", + "%" PRIuPTR " routes", this, rds_update.value().routes.size()); for (const auto& route : rds_update.value().routes) { gpr_log(GPR_INFO, From 0ff25bb1b3586d0dccfdf385f6e42338e785e614 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Mon, 20 Apr 2020 12:38:21 -0700 Subject: [PATCH 552/758] Revert "Revert "[Aio] Add AsyncIO support to grpcio-reflection"" --- .../grpc_reflection/v1alpha/BUILD.bazel | 2 +- .../grpc_reflection/v1alpha/_async.py | 57 ++++++ .../grpc_reflection/v1alpha/_base.py | 110 ++++++++++ .../grpc_reflection/v1alpha/reflection.py | 137 ++++--------- .../tests_aio/reflection/BUILD.bazel | 30 +++ .../tests_aio/reflection/__init__.py | 13 ++ .../reflection/reflection_servicer_test.py | 193 ++++++++++++++++++ src/python/grpcio_tests/tests_aio/tests.json | 1 + 8 files changed, 450 insertions(+), 93 deletions(-) create mode 100644 src/python/grpcio_reflection/grpc_reflection/v1alpha/_async.py create mode 100644 src/python/grpcio_reflection/grpc_reflection/v1alpha/_base.py create mode 100644 src/python/grpcio_tests/tests_aio/reflection/BUILD.bazel create mode 100644 src/python/grpcio_tests/tests_aio/reflection/__init__.py create mode 100644 src/python/grpcio_tests/tests_aio/reflection/reflection_servicer_test.py diff --git a/src/python/grpcio_reflection/grpc_reflection/v1alpha/BUILD.bazel b/src/python/grpcio_reflection/grpc_reflection/v1alpha/BUILD.bazel index cf30c395c68..6e3d8e01eea 100644 --- a/src/python/grpcio_reflection/grpc_reflection/v1alpha/BUILD.bazel +++ b/src/python/grpcio_reflection/grpc_reflection/v1alpha/BUILD.bazel @@ -17,7 +17,7 @@ py_grpc_library( py_library( name = "grpc_reflection", - srcs = ["reflection.py"], + srcs = glob(["*.py"]), imports = ["../../"], deps = [ ":reflection_py_pb2", diff --git a/src/python/grpcio_reflection/grpc_reflection/v1alpha/_async.py b/src/python/grpcio_reflection/grpc_reflection/v1alpha/_async.py new file mode 100644 index 00000000000..6e684a4e5e0 --- /dev/null +++ b/src/python/grpcio_reflection/grpc_reflection/v1alpha/_async.py @@ -0,0 +1,57 @@ +# Copyright 2020 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""The AsyncIO version of the reflection servicer.""" + +from typing import AsyncIterable + +import grpc + +from grpc_reflection.v1alpha import reflection_pb2 as _reflection_pb2 +from grpc_reflection.v1alpha._base import BaseReflectionServicer + + +class ReflectionServicer(BaseReflectionServicer): + """Servicer handling RPCs for service statuses.""" + + async def ServerReflectionInfo( + self, request_iterator: AsyncIterable[ + _reflection_pb2.ServerReflectionRequest], unused_context + ) -> AsyncIterable[_reflection_pb2.ServerReflectionResponse]: + async for request in request_iterator: + if request.HasField('file_by_filename'): + yield self._file_by_filename(request.file_by_filename) + elif request.HasField('file_containing_symbol'): + yield self._file_containing_symbol( + request.file_containing_symbol) + elif request.HasField('file_containing_extension'): + yield self._file_containing_extension( + request.file_containing_extension.containing_type, + request.file_containing_extension.extension_number) + elif request.HasField('all_extension_numbers_of_type'): + yield self._all_extension_numbers_of_type( + request.all_extension_numbers_of_type) + elif request.HasField('list_services'): + yield self._list_services() + else: + yield _reflection_pb2.ServerReflectionResponse( + error_response=_reflection_pb2.ErrorResponse( + error_code=grpc.StatusCode.INVALID_ARGUMENT.value[0], + error_message=grpc.StatusCode.INVALID_ARGUMENT.value[1]. + encode(), + )) + + +__all__ = [ + "ReflectionServicer", +] diff --git a/src/python/grpcio_reflection/grpc_reflection/v1alpha/_base.py b/src/python/grpcio_reflection/grpc_reflection/v1alpha/_base.py new file mode 100644 index 00000000000..2c9e79c9dd1 --- /dev/null +++ b/src/python/grpcio_reflection/grpc_reflection/v1alpha/_base.py @@ -0,0 +1,110 @@ +# Copyright 2020 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Base implementation of reflection servicer.""" + +import grpc +from google.protobuf import descriptor_pb2 +from google.protobuf import descriptor_pool + +from grpc_reflection.v1alpha import reflection_pb2 as _reflection_pb2 +from grpc_reflection.v1alpha import reflection_pb2_grpc as _reflection_pb2_grpc + +_POOL = descriptor_pool.Default() + + +def _not_found_error(): + return _reflection_pb2.ServerReflectionResponse( + error_response=_reflection_pb2.ErrorResponse( + error_code=grpc.StatusCode.NOT_FOUND.value[0], + error_message=grpc.StatusCode.NOT_FOUND.value[1].encode(), + )) + + +def _file_descriptor_response(descriptor): + proto = descriptor_pb2.FileDescriptorProto() + descriptor.CopyToProto(proto) + serialized_proto = proto.SerializeToString() + return _reflection_pb2.ServerReflectionResponse( + file_descriptor_response=_reflection_pb2.FileDescriptorResponse( + file_descriptor_proto=(serialized_proto,)),) + + +class BaseReflectionServicer(_reflection_pb2_grpc.ServerReflectionServicer): + """Base class for reflection servicer.""" + + def __init__(self, service_names, pool=None): + """Constructor. + + Args: + service_names: Iterable of fully-qualified service names available. + pool: An optional DescriptorPool instance. + """ + self._service_names = tuple(sorted(service_names)) + self._pool = _POOL if pool is None else pool + + def _file_by_filename(self, filename): + try: + descriptor = self._pool.FindFileByName(filename) + except KeyError: + return _not_found_error() + else: + return _file_descriptor_response(descriptor) + + def _file_containing_symbol(self, fully_qualified_name): + try: + descriptor = self._pool.FindFileContainingSymbol( + fully_qualified_name) + except KeyError: + return _not_found_error() + else: + return _file_descriptor_response(descriptor) + + def _file_containing_extension(self, containing_type, extension_number): + try: + message_descriptor = self._pool.FindMessageTypeByName( + containing_type) + extension_descriptor = self._pool.FindExtensionByNumber( + message_descriptor, extension_number) + descriptor = self._pool.FindFileContainingSymbol( + extension_descriptor.full_name) + except KeyError: + return _not_found_error() + else: + return _file_descriptor_response(descriptor) + + def _all_extension_numbers_of_type(self, containing_type): + try: + message_descriptor = self._pool.FindMessageTypeByName( + containing_type) + extension_numbers = tuple( + sorted(extension.number for extension in + self._pool.FindAllExtensions(message_descriptor))) + except KeyError: + return _not_found_error() + else: + return _reflection_pb2.ServerReflectionResponse( + all_extension_numbers_response=_reflection_pb2. + ExtensionNumberResponse( + base_type_name=message_descriptor.full_name, + extension_number=extension_numbers)) + + def _list_services(self): + return _reflection_pb2.ServerReflectionResponse( + list_services_response=_reflection_pb2.ListServiceResponse(service=[ + _reflection_pb2.ServiceResponse(name=service_name) + for service_name in self._service_names + ])) + + +__all__ = ['BaseReflectionServicer'] diff --git a/src/python/grpcio_reflection/grpc_reflection/v1alpha/reflection.py b/src/python/grpcio_reflection/grpc_reflection/v1alpha/reflection.py index dde291ff740..219f10ab61c 100644 --- a/src/python/grpcio_reflection/grpc_reflection/v1alpha/reflection.py +++ b/src/python/grpcio_reflection/grpc_reflection/v1alpha/reflection.py @@ -13,100 +13,21 @@ # limitations under the License. """Reference implementation for reflection in gRPC Python.""" +import sys import grpc -from google.protobuf import descriptor_pb2 -from google.protobuf import descriptor_pool from grpc_reflection.v1alpha import reflection_pb2 as _reflection_pb2 from grpc_reflection.v1alpha import reflection_pb2_grpc as _reflection_pb2_grpc -_POOL = descriptor_pool.Default() +from grpc_reflection.v1alpha._base import BaseReflectionServicer + SERVICE_NAME = _reflection_pb2.DESCRIPTOR.services_by_name[ 'ServerReflection'].full_name -def _not_found_error(): - return _reflection_pb2.ServerReflectionResponse( - error_response=_reflection_pb2.ErrorResponse( - error_code=grpc.StatusCode.NOT_FOUND.value[0], - error_message=grpc.StatusCode.NOT_FOUND.value[1].encode(), - )) - - -def _file_descriptor_response(descriptor): - proto = descriptor_pb2.FileDescriptorProto() - descriptor.CopyToProto(proto) - serialized_proto = proto.SerializeToString() - return _reflection_pb2.ServerReflectionResponse( - file_descriptor_response=_reflection_pb2.FileDescriptorResponse( - file_descriptor_proto=(serialized_proto,)),) - - -class ReflectionServicer(_reflection_pb2_grpc.ServerReflectionServicer): +class ReflectionServicer(BaseReflectionServicer): """Servicer handling RPCs for service statuses.""" - def __init__(self, service_names, pool=None): - """Constructor. - - Args: - service_names: Iterable of fully-qualified service names available. - """ - self._service_names = tuple(sorted(service_names)) - self._pool = _POOL if pool is None else pool - - def _file_by_filename(self, filename): - try: - descriptor = self._pool.FindFileByName(filename) - except KeyError: - return _not_found_error() - else: - return _file_descriptor_response(descriptor) - - def _file_containing_symbol(self, fully_qualified_name): - try: - descriptor = self._pool.FindFileContainingSymbol( - fully_qualified_name) - except KeyError: - return _not_found_error() - else: - return _file_descriptor_response(descriptor) - - def _file_containing_extension(self, containing_type, extension_number): - try: - message_descriptor = self._pool.FindMessageTypeByName( - containing_type) - extension_descriptor = self._pool.FindExtensionByNumber( - message_descriptor, extension_number) - descriptor = self._pool.FindFileContainingSymbol( - extension_descriptor.full_name) - except KeyError: - return _not_found_error() - else: - return _file_descriptor_response(descriptor) - - def _all_extension_numbers_of_type(self, containing_type): - try: - message_descriptor = self._pool.FindMessageTypeByName( - containing_type) - extension_numbers = tuple( - sorted(extension.number for extension in - self._pool.FindAllExtensions(message_descriptor))) - except KeyError: - return _not_found_error() - else: - return _reflection_pb2.ServerReflectionResponse( - all_extension_numbers_response=_reflection_pb2. - ExtensionNumberResponse( - base_type_name=message_descriptor.full_name, - extension_number=extension_numbers)) - - def _list_services(self): - return _reflection_pb2.ServerReflectionResponse( - list_services_response=_reflection_pb2.ListServiceResponse(service=[ - _reflection_pb2.ServiceResponse(name=service_name) - for service_name in self._service_names - ])) - def ServerReflectionInfo(self, request_iterator, context): # pylint: disable=unused-argument for request in request_iterator: @@ -133,13 +54,45 @@ class ReflectionServicer(_reflection_pb2_grpc.ServerReflectionServicer): )) -def enable_server_reflection(service_names, server, pool=None): - """Enables server reflection on a server. +_enable_server_reflection_doc = """Enables server reflection on a server. - Args: - service_names: Iterable of fully-qualified service names available. - server: grpc.Server to which reflection service will be added. - pool: DescriptorPool object to use (descriptor_pool.Default() if None). - """ - _reflection_pb2_grpc.add_ServerReflectionServicer_to_server( - ReflectionServicer(service_names, pool=pool), server) +Args: + service_names: Iterable of fully-qualified service names available. + server: grpc.Server to which reflection service will be added. + pool: DescriptorPool object to use (descriptor_pool.Default() if None). +""" + +if sys.version_info[0] >= 3 and sys.version_info[1] >= 6: + # Exposes AsyncReflectionServicer as public API. + from . import _async as aio + from grpc.experimental import aio as grpc_aio # pylint: disable=ungrouped-imports + + def enable_server_reflection(service_names, server, pool=None): + if isinstance(server, grpc_aio.Server): + _reflection_pb2_grpc.add_ServerReflectionServicer_to_server( + aio.ReflectionServicer(service_names, pool=pool), server) + else: + _reflection_pb2_grpc.add_ServerReflectionServicer_to_server( + ReflectionServicer(service_names, pool=pool), server) + + enable_server_reflection.__doc__ = _enable_server_reflection_doc + + __all__ = [ + "SERVICE_NAME", + "ReflectionServicer", + "enable_server_reflection", + "aio", + ] +else: + + def enable_server_reflection(service_names, server, pool=None): + _reflection_pb2_grpc.add_ServerReflectionServicer_to_server( + ReflectionServicer(service_names, pool=pool), server) + + enable_server_reflection.__doc__ = _enable_server_reflection_doc + + __all__ = [ + "SERVICE_NAME", + "ReflectionServicer", + "enable_server_reflection", + ] diff --git a/src/python/grpcio_tests/tests_aio/reflection/BUILD.bazel b/src/python/grpcio_tests/tests_aio/reflection/BUILD.bazel new file mode 100644 index 00000000000..88bf8cc903f --- /dev/null +++ b/src/python/grpcio_tests/tests_aio/reflection/BUILD.bazel @@ -0,0 +1,30 @@ +# Copyright 2020 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +package(default_testonly = 1) + +py_test( + name = "reflection_servicer_test", + srcs = ["reflection_servicer_test.py"], + imports = ["../../"], + python_version = "PY3", + deps = [ + "//src/proto/grpc/testing:empty_py_pb2", + "//src/proto/grpc/testing/proto2:empty2_extensions_proto", + "//src/proto/grpc/testing/proto2:empty2_proto", + "//src/python/grpcio/grpc:grpcio", + "//src/python/grpcio_reflection/grpc_reflection/v1alpha:grpc_reflection", + "//src/python/grpcio_tests/tests_aio/unit:_test_base", + ], +) diff --git a/src/python/grpcio_tests/tests_aio/reflection/__init__.py b/src/python/grpcio_tests/tests_aio/reflection/__init__.py new file mode 100644 index 00000000000..5772620b602 --- /dev/null +++ b/src/python/grpcio_tests/tests_aio/reflection/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2016 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/src/python/grpcio_tests/tests_aio/reflection/reflection_servicer_test.py b/src/python/grpcio_tests/tests_aio/reflection/reflection_servicer_test.py new file mode 100644 index 00000000000..11242ed7e5d --- /dev/null +++ b/src/python/grpcio_tests/tests_aio/reflection/reflection_servicer_test.py @@ -0,0 +1,193 @@ +# Copyright 2016 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Tests of grpc_reflection.v1alpha.reflection.""" + +import logging +import unittest + +import grpc +from google.protobuf import descriptor_pb2, descriptor_pool +from grpc.experimental import aio + +from grpc_reflection.v1alpha import (reflection, reflection_pb2, + reflection_pb2_grpc) +from src.proto.grpc.testing import empty_pb2 +from src.proto.grpc.testing.proto2 import empty2_extensions_pb2 +from tests_aio.unit._test_base import AioTestBase + +_EMPTY_PROTO_FILE_NAME = 'src/proto/grpc/testing/empty.proto' +_EMPTY_PROTO_SYMBOL_NAME = 'grpc.testing.Empty' +_SERVICE_NAMES = ('Angstrom', 'Bohr', 'Curie', 'Dyson', 'Einstein', 'Feynman', + 'Galilei') +_EMPTY_EXTENSIONS_SYMBOL_NAME = 'grpc.testing.proto2.EmptyWithExtensions' +_EMPTY_EXTENSIONS_NUMBERS = ( + 124, + 125, + 126, + 127, + 128, +) + + +def _file_descriptor_to_proto(descriptor): + proto = descriptor_pb2.FileDescriptorProto() + descriptor.CopyToProto(proto) + return proto.SerializeToString() + + +class ReflectionServicerTest(AioTestBase): + + async def setUp(self): + self._server = aio.server() + reflection.enable_server_reflection(_SERVICE_NAMES, self._server) + port = self._server.add_insecure_port('[::]:0') + await self._server.start() + + self._channel = aio.insecure_channel('localhost:%d' % port) + self._stub = reflection_pb2_grpc.ServerReflectionStub(self._channel) + + async def tearDown(self): + await self._server.stop(None) + await self._channel.close() + + async def test_file_by_name(self): + requests = ( + reflection_pb2.ServerReflectionRequest( + file_by_filename=_EMPTY_PROTO_FILE_NAME), + reflection_pb2.ServerReflectionRequest( + file_by_filename='i-donut-exist'), + ) + responses = [] + async for response in self._stub.ServerReflectionInfo(iter(requests)): + responses.append(response) + expected_responses = ( + reflection_pb2.ServerReflectionResponse( + valid_host='', + file_descriptor_response=reflection_pb2.FileDescriptorResponse( + file_descriptor_proto=( + _file_descriptor_to_proto(empty_pb2.DESCRIPTOR),))), + reflection_pb2.ServerReflectionResponse( + valid_host='', + error_response=reflection_pb2.ErrorResponse( + error_code=grpc.StatusCode.NOT_FOUND.value[0], + error_message=grpc.StatusCode.NOT_FOUND.value[1].encode(), + )), + ) + self.assertSequenceEqual(expected_responses, responses) + + async def test_file_by_symbol(self): + requests = ( + reflection_pb2.ServerReflectionRequest( + file_containing_symbol=_EMPTY_PROTO_SYMBOL_NAME), + reflection_pb2.ServerReflectionRequest( + file_containing_symbol='i.donut.exist.co.uk.org.net.me.name.foo' + ), + ) + responses = [] + async for response in self._stub.ServerReflectionInfo(iter(requests)): + responses.append(response) + expected_responses = ( + reflection_pb2.ServerReflectionResponse( + valid_host='', + file_descriptor_response=reflection_pb2.FileDescriptorResponse( + file_descriptor_proto=( + _file_descriptor_to_proto(empty_pb2.DESCRIPTOR),))), + reflection_pb2.ServerReflectionResponse( + valid_host='', + error_response=reflection_pb2.ErrorResponse( + error_code=grpc.StatusCode.NOT_FOUND.value[0], + error_message=grpc.StatusCode.NOT_FOUND.value[1].encode(), + )), + ) + self.assertSequenceEqual(expected_responses, responses) + + async def test_file_containing_extension(self): + requests = ( + reflection_pb2.ServerReflectionRequest( + file_containing_extension=reflection_pb2.ExtensionRequest( + containing_type=_EMPTY_EXTENSIONS_SYMBOL_NAME, + extension_number=125, + ),), + reflection_pb2.ServerReflectionRequest( + file_containing_extension=reflection_pb2.ExtensionRequest( + containing_type='i.donut.exist.co.uk.org.net.me.name.foo', + extension_number=55, + ),), + ) + responses = [] + async for response in self._stub.ServerReflectionInfo(iter(requests)): + responses.append(response) + expected_responses = ( + reflection_pb2.ServerReflectionResponse( + valid_host='', + file_descriptor_response=reflection_pb2.FileDescriptorResponse( + file_descriptor_proto=(_file_descriptor_to_proto( + empty2_extensions_pb2.DESCRIPTOR),))), + reflection_pb2.ServerReflectionResponse( + valid_host='', + error_response=reflection_pb2.ErrorResponse( + error_code=grpc.StatusCode.NOT_FOUND.value[0], + error_message=grpc.StatusCode.NOT_FOUND.value[1].encode(), + )), + ) + self.assertSequenceEqual(expected_responses, responses) + + async def test_extension_numbers_of_type(self): + requests = ( + reflection_pb2.ServerReflectionRequest( + all_extension_numbers_of_type=_EMPTY_EXTENSIONS_SYMBOL_NAME), + reflection_pb2.ServerReflectionRequest( + all_extension_numbers_of_type='i.donut.exist.co.uk.net.name.foo' + ), + ) + responses = [] + async for response in self._stub.ServerReflectionInfo(iter(requests)): + responses.append(response) + expected_responses = ( + reflection_pb2.ServerReflectionResponse( + valid_host='', + all_extension_numbers_response=reflection_pb2. + ExtensionNumberResponse( + base_type_name=_EMPTY_EXTENSIONS_SYMBOL_NAME, + extension_number=_EMPTY_EXTENSIONS_NUMBERS)), + reflection_pb2.ServerReflectionResponse( + valid_host='', + error_response=reflection_pb2.ErrorResponse( + error_code=grpc.StatusCode.NOT_FOUND.value[0], + error_message=grpc.StatusCode.NOT_FOUND.value[1].encode(), + )), + ) + self.assertSequenceEqual(expected_responses, responses) + + async def test_list_services(self): + requests = (reflection_pb2.ServerReflectionRequest(list_services='',),) + responses = [] + async for response in self._stub.ServerReflectionInfo(iter(requests)): + responses.append(response) + expected_responses = (reflection_pb2.ServerReflectionResponse( + valid_host='', + list_services_response=reflection_pb2.ListServiceResponse( + service=tuple( + reflection_pb2.ServiceResponse(name=name) + for name in _SERVICE_NAMES))),) + self.assertSequenceEqual(expected_responses, responses) + + def test_reflection_service_name(self): + self.assertEqual(reflection.SERVICE_NAME, + 'grpc.reflection.v1alpha.ServerReflection') + + +if __name__ == '__main__': + logging.basicConfig(level=logging.DEBUG) + unittest.main(verbosity=2) diff --git a/src/python/grpcio_tests/tests_aio/tests.json b/src/python/grpcio_tests/tests_aio/tests.json index 71f8733f5f9..f28976e360a 100644 --- a/src/python/grpcio_tests/tests_aio/tests.json +++ b/src/python/grpcio_tests/tests_aio/tests.json @@ -3,6 +3,7 @@ "health_check.health_servicer_test.HealthServicerTest", "interop.local_interop_test.InsecureLocalInteropTest", "interop.local_interop_test.SecureLocalInteropTest", + "reflection.reflection_servicer_test.ReflectionServicerTest", "unit._metadata_test.TestTypeMetadata", "unit.abort_test.TestAbort", "unit.aio_rpc_error_test.TestAioRpcError", From 3ecfe274486a804169981a101ecaaa77e031fc66 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Mon, 20 Apr 2020 12:45:07 -0700 Subject: [PATCH 553/758] Remove the unused import so copybara don't panic --- .../tests_aio/reflection/reflection_servicer_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/python/grpcio_tests/tests_aio/reflection/reflection_servicer_test.py b/src/python/grpcio_tests/tests_aio/reflection/reflection_servicer_test.py index 11242ed7e5d..edd2d79eabe 100644 --- a/src/python/grpcio_tests/tests_aio/reflection/reflection_servicer_test.py +++ b/src/python/grpcio_tests/tests_aio/reflection/reflection_servicer_test.py @@ -17,7 +17,7 @@ import logging import unittest import grpc -from google.protobuf import descriptor_pb2, descriptor_pool +from google.protobuf import descriptor_pb2 from grpc.experimental import aio from grpc_reflection.v1alpha import (reflection, reflection_pb2, From dae80a4977c9afcabd7e104c317cfd8e259c7814 Mon Sep 17 00:00:00 2001 From: Pau Freixes Date: Mon, 20 Apr 2020 23:24:54 +0200 Subject: [PATCH 554/758] Apply feedback --- .../grpcio/grpc/experimental/aio/__init__.py | 5 +- .../grpcio/grpc/experimental/aio/_channel.py | 20 +- .../grpc/experimental/aio/_interceptor.py | 46 ++--- .../grpcio_tests/tests_aio/unit/_common.py | 31 +++ .../client_unary_stream_interceptor_test.py | 182 +++++++++--------- .../tests_aio/unit/done_callback_test.py | 24 +-- 6 files changed, 162 insertions(+), 146 deletions(-) diff --git a/src/python/grpcio/grpc/experimental/aio/__init__.py b/src/python/grpcio/grpc/experimental/aio/__init__.py index 649d29588d4..d0b6a58a149 100644 --- a/src/python/grpcio/grpc/experimental/aio/__init__.py +++ b/src/python/grpcio/grpc/experimental/aio/__init__.py @@ -30,7 +30,8 @@ from ._base_channel import (Channel, StreamStreamMultiCallable, StreamUnaryMultiCallable, UnaryStreamMultiCallable, UnaryUnaryMultiCallable) from ._call import AioRpcError -from ._interceptor import (ClientCallDetails, InterceptedUnaryUnaryCall, +from ._interceptor import (ClientCallDetails, ClientInterceptor, + InterceptedUnaryUnaryCall, UnaryUnaryClientInterceptor, UnaryStreamClientInterceptor, ServerInterceptor) from ._server import server @@ -57,6 +58,8 @@ __all__ = ( 'StreamUnaryMultiCallable', 'StreamStreamMultiCallable', 'ClientCallDetails', + 'ClientInterceptor', + 'UnaryStreamClientInterceptor', 'UnaryUnaryClientInterceptor', 'InterceptedUnaryUnaryCall', 'ServerInterceptor', diff --git a/src/python/grpcio/grpc/experimental/aio/_channel.py b/src/python/grpcio/grpc/experimental/aio/_channel.py index 03d8aa075e0..f783999dd2a 100644 --- a/src/python/grpcio/grpc/experimental/aio/_channel.py +++ b/src/python/grpcio/grpc/experimental/aio/_channel.py @@ -15,7 +15,7 @@ import asyncio import sys -from typing import Any, Iterable, Optional, Sequence +from typing import Any, Iterable, Optional, Sequence, List import grpc from grpc import _common, _compression, _grpcio_metadata @@ -202,8 +202,8 @@ class StreamStreamMultiCallable(_BaseMultiCallable, class Channel(_base_channel.Channel): _loop: asyncio.AbstractEventLoop _channel: cygrpc.AioChannel - _unary_unary_interceptors: Sequence[UnaryUnaryClientInterceptor] - _unary_stream_interceptors: Sequence[UnaryStreamClientInterceptor] + _unary_unary_interceptors: List[UnaryUnaryClientInterceptor] + _unary_stream_interceptors: List[UnaryStreamClientInterceptor] def __init__(self, target: str, options: ChannelArgumentType, credentials: Optional[grpc.ChannelCredentials], @@ -224,18 +224,16 @@ class Channel(_base_channel.Channel): self._unary_stream_interceptors = [] if interceptors: - attrs_and_interceptor_classes = [ + attrs_and_interceptor_classes = ( (self._unary_unary_interceptors, UnaryUnaryClientInterceptor), (self._unary_stream_interceptors, UnaryStreamClientInterceptor) - ] + ) # pylint: disable=cell-var-from-loop for attr, interceptor_class in attrs_and_interceptor_classes: attr.extend( - list( - filter( - lambda interceptor: isinstance( - interceptor, interceptor_class), interceptors))) + [interceptor for interceptor in interceptors if isinstance(interceptor, interceptor_class)] + ) invalid_interceptors = set(interceptors) - set( self._unary_unary_interceptors) - set( @@ -245,7 +243,7 @@ class Channel(_base_channel.Channel): raise ValueError( "Interceptor must be "+\ "UnaryUnaryClientInterceptors or "+\ - "UnaryStreamClientInterceptors the following are invalid: {}"\ + "UnaryStreamClientInterceptors. The following are invalid: {}"\ .format(invalid_interceptors)) self._loop = asyncio.get_event_loop() @@ -402,7 +400,7 @@ def insecure_channel( target: str, options: Optional[ChannelArgumentType] = None, compression: Optional[grpc.Compression] = None, - interceptors: Optional[Sequence[UnaryUnaryClientInterceptor]] = None): + interceptors: Optional[Sequence[ClientInterceptor]] = None): """Creates an insecure asynchronous Channel to a server. Args: diff --git a/src/python/grpcio/grpc/experimental/aio/_interceptor.py b/src/python/grpcio/grpc/experimental/aio/_interceptor.py index 3ce0ddd904d..469585de51a 100644 --- a/src/python/grpcio/grpc/experimental/aio/_interceptor.py +++ b/src/python/grpcio/grpc/experimental/aio/_interceptor.py @@ -126,9 +126,9 @@ class UnaryStreamClientInterceptor(ClientInterceptor, metaclass=ABCMeta): @abstractmethod async def intercept_unary_stream(self, continuation: Callable[[ - ClientCallDetails, RequestType, AsyncIterable[ResponseType] - ], UnaryStreamCall], client_call_details: ClientCallDetails, - request: RequestType) -> UnaryStreamCall: + ClientCallDetails, RequestType], UnaryStreamCall], + client_call_details: ClientCallDetails, + request: RequestType) -> Union[AsyncIterable[ResponseType], UnaryStreamCall]: """Intercepts a unary-stream invocation asynchronously. Args: @@ -180,31 +180,32 @@ class InterceptedCall: self._interceptors_task = interceptors_task self._pending_add_done_callbacks = [] self._interceptors_task.add_done_callback( - self._fire_or_add_pending_add_done_callbacks) + self._fire_or_add_pending_done_callbacks) def __del__(self): self.cancel() - def _fire_or_add_pending_add_done_callbacks(self, + def _fire_or_add_pending_done_callbacks(self, interceptors_task: asyncio.Task ) -> None: if not self._pending_add_done_callbacks: return - fire = False + call_completed = False try: call = interceptors_task.result() if call.done(): - fire = True + call_completed = True except (AioRpcError, asyncio.CancelledError): - fire = True + call_completed = True - for callback in self._pending_add_done_callbacks: - if fire: + if call_completed: + for callback in self._pending_add_done_callbacks: callback(self) - else: + else: + for callback in self._pending_add_done_callbacks: callback = functools.partial(self._wrap_add_done_callback, callback) call.add_done_callback(callback) @@ -415,6 +416,7 @@ class InterceptedUnaryStreamCall(InterceptedCall, _base_call.UnaryStreamCall): _loop: asyncio.AbstractEventLoop _channel: cygrpc.AioChannel _response_aiter: AsyncIterable[ResponseType] + _last_returned_call_from_interceptors = Optional[_base_call.UnaryStreamCall] # pylint: disable=too-many-arguments def __init__(self, interceptors: Sequence[UnaryStreamClientInterceptor], @@ -429,6 +431,7 @@ class InterceptedUnaryStreamCall(InterceptedCall, _base_call.UnaryStreamCall): self._channel = channel self._response_aiter = self._wait_for_interceptor_task_response_iterator( ) + self._last_returned_call_from_interceptors = None interceptors_task = loop.create_task( self._invoke(interceptors, method, timeout, metadata, credentials, wait_for_ready, request, request_serializer, @@ -446,7 +449,6 @@ class InterceptedUnaryStreamCall(InterceptedCall, _base_call.UnaryStreamCall): ) -> UnaryStreamCall: """Run the RPC call wrapped in interceptors""" - last_returned_call_from_interceptors = [None] async def _run_interceptor( interceptors: Iterator[UnaryStreamClientInterceptor], @@ -462,17 +464,15 @@ class InterceptedUnaryStreamCall(InterceptedCall, _base_call.UnaryStreamCall): call_or_response_iterator = await interceptor.intercept_unary_stream( continuation, client_call_details, request) - if call_or_response_iterator is last_returned_call_from_interceptors[ - 0]: - return call_or_response_iterator + if isinstance(call_or_response_iterator, _base_call.UnaryUnaryCall): + self._last_returned_call_from_interceptors = call_or_response_iterator else: - last_returned_call_from_interceptors[ - 0] = UnaryStreamCallResponseIterator( - last_returned_call_from_interceptors[0], + self._last_returned_call_from_interceptors = UnaryStreamCallResponseIterator( + self._last_returned_call_from_interceptors, call_or_response_iterator) - return last_returned_call_from_interceptors[0] + return self._last_returned_call_from_interceptors else: - last_returned_call_from_interceptors[0] = UnaryStreamCall( + self._last_returned_call_from_interceptors = UnaryStreamCall( request, _timeout_to_deadline(client_call_details.timeout), client_call_details.metadata, client_call_details.credentials, @@ -480,7 +480,7 @@ class InterceptedUnaryStreamCall(InterceptedCall, _base_call.UnaryStreamCall): client_call_details.method, request_serializer, response_deserializer, self._loop) - return last_returned_call_from_interceptors[0] + return self._last_returned_call_from_interceptors client_call_details = ClientCallDetails(method, timeout, metadata, credentials, wait_for_ready) @@ -598,4 +598,6 @@ class UnaryStreamCallResponseIterator(_base_call.UnaryStreamCall): return await self._call.wait_for_connection() async def read(self) -> ResponseType: - return await self._call.read() + # Behind the scenes everyting goes through the + # async iterator. So this path should not be reached. + raise Exception() diff --git a/src/python/grpcio_tests/tests_aio/unit/_common.py b/src/python/grpcio_tests/tests_aio/unit/_common.py index 1b5a4d909fa..e820a18dd77 100644 --- a/src/python/grpcio_tests/tests_aio/unit/_common.py +++ b/src/python/grpcio_tests/tests_aio/unit/_common.py @@ -12,10 +12,13 @@ # See the License for the specific language governing permissions and # limitations under the License. +import asyncio import grpc from grpc.experimental import aio from grpc.experimental.aio._typing import MetadataType, MetadatumType +from tests.unit.framework.common import test_constants + def seen_metadata(expected: MetadataType, actual: MetadataType): return not bool(set(expected) - set(actual)) @@ -32,3 +35,31 @@ async def block_until_certain_state(channel: aio.Channel, while state != expected_state: await channel.wait_for_state_change(state) state = channel.get_state() + +def inject_callbacks(call): + first_callback_ran = asyncio.Event() + + def first_callback(call): + # Validate that all resopnses have been received + # and the call is an end state. + assert call.done() + first_callback_ran.set() + + second_callback_ran = asyncio.Event() + + def second_callback(call): + # Validate that all resopnses have been received + # and the call is an end state. + assert call.done() + second_callback_ran.set() + + call.add_done_callback(first_callback) + call.add_done_callback(second_callback) + + async def validation(): + await asyncio.wait_for( + asyncio.gather(first_callback_ran.wait(), + second_callback_ran.wait()), + test_constants.SHORT_TIMEOUT) + + return validation() diff --git a/src/python/grpcio_tests/tests_aio/unit/client_unary_stream_interceptor_test.py b/src/python/grpcio_tests/tests_aio/unit/client_unary_stream_interceptor_test.py index 3de4d054469..fc9c8d81ad0 100644 --- a/src/python/grpcio_tests/tests_aio/unit/client_unary_stream_interceptor_test.py +++ b/src/python/grpcio_tests/tests_aio/unit/client_unary_stream_interceptor_test.py @@ -1,4 +1,4 @@ -# Copyright 2019 The gRPC Authors. +# Copyright 2020 The gRPC Authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -20,67 +20,34 @@ import grpc from grpc.experimental import aio from tests_aio.unit._constants import UNREACHABLE_TARGET +from tests_aio.unit._common import inject_callbacks from tests_aio.unit._test_server import start_test_server from tests_aio.unit._test_base import AioTestBase from tests.unit.framework.common import test_constants from src.proto.grpc.testing import messages_pb2, test_pb2_grpc -_SHORT_TIMEOUT_S = datetime.timedelta(seconds=1).total_seconds() +_SHORT_TIMEOUT_S = 1.0 -_LOCAL_CANCEL_DETAILS_EXPECTATION = 'Locally cancelled by application!' _NUM_STREAM_RESPONSES = 5 _REQUEST_PAYLOAD_SIZE = 7 _RESPONSE_PAYLOAD_SIZE = 7 _RESPONSE_INTERVAL_US = int(_SHORT_TIMEOUT_S * 1000 * 1000) -class _ResponseIterator: +class _CountingResponseIterator: def __init__(self, response_iterator): - self._response_cnt = 0 + self.response_cnt = 0 self._response_iterator = response_iterator async def _forward_responses(self): async for response in self._response_iterator: - self._response_cnt += 1 + self.response_cnt += 1 yield response def __aiter__(self): return self._forward_responses() - @property - def response_cnt(self): - return self._response_cnt - - -def _inject_callbacks(call): - first_callback_ran = asyncio.Event() - - def first_callback(call): - # Validate that all resopnses have been received - # and the call is an end state. - assert call.done() - first_callback_ran.set() - - second_callback_ran = asyncio.Event() - - def second_callback(call): - # Validate that all resopnses have been received - # and the call is an end state. - assert call.done() - second_callback_ran.set() - - call.add_done_callback(first_callback) - call.add_done_callback(second_callback) - - async def validation(): - await asyncio.wait_for( - asyncio.gather(first_callback_ran.wait(), - second_callback_ran.wait()), - test_constants.SHORT_TIMEOUT) - - return validation() - class _UnaryStreamInterceptorEmpty(aio.UnaryStreamClientInterceptor): @@ -89,7 +56,7 @@ class _UnaryStreamInterceptorEmpty(aio.UnaryStreamClientInterceptor): return await continuation(client_call_details, request) -class _UnaryStreamInterceptorWith_ResponseIterator( +class _UnaryStreamInterceptorWithResponseIterator( aio.UnaryStreamClientInterceptor): def __init__(self): @@ -98,7 +65,7 @@ class _UnaryStreamInterceptorWith_ResponseIterator( async def intercept_unary_stream(self, continuation, client_call_details, request): call = await continuation(client_call_details, request) - self.response_iterator = _ResponseIterator(call) + self.response_iterator = _CountingResponseIterator(call) return self.response_iterator @@ -112,16 +79,15 @@ class TestUnaryStreamClientInterceptor(AioTestBase): async def test_intercepts(self): for interceptor_class in (_UnaryStreamInterceptorEmpty, - _UnaryStreamInterceptorWith_ResponseIterator): + _UnaryStreamInterceptorWithResponseIterator): with self.subTest(name=interceptor_class): interceptor = interceptor_class() request = messages_pb2.StreamingOutputCallRequest() - for _ in range(_NUM_STREAM_RESPONSES): - request.response_parameters.append( - messages_pb2.ResponseParameters( - size=_RESPONSE_PAYLOAD_SIZE)) + request.response_parameters.extend([ + messages_pb2.ResponseParameters( + size=_RESPONSE_PAYLOAD_SIZE)] * _NUM_STREAM_RESPONSES) channel = aio.insecure_channel(self._server_target, interceptors=[interceptor]) @@ -138,7 +104,7 @@ class TestUnaryStreamClientInterceptor(AioTestBase): self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) - self.assertTrue(response_cnt, _NUM_STREAM_RESPONSES) + self.assertEqual(response_cnt, _NUM_STREAM_RESPONSES) self.assertEqual(await call.code(), grpc.StatusCode.OK) self.assertEqual(await call.initial_metadata(), ()) self.assertEqual(await call.trailing_metadata(), ()) @@ -148,31 +114,30 @@ class TestUnaryStreamClientInterceptor(AioTestBase): self.assertEqual(call.cancelled(), False) self.assertEqual(call.done(), True) - if interceptor_class == _UnaryStreamInterceptorWith_ResponseIterator: - self.assertTrue(interceptor.response_iterator.response_cnt, + if interceptor_class == _UnaryStreamInterceptorWithResponseIterator: + self.assertEqual(interceptor.response_iterator.response_cnt, _NUM_STREAM_RESPONSES) await channel.close() - async def test_add_done_callback(self): + async def test_add_done_callback_interceptor_task_not_finished(self): for interceptor_class in (_UnaryStreamInterceptorEmpty, - _UnaryStreamInterceptorWith_ResponseIterator): + _UnaryStreamInterceptorWithResponseIterator): with self.subTest(name=interceptor_class): interceptor = interceptor_class() request = messages_pb2.StreamingOutputCallRequest() - for _ in range(_NUM_STREAM_RESPONSES): - request.response_parameters.append( - messages_pb2.ResponseParameters( - size=_RESPONSE_PAYLOAD_SIZE)) + request.response_parameters.extend([ + messages_pb2.ResponseParameters( + size=_RESPONSE_PAYLOAD_SIZE)] * _NUM_STREAM_RESPONSES) channel = aio.insecure_channel(self._server_target, interceptors=[interceptor]) stub = test_pb2_grpc.TestServiceStub(channel) call = stub.StreamingOutputCall(request) - validation = _inject_callbacks(call) + validation = inject_callbacks(call) async for response in call: pass @@ -181,18 +146,17 @@ class TestUnaryStreamClientInterceptor(AioTestBase): await channel.close() - async def test_add_done_callback_after_connection(self): + async def test_add_done_callback_interceptor_task_finished(self): for interceptor_class in (_UnaryStreamInterceptorEmpty, - _UnaryStreamInterceptorWith_ResponseIterator): + _UnaryStreamInterceptorWithResponseIterator): with self.subTest(name=interceptor_class): interceptor = interceptor_class() request = messages_pb2.StreamingOutputCallRequest() - for _ in range(_NUM_STREAM_RESPONSES): - request.response_parameters.append( - messages_pb2.ResponseParameters( - size=_RESPONSE_PAYLOAD_SIZE)) + request.response_parameters.extend([ + messages_pb2.ResponseParameters( + size=_RESPONSE_PAYLOAD_SIZE)] * _NUM_STREAM_RESPONSES) channel = aio.insecure_channel(self._server_target, interceptors=[interceptor]) @@ -204,7 +168,7 @@ class TestUnaryStreamClientInterceptor(AioTestBase): # pending state list. await call.wait_for_connection() - validation = _inject_callbacks(call) + validation = inject_callbacks(call) async for response in call: pass @@ -214,16 +178,16 @@ class TestUnaryStreamClientInterceptor(AioTestBase): await channel.close() async def test_response_iterator_using_read(self): - interceptor = _UnaryStreamInterceptorWith_ResponseIterator() + interceptor = _UnaryStreamInterceptorWithResponseIterator() channel = aio.insecure_channel(self._server_target, interceptors=[interceptor]) stub = test_pb2_grpc.TestServiceStub(channel) request = messages_pb2.StreamingOutputCallRequest() - for _ in range(_NUM_STREAM_RESPONSES): - request.response_parameters.append( - messages_pb2.ResponseParameters(size=_RESPONSE_PAYLOAD_SIZE)) + request.response_parameters.extend([ + messages_pb2.ResponseParameters( + size=_RESPONSE_PAYLOAD_SIZE)] * _NUM_STREAM_RESPONSES) call = stub.StreamingOutputCall(request) @@ -235,16 +199,16 @@ class TestUnaryStreamClientInterceptor(AioTestBase): messages_pb2.StreamingOutputCallResponse) self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) - self.assertTrue(response_cnt, _NUM_STREAM_RESPONSES) - self.assertTrue(interceptor.response_iterator.response_cnt, + self.assertEqual(response_cnt, _NUM_STREAM_RESPONSES) + self.assertEqual(interceptor.response_iterator.response_cnt, _NUM_STREAM_RESPONSES) self.assertEqual(await call.code(), grpc.StatusCode.OK) await channel.close() - async def test_mulitple_interceptors_response_iterator(self): + async def test_multiple_interceptors_response_iterator(self): for interceptor_class in (_UnaryStreamInterceptorEmpty, - _UnaryStreamInterceptorWith_ResponseIterator): + _UnaryStreamInterceptorWithResponseIterator): with self.subTest(name=interceptor_class): @@ -255,10 +219,9 @@ class TestUnaryStreamClientInterceptor(AioTestBase): stub = test_pb2_grpc.TestServiceStub(channel) request = messages_pb2.StreamingOutputCallRequest() - for _ in range(_NUM_STREAM_RESPONSES): - request.response_parameters.append( - messages_pb2.ResponseParameters( - size=_RESPONSE_PAYLOAD_SIZE)) + request.response_parameters.extend([ + messages_pb2.ResponseParameters( + size=_RESPONSE_PAYLOAD_SIZE)] * _NUM_STREAM_RESPONSES) call = stub.StreamingOutputCall(request) @@ -270,14 +233,14 @@ class TestUnaryStreamClientInterceptor(AioTestBase): self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) - self.assertTrue(response_cnt, _NUM_STREAM_RESPONSES) + self.assertEqual(response_cnt, _NUM_STREAM_RESPONSES) self.assertEqual(await call.code(), grpc.StatusCode.OK) await channel.close() async def test_intercepts_response_iterator_rpc_error(self): for interceptor_class in (_UnaryStreamInterceptorEmpty, - _UnaryStreamInterceptorWith_ResponseIterator): + _UnaryStreamInterceptorWithResponseIterator): with self.subTest(name=interceptor_class): @@ -329,8 +292,6 @@ class TestUnaryStreamClientInterceptor(AioTestBase): self.assertTrue(call.cancelled()) self.assertTrue(call.done()) self.assertEqual(await call.code(), grpc.StatusCode.CANCELLED) - self.assertEqual(await call.details(), - _LOCAL_CANCEL_DETAILS_EXPECTATION) self.assertEqual(await call.initial_metadata(), None) self.assertEqual(await call.trailing_metadata(), None) await channel.close() @@ -367,23 +328,19 @@ class TestUnaryStreamClientInterceptor(AioTestBase): self.assertTrue(call.cancelled()) self.assertTrue(call.done()) self.assertEqual(await call.code(), grpc.StatusCode.CANCELLED) - self.assertEqual(await call.details(), - _LOCAL_CANCEL_DETAILS_EXPECTATION) self.assertEqual(await call.initial_metadata(), None) self.assertEqual(await call.trailing_metadata(), None) await channel.close() async def test_cancel_consuming_response_iterator(self): request = messages_pb2.StreamingOutputCallRequest() - for _ in range(_NUM_STREAM_RESPONSES): - request.response_parameters.append( - messages_pb2.ResponseParameters( - size=_RESPONSE_PAYLOAD_SIZE, - interval_us=_RESPONSE_INTERVAL_US)) + request.response_parameters.extend([ + messages_pb2.ResponseParameters( + size=_RESPONSE_PAYLOAD_SIZE)] * _NUM_STREAM_RESPONSES) channel = aio.insecure_channel( self._server_target, - interceptors=[_UnaryStreamInterceptorWith_ResponseIterator()]) + interceptors=[_UnaryStreamInterceptorWithResponseIterator()]) stub = test_pb2_grpc.TestServiceStub(channel) call = stub.StreamingOutputCall(request) @@ -394,10 +351,57 @@ class TestUnaryStreamClientInterceptor(AioTestBase): self.assertTrue(call.cancelled()) self.assertTrue(call.done()) self.assertEqual(await call.code(), grpc.StatusCode.CANCELLED) - self.assertEqual(await call.details(), - _LOCAL_CANCEL_DETAILS_EXPECTATION) await channel.close() + async def test_cancel_by_the_interceptor(self): + + class Interceptor(aio.UnaryStreamClientInterceptor): + + async def intercept_unary_stream(self, continuation, + client_call_details, request): + call = await continuation(client_call_details, request) + call.cancel() + return call + + channel = aio.insecure_channel(UNREACHABLE_TARGET, + interceptors=[Interceptor()]) + request = messages_pb2.StreamingOutputCallRequest() + stub = test_pb2_grpc.TestServiceStub(channel) + call = stub.StreamingOutputCall(request) + + with self.assertRaises(asyncio.CancelledError): + async for response in call: + pass + + self.assertTrue(call.cancelled()) + self.assertTrue(call.done()) + self.assertEqual(await call.code(), grpc.StatusCode.CANCELLED) + await channel.close() + + async def test_exception_raised_by_interceptor(self): + + class InterceptorException(Exception): + pass + + class Interceptor(aio.UnaryStreamClientInterceptor): + + async def intercept_unary_stream(self, continuation, + client_call_details, request): + raise InterceptorException + + channel = aio.insecure_channel(UNREACHABLE_TARGET, + interceptors=[Interceptor()]) + request = messages_pb2.StreamingOutputCallRequest() + stub = test_pb2_grpc.TestServiceStub(channel) + call = stub.StreamingOutputCall(request) + + with self.assertRaises(InterceptorException): + async for response in call: + pass + + await channel.close() + + if __name__ == '__main__': logging.basicConfig(level=logging.DEBUG) diff --git a/src/python/grpcio_tests/tests_aio/unit/done_callback_test.py b/src/python/grpcio_tests/tests_aio/unit/done_callback_test.py index a312e45711f..d4adf965512 100644 --- a/src/python/grpcio_tests/tests_aio/unit/done_callback_test.py +++ b/src/python/grpcio_tests/tests_aio/unit/done_callback_test.py @@ -21,6 +21,7 @@ import gc import grpc from grpc.experimental import aio +from tests_aio.unit._common import inject_callbacks from tests_aio.unit._test_base import AioTestBase from tests.unit.framework.common import test_constants from src.proto.grpc.testing import messages_pb2, test_pb2_grpc @@ -31,29 +32,6 @@ _REQUEST_PAYLOAD_SIZE = 7 _RESPONSE_PAYLOAD_SIZE = 42 -def _inject_callbacks(call): - first_callback_ran = asyncio.Event() - - def first_callback(unused_call): - first_callback_ran.set() - - second_callback_ran = asyncio.Event() - - def second_callback(unused_call): - second_callback_ran.set() - - call.add_done_callback(first_callback) - call.add_done_callback(second_callback) - - async def validation(): - await asyncio.wait_for( - asyncio.gather(first_callback_ran.wait(), - second_callback_ran.wait()), - test_constants.SHORT_TIMEOUT) - - return validation() - - class TestDoneCallback(AioTestBase): async def setUp(self): From f07e0da6dd5ef1e9a634b67714eaf342984b3022 Mon Sep 17 00:00:00 2001 From: Pau Freixes Date: Mon, 20 Apr 2020 23:25:59 +0200 Subject: [PATCH 555/758] Make YAPF happy --- .../grpcio/grpc/experimental/aio/_channel.py | 15 +++++---- .../grpc/experimental/aio/_interceptor.py | 21 ++++++------ .../grpcio_tests/tests_aio/unit/_common.py | 1 + .../client_unary_stream_interceptor_test.py | 33 +++++++++---------- 4 files changed, 36 insertions(+), 34 deletions(-) diff --git a/src/python/grpcio/grpc/experimental/aio/_channel.py b/src/python/grpcio/grpc/experimental/aio/_channel.py index f783999dd2a..edd956b973a 100644 --- a/src/python/grpcio/grpc/experimental/aio/_channel.py +++ b/src/python/grpcio/grpc/experimental/aio/_channel.py @@ -224,16 +224,17 @@ class Channel(_base_channel.Channel): self._unary_stream_interceptors = [] if interceptors: - attrs_and_interceptor_classes = ( - (self._unary_unary_interceptors, UnaryUnaryClientInterceptor), - (self._unary_stream_interceptors, UnaryStreamClientInterceptor) - ) + attrs_and_interceptor_classes = ((self._unary_unary_interceptors, + UnaryUnaryClientInterceptor), + (self._unary_stream_interceptors, + UnaryStreamClientInterceptor)) # pylint: disable=cell-var-from-loop for attr, interceptor_class in attrs_and_interceptor_classes: - attr.extend( - [interceptor for interceptor in interceptors if isinstance(interceptor, interceptor_class)] - ) + attr.extend([ + interceptor for interceptor in interceptors + if isinstance(interceptor, interceptor_class) + ]) invalid_interceptors = set(interceptors) - set( self._unary_unary_interceptors) - set( diff --git a/src/python/grpcio/grpc/experimental/aio/_interceptor.py b/src/python/grpcio/grpc/experimental/aio/_interceptor.py index 469585de51a..80d17e04ce9 100644 --- a/src/python/grpcio/grpc/experimental/aio/_interceptor.py +++ b/src/python/grpcio/grpc/experimental/aio/_interceptor.py @@ -125,10 +125,11 @@ class UnaryStreamClientInterceptor(ClientInterceptor, metaclass=ABCMeta): """Affords intercepting unary-stream invocations.""" @abstractmethod - async def intercept_unary_stream(self, continuation: Callable[[ - ClientCallDetails, RequestType], UnaryStreamCall], - client_call_details: ClientCallDetails, - request: RequestType) -> Union[AsyncIterable[ResponseType], UnaryStreamCall]: + async def intercept_unary_stream( + self, continuation: Callable[[ClientCallDetails, RequestType], + UnaryStreamCall], + client_call_details: ClientCallDetails, request: RequestType + ) -> Union[AsyncIterable[ResponseType], UnaryStreamCall]: """Intercepts a unary-stream invocation asynchronously. Args: @@ -186,8 +187,8 @@ class InterceptedCall: self.cancel() def _fire_or_add_pending_done_callbacks(self, - interceptors_task: asyncio.Task - ) -> None: + interceptors_task: asyncio.Task + ) -> None: if not self._pending_add_done_callbacks: return @@ -449,7 +450,6 @@ class InterceptedUnaryStreamCall(InterceptedCall, _base_call.UnaryStreamCall): ) -> UnaryStreamCall: """Run the RPC call wrapped in interceptors""" - async def _run_interceptor( interceptors: Iterator[UnaryStreamClientInterceptor], client_call_details: ClientCallDetails, @@ -464,12 +464,13 @@ class InterceptedUnaryStreamCall(InterceptedCall, _base_call.UnaryStreamCall): call_or_response_iterator = await interceptor.intercept_unary_stream( continuation, client_call_details, request) - if isinstance(call_or_response_iterator, _base_call.UnaryUnaryCall): + if isinstance(call_or_response_iterator, + _base_call.UnaryUnaryCall): self._last_returned_call_from_interceptors = call_or_response_iterator else: self._last_returned_call_from_interceptors = UnaryStreamCallResponseIterator( - self._last_returned_call_from_interceptors, - call_or_response_iterator) + self._last_returned_call_from_interceptors, + call_or_response_iterator) return self._last_returned_call_from_interceptors else: self._last_returned_call_from_interceptors = UnaryStreamCall( diff --git a/src/python/grpcio_tests/tests_aio/unit/_common.py b/src/python/grpcio_tests/tests_aio/unit/_common.py index e820a18dd77..97cbe759ed0 100644 --- a/src/python/grpcio_tests/tests_aio/unit/_common.py +++ b/src/python/grpcio_tests/tests_aio/unit/_common.py @@ -36,6 +36,7 @@ async def block_until_certain_state(channel: aio.Channel, await channel.wait_for_state_change(state) state = channel.get_state() + def inject_callbacks(call): first_callback_ran = asyncio.Event() diff --git a/src/python/grpcio_tests/tests_aio/unit/client_unary_stream_interceptor_test.py b/src/python/grpcio_tests/tests_aio/unit/client_unary_stream_interceptor_test.py index fc9c8d81ad0..3d14b496a8a 100644 --- a/src/python/grpcio_tests/tests_aio/unit/client_unary_stream_interceptor_test.py +++ b/src/python/grpcio_tests/tests_aio/unit/client_unary_stream_interceptor_test.py @@ -86,8 +86,8 @@ class TestUnaryStreamClientInterceptor(AioTestBase): request = messages_pb2.StreamingOutputCallRequest() request.response_parameters.extend([ - messages_pb2.ResponseParameters( - size=_RESPONSE_PAYLOAD_SIZE)] * _NUM_STREAM_RESPONSES) + messages_pb2.ResponseParameters(size=_RESPONSE_PAYLOAD_SIZE) + ] * _NUM_STREAM_RESPONSES) channel = aio.insecure_channel(self._server_target, interceptors=[interceptor]) @@ -116,7 +116,7 @@ class TestUnaryStreamClientInterceptor(AioTestBase): if interceptor_class == _UnaryStreamInterceptorWithResponseIterator: self.assertEqual(interceptor.response_iterator.response_cnt, - _NUM_STREAM_RESPONSES) + _NUM_STREAM_RESPONSES) await channel.close() @@ -129,8 +129,8 @@ class TestUnaryStreamClientInterceptor(AioTestBase): request = messages_pb2.StreamingOutputCallRequest() request.response_parameters.extend([ - messages_pb2.ResponseParameters( - size=_RESPONSE_PAYLOAD_SIZE)] * _NUM_STREAM_RESPONSES) + messages_pb2.ResponseParameters(size=_RESPONSE_PAYLOAD_SIZE) + ] * _NUM_STREAM_RESPONSES) channel = aio.insecure_channel(self._server_target, interceptors=[interceptor]) @@ -155,8 +155,8 @@ class TestUnaryStreamClientInterceptor(AioTestBase): request = messages_pb2.StreamingOutputCallRequest() request.response_parameters.extend([ - messages_pb2.ResponseParameters( - size=_RESPONSE_PAYLOAD_SIZE)] * _NUM_STREAM_RESPONSES) + messages_pb2.ResponseParameters(size=_RESPONSE_PAYLOAD_SIZE) + ] * _NUM_STREAM_RESPONSES) channel = aio.insecure_channel(self._server_target, interceptors=[interceptor]) @@ -185,9 +185,9 @@ class TestUnaryStreamClientInterceptor(AioTestBase): stub = test_pb2_grpc.TestServiceStub(channel) request = messages_pb2.StreamingOutputCallRequest() - request.response_parameters.extend([ - messages_pb2.ResponseParameters( - size=_RESPONSE_PAYLOAD_SIZE)] * _NUM_STREAM_RESPONSES) + request.response_parameters.extend( + [messages_pb2.ResponseParameters(size=_RESPONSE_PAYLOAD_SIZE)] * + _NUM_STREAM_RESPONSES) call = stub.StreamingOutputCall(request) @@ -201,7 +201,7 @@ class TestUnaryStreamClientInterceptor(AioTestBase): self.assertEqual(response_cnt, _NUM_STREAM_RESPONSES) self.assertEqual(interceptor.response_iterator.response_cnt, - _NUM_STREAM_RESPONSES) + _NUM_STREAM_RESPONSES) self.assertEqual(await call.code(), grpc.StatusCode.OK) await channel.close() @@ -220,8 +220,8 @@ class TestUnaryStreamClientInterceptor(AioTestBase): request = messages_pb2.StreamingOutputCallRequest() request.response_parameters.extend([ - messages_pb2.ResponseParameters( - size=_RESPONSE_PAYLOAD_SIZE)] * _NUM_STREAM_RESPONSES) + messages_pb2.ResponseParameters(size=_RESPONSE_PAYLOAD_SIZE) + ] * _NUM_STREAM_RESPONSES) call = stub.StreamingOutputCall(request) @@ -334,9 +334,9 @@ class TestUnaryStreamClientInterceptor(AioTestBase): async def test_cancel_consuming_response_iterator(self): request = messages_pb2.StreamingOutputCallRequest() - request.response_parameters.extend([ - messages_pb2.ResponseParameters( - size=_RESPONSE_PAYLOAD_SIZE)] * _NUM_STREAM_RESPONSES) + request.response_parameters.extend( + [messages_pb2.ResponseParameters(size=_RESPONSE_PAYLOAD_SIZE)] * + _NUM_STREAM_RESPONSES) channel = aio.insecure_channel( self._server_target, @@ -402,7 +402,6 @@ class TestUnaryStreamClientInterceptor(AioTestBase): await channel.close() - if __name__ == '__main__': logging.basicConfig(level=logging.DEBUG) unittest.main(verbosity=2) From 314e105f709a907c0fe35546c0764cc2cff9fb0d Mon Sep 17 00:00:00 2001 From: Pau Freixes Date: Mon, 20 Apr 2020 23:39:53 +0200 Subject: [PATCH 556/758] Apply review feedback --- .../unit/client_unary_stream_interceptor_test.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/python/grpcio_tests/tests_aio/unit/client_unary_stream_interceptor_test.py b/src/python/grpcio_tests/tests_aio/unit/client_unary_stream_interceptor_test.py index 3d14b496a8a..cd4ed47010b 100644 --- a/src/python/grpcio_tests/tests_aio/unit/client_unary_stream_interceptor_test.py +++ b/src/python/grpcio_tests/tests_aio/unit/client_unary_stream_interceptor_test.py @@ -55,6 +55,9 @@ class _UnaryStreamInterceptorEmpty(aio.UnaryStreamClientInterceptor): request): return await continuation(client_call_details, request) + def assert_in_final_state(self, test: unittest.TestCase): + pass + class _UnaryStreamInterceptorWithResponseIterator( aio.UnaryStreamClientInterceptor): @@ -68,6 +71,10 @@ class _UnaryStreamInterceptorWithResponseIterator( self.response_iterator = _CountingResponseIterator(call) return self.response_iterator + def assert_in_final_state(self, test: unittest.TestCase): + test.assertEqual(_NUM_STREAM_RESPONSES, + self.response_iterator.response_cnt) + class TestUnaryStreamClientInterceptor(AioTestBase): @@ -114,9 +121,7 @@ class TestUnaryStreamClientInterceptor(AioTestBase): self.assertEqual(call.cancelled(), False) self.assertEqual(call.done(), True) - if interceptor_class == _UnaryStreamInterceptorWithResponseIterator: - self.assertEqual(interceptor.response_iterator.response_cnt, - _NUM_STREAM_RESPONSES) + interceptor.assert_in_final_state(self) await channel.close() From a0613c2f9ff70794b66c0cc5d899d7a003230baf Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Mon, 20 Apr 2020 16:10:46 -0700 Subject: [PATCH 557/758] Drop commands about Python 3.4 in manylinux2010 Dockerfile --- .../dockerfile/grpc_artifact_python_manylinux2010_x64/Dockerfile | 1 - .../dockerfile/grpc_artifact_python_manylinux2010_x86/Dockerfile | 1 - 2 files changed, 2 deletions(-) diff --git a/tools/dockerfile/grpc_artifact_python_manylinux2010_x64/Dockerfile b/tools/dockerfile/grpc_artifact_python_manylinux2010_x64/Dockerfile index 4d80a33eee4..1bb658b8e42 100644 --- a/tools/dockerfile/grpc_artifact_python_manylinux2010_x64/Dockerfile +++ b/tools/dockerfile/grpc_artifact_python_manylinux2010_x64/Dockerfile @@ -24,7 +24,6 @@ RUN yum install -y curl-devel expat-devel gettext-devel linux-headers openssl-de # Install Python build requirements RUN /opt/python/cp27-cp27m/bin/pip install --upgrade cython RUN /opt/python/cp27-cp27mu/bin/pip install --upgrade cython -RUN /opt/python/cp34-cp34m/bin/pip install --upgrade cython RUN /opt/python/cp35-cp35m/bin/pip install --upgrade cython RUN /opt/python/cp36-cp36m/bin/pip install --upgrade cython RUN /opt/python/cp37-cp37m/bin/pip install --upgrade cython diff --git a/tools/dockerfile/grpc_artifact_python_manylinux2010_x86/Dockerfile b/tools/dockerfile/grpc_artifact_python_manylinux2010_x86/Dockerfile index 324f64f3fff..61c901e2f9c 100644 --- a/tools/dockerfile/grpc_artifact_python_manylinux2010_x86/Dockerfile +++ b/tools/dockerfile/grpc_artifact_python_manylinux2010_x86/Dockerfile @@ -24,7 +24,6 @@ RUN yum install -y curl-devel expat-devel gettext-devel linux-headers openssl-de # Install Python build requirements RUN /opt/python/cp27-cp27m/bin/pip install --upgrade cython RUN /opt/python/cp27-cp27mu/bin/pip install --upgrade cython -RUN /opt/python/cp34-cp34m/bin/pip install --upgrade cython RUN /opt/python/cp35-cp35m/bin/pip install --upgrade cython RUN /opt/python/cp36-cp36m/bin/pip install --upgrade cython RUN /opt/python/cp37-cp37m/bin/pip install --upgrade cython From 682c28eb4249d7b8367b5ac787b1b70c27ea88ef Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Mon, 20 Apr 2020 16:30:47 -0700 Subject: [PATCH 558/758] Drop 3.4 from setup.py --- setup.py | 365 +++++++++++++++++++++++++++++-------------------------- 1 file changed, 193 insertions(+), 172 deletions(-) diff --git a/setup.py b/setup.py index a1562c76a87..2379703eb7d 100644 --- a/setup.py +++ b/setup.py @@ -11,7 +11,6 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. - """A setup module for the GRPC Python package.""" from distutils import cygwinccompiler from distutils import extension as _extension @@ -37,23 +36,30 @@ egg_info.manifest_maker.template = 'PYTHON-MANIFEST.in' PY3 = sys.version_info.major == 3 PYTHON_STEM = os.path.join('src', 'python', 'grpcio') -CORE_INCLUDE = ('include', '.',) +CORE_INCLUDE = ( + 'include', + '.', +) ABSL_INCLUDE = (os.path.join('third_party', 'abseil-cpp'),) -ADDRESS_SORTING_INCLUDE = (os.path.join('third_party', 'address_sorting', 'include'),) +ADDRESS_SORTING_INCLUDE = (os.path.join('third_party', 'address_sorting', + 'include'),) CARES_INCLUDE = ( os.path.join('third_party', 'cares'), - os.path.join('third_party', 'cares', 'cares'),) + os.path.join('third_party', 'cares', 'cares'), +) if 'darwin' in sys.platform: - CARES_INCLUDE += (os.path.join('third_party', 'cares', 'config_darwin'),) + CARES_INCLUDE += (os.path.join('third_party', 'cares', 'config_darwin'),) if 'freebsd' in sys.platform: - CARES_INCLUDE += (os.path.join('third_party', 'cares', 'config_freebsd'),) + CARES_INCLUDE += (os.path.join('third_party', 'cares', 'config_freebsd'),) if 'linux' in sys.platform: - CARES_INCLUDE += (os.path.join('third_party', 'cares', 'config_linux'),) + CARES_INCLUDE += (os.path.join('third_party', 'cares', 'config_linux'),) if 'openbsd' in sys.platform: - CARES_INCLUDE += (os.path.join('third_party', 'cares', 'config_openbsd'),) -SSL_INCLUDE = (os.path.join('third_party', 'boringssl-with-bazel', 'src', 'include'),) + CARES_INCLUDE += (os.path.join('third_party', 'cares', 'config_openbsd'),) +SSL_INCLUDE = (os.path.join('third_party', 'boringssl-with-bazel', 'src', + 'include'),) UPB_INCLUDE = (os.path.join('third_party', 'upb'),) -UPB_GRPC_GENERATED_INCLUDE = (os.path.join('src', 'core', 'ext', 'upb-generated'),) +UPB_GRPC_GENERATED_INCLUDE = (os.path.join('src', 'core', 'ext', + 'upb-generated'),) ZLIB_INCLUDE = (os.path.join('third_party', 'zlib'),) README = os.path.join(PYTHON_STEM, 'README.rst') @@ -79,7 +85,6 @@ CLASSIFIERS = [ 'Programming Language :: Python :: 2', 'Programming Language :: Python :: 2.7', 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.4', 'Programming Language :: Python :: 3.5', 'Programming Language :: Python :: 3.6', 'Programming Language :: Python :: 3.7', @@ -94,7 +99,6 @@ CLASSIFIERS = [ # present, then it will still attempt to use Cython. BUILD_WITH_CYTHON = os.environ.get('GRPC_PYTHON_BUILD_WITH_CYTHON', False) - # Export this variable to use the system installation of openssl. You need to # have the header files installed (in /usr/include/openssl) and during # runtime, the shared library must be installed @@ -104,8 +108,7 @@ BUILD_WITH_SYSTEM_OPENSSL = os.environ.get('GRPC_PYTHON_BUILD_SYSTEM_OPENSSL', # Export this variable to use the system installation of zlib. You need to # have the header files installed (in /usr/include/) and during # runtime, the shared library must be installed -BUILD_WITH_SYSTEM_ZLIB = os.environ.get('GRPC_PYTHON_BUILD_SYSTEM_ZLIB', - False) +BUILD_WITH_SYSTEM_ZLIB = os.environ.get('GRPC_PYTHON_BUILD_SYSTEM_ZLIB', False) # Export this variable to use the system installation of cares. You need to # have the header files installed (in /usr/include/) and during @@ -124,34 +127,36 @@ BUILD_WITH_SYSTEM_CARES = os.environ.get('GRPC_PYTHON_BUILD_SYSTEM_CARES', # make HAS_SYSTEM_OPENSSL_ALPN=0 # # TODO(ericgribkoff) Respect the BUILD_WITH_SYSTEM_* flags alongside this option -USE_PREBUILT_GRPC_CORE = os.environ.get( - 'GRPC_PYTHON_USE_PREBUILT_GRPC_CORE', False) - +USE_PREBUILT_GRPC_CORE = os.environ.get('GRPC_PYTHON_USE_PREBUILT_GRPC_CORE', + False) # If this environmental variable is set, GRPC will not try to be compatible with # libc versions old than the one it was compiled against. -DISABLE_LIBC_COMPATIBILITY = os.environ.get('GRPC_PYTHON_DISABLE_LIBC_COMPATIBILITY', False) +DISABLE_LIBC_COMPATIBILITY = os.environ.get( + 'GRPC_PYTHON_DISABLE_LIBC_COMPATIBILITY', False) # Environment variable to determine whether or not to enable coverage analysis # in Cython modules. -ENABLE_CYTHON_TRACING = os.environ.get( - 'GRPC_PYTHON_ENABLE_CYTHON_TRACING', False) +ENABLE_CYTHON_TRACING = os.environ.get('GRPC_PYTHON_ENABLE_CYTHON_TRACING', + False) # Environment variable specifying whether or not there's interest in setting up # documentation building. ENABLE_DOCUMENTATION_BUILD = os.environ.get( 'GRPC_PYTHON_ENABLE_DOCUMENTATION_BUILD', False) + def check_linker_need_libatomic(): - """Test if linker on system needs libatomic.""" - code_test = (b'#include \n' + - b'int main() { return std::atomic{}; }') - cc_test = subprocess.Popen(['cc', '-x', 'c++', '-std=c++11', '-'], - stdin=PIPE, - stdout=PIPE, - stderr=PIPE) - cc_test.communicate(input=code_test) - return cc_test.returncode != 0 + """Test if linker on system needs libatomic.""" + code_test = (b'#include \n' + + b'int main() { return std::atomic{}; }') + cc_test = subprocess.Popen(['cc', '-x', 'c++', '-std=c++11', '-'], + stdin=PIPE, + stdout=PIPE, + stderr=PIPE) + cc_test.communicate(input=code_test) + return cc_test.returncode != 0 + # There are some situations (like on Windows) where CC, CFLAGS, and LDFLAGS are # entirely ignored/dropped/forgotten by distutils and its Cygwin/MinGW support. @@ -163,40 +168,40 @@ def check_linker_need_libatomic(): EXTRA_ENV_COMPILE_ARGS = os.environ.get('GRPC_PYTHON_CFLAGS', None) EXTRA_ENV_LINK_ARGS = os.environ.get('GRPC_PYTHON_LDFLAGS', None) if EXTRA_ENV_COMPILE_ARGS is None: - EXTRA_ENV_COMPILE_ARGS = ' -std=c++11' - if 'win32' in sys.platform: - if sys.version_info < (3, 5): - EXTRA_ENV_COMPILE_ARGS += ' -D_hypot=hypot' - # We use define flags here and don't directly add to DEFINE_MACROS below to - # ensure that the expert user/builder has a way of turning it off (via the - # envvars) without adding yet more GRPC-specific envvars. - # See https://sourceforge.net/p/mingw-w64/bugs/363/ - if '32' in platform.architecture()[0]: - EXTRA_ENV_COMPILE_ARGS += ' -D_ftime=_ftime32 -D_timeb=__timeb32 -D_ftime_s=_ftime32_s' - else: - EXTRA_ENV_COMPILE_ARGS += ' -D_ftime=_ftime64 -D_timeb=__timeb64' - else: - # We need to statically link the C++ Runtime, only the C runtime is - # available dynamically - EXTRA_ENV_COMPILE_ARGS += ' /MT' - elif "linux" in sys.platform: - EXTRA_ENV_COMPILE_ARGS += ' -std=gnu99 -fvisibility=hidden -fno-wrapv -fno-exceptions' - elif "darwin" in sys.platform: - EXTRA_ENV_COMPILE_ARGS += ' -stdlib=libc++ -fvisibility=hidden -fno-wrapv -fno-exceptions' + EXTRA_ENV_COMPILE_ARGS = ' -std=c++11' + if 'win32' in sys.platform: + if sys.version_info < (3, 5): + EXTRA_ENV_COMPILE_ARGS += ' -D_hypot=hypot' + # We use define flags here and don't directly add to DEFINE_MACROS below to + # ensure that the expert user/builder has a way of turning it off (via the + # envvars) without adding yet more GRPC-specific envvars. + # See https://sourceforge.net/p/mingw-w64/bugs/363/ + if '32' in platform.architecture()[0]: + EXTRA_ENV_COMPILE_ARGS += ' -D_ftime=_ftime32 -D_timeb=__timeb32 -D_ftime_s=_ftime32_s' + else: + EXTRA_ENV_COMPILE_ARGS += ' -D_ftime=_ftime64 -D_timeb=__timeb64' + else: + # We need to statically link the C++ Runtime, only the C runtime is + # available dynamically + EXTRA_ENV_COMPILE_ARGS += ' /MT' + elif "linux" in sys.platform: + EXTRA_ENV_COMPILE_ARGS += ' -std=gnu99 -fvisibility=hidden -fno-wrapv -fno-exceptions' + elif "darwin" in sys.platform: + EXTRA_ENV_COMPILE_ARGS += ' -stdlib=libc++ -fvisibility=hidden -fno-wrapv -fno-exceptions' if EXTRA_ENV_LINK_ARGS is None: - EXTRA_ENV_LINK_ARGS = '' - if "linux" in sys.platform or "darwin" in sys.platform: - EXTRA_ENV_LINK_ARGS += ' -lpthread' - if check_linker_need_libatomic(): - EXTRA_ENV_LINK_ARGS += ' -latomic' - elif "win32" in sys.platform and sys.version_info < (3, 5): - msvcr = cygwinccompiler.get_msvcr()[0] - EXTRA_ENV_LINK_ARGS += ( - ' -static-libgcc -static-libstdc++ -mcrtdll={msvcr}' - ' -static -lshlwapi'.format(msvcr=msvcr)) - if "linux" in sys.platform: - EXTRA_ENV_LINK_ARGS += ' -Wl,-wrap,memcpy -static-libgcc' + EXTRA_ENV_LINK_ARGS = '' + if "linux" in sys.platform or "darwin" in sys.platform: + EXTRA_ENV_LINK_ARGS += ' -lpthread' + if check_linker_need_libatomic(): + EXTRA_ENV_LINK_ARGS += ' -latomic' + elif "win32" in sys.platform and sys.version_info < (3, 5): + msvcr = cygwinccompiler.get_msvcr()[0] + EXTRA_ENV_LINK_ARGS += ( + ' -static-libgcc -static-libstdc++ -mcrtdll={msvcr}' + ' -static -lshlwapi'.format(msvcr=msvcr)) + if "linux" in sys.platform: + EXTRA_ENV_LINK_ARGS += ' -Wl,-wrap,memcpy -static-libgcc' EXTRA_COMPILE_ARGS = shlex.split(EXTRA_ENV_COMPILE_ARGS) EXTRA_LINK_ARGS = shlex.split(EXTRA_ENV_LINK_ARGS) @@ -209,119 +214,135 @@ CYTHON_HELPER_C_FILES = () CORE_C_FILES = tuple(grpc_core_dependencies.CORE_SOURCE_FILES) if "win32" in sys.platform: - CORE_C_FILES = filter(lambda x: 'third_party/cares' not in x, CORE_C_FILES) + CORE_C_FILES = filter(lambda x: 'third_party/cares' not in x, CORE_C_FILES) if BUILD_WITH_SYSTEM_OPENSSL: - CORE_C_FILES = filter(lambda x: 'third_party/boringssl' not in x, CORE_C_FILES) - CORE_C_FILES = filter(lambda x: 'src/boringssl' not in x, CORE_C_FILES) - SSL_INCLUDE = (os.path.join('/usr', 'include', 'openssl'),) + CORE_C_FILES = filter(lambda x: 'third_party/boringssl' not in x, + CORE_C_FILES) + CORE_C_FILES = filter(lambda x: 'src/boringssl' not in x, CORE_C_FILES) + SSL_INCLUDE = (os.path.join('/usr', 'include', 'openssl'),) if BUILD_WITH_SYSTEM_ZLIB: - CORE_C_FILES = filter(lambda x: 'third_party/zlib' not in x, CORE_C_FILES) - ZLIB_INCLUDE = (os.path.join('/usr', 'include'),) + CORE_C_FILES = filter(lambda x: 'third_party/zlib' not in x, CORE_C_FILES) + ZLIB_INCLUDE = (os.path.join('/usr', 'include'),) if BUILD_WITH_SYSTEM_CARES: - CORE_C_FILES = filter(lambda x: 'third_party/cares' not in x, CORE_C_FILES) - CARES_INCLUDE = (os.path.join('/usr', 'include'),) - -EXTENSION_INCLUDE_DIRECTORIES = ( - (PYTHON_STEM,) + - CORE_INCLUDE + - ABSL_INCLUDE + - ADDRESS_SORTING_INCLUDE + - CARES_INCLUDE + - SSL_INCLUDE + - UPB_INCLUDE + - UPB_GRPC_GENERATED_INCLUDE + - ZLIB_INCLUDE) + CORE_C_FILES = filter(lambda x: 'third_party/cares' not in x, CORE_C_FILES) + CARES_INCLUDE = (os.path.join('/usr', 'include'),) + +EXTENSION_INCLUDE_DIRECTORIES = ((PYTHON_STEM,) + CORE_INCLUDE + ABSL_INCLUDE + + ADDRESS_SORTING_INCLUDE + CARES_INCLUDE + + SSL_INCLUDE + UPB_INCLUDE + + UPB_GRPC_GENERATED_INCLUDE + ZLIB_INCLUDE) EXTENSION_LIBRARIES = () if "linux" in sys.platform: - EXTENSION_LIBRARIES += ('rt',) + EXTENSION_LIBRARIES += ('rt',) if not "win32" in sys.platform: - EXTENSION_LIBRARIES += ('m',) + EXTENSION_LIBRARIES += ('m',) if "win32" in sys.platform: - EXTENSION_LIBRARIES += ('advapi32', 'ws2_32', 'dbghelp',) + EXTENSION_LIBRARIES += ( + 'advapi32', + 'ws2_32', + 'dbghelp', + ) if BUILD_WITH_SYSTEM_OPENSSL: - EXTENSION_LIBRARIES += ('ssl', 'crypto',) + EXTENSION_LIBRARIES += ( + 'ssl', + 'crypto', + ) if BUILD_WITH_SYSTEM_ZLIB: - EXTENSION_LIBRARIES += ('z',) + EXTENSION_LIBRARIES += ('z',) if BUILD_WITH_SYSTEM_CARES: - EXTENSION_LIBRARIES += ('cares',) + EXTENSION_LIBRARIES += ('cares',) DEFINE_MACROS = (('OPENSSL_NO_ASM', 1), ('_WIN32_WINNT', 0x600)) if not DISABLE_LIBC_COMPATIBILITY: - DEFINE_MACROS += (('GPR_BACKWARDS_COMPATIBILITY_MODE', 1),) + DEFINE_MACROS += (('GPR_BACKWARDS_COMPATIBILITY_MODE', 1),) if "win32" in sys.platform: - # TODO(zyc): Re-enable c-ares on x64 and x86 windows after fixing the - # ares_library_init compilation issue - DEFINE_MACROS += (('WIN32_LEAN_AND_MEAN', 1), ('CARES_STATICLIB', 1), - ('GRPC_ARES', 0), ('NTDDI_VERSION', 0x06000000), - ('NOMINMAX', 1),) - if '64bit' in platform.architecture()[0]: - DEFINE_MACROS += (('MS_WIN64', 1),) - elif sys.version_info >= (3, 5): - # For some reason, this is needed to get access to inet_pton/inet_ntop - # on msvc, but only for 32 bits - DEFINE_MACROS += (('NTDDI_VERSION', 0x06000000),) + # TODO(zyc): Re-enable c-ares on x64 and x86 windows after fixing the + # ares_library_init compilation issue + DEFINE_MACROS += ( + ('WIN32_LEAN_AND_MEAN', 1), + ('CARES_STATICLIB', 1), + ('GRPC_ARES', 0), + ('NTDDI_VERSION', 0x06000000), + ('NOMINMAX', 1), + ) + if '64bit' in platform.architecture()[0]: + DEFINE_MACROS += (('MS_WIN64', 1),) + elif sys.version_info >= (3, 5): + # For some reason, this is needed to get access to inet_pton/inet_ntop + # on msvc, but only for 32 bits + DEFINE_MACROS += (('NTDDI_VERSION', 0x06000000),) else: - DEFINE_MACROS += (('HAVE_CONFIG_H', 1), ('GRPC_ENABLE_FORK_SUPPORT', 1),) + DEFINE_MACROS += ( + ('HAVE_CONFIG_H', 1), + ('GRPC_ENABLE_FORK_SUPPORT', 1), + ) LDFLAGS = tuple(EXTRA_LINK_ARGS) CFLAGS = tuple(EXTRA_COMPILE_ARGS) if "linux" in sys.platform or "darwin" in sys.platform: - pymodinit_type = 'PyObject*' if PY3 else 'void' - pymodinit = 'extern "C" __attribute__((visibility ("default"))) {}'.format(pymodinit_type) - DEFINE_MACROS += (('PyMODINIT_FUNC', pymodinit),) - DEFINE_MACROS += (('GRPC_POSIX_FORK_ALLOW_PTHREAD_ATFORK', 1),) + pymodinit_type = 'PyObject*' if PY3 else 'void' + pymodinit = 'extern "C" __attribute__((visibility ("default"))) {}'.format( + pymodinit_type) + DEFINE_MACROS += (('PyMODINIT_FUNC', pymodinit),) + DEFINE_MACROS += (('GRPC_POSIX_FORK_ALLOW_PTHREAD_ATFORK', 1),) # By default, Python3 distutils enforces compatibility of # c plugins (.so files) with the OSX version Python3 was built with. # For Python3.4, this is OSX 10.6, but we need Thread Local Support (__thread) if 'darwin' in sys.platform and PY3: - mac_target = sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET') - if mac_target and (pkg_resources.parse_version(mac_target) < - pkg_resources.parse_version('10.7.0')): - os.environ['MACOSX_DEPLOYMENT_TARGET'] = '10.7' - os.environ['_PYTHON_HOST_PLATFORM'] = re.sub( - r'macosx-[0-9]+\.[0-9]+-(.+)', - r'macosx-10.7-\1', - util.get_platform()) + mac_target = sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET') + if mac_target and (pkg_resources.parse_version(mac_target) < + pkg_resources.parse_version('10.7.0')): + os.environ['MACOSX_DEPLOYMENT_TARGET'] = '10.7' + os.environ['_PYTHON_HOST_PLATFORM'] = re.sub( + r'macosx-[0-9]+\.[0-9]+-(.+)', r'macosx-10.7-\1', + util.get_platform()) def cython_extensions_and_necessity(): - cython_module_files = [os.path.join(PYTHON_STEM, - name.replace('.', '/') + '.pyx') - for name in CYTHON_EXTENSION_MODULE_NAMES] - config = os.environ.get('CONFIG', 'opt') - prefix = 'libs/' + config + '/' - if USE_PREBUILT_GRPC_CORE: - extra_objects = [prefix + 'libares.a', - prefix + 'libboringssl.a', - prefix + 'libgpr.a', - prefix + 'libgrpc.a'] - core_c_files = [] - else: - core_c_files = list(CORE_C_FILES) - extra_objects = [] - extensions = [ - _extension.Extension( - name=module_name, - sources=[module_file] + list(CYTHON_HELPER_C_FILES) + core_c_files, - include_dirs=list(EXTENSION_INCLUDE_DIRECTORIES), - libraries=list(EXTENSION_LIBRARIES), - define_macros=list(DEFINE_MACROS), - extra_objects=extra_objects, - extra_compile_args=list(CFLAGS), - extra_link_args=list(LDFLAGS), - ) for (module_name, module_file) in zip(list(CYTHON_EXTENSION_MODULE_NAMES), cython_module_files) - ] - need_cython = BUILD_WITH_CYTHON - if not BUILD_WITH_CYTHON: - need_cython = need_cython or not commands.check_and_update_cythonization(extensions) - # TODO: the strategy for conditional compiling and exposing the aio Cython - # dependencies will be revisited by https://github.com/grpc/grpc/issues/19728 - return commands.try_cythonize(extensions, linetracing=ENABLE_CYTHON_TRACING, mandatory=BUILD_WITH_CYTHON), need_cython + cython_module_files = [ + os.path.join(PYTHON_STEM, + name.replace('.', '/') + '.pyx') + for name in CYTHON_EXTENSION_MODULE_NAMES + ] + config = os.environ.get('CONFIG', 'opt') + prefix = 'libs/' + config + '/' + if USE_PREBUILT_GRPC_CORE: + extra_objects = [ + prefix + 'libares.a', prefix + 'libboringssl.a', + prefix + 'libgpr.a', prefix + 'libgrpc.a' + ] + core_c_files = [] + else: + core_c_files = list(CORE_C_FILES) + extra_objects = [] + extensions = [ + _extension.Extension( + name=module_name, + sources=[module_file] + list(CYTHON_HELPER_C_FILES) + core_c_files, + include_dirs=list(EXTENSION_INCLUDE_DIRECTORIES), + libraries=list(EXTENSION_LIBRARIES), + define_macros=list(DEFINE_MACROS), + extra_objects=extra_objects, + extra_compile_args=list(CFLAGS), + extra_link_args=list(LDFLAGS), + ) for (module_name, module_file + ) in zip(list(CYTHON_EXTENSION_MODULE_NAMES), cython_module_files) + ] + need_cython = BUILD_WITH_CYTHON + if not BUILD_WITH_CYTHON: + need_cython = need_cython or not commands.check_and_update_cythonization( + extensions) + # TODO: the strategy for conditional compiling and exposing the aio Cython + # dependencies will be revisited by https://github.com/grpc/grpc/issues/19728 + return commands.try_cythonize(extensions, + linetracing=ENABLE_CYTHON_TRACING, + mandatory=BUILD_WITH_CYTHON), need_cython + CYTHON_EXTENSION_MODULES, need_cython = cython_extensions_and_necessity() @@ -338,20 +359,20 @@ INSTALL_REQUIRES = ( SETUP_REQUIRES = INSTALL_REQUIRES + ( 'Sphinx~=1.8.1', 'six>=1.10', - ) if ENABLE_DOCUMENTATION_BUILD else () +) if ENABLE_DOCUMENTATION_BUILD else () try: - import Cython + import Cython except ImportError: - if BUILD_WITH_CYTHON: - sys.stderr.write( - "You requested a Cython build via GRPC_PYTHON_BUILD_WITH_CYTHON, " - "but do not have Cython installed. We won't stop you from using " - "other commands, but the extension files will fail to build.\n") - elif need_cython: - sys.stderr.write( - 'We could not find Cython. Setup may take 10-20 minutes.\n') - SETUP_REQUIRES += ('cython>=0.23',) + if BUILD_WITH_CYTHON: + sys.stderr.write( + "You requested a Cython build via GRPC_PYTHON_BUILD_WITH_CYTHON, " + "but do not have Cython installed. We won't stop you from using " + "other commands, but the extension files will fail to build.\n") + elif need_cython: + sys.stderr.write( + 'We could not find Cython. Setup may take 10-20 minutes.\n') + SETUP_REQUIRES += ('cython>=0.23',) COMMAND_CLASS = { 'doc': commands.SphinxDocumentation, @@ -364,9 +385,9 @@ COMMAND_CLASS = { # Ensure that package data is copied over before any commands have been run: credentials_dir = os.path.join(PYTHON_STEM, 'grpc', '_cython', '_credentials') try: - os.mkdir(credentials_dir) + os.mkdir(credentials_dir) except OSError: - pass + pass shutil.copyfile(os.path.join('etc', 'roots.pem'), os.path.join(credentials_dir, 'roots.pem')) @@ -382,20 +403,20 @@ PACKAGE_DATA = { PACKAGES = setuptools.find_packages(PYTHON_STEM) setuptools.setup( - name='grpcio', - version=grpc_version.VERSION, - description='HTTP/2-based RPC framework', - author='The gRPC Authors', - author_email='grpc-io@googlegroups.com', - url='https://grpc.io', - license=LICENSE, - classifiers=CLASSIFIERS, - long_description=open(README).read(), - ext_modules=CYTHON_EXTENSION_MODULES, - packages=list(PACKAGES), - package_dir=PACKAGE_DIRECTORIES, - package_data=PACKAGE_DATA, - install_requires=INSTALL_REQUIRES, - setup_requires=SETUP_REQUIRES, - cmdclass=COMMAND_CLASS, + name='grpcio', + version=grpc_version.VERSION, + description='HTTP/2-based RPC framework', + author='The gRPC Authors', + author_email='grpc-io@googlegroups.com', + url='https://grpc.io', + license=LICENSE, + classifiers=CLASSIFIERS, + long_description=open(README).read(), + ext_modules=CYTHON_EXTENSION_MODULES, + packages=list(PACKAGES), + package_dir=PACKAGE_DIRECTORIES, + package_data=PACKAGE_DATA, + install_requires=INSTALL_REQUIRES, + setup_requires=SETUP_REQUIRES, + cmdclass=COMMAND_CLASS, ) From 3d8b096c4a1d7b68c992f3060abb94ed6b582f3e Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Mon, 20 Apr 2020 16:36:41 -0700 Subject: [PATCH 559/758] Add setup.py to yapf_code check list --- tools/distrib/yapf_code.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/distrib/yapf_code.sh b/tools/distrib/yapf_code.sh index 4c9639ba8dc..cd4e722d504 100755 --- a/tools/distrib/yapf_code.sh +++ b/tools/distrib/yapf_code.sh @@ -26,6 +26,7 @@ DIRS=( 'src' 'test' 'tools' + 'setup.py' ) VIRTUALENV=yapf_virtual_environment From 7dbed97594b6640da51e83dd67670602ee1dd4ff Mon Sep 17 00:00:00 2001 From: Pau Freixes Date: Tue, 21 Apr 2020 11:49:17 +0200 Subject: [PATCH 560/758] Fix add done callback test --- .../grpcio_tests/tests_aio/unit/done_callback_test.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/python/grpcio_tests/tests_aio/unit/done_callback_test.py b/src/python/grpcio_tests/tests_aio/unit/done_callback_test.py index d4adf965512..481bafd5679 100644 --- a/src/python/grpcio_tests/tests_aio/unit/done_callback_test.py +++ b/src/python/grpcio_tests/tests_aio/unit/done_callback_test.py @@ -47,12 +47,12 @@ class TestDoneCallback(AioTestBase): call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) self.assertEqual(grpc.StatusCode.OK, await call.code()) - validation = _inject_callbacks(call) + validation = inject_callbacks(call) await validation async def test_unary_unary(self): call = self._stub.UnaryCall(messages_pb2.SimpleRequest()) - validation = _inject_callbacks(call) + validation = inject_callbacks(call) self.assertEqual(grpc.StatusCode.OK, await call.code()) @@ -65,7 +65,7 @@ class TestDoneCallback(AioTestBase): messages_pb2.ResponseParameters(size=_RESPONSE_PAYLOAD_SIZE)) call = self._stub.StreamingOutputCall(request) - validation = _inject_callbacks(call) + validation = inject_callbacks(call) response_cnt = 0 async for response in call: @@ -88,7 +88,7 @@ class TestDoneCallback(AioTestBase): yield request call = self._stub.StreamingInputCall(gen()) - validation = _inject_callbacks(call) + validation = inject_callbacks(call) response = await call self.assertIsInstance(response, messages_pb2.StreamingInputCallResponse) @@ -100,7 +100,7 @@ class TestDoneCallback(AioTestBase): async def test_stream_stream(self): call = self._stub.FullDuplexCall() - validation = _inject_callbacks(call) + validation = inject_callbacks(call) request = messages_pb2.StreamingOutputCallRequest() request.response_parameters.append( From 20898aa2f2a47ee75a58319a12ca1cc7cc843b48 Mon Sep 17 00:00:00 2001 From: Pau Freixes Date: Tue, 21 Apr 2020 16:45:33 +0200 Subject: [PATCH 561/758] Fix type issue --- src/python/grpcio/grpc/experimental/aio/_channel.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/python/grpcio/grpc/experimental/aio/_channel.py b/src/python/grpcio/grpc/experimental/aio/_channel.py index edd956b973a..89c556c997e 100644 --- a/src/python/grpcio/grpc/experimental/aio/_channel.py +++ b/src/python/grpcio/grpc/experimental/aio/_channel.py @@ -67,7 +67,7 @@ class _BaseMultiCallable: _method: bytes _request_serializer: SerializingFunction _response_deserializer: DeserializingFunction - _interceptors: Sequence[ClientInterceptor] + _interceptors: Optional[Sequence[ClientInterceptor]] _loop: asyncio.AbstractEventLoop # pylint: disable=too-many-arguments @@ -77,7 +77,7 @@ class _BaseMultiCallable: method: bytes, request_serializer: SerializingFunction, response_deserializer: DeserializingFunction, - interceptors: Sequence[ClientInterceptor], + interceptors: Optional[Sequence[ClientInterceptor]], loop: asyncio.AbstractEventLoop, ) -> None: self._loop = loop From 2c84dec7daf8ccaf122bd51b42cd0463a5fc5c9d Mon Sep 17 00:00:00 2001 From: ZhenLian Date: Tue, 21 Apr 2020 10:08:34 -0700 Subject: [PATCH 562/758] try adding extern --- test/cpp/util/test_credentials_provider.cc | 1 - test/cpp/util/test_credentials_provider.h | 6 +++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/test/cpp/util/test_credentials_provider.cc b/test/cpp/util/test_credentials_provider.cc index 830bccc3614..0893fb2bf3e 100644 --- a/test/cpp/util/test_credentials_provider.cc +++ b/test/cpp/util/test_credentials_provider.cc @@ -31,7 +31,6 @@ #include #include "src/core/lib/iomgr/load_file.h" -#include "test/core/end2end/data/ssl_test_data.h" #define CA_CERT_PATH "src/core/tsi/test_creds/ca.pem" #define SERVER_CERT_PATH "src/core/tsi/test_creds/server1.pem" diff --git a/test/cpp/util/test_credentials_provider.h b/test/cpp/util/test_credentials_provider.h index 0bc910dbc09..2e4bf7f1370 100644 --- a/test/cpp/util/test_credentials_provider.h +++ b/test/cpp/util/test_credentials_provider.h @@ -19,12 +19,16 @@ #ifndef GRPC_TEST_CPP_UTIL_TEST_CREDENTIALS_PROVIDER_H #define GRPC_TEST_CPP_UTIL_TEST_CREDENTIALS_PROVIDER_H -#include +extern const char test_root_cert[]; +extern const char server_cert[]; +extern const char server_key[]; #include #include #include +#include + namespace grpc { namespace testing { From a3702cdfa91eef433df92b81fbef2bbeb9de82f3 Mon Sep 17 00:00:00 2001 From: Nicolas 'Pixel' Noble Date: Tue, 21 Apr 2020 11:25:20 -0700 Subject: [PATCH 563/758] Passing repo manager. --- .github/ISSUE_TEMPLATE/bug_report.md | 2 +- .github/ISSUE_TEMPLATE/cleanup_request.md | 2 +- .github/ISSUE_TEMPLATE/feature_request.md | 2 +- .github/pull_request_template.md | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index f02cf704d1b..74060283ce2 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -2,7 +2,7 @@ name: Report a bug about: Create a report to help us improve labels: kind/bug, priority/P2 -assignees: nicolasnoble +assignees: veblush --- diff --git a/.github/ISSUE_TEMPLATE/cleanup_request.md b/.github/ISSUE_TEMPLATE/cleanup_request.md index 11e8be8ef3e..6e5c5aec48a 100644 --- a/.github/ISSUE_TEMPLATE/cleanup_request.md +++ b/.github/ISSUE_TEMPLATE/cleanup_request.md @@ -2,7 +2,7 @@ name: Request a cleanup about: Suggest a cleanup in our repository labels: kind/internal cleanup, priority/P2 -assignees: nicolasnoble +assignees: veblush --- diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index fb3dae79227..ba5d92da901 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -2,7 +2,7 @@ name: Request a feature about: Suggest an idea for this project labels: kind/enhancement, priority/P2 -assignees: nicolasnoble +assignees: veblush --- diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 57af6c21597..366b68604df 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -8,4 +8,4 @@ If you know who should review your pull request, please remove the mentioning be --> -@nicolasnoble +@veblush From 6000747f83bfebe3f02682a45456896b80b670a5 Mon Sep 17 00:00:00 2001 From: Pau Freixes Date: Tue, 21 Apr 2020 20:46:53 +0200 Subject: [PATCH 564/758] Fix some werid pytype complaning --- .../grpcio_tests/tests_aio/unit/call_test.py | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/src/python/grpcio_tests/tests_aio/unit/call_test.py b/src/python/grpcio_tests/tests_aio/unit/call_test.py index 2dc5e806115..3ce2a2f7b52 100644 --- a/src/python/grpcio_tests/tests_aio/unit/call_test.py +++ b/src/python/grpcio_tests/tests_aio/unit/call_test.py @@ -218,20 +218,21 @@ class TestUnaryUnaryCall(_MulticallableTestMixin, AioTestBase): class TestUnaryStreamCall(_MulticallableTestMixin, AioTestBase): async def test_call_rpc_error(self): - async with aio.insecure_channel(UNREACHABLE_TARGET) as channel: - request = messages_pb2.StreamingOutputCallRequest() - stub = test_pb2_grpc.TestServiceStub(channel) - call = stub.StreamingOutputCall(request) + channel = aio.insecure_channel(UNREACHABLE_TARGET) + request = messages_pb2.StreamingOutputCallRequest() + stub = test_pb2_grpc.TestServiceStub(channel) + call = stub.StreamingOutputCall(request) - with self.assertRaises(aio.AioRpcError) as exception_context: - async for response in call: - pass + with self.assertRaises(aio.AioRpcError) as exception_context: + async for response in call: + pass - self.assertEqual(grpc.StatusCode.UNAVAILABLE, - exception_context.exception.code()) + self.assertEqual(grpc.StatusCode.UNAVAILABLE, + exception_context.exception.code()) - self.assertTrue(call.done()) - self.assertEqual(grpc.StatusCode.UNAVAILABLE, await call.code()) + self.assertTrue(call.done()) + self.assertEqual(grpc.StatusCode.UNAVAILABLE, await call.code()) + await channel.close() async def test_cancel_unary_stream(self): # Prepares the request From 6d4f3ce244d7fb3d9598bd85e388cc9a59074aae Mon Sep 17 00:00:00 2001 From: Pau Freixes Date: Tue, 21 Apr 2020 20:54:34 +0200 Subject: [PATCH 565/758] Fix pytype issue raised only with Python 3.7 --- .../tests_aio/unit/client_unary_stream_interceptor_test.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/python/grpcio_tests/tests_aio/unit/client_unary_stream_interceptor_test.py b/src/python/grpcio_tests/tests_aio/unit/client_unary_stream_interceptor_test.py index cd4ed47010b..cfb3ead226f 100644 --- a/src/python/grpcio_tests/tests_aio/unit/client_unary_stream_interceptor_test.py +++ b/src/python/grpcio_tests/tests_aio/unit/client_unary_stream_interceptor_test.py @@ -62,9 +62,6 @@ class _UnaryStreamInterceptorEmpty(aio.UnaryStreamClientInterceptor): class _UnaryStreamInterceptorWithResponseIterator( aio.UnaryStreamClientInterceptor): - def __init__(self): - self.response_iterator = None - async def intercept_unary_stream(self, continuation, client_call_details, request): call = await continuation(client_call_details, request) From ad06797f0a0895ccd6a3453529d234eb5f1d2244 Mon Sep 17 00:00:00 2001 From: jeffreyqw <49655798+jeffreyqw@users.noreply.github.com> Date: Tue, 21 Apr 2020 12:54:28 -0700 Subject: [PATCH 566/758] fixed- generated file --- src/php/docker/centos7/Dockerfile | 10 +---- .../php/docker/centos7/Dockerfile.template | 42 +++++++++++++++++++ 2 files changed, 43 insertions(+), 9 deletions(-) create mode 100644 templates/src/php/docker/centos7/Dockerfile.template diff --git a/src/php/docker/centos7/Dockerfile b/src/php/docker/centos7/Dockerfile index e6491a0cb38..7c96c77f7f5 100644 --- a/src/php/docker/centos7/Dockerfile +++ b/src/php/docker/centos7/Dockerfile @@ -14,7 +14,6 @@ FROM centos:centos7 -# Install PHP7.2 RUN yum update -y && \ yum install epel-release -y && \ rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm && \ @@ -26,21 +25,14 @@ RUN yum update -y && \ ARG MAKEFLAGS=-j8 -WORKDIR /tmp -# Easy way to install gcc version -# devtoolset-3-toolchain(GCC-4) -# devtoolset-4-toolchain(GCC-5) -# devtoolset-6-toolchain(GCC-6) -# devtoolset-7-toolchain(GCC-7) -# etc +WORKDIR /tmp RUN yum install -y centos-release-scl && \ yum install -y devtoolset-4-gcc* SHELL [ "/usr/bin/scl", "enable", "devtoolset-4"] -# Install phpunit RUN wget https://phar.phpunit.de/phpunit-5.7.27.phar && \ mv phpunit-5.7.27.phar /usr/local/bin/phpunit && \ chmod +x /usr/local/bin/phpunit diff --git a/templates/src/php/docker/centos7/Dockerfile.template b/templates/src/php/docker/centos7/Dockerfile.template new file mode 100644 index 00000000000..61fa7907edc --- /dev/null +++ b/templates/src/php/docker/centos7/Dockerfile.template @@ -0,0 +1,42 @@ +%YAML 1.2 +--- | + # Copyright 2019 gRPC authors. + # + # Licensed under the Apache License, Version 2.0 (the "License"); + # you may not use this file except in compliance with the License. + # You may obtain a copy of the License at + # + # http://www.apache.org/licenses/LICENSE-2.0 + # + # Unless required by applicable law or agreed to in writing, software + # distributed under the License is distributed on an "AS IS" BASIS, + # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + # See the License for the specific language governing permissions and + # limitations under the License. + + FROM centos:centos7 + + RUN yum update -y && ${'\\'} + yum install epel-release -y && ${'\\'} + rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm && ${'\\'} + rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm && ${'\\'} + yum --enablerepo=remi-php72 install php -y && ${'\\'} + yum-config-manager --enable remi-php72 && ${'\\'} + yum install -y php-fpm php-pear make php-devel wget libmpc-devel mpfr-devel gmp-devel yum-utils && ${'\\'} + yum clean all -y + + ARG MAKEFLAGS=-j8 + + + WORKDIR /tmp + + RUN yum install -y centos-release-scl && ${'\\'} + yum install -y devtoolset-4-gcc* + + SHELL [ "/usr/bin/scl", "enable", "devtoolset-4"] + + <%include file="../download_phpunit.include" /> + + <%include file="../pecl_ext_build_src.include" /> + + CMD ["/github/grpc/src/php/bin/run_tests.sh", "--skip-persistent-channel-tests"] From b751f8534a3c943fb96bc6d3a29346df6b4c3576 Mon Sep 17 00:00:00 2001 From: jeffreyqw <49655798+jeffreyqw@users.noreply.github.com> Date: Tue, 21 Apr 2020 13:35:33 -0700 Subject: [PATCH 567/758] add run centos7 image --- src/php/bin/run_all_docker_images.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/php/bin/run_all_docker_images.sh b/src/php/bin/run_all_docker_images.sh index 0882ecc58f9..5859d08fe2a 100755 --- a/src/php/bin/run_all_docker_images.sh +++ b/src/php/bin/run_all_docker_images.sh @@ -16,7 +16,7 @@ set -e cd $(dirname $0)/../../.. -ALL_IMAGES=( grpc-ext grpc-src alpine php5 php-src php-future php-zts +ALL_IMAGES=( grpc-ext grpc-src alpine centos7 php5 php-src php-future php-zts fork-support ) if [[ "$1" == "--cmds" ]]; then From 0013b1b9a2184fb2904827f9b0da6a810a655ae6 Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Tue, 21 Apr 2020 14:57:04 -0700 Subject: [PATCH 568/758] Use aligned calculation to determine transport stream from call data --- src/core/lib/channel/connected_channel.cc | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/core/lib/channel/connected_channel.cc b/src/core/lib/channel/connected_channel.cc index 23ff63bf316..14b68b3c77f 100644 --- a/src/core/lib/channel/connected_channel.cc +++ b/src/core/lib/channel/connected_channel.cc @@ -91,9 +91,12 @@ static callback_state* get_state_for_batch( /* We perform a small hack to locate transport data alongside the connected channel data in call allocations, to allow everything to be pulled in minimal cache line requests */ -#define TRANSPORT_STREAM_FROM_CALL_DATA(calld) ((grpc_stream*)((calld) + 1)) +#define TRANSPORT_STREAM_FROM_CALL_DATA(calld) \ + ((grpc_stream*)(((char*)(calld)) + \ + GPR_ROUND_UP_TO_ALIGNMENT_SIZE(sizeof(call_data)))) #define CALL_DATA_FROM_TRANSPORT_STREAM(transport_stream) \ - (((call_data*)(transport_stream)) - 1) + ((call_data*)(((char*)(transport_stream)) - \ + GPR_ROUND_UP_TO_ALIGNMENT_SIZE(sizeof(call_data)))) /* Intercept a call operation and either push it directly up or translate it into transport stream operations */ From 2b00d09e45c969cbb90175c01a182f3c015b71ba Mon Sep 17 00:00:00 2001 From: Easwar Swaminathan Date: Tue, 21 Apr 2020 16:15:49 -0700 Subject: [PATCH 569/758] Add v1.29.0 release of grpc-go to interop matrix --- tools/interop_matrix/client_matrix.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/interop_matrix/client_matrix.py b/tools/interop_matrix/client_matrix.py index 96e2b33c614..52cf0230763 100644 --- a/tools/interop_matrix/client_matrix.py +++ b/tools/interop_matrix/client_matrix.py @@ -155,6 +155,7 @@ LANG_RELEASE_MATRIX = { ('v1.26.0', ReleaseInfo(runtimes=['go1.11'])), ('v1.27.1', ReleaseInfo(runtimes=['go1.11'])), ('v1.28.0', ReleaseInfo(runtimes=['go1.11'])), + ('v1.29.0', ReleaseInfo(runtimes=['go1.11'])), ]), 'java': OrderedDict([ From 490bdc45e04a6df6e510943522b4339e67e03f86 Mon Sep 17 00:00:00 2001 From: jeffreyqw <49655798+jeffreyqw@users.noreply.github.com> Date: Wed, 22 Apr 2020 01:08:33 -0700 Subject: [PATCH 570/758] update devtoolset gcc version Centos7 removed devtooset-4,5 and 6 version. --- src/php/docker/README.md | 6 +++--- src/php/docker/centos7/Dockerfile | 18 ++++++++++-------- .../src/php/docker/centos7/Dockerfile.template | 18 ++++++++++-------- 3 files changed, 23 insertions(+), 19 deletions(-) diff --git a/src/php/docker/README.md b/src/php/docker/README.md index 3df7039b8ce..638d65cbb84 100644 --- a/src/php/docker/README.md +++ b/src/php/docker/README.md @@ -97,17 +97,17 @@ $ docker run -it --rm grpc-php/alpine ``` ### `centos7` -This image builds the `grpc` extension against the GCC version in Centos7 base image. +This image builds the `grpc` extension against the GCC version in Centos7 base image. The default version of gcc in centos7 is gcc-4.8.5. Run `scl enable devtoolset-7 bash` command to enable gcc-7.3.1. Build `centos7` docker image: ```sh $ cd grpc -$ docker build -t grpc-gcc5/centos -f ./src/php/docker/centos7/Dockerfile . +$ docker build -t grpc-gcc7/centos -f ./src/php/docker/centos7/Dockerfile . ``` Run image: ```sh -$ docker run -it --rm grpc-gcc5/centos +$ docker run -it --rm grpc-gcc7/centos ``` ### `php-src` diff --git a/src/php/docker/centos7/Dockerfile b/src/php/docker/centos7/Dockerfile index 7c96c77f7f5..9ccdf759297 100644 --- a/src/php/docker/centos7/Dockerfile +++ b/src/php/docker/centos7/Dockerfile @@ -14,25 +14,27 @@ FROM centos:centos7 +RUN yum install -y centos-release-scl && \ + yum install -y devtoolset-7-gcc* + +SHELL [ "/usr/bin/scl", "enable", "devtoolset-7"] + RUN yum update -y && \ yum install epel-release -y && \ rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm && \ rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm && \ yum --enablerepo=remi-php72 install php -y && \ - yum-config-manager --enable remi-php72 && \ - yum install -y php-fpm php-pear make php-devel wget libmpc-devel mpfr-devel gmp-devel yum-utils && \ - yum clean all -y + yum-config-manager --enable remi-php72 > /dev/null && \ + yum install -y make wget which \ + gmp-devel libmpc-devel mpfr-devel yum-utils \ + php-devel php-fpm php-pear && \ + yum clean all -y ARG MAKEFLAGS=-j8 WORKDIR /tmp -RUN yum install -y centos-release-scl && \ - yum install -y devtoolset-4-gcc* - -SHELL [ "/usr/bin/scl", "enable", "devtoolset-4"] - RUN wget https://phar.phpunit.de/phpunit-5.7.27.phar && \ mv phpunit-5.7.27.phar /usr/local/bin/phpunit && \ chmod +x /usr/local/bin/phpunit diff --git a/templates/src/php/docker/centos7/Dockerfile.template b/templates/src/php/docker/centos7/Dockerfile.template index 61fa7907edc..368c6ee506e 100644 --- a/templates/src/php/docker/centos7/Dockerfile.template +++ b/templates/src/php/docker/centos7/Dockerfile.template @@ -16,25 +16,27 @@ FROM centos:centos7 + RUN yum install -y centos-release-scl && ${'\\'} + yum install -y devtoolset-7-gcc* + + SHELL [ "/usr/bin/scl", "enable", "devtoolset-7"] + RUN yum update -y && ${'\\'} yum install epel-release -y && ${'\\'} rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm && ${'\\'} rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm && ${'\\'} yum --enablerepo=remi-php72 install php -y && ${'\\'} - yum-config-manager --enable remi-php72 && ${'\\'} - yum install -y php-fpm php-pear make php-devel wget libmpc-devel mpfr-devel gmp-devel yum-utils && ${'\\'} - yum clean all -y + yum-config-manager --enable remi-php72 > /dev/null && ${'\\'} + yum install -y make wget which ${'\\'} + gmp-devel libmpc-devel mpfr-devel yum-utils ${'\\'} + php-devel php-fpm php-pear && ${'\\'} + yum clean all -y ARG MAKEFLAGS=-j8 WORKDIR /tmp - RUN yum install -y centos-release-scl && ${'\\'} - yum install -y devtoolset-4-gcc* - - SHELL [ "/usr/bin/scl", "enable", "devtoolset-4"] - <%include file="../download_phpunit.include" /> <%include file="../pecl_ext_build_src.include" /> From c76ad7371254a5cd14b64dfadeacd21e325f9741 Mon Sep 17 00:00:00 2001 From: Nao Minami Date: Wed, 22 Apr 2020 18:50:48 +0900 Subject: [PATCH 571/758] Fix yard annotation of ClientInterceptor --- src/ruby/lib/grpc/generic/interceptors.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/ruby/lib/grpc/generic/interceptors.rb b/src/ruby/lib/grpc/generic/interceptors.rb index 56d3cecaadb..ace22205cad 100644 --- a/src/ruby/lib/grpc/generic/interceptors.rb +++ b/src/ruby/lib/grpc/generic/interceptors.rb @@ -38,7 +38,7 @@ module GRPC # # @param [Object] request # @param [GRPC::ActiveCall] call - # @param [Method] method + # @param [String] method # @param [Hash] metadata # def request_response(request: nil, call: nil, method: nil, metadata: nil) @@ -52,7 +52,7 @@ module GRPC # # @param [Enumerable] requests # @param [GRPC::ActiveCall] call - # @param [Method] method + # @param [String] method # @param [Hash] metadata # def client_streamer(requests: nil, call: nil, method: nil, metadata: nil) @@ -66,7 +66,7 @@ module GRPC # # @param [Object] request # @param [GRPC::ActiveCall] call - # @param [Method] method + # @param [String] method # @param [Hash] metadata # def server_streamer(request: nil, call: nil, method: nil, metadata: nil) @@ -80,7 +80,7 @@ module GRPC # # @param [Enumerable] requests # @param [GRPC::ActiveCall] call - # @param [Method] method + # @param [String] method # @param [Hash] metadata # def bidi_streamer(requests: nil, call: nil, method: nil, metadata: nil) From 43f57958e499a9adbf2281721dcb4d854284dec6 Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Mon, 20 Apr 2020 12:18:52 +0200 Subject: [PATCH 572/758] fix c# codegen script typo --- src/csharp/generate_proto_csharp.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/csharp/generate_proto_csharp.sh b/src/csharp/generate_proto_csharp.sh index 9c731f3924a..c7c45a77546 100755 --- a/src/csharp/generate_proto_csharp.sh +++ b/src/csharp/generate_proto_csharp.sh @@ -36,7 +36,7 @@ $PROTOC --plugin=$PLUGIN --csharp_out=$HEALTHCHECK_DIR --grpc_out=$HEALTHCHECK_D $PROTOC --plugin=$PLUGIN --csharp_out=$REFLECTION_DIR --grpc_out=$REFLECTION_DIR \ -I src/proto src/proto/grpc/reflection/v1alpha/reflection.proto -# Put grp/core/stats.proto in a subdirectory to avoid collision with grpc/testing/stats.proto +# Put grpc/core/stats.proto in a subdirectory to avoid collision with grpc/testing/stats.proto mkdir -p $TESTING_DIR/CoreStats $PROTOC --plugin=$PLUGIN --csharp_out=$TESTING_DIR/CoreStats --grpc_out=$TESTING_DIR/CoreStats \ -I src/proto src/proto/grpc/core/stats.proto From 710be138565139ace1291857d004220b4e4f07b4 Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Mon, 20 Apr 2020 12:22:26 +0200 Subject: [PATCH 573/758] refactor generate_proto_php.sh --- src/php/README.md | 8 ++--- src/php/bin/generate_proto_php.sh | 29 ++++++++++++------- .../grpc_interop_php/build_interop.sh | 1 - .../grpc_interop_php7/build_interop.sh | 2 -- 4 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/php/README.md b/src/php/README.md index e589408b0c3..84ee8f7a2e9 100644 --- a/src/php/README.md +++ b/src/php/README.md @@ -275,12 +275,8 @@ $ composer install ### Client Stub -Generate client stub classes from `.proto` files - -```sh -$ cd grpc/src/php -$ ./bin/generate_proto_php.sh -``` +The generate client stub classes have already been generated from `.proto` files +by the `./bin/generate_proto_php.sh` script. ### Run test server diff --git a/src/php/bin/generate_proto_php.sh b/src/php/bin/generate_proto_php.sh index 0b09b85b415..1c943457ba1 100755 --- a/src/php/bin/generate_proto_php.sh +++ b/src/php/bin/generate_proto_php.sh @@ -16,16 +16,15 @@ set -e cd $(dirname $0)/../../.. -# TODO(jtattermusch): unlike for e.g. ruby and csharp, -# PHP runs the code generator as part of the build, so we cannot -# easily use bazel-built "protoc" and "grpc_php_plugin" binaries. -# TODO(jtattermusch): the generated code for qps tests -# is actually checked into the repository, but for other tests -# (e.g. interop or unit tests) it's not. This should made consistent. -protoc --proto_path=src/proto/math \ +# protoc and grpc_*_plugin binaries can be obtained by running +# $ bazel build @com_google_protobuf//:protoc //src/compiler:all +PROTOC=bazel-bin/external/com_google_protobuf/protoc +PLUGIN=protoc-gen-grpc=bazel-bin/src/compiler/grpc_php_plugin + +$PROTOC --proto_path=src/proto/math \ --php_out=src/php/tests/generated_code \ --grpc_out=src/php/tests/generated_code \ - --plugin=protoc-gen-grpc=bins/opt/grpc_php_plugin \ + --plugin=$PLUGIN \ src/proto/math/math.proto # replace the Empty message with EmptyMessage @@ -38,14 +37,23 @@ sed 's/grpc\.testing\.Empty/grpc\.testing\.EmptyMessage/g' \ src/proto/grpc/testing/test.proto > $output_file mv $output_file ./src/proto/grpc/testing/test.proto -protoc --proto_path=. \ +# interop test protos +$PROTOC --proto_path=. \ --php_out=src/php/tests/interop \ --grpc_out=src/php/tests/interop \ - --plugin=protoc-gen-grpc=bins/opt/grpc_php_plugin \ + --plugin=$PLUGIN \ src/proto/grpc/testing/messages.proto \ src/proto/grpc/testing/empty.proto \ src/proto/grpc/testing/test.proto +# qps test protos +$PROTOC --proto_path=. \ + --php_out=src/php/tests/qps/generated_code \ + --grpc_out=src/php/tests/qps/generated_code \ + --plugin=$PLUGIN \ + src/proto/grpc/core/stats.proto \ + src/proto/grpc/testing/{benchmark_service,compiler_test,control,echo_messages,empty,empty_service,messages,payloads,proxy-service,report_qps_scenario_service,stats,test,worker_service}.proto + # change it back sed 's/message EmptyMessage/message Empty/g' \ src/proto/grpc/testing/empty.proto > $output_file @@ -53,4 +61,3 @@ mv $output_file ./src/proto/grpc/testing/empty.proto sed 's/grpc\.testing\.EmptyMessage/grpc\.testing\.Empty/g' \ src/proto/grpc/testing/test.proto > $output_file mv $output_file ./src/proto/grpc/testing/test.proto - diff --git a/tools/dockerfile/interoptest/grpc_interop_php/build_interop.sh b/tools/dockerfile/interoptest/grpc_interop_php/build_interop.sh index 8f9a7c3d09e..d613d55c9cd 100755 --- a/tools/dockerfile/interoptest/grpc_interop_php/build_interop.sh +++ b/tools/dockerfile/interoptest/grpc_interop_php/build_interop.sh @@ -45,4 +45,3 @@ for ((i = 0; i < 5; i++)); do done [[ "$DONE" != 1 ]] && echo "Failed to do composer install" && exit 1 -./bin/generate_proto_php.sh diff --git a/tools/dockerfile/interoptest/grpc_interop_php7/build_interop.sh b/tools/dockerfile/interoptest/grpc_interop_php7/build_interop.sh index 7de17550df2..ab7eface1ef 100755 --- a/tools/dockerfile/interoptest/grpc_interop_php7/build_interop.sh +++ b/tools/dockerfile/interoptest/grpc_interop_php7/build_interop.sh @@ -44,5 +44,3 @@ for ((i = 0; i < 5; i++)); do [[ "$DONE" == 1 ]] && break done [[ "$DONE" != 1 ]] && echo "Failed to do composer install" && exit 1 - -./bin/generate_proto_php.sh From d5dfb408232311ec4bfcd161aa5fe32e009de880 Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Mon, 20 Apr 2020 12:26:09 +0200 Subject: [PATCH 574/758] checkin PHP generated code (tests and interop) --- .../tests/generated_code/GPBMetadata/Math.php | 36 ++ src/php/tests/generated_code/Math/DivArgs.php | 85 ++++ .../tests/generated_code/Math/DivReply.php | 85 ++++ src/php/tests/generated_code/Math/FibArgs.php | 58 +++ .../tests/generated_code/Math/FibReply.php | 58 +++ .../tests/generated_code/Math/MathClient.php | 91 ++++ src/php/tests/generated_code/Math/Num.php | 58 +++ .../Src/Proto/Grpc/Testing/Messages.php | 86 ++++ .../Src/Proto/Grpc/Testing/PBEmpty.php | 26 ++ .../Src/Proto/Grpc/Testing/Test.php | 66 +++ .../tests/interop/Grpc/Testing/BoolValue.php | 69 ++++ .../tests/interop/Grpc/Testing/EchoStatus.php | 88 ++++ .../interop/Grpc/Testing/EmptyMessage.php | 38 ++ .../Grpc/Testing/EmptyMessageMessage.php | 38 ++ .../interop/Grpc/Testing/GrpclbRouteType.php | 66 +++ .../Grpc/Testing/LoadBalancerStatsRequest.php | 99 +++++ .../Testing/LoadBalancerStatsResponse.php | 99 +++++ .../LoadBalancerStatsServiceClient.php | 52 +++ .../tests/interop/Grpc/Testing/Payload.php | 101 +++++ .../interop/Grpc/Testing/PayloadType.php | 47 +++ .../interop/Grpc/Testing/ReconnectInfo.php | 89 ++++ .../interop/Grpc/Testing/ReconnectParams.php | 61 +++ .../Grpc/Testing/ReconnectServiceClient.php | 64 +++ .../Grpc/Testing/ResponseParameters.php | 151 +++++++ .../interop/Grpc/Testing/SimpleRequest.php | 389 ++++++++++++++++++ .../interop/Grpc/Testing/SimpleResponse.php | 245 +++++++++++ .../Testing/StreamingInputCallRequest.php | 113 +++++ .../Testing/StreamingInputCallResponse.php | 67 +++ .../Testing/StreamingOutputCallRequest.php | 181 ++++++++ .../Testing/StreamingOutputCallResponse.php | 67 +++ .../Grpc/Testing/TestServiceClient.php | 152 +++++++ .../Testing/UnimplementedServiceClient.php | 53 +++ 32 files changed, 2978 insertions(+) create mode 100644 src/php/tests/generated_code/GPBMetadata/Math.php create mode 100644 src/php/tests/generated_code/Math/DivArgs.php create mode 100644 src/php/tests/generated_code/Math/DivReply.php create mode 100644 src/php/tests/generated_code/Math/FibArgs.php create mode 100644 src/php/tests/generated_code/Math/FibReply.php create mode 100644 src/php/tests/generated_code/Math/MathClient.php create mode 100644 src/php/tests/generated_code/Math/Num.php create mode 100644 src/php/tests/interop/GPBMetadata/Src/Proto/Grpc/Testing/Messages.php create mode 100644 src/php/tests/interop/GPBMetadata/Src/Proto/Grpc/Testing/PBEmpty.php create mode 100644 src/php/tests/interop/GPBMetadata/Src/Proto/Grpc/Testing/Test.php create mode 100644 src/php/tests/interop/Grpc/Testing/BoolValue.php create mode 100644 src/php/tests/interop/Grpc/Testing/EchoStatus.php create mode 100644 src/php/tests/interop/Grpc/Testing/EmptyMessage.php create mode 100644 src/php/tests/interop/Grpc/Testing/EmptyMessageMessage.php create mode 100644 src/php/tests/interop/Grpc/Testing/GrpclbRouteType.php create mode 100644 src/php/tests/interop/Grpc/Testing/LoadBalancerStatsRequest.php create mode 100644 src/php/tests/interop/Grpc/Testing/LoadBalancerStatsResponse.php create mode 100644 src/php/tests/interop/Grpc/Testing/LoadBalancerStatsServiceClient.php create mode 100644 src/php/tests/interop/Grpc/Testing/Payload.php create mode 100644 src/php/tests/interop/Grpc/Testing/PayloadType.php create mode 100644 src/php/tests/interop/Grpc/Testing/ReconnectInfo.php create mode 100644 src/php/tests/interop/Grpc/Testing/ReconnectParams.php create mode 100644 src/php/tests/interop/Grpc/Testing/ReconnectServiceClient.php create mode 100644 src/php/tests/interop/Grpc/Testing/ResponseParameters.php create mode 100644 src/php/tests/interop/Grpc/Testing/SimpleRequest.php create mode 100644 src/php/tests/interop/Grpc/Testing/SimpleResponse.php create mode 100644 src/php/tests/interop/Grpc/Testing/StreamingInputCallRequest.php create mode 100644 src/php/tests/interop/Grpc/Testing/StreamingInputCallResponse.php create mode 100644 src/php/tests/interop/Grpc/Testing/StreamingOutputCallRequest.php create mode 100644 src/php/tests/interop/Grpc/Testing/StreamingOutputCallResponse.php create mode 100644 src/php/tests/interop/Grpc/Testing/TestServiceClient.php create mode 100644 src/php/tests/interop/Grpc/Testing/UnimplementedServiceClient.php diff --git a/src/php/tests/generated_code/GPBMetadata/Math.php b/src/php/tests/generated_code/GPBMetadata/Math.php new file mode 100644 index 00000000000..07c886701b7 --- /dev/null +++ b/src/php/tests/generated_code/GPBMetadata/Math.php @@ -0,0 +1,36 @@ +internalAddGeneratedFile(hex2bin( + "0ae9020a0a6d6174682e70726f746f12046d617468222c0a074469764172" . + "677312100a086469766964656e64180120012803120f0a0764697669736f" . + "72180220012803222f0a084469765265706c7912100a0871756f7469656e" . + "7418012001280312110a0972656d61696e64657218022001280322180a07" . + "46696241726773120d0a056c696d697418012001280322120a034e756d12" . + "0b0a036e756d18012001280322190a084669625265706c79120d0a05636f" . + "756e7418012001280332a4010a044d61746812260a03446976120d2e6d61" . + "74682e446976417267731a0e2e6d6174682e4469765265706c792200122e" . + "0a074469764d616e79120d2e6d6174682e446976417267731a0e2e6d6174" . + "682e4469765265706c7922002801300112230a03466962120d2e6d617468" . + "2e466962417267731a092e6d6174682e4e756d22003001121f0a0353756d" . + "12092e6d6174682e4e756d1a092e6d6174682e4e756d2200280162067072" . + "6f746f33" + ), true); + + static::$is_initialized = true; + } +} + diff --git a/src/php/tests/generated_code/Math/DivArgs.php b/src/php/tests/generated_code/Math/DivArgs.php new file mode 100644 index 00000000000..21fb1d7252f --- /dev/null +++ b/src/php/tests/generated_code/Math/DivArgs.php @@ -0,0 +1,85 @@ +math.DivArgs + */ +class DivArgs extends \Google\Protobuf\Internal\Message +{ + /** + * Generated from protobuf field int64 dividend = 1; + */ + protected $dividend = 0; + /** + * Generated from protobuf field int64 divisor = 2; + */ + protected $divisor = 0; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type int|string $dividend + * @type int|string $divisor + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Math::initOnce(); + parent::__construct($data); + } + + /** + * Generated from protobuf field int64 dividend = 1; + * @return int|string + */ + public function getDividend() + { + return $this->dividend; + } + + /** + * Generated from protobuf field int64 dividend = 1; + * @param int|string $var + * @return $this + */ + public function setDividend($var) + { + GPBUtil::checkInt64($var); + $this->dividend = $var; + + return $this; + } + + /** + * Generated from protobuf field int64 divisor = 2; + * @return int|string + */ + public function getDivisor() + { + return $this->divisor; + } + + /** + * Generated from protobuf field int64 divisor = 2; + * @param int|string $var + * @return $this + */ + public function setDivisor($var) + { + GPBUtil::checkInt64($var); + $this->divisor = $var; + + return $this; + } + +} + diff --git a/src/php/tests/generated_code/Math/DivReply.php b/src/php/tests/generated_code/Math/DivReply.php new file mode 100644 index 00000000000..c4d7575b209 --- /dev/null +++ b/src/php/tests/generated_code/Math/DivReply.php @@ -0,0 +1,85 @@ +math.DivReply + */ +class DivReply extends \Google\Protobuf\Internal\Message +{ + /** + * Generated from protobuf field int64 quotient = 1; + */ + protected $quotient = 0; + /** + * Generated from protobuf field int64 remainder = 2; + */ + protected $remainder = 0; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type int|string $quotient + * @type int|string $remainder + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Math::initOnce(); + parent::__construct($data); + } + + /** + * Generated from protobuf field int64 quotient = 1; + * @return int|string + */ + public function getQuotient() + { + return $this->quotient; + } + + /** + * Generated from protobuf field int64 quotient = 1; + * @param int|string $var + * @return $this + */ + public function setQuotient($var) + { + GPBUtil::checkInt64($var); + $this->quotient = $var; + + return $this; + } + + /** + * Generated from protobuf field int64 remainder = 2; + * @return int|string + */ + public function getRemainder() + { + return $this->remainder; + } + + /** + * Generated from protobuf field int64 remainder = 2; + * @param int|string $var + * @return $this + */ + public function setRemainder($var) + { + GPBUtil::checkInt64($var); + $this->remainder = $var; + + return $this; + } + +} + diff --git a/src/php/tests/generated_code/Math/FibArgs.php b/src/php/tests/generated_code/Math/FibArgs.php new file mode 100644 index 00000000000..39bb4fad2f9 --- /dev/null +++ b/src/php/tests/generated_code/Math/FibArgs.php @@ -0,0 +1,58 @@ +math.FibArgs + */ +class FibArgs extends \Google\Protobuf\Internal\Message +{ + /** + * Generated from protobuf field int64 limit = 1; + */ + protected $limit = 0; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type int|string $limit + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Math::initOnce(); + parent::__construct($data); + } + + /** + * Generated from protobuf field int64 limit = 1; + * @return int|string + */ + public function getLimit() + { + return $this->limit; + } + + /** + * Generated from protobuf field int64 limit = 1; + * @param int|string $var + * @return $this + */ + public function setLimit($var) + { + GPBUtil::checkInt64($var); + $this->limit = $var; + + return $this; + } + +} + diff --git a/src/php/tests/generated_code/Math/FibReply.php b/src/php/tests/generated_code/Math/FibReply.php new file mode 100644 index 00000000000..d9ad9cd41be --- /dev/null +++ b/src/php/tests/generated_code/Math/FibReply.php @@ -0,0 +1,58 @@ +math.FibReply + */ +class FibReply extends \Google\Protobuf\Internal\Message +{ + /** + * Generated from protobuf field int64 count = 1; + */ + protected $count = 0; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type int|string $count + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Math::initOnce(); + parent::__construct($data); + } + + /** + * Generated from protobuf field int64 count = 1; + * @return int|string + */ + public function getCount() + { + return $this->count; + } + + /** + * Generated from protobuf field int64 count = 1; + * @param int|string $var + * @return $this + */ + public function setCount($var) + { + GPBUtil::checkInt64($var); + $this->count = $var; + + return $this; + } + +} + diff --git a/src/php/tests/generated_code/Math/MathClient.php b/src/php/tests/generated_code/Math/MathClient.php new file mode 100644 index 00000000000..92c980afe16 --- /dev/null +++ b/src/php/tests/generated_code/Math/MathClient.php @@ -0,0 +1,91 @@ +_simpleRequest('/math.Math/Div', + $argument, + ['\Math\DivReply', 'decode'], + $metadata, $options); + } + + /** + * DivMany accepts an arbitrary number of division args from the client stream + * and sends back the results in the reply stream. The stream continues until + * the client closes its end; the server does the same after sending all the + * replies. The stream ends immediately if either end aborts. + * @param array $metadata metadata + * @param array $options call options + */ + public function DivMany($metadata = [], $options = []) { + return $this->_bidiRequest('/math.Math/DivMany', + ['\Math\DivReply','decode'], + $metadata, $options); + } + + /** + * Fib generates numbers in the Fibonacci sequence. If FibArgs.limit > 0, Fib + * generates up to limit numbers; otherwise it continues until the call is + * canceled. Unlike Fib above, Fib has no final FibReply. + * @param \Math\FibArgs $argument input argument + * @param array $metadata metadata + * @param array $options call options + */ + public function Fib(\Math\FibArgs $argument, + $metadata = [], $options = []) { + return $this->_serverStreamRequest('/math.Math/Fib', + $argument, + ['\Math\Num', 'decode'], + $metadata, $options); + } + + /** + * Sum sums a stream of numbers, returning the final result once the stream + * is closed. + * @param array $metadata metadata + * @param array $options call options + */ + public function Sum($metadata = [], $options = []) { + return $this->_clientStreamRequest('/math.Math/Sum', + ['\Math\Num','decode'], + $metadata, $options); + } + +} diff --git a/src/php/tests/generated_code/Math/Num.php b/src/php/tests/generated_code/Math/Num.php new file mode 100644 index 00000000000..356b328b2cc --- /dev/null +++ b/src/php/tests/generated_code/Math/Num.php @@ -0,0 +1,58 @@ +math.Num + */ +class Num extends \Google\Protobuf\Internal\Message +{ + /** + * Generated from protobuf field int64 num = 1; + */ + protected $num = 0; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type int|string $num + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Math::initOnce(); + parent::__construct($data); + } + + /** + * Generated from protobuf field int64 num = 1; + * @return int|string + */ + public function getNum() + { + return $this->num; + } + + /** + * Generated from protobuf field int64 num = 1; + * @param int|string $var + * @return $this + */ + public function setNum($var) + { + GPBUtil::checkInt64($var); + $this->num = $var; + + return $this; + } + +} + diff --git a/src/php/tests/interop/GPBMetadata/Src/Proto/Grpc/Testing/Messages.php b/src/php/tests/interop/GPBMetadata/Src/Proto/Grpc/Testing/Messages.php new file mode 100644 index 00000000000..72c17046a24 --- /dev/null +++ b/src/php/tests/interop/GPBMetadata/Src/Proto/Grpc/Testing/Messages.php @@ -0,0 +1,86 @@ +internalAddGeneratedFile(hex2bin( + "0ad70e0a257372632f70726f746f2f677270632f74657374696e672f6d65" . + "7373616765732e70726f746f120c677270632e74657374696e67221a0a09" . + "426f6f6c56616c7565120d0a0576616c756518012001280822400a075061" . + "796c6f616412270a047479706518012001280e32192e677270632e746573" . + "74696e672e5061796c6f616454797065120c0a04626f647918022001280c" . + "222b0a0a4563686f537461747573120c0a04636f6465180120012805120f" . + "0a076d6573736167651802200128092286030a0d53696d706c6552657175" . + "65737412300a0d726573706f6e73655f7479706518012001280e32192e67" . + "7270632e74657374696e672e5061796c6f61645479706512150a0d726573" . + "706f6e73655f73697a6518022001280512260a077061796c6f6164180320" . + "01280b32152e677270632e74657374696e672e5061796c6f616412150a0d" . + "66696c6c5f757365726e616d6518042001280812180a1066696c6c5f6f61" . + "7574685f73636f706518052001280812340a13726573706f6e73655f636f" . + "6d7072657373656418062001280b32172e677270632e74657374696e672e" . + "426f6f6c56616c756512310a0f726573706f6e73655f7374617475731807" . + "2001280b32182e677270632e74657374696e672e4563686f537461747573" . + "12320a116578706563745f636f6d7072657373656418082001280b32172e" . + "677270632e74657374696e672e426f6f6c56616c756512160a0e66696c6c" . + "5f7365727665725f6964180920012808121e0a1666696c6c5f677270636c" . + "625f726f7574655f74797065180a2001280822be010a0e53696d706c6552" . + "6573706f6e736512260a077061796c6f616418012001280b32152e677270" . + "632e74657374696e672e5061796c6f616412100a08757365726e616d6518" . + "022001280912130a0b6f617574685f73636f706518032001280912110a09" . + "7365727665725f696418042001280912380a11677270636c625f726f7574" . + "655f7479706518052001280e321d2e677270632e74657374696e672e4772" . + "70636c62526f7574655479706512100a08686f73746e616d651806200128" . + "0922770a1953747265616d696e67496e70757443616c6c52657175657374" . + "12260a077061796c6f616418012001280b32152e677270632e7465737469" . + "6e672e5061796c6f616412320a116578706563745f636f6d707265737365" . + "6418022001280b32172e677270632e74657374696e672e426f6f6c56616c" . + "7565223d0a1a53747265616d696e67496e70757443616c6c526573706f6e" . + "7365121f0a17616767726567617465645f7061796c6f61645f73697a6518" . + "012001280522640a12526573706f6e7365506172616d6574657273120c0a" . + "0473697a6518012001280512130a0b696e74657276616c5f757318022001" . + "2805122b0a0a636f6d7072657373656418032001280b32172e677270632e" . + "74657374696e672e426f6f6c56616c756522e8010a1a53747265616d696e" . + "674f757470757443616c6c5265717565737412300a0d726573706f6e7365" . + "5f7479706518012001280e32192e677270632e74657374696e672e506179" . + "6c6f616454797065123d0a13726573706f6e73655f706172616d65746572" . + "7318022003280b32202e677270632e74657374696e672e526573706f6e73" . + "65506172616d657465727312260a077061796c6f616418032001280b3215" . + "2e677270632e74657374696e672e5061796c6f616412310a0f726573706f" . + "6e73655f73746174757318072001280b32182e677270632e74657374696e" . + "672e4563686f53746174757322450a1b53747265616d696e674f75747075" . + "7443616c6c526573706f6e736512260a077061796c6f616418012001280b" . + "32152e677270632e74657374696e672e5061796c6f616422330a0f526563" . + "6f6e6e656374506172616d7312200a186d61785f7265636f6e6e6563745f" . + "6261636b6f66665f6d7318012001280522330a0d5265636f6e6e65637449" . + "6e666f120e0a0670617373656418012001280812120a0a6261636b6f6666" . + "5f6d7318022003280522410a184c6f616442616c616e6365725374617473" . + "5265717565737412100a086e756d5f7270637318012001280512130a0b74" . + "696d656f75745f73656318022001280522b3010a194c6f616442616c616e" . + "6365725374617473526573706f6e7365124d0a0c727063735f62795f7065" . + "657218012003280b32372e677270632e74657374696e672e4c6f61644261" . + "6c616e6365725374617473526573706f6e73652e52706373427950656572" . + "456e74727912140a0c6e756d5f6661696c757265731802200128051a310a" . + "0f52706373427950656572456e747279120b0a036b657918012001280912" . + "0d0a0576616c75651802200128053a0238012a1f0a0b5061796c6f616454" . + "79706512100a0c434f4d505245535341424c4510002a6f0a0f477270636c" . + "62526f75746554797065121d0a19475250434c425f524f5554455f545950" . + "455f554e4b4e4f574e1000121e0a1a475250434c425f524f5554455f5459" . + "50455f46414c4c4241434b1001121d0a19475250434c425f524f5554455f" . + "545950455f4241434b454e441002620670726f746f33" + ), true); + + static::$is_initialized = true; + } +} + diff --git a/src/php/tests/interop/GPBMetadata/Src/Proto/Grpc/Testing/PBEmpty.php b/src/php/tests/interop/GPBMetadata/Src/Proto/Grpc/Testing/PBEmpty.php new file mode 100644 index 00000000000..6118c2609c0 --- /dev/null +++ b/src/php/tests/interop/GPBMetadata/Src/Proto/Grpc/Testing/PBEmpty.php @@ -0,0 +1,26 @@ +internalAddGeneratedFile(hex2bin( + "0a4a0a227372632f70726f746f2f677270632f74657374696e672f656d70" . + "74792e70726f746f120c677270632e74657374696e67220e0a0c456d7074" . + "794d657373616765620670726f746f33" + ), true); + + static::$is_initialized = true; + } +} + diff --git a/src/php/tests/interop/GPBMetadata/Src/Proto/Grpc/Testing/Test.php b/src/php/tests/interop/GPBMetadata/Src/Proto/Grpc/Testing/Test.php new file mode 100644 index 00000000000..c3063340d00 --- /dev/null +++ b/src/php/tests/interop/GPBMetadata/Src/Proto/Grpc/Testing/Test.php @@ -0,0 +1,66 @@ +internalAddGeneratedFile(hex2bin( + "0aca090a217372632f70726f746f2f677270632f74657374696e672f7465" . + "73742e70726f746f120c677270632e74657374696e671a257372632f7072" . + "6f746f2f677270632f74657374696e672f6d657373616765732e70726f74" . + "6f32e7050a0b546573745365727669636512430a09456d70747943616c6c" . + "121a2e677270632e74657374696e672e456d7074794d6573736167651a1a" . + "2e677270632e74657374696e672e456d7074794d65737361676512460a09" . + "556e61727943616c6c121b2e677270632e74657374696e672e53696d706c" . + "65526571756573741a1c2e677270632e74657374696e672e53696d706c65" . + "526573706f6e7365124f0a12436163686561626c65556e61727943616c6c" . + "121b2e677270632e74657374696e672e53696d706c65526571756573741a" . + "1c2e677270632e74657374696e672e53696d706c65526573706f6e736512" . + "6c0a1353747265616d696e674f757470757443616c6c12282e677270632e" . + "74657374696e672e53747265616d696e674f757470757443616c6c526571" . + "756573741a292e677270632e74657374696e672e53747265616d696e674f" . + "757470757443616c6c526573706f6e7365300112690a1253747265616d69" . + "6e67496e70757443616c6c12272e677270632e74657374696e672e537472" . + "65616d696e67496e70757443616c6c526571756573741a282e677270632e" . + "74657374696e672e53747265616d696e67496e70757443616c6c52657370" . + "6f6e7365280112690a0e46756c6c4475706c657843616c6c12282e677270" . + "632e74657374696e672e53747265616d696e674f757470757443616c6c52" . + "6571756573741a292e677270632e74657374696e672e53747265616d696e" . + "674f757470757443616c6c526573706f6e73652801300112690a0e48616c" . + "664475706c657843616c6c12282e677270632e74657374696e672e537472" . + "65616d696e674f757470757443616c6c526571756573741a292e67727063" . + "2e74657374696e672e53747265616d696e674f757470757443616c6c5265" . + "73706f6e736528013001124b0a11556e696d706c656d656e74656443616c" . + "6c121a2e677270632e74657374696e672e456d7074794d6573736167651a" . + "1a2e677270632e74657374696e672e456d7074794d65737361676532630a" . + "14556e696d706c656d656e74656453657276696365124b0a11556e696d70" . + "6c656d656e74656443616c6c121a2e677270632e74657374696e672e456d" . + "7074794d6573736167651a1a2e677270632e74657374696e672e456d7074" . + "794d6573736167653297010a105265636f6e6e6563745365727669636512" . + "420a055374617274121d2e677270632e74657374696e672e5265636f6e6e" . + "656374506172616d731a1a2e677270632e74657374696e672e456d707479" . + "4d657373616765123f0a0453746f70121a2e677270632e74657374696e67" . + "2e456d7074794d6573736167651a1b2e677270632e74657374696e672e52" . + "65636f6e6e656374496e666f327f0a184c6f616442616c616e6365725374" . + "6174735365727669636512630a0e476574436c69656e7453746174731226" . + "2e677270632e74657374696e672e4c6f616442616c616e63657253746174" . + "73526571756573741a272e677270632e74657374696e672e4c6f61644261" . + "6c616e6365725374617473526573706f6e73652200620670726f746f33" + ), true); + + static::$is_initialized = true; + } +} + diff --git a/src/php/tests/interop/Grpc/Testing/BoolValue.php b/src/php/tests/interop/Grpc/Testing/BoolValue.php new file mode 100644 index 00000000000..a1fd08d674d --- /dev/null +++ b/src/php/tests/interop/Grpc/Testing/BoolValue.php @@ -0,0 +1,69 @@ +grpc.testing.BoolValue + */ +class BoolValue extends \Google\Protobuf\Internal\Message +{ + /** + * The bool value. + * + * Generated from protobuf field bool value = 1; + */ + protected $value = false; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type bool $value + * The bool value. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Src\Proto\Grpc\Testing\Messages::initOnce(); + parent::__construct($data); + } + + /** + * The bool value. + * + * Generated from protobuf field bool value = 1; + * @return bool + */ + public function getValue() + { + return $this->value; + } + + /** + * The bool value. + * + * Generated from protobuf field bool value = 1; + * @param bool $var + * @return $this + */ + public function setValue($var) + { + GPBUtil::checkBool($var); + $this->value = $var; + + return $this; + } + +} + diff --git a/src/php/tests/interop/Grpc/Testing/EchoStatus.php b/src/php/tests/interop/Grpc/Testing/EchoStatus.php new file mode 100644 index 00000000000..31fd6dd8995 --- /dev/null +++ b/src/php/tests/interop/Grpc/Testing/EchoStatus.php @@ -0,0 +1,88 @@ +grpc.testing.EchoStatus + */ +class EchoStatus extends \Google\Protobuf\Internal\Message +{ + /** + * Generated from protobuf field int32 code = 1; + */ + protected $code = 0; + /** + * Generated from protobuf field string message = 2; + */ + protected $message = ''; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type int $code + * @type string $message + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Src\Proto\Grpc\Testing\Messages::initOnce(); + parent::__construct($data); + } + + /** + * Generated from protobuf field int32 code = 1; + * @return int + */ + public function getCode() + { + return $this->code; + } + + /** + * Generated from protobuf field int32 code = 1; + * @param int $var + * @return $this + */ + public function setCode($var) + { + GPBUtil::checkInt32($var); + $this->code = $var; + + return $this; + } + + /** + * Generated from protobuf field string message = 2; + * @return string + */ + public function getMessage() + { + return $this->message; + } + + /** + * Generated from protobuf field string message = 2; + * @param string $var + * @return $this + */ + public function setMessage($var) + { + GPBUtil::checkString($var, True); + $this->message = $var; + + return $this; + } + +} + diff --git a/src/php/tests/interop/Grpc/Testing/EmptyMessage.php b/src/php/tests/interop/Grpc/Testing/EmptyMessage.php new file mode 100644 index 00000000000..66e49ab07d2 --- /dev/null +++ b/src/php/tests/interop/Grpc/Testing/EmptyMessage.php @@ -0,0 +1,38 @@ +grpc.testing.EmptyMessage + */ +class EmptyMessage extends \Google\Protobuf\Internal\Message +{ + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Src\Proto\Grpc\Testing\PBEmpty::initOnce(); + parent::__construct($data); + } + +} + diff --git a/src/php/tests/interop/Grpc/Testing/EmptyMessageMessage.php b/src/php/tests/interop/Grpc/Testing/EmptyMessageMessage.php new file mode 100644 index 00000000000..678b6ca9b22 --- /dev/null +++ b/src/php/tests/interop/Grpc/Testing/EmptyMessageMessage.php @@ -0,0 +1,38 @@ +grpc.testing.EmptyMessageMessage + */ +class EmptyMessageMessage extends \Google\Protobuf\Internal\Message +{ + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Src\Proto\Grpc\Testing\PBEmpty::initOnce(); + parent::__construct($data); + } + +} + diff --git a/src/php/tests/interop/Grpc/Testing/GrpclbRouteType.php b/src/php/tests/interop/Grpc/Testing/GrpclbRouteType.php new file mode 100644 index 00000000000..f8bff1cb695 --- /dev/null +++ b/src/php/tests/interop/Grpc/Testing/GrpclbRouteType.php @@ -0,0 +1,66 @@ +grpc.testing.GrpclbRouteType + */ +class GrpclbRouteType +{ + /** + * Server didn't detect the route that a client took to reach it. + * + * Generated from protobuf enum GRPCLB_ROUTE_TYPE_UNKNOWN = 0; + */ + const GRPCLB_ROUTE_TYPE_UNKNOWN = 0; + /** + * Indicates that a client reached a server via gRPCLB fallback. + * + * Generated from protobuf enum GRPCLB_ROUTE_TYPE_FALLBACK = 1; + */ + const GRPCLB_ROUTE_TYPE_FALLBACK = 1; + /** + * Indicates that a client reached a server as a gRPCLB-given backend. + * + * Generated from protobuf enum GRPCLB_ROUTE_TYPE_BACKEND = 2; + */ + const GRPCLB_ROUTE_TYPE_BACKEND = 2; + + private static $valueToName = [ + self::GRPCLB_ROUTE_TYPE_UNKNOWN => 'GRPCLB_ROUTE_TYPE_UNKNOWN', + self::GRPCLB_ROUTE_TYPE_FALLBACK => 'GRPCLB_ROUTE_TYPE_FALLBACK', + self::GRPCLB_ROUTE_TYPE_BACKEND => 'GRPCLB_ROUTE_TYPE_BACKEND', + ]; + + public static function name($value) + { + if (!isset(self::$valueToName[$value])) { + throw new UnexpectedValueException(sprintf( + 'Enum %s has no name defined for value %s', __CLASS__, $value)); + } + return self::$valueToName[$value]; + } + + + public static function value($name) + { + $const = __CLASS__ . '::' . strtoupper($name); + if (!defined($const)) { + throw new UnexpectedValueException(sprintf( + 'Enum %s has no value defined for name %s', __CLASS__, $name)); + } + return constant($const); + } +} + diff --git a/src/php/tests/interop/Grpc/Testing/LoadBalancerStatsRequest.php b/src/php/tests/interop/Grpc/Testing/LoadBalancerStatsRequest.php new file mode 100644 index 00000000000..02a15306688 --- /dev/null +++ b/src/php/tests/interop/Grpc/Testing/LoadBalancerStatsRequest.php @@ -0,0 +1,99 @@ +grpc.testing.LoadBalancerStatsRequest + */ +class LoadBalancerStatsRequest extends \Google\Protobuf\Internal\Message +{ + /** + * Request stats for the next num_rpcs sent by client. + * + * Generated from protobuf field int32 num_rpcs = 1; + */ + protected $num_rpcs = 0; + /** + * If num_rpcs have not completed within timeout_sec, return partial results. + * + * Generated from protobuf field int32 timeout_sec = 2; + */ + protected $timeout_sec = 0; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type int $num_rpcs + * Request stats for the next num_rpcs sent by client. + * @type int $timeout_sec + * If num_rpcs have not completed within timeout_sec, return partial results. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Src\Proto\Grpc\Testing\Messages::initOnce(); + parent::__construct($data); + } + + /** + * Request stats for the next num_rpcs sent by client. + * + * Generated from protobuf field int32 num_rpcs = 1; + * @return int + */ + public function getNumRpcs() + { + return $this->num_rpcs; + } + + /** + * Request stats for the next num_rpcs sent by client. + * + * Generated from protobuf field int32 num_rpcs = 1; + * @param int $var + * @return $this + */ + public function setNumRpcs($var) + { + GPBUtil::checkInt32($var); + $this->num_rpcs = $var; + + return $this; + } + + /** + * If num_rpcs have not completed within timeout_sec, return partial results. + * + * Generated from protobuf field int32 timeout_sec = 2; + * @return int + */ + public function getTimeoutSec() + { + return $this->timeout_sec; + } + + /** + * If num_rpcs have not completed within timeout_sec, return partial results. + * + * Generated from protobuf field int32 timeout_sec = 2; + * @param int $var + * @return $this + */ + public function setTimeoutSec($var) + { + GPBUtil::checkInt32($var); + $this->timeout_sec = $var; + + return $this; + } + +} + diff --git a/src/php/tests/interop/Grpc/Testing/LoadBalancerStatsResponse.php b/src/php/tests/interop/Grpc/Testing/LoadBalancerStatsResponse.php new file mode 100644 index 00000000000..270189e1871 --- /dev/null +++ b/src/php/tests/interop/Grpc/Testing/LoadBalancerStatsResponse.php @@ -0,0 +1,99 @@ +grpc.testing.LoadBalancerStatsResponse + */ +class LoadBalancerStatsResponse extends \Google\Protobuf\Internal\Message +{ + /** + * The number of completed RPCs for each peer. + * + * Generated from protobuf field map rpcs_by_peer = 1; + */ + private $rpcs_by_peer; + /** + * The number of RPCs that failed to record a remote peer. + * + * Generated from protobuf field int32 num_failures = 2; + */ + protected $num_failures = 0; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type array|\Google\Protobuf\Internal\MapField $rpcs_by_peer + * The number of completed RPCs for each peer. + * @type int $num_failures + * The number of RPCs that failed to record a remote peer. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Src\Proto\Grpc\Testing\Messages::initOnce(); + parent::__construct($data); + } + + /** + * The number of completed RPCs for each peer. + * + * Generated from protobuf field map rpcs_by_peer = 1; + * @return \Google\Protobuf\Internal\MapField + */ + public function getRpcsByPeer() + { + return $this->rpcs_by_peer; + } + + /** + * The number of completed RPCs for each peer. + * + * Generated from protobuf field map rpcs_by_peer = 1; + * @param array|\Google\Protobuf\Internal\MapField $var + * @return $this + */ + public function setRpcsByPeer($var) + { + $arr = GPBUtil::checkMapField($var, \Google\Protobuf\Internal\GPBType::STRING, \Google\Protobuf\Internal\GPBType::INT32); + $this->rpcs_by_peer = $arr; + + return $this; + } + + /** + * The number of RPCs that failed to record a remote peer. + * + * Generated from protobuf field int32 num_failures = 2; + * @return int + */ + public function getNumFailures() + { + return $this->num_failures; + } + + /** + * The number of RPCs that failed to record a remote peer. + * + * Generated from protobuf field int32 num_failures = 2; + * @param int $var + * @return $this + */ + public function setNumFailures($var) + { + GPBUtil::checkInt32($var); + $this->num_failures = $var; + + return $this; + } + +} + diff --git a/src/php/tests/interop/Grpc/Testing/LoadBalancerStatsServiceClient.php b/src/php/tests/interop/Grpc/Testing/LoadBalancerStatsServiceClient.php new file mode 100644 index 00000000000..129776d8a30 --- /dev/null +++ b/src/php/tests/interop/Grpc/Testing/LoadBalancerStatsServiceClient.php @@ -0,0 +1,52 @@ +_simpleRequest('/grpc.testing.LoadBalancerStatsService/GetClientStats', + $argument, + ['\Grpc\Testing\LoadBalancerStatsResponse', 'decode'], + $metadata, $options); + } + +} diff --git a/src/php/tests/interop/Grpc/Testing/Payload.php b/src/php/tests/interop/Grpc/Testing/Payload.php new file mode 100644 index 00000000000..65a007e119e --- /dev/null +++ b/src/php/tests/interop/Grpc/Testing/Payload.php @@ -0,0 +1,101 @@ +grpc.testing.Payload + */ +class Payload extends \Google\Protobuf\Internal\Message +{ + /** + * The type of data in body. + * + * Generated from protobuf field .grpc.testing.PayloadType type = 1; + */ + protected $type = 0; + /** + * Primary contents of payload. + * + * Generated from protobuf field bytes body = 2; + */ + protected $body = ''; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type int $type + * The type of data in body. + * @type string $body + * Primary contents of payload. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Src\Proto\Grpc\Testing\Messages::initOnce(); + parent::__construct($data); + } + + /** + * The type of data in body. + * + * Generated from protobuf field .grpc.testing.PayloadType type = 1; + * @return int + */ + public function getType() + { + return $this->type; + } + + /** + * The type of data in body. + * + * Generated from protobuf field .grpc.testing.PayloadType type = 1; + * @param int $var + * @return $this + */ + public function setType($var) + { + GPBUtil::checkEnum($var, \Grpc\Testing\PayloadType::class); + $this->type = $var; + + return $this; + } + + /** + * Primary contents of payload. + * + * Generated from protobuf field bytes body = 2; + * @return string + */ + public function getBody() + { + return $this->body; + } + + /** + * Primary contents of payload. + * + * Generated from protobuf field bytes body = 2; + * @param string $var + * @return $this + */ + public function setBody($var) + { + GPBUtil::checkString($var, False); + $this->body = $var; + + return $this; + } + +} + diff --git a/src/php/tests/interop/Grpc/Testing/PayloadType.php b/src/php/tests/interop/Grpc/Testing/PayloadType.php new file mode 100644 index 00000000000..dc246b37891 --- /dev/null +++ b/src/php/tests/interop/Grpc/Testing/PayloadType.php @@ -0,0 +1,47 @@ +grpc.testing.PayloadType + */ +class PayloadType +{ + /** + * Compressable text format. + * + * Generated from protobuf enum COMPRESSABLE = 0; + */ + const COMPRESSABLE = 0; + + private static $valueToName = [ + self::COMPRESSABLE => 'COMPRESSABLE', + ]; + + public static function name($value) + { + if (!isset(self::$valueToName[$value])) { + throw new UnexpectedValueException(sprintf( + 'Enum %s has no name defined for value %s', __CLASS__, $value)); + } + return self::$valueToName[$value]; + } + + + public static function value($name) + { + $const = __CLASS__ . '::' . strtoupper($name); + if (!defined($const)) { + throw new UnexpectedValueException(sprintf( + 'Enum %s has no value defined for name %s', __CLASS__, $name)); + } + return constant($const); + } +} + diff --git a/src/php/tests/interop/Grpc/Testing/ReconnectInfo.php b/src/php/tests/interop/Grpc/Testing/ReconnectInfo.php new file mode 100644 index 00000000000..58ac838a859 --- /dev/null +++ b/src/php/tests/interop/Grpc/Testing/ReconnectInfo.php @@ -0,0 +1,89 @@ +grpc.testing.ReconnectInfo + */ +class ReconnectInfo extends \Google\Protobuf\Internal\Message +{ + /** + * Generated from protobuf field bool passed = 1; + */ + protected $passed = false; + /** + * Generated from protobuf field repeated int32 backoff_ms = 2; + */ + private $backoff_ms; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type bool $passed + * @type int[]|\Google\Protobuf\Internal\RepeatedField $backoff_ms + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Src\Proto\Grpc\Testing\Messages::initOnce(); + parent::__construct($data); + } + + /** + * Generated from protobuf field bool passed = 1; + * @return bool + */ + public function getPassed() + { + return $this->passed; + } + + /** + * Generated from protobuf field bool passed = 1; + * @param bool $var + * @return $this + */ + public function setPassed($var) + { + GPBUtil::checkBool($var); + $this->passed = $var; + + return $this; + } + + /** + * Generated from protobuf field repeated int32 backoff_ms = 2; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getBackoffMs() + { + return $this->backoff_ms; + } + + /** + * Generated from protobuf field repeated int32 backoff_ms = 2; + * @param int[]|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setBackoffMs($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::INT32); + $this->backoff_ms = $arr; + + return $this; + } + +} + diff --git a/src/php/tests/interop/Grpc/Testing/ReconnectParams.php b/src/php/tests/interop/Grpc/Testing/ReconnectParams.php new file mode 100644 index 00000000000..599b13db1d6 --- /dev/null +++ b/src/php/tests/interop/Grpc/Testing/ReconnectParams.php @@ -0,0 +1,61 @@ +grpc.testing.ReconnectParams + */ +class ReconnectParams extends \Google\Protobuf\Internal\Message +{ + /** + * Generated from protobuf field int32 max_reconnect_backoff_ms = 1; + */ + protected $max_reconnect_backoff_ms = 0; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type int $max_reconnect_backoff_ms + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Src\Proto\Grpc\Testing\Messages::initOnce(); + parent::__construct($data); + } + + /** + * Generated from protobuf field int32 max_reconnect_backoff_ms = 1; + * @return int + */ + public function getMaxReconnectBackoffMs() + { + return $this->max_reconnect_backoff_ms; + } + + /** + * Generated from protobuf field int32 max_reconnect_backoff_ms = 1; + * @param int $var + * @return $this + */ + public function setMaxReconnectBackoffMs($var) + { + GPBUtil::checkInt32($var); + $this->max_reconnect_backoff_ms = $var; + + return $this; + } + +} + diff --git a/src/php/tests/interop/Grpc/Testing/ReconnectServiceClient.php b/src/php/tests/interop/Grpc/Testing/ReconnectServiceClient.php new file mode 100644 index 00000000000..50beca20e00 --- /dev/null +++ b/src/php/tests/interop/Grpc/Testing/ReconnectServiceClient.php @@ -0,0 +1,64 @@ +_simpleRequest('/grpc.testing.ReconnectService/Start', + $argument, + ['\Grpc\Testing\EmptyMessage', 'decode'], + $metadata, $options); + } + + /** + * @param \Grpc\Testing\EmptyMessage $argument input argument + * @param array $metadata metadata + * @param array $options call options + */ + public function Stop(\Grpc\Testing\EmptyMessage $argument, + $metadata = [], $options = []) { + return $this->_simpleRequest('/grpc.testing.ReconnectService/Stop', + $argument, + ['\Grpc\Testing\ReconnectInfo', 'decode'], + $metadata, $options); + } + +} diff --git a/src/php/tests/interop/Grpc/Testing/ResponseParameters.php b/src/php/tests/interop/Grpc/Testing/ResponseParameters.php new file mode 100644 index 00000000000..470349325c4 --- /dev/null +++ b/src/php/tests/interop/Grpc/Testing/ResponseParameters.php @@ -0,0 +1,151 @@ +grpc.testing.ResponseParameters + */ +class ResponseParameters extends \Google\Protobuf\Internal\Message +{ + /** + * Desired payload sizes in responses from the server. + * + * Generated from protobuf field int32 size = 1; + */ + protected $size = 0; + /** + * Desired interval between consecutive responses in the response stream in + * microseconds. + * + * Generated from protobuf field int32 interval_us = 2; + */ + protected $interval_us = 0; + /** + * Whether to request the server to compress the response. This field is + * "nullable" in order to interoperate seamlessly with clients not able to + * implement the full compression tests by introspecting the call to verify + * the response's compression status. + * + * Generated from protobuf field .grpc.testing.BoolValue compressed = 3; + */ + protected $compressed = null; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type int $size + * Desired payload sizes in responses from the server. + * @type int $interval_us + * Desired interval between consecutive responses in the response stream in + * microseconds. + * @type \Grpc\Testing\BoolValue $compressed + * Whether to request the server to compress the response. This field is + * "nullable" in order to interoperate seamlessly with clients not able to + * implement the full compression tests by introspecting the call to verify + * the response's compression status. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Src\Proto\Grpc\Testing\Messages::initOnce(); + parent::__construct($data); + } + + /** + * Desired payload sizes in responses from the server. + * + * Generated from protobuf field int32 size = 1; + * @return int + */ + public function getSize() + { + return $this->size; + } + + /** + * Desired payload sizes in responses from the server. + * + * Generated from protobuf field int32 size = 1; + * @param int $var + * @return $this + */ + public function setSize($var) + { + GPBUtil::checkInt32($var); + $this->size = $var; + + return $this; + } + + /** + * Desired interval between consecutive responses in the response stream in + * microseconds. + * + * Generated from protobuf field int32 interval_us = 2; + * @return int + */ + public function getIntervalUs() + { + return $this->interval_us; + } + + /** + * Desired interval between consecutive responses in the response stream in + * microseconds. + * + * Generated from protobuf field int32 interval_us = 2; + * @param int $var + * @return $this + */ + public function setIntervalUs($var) + { + GPBUtil::checkInt32($var); + $this->interval_us = $var; + + return $this; + } + + /** + * Whether to request the server to compress the response. This field is + * "nullable" in order to interoperate seamlessly with clients not able to + * implement the full compression tests by introspecting the call to verify + * the response's compression status. + * + * Generated from protobuf field .grpc.testing.BoolValue compressed = 3; + * @return \Grpc\Testing\BoolValue + */ + public function getCompressed() + { + return $this->compressed; + } + + /** + * Whether to request the server to compress the response. This field is + * "nullable" in order to interoperate seamlessly with clients not able to + * implement the full compression tests by introspecting the call to verify + * the response's compression status. + * + * Generated from protobuf field .grpc.testing.BoolValue compressed = 3; + * @param \Grpc\Testing\BoolValue $var + * @return $this + */ + public function setCompressed($var) + { + GPBUtil::checkMessage($var, \Grpc\Testing\BoolValue::class); + $this->compressed = $var; + + return $this; + } + +} + diff --git a/src/php/tests/interop/Grpc/Testing/SimpleRequest.php b/src/php/tests/interop/Grpc/Testing/SimpleRequest.php new file mode 100644 index 00000000000..95393659811 --- /dev/null +++ b/src/php/tests/interop/Grpc/Testing/SimpleRequest.php @@ -0,0 +1,389 @@ +grpc.testing.SimpleRequest + */ +class SimpleRequest extends \Google\Protobuf\Internal\Message +{ + /** + * Desired payload type in the response from the server. + * If response_type is RANDOM, server randomly chooses one from other formats. + * + * Generated from protobuf field .grpc.testing.PayloadType response_type = 1; + */ + protected $response_type = 0; + /** + * Desired payload size in the response from the server. + * + * Generated from protobuf field int32 response_size = 2; + */ + protected $response_size = 0; + /** + * Optional input payload sent along with the request. + * + * Generated from protobuf field .grpc.testing.Payload payload = 3; + */ + protected $payload = null; + /** + * Whether SimpleResponse should include username. + * + * Generated from protobuf field bool fill_username = 4; + */ + protected $fill_username = false; + /** + * Whether SimpleResponse should include OAuth scope. + * + * Generated from protobuf field bool fill_oauth_scope = 5; + */ + protected $fill_oauth_scope = false; + /** + * Whether to request the server to compress the response. This field is + * "nullable" in order to interoperate seamlessly with clients not able to + * implement the full compression tests by introspecting the call to verify + * the response's compression status. + * + * Generated from protobuf field .grpc.testing.BoolValue response_compressed = 6; + */ + protected $response_compressed = null; + /** + * Whether server should return a given status + * + * Generated from protobuf field .grpc.testing.EchoStatus response_status = 7; + */ + protected $response_status = null; + /** + * Whether the server should expect this request to be compressed. + * + * Generated from protobuf field .grpc.testing.BoolValue expect_compressed = 8; + */ + protected $expect_compressed = null; + /** + * Whether SimpleResponse should include server_id. + * + * Generated from protobuf field bool fill_server_id = 9; + */ + protected $fill_server_id = false; + /** + * Whether SimpleResponse should include grpclb_route_type. + * + * Generated from protobuf field bool fill_grpclb_route_type = 10; + */ + protected $fill_grpclb_route_type = false; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type int $response_type + * Desired payload type in the response from the server. + * If response_type is RANDOM, server randomly chooses one from other formats. + * @type int $response_size + * Desired payload size in the response from the server. + * @type \Grpc\Testing\Payload $payload + * Optional input payload sent along with the request. + * @type bool $fill_username + * Whether SimpleResponse should include username. + * @type bool $fill_oauth_scope + * Whether SimpleResponse should include OAuth scope. + * @type \Grpc\Testing\BoolValue $response_compressed + * Whether to request the server to compress the response. This field is + * "nullable" in order to interoperate seamlessly with clients not able to + * implement the full compression tests by introspecting the call to verify + * the response's compression status. + * @type \Grpc\Testing\EchoStatus $response_status + * Whether server should return a given status + * @type \Grpc\Testing\BoolValue $expect_compressed + * Whether the server should expect this request to be compressed. + * @type bool $fill_server_id + * Whether SimpleResponse should include server_id. + * @type bool $fill_grpclb_route_type + * Whether SimpleResponse should include grpclb_route_type. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Src\Proto\Grpc\Testing\Messages::initOnce(); + parent::__construct($data); + } + + /** + * Desired payload type in the response from the server. + * If response_type is RANDOM, server randomly chooses one from other formats. + * + * Generated from protobuf field .grpc.testing.PayloadType response_type = 1; + * @return int + */ + public function getResponseType() + { + return $this->response_type; + } + + /** + * Desired payload type in the response from the server. + * If response_type is RANDOM, server randomly chooses one from other formats. + * + * Generated from protobuf field .grpc.testing.PayloadType response_type = 1; + * @param int $var + * @return $this + */ + public function setResponseType($var) + { + GPBUtil::checkEnum($var, \Grpc\Testing\PayloadType::class); + $this->response_type = $var; + + return $this; + } + + /** + * Desired payload size in the response from the server. + * + * Generated from protobuf field int32 response_size = 2; + * @return int + */ + public function getResponseSize() + { + return $this->response_size; + } + + /** + * Desired payload size in the response from the server. + * + * Generated from protobuf field int32 response_size = 2; + * @param int $var + * @return $this + */ + public function setResponseSize($var) + { + GPBUtil::checkInt32($var); + $this->response_size = $var; + + return $this; + } + + /** + * Optional input payload sent along with the request. + * + * Generated from protobuf field .grpc.testing.Payload payload = 3; + * @return \Grpc\Testing\Payload + */ + public function getPayload() + { + return $this->payload; + } + + /** + * Optional input payload sent along with the request. + * + * Generated from protobuf field .grpc.testing.Payload payload = 3; + * @param \Grpc\Testing\Payload $var + * @return $this + */ + public function setPayload($var) + { + GPBUtil::checkMessage($var, \Grpc\Testing\Payload::class); + $this->payload = $var; + + return $this; + } + + /** + * Whether SimpleResponse should include username. + * + * Generated from protobuf field bool fill_username = 4; + * @return bool + */ + public function getFillUsername() + { + return $this->fill_username; + } + + /** + * Whether SimpleResponse should include username. + * + * Generated from protobuf field bool fill_username = 4; + * @param bool $var + * @return $this + */ + public function setFillUsername($var) + { + GPBUtil::checkBool($var); + $this->fill_username = $var; + + return $this; + } + + /** + * Whether SimpleResponse should include OAuth scope. + * + * Generated from protobuf field bool fill_oauth_scope = 5; + * @return bool + */ + public function getFillOauthScope() + { + return $this->fill_oauth_scope; + } + + /** + * Whether SimpleResponse should include OAuth scope. + * + * Generated from protobuf field bool fill_oauth_scope = 5; + * @param bool $var + * @return $this + */ + public function setFillOauthScope($var) + { + GPBUtil::checkBool($var); + $this->fill_oauth_scope = $var; + + return $this; + } + + /** + * Whether to request the server to compress the response. This field is + * "nullable" in order to interoperate seamlessly with clients not able to + * implement the full compression tests by introspecting the call to verify + * the response's compression status. + * + * Generated from protobuf field .grpc.testing.BoolValue response_compressed = 6; + * @return \Grpc\Testing\BoolValue + */ + public function getResponseCompressed() + { + return $this->response_compressed; + } + + /** + * Whether to request the server to compress the response. This field is + * "nullable" in order to interoperate seamlessly with clients not able to + * implement the full compression tests by introspecting the call to verify + * the response's compression status. + * + * Generated from protobuf field .grpc.testing.BoolValue response_compressed = 6; + * @param \Grpc\Testing\BoolValue $var + * @return $this + */ + public function setResponseCompressed($var) + { + GPBUtil::checkMessage($var, \Grpc\Testing\BoolValue::class); + $this->response_compressed = $var; + + return $this; + } + + /** + * Whether server should return a given status + * + * Generated from protobuf field .grpc.testing.EchoStatus response_status = 7; + * @return \Grpc\Testing\EchoStatus + */ + public function getResponseStatus() + { + return $this->response_status; + } + + /** + * Whether server should return a given status + * + * Generated from protobuf field .grpc.testing.EchoStatus response_status = 7; + * @param \Grpc\Testing\EchoStatus $var + * @return $this + */ + public function setResponseStatus($var) + { + GPBUtil::checkMessage($var, \Grpc\Testing\EchoStatus::class); + $this->response_status = $var; + + return $this; + } + + /** + * Whether the server should expect this request to be compressed. + * + * Generated from protobuf field .grpc.testing.BoolValue expect_compressed = 8; + * @return \Grpc\Testing\BoolValue + */ + public function getExpectCompressed() + { + return $this->expect_compressed; + } + + /** + * Whether the server should expect this request to be compressed. + * + * Generated from protobuf field .grpc.testing.BoolValue expect_compressed = 8; + * @param \Grpc\Testing\BoolValue $var + * @return $this + */ + public function setExpectCompressed($var) + { + GPBUtil::checkMessage($var, \Grpc\Testing\BoolValue::class); + $this->expect_compressed = $var; + + return $this; + } + + /** + * Whether SimpleResponse should include server_id. + * + * Generated from protobuf field bool fill_server_id = 9; + * @return bool + */ + public function getFillServerId() + { + return $this->fill_server_id; + } + + /** + * Whether SimpleResponse should include server_id. + * + * Generated from protobuf field bool fill_server_id = 9; + * @param bool $var + * @return $this + */ + public function setFillServerId($var) + { + GPBUtil::checkBool($var); + $this->fill_server_id = $var; + + return $this; + } + + /** + * Whether SimpleResponse should include grpclb_route_type. + * + * Generated from protobuf field bool fill_grpclb_route_type = 10; + * @return bool + */ + public function getFillGrpclbRouteType() + { + return $this->fill_grpclb_route_type; + } + + /** + * Whether SimpleResponse should include grpclb_route_type. + * + * Generated from protobuf field bool fill_grpclb_route_type = 10; + * @param bool $var + * @return $this + */ + public function setFillGrpclbRouteType($var) + { + GPBUtil::checkBool($var); + $this->fill_grpclb_route_type = $var; + + return $this; + } + +} + diff --git a/src/php/tests/interop/Grpc/Testing/SimpleResponse.php b/src/php/tests/interop/Grpc/Testing/SimpleResponse.php new file mode 100644 index 00000000000..7121fc215ec --- /dev/null +++ b/src/php/tests/interop/Grpc/Testing/SimpleResponse.php @@ -0,0 +1,245 @@ +grpc.testing.SimpleResponse + */ +class SimpleResponse extends \Google\Protobuf\Internal\Message +{ + /** + * Payload to increase message size. + * + * Generated from protobuf field .grpc.testing.Payload payload = 1; + */ + protected $payload = null; + /** + * The user the request came from, for verifying authentication was + * successful when the client expected it. + * + * Generated from protobuf field string username = 2; + */ + protected $username = ''; + /** + * OAuth scope. + * + * Generated from protobuf field string oauth_scope = 3; + */ + protected $oauth_scope = ''; + /** + * Server ID. This must be unique among different server instances, + * but the same across all RPC's made to a particular server instance. + * + * Generated from protobuf field string server_id = 4; + */ + protected $server_id = ''; + /** + * gRPCLB Path. + * + * Generated from protobuf field .grpc.testing.GrpclbRouteType grpclb_route_type = 5; + */ + protected $grpclb_route_type = 0; + /** + * Server hostname. + * + * Generated from protobuf field string hostname = 6; + */ + protected $hostname = ''; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type \Grpc\Testing\Payload $payload + * Payload to increase message size. + * @type string $username + * The user the request came from, for verifying authentication was + * successful when the client expected it. + * @type string $oauth_scope + * OAuth scope. + * @type string $server_id + * Server ID. This must be unique among different server instances, + * but the same across all RPC's made to a particular server instance. + * @type int $grpclb_route_type + * gRPCLB Path. + * @type string $hostname + * Server hostname. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Src\Proto\Grpc\Testing\Messages::initOnce(); + parent::__construct($data); + } + + /** + * Payload to increase message size. + * + * Generated from protobuf field .grpc.testing.Payload payload = 1; + * @return \Grpc\Testing\Payload + */ + public function getPayload() + { + return $this->payload; + } + + /** + * Payload to increase message size. + * + * Generated from protobuf field .grpc.testing.Payload payload = 1; + * @param \Grpc\Testing\Payload $var + * @return $this + */ + public function setPayload($var) + { + GPBUtil::checkMessage($var, \Grpc\Testing\Payload::class); + $this->payload = $var; + + return $this; + } + + /** + * The user the request came from, for verifying authentication was + * successful when the client expected it. + * + * Generated from protobuf field string username = 2; + * @return string + */ + public function getUsername() + { + return $this->username; + } + + /** + * The user the request came from, for verifying authentication was + * successful when the client expected it. + * + * Generated from protobuf field string username = 2; + * @param string $var + * @return $this + */ + public function setUsername($var) + { + GPBUtil::checkString($var, True); + $this->username = $var; + + return $this; + } + + /** + * OAuth scope. + * + * Generated from protobuf field string oauth_scope = 3; + * @return string + */ + public function getOauthScope() + { + return $this->oauth_scope; + } + + /** + * OAuth scope. + * + * Generated from protobuf field string oauth_scope = 3; + * @param string $var + * @return $this + */ + public function setOauthScope($var) + { + GPBUtil::checkString($var, True); + $this->oauth_scope = $var; + + return $this; + } + + /** + * Server ID. This must be unique among different server instances, + * but the same across all RPC's made to a particular server instance. + * + * Generated from protobuf field string server_id = 4; + * @return string + */ + public function getServerId() + { + return $this->server_id; + } + + /** + * Server ID. This must be unique among different server instances, + * but the same across all RPC's made to a particular server instance. + * + * Generated from protobuf field string server_id = 4; + * @param string $var + * @return $this + */ + public function setServerId($var) + { + GPBUtil::checkString($var, True); + $this->server_id = $var; + + return $this; + } + + /** + * gRPCLB Path. + * + * Generated from protobuf field .grpc.testing.GrpclbRouteType grpclb_route_type = 5; + * @return int + */ + public function getGrpclbRouteType() + { + return $this->grpclb_route_type; + } + + /** + * gRPCLB Path. + * + * Generated from protobuf field .grpc.testing.GrpclbRouteType grpclb_route_type = 5; + * @param int $var + * @return $this + */ + public function setGrpclbRouteType($var) + { + GPBUtil::checkEnum($var, \Grpc\Testing\GrpclbRouteType::class); + $this->grpclb_route_type = $var; + + return $this; + } + + /** + * Server hostname. + * + * Generated from protobuf field string hostname = 6; + * @return string + */ + public function getHostname() + { + return $this->hostname; + } + + /** + * Server hostname. + * + * Generated from protobuf field string hostname = 6; + * @param string $var + * @return $this + */ + public function setHostname($var) + { + GPBUtil::checkString($var, True); + $this->hostname = $var; + + return $this; + } + +} + diff --git a/src/php/tests/interop/Grpc/Testing/StreamingInputCallRequest.php b/src/php/tests/interop/Grpc/Testing/StreamingInputCallRequest.php new file mode 100644 index 00000000000..00c754b946b --- /dev/null +++ b/src/php/tests/interop/Grpc/Testing/StreamingInputCallRequest.php @@ -0,0 +1,113 @@ +grpc.testing.StreamingInputCallRequest + */ +class StreamingInputCallRequest extends \Google\Protobuf\Internal\Message +{ + /** + * Optional input payload sent along with the request. + * + * Generated from protobuf field .grpc.testing.Payload payload = 1; + */ + protected $payload = null; + /** + * Whether the server should expect this request to be compressed. This field + * is "nullable" in order to interoperate seamlessly with servers not able to + * implement the full compression tests by introspecting the call to verify + * the request's compression status. + * + * Generated from protobuf field .grpc.testing.BoolValue expect_compressed = 2; + */ + protected $expect_compressed = null; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type \Grpc\Testing\Payload $payload + * Optional input payload sent along with the request. + * @type \Grpc\Testing\BoolValue $expect_compressed + * Whether the server should expect this request to be compressed. This field + * is "nullable" in order to interoperate seamlessly with servers not able to + * implement the full compression tests by introspecting the call to verify + * the request's compression status. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Src\Proto\Grpc\Testing\Messages::initOnce(); + parent::__construct($data); + } + + /** + * Optional input payload sent along with the request. + * + * Generated from protobuf field .grpc.testing.Payload payload = 1; + * @return \Grpc\Testing\Payload + */ + public function getPayload() + { + return $this->payload; + } + + /** + * Optional input payload sent along with the request. + * + * Generated from protobuf field .grpc.testing.Payload payload = 1; + * @param \Grpc\Testing\Payload $var + * @return $this + */ + public function setPayload($var) + { + GPBUtil::checkMessage($var, \Grpc\Testing\Payload::class); + $this->payload = $var; + + return $this; + } + + /** + * Whether the server should expect this request to be compressed. This field + * is "nullable" in order to interoperate seamlessly with servers not able to + * implement the full compression tests by introspecting the call to verify + * the request's compression status. + * + * Generated from protobuf field .grpc.testing.BoolValue expect_compressed = 2; + * @return \Grpc\Testing\BoolValue + */ + public function getExpectCompressed() + { + return $this->expect_compressed; + } + + /** + * Whether the server should expect this request to be compressed. This field + * is "nullable" in order to interoperate seamlessly with servers not able to + * implement the full compression tests by introspecting the call to verify + * the request's compression status. + * + * Generated from protobuf field .grpc.testing.BoolValue expect_compressed = 2; + * @param \Grpc\Testing\BoolValue $var + * @return $this + */ + public function setExpectCompressed($var) + { + GPBUtil::checkMessage($var, \Grpc\Testing\BoolValue::class); + $this->expect_compressed = $var; + + return $this; + } + +} + diff --git a/src/php/tests/interop/Grpc/Testing/StreamingInputCallResponse.php b/src/php/tests/interop/Grpc/Testing/StreamingInputCallResponse.php new file mode 100644 index 00000000000..f7ff87c1fb1 --- /dev/null +++ b/src/php/tests/interop/Grpc/Testing/StreamingInputCallResponse.php @@ -0,0 +1,67 @@ +grpc.testing.StreamingInputCallResponse + */ +class StreamingInputCallResponse extends \Google\Protobuf\Internal\Message +{ + /** + * Aggregated size of payloads received from the client. + * + * Generated from protobuf field int32 aggregated_payload_size = 1; + */ + protected $aggregated_payload_size = 0; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type int $aggregated_payload_size + * Aggregated size of payloads received from the client. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Src\Proto\Grpc\Testing\Messages::initOnce(); + parent::__construct($data); + } + + /** + * Aggregated size of payloads received from the client. + * + * Generated from protobuf field int32 aggregated_payload_size = 1; + * @return int + */ + public function getAggregatedPayloadSize() + { + return $this->aggregated_payload_size; + } + + /** + * Aggregated size of payloads received from the client. + * + * Generated from protobuf field int32 aggregated_payload_size = 1; + * @param int $var + * @return $this + */ + public function setAggregatedPayloadSize($var) + { + GPBUtil::checkInt32($var); + $this->aggregated_payload_size = $var; + + return $this; + } + +} + diff --git a/src/php/tests/interop/Grpc/Testing/StreamingOutputCallRequest.php b/src/php/tests/interop/Grpc/Testing/StreamingOutputCallRequest.php new file mode 100644 index 00000000000..552e96d7ae2 --- /dev/null +++ b/src/php/tests/interop/Grpc/Testing/StreamingOutputCallRequest.php @@ -0,0 +1,181 @@ +grpc.testing.StreamingOutputCallRequest + */ +class StreamingOutputCallRequest extends \Google\Protobuf\Internal\Message +{ + /** + * Desired payload type in the response from the server. + * If response_type is RANDOM, the payload from each response in the stream + * might be of different types. This is to simulate a mixed type of payload + * stream. + * + * Generated from protobuf field .grpc.testing.PayloadType response_type = 1; + */ + protected $response_type = 0; + /** + * Configuration for each expected response message. + * + * Generated from protobuf field repeated .grpc.testing.ResponseParameters response_parameters = 2; + */ + private $response_parameters; + /** + * Optional input payload sent along with the request. + * + * Generated from protobuf field .grpc.testing.Payload payload = 3; + */ + protected $payload = null; + /** + * Whether server should return a given status + * + * Generated from protobuf field .grpc.testing.EchoStatus response_status = 7; + */ + protected $response_status = null; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type int $response_type + * Desired payload type in the response from the server. + * If response_type is RANDOM, the payload from each response in the stream + * might be of different types. This is to simulate a mixed type of payload + * stream. + * @type \Grpc\Testing\ResponseParameters[]|\Google\Protobuf\Internal\RepeatedField $response_parameters + * Configuration for each expected response message. + * @type \Grpc\Testing\Payload $payload + * Optional input payload sent along with the request. + * @type \Grpc\Testing\EchoStatus $response_status + * Whether server should return a given status + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Src\Proto\Grpc\Testing\Messages::initOnce(); + parent::__construct($data); + } + + /** + * Desired payload type in the response from the server. + * If response_type is RANDOM, the payload from each response in the stream + * might be of different types. This is to simulate a mixed type of payload + * stream. + * + * Generated from protobuf field .grpc.testing.PayloadType response_type = 1; + * @return int + */ + public function getResponseType() + { + return $this->response_type; + } + + /** + * Desired payload type in the response from the server. + * If response_type is RANDOM, the payload from each response in the stream + * might be of different types. This is to simulate a mixed type of payload + * stream. + * + * Generated from protobuf field .grpc.testing.PayloadType response_type = 1; + * @param int $var + * @return $this + */ + public function setResponseType($var) + { + GPBUtil::checkEnum($var, \Grpc\Testing\PayloadType::class); + $this->response_type = $var; + + return $this; + } + + /** + * Configuration for each expected response message. + * + * Generated from protobuf field repeated .grpc.testing.ResponseParameters response_parameters = 2; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getResponseParameters() + { + return $this->response_parameters; + } + + /** + * Configuration for each expected response message. + * + * Generated from protobuf field repeated .grpc.testing.ResponseParameters response_parameters = 2; + * @param \Grpc\Testing\ResponseParameters[]|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setResponseParameters($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Grpc\Testing\ResponseParameters::class); + $this->response_parameters = $arr; + + return $this; + } + + /** + * Optional input payload sent along with the request. + * + * Generated from protobuf field .grpc.testing.Payload payload = 3; + * @return \Grpc\Testing\Payload + */ + public function getPayload() + { + return $this->payload; + } + + /** + * Optional input payload sent along with the request. + * + * Generated from protobuf field .grpc.testing.Payload payload = 3; + * @param \Grpc\Testing\Payload $var + * @return $this + */ + public function setPayload($var) + { + GPBUtil::checkMessage($var, \Grpc\Testing\Payload::class); + $this->payload = $var; + + return $this; + } + + /** + * Whether server should return a given status + * + * Generated from protobuf field .grpc.testing.EchoStatus response_status = 7; + * @return \Grpc\Testing\EchoStatus + */ + public function getResponseStatus() + { + return $this->response_status; + } + + /** + * Whether server should return a given status + * + * Generated from protobuf field .grpc.testing.EchoStatus response_status = 7; + * @param \Grpc\Testing\EchoStatus $var + * @return $this + */ + public function setResponseStatus($var) + { + GPBUtil::checkMessage($var, \Grpc\Testing\EchoStatus::class); + $this->response_status = $var; + + return $this; + } + +} + diff --git a/src/php/tests/interop/Grpc/Testing/StreamingOutputCallResponse.php b/src/php/tests/interop/Grpc/Testing/StreamingOutputCallResponse.php new file mode 100644 index 00000000000..b28b906ce93 --- /dev/null +++ b/src/php/tests/interop/Grpc/Testing/StreamingOutputCallResponse.php @@ -0,0 +1,67 @@ +grpc.testing.StreamingOutputCallResponse + */ +class StreamingOutputCallResponse extends \Google\Protobuf\Internal\Message +{ + /** + * Payload to increase response size. + * + * Generated from protobuf field .grpc.testing.Payload payload = 1; + */ + protected $payload = null; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type \Grpc\Testing\Payload $payload + * Payload to increase response size. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Src\Proto\Grpc\Testing\Messages::initOnce(); + parent::__construct($data); + } + + /** + * Payload to increase response size. + * + * Generated from protobuf field .grpc.testing.Payload payload = 1; + * @return \Grpc\Testing\Payload + */ + public function getPayload() + { + return $this->payload; + } + + /** + * Payload to increase response size. + * + * Generated from protobuf field .grpc.testing.Payload payload = 1; + * @param \Grpc\Testing\Payload $var + * @return $this + */ + public function setPayload($var) + { + GPBUtil::checkMessage($var, \Grpc\Testing\Payload::class); + $this->payload = $var; + + return $this; + } + +} + diff --git a/src/php/tests/interop/Grpc/Testing/TestServiceClient.php b/src/php/tests/interop/Grpc/Testing/TestServiceClient.php new file mode 100644 index 00000000000..e6fef125b8b --- /dev/null +++ b/src/php/tests/interop/Grpc/Testing/TestServiceClient.php @@ -0,0 +1,152 @@ +_simpleRequest('/grpc.testing.TestService/EmptyCall', + $argument, + ['\Grpc\Testing\EmptyMessage', 'decode'], + $metadata, $options); + } + + /** + * One request followed by one response. + * @param \Grpc\Testing\SimpleRequest $argument input argument + * @param array $metadata metadata + * @param array $options call options + */ + public function UnaryCall(\Grpc\Testing\SimpleRequest $argument, + $metadata = [], $options = []) { + return $this->_simpleRequest('/grpc.testing.TestService/UnaryCall', + $argument, + ['\Grpc\Testing\SimpleResponse', 'decode'], + $metadata, $options); + } + + /** + * One request followed by one response. Response has cache control + * headers set such that a caching HTTP proxy (such as GFE) can + * satisfy subsequent requests. + * @param \Grpc\Testing\SimpleRequest $argument input argument + * @param array $metadata metadata + * @param array $options call options + */ + public function CacheableUnaryCall(\Grpc\Testing\SimpleRequest $argument, + $metadata = [], $options = []) { + return $this->_simpleRequest('/grpc.testing.TestService/CacheableUnaryCall', + $argument, + ['\Grpc\Testing\SimpleResponse', 'decode'], + $metadata, $options); + } + + /** + * One request followed by a sequence of responses (streamed download). + * The server returns the payload with client desired type and sizes. + * @param \Grpc\Testing\StreamingOutputCallRequest $argument input argument + * @param array $metadata metadata + * @param array $options call options + */ + public function StreamingOutputCall(\Grpc\Testing\StreamingOutputCallRequest $argument, + $metadata = [], $options = []) { + return $this->_serverStreamRequest('/grpc.testing.TestService/StreamingOutputCall', + $argument, + ['\Grpc\Testing\StreamingOutputCallResponse', 'decode'], + $metadata, $options); + } + + /** + * A sequence of requests followed by one response (streamed upload). + * The server returns the aggregated size of client payload as the result. + * @param array $metadata metadata + * @param array $options call options + */ + public function StreamingInputCall($metadata = [], $options = []) { + return $this->_clientStreamRequest('/grpc.testing.TestService/StreamingInputCall', + ['\Grpc\Testing\StreamingInputCallResponse','decode'], + $metadata, $options); + } + + /** + * A sequence of requests with each request served by the server immediately. + * As one request could lead to multiple responses, this interface + * demonstrates the idea of full duplexing. + * @param array $metadata metadata + * @param array $options call options + */ + public function FullDuplexCall($metadata = [], $options = []) { + return $this->_bidiRequest('/grpc.testing.TestService/FullDuplexCall', + ['\Grpc\Testing\StreamingOutputCallResponse','decode'], + $metadata, $options); + } + + /** + * A sequence of requests followed by a sequence of responses. + * The server buffers all the client requests and then serves them in order. A + * stream of responses are returned to the client when the server starts with + * first request. + * @param array $metadata metadata + * @param array $options call options + */ + public function HalfDuplexCall($metadata = [], $options = []) { + return $this->_bidiRequest('/grpc.testing.TestService/HalfDuplexCall', + ['\Grpc\Testing\StreamingOutputCallResponse','decode'], + $metadata, $options); + } + + /** + * The test server will not implement this method. It will be used + * to test the behavior when clients call unimplemented methods. + * @param \Grpc\Testing\EmptyMessage $argument input argument + * @param array $metadata metadata + * @param array $options call options + */ + public function UnimplementedCall(\Grpc\Testing\EmptyMessage $argument, + $metadata = [], $options = []) { + return $this->_simpleRequest('/grpc.testing.TestService/UnimplementedCall', + $argument, + ['\Grpc\Testing\EmptyMessage', 'decode'], + $metadata, $options); + } + +} diff --git a/src/php/tests/interop/Grpc/Testing/UnimplementedServiceClient.php b/src/php/tests/interop/Grpc/Testing/UnimplementedServiceClient.php new file mode 100644 index 00000000000..2c1d921bfcc --- /dev/null +++ b/src/php/tests/interop/Grpc/Testing/UnimplementedServiceClient.php @@ -0,0 +1,53 @@ +_simpleRequest('/grpc.testing.UnimplementedService/UnimplementedCall', + $argument, + ['\Grpc\Testing\EmptyMessage', 'decode'], + $metadata, $options); + } + +} From 7ec6ad434f6306bfc5f7add9187362ff50957273 Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Mon, 20 Apr 2020 13:27:49 +0200 Subject: [PATCH 575/758] regenerate PHP protos --- .../GPBMetadata/Src/Proto/Grpc/Core/Stats.php | 2 +- .../Proto/Grpc/Testing/BenchmarkService.php | 2 +- .../Src/Proto/Grpc/Testing/CompilerTest.php | 2 +- .../Src/Proto/Grpc/Testing/Control.php | 166 +++++++++--------- .../Src/Proto/Grpc/Testing/Echo.php | 43 ----- .../Src/Proto/Grpc/Testing/EchoMessages.php | 28 +-- .../Src/Proto/Grpc/Testing/EmptyService.php | 26 +++ .../Src/Proto/Grpc/Testing/Messages.php | 81 +++++---- .../Src/Proto/Grpc/Testing/Metrics.php | 36 ---- .../Testing/{GPBEmpty.php => PBEmpty.php} | 10 +- .../Src/Proto/Grpc/Testing/Payloads.php | 2 +- .../Src/Proto/Grpc/Testing/ProxyService.php | 2 +- .../Grpc/Testing/ReportQpsScenarioService.php | 2 +- .../Src/Proto/Grpc/Testing/Stats.php | 2 +- .../Src/Proto/Grpc/Testing/Test.php | 76 ++++---- .../Src/Proto/Grpc/Testing/WorkerService.php | 2 +- .../qps/generated_code/Grpc/Core/Bucket.php | 18 +- .../generated_code/Grpc/Core/Histogram.php | 13 +- .../qps/generated_code/Grpc/Core/Metric.php | 17 +- .../qps/generated_code/Grpc/Core/Stats.php | 13 +- .../generated_code/Grpc/Testing/BoolValue.php | 16 +- .../Grpc/Testing/ByteBufferParams.php | 18 +- .../Grpc/Testing/ChannelArg.php | 17 +- .../Grpc/Testing/ClientArgs.php | 14 +- .../Grpc/Testing/ClientConfig.php | 141 +++++++++++++-- .../Grpc/Testing/ClientStats.php | 36 +++- .../Grpc/Testing/ClientStatus.php | 15 +- .../Grpc/Testing/ClientType.php | 35 +++- .../Grpc/Testing/ClosedLoopParams.php | 12 +- .../Grpc/Testing/ComplexProtoParams.php | 12 +- .../Grpc/Testing/CoreRequest.php | 12 +- .../Grpc/Testing/CoreResponse.php | 16 +- .../generated_code/Grpc/Testing/DebugInfo.php | 16 +- .../Grpc/Testing/EchoRequest.php | 18 +- .../Grpc/Testing/EchoResponse.php | 18 +- .../Grpc/Testing/EchoStatus.php | 18 +- .../Grpc/Testing/EchoTestServiceClient.php | 93 ---------- .../Grpc/Testing/EmptyMessage.php | 23 ++- ...rviceClient.php => EmptyServiceClient.php} | 7 +- .../Grpc/Testing/ErrorStatus.php | 21 ++- .../Grpc/Testing/GaugeRequest.php | 51 ------ .../Grpc/Testing/GaugeResponse.php | 126 ------------- .../Grpc/Testing/GrpclbRouteType.php | 66 +++++++ .../Grpc/Testing/HistogramData.php | 28 ++- .../Grpc/Testing/HistogramParams.php | 20 ++- .../Grpc/Testing/LoadBalancerStatsRequest.php | 99 +++++++++++ .../Testing/LoadBalancerStatsResponse.php | 99 +++++++++++ ...php => LoadBalancerStatsServiceClient.php} | 17 +- .../Grpc/Testing/LoadParams.php | 14 +- .../qps/generated_code/Grpc/Testing/Mark.php | 16 +- .../Grpc/Testing/MetricsServiceClient.php | 69 -------- .../generated_code/Grpc/Testing/PBEmpty.php | 30 ---- .../generated_code/Grpc/Testing/PBVoid.php | 12 +- .../generated_code/Grpc/Testing/Payload.php | 23 ++- .../Grpc/Testing/PayloadConfig.php | 15 +- .../Grpc/Testing/PayloadType.php | 29 ++- .../Grpc/Testing/PoissonParams.php | 16 +- .../generated_code/Grpc/Testing/ProxyStat.php | 15 +- .../Grpc/Testing/ReconnectInfo.php | 16 +- .../Grpc/Testing/ReconnectParams.php | 15 +- .../Grpc/Testing/ReconnectServiceClient.php | 6 +- .../generated_code/Grpc/Testing/Request.php | 12 +- .../Grpc/Testing/RequestParams.php | 154 +++++++++++++--- .../Grpc/Testing/RequestResultCount.php | 18 +- .../generated_code/Grpc/Testing/Response.php | 12 +- .../Grpc/Testing/ResponseParameters.php | 28 ++- .../Grpc/Testing/ResponseParams.php | 21 ++- .../generated_code/Grpc/Testing/RpcType.php | 32 +++- .../generated_code/Grpc/Testing/Scenario.php | 44 +++-- .../Grpc/Testing/ScenarioResult.php | 35 +++- .../Grpc/Testing/ScenarioResultSummary.php | 135 ++++++++++---- .../generated_code/Grpc/Testing/Scenarios.php | 13 +- .../Grpc/Testing/SecurityParams.php | 21 ++- .../Grpc/Testing/ServerArgs.php | 14 +- .../Grpc/Testing/ServerConfig.php | 86 +++++++-- .../Grpc/Testing/ServerStats.php | 41 ++++- .../Grpc/Testing/ServerStatus.php | 23 ++- .../Grpc/Testing/ServerType.php | 36 +++- .../Grpc/Testing/SimpleProtoParams.php | 18 +- .../Grpc/Testing/SimpleRequest.php | 119 +++++++++++-- .../Grpc/Testing/SimpleResponse.php | 131 +++++++++++++- .../Testing/StreamingInputCallRequest.php | 23 ++- .../Testing/StreamingInputCallResponse.php | 16 +- .../Testing/StreamingOutputCallRequest.php | 32 +++- .../Testing/StreamingOutputCallResponse.php | 16 +- .../Grpc/Testing/TestServiceClient.php | 12 +- .../Testing/UnimplementedServiceClient.php | 6 +- 87 files changed, 2046 insertions(+), 935 deletions(-) delete mode 100644 src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/Echo.php create mode 100644 src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/EmptyService.php delete mode 100644 src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/Metrics.php rename src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/{GPBEmpty.php => PBEmpty.php} (69%) delete mode 100644 src/php/tests/qps/generated_code/Grpc/Testing/EchoTestServiceClient.php rename src/php/tests/qps/generated_code/Grpc/Testing/{NoRpcServiceClient.php => EmptyServiceClient.php} (85%) delete mode 100644 src/php/tests/qps/generated_code/Grpc/Testing/GaugeRequest.php delete mode 100644 src/php/tests/qps/generated_code/Grpc/Testing/GaugeResponse.php create mode 100644 src/php/tests/qps/generated_code/Grpc/Testing/GrpclbRouteType.php create mode 100644 src/php/tests/qps/generated_code/Grpc/Testing/LoadBalancerStatsRequest.php create mode 100644 src/php/tests/qps/generated_code/Grpc/Testing/LoadBalancerStatsResponse.php rename src/php/tests/qps/generated_code/Grpc/Testing/{UnimplementedEchoServiceClient.php => LoadBalancerStatsServiceClient.php} (63%) delete mode 100644 src/php/tests/qps/generated_code/Grpc/Testing/MetricsServiceClient.php delete mode 100644 src/php/tests/qps/generated_code/Grpc/Testing/PBEmpty.php diff --git a/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Core/Stats.php b/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Core/Stats.php index f9c710cd4e0..36aaad2884b 100644 --- a/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Core/Stats.php +++ b/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Core/Stats.php @@ -25,7 +25,7 @@ class Stats "6973746f6772616d480042070a0576616c7565222b0a0553746174731222" . "0a076d65747269637318012003280b32112e677270632e636f72652e4d65" . "74726963620670726f746f33" - )); + ), true); static::$is_initialized = true; } diff --git a/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/BenchmarkService.php b/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/BenchmarkService.php index 906f6a2d846..ead856ba901 100644 --- a/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/BenchmarkService.php +++ b/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/BenchmarkService.php @@ -33,7 +33,7 @@ class BenchmarkService "6f746857617973121b2e677270632e74657374696e672e53696d706c6552" . "6571756573741a1c2e677270632e74657374696e672e53696d706c655265" . "73706f6e736528013001620670726f746f33" - )); + ), true); static::$is_initialized = true; } diff --git a/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/CompilerTest.php b/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/CompilerTest.php index 2c4fe92f052..3eb7acd5729 100644 --- a/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/CompilerTest.php +++ b/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/CompilerTest.php @@ -29,7 +29,7 @@ class CompilerTest "6573706f6e73652801300132450a08536572766963654212390a084d6574" . "686f64423112152e677270632e74657374696e672e526571756573741a16" . "2e677270632e74657374696e672e526573706f6e7365620670726f746f33" - )); + ), true); static::$is_initialized = true; } diff --git a/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/Control.php b/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/Control.php index 2319bcd0213..b92e61bf25a 100644 --- a/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/Control.php +++ b/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/Control.php @@ -17,7 +17,7 @@ class Control \GPBMetadata\Src\Proto\Grpc\Testing\Payloads::initOnce(); \GPBMetadata\Src\Proto\Grpc\Testing\Stats::initOnce(); $pool->internalAddGeneratedFile(hex2bin( - "0abc1a0a247372632f70726f746f2f677270632f74657374696e672f636f" . + "0acd1b0a247372632f70726f746f2f677270632f74657374696e672f636f" . "6e74726f6c2e70726f746f120c677270632e74657374696e671a22737263" . "2f70726f746f2f677270632f74657374696e672f73746174732e70726f74" . "6f22250a0d506f6973736f6e506172616d7312140a0c6f6666657265645f" . @@ -31,7 +31,7 @@ class Control "6f7665727269646518022001280912110a09637265645f74797065180320" . "012809224d0a0a4368616e6e656c417267120c0a046e616d651801200128" . "0912130a097374725f76616c7565180220012809480012130a09696e745f" . - "76616c7565180320012805480042070a0576616c756522ef040a0c436c69" . + "76616c7565180320012805480042070a0576616c756522bc050a0c436c69" . "656e74436f6e66696712160a0e7365727665725f74617267657473180120" . "032809122d0a0b636c69656e745f7479706518022001280e32182e677270" . "632e74657374696e672e436c69656e745479706512350a0f736563757269" . @@ -52,86 +52,90 @@ class Control "03280b32182e677270632e74657374696e672e4368616e6e656c41726712" . "160a0e746872656164735f7065725f6371181120012805121b0a136d6573" . "73616765735f7065725f73747265616d18122001280512180a107573655f" . - "636f616c657363655f61706918132001280822380a0c436c69656e745374" . + "636f616c657363655f61706918132001280812310a296d656469616e5f6c" . + "6174656e63795f636f6c6c656374696f6e5f696e74657276616c5f6d696c" . + "6c697318142001280512180a10636c69656e745f70726f63657373657318" . + "152001280522380a0c436c69656e7453746174757312280a057374617473" . + "18012001280b32192e677270632e74657374696e672e436c69656e745374" . + "61747322150a044d61726b120d0a05726573657418012001280822680a0a" . + "436c69656e7441726773122b0a05736574757018012001280b321a2e6772" . + "70632e74657374696e672e436c69656e74436f6e666967480012220a046d" . + "61726b18022001280b32122e677270632e74657374696e672e4d61726b48" . + "0042090a07617267747970652297030a0c536572766572436f6e66696712" . + "2d0a0b7365727665725f7479706518012001280e32182e677270632e7465" . + "7374696e672e5365727665725479706512350a0f73656375726974795f70" . + "6172616d7318022001280b321c2e677270632e74657374696e672e536563" . + "7572697479506172616d73120c0a04706f7274180420012805121c0a1461" . + "73796e635f7365727665725f7468726561647318072001280512120a0a63" . + "6f72655f6c696d697418082001280512330a0e7061796c6f61645f636f6e" . + "66696718092001280b321b2e677270632e74657374696e672e5061796c6f" . + "6164436f6e66696712110a09636f72655f6c697374180a2003280512180a" . + "106f746865725f7365727665725f617069180b2001280912160a0e746872" . + "656164735f7065725f6371180c20012805121c0a137265736f757263655f" . + "71756f74615f73697a6518e90720012805122f0a0c6368616e6e656c5f61" . + "72677318ea072003280b32182e677270632e74657374696e672e4368616e" . + "6e656c41726712180a107365727665725f70726f63657373657318152001" . + "280522680a0a53657276657241726773122b0a0573657475701801200128" . + "0b321a2e677270632e74657374696e672e536572766572436f6e66696748" . + "0012220a046d61726b18022001280b32122e677270632e74657374696e67" . + "2e4d61726b480042090a076172677479706522550a0c5365727665725374" . "6174757312280a05737461747318012001280b32192e677270632e746573" . - "74696e672e436c69656e74537461747322150a044d61726b120d0a057265" . - "73657418012001280822680a0a436c69656e7441726773122b0a05736574" . - "757018012001280b321a2e677270632e74657374696e672e436c69656e74" . - "436f6e666967480012220a046d61726b18022001280b32122e677270632e" . - "74657374696e672e4d61726b480042090a076172677479706522fd020a0c" . - "536572766572436f6e666967122d0a0b7365727665725f74797065180120" . - "01280e32182e677270632e74657374696e672e5365727665725479706512" . - "350a0f73656375726974795f706172616d7318022001280b321c2e677270" . - "632e74657374696e672e5365637572697479506172616d73120c0a04706f" . - "7274180420012805121c0a146173796e635f7365727665725f7468726561" . - "647318072001280512120a0a636f72655f6c696d69741808200128051233" . - "0a0e7061796c6f61645f636f6e66696718092001280b321b2e677270632e" . - "74657374696e672e5061796c6f6164436f6e66696712110a09636f72655f" . - "6c697374180a2003280512180a106f746865725f7365727665725f617069" . - "180b2001280912160a0e746872656164735f7065725f6371180c20012805" . - "121c0a137265736f757263655f71756f74615f73697a6518e90720012805" . - "122f0a0c6368616e6e656c5f6172677318ea072003280b32182e67727063" . - "2e74657374696e672e4368616e6e656c41726722680a0a53657276657241" . - "726773122b0a05736574757018012001280b321a2e677270632e74657374" . - "696e672e536572766572436f6e666967480012220a046d61726b18022001" . - "280b32122e677270632e74657374696e672e4d61726b480042090a076172" . - "677479706522550a0c53657276657253746174757312280a057374617473" . - "18012001280b32192e677270632e74657374696e672e5365727665725374" . - "617473120c0a04706f7274180220012805120d0a05636f72657318032001" . - "2805220d0a0b436f726552657175657374221d0a0c436f7265526573706f" . - "6e7365120d0a05636f72657318012001280522060a04566f696422fd010a" . - "085363656e6172696f120c0a046e616d6518012001280912310a0d636c69" . - "656e745f636f6e66696718022001280b321a2e677270632e74657374696e" . - "672e436c69656e74436f6e66696712130a0b6e756d5f636c69656e747318" . - "032001280512310a0d7365727665725f636f6e66696718042001280b321a" . - "2e677270632e74657374696e672e536572766572436f6e66696712130a0b" . - "6e756d5f7365727665727318052001280512160a0e7761726d75705f7365" . - "636f6e647318062001280512190a1162656e63686d61726b5f7365636f6e" . - "647318072001280512200a18737061776e5f6c6f63616c5f776f726b6572" . - "5f636f756e7418082001280522360a095363656e6172696f7312290a0973" . - "63656e6172696f7318012003280b32162e677270632e74657374696e672e" . - "5363656e6172696f2284040a155363656e6172696f526573756c7453756d" . - "6d617279120b0a03717073180120012801121b0a137170735f7065725f73" . - "65727665725f636f7265180220012801121a0a127365727665725f737973" . - "74656d5f74696d6518032001280112180a107365727665725f757365725f" . - "74696d65180420012801121a0a12636c69656e745f73797374656d5f7469" . - "6d6518052001280112180a10636c69656e745f757365725f74696d651806" . - "2001280112120a0a6c6174656e63795f353018072001280112120a0a6c61" . - "74656e63795f393018082001280112120a0a6c6174656e63795f39351809" . - "2001280112120a0a6c6174656e63795f3939180a2001280112130a0b6c61" . - "74656e63795f393939180b2001280112180a107365727665725f6370755f" . - "7573616765180c2001280112260a1e7375636365737366756c5f72657175" . - "657374735f7065725f7365636f6e64180d2001280112220a1a6661696c65" . - "645f72657175657374735f7065725f7365636f6e64180e2001280112200a" . - "18636c69656e745f706f6c6c735f7065725f72657175657374180f200128" . - "0112200a187365727665725f706f6c6c735f7065725f7265717565737418" . - "102001280112220a1a7365727665725f717565726965735f7065725f6370" . - "755f73656318112001280112220a1a636c69656e745f717565726965735f" . - "7065725f6370755f7365631812200128012283030a0e5363656e6172696f" . - "526573756c7412280a087363656e6172696f18012001280b32162e677270" . - "632e74657374696e672e5363656e6172696f122e0a096c6174656e636965" . - "7318022001280b321b2e677270632e74657374696e672e486973746f6772" . - "616d44617461122f0a0c636c69656e745f737461747318032003280b3219" . - "2e677270632e74657374696e672e436c69656e745374617473122f0a0c73" . - "65727665725f737461747318042003280b32192e677270632e7465737469" . - "6e672e536572766572537461747312140a0c7365727665725f636f726573" . - "18052003280512340a0773756d6d61727918062001280b32232e67727063" . - "2e74657374696e672e5363656e6172696f526573756c7453756d6d617279" . - "12160a0e636c69656e745f7375636365737318072003280812160a0e7365" . - "727665725f7375636365737318082003280812390a0f726571756573745f" . - "726573756c747318092003280b32202e677270632e74657374696e672e52" . - "657175657374526573756c74436f756e742a410a0a436c69656e74547970" . - "65120f0a0b53594e435f434c49454e54100012100a0c4153594e435f434c" . - "49454e54100112100a0c4f544845525f434c49454e5410022a5b0a0a5365" . - "7276657254797065120f0a0b53594e435f534552564552100012100a0c41" . - "53594e435f534552564552100112180a144153594e435f47454e45524943" . - "5f534552564552100212100a0c4f544845525f53455256455210032a720a" . - "075270635479706512090a05554e4152591000120d0a0953545245414d49" . - "4e47100112190a1553545245414d494e475f46524f4d5f434c49454e5410" . - "0212190a1553545245414d494e475f46524f4d5f53455256455210031217" . - "0a1353545245414d494e475f424f54485f574159531004620670726f746f" . - "33" - )); + "74696e672e5365727665725374617473120c0a04706f7274180220012805" . + "120d0a05636f726573180320012805220d0a0b436f726552657175657374" . + "221d0a0c436f7265526573706f6e7365120d0a05636f7265731801200128" . + "0522060a04566f696422fd010a085363656e6172696f120c0a046e616d65" . + "18012001280912310a0d636c69656e745f636f6e66696718022001280b32" . + "1a2e677270632e74657374696e672e436c69656e74436f6e66696712130a" . + "0b6e756d5f636c69656e747318032001280512310a0d7365727665725f63" . + "6f6e66696718042001280b321a2e677270632e74657374696e672e536572" . + "766572436f6e66696712130a0b6e756d5f73657276657273180520012805" . + "12160a0e7761726d75705f7365636f6e647318062001280512190a116265" . + "6e63686d61726b5f7365636f6e647318072001280512200a18737061776e" . + "5f6c6f63616c5f776f726b65725f636f756e7418082001280522360a0953" . + "63656e6172696f7312290a097363656e6172696f7318012003280b32162e" . + "677270632e74657374696e672e5363656e6172696f2284040a155363656e" . + "6172696f526573756c7453756d6d617279120b0a03717073180120012801" . + "121b0a137170735f7065725f7365727665725f636f726518022001280112" . + "1a0a127365727665725f73797374656d5f74696d6518032001280112180a" . + "107365727665725f757365725f74696d65180420012801121a0a12636c69" . + "656e745f73797374656d5f74696d6518052001280112180a10636c69656e" . + "745f757365725f74696d6518062001280112120a0a6c6174656e63795f35" . + "3018072001280112120a0a6c6174656e63795f393018082001280112120a" . + "0a6c6174656e63795f393518092001280112120a0a6c6174656e63795f39" . + "39180a2001280112130a0b6c6174656e63795f393939180b200128011218" . + "0a107365727665725f6370755f7573616765180c2001280112260a1e7375" . + "636365737366756c5f72657175657374735f7065725f7365636f6e64180d" . + "2001280112220a1a6661696c65645f72657175657374735f7065725f7365" . + "636f6e64180e2001280112200a18636c69656e745f706f6c6c735f706572" . + "5f72657175657374180f2001280112200a187365727665725f706f6c6c73" . + "5f7065725f7265717565737418102001280112220a1a7365727665725f71" . + "7565726965735f7065725f6370755f73656318112001280112220a1a636c" . + "69656e745f717565726965735f7065725f6370755f736563181220012801" . + "2283030a0e5363656e6172696f526573756c7412280a087363656e617269" . + "6f18012001280b32162e677270632e74657374696e672e5363656e617269" . + "6f122e0a096c6174656e6369657318022001280b321b2e677270632e7465" . + "7374696e672e486973746f6772616d44617461122f0a0c636c69656e745f" . + "737461747318032003280b32192e677270632e74657374696e672e436c69" . + "656e745374617473122f0a0c7365727665725f737461747318042003280b" . + "32192e677270632e74657374696e672e536572766572537461747312140a" . + "0c7365727665725f636f72657318052003280512340a0773756d6d617279" . + "18062001280b32232e677270632e74657374696e672e5363656e6172696f" . + "526573756c7453756d6d61727912160a0e636c69656e745f737563636573" . + "7318072003280812160a0e7365727665725f737563636573731808200328" . + "0812390a0f726571756573745f726573756c747318092003280b32202e67" . + "7270632e74657374696e672e52657175657374526573756c74436f756e74" . + "2a560a0a436c69656e7454797065120f0a0b53594e435f434c49454e5410" . + "0012100a0c4153594e435f434c49454e54100112100a0c4f544845525f43" . + "4c49454e54100212130a0f43414c4c4241434b5f434c49454e5410032a70" . + "0a0a53657276657254797065120f0a0b53594e435f534552564552100012" . + "100a0c4153594e435f534552564552100112180a144153594e435f47454e" . + "455249435f534552564552100212100a0c4f544845525f53455256455210" . + "0312130a0f43414c4c4241434b5f53455256455210042a720a0752706354" . + "79706512090a05554e4152591000120d0a0953545245414d494e47100112" . + "190a1553545245414d494e475f46524f4d5f434c49454e54100212190a15" . + "53545245414d494e475f46524f4d5f534552564552100312170a13535452" . + "45414d494e475f424f54485f574159531004620670726f746f33" + ), true); static::$is_initialized = true; } diff --git a/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/Echo.php b/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/Echo.php deleted file mode 100644 index 77c5230f450..00000000000 --- a/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/Echo.php +++ /dev/null @@ -1,43 +0,0 @@ -internalAddGeneratedFile(hex2bin( - "0aa6040a217372632f70726f746f2f677270632f74657374696e672f6563" . - "686f2e70726f746f120c677270632e74657374696e6732f6020a0f456368" . - "6f5465737453657276696365123d0a044563686f12192e677270632e7465" . - "7374696e672e4563686f526571756573741a1a2e677270632e7465737469" . - "6e672e4563686f526573706f6e736512480a0d5265717565737453747265" . - "616d12192e677270632e74657374696e672e4563686f526571756573741a" . - "1a2e677270632e74657374696e672e4563686f526573706f6e7365280112" . - "490a0e526573706f6e736553747265616d12192e677270632e7465737469" . - "6e672e4563686f526571756573741a1a2e677270632e74657374696e672e" . - "4563686f526573706f6e7365300112470a0a4269646953747265616d1219" . - "2e677270632e74657374696e672e4563686f526571756573741a1a2e6772" . - "70632e74657374696e672e4563686f526573706f6e73652801300112460a" . - "0d556e696d706c656d656e74656412192e677270632e74657374696e672e" . - "4563686f526571756573741a1a2e677270632e74657374696e672e456368" . - "6f526573706f6e736532620a18556e696d706c656d656e7465644563686f" . - "5365727669636512460a0d556e696d706c656d656e74656412192e677270" . - "632e74657374696e672e4563686f526571756573741a1a2e677270632e74" . - "657374696e672e4563686f526573706f6e7365320e0a0c4e6f5270635365" . - "7276696365620670726f746f33" - )); - - static::$is_initialized = true; - } -} - diff --git a/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/EchoMessages.php b/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/EchoMessages.php index 4bac8a29060..940b6bd21e7 100644 --- a/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/EchoMessages.php +++ b/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/EchoMessages.php @@ -15,13 +15,13 @@ class EchoMessages return; } $pool->internalAddGeneratedFile(hex2bin( - "0a8f070a2a7372632f70726f746f2f677270632f74657374696e672f6563" . + "0afd070a2a7372632f70726f746f2f677270632f74657374696e672f6563" . "686f5f6d657373616765732e70726f746f120c677270632e74657374696e" . "6722320a094465627567496e666f12150a0d737461636b5f656e74726965" . "73180120032809120e0a0664657461696c18022001280922500a0b457272" . "6f72537461747573120c0a04636f646518012001280512150a0d6572726f" . "725f6d657373616765180220012809121c0a1462696e6172795f6572726f" . - "725f64657461696c7318032001280922e2030a0d52657175657374506172" . + "725f64657461696c7318032001280922cb040a0d52657175657374506172" . "616d7312150a0d6563686f5f646561646c696e65180120012808121e0a16" . "636c69656e745f63616e63656c5f61667465725f7573180220012805121e" . "0a167365727665725f63616e63656c5f61667465725f7573180320012805" . @@ -37,16 +37,20 @@ class EchoMessages "20012808121c0a1462696e6172795f6572726f725f64657461696c73180d" . "2001280912310a0e65787065637465645f6572726f72180e2001280b3219" . "2e677270632e74657374696e672e4572726f7253746174757312170a0f73" . - "65727665725f736c6565705f7573180f20012805224a0a0b4563686f5265" . - "7175657374120f0a076d657373616765180120012809122a0a0570617261" . - "6d18022001280b321b2e677270632e74657374696e672e52657175657374" . - "506172616d7322460a0e526573706f6e7365506172616d7312180a107265" . - "71756573745f646561646c696e65180120012803120c0a04686f73741802" . - "20012809120c0a0470656572180320012809224c0a0c4563686f52657370" . - "6f6e7365120f0a076d657373616765180120012809122b0a05706172616d" . - "18022001280b321c2e677270632e74657374696e672e526573706f6e7365" . - "506172616d73620670726f746f33" - )); + "65727665725f736c6565705f7573180f20012805121b0a136261636b656e" . + "645f6368616e6e656c5f696478181020012805121f0a176563686f5f6d65" . + "7461646174615f696e697469616c6c7918112001280812290a2173657276" . + "65725f6e6f746966795f636c69656e745f7768656e5f7374617274656418" . + "1220012808224a0a0b4563686f52657175657374120f0a076d6573736167" . + "65180120012809122a0a05706172616d18022001280b321b2e677270632e" . + "74657374696e672e52657175657374506172616d7322460a0e526573706f" . + "6e7365506172616d7312180a10726571756573745f646561646c696e6518" . + "0120012803120c0a04686f7374180220012809120c0a0470656572180320" . + "012809224c0a0c4563686f526573706f6e7365120f0a076d657373616765" . + "180120012809122b0a05706172616d18022001280b321c2e677270632e74" . + "657374696e672e526573706f6e7365506172616d734203f8010162067072" . + "6f746f33" + ), true); static::$is_initialized = true; } diff --git a/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/EmptyService.php b/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/EmptyService.php new file mode 100644 index 00000000000..d0a2f5473d6 --- /dev/null +++ b/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/EmptyService.php @@ -0,0 +1,26 @@ +internalAddGeneratedFile(hex2bin( + "0a520a2a7372632f70726f746f2f677270632f74657374696e672f656d70" . + "74795f736572766963652e70726f746f120c677270632e74657374696e67" . + "320e0a0c456d70747953657276696365620670726f746f33" + ), true); + + static::$is_initialized = true; + } +} + diff --git a/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/Messages.php b/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/Messages.php index c0880026264..72c17046a24 100644 --- a/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/Messages.php +++ b/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/Messages.php @@ -15,13 +15,13 @@ class Messages return; } $pool->internalAddGeneratedFile(hex2bin( - "0ad50a0a257372632f70726f746f2f677270632f74657374696e672f6d65" . + "0ad70e0a257372632f70726f746f2f677270632f74657374696e672f6d65" . "7373616765732e70726f746f120c677270632e74657374696e67221a0a09" . "426f6f6c56616c7565120d0a0576616c756518012001280822400a075061" . "796c6f616412270a047479706518012001280e32192e677270632e746573" . "74696e672e5061796c6f616454797065120c0a04626f647918022001280c" . "222b0a0a4563686f537461747573120c0a04636f6465180120012805120f" . - "0a076d65737361676518022001280922ce020a0d53696d706c6552657175" . + "0a076d6573736167651802200128092286030a0d53696d706c6552657175" . "65737412300a0d726573706f6e73655f7479706518012001280e32192e67" . "7270632e74657374696e672e5061796c6f61645479706512150a0d726573" . "706f6e73655f73697a6518022001280512260a077061796c6f6164180320" . @@ -32,36 +32,53 @@ class Messages "426f6f6c56616c756512310a0f726573706f6e73655f7374617475731807" . "2001280b32182e677270632e74657374696e672e4563686f537461747573" . "12320a116578706563745f636f6d7072657373656418082001280b32172e" . - "677270632e74657374696e672e426f6f6c56616c7565225f0a0e53696d70" . - "6c65526573706f6e736512260a077061796c6f616418012001280b32152e" . - "677270632e74657374696e672e5061796c6f616412100a08757365726e61" . - "6d6518022001280912130a0b6f617574685f73636f706518032001280922" . - "770a1953747265616d696e67496e70757443616c6c526571756573741226" . - "0a077061796c6f616418012001280b32152e677270632e74657374696e67" . - "2e5061796c6f616412320a116578706563745f636f6d7072657373656418" . - "022001280b32172e677270632e74657374696e672e426f6f6c56616c7565" . - "223d0a1a53747265616d696e67496e70757443616c6c526573706f6e7365" . - "121f0a17616767726567617465645f7061796c6f61645f73697a65180120" . - "01280522640a12526573706f6e7365506172616d6574657273120c0a0473" . - "697a6518012001280512130a0b696e74657276616c5f7573180220012805" . - "122b0a0a636f6d7072657373656418032001280b32172e677270632e7465" . - "7374696e672e426f6f6c56616c756522e8010a1a53747265616d696e674f" . - "757470757443616c6c5265717565737412300a0d726573706f6e73655f74" . - "79706518012001280e32192e677270632e74657374696e672e5061796c6f" . - "616454797065123d0a13726573706f6e73655f706172616d657465727318" . - "022003280b32202e677270632e74657374696e672e526573706f6e736550" . - "6172616d657465727312260a077061796c6f616418032001280b32152e67" . - "7270632e74657374696e672e5061796c6f616412310a0f726573706f6e73" . - "655f73746174757318072001280b32182e677270632e74657374696e672e" . - "4563686f53746174757322450a1b53747265616d696e674f757470757443" . - "616c6c526573706f6e736512260a077061796c6f616418012001280b3215" . - "2e677270632e74657374696e672e5061796c6f616422330a0f5265636f6e" . - "6e656374506172616d7312200a186d61785f7265636f6e6e6563745f6261" . - "636b6f66665f6d7318012001280522330a0d5265636f6e6e656374496e66" . - "6f120e0a0670617373656418012001280812120a0a6261636b6f66665f6d" . - "731802200328052a1f0a0b5061796c6f61645479706512100a0c434f4d50" . - "5245535341424c451000620670726f746f33" - )); + "677270632e74657374696e672e426f6f6c56616c756512160a0e66696c6c" . + "5f7365727665725f6964180920012808121e0a1666696c6c5f677270636c" . + "625f726f7574655f74797065180a2001280822be010a0e53696d706c6552" . + "6573706f6e736512260a077061796c6f616418012001280b32152e677270" . + "632e74657374696e672e5061796c6f616412100a08757365726e616d6518" . + "022001280912130a0b6f617574685f73636f706518032001280912110a09" . + "7365727665725f696418042001280912380a11677270636c625f726f7574" . + "655f7479706518052001280e321d2e677270632e74657374696e672e4772" . + "70636c62526f7574655479706512100a08686f73746e616d651806200128" . + "0922770a1953747265616d696e67496e70757443616c6c52657175657374" . + "12260a077061796c6f616418012001280b32152e677270632e7465737469" . + "6e672e5061796c6f616412320a116578706563745f636f6d707265737365" . + "6418022001280b32172e677270632e74657374696e672e426f6f6c56616c" . + "7565223d0a1a53747265616d696e67496e70757443616c6c526573706f6e" . + "7365121f0a17616767726567617465645f7061796c6f61645f73697a6518" . + "012001280522640a12526573706f6e7365506172616d6574657273120c0a" . + "0473697a6518012001280512130a0b696e74657276616c5f757318022001" . + "2805122b0a0a636f6d7072657373656418032001280b32172e677270632e" . + "74657374696e672e426f6f6c56616c756522e8010a1a53747265616d696e" . + "674f757470757443616c6c5265717565737412300a0d726573706f6e7365" . + "5f7479706518012001280e32192e677270632e74657374696e672e506179" . + "6c6f616454797065123d0a13726573706f6e73655f706172616d65746572" . + "7318022003280b32202e677270632e74657374696e672e526573706f6e73" . + "65506172616d657465727312260a077061796c6f616418032001280b3215" . + "2e677270632e74657374696e672e5061796c6f616412310a0f726573706f" . + "6e73655f73746174757318072001280b32182e677270632e74657374696e" . + "672e4563686f53746174757322450a1b53747265616d696e674f75747075" . + "7443616c6c526573706f6e736512260a077061796c6f616418012001280b" . + "32152e677270632e74657374696e672e5061796c6f616422330a0f526563" . + "6f6e6e656374506172616d7312200a186d61785f7265636f6e6e6563745f" . + "6261636b6f66665f6d7318012001280522330a0d5265636f6e6e65637449" . + "6e666f120e0a0670617373656418012001280812120a0a6261636b6f6666" . + "5f6d7318022003280522410a184c6f616442616c616e6365725374617473" . + "5265717565737412100a086e756d5f7270637318012001280512130a0b74" . + "696d656f75745f73656318022001280522b3010a194c6f616442616c616e" . + "6365725374617473526573706f6e7365124d0a0c727063735f62795f7065" . + "657218012003280b32372e677270632e74657374696e672e4c6f61644261" . + "6c616e6365725374617473526573706f6e73652e52706373427950656572" . + "456e74727912140a0c6e756d5f6661696c757265731802200128051a310a" . + "0f52706373427950656572456e747279120b0a036b657918012001280912" . + "0d0a0576616c75651802200128053a0238012a1f0a0b5061796c6f616454" . + "79706512100a0c434f4d505245535341424c4510002a6f0a0f477270636c" . + "62526f75746554797065121d0a19475250434c425f524f5554455f545950" . + "455f554e4b4e4f574e1000121e0a1a475250434c425f524f5554455f5459" . + "50455f46414c4c4241434b1001121d0a19475250434c425f524f5554455f" . + "545950455f4241434b454e441002620670726f746f33" + ), true); static::$is_initialized = true; } diff --git a/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/Metrics.php b/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/Metrics.php deleted file mode 100644 index 7ac739fb54f..00000000000 --- a/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/Metrics.php +++ /dev/null @@ -1,36 +0,0 @@ -internalAddGeneratedFile(hex2bin( - "0afb020a247372632f70726f746f2f677270632f74657374696e672f6d65" . - "74726963732e70726f746f120c677270632e74657374696e67226c0a0d47" . - "61756765526573706f6e7365120c0a046e616d6518012001280912140a0a" . - "6c6f6e675f76616c7565180220012803480012160a0c646f75626c655f76" . - "616c7565180320012801480012160a0c737472696e675f76616c75651804" . - "20012809480042070a0576616c7565221c0a0c4761756765526571756573" . - "74120c0a046e616d65180120012809220e0a0c456d7074794d6573736167" . - "6532a0010a0e4d6574726963735365727669636512490a0c476574416c6c" . - "476175676573121a2e677270632e74657374696e672e456d7074794d6573" . - "736167651a1b2e677270632e74657374696e672e4761756765526573706f" . - "6e7365300112430a084765744761756765121a2e677270632e7465737469" . - "6e672e4761756765526571756573741a1b2e677270632e74657374696e67" . - "2e4761756765526573706f6e7365620670726f746f33" - )); - - static::$is_initialized = true; - } -} - diff --git a/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/GPBEmpty.php b/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/PBEmpty.php similarity index 69% rename from src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/GPBEmpty.php rename to src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/PBEmpty.php index 7198f7da0c1..6118c2609c0 100644 --- a/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/GPBEmpty.php +++ b/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/PBEmpty.php @@ -4,7 +4,7 @@ namespace GPBMetadata\Src\Proto\Grpc\Testing; -class GPBEmpty +class PBEmpty { public static $is_initialized = false; @@ -15,10 +15,10 @@ class GPBEmpty return; } $pool->internalAddGeneratedFile(hex2bin( - "0a430a227372632f70726f746f2f677270632f74657374696e672f656d70" . - "74792e70726f746f120c677270632e74657374696e6722070a05456d7074" . - "79620670726f746f33" - )); + "0a4a0a227372632f70726f746f2f677270632f74657374696e672f656d70" . + "74792e70726f746f120c677270632e74657374696e67220e0a0c456d7074" . + "794d657373616765620670726f746f33" + ), true); static::$is_initialized = true; } diff --git a/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/Payloads.php b/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/Payloads.php index 279fe00ac82..31a51708e96 100644 --- a/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/Payloads.php +++ b/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/Payloads.php @@ -29,7 +29,7 @@ class Payloads "0e636f6d706c65785f706172616d7318032001280b32202e677270632e74" . "657374696e672e436f6d706c657850726f746f506172616d73480042090a" . "077061796c6f6164620670726f746f33" - )); + ), true); static::$is_initialized = true; } diff --git a/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/ProxyService.php b/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/ProxyService.php index e07f73679ea..e8ed140b21b 100644 --- a/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/ProxyService.php +++ b/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/ProxyService.php @@ -29,7 +29,7 @@ class ProxyService "2801123f0a0a5265706f727448697374121b2e677270632e74657374696e" . "672e486973746f6772616d446174611a122e677270632e74657374696e67" . "2e566f69642801620670726f746f33" - )); + ), true); static::$is_initialized = true; } diff --git a/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/ReportQpsScenarioService.php b/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/ReportQpsScenarioService.php index 35a1fb4acb0..19edcc07ffa 100644 --- a/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/ReportQpsScenarioService.php +++ b/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/ReportQpsScenarioService.php @@ -22,7 +22,7 @@ class ReportQpsScenarioService "656e6172696f5365727669636512420a0e5265706f72745363656e617269" . "6f121c2e677270632e74657374696e672e5363656e6172696f526573756c" . "741a122e677270632e74657374696e672e566f6964620670726f746f33" - )); + ), true); static::$is_initialized = true; } diff --git a/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/Stats.php b/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/Stats.php index 3d23b75dfa0..186de704c77 100644 --- a/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/Stats.php +++ b/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/Stats.php @@ -41,7 +41,7 @@ class Stats "6f756e7412150a0d63715f706f6c6c5f636f756e7418062001280412240a" . "0a636f72655f737461747318072001280b32102e677270632e636f72652e" . "5374617473620670726f746f33" - )); + ), true); static::$is_initialized = true; } diff --git a/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/Test.php b/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/Test.php index 54628cfa373..c3063340d00 100644 --- a/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/Test.php +++ b/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/Test.php @@ -14,45 +14,51 @@ class Test if (static::$is_initialized == true) { return; } - \GPBMetadata\Src\Proto\Grpc\Testing\GPBEmpty::initOnce(); + \GPBMetadata\Src\Proto\Grpc\Testing\PBEmpty::initOnce(); \GPBMetadata\Src\Proto\Grpc\Testing\Messages::initOnce(); $pool->internalAddGeneratedFile(hex2bin( - "0a91080a217372632f70726f746f2f677270632f74657374696e672f7465" . + "0aca090a217372632f70726f746f2f677270632f74657374696e672f7465" . "73742e70726f746f120c677270632e74657374696e671a257372632f7072" . "6f746f2f677270632f74657374696e672f6d657373616765732e70726f74" . - "6f32cb050a0b546573745365727669636512350a09456d70747943616c6c" . - "12132e677270632e74657374696e672e456d7074791a132e677270632e74" . - "657374696e672e456d70747912460a09556e61727943616c6c121b2e6772" . - "70632e74657374696e672e53696d706c65526571756573741a1c2e677270" . - "632e74657374696e672e53696d706c65526573706f6e7365124f0a124361" . - "63686561626c65556e61727943616c6c121b2e677270632e74657374696e" . - "672e53696d706c65526571756573741a1c2e677270632e74657374696e67" . - "2e53696d706c65526573706f6e7365126c0a1353747265616d696e674f75" . - "7470757443616c6c12282e677270632e74657374696e672e53747265616d" . - "696e674f757470757443616c6c526571756573741a292e677270632e7465" . - "7374696e672e53747265616d696e674f757470757443616c6c526573706f" . - "6e7365300112690a1253747265616d696e67496e70757443616c6c12272e" . - "677270632e74657374696e672e53747265616d696e67496e70757443616c" . - "6c526571756573741a282e677270632e74657374696e672e53747265616d" . - "696e67496e70757443616c6c526573706f6e7365280112690a0e46756c6c" . - "4475706c657843616c6c12282e677270632e74657374696e672e53747265" . - "616d696e674f757470757443616c6c526571756573741a292e677270632e" . - "74657374696e672e53747265616d696e674f757470757443616c6c526573" . - "706f6e73652801300112690a0e48616c664475706c657843616c6c12282e" . - "677270632e74657374696e672e53747265616d696e674f75747075744361" . - "6c6c526571756573741a292e677270632e74657374696e672e5374726561" . - "6d696e674f757470757443616c6c526573706f6e736528013001123d0a11" . - "556e696d706c656d656e74656443616c6c12132e677270632e7465737469" . - "6e672e456d7074791a132e677270632e74657374696e672e456d70747932" . - "550a14556e696d706c656d656e74656453657276696365123d0a11556e69" . - "6d706c656d656e74656443616c6c12132e677270632e74657374696e672e" . - "456d7074791a132e677270632e74657374696e672e456d7074793289010a" . - "105265636f6e6e65637453657276696365123b0a055374617274121d2e67" . - "7270632e74657374696e672e5265636f6e6e656374506172616d731a132e" . - "677270632e74657374696e672e456d70747912380a0453746f7012132e67" . - "7270632e74657374696e672e456d7074791a1b2e677270632e7465737469" . - "6e672e5265636f6e6e656374496e666f620670726f746f33" - )); + "6f32e7050a0b546573745365727669636512430a09456d70747943616c6c" . + "121a2e677270632e74657374696e672e456d7074794d6573736167651a1a" . + "2e677270632e74657374696e672e456d7074794d65737361676512460a09" . + "556e61727943616c6c121b2e677270632e74657374696e672e53696d706c" . + "65526571756573741a1c2e677270632e74657374696e672e53696d706c65" . + "526573706f6e7365124f0a12436163686561626c65556e61727943616c6c" . + "121b2e677270632e74657374696e672e53696d706c65526571756573741a" . + "1c2e677270632e74657374696e672e53696d706c65526573706f6e736512" . + "6c0a1353747265616d696e674f757470757443616c6c12282e677270632e" . + "74657374696e672e53747265616d696e674f757470757443616c6c526571" . + "756573741a292e677270632e74657374696e672e53747265616d696e674f" . + "757470757443616c6c526573706f6e7365300112690a1253747265616d69" . + "6e67496e70757443616c6c12272e677270632e74657374696e672e537472" . + "65616d696e67496e70757443616c6c526571756573741a282e677270632e" . + "74657374696e672e53747265616d696e67496e70757443616c6c52657370" . + "6f6e7365280112690a0e46756c6c4475706c657843616c6c12282e677270" . + "632e74657374696e672e53747265616d696e674f757470757443616c6c52" . + "6571756573741a292e677270632e74657374696e672e53747265616d696e" . + "674f757470757443616c6c526573706f6e73652801300112690a0e48616c" . + "664475706c657843616c6c12282e677270632e74657374696e672e537472" . + "65616d696e674f757470757443616c6c526571756573741a292e67727063" . + "2e74657374696e672e53747265616d696e674f757470757443616c6c5265" . + "73706f6e736528013001124b0a11556e696d706c656d656e74656443616c" . + "6c121a2e677270632e74657374696e672e456d7074794d6573736167651a" . + "1a2e677270632e74657374696e672e456d7074794d65737361676532630a" . + "14556e696d706c656d656e74656453657276696365124b0a11556e696d70" . + "6c656d656e74656443616c6c121a2e677270632e74657374696e672e456d" . + "7074794d6573736167651a1a2e677270632e74657374696e672e456d7074" . + "794d6573736167653297010a105265636f6e6e6563745365727669636512" . + "420a055374617274121d2e677270632e74657374696e672e5265636f6e6e" . + "656374506172616d731a1a2e677270632e74657374696e672e456d707479" . + "4d657373616765123f0a0453746f70121a2e677270632e74657374696e67" . + "2e456d7074794d6573736167651a1b2e677270632e74657374696e672e52" . + "65636f6e6e656374496e666f327f0a184c6f616442616c616e6365725374" . + "6174735365727669636512630a0e476574436c69656e7453746174731226" . + "2e677270632e74657374696e672e4c6f616442616c616e63657253746174" . + "73526571756573741a272e677270632e74657374696e672e4c6f61644261" . + "6c616e6365725374617473526573706f6e73652200620670726f746f33" + ), true); static::$is_initialized = true; } diff --git a/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/WorkerService.php b/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/WorkerService.php index a8a863df19d..3f67c9918f8 100644 --- a/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/WorkerService.php +++ b/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/WorkerService.php @@ -28,7 +28,7 @@ class WorkerService "74657374696e672e436f7265526573706f6e736512340a0a51756974576f" . "726b657212122e677270632e74657374696e672e566f69641a122e677270" . "632e74657374696e672e566f6964620670726f746f33" - )); + ), true); static::$is_initialized = true; } diff --git a/src/php/tests/qps/generated_code/Grpc/Core/Bucket.php b/src/php/tests/qps/generated_code/Grpc/Core/Bucket.php index 897d6271c28..d9743584292 100644 --- a/src/php/tests/qps/generated_code/Grpc/Core/Bucket.php +++ b/src/php/tests/qps/generated_code/Grpc/Core/Bucket.php @@ -16,15 +16,25 @@ class Bucket extends \Google\Protobuf\Internal\Message /** * Generated from protobuf field double start = 1; */ - private $start = 0.0; + protected $start = 0.0; /** * Generated from protobuf field uint64 count = 2; */ - private $count = 0; + protected $count = 0; - public function __construct() { + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type float $start + * @type int|string $count + * } + */ + public function __construct($data = NULL) { \GPBMetadata\Src\Proto\Grpc\Core\Stats::initOnce(); - parent::__construct(); + parent::__construct($data); } /** diff --git a/src/php/tests/qps/generated_code/Grpc/Core/Histogram.php b/src/php/tests/qps/generated_code/Grpc/Core/Histogram.php index 1902be8e4ac..a40319b0fa3 100644 --- a/src/php/tests/qps/generated_code/Grpc/Core/Histogram.php +++ b/src/php/tests/qps/generated_code/Grpc/Core/Histogram.php @@ -18,9 +18,18 @@ class Histogram extends \Google\Protobuf\Internal\Message */ private $buckets; - public function __construct() { + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type \Grpc\Core\Bucket[]|\Google\Protobuf\Internal\RepeatedField $buckets + * } + */ + public function __construct($data = NULL) { \GPBMetadata\Src\Proto\Grpc\Core\Stats::initOnce(); - parent::__construct(); + parent::__construct($data); } /** diff --git a/src/php/tests/qps/generated_code/Grpc/Core/Metric.php b/src/php/tests/qps/generated_code/Grpc/Core/Metric.php index c3581b7d21b..d8c1e85fc1f 100644 --- a/src/php/tests/qps/generated_code/Grpc/Core/Metric.php +++ b/src/php/tests/qps/generated_code/Grpc/Core/Metric.php @@ -16,12 +16,23 @@ class Metric extends \Google\Protobuf\Internal\Message /** * Generated from protobuf field string name = 1; */ - private $name = ''; + protected $name = ''; protected $value; - public function __construct() { + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $name + * @type int|string $count + * @type \Grpc\Core\Histogram $histogram + * } + */ + public function __construct($data = NULL) { \GPBMetadata\Src\Proto\Grpc\Core\Stats::initOnce(); - parent::__construct(); + parent::__construct($data); } /** diff --git a/src/php/tests/qps/generated_code/Grpc/Core/Stats.php b/src/php/tests/qps/generated_code/Grpc/Core/Stats.php index e6f3fb08992..482776a4670 100644 --- a/src/php/tests/qps/generated_code/Grpc/Core/Stats.php +++ b/src/php/tests/qps/generated_code/Grpc/Core/Stats.php @@ -18,9 +18,18 @@ class Stats extends \Google\Protobuf\Internal\Message */ private $metrics; - public function __construct() { + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type \Grpc\Core\Metric[]|\Google\Protobuf\Internal\RepeatedField $metrics + * } + */ + public function __construct($data = NULL) { \GPBMetadata\Src\Proto\Grpc\Core\Stats::initOnce(); - parent::__construct(); + parent::__construct($data); } /** diff --git a/src/php/tests/qps/generated_code/Grpc/Testing/BoolValue.php b/src/php/tests/qps/generated_code/Grpc/Testing/BoolValue.php index 7eb364b7a0b..a1fd08d674d 100644 --- a/src/php/tests/qps/generated_code/Grpc/Testing/BoolValue.php +++ b/src/php/tests/qps/generated_code/Grpc/Testing/BoolValue.php @@ -22,11 +22,21 @@ class BoolValue extends \Google\Protobuf\Internal\Message * * Generated from protobuf field bool value = 1; */ - private $value = false; + protected $value = false; - public function __construct() { + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type bool $value + * The bool value. + * } + */ + public function __construct($data = NULL) { \GPBMetadata\Src\Proto\Grpc\Testing\Messages::initOnce(); - parent::__construct(); + parent::__construct($data); } /** diff --git a/src/php/tests/qps/generated_code/Grpc/Testing/ByteBufferParams.php b/src/php/tests/qps/generated_code/Grpc/Testing/ByteBufferParams.php index 0511026ba74..2a37cd259a2 100644 --- a/src/php/tests/qps/generated_code/Grpc/Testing/ByteBufferParams.php +++ b/src/php/tests/qps/generated_code/Grpc/Testing/ByteBufferParams.php @@ -16,15 +16,25 @@ class ByteBufferParams extends \Google\Protobuf\Internal\Message /** * Generated from protobuf field int32 req_size = 1; */ - private $req_size = 0; + protected $req_size = 0; /** * Generated from protobuf field int32 resp_size = 2; */ - private $resp_size = 0; + protected $resp_size = 0; - public function __construct() { + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type int $req_size + * @type int $resp_size + * } + */ + public function __construct($data = NULL) { \GPBMetadata\Src\Proto\Grpc\Testing\Payloads::initOnce(); - parent::__construct(); + parent::__construct($data); } /** diff --git a/src/php/tests/qps/generated_code/Grpc/Testing/ChannelArg.php b/src/php/tests/qps/generated_code/Grpc/Testing/ChannelArg.php index 5c5fb861a40..72c1b0cad04 100644 --- a/src/php/tests/qps/generated_code/Grpc/Testing/ChannelArg.php +++ b/src/php/tests/qps/generated_code/Grpc/Testing/ChannelArg.php @@ -16,12 +16,23 @@ class ChannelArg extends \Google\Protobuf\Internal\Message /** * Generated from protobuf field string name = 1; */ - private $name = ''; + protected $name = ''; protected $value; - public function __construct() { + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $name + * @type string $str_value + * @type int $int_value + * } + */ + public function __construct($data = NULL) { \GPBMetadata\Src\Proto\Grpc\Testing\Control::initOnce(); - parent::__construct(); + parent::__construct($data); } /** diff --git a/src/php/tests/qps/generated_code/Grpc/Testing/ClientArgs.php b/src/php/tests/qps/generated_code/Grpc/Testing/ClientArgs.php index ee3fd46f0f6..9964098035f 100644 --- a/src/php/tests/qps/generated_code/Grpc/Testing/ClientArgs.php +++ b/src/php/tests/qps/generated_code/Grpc/Testing/ClientArgs.php @@ -15,9 +15,19 @@ class ClientArgs extends \Google\Protobuf\Internal\Message { protected $argtype; - public function __construct() { + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type \Grpc\Testing\ClientConfig $setup + * @type \Grpc\Testing\Mark $mark + * } + */ + public function __construct($data = NULL) { \GPBMetadata\Src\Proto\Grpc\Testing\Control::initOnce(); - parent::__construct(); + parent::__construct($data); } /** diff --git a/src/php/tests/qps/generated_code/Grpc/Testing/ClientConfig.php b/src/php/tests/qps/generated_code/Grpc/Testing/ClientConfig.php index 0dd3072f184..d14257a3392 100644 --- a/src/php/tests/qps/generated_code/Grpc/Testing/ClientConfig.php +++ b/src/php/tests/qps/generated_code/Grpc/Testing/ClientConfig.php @@ -22,49 +22,49 @@ class ClientConfig extends \Google\Protobuf\Internal\Message /** * Generated from protobuf field .grpc.testing.ClientType client_type = 2; */ - private $client_type = 0; + protected $client_type = 0; /** * Generated from protobuf field .grpc.testing.SecurityParams security_params = 3; */ - private $security_params = null; + protected $security_params = null; /** * How many concurrent RPCs to start for each channel. * For synchronous client, use a separate thread for each outstanding RPC. * * Generated from protobuf field int32 outstanding_rpcs_per_channel = 4; */ - private $outstanding_rpcs_per_channel = 0; + protected $outstanding_rpcs_per_channel = 0; /** * Number of independent client channels to create. * i-th channel will connect to server_target[i % server_targets.size()] * * Generated from protobuf field int32 client_channels = 5; */ - private $client_channels = 0; + protected $client_channels = 0; /** * Only for async client. Number of threads to use to start/manage RPCs. * * Generated from protobuf field int32 async_client_threads = 7; */ - private $async_client_threads = 0; + protected $async_client_threads = 0; /** * Generated from protobuf field .grpc.testing.RpcType rpc_type = 8; */ - private $rpc_type = 0; + protected $rpc_type = 0; /** * The requested load for the entire client (aggregated over all the threads). * * Generated from protobuf field .grpc.testing.LoadParams load_params = 10; */ - private $load_params = null; + protected $load_params = null; /** * Generated from protobuf field .grpc.testing.PayloadConfig payload_config = 11; */ - private $payload_config = null; + protected $payload_config = null; /** * Generated from protobuf field .grpc.testing.HistogramParams histogram_params = 12; */ - private $histogram_params = null; + protected $histogram_params = null; /** * Specify the cores we should run the client on, if desired * @@ -74,13 +74,13 @@ class ClientConfig extends \Google\Protobuf\Internal\Message /** * Generated from protobuf field int32 core_limit = 14; */ - private $core_limit = 0; + protected $core_limit = 0; /** * If we use an OTHER_CLIENT client_type, this string gives more detail * * Generated from protobuf field string other_client_api = 15; */ - private $other_client_api = ''; + protected $other_client_api = ''; /** * Generated from protobuf field repeated .grpc.testing.ChannelArg channel_args = 16; */ @@ -90,23 +90,78 @@ class ClientConfig extends \Google\Protobuf\Internal\Message * * Generated from protobuf field int32 threads_per_cq = 17; */ - private $threads_per_cq = 0; + protected $threads_per_cq = 0; /** * Number of messages on a stream before it gets finished/restarted * * Generated from protobuf field int32 messages_per_stream = 18; */ - private $messages_per_stream = 0; + protected $messages_per_stream = 0; /** * Use coalescing API when possible. * * Generated from protobuf field bool use_coalesce_api = 19; */ - private $use_coalesce_api = false; + protected $use_coalesce_api = false; + /** + * If 0, disabled. Else, specifies the period between gathering latency + * medians in milliseconds. + * + * Generated from protobuf field int32 median_latency_collection_interval_millis = 20; + */ + protected $median_latency_collection_interval_millis = 0; + /** + * Number of client processes. 0 indicates no restriction. + * + * Generated from protobuf field int32 client_processes = 21; + */ + protected $client_processes = 0; - public function __construct() { + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string[]|\Google\Protobuf\Internal\RepeatedField $server_targets + * List of targets to connect to. At least one target needs to be specified. + * @type int $client_type + * @type \Grpc\Testing\SecurityParams $security_params + * @type int $outstanding_rpcs_per_channel + * How many concurrent RPCs to start for each channel. + * For synchronous client, use a separate thread for each outstanding RPC. + * @type int $client_channels + * Number of independent client channels to create. + * i-th channel will connect to server_target[i % server_targets.size()] + * @type int $async_client_threads + * Only for async client. Number of threads to use to start/manage RPCs. + * @type int $rpc_type + * @type \Grpc\Testing\LoadParams $load_params + * The requested load for the entire client (aggregated over all the threads). + * @type \Grpc\Testing\PayloadConfig $payload_config + * @type \Grpc\Testing\HistogramParams $histogram_params + * @type int[]|\Google\Protobuf\Internal\RepeatedField $core_list + * Specify the cores we should run the client on, if desired + * @type int $core_limit + * @type string $other_client_api + * If we use an OTHER_CLIENT client_type, this string gives more detail + * @type \Grpc\Testing\ChannelArg[]|\Google\Protobuf\Internal\RepeatedField $channel_args + * @type int $threads_per_cq + * Number of threads that share each completion queue + * @type int $messages_per_stream + * Number of messages on a stream before it gets finished/restarted + * @type bool $use_coalesce_api + * Use coalescing API when possible. + * @type int $median_latency_collection_interval_millis + * If 0, disabled. Else, specifies the period between gathering latency + * medians in milliseconds. + * @type int $client_processes + * Number of client processes. 0 indicates no restriction. + * } + */ + public function __construct($data = NULL) { \GPBMetadata\Src\Proto\Grpc\Testing\Control::initOnce(); - parent::__construct(); + parent::__construct($data); } /** @@ -527,5 +582,59 @@ class ClientConfig extends \Google\Protobuf\Internal\Message return $this; } + /** + * If 0, disabled. Else, specifies the period between gathering latency + * medians in milliseconds. + * + * Generated from protobuf field int32 median_latency_collection_interval_millis = 20; + * @return int + */ + public function getMedianLatencyCollectionIntervalMillis() + { + return $this->median_latency_collection_interval_millis; + } + + /** + * If 0, disabled. Else, specifies the period between gathering latency + * medians in milliseconds. + * + * Generated from protobuf field int32 median_latency_collection_interval_millis = 20; + * @param int $var + * @return $this + */ + public function setMedianLatencyCollectionIntervalMillis($var) + { + GPBUtil::checkInt32($var); + $this->median_latency_collection_interval_millis = $var; + + return $this; + } + + /** + * Number of client processes. 0 indicates no restriction. + * + * Generated from protobuf field int32 client_processes = 21; + * @return int + */ + public function getClientProcesses() + { + return $this->client_processes; + } + + /** + * Number of client processes. 0 indicates no restriction. + * + * Generated from protobuf field int32 client_processes = 21; + * @param int $var + * @return $this + */ + public function setClientProcesses($var) + { + GPBUtil::checkInt32($var); + $this->client_processes = $var; + + return $this; + } + } diff --git a/src/php/tests/qps/generated_code/Grpc/Testing/ClientStats.php b/src/php/tests/qps/generated_code/Grpc/Testing/ClientStats.php index f2a76217917..89d241a8c1c 100644 --- a/src/php/tests/qps/generated_code/Grpc/Testing/ClientStats.php +++ b/src/php/tests/qps/generated_code/Grpc/Testing/ClientStats.php @@ -18,21 +18,21 @@ class ClientStats extends \Google\Protobuf\Internal\Message * * Generated from protobuf field .grpc.testing.HistogramData latencies = 1; */ - private $latencies = null; + protected $latencies = null; /** * See ServerStats for details. * * Generated from protobuf field double time_elapsed = 2; */ - private $time_elapsed = 0.0; + protected $time_elapsed = 0.0; /** * Generated from protobuf field double time_user = 3; */ - private $time_user = 0.0; + protected $time_user = 0.0; /** * Generated from protobuf field double time_system = 4; */ - private $time_system = 0.0; + protected $time_system = 0.0; /** * Number of failed requests (one row per status code seen) * @@ -44,17 +44,37 @@ class ClientStats extends \Google\Protobuf\Internal\Message * * Generated from protobuf field uint64 cq_poll_count = 6; */ - private $cq_poll_count = 0; + protected $cq_poll_count = 0; /** * Core library stats * * Generated from protobuf field .grpc.core.Stats core_stats = 7; */ - private $core_stats = null; + protected $core_stats = null; - public function __construct() { + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type \Grpc\Testing\HistogramData $latencies + * Latency histogram. Data points are in nanoseconds. + * @type float $time_elapsed + * See ServerStats for details. + * @type float $time_user + * @type float $time_system + * @type \Grpc\Testing\RequestResultCount[]|\Google\Protobuf\Internal\RepeatedField $request_results + * Number of failed requests (one row per status code seen) + * @type int|string $cq_poll_count + * Number of polls called inside completion queue + * @type \Grpc\Core\Stats $core_stats + * Core library stats + * } + */ + public function __construct($data = NULL) { \GPBMetadata\Src\Proto\Grpc\Testing\Stats::initOnce(); - parent::__construct(); + parent::__construct($data); } /** diff --git a/src/php/tests/qps/generated_code/Grpc/Testing/ClientStatus.php b/src/php/tests/qps/generated_code/Grpc/Testing/ClientStatus.php index 3ea40c4dfa0..3f879291298 100644 --- a/src/php/tests/qps/generated_code/Grpc/Testing/ClientStatus.php +++ b/src/php/tests/qps/generated_code/Grpc/Testing/ClientStatus.php @@ -16,11 +16,20 @@ class ClientStatus extends \Google\Protobuf\Internal\Message /** * Generated from protobuf field .grpc.testing.ClientStats stats = 1; */ - private $stats = null; + protected $stats = null; - public function __construct() { + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type \Grpc\Testing\ClientStats $stats + * } + */ + public function __construct($data = NULL) { \GPBMetadata\Src\Proto\Grpc\Testing\Control::initOnce(); - parent::__construct(); + parent::__construct($data); } /** diff --git a/src/php/tests/qps/generated_code/Grpc/Testing/ClientType.php b/src/php/tests/qps/generated_code/Grpc/Testing/ClientType.php index d1df4f19436..080cb405a65 100644 --- a/src/php/tests/qps/generated_code/Grpc/Testing/ClientType.php +++ b/src/php/tests/qps/generated_code/Grpc/Testing/ClientType.php @@ -4,8 +4,10 @@ namespace Grpc\Testing; +use UnexpectedValueException; + /** - * Protobuf enum Grpc\Testing\ClientType + * Protobuf type grpc.testing.ClientType */ class ClientType { @@ -26,5 +28,36 @@ class ClientType * Generated from protobuf enum OTHER_CLIENT = 2; */ const OTHER_CLIENT = 2; + /** + * Generated from protobuf enum CALLBACK_CLIENT = 3; + */ + const CALLBACK_CLIENT = 3; + + private static $valueToName = [ + self::SYNC_CLIENT => 'SYNC_CLIENT', + self::ASYNC_CLIENT => 'ASYNC_CLIENT', + self::OTHER_CLIENT => 'OTHER_CLIENT', + self::CALLBACK_CLIENT => 'CALLBACK_CLIENT', + ]; + + public static function name($value) + { + if (!isset(self::$valueToName[$value])) { + throw new UnexpectedValueException(sprintf( + 'Enum %s has no name defined for value %s', __CLASS__, $value)); + } + return self::$valueToName[$value]; + } + + + public static function value($name) + { + $const = __CLASS__ . '::' . strtoupper($name); + if (!defined($const)) { + throw new UnexpectedValueException(sprintf( + 'Enum %s has no value defined for name %s', __CLASS__, $name)); + } + return constant($const); + } } diff --git a/src/php/tests/qps/generated_code/Grpc/Testing/ClosedLoopParams.php b/src/php/tests/qps/generated_code/Grpc/Testing/ClosedLoopParams.php index 2772836f13d..59e7cb55c82 100644 --- a/src/php/tests/qps/generated_code/Grpc/Testing/ClosedLoopParams.php +++ b/src/php/tests/qps/generated_code/Grpc/Testing/ClosedLoopParams.php @@ -17,9 +17,17 @@ use Google\Protobuf\Internal\GPBUtil; class ClosedLoopParams extends \Google\Protobuf\Internal\Message { - public function __construct() { + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * } + */ + public function __construct($data = NULL) { \GPBMetadata\Src\Proto\Grpc\Testing\Control::initOnce(); - parent::__construct(); + parent::__construct($data); } } diff --git a/src/php/tests/qps/generated_code/Grpc/Testing/ComplexProtoParams.php b/src/php/tests/qps/generated_code/Grpc/Testing/ComplexProtoParams.php index b9013cdb300..8a6471a4f18 100644 --- a/src/php/tests/qps/generated_code/Grpc/Testing/ComplexProtoParams.php +++ b/src/php/tests/qps/generated_code/Grpc/Testing/ComplexProtoParams.php @@ -17,9 +17,17 @@ use Google\Protobuf\Internal\GPBUtil; class ComplexProtoParams extends \Google\Protobuf\Internal\Message { - public function __construct() { + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * } + */ + public function __construct($data = NULL) { \GPBMetadata\Src\Proto\Grpc\Testing\Payloads::initOnce(); - parent::__construct(); + parent::__construct($data); } } diff --git a/src/php/tests/qps/generated_code/Grpc/Testing/CoreRequest.php b/src/php/tests/qps/generated_code/Grpc/Testing/CoreRequest.php index 7772572f1c5..8f60530d31a 100644 --- a/src/php/tests/qps/generated_code/Grpc/Testing/CoreRequest.php +++ b/src/php/tests/qps/generated_code/Grpc/Testing/CoreRequest.php @@ -14,9 +14,17 @@ use Google\Protobuf\Internal\GPBUtil; class CoreRequest extends \Google\Protobuf\Internal\Message { - public function __construct() { + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * } + */ + public function __construct($data = NULL) { \GPBMetadata\Src\Proto\Grpc\Testing\Control::initOnce(); - parent::__construct(); + parent::__construct($data); } } diff --git a/src/php/tests/qps/generated_code/Grpc/Testing/CoreResponse.php b/src/php/tests/qps/generated_code/Grpc/Testing/CoreResponse.php index e0b40ee3001..4964375bdd3 100644 --- a/src/php/tests/qps/generated_code/Grpc/Testing/CoreResponse.php +++ b/src/php/tests/qps/generated_code/Grpc/Testing/CoreResponse.php @@ -18,11 +18,21 @@ class CoreResponse extends \Google\Protobuf\Internal\Message * * Generated from protobuf field int32 cores = 1; */ - private $cores = 0; + protected $cores = 0; - public function __construct() { + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type int $cores + * Number of cores available on the server + * } + */ + public function __construct($data = NULL) { \GPBMetadata\Src\Proto\Grpc\Testing\Control::initOnce(); - parent::__construct(); + parent::__construct($data); } /** diff --git a/src/php/tests/qps/generated_code/Grpc/Testing/DebugInfo.php b/src/php/tests/qps/generated_code/Grpc/Testing/DebugInfo.php index 805b629b0db..c12e0a08f2b 100644 --- a/src/php/tests/qps/generated_code/Grpc/Testing/DebugInfo.php +++ b/src/php/tests/qps/generated_code/Grpc/Testing/DebugInfo.php @@ -22,11 +22,21 @@ class DebugInfo extends \Google\Protobuf\Internal\Message /** * Generated from protobuf field string detail = 2; */ - private $detail = ''; + protected $detail = ''; - public function __construct() { + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string[]|\Google\Protobuf\Internal\RepeatedField $stack_entries + * @type string $detail + * } + */ + public function __construct($data = NULL) { \GPBMetadata\Src\Proto\Grpc\Testing\EchoMessages::initOnce(); - parent::__construct(); + parent::__construct($data); } /** diff --git a/src/php/tests/qps/generated_code/Grpc/Testing/EchoRequest.php b/src/php/tests/qps/generated_code/Grpc/Testing/EchoRequest.php index 9aadfc5dee3..1ad946966a0 100644 --- a/src/php/tests/qps/generated_code/Grpc/Testing/EchoRequest.php +++ b/src/php/tests/qps/generated_code/Grpc/Testing/EchoRequest.php @@ -16,15 +16,25 @@ class EchoRequest extends \Google\Protobuf\Internal\Message /** * Generated from protobuf field string message = 1; */ - private $message = ''; + protected $message = ''; /** * Generated from protobuf field .grpc.testing.RequestParams param = 2; */ - private $param = null; + protected $param = null; - public function __construct() { + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $message + * @type \Grpc\Testing\RequestParams $param + * } + */ + public function __construct($data = NULL) { \GPBMetadata\Src\Proto\Grpc\Testing\EchoMessages::initOnce(); - parent::__construct(); + parent::__construct($data); } /** diff --git a/src/php/tests/qps/generated_code/Grpc/Testing/EchoResponse.php b/src/php/tests/qps/generated_code/Grpc/Testing/EchoResponse.php index c4a9db35aba..47d4d9e8141 100644 --- a/src/php/tests/qps/generated_code/Grpc/Testing/EchoResponse.php +++ b/src/php/tests/qps/generated_code/Grpc/Testing/EchoResponse.php @@ -16,15 +16,25 @@ class EchoResponse extends \Google\Protobuf\Internal\Message /** * Generated from protobuf field string message = 1; */ - private $message = ''; + protected $message = ''; /** * Generated from protobuf field .grpc.testing.ResponseParams param = 2; */ - private $param = null; + protected $param = null; - public function __construct() { + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $message + * @type \Grpc\Testing\ResponseParams $param + * } + */ + public function __construct($data = NULL) { \GPBMetadata\Src\Proto\Grpc\Testing\EchoMessages::initOnce(); - parent::__construct(); + parent::__construct($data); } /** diff --git a/src/php/tests/qps/generated_code/Grpc/Testing/EchoStatus.php b/src/php/tests/qps/generated_code/Grpc/Testing/EchoStatus.php index 6a6623a042d..31fd6dd8995 100644 --- a/src/php/tests/qps/generated_code/Grpc/Testing/EchoStatus.php +++ b/src/php/tests/qps/generated_code/Grpc/Testing/EchoStatus.php @@ -19,15 +19,25 @@ class EchoStatus extends \Google\Protobuf\Internal\Message /** * Generated from protobuf field int32 code = 1; */ - private $code = 0; + protected $code = 0; /** * Generated from protobuf field string message = 2; */ - private $message = ''; + protected $message = ''; - public function __construct() { + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type int $code + * @type string $message + * } + */ + public function __construct($data = NULL) { \GPBMetadata\Src\Proto\Grpc\Testing\Messages::initOnce(); - parent::__construct(); + parent::__construct($data); } /** diff --git a/src/php/tests/qps/generated_code/Grpc/Testing/EchoTestServiceClient.php b/src/php/tests/qps/generated_code/Grpc/Testing/EchoTestServiceClient.php deleted file mode 100644 index b3dcf5b7af8..00000000000 --- a/src/php/tests/qps/generated_code/Grpc/Testing/EchoTestServiceClient.php +++ /dev/null @@ -1,93 +0,0 @@ -_simpleRequest('/grpc.testing.EchoTestService/Echo', - $argument, - ['\Grpc\Testing\EchoResponse', 'decode'], - $metadata, $options); - } - - /** - * @param array $metadata metadata - * @param array $options call options - */ - public function RequestStream($metadata = [], $options = []) { - return $this->_clientStreamRequest('/grpc.testing.EchoTestService/RequestStream', - ['\Grpc\Testing\EchoResponse','decode'], - $metadata, $options); - } - - /** - * @param \Grpc\Testing\EchoRequest $argument input argument - * @param array $metadata metadata - * @param array $options call options - */ - public function ResponseStream(\Grpc\Testing\EchoRequest $argument, - $metadata = [], $options = []) { - return $this->_serverStreamRequest('/grpc.testing.EchoTestService/ResponseStream', - $argument, - ['\Grpc\Testing\EchoResponse', 'decode'], - $metadata, $options); - } - - /** - * @param array $metadata metadata - * @param array $options call options - */ - public function BidiStream($metadata = [], $options = []) { - return $this->_bidiRequest('/grpc.testing.EchoTestService/BidiStream', - ['\Grpc\Testing\EchoResponse','decode'], - $metadata, $options); - } - - /** - * @param \Grpc\Testing\EchoRequest $argument input argument - * @param array $metadata metadata - * @param array $options call options - */ - public function Unimplemented(\Grpc\Testing\EchoRequest $argument, - $metadata = [], $options = []) { - return $this->_simpleRequest('/grpc.testing.EchoTestService/Unimplemented', - $argument, - ['\Grpc\Testing\EchoResponse', 'decode'], - $metadata, $options); - } - -} diff --git a/src/php/tests/qps/generated_code/Grpc/Testing/EmptyMessage.php b/src/php/tests/qps/generated_code/Grpc/Testing/EmptyMessage.php index 3da163e7c09..66e49ab07d2 100644 --- a/src/php/tests/qps/generated_code/Grpc/Testing/EmptyMessage.php +++ b/src/php/tests/qps/generated_code/Grpc/Testing/EmptyMessage.php @@ -1,6 +1,6 @@ grpc.testing.EmptyMessage */ class EmptyMessage extends \Google\Protobuf\Internal\Message { - public function __construct() { - \GPBMetadata\Src\Proto\Grpc\Testing\Metrics::initOnce(); - parent::__construct(); + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Src\Proto\Grpc\Testing\PBEmpty::initOnce(); + parent::__construct($data); } } diff --git a/src/php/tests/qps/generated_code/Grpc/Testing/NoRpcServiceClient.php b/src/php/tests/qps/generated_code/Grpc/Testing/EmptyServiceClient.php similarity index 85% rename from src/php/tests/qps/generated_code/Grpc/Testing/NoRpcServiceClient.php rename to src/php/tests/qps/generated_code/Grpc/Testing/EmptyServiceClient.php index 1d58eaf88ac..c28dd47271b 100644 --- a/src/php/tests/qps/generated_code/Grpc/Testing/NoRpcServiceClient.php +++ b/src/php/tests/qps/generated_code/Grpc/Testing/EmptyServiceClient.php @@ -2,7 +2,7 @@ // GENERATED CODE -- DO NOT EDIT! // Original file comments: -// Copyright 2015 gRPC authors. +// Copyright 2018 gRPC authors. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -19,9 +19,10 @@ namespace Grpc\Testing; /** - * A service without any rpc defined to test coverage. + * A service that has zero methods. + * See https://github.com/grpc/grpc/issues/15574 */ -class NoRpcServiceClient extends \Grpc\BaseStub { +class EmptyServiceClient extends \Grpc\BaseStub { /** * @param string $hostname hostname diff --git a/src/php/tests/qps/generated_code/Grpc/Testing/ErrorStatus.php b/src/php/tests/qps/generated_code/Grpc/Testing/ErrorStatus.php index cc378756c75..a9d12bcb872 100644 --- a/src/php/tests/qps/generated_code/Grpc/Testing/ErrorStatus.php +++ b/src/php/tests/qps/generated_code/Grpc/Testing/ErrorStatus.php @@ -18,19 +18,30 @@ class ErrorStatus extends \Google\Protobuf\Internal\Message /** * Generated from protobuf field int32 code = 1; */ - private $code = 0; + protected $code = 0; /** * Generated from protobuf field string error_message = 2; */ - private $error_message = ''; + protected $error_message = ''; /** * Generated from protobuf field string binary_error_details = 3; */ - private $binary_error_details = ''; + protected $binary_error_details = ''; - public function __construct() { + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type int $code + * @type string $error_message + * @type string $binary_error_details + * } + */ + public function __construct($data = NULL) { \GPBMetadata\Src\Proto\Grpc\Testing\EchoMessages::initOnce(); - parent::__construct(); + parent::__construct($data); } /** diff --git a/src/php/tests/qps/generated_code/Grpc/Testing/GaugeRequest.php b/src/php/tests/qps/generated_code/Grpc/Testing/GaugeRequest.php deleted file mode 100644 index 3c283693c9c..00000000000 --- a/src/php/tests/qps/generated_code/Grpc/Testing/GaugeRequest.php +++ /dev/null @@ -1,51 +0,0 @@ -grpc.testing.GaugeRequest - */ -class GaugeRequest extends \Google\Protobuf\Internal\Message -{ - /** - * Generated from protobuf field string name = 1; - */ - private $name = ''; - - public function __construct() { - \GPBMetadata\Src\Proto\Grpc\Testing\Metrics::initOnce(); - parent::__construct(); - } - - /** - * Generated from protobuf field string name = 1; - * @return string - */ - public function getName() - { - return $this->name; - } - - /** - * Generated from protobuf field string name = 1; - * @param string $var - * @return $this - */ - public function setName($var) - { - GPBUtil::checkString($var, True); - $this->name = $var; - - return $this; - } - -} - diff --git a/src/php/tests/qps/generated_code/Grpc/Testing/GaugeResponse.php b/src/php/tests/qps/generated_code/Grpc/Testing/GaugeResponse.php deleted file mode 100644 index 3969a708a06..00000000000 --- a/src/php/tests/qps/generated_code/Grpc/Testing/GaugeResponse.php +++ /dev/null @@ -1,126 +0,0 @@ -grpc.testing.GaugeResponse - */ -class GaugeResponse extends \Google\Protobuf\Internal\Message -{ - /** - * Generated from protobuf field string name = 1; - */ - private $name = ''; - protected $value; - - public function __construct() { - \GPBMetadata\Src\Proto\Grpc\Testing\Metrics::initOnce(); - parent::__construct(); - } - - /** - * Generated from protobuf field string name = 1; - * @return string - */ - public function getName() - { - return $this->name; - } - - /** - * Generated from protobuf field string name = 1; - * @param string $var - * @return $this - */ - public function setName($var) - { - GPBUtil::checkString($var, True); - $this->name = $var; - - return $this; - } - - /** - * Generated from protobuf field int64 long_value = 2; - * @return int|string - */ - public function getLongValue() - { - return $this->readOneof(2); - } - - /** - * Generated from protobuf field int64 long_value = 2; - * @param int|string $var - * @return $this - */ - public function setLongValue($var) - { - GPBUtil::checkInt64($var); - $this->writeOneof(2, $var); - - return $this; - } - - /** - * Generated from protobuf field double double_value = 3; - * @return float - */ - public function getDoubleValue() - { - return $this->readOneof(3); - } - - /** - * Generated from protobuf field double double_value = 3; - * @param float $var - * @return $this - */ - public function setDoubleValue($var) - { - GPBUtil::checkDouble($var); - $this->writeOneof(3, $var); - - return $this; - } - - /** - * Generated from protobuf field string string_value = 4; - * @return string - */ - public function getStringValue() - { - return $this->readOneof(4); - } - - /** - * Generated from protobuf field string string_value = 4; - * @param string $var - * @return $this - */ - public function setStringValue($var) - { - GPBUtil::checkString($var, True); - $this->writeOneof(4, $var); - - return $this; - } - - /** - * @return string - */ - public function getValue() - { - return $this->whichOneof("value"); - } - -} - diff --git a/src/php/tests/qps/generated_code/Grpc/Testing/GrpclbRouteType.php b/src/php/tests/qps/generated_code/Grpc/Testing/GrpclbRouteType.php new file mode 100644 index 00000000000..f8bff1cb695 --- /dev/null +++ b/src/php/tests/qps/generated_code/Grpc/Testing/GrpclbRouteType.php @@ -0,0 +1,66 @@ +grpc.testing.GrpclbRouteType + */ +class GrpclbRouteType +{ + /** + * Server didn't detect the route that a client took to reach it. + * + * Generated from protobuf enum GRPCLB_ROUTE_TYPE_UNKNOWN = 0; + */ + const GRPCLB_ROUTE_TYPE_UNKNOWN = 0; + /** + * Indicates that a client reached a server via gRPCLB fallback. + * + * Generated from protobuf enum GRPCLB_ROUTE_TYPE_FALLBACK = 1; + */ + const GRPCLB_ROUTE_TYPE_FALLBACK = 1; + /** + * Indicates that a client reached a server as a gRPCLB-given backend. + * + * Generated from protobuf enum GRPCLB_ROUTE_TYPE_BACKEND = 2; + */ + const GRPCLB_ROUTE_TYPE_BACKEND = 2; + + private static $valueToName = [ + self::GRPCLB_ROUTE_TYPE_UNKNOWN => 'GRPCLB_ROUTE_TYPE_UNKNOWN', + self::GRPCLB_ROUTE_TYPE_FALLBACK => 'GRPCLB_ROUTE_TYPE_FALLBACK', + self::GRPCLB_ROUTE_TYPE_BACKEND => 'GRPCLB_ROUTE_TYPE_BACKEND', + ]; + + public static function name($value) + { + if (!isset(self::$valueToName[$value])) { + throw new UnexpectedValueException(sprintf( + 'Enum %s has no name defined for value %s', __CLASS__, $value)); + } + return self::$valueToName[$value]; + } + + + public static function value($name) + { + $const = __CLASS__ . '::' . strtoupper($name); + if (!defined($const)) { + throw new UnexpectedValueException(sprintf( + 'Enum %s has no value defined for name %s', __CLASS__, $name)); + } + return constant($const); + } +} + diff --git a/src/php/tests/qps/generated_code/Grpc/Testing/HistogramData.php b/src/php/tests/qps/generated_code/Grpc/Testing/HistogramData.php index 136eac75e28..705bc832c23 100644 --- a/src/php/tests/qps/generated_code/Grpc/Testing/HistogramData.php +++ b/src/php/tests/qps/generated_code/Grpc/Testing/HistogramData.php @@ -22,27 +22,41 @@ class HistogramData extends \Google\Protobuf\Internal\Message /** * Generated from protobuf field double min_seen = 2; */ - private $min_seen = 0.0; + protected $min_seen = 0.0; /** * Generated from protobuf field double max_seen = 3; */ - private $max_seen = 0.0; + protected $max_seen = 0.0; /** * Generated from protobuf field double sum = 4; */ - private $sum = 0.0; + protected $sum = 0.0; /** * Generated from protobuf field double sum_of_squares = 5; */ - private $sum_of_squares = 0.0; + protected $sum_of_squares = 0.0; /** * Generated from protobuf field double count = 6; */ - private $count = 0.0; + protected $count = 0.0; - public function __construct() { + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type int[]|\Google\Protobuf\Internal\RepeatedField $bucket + * @type float $min_seen + * @type float $max_seen + * @type float $sum + * @type float $sum_of_squares + * @type float $count + * } + */ + public function __construct($data = NULL) { \GPBMetadata\Src\Proto\Grpc\Testing\Stats::initOnce(); - parent::__construct(); + parent::__construct($data); } /** diff --git a/src/php/tests/qps/generated_code/Grpc/Testing/HistogramParams.php b/src/php/tests/qps/generated_code/Grpc/Testing/HistogramParams.php index 1a1b484f144..126b0b928a2 100644 --- a/src/php/tests/qps/generated_code/Grpc/Testing/HistogramParams.php +++ b/src/php/tests/qps/generated_code/Grpc/Testing/HistogramParams.php @@ -20,17 +20,29 @@ class HistogramParams extends \Google\Protobuf\Internal\Message * * Generated from protobuf field double resolution = 1; */ - private $resolution = 0.0; + protected $resolution = 0.0; /** * use enough buckets to allow this value * * Generated from protobuf field double max_possible = 2; */ - private $max_possible = 0.0; + protected $max_possible = 0.0; - public function __construct() { + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type float $resolution + * first bucket is [0, 1 + resolution) + * @type float $max_possible + * use enough buckets to allow this value + * } + */ + public function __construct($data = NULL) { \GPBMetadata\Src\Proto\Grpc\Testing\Stats::initOnce(); - parent::__construct(); + parent::__construct($data); } /** diff --git a/src/php/tests/qps/generated_code/Grpc/Testing/LoadBalancerStatsRequest.php b/src/php/tests/qps/generated_code/Grpc/Testing/LoadBalancerStatsRequest.php new file mode 100644 index 00000000000..02a15306688 --- /dev/null +++ b/src/php/tests/qps/generated_code/Grpc/Testing/LoadBalancerStatsRequest.php @@ -0,0 +1,99 @@ +grpc.testing.LoadBalancerStatsRequest + */ +class LoadBalancerStatsRequest extends \Google\Protobuf\Internal\Message +{ + /** + * Request stats for the next num_rpcs sent by client. + * + * Generated from protobuf field int32 num_rpcs = 1; + */ + protected $num_rpcs = 0; + /** + * If num_rpcs have not completed within timeout_sec, return partial results. + * + * Generated from protobuf field int32 timeout_sec = 2; + */ + protected $timeout_sec = 0; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type int $num_rpcs + * Request stats for the next num_rpcs sent by client. + * @type int $timeout_sec + * If num_rpcs have not completed within timeout_sec, return partial results. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Src\Proto\Grpc\Testing\Messages::initOnce(); + parent::__construct($data); + } + + /** + * Request stats for the next num_rpcs sent by client. + * + * Generated from protobuf field int32 num_rpcs = 1; + * @return int + */ + public function getNumRpcs() + { + return $this->num_rpcs; + } + + /** + * Request stats for the next num_rpcs sent by client. + * + * Generated from protobuf field int32 num_rpcs = 1; + * @param int $var + * @return $this + */ + public function setNumRpcs($var) + { + GPBUtil::checkInt32($var); + $this->num_rpcs = $var; + + return $this; + } + + /** + * If num_rpcs have not completed within timeout_sec, return partial results. + * + * Generated from protobuf field int32 timeout_sec = 2; + * @return int + */ + public function getTimeoutSec() + { + return $this->timeout_sec; + } + + /** + * If num_rpcs have not completed within timeout_sec, return partial results. + * + * Generated from protobuf field int32 timeout_sec = 2; + * @param int $var + * @return $this + */ + public function setTimeoutSec($var) + { + GPBUtil::checkInt32($var); + $this->timeout_sec = $var; + + return $this; + } + +} + diff --git a/src/php/tests/qps/generated_code/Grpc/Testing/LoadBalancerStatsResponse.php b/src/php/tests/qps/generated_code/Grpc/Testing/LoadBalancerStatsResponse.php new file mode 100644 index 00000000000..270189e1871 --- /dev/null +++ b/src/php/tests/qps/generated_code/Grpc/Testing/LoadBalancerStatsResponse.php @@ -0,0 +1,99 @@ +grpc.testing.LoadBalancerStatsResponse + */ +class LoadBalancerStatsResponse extends \Google\Protobuf\Internal\Message +{ + /** + * The number of completed RPCs for each peer. + * + * Generated from protobuf field map rpcs_by_peer = 1; + */ + private $rpcs_by_peer; + /** + * The number of RPCs that failed to record a remote peer. + * + * Generated from protobuf field int32 num_failures = 2; + */ + protected $num_failures = 0; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type array|\Google\Protobuf\Internal\MapField $rpcs_by_peer + * The number of completed RPCs for each peer. + * @type int $num_failures + * The number of RPCs that failed to record a remote peer. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Src\Proto\Grpc\Testing\Messages::initOnce(); + parent::__construct($data); + } + + /** + * The number of completed RPCs for each peer. + * + * Generated from protobuf field map rpcs_by_peer = 1; + * @return \Google\Protobuf\Internal\MapField + */ + public function getRpcsByPeer() + { + return $this->rpcs_by_peer; + } + + /** + * The number of completed RPCs for each peer. + * + * Generated from protobuf field map rpcs_by_peer = 1; + * @param array|\Google\Protobuf\Internal\MapField $var + * @return $this + */ + public function setRpcsByPeer($var) + { + $arr = GPBUtil::checkMapField($var, \Google\Protobuf\Internal\GPBType::STRING, \Google\Protobuf\Internal\GPBType::INT32); + $this->rpcs_by_peer = $arr; + + return $this; + } + + /** + * The number of RPCs that failed to record a remote peer. + * + * Generated from protobuf field int32 num_failures = 2; + * @return int + */ + public function getNumFailures() + { + return $this->num_failures; + } + + /** + * The number of RPCs that failed to record a remote peer. + * + * Generated from protobuf field int32 num_failures = 2; + * @param int $var + * @return $this + */ + public function setNumFailures($var) + { + GPBUtil::checkInt32($var); + $this->num_failures = $var; + + return $this; + } + +} + diff --git a/src/php/tests/qps/generated_code/Grpc/Testing/UnimplementedEchoServiceClient.php b/src/php/tests/qps/generated_code/Grpc/Testing/LoadBalancerStatsServiceClient.php similarity index 63% rename from src/php/tests/qps/generated_code/Grpc/Testing/UnimplementedEchoServiceClient.php rename to src/php/tests/qps/generated_code/Grpc/Testing/LoadBalancerStatsServiceClient.php index fee0daa70c7..129776d8a30 100644 --- a/src/php/tests/qps/generated_code/Grpc/Testing/UnimplementedEchoServiceClient.php +++ b/src/php/tests/qps/generated_code/Grpc/Testing/LoadBalancerStatsServiceClient.php @@ -2,7 +2,7 @@ // GENERATED CODE -- DO NOT EDIT! // Original file comments: -// Copyright 2015 gRPC authors. +// Copyright 2015-2016 gRPC authors. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -16,11 +16,15 @@ // See the License for the specific language governing permissions and // limitations under the License. // +// An integration test service that covers all the method signature permutations +// of unary/streaming requests/responses. +// namespace Grpc\Testing; /** + * A service used to obtain stats for verifying LB behavior. */ -class UnimplementedEchoServiceClient extends \Grpc\BaseStub { +class LoadBalancerStatsServiceClient extends \Grpc\BaseStub { /** * @param string $hostname hostname @@ -32,15 +36,16 @@ class UnimplementedEchoServiceClient extends \Grpc\BaseStub { } /** - * @param \Grpc\Testing\EchoRequest $argument input argument + * Gets the backend distribution for RPCs sent by a test client. + * @param \Grpc\Testing\LoadBalancerStatsRequest $argument input argument * @param array $metadata metadata * @param array $options call options */ - public function Unimplemented(\Grpc\Testing\EchoRequest $argument, + public function GetClientStats(\Grpc\Testing\LoadBalancerStatsRequest $argument, $metadata = [], $options = []) { - return $this->_simpleRequest('/grpc.testing.UnimplementedEchoService/Unimplemented', + return $this->_simpleRequest('/grpc.testing.LoadBalancerStatsService/GetClientStats', $argument, - ['\Grpc\Testing\EchoResponse', 'decode'], + ['\Grpc\Testing\LoadBalancerStatsResponse', 'decode'], $metadata, $options); } diff --git a/src/php/tests/qps/generated_code/Grpc/Testing/LoadParams.php b/src/php/tests/qps/generated_code/Grpc/Testing/LoadParams.php index 04c345f2421..0df1401a10b 100644 --- a/src/php/tests/qps/generated_code/Grpc/Testing/LoadParams.php +++ b/src/php/tests/qps/generated_code/Grpc/Testing/LoadParams.php @@ -15,9 +15,19 @@ class LoadParams extends \Google\Protobuf\Internal\Message { protected $load; - public function __construct() { + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type \Grpc\Testing\ClosedLoopParams $closed_loop + * @type \Grpc\Testing\PoissonParams $poisson + * } + */ + public function __construct($data = NULL) { \GPBMetadata\Src\Proto\Grpc\Testing\Control::initOnce(); - parent::__construct(); + parent::__construct($data); } /** diff --git a/src/php/tests/qps/generated_code/Grpc/Testing/Mark.php b/src/php/tests/qps/generated_code/Grpc/Testing/Mark.php index be058d51be8..ad97eb92f5a 100644 --- a/src/php/tests/qps/generated_code/Grpc/Testing/Mark.php +++ b/src/php/tests/qps/generated_code/Grpc/Testing/Mark.php @@ -20,11 +20,21 @@ class Mark extends \Google\Protobuf\Internal\Message * * Generated from protobuf field bool reset = 1; */ - private $reset = false; + protected $reset = false; - public function __construct() { + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type bool $reset + * if true, the stats will be reset after taking their snapshot. + * } + */ + public function __construct($data = NULL) { \GPBMetadata\Src\Proto\Grpc\Testing\Control::initOnce(); - parent::__construct(); + parent::__construct($data); } /** diff --git a/src/php/tests/qps/generated_code/Grpc/Testing/MetricsServiceClient.php b/src/php/tests/qps/generated_code/Grpc/Testing/MetricsServiceClient.php deleted file mode 100644 index 491ccbce72e..00000000000 --- a/src/php/tests/qps/generated_code/Grpc/Testing/MetricsServiceClient.php +++ /dev/null @@ -1,69 +0,0 @@ -_serverStreamRequest('/grpc.testing.MetricsService/GetAllGauges', - $argument, - ['\Grpc\Testing\GaugeResponse', 'decode'], - $metadata, $options); - } - - /** - * Returns the value of one gauge - * @param \Grpc\Testing\GaugeRequest $argument input argument - * @param array $metadata metadata - * @param array $options call options - */ - public function GetGauge(\Grpc\Testing\GaugeRequest $argument, - $metadata = [], $options = []) { - return $this->_simpleRequest('/grpc.testing.MetricsService/GetGauge', - $argument, - ['\Grpc\Testing\GaugeResponse', 'decode'], - $metadata, $options); - } - -} diff --git a/src/php/tests/qps/generated_code/Grpc/Testing/PBEmpty.php b/src/php/tests/qps/generated_code/Grpc/Testing/PBEmpty.php deleted file mode 100644 index a1fe9df4544..00000000000 --- a/src/php/tests/qps/generated_code/Grpc/Testing/PBEmpty.php +++ /dev/null @@ -1,30 +0,0 @@ -grpc.testing.Empty - */ -class PBEmpty extends \Google\Protobuf\Internal\Message -{ - - public function __construct() { - \GPBMetadata\Src\Proto\Grpc\Testing\GPBEmpty::initOnce(); - parent::__construct(); - } - -} - diff --git a/src/php/tests/qps/generated_code/Grpc/Testing/PBVoid.php b/src/php/tests/qps/generated_code/Grpc/Testing/PBVoid.php index 94cb6c1ecfe..2215f8901f6 100644 --- a/src/php/tests/qps/generated_code/Grpc/Testing/PBVoid.php +++ b/src/php/tests/qps/generated_code/Grpc/Testing/PBVoid.php @@ -14,9 +14,17 @@ use Google\Protobuf\Internal\GPBUtil; class PBVoid extends \Google\Protobuf\Internal\Message { - public function __construct() { + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * } + */ + public function __construct($data = NULL) { \GPBMetadata\Src\Proto\Grpc\Testing\Control::initOnce(); - parent::__construct(); + parent::__construct($data); } } diff --git a/src/php/tests/qps/generated_code/Grpc/Testing/Payload.php b/src/php/tests/qps/generated_code/Grpc/Testing/Payload.php index ad97890c93f..65a007e119e 100644 --- a/src/php/tests/qps/generated_code/Grpc/Testing/Payload.php +++ b/src/php/tests/qps/generated_code/Grpc/Testing/Payload.php @@ -16,26 +16,36 @@ use Google\Protobuf\Internal\GPBUtil; class Payload extends \Google\Protobuf\Internal\Message { /** - * DEPRECATED, don't use. To be removed shortly. * The type of data in body. * * Generated from protobuf field .grpc.testing.PayloadType type = 1; */ - private $type = 0; + protected $type = 0; /** * Primary contents of payload. * * Generated from protobuf field bytes body = 2; */ - private $body = ''; + protected $body = ''; - public function __construct() { + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type int $type + * The type of data in body. + * @type string $body + * Primary contents of payload. + * } + */ + public function __construct($data = NULL) { \GPBMetadata\Src\Proto\Grpc\Testing\Messages::initOnce(); - parent::__construct(); + parent::__construct($data); } /** - * DEPRECATED, don't use. To be removed shortly. * The type of data in body. * * Generated from protobuf field .grpc.testing.PayloadType type = 1; @@ -47,7 +57,6 @@ class Payload extends \Google\Protobuf\Internal\Message } /** - * DEPRECATED, don't use. To be removed shortly. * The type of data in body. * * Generated from protobuf field .grpc.testing.PayloadType type = 1; diff --git a/src/php/tests/qps/generated_code/Grpc/Testing/PayloadConfig.php b/src/php/tests/qps/generated_code/Grpc/Testing/PayloadConfig.php index 748f52da82d..495d2e13f68 100644 --- a/src/php/tests/qps/generated_code/Grpc/Testing/PayloadConfig.php +++ b/src/php/tests/qps/generated_code/Grpc/Testing/PayloadConfig.php @@ -15,9 +15,20 @@ class PayloadConfig extends \Google\Protobuf\Internal\Message { protected $payload; - public function __construct() { + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type \Grpc\Testing\ByteBufferParams $bytebuf_params + * @type \Grpc\Testing\SimpleProtoParams $simple_params + * @type \Grpc\Testing\ComplexProtoParams $complex_params + * } + */ + public function __construct($data = NULL) { \GPBMetadata\Src\Proto\Grpc\Testing\Payloads::initOnce(); - parent::__construct(); + parent::__construct($data); } /** diff --git a/src/php/tests/qps/generated_code/Grpc/Testing/PayloadType.php b/src/php/tests/qps/generated_code/Grpc/Testing/PayloadType.php index d8df1af7982..dc246b37891 100644 --- a/src/php/tests/qps/generated_code/Grpc/Testing/PayloadType.php +++ b/src/php/tests/qps/generated_code/Grpc/Testing/PayloadType.php @@ -4,11 +4,12 @@ namespace Grpc\Testing; +use UnexpectedValueException; + /** - * DEPRECATED, don't use. To be removed shortly. * The type of payload that should be returned. * - * Protobuf enum Grpc\Testing\PayloadType + * Protobuf type grpc.testing.PayloadType */ class PayloadType { @@ -18,5 +19,29 @@ class PayloadType * Generated from protobuf enum COMPRESSABLE = 0; */ const COMPRESSABLE = 0; + + private static $valueToName = [ + self::COMPRESSABLE => 'COMPRESSABLE', + ]; + + public static function name($value) + { + if (!isset(self::$valueToName[$value])) { + throw new UnexpectedValueException(sprintf( + 'Enum %s has no name defined for value %s', __CLASS__, $value)); + } + return self::$valueToName[$value]; + } + + + public static function value($name) + { + $const = __CLASS__ . '::' . strtoupper($name); + if (!defined($const)) { + throw new UnexpectedValueException(sprintf( + 'Enum %s has no value defined for name %s', __CLASS__, $name)); + } + return constant($const); + } } diff --git a/src/php/tests/qps/generated_code/Grpc/Testing/PoissonParams.php b/src/php/tests/qps/generated_code/Grpc/Testing/PoissonParams.php index 6a4047f2ece..34a0a66fd70 100644 --- a/src/php/tests/qps/generated_code/Grpc/Testing/PoissonParams.php +++ b/src/php/tests/qps/generated_code/Grpc/Testing/PoissonParams.php @@ -21,11 +21,21 @@ class PoissonParams extends \Google\Protobuf\Internal\Message * * Generated from protobuf field double offered_load = 1; */ - private $offered_load = 0.0; + protected $offered_load = 0.0; - public function __construct() { + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type float $offered_load + * The rate of arrivals (a.k.a. lambda parameter of the exp distribution). + * } + */ + public function __construct($data = NULL) { \GPBMetadata\Src\Proto\Grpc\Testing\Control::initOnce(); - parent::__construct(); + parent::__construct($data); } /** diff --git a/src/php/tests/qps/generated_code/Grpc/Testing/ProxyStat.php b/src/php/tests/qps/generated_code/Grpc/Testing/ProxyStat.php index 6fab6115342..f9525162445 100644 --- a/src/php/tests/qps/generated_code/Grpc/Testing/ProxyStat.php +++ b/src/php/tests/qps/generated_code/Grpc/Testing/ProxyStat.php @@ -16,11 +16,20 @@ class ProxyStat extends \Google\Protobuf\Internal\Message /** * Generated from protobuf field double latency = 1; */ - private $latency = 0.0; + protected $latency = 0.0; - public function __construct() { + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type float $latency + * } + */ + public function __construct($data = NULL) { \GPBMetadata\Src\Proto\Grpc\Testing\ProxyService::initOnce(); - parent::__construct(); + parent::__construct($data); } /** diff --git a/src/php/tests/qps/generated_code/Grpc/Testing/ReconnectInfo.php b/src/php/tests/qps/generated_code/Grpc/Testing/ReconnectInfo.php index cd728705fa4..58ac838a859 100644 --- a/src/php/tests/qps/generated_code/Grpc/Testing/ReconnectInfo.php +++ b/src/php/tests/qps/generated_code/Grpc/Testing/ReconnectInfo.php @@ -20,15 +20,25 @@ class ReconnectInfo extends \Google\Protobuf\Internal\Message /** * Generated from protobuf field bool passed = 1; */ - private $passed = false; + protected $passed = false; /** * Generated from protobuf field repeated int32 backoff_ms = 2; */ private $backoff_ms; - public function __construct() { + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type bool $passed + * @type int[]|\Google\Protobuf\Internal\RepeatedField $backoff_ms + * } + */ + public function __construct($data = NULL) { \GPBMetadata\Src\Proto\Grpc\Testing\Messages::initOnce(); - parent::__construct(); + parent::__construct($data); } /** diff --git a/src/php/tests/qps/generated_code/Grpc/Testing/ReconnectParams.php b/src/php/tests/qps/generated_code/Grpc/Testing/ReconnectParams.php index f91dc410cb5..599b13db1d6 100644 --- a/src/php/tests/qps/generated_code/Grpc/Testing/ReconnectParams.php +++ b/src/php/tests/qps/generated_code/Grpc/Testing/ReconnectParams.php @@ -19,11 +19,20 @@ class ReconnectParams extends \Google\Protobuf\Internal\Message /** * Generated from protobuf field int32 max_reconnect_backoff_ms = 1; */ - private $max_reconnect_backoff_ms = 0; + protected $max_reconnect_backoff_ms = 0; - public function __construct() { + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type int $max_reconnect_backoff_ms + * } + */ + public function __construct($data = NULL) { \GPBMetadata\Src\Proto\Grpc\Testing\Messages::initOnce(); - parent::__construct(); + parent::__construct($data); } /** diff --git a/src/php/tests/qps/generated_code/Grpc/Testing/ReconnectServiceClient.php b/src/php/tests/qps/generated_code/Grpc/Testing/ReconnectServiceClient.php index a1802e97cdb..50beca20e00 100644 --- a/src/php/tests/qps/generated_code/Grpc/Testing/ReconnectServiceClient.php +++ b/src/php/tests/qps/generated_code/Grpc/Testing/ReconnectServiceClient.php @@ -44,16 +44,16 @@ class ReconnectServiceClient extends \Grpc\BaseStub { $metadata = [], $options = []) { return $this->_simpleRequest('/grpc.testing.ReconnectService/Start', $argument, - ['\Grpc\Testing\PBEmpty', 'decode'], + ['\Grpc\Testing\EmptyMessage', 'decode'], $metadata, $options); } /** - * @param \Grpc\Testing\PBEmpty $argument input argument + * @param \Grpc\Testing\EmptyMessage $argument input argument * @param array $metadata metadata * @param array $options call options */ - public function Stop(\Grpc\Testing\PBEmpty $argument, + public function Stop(\Grpc\Testing\EmptyMessage $argument, $metadata = [], $options = []) { return $this->_simpleRequest('/grpc.testing.ReconnectService/Stop', $argument, diff --git a/src/php/tests/qps/generated_code/Grpc/Testing/Request.php b/src/php/tests/qps/generated_code/Grpc/Testing/Request.php index 6a20f6a897e..d425141096a 100644 --- a/src/php/tests/qps/generated_code/Grpc/Testing/Request.php +++ b/src/php/tests/qps/generated_code/Grpc/Testing/Request.php @@ -14,9 +14,17 @@ use Google\Protobuf\Internal\GPBUtil; class Request extends \Google\Protobuf\Internal\Message { - public function __construct() { + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * } + */ + public function __construct($data = NULL) { \GPBMetadata\Src\Proto\Grpc\Testing\CompilerTest::initOnce(); - parent::__construct(); + parent::__construct($data); } } diff --git a/src/php/tests/qps/generated_code/Grpc/Testing/RequestParams.php b/src/php/tests/qps/generated_code/Grpc/Testing/RequestParams.php index f01f50d5afa..d321a8098ca 100644 --- a/src/php/tests/qps/generated_code/Grpc/Testing/RequestParams.php +++ b/src/php/tests/qps/generated_code/Grpc/Testing/RequestParams.php @@ -16,73 +16,117 @@ class RequestParams extends \Google\Protobuf\Internal\Message /** * Generated from protobuf field bool echo_deadline = 1; */ - private $echo_deadline = false; + protected $echo_deadline = false; /** * Generated from protobuf field int32 client_cancel_after_us = 2; */ - private $client_cancel_after_us = 0; + protected $client_cancel_after_us = 0; /** * Generated from protobuf field int32 server_cancel_after_us = 3; */ - private $server_cancel_after_us = 0; + protected $server_cancel_after_us = 0; /** * Generated from protobuf field bool echo_metadata = 4; */ - private $echo_metadata = false; + protected $echo_metadata = false; /** * Generated from protobuf field bool check_auth_context = 5; */ - private $check_auth_context = false; + protected $check_auth_context = false; /** * Generated from protobuf field int32 response_message_length = 6; */ - private $response_message_length = 0; + protected $response_message_length = 0; /** * Generated from protobuf field bool echo_peer = 7; */ - private $echo_peer = false; + protected $echo_peer = false; /** * will force check_auth_context. * * Generated from protobuf field string expected_client_identity = 8; */ - private $expected_client_identity = ''; + protected $expected_client_identity = ''; /** * Generated from protobuf field bool skip_cancelled_check = 9; */ - private $skip_cancelled_check = false; + protected $skip_cancelled_check = false; /** * Generated from protobuf field string expected_transport_security_type = 10; */ - private $expected_transport_security_type = ''; + protected $expected_transport_security_type = ''; /** * Generated from protobuf field .grpc.testing.DebugInfo debug_info = 11; */ - private $debug_info = null; + protected $debug_info = null; /** * Server should not see a request with this set. * * Generated from protobuf field bool server_die = 12; */ - private $server_die = false; + protected $server_die = false; /** * Generated from protobuf field string binary_error_details = 13; */ - private $binary_error_details = ''; + protected $binary_error_details = ''; /** * Generated from protobuf field .grpc.testing.ErrorStatus expected_error = 14; */ - private $expected_error = null; + protected $expected_error = null; /** - * Amount to sleep when invoking server + * sleep when invoking server for deadline tests * * Generated from protobuf field int32 server_sleep_us = 15; */ - private $server_sleep_us = 0; + protected $server_sleep_us = 0; + /** + * which backend to send request to + * + * Generated from protobuf field int32 backend_channel_idx = 16; + */ + protected $backend_channel_idx = 0; + /** + * Generated from protobuf field bool echo_metadata_initially = 17; + */ + protected $echo_metadata_initially = false; + /** + * Generated from protobuf field bool server_notify_client_when_started = 18; + */ + protected $server_notify_client_when_started = false; - public function __construct() { + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type bool $echo_deadline + * @type int $client_cancel_after_us + * @type int $server_cancel_after_us + * @type bool $echo_metadata + * @type bool $check_auth_context + * @type int $response_message_length + * @type bool $echo_peer + * @type string $expected_client_identity + * will force check_auth_context. + * @type bool $skip_cancelled_check + * @type string $expected_transport_security_type + * @type \Grpc\Testing\DebugInfo $debug_info + * @type bool $server_die + * Server should not see a request with this set. + * @type string $binary_error_details + * @type \Grpc\Testing\ErrorStatus $expected_error + * @type int $server_sleep_us + * sleep when invoking server for deadline tests + * @type int $backend_channel_idx + * which backend to send request to + * @type bool $echo_metadata_initially + * @type bool $server_notify_client_when_started + * } + */ + public function __construct($data = NULL) { \GPBMetadata\Src\Proto\Grpc\Testing\EchoMessages::initOnce(); - parent::__construct(); + parent::__construct($data); } /** @@ -402,7 +446,7 @@ class RequestParams extends \Google\Protobuf\Internal\Message } /** - * Amount to sleep when invoking server + * sleep when invoking server for deadline tests * * Generated from protobuf field int32 server_sleep_us = 15; * @return int @@ -413,7 +457,7 @@ class RequestParams extends \Google\Protobuf\Internal\Message } /** - * Amount to sleep when invoking server + * sleep when invoking server for deadline tests * * Generated from protobuf field int32 server_sleep_us = 15; * @param int $var @@ -427,5 +471,75 @@ class RequestParams extends \Google\Protobuf\Internal\Message return $this; } + /** + * which backend to send request to + * + * Generated from protobuf field int32 backend_channel_idx = 16; + * @return int + */ + public function getBackendChannelIdx() + { + return $this->backend_channel_idx; + } + + /** + * which backend to send request to + * + * Generated from protobuf field int32 backend_channel_idx = 16; + * @param int $var + * @return $this + */ + public function setBackendChannelIdx($var) + { + GPBUtil::checkInt32($var); + $this->backend_channel_idx = $var; + + return $this; + } + + /** + * Generated from protobuf field bool echo_metadata_initially = 17; + * @return bool + */ + public function getEchoMetadataInitially() + { + return $this->echo_metadata_initially; + } + + /** + * Generated from protobuf field bool echo_metadata_initially = 17; + * @param bool $var + * @return $this + */ + public function setEchoMetadataInitially($var) + { + GPBUtil::checkBool($var); + $this->echo_metadata_initially = $var; + + return $this; + } + + /** + * Generated from protobuf field bool server_notify_client_when_started = 18; + * @return bool + */ + public function getServerNotifyClientWhenStarted() + { + return $this->server_notify_client_when_started; + } + + /** + * Generated from protobuf field bool server_notify_client_when_started = 18; + * @param bool $var + * @return $this + */ + public function setServerNotifyClientWhenStarted($var) + { + GPBUtil::checkBool($var); + $this->server_notify_client_when_started = $var; + + return $this; + } + } diff --git a/src/php/tests/qps/generated_code/Grpc/Testing/RequestResultCount.php b/src/php/tests/qps/generated_code/Grpc/Testing/RequestResultCount.php index 75fa6cafe28..5bbe79f49f3 100644 --- a/src/php/tests/qps/generated_code/Grpc/Testing/RequestResultCount.php +++ b/src/php/tests/qps/generated_code/Grpc/Testing/RequestResultCount.php @@ -16,15 +16,25 @@ class RequestResultCount extends \Google\Protobuf\Internal\Message /** * Generated from protobuf field int32 status_code = 1; */ - private $status_code = 0; + protected $status_code = 0; /** * Generated from protobuf field int64 count = 2; */ - private $count = 0; + protected $count = 0; - public function __construct() { + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type int $status_code + * @type int|string $count + * } + */ + public function __construct($data = NULL) { \GPBMetadata\Src\Proto\Grpc\Testing\Stats::initOnce(); - parent::__construct(); + parent::__construct($data); } /** diff --git a/src/php/tests/qps/generated_code/Grpc/Testing/Response.php b/src/php/tests/qps/generated_code/Grpc/Testing/Response.php index 7925a7db3df..84e93b8a9c4 100644 --- a/src/php/tests/qps/generated_code/Grpc/Testing/Response.php +++ b/src/php/tests/qps/generated_code/Grpc/Testing/Response.php @@ -14,9 +14,17 @@ use Google\Protobuf\Internal\GPBUtil; class Response extends \Google\Protobuf\Internal\Message { - public function __construct() { + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * } + */ + public function __construct($data = NULL) { \GPBMetadata\Src\Proto\Grpc\Testing\CompilerTest::initOnce(); - parent::__construct(); + parent::__construct($data); } } diff --git a/src/php/tests/qps/generated_code/Grpc/Testing/ResponseParameters.php b/src/php/tests/qps/generated_code/Grpc/Testing/ResponseParameters.php index b2f0a827fe0..470349325c4 100644 --- a/src/php/tests/qps/generated_code/Grpc/Testing/ResponseParameters.php +++ b/src/php/tests/qps/generated_code/Grpc/Testing/ResponseParameters.php @@ -20,14 +20,14 @@ class ResponseParameters extends \Google\Protobuf\Internal\Message * * Generated from protobuf field int32 size = 1; */ - private $size = 0; + protected $size = 0; /** * Desired interval between consecutive responses in the response stream in * microseconds. * * Generated from protobuf field int32 interval_us = 2; */ - private $interval_us = 0; + protected $interval_us = 0; /** * Whether to request the server to compress the response. This field is * "nullable" in order to interoperate seamlessly with clients not able to @@ -36,11 +36,29 @@ class ResponseParameters extends \Google\Protobuf\Internal\Message * * Generated from protobuf field .grpc.testing.BoolValue compressed = 3; */ - private $compressed = null; + protected $compressed = null; - public function __construct() { + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type int $size + * Desired payload sizes in responses from the server. + * @type int $interval_us + * Desired interval between consecutive responses in the response stream in + * microseconds. + * @type \Grpc\Testing\BoolValue $compressed + * Whether to request the server to compress the response. This field is + * "nullable" in order to interoperate seamlessly with clients not able to + * implement the full compression tests by introspecting the call to verify + * the response's compression status. + * } + */ + public function __construct($data = NULL) { \GPBMetadata\Src\Proto\Grpc\Testing\Messages::initOnce(); - parent::__construct(); + parent::__construct($data); } /** diff --git a/src/php/tests/qps/generated_code/Grpc/Testing/ResponseParams.php b/src/php/tests/qps/generated_code/Grpc/Testing/ResponseParams.php index d20f92289a3..18e99b0534b 100644 --- a/src/php/tests/qps/generated_code/Grpc/Testing/ResponseParams.php +++ b/src/php/tests/qps/generated_code/Grpc/Testing/ResponseParams.php @@ -16,19 +16,30 @@ class ResponseParams extends \Google\Protobuf\Internal\Message /** * Generated from protobuf field int64 request_deadline = 1; */ - private $request_deadline = 0; + protected $request_deadline = 0; /** * Generated from protobuf field string host = 2; */ - private $host = ''; + protected $host = ''; /** * Generated from protobuf field string peer = 3; */ - private $peer = ''; + protected $peer = ''; - public function __construct() { + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type int|string $request_deadline + * @type string $host + * @type string $peer + * } + */ + public function __construct($data = NULL) { \GPBMetadata\Src\Proto\Grpc\Testing\EchoMessages::initOnce(); - parent::__construct(); + parent::__construct($data); } /** diff --git a/src/php/tests/qps/generated_code/Grpc/Testing/RpcType.php b/src/php/tests/qps/generated_code/Grpc/Testing/RpcType.php index 73a66490ea9..559d12b23f3 100644 --- a/src/php/tests/qps/generated_code/Grpc/Testing/RpcType.php +++ b/src/php/tests/qps/generated_code/Grpc/Testing/RpcType.php @@ -4,8 +4,10 @@ namespace Grpc\Testing; +use UnexpectedValueException; + /** - * Protobuf enum Grpc\Testing\RpcType + * Protobuf type grpc.testing.RpcType */ class RpcType { @@ -29,5 +31,33 @@ class RpcType * Generated from protobuf enum STREAMING_BOTH_WAYS = 4; */ const STREAMING_BOTH_WAYS = 4; + + private static $valueToName = [ + self::UNARY => 'UNARY', + self::STREAMING => 'STREAMING', + self::STREAMING_FROM_CLIENT => 'STREAMING_FROM_CLIENT', + self::STREAMING_FROM_SERVER => 'STREAMING_FROM_SERVER', + self::STREAMING_BOTH_WAYS => 'STREAMING_BOTH_WAYS', + ]; + + public static function name($value) + { + if (!isset(self::$valueToName[$value])) { + throw new UnexpectedValueException(sprintf( + 'Enum %s has no name defined for value %s', __CLASS__, $value)); + } + return self::$valueToName[$value]; + } + + + public static function value($name) + { + $const = __CLASS__ . '::' . strtoupper($name); + if (!defined($const)) { + throw new UnexpectedValueException(sprintf( + 'Enum %s has no value defined for name %s', __CLASS__, $name)); + } + return constant($const); + } } diff --git a/src/php/tests/qps/generated_code/Grpc/Testing/Scenario.php b/src/php/tests/qps/generated_code/Grpc/Testing/Scenario.php index 9ec284b71f2..8c1f3fb865b 100644 --- a/src/php/tests/qps/generated_code/Grpc/Testing/Scenario.php +++ b/src/php/tests/qps/generated_code/Grpc/Testing/Scenario.php @@ -20,53 +20,77 @@ class Scenario extends \Google\Protobuf\Internal\Message * * Generated from protobuf field string name = 1; */ - private $name = ''; + protected $name = ''; /** * Client configuration * * Generated from protobuf field .grpc.testing.ClientConfig client_config = 2; */ - private $client_config = null; + protected $client_config = null; /** * Number of clients to start for the test * * Generated from protobuf field int32 num_clients = 3; */ - private $num_clients = 0; + protected $num_clients = 0; /** * Server configuration * * Generated from protobuf field .grpc.testing.ServerConfig server_config = 4; */ - private $server_config = null; + protected $server_config = null; /** * Number of servers to start for the test * * Generated from protobuf field int32 num_servers = 5; */ - private $num_servers = 0; + protected $num_servers = 0; /** * Warmup period, in seconds * * Generated from protobuf field int32 warmup_seconds = 6; */ - private $warmup_seconds = 0; + protected $warmup_seconds = 0; /** * Benchmark time, in seconds * * Generated from protobuf field int32 benchmark_seconds = 7; */ - private $benchmark_seconds = 0; + protected $benchmark_seconds = 0; /** * Number of workers to spawn locally (usually zero) * * Generated from protobuf field int32 spawn_local_worker_count = 8; */ - private $spawn_local_worker_count = 0; + protected $spawn_local_worker_count = 0; - public function __construct() { + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $name + * Human readable name for this scenario + * @type \Grpc\Testing\ClientConfig $client_config + * Client configuration + * @type int $num_clients + * Number of clients to start for the test + * @type \Grpc\Testing\ServerConfig $server_config + * Server configuration + * @type int $num_servers + * Number of servers to start for the test + * @type int $warmup_seconds + * Warmup period, in seconds + * @type int $benchmark_seconds + * Benchmark time, in seconds + * @type int $spawn_local_worker_count + * Number of workers to spawn locally (usually zero) + * } + */ + public function __construct($data = NULL) { \GPBMetadata\Src\Proto\Grpc\Testing\Control::initOnce(); - parent::__construct(); + parent::__construct($data); } /** diff --git a/src/php/tests/qps/generated_code/Grpc/Testing/ScenarioResult.php b/src/php/tests/qps/generated_code/Grpc/Testing/ScenarioResult.php index 31d9a39a1fc..a15b787fca6 100644 --- a/src/php/tests/qps/generated_code/Grpc/Testing/ScenarioResult.php +++ b/src/php/tests/qps/generated_code/Grpc/Testing/ScenarioResult.php @@ -20,13 +20,13 @@ class ScenarioResult extends \Google\Protobuf\Internal\Message * * Generated from protobuf field .grpc.testing.Scenario scenario = 1; */ - private $scenario = null; + protected $scenario = null; /** * Histograms from all clients merged into one histogram. * * Generated from protobuf field .grpc.testing.HistogramData latencies = 2; */ - private $latencies = null; + protected $latencies = null; /** * Client stats for each client * @@ -50,7 +50,7 @@ class ScenarioResult extends \Google\Protobuf\Internal\Message * * Generated from protobuf field .grpc.testing.ScenarioResultSummary summary = 6; */ - private $summary = null; + protected $summary = null; /** * Information on success or failure of each worker * @@ -68,9 +68,34 @@ class ScenarioResult extends \Google\Protobuf\Internal\Message */ private $request_results; - public function __construct() { + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type \Grpc\Testing\Scenario $scenario + * Inputs used to run the scenario. + * @type \Grpc\Testing\HistogramData $latencies + * Histograms from all clients merged into one histogram. + * @type \Grpc\Testing\ClientStats[]|\Google\Protobuf\Internal\RepeatedField $client_stats + * Client stats for each client + * @type \Grpc\Testing\ServerStats[]|\Google\Protobuf\Internal\RepeatedField $server_stats + * Server stats for each server + * @type int[]|\Google\Protobuf\Internal\RepeatedField $server_cores + * Number of cores available to each server + * @type \Grpc\Testing\ScenarioResultSummary $summary + * An after-the-fact computed summary + * @type bool[]|\Google\Protobuf\Internal\RepeatedField $client_success + * Information on success or failure of each worker + * @type bool[]|\Google\Protobuf\Internal\RepeatedField $server_success + * @type \Grpc\Testing\RequestResultCount[]|\Google\Protobuf\Internal\RepeatedField $request_results + * Number of failed requests (one row per status code seen) + * } + */ + public function __construct($data = NULL) { \GPBMetadata\Src\Proto\Grpc\Testing\Control::initOnce(); - parent::__construct(); + parent::__construct($data); } /** diff --git a/src/php/tests/qps/generated_code/Grpc/Testing/ScenarioResultSummary.php b/src/php/tests/qps/generated_code/Grpc/Testing/ScenarioResultSummary.php index f7f1c987b53..2724e9cb372 100644 --- a/src/php/tests/qps/generated_code/Grpc/Testing/ScenarioResultSummary.php +++ b/src/php/tests/qps/generated_code/Grpc/Testing/ScenarioResultSummary.php @@ -17,107 +17,156 @@ use Google\Protobuf\Internal\GPBUtil; class ScenarioResultSummary extends \Google\Protobuf\Internal\Message { /** - * Total number of operations per second over all clients. + * Total number of operations per second over all clients. What is counted as 1 'operation' depends on the benchmark scenarios: + * For unary benchmarks, an operation is processing of a single unary RPC. + * For streaming benchmarks, an operation is processing of a single ping pong of request and response. * * Generated from protobuf field double qps = 1; */ - private $qps = 0.0; + protected $qps = 0.0; /** - * QPS per one server core. + * QPS per server core. * * Generated from protobuf field double qps_per_server_core = 2; */ - private $qps_per_server_core = 0.0; + protected $qps_per_server_core = 0.0; /** - * server load based on system_time (0.85 => 85%) + * The total server cpu load based on system time across all server processes, expressed as percentage of a single cpu core. + * For example, 85 implies 85% of a cpu core, 125 implies 125% of a cpu core. Since we are accumulating the cpu load across all the server + * processes, the value could > 100 when there are multiple servers or a single server using multiple threads and cores. + * Same explanation for the total client cpu load below. * * Generated from protobuf field double server_system_time = 3; */ - private $server_system_time = 0.0; + protected $server_system_time = 0.0; /** - * server load based on user_time (0.85 => 85%) + * The total server cpu load based on user time across all server processes, expressed as percentage of a single cpu core. (85 => 85%, 125 => 125%) * * Generated from protobuf field double server_user_time = 4; */ - private $server_user_time = 0.0; + protected $server_user_time = 0.0; /** - * client load based on system_time (0.85 => 85%) + * The total client cpu load based on system time across all client processes, expressed as percentage of a single cpu core. (85 => 85%, 125 => 125%) * * Generated from protobuf field double client_system_time = 5; */ - private $client_system_time = 0.0; + protected $client_system_time = 0.0; /** - * client load based on user_time (0.85 => 85%) + * The total client cpu load based on user time across all client processes, expressed as percentage of a single cpu core. (85 => 85%, 125 => 125%) * * Generated from protobuf field double client_user_time = 6; */ - private $client_user_time = 0.0; + protected $client_user_time = 0.0; /** * X% latency percentiles (in nanoseconds) * * Generated from protobuf field double latency_50 = 7; */ - private $latency_50 = 0.0; + protected $latency_50 = 0.0; /** * Generated from protobuf field double latency_90 = 8; */ - private $latency_90 = 0.0; + protected $latency_90 = 0.0; /** * Generated from protobuf field double latency_95 = 9; */ - private $latency_95 = 0.0; + protected $latency_95 = 0.0; /** * Generated from protobuf field double latency_99 = 10; */ - private $latency_99 = 0.0; + protected $latency_99 = 0.0; /** * Generated from protobuf field double latency_999 = 11; */ - private $latency_999 = 0.0; + protected $latency_999 = 0.0; /** * server cpu usage percentage * * Generated from protobuf field double server_cpu_usage = 12; */ - private $server_cpu_usage = 0.0; + protected $server_cpu_usage = 0.0; /** * Number of requests that succeeded/failed * * Generated from protobuf field double successful_requests_per_second = 13; */ - private $successful_requests_per_second = 0.0; + protected $successful_requests_per_second = 0.0; /** * Generated from protobuf field double failed_requests_per_second = 14; */ - private $failed_requests_per_second = 0.0; + protected $failed_requests_per_second = 0.0; /** * Number of polls called inside completion queue per request * * Generated from protobuf field double client_polls_per_request = 15; */ - private $client_polls_per_request = 0.0; + protected $client_polls_per_request = 0.0; /** * Generated from protobuf field double server_polls_per_request = 16; */ - private $server_polls_per_request = 0.0; + protected $server_polls_per_request = 0.0; /** * Queries per CPU-sec over all servers or clients * * Generated from protobuf field double server_queries_per_cpu_sec = 17; */ - private $server_queries_per_cpu_sec = 0.0; + protected $server_queries_per_cpu_sec = 0.0; /** * Generated from protobuf field double client_queries_per_cpu_sec = 18; */ - private $client_queries_per_cpu_sec = 0.0; - - public function __construct() { + protected $client_queries_per_cpu_sec = 0.0; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type float $qps + * Total number of operations per second over all clients. What is counted as 1 'operation' depends on the benchmark scenarios: + * For unary benchmarks, an operation is processing of a single unary RPC. + * For streaming benchmarks, an operation is processing of a single ping pong of request and response. + * @type float $qps_per_server_core + * QPS per server core. + * @type float $server_system_time + * The total server cpu load based on system time across all server processes, expressed as percentage of a single cpu core. + * For example, 85 implies 85% of a cpu core, 125 implies 125% of a cpu core. Since we are accumulating the cpu load across all the server + * processes, the value could > 100 when there are multiple servers or a single server using multiple threads and cores. + * Same explanation for the total client cpu load below. + * @type float $server_user_time + * The total server cpu load based on user time across all server processes, expressed as percentage of a single cpu core. (85 => 85%, 125 => 125%) + * @type float $client_system_time + * The total client cpu load based on system time across all client processes, expressed as percentage of a single cpu core. (85 => 85%, 125 => 125%) + * @type float $client_user_time + * The total client cpu load based on user time across all client processes, expressed as percentage of a single cpu core. (85 => 85%, 125 => 125%) + * @type float $latency_50 + * X% latency percentiles (in nanoseconds) + * @type float $latency_90 + * @type float $latency_95 + * @type float $latency_99 + * @type float $latency_999 + * @type float $server_cpu_usage + * server cpu usage percentage + * @type float $successful_requests_per_second + * Number of requests that succeeded/failed + * @type float $failed_requests_per_second + * @type float $client_polls_per_request + * Number of polls called inside completion queue per request + * @type float $server_polls_per_request + * @type float $server_queries_per_cpu_sec + * Queries per CPU-sec over all servers or clients + * @type float $client_queries_per_cpu_sec + * } + */ + public function __construct($data = NULL) { \GPBMetadata\Src\Proto\Grpc\Testing\Control::initOnce(); - parent::__construct(); + parent::__construct($data); } /** - * Total number of operations per second over all clients. + * Total number of operations per second over all clients. What is counted as 1 'operation' depends on the benchmark scenarios: + * For unary benchmarks, an operation is processing of a single unary RPC. + * For streaming benchmarks, an operation is processing of a single ping pong of request and response. * * Generated from protobuf field double qps = 1; * @return float @@ -128,7 +177,9 @@ class ScenarioResultSummary extends \Google\Protobuf\Internal\Message } /** - * Total number of operations per second over all clients. + * Total number of operations per second over all clients. What is counted as 1 'operation' depends on the benchmark scenarios: + * For unary benchmarks, an operation is processing of a single unary RPC. + * For streaming benchmarks, an operation is processing of a single ping pong of request and response. * * Generated from protobuf field double qps = 1; * @param float $var @@ -143,7 +194,7 @@ class ScenarioResultSummary extends \Google\Protobuf\Internal\Message } /** - * QPS per one server core. + * QPS per server core. * * Generated from protobuf field double qps_per_server_core = 2; * @return float @@ -154,7 +205,7 @@ class ScenarioResultSummary extends \Google\Protobuf\Internal\Message } /** - * QPS per one server core. + * QPS per server core. * * Generated from protobuf field double qps_per_server_core = 2; * @param float $var @@ -169,7 +220,10 @@ class ScenarioResultSummary extends \Google\Protobuf\Internal\Message } /** - * server load based on system_time (0.85 => 85%) + * The total server cpu load based on system time across all server processes, expressed as percentage of a single cpu core. + * For example, 85 implies 85% of a cpu core, 125 implies 125% of a cpu core. Since we are accumulating the cpu load across all the server + * processes, the value could > 100 when there are multiple servers or a single server using multiple threads and cores. + * Same explanation for the total client cpu load below. * * Generated from protobuf field double server_system_time = 3; * @return float @@ -180,7 +234,10 @@ class ScenarioResultSummary extends \Google\Protobuf\Internal\Message } /** - * server load based on system_time (0.85 => 85%) + * The total server cpu load based on system time across all server processes, expressed as percentage of a single cpu core. + * For example, 85 implies 85% of a cpu core, 125 implies 125% of a cpu core. Since we are accumulating the cpu load across all the server + * processes, the value could > 100 when there are multiple servers or a single server using multiple threads and cores. + * Same explanation for the total client cpu load below. * * Generated from protobuf field double server_system_time = 3; * @param float $var @@ -195,7 +252,7 @@ class ScenarioResultSummary extends \Google\Protobuf\Internal\Message } /** - * server load based on user_time (0.85 => 85%) + * The total server cpu load based on user time across all server processes, expressed as percentage of a single cpu core. (85 => 85%, 125 => 125%) * * Generated from protobuf field double server_user_time = 4; * @return float @@ -206,7 +263,7 @@ class ScenarioResultSummary extends \Google\Protobuf\Internal\Message } /** - * server load based on user_time (0.85 => 85%) + * The total server cpu load based on user time across all server processes, expressed as percentage of a single cpu core. (85 => 85%, 125 => 125%) * * Generated from protobuf field double server_user_time = 4; * @param float $var @@ -221,7 +278,7 @@ class ScenarioResultSummary extends \Google\Protobuf\Internal\Message } /** - * client load based on system_time (0.85 => 85%) + * The total client cpu load based on system time across all client processes, expressed as percentage of a single cpu core. (85 => 85%, 125 => 125%) * * Generated from protobuf field double client_system_time = 5; * @return float @@ -232,7 +289,7 @@ class ScenarioResultSummary extends \Google\Protobuf\Internal\Message } /** - * client load based on system_time (0.85 => 85%) + * The total client cpu load based on system time across all client processes, expressed as percentage of a single cpu core. (85 => 85%, 125 => 125%) * * Generated from protobuf field double client_system_time = 5; * @param float $var @@ -247,7 +304,7 @@ class ScenarioResultSummary extends \Google\Protobuf\Internal\Message } /** - * client load based on user_time (0.85 => 85%) + * The total client cpu load based on user time across all client processes, expressed as percentage of a single cpu core. (85 => 85%, 125 => 125%) * * Generated from protobuf field double client_user_time = 6; * @return float @@ -258,7 +315,7 @@ class ScenarioResultSummary extends \Google\Protobuf\Internal\Message } /** - * client load based on user_time (0.85 => 85%) + * The total client cpu load based on user time across all client processes, expressed as percentage of a single cpu core. (85 => 85%, 125 => 125%) * * Generated from protobuf field double client_user_time = 6; * @param float $var diff --git a/src/php/tests/qps/generated_code/Grpc/Testing/Scenarios.php b/src/php/tests/qps/generated_code/Grpc/Testing/Scenarios.php index 2146b4776e2..8712524784f 100644 --- a/src/php/tests/qps/generated_code/Grpc/Testing/Scenarios.php +++ b/src/php/tests/qps/generated_code/Grpc/Testing/Scenarios.php @@ -20,9 +20,18 @@ class Scenarios extends \Google\Protobuf\Internal\Message */ private $scenarios; - public function __construct() { + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type \Grpc\Testing\Scenario[]|\Google\Protobuf\Internal\RepeatedField $scenarios + * } + */ + public function __construct($data = NULL) { \GPBMetadata\Src\Proto\Grpc\Testing\Control::initOnce(); - parent::__construct(); + parent::__construct($data); } /** diff --git a/src/php/tests/qps/generated_code/Grpc/Testing/SecurityParams.php b/src/php/tests/qps/generated_code/Grpc/Testing/SecurityParams.php index 8ce623a4bc1..d54e56b0842 100644 --- a/src/php/tests/qps/generated_code/Grpc/Testing/SecurityParams.php +++ b/src/php/tests/qps/generated_code/Grpc/Testing/SecurityParams.php @@ -18,19 +18,30 @@ class SecurityParams extends \Google\Protobuf\Internal\Message /** * Generated from protobuf field bool use_test_ca = 1; */ - private $use_test_ca = false; + protected $use_test_ca = false; /** * Generated from protobuf field string server_host_override = 2; */ - private $server_host_override = ''; + protected $server_host_override = ''; /** * Generated from protobuf field string cred_type = 3; */ - private $cred_type = ''; + protected $cred_type = ''; - public function __construct() { + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type bool $use_test_ca + * @type string $server_host_override + * @type string $cred_type + * } + */ + public function __construct($data = NULL) { \GPBMetadata\Src\Proto\Grpc\Testing\Control::initOnce(); - parent::__construct(); + parent::__construct($data); } /** diff --git a/src/php/tests/qps/generated_code/Grpc/Testing/ServerArgs.php b/src/php/tests/qps/generated_code/Grpc/Testing/ServerArgs.php index acf7e18b6da..a6783ed5303 100644 --- a/src/php/tests/qps/generated_code/Grpc/Testing/ServerArgs.php +++ b/src/php/tests/qps/generated_code/Grpc/Testing/ServerArgs.php @@ -15,9 +15,19 @@ class ServerArgs extends \Google\Protobuf\Internal\Message { protected $argtype; - public function __construct() { + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type \Grpc\Testing\ServerConfig $setup + * @type \Grpc\Testing\Mark $mark + * } + */ + public function __construct($data = NULL) { \GPBMetadata\Src\Proto\Grpc\Testing\Control::initOnce(); - parent::__construct(); + parent::__construct($data); } /** diff --git a/src/php/tests/qps/generated_code/Grpc/Testing/ServerConfig.php b/src/php/tests/qps/generated_code/Grpc/Testing/ServerConfig.php index 8bd4c69566b..f44fa3180f9 100644 --- a/src/php/tests/qps/generated_code/Grpc/Testing/ServerConfig.php +++ b/src/php/tests/qps/generated_code/Grpc/Testing/ServerConfig.php @@ -16,29 +16,29 @@ class ServerConfig extends \Google\Protobuf\Internal\Message /** * Generated from protobuf field .grpc.testing.ServerType server_type = 1; */ - private $server_type = 0; + protected $server_type = 0; /** * Generated from protobuf field .grpc.testing.SecurityParams security_params = 2; */ - private $security_params = null; + protected $security_params = null; /** * Port on which to listen. Zero means pick unused port. * * Generated from protobuf field int32 port = 4; */ - private $port = 0; + protected $port = 0; /** * Only for async server. Number of threads used to serve the requests. * * Generated from protobuf field int32 async_server_threads = 7; */ - private $async_server_threads = 0; + protected $async_server_threads = 0; /** * Specify the number of cores to limit server to, if desired * * Generated from protobuf field int32 core_limit = 8; */ - private $core_limit = 0; + protected $core_limit = 0; /** * payload config, used in generic server. * Note this must NOT be used in proto (non-generic) servers. For proto servers, @@ -47,7 +47,7 @@ class ServerConfig extends \Google\Protobuf\Internal\Message * * Generated from protobuf field .grpc.testing.PayloadConfig payload_config = 9; */ - private $payload_config = null; + protected $payload_config = null; /** * Specify the cores we should run the server on, if desired * @@ -59,27 +59,65 @@ class ServerConfig extends \Google\Protobuf\Internal\Message * * Generated from protobuf field string other_server_api = 11; */ - private $other_server_api = ''; + protected $other_server_api = ''; /** * Number of threads that share each completion queue * * Generated from protobuf field int32 threads_per_cq = 12; */ - private $threads_per_cq = 0; + protected $threads_per_cq = 0; /** * Buffer pool size (no buffer pool specified if unset) * * Generated from protobuf field int32 resource_quota_size = 1001; */ - private $resource_quota_size = 0; + protected $resource_quota_size = 0; /** * Generated from protobuf field repeated .grpc.testing.ChannelArg channel_args = 1002; */ private $channel_args; + /** + * Number of server processes. 0 indicates no restriction. + * + * Generated from protobuf field int32 server_processes = 21; + */ + protected $server_processes = 0; - public function __construct() { + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type int $server_type + * @type \Grpc\Testing\SecurityParams $security_params + * @type int $port + * Port on which to listen. Zero means pick unused port. + * @type int $async_server_threads + * Only for async server. Number of threads used to serve the requests. + * @type int $core_limit + * Specify the number of cores to limit server to, if desired + * @type \Grpc\Testing\PayloadConfig $payload_config + * payload config, used in generic server. + * Note this must NOT be used in proto (non-generic) servers. For proto servers, + * 'response sizes' must be configured from the 'response_size' field of the + * 'SimpleRequest' objects in RPC requests. + * @type int[]|\Google\Protobuf\Internal\RepeatedField $core_list + * Specify the cores we should run the server on, if desired + * @type string $other_server_api + * If we use an OTHER_SERVER client_type, this string gives more detail + * @type int $threads_per_cq + * Number of threads that share each completion queue + * @type int $resource_quota_size + * Buffer pool size (no buffer pool specified if unset) + * @type \Grpc\Testing\ChannelArg[]|\Google\Protobuf\Internal\RepeatedField $channel_args + * @type int $server_processes + * Number of server processes. 0 indicates no restriction. + * } + */ + public function __construct($data = NULL) { \GPBMetadata\Src\Proto\Grpc\Testing\Control::initOnce(); - parent::__construct(); + parent::__construct($data); } /** @@ -362,5 +400,31 @@ class ServerConfig extends \Google\Protobuf\Internal\Message return $this; } + /** + * Number of server processes. 0 indicates no restriction. + * + * Generated from protobuf field int32 server_processes = 21; + * @return int + */ + public function getServerProcesses() + { + return $this->server_processes; + } + + /** + * Number of server processes. 0 indicates no restriction. + * + * Generated from protobuf field int32 server_processes = 21; + * @param int $var + * @return $this + */ + public function setServerProcesses($var) + { + GPBUtil::checkInt32($var); + $this->server_processes = $var; + + return $this; + } + } diff --git a/src/php/tests/qps/generated_code/Grpc/Testing/ServerStats.php b/src/php/tests/qps/generated_code/Grpc/Testing/ServerStats.php index aea2cb0fce3..c91696d3240 100644 --- a/src/php/tests/qps/generated_code/Grpc/Testing/ServerStats.php +++ b/src/php/tests/qps/generated_code/Grpc/Testing/ServerStats.php @@ -18,48 +18,71 @@ class ServerStats extends \Google\Protobuf\Internal\Message * * Generated from protobuf field double time_elapsed = 1; */ - private $time_elapsed = 0.0; + protected $time_elapsed = 0.0; /** * change in user time (in seconds) used by the server since last reset * * Generated from protobuf field double time_user = 2; */ - private $time_user = 0.0; + protected $time_user = 0.0; /** * change in server time (in seconds) used by the server process and all * threads since last reset * * Generated from protobuf field double time_system = 3; */ - private $time_system = 0.0; + protected $time_system = 0.0; /** * change in total cpu time of the server (data from proc/stat) * * Generated from protobuf field uint64 total_cpu_time = 4; */ - private $total_cpu_time = 0; + protected $total_cpu_time = 0; /** * change in idle time of the server (data from proc/stat) * * Generated from protobuf field uint64 idle_cpu_time = 5; */ - private $idle_cpu_time = 0; + protected $idle_cpu_time = 0; /** * Number of polls called inside completion queue * * Generated from protobuf field uint64 cq_poll_count = 6; */ - private $cq_poll_count = 0; + protected $cq_poll_count = 0; /** * Core library stats * * Generated from protobuf field .grpc.core.Stats core_stats = 7; */ - private $core_stats = null; + protected $core_stats = null; - public function __construct() { + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type float $time_elapsed + * wall clock time change in seconds since last reset + * @type float $time_user + * change in user time (in seconds) used by the server since last reset + * @type float $time_system + * change in server time (in seconds) used by the server process and all + * threads since last reset + * @type int|string $total_cpu_time + * change in total cpu time of the server (data from proc/stat) + * @type int|string $idle_cpu_time + * change in idle time of the server (data from proc/stat) + * @type int|string $cq_poll_count + * Number of polls called inside completion queue + * @type \Grpc\Core\Stats $core_stats + * Core library stats + * } + */ + public function __construct($data = NULL) { \GPBMetadata\Src\Proto\Grpc\Testing\Stats::initOnce(); - parent::__construct(); + parent::__construct($data); } /** diff --git a/src/php/tests/qps/generated_code/Grpc/Testing/ServerStatus.php b/src/php/tests/qps/generated_code/Grpc/Testing/ServerStatus.php index 04f2ca7c4ae..ae96db02c6c 100644 --- a/src/php/tests/qps/generated_code/Grpc/Testing/ServerStatus.php +++ b/src/php/tests/qps/generated_code/Grpc/Testing/ServerStatus.php @@ -16,23 +16,36 @@ class ServerStatus extends \Google\Protobuf\Internal\Message /** * Generated from protobuf field .grpc.testing.ServerStats stats = 1; */ - private $stats = null; + protected $stats = null; /** * the port bound by the server * * Generated from protobuf field int32 port = 2; */ - private $port = 0; + protected $port = 0; /** * Number of cores available to the server * * Generated from protobuf field int32 cores = 3; */ - private $cores = 0; + protected $cores = 0; - public function __construct() { + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type \Grpc\Testing\ServerStats $stats + * @type int $port + * the port bound by the server + * @type int $cores + * Number of cores available to the server + * } + */ + public function __construct($data = NULL) { \GPBMetadata\Src\Proto\Grpc\Testing\Control::initOnce(); - parent::__construct(); + parent::__construct($data); } /** diff --git a/src/php/tests/qps/generated_code/Grpc/Testing/ServerType.php b/src/php/tests/qps/generated_code/Grpc/Testing/ServerType.php index 4110e91c18a..1c2c0413445 100644 --- a/src/php/tests/qps/generated_code/Grpc/Testing/ServerType.php +++ b/src/php/tests/qps/generated_code/Grpc/Testing/ServerType.php @@ -4,8 +4,10 @@ namespace Grpc\Testing; +use UnexpectedValueException; + /** - * Protobuf enum Grpc\Testing\ServerType + * Protobuf type grpc.testing.ServerType */ class ServerType { @@ -27,5 +29,37 @@ class ServerType * Generated from protobuf enum OTHER_SERVER = 3; */ const OTHER_SERVER = 3; + /** + * Generated from protobuf enum CALLBACK_SERVER = 4; + */ + const CALLBACK_SERVER = 4; + + private static $valueToName = [ + self::SYNC_SERVER => 'SYNC_SERVER', + self::ASYNC_SERVER => 'ASYNC_SERVER', + self::ASYNC_GENERIC_SERVER => 'ASYNC_GENERIC_SERVER', + self::OTHER_SERVER => 'OTHER_SERVER', + self::CALLBACK_SERVER => 'CALLBACK_SERVER', + ]; + + public static function name($value) + { + if (!isset(self::$valueToName[$value])) { + throw new UnexpectedValueException(sprintf( + 'Enum %s has no name defined for value %s', __CLASS__, $value)); + } + return self::$valueToName[$value]; + } + + + public static function value($name) + { + $const = __CLASS__ . '::' . strtoupper($name); + if (!defined($const)) { + throw new UnexpectedValueException(sprintf( + 'Enum %s has no value defined for name %s', __CLASS__, $name)); + } + return constant($const); + } } diff --git a/src/php/tests/qps/generated_code/Grpc/Testing/SimpleProtoParams.php b/src/php/tests/qps/generated_code/Grpc/Testing/SimpleProtoParams.php index 507db598f03..1edc36870e9 100644 --- a/src/php/tests/qps/generated_code/Grpc/Testing/SimpleProtoParams.php +++ b/src/php/tests/qps/generated_code/Grpc/Testing/SimpleProtoParams.php @@ -16,15 +16,25 @@ class SimpleProtoParams extends \Google\Protobuf\Internal\Message /** * Generated from protobuf field int32 req_size = 1; */ - private $req_size = 0; + protected $req_size = 0; /** * Generated from protobuf field int32 resp_size = 2; */ - private $resp_size = 0; + protected $resp_size = 0; - public function __construct() { + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type int $req_size + * @type int $resp_size + * } + */ + public function __construct($data = NULL) { \GPBMetadata\Src\Proto\Grpc\Testing\Payloads::initOnce(); - parent::__construct(); + parent::__construct($data); } /** diff --git a/src/php/tests/qps/generated_code/Grpc/Testing/SimpleRequest.php b/src/php/tests/qps/generated_code/Grpc/Testing/SimpleRequest.php index e0c2d2d94ce..95393659811 100644 --- a/src/php/tests/qps/generated_code/Grpc/Testing/SimpleRequest.php +++ b/src/php/tests/qps/generated_code/Grpc/Testing/SimpleRequest.php @@ -16,37 +16,36 @@ use Google\Protobuf\Internal\GPBUtil; class SimpleRequest extends \Google\Protobuf\Internal\Message { /** - * DEPRECATED, don't use. To be removed shortly. * Desired payload type in the response from the server. * If response_type is RANDOM, server randomly chooses one from other formats. * * Generated from protobuf field .grpc.testing.PayloadType response_type = 1; */ - private $response_type = 0; + protected $response_type = 0; /** * Desired payload size in the response from the server. * * Generated from protobuf field int32 response_size = 2; */ - private $response_size = 0; + protected $response_size = 0; /** * Optional input payload sent along with the request. * * Generated from protobuf field .grpc.testing.Payload payload = 3; */ - private $payload = null; + protected $payload = null; /** * Whether SimpleResponse should include username. * * Generated from protobuf field bool fill_username = 4; */ - private $fill_username = false; + protected $fill_username = false; /** * Whether SimpleResponse should include OAuth scope. * * Generated from protobuf field bool fill_oauth_scope = 5; */ - private $fill_oauth_scope = false; + protected $fill_oauth_scope = false; /** * Whether to request the server to compress the response. This field is * "nullable" in order to interoperate seamlessly with clients not able to @@ -55,27 +54,70 @@ class SimpleRequest extends \Google\Protobuf\Internal\Message * * Generated from protobuf field .grpc.testing.BoolValue response_compressed = 6; */ - private $response_compressed = null; + protected $response_compressed = null; /** * Whether server should return a given status * * Generated from protobuf field .grpc.testing.EchoStatus response_status = 7; */ - private $response_status = null; + protected $response_status = null; /** * Whether the server should expect this request to be compressed. * * Generated from protobuf field .grpc.testing.BoolValue expect_compressed = 8; */ - private $expect_compressed = null; + protected $expect_compressed = null; + /** + * Whether SimpleResponse should include server_id. + * + * Generated from protobuf field bool fill_server_id = 9; + */ + protected $fill_server_id = false; + /** + * Whether SimpleResponse should include grpclb_route_type. + * + * Generated from protobuf field bool fill_grpclb_route_type = 10; + */ + protected $fill_grpclb_route_type = false; - public function __construct() { + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type int $response_type + * Desired payload type in the response from the server. + * If response_type is RANDOM, server randomly chooses one from other formats. + * @type int $response_size + * Desired payload size in the response from the server. + * @type \Grpc\Testing\Payload $payload + * Optional input payload sent along with the request. + * @type bool $fill_username + * Whether SimpleResponse should include username. + * @type bool $fill_oauth_scope + * Whether SimpleResponse should include OAuth scope. + * @type \Grpc\Testing\BoolValue $response_compressed + * Whether to request the server to compress the response. This field is + * "nullable" in order to interoperate seamlessly with clients not able to + * implement the full compression tests by introspecting the call to verify + * the response's compression status. + * @type \Grpc\Testing\EchoStatus $response_status + * Whether server should return a given status + * @type \Grpc\Testing\BoolValue $expect_compressed + * Whether the server should expect this request to be compressed. + * @type bool $fill_server_id + * Whether SimpleResponse should include server_id. + * @type bool $fill_grpclb_route_type + * Whether SimpleResponse should include grpclb_route_type. + * } + */ + public function __construct($data = NULL) { \GPBMetadata\Src\Proto\Grpc\Testing\Messages::initOnce(); - parent::__construct(); + parent::__construct($data); } /** - * DEPRECATED, don't use. To be removed shortly. * Desired payload type in the response from the server. * If response_type is RANDOM, server randomly chooses one from other formats. * @@ -88,7 +130,6 @@ class SimpleRequest extends \Google\Protobuf\Internal\Message } /** - * DEPRECATED, don't use. To be removed shortly. * Desired payload type in the response from the server. * If response_type is RANDOM, server randomly chooses one from other formats. * @@ -292,5 +333,57 @@ class SimpleRequest extends \Google\Protobuf\Internal\Message return $this; } + /** + * Whether SimpleResponse should include server_id. + * + * Generated from protobuf field bool fill_server_id = 9; + * @return bool + */ + public function getFillServerId() + { + return $this->fill_server_id; + } + + /** + * Whether SimpleResponse should include server_id. + * + * Generated from protobuf field bool fill_server_id = 9; + * @param bool $var + * @return $this + */ + public function setFillServerId($var) + { + GPBUtil::checkBool($var); + $this->fill_server_id = $var; + + return $this; + } + + /** + * Whether SimpleResponse should include grpclb_route_type. + * + * Generated from protobuf field bool fill_grpclb_route_type = 10; + * @return bool + */ + public function getFillGrpclbRouteType() + { + return $this->fill_grpclb_route_type; + } + + /** + * Whether SimpleResponse should include grpclb_route_type. + * + * Generated from protobuf field bool fill_grpclb_route_type = 10; + * @param bool $var + * @return $this + */ + public function setFillGrpclbRouteType($var) + { + GPBUtil::checkBool($var); + $this->fill_grpclb_route_type = $var; + + return $this; + } + } diff --git a/src/php/tests/qps/generated_code/Grpc/Testing/SimpleResponse.php b/src/php/tests/qps/generated_code/Grpc/Testing/SimpleResponse.php index d49f33746e2..7121fc215ec 100644 --- a/src/php/tests/qps/generated_code/Grpc/Testing/SimpleResponse.php +++ b/src/php/tests/qps/generated_code/Grpc/Testing/SimpleResponse.php @@ -20,24 +20,65 @@ class SimpleResponse extends \Google\Protobuf\Internal\Message * * Generated from protobuf field .grpc.testing.Payload payload = 1; */ - private $payload = null; + protected $payload = null; /** * The user the request came from, for verifying authentication was * successful when the client expected it. * * Generated from protobuf field string username = 2; */ - private $username = ''; + protected $username = ''; /** * OAuth scope. * * Generated from protobuf field string oauth_scope = 3; */ - private $oauth_scope = ''; + protected $oauth_scope = ''; + /** + * Server ID. This must be unique among different server instances, + * but the same across all RPC's made to a particular server instance. + * + * Generated from protobuf field string server_id = 4; + */ + protected $server_id = ''; + /** + * gRPCLB Path. + * + * Generated from protobuf field .grpc.testing.GrpclbRouteType grpclb_route_type = 5; + */ + protected $grpclb_route_type = 0; + /** + * Server hostname. + * + * Generated from protobuf field string hostname = 6; + */ + protected $hostname = ''; - public function __construct() { + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type \Grpc\Testing\Payload $payload + * Payload to increase message size. + * @type string $username + * The user the request came from, for verifying authentication was + * successful when the client expected it. + * @type string $oauth_scope + * OAuth scope. + * @type string $server_id + * Server ID. This must be unique among different server instances, + * but the same across all RPC's made to a particular server instance. + * @type int $grpclb_route_type + * gRPCLB Path. + * @type string $hostname + * Server hostname. + * } + */ + public function __construct($data = NULL) { \GPBMetadata\Src\Proto\Grpc\Testing\Messages::initOnce(); - parent::__construct(); + parent::__construct($data); } /** @@ -120,5 +161,85 @@ class SimpleResponse extends \Google\Protobuf\Internal\Message return $this; } + /** + * Server ID. This must be unique among different server instances, + * but the same across all RPC's made to a particular server instance. + * + * Generated from protobuf field string server_id = 4; + * @return string + */ + public function getServerId() + { + return $this->server_id; + } + + /** + * Server ID. This must be unique among different server instances, + * but the same across all RPC's made to a particular server instance. + * + * Generated from protobuf field string server_id = 4; + * @param string $var + * @return $this + */ + public function setServerId($var) + { + GPBUtil::checkString($var, True); + $this->server_id = $var; + + return $this; + } + + /** + * gRPCLB Path. + * + * Generated from protobuf field .grpc.testing.GrpclbRouteType grpclb_route_type = 5; + * @return int + */ + public function getGrpclbRouteType() + { + return $this->grpclb_route_type; + } + + /** + * gRPCLB Path. + * + * Generated from protobuf field .grpc.testing.GrpclbRouteType grpclb_route_type = 5; + * @param int $var + * @return $this + */ + public function setGrpclbRouteType($var) + { + GPBUtil::checkEnum($var, \Grpc\Testing\GrpclbRouteType::class); + $this->grpclb_route_type = $var; + + return $this; + } + + /** + * Server hostname. + * + * Generated from protobuf field string hostname = 6; + * @return string + */ + public function getHostname() + { + return $this->hostname; + } + + /** + * Server hostname. + * + * Generated from protobuf field string hostname = 6; + * @param string $var + * @return $this + */ + public function setHostname($var) + { + GPBUtil::checkString($var, True); + $this->hostname = $var; + + return $this; + } + } diff --git a/src/php/tests/qps/generated_code/Grpc/Testing/StreamingInputCallRequest.php b/src/php/tests/qps/generated_code/Grpc/Testing/StreamingInputCallRequest.php index a7460af83a3..00c754b946b 100644 --- a/src/php/tests/qps/generated_code/Grpc/Testing/StreamingInputCallRequest.php +++ b/src/php/tests/qps/generated_code/Grpc/Testing/StreamingInputCallRequest.php @@ -20,7 +20,7 @@ class StreamingInputCallRequest extends \Google\Protobuf\Internal\Message * * Generated from protobuf field .grpc.testing.Payload payload = 1; */ - private $payload = null; + protected $payload = null; /** * Whether the server should expect this request to be compressed. This field * is "nullable" in order to interoperate seamlessly with servers not able to @@ -29,11 +29,26 @@ class StreamingInputCallRequest extends \Google\Protobuf\Internal\Message * * Generated from protobuf field .grpc.testing.BoolValue expect_compressed = 2; */ - private $expect_compressed = null; + protected $expect_compressed = null; - public function __construct() { + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type \Grpc\Testing\Payload $payload + * Optional input payload sent along with the request. + * @type \Grpc\Testing\BoolValue $expect_compressed + * Whether the server should expect this request to be compressed. This field + * is "nullable" in order to interoperate seamlessly with servers not able to + * implement the full compression tests by introspecting the call to verify + * the request's compression status. + * } + */ + public function __construct($data = NULL) { \GPBMetadata\Src\Proto\Grpc\Testing\Messages::initOnce(); - parent::__construct(); + parent::__construct($data); } /** diff --git a/src/php/tests/qps/generated_code/Grpc/Testing/StreamingInputCallResponse.php b/src/php/tests/qps/generated_code/Grpc/Testing/StreamingInputCallResponse.php index 41f3893aa3f..f7ff87c1fb1 100644 --- a/src/php/tests/qps/generated_code/Grpc/Testing/StreamingInputCallResponse.php +++ b/src/php/tests/qps/generated_code/Grpc/Testing/StreamingInputCallResponse.php @@ -20,11 +20,21 @@ class StreamingInputCallResponse extends \Google\Protobuf\Internal\Message * * Generated from protobuf field int32 aggregated_payload_size = 1; */ - private $aggregated_payload_size = 0; + protected $aggregated_payload_size = 0; - public function __construct() { + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type int $aggregated_payload_size + * Aggregated size of payloads received from the client. + * } + */ + public function __construct($data = NULL) { \GPBMetadata\Src\Proto\Grpc\Testing\Messages::initOnce(); - parent::__construct(); + parent::__construct($data); } /** diff --git a/src/php/tests/qps/generated_code/Grpc/Testing/StreamingOutputCallRequest.php b/src/php/tests/qps/generated_code/Grpc/Testing/StreamingOutputCallRequest.php index 69d9cecffa7..552e96d7ae2 100644 --- a/src/php/tests/qps/generated_code/Grpc/Testing/StreamingOutputCallRequest.php +++ b/src/php/tests/qps/generated_code/Grpc/Testing/StreamingOutputCallRequest.php @@ -16,7 +16,6 @@ use Google\Protobuf\Internal\GPBUtil; class StreamingOutputCallRequest extends \Google\Protobuf\Internal\Message { /** - * DEPRECATED, don't use. To be removed shortly. * Desired payload type in the response from the server. * If response_type is RANDOM, the payload from each response in the stream * might be of different types. This is to simulate a mixed type of payload @@ -24,7 +23,7 @@ class StreamingOutputCallRequest extends \Google\Protobuf\Internal\Message * * Generated from protobuf field .grpc.testing.PayloadType response_type = 1; */ - private $response_type = 0; + protected $response_type = 0; /** * Configuration for each expected response message. * @@ -36,21 +35,39 @@ class StreamingOutputCallRequest extends \Google\Protobuf\Internal\Message * * Generated from protobuf field .grpc.testing.Payload payload = 3; */ - private $payload = null; + protected $payload = null; /** * Whether server should return a given status * * Generated from protobuf field .grpc.testing.EchoStatus response_status = 7; */ - private $response_status = null; + protected $response_status = null; - public function __construct() { + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type int $response_type + * Desired payload type in the response from the server. + * If response_type is RANDOM, the payload from each response in the stream + * might be of different types. This is to simulate a mixed type of payload + * stream. + * @type \Grpc\Testing\ResponseParameters[]|\Google\Protobuf\Internal\RepeatedField $response_parameters + * Configuration for each expected response message. + * @type \Grpc\Testing\Payload $payload + * Optional input payload sent along with the request. + * @type \Grpc\Testing\EchoStatus $response_status + * Whether server should return a given status + * } + */ + public function __construct($data = NULL) { \GPBMetadata\Src\Proto\Grpc\Testing\Messages::initOnce(); - parent::__construct(); + parent::__construct($data); } /** - * DEPRECATED, don't use. To be removed shortly. * Desired payload type in the response from the server. * If response_type is RANDOM, the payload from each response in the stream * might be of different types. This is to simulate a mixed type of payload @@ -65,7 +82,6 @@ class StreamingOutputCallRequest extends \Google\Protobuf\Internal\Message } /** - * DEPRECATED, don't use. To be removed shortly. * Desired payload type in the response from the server. * If response_type is RANDOM, the payload from each response in the stream * might be of different types. This is to simulate a mixed type of payload diff --git a/src/php/tests/qps/generated_code/Grpc/Testing/StreamingOutputCallResponse.php b/src/php/tests/qps/generated_code/Grpc/Testing/StreamingOutputCallResponse.php index 52315bb4995..b28b906ce93 100644 --- a/src/php/tests/qps/generated_code/Grpc/Testing/StreamingOutputCallResponse.php +++ b/src/php/tests/qps/generated_code/Grpc/Testing/StreamingOutputCallResponse.php @@ -20,11 +20,21 @@ class StreamingOutputCallResponse extends \Google\Protobuf\Internal\Message * * Generated from protobuf field .grpc.testing.Payload payload = 1; */ - private $payload = null; + protected $payload = null; - public function __construct() { + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type \Grpc\Testing\Payload $payload + * Payload to increase response size. + * } + */ + public function __construct($data = NULL) { \GPBMetadata\Src\Proto\Grpc\Testing\Messages::initOnce(); - parent::__construct(); + parent::__construct($data); } /** diff --git a/src/php/tests/qps/generated_code/Grpc/Testing/TestServiceClient.php b/src/php/tests/qps/generated_code/Grpc/Testing/TestServiceClient.php index 7da9713d65e..e6fef125b8b 100644 --- a/src/php/tests/qps/generated_code/Grpc/Testing/TestServiceClient.php +++ b/src/php/tests/qps/generated_code/Grpc/Testing/TestServiceClient.php @@ -38,15 +38,15 @@ class TestServiceClient extends \Grpc\BaseStub { /** * One empty request followed by one empty response. - * @param \Grpc\Testing\PBEmpty $argument input argument + * @param \Grpc\Testing\EmptyMessage $argument input argument * @param array $metadata metadata * @param array $options call options */ - public function EmptyCall(\Grpc\Testing\PBEmpty $argument, + public function EmptyCall(\Grpc\Testing\EmptyMessage $argument, $metadata = [], $options = []) { return $this->_simpleRequest('/grpc.testing.TestService/EmptyCall', $argument, - ['\Grpc\Testing\PBEmpty', 'decode'], + ['\Grpc\Testing\EmptyMessage', 'decode'], $metadata, $options); } @@ -137,15 +137,15 @@ class TestServiceClient extends \Grpc\BaseStub { /** * The test server will not implement this method. It will be used * to test the behavior when clients call unimplemented methods. - * @param \Grpc\Testing\PBEmpty $argument input argument + * @param \Grpc\Testing\EmptyMessage $argument input argument * @param array $metadata metadata * @param array $options call options */ - public function UnimplementedCall(\Grpc\Testing\PBEmpty $argument, + public function UnimplementedCall(\Grpc\Testing\EmptyMessage $argument, $metadata = [], $options = []) { return $this->_simpleRequest('/grpc.testing.TestService/UnimplementedCall', $argument, - ['\Grpc\Testing\PBEmpty', 'decode'], + ['\Grpc\Testing\EmptyMessage', 'decode'], $metadata, $options); } diff --git a/src/php/tests/qps/generated_code/Grpc/Testing/UnimplementedServiceClient.php b/src/php/tests/qps/generated_code/Grpc/Testing/UnimplementedServiceClient.php index 53b2020f190..2c1d921bfcc 100644 --- a/src/php/tests/qps/generated_code/Grpc/Testing/UnimplementedServiceClient.php +++ b/src/php/tests/qps/generated_code/Grpc/Testing/UnimplementedServiceClient.php @@ -38,15 +38,15 @@ class UnimplementedServiceClient extends \Grpc\BaseStub { /** * A call that no server should implement - * @param \Grpc\Testing\PBEmpty $argument input argument + * @param \Grpc\Testing\EmptyMessage $argument input argument * @param array $metadata metadata * @param array $options call options */ - public function UnimplementedCall(\Grpc\Testing\PBEmpty $argument, + public function UnimplementedCall(\Grpc\Testing\EmptyMessage $argument, $metadata = [], $options = []) { return $this->_simpleRequest('/grpc.testing.UnimplementedService/UnimplementedCall', $argument, - ['\Grpc\Testing\PBEmpty', 'decode'], + ['\Grpc\Testing\EmptyMessage', 'decode'], $metadata, $options); } From 0664256b53a8d56c4432329ac1dc217185859406 Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Wed, 22 Apr 2020 09:54:10 -0700 Subject: [PATCH 576/758] Reviewer comments and windows fix --- .../ext/filters/client_channel/lb_policy/xds/xds_routing.cc | 4 ++-- .../resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc b/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc index ac98ef972e1..b72ac3bab55 100644 --- a/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc +++ b/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc @@ -400,6 +400,8 @@ XdsRoutingLb::XdsRoutingChild::XdsRoutingChild( gpr_log(GPR_INFO, "[xds_routing_lb %p] created XdsRoutingChild %p for %s", xds_routing_policy_.get(), this, name_.c_str()); } + GRPC_CLOSURE_INIT(&on_delayed_removal_timer_, OnDelayedRemovalTimer, this, + grpc_schedule_on_exec_ctx); } XdsRoutingLb::XdsRoutingChild::~XdsRoutingChild() { @@ -501,8 +503,6 @@ void XdsRoutingLb::XdsRoutingChild::DeactivateLocked() { // Set the child weight to 0 so that future picker won't contain this child. // Start a timer to delete the child. Ref(DEBUG_LOCATION, "XdsRoutingChild+timer").release(); - GRPC_CLOSURE_INIT(&on_delayed_removal_timer_, OnDelayedRemovalTimer, this, - grpc_schedule_on_exec_ctx); grpc_timer_init( &delayed_removal_timer_, ExecCtx::Get()->Now() + GRPC_XDS_ROUTING_CHILD_RETENTION_INTERVAL_MS, diff --git a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc index d4987f5ad20..1b5bfb0662b 100644 --- a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +++ b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc @@ -100,13 +100,13 @@ class GrpcPolledFdWindows { GrpcPolledFdWindows(ares_socket_t as, std::shared_ptr work_serializer, int address_family, int socket_type) - : read_buf_(grpc_empty_slice()), + : work_serializer_(std::move(work_serializer)), + read_buf_(grpc_empty_slice()), write_buf_(grpc_empty_slice()), tcp_write_state_(WRITE_IDLE), gotten_into_driver_list_(false), address_family_(address_family), - socket_type_(socket_type), - work_serializer_(std::move(work_serializer)) { + socket_type_(socket_type) { gpr_asprintf(&name_, "c-ares socket: %" PRIdPTR, as); // Closure Initialization GRPC_CLOSURE_INIT(&outer_read_closure_, From 5d539cc15c3309503877867cf4dca7bb1a191a5b Mon Sep 17 00:00:00 2001 From: jeffreyqw <49655798+jeffreyqw@users.noreply.github.com> Date: Wed, 22 Apr 2020 10:10:10 -0700 Subject: [PATCH 577/758] fixed indent issue and yum update --- src/php/docker/centos7/Dockerfile | 8 ++++---- templates/src/php/docker/centos7/Dockerfile.template | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/php/docker/centos7/Dockerfile b/src/php/docker/centos7/Dockerfile index 9ccdf759297..e6df3ef819e 100644 --- a/src/php/docker/centos7/Dockerfile +++ b/src/php/docker/centos7/Dockerfile @@ -14,13 +14,13 @@ FROM centos:centos7 -RUN yum install -y centos-release-scl && \ +RUN yum update -y && \ + yum install -y centos-release-scl && \ yum install -y devtoolset-7-gcc* SHELL [ "/usr/bin/scl", "enable", "devtoolset-7"] -RUN yum update -y && \ - yum install epel-release -y && \ +RUN yum install epel-release -y && \ rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm && \ rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm && \ yum --enablerepo=remi-php72 install php -y && \ @@ -28,7 +28,7 @@ RUN yum update -y && \ yum install -y make wget which \ gmp-devel libmpc-devel mpfr-devel yum-utils \ php-devel php-fpm php-pear && \ - yum clean all -y + yum clean all -y ARG MAKEFLAGS=-j8 diff --git a/templates/src/php/docker/centos7/Dockerfile.template b/templates/src/php/docker/centos7/Dockerfile.template index 368c6ee506e..47084bfddc2 100644 --- a/templates/src/php/docker/centos7/Dockerfile.template +++ b/templates/src/php/docker/centos7/Dockerfile.template @@ -16,13 +16,13 @@ FROM centos:centos7 - RUN yum install -y centos-release-scl && ${'\\'} + RUN yum update -y && ${'\\'} + yum install -y centos-release-scl && ${'\\'} yum install -y devtoolset-7-gcc* SHELL [ "/usr/bin/scl", "enable", "devtoolset-7"] - RUN yum update -y && ${'\\'} - yum install epel-release -y && ${'\\'} + RUN yum install epel-release -y && ${'\\'} rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm && ${'\\'} rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm && ${'\\'} yum --enablerepo=remi-php72 install php -y && ${'\\'} @@ -30,7 +30,7 @@ yum install -y make wget which ${'\\'} gmp-devel libmpc-devel mpfr-devel yum-utils ${'\\'} php-devel php-fpm php-pear && ${'\\'} - yum clean all -y + yum clean all -y ARG MAKEFLAGS=-j8 From b797dbec3e230dede3b93ac5f96453ee007faed5 Mon Sep 17 00:00:00 2001 From: Vijay Pai Date: Wed, 22 Apr 2020 10:53:08 -0700 Subject: [PATCH 578/758] Allocating request matcher to support C++ callback API --- include/grpcpp/server_impl.h | 39 ++-- src/core/lib/surface/server.cc | 329 ++++++++++++++++++++++++--------- src/core/lib/surface/server.h | 32 ++++ src/cpp/server/server_cc.cc | 267 ++++++++++---------------- 4 files changed, 387 insertions(+), 280 deletions(-) diff --git a/include/grpcpp/server_impl.h b/include/grpcpp/server_impl.h index 8572c74b075..5cbfee436de 100644 --- a/include/grpcpp/server_impl.h +++ b/include/grpcpp/server_impl.h @@ -291,6 +291,13 @@ class Server : public grpc::ServerInterface, private grpc::GrpcLibraryCodegen { grpc_impl::ServerInitializer* initializer(); + // Functions to manage the server shutdown ref count. Things that increase + // the ref count are the running state of the server (take a ref at start and + // drop it at shutdown) and each running callback RPC. + void Ref(); + void UnrefWithPossibleNotify() /* LOCKS_EXCLUDED(mu_) */; + void UnrefAndWaitLocked() /* EXCLUSIVE_LOCKS_REQUIRED(mu_) */; + std::vector> acceptors_; @@ -315,16 +322,6 @@ class Server : public grpc::ServerInterface, private grpc::GrpcLibraryCodegen { /// the \a sync_server_cqs) std::vector> sync_req_mgrs_; - // Outstanding unmatched callback requests, indexed by method. - // NOTE: Using a gpr_atm rather than atomic_int because atomic_int isn't - // copyable or movable and thus will cause compilation errors. We - // actually only want to extend the vector before the threaded use - // starts, but this is still a limitation. - std::vector callback_unmatched_reqs_count_; - - // List of callback requests to start when server actually starts. - std::list callback_reqs_to_start_; - #ifndef GRPC_CALLBACK_API_NONEXPERIMENTAL // For registering experimental callback generic service; remove when that // method longer experimental @@ -336,25 +333,18 @@ class Server : public grpc::ServerInterface, private grpc::GrpcLibraryCodegen { bool started_; bool shutdown_; bool shutdown_notified_; // Was notify called on the shutdown_cv_ + grpc::internal::CondVar shutdown_done_cv_; + bool shutdown_done_ = false; + std::atomic_int shutdown_refs_outstanding_{1}; grpc::internal::CondVar shutdown_cv_; - // It is ok (but not required) to nest callback_reqs_mu_ under mu_ . - // Incrementing callback_reqs_outstanding_ is ok without a lock but it must be - // decremented under the lock in case it is the last request and enables the - // server shutdown. The increment is performance-critical since it happens - // during periods of increasing load; the decrement happens only when memory - // is maxed out, during server shutdown, or (possibly in a future version) - // during decreasing load, so it is less performance-critical. - grpc::internal::Mutex callback_reqs_mu_; - grpc::internal::CondVar callback_reqs_done_cv_; - std::atomic callback_reqs_outstanding_{0}; - std::shared_ptr global_callbacks_; std::vector services_; - bool has_async_generic_service_{false}; - bool has_callback_generic_service_{false}; + bool has_async_generic_service_ = false; + bool has_callback_generic_service_ = false; + bool has_callback_methods_ = false; // Pointer to the wrapped grpc_server. grpc_server* server_; @@ -383,8 +373,7 @@ class Server : public grpc::ServerInterface, private grpc::GrpcLibraryCodegen { // with this server (if any). It is set on the first call to CallbackCQ(). // It is _not owned_ by the server; ownership belongs with its internal // shutdown callback tag (invoked when the CQ is fully shutdown). - // It is protected by mu_ - CompletionQueue* callback_cq_ = nullptr; + CompletionQueue* callback_cq_ /* GUARDED_BY(mu_) */ = nullptr; // List of CQs passed in by user that must be Shutdown only after Server is // Shutdown. Even though this is only used with NDEBUG, instantiate it in all diff --git a/src/core/lib/surface/server.cc b/src/core/lib/surface/server.cc index 998eb6dd4a9..e03bc6f1b5f 100644 --- a/src/core/lib/surface/server.cc +++ b/src/core/lib/surface/server.cc @@ -72,15 +72,39 @@ enum requested_call_type { BATCH_CALL, REGISTERED_CALL }; struct registered_method; struct requested_call { - grpc_core::ManualConstructor< - grpc_core::MultiProducerSingleConsumerQueue::Node> - mpscq_node; - requested_call_type type; - void* tag; - grpc_completion_queue* cq_bound_to_call; - grpc_call** call; + requested_call(void* tag_arg, grpc_completion_queue* call_cq, + grpc_call** call_arg, grpc_metadata_array* initial_md, + grpc_call_details* details) + : type(BATCH_CALL), + tag(tag_arg), + cq_bound_to_call(call_cq), + call(call_arg), + initial_metadata(initial_md) { + details->reserved = nullptr; + data.batch.details = details; + } + + requested_call(void* tag_arg, grpc_completion_queue* call_cq, + grpc_call** call_arg, grpc_metadata_array* initial_md, + registered_method* rm, gpr_timespec* deadline, + grpc_byte_buffer** optional_payload) + : type(REGISTERED_CALL), + tag(tag_arg), + cq_bound_to_call(call_cq), + call(call_arg), + initial_metadata(initial_md) { + data.registered.method = rm; + data.registered.deadline = deadline; + data.registered.optional_payload = optional_payload; + } + + grpc_core::MultiProducerSingleConsumerQueue::Node mpscq_node; + const requested_call_type type; + void* const tag; + grpc_completion_queue* const cq_bound_to_call; + grpc_call** const call; grpc_cq_completion completion; - grpc_metadata_array* initial_metadata; + grpc_metadata_array* const initial_metadata; union { struct { grpc_call_details* details; @@ -134,6 +158,10 @@ enum call_state { struct call_data; +grpc_call_error ValidateServerRequest( + grpc_completion_queue* cq_for_notification, void* tag, + grpc_byte_buffer** optional_payload, registered_method* rm); + // RPCs that come in from the transport must be matched against RPC requests // from the application. An incoming request from the application can be matched // to an RPC that has already arrived or can be queued up for later use. @@ -242,14 +270,26 @@ struct call_data { }; struct registered_method { - char* method; - char* host; - grpc_server_register_method_payload_handling payload_handling; - uint32_t flags; + registered_method( + const char* method_arg, const char* host_arg, + grpc_server_register_method_payload_handling payload_handling_arg, + uint32_t flags_arg) + : method(gpr_strdup(method_arg)), + host(gpr_strdup(host_arg)), + payload_handling(payload_handling_arg), + flags(flags_arg) {} + + ~registered_method() { + gpr_free(method); + gpr_free(host); + } + + char* const method; + char* const host; + const grpc_server_register_method_payload_handling payload_handling; + const uint32_t flags; /* one request matcher per method */ - // TODO(vjpai): Move this to a unique_ptr once this has a real - // constructor/destructor - RequestMatcherInterface* matcher = nullptr; + std::unique_ptr matcher; registered_method* next; }; @@ -285,6 +325,8 @@ struct grpc_server { bool starting; gpr_cv starting_cv; + // TODO(vjpai): Convert from a linked-list head pointer to a std::vector once + // grpc_server has a real constructor/destructor registered_method* registered_methods; /** one request matcher for unregistered methods */ // TODO(vjpai): Convert to a std::unique_ptr once grpc_server has a real @@ -444,7 +486,7 @@ class RealRequestMatcher : public RequestMatcherInterface { void RequestCallWithPossiblePublish(size_t request_queue_index, requested_call* call) override { - if (requests_per_cq_[request_queue_index].Push(call->mpscq_node.get())) { + if (requests_per_cq_[request_queue_index].Push(&call->mpscq_node)) { /* this was the first queued request: we need to lock and start matching calls */ gpr_mu_lock(&server_->mu_call); @@ -530,6 +572,103 @@ class RealRequestMatcher : public RequestMatcherInterface { std::vector requests_per_cq_; }; +// AllocatingRequestMatchers don't allow the application to request an RPC in +// advance or queue up any incoming RPC for later match. Instead, MatchOrQueue +// will call out to an allocation function passed in at the construction of the +// object. These request matchers are designed for the C++ callback API, so they +// only support 1 completion queue (passed in at the constructor). +class AllocatingRequestMatcherBase : public RequestMatcherInterface { + public: + AllocatingRequestMatcherBase(grpc_server* server, grpc_completion_queue* cq) + : server_(server), cq_(cq) { + size_t idx; + for (idx = 0; idx < server->cq_count; idx++) { + if (server->cqs[idx] == cq) { + break; + } + } + GPR_ASSERT(idx < server->cq_count); + cq_idx_ = idx; + } + + void ZombifyPending() override {} + + void KillRequests(grpc_error* error) override { GRPC_ERROR_UNREF(error); } + + size_t request_queue_count() const override { return 0; } + + void RequestCallWithPossiblePublish(size_t /*request_queue_index*/, + requested_call* /*call*/) final { + GPR_ASSERT(false); + } + + grpc_server* server() const override { return server_; } + + // Supply the completion queue related to this request matcher + grpc_completion_queue* cq() const { return cq_; } + + // Supply the completion queue's index relative to the server. + size_t cq_idx() const { return cq_idx_; } + + private: + grpc_server* const server_; + grpc_completion_queue* const cq_; + size_t cq_idx_; +}; + +// An allocating request matcher for non-registered methods (used for generic +// API and unimplemented RPCs). +class AllocatingRequestMatcherBatch : public AllocatingRequestMatcherBase { + public: + AllocatingRequestMatcherBatch( + grpc_server* server, grpc_completion_queue* cq, + std::function allocator) + : AllocatingRequestMatcherBase(server, cq), + allocator_(std::move(allocator)) {} + void MatchOrQueue(size_t /*start_request_queue_index*/, + call_data* calld) override { + grpc_core::ServerBatchCallAllocation call_info = allocator_(); + GPR_ASSERT(ValidateServerRequest(cq(), static_cast(call_info.tag), + nullptr, nullptr) == GRPC_CALL_OK); + requested_call* rc = new requested_call( + static_cast(call_info.tag), cq(), call_info.call, + call_info.initial_metadata, call_info.details); + gpr_atm_no_barrier_store(&calld->state, ACTIVATED); + publish_call(server(), calld, cq_idx(), rc); + } + + private: + std::function allocator_; +}; + +// An allocating request matcher for registered methods. +class AllocatingRequestMatcherRegistered : public AllocatingRequestMatcherBase { + public: + AllocatingRequestMatcherRegistered( + grpc_server* server, grpc_completion_queue* cq, registered_method* rm, + std::function allocator) + : AllocatingRequestMatcherBase(server, cq), + registered_method_(rm), + allocator_(std::move(allocator)) {} + void MatchOrQueue(size_t /*start_request_queue_index*/, + call_data* calld) override { + grpc_core::ServerRegisteredCallAllocation call_info = allocator_(); + GPR_ASSERT(ValidateServerRequest(cq(), static_cast(call_info.tag), + call_info.optional_payload, + registered_method_) == GRPC_CALL_OK); + requested_call* rc = new requested_call( + static_cast(call_info.tag), cq(), call_info.call, + call_info.initial_metadata, registered_method_, call_info.deadline, + call_info.optional_payload); + gpr_atm_no_barrier_store(&calld->state, ACTIVATED); + publish_call(server(), calld, cq_idx(), rc); + } + + private: + registered_method* const registered_method_; + std::function allocator_; +}; + /* * server proper */ @@ -546,10 +685,7 @@ void server_delete(grpc_server* server) { gpr_cv_destroy(&server->starting_cv); while ((rm = server->registered_methods) != nullptr) { server->registered_methods = rm->next; - delete rm->matcher; - gpr_free(rm->method); - gpr_free(rm->host); - gpr_free(rm); + delete rm; } delete server->unregistered_request_matcher; for (i = 0; i < server->cq_count; i++) { @@ -603,7 +739,9 @@ void destroy_channel(channel_data* chand) { op); } -void done_request_event(void* req, grpc_cq_completion* /*c*/) { gpr_free(req); } +void done_request_event(void* req, grpc_cq_completion* /*c*/) { + delete static_cast(req); +} void publish_call(grpc_server* server, call_data* calld, size_t cq_idx, requested_call* rc) { @@ -718,7 +856,8 @@ void start_new_rpc(grpc_call_element* elem) { GRPC_INITIAL_METADATA_IDEMPOTENT_REQUEST)) { continue; } - finish_start_new_rpc(server, elem, rm->server_registered_method->matcher, + finish_start_new_rpc(server, elem, + rm->server_registered_method->matcher.get(), rm->server_registered_method->payload_handling); return; } @@ -735,7 +874,8 @@ void start_new_rpc(grpc_call_element* elem) { GRPC_INITIAL_METADATA_IDEMPOTENT_REQUEST)) { continue; } - finish_start_new_rpc(server, elem, rm->server_registered_method->matcher, + finish_start_new_rpc(server, elem, + rm->server_registered_method->matcher.get(), rm->server_registered_method->payload_handling); return; } @@ -1101,7 +1241,7 @@ grpc_call_error queue_call_request(grpc_server* server, size_t cq_idx, rm = server->unregistered_request_matcher; break; case REGISTERED_CALL: - rm = rc->data.registered.method->matcher; + rm = rc->data.registered.method->matcher.get(); break; } rm->RequestCallWithPossiblePublish(cq_idx, rc); @@ -1119,6 +1259,26 @@ void fail_call(grpc_server* server, size_t cq_idx, requested_call* rc, } } // namespace +namespace grpc_core { + +void SetServerRegisteredMethodAllocator( + grpc_server* server, grpc_completion_queue* cq, void* method_tag, + std::function allocator) { + registered_method* rm = static_cast(method_tag); + rm->matcher.reset(new AllocatingRequestMatcherRegistered( + server, cq, rm, std::move(allocator))); +} + +void SetServerBatchMethodAllocator( + grpc_server* server, grpc_completion_queue* cq, + std::function allocator) { + GPR_DEBUG_ASSERT(server->unregistered_request_matcher == nullptr); + server->unregistered_request_matcher = + new AllocatingRequestMatcherBatch(server, cq, std::move(allocator)); +} + +}; // namespace grpc_core + const grpc_channel_filter grpc_server_top_filter = { server_start_transport_stream_op_batch, grpc_channel_next_op, @@ -1224,12 +1384,8 @@ void* grpc_server_register_method( flags); return nullptr; } - m = static_cast(gpr_zalloc(sizeof(registered_method))); - m->method = gpr_strdup(method); - m->host = gpr_strdup(host); + m = new registered_method(method, host, payload_handling, flags); m->next = server->registered_methods; - m->payload_handling = payload_handling; - m->flags = flags; server->registered_methods = m; return m; } @@ -1250,9 +1406,13 @@ void grpc_server_start(grpc_server* server) { grpc_cq_pollset(server->cqs[i]); } } - server->unregistered_request_matcher = new RealRequestMatcher(server); + if (server->unregistered_request_matcher == nullptr) { + server->unregistered_request_matcher = new RealRequestMatcher(server); + } for (registered_method* rm = server->registered_methods; rm; rm = rm->next) { - rm->matcher = new RealRequestMatcher(server); + if (rm->matcher == nullptr) { + rm->matcher.reset(new RealRequestMatcher(server)); + } } gpr_mu_lock(&server->mu_global); @@ -1523,15 +1683,51 @@ void grpc_server_add_listener( server->listeners = l; } +namespace { +grpc_call_error ValidateServerRequest( + grpc_completion_queue* cq_for_notification, void* tag, + grpc_byte_buffer** optional_payload, registered_method* rm) { + if ((rm == nullptr && optional_payload != nullptr) || + ((rm != nullptr) && ((optional_payload == nullptr) != + (rm->payload_handling == GRPC_SRM_PAYLOAD_NONE)))) { + return GRPC_CALL_ERROR_PAYLOAD_TYPE_MISMATCH; + } + if (grpc_cq_begin_op(cq_for_notification, tag) == false) { + return GRPC_CALL_ERROR_COMPLETION_QUEUE_SHUTDOWN; + } + return GRPC_CALL_OK; +} +grpc_call_error ValidateServerRequestAndCq( + size_t* cq_idx, grpc_server* server, + grpc_completion_queue* cq_for_notification, void* tag, + grpc_byte_buffer** optional_payload, registered_method* rm) { + size_t idx; + for (idx = 0; idx < server->cq_count; idx++) { + if (server->cqs[idx] == cq_for_notification) { + break; + } + } + if (idx == server->cq_count) { + return GRPC_CALL_ERROR_NOT_SERVER_COMPLETION_QUEUE; + } + grpc_call_error error = + ValidateServerRequest(cq_for_notification, tag, optional_payload, rm); + if (error != GRPC_CALL_OK) { + return error; + } + + *cq_idx = idx; + return GRPC_CALL_OK; +} +} // namespace + grpc_call_error grpc_server_request_call( grpc_server* server, grpc_call** call, grpc_call_details* details, grpc_metadata_array* initial_metadata, grpc_completion_queue* cq_bound_to_call, grpc_completion_queue* cq_for_notification, void* tag) { - grpc_call_error error; grpc_core::ApplicationCallbackExecCtx callback_exec_ctx; grpc_core::ExecCtx exec_ctx; - requested_call* rc = static_cast(gpr_malloc(sizeof(*rc))); GRPC_STATS_INC_SERVER_REQUESTED_CALLS(); GRPC_API_TRACE( "grpc_server_request_call(" @@ -1540,33 +1736,17 @@ grpc_call_error grpc_server_request_call( 7, (server, call, details, initial_metadata, cq_bound_to_call, cq_for_notification, tag)); + size_t cq_idx; - for (cq_idx = 0; cq_idx < server->cq_count; cq_idx++) { - if (server->cqs[cq_idx] == cq_for_notification) { - break; - } - } - if (cq_idx == server->cq_count) { - gpr_free(rc); - error = GRPC_CALL_ERROR_NOT_SERVER_COMPLETION_QUEUE; - goto done; + grpc_call_error error = ValidateServerRequestAndCq( + &cq_idx, server, cq_for_notification, tag, nullptr, nullptr); + if (error != GRPC_CALL_OK) { + return error; } - if (grpc_cq_begin_op(cq_for_notification, tag) == false) { - gpr_free(rc); - error = GRPC_CALL_ERROR_COMPLETION_QUEUE_SHUTDOWN; - goto done; - } - details->reserved = nullptr; - rc->type = BATCH_CALL; - rc->tag = tag; - rc->cq_bound_to_call = cq_bound_to_call; - rc->call = call; - rc->data.batch.details = details; - rc->initial_metadata = initial_metadata; - error = queue_call_request(server, cq_idx, rc); -done: - - return error; + + requested_call* rc = new requested_call(tag, cq_bound_to_call, call, + initial_metadata, details); + return queue_call_request(server, cq_idx, rc); } grpc_call_error grpc_server_request_registered_call( @@ -1577,7 +1757,6 @@ grpc_call_error grpc_server_request_registered_call( grpc_core::ApplicationCallbackExecCtx callback_exec_ctx; grpc_core::ExecCtx exec_ctx; GRPC_STATS_INC_SERVER_REQUESTED_CALLS(); - requested_call* rc = static_cast(gpr_malloc(sizeof(*rc))); registered_method* rm = static_cast(rmp); GRPC_API_TRACE( "grpc_server_request_registered_call(" @@ -1589,33 +1768,15 @@ grpc_call_error grpc_server_request_registered_call( cq_bound_to_call, cq_for_notification, tag)); size_t cq_idx; - for (cq_idx = 0; cq_idx < server->cq_count; cq_idx++) { - if (server->cqs[cq_idx] == cq_for_notification) { - break; - } - } - if (cq_idx == server->cq_count) { - gpr_free(rc); - return GRPC_CALL_ERROR_NOT_SERVER_COMPLETION_QUEUE; - } - if ((optional_payload == nullptr) != - (rm->payload_handling == GRPC_SRM_PAYLOAD_NONE)) { - gpr_free(rc); - return GRPC_CALL_ERROR_PAYLOAD_TYPE_MISMATCH; + grpc_call_error error = ValidateServerRequestAndCq( + &cq_idx, server, cq_for_notification, tag, optional_payload, rm); + if (error != GRPC_CALL_OK) { + return error; } - if (grpc_cq_begin_op(cq_for_notification, tag) == false) { - gpr_free(rc); - return GRPC_CALL_ERROR_COMPLETION_QUEUE_SHUTDOWN; - } - rc->type = REGISTERED_CALL; - rc->tag = tag; - rc->cq_bound_to_call = cq_bound_to_call; - rc->call = call; - rc->data.registered.method = rm; - rc->data.registered.deadline = deadline; - rc->initial_metadata = initial_metadata; - rc->data.registered.optional_payload = optional_payload; + requested_call* rc = + new requested_call(tag, cq_bound_to_call, call, initial_metadata, rm, + deadline, optional_payload); return queue_call_request(server, cq_idx, rc); } diff --git a/src/core/lib/surface/server.h b/src/core/lib/surface/server.h index 2285821e11b..3f11c83caa9 100644 --- a/src/core/lib/surface/server.h +++ b/src/core/lib/surface/server.h @@ -64,4 +64,36 @@ int grpc_server_has_open_connections(grpc_server* server); void grpc_server_get_pollsets(grpc_server* server, grpc_pollset*** pollsets, size_t* pollset_count); +namespace grpc_core { + +// An object to represent the most relevant characteristics of a newly-allocated +// call object when using an AllocatingRequestMatcherBatch +struct ServerBatchCallAllocation { + grpc_experimental_completion_queue_functor* tag; + grpc_call** call; + grpc_metadata_array* initial_metadata; + grpc_call_details* details; +}; + +// An object to represent the most relevant characteristics of a newly-allocated +// call object when using an AllocatingRequestMatcherRegistered +struct ServerRegisteredCallAllocation { + grpc_experimental_completion_queue_functor* tag; + grpc_call** call; + grpc_metadata_array* initial_metadata; + gpr_timespec* deadline; + grpc_byte_buffer** optional_payload; +}; + +// Functions to specify that a specific registered method or the unregistered +// collection should use a specific allocator for request matching. +void SetServerRegisteredMethodAllocator( + grpc_server* server, grpc_completion_queue* cq, void* method_tag, + std::function allocator); +void SetServerBatchMethodAllocator( + grpc_server* server, grpc_completion_queue* cq, + std::function allocator); + +} // namespace grpc_core + #endif /* GRPC_CORE_LIB_SURFACE_SERVER_H */ diff --git a/src/cpp/server/server_cc.cc b/src/cpp/server/server_cc.cc index a30e4911dc0..2f6c2700076 100644 --- a/src/cpp/server/server_cc.cc +++ b/src/cpp/server/server_cc.cc @@ -47,6 +47,7 @@ #include "src/core/lib/profiling/timers.h" #include "src/core/lib/surface/call.h" #include "src/core/lib/surface/completion_queue.h" +#include "src/core/lib/surface/server.h" #include "src/cpp/client/create_channel_internal.h" #include "src/cpp/server/external_connection_acceptor_impl.h" #include "src/cpp/server/health/default_health_check_service.h" @@ -62,17 +63,6 @@ namespace { // max-threads set) to the server builder. #define DEFAULT_MAX_SYNC_SERVER_THREADS INT_MAX -// How many callback requests of each method should we pre-register at start -#define DEFAULT_CALLBACK_REQS_PER_METHOD 512 - -// What is the (soft) limit for outstanding requests in the server -#define SOFT_MAXIMUM_CALLBACK_REQS_OUTSTANDING 30000 - -// If the number of unmatched requests for a method drops below this amount, try -// to allocate extra unless it pushes the total number of callbacks above the -// soft maximum -#define SOFT_MINIMUM_SPARE_CALLBACK_REQS_PER_METHOD 128 - class DefaultGlobalCallbacks final : public Server::GlobalCallbacks { public: ~DefaultGlobalCallbacks() override {} @@ -544,74 +534,61 @@ class Server::SyncRequest final : public grpc::internal::CompletionQueueTag { grpc_completion_queue* cq_; }; -class Server::CallbackRequestBase : public grpc::internal::CompletionQueueTag { - public: - virtual ~CallbackRequestBase() {} - virtual bool Request() = 0; -}; - template -class Server::CallbackRequest final : public Server::CallbackRequestBase { +class Server::CallbackRequest final + : public grpc::internal::CompletionQueueTag { public: static_assert( std::is_base_of::value, "ServerContextType must be derived from CallbackServerContext"); - // The constructor needs to know the server for this callback request and its - // index in the server's request count array to allow for proper dynamic - // requesting of incoming RPCs. For codegen services, the values of method and - // method_tag represent the defined characteristics of the method being - // requested. For generic services, method and method_tag are nullptr since - // these services don't have pre-defined methods or method registration tags. - CallbackRequest(Server* server, size_t method_idx, - grpc::internal::RpcServiceMethod* method, void* method_tag) + // For codegen services, the value of method represents the defined + // characteristics of the method being requested. For generic services, method + // is nullptr since these services don't have pre-defined methods. + CallbackRequest(Server* server, grpc::internal::RpcServiceMethod* method, + grpc::CompletionQueue* cq, + grpc_core::ServerRegisteredCallAllocation* data) : server_(server), - method_index_(method_idx), method_(method), - method_tag_(method_tag), - has_request_payload_( - method_ != nullptr && - (method->method_type() == grpc::internal::RpcMethod::NORMAL_RPC || - method->method_type() == - grpc::internal::RpcMethod::SERVER_STREAMING)), - cq_(server->CallbackCQ()), + has_request_payload_(method->method_type() == + grpc::internal::RpcMethod::NORMAL_RPC || + method->method_type() == + grpc::internal::RpcMethod::SERVER_STREAMING), + cq_(cq), tag_(this) { - server_->callback_reqs_outstanding_++; + server->Ref(); Setup(); + data->tag = &tag_; + data->call = &call_; + data->initial_metadata = &request_metadata_; + data->deadline = &deadline_; + data->optional_payload = has_request_payload_ ? &request_payload_ : nullptr; } - ~CallbackRequest() { - Clear(); - - // The counter of outstanding requests must be decremented - // under a lock in case it causes the server shutdown. - grpc::internal::MutexLock l(&server_->callback_reqs_mu_); - if (--server_->callback_reqs_outstanding_ == 0) { - server_->callback_reqs_done_cv_.Signal(); + // For generic services, method is nullptr since these services don't have + // pre-defined methods. + CallbackRequest(Server* server, grpc::CompletionQueue* cq, + grpc_core::ServerBatchCallAllocation* data) + : server_(server), + method_(nullptr), + has_request_payload_(false), + cq_(cq), + tag_(this) { + server->Ref(); + Setup(); + data->tag = &tag_; + data->call = &call_; + data->initial_metadata = &request_metadata_; + if (!call_details_) { + call_details_ = new grpc_call_details; + grpc_call_details_init(call_details_); } + data->details = call_details_; } - bool Request() override { - if (method_tag_) { - if (grpc_server_request_registered_call( - server_->c_server(), method_tag_, &call_, &deadline_, - &request_metadata_, - has_request_payload_ ? &request_payload_ : nullptr, cq_->cq(), - cq_->cq(), static_cast(&tag_)) != GRPC_CALL_OK) { - return false; - } - } else { - if (!call_details_) { - call_details_ = new grpc_call_details; - grpc_call_details_init(call_details_); - } - if (grpc_server_request_call(server_->c_server(), &call_, call_details_, - &request_metadata_, cq_->cq(), cq_->cq(), - static_cast(&tag_)) != GRPC_CALL_OK) { - return false; - } - } - return true; + ~CallbackRequest() { + Clear(); + server_->UnrefWithPossibleNotify(); } // Needs specialization to account for different processing of metadata @@ -655,12 +632,6 @@ class Server::CallbackRequest final : public Server::CallbackRequestBase { GPR_ASSERT(!req_->FinalizeResult(&ignored, &new_ok)); GPR_ASSERT(ignored == req_); - int count = - static_cast(gpr_atm_no_barrier_fetch_add( - &req_->server_ - ->callback_unmatched_reqs_count_[req_->method_index_], - -1)) - - 1; if (!ok) { // The call has been shutdown. // Delete its contents to free up the request. @@ -668,24 +639,6 @@ class Server::CallbackRequest final : public Server::CallbackRequestBase { return; } - // If this was the last request in the list or it is below the soft - // minimum and there are spare requests available, set up a new one. - if (count == 0 || (count < SOFT_MINIMUM_SPARE_CALLBACK_REQS_PER_METHOD && - req_->server_->callback_reqs_outstanding_ < - SOFT_MAXIMUM_CALLBACK_REQS_OUTSTANDING)) { - auto* new_req = new CallbackRequest( - req_->server_, req_->method_index_, req_->method_, - req_->method_tag_); - if (!new_req->Request()) { - // The server must have just decided to shutdown. - gpr_atm_no_barrier_fetch_add( - &new_req->server_ - ->callback_unmatched_reqs_count_[new_req->method_index_], - -1); - delete new_req; - } - } - // Bind the call, deadline, and metadata from what we got req_->ctx_.set_call(req_->call_); req_->ctx_.cq_ = req_->cq_; @@ -740,28 +693,7 @@ class Server::CallbackRequest final : public Server::CallbackRequestBase { : req_->server_->generic_handler_.get(); handler->RunHandler(grpc::internal::MethodHandler::HandlerParameter( call_, &req_->ctx_, req_->request_, req_->request_status_, - req_->handler_data_, [this] { - // Recycle this request if there aren't too many outstanding. - // Note that we don't have to worry about a case where there - // are no requests waiting to match for this method since that - // is already taken care of when binding a request to a call. - // TODO(vjpai): Also don't recycle this request if the dynamic - // load no longer justifies it. Consider measuring - // dynamic load and setting a target accordingly. - if (req_->server_->callback_reqs_outstanding_ < - SOFT_MAXIMUM_CALLBACK_REQS_OUTSTANDING) { - req_->Clear(); - req_->Setup(); - } else { - // We can free up this request because there are too many - delete req_; - return; - } - if (!req_->Request()) { - // The server must have just decided to shutdown. - delete req_; - } - })); + req_->handler_data_, [this] { delete req_; })); } }; @@ -779,8 +711,6 @@ class Server::CallbackRequest final : public Server::CallbackRequestBase { } void Setup() { - gpr_atm_no_barrier_fetch_add( - &server_->callback_unmatched_reqs_count_[method_index_], 1); grpc_metadata_array_init(&request_metadata_); ctx_.Setup(gpr_inf_future(GPR_CLOCK_REALTIME)); request_payload_ = nullptr; @@ -790,9 +720,7 @@ class Server::CallbackRequest final : public Server::CallbackRequestBase { } Server* const server_; - const size_t method_index_; grpc::internal::RpcServiceMethod* const method_; - void* const method_tag_; const bool has_request_payload_; grpc_byte_buffer* request_payload_; void* request_; @@ -1055,13 +983,6 @@ Server::~Server() { } grpc_server_destroy(server_); - for (auto& per_method_count : callback_unmatched_reqs_count_) { - // There should be no more unmatched callbacks for any method - // as each request is failed by Shutdown. Check that this actually - // happened - GPR_ASSERT(static_cast(gpr_atm_no_barrier_load(&per_method_count)) == - 0); - } } void Server::SetGlobalCallbacks(GlobalCallbacks* callbacks) { @@ -1139,17 +1060,16 @@ bool Server::RegisterService(const grpc::string* host, grpc::Service* service) { value->AddSyncMethod(method.get(), method_registration_tag); } } else { - // a callback method. Register at least some callback requests - callback_unmatched_reqs_count_.push_back(0); - auto method_index = callback_unmatched_reqs_count_.size() - 1; - // TODO(vjpai): Register these dynamically based on need - for (int i = 0; i < DEFAULT_CALLBACK_REQS_PER_METHOD; i++) { - callback_reqs_to_start_.push_back( - new CallbackRequest( - this, method_index, method.get(), method_registration_tag)); - } - // Enqueue it so that it will be Request'ed later after all request - // matchers are created at core server startup + has_callback_methods_ = true; + grpc::internal::RpcServiceMethod* method_value = method.get(); + grpc::CompletionQueue* cq = CallbackCQ(); + grpc_core::SetServerRegisteredMethodAllocator( + server_, cq->cq(), method_registration_tag, [this, cq, method_value] { + grpc_core::ServerRegisteredCallAllocation result; + new CallbackRequest(this, method_value, + cq, &result); + return result; + }); } method_name = method->name(); @@ -1183,14 +1103,12 @@ void Server::RegisterCallbackGenericService( has_callback_generic_service_ = true; generic_handler_.reset(service->Handler()); - callback_unmatched_reqs_count_.push_back(0); - auto method_index = callback_unmatched_reqs_count_.size() - 1; - // TODO(vjpai): Register these dynamically based on need - for (int i = 0; i < DEFAULT_CALLBACK_REQS_PER_METHOD; i++) { - callback_reqs_to_start_.push_back( - new CallbackRequest( - this, method_index, nullptr, nullptr)); - } + grpc::CompletionQueue* cq = CallbackCQ(); + grpc_core::SetServerBatchMethodAllocator(server_, cq->cq(), [this, cq] { + grpc_core::ServerBatchCallAllocation result; + new CallbackRequest(this, cq, &result); + return result; + }); } int Server::AddListeningPort(const grpc::string& addr, @@ -1201,6 +1119,31 @@ int Server::AddListeningPort(const grpc::string& addr, return port; } +void Server::Ref() { + shutdown_refs_outstanding_.fetch_add(1, std::memory_order_relaxed); +} + +void Server::UnrefWithPossibleNotify() { + if (GPR_UNLIKELY(shutdown_refs_outstanding_.fetch_sub( + 1, std::memory_order_acq_rel) == 1)) { + // No refs outstanding means that shutdown has been initiated and no more + // callback requests are outstanding. + grpc::internal::MutexLock lock(&mu_); + GPR_ASSERT(shutdown_); + shutdown_done_ = true; + shutdown_done_cv_.Signal(); + } +} + +void Server::UnrefAndWaitLocked() { + if (GPR_UNLIKELY(shutdown_refs_outstanding_.fetch_sub( + 1, std::memory_order_acq_rel) == 1)) { + shutdown_done_ = true; + return; // no need to wait on CV since done condition already set + } + shutdown_done_cv_.WaitUntil(&mu_, [this] { return shutdown_done_; }); +} + void Server::Start(grpc::ServerCompletionQueue** cqs, size_t num_cqs) { GPR_ASSERT(!started_); global_callbacks_->PreServerStart(this); @@ -1236,7 +1179,7 @@ void Server::Start(grpc::ServerCompletionQueue** cqs, size_t num_cqs) { // If this server uses callback methods, then create a callback generic // service to handle any unimplemented methods using the default reactor // creator - if (!callback_reqs_to_start_.empty() && !has_callback_generic_service_) { + if (has_callback_methods_ && !has_callback_generic_service_) { unimplemented_service_.reset(new grpc::CallbackGenericService); RegisterCallbackGenericService(unimplemented_service_.get()); } @@ -1276,11 +1219,6 @@ void Server::Start(grpc::ServerCompletionQueue** cqs, size_t num_cqs) { value->Start(); } - for (auto* cbreq : callback_reqs_to_start_) { - GPR_ASSERT(cbreq->Request()); - } - callback_reqs_to_start_.clear(); - if (default_health_check_service_impl != nullptr) { default_health_check_service_impl->StartServingThread(); } @@ -1333,23 +1271,8 @@ void Server::ShutdownInternal(gpr_timespec deadline) { value->Wait(); } - // Wait for all outstanding callback requests to complete - // (whether waiting for a match or already active). - // We know that no new requests will be created after this point - // because they are only created at server startup time or when - // we have a successful match on a request. During the shutdown phase, - // requests that have not yet matched will be failed rather than - // allowed to succeed, which will cause the server to delete the - // request and decrement the count. Possibly a request will match before - // the shutdown but then find that shutdown has already started by the - // time it tries to register a new request. In that case, the registration - // will report a failure, indicating a shutdown and again we won't end - // up incrementing the counter. - { - grpc::internal::MutexLock cblock(&callback_reqs_mu_); - callback_reqs_done_cv_.WaitUntil( - &callback_reqs_mu_, [this] { return callback_reqs_outstanding_ == 0; }); - } + // Drop the shutdown ref and wait for all other refs to drop as well. + UnrefAndWaitLocked(); // Shutdown the callback CQ. The CQ is owned by its own shutdown tag, so it // will delete itself at true shutdown. @@ -1421,15 +1344,17 @@ grpc::CompletionQueue* Server::CallbackCQ() { // TODO(vjpai): Consider using a single global CQ for the default CQ // if there is no explicit per-server CQ registered grpc::internal::MutexLock l(&mu_); - if (callback_cq_ == nullptr) { - auto* shutdown_callback = new grpc::ShutdownCallback; - callback_cq_ = new grpc::CompletionQueue(grpc_completion_queue_attributes{ - GRPC_CQ_CURRENT_VERSION, GRPC_CQ_CALLBACK, GRPC_CQ_DEFAULT_POLLING, - shutdown_callback}); - - // Transfer ownership of the new cq to its own shutdown callback - shutdown_callback->TakeCQ(callback_cq_); + if (callback_cq_ != nullptr) { + return callback_cq_; } + auto* shutdown_callback = new grpc::ShutdownCallback; + callback_cq_ = new grpc::CompletionQueue(grpc_completion_queue_attributes{ + GRPC_CQ_CURRENT_VERSION, GRPC_CQ_CALLBACK, GRPC_CQ_DEFAULT_POLLING, + shutdown_callback}); + + // Transfer ownership of the new cq to its own shutdown callback + shutdown_callback->TakeCQ(callback_cq_); + return callback_cq_; } From c1df38f2b97369b4cbbdf697331e61eea06059a9 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Wed, 22 Apr 2020 13:38:22 -0700 Subject: [PATCH 579/758] Document wait_for_ready mechanism in Python's glossary --- doc/python/sphinx/glossary.rst | 14 +++++++++++++ src/python/grpcio/grpc/__init__.py | 20 +++++++++---------- .../grpc/experimental/aio/_base_channel.py | 8 ++++---- .../grpc/experimental/aio/_interceptor.py | 4 ++-- 4 files changed, 30 insertions(+), 16 deletions(-) diff --git a/doc/python/sphinx/glossary.rst b/doc/python/sphinx/glossary.rst index cae5f4a32e3..353c5a3c11b 100644 --- a/doc/python/sphinx/glossary.rst +++ b/doc/python/sphinx/glossary.rst @@ -27,3 +27,17 @@ Glossary the returned object doesn't have restrictions (i.e. ``None`` allowed). The deserializer is invoked with inbound message bytes on both the server side and the client-side. + + wait_for_ready + If an RPC is issued but the channel is in TRANSIENT_FAILURE or SHUTDOWN + states, the RPC is unable to be transmitted promptly. By default, gRPC + implementations SHOULD fail such RPCs immediately. This is known as "fail + fast," but the usage of the term is historical. RPCs SHOULD NOT fail as a + result of the channel being in other states (CONNECTING, READY, or IDLE). + + gRPC implementations MAY provide a per-RPC option to not fail RPCs as a + result of the channel being in TRANSIENT_FAILURE state. Instead, the + implementation queues the RPCs until the channel is READY. This is known as + "wait for ready." The RPCs SHOULD still fail before READY if there are + unrelated reasons, such as the channel is SHUTDOWN or the RPC's deadline is + reached. diff --git a/src/python/grpcio/grpc/__init__.py b/src/python/grpcio/grpc/__init__.py index ff799cd07e9..75b1a923f67 100644 --- a/src/python/grpcio/grpc/__init__.py +++ b/src/python/grpcio/grpc/__init__.py @@ -414,8 +414,8 @@ class ClientCallDetails(six.with_metaclass(abc.ABCMeta)): metadata: Optional :term:`metadata` to be transmitted to the service-side of the RPC. credentials: An optional CallCredentials for the RPC. - wait_for_ready: This is an EXPERIMENTAL argument. An optional flag t - enable wait for ready mechanism. + wait_for_ready: This is an EXPERIMENTAL argument. An optional + flag to enable :term:`wait_for_ready` mechanism. compression: An element of grpc.compression, e.g. grpc.compression.Gzip. This is an EXPERIMENTAL option. """ @@ -690,7 +690,7 @@ class UnaryUnaryMultiCallable(six.with_metaclass(abc.ABCMeta)): credentials: An optional CallCredentials for the RPC. Only valid for secure Channel. wait_for_ready: This is an EXPERIMENTAL argument. An optional - flag to enable wait for ready mechanism + flag to enable :term:`wait_for_ready` mechanism. compression: An element of grpc.compression, e.g. grpc.compression.Gzip. This is an EXPERIMENTAL option. @@ -723,7 +723,7 @@ class UnaryUnaryMultiCallable(six.with_metaclass(abc.ABCMeta)): credentials: An optional CallCredentials for the RPC. Only valid for secure Channel. wait_for_ready: This is an EXPERIMENTAL argument. An optional - flag to enable wait for ready mechanism + flag to enable :term:`wait_for_ready` mechanism. compression: An element of grpc.compression, e.g. grpc.compression.Gzip. This is an EXPERIMENTAL option. @@ -756,7 +756,7 @@ class UnaryUnaryMultiCallable(six.with_metaclass(abc.ABCMeta)): credentials: An optional CallCredentials for the RPC. Only valid for secure Channel. wait_for_ready: This is an EXPERIMENTAL argument. An optional - flag to enable wait for ready mechanism + flag to enable :term:`wait_for_ready` mechanism. compression: An element of grpc.compression, e.g. grpc.compression.Gzip. This is an EXPERIMENTAL option. @@ -792,7 +792,7 @@ class UnaryStreamMultiCallable(six.with_metaclass(abc.ABCMeta)): credentials: An optional CallCredentials for the RPC. Only valid for secure Channel. wait_for_ready: This is an EXPERIMENTAL argument. An optional - flag to enable wait for ready mechanism + flag to enable :term:`wait_for_ready` mechanism. compression: An element of grpc.compression, e.g. grpc.compression.Gzip. This is an EXPERIMENTAL option. @@ -828,7 +828,7 @@ class StreamUnaryMultiCallable(six.with_metaclass(abc.ABCMeta)): credentials: An optional CallCredentials for the RPC. Only valid for secure Channel. wait_for_ready: This is an EXPERIMENTAL argument. An optional - flag to enable wait for ready mechanism + flag to enable :term:`wait_for_ready` mechanism. compression: An element of grpc.compression, e.g. grpc.compression.Gzip. This is an EXPERIMENTAL option. @@ -862,7 +862,7 @@ class StreamUnaryMultiCallable(six.with_metaclass(abc.ABCMeta)): credentials: An optional CallCredentials for the RPC. Only valid for secure Channel. wait_for_ready: This is an EXPERIMENTAL argument. An optional - flag to enable wait for ready mechanism + flag to enable :term:`wait_for_ready` mechanism. compression: An element of grpc.compression, e.g. grpc.compression.Gzip. This is an EXPERIMENTAL option. @@ -895,7 +895,7 @@ class StreamUnaryMultiCallable(six.with_metaclass(abc.ABCMeta)): credentials: An optional CallCredentials for the RPC. Only valid for secure Channel. wait_for_ready: This is an EXPERIMENTAL argument. An optional - flag to enable wait for ready mechanism + flag to enable :term:`wait_for_ready` mechanism. compression: An element of grpc.compression, e.g. grpc.compression.Gzip. This is an EXPERIMENTAL option. @@ -931,7 +931,7 @@ class StreamStreamMultiCallable(six.with_metaclass(abc.ABCMeta)): credentials: An optional CallCredentials for the RPC. Only valid for secure Channel. wait_for_ready: This is an EXPERIMENTAL argument. An optional - flag to enable wait for ready mechanism + flag to enable :term:`wait_for_ready` mechanism. compression: An element of grpc.compression, e.g. grpc.compression.Gzip. This is an EXPERIMENTAL option. diff --git a/src/python/grpcio/grpc/experimental/aio/_base_channel.py b/src/python/grpcio/grpc/experimental/aio/_base_channel.py index b6c946a4367..33efa7789cb 100644 --- a/src/python/grpcio/grpc/experimental/aio/_base_channel.py +++ b/src/python/grpcio/grpc/experimental/aio/_base_channel.py @@ -49,7 +49,7 @@ class UnaryUnaryMultiCallable(abc.ABC): credentials: An optional CallCredentials for the RPC. Only valid for secure Channel. wait_for_ready: This is an EXPERIMENTAL argument. An optional - flag to enable wait for ready mechanism + flag to enable :term:`wait_for_ready` mechanism. compression: An element of grpc.compression, e.g. grpc.compression.Gzip. This is an EXPERIMENTAL option. @@ -87,7 +87,7 @@ class UnaryStreamMultiCallable(abc.ABC): credentials: An optional CallCredentials for the RPC. Only valid for secure Channel. wait_for_ready: This is an EXPERIMENTAL argument. An optional - flag to enable wait for ready mechanism + flag to enable :term:`wait_for_ready` mechanism. compression: An element of grpc.compression, e.g. grpc.compression.Gzip. This is an EXPERIMENTAL option. @@ -125,7 +125,7 @@ class StreamUnaryMultiCallable(abc.ABC): credentials: An optional CallCredentials for the RPC. Only valid for secure Channel. wait_for_ready: This is an EXPERIMENTAL argument. An optional - flag to enable wait for ready mechanism + flag to enable :term:`wait_for_ready` mechanism. compression: An element of grpc.compression, e.g. grpc.compression.Gzip. This is an EXPERIMENTAL option. @@ -163,7 +163,7 @@ class StreamStreamMultiCallable(abc.ABC): credentials: An optional CallCredentials for the RPC. Only valid for secure Channel. wait_for_ready: This is an EXPERIMENTAL argument. An optional - flag to enable wait for ready mechanism + flag to enable :term:`wait_for_ready` mechanism. compression: An element of grpc.compression, e.g. grpc.compression.Gzip. This is an EXPERIMENTAL option. diff --git a/src/python/grpcio/grpc/experimental/aio/_interceptor.py b/src/python/grpcio/grpc/experimental/aio/_interceptor.py index d4aca3ae0fc..f47f2927f02 100644 --- a/src/python/grpcio/grpc/experimental/aio/_interceptor.py +++ b/src/python/grpcio/grpc/experimental/aio/_interceptor.py @@ -73,8 +73,8 @@ class ClientCallDetails( metadata: Optional metadata to be transmitted to the service-side of the RPC. credentials: An optional CallCredentials for the RPC. - wait_for_ready: This is an EXPERIMENTAL argument. An optional flag to - enable wait for ready mechanism. + wait_for_ready: This is an EXPERIMENTAL argument. An optional + flag to enable :term:`wait_for_ready` mechanism. """ method: str From 564b70a1d772a425d0ff7a25544d8e6ac18bb10a Mon Sep 17 00:00:00 2001 From: nanahpang <31627465+nanahpang@users.noreply.github.com> Date: Wed, 22 Apr 2020 13:58:40 -0700 Subject: [PATCH 580/758] Update check_copyright.py to follow python 3 rules Found this issue during the import. --- tools/distrib/check_copyright.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tools/distrib/check_copyright.py b/tools/distrib/check_copyright.py index 831d62ef52e..c264bf8a454 100755 --- a/tools/distrib/check_copyright.py +++ b/tools/distrib/check_copyright.py @@ -14,6 +14,7 @@ # See the License for the specific language governing permissions and # limitations under the License. +from __future__ import print_function import argparse import datetime import os @@ -129,9 +130,9 @@ assert (re.search(RE_LICENSE['Makefile'], load('Makefile'))) def log(cond, why, filename): if not cond: return if args.output == 'details': - print '%s: %s' % (why, filename) + print('%s: %s' % (why, filename)) else: - print filename + print(filename) # scan files, validate the text From cacc03f56a88503e501c42223df9c0298b0046ef Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Thu, 23 Apr 2020 09:10:58 +1200 Subject: [PATCH 581/758] Add helper methods for getting metadata values --- src/csharp/Grpc.Core.Api/Metadata.cs | 78 ++++++++++++++++++++++------ 1 file changed, 61 insertions(+), 17 deletions(-) diff --git a/src/csharp/Grpc.Core.Api/Metadata.cs b/src/csharp/Grpc.Core.Api/Metadata.cs index f7f0ae1c93a..a80345a6ba3 100644 --- a/src/csharp/Grpc.Core.Api/Metadata.cs +++ b/src/csharp/Grpc.Core.Api/Metadata.cs @@ -75,7 +75,67 @@ namespace Grpc.Core return this; } - // TODO: add support for access by key + /// + /// Gets the last metadata entry with the specified key. + /// + public Entry Get(string key) + { + for (int i = entries.Count - 1; i >= 0; i--) + { + if (entries[i].Key == key) + { + return entries[i]; + } + } + + return null; + } + + /// + /// Gets all metadata entries with the specified key. + /// + public IEnumerable GetAll(string key) + { + for (int i = 0; i < entries.Count; i++) + { + if (entries[i].Key == key) + { + yield return entries[i]; + } + } + } + + /// + /// Gets the last metadata entry string value with the specified key. + /// + public string GetValue(string key) + { + return Get(key)?.Value; + } + + /// + /// Gets the last metadata entry bytes value with the specified key. + /// + public byte[] GetValueBytes(string key) + { + return Get(key)?.ValueBytes; + } + + /// + /// Adds a new ASCII-valued metadata entry. See Metadata.Entry constructor for params. + /// + public void Add(string key, string value) + { + Add(new Entry(key, value)); + } + + /// + /// Adds a new binary-valued metadata entry. See Metadata.Entry constructor for params. + /// + public void Add(string key, byte[] valueBytes) + { + Add(new Entry(key, valueBytes)); + } #region IList members @@ -135,22 +195,6 @@ namespace Grpc.Core entries.Add(item); } - /// - /// Adds a new ASCII-valued metadata entry. See Metadata.Entry constructor for params. - /// - public void Add(string key, string value) - { - Add(new Entry(key, value)); - } - - /// - /// Adds a new binary-valued metadata entry. See Metadata.Entry constructor for params. - /// - public void Add(string key, byte[] valueBytes) - { - Add(new Entry(key, valueBytes)); - } - /// /// /// From 840c974a93cc4074f0f80000e45d713e16314cf2 Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Thu, 23 Apr 2020 09:14:31 +1200 Subject: [PATCH 582/758] Improve docs --- src/csharp/Grpc.Core.Api/Metadata.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/csharp/Grpc.Core.Api/Metadata.cs b/src/csharp/Grpc.Core.Api/Metadata.cs index a80345a6ba3..a400f909f94 100644 --- a/src/csharp/Grpc.Core.Api/Metadata.cs +++ b/src/csharp/Grpc.Core.Api/Metadata.cs @@ -76,7 +76,7 @@ namespace Grpc.Core } /// - /// Gets the last metadata entry with the specified key. + /// Gets the last metadata entry with the specified key. If no entries have the key then null is returned. /// public Entry Get(string key) { @@ -106,7 +106,7 @@ namespace Grpc.Core } /// - /// Gets the last metadata entry string value with the specified key. + /// Gets the last metadata entry string value with the specified key. If no entries have the key then null is returned. /// public string GetValue(string key) { @@ -114,7 +114,7 @@ namespace Grpc.Core } /// - /// Gets the last metadata entry bytes value with the specified key. + /// Gets the last metadata entry bytes value with the specified key. If no entries have the key then null is returned. /// public byte[] GetValueBytes(string key) { From b8f2034c353b0b79b63fca8b6822ab897b0b7484 Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Thu, 23 Apr 2020 09:27:20 +1200 Subject: [PATCH 583/758] Improve docs --- src/csharp/Grpc.Core.Api/Metadata.cs | 32 ++++++++++++++-------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/csharp/Grpc.Core.Api/Metadata.cs b/src/csharp/Grpc.Core.Api/Metadata.cs index a400f909f94..376ccc531b7 100644 --- a/src/csharp/Grpc.Core.Api/Metadata.cs +++ b/src/csharp/Grpc.Core.Api/Metadata.cs @@ -76,7 +76,7 @@ namespace Grpc.Core } /// - /// Gets the last metadata entry with the specified key. If no entries have the key then null is returned. + /// Gets the last metadata entry with the specified key. If there are no matching entries then null is returned. /// public Entry Get(string key) { @@ -92,33 +92,33 @@ namespace Grpc.Core } /// - /// Gets all metadata entries with the specified key. + /// Gets the string value of the last metadata entry with the specified key. If there are no matching entries then null is returned. /// - public IEnumerable GetAll(string key) + public string GetValue(string key) { - for (int i = 0; i < entries.Count; i++) - { - if (entries[i].Key == key) - { - yield return entries[i]; - } - } + return Get(key)?.Value; } /// - /// Gets the last metadata entry string value with the specified key. If no entries have the key then null is returned. + /// Gets the bytes value of the last metadata entry with the specified key. If there are no matching entries then null is returned. /// - public string GetValue(string key) + public byte[] GetValueBytes(string key) { - return Get(key)?.Value; + return Get(key)?.ValueBytes; } /// - /// Gets the last metadata entry bytes value with the specified key. If no entries have the key then null is returned. + /// Gets all metadata entries with the specified key. /// - public byte[] GetValueBytes(string key) + public IEnumerable GetAll(string key) { - return Get(key)?.ValueBytes; + for (int i = 0; i < entries.Count; i++) + { + if (entries[i].Key == key) + { + yield return entries[i]; + } + } } /// From f7d71ccfa6f4d0058a0e2e7163b1f4c64f54f69f Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Wed, 22 Apr 2020 14:51:21 -0700 Subject: [PATCH 584/758] Update the glossary --- doc/python/sphinx/glossary.rst | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/doc/python/sphinx/glossary.rst b/doc/python/sphinx/glossary.rst index 353c5a3c11b..fb44bdf114d 100644 --- a/doc/python/sphinx/glossary.rst +++ b/doc/python/sphinx/glossary.rst @@ -29,15 +29,13 @@ Glossary and the client-side. wait_for_ready - If an RPC is issued but the channel is in TRANSIENT_FAILURE or SHUTDOWN - states, the RPC is unable to be transmitted promptly. By default, gRPC - implementations SHOULD fail such RPCs immediately. This is known as "fail - fast," but the usage of the term is historical. RPCs SHOULD NOT fail as a - result of the channel being in other states (CONNECTING, READY, or IDLE). + If an RPC is issued but the channel is in the TRANSIENT_FAILURE or SHUTDOWN + states, the library cannot transmit the RPC at the moment. By default, the + gRPC library will fail such RPCs immediately. This is known as "fail fast." + RPCs will not fail as a result of the channel being in other states + (CONNECTING, READY, or IDLE). - gRPC implementations MAY provide a per-RPC option to not fail RPCs as a - result of the channel being in TRANSIENT_FAILURE state. Instead, the - implementation queues the RPCs until the channel is READY. This is known as - "wait for ready." The RPCs SHOULD still fail before READY if there are - unrelated reasons, such as the channel is SHUTDOWN or the RPC's deadline is - reached. + When the wait_for_ready option is specified, the library will queue RPCs + until the channel is READY. Any submitted RPCs may still fail before the + READY state is reached for other reasons, e.g., the client channel has been + shut down or the RPC's deadline has been reached. From d3805e1b6c19fb9caa73f71c27a4794873aeaa8c Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Wed, 22 Apr 2020 16:18:02 -0700 Subject: [PATCH 585/758] Explain how to find channel arguments in our doc --- doc/python/sphinx/glossary.rst | 9 +++++++++ src/python/grpcio/grpc/__init__.py | 6 +++--- src/python/grpcio/grpc/_simple_stubs.py | 8 ++++---- src/python/grpcio/grpc/experimental/aio/_channel.py | 4 ++-- src/python/grpcio/grpc/experimental/aio/_server.py | 2 +- src/python/grpcio_tests/tests/unit/_channel_args_test.py | 2 +- 6 files changed, 20 insertions(+), 11 deletions(-) diff --git a/doc/python/sphinx/glossary.rst b/doc/python/sphinx/glossary.rst index fb44bdf114d..c96c9bba1ad 100644 --- a/doc/python/sphinx/glossary.rst +++ b/doc/python/sphinx/glossary.rst @@ -39,3 +39,12 @@ Glossary until the channel is READY. Any submitted RPCs may still fail before the READY state is reached for other reasons, e.g., the client channel has been shut down or the RPC's deadline has been reached. + + channel_arguments + A list of key-value pairs to configure the underlying gRPC Core channel or + server object. Channel arguments are meant for advanced usages. Full list + channel arguments can be found under the "grpc_arg_keys" section of + `grpc_types.h + `_ + header file. For example, if you want to disable TCP port reuse, you may + construct channel arguments like: ``options = (('grpc.so_reuseport', 0),)``. diff --git a/src/python/grpcio/grpc/__init__.py b/src/python/grpcio/grpc/__init__.py index 75b1a923f67..d6c6815291c 100644 --- a/src/python/grpcio/grpc/__init__.py +++ b/src/python/grpcio/grpc/__init__.py @@ -1857,7 +1857,7 @@ def insecure_channel(target, options=None, compression=None): Args: target: The server address - options: An optional list of key-value pairs (channel args + options: An optional list of key-value pairs (:term:`channel_arguments` in gRPC Core runtime) to configure the channel. compression: An optional value indicating the compression method to be used over the lifetime of the channel. This is an EXPERIMENTAL option. @@ -1878,7 +1878,7 @@ def secure_channel(target, credentials, options=None, compression=None): Args: target: The server address. credentials: A ChannelCredentials instance. - options: An optional list of key-value pairs (channel args + options: An optional list of key-value pairs (:term:`channel_arguments` in gRPC Core runtime) to configure the channel. compression: An optional value indicating the compression method to be used over the lifetime of the channel. This is an EXPERIMENTAL option. @@ -1942,7 +1942,7 @@ def server(thread_pool, and optionally manipulate the incoming RPCs before handing them over to handlers. The interceptors are given control in the order they are specified. This is an EXPERIMENTAL API. - options: An optional list of key-value pairs (channel args in gRPC runtime) + options: An optional list of key-value pairs (:term:`channel_arguments` in gRPC runtime) to configure the channel. maximum_concurrent_rpcs: The maximum number of concurrent RPCs this server will service before returning RESOURCE_EXHAUSTED status, or None to diff --git a/src/python/grpcio/grpc/_simple_stubs.py b/src/python/grpcio/grpc/_simple_stubs.py index 39535527ef5..202ad123e82 100644 --- a/src/python/grpcio/grpc/_simple_stubs.py +++ b/src/python/grpcio/grpc/_simple_stubs.py @@ -196,7 +196,7 @@ def unary_unary( message. Request goes unserialized in case None is passed. response_deserializer: Optional :term:`deserializer` for deserializing the response message. Response goes undeserialized in case None is passed. - options: An optional list of key-value pairs (channel args in gRPC Core + options: An optional list of key-value pairs (:term:`channel_arguments` in gRPC Core runtime) to configure the channel. channel_credentials: A credential applied to the whole channel, e.g. the return value of grpc.ssl_channel_credentials() or @@ -267,7 +267,7 @@ def unary_stream( message. Request goes unserialized in case None is passed. response_deserializer: Optional :term:`deserializer` for deserializing the response message. Response goes undeserialized in case None is passed. - options: An optional list of key-value pairs (channel args in gRPC Core + options: An optional list of key-value pairs (:term:`channel_arguments` in gRPC Core runtime) to configure the channel. channel_credentials: A credential applied to the whole channel, e.g. the return value of grpc.ssl_channel_credentials(). @@ -337,7 +337,7 @@ def stream_unary( message. Request goes unserialized in case None is passed. response_deserializer: Optional :term:`deserializer` for deserializing the response message. Response goes undeserialized in case None is passed. - options: An optional list of key-value pairs (channel args in gRPC Core + options: An optional list of key-value pairs (:term:`channel_arguments` in gRPC Core runtime) to configure the channel. channel_credentials: A credential applied to the whole channel, e.g. the return value of grpc.ssl_channel_credentials(). @@ -407,7 +407,7 @@ def stream_stream( message. Request goes unserialized in case None is passed. response_deserializer: Optional :term:`deserializer` for deserializing the response message. Response goes undeserialized in case None is passed. - options: An optional list of key-value pairs (channel args in gRPC Core + options: An optional list of key-value pairs (:term:`channel_arguments` in gRPC Core runtime) to configure the channel. channel_credentials: A credential applied to the whole channel, e.g. the return value of grpc.ssl_channel_credentials(). diff --git a/src/python/grpcio/grpc/experimental/aio/_channel.py b/src/python/grpcio/grpc/experimental/aio/_channel.py index 89c556c997e..afa9cf30630 100644 --- a/src/python/grpcio/grpc/experimental/aio/_channel.py +++ b/src/python/grpcio/grpc/experimental/aio/_channel.py @@ -406,7 +406,7 @@ def insecure_channel( Args: target: The server address - options: An optional list of key-value pairs (channel args + options: An optional list of key-value pairs (:term:`channel_arguments` in gRPC Core runtime) to configure the channel. compression: An optional value indicating the compression method to be used over the lifetime of the channel. This is an EXPERIMENTAL option. @@ -430,7 +430,7 @@ def secure_channel(target: str, Args: target: The server address. credentials: A ChannelCredentials instance. - options: An optional list of key-value pairs (channel args + options: An optional list of key-value pairs (:term:`channel_arguments` in gRPC Core runtime) to configure the channel. compression: An optional value indicating the compression method to be used over the lifetime of the channel. This is an EXPERIMENTAL option. diff --git a/src/python/grpcio/grpc/experimental/aio/_server.py b/src/python/grpcio/grpc/experimental/aio/_server.py index 478049e5db4..81438891268 100644 --- a/src/python/grpcio/grpc/experimental/aio/_server.py +++ b/src/python/grpcio/grpc/experimental/aio/_server.py @@ -187,7 +187,7 @@ def server(migration_thread_pool: Optional[Executor] = None, and optionally manipulate the incoming RPCs before handing them over to handlers. The interceptors are given control in the order they are specified. This is an EXPERIMENTAL API. - options: An optional list of key-value pairs (channel args in gRPC runtime) + options: An optional list of key-value pairs (:term:`channel_arguments` in gRPC runtime) to configure the channel. maximum_concurrent_rpcs: The maximum number of concurrent RPCs this server will service before returning RESOURCE_EXHAUSTED status, or None to diff --git a/src/python/grpcio_tests/tests/unit/_channel_args_test.py b/src/python/grpcio_tests/tests/unit/_channel_args_test.py index 3f3db2edd23..2f2eea61dbd 100644 --- a/src/python/grpcio_tests/tests/unit/_channel_args_test.py +++ b/src/python/grpcio_tests/tests/unit/_channel_args_test.py @@ -11,7 +11,7 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -"""Tests of Channel Args on client/server side.""" +"""Tests of channel arguments on client/server side.""" from concurrent import futures import unittest From 6b2239ed40aae1caf904750f45cedde84fde007e Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Wed, 22 Apr 2020 16:56:42 -0700 Subject: [PATCH 586/758] Generate corresponding grpc_types.h link --- doc/python/sphinx/conf.py | 13 +++++++++++-- doc/python/sphinx/glossary.rst | 7 +++---- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/doc/python/sphinx/conf.py b/doc/python/sphinx/conf.py index 49e5ecb1dcd..c30204b51ff 100644 --- a/doc/python/sphinx/conf.py +++ b/doc/python/sphinx/conf.py @@ -28,13 +28,17 @@ sys.path.insert(0, os.path.join(PYTHON_FOLDER, 'grpcio_testing')) # -- Project information ----------------------------------------------------- project = 'gRPC Python' -copyright = '2018, The gRPC Authors' +copyright = '2020, The gRPC Authors' author = 'The gRPC Authors' # Import generated grpc_version after the path been modified import grpc_version -version = ".".join(grpc_version.VERSION.split(".")[:3]) +version = '.'.join(grpc_version.VERSION.split('.')[:3]) release = grpc_version.VERSION +if 'dev' in grpc_version.VERSION: + branch = 'master' +else: + branch = 'v%s.%s.x' % tuple(grpc_version.VERSION.split('.')[:2]) # -- General configuration --------------------------------------------------- @@ -54,6 +58,7 @@ extensions = [ 'sphinx.ext.napoleon', 'sphinx.ext.coverage', 'sphinx.ext.autodoc.typehints', + 'sphinx.ext.extlinks', ] napoleon_google_docstring = True @@ -100,3 +105,7 @@ epub_exclude_files = ['search.html'] # -- Options for todo extension ---------------------------------------------- todo_include_todos = True + +# -- Options for substitutions ----------------------------------------------- + +rst_epilog = '.. |grpc_types_link| replace:: https://github.com/grpc/grpc/blob/%s/include/grpc/impl/codegen/grpc_types.h' % branch diff --git a/doc/python/sphinx/glossary.rst b/doc/python/sphinx/glossary.rst index c96c9bba1ad..951eba728a3 100644 --- a/doc/python/sphinx/glossary.rst +++ b/doc/python/sphinx/glossary.rst @@ -44,7 +44,6 @@ Glossary A list of key-value pairs to configure the underlying gRPC Core channel or server object. Channel arguments are meant for advanced usages. Full list channel arguments can be found under the "grpc_arg_keys" section of - `grpc_types.h - `_ - header file. For example, if you want to disable TCP port reuse, you may - construct channel arguments like: ``options = (('grpc.so_reuseport', 0),)``. + "grpc_types.h" header file (|grpc_types_link|). For example, if you want to disable TCP port + reuse, you may construct channel arguments like: ``options = + (('grpc.so_reuseport', 0),)``. From c57a3792a092873f40c4e3490e719738e6ce2f2b Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Wed, 22 Apr 2020 17:02:32 -0700 Subject: [PATCH 587/758] Remove unused extension --- doc/python/sphinx/conf.py | 1 - 1 file changed, 1 deletion(-) diff --git a/doc/python/sphinx/conf.py b/doc/python/sphinx/conf.py index c30204b51ff..6e4bfab7d0e 100644 --- a/doc/python/sphinx/conf.py +++ b/doc/python/sphinx/conf.py @@ -58,7 +58,6 @@ extensions = [ 'sphinx.ext.napoleon', 'sphinx.ext.coverage', 'sphinx.ext.autodoc.typehints', - 'sphinx.ext.extlinks', ] napoleon_google_docstring = True From 6c2542150c335fd882b28fd2b9d9738e3dedda38 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Wed, 22 Apr 2020 17:03:39 -0700 Subject: [PATCH 588/758] Format the rst file --- doc/python/sphinx/glossary.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/python/sphinx/glossary.rst b/doc/python/sphinx/glossary.rst index 951eba728a3..8fdccd756f2 100644 --- a/doc/python/sphinx/glossary.rst +++ b/doc/python/sphinx/glossary.rst @@ -44,6 +44,6 @@ Glossary A list of key-value pairs to configure the underlying gRPC Core channel or server object. Channel arguments are meant for advanced usages. Full list channel arguments can be found under the "grpc_arg_keys" section of - "grpc_types.h" header file (|grpc_types_link|). For example, if you want to disable TCP port - reuse, you may construct channel arguments like: ``options = - (('grpc.so_reuseport', 0),)``. + "grpc_types.h" header file (|grpc_types_link|). For example, if you want to + disable TCP port reuse, you may construct channel arguments like: ``options + = (('grpc.so_reuseport', 0),)``. From edbae5d8e66fd72c8ac743dd54fa41319a5e251b Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Wed, 22 Apr 2020 23:01:56 -0700 Subject: [PATCH 589/758] Fix interceptor batch method FailHijackedRecvMessage for async APIs --- include/grpcpp/impl/codegen/call_op_set.h | 61 ++++-- .../grpcpp/impl/codegen/interceptor_common.h | 8 +- .../client_interceptors_end2end_test.cc | 181 ++++++++++++++++-- test/cpp/end2end/interceptors_util.cc | 57 +++++- test/cpp/end2end/interceptors_util.h | 18 ++ 5 files changed, 286 insertions(+), 39 deletions(-) diff --git a/include/grpcpp/impl/codegen/call_op_set.h b/include/grpcpp/impl/codegen/call_op_set.h index e6d7b900ca1..5bfd541c8f4 100644 --- a/include/grpcpp/impl/codegen/call_op_set.h +++ b/include/grpcpp/impl/codegen/call_op_set.h @@ -421,17 +421,14 @@ Status CallOpSendMessage::SendMessagePtr(const M* message) { template class CallOpRecvMessage { public: - CallOpRecvMessage() - : got_message(false), - message_(nullptr), - allow_not_getting_message_(false) {} + CallOpRecvMessage() {} void RecvMessage(R* message) { message_ = message; } // Do not change status if no message is received. void AllowNoMessage() { allow_not_getting_message_ = true; } - bool got_message; + bool got_message = false; protected: void AddOp(grpc_op* ops, size_t* nops) { @@ -444,7 +441,7 @@ class CallOpRecvMessage { } void FinishOp(bool* status) { - if (message_ == nullptr || hijacked_) return; + if (message_ == nullptr) return; if (recv_buf_.Valid()) { if (*status) { got_message = *status = @@ -455,18 +452,20 @@ class CallOpRecvMessage { got_message = false; recv_buf_.Clear(); } - } else { - got_message = false; - if (!allow_not_getting_message_) { - *status = false; + } else if (hijacked_) { + if (!hijacked_recv_message_status_) { + FinishOpRecvMessageFailureHandler(status); } + } else { + FinishOpRecvMessageFailureHandler(status); } } void SetInterceptionHookPoint( InterceptorBatchMethodsImpl* interceptor_methods) { if (message_ == nullptr) return; - interceptor_methods->SetRecvMessage(message_, &got_message); + interceptor_methods->SetRecvMessage(message_, + &hijacked_recv_message_status_); } void SetFinishInterceptionHookPoint( @@ -485,10 +484,19 @@ class CallOpRecvMessage { } private: - R* message_; + // Sets got_message and \a status for a failed recv message op + void FinishOpRecvMessageFailureHandler(bool* status) { + got_message = false; + if (!allow_not_getting_message_) { + *status = false; + } + } + + R* message_ = nullptr; ByteBuffer recv_buf_; - bool allow_not_getting_message_; + bool allow_not_getting_message_ = false; bool hijacked_ = false; + bool hijacked_recv_message_status_ = true; }; class DeserializeFunc { @@ -513,8 +521,7 @@ class DeserializeFuncType final : public DeserializeFunc { class CallOpGenericRecvMessage { public: - CallOpGenericRecvMessage() - : got_message(false), allow_not_getting_message_(false) {} + CallOpGenericRecvMessage() {} template void RecvMessage(R* message) { @@ -528,7 +535,7 @@ class CallOpGenericRecvMessage { // Do not change status if no message is received. void AllowNoMessage() { allow_not_getting_message_ = true; } - bool got_message; + bool got_message = false; protected: void AddOp(grpc_op* ops, size_t* nops) { @@ -551,6 +558,10 @@ class CallOpGenericRecvMessage { got_message = false; recv_buf_.Clear(); } + } else if (hijacked_) { + if (!hijacked_recv_message_status_) { + FinishOpRecvMessageFailureHandler(status); + } } else { got_message = false; if (!allow_not_getting_message_) { @@ -562,7 +573,8 @@ class CallOpGenericRecvMessage { void SetInterceptionHookPoint( InterceptorBatchMethodsImpl* interceptor_methods) { if (!deserialize_) return; - interceptor_methods->SetRecvMessage(message_, &got_message); + interceptor_methods->SetRecvMessage(message_, + &hijacked_recv_message_status_); } void SetFinishInterceptionHookPoint( @@ -582,11 +594,20 @@ class CallOpGenericRecvMessage { } private: - void* message_; - bool hijacked_ = false; + // Sets got_message and \a status for a failed recv message op + void FinishOpRecvMessageFailureHandler(bool* status) { + got_message = false; + if (!allow_not_getting_message_) { + *status = false; + } + } + + void* message_ = nullptr; std::unique_ptr deserialize_; ByteBuffer recv_buf_; - bool allow_not_getting_message_; + bool allow_not_getting_message_ = false; + bool hijacked_ = false; + bool hijacked_recv_message_status_ = true; }; class CallOpClientSendClose { diff --git a/include/grpcpp/impl/codegen/interceptor_common.h b/include/grpcpp/impl/codegen/interceptor_common.h index 01ffe19bc4a..9b124197ff0 100644 --- a/include/grpcpp/impl/codegen/interceptor_common.h +++ b/include/grpcpp/impl/codegen/interceptor_common.h @@ -166,9 +166,9 @@ class InterceptorBatchMethodsImpl send_trailing_metadata_ = metadata; } - void SetRecvMessage(void* message, bool* got_message) { + void SetRecvMessage(void* message, bool* hijacked_recv_message_status) { recv_message_ = message; - got_message_ = got_message; + hijacked_recv_message_status_ = hijacked_recv_message_status; } void SetRecvInitialMetadata(MetadataMap* map) { @@ -195,7 +195,7 @@ class InterceptorBatchMethodsImpl void FailHijackedRecvMessage() override { GPR_CODEGEN_ASSERT(hooks_[static_cast( experimental::InterceptionHookPoints::PRE_RECV_MESSAGE)]); - *got_message_ = false; + *hijacked_recv_message_status_ = false; } // Clears all state @@ -407,7 +407,7 @@ class InterceptorBatchMethodsImpl std::multimap* send_trailing_metadata_ = nullptr; void* recv_message_ = nullptr; - bool* got_message_ = nullptr; + bool* hijacked_recv_message_status_ = nullptr; MetadataMap* recv_initial_metadata_ = nullptr; diff --git a/test/cpp/end2end/client_interceptors_end2end_test.cc b/test/cpp/end2end/client_interceptors_end2end_test.cc index 7ee95a60c1f..86012a34586 100644 --- a/test/cpp/end2end/client_interceptors_end2end_test.cc +++ b/test/cpp/end2end/client_interceptors_end2end_test.cc @@ -43,6 +43,17 @@ namespace grpc { namespace testing { namespace { +enum class RPCType { + kSyncUnary, + kSyncClientStreaming, + kSyncServerStreaming, + kSyncBidiStreaming, + kAsyncCQUnary, + kAsyncCQClientStreaming, + kAsyncCQServerStreaming, + kAsyncCQBidiStreaming, +}; + /* Hijacks Echo RPC and fills in the expected values */ class HijackingInterceptor : public experimental::Interceptor { public: @@ -400,6 +411,7 @@ class ServerStreamingRpcHijackingInterceptor public: ServerStreamingRpcHijackingInterceptor(experimental::ClientRpcInfo* info) { info_ = info; + got_failed_message_ = false; } virtual void Intercept(experimental::InterceptorBatchMethods* methods) { @@ -531,10 +543,22 @@ class LoggingInterceptor : public experimental::Interceptor { if (methods->QueryInterceptionHookPoint( experimental::InterceptionHookPoints::PRE_SEND_MESSAGE)) { EchoRequest req; - EXPECT_EQ(static_cast(methods->GetSendMessage()) - ->message() - .find("Hello"), - 0u); + auto* send_msg = methods->GetSendMessage(); + if (send_msg == nullptr) { + // We did not get the non-serialized form of the message. Get the + // serialized form. + auto* buffer = methods->GetSerializedSendMessage(); + auto copied_buffer = *buffer; + EchoRequest req; + EXPECT_TRUE( + SerializationTraits::Deserialize(&copied_buffer, &req) + .ok()); + EXPECT_EQ(req.message(), "Hello"); + } else { + EXPECT_EQ( + static_cast(send_msg)->message().find("Hello"), + 0u); + } auto* buffer = methods->GetSerializedSendMessage(); auto copied_buffer = *buffer; EXPECT_TRUE( @@ -582,6 +606,27 @@ class LoggingInterceptor : public experimental::Interceptor { methods->Proceed(); } + static void VerifyCall(RPCType type) { + switch (type) { + case RPCType::kSyncUnary: + case RPCType::kAsyncCQUnary: + VerifyUnaryCall(); + break; + case RPCType::kSyncClientStreaming: + case RPCType::kAsyncCQClientStreaming: + VerifyClientStreamingCall(); + break; + case RPCType::kSyncServerStreaming: + case RPCType::kAsyncCQServerStreaming: + VerifyServerStreamingCall(); + break; + case RPCType::kSyncBidiStreaming: + case RPCType::kAsyncCQBidiStreaming: + VerifyBidiStreamingCall(); + break; + } + } + static void VerifyCallCommon() { EXPECT_TRUE(pre_send_initial_metadata_); EXPECT_TRUE(pre_send_close_); @@ -638,9 +683,31 @@ class LoggingInterceptorFactory } }; -class ClientInterceptorsEnd2endTest : public ::testing::Test { +class TestScenario { + public: + explicit TestScenario(const RPCType& type) : type_(type) {} + + RPCType type() const { return type_; } + + private: + RPCType type_; +}; + +std::vector CreateTestScenarios() { + std::vector scenarios; + scenarios.emplace_back(RPCType::kSyncUnary); + scenarios.emplace_back(RPCType::kSyncClientStreaming); + scenarios.emplace_back(RPCType::kSyncServerStreaming); + scenarios.emplace_back(RPCType::kSyncBidiStreaming); + scenarios.emplace_back(RPCType::kAsyncCQUnary); + scenarios.emplace_back(RPCType::kAsyncCQServerStreaming); + return scenarios; +} + +class ParameterizedClientInterceptorsEnd2endTest + : public ::testing::TestWithParam { protected: - ClientInterceptorsEnd2endTest() { + ParameterizedClientInterceptorsEnd2endTest() { int port = grpc_pick_unused_port_or_die(); ServerBuilder builder; @@ -650,14 +717,44 @@ class ClientInterceptorsEnd2endTest : public ::testing::Test { server_ = builder.BuildAndStart(); } - ~ClientInterceptorsEnd2endTest() { server_->Shutdown(); } + ~ParameterizedClientInterceptorsEnd2endTest() { server_->Shutdown(); } + + void SendRPC(const std::shared_ptr& channel) { + switch (GetParam().type()) { + case RPCType::kSyncUnary: + MakeCall(channel); + break; + case RPCType::kSyncClientStreaming: + MakeClientStreamingCall(channel); + break; + case RPCType::kSyncServerStreaming: + MakeServerStreamingCall(channel); + break; + case RPCType::kSyncBidiStreaming: + MakeBidiStreamingCall(channel); + break; + case RPCType::kAsyncCQUnary: + MakeAsyncCQCall(channel); + break; + case RPCType::kAsyncCQClientStreaming: + // TODO(yashykt) : Fill this out + break; + case RPCType::kAsyncCQServerStreaming: + MakeAsyncCQServerStreamingCall(channel); + break; + case RPCType::kAsyncCQBidiStreaming: + // TODO(yashykt) : Fill this out + break; + } + } std::string server_address_; - TestServiceImpl service_; + EchoTestServiceStreamingImpl service_; std::unique_ptr server_; }; -TEST_F(ClientInterceptorsEnd2endTest, ClientInterceptorLoggingTest) { +TEST_P(ParameterizedClientInterceptorsEnd2endTest, + ClientInterceptorLoggingTest) { ChannelArguments args; DummyInterceptor::Reset(); std::vector> @@ -671,12 +768,36 @@ TEST_F(ClientInterceptorsEnd2endTest, ClientInterceptorLoggingTest) { } auto channel = experimental::CreateCustomChannelWithInterceptors( server_address_, InsecureChannelCredentials(), args, std::move(creators)); - MakeCall(channel); - LoggingInterceptor::VerifyUnaryCall(); + SendRPC(channel); + LoggingInterceptor::VerifyCall(GetParam().type()); // Make sure all 20 dummy interceptors were run EXPECT_EQ(DummyInterceptor::GetNumTimesRun(), 20); } +INSTANTIATE_TEST_SUITE_P(ParameterizedClientInterceptorsEnd2end, + ParameterizedClientInterceptorsEnd2endTest, + ::testing::ValuesIn(CreateTestScenarios())); + +class ClientInterceptorsEnd2endTest + : public ::testing::TestWithParam { + protected: + ClientInterceptorsEnd2endTest() { + int port = grpc_pick_unused_port_or_die(); + + ServerBuilder builder; + server_address_ = "localhost:" + std::to_string(port); + builder.AddListeningPort(server_address_, InsecureServerCredentials()); + builder.RegisterService(&service_); + server_ = builder.BuildAndStart(); + } + + ~ClientInterceptorsEnd2endTest() { server_->Shutdown(); } + + std::string server_address_; + TestServiceImpl service_; + std::unique_ptr server_; +}; + TEST_F(ClientInterceptorsEnd2endTest, LameChannelClientInterceptorHijackingTest) { ChannelArguments args; @@ -757,7 +878,26 @@ TEST_F(ClientInterceptorsEnd2endTest, EXPECT_EQ(DummyInterceptor::GetNumTimesRun(), 12); } -TEST_F(ClientInterceptorsEnd2endTest, +class ClientInterceptorsCallbackEnd2endTest : public ::testing::Test { + protected: + ClientInterceptorsCallbackEnd2endTest() { + int port = grpc_pick_unused_port_or_die(); + + ServerBuilder builder; + server_address_ = "localhost:" + std::to_string(port); + builder.AddListeningPort(server_address_, InsecureServerCredentials()); + builder.RegisterService(&service_); + server_ = builder.BuildAndStart(); + } + + ~ClientInterceptorsCallbackEnd2endTest() { server_->Shutdown(); } + + std::string server_address_; + TestServiceImpl service_; + std::unique_ptr server_; +}; + +TEST_F(ClientInterceptorsCallbackEnd2endTest, ClientInterceptorLoggingTestWithCallback) { ChannelArguments args; DummyInterceptor::Reset(); @@ -778,7 +918,7 @@ TEST_F(ClientInterceptorsEnd2endTest, EXPECT_EQ(DummyInterceptor::GetNumTimesRun(), 20); } -TEST_F(ClientInterceptorsEnd2endTest, +TEST_F(ClientInterceptorsCallbackEnd2endTest, ClientInterceptorFactoryAllowsNullptrReturn) { ChannelArguments args; DummyInterceptor::Reset(); @@ -903,6 +1043,21 @@ TEST_F(ClientInterceptorsStreamingEnd2endTest, ServerStreamingHijackingTest) { EXPECT_TRUE(ServerStreamingRpcHijackingInterceptor::GotFailedMessage()); } +TEST_F(ClientInterceptorsStreamingEnd2endTest, + AsyncCQServerStreamingHijackingTest) { + ChannelArguments args; + DummyInterceptor::Reset(); + std::vector> + creators; + creators.push_back( + std::unique_ptr( + new ServerStreamingRpcHijackingInterceptorFactory())); + auto channel = experimental::CreateCustomChannelWithInterceptors( + server_address_, InsecureChannelCredentials(), args, std::move(creators)); + MakeAsyncCQServerStreamingCall(channel); + EXPECT_TRUE(ServerStreamingRpcHijackingInterceptor::GotFailedMessage()); +} + TEST_F(ClientInterceptorsStreamingEnd2endTest, BidiStreamingHijackingTest) { ChannelArguments args; DummyInterceptor::Reset(); diff --git a/test/cpp/end2end/interceptors_util.cc b/test/cpp/end2end/interceptors_util.cc index 6321c35ba4a..7d74a48db62 100644 --- a/test/cpp/end2end/interceptors_util.cc +++ b/test/cpp/end2end/interceptors_util.cc @@ -66,7 +66,6 @@ void MakeServerStreamingCall(const std::shared_ptr& channel) { ctx.AddMetadata("testkey", "testvalue"); req.set_message("Hello"); EchoResponse resp; - string expected_resp = ""; auto reader = stub->ResponseStream(&ctx, req); int count = 0; while (reader->Read(&resp)) { @@ -84,6 +83,7 @@ void MakeBidiStreamingCall(const std::shared_ptr& channel) { EchoRequest req; EchoResponse resp; ctx.AddMetadata("testkey", "testvalue"); + req.mutable_param()->set_echo_metadata(true); auto stream = stub->BidiStream(&ctx); for (auto i = 0; i < kNumStreamingMessages; i++) { req.set_message("Hello" + std::to_string(i)); @@ -96,6 +96,60 @@ void MakeBidiStreamingCall(const std::shared_ptr& channel) { EXPECT_EQ(s.ok(), true); } +void MakeAsyncCQCall(const std::shared_ptr& channel) { + auto stub = grpc::testing::EchoTestService::NewStub(channel); + CompletionQueue cq; + EchoRequest send_request; + EchoResponse recv_response; + Status recv_status; + ClientContext cli_ctx; + + send_request.set_message("Hello"); + cli_ctx.AddMetadata("testkey", "testvalue"); + std::unique_ptr> response_reader( + stub->AsyncEcho(&cli_ctx, send_request, &cq)); + response_reader->Finish(&recv_response, &recv_status, tag(1)); + Verifier().Expect(1, true).Verify(&cq); + EXPECT_EQ(send_request.message(), recv_response.message()); + EXPECT_TRUE(recv_status.ok()); +} + +void MakeAsyncCQClientStreamingCall(const std::shared_ptr& channel) { + // TODO(yashykt) : Fill this out +} + +void MakeAsyncCQServerStreamingCall(const std::shared_ptr& channel) { + auto stub = grpc::testing::EchoTestService::NewStub(channel); + CompletionQueue cq; + EchoRequest send_request; + EchoResponse recv_response; + Status recv_status; + ClientContext cli_ctx; + + cli_ctx.AddMetadata("testkey", "testvalue"); + send_request.set_message("Hello"); + std::unique_ptr> cli_stream( + stub->AsyncResponseStream(&cli_ctx, send_request, &cq, tag(1))); + Verifier().Expect(1, true).Verify(&cq); + // Read the expected number of messages + for (int i = 0; i < kNumStreamingMessages; i++) { + cli_stream->Read(&recv_response, tag(2)); + Verifier().Expect(2, true).Verify(&cq); + ASSERT_EQ(recv_response.message(), send_request.message()); + } + // The next read should fail + cli_stream->Read(&recv_response, tag(3)); + Verifier().Expect(3, false).Verify(&cq); + // Get the status + cli_stream->Finish(&recv_status, tag(4)); + Verifier().Expect(4, true).Verify(&cq); + EXPECT_TRUE(recv_status.ok()); +} + +void MakeAsyncCQBidiStreamingCall(const std::shared_ptr& channel) { + // TODO(yashykt) : Fill this out +} + void MakeCallbackCall(const std::shared_ptr& channel) { auto stub = grpc::testing::EchoTestService::NewStub(channel); ClientContext ctx; @@ -109,7 +163,6 @@ void MakeCallbackCall(const std::shared_ptr& channel) { EchoResponse resp; stub->experimental_async()->Echo(&ctx, &req, &resp, [&resp, &mu, &done, &cv](Status s) { - // gpr_log(GPR_ERROR, "got the callback"); EXPECT_EQ(s.ok(), true); EXPECT_EQ(resp.message(), "Hello"); std::lock_guard l(mu); diff --git a/test/cpp/end2end/interceptors_util.h b/test/cpp/end2end/interceptors_util.h index 6027c9b3dcf..cac9f3a6bb8 100644 --- a/test/cpp/end2end/interceptors_util.h +++ b/test/cpp/end2end/interceptors_util.h @@ -102,6 +102,16 @@ class EchoTestServiceStreamingImpl : public EchoTestService::Service { public: ~EchoTestServiceStreamingImpl() override {} + Status Echo(ServerContext* context, const EchoRequest* request, + EchoResponse* response) { + auto client_metadata = context->client_metadata(); + for (const auto& pair : client_metadata) { + context->AddTrailingMetadata(ToString(pair.first), ToString(pair.second)); + } + response->set_message(request->message()); + return Status::OK; + } + Status BidiStream( ServerContext* context, grpc::ServerReaderWriter* stream) override { @@ -162,6 +172,14 @@ void MakeServerStreamingCall(const std::shared_ptr& channel); void MakeBidiStreamingCall(const std::shared_ptr& channel); +void MakeAsyncCQCall(const std::shared_ptr& channel); + +void MakeAsyncCQClientStreamingCall(const std::shared_ptr& channel); + +void MakeAsyncCQServerStreamingCall(const std::shared_ptr& channel); + +void MakeAsyncCQBidiStreamingCall(const std::shared_ptr& channel); + void MakeCallbackCall(const std::shared_ptr& channel); bool CheckMetadata(const std::multimap& map, From c6fad536222396517276a6d25192c70a6b1ff0ff Mon Sep 17 00:00:00 2001 From: Vijay Pai Date: Wed, 22 Apr 2020 14:17:00 -0700 Subject: [PATCH 590/758] Start using std::string for registered_method --- src/core/lib/surface/server.cc | 27 +++++++++++---------------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/src/core/lib/surface/server.cc b/src/core/lib/surface/server.cc index e03bc6f1b5f..d22b52ad6fe 100644 --- a/src/core/lib/surface/server.cc +++ b/src/core/lib/surface/server.cc @@ -274,18 +274,15 @@ struct registered_method { const char* method_arg, const char* host_arg, grpc_server_register_method_payload_handling payload_handling_arg, uint32_t flags_arg) - : method(gpr_strdup(method_arg)), - host(gpr_strdup(host_arg)), + : method(method_arg == nullptr ? "" : method_arg), + host(host_arg == nullptr ? "" : host_arg), payload_handling(payload_handling_arg), flags(flags_arg) {} - ~registered_method() { - gpr_free(method); - gpr_free(host); - } + ~registered_method() = default; - char* const method; - char* const host; + const std::string method; + const std::string host; const grpc_server_register_method_payload_handling payload_handling; const uint32_t flags; /* one request matcher per method */ @@ -1183,11 +1180,9 @@ void register_completion_queue(grpc_server* server, grpc_completion_queue* cq, server->cqs[n] = cq; } -int streq(const char* a, const char* b) { - if (a == nullptr && b == nullptr) return 1; - if (a == nullptr) return 0; - if (b == nullptr) return 0; - return 0 == strcmp(a, b); +bool streq(const std::string& a, const char* b) { + return (a.empty() && b == nullptr) || + ((b != nullptr) && !strcmp(a.c_str(), b)); } class ConnectivityWatcher @@ -1491,10 +1486,10 @@ void grpc_server_setup_transport( static_cast(gpr_zalloc(alloc)); for (rm = s->registered_methods; rm; rm = rm->next) { grpc_core::ExternallyManagedSlice host; - grpc_core::ExternallyManagedSlice method(rm->method); - const bool has_host = rm->host != nullptr; + grpc_core::ExternallyManagedSlice method(rm->method.c_str()); + const bool has_host = !rm->host.empty(); if (has_host) { - host = grpc_core::ExternallyManagedSlice(rm->host); + host = grpc_core::ExternallyManagedSlice(rm->host.c_str()); } hash = GRPC_MDSTR_KV_HASH(has_host ? host.Hash() : 0, method.Hash()); for (probes = 0; chand->registered_methods[(hash + probes) % slots] From cfbeb3edd78629bf231a426bba95ee655450eb9c Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Thu, 23 Apr 2020 16:15:02 +0200 Subject: [PATCH 591/758] Fix wrong error handling logic in php's build_interop.sh If [[ "$DONE" != 1 ]] && echo "Failed to do composer install" && exit 1 is at the end of a shell script, even if DONE is 1, this will return with error exit status. That's because [[ $DONE != 1 ]] has exitcode 1 and thus anything after && doesn't get executed and the entire scripts exits the last exit code it seen (which is 1). --- .../interoptest/grpc_interop_php/build_interop.sh | 9 ++++++--- .../interoptest/grpc_interop_php7/build_interop.sh | 10 +++++++--- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/tools/dockerfile/interoptest/grpc_interop_php/build_interop.sh b/tools/dockerfile/interoptest/grpc_interop_php/build_interop.sh index d613d55c9cd..bce6c12f280 100755 --- a/tools/dockerfile/interoptest/grpc_interop_php/build_interop.sh +++ b/tools/dockerfile/interoptest/grpc_interop_php/build_interop.sh @@ -40,8 +40,11 @@ cd src/php DONE=0 for ((i = 0; i < 5; i++)); do - php -d extension=ext/grpc/modules/grpc.so /usr/local/bin/composer install && DONE=1 - [[ "$DONE" == 1 ]] && break + php -d extension=ext/grpc/modules/grpc.so /usr/local/bin/composer install && DONE=1 && break done -[[ "$DONE" != 1 ]] && echo "Failed to do composer install" && exit 1 +if [ "$DONE" != "1" ] +then + echo "Failed to do composer install" + exit 1 +fi diff --git a/tools/dockerfile/interoptest/grpc_interop_php7/build_interop.sh b/tools/dockerfile/interoptest/grpc_interop_php7/build_interop.sh index ab7eface1ef..26a49be6300 100755 --- a/tools/dockerfile/interoptest/grpc_interop_php7/build_interop.sh +++ b/tools/dockerfile/interoptest/grpc_interop_php7/build_interop.sh @@ -40,7 +40,11 @@ cd src/php DONE=0 for ((i = 0; i < 5; i++)); do - php -d extension=ext/grpc/modules/grpc.so /usr/local/bin/composer install && DONE=1 - [[ "$DONE" == 1 ]] && break + php -d extension=ext/grpc/modules/grpc.so /usr/local/bin/composer install && DONE=1 && break done -[[ "$DONE" != 1 ]] && echo "Failed to do composer install" && exit 1 + +if [ "$DONE" != "1" ] +then + echo "Failed to do composer install" + exit 1 +fi From 635e7a2088bd82fcc32e4154a354bcd1e4ddc2b5 Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Thu, 23 Apr 2020 12:02:59 -0400 Subject: [PATCH 592/758] dont run resource_quota_server test case under epoll1 --- test/core/end2end/generate_tests.bzl | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/test/core/end2end/generate_tests.bzl b/test/core/end2end/generate_tests.bzl index 83a2541a14b..7eabb251413 100755 --- a/test/core/end2end/generate_tests.bzl +++ b/test/core/end2end/generate_tests.bzl @@ -64,7 +64,6 @@ END2END_FIXTURES = { fullstack = False, client_channel = False, _platforms = ["linux", "mac", "posix"], - flaky_tests = ["resource_quota_server"], # TODO(b/151212019) ), "h2_full": _fixture_options(), "h2_full+pipe": _fixture_options(_platforms = ["linux"]), @@ -96,7 +95,6 @@ END2END_FIXTURES = { secure = True, dns_resolver = False, _platforms = ["linux", "mac", "posix"], - flaky_tests = ["resource_quota_server"], # TODO(b/151212019) ), "h2_local_ipv4": _fixture_options(secure = True, dns_resolver = False, _platforms = ["linux", "mac", "posix"]), "h2_local_ipv6": _fixture_options(secure = True, dns_resolver = False, _platforms = ["linux", "mac", "posix"]), @@ -104,7 +102,6 @@ END2END_FIXTURES = { "h2_uds": _fixture_options( dns_resolver = False, _platforms = ["linux", "mac", "posix"], - flaky_tests = ["resource_quota_server"], # TODO(b/151212019) ), "inproc": _fixture_options( secure = True, @@ -133,7 +130,6 @@ END2END_NOSEC_FIXTURES = { secure = False, _platforms = ["linux", "mac", "posix"], supports_msvc = False, - flaky_tests = ["resource_quota_server"], # TODO(b/151212019) ), "h2_full": _fixture_options(secure = False), "h2_full+pipe": _fixture_options(secure = False, _platforms = ["linux"], supports_msvc = False), @@ -168,7 +164,6 @@ END2END_NOSEC_FIXTURES = { _platforms = ["linux", "mac", "posix"], secure = False, supports_msvc = False, - flaky_tests = ["resource_quota_server"], # TODO(b/151212019) ), } @@ -184,7 +179,8 @@ def _test_options( needs_proxy_auth = False, needs_write_buffering = False, needs_client_channel = False, - short_name = None): + short_name = None, + exclude_pollers = []): return struct( needs_fullstack = needs_fullstack, needs_dns = needs_dns, @@ -198,6 +194,7 @@ def _test_options( needs_write_buffering = needs_write_buffering, needs_client_channel = needs_client_channel, short_name = short_name, + exclude_pollers = exclude_pollers, ) # maps test names to options @@ -205,7 +202,11 @@ END2END_TESTS = { "bad_hostname": _test_options(needs_names = True), "bad_ping": _test_options(needs_fullstack = True, proxyable = False), "binary_metadata": _test_options(), - "resource_quota_server": _test_options(proxyable = False), + "resource_quota_server": _test_options( + proxyable = False, + # TODO(b/151212019): Test case known to be flaky under epoll1. + exclude_pollers = ["epoll1"], + ), "call_creds": _test_options(secure = True), "call_host_override": _test_options( needs_fullstack = True, @@ -466,6 +467,8 @@ def grpc_end2end_tests(): ) for poller in POLLERS: + if poller in topt.exclude_pollers: + continue native.sh_test( name = "%s_test@%s@poller=%s" % (f, test_short_name, poller), data = [":%s_test" % f], @@ -542,6 +545,8 @@ def grpc_end2end_nosec_tests(): ) for poller in POLLERS: + if poller in topt.exclude_pollers: + continue native.sh_test( name = "%s_nosec_test@%s@poller=%s" % (f, test_short_name, poller), data = [":%s_nosec_test" % f], From a7d9865961314fe5bb25734275c149a604ea5aa9 Mon Sep 17 00:00:00 2001 From: Donna Dionne Date: Thu, 23 Apr 2020 10:10:07 -0700 Subject: [PATCH 593/758] Fixing xds_end2endtest.cc BackendsRestart flake test Increase the number of RPCs after shutdown to ensure all backends are down before restarting. --- test/cpp/end2end/xds_end2end_test.cc | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/test/cpp/end2end/xds_end2end_test.cc b/test/cpp/end2end/xds_end2end_test.cc index 9a4befb0388..9b6999639ac 100644 --- a/test/cpp/end2end/xds_end2end_test.cc +++ b/test/cpp/end2end/xds_end2end_test.cc @@ -1805,7 +1805,16 @@ TEST_P(BasicTest, BackendsRestart) { WaitForAllBackends(); // Stop backends. RPCs should fail. ShutdownAllBackends(); - CheckRpcSendFailure(); + // Sending multiple failed requests instead of just one to ensure that the + // client notices that all backends are down before we restart them. If we + // didn't do this, then a single RPC could fail here due to the race condition + // between the LB pick and the GOAWAY from the chosen backend being shut down, + // which would not actually prove that the client noticed that all of the + // backends are down. Then, when we send another request below (which we + // expect to succeed), if the callbacks happen in the wrong order, the same + // race condition could happen again due to the client not yet having noticed + // that the backends were all down. + CheckRpcSendFailure(num_backends_); // Restart all backends. RPCs should start succeeding again. StartAllBackends(); CheckRpcSendOk(1, RpcOptions().set_timeout_ms(2000).set_wait_for_ready(true)); From dc3eb43ae6753003c8d57fcfb4682cb0658df9d4 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Thu, 23 Apr 2020 10:22:34 -0700 Subject: [PATCH 594/758] It might be experimental --- doc/python/sphinx/glossary.rst | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/doc/python/sphinx/glossary.rst b/doc/python/sphinx/glossary.rst index 8fdccd756f2..fe7be23ffcb 100644 --- a/doc/python/sphinx/glossary.rst +++ b/doc/python/sphinx/glossary.rst @@ -42,8 +42,8 @@ Glossary channel_arguments A list of key-value pairs to configure the underlying gRPC Core channel or - server object. Channel arguments are meant for advanced usages. Full list - channel arguments can be found under the "grpc_arg_keys" section of - "grpc_types.h" header file (|grpc_types_link|). For example, if you want to - disable TCP port reuse, you may construct channel arguments like: ``options - = (('grpc.so_reuseport', 0),)``. + server object. Channel arguments are meant for advanced usages and contain + experimental API. Full list channel arguments can be found under the + "grpc_arg_keys" section of "grpc_types.h" header file (|grpc_types_link|). + For example, if you want to disable TCP port reuse, you may construct + channel arguments like: ``options = (('grpc.so_reuseport', 0),)``. From 1cd6e868458c9ea20850dabdc2247d88a6b238c4 Mon Sep 17 00:00:00 2001 From: "Mark D. Roth" Date: Thu, 23 Apr 2020 11:19:21 -0700 Subject: [PATCH 595/758] Fix size_t range problem in weighted_target LB parsing code. --- .../lb_policy/weighted_target/weighted_target.cc | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc b/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc index a319c40cd31..a734ccdc477 100644 --- a/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +++ b/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc @@ -676,14 +676,15 @@ class WeightedTargetLbFactory : public LoadBalancingPolicyFactory { error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( "field:weight error:must be of type number")); } else { - child_config->weight = - gpr_parse_nonnegative_int(it->second.string_value().c_str()); - if (child_config->weight == -1) { + int weight = gpr_parse_nonnegative_int(it->second.string_value().c_str()); + if (weight == -1) { error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( "field:weight error:unparseable value")); - } else if (child_config->weight == 0) { + } else if (weight == 0) { error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( "field:weight error:value must be greater than zero")); + } else { + child_config->weight = weight; } } // Child policy. From 457f1b2699cd8e35a36a94f8d59c34c54c6e04d6 Mon Sep 17 00:00:00 2001 From: "Mark D. Roth" Date: Thu, 23 Apr 2020 11:22:36 -0700 Subject: [PATCH 596/758] Remove RefCountedPtrLess. --- src/core/ext/filters/client_channel/client_channel.cc | 3 +-- src/core/lib/gprpp/map.h | 8 -------- src/core/lib/gprpp/ref_counted_ptr.h | 5 +++++ 3 files changed, 6 insertions(+), 10 deletions(-) diff --git a/src/core/ext/filters/client_channel/client_channel.cc b/src/core/ext/filters/client_channel/client_channel.cc index aea8e00a501..d7004551400 100644 --- a/src/core/ext/filters/client_channel/client_channel.cc +++ b/src/core/ext/filters/client_channel/client_channel.cc @@ -305,8 +305,7 @@ class ChannelData { // Pending ConnectedSubchannel updates for each SubchannelWrapper. // Updates are queued here in the control plane work_serializer and then // applied in the data plane mutex when the picker is updated. - std::map, RefCountedPtr, - RefCountedPtrLess> + std::map, RefCountedPtr> pending_subchannel_updates_; // diff --git a/src/core/lib/gprpp/map.h b/src/core/lib/gprpp/map.h index 033b861c77f..f14f3f6fc84 100644 --- a/src/core/lib/gprpp/map.h +++ b/src/core/lib/gprpp/map.h @@ -46,14 +46,6 @@ struct StringLess { } }; -template -struct RefCountedPtrLess { - bool operator()(const RefCountedPtr& p1, - const RefCountedPtr& p2) const { - return p1.get() < p2.get(); - } -}; - } // namespace grpc_core #endif /* GRPC_CORE_LIB_GPRPP_MAP_H */ diff --git a/src/core/lib/gprpp/ref_counted_ptr.h b/src/core/lib/gprpp/ref_counted_ptr.h index 4c5b46538a8..179491b22c2 100644 --- a/src/core/lib/gprpp/ref_counted_ptr.h +++ b/src/core/lib/gprpp/ref_counted_ptr.h @@ -182,6 +182,11 @@ inline RefCountedPtr MakeRefCounted(Args&&... args) { return RefCountedPtr(new T(std::forward(args)...)); } +template +bool operator<(const RefCountedPtr& p1, const RefCountedPtr& p2) { + return p1.get() < p2.get(); +} + } // namespace grpc_core #endif /* GRPC_CORE_LIB_GPRPP_REF_COUNTED_PTR_H */ From 09b42371e7f8ff992bf82d353bf269c8d6411f6f Mon Sep 17 00:00:00 2001 From: "Mark D. Roth" Date: Thu, 23 Apr 2020 11:24:41 -0700 Subject: [PATCH 597/758] Remove grpc_core::InlinedVector<> and grpc_core::Optional<>. --- BUILD | 36 ++----------- BUILD.gn | 2 - CMakeLists.txt | 39 --------------- Makefile | 48 ------------------ build_autogenerated.yaml | 17 ------- gRPC-C++.podspec | 4 -- gRPC-Core.podspec | 4 -- grpc.gemspec | 2 - package.xml | 2 - .../filters/client_channel/client_channel.cc | 8 +-- .../client_channel/lb_policy/grpclb/grpclb.cc | 8 +-- .../lb_policy/grpclb/grpclb_channel_secure.cc | 6 ++- .../lb_policy/grpclb/grpclb_client_stats.h | 5 +- .../lb_policy/round_robin/round_robin.cc | 2 +- .../lb_policy/subchannel_list.h | 7 +-- .../weighted_target/weighted_target.cc | 6 +-- .../client_channel/lb_policy_registry.cc | 6 ++- .../resolver/dns/c_ares/dns_resolver_ares.cc | 6 ++- .../resolver/dns/c_ares/grpc_ares_wrapper.cc | 4 +- .../client_channel/resolver_registry.cc | 4 +- .../client_channel/resolver_registry.h | 1 - .../client_channel/resolver_result_parsing.cc | 8 +-- .../client_channel/resolver_result_parsing.h | 15 +++--- .../client_channel/resolving_lb_policy.cc | 1 - .../client_channel/resolving_lb_policy.h | 5 +- .../filters/client_channel/server_address.h | 5 +- .../filters/client_channel/service_config.cc | 6 +-- .../filters/client_channel/service_config.h | 10 ++-- .../ext/filters/client_channel/xds/xds_api.cc | 1 - .../ext/filters/client_channel/xds/xds_api.h | 5 +- .../client_channel/xds/xds_bootstrap.cc | 16 +++--- .../client_channel/xds/xds_bootstrap.h | 7 +-- .../client_channel/xds/xds_channel_secure.cc | 6 ++- .../filters/client_channel/xds/xds_client.cc | 3 +- .../client_channel/xds/xds_client_stats.h | 1 - src/core/lib/channel/channelz.h | 5 +- src/core/lib/channel/channelz_registry.cc | 8 +-- src/core/lib/channel/handshaker.h | 6 ++- src/core/lib/channel/handshaker_registry.cc | 5 +- src/core/lib/gprpp/inlined_vector.h | 37 -------------- src/core/lib/gprpp/optional.h | 33 ------------ src/core/lib/iomgr/buffer_list.h | 43 ++++++++-------- src/core/lib/iomgr/call_combiner.h | 5 +- src/core/lib/iomgr/error.h | 1 - src/core/lib/iomgr/udp_server.cc | 5 +- .../composite/composite_credentials.h | 6 +-- .../credentials/oauth2/oauth2_credentials.cc | 5 +- .../tls/grpc_tls_credentials_options.h | 6 +-- .../load_system_roots_linux.cc | 5 +- src/cpp/common/tls_credentials_options.cc | 7 ++- .../common/tls_credentials_options_util.cc | 6 ++- .../resolvers/fake_resolver_test.cc | 2 +- test/core/end2end/fixtures/h2_tls.cc | 5 +- test/core/gprpp/BUILD | 13 ----- test/core/gprpp/optional_test.cc | 50 ------------------- test/cpp/client/credentials_test.cc | 7 ++- tools/doxygen/Doxyfile.c++.internal | 2 - tools/doxygen/Doxyfile.core.internal | 2 - tools/run_tests/generated/tests.json | 24 --------- 59 files changed, 165 insertions(+), 429 deletions(-) delete mode 100644 src/core/lib/gprpp/inlined_vector.h delete mode 100644 src/core/lib/gprpp/optional.h delete mode 100644 test/core/gprpp/optional_test.cc diff --git a/BUILD b/BUILD index 7fcd4a55f5d..91cd3488408 100644 --- a/BUILD +++ b/BUILD @@ -618,40 +618,12 @@ grpc_cc_library( ], ) -grpc_cc_library( - name = "inlined_vector", - external_deps = [ - "absl/container:inlined_vector", - ], - language = "c++", - public_hdrs = [ - "src/core/lib/gprpp/inlined_vector.h", - ], - deps = [ - "gpr_base", - ], -) - grpc_cc_library( name = "debug_location", language = "c++", public_hdrs = ["src/core/lib/gprpp/debug_location.h"], ) -grpc_cc_library( - name = "optional", - external_deps = [ - "absl/types:optional", - ], - language = "c++", - public_hdrs = [ - "src/core/lib/gprpp/optional.h", - ], - deps = [ - "gpr_base", - ], -) - grpc_cc_library( name = "orphanable", language = "c++", @@ -990,6 +962,8 @@ grpc_cc_library( ], external_deps = [ "madler_zlib", + "absl/container:inlined_vector", + "absl/types:optional", ], language = "c++", public_hdrs = GRPC_PUBLIC_HDRS, @@ -998,8 +972,6 @@ grpc_cc_library( "gpr_base", "grpc_codegen", "grpc_trace", - "inlined_vector", - "optional", "orphanable", "ref_counted", "ref_counted_ptr", @@ -1107,6 +1079,9 @@ grpc_cc_library( "src/core/ext/filters/client_channel/subchannel_interface.h", "src/core/ext/filters/client_channel/subchannel_pool_interface.h", ], + external_deps = [ + "absl/container:inlined_vector", + ], language = "c++", deps = [ "gpr_base", @@ -1114,7 +1089,6 @@ grpc_cc_library( "grpc_client_authority_filter", "grpc_deadline_filter", "grpc_health_upb", - "inlined_vector", "orphanable", "ref_counted", "ref_counted_ptr", diff --git a/BUILD.gn b/BUILD.gn index 6c3db9ac4b7..9ec801e373c 100644 --- a/BUILD.gn +++ b/BUILD.gn @@ -570,8 +570,6 @@ config("grpc_config") { "src/core/lib/debug/trace.h", "src/core/lib/gprpp/atomic.h", "src/core/lib/gprpp/debug_location.h", - "src/core/lib/gprpp/inlined_vector.h", - "src/core/lib/gprpp/optional.h", "src/core/lib/gprpp/orphanable.h", "src/core/lib/gprpp/ref_counted.h", "src/core/lib/gprpp/ref_counted_ptr.h", diff --git a/CMakeLists.txt b/CMakeLists.txt index 17ed31d4910..a82784d07db 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -756,7 +756,6 @@ if(gRPC_BUILD_TESTS) add_dependencies(buildtests_cxx mock_test) add_dependencies(buildtests_cxx nonblocking_test) add_dependencies(buildtests_cxx noop-benchmark) - add_dependencies(buildtests_cxx optional_test) add_dependencies(buildtests_cxx orphanable_test) add_dependencies(buildtests_cxx out_of_bounds_bad_client_test) add_dependencies(buildtests_cxx pid_controller_test) @@ -12166,44 +12165,6 @@ target_link_libraries(noop-benchmark ) -endif() -if(gRPC_BUILD_TESTS) - -add_executable(optional_test - test/core/gprpp/optional_test.cc - third_party/googletest/googletest/src/gtest-all.cc - third_party/googletest/googlemock/src/gmock-all.cc -) - -target_include_directories(optional_test - PRIVATE - ${CMAKE_CURRENT_SOURCE_DIR} - ${CMAKE_CURRENT_SOURCE_DIR}/include - ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} - ${_gRPC_SSL_INCLUDE_DIR} - ${_gRPC_UPB_GENERATED_DIR} - ${_gRPC_UPB_GRPC_GENERATED_DIR} - ${_gRPC_UPB_INCLUDE_DIR} - ${_gRPC_ZLIB_INCLUDE_DIR} - third_party/googletest/googletest/include - third_party/googletest/googletest - third_party/googletest/googlemock/include - third_party/googletest/googlemock - ${_gRPC_PROTO_GENS_DIR} -) - -target_link_libraries(optional_test - ${_gRPC_PROTOBUF_LIBRARIES} - ${_gRPC_ALLTARGETS_LIBRARIES} - grpc_test_util - grpc - gpr - address_sorting - upb - ${_gRPC_GFLAGS_LIBRARIES} -) - - endif() if(gRPC_BUILD_TESTS) diff --git a/Makefile b/Makefile index 883745259c5..1ccc7e99fd5 100644 --- a/Makefile +++ b/Makefile @@ -1251,7 +1251,6 @@ nanopb_fuzzer_response_test: $(BINDIR)/$(CONFIG)/nanopb_fuzzer_response_test nanopb_fuzzer_serverlist_test: $(BINDIR)/$(CONFIG)/nanopb_fuzzer_serverlist_test nonblocking_test: $(BINDIR)/$(CONFIG)/nonblocking_test noop-benchmark: $(BINDIR)/$(CONFIG)/noop-benchmark -optional_test: $(BINDIR)/$(CONFIG)/optional_test orphanable_test: $(BINDIR)/$(CONFIG)/orphanable_test out_of_bounds_bad_client_test: $(BINDIR)/$(CONFIG)/out_of_bounds_bad_client_test percent_decode_fuzzer: $(BINDIR)/$(CONFIG)/percent_decode_fuzzer @@ -1616,7 +1615,6 @@ buildtests_cxx: privatelibs_cxx \ $(BINDIR)/$(CONFIG)/mock_test \ $(BINDIR)/$(CONFIG)/nonblocking_test \ $(BINDIR)/$(CONFIG)/noop-benchmark \ - $(BINDIR)/$(CONFIG)/optional_test \ $(BINDIR)/$(CONFIG)/orphanable_test \ $(BINDIR)/$(CONFIG)/out_of_bounds_bad_client_test \ $(BINDIR)/$(CONFIG)/pid_controller_test \ @@ -1774,7 +1772,6 @@ buildtests_cxx: privatelibs_cxx \ $(BINDIR)/$(CONFIG)/mock_test \ $(BINDIR)/$(CONFIG)/nonblocking_test \ $(BINDIR)/$(CONFIG)/noop-benchmark \ - $(BINDIR)/$(CONFIG)/optional_test \ $(BINDIR)/$(CONFIG)/orphanable_test \ $(BINDIR)/$(CONFIG)/out_of_bounds_bad_client_test \ $(BINDIR)/$(CONFIG)/pid_controller_test \ @@ -2276,8 +2273,6 @@ test_cxx: buildtests_cxx $(Q) $(BINDIR)/$(CONFIG)/nonblocking_test || ( echo test nonblocking_test failed ; exit 1 ) $(E) "[RUN] Testing noop-benchmark" $(Q) $(BINDIR)/$(CONFIG)/noop-benchmark || ( echo test noop-benchmark failed ; exit 1 ) - $(E) "[RUN] Testing optional_test" - $(Q) $(BINDIR)/$(CONFIG)/optional_test || ( echo test optional_test failed ; exit 1 ) $(E) "[RUN] Testing orphanable_test" $(Q) $(BINDIR)/$(CONFIG)/orphanable_test || ( echo test orphanable_test failed ; exit 1 ) $(E) "[RUN] Testing out_of_bounds_bad_client_test" @@ -16213,49 +16208,6 @@ endif endif -OPTIONAL_TEST_SRC = \ - test/core/gprpp/optional_test.cc \ - -OPTIONAL_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(OPTIONAL_TEST_SRC)))) -ifeq ($(NO_SECURE),true) - -# You can't build secure targets if you don't have OpenSSL. - -$(BINDIR)/$(CONFIG)/optional_test: openssl_dep_error - -else - - - - -ifeq ($(NO_PROTOBUF),true) - -# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. - -$(BINDIR)/$(CONFIG)/optional_test: protobuf_dep_error - -else - -$(BINDIR)/$(CONFIG)/optional_test: $(PROTOBUF_DEP) $(OPTIONAL_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a - $(E) "[LD] Linking $@" - $(Q) mkdir -p `dirname $@` - $(Q) $(LDXX) $(LDFLAGS) $(OPTIONAL_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/optional_test - -endif - -endif - -$(OBJDIR)/$(CONFIG)/test/core/gprpp/optional_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a - -deps_optional_test: $(OPTIONAL_TEST_OBJS:.o=.dep) - -ifneq ($(NO_SECURE),true) -ifneq ($(NO_DEPS),true) --include $(OPTIONAL_TEST_OBJS:.o=.dep) -endif -endif - - ORPHANABLE_TEST_SRC = \ test/core/gprpp/orphanable_test.cc \ diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml index ca226638154..d01ff14cc58 100644 --- a/build_autogenerated.yaml +++ b/build_autogenerated.yaml @@ -548,8 +548,6 @@ libs: - src/core/lib/debug/trace.h - src/core/lib/gprpp/atomic.h - src/core/lib/gprpp/debug_location.h - - src/core/lib/gprpp/inlined_vector.h - - src/core/lib/gprpp/optional.h - src/core/lib/gprpp/orphanable.h - src/core/lib/gprpp/ref_counted.h - src/core/lib/gprpp/ref_counted_ptr.h @@ -1451,8 +1449,6 @@ libs: - src/core/lib/debug/trace.h - src/core/lib/gprpp/atomic.h - src/core/lib/gprpp/debug_location.h - - src/core/lib/gprpp/inlined_vector.h - - src/core/lib/gprpp/optional.h - src/core/lib/gprpp/orphanable.h - src/core/lib/gprpp/ref_counted.h - src/core/lib/gprpp/ref_counted_ptr.h @@ -6538,19 +6534,6 @@ targets: - benchmark benchmark: true defaults: benchmark -- name: optional_test - gtest: true - build: test - language: c++ - headers: [] - src: - - test/core/gprpp/optional_test.cc - deps: - - grpc_test_util - - grpc - - gpr - - address_sorting - - upb - name: orphanable_test gtest: true build: test diff --git a/gRPC-C++.podspec b/gRPC-C++.podspec index 612090f465c..77e015d1d97 100644 --- a/gRPC-C++.podspec +++ b/gRPC-C++.podspec @@ -418,12 +418,10 @@ Pod::Spec.new do |s| 'src/core/lib/gprpp/global_config_env.h', 'src/core/lib/gprpp/global_config_generic.h', 'src/core/lib/gprpp/host_port.h', - 'src/core/lib/gprpp/inlined_vector.h', 'src/core/lib/gprpp/manual_constructor.h', 'src/core/lib/gprpp/map.h', 'src/core/lib/gprpp/memory.h', 'src/core/lib/gprpp/mpscq.h', - 'src/core/lib/gprpp/optional.h', 'src/core/lib/gprpp/orphanable.h', 'src/core/lib/gprpp/ref_counted.h', 'src/core/lib/gprpp/ref_counted_ptr.h', @@ -870,12 +868,10 @@ Pod::Spec.new do |s| 'src/core/lib/gprpp/global_config_env.h', 'src/core/lib/gprpp/global_config_generic.h', 'src/core/lib/gprpp/host_port.h', - 'src/core/lib/gprpp/inlined_vector.h', 'src/core/lib/gprpp/manual_constructor.h', 'src/core/lib/gprpp/map.h', 'src/core/lib/gprpp/memory.h', 'src/core/lib/gprpp/mpscq.h', - 'src/core/lib/gprpp/optional.h', 'src/core/lib/gprpp/orphanable.h', 'src/core/lib/gprpp/ref_counted.h', 'src/core/lib/gprpp/ref_counted_ptr.h', diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec index b2595ac1ce4..a9c11d7d933 100644 --- a/gRPC-Core.podspec +++ b/gRPC-Core.podspec @@ -610,13 +610,11 @@ Pod::Spec.new do |s| 'src/core/lib/gprpp/global_config_generic.h', 'src/core/lib/gprpp/host_port.cc', 'src/core/lib/gprpp/host_port.h', - 'src/core/lib/gprpp/inlined_vector.h', 'src/core/lib/gprpp/manual_constructor.h', 'src/core/lib/gprpp/map.h', 'src/core/lib/gprpp/memory.h', 'src/core/lib/gprpp/mpscq.cc', 'src/core/lib/gprpp/mpscq.h', - 'src/core/lib/gprpp/optional.h', 'src/core/lib/gprpp/orphanable.h', 'src/core/lib/gprpp/ref_counted.h', 'src/core/lib/gprpp/ref_counted_ptr.h', @@ -1226,12 +1224,10 @@ Pod::Spec.new do |s| 'src/core/lib/gprpp/global_config_env.h', 'src/core/lib/gprpp/global_config_generic.h', 'src/core/lib/gprpp/host_port.h', - 'src/core/lib/gprpp/inlined_vector.h', 'src/core/lib/gprpp/manual_constructor.h', 'src/core/lib/gprpp/map.h', 'src/core/lib/gprpp/memory.h', 'src/core/lib/gprpp/mpscq.h', - 'src/core/lib/gprpp/optional.h', 'src/core/lib/gprpp/orphanable.h', 'src/core/lib/gprpp/ref_counted.h', 'src/core/lib/gprpp/ref_counted_ptr.h', diff --git a/grpc.gemspec b/grpc.gemspec index c6faf7095f6..7042206375a 100644 --- a/grpc.gemspec +++ b/grpc.gemspec @@ -532,13 +532,11 @@ Gem::Specification.new do |s| s.files += %w( src/core/lib/gprpp/global_config_generic.h ) s.files += %w( src/core/lib/gprpp/host_port.cc ) s.files += %w( src/core/lib/gprpp/host_port.h ) - s.files += %w( src/core/lib/gprpp/inlined_vector.h ) s.files += %w( src/core/lib/gprpp/manual_constructor.h ) s.files += %w( src/core/lib/gprpp/map.h ) s.files += %w( src/core/lib/gprpp/memory.h ) s.files += %w( src/core/lib/gprpp/mpscq.cc ) s.files += %w( src/core/lib/gprpp/mpscq.h ) - s.files += %w( src/core/lib/gprpp/optional.h ) s.files += %w( src/core/lib/gprpp/orphanable.h ) s.files += %w( src/core/lib/gprpp/ref_counted.h ) s.files += %w( src/core/lib/gprpp/ref_counted_ptr.h ) diff --git a/package.xml b/package.xml index adc859441ee..862ea4f566c 100644 --- a/package.xml +++ b/package.xml @@ -512,13 +512,11 @@ - - diff --git a/src/core/ext/filters/client_channel/client_channel.cc b/src/core/ext/filters/client_channel/client_channel.cc index aea8e00a501..a00bdd6fdb6 100644 --- a/src/core/ext/filters/client_channel/client_channel.cc +++ b/src/core/ext/filters/client_channel/client_channel.cc @@ -33,6 +33,9 @@ #include #include +#include "absl/container/inlined_vector.h" +#include "absl/types/optional.h" + #include "src/core/ext/filters/client_channel/backend_metric.h" #include "src/core/ext/filters/client_channel/backup_poller.h" #include "src/core/ext/filters/client_channel/global_subchannel_pool.h" @@ -52,7 +55,6 @@ #include "src/core/lib/channel/connected_channel.h" #include "src/core/lib/channel/status_util.h" #include "src/core/lib/gpr/string.h" -#include "src/core/lib/gprpp/inlined_vector.h" #include "src/core/lib/gprpp/manual_constructor.h" #include "src/core/lib/gprpp/map.h" #include "src/core/lib/gprpp/sync.h" @@ -827,7 +829,7 @@ class CallData { // Note: We inline the cache for the first 3 send_message ops and use // dynamic allocation after that. This number was essentially picked // at random; it could be changed in the future to tune performance. - InlinedVector send_messages_; + absl::InlinedVector send_messages_; // send_trailing_metadata bool seen_send_trailing_metadata_ = false; grpc_linked_mdelem* send_trailing_metadata_storage_ = nullptr; @@ -1726,7 +1728,7 @@ bool ChannelData::ProcessResolverResultLocked( chand->received_first_resolver_result_ = true; RefCountedPtr retry_throttle_data; if (parsed_service_config != nullptr) { - Optional + absl::optional retry_throttle_config = parsed_service_config->retry_throttling(); if (retry_throttle_config.has_value()) { retry_throttle_data = diff --git a/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc b/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc index 9f30e76c9a1..5a7a3840fa7 100644 --- a/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +++ b/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc @@ -64,6 +64,8 @@ #include #include +#include "absl/container/inlined_vector.h" + #include #include #include @@ -555,7 +557,7 @@ ServerAddressList GrpcLb::Serverlist::GetServerAddressList( lb_token[0] = '\0'; } // Add address. - InlinedVector args_to_add; + absl::InlinedVector args_to_add; args_to_add.emplace_back(grpc_channel_arg_pointer_create( const_cast(GRPC_ARG_GRPCLB_ADDRESS_LB_TOKEN), lb_token, &lb_token_arg_vtable)); @@ -1273,7 +1275,7 @@ grpc_channel_args* BuildBalancerChannelArgs( GRPC_ARG_CHANNELZ_CHANNEL_NODE, }; // Channel args to add. - InlinedVector args_to_add; + absl::InlinedVector args_to_add; // The fake resolver response generator, which we use to inject // address updates into the LB channel. args_to_add.emplace_back( @@ -1595,7 +1597,7 @@ void GrpcLb::OnFallbackTimerLocked(grpc_error* error) { grpc_channel_args* GrpcLb::CreateChildPolicyArgsLocked( bool is_backend_from_grpclb_load_balancer) { - InlinedVector args_to_add; + absl::InlinedVector args_to_add; args_to_add.emplace_back(grpc_channel_arg_integer_create( const_cast(GRPC_ARG_ADDRESS_IS_BACKEND_FROM_GRPCLB_LOAD_BALANCER), is_backend_from_grpclb_load_balancer)); diff --git a/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc b/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc index 414f8274317..92cf17ac751 100644 --- a/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +++ b/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc @@ -22,6 +22,8 @@ #include +#include "absl/container/inlined_vector.h" + #include #include #include @@ -71,8 +73,8 @@ RefCountedPtr CreateTargetAuthorityTable( grpc_channel_args* ModifyGrpclbBalancerChannelArgs( const ServerAddressList& addresses, grpc_channel_args* args) { - InlinedVector args_to_remove; - InlinedVector args_to_add; + absl::InlinedVector args_to_remove; + absl::InlinedVector args_to_add; // Add arg for targets info table. RefCountedPtr target_authority_table = CreateTargetAuthorityTable(addresses); diff --git a/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h b/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h index 4b1c0046bf0..f6e9440d3ee 100644 --- a/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +++ b/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h @@ -23,7 +23,8 @@ #include -#include "src/core/lib/gprpp/inlined_vector.h" +#include "absl/container/inlined_vector.h" + #include "src/core/lib/gprpp/memory.h" #include "src/core/lib/gprpp/ref_counted.h" #include "src/core/lib/gprpp/sync.h" @@ -40,7 +41,7 @@ class GrpcLbClientStats : public RefCounted { : token(std::move(token)), count(count) {} }; - typedef InlinedVector DroppedCallCounts; + typedef absl::InlinedVector DroppedCallCounts; void AddCallStarted(); void AddCallFinished(bool finished_with_client_failed_to_send, diff --git a/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc b/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc index a5ab488ec55..56b71b69dfc 100644 --- a/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +++ b/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc @@ -160,7 +160,7 @@ class RoundRobin : public LoadBalancingPolicy { RoundRobin* parent_; size_t last_picked_index_; - InlinedVector, 10> subchannels_; + absl::InlinedVector, 10> subchannels_; }; void ShutdownLocked() override; diff --git a/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h b/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h index 0fa4871b707..93c5deb7957 100644 --- a/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +++ b/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h @@ -25,6 +25,8 @@ #include +#include "absl/container/inlined_vector.h" + #include "src/core/ext/filters/client_channel/lb_policy_registry.h" #include "src/core/ext/filters/client_channel/server_address.h" // TODO(roth): Should not need the include of subchannel.h here, since @@ -33,7 +35,6 @@ #include "src/core/ext/filters/client_channel/subchannel_interface.h" #include "src/core/lib/channel/channel_args.h" #include "src/core/lib/debug/trace.h" -#include "src/core/lib/gprpp/inlined_vector.h" #include "src/core/lib/gprpp/orphanable.h" #include "src/core/lib/gprpp/ref_counted.h" #include "src/core/lib/gprpp/ref_counted_ptr.h" @@ -172,7 +173,7 @@ class SubchannelData { template class SubchannelList : public InternallyRefCounted { public: - typedef InlinedVector SubchannelVector; + typedef absl::InlinedVector SubchannelVector; // The number of subchannels in the list. size_t num_subchannels() const { return subchannels_.size(); } @@ -370,7 +371,7 @@ SubchannelList::SubchannelList( GRPC_ARG_SERVICE_CONFIG}; // Create a subchannel for each address. for (size_t i = 0; i < addresses.size(); i++) { - InlinedVector args_to_add; + absl::InlinedVector args_to_add; const size_t subchannel_address_arg_index = args_to_add.size(); args_to_add.emplace_back( Subchannel::CreateSubchannelAddressArg(&addresses[i].address())); diff --git a/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc b/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc index 09e72ae72e0..b1dbe3b5694 100644 --- a/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +++ b/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc @@ -20,6 +20,7 @@ #include #include +#include "absl/container/inlined_vector.h" #include "absl/strings/str_cat.h" #include @@ -99,9 +100,8 @@ class WeightedTargetLb : public LoadBalancingPolicy { // ready state. The first element in the pair represents the end of a // range proportional to the child's weight. The start of the range // is the previous value in the vector and is 0 for the first element. - using PickerList = - InlinedVector>, - 1>; + using PickerList = absl::InlinedVector< + std::pair>, 1>; explicit WeightedPicker(PickerList pickers) : pickers_(std::move(pickers)) {} diff --git a/src/core/ext/filters/client_channel/lb_policy_registry.cc b/src/core/ext/filters/client_channel/lb_policy_registry.cc index 498b158900e..806d6b3d8b4 100644 --- a/src/core/ext/filters/client_channel/lb_policy_registry.cc +++ b/src/core/ext/filters/client_channel/lb_policy_registry.cc @@ -22,8 +22,9 @@ #include +#include "absl/container/inlined_vector.h" + #include "src/core/lib/gpr/string.h" -#include "src/core/lib/gprpp/inlined_vector.h" namespace grpc_core { @@ -54,7 +55,8 @@ class RegistryState { } private: - InlinedVector, 10> factories_; + absl::InlinedVector, 10> + factories_; }; RegistryState* g_state = nullptr; diff --git a/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc b/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc index de49ac76f6d..781941bdbb8 100644 --- a/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +++ b/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc @@ -24,6 +24,8 @@ #include #include +#include "absl/container/inlined_vector.h" + #include #include @@ -249,7 +251,7 @@ std::string ChooseServiceConfig(char* service_config_choice_json, return ""; } const Json* service_config = nullptr; - InlinedVector error_list; + absl::InlinedVector error_list; for (const Json& choice : json.array_value()) { if (choice.type() != Json::Type::OBJECT) { error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( @@ -352,7 +354,7 @@ void AresDnsResolver::OnResolvedLocked(grpc_error* error) { service_config_string, &result.service_config_error); } } - InlinedVector new_args; + absl::InlinedVector new_args; if (balancer_addresses_ != nullptr) { new_args.push_back( CreateGrpclbBalancerAddressesArg(balancer_addresses_.get())); diff --git a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc index 54c60072654..32784b0eded 100644 --- a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +++ b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc @@ -26,6 +26,8 @@ #include #include +#include "absl/container/inlined_vector.h" + #include #include #include @@ -200,7 +202,7 @@ static void on_hostbyname_done_locked(void* arg, int status, int /*timeouts*/, } ServerAddressList& addresses = **address_list_ptr; for (size_t i = 0; hostent->h_addr_list[i] != nullptr; ++i) { - grpc_core::InlinedVector args_to_add; + absl::InlinedVector args_to_add; if (hr->is_balancer) { args_to_add.emplace_back( grpc_core::CreateGrpclbBalancerNameArg(hr->host)); diff --git a/src/core/ext/filters/client_channel/resolver_registry.cc b/src/core/ext/filters/client_channel/resolver_registry.cc index 718556a4c2a..c7f78389ac8 100644 --- a/src/core/ext/filters/client_channel/resolver_registry.cc +++ b/src/core/ext/filters/client_channel/resolver_registry.cc @@ -22,6 +22,8 @@ #include +#include "absl/container/inlined_vector.h" + #include #include #include @@ -90,7 +92,7 @@ class RegistryState { // more factories are needed and the additional allocations are // hurting performance (which is unlikely, since these allocations // only occur at gRPC initialization time). - InlinedVector, 10> factories_; + absl::InlinedVector, 10> factories_; grpc_core::UniquePtr default_prefix_; }; diff --git a/src/core/ext/filters/client_channel/resolver_registry.h b/src/core/ext/filters/client_channel/resolver_registry.h index 82025065494..bf34216b2cf 100644 --- a/src/core/ext/filters/client_channel/resolver_registry.h +++ b/src/core/ext/filters/client_channel/resolver_registry.h @@ -22,7 +22,6 @@ #include #include "src/core/ext/filters/client_channel/resolver_factory.h" -#include "src/core/lib/gprpp/inlined_vector.h" #include "src/core/lib/gprpp/memory.h" #include "src/core/lib/gprpp/orphanable.h" #include "src/core/lib/iomgr/pollset_set.h" diff --git a/src/core/ext/filters/client_channel/resolver_result_parsing.cc b/src/core/ext/filters/client_channel/resolver_result_parsing.cc index d87890d1c97..77ee5fad3cd 100644 --- a/src/core/ext/filters/client_channel/resolver_result_parsing.cc +++ b/src/core/ext/filters/client_channel/resolver_result_parsing.cc @@ -24,6 +24,8 @@ #include #include +#include "absl/types/optional.h" + #include #include #include @@ -35,7 +37,6 @@ #include "src/core/lib/channel/status_util.h" #include "src/core/lib/gpr/string.h" #include "src/core/lib/gprpp/memory.h" -#include "src/core/lib/gprpp/optional.h" #include "src/core/lib/uri/uri_parser.h" // As per the retry design, we do not allow more than 5 retry attempts. @@ -318,7 +319,8 @@ ClientChannelServiceConfigParser::ParseGlobalParams(const Json& json, std::vector error_list; RefCountedPtr parsed_lb_config; std::string lb_policy_name; - Optional retry_throttling; + absl::optional + retry_throttling; const char* health_check_service_name = nullptr; // Parse LB config. auto it = json.object_value().find("loadBalancingConfig"); @@ -396,7 +398,7 @@ ClientChannelServiceConfigParser::ParsePerMethodParams(const Json& json, grpc_error** error) { GPR_DEBUG_ASSERT(error != nullptr && *error == GRPC_ERROR_NONE); std::vector error_list; - Optional wait_for_ready; + absl::optional wait_for_ready; grpc_millis timeout = 0; std::unique_ptr retry_policy; // Parse waitForReady. diff --git a/src/core/ext/filters/client_channel/resolver_result_parsing.h b/src/core/ext/filters/client_channel/resolver_result_parsing.h index 1f928cfd551..b38ae730708 100644 --- a/src/core/ext/filters/client_channel/resolver_result_parsing.h +++ b/src/core/ext/filters/client_channel/resolver_result_parsing.h @@ -21,13 +21,14 @@ #include +#include "absl/types/optional.h" + #include "src/core/ext/filters/client_channel/lb_policy.h" #include "src/core/ext/filters/client_channel/lb_policy_factory.h" #include "src/core/ext/filters/client_channel/resolver.h" #include "src/core/ext/filters/client_channel/retry_throttle.h" #include "src/core/ext/filters/client_channel/service_config.h" #include "src/core/lib/channel/status_util.h" -#include "src/core/lib/gprpp/optional.h" #include "src/core/lib/gprpp/ref_counted.h" #include "src/core/lib/gprpp/ref_counted_ptr.h" #include "src/core/lib/iomgr/exec_ctx.h" // for grpc_millis @@ -47,14 +48,14 @@ class ClientChannelGlobalParsedConfig : public ServiceConfig::ParsedConfig { ClientChannelGlobalParsedConfig( RefCountedPtr parsed_lb_config, std::string parsed_deprecated_lb_policy, - const Optional& retry_throttling, + const absl::optional& retry_throttling, const char* health_check_service_name) : parsed_lb_config_(std::move(parsed_lb_config)), parsed_deprecated_lb_policy_(std::move(parsed_deprecated_lb_policy)), retry_throttling_(retry_throttling), health_check_service_name_(health_check_service_name) {} - Optional retry_throttling() const { + absl::optional retry_throttling() const { return retry_throttling_; } @@ -73,7 +74,7 @@ class ClientChannelGlobalParsedConfig : public ServiceConfig::ParsedConfig { private: RefCountedPtr parsed_lb_config_; std::string parsed_deprecated_lb_policy_; - Optional retry_throttling_; + absl::optional retry_throttling_; const char* health_check_service_name_; }; @@ -88,7 +89,7 @@ class ClientChannelMethodParsedConfig : public ServiceConfig::ParsedConfig { }; ClientChannelMethodParsedConfig(grpc_millis timeout, - const Optional& wait_for_ready, + const absl::optional& wait_for_ready, std::unique_ptr retry_policy) : timeout_(timeout), wait_for_ready_(wait_for_ready), @@ -96,13 +97,13 @@ class ClientChannelMethodParsedConfig : public ServiceConfig::ParsedConfig { grpc_millis timeout() const { return timeout_; } - Optional wait_for_ready() const { return wait_for_ready_; } + absl::optional wait_for_ready() const { return wait_for_ready_; } const RetryPolicy* retry_policy() const { return retry_policy_.get(); } private: grpc_millis timeout_ = 0; - Optional wait_for_ready_; + absl::optional wait_for_ready_; std::unique_ptr retry_policy_; }; diff --git a/src/core/ext/filters/client_channel/resolving_lb_policy.cc b/src/core/ext/filters/client_channel/resolving_lb_policy.cc index 851c2f20e9a..f0c29ec0183 100644 --- a/src/core/ext/filters/client_channel/resolving_lb_policy.cc +++ b/src/core/ext/filters/client_channel/resolving_lb_policy.cc @@ -47,7 +47,6 @@ #include "src/core/lib/channel/connected_channel.h" #include "src/core/lib/channel/status_util.h" #include "src/core/lib/gpr/string.h" -#include "src/core/lib/gprpp/inlined_vector.h" #include "src/core/lib/gprpp/manual_constructor.h" #include "src/core/lib/gprpp/sync.h" #include "src/core/lib/iomgr/iomgr.h" diff --git a/src/core/ext/filters/client_channel/resolving_lb_policy.h b/src/core/ext/filters/client_channel/resolving_lb_policy.h index ba53368f219..8a04491424f 100644 --- a/src/core/ext/filters/client_channel/resolving_lb_policy.h +++ b/src/core/ext/filters/client_channel/resolving_lb_policy.h @@ -21,13 +21,14 @@ #include +#include "absl/container/inlined_vector.h" + #include "src/core/ext/filters/client_channel/lb_policy.h" #include "src/core/ext/filters/client_channel/lb_policy_factory.h" #include "src/core/ext/filters/client_channel/resolver.h" #include "src/core/lib/channel/channel_args.h" #include "src/core/lib/channel/channel_stack.h" #include "src/core/lib/debug/trace.h" -#include "src/core/lib/gprpp/inlined_vector.h" #include "src/core/lib/gprpp/orphanable.h" #include "src/core/lib/iomgr/call_combiner.h" #include "src/core/lib/iomgr/closure.h" @@ -80,7 +81,7 @@ class ResolvingLoadBalancingPolicy : public LoadBalancingPolicy { void ResetBackoffLocked() override; private: - using TraceStringVector = InlinedVector; + using TraceStringVector = absl::InlinedVector; class ResolverResultHandler; class ResolvingControlHelper; diff --git a/src/core/ext/filters/client_channel/server_address.h b/src/core/ext/filters/client_channel/server_address.h index 10f49f2f344..f53dd3c7dd5 100644 --- a/src/core/ext/filters/client_channel/server_address.h +++ b/src/core/ext/filters/client_channel/server_address.h @@ -21,8 +21,9 @@ #include +#include "absl/container/inlined_vector.h" + #include "src/core/lib/channel/channel_args.h" -#include "src/core/lib/gprpp/inlined_vector.h" #include "src/core/lib/iomgr/resolve_address.h" namespace grpc_core { @@ -82,7 +83,7 @@ class ServerAddress { // ServerAddressList // -typedef InlinedVector ServerAddressList; +typedef absl::InlinedVector ServerAddressList; } // namespace grpc_core diff --git a/src/core/ext/filters/client_channel/service_config.cc b/src/core/ext/filters/client_channel/service_config.cc index f08ebe1a37d..04ef477204b 100644 --- a/src/core/ext/filters/client_channel/service_config.cc +++ b/src/core/ext/filters/client_channel/service_config.cc @@ -34,8 +34,8 @@ namespace grpc_core { namespace { -typedef InlinedVector, - ServiceConfig::kNumPreallocatedParsers> +typedef absl::InlinedVector, + ServiceConfig::kNumPreallocatedParsers> ServiceConfigParserList; ServiceConfigParserList* g_registered_parsers; } // namespace @@ -100,7 +100,7 @@ grpc_error* ServiceConfig::ParseGlobalParams() { grpc_error* ServiceConfig::ParseJsonMethodConfig(const Json& json) { // Parse method config with each registered parser. auto objs_vector = absl::make_unique(); - InlinedVector error_list; + std::vector error_list; for (size_t i = 0; i < g_registered_parsers->size(); i++) { grpc_error* parser_error = GRPC_ERROR_NONE; auto parsed_obj = diff --git a/src/core/ext/filters/client_channel/service_config.h b/src/core/ext/filters/client_channel/service_config.h index 3bba4ec1010..73157db50d3 100644 --- a/src/core/ext/filters/client_channel/service_config.h +++ b/src/core/ext/filters/client_channel/service_config.h @@ -21,10 +21,11 @@ #include +#include "absl/container/inlined_vector.h" + #include #include -#include "src/core/lib/gprpp/inlined_vector.h" #include "src/core/lib/gprpp/ref_counted.h" #include "src/core/lib/gprpp/ref_counted_ptr.h" #include "src/core/lib/iomgr/error.h" @@ -89,7 +90,8 @@ class ServiceConfig : public RefCounted { }; static constexpr int kNumPreallocatedParsers = 4; - typedef InlinedVector, kNumPreallocatedParsers> + typedef absl::InlinedVector, + kNumPreallocatedParsers> ParsedConfigVector; /// When a service config is applied to a call in the client_channel_filter, @@ -175,7 +177,7 @@ class ServiceConfig : public RefCounted { std::string json_string_; Json json_; - InlinedVector, kNumPreallocatedParsers> + absl::InlinedVector, kNumPreallocatedParsers> parsed_global_configs_; // A map from the method name to the parsed config vector. Note that we are // using a raw pointer and not a unique pointer so that we can use the same @@ -186,7 +188,7 @@ class ServiceConfig : public RefCounted { const ParsedConfigVector* default_method_config_vector_ = nullptr; // Storage for all the vectors that are being used in // parsed_method_configs_table_. - InlinedVector, 32> + absl::InlinedVector, 32> parsed_method_config_vectors_storage_; }; diff --git a/src/core/ext/filters/client_channel/xds/xds_api.cc b/src/core/ext/filters/client_channel/xds/xds_api.cc index 4be62a33cd0..08ba9f925a0 100644 --- a/src/core/ext/filters/client_channel/xds/xds_api.cc +++ b/src/core/ext/filters/client_channel/xds/xds_api.cc @@ -31,7 +31,6 @@ #include #include "src/core/ext/filters/client_channel/xds/xds_api.h" -#include "src/core/lib/gprpp/inlined_vector.h" #include "src/core/lib/iomgr/error.h" #include "src/core/lib/iomgr/sockaddr_utils.h" diff --git a/src/core/ext/filters/client_channel/xds/xds_api.h b/src/core/ext/filters/client_channel/xds/xds_api.h index 9bd74c777f7..9117466fe84 100644 --- a/src/core/ext/filters/client_channel/xds/xds_api.h +++ b/src/core/ext/filters/client_channel/xds/xds_api.h @@ -25,6 +25,7 @@ #include +#include "absl/container/inlined_vector.h" #include "absl/types/optional.h" #include @@ -150,7 +151,7 @@ class XdsApi { } private: - InlinedVector priorities_; + absl::InlinedVector priorities_; }; // There are two phases of accessing this class's content: @@ -169,7 +170,7 @@ class XdsApi { const uint32_t parts_per_million; }; - using DropCategoryList = InlinedVector; + using DropCategoryList = absl::InlinedVector; void AddCategory(std::string name, uint32_t parts_per_million) { drop_category_list_.emplace_back( diff --git a/src/core/ext/filters/client_channel/xds/xds_bootstrap.cc b/src/core/ext/filters/client_channel/xds/xds_bootstrap.cc index 6a641714912..9caee17a852 100644 --- a/src/core/ext/filters/client_channel/xds/xds_bootstrap.cc +++ b/src/core/ext/filters/client_channel/xds/xds_bootstrap.cc @@ -18,6 +18,8 @@ #include "src/core/ext/filters/client_channel/xds/xds_bootstrap.h" +#include + #include #include @@ -128,7 +130,7 @@ XdsBootstrap::XdsBootstrap(Json json, grpc_error** error) { "malformed JSON in bootstrap file"); return; } - InlinedVector error_list; + std::vector error_list; auto it = json.mutable_object()->find("xds_servers"); if (it == json.mutable_object()->end()) { error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( @@ -155,7 +157,7 @@ XdsBootstrap::XdsBootstrap(Json json, grpc_error** error) { } grpc_error* XdsBootstrap::ParseXdsServerList(Json* json) { - InlinedVector error_list; + std::vector error_list; for (size_t i = 0; i < json->mutable_array()->size(); ++i) { Json& child = json->mutable_array()->at(i); if (child.type() != Json::Type::OBJECT) { @@ -173,7 +175,7 @@ grpc_error* XdsBootstrap::ParseXdsServerList(Json* json) { } grpc_error* XdsBootstrap::ParseXdsServer(Json* json, size_t idx) { - InlinedVector error_list; + std::vector error_list; servers_.emplace_back(); XdsServer& server = servers_[servers_.size() - 1]; auto it = json->mutable_object()->find("server_uri"); @@ -211,7 +213,7 @@ grpc_error* XdsBootstrap::ParseXdsServer(Json* json, size_t idx) { grpc_error* XdsBootstrap::ParseChannelCredsArray(Json* json, XdsServer* server) { - InlinedVector error_list; + std::vector error_list; for (size_t i = 0; i < json->mutable_array()->size(); ++i) { Json& child = json->mutable_array()->at(i); if (child.type() != Json::Type::OBJECT) { @@ -230,7 +232,7 @@ grpc_error* XdsBootstrap::ParseChannelCredsArray(Json* json, grpc_error* XdsBootstrap::ParseChannelCreds(Json* json, size_t idx, XdsServer* server) { - InlinedVector error_list; + std::vector error_list; ChannelCreds channel_creds; auto it = json->mutable_object()->find("type"); if (it == json->mutable_object()->end()) { @@ -268,7 +270,7 @@ grpc_error* XdsBootstrap::ParseChannelCreds(Json* json, size_t idx, } grpc_error* XdsBootstrap::ParseNode(Json* json) { - InlinedVector error_list; + std::vector error_list; node_ = absl::make_unique(); auto it = json->mutable_object()->find("id"); if (it != json->mutable_object()->end()) { @@ -312,7 +314,7 @@ grpc_error* XdsBootstrap::ParseNode(Json* json) { } grpc_error* XdsBootstrap::ParseLocality(Json* json) { - InlinedVector error_list; + std::vector error_list; auto it = json->mutable_object()->find("region"); if (it != json->mutable_object()->end()) { if (it->second.type() != Json::Type::STRING) { diff --git a/src/core/ext/filters/client_channel/xds/xds_bootstrap.h b/src/core/ext/filters/client_channel/xds/xds_bootstrap.h index d3b04ad922f..13eff49f575 100644 --- a/src/core/ext/filters/client_channel/xds/xds_bootstrap.h +++ b/src/core/ext/filters/client_channel/xds/xds_bootstrap.h @@ -23,9 +23,10 @@ #include #include +#include "absl/container/inlined_vector.h" + #include -#include "src/core/lib/gprpp/inlined_vector.h" #include "src/core/lib/gprpp/map.h" #include "src/core/lib/gprpp/memory.h" #include "src/core/lib/iomgr/error.h" @@ -53,7 +54,7 @@ class XdsBootstrap { struct XdsServer { std::string server_uri; - InlinedVector channel_creds; + absl::InlinedVector channel_creds; }; // If *error is not GRPC_ERROR_NONE after returning, then there was an @@ -78,7 +79,7 @@ class XdsBootstrap { grpc_error* ParseNode(Json* json); grpc_error* ParseLocality(Json* json); - InlinedVector servers_; + absl::InlinedVector servers_; std::unique_ptr node_; }; diff --git a/src/core/ext/filters/client_channel/xds/xds_channel_secure.cc b/src/core/ext/filters/client_channel/xds/xds_channel_secure.cc index 52d226ce74b..c218db86a17 100644 --- a/src/core/ext/filters/client_channel/xds/xds_channel_secure.cc +++ b/src/core/ext/filters/client_channel/xds/xds_channel_secure.cc @@ -22,6 +22,8 @@ #include +#include "absl/container/inlined_vector.h" + #include #include #include @@ -39,8 +41,8 @@ namespace grpc_core { grpc_channel_args* ModifyXdsChannelArgs(grpc_channel_args* args) { - InlinedVector args_to_remove; - InlinedVector args_to_add; + absl::InlinedVector args_to_remove; + absl::InlinedVector args_to_add; // Substitute the channel credentials with a version without call // credentials: the load balancer is not necessarily trusted to handle // bearer token credentials. diff --git a/src/core/ext/filters/client_channel/xds/xds_client.cc b/src/core/ext/filters/client_channel/xds/xds_client.cc index 9a0e566e1e4..9dc7b97773c 100644 --- a/src/core/ext/filters/client_channel/xds/xds_client.cc +++ b/src/core/ext/filters/client_channel/xds/xds_client.cc @@ -22,6 +22,7 @@ #include #include +#include "absl/container/inlined_vector.h" #include "absl/strings/str_format.h" #include "absl/strings/str_join.h" @@ -447,7 +448,7 @@ grpc_channel_args* BuildXdsChannelArgs(const grpc_channel_args& args) { GRPC_ARG_KEEPALIVE_TIME_MS, }; // Channel args to add. - InlinedVector args_to_add; + absl::InlinedVector args_to_add; // Keepalive interval. args_to_add.emplace_back(grpc_channel_arg_integer_create( const_cast(GRPC_ARG_KEEPALIVE_TIME_MS), 5000)); diff --git a/src/core/ext/filters/client_channel/xds/xds_client_stats.h b/src/core/ext/filters/client_channel/xds/xds_client_stats.h index cbeccd2279d..7a358d47b91 100644 --- a/src/core/ext/filters/client_channel/xds/xds_client_stats.h +++ b/src/core/ext/filters/client_channel/xds/xds_client_stats.h @@ -24,7 +24,6 @@ #include #include "src/core/lib/gprpp/atomic.h" -#include "src/core/lib/gprpp/inlined_vector.h" #include "src/core/lib/gprpp/map.h" #include "src/core/lib/gprpp/memory.h" #include "src/core/lib/gprpp/ref_counted.h" diff --git a/src/core/lib/channel/channelz.h b/src/core/lib/channel/channelz.h index 73a9b57a45c..63502030966 100644 --- a/src/core/lib/channel/channelz.h +++ b/src/core/lib/channel/channelz.h @@ -25,10 +25,11 @@ #include +#include "absl/container/inlined_vector.h" + #include "src/core/lib/channel/channel_trace.h" #include "src/core/lib/gpr/time_precise.h" #include "src/core/lib/gprpp/atomic.h" -#include "src/core/lib/gprpp/inlined_vector.h" #include "src/core/lib/gprpp/manual_constructor.h" #include "src/core/lib/gprpp/map.h" #include "src/core/lib/gprpp/ref_counted.h" @@ -167,7 +168,7 @@ class CallCountingHelper { void CollectData(CounterData* out); // Really zero-sized, but 0-sized arrays are illegal on MSVC. - InlinedVector per_cpu_counter_data_storage_; + absl::InlinedVector per_cpu_counter_data_storage_; size_t num_cores_ = 0; }; diff --git a/src/core/lib/channel/channelz_registry.cc b/src/core/lib/channel/channelz_registry.cc index 0964ffca2a1..43439363bf7 100644 --- a/src/core/lib/channel/channelz_registry.cc +++ b/src/core/lib/channel/channelz_registry.cc @@ -21,6 +21,8 @@ #include #include +#include "absl/container/inlined_vector.h" + #include "src/core/lib/channel/channel_trace.h" #include "src/core/lib/channel/channelz.h" #include "src/core/lib/channel/channelz_registry.h" @@ -82,7 +84,7 @@ RefCountedPtr ChannelzRegistry::InternalGet(intptr_t uuid) { std::string ChannelzRegistry::InternalGetTopChannels( intptr_t start_channel_id) { - InlinedVector, 10> top_level_channels; + absl::InlinedVector, 10> top_level_channels; RefCountedPtr node_after_pagination_limit; { MutexLock lock(&mu_); @@ -120,7 +122,7 @@ std::string ChannelzRegistry::InternalGetTopChannels( } std::string ChannelzRegistry::InternalGetServers(intptr_t start_server_id) { - InlinedVector, 10> servers; + absl::InlinedVector, 10> servers; RefCountedPtr node_after_pagination_limit; { MutexLock lock(&mu_); @@ -158,7 +160,7 @@ std::string ChannelzRegistry::InternalGetServers(intptr_t start_server_id) { } void ChannelzRegistry::InternalLogAllEntities() { - InlinedVector, 10> nodes; + absl::InlinedVector, 10> nodes; { MutexLock lock(&mu_); for (auto& p : node_map_) { diff --git a/src/core/lib/channel/handshaker.h b/src/core/lib/channel/handshaker.h index 4f064d901df..10b0631968f 100644 --- a/src/core/lib/channel/handshaker.h +++ b/src/core/lib/channel/handshaker.h @@ -21,12 +21,13 @@ #include +#include "absl/container/inlined_vector.h" + #include #include #include "src/core/lib/channel/channel_args.h" -#include "src/core/lib/gprpp/inlined_vector.h" #include "src/core/lib/gprpp/ref_counted.h" #include "src/core/lib/gprpp/sync.h" #include "src/core/lib/iomgr/closure.h" @@ -146,7 +147,8 @@ class HandshakeManager : public RefCounted { gpr_mu mu_; bool is_shutdown_ = false; // An array of handshakers added via grpc_handshake_manager_add(). - InlinedVector, HANDSHAKERS_INIT_SIZE> handshakers_; + absl::InlinedVector, HANDSHAKERS_INIT_SIZE> + handshakers_; // The index of the handshaker to invoke next and closure to invoke it. size_t index_ = 0; grpc_closure call_next_handshaker_; diff --git a/src/core/lib/channel/handshaker_registry.cc b/src/core/lib/channel/handshaker_registry.cc index 9ec458b210a..0e686af8992 100644 --- a/src/core/lib/channel/handshaker_registry.cc +++ b/src/core/lib/channel/handshaker_registry.cc @@ -18,9 +18,10 @@ #include +#include "absl/container/inlined_vector.h" + #include "src/core/lib/channel/handshaker_registry.h" #include "src/core/lib/gpr/alloc.h" -#include "src/core/lib/gprpp/inlined_vector.h" #include "src/core/lib/gprpp/memory.h" #include @@ -44,7 +45,7 @@ class HandshakerFactoryList { HandshakeManager* handshake_mgr); private: - InlinedVector, 2> factories_; + absl::InlinedVector, 2> factories_; }; HandshakerFactoryList* g_handshaker_factory_lists = nullptr; diff --git a/src/core/lib/gprpp/inlined_vector.h b/src/core/lib/gprpp/inlined_vector.h deleted file mode 100644 index 3cad99d3429..00000000000 --- a/src/core/lib/gprpp/inlined_vector.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - * - * Copyright 2017 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef GRPC_CORE_LIB_GPRPP_INLINED_VECTOR_H -#define GRPC_CORE_LIB_GPRPP_INLINED_VECTOR_H - -#include - -#include -#include - -#include "absl/container/inlined_vector.h" -#include "src/core/lib/gprpp/memory.h" - -namespace grpc_core { - -template > -using InlinedVector = absl::InlinedVector; - -} // namespace grpc_core - -#endif /* GRPC_CORE_LIB_GPRPP_INLINED_VECTOR_H */ diff --git a/src/core/lib/gprpp/optional.h b/src/core/lib/gprpp/optional.h deleted file mode 100644 index f4535bb03a8..00000000000 --- a/src/core/lib/gprpp/optional.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - * - * Copyright 2019 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef GRPC_CORE_LIB_GPRPP_OPTIONAL_H -#define GRPC_CORE_LIB_GPRPP_OPTIONAL_H - -#include - -#include "absl/types/optional.h" - -namespace grpc_core { - -template -using Optional = absl::optional; - -} // namespace grpc_core - -#endif /* GRPC_CORE_LIB_GPRPP_OPTIONAL_H */ diff --git a/src/core/lib/iomgr/buffer_list.h b/src/core/lib/iomgr/buffer_list.h index c2552ca26bf..f804f021a75 100644 --- a/src/core/lib/iomgr/buffer_list.h +++ b/src/core/lib/iomgr/buffer_list.h @@ -21,12 +21,13 @@ #include +#include "absl/types/optional.h" + #include "src/core/lib/iomgr/port.h" #include #include "src/core/lib/gprpp/memory.h" -#include "src/core/lib/gprpp/optional.h" #include "src/core/lib/iomgr/error.h" #include "src/core/lib/iomgr/internal_errqueue.h" @@ -34,52 +35,52 @@ namespace grpc_core { struct ConnectionMetrics { /* Delivery rate in Bytes/s. */ - Optional delivery_rate; + absl::optional delivery_rate; /* If the delivery rate is limited by the application, this is set to true. */ - Optional is_delivery_rate_app_limited; + absl::optional is_delivery_rate_app_limited; /* Total packets retransmitted. */ - Optional packet_retx; + absl::optional packet_retx; /* Total packets retransmitted spuriously. This metric is smaller than or equal to packet_retx. */ - Optional packet_spurious_retx; + absl::optional packet_spurious_retx; /* Total packets sent. */ - Optional packet_sent; + absl::optional packet_sent; /* Total packets delivered. */ - Optional packet_delivered; + absl::optional packet_delivered; /* Total packets delivered with ECE marked. This metric is smaller than or equal to packet_delivered. */ - Optional packet_delivered_ce; + absl::optional packet_delivered_ce; /* Total bytes lost so far. */ - Optional data_retx; + absl::optional data_retx; /* Total bytes sent so far. */ - Optional data_sent; + absl::optional data_sent; /* Total bytes in write queue but not sent. */ - Optional data_notsent; + absl::optional data_notsent; /* Pacing rate of the connection in Bps */ - Optional pacing_rate; + absl::optional pacing_rate; /* Minimum RTT observed in usec. */ - Optional min_rtt; + absl::optional min_rtt; /* Smoothed RTT in usec */ - Optional srtt; + absl::optional srtt; /* Send congestion window. */ - Optional congestion_window; + absl::optional congestion_window; /* Slow start threshold in packets. */ - Optional snd_ssthresh; + absl::optional snd_ssthresh; /* Maximum degree of reordering (i.e., maximum number of packets reodered) on the connection. */ - Optional reordering; + absl::optional reordering; /* Represents the number of recurring retransmissions of the first sequence that is not acknowledged yet. */ - Optional recurring_retrans; + absl::optional recurring_retrans; /* The cumulative time (in usec) that the transport protocol was busy sending data. */ - Optional busy_usec; + absl::optional busy_usec; /* The cumulative time (in usec) that the transport protocol was limited by the receive window size. */ - Optional rwnd_limited_usec; + absl::optional rwnd_limited_usec; /* The cumulative time (in usec) that the transport protocol was limited by the send buffer size. */ - Optional sndbuf_limited_usec; + absl::optional sndbuf_limited_usec; }; struct Timestamp { diff --git a/src/core/lib/iomgr/call_combiner.h b/src/core/lib/iomgr/call_combiner.h index d3f43cf547f..44acd9fe870 100644 --- a/src/core/lib/iomgr/call_combiner.h +++ b/src/core/lib/iomgr/call_combiner.h @@ -23,9 +23,10 @@ #include +#include "absl/container/inlined_vector.h" + #include -#include "src/core/lib/gprpp/inlined_vector.h" #include "src/core/lib/gprpp/mpscq.h" #include "src/core/lib/gprpp/ref_counted.h" #include "src/core/lib/gprpp/ref_counted_ptr.h" @@ -208,7 +209,7 @@ class CallCombinerClosureList { // There are generally a maximum of 6 closures to run in the call // combiner, one for each pending op. - InlinedVector closures_; + absl::InlinedVector closures_; }; } // namespace grpc_core diff --git a/src/core/lib/iomgr/error.h b/src/core/lib/iomgr/error.h index 5c79aa78ae7..ac3ff876289 100644 --- a/src/core/lib/iomgr/error.h +++ b/src/core/lib/iomgr/error.h @@ -30,7 +30,6 @@ #include #include "src/core/lib/debug/trace.h" -#include "src/core/lib/gprpp/inlined_vector.h" /// Opaque representation of an error. /// See https://github.com/grpc/grpc/blob/master/doc/core/grpc-error.md for a diff --git a/src/core/lib/iomgr/udp_server.cc b/src/core/lib/iomgr/udp_server.cc index 0bfd22fc79c..ce3531f3378 100644 --- a/src/core/lib/iomgr/udp_server.cc +++ b/src/core/lib/iomgr/udp_server.cc @@ -44,6 +44,8 @@ #include #include +#include "absl/container/inlined_vector.h" + #include #include #include @@ -52,7 +54,6 @@ #include #include "src/core/lib/channel/channel_args.h" #include "src/core/lib/gpr/string.h" -#include "src/core/lib/gprpp/inlined_vector.h" #include "src/core/lib/gprpp/memory.h" #include "src/core/lib/iomgr/error.h" #include "src/core/lib/iomgr/ev_posix.h" @@ -177,7 +178,7 @@ struct grpc_udp_server { int shutdown; /* An array of listeners */ - grpc_core::InlinedVector listeners; + absl::InlinedVector listeners; /* factory for use to create udp listeners */ GrpcUdpHandlerFactory* handler_factory; diff --git a/src/core/lib/security/credentials/composite/composite_credentials.h b/src/core/lib/security/credentials/composite/composite_credentials.h index 57967e1b6c9..6b9e9d114d8 100644 --- a/src/core/lib/security/credentials/composite/composite_credentials.h +++ b/src/core/lib/security/credentials/composite/composite_credentials.h @@ -23,7 +23,8 @@ #include -#include "src/core/lib/gprpp/inlined_vector.h" +#include "absl/container/inlined_vector.h" + #include "src/core/lib/gprpp/ref_counted_ptr.h" #include "src/core/lib/security/credentials/credentials.h" @@ -71,8 +72,7 @@ class grpc_composite_channel_credentials : public grpc_channel_credentials { class grpc_composite_call_credentials : public grpc_call_credentials { public: using CallCredentialsList = - grpc_core::InlinedVector, - 2>; + absl::InlinedVector, 2>; grpc_composite_call_credentials( grpc_core::RefCountedPtr creds1, diff --git a/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc b/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc index c922d35b8d8..8191043db21 100644 --- a/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +++ b/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc @@ -23,6 +23,8 @@ #include +#include "absl/container/inlined_vector.h" + #include #include #include @@ -32,7 +34,6 @@ #include "absl/strings/str_format.h" #include "src/core/lib/gpr/string.h" -#include "src/core/lib/gprpp/inlined_vector.h" #include "src/core/lib/gprpp/ref_counted_ptr.h" #include "src/core/lib/iomgr/error.h" #include "src/core/lib/iomgr/load_file.h" @@ -669,7 +670,7 @@ grpc_error* ValidateStsCredentialsOptions( void operator()(grpc_uri* uri) { grpc_uri_destroy(uri); } }; *sts_url_out = nullptr; - InlinedVector error_list; + absl::InlinedVector error_list; std::unique_ptr sts_url( options->token_exchange_service_uri != nullptr ? grpc_uri_parse(options->token_exchange_service_uri, false) diff --git a/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h b/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h index c411fb2b96b..a5f032abec4 100644 --- a/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +++ b/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h @@ -23,7 +23,8 @@ #include -#include "src/core/lib/gprpp/inlined_vector.h" +#include "absl/container/inlined_vector.h" + #include "src/core/lib/gprpp/ref_counted.h" #include "src/core/lib/security/security_connector/ssl_utils.h" @@ -44,8 +45,7 @@ struct grpc_tls_error_details struct grpc_tls_key_materials_config : public grpc_core::RefCounted { public: - typedef grpc_core::InlinedVector - PemKeyCertPairList; + typedef absl::InlinedVector PemKeyCertPairList; /** Getters for member fields. **/ const char* pem_root_certs() const { return pem_root_certs_.get(); } diff --git a/src/core/lib/security/security_connector/load_system_roots_linux.cc b/src/core/lib/security/security_connector/load_system_roots_linux.cc index e97773f38b3..f7c6c2cec35 100644 --- a/src/core/lib/security/security_connector/load_system_roots_linux.cc +++ b/src/core/lib/security/security_connector/load_system_roots_linux.cc @@ -34,6 +34,8 @@ #include #include +#include "absl/container/inlined_vector.h" + #include #include #include @@ -41,7 +43,6 @@ #include "src/core/lib/gpr/string.h" #include "src/core/lib/gpr/useful.h" #include "src/core/lib/gprpp/global_config.h" -#include "src/core/lib/gprpp/inlined_vector.h" #include "src/core/lib/iomgr/load_file.h" GPR_GLOBAL_CONFIG_DEFINE_STRING(grpc_system_ssl_roots_dir, "", @@ -100,7 +101,7 @@ grpc_slice CreateRootCertsBundle(const char* certs_directory) { char path[MAXPATHLEN]; off_t size; }; - InlinedVector roots_filenames; + absl::InlinedVector roots_filenames; size_t total_bundle_size = 0; struct dirent* directory_entry; while ((directory_entry = readdir(ca_directory)) != nullptr) { diff --git a/src/cpp/common/tls_credentials_options.cc b/src/cpp/common/tls_credentials_options.cc index c821e100f93..23d6495dd20 100644 --- a/src/cpp/common/tls_credentials_options.cc +++ b/src/cpp/common/tls_credentials_options.cc @@ -18,6 +18,9 @@ #include #include + +#include "absl/container/inlined_vector.h" + #include "src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h" #include "src/cpp/common/tls_credentials_options_util.h" @@ -111,7 +114,7 @@ void TlsCredentialReloadArg::set_key_materials( c_arg_->key_materials_config = grpc_tls_key_materials_config_create(); } /** Convert |pem_key_cert_pair_list| to an inlined vector of ssl pairs. **/ - ::grpc_core::InlinedVector<::grpc_core::PemKeyCertPair, 1> + ::absl::InlinedVector<::grpc_core::PemKeyCertPair, 1> c_pem_key_cert_pair_list; for (const auto& key_cert_pair : pem_key_cert_pair_list) { c_pem_key_cert_pair_list.emplace_back( @@ -128,7 +131,7 @@ void TlsCredentialReloadArg::set_key_materials_config( c_arg_->key_materials_config = nullptr; return; } - ::grpc_core::InlinedVector<::grpc_core::PemKeyCertPair, 1> + ::absl::InlinedVector<::grpc_core::PemKeyCertPair, 1> c_pem_key_cert_pair_list; for (const auto& key_cert_pair : key_materials_config->pem_key_cert_pair_list()) { diff --git a/src/cpp/common/tls_credentials_options_util.cc b/src/cpp/common/tls_credentials_options_util.cc index 59915e42f61..2211460e664 100644 --- a/src/cpp/common/tls_credentials_options_util.cc +++ b/src/cpp/common/tls_credentials_options_util.cc @@ -16,8 +16,10 @@ * */ -#include "src/cpp/common/tls_credentials_options_util.h" +#include "absl/container/inlined_vector.h" + #include +#include "src/cpp/common/tls_credentials_options_util.h" namespace grpc_impl { namespace experimental { @@ -35,7 +37,7 @@ grpc_tls_key_materials_config* ConvertToCKeyMaterialsConfig( } grpc_tls_key_materials_config* c_config = grpc_tls_key_materials_config_create(); - ::grpc_core::InlinedVector<::grpc_core::PemKeyCertPair, 1> + ::absl::InlinedVector<::grpc_core::PemKeyCertPair, 1> c_pem_key_cert_pair_list; for (const auto& key_cert_pair : config->pem_key_cert_pair_list()) { grpc_ssl_pem_key_cert_pair* ssl_pair = diff --git a/test/core/client_channel/resolvers/fake_resolver_test.cc b/test/core/client_channel/resolvers/fake_resolver_test.cc index 84ff252deaf..fb1e3e2dc1d 100644 --- a/test/core/client_channel/resolvers/fake_resolver_test.cc +++ b/test/core/client_channel/resolvers/fake_resolver_test.cc @@ -94,7 +94,7 @@ static grpc_core::Resolver::Result create_new_resolver_result() { grpc_uri* uri = grpc_uri_parse(uri_string, true); grpc_resolved_address address; GPR_ASSERT(grpc_parse_uri(uri, &address)); - grpc_core::InlinedVector args_to_add; + absl::InlinedVector args_to_add; result.addresses.emplace_back( address.addr, address.len, grpc_channel_args_copy_and_add(nullptr, nullptr, 0)); diff --git a/test/core/end2end/fixtures/h2_tls.cc b/test/core/end2end/fixtures/h2_tls.cc index 95cff3a2b00..1a79bc96014 100644 --- a/test/core/end2end/fixtures/h2_tls.cc +++ b/test/core/end2end/fixtures/h2_tls.cc @@ -23,12 +23,13 @@ #include #include +#include "absl/container/inlined_vector.h" + #include "src/core/lib/channel/channel_args.h" #include "src/core/lib/gpr/env.h" #include "src/core/lib/gpr/string.h" #include "src/core/lib/gpr/tmpfile.h" #include "src/core/lib/gprpp/host_port.h" -#include "src/core/lib/gprpp/inlined_vector.h" #include "src/core/lib/gprpp/thd.h" #include "src/core/lib/iomgr/load_file.h" #include "src/core/lib/security/credentials/credentials.h" @@ -42,7 +43,7 @@ #define SERVER_CERT_PATH "src/core/tsi/test_creds/server1.pem" #define SERVER_KEY_PATH "src/core/tsi/test_creds/server1.key" -typedef grpc_core::InlinedVector ThreadList; +typedef absl::InlinedVector ThreadList; struct fullstack_secure_fixture_data { ~fullstack_secure_fixture_data() { diff --git a/test/core/gprpp/BUILD b/test/core/gprpp/BUILD index a9a8f84ebec..4eb81c3db23 100644 --- a/test/core/gprpp/BUILD +++ b/test/core/gprpp/BUILD @@ -95,19 +95,6 @@ grpc_cc_test( ], ) -grpc_cc_test( - name = "optional_test", - srcs = ["optional_test.cc"], - external_deps = [ - "gtest", - ], - language = "C++", - deps = [ - "//:optional", - "//test/core/util:grpc_test_util", - ], -) - grpc_cc_test( name = "orphanable_test", srcs = ["orphanable_test.cc"], diff --git a/test/core/gprpp/optional_test.cc b/test/core/gprpp/optional_test.cc deleted file mode 100644 index 67c7fad6c32..00000000000 --- a/test/core/gprpp/optional_test.cc +++ /dev/null @@ -1,50 +0,0 @@ -/* - * - * Copyright 2019 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#include "src/core/lib/gprpp/optional.h" -#include -#include -#include "src/core/lib/gprpp/memory.h" -#include "test/core/util/test_config.h" - -namespace grpc_core { -namespace testing { - -namespace { -TEST(OptionalTest, BasicTest) { - grpc_core::Optional opt_val; - EXPECT_FALSE(opt_val.has_value()); - const int kTestVal = 123; - - opt_val.emplace(kTestVal); - EXPECT_TRUE(opt_val.has_value()); - EXPECT_EQ(opt_val.value(), kTestVal); - - opt_val.reset(); - EXPECT_EQ(opt_val.has_value(), false); -} -} // namespace - -} // namespace testing -} // namespace grpc_core - -int main(int argc, char** argv) { - grpc::testing::TestEnvironment env(argc, argv); - ::testing::InitGoogleTest(&argc, argv); - return RUN_ALL_TESTS(); -} diff --git a/test/cpp/client/credentials_test.cc b/test/cpp/client/credentials_test.cc index a1a0633e1f8..7ca90f7ff68 100644 --- a/test/cpp/client/credentials_test.cc +++ b/test/cpp/client/credentials_test.cc @@ -399,8 +399,7 @@ TEST_F(CredentialsTest, TlsCredentialReloadConfigCppToC) { ssl_pair->cert_chain = gpr_strdup(test_cert_chain.c_str()); ::grpc_core::PemKeyCertPair pem_key_cert_pair = ::grpc_core::PemKeyCertPair(ssl_pair); - ::grpc_core::InlinedVector<::grpc_core::PemKeyCertPair, 1> - pem_key_cert_pair_list; + ::absl::InlinedVector<::grpc_core::PemKeyCertPair, 1> pem_key_cert_pair_list; pem_key_cert_pair_list.push_back(pem_key_cert_pair); grpc::string test_pem_root_certs = "pem_root_certs"; c_key_materials.set_key_materials(test_pem_root_certs.c_str(), @@ -417,7 +416,7 @@ TEST_F(CredentialsTest, TlsCredentialReloadConfigCppToC) { EXPECT_EQ(c_arg.cb_user_data, nullptr); EXPECT_STREQ(c_arg.key_materials_config->pem_root_certs(), "new_pem_root_certs"); - ::grpc_core::InlinedVector<::grpc_core::PemKeyCertPair, 1> pair_list = + ::absl::InlinedVector<::grpc_core::PemKeyCertPair, 1> pair_list = c_arg.key_materials_config->pem_key_cert_pair_list(); EXPECT_EQ(static_cast(pair_list.size()), 2); EXPECT_STREQ(pair_list[0].private_key(), "private_key"); @@ -625,7 +624,7 @@ TEST_F(CredentialsTest, TlsCredentialsOptionsCppToC) { EXPECT_EQ(c_credential_reload_arg.cb_user_data, nullptr); EXPECT_STREQ(c_credential_reload_arg.key_materials_config->pem_root_certs(), "new_pem_root_certs"); - ::grpc_core::InlinedVector<::grpc_core::PemKeyCertPair, 1> c_pair_list = + ::absl::InlinedVector<::grpc_core::PemKeyCertPair, 1> c_pair_list = c_credential_reload_arg.key_materials_config->pem_key_cert_pair_list(); EXPECT_EQ(static_cast(c_pair_list.size()), 2); EXPECT_STREQ(c_pair_list[0].private_key(), "private_key"); diff --git a/tools/doxygen/Doxyfile.c++.internal b/tools/doxygen/Doxyfile.c++.internal index c00bec03dcb..c5d220fabf1 100644 --- a/tools/doxygen/Doxyfile.c++.internal +++ b/tools/doxygen/Doxyfile.c++.internal @@ -1495,13 +1495,11 @@ src/core/lib/gprpp/global_config_env.h \ src/core/lib/gprpp/global_config_generic.h \ src/core/lib/gprpp/host_port.cc \ src/core/lib/gprpp/host_port.h \ -src/core/lib/gprpp/inlined_vector.h \ src/core/lib/gprpp/manual_constructor.h \ src/core/lib/gprpp/map.h \ src/core/lib/gprpp/memory.h \ src/core/lib/gprpp/mpscq.cc \ src/core/lib/gprpp/mpscq.h \ -src/core/lib/gprpp/optional.h \ src/core/lib/gprpp/orphanable.h \ src/core/lib/gprpp/ref_counted.h \ src/core/lib/gprpp/ref_counted_ptr.h \ diff --git a/tools/doxygen/Doxyfile.core.internal b/tools/doxygen/Doxyfile.core.internal index fd50700de67..04f37228424 100644 --- a/tools/doxygen/Doxyfile.core.internal +++ b/tools/doxygen/Doxyfile.core.internal @@ -1306,13 +1306,11 @@ src/core/lib/gprpp/global_config_env.h \ src/core/lib/gprpp/global_config_generic.h \ src/core/lib/gprpp/host_port.cc \ src/core/lib/gprpp/host_port.h \ -src/core/lib/gprpp/inlined_vector.h \ src/core/lib/gprpp/manual_constructor.h \ src/core/lib/gprpp/map.h \ src/core/lib/gprpp/memory.h \ src/core/lib/gprpp/mpscq.cc \ src/core/lib/gprpp/mpscq.h \ -src/core/lib/gprpp/optional.h \ src/core/lib/gprpp/orphanable.h \ src/core/lib/gprpp/ref_counted.h \ src/core/lib/gprpp/ref_counted_ptr.h \ diff --git a/tools/run_tests/generated/tests.json b/tools/run_tests/generated/tests.json index b09efd61926..ab8760486a7 100644 --- a/tools/run_tests/generated/tests.json +++ b/tools/run_tests/generated/tests.json @@ -4931,30 +4931,6 @@ ], "uses_polling": true }, - { - "args": [], - "benchmark": false, - "ci_platforms": [ - "linux", - "mac", - "posix", - "windows" - ], - "cpu_cost": 1.0, - "exclude_configs": [], - "exclude_iomgrs": [], - "flaky": false, - "gtest": true, - "language": "c++", - "name": "optional_test", - "platforms": [ - "linux", - "mac", - "posix", - "windows" - ], - "uses_polling": true - }, { "args": [], "benchmark": false, From 61f66e81b61df3b5fb6c0d698ad2213d6090501a Mon Sep 17 00:00:00 2001 From: Eric Anderson Date: Thu, 23 Apr 2020 12:53:46 -0700 Subject: [PATCH 598/758] tools: Put sha1 in container tag instead of name Ideally instead of having names like ruby_jessie_x64_ruby_2_5 and ruby_jessie_x64_ruby_2_6 they would have the name "ruby" with tags containing jessie_x64_ruby_2_5/6. But fixing that would be much more invasive. The sha1 in the tag is producing the worst effects, so this is a case of the perfect being the enemy of the good. Fixes #20546 --- tools/dockerfile/push_testing_images.sh | 11 ++++++----- tools/run_tests/dockerize/build_and_run_docker.sh | 2 +- .../run_tests/dockerize/build_docker_and_run_tests.sh | 2 +- tools/run_tests/dockerize/build_interop_image.sh | 4 ++-- 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/tools/dockerfile/push_testing_images.sh b/tools/dockerfile/push_testing_images.sh index 2e0841a4db5..7d2068edbe1 100755 --- a/tools/dockerfile/push_testing_images.sh +++ b/tools/dockerfile/push_testing_images.sh @@ -36,14 +36,15 @@ do # contents of the docker image always changes the SHA (e.g. using "ADD file" # cmd in the dockerfile in not ok as contents of the added file will not be # reflected in the SHA). - DOCKER_IMAGE_NAME=$(basename $DOCKERFILE_DIR)_$(sha1sum $DOCKERFILE_DIR/Dockerfile | cut -f1 -d\ ) + DOCKER_IMAGE_NAME=$(basename $DOCKERFILE_DIR) + DOCKER_IMAGE_TAG=$(sha1sum $DOCKERFILE_DIR/Dockerfile | cut -f1 -d\ ) # skip the image if it already exists in the repo - curl --silent -f -lSL https://registry.hub.docker.com/v2/repositories/${DOCKERHUB_ORGANIZATION}/${DOCKER_IMAGE_NAME}/tags/latest > /dev/null \ + curl --silent -f -lSL https://registry.hub.docker.com/v2/repositories/${DOCKERHUB_ORGANIZATION}/${DOCKER_IMAGE_NAME}/tags/${DOCKER_IMAGE_TAG} > /dev/null \ && continue - docker build -t ${DOCKERHUB_ORGANIZATION}/${DOCKER_IMAGE_NAME} ${DOCKERFILE_DIR} - + docker build -t ${DOCKERHUB_ORGANIZATION}/${DOCKER_IMAGE_NAME}:${DOCKER_IMAGE_TAG} ${DOCKERFILE_DIR} + # "docker login" needs to be run in advance - docker push ${DOCKERHUB_ORGANIZATION}/${DOCKER_IMAGE_NAME} + docker push ${DOCKERHUB_ORGANIZATION}/${DOCKER_IMAGE_NAME}:${DOCKER_IMAGE_TAG} done diff --git a/tools/run_tests/dockerize/build_and_run_docker.sh b/tools/run_tests/dockerize/build_and_run_docker.sh index a5ef4284be7..7e9bc7744eb 100755 --- a/tools/run_tests/dockerize/build_and_run_docker.sh +++ b/tools/run_tests/dockerize/build_and_run_docker.sh @@ -33,7 +33,7 @@ cd - # $@ - Extra args to pass to docker run # Use image name based on Dockerfile location checksum -DOCKER_IMAGE_NAME=$(basename "$DOCKERFILE_DIR")_$(sha1sum "$DOCKERFILE_DIR/Dockerfile" | cut -f1 -d\ ) +DOCKER_IMAGE_NAME=$(basename "$DOCKERFILE_DIR"):$(sha1sum "$DOCKERFILE_DIR/Dockerfile" | cut -f1 -d\ ) # Pull the base image to force an update if [ "$DOCKER_BASE_IMAGE" != "" ] diff --git a/tools/run_tests/dockerize/build_docker_and_run_tests.sh b/tools/run_tests/dockerize/build_docker_and_run_tests.sh index aeaae3f9a2b..4a7908b0462 100755 --- a/tools/run_tests/dockerize/build_docker_and_run_tests.sh +++ b/tools/run_tests/dockerize/build_docker_and_run_tests.sh @@ -30,7 +30,7 @@ cd - # DOCKERHUB_ORGANIZATION - If set, pull a prebuilt image from given dockerhub org. # Use image name based on Dockerfile location checksum -DOCKER_IMAGE_NAME=$(basename "$DOCKERFILE_DIR")_$(sha1sum "$DOCKERFILE_DIR/Dockerfile" | cut -f1 -d\ ) +DOCKER_IMAGE_NAME=$(basename "$DOCKERFILE_DIR"):$(sha1sum "$DOCKERFILE_DIR/Dockerfile" | cut -f1 -d\ ) if [ "$DOCKERHUB_ORGANIZATION" != "" ] then diff --git a/tools/run_tests/dockerize/build_interop_image.sh b/tools/run_tests/dockerize/build_interop_image.sh index 9516c5ade26..5b5bfb65982 100755 --- a/tools/run_tests/dockerize/build_interop_image.sh +++ b/tools/run_tests/dockerize/build_interop_image.sh @@ -84,9 +84,9 @@ fi # on OSX use md5 instead of sha1sum if command -v sha1sum > /dev/null; then - BASE_IMAGE=${BASE_NAME}_$(sha1sum "tools/dockerfile/interoptest/$BASE_NAME/Dockerfile" | cut -f1 -d\ ) + BASE_IMAGE=${BASE_NAME}:$(sha1sum "tools/dockerfile/interoptest/$BASE_NAME/Dockerfile" | cut -f1 -d\ ) else - BASE_IMAGE=${BASE_NAME}_$(md5 -r "tools/dockerfile/interoptest/$BASE_NAME/Dockerfile" | cut -f1 -d\ ) + BASE_IMAGE=${BASE_NAME}:$(md5 -r "tools/dockerfile/interoptest/$BASE_NAME/Dockerfile" | cut -f1 -d\ ) fi if [ "$DOCKERHUB_ORGANIZATION" != "" ] From 82c586bb3c03da8feff83c4752d567349409579e Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Thu, 23 Apr 2020 13:06:11 -0700 Subject: [PATCH 599/758] Revert "[Aio] Add AsyncIO support to grpcio-status" --- .../grpc/_cython/_cygrpc/aio/server.pyx.pxi | 3 - .../grpcio_status/grpc_status/BUILD.bazel | 2 +- .../grpcio_status/grpc_status/_async.py | 56 ------ .../grpcio_status/grpc_status/_common.py | 27 --- .../grpcio_status/grpc_status/rpc_status.py | 32 ++-- .../grpcio_tests/tests_aio/status/BUILD.bazel | 30 --- .../grpcio_tests/tests_aio/status/__init__.py | 13 -- .../tests_aio/status/grpc_status_test.py | 175 ------------------ src/python/grpcio_tests/tests_aio/tests.json | 1 - 9 files changed, 17 insertions(+), 322 deletions(-) delete mode 100644 src/python/grpcio_status/grpc_status/_async.py delete mode 100644 src/python/grpcio_status/grpc_status/_common.py delete mode 100644 src/python/grpcio_tests/tests_aio/status/BUILD.bazel delete mode 100644 src/python/grpcio_tests/tests_aio/status/__init__.py delete mode 100644 src/python/grpcio_tests/tests_aio/status/grpc_status_test.py diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi index a0d51a14325..0e407172806 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi @@ -189,9 +189,6 @@ cdef class _ServicerContext: raise self._rpc_state.abort_exception - async def abort_with_status(self, object status): - await self.abort(status.code, status.details, status.trailing_metadata) - def set_trailing_metadata(self, tuple metadata): self._rpc_state.trailing_metadata = metadata diff --git a/src/python/grpcio_status/grpc_status/BUILD.bazel b/src/python/grpcio_status/grpc_status/BUILD.bazel index a6abdd3ef56..122a94f411a 100644 --- a/src/python/grpcio_status/grpc_status/BUILD.bazel +++ b/src/python/grpcio_status/grpc_status/BUILD.bazel @@ -4,7 +4,7 @@ package(default_visibility = ["//visibility:public"]) py_library( name = "grpc_status", - srcs = glob(["*.py"]), + srcs = ["rpc_status.py"], imports = ["../"], deps = [ "//src/python/grpcio/grpc:grpcio", diff --git a/src/python/grpcio_status/grpc_status/_async.py b/src/python/grpcio_status/grpc_status/_async.py deleted file mode 100644 index a6a6f7ef6ad..00000000000 --- a/src/python/grpcio_status/grpc_status/_async.py +++ /dev/null @@ -1,56 +0,0 @@ -# Copyright 2020 The gRPC Authors -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Reference implementation for status mapping in gRPC Python.""" - -from grpc.experimental import aio - -from google.rpc import status_pb2 - -from ._common import code_to_grpc_status_code, GRPC_DETAILS_METADATA_KEY - - -async def from_call(call: aio.Call): - """Returns a google.rpc.status.Status message from a given grpc.aio.Call. - - This is an EXPERIMENTAL API. - - Args: - call: An grpc.aio.Call instance. - - Returns: - A google.rpc.status.Status message representing the status of the RPC. - """ - code = await call.code() - details = await call.details() - trailing_metadata = await call.trailing_metadata() - if trailing_metadata is None: - return None - for key, value in trailing_metadata: - if key == GRPC_DETAILS_METADATA_KEY: - rich_status = status_pb2.Status.FromString(value) - if code.value[0] != rich_status.code: - raise ValueError( - 'Code in Status proto (%s) doesn\'t match status code (%s)' - % (code_to_grpc_status_code(rich_status.code), code)) - if details != rich_status.message: - raise ValueError( - 'Message in Status proto (%s) doesn\'t match status details (%s)' - % (rich_status.message, details)) - return rich_status - return None - - -__all__ = [ - 'from_call', -] diff --git a/src/python/grpcio_status/grpc_status/_common.py b/src/python/grpcio_status/grpc_status/_common.py deleted file mode 100644 index 4bec0ba1372..00000000000 --- a/src/python/grpcio_status/grpc_status/_common.py +++ /dev/null @@ -1,27 +0,0 @@ -# Copyright 2020 The gRPC Authors -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Reference implementation for status mapping in gRPC Python.""" - -import grpc - -_CODE_TO_GRPC_CODE_MAPPING = {x.value[0]: x for x in grpc.StatusCode} - -GRPC_DETAILS_METADATA_KEY = 'grpc-status-details-bin' - - -def code_to_grpc_status_code(code): - try: - return _CODE_TO_GRPC_CODE_MAPPING[code] - except KeyError: - raise ValueError('Invalid status code %s' % code) diff --git a/src/python/grpcio_status/grpc_status/rpc_status.py b/src/python/grpcio_status/grpc_status/rpc_status.py index d0ec08e3a5d..ec78c477694 100644 --- a/src/python/grpcio_status/grpc_status/rpc_status.py +++ b/src/python/grpcio_status/grpc_status/rpc_status.py @@ -14,12 +14,14 @@ """Reference implementation for status mapping in gRPC Python.""" import collections -import sys import grpc from google.rpc import status_pb2 -from ._common import code_to_grpc_status_code, GRPC_DETAILS_METADATA_KEY + +_CODE_TO_GRPC_CODE_MAPPING = {x.value[0]: x for x in grpc.StatusCode} + +_GRPC_DETAILS_METADATA_KEY = 'grpc-status-details-bin' class _Status( @@ -29,6 +31,13 @@ class _Status( pass +def _code_to_grpc_status_code(code): + try: + return _CODE_TO_GRPC_CODE_MAPPING[code] + except KeyError: + raise ValueError('Invalid status code %s' % code) + + def from_call(call): """Returns a google.rpc.status.Status message corresponding to a given grpc.Call. @@ -47,12 +56,13 @@ def from_call(call): if call.trailing_metadata() is None: return None for key, value in call.trailing_metadata(): - if key == GRPC_DETAILS_METADATA_KEY: + if key == _GRPC_DETAILS_METADATA_KEY: rich_status = status_pb2.Status.FromString(value) if call.code().value[0] != rich_status.code: raise ValueError( 'Code in Status proto (%s) doesn\'t match status code (%s)' - % (code_to_grpc_status_code(rich_status.code), call.code())) + % + (_code_to_grpc_status_code(rich_status.code), call.code())) if call.details() != rich_status.message: raise ValueError( 'Message in Status proto (%s) doesn\'t match status details (%s)' @@ -73,17 +83,7 @@ def to_status(status): Returns: A grpc.Status instance representing the input google.rpc.status.Status message. """ - return _Status(code=code_to_grpc_status_code(status.code), + return _Status(code=_code_to_grpc_status_code(status.code), details=status.message, - trailing_metadata=((GRPC_DETAILS_METADATA_KEY, + trailing_metadata=((_GRPC_DETAILS_METADATA_KEY, status.SerializeToString()),)) - - -__all__ = [ - 'from_call', - 'to_status', -] - -if sys.version_info[0] >= 3 and sys.version_info[1] >= 6: - from . import _async as aio # pylint: disable=unused-import - __all__.append('aio') diff --git a/src/python/grpcio_tests/tests_aio/status/BUILD.bazel b/src/python/grpcio_tests/tests_aio/status/BUILD.bazel deleted file mode 100644 index 2fd82f2684c..00000000000 --- a/src/python/grpcio_tests/tests_aio/status/BUILD.bazel +++ /dev/null @@ -1,30 +0,0 @@ -# Copyright 2020 The gRPC Authors -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -load("@grpc_python_dependencies//:requirements.bzl", "requirement") - -py_test( - name = "grpc_status_test", - size = "small", - srcs = ["grpc_status_test.py"], - imports = ["../../"], - python_version = "PY3", - deps = [ - "//src/python/grpcio/grpc:grpcio", - "//src/python/grpcio_status/grpc_status", - "//src/python/grpcio_tests/tests_aio/unit:_test_base", - requirement("protobuf"), - requirement("googleapis-common-protos"), - ], -) diff --git a/src/python/grpcio_tests/tests_aio/status/__init__.py b/src/python/grpcio_tests/tests_aio/status/__init__.py deleted file mode 100644 index 1517f71d093..00000000000 --- a/src/python/grpcio_tests/tests_aio/status/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright 2020 The gRPC Authors -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. diff --git a/src/python/grpcio_tests/tests_aio/status/grpc_status_test.py b/src/python/grpcio_tests/tests_aio/status/grpc_status_test.py deleted file mode 100644 index 980cf5a67e7..00000000000 --- a/src/python/grpcio_tests/tests_aio/status/grpc_status_test.py +++ /dev/null @@ -1,175 +0,0 @@ -# Copyright 2020 The gRPC Authors -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Tests of grpc_status with gRPC AsyncIO stack.""" - -import logging -import traceback -import unittest - -import grpc -from google.protobuf import any_pb2 -from google.rpc import code_pb2, error_details_pb2, status_pb2 -from grpc.experimental import aio - -from grpc_status import rpc_status -from tests_aio.unit._test_base import AioTestBase - -_STATUS_OK = '/test/StatusOK' -_STATUS_NOT_OK = '/test/StatusNotOk' -_ERROR_DETAILS = '/test/ErrorDetails' -_INCONSISTENT = '/test/Inconsistent' -_INVALID_CODE = '/test/InvalidCode' - -_REQUEST = b'\x00\x00\x00' -_RESPONSE = b'\x01\x01\x01' - -_GRPC_DETAILS_METADATA_KEY = 'grpc-status-details-bin' - -_STATUS_DETAILS = 'This is an error detail' -_STATUS_DETAILS_ANOTHER = 'This is another error detail' - - -async def _ok_unary_unary(request, servicer_context): - return _RESPONSE - - -async def _not_ok_unary_unary(request, servicer_context): - await servicer_context.abort(grpc.StatusCode.INTERNAL, _STATUS_DETAILS) - - -async def _error_details_unary_unary(request, servicer_context): - details = any_pb2.Any() - details.Pack( - error_details_pb2.DebugInfo(stack_entries=traceback.format_stack(), - detail='Intentionally invoked')) - rich_status = status_pb2.Status( - code=code_pb2.INTERNAL, - message=_STATUS_DETAILS, - details=[details], - ) - await servicer_context.abort_with_status(rpc_status.to_status(rich_status)) - - -async def _inconsistent_unary_unary(request, servicer_context): - rich_status = status_pb2.Status( - code=code_pb2.INTERNAL, - message=_STATUS_DETAILS, - ) - servicer_context.set_code(grpc.StatusCode.NOT_FOUND) - servicer_context.set_details(_STATUS_DETAILS_ANOTHER) - # User put inconsistent status information in trailing metadata - servicer_context.set_trailing_metadata( - ((_GRPC_DETAILS_METADATA_KEY, rich_status.SerializeToString()),)) - - -async def _invalid_code_unary_unary(request, servicer_context): - rich_status = status_pb2.Status( - code=42, - message='Invalid code', - ) - await servicer_context.abort_with_status(rpc_status.to_status(rich_status)) - - -class _GenericHandler(grpc.GenericRpcHandler): - - def service(self, handler_call_details): - if handler_call_details.method == _STATUS_OK: - return grpc.unary_unary_rpc_method_handler(_ok_unary_unary) - elif handler_call_details.method == _STATUS_NOT_OK: - return grpc.unary_unary_rpc_method_handler(_not_ok_unary_unary) - elif handler_call_details.method == _ERROR_DETAILS: - return grpc.unary_unary_rpc_method_handler( - _error_details_unary_unary) - elif handler_call_details.method == _INCONSISTENT: - return grpc.unary_unary_rpc_method_handler( - _inconsistent_unary_unary) - elif handler_call_details.method == _INVALID_CODE: - return grpc.unary_unary_rpc_method_handler( - _invalid_code_unary_unary) - else: - return None - - -class StatusTest(AioTestBase): - - async def setUp(self): - self._server = aio.server() - self._server.add_generic_rpc_handlers((_GenericHandler(),)) - port = self._server.add_insecure_port('[::]:0') - await self._server.start() - - self._channel = aio.insecure_channel('localhost:%d' % port) - - async def tearDown(self): - await self._server.stop(None) - await self._channel.close() - - async def test_status_ok(self): - call = self._channel.unary_unary(_STATUS_OK)(_REQUEST) - - # Succeed RPC doesn't have status - status = await rpc_status.aio.from_call(call) - self.assertIs(status, None) - - async def test_status_not_ok(self): - call = self._channel.unary_unary(_STATUS_NOT_OK)(_REQUEST) - with self.assertRaises(aio.AioRpcError) as exception_context: - await call - rpc_error = exception_context.exception - - self.assertEqual(rpc_error.code(), grpc.StatusCode.INTERNAL) - # Failed RPC doesn't automatically generate status - status = await rpc_status.aio.from_call(call) - self.assertIs(status, None) - - async def test_error_details(self): - call = self._channel.unary_unary(_ERROR_DETAILS)(_REQUEST) - with self.assertRaises(aio.AioRpcError) as exception_context: - await call - rpc_error = exception_context.exception - - status = await rpc_status.aio.from_call(call) - self.assertEqual(rpc_error.code(), grpc.StatusCode.INTERNAL) - self.assertEqual(status.code, code_pb2.Code.Value('INTERNAL')) - - # Check if the underlying proto message is intact - self.assertTrue(status.details[0].Is( - error_details_pb2.DebugInfo.DESCRIPTOR)) - info = error_details_pb2.DebugInfo() - status.details[0].Unpack(info) - self.assertIn('_error_details_unary_unary', info.stack_entries[-1]) - - async def test_code_message_validation(self): - call = self._channel.unary_unary(_INCONSISTENT)(_REQUEST) - with self.assertRaises(aio.AioRpcError) as exception_context: - await call - rpc_error = exception_context.exception - self.assertEqual(rpc_error.code(), grpc.StatusCode.NOT_FOUND) - - # Code/Message validation failed - with self.assertRaises(ValueError): - await rpc_status.aio.from_call(call) - - async def test_invalid_code(self): - with self.assertRaises(aio.AioRpcError) as exception_context: - await self._channel.unary_unary(_INVALID_CODE)(_REQUEST) - rpc_error = exception_context.exception - self.assertEqual(rpc_error.code(), grpc.StatusCode.UNKNOWN) - # Invalid status code exception raised during coversion - self.assertIn('Invalid status code', rpc_error.details()) - - -if __name__ == '__main__': - logging.basicConfig() - unittest.main(verbosity=2) diff --git a/src/python/grpcio_tests/tests_aio/tests.json b/src/python/grpcio_tests/tests_aio/tests.json index 111607a3509..0bdd1f72e50 100644 --- a/src/python/grpcio_tests/tests_aio/tests.json +++ b/src/python/grpcio_tests/tests_aio/tests.json @@ -3,7 +3,6 @@ "health_check.health_servicer_test.HealthServicerTest", "interop.local_interop_test.InsecureLocalInteropTest", "interop.local_interop_test.SecureLocalInteropTest", - "status.grpc_status_test.StatusTest", "unit._metadata_test.TestTypeMetadata", "unit.abort_test.TestAbort", "unit.aio_rpc_error_test.TestAioRpcError", From 77811ef32354510d05d969fcb270e131a5d56f8a Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Wed, 22 Apr 2020 16:01:51 -0700 Subject: [PATCH 600/758] Make completion queue shutdown stricter --- .../grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi index 15d2e18f3d7..f42929461a0 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi @@ -15,6 +15,7 @@ import socket cdef gpr_timespec _GPR_INF_FUTURE = gpr_inf_future(GPR_CLOCK_REALTIME) +cdef float _POLL_AWAKE_INTERVAL_S = 0.2 IF UNAME_SYSNAME == "Windows": @@ -58,8 +59,8 @@ cdef class PollerCompletionQueue(BaseCompletionQueue): while not self._shutdown: event = grpc_completion_queue_next(self._cq, - _GPR_INF_FUTURE, - NULL) + _GPR_INF_FUTURE, + NULL) if event.type == GRPC_QUEUE_TIMEOUT: with gil: @@ -80,6 +81,8 @@ cdef class PollerCompletionQueue(BaseCompletionQueue): self._loop.remove_reader(self._read_socket) # TODO(https://github.com/grpc/grpc/issues/22365) perform graceful shutdown grpc_completion_queue_shutdown(self._cq) + while not self._shutdown: + self._poller_thread.join(timeout=_POLL_AWAKE_INTERVAL_S) grpc_completion_queue_destroy(self._cq) def _handle_events(self): From 004a3c3253f9dec749cebf6d97d5d02a86e17e84 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Thu, 23 Apr 2020 14:16:36 -0700 Subject: [PATCH 601/758] Weaken our promise --- doc/python/sphinx/glossary.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/python/sphinx/glossary.rst b/doc/python/sphinx/glossary.rst index fe7be23ffcb..a4daa31d180 100644 --- a/doc/python/sphinx/glossary.rst +++ b/doc/python/sphinx/glossary.rst @@ -43,7 +43,8 @@ Glossary channel_arguments A list of key-value pairs to configure the underlying gRPC Core channel or server object. Channel arguments are meant for advanced usages and contain - experimental API. Full list channel arguments can be found under the + experimental API (some may not labeled as experimental). Full list of + available channel arguments and documentation can be found under the "grpc_arg_keys" section of "grpc_types.h" header file (|grpc_types_link|). For example, if you want to disable TCP port reuse, you may construct channel arguments like: ``options = (('grpc.so_reuseport', 0),)``. From c0f82fc5953c28ce7d912edab2b3a13e38eebc0b Mon Sep 17 00:00:00 2001 From: "Mark D. Roth" Date: Thu, 23 Apr 2020 14:42:44 -0700 Subject: [PATCH 602/758] Remove StringLess and src/core/lib/gprpp/map.h --- BUILD | 1 - BUILD.gn | 1 - build_autogenerated.yaml | 1 - gRPC-C++.podspec | 2 - gRPC-Core.podspec | 2 - grpc.gemspec | 1 - package.xml | 1 - .../filters/client_channel/backend_metric.cc | 4 +- .../filters/client_channel/client_channel.cc | 47 ++++++++--------- .../health/health_check_client.cc | 7 +-- .../health/health_check_client.h | 6 ++- .../ext/filters/client_channel/lb_policy.h | 5 +- .../client_channel/resolver_result_parsing.cc | 15 +++--- .../client_channel/resolver_result_parsing.h | 6 +-- .../ext/filters/client_channel/subchannel.cc | 43 ++++++++-------- .../ext/filters/client_channel/subchannel.h | 18 ++++--- .../client_channel/xds/xds_bootstrap.h | 1 - .../filters/client_channel/xds/xds_client.cc | 3 +- .../filters/client_channel/xds/xds_client.h | 2 +- .../client_channel/xds/xds_client_stats.h | 4 +- src/core/lib/channel/channelz.h | 2 +- src/core/lib/channel/channelz_registry.h | 3 +- src/core/lib/gprpp/map.h | 51 ------------------- src/core/lib/transport/connectivity_state.h | 3 +- .../client_channel/service_config_test.cc | 4 +- test/cpp/end2end/xds_end2end_test.cc | 2 +- tools/doxygen/Doxyfile.c++.internal | 1 - tools/doxygen/Doxyfile.core.internal | 1 - 28 files changed, 85 insertions(+), 152 deletions(-) delete mode 100644 src/core/lib/gprpp/map.h diff --git a/BUILD b/BUILD index 91cd3488408..8be2c685cd8 100644 --- a/BUILD +++ b/BUILD @@ -551,7 +551,6 @@ grpc_cc_library( "src/core/lib/gprpp/global_config_generic.h", "src/core/lib/gprpp/host_port.h", "src/core/lib/gprpp/manual_constructor.h", - "src/core/lib/gprpp/map.h", "src/core/lib/gprpp/memory.h", "src/core/lib/gprpp/mpscq.h", "src/core/lib/gprpp/string_view.h", diff --git a/BUILD.gn b/BUILD.gn index 9ec801e373c..40dfa4bf46c 100644 --- a/BUILD.gn +++ b/BUILD.gn @@ -156,7 +156,6 @@ config("grpc_config") { "src/core/lib/gprpp/host_port.cc", "src/core/lib/gprpp/host_port.h", "src/core/lib/gprpp/manual_constructor.h", - "src/core/lib/gprpp/map.h", "src/core/lib/gprpp/memory.h", "src/core/lib/gprpp/mpscq.cc", "src/core/lib/gprpp/mpscq.h", diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml index d01ff14cc58..560904729ad 100644 --- a/build_autogenerated.yaml +++ b/build_autogenerated.yaml @@ -299,7 +299,6 @@ libs: - src/core/lib/gprpp/global_config_generic.h - src/core/lib/gprpp/host_port.h - src/core/lib/gprpp/manual_constructor.h - - src/core/lib/gprpp/map.h - src/core/lib/gprpp/memory.h - src/core/lib/gprpp/mpscq.h - src/core/lib/gprpp/string_view.h diff --git a/gRPC-C++.podspec b/gRPC-C++.podspec index 77e015d1d97..b94955f47a4 100644 --- a/gRPC-C++.podspec +++ b/gRPC-C++.podspec @@ -419,7 +419,6 @@ Pod::Spec.new do |s| 'src/core/lib/gprpp/global_config_generic.h', 'src/core/lib/gprpp/host_port.h', 'src/core/lib/gprpp/manual_constructor.h', - 'src/core/lib/gprpp/map.h', 'src/core/lib/gprpp/memory.h', 'src/core/lib/gprpp/mpscq.h', 'src/core/lib/gprpp/orphanable.h', @@ -869,7 +868,6 @@ Pod::Spec.new do |s| 'src/core/lib/gprpp/global_config_generic.h', 'src/core/lib/gprpp/host_port.h', 'src/core/lib/gprpp/manual_constructor.h', - 'src/core/lib/gprpp/map.h', 'src/core/lib/gprpp/memory.h', 'src/core/lib/gprpp/mpscq.h', 'src/core/lib/gprpp/orphanable.h', diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec index a9c11d7d933..d04fa0aaabc 100644 --- a/gRPC-Core.podspec +++ b/gRPC-Core.podspec @@ -611,7 +611,6 @@ Pod::Spec.new do |s| 'src/core/lib/gprpp/host_port.cc', 'src/core/lib/gprpp/host_port.h', 'src/core/lib/gprpp/manual_constructor.h', - 'src/core/lib/gprpp/map.h', 'src/core/lib/gprpp/memory.h', 'src/core/lib/gprpp/mpscq.cc', 'src/core/lib/gprpp/mpscq.h', @@ -1225,7 +1224,6 @@ Pod::Spec.new do |s| 'src/core/lib/gprpp/global_config_generic.h', 'src/core/lib/gprpp/host_port.h', 'src/core/lib/gprpp/manual_constructor.h', - 'src/core/lib/gprpp/map.h', 'src/core/lib/gprpp/memory.h', 'src/core/lib/gprpp/mpscq.h', 'src/core/lib/gprpp/orphanable.h', diff --git a/grpc.gemspec b/grpc.gemspec index 7042206375a..e2f6580651e 100644 --- a/grpc.gemspec +++ b/grpc.gemspec @@ -533,7 +533,6 @@ Gem::Specification.new do |s| s.files += %w( src/core/lib/gprpp/host_port.cc ) s.files += %w( src/core/lib/gprpp/host_port.h ) s.files += %w( src/core/lib/gprpp/manual_constructor.h ) - s.files += %w( src/core/lib/gprpp/map.h ) s.files += %w( src/core/lib/gprpp/memory.h ) s.files += %w( src/core/lib/gprpp/mpscq.cc ) s.files += %w( src/core/lib/gprpp/mpscq.h ) diff --git a/package.xml b/package.xml index 862ea4f566c..c5294e90da6 100644 --- a/package.xml +++ b/package.xml @@ -513,7 +513,6 @@ - diff --git a/src/core/ext/filters/client_channel/backend_metric.cc b/src/core/ext/filters/client_channel/backend_metric.cc index b36614f5b80..dbc296a39d4 100644 --- a/src/core/ext/filters/client_channel/backend_metric.cc +++ b/src/core/ext/filters/client_channel/backend_metric.cc @@ -26,12 +26,12 @@ namespace grpc_core { namespace { template -std::map ParseMap( +std::map ParseMap( udpa_data_orca_v1_OrcaLoadReport* msg, EntryType** (*entry_func)(udpa_data_orca_v1_OrcaLoadReport*, size_t*), upb_strview (*key_func)(const EntryType*), double (*value_func)(const EntryType*), Arena* arena) { - std::map result; + std::map result; size_t size; const auto* const* entries = entry_func(msg, &size); for (size_t i = 0; i < size; ++i) { diff --git a/src/core/ext/filters/client_channel/client_channel.cc b/src/core/ext/filters/client_channel/client_channel.cc index a66a3a615c7..97fc16822ef 100644 --- a/src/core/ext/filters/client_channel/client_channel.cc +++ b/src/core/ext/filters/client_channel/client_channel.cc @@ -26,6 +26,7 @@ #include #include +#include #include #include @@ -56,7 +57,6 @@ #include "src/core/lib/channel/status_util.h" #include "src/core/lib/gpr/string.h" #include "src/core/lib/gprpp/manual_constructor.h" -#include "src/core/lib/gprpp/map.h" #include "src/core/lib/gprpp/sync.h" #include "src/core/lib/iomgr/iomgr.h" #include "src/core/lib/iomgr/polling_entity.h" @@ -295,7 +295,7 @@ class ChannelData { RefCountedPtr subchannel_pool_; OrphanablePtr resolving_lb_policy_; ConnectivityStateTracker state_tracker_; - grpc_core::UniquePtr health_check_service_name_; + std::string health_check_service_name_; RefCountedPtr saved_service_config_; bool received_first_resolver_result_ = false; // The number of SubchannelWrapper instances referencing a given Subchannel. @@ -850,7 +850,7 @@ class CallData { class ChannelData::SubchannelWrapper : public SubchannelInterface { public: SubchannelWrapper(ChannelData* chand, Subchannel* subchannel, - grpc_core::UniquePtr health_check_service_name) + std::string health_check_service_name) : SubchannelInterface(&grpc_client_channel_routing_trace), chand_(chand), subchannel_(subchannel), @@ -897,7 +897,7 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface { grpc_connectivity_state CheckConnectivityState() override { RefCountedPtr connected_subchannel; grpc_connectivity_state connectivity_state = - subchannel_->CheckConnectivityState(health_check_service_name_.get(), + subchannel_->CheckConnectivityState(health_check_service_name_, &connected_subchannel); MaybeUpdateConnectedSubchannel(std::move(connected_subchannel)); return connectivity_state; @@ -912,9 +912,7 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface { Ref(DEBUG_LOCATION, "WatcherWrapper"), initial_state); subchannel_->WatchConnectivityState( - initial_state, - grpc_core::UniquePtr( - gpr_strdup(health_check_service_name_.get())), + initial_state, health_check_service_name_, RefCountedPtr( watcher_wrapper)); } @@ -923,7 +921,7 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface { ConnectivityStateWatcherInterface* watcher) override { auto it = watcher_map_.find(watcher); GPR_ASSERT(it != watcher_map_.end()); - subchannel_->CancelConnectivityStateWatch(health_check_service_name_.get(), + subchannel_->CancelConnectivityStateWatch(health_check_service_name_, it->second); watcher_map_.erase(it); } @@ -936,14 +934,13 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface { return subchannel_->channel_args(); } - void UpdateHealthCheckServiceName( - grpc_core::UniquePtr health_check_service_name) { + void UpdateHealthCheckServiceName(std::string health_check_service_name) { if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) { gpr_log(GPR_INFO, "chand=%p: subchannel wrapper %p: updating health check service " "name from \"%s\" to \"%s\"", - chand_, this, health_check_service_name_.get(), - health_check_service_name.get()); + chand_, this, health_check_service_name_.c_str(), + health_check_service_name.c_str()); } for (auto& p : watcher_map_) { WatcherWrapper*& watcher_wrapper = p.second; @@ -958,13 +955,11 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface { // problem, we may be able to handle it by waiting for the new // watcher to report READY before we use it to replace the old one. WatcherWrapper* replacement = watcher_wrapper->MakeReplacement(); - subchannel_->CancelConnectivityStateWatch( - health_check_service_name_.get(), watcher_wrapper); + subchannel_->CancelConnectivityStateWatch(health_check_service_name_, + watcher_wrapper); watcher_wrapper = replacement; subchannel_->WatchConnectivityState( - replacement->last_seen_state(), - grpc_core::UniquePtr( - gpr_strdup(health_check_service_name.get())), + replacement->last_seen_state(), health_check_service_name, RefCountedPtr( replacement)); } @@ -1102,7 +1097,7 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface { ChannelData* chand_; Subchannel* subchannel_; - grpc_core::UniquePtr health_check_service_name_; + std::string health_check_service_name_; // Maps from the address of the watcher passed to us by the LB policy // to the address of the WrapperWatcher that we passed to the underlying // subchannel. This is needed so that when the LB policy calls @@ -1265,10 +1260,9 @@ class ChannelData::ClientChannelControlHelper const grpc_channel_args& args) override { bool inhibit_health_checking = grpc_channel_arg_get_bool( grpc_channel_args_find(&args, GRPC_ARG_INHIBIT_HEALTH_CHECKING), false); - grpc_core::UniquePtr health_check_service_name; + std::string health_check_service_name; if (!inhibit_health_checking) { - health_check_service_name.reset( - gpr_strdup(chand_->health_check_service_name_.get())); + health_check_service_name = chand_->health_check_service_name_; } static const char* args_to_remove[] = { GRPC_ARG_INHIBIT_HEALTH_CHECKING, @@ -1463,7 +1457,7 @@ void ChannelData::UpdateStateAndPickerLocked( std::unique_ptr picker) { // Clean the control plane when entering IDLE. if (picker_ == nullptr) { - health_check_service_name_.reset(); + health_check_service_name_.clear(); saved_service_config_.reset(); received_first_resolver_result_ = false; } @@ -1706,16 +1700,15 @@ bool ChannelData::ProcessResolverResultLocked( } // Save health check service name. if (service_config != nullptr) { - chand->health_check_service_name_.reset( - gpr_strdup(parsed_service_config->health_check_service_name())); + chand->health_check_service_name_ = + parsed_service_config->health_check_service_name(); } else { - chand->health_check_service_name_.reset(); + chand->health_check_service_name_.clear(); } // Update health check service name used by existing subchannel wrappers. for (auto* subchannel_wrapper : chand->subchannel_wrappers_) { subchannel_wrapper->UpdateHealthCheckServiceName( - grpc_core::UniquePtr( - gpr_strdup(chand->health_check_service_name_.get()))); + chand->health_check_service_name_); } // Save service config. chand->saved_service_config_ = std::move(service_config); diff --git a/src/core/ext/filters/client_channel/health/health_check_client.cc b/src/core/ext/filters/client_channel/health/health_check_client.cc index 5c4aa986e80..ba1bc26d293 100644 --- a/src/core/ext/filters/client_channel/health/health_check_client.cc +++ b/src/core/ext/filters/client_channel/health/health_check_client.cc @@ -44,7 +44,7 @@ TraceFlag grpc_health_check_client_trace(false, "health_check_client"); // HealthCheckClient::HealthCheckClient( - const char* service_name, + absl::string_view service_name, RefCountedPtr connected_subchannel, grpc_pollset_set* interested_parties, RefCountedPtr channelz_node, @@ -171,13 +171,14 @@ void HealthCheckClient::OnRetryTimer(void* arg, grpc_error* error) { namespace { -void EncodeRequest(const char* service_name, +void EncodeRequest(absl::string_view service_name, ManualConstructor* send_message) { upb::Arena arena; grpc_health_v1_HealthCheckRequest* request_struct = grpc_health_v1_HealthCheckRequest_new(arena.ptr()); grpc_health_v1_HealthCheckRequest_set_service( - request_struct, upb_strview_makez(service_name)); + request_struct, + upb_strview_make(service_name.data(), service_name.size())); size_t buf_length; char* buf = grpc_health_v1_HealthCheckRequest_serialize( request_struct, arena.ptr(), &buf_length); diff --git a/src/core/ext/filters/client_channel/health/health_check_client.h b/src/core/ext/filters/client_channel/health/health_check_client.h index f8b9ade5ab6..9b90e607631 100644 --- a/src/core/ext/filters/client_channel/health/health_check_client.h +++ b/src/core/ext/filters/client_channel/health/health_check_client.h @@ -21,6 +21,8 @@ #include +#include "absl/strings/string_view.h" + #include #include @@ -44,7 +46,7 @@ namespace grpc_core { class HealthCheckClient : public InternallyRefCounted { public: - HealthCheckClient(const char* service_name, + HealthCheckClient(absl::string_view service_name, RefCountedPtr connected_subchannel, grpc_pollset_set* interested_parties, RefCountedPtr channelz_node, @@ -150,7 +152,7 @@ class HealthCheckClient : public InternallyRefCounted { void SetHealthStatusLocked(grpc_connectivity_state state, const char* reason); // Requires holding mu_. - const char* service_name_; // Do not own. + absl::string_view service_name_; RefCountedPtr connected_subchannel_; grpc_pollset_set* interested_parties_; // Do not own. RefCountedPtr channelz_node_; diff --git a/src/core/ext/filters/client_channel/lb_policy.h b/src/core/ext/filters/client_channel/lb_policy.h index 4f269e9d383..9cdd1d478f5 100644 --- a/src/core/ext/filters/client_channel/lb_policy.h +++ b/src/core/ext/filters/client_channel/lb_policy.h @@ -27,7 +27,6 @@ #include "src/core/ext/filters/client_channel/server_address.h" #include "src/core/ext/filters/client_channel/service_config.h" #include "src/core/ext/filters/client_channel/subchannel_interface.h" -#include "src/core/lib/gprpp/map.h" #include "src/core/lib/gprpp/orphanable.h" #include "src/core/lib/gprpp/ref_counted_ptr.h" #include "src/core/lib/gprpp/string_view.h" @@ -93,11 +92,11 @@ class LoadBalancingPolicy : public InternallyRefCounted { /// Application-specific requests cost metrics. Metric names are /// determined by the application. Each value is an absolute cost /// (e.g. 3487 bytes of storage) associated with the request. - std::map request_cost; + std::map request_cost; /// Application-specific resource utilization metrics. Metric names /// are determined by the application. Each value is expressed as a /// fraction of total resources available. - std::map utilization; + std::map utilization; }; /// Interface for accessing per-call state. diff --git a/src/core/ext/filters/client_channel/resolver_result_parsing.cc b/src/core/ext/filters/client_channel/resolver_result_parsing.cc index 77ee5fad3cd..0c23269c66a 100644 --- a/src/core/ext/filters/client_channel/resolver_result_parsing.cc +++ b/src/core/ext/filters/client_channel/resolver_result_parsing.cc @@ -284,13 +284,13 @@ grpc_error* ParseRetryThrottling( return GRPC_ERROR_CREATE_FROM_VECTOR("retryPolicy", &error_list); } -const char* ParseHealthCheckConfig(const Json& field, grpc_error** error) { +std::string ParseHealthCheckConfig(const Json& field, grpc_error** error) { GPR_DEBUG_ASSERT(error != nullptr && *error == GRPC_ERROR_NONE); - const char* service_name = nullptr; + std::string service_name; if (field.type() != Json::Type::OBJECT) { *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING( "field:healthCheckConfig error:should be of type object"); - return nullptr; + return service_name; } std::vector error_list; auto it = field.object_value().find("serviceName"); @@ -299,12 +299,9 @@ const char* ParseHealthCheckConfig(const Json& field, grpc_error** error) { error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( "field:serviceName error:should be of type string")); } else { - service_name = it->second.string_value().c_str(); + service_name = it->second.string_value(); } } - if (!error_list.empty()) { - return nullptr; - } *error = GRPC_ERROR_CREATE_FROM_VECTOR("field:healthCheckConfig", &error_list); return service_name; @@ -321,7 +318,7 @@ ClientChannelServiceConfigParser::ParseGlobalParams(const Json& json, std::string lb_policy_name; absl::optional retry_throttling; - const char* health_check_service_name = nullptr; + std::string health_check_service_name; // Parse LB config. auto it = json.object_value().find("loadBalancingConfig"); if (it != json.object_value().end()) { @@ -388,7 +385,7 @@ ClientChannelServiceConfigParser::ParseGlobalParams(const Json& json, if (*error == GRPC_ERROR_NONE) { return absl::make_unique( std::move(parsed_lb_config), std::move(lb_policy_name), - retry_throttling, health_check_service_name); + retry_throttling, std::move(health_check_service_name)); } return nullptr; } diff --git a/src/core/ext/filters/client_channel/resolver_result_parsing.h b/src/core/ext/filters/client_channel/resolver_result_parsing.h index b38ae730708..c736a2ef91f 100644 --- a/src/core/ext/filters/client_channel/resolver_result_parsing.h +++ b/src/core/ext/filters/client_channel/resolver_result_parsing.h @@ -49,7 +49,7 @@ class ClientChannelGlobalParsedConfig : public ServiceConfig::ParsedConfig { RefCountedPtr parsed_lb_config, std::string parsed_deprecated_lb_policy, const absl::optional& retry_throttling, - const char* health_check_service_name) + std::string health_check_service_name) : parsed_lb_config_(std::move(parsed_lb_config)), parsed_deprecated_lb_policy_(std::move(parsed_deprecated_lb_policy)), retry_throttling_(retry_throttling), @@ -67,7 +67,7 @@ class ClientChannelGlobalParsedConfig : public ServiceConfig::ParsedConfig { return parsed_deprecated_lb_policy_; } - const char* health_check_service_name() const { + const std::string& health_check_service_name() const { return health_check_service_name_; } @@ -75,7 +75,7 @@ class ClientChannelGlobalParsedConfig : public ServiceConfig::ParsedConfig { RefCountedPtr parsed_lb_config_; std::string parsed_deprecated_lb_policy_; absl::optional retry_throttling_; - const char* health_check_service_name_; + std::string health_check_service_name_; }; class ClientChannelMethodParsedConfig : public ServiceConfig::ParsedConfig { diff --git a/src/core/ext/filters/client_channel/subchannel.cc b/src/core/ext/filters/client_channel/subchannel.cc index f350b2ec36a..62d2eff4fa1 100644 --- a/src/core/ext/filters/client_channel/subchannel.cc +++ b/src/core/ext/filters/client_channel/subchannel.cc @@ -424,11 +424,10 @@ void Subchannel::ConnectivityStateWatcherList::NotifyLocked( class Subchannel::HealthWatcherMap::HealthWatcher : public AsyncConnectivityStateWatcherInterface { public: - HealthWatcher(Subchannel* c, - grpc_core::UniquePtr health_check_service_name, + HealthWatcher(Subchannel* c, absl::string_view health_check_service_name, grpc_connectivity_state subchannel_state) : subchannel_(c), - health_check_service_name_(std::move(health_check_service_name)), + health_check_service_name_(std::string(health_check_service_name)), state_(subchannel_state == GRPC_CHANNEL_READY ? GRPC_CHANNEL_CONNECTING : subchannel_state) { GRPC_SUBCHANNEL_WEAK_REF(subchannel_, "health_watcher"); @@ -440,8 +439,8 @@ class Subchannel::HealthWatcherMap::HealthWatcher GRPC_SUBCHANNEL_WEAK_UNREF(subchannel_, "health_watcher"); } - const char* health_check_service_name() const { - return health_check_service_name_.get(); + absl::string_view health_check_service_name() const { + return health_check_service_name_; } grpc_connectivity_state state() const { return state_; } @@ -500,12 +499,12 @@ class Subchannel::HealthWatcherMap::HealthWatcher void StartHealthCheckingLocked() { GPR_ASSERT(health_check_client_ == nullptr); health_check_client_ = MakeOrphanable( - health_check_service_name_.get(), subchannel_->connected_subchannel_, + health_check_service_name_, subchannel_->connected_subchannel_, subchannel_->pollset_set_, subchannel_->channelz_node_, Ref()); } Subchannel* subchannel_; - grpc_core::UniquePtr health_check_service_name_; + std::string health_check_service_name_; OrphanablePtr health_check_client_; grpc_connectivity_state state_; ConnectivityStateWatcherList watcher_list_; @@ -517,18 +516,17 @@ class Subchannel::HealthWatcherMap::HealthWatcher void Subchannel::HealthWatcherMap::AddWatcherLocked( Subchannel* subchannel, grpc_connectivity_state initial_state, - grpc_core::UniquePtr health_check_service_name, + absl::string_view health_check_service_name, RefCountedPtr watcher) { // If the health check service name is not already present in the map, // add it. - auto it = map_.find(health_check_service_name.get()); + auto it = map_.find(health_check_service_name); HealthWatcher* health_watcher; if (it == map_.end()) { - const char* key = health_check_service_name.get(); auto w = MakeOrphanable( - subchannel, std::move(health_check_service_name), subchannel->state_); + subchannel, health_check_service_name, subchannel->state_); health_watcher = w.get(); - map_[key] = std::move(w); + map_[w->health_check_service_name()] = std::move(w); } else { health_watcher = it->second.get(); } @@ -537,7 +535,7 @@ void Subchannel::HealthWatcherMap::AddWatcherLocked( } void Subchannel::HealthWatcherMap::RemoveWatcherLocked( - const char* health_check_service_name, + absl::string_view health_check_service_name, ConnectivityStateWatcherInterface* watcher) { auto it = map_.find(health_check_service_name); GPR_ASSERT(it != map_.end()); @@ -555,7 +553,7 @@ void Subchannel::HealthWatcherMap::NotifyLocked(grpc_connectivity_state state) { grpc_connectivity_state Subchannel::HealthWatcherMap::CheckConnectivityStateLocked( - Subchannel* subchannel, const char* health_check_service_name) { + Subchannel* subchannel, absl::string_view health_check_service_name) { auto it = map_.find(health_check_service_name); if (it == map_.end()) { // If the health check service name is not found in the map, we're @@ -799,11 +797,11 @@ channelz::SubchannelNode* Subchannel::channelz_node() { } grpc_connectivity_state Subchannel::CheckConnectivityState( - const char* health_check_service_name, + absl::string_view health_check_service_name, RefCountedPtr* connected_subchannel) { MutexLock lock(&mu_); grpc_connectivity_state state; - if (health_check_service_name == nullptr) { + if (health_check_service_name.empty()) { state = state_; } else { state = health_watcher_map_.CheckConnectivityStateLocked( @@ -817,34 +815,33 @@ grpc_connectivity_state Subchannel::CheckConnectivityState( void Subchannel::WatchConnectivityState( grpc_connectivity_state initial_state, - grpc_core::UniquePtr health_check_service_name, + absl::string_view health_check_service_name, RefCountedPtr watcher) { MutexLock lock(&mu_); grpc_pollset_set* interested_parties = watcher->interested_parties(); if (interested_parties != nullptr) { grpc_pollset_set_add_pollset_set(pollset_set_, interested_parties); } - if (health_check_service_name == nullptr) { + if (health_check_service_name.empty()) { if (state_ != initial_state) { new AsyncWatcherNotifierLocked(watcher, this, state_); } watcher_list_.AddWatcherLocked(std::move(watcher)); } else { - health_watcher_map_.AddWatcherLocked(this, initial_state, - std::move(health_check_service_name), - std::move(watcher)); + health_watcher_map_.AddWatcherLocked( + this, initial_state, health_check_service_name, std::move(watcher)); } } void Subchannel::CancelConnectivityStateWatch( - const char* health_check_service_name, + absl::string_view health_check_service_name, ConnectivityStateWatcherInterface* watcher) { MutexLock lock(&mu_); grpc_pollset_set* interested_parties = watcher->interested_parties(); if (interested_parties != nullptr) { grpc_pollset_set_del_pollset_set(pollset_set_, interested_parties); } - if (health_check_service_name == nullptr) { + if (health_check_service_name.empty()) { watcher_list_.RemoveWatcherLocked(watcher); } else { health_watcher_map_.RemoveWatcherLocked(health_check_service_name, watcher); diff --git a/src/core/ext/filters/client_channel/subchannel.h b/src/core/ext/filters/client_channel/subchannel.h index 9478fa7340c..bc45c28dd36 100644 --- a/src/core/ext/filters/client_channel/subchannel.h +++ b/src/core/ext/filters/client_channel/subchannel.h @@ -23,6 +23,8 @@ #include +#include "absl/strings/string_view.h" + #include "src/core/ext/filters/client_channel/client_channel_channelz.h" #include "src/core/ext/filters/client_channel/connector.h" #include "src/core/ext/filters/client_channel/subchannel_pool_interface.h" @@ -30,7 +32,6 @@ #include "src/core/lib/channel/channel_stack.h" #include "src/core/lib/gpr/time_precise.h" #include "src/core/lib/gprpp/arena.h" -#include "src/core/lib/gprpp/map.h" #include "src/core/lib/gprpp/ref_counted.h" #include "src/core/lib/gprpp/ref_counted_ptr.h" #include "src/core/lib/gprpp/sync.h" @@ -251,7 +252,7 @@ class Subchannel { // service name. // If the return value is GRPC_CHANNEL_READY, also sets *connected_subchannel. grpc_connectivity_state CheckConnectivityState( - const char* health_check_service_name, + absl::string_view health_check_service_name, RefCountedPtr* connected_subchannel); // Starts watching the subchannel's connectivity state. @@ -264,12 +265,12 @@ class Subchannel { // destroyed or when CancelConnectivityStateWatch() is called. void WatchConnectivityState( grpc_connectivity_state initial_state, - grpc_core::UniquePtr health_check_service_name, + absl::string_view health_check_service_name, RefCountedPtr watcher); // Cancels a connectivity state watch. // If the watcher has already been destroyed, this is a no-op. - void CancelConnectivityStateWatch(const char* health_check_service_name, + void CancelConnectivityStateWatch(absl::string_view health_check_service_name, ConnectivityStateWatcherInterface* watcher); // Attempt to connect to the backend. Has no effect if already connected. @@ -333,23 +334,24 @@ class Subchannel { public: void AddWatcherLocked( Subchannel* subchannel, grpc_connectivity_state initial_state, - grpc_core::UniquePtr health_check_service_name, + absl::string_view health_check_service_name, RefCountedPtr watcher); - void RemoveWatcherLocked(const char* health_check_service_name, + void RemoveWatcherLocked(absl::string_view health_check_service_name, ConnectivityStateWatcherInterface* watcher); // Notifies the watcher when the subchannel's state changes. void NotifyLocked(grpc_connectivity_state state); grpc_connectivity_state CheckConnectivityStateLocked( - Subchannel* subchannel, const char* health_check_service_name); + Subchannel* subchannel, absl::string_view health_check_service_name); void ShutdownLocked(); private: class HealthWatcher; - std::map, StringLess> map_; + // Key points to the health_check_service_name_ field in the value object. + std::map> map_; }; class ConnectedSubchannelStateWatcher; diff --git a/src/core/ext/filters/client_channel/xds/xds_bootstrap.h b/src/core/ext/filters/client_channel/xds/xds_bootstrap.h index 13eff49f575..f3e49ba0e5a 100644 --- a/src/core/ext/filters/client_channel/xds/xds_bootstrap.h +++ b/src/core/ext/filters/client_channel/xds/xds_bootstrap.h @@ -27,7 +27,6 @@ #include -#include "src/core/lib/gprpp/map.h" #include "src/core/lib/gprpp/memory.h" #include "src/core/lib/iomgr/error.h" #include "src/core/lib/json/json.h" diff --git a/src/core/ext/filters/client_channel/xds/xds_client.cc b/src/core/ext/filters/client_channel/xds/xds_client.cc index 9dc7b97773c..abfcc452526 100644 --- a/src/core/ext/filters/client_channel/xds/xds_client.cc +++ b/src/core/ext/filters/client_channel/xds/xds_client.cc @@ -22,6 +22,8 @@ #include #include +#include + #include "absl/container/inlined_vector.h" #include "absl/strings/str_format.h" #include "absl/strings/str_join.h" @@ -45,7 +47,6 @@ #include "src/core/lib/channel/channel_args.h" #include "src/core/lib/channel/channel_stack.h" #include "src/core/lib/gpr/string.h" -#include "src/core/lib/gprpp/map.h" #include "src/core/lib/gprpp/memory.h" #include "src/core/lib/gprpp/orphanable.h" #include "src/core/lib/gprpp/ref_counted_ptr.h" diff --git a/src/core/ext/filters/client_channel/xds/xds_client.h b/src/core/ext/filters/client_channel/xds/xds_client.h index 267a0fe9e19..ccdffc5f417 100644 --- a/src/core/ext/filters/client_channel/xds/xds_client.h +++ b/src/core/ext/filters/client_channel/xds/xds_client.h @@ -19,6 +19,7 @@ #include +#include #include #include "absl/types/optional.h" @@ -27,7 +28,6 @@ #include "src/core/ext/filters/client_channel/xds/xds_api.h" #include "src/core/ext/filters/client_channel/xds/xds_bootstrap.h" #include "src/core/ext/filters/client_channel/xds/xds_client_stats.h" -#include "src/core/lib/gprpp/map.h" #include "src/core/lib/gprpp/memory.h" #include "src/core/lib/gprpp/orphanable.h" #include "src/core/lib/gprpp/ref_counted.h" diff --git a/src/core/ext/filters/client_channel/xds/xds_client_stats.h b/src/core/ext/filters/client_channel/xds/xds_client_stats.h index 7a358d47b91..1539c9a4986 100644 --- a/src/core/ext/filters/client_channel/xds/xds_client_stats.h +++ b/src/core/ext/filters/client_channel/xds/xds_client_stats.h @@ -21,12 +21,14 @@ #include +#include + #include #include "src/core/lib/gprpp/atomic.h" -#include "src/core/lib/gprpp/map.h" #include "src/core/lib/gprpp/memory.h" #include "src/core/lib/gprpp/ref_counted.h" +#include "src/core/lib/gprpp/string_view.h" #include "src/core/lib/gprpp/sync.h" #include "src/core/lib/iomgr/exec_ctx.h" diff --git a/src/core/lib/channel/channelz.h b/src/core/lib/channel/channelz.h index 63502030966..3bf2598414e 100644 --- a/src/core/lib/channel/channelz.h +++ b/src/core/lib/channel/channelz.h @@ -23,6 +23,7 @@ #include +#include #include #include "absl/container/inlined_vector.h" @@ -31,7 +32,6 @@ #include "src/core/lib/gpr/time_precise.h" #include "src/core/lib/gprpp/atomic.h" #include "src/core/lib/gprpp/manual_constructor.h" -#include "src/core/lib/gprpp/map.h" #include "src/core/lib/gprpp/ref_counted.h" #include "src/core/lib/gprpp/ref_counted_ptr.h" #include "src/core/lib/gprpp/sync.h" diff --git a/src/core/lib/channel/channelz_registry.h b/src/core/lib/channel/channelz_registry.h index d777651c12f..ac6d442eff5 100644 --- a/src/core/lib/channel/channelz_registry.h +++ b/src/core/lib/channel/channelz_registry.h @@ -23,9 +23,10 @@ #include +#include + #include "src/core/lib/channel/channel_trace.h" #include "src/core/lib/channel/channelz.h" -#include "src/core/lib/gprpp/map.h" #include "src/core/lib/gprpp/sync.h" namespace grpc_core { diff --git a/src/core/lib/gprpp/map.h b/src/core/lib/gprpp/map.h deleted file mode 100644 index f14f3f6fc84..00000000000 --- a/src/core/lib/gprpp/map.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - * - * Copyright 2017 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef GRPC_CORE_LIB_GPRPP_MAP_H -#define GRPC_CORE_LIB_GPRPP_MAP_H - -#include - -#include - -#include - -#include "src/core/lib/gprpp/ref_counted_ptr.h" -#include "src/core/lib/gprpp/string_view.h" - -namespace grpc_core { - -struct StringLess { - bool operator()(const char* a, const char* b) const { - return strcmp(a, b) < 0; - } - bool operator()(const grpc_core::UniquePtr& a, - const grpc_core::UniquePtr& b) const { - return strcmp(a.get(), b.get()) < 0; - } - bool operator()(const StringView& a, const StringView& b) const { - const size_t min_size = std::min(a.size(), b.size()); - int c = strncmp(a.data(), b.data(), min_size); - if (c != 0) return c < 0; - return a.size() < b.size(); - } -}; - -} // namespace grpc_core - -#endif /* GRPC_CORE_LIB_GPRPP_MAP_H */ diff --git a/src/core/lib/transport/connectivity_state.h b/src/core/lib/transport/connectivity_state.h index 5ab62bed40c..ba9cc927e61 100644 --- a/src/core/lib/transport/connectivity_state.h +++ b/src/core/lib/transport/connectivity_state.h @@ -21,11 +21,12 @@ #include +#include + #include #include "src/core/lib/debug/trace.h" #include "src/core/lib/gprpp/atomic.h" -#include "src/core/lib/gprpp/map.h" #include "src/core/lib/gprpp/orphanable.h" #include "src/core/lib/iomgr/closure.h" #include "src/core/lib/iomgr/exec_ctx.h" diff --git a/test/core/client_channel/service_config_test.cc b/test/core/client_channel/service_config_test.cc index 5cdb51341ab..b0f5a3ae70f 100644 --- a/test/core/client_channel/service_config_test.cc +++ b/test/core/client_channel/service_config_test.cc @@ -913,8 +913,8 @@ TEST_F(ClientChannelParserTest, ValidHealthCheck) { static_cast( svc_cfg->GetGlobalParsedConfig(0)); ASSERT_NE(parsed_config, nullptr); - EXPECT_STREQ(parsed_config->health_check_service_name(), - "health_check_service_name"); + EXPECT_EQ(parsed_config->health_check_service_name(), + "health_check_service_name"); } TEST_F(ClientChannelParserTest, InvalidHealthCheckMultipleEntries) { diff --git a/test/cpp/end2end/xds_end2end_test.cc b/test/cpp/end2end/xds_end2end_test.cc index 9b6999639ac..864e76a16fc 100644 --- a/test/cpp/end2end/xds_end2end_test.cc +++ b/test/cpp/end2end/xds_end2end_test.cc @@ -17,6 +17,7 @@ */ #include +#include #include #include #include @@ -47,7 +48,6 @@ #include "src/core/ext/filters/client_channel/xds/xds_api.h" #include "src/core/lib/gpr/env.h" #include "src/core/lib/gpr/tmpfile.h" -#include "src/core/lib/gprpp/map.h" #include "src/core/lib/gprpp/ref_counted_ptr.h" #include "src/core/lib/gprpp/sync.h" #include "src/core/lib/iomgr/sockaddr.h" diff --git a/tools/doxygen/Doxyfile.c++.internal b/tools/doxygen/Doxyfile.c++.internal index c5d220fabf1..36a25781429 100644 --- a/tools/doxygen/Doxyfile.c++.internal +++ b/tools/doxygen/Doxyfile.c++.internal @@ -1496,7 +1496,6 @@ src/core/lib/gprpp/global_config_generic.h \ src/core/lib/gprpp/host_port.cc \ src/core/lib/gprpp/host_port.h \ src/core/lib/gprpp/manual_constructor.h \ -src/core/lib/gprpp/map.h \ src/core/lib/gprpp/memory.h \ src/core/lib/gprpp/mpscq.cc \ src/core/lib/gprpp/mpscq.h \ diff --git a/tools/doxygen/Doxyfile.core.internal b/tools/doxygen/Doxyfile.core.internal index 04f37228424..dbbf9104c61 100644 --- a/tools/doxygen/Doxyfile.core.internal +++ b/tools/doxygen/Doxyfile.core.internal @@ -1307,7 +1307,6 @@ src/core/lib/gprpp/global_config_generic.h \ src/core/lib/gprpp/host_port.cc \ src/core/lib/gprpp/host_port.h \ src/core/lib/gprpp/manual_constructor.h \ -src/core/lib/gprpp/map.h \ src/core/lib/gprpp/memory.h \ src/core/lib/gprpp/mpscq.cc \ src/core/lib/gprpp/mpscq.h \ From 0452c2a0cbf29401007dc1479234986d8749f0a0 Mon Sep 17 00:00:00 2001 From: Donna Dionne Date: Thu, 23 Apr 2020 15:43:30 -0700 Subject: [PATCH 603/758] Fixing xds_end2end_test.cc: ClientLoadReporting Vanilla tests 1. sometimes the StreamLoadStats service (in a separate thread) is not ready when we check to see if it has received and responded to request; moving the check to a bit later after we know that it has processed a report. 2. Drop test numbers can fall out of range by little bit: 366 > 360.6; increasing traffic to smooth the result (this fix has been effective for other similar flakes) --- test/cpp/end2end/xds_end2end_test.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/cpp/end2end/xds_end2end_test.cc b/test/cpp/end2end/xds_end2end_test.cc index 9b6999639ac..aa873490ca4 100644 --- a/test/cpp/end2end/xds_end2end_test.cc +++ b/test/cpp/end2end/xds_end2end_test.cc @@ -3826,9 +3826,6 @@ TEST_P(ClientLoadReportingTest, Vanilla) { EXPECT_EQ(kNumRpcsPerAddress + kNumFailuresPerAddress, backends_[i]->backend_service()->request_count()); } - // The LRS service got a single request, and sent a single response. - EXPECT_EQ(1U, balancers_[0]->lrs_service()->request_count()); - EXPECT_EQ(1U, balancers_[0]->lrs_service()->response_count()); // The load report received at the balancer should be correct. std::vector load_report = balancers_[0]->lrs_service()->WaitForLoadReport(); @@ -3843,6 +3840,9 @@ TEST_P(ClientLoadReportingTest, Vanilla) { EXPECT_EQ(kNumFailuresPerAddress * num_backends_ + num_failure, client_stats.total_error_requests()); EXPECT_EQ(0U, client_stats.total_dropped_requests()); + // The LRS service got a single request, and sent a single response. + EXPECT_EQ(1U, balancers_[0]->lrs_service()->request_count()); + EXPECT_EQ(1U, balancers_[0]->lrs_service()->response_count()); } // Tests that we don't include stats for clusters that are not requested @@ -3956,7 +3956,7 @@ class ClientLoadReportingWithDropTest : public XdsEnd2endTest { TEST_P(ClientLoadReportingWithDropTest, Vanilla) { SetNextResolution({}); SetNextResolutionForLbChannelAllBalancers(); - const size_t kNumRpcs = 3000; + const size_t kNumRpcs = 5000; const uint32_t kDropPerMillionForLb = 100000; const uint32_t kDropPerMillionForThrottle = 200000; const double kDropRateForLb = kDropPerMillionForLb / 1000000.0; From 5af3eafee07d9d112558407f2a55bd1f0e558d40 Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Fri, 24 Apr 2020 02:59:40 -0400 Subject: [PATCH 604/758] add mirror for each bazel http_archive dependency --- bazel/grpc_deps.bzl | 105 +++++++++++++++++++++++++++++++++++--------- 1 file changed, 84 insertions(+), 21 deletions(-) diff --git a/bazel/grpc_deps.bzl b/bazel/grpc_deps.bzl index bc66dfeb1fb..baf70f30db5 100644 --- a/bazel/grpc_deps.bzl +++ b/bazel/grpc_deps.bzl @@ -133,7 +133,10 @@ def grpc_deps(): # to obtain a boringssl archive with consistent sha256 sha256 = "a3d4de4f03cb321ef943678d72a045c9a19d26b23d6f4e313f97600c65201a27", strip_prefix = "boringssl-1c2769383f027befac5b75b6cedd25daf3bf4dcf", - url = "https://github.com/google/boringssl/archive/1c2769383f027befac5b75b6cedd25daf3bf4dcf.tar.gz", + urls = [ + "https://storage.googleapis.com/grpc-bazel-mirror/github.com/google/boringssl/archive/1c2769383f027befac5b75b6cedd25daf3bf4dcf.tar.gz", + "https://github.com/google/boringssl/archive/1c2769383f027befac5b75b6cedd25daf3bf4dcf.tar.gz", + ], ) if "zlib" not in native.existing_rules(): @@ -142,7 +145,10 @@ def grpc_deps(): build_file = "@com_github_grpc_grpc//third_party:zlib.BUILD", sha256 = "6d4d6640ca3121620995ee255945161821218752b551a1a180f4215f7d124d45", strip_prefix = "zlib-cacf7f1d4e3d44d871b605da3b647f07d718623f", - url = "https://github.com/madler/zlib/archive/cacf7f1d4e3d44d871b605da3b647f07d718623f.tar.gz", + urls = [ + "https://storage.googleapis.com/grpc-bazel-mirror/github.com/madler/zlib/archive/cacf7f1d4e3d44d871b605da3b647f07d718623f.tar.gz", + "https://github.com/madler/zlib/archive/cacf7f1d4e3d44d871b605da3b647f07d718623f.tar.gz", + ], ) if "com_google_protobuf" not in native.existing_rules(): @@ -150,7 +156,10 @@ def grpc_deps(): name = "com_google_protobuf", sha256 = "51398b0b97b353c1c226d0ade0bae80c80380e691cba7c1a108918986784a1c7", strip_prefix = "protobuf-29cd005ce1fe1a8fabf11e325cb13006a6646d59", - url = "https://github.com/google/protobuf/archive/29cd005ce1fe1a8fabf11e325cb13006a6646d59.tar.gz", + urls = [ + "https://storage.googleapis.com/grpc-bazel-mirror/github.com/google/protobuf/archive/29cd005ce1fe1a8fabf11e325cb13006a6646d59.tar.gz", + "https://github.com/google/protobuf/archive/29cd005ce1fe1a8fabf11e325cb13006a6646d59.tar.gz", + ], ) if "com_github_google_googletest" not in native.existing_rules(): @@ -158,7 +167,11 @@ def grpc_deps(): name = "com_github_google_googletest", sha256 = "443d383db648ebb8e391382c0ab63263b7091d03197f304390baac10f178a468", strip_prefix = "googletest-c9ccac7cb7345901884aabf5d1a786cfa6e2f397", - url = "https://github.com/google/googletest/archive/c9ccac7cb7345901884aabf5d1a786cfa6e2f397.tar.gz", # 2019-08-19 + urls = [ + # 2019-08-19 + "https://storage.googleapis.com/grpc-bazel-mirror/github.com/google/googletest/archive/c9ccac7cb7345901884aabf5d1a786cfa6e2f397.tar.gz", + "https://github.com/google/googletest/archive/c9ccac7cb7345901884aabf5d1a786cfa6e2f397.tar.gz", + ], ) if "rules_cc" not in native.existing_rules(): @@ -166,7 +179,11 @@ def grpc_deps(): name = "rules_cc", sha256 = "35f2fb4ea0b3e61ad64a369de284e4fbbdcdba71836a5555abb5e194cf119509", strip_prefix = "rules_cc-624b5d59dfb45672d4239422fa1e3de1822ee110", - url = "https://github.com/bazelbuild/rules_cc/archive/624b5d59dfb45672d4239422fa1e3de1822ee110.tar.gz", #2019-08-15 + urls = [ + #2019-08-15 + "https://storage.googleapis.com/grpc-bazel-mirror/github.com/bazelbuild/rules_cc/archive/624b5d59dfb45672d4239422fa1e3de1822ee110.tar.gz", + "https://github.com/bazelbuild/rules_cc/archive/624b5d59dfb45672d4239422fa1e3de1822ee110.tar.gz", + ], ) if "com_github_gflags_gflags" not in native.existing_rules(): @@ -174,7 +191,10 @@ def grpc_deps(): name = "com_github_gflags_gflags", sha256 = "63ae70ea3e05780f7547d03503a53de3a7d2d83ad1caaa443a31cb20aea28654", strip_prefix = "gflags-28f50e0fed19872e0fd50dd23ce2ee8cd759338e", - url = "https://github.com/gflags/gflags/archive/28f50e0fed19872e0fd50dd23ce2ee8cd759338e.tar.gz", + urls = [ + "https://storage.googleapis.com/grpc-bazel-mirror/github.com/gflags/gflags/archive/28f50e0fed19872e0fd50dd23ce2ee8cd759338e.tar.gz", + "https://github.com/gflags/gflags/archive/28f50e0fed19872e0fd50dd23ce2ee8cd759338e.tar.gz", + ], ) if "com_github_google_benchmark" not in native.existing_rules(): @@ -182,7 +202,10 @@ def grpc_deps(): name = "com_github_google_benchmark", sha256 = "f68aec93154d010324c05bcd8c5cc53468b87af88d87acb5ddcfaa1bba044837", strip_prefix = "benchmark-090faecb454fbd6e6e17a75ef8146acb037118d4", - url = "https://github.com/google/benchmark/archive/090faecb454fbd6e6e17a75ef8146acb037118d4.tar.gz", + urls = [ + "https://storage.googleapis.com/grpc-bazel-mirror/github.com/google/benchmark/archive/090faecb454fbd6e6e17a75ef8146acb037118d4.tar.gz", + "https://github.com/google/benchmark/archive/090faecb454fbd6e6e17a75ef8146acb037118d4.tar.gz", + ], ) if "com_github_cares_cares" not in native.existing_rules(): @@ -191,7 +214,10 @@ def grpc_deps(): build_file = "@com_github_grpc_grpc//third_party:cares/cares.BUILD", sha256 = "e8c2751ddc70fed9dc6f999acd92e232d5846f009ee1674f8aee81f19b2b915a", strip_prefix = "c-ares-e982924acee7f7313b4baa4ee5ec000c5e373c30", - url = "https://github.com/c-ares/c-ares/archive/e982924acee7f7313b4baa4ee5ec000c5e373c30.tar.gz", + urls = [ + "https://storage.googleapis.com/grpc-bazel-mirror/github.com/c-ares/c-ares/archive/e982924acee7f7313b4baa4ee5ec000c5e373c30.tar.gz", + "https://github.com/c-ares/c-ares/archive/e982924acee7f7313b4baa4ee5ec000c5e373c30.tar.gz", + ], ) if "com_google_absl" not in native.existing_rules(): @@ -199,7 +225,10 @@ def grpc_deps(): name = "com_google_absl", sha256 = "f368a8476f4e2e0eccf8a7318b98dafbe30b2600f4e3cf52636e5eb145aba06a", strip_prefix = "abseil-cpp-df3ea785d8c30a9503321a3d35ee7d35808f190d", - url = "https://github.com/abseil/abseil-cpp/archive/df3ea785d8c30a9503321a3d35ee7d35808f190d.tar.gz", + urls = [ + "https://storage.googleapis.com/grpc-bazel-mirror/github.com/abseil/abseil-cpp/archive/df3ea785d8c30a9503321a3d35ee7d35808f190d.tar.gz", + "https://github.com/abseil/abseil-cpp/archive/df3ea785d8c30a9503321a3d35ee7d35808f190d.tar.gz", + ], ) if "bazel_toolchains" not in native.existing_rules(): @@ -209,8 +238,8 @@ def grpc_deps(): sha256 = "0b36eef8a66f39c8dbae88e522d5bbbef49d5e66e834a982402c79962281be10", strip_prefix = "bazel-toolchains-1.0.1", urls = [ - "https://github.com/bazelbuild/bazel-toolchains/releases/download/1.0.1/bazel-toolchains-1.0.1.tar.gz", "https://mirror.bazel.build/github.com/bazelbuild/bazel-toolchains/archive/1.0.1.tar.gz", + "https://github.com/bazelbuild/bazel-toolchains/releases/download/1.0.1/bazel-toolchains-1.0.1.tar.gz", ], ) @@ -229,14 +258,20 @@ def grpc_deps(): name = "io_opencensus_cpp", sha256 = "90d6fafa8b1a2ea613bf662731d3086e1c2ed286f458a95c81744df2dbae41b1", strip_prefix = "opencensus-cpp-c9a4da319bc669a772928ffc55af4a61be1a1176", - url = "https://github.com/census-instrumentation/opencensus-cpp/archive/c9a4da319bc669a772928ffc55af4a61be1a1176.tar.gz", + urls = [ + "https://storage.googleapis.com/grpc-bazel-mirror/github.com/census-instrumentation/opencensus-cpp/archive/c9a4da319bc669a772928ffc55af4a61be1a1176.tar.gz", + "https://github.com/census-instrumentation/opencensus-cpp/archive/c9a4da319bc669a772928ffc55af4a61be1a1176.tar.gz", + ], ) if "upb" not in native.existing_rules(): http_archive( name = "upb", sha256 = "e9c136e56b98c8eb48ad1c9f8df4a6348e99f9f336ee6199c4259a312c2e3598", strip_prefix = "upb-d8f3d6f9d415b31f3ce56d46791706c38fa311bc", - url = "https://github.com/protocolbuffers/upb/archive/d8f3d6f9d415b31f3ce56d46791706c38fa311bc.tar.gz", + urls = [ + "https://storage.googleapis.com/grpc-bazel-mirror/github.com/protocolbuffers/upb/archive/d8f3d6f9d415b31f3ce56d46791706c38fa311bc.tar.gz", + "https://github.com/protocolbuffers/upb/archive/d8f3d6f9d415b31f3ce56d46791706c38fa311bc.tar.gz", + ], ) if "envoy_api" not in native.existing_rules(): @@ -244,28 +279,38 @@ def grpc_deps(): name = "envoy_api", sha256 = "4ba23e0370ec358d1050c020e00cd020f03644a733aaf8fd85cc43d17b92236a", strip_prefix = "data-plane-api-0487bbb43c3e8b54c7332f74ba7344d8265774f7", - url = "https://github.com/envoyproxy/data-plane-api/archive/0487bbb43c3e8b54c7332f74ba7344d8265774f7.tar.gz", + urls = [ + "https://storage.googleapis.com/grpc-bazel-mirror/github.com/envoyproxy/data-plane-api/archive/0487bbb43c3e8b54c7332f74ba7344d8265774f7.tar.gz", + "https://github.com/envoyproxy/data-plane-api/archive/0487bbb43c3e8b54c7332f74ba7344d8265774f7.tar.gz", + ], ) if "io_bazel_rules_go" not in native.existing_rules(): http_archive( name = "io_bazel_rules_go", - urls = ["https://github.com/bazelbuild/rules_go/releases/download/0.18.5/rules_go-0.18.5.tar.gz"], sha256 = "a82a352bffae6bee4e95f68a8d80a70e87f42c4741e6a448bec11998fcc82329", + urls = [ + "https://storage.googleapis.com/grpc-bazel-mirror/github.com/bazelbuild/rules_go/releases/download/0.18.5/rules_go-0.18.5.tar.gz", + "https://github.com/bazelbuild/rules_go/releases/download/0.18.5/rules_go-0.18.5.tar.gz", + ], ) if "build_bazel_rules_apple" not in native.existing_rules(): http_archive( name = "build_bazel_rules_apple", - url = "https://github.com/bazelbuild/rules_apple/archive/b869b0d3868d78a1d4ffd866ccb304fb68aa12c3.tar.gz", strip_prefix = "rules_apple-b869b0d3868d78a1d4ffd866ccb304fb68aa12c3", sha256 = "bdc8e66e70b8a75da23b79f1f8c6207356df07d041d96d2189add7ee0780cf4e", + urls = [ + "https://storage.googleapis.com/grpc-bazel-mirror/github.com/bazelbuild/rules_apple/archive/b869b0d3868d78a1d4ffd866ccb304fb68aa12c3.tar.gz", + "https://github.com/bazelbuild/rules_apple/archive/b869b0d3868d78a1d4ffd866ccb304fb68aa12c3.tar.gz", + ], ) if "build_bazel_apple_support" not in native.existing_rules(): http_archive( name = "build_bazel_apple_support", urls = [ + "https://storage.googleapis.com/grpc-bazel-mirror/github.com/bazelbuild/apple_support/releases/download/0.7.1/apple_support.0.7.1.tar.gz", "https://github.com/bazelbuild/apple_support/releases/download/0.7.1/apple_support.0.7.1.tar.gz", ], sha256 = "122ebf7fe7d1c8e938af6aeaee0efe788a3a2449ece5a8d6a428cb18d6f88033", @@ -277,7 +322,10 @@ def grpc_deps(): build_file = "@com_github_grpc_grpc//third_party:libuv.BUILD", sha256 = "dfb4fe1ff0b47340978490a14bf253475159ecfcbad46ab2a350c78f9ce3360f", strip_prefix = "libuv-15ae750151ac9341e5945eb38f8982d59fb99201", - url = "https://github.com/libuv/libuv/archive/15ae750151ac9341e5945eb38f8982d59fb99201.tar.gz", + urls = [ + "https://storage.googleapis.com/grpc-bazel-mirror/github.com/libuv/libuv/archive/15ae750151ac9341e5945eb38f8982d59fb99201.tar.gz", + "https://github.com/libuv/libuv/archive/15ae750151ac9341e5945eb38f8982d59fb99201.tar.gz", + ], ) grpc_python_deps() @@ -301,7 +349,10 @@ def grpc_test_only_deps(): name = "com_github_twisted_twisted", sha256 = "ca17699d0d62eafc5c28daf2c7d0a18e62ae77b4137300b6c7d7868b39b06139", strip_prefix = "twisted-twisted-17.5.0", - url = "https://github.com/twisted/twisted/archive/twisted-17.5.0.zip", + urls = [ + "https://storage.googleapis.com/grpc-bazel-mirror/github.com/twisted/twisted/archive/twisted-17.5.0.zip", + "https://github.com/twisted/twisted/archive/twisted-17.5.0.zip", + ], build_file = "@com_github_grpc_grpc//third_party:twisted.BUILD", ) @@ -310,7 +361,10 @@ def grpc_test_only_deps(): name = "com_github_yaml_pyyaml", sha256 = "6b4314b1b2051ddb9d4fcd1634e1fa9c1bb4012954273c9ff3ef689f6ec6c93e", strip_prefix = "pyyaml-3.12", - url = "https://github.com/yaml/pyyaml/archive/3.12.zip", + urls = [ + "https://storage.googleapis.com/grpc-bazel-mirror/github.com/yaml/pyyaml/archive/3.12.zip", + "https://github.com/yaml/pyyaml/archive/3.12.zip", + ], build_file = "@com_github_grpc_grpc//third_party:yaml.BUILD", ) @@ -319,7 +373,10 @@ def grpc_test_only_deps(): name = "com_github_twisted_incremental", sha256 = "f0ca93359ee70243ff7fbf2d904a6291810bd88cb80ed4aca6fa77f318a41a36", strip_prefix = "incremental-incremental-17.5.0", - url = "https://github.com/twisted/incremental/archive/incremental-17.5.0.zip", + urls = [ + "https://storage.googleapis.com/grpc-bazel-mirror/github.com/twisted/incremental/archive/incremental-17.5.0.zip", + "https://github.com/twisted/incremental/archive/incremental-17.5.0.zip", + ], build_file = "@com_github_grpc_grpc//third_party:incremental.BUILD", ) @@ -328,7 +385,10 @@ def grpc_test_only_deps(): name = "com_github_zopefoundation_zope_interface", sha256 = "e9579fc6149294339897be3aa9ecd8a29217c0b013fe6f44fcdae00e3204198a", strip_prefix = "zope.interface-4.4.3", - url = "https://github.com/zopefoundation/zope.interface/archive/4.4.3.zip", + urls = [ + "https://storage.googleapis.com/grpc-bazel-mirror/github.com/zopefoundation/zope.interface/archive/4.4.3.zip", + "https://github.com/zopefoundation/zope.interface/archive/4.4.3.zip", + ], build_file = "@com_github_grpc_grpc//third_party:zope_interface.BUILD", ) @@ -337,6 +397,9 @@ def grpc_test_only_deps(): name = "com_github_twisted_constantly", sha256 = "2702cd322161a579d2c0dbf94af4e57712eedc7bd7bbbdc554a230544f7d346c", strip_prefix = "constantly-15.1.0", - url = "https://github.com/twisted/constantly/archive/15.1.0.zip", + urls = [ + "https://storage.googleapis.com/grpc-bazel-mirror/github.com/twisted/constantly/archive/15.1.0.zip", + "https://github.com/twisted/constantly/archive/15.1.0.zip", + ], build_file = "@com_github_grpc_grpc//third_party:constantly.BUILD", ) From ca33752a4cb394f3470b9746611d4867baddfb49 Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Fri, 24 Apr 2020 04:31:35 -0400 Subject: [PATCH 605/758] script for updating bazel mirror --- bazel/update_mirror.sh | 43 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100755 bazel/update_mirror.sh diff --git a/bazel/update_mirror.sh b/bazel/update_mirror.sh new file mode 100755 index 00000000000..a757f397b13 --- /dev/null +++ b/bazel/update_mirror.sh @@ -0,0 +1,43 @@ +#!/bin/bash + +# Script to upload github archives for bazel dependencies to GCS, creating a reliable mirror link. +# Archives are copied to "grpc-bazel-mirror" GCS bucket (https://console.cloud.google.com/storage/browser/grpc-bazel-mirror?project=grpc-testing) +# and will by downloadable with the https://storage.googleapis.com/grpc-bazel-mirror/ prefix. + +set -e + +cd $(dirname $0)/.. + +# Create a temp directory to hold the versioned tarball, +# and clean it up when the script exits. +tmpdir="$(mktemp -d)" +function cleanup { + rm -rf "$tmpdir" +} +trap cleanup EXIT + +function upload { + local file="$1" + + echo "Downloading https://${file}" + curl -L --fail --output "${tmpdir}/archive" "https://${file}" + + echo "Uploading https://${file} to https://storage.googleapis.com/grpc-bazel-mirror/${file}" + gsutil cp -n "${tmpdir}/archive" "gs://grpc-bazel-mirror/${file}" # "-n" will skip existing files + + rm -rf "${tmpdir}/archive" +} + +# How to check that all mirror URLs work: +# 1. clean $HOME/.cache/bazel +# 2. bazel clean --expunge +# 3. bazel sync (failed downloads will print warnings) + +# A specific link can be upload manually by running e.g. +# upload "github.com/google/boringssl/archive/1c2769383f027befac5b75b6cedd25daf3bf4dcf.tar.gz" + +# Collect the github archives to mirror from grpc_deps.bzl +grep -o '"https://github.com/[^"]*"' bazel/grpc_deps.bzl | sed 's/^"https:\/\///' | sed 's/"$//' | while read -r line ; do + echo "Updating mirror for ${line}" + upload "${line}" +done From 4e7b000148ed9d6663142673949fe2be435a745b Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Fri, 24 Apr 2020 11:38:32 -0400 Subject: [PATCH 606/758] add copyright notice --- bazel/update_mirror.sh | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/bazel/update_mirror.sh b/bazel/update_mirror.sh index a757f397b13..81e3acdc97e 100755 --- a/bazel/update_mirror.sh +++ b/bazel/update_mirror.sh @@ -1,8 +1,23 @@ #!/bin/bash +# Copyright 2020 The gRPC Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. # Script to upload github archives for bazel dependencies to GCS, creating a reliable mirror link. # Archives are copied to "grpc-bazel-mirror" GCS bucket (https://console.cloud.google.com/storage/browser/grpc-bazel-mirror?project=grpc-testing) # and will by downloadable with the https://storage.googleapis.com/grpc-bazel-mirror/ prefix. +# +# This script should be run each time bazel dependencies are updated. set -e From fc5938ad41d63fe80abcbf290b479c88ae2f0e51 Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Fri, 24 Apr 2020 11:43:01 -0400 Subject: [PATCH 607/758] handle mirror urls in check_bazel_workspace.py --- tools/run_tests/sanity/check_bazel_workspace.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tools/run_tests/sanity/check_bazel_workspace.py b/tools/run_tests/sanity/check_bazel_workspace.py index 641692dc16e..99252b717af 100755 --- a/tools/run_tests/sanity/check_bazel_workspace.py +++ b/tools/run_tests/sanity/check_bazel_workspace.py @@ -109,7 +109,12 @@ class BazelEvalState(object): if args['name'] in _GRPC_BAZEL_ONLY_DEPS: self.names_and_urls[args['name']] = 'dont care' return - self.names_and_urls[args['name']] = args['url'] + url = args.get('url', None) + if not url: + # we will only be looking for git commit hashes, so concatenating + # the urls is fine. + url = ' '.join(args['urls']) + self.names_and_urls[args['name']] = url def git_repository(self, **args): assert self.names_and_urls.get(args['name']) is None From 5330ead3ab843920a5af05a1508a6642a876c7f5 Mon Sep 17 00:00:00 2001 From: Eric Gribkoff Date: Fri, 24 Apr 2020 00:45:19 -0700 Subject: [PATCH 608/758] Add --fail_on_failed_rpc flag to xds tests --- doc/xds-test-descriptions.md | 7 ++++ test/cpp/interop/xds_interop_client.cc | 18 ++++++--- .../linux/grpc_xds_bazel_test_in_docker.sh | 2 +- tools/run_tests/run_xds_tests.py | 40 ++++++++++++------- 4 files changed, 45 insertions(+), 22 deletions(-) diff --git a/doc/xds-test-descriptions.md b/doc/xds-test-descriptions.md index 999238a162e..46414384e95 100644 --- a/doc/xds-test-descriptions.md +++ b/doc/xds-test-descriptions.md @@ -25,6 +25,9 @@ The code for the xDS test client can be at: Clients should accept these arguments: +* --fail_on_failed_rpcs=BOOL + * If true, the client should exit with a non-zero return code if any RPCs + fail. Default is false. * --num_channels=CHANNELS * The number of channels to create to the server. * --qps=QPS @@ -88,6 +91,7 @@ Client parameters: 1. --num_channels=1 1. --qps=10 +1. --fail_on_failed_rpc=true Load balancer configuration: @@ -106,6 +110,7 @@ Client parameters: 1. --num_channels=1 1. --qps=10 +1. --fail_on_failed_rpc=true Load balancer configuration: @@ -220,6 +225,7 @@ Client parameters: 1. --num_channels=1 1. --qps=10 +1. --fail_on_failed_rpc=true Load balancer configuration: @@ -268,6 +274,7 @@ Client parameters: 1. --num_channels=1 1. --qps=10 +1. --fail_on_failed_rpc=true Load balancer configuration: diff --git a/test/cpp/interop/xds_interop_client.cc b/test/cpp/interop/xds_interop_client.cc index 6cb32b2b0e8..6d7f3c21690 100644 --- a/test/cpp/interop/xds_interop_client.cc +++ b/test/cpp/interop/xds_interop_client.cc @@ -38,10 +38,11 @@ #include "test/core/util/test_config.h" #include "test/cpp/util/test_config.h" +DEFINE_bool(fail_on_failed_rpc, false, "Fail client if any RPCs fail."); DEFINE_int32(num_channels, 1, "Number of channels."); DEFINE_bool(print_response, false, "Write RPC response to stdout."); DEFINE_int32(qps, 1, "Qps per channel."); -DEFINE_int32(rpc_timeout_sec, 10, "Per RPC timeout seconds."); +DEFINE_int32(rpc_timeout_sec, 30, "Per RPC timeout seconds."); DEFINE_string(server, "localhost:50051", "Address of server."); DEFINE_int32(stats_port, 50052, "Port to expose peer distribution stats service."); @@ -155,14 +156,19 @@ class TestClient { } } - if (FLAGS_print_response) { - if (call->status.ok()) { + if (!call->status.ok()) { + if (FLAGS_print_response || FLAGS_fail_on_failed_rpc) { + std::cout << "RPC failed: " << call->status.error_code() << ": " + << call->status.error_message() << std::endl; + } + if (FLAGS_fail_on_failed_rpc) { + abort(); + } + } else { + if (FLAGS_print_response) { std::cout << "Greeting: Hello world, this is " << call->response.hostname() << ", from " << call->context.peer() << std::endl; - } else { - std::cout << "RPC failed: " << call->status.error_code() << ": " - << call->status.error_message() << std::endl; } } diff --git a/tools/internal_ci/linux/grpc_xds_bazel_test_in_docker.sh b/tools/internal_ci/linux/grpc_xds_bazel_test_in_docker.sh index 943ba2b1981..54ade769e75 100755 --- a/tools/internal_ci/linux/grpc_xds_bazel_test_in_docker.sh +++ b/tools/internal_ci/linux/grpc_xds_bazel_test_in_docker.sh @@ -56,4 +56,4 @@ GRPC_VERBOSITY=debug GRPC_TRACE=xds_client,xds_resolver,cds_lb,eds_lb,priority_l --path_to_server_binary=/java_server/grpc-java/interop-testing/build/install/grpc-interop-testing/bin/xds-test-server \ --gcp_suffix=$(date '+%s') \ --verbose \ - --client_cmd='bazel-bin/test/cpp/interop/xds_interop_client --server=xds-experimental:///{server_uri} --stats_port={stats_port} --qps={qps}' + --client_cmd='bazel-bin/test/cpp/interop/xds_interop_client --server=xds-experimental:///{server_uri} --stats_port={stats_port} --qps={qps} {fail_on_failed_rpc}' diff --git a/tools/run_tests/run_xds_tests.py b/tools/run_tests/run_xds_tests.py index 8f1d9b151f8..4dc18494e6b 100755 --- a/tools/run_tests/run_xds_tests.py +++ b/tools/run_tests/run_xds_tests.py @@ -199,6 +199,7 @@ _INSTANCE_GROUP_SIZE = args.instance_group_size _NUM_TEST_RPCS = 10 * args.qps _WAIT_FOR_STATS_SEC = 180 _WAIT_FOR_URL_MAP_PATCH_SEC = 300 +_CONNECTION_TIMEOUT_SEC = 60 _GCP_API_RETRIES = 5 _BOOTSTRAP_TEMPLATE = """ {{ @@ -221,6 +222,10 @@ _BOOTSTRAP_TEMPLATE = """ ] }}] }}""" % (args.network.split('/')[-1], args.zone, args.xds_server) +_TESTS_TO_FAIL_ON_RPC_FAILURE = [ + 'change_backend_service', 'new_instance_group_receives_traffic', + 'ping_pong', 'round_robin' +] _TESTS_USING_SECONDARY_IG = [ 'secondary_locality_gets_no_requests_on_partial_primary_failure', 'secondary_locality_gets_requests_on_primary_failure' @@ -249,15 +254,12 @@ def get_client_stats(num_rpcs, timeout_sec): request = messages_pb2.LoadBalancerStatsRequest() request.num_rpcs = num_rpcs request.timeout_sec = timeout_sec - rpc_timeout = timeout_sec * 2 # Allow time for connection establishment - try: - response = stub.GetClientStats(request, - wait_for_ready=True, - timeout=rpc_timeout) - logger.debug('Invoked GetClientStats RPC: %s', response) - return response - except grpc.RpcError as rpc_error: - logger.exception('GetClientStats RPC failed') + rpc_timeout = timeout_sec + _CONNECTION_TIMEOUT_SEC + response = stub.GetClientStats(request, + wait_for_ready=True, + timeout=rpc_timeout) + logger.debug('Invoked GetClientStats RPC: %s', response) + return response def _verify_rpcs_to_given_backends(backends, timeout_sec, num_rpcs, @@ -1178,7 +1180,6 @@ try: wait_for_healthy_backends(gcp, backend_service, instance_group) if args.test_case: - if gcp.service_port == _DEFAULT_SERVICE_PORT: server_uri = service_host_name else: @@ -1192,10 +1193,6 @@ try: node_id=socket.gethostname()).encode('utf-8')) bootstrap_path = bootstrap_file.name client_env = dict(os.environ, GRPC_XDS_BOOTSTRAP=bootstrap_path) - client_cmd = shlex.split( - args.client_cmd.format(server_uri=server_uri, - stats_port=args.stats_port, - qps=args.qps)) test_results = {} failed_tests = [] @@ -1207,6 +1204,15 @@ try: test_log_filename = os.path.join(log_dir, _SPONGE_LOG_NAME) test_log_file = open(test_log_filename, 'w+') client_process = None + if test_case in _TESTS_TO_FAIL_ON_RPC_FAILURE: + fail_on_failed_rpc = '--fail_on_failed_rpc=true' + else: + fail_on_failed_rpc = '--fail_on_failed_rpc=false' + client_cmd = shlex.split( + args.client_cmd.format(server_uri=server_uri, + stats_port=args.stats_port, + qps=args.qps, + fail_on_failed_rpc=fail_on_failed_rpc)) try: client_process = subprocess.Popen(client_cmd, env=client_env, @@ -1242,6 +1248,10 @@ try: else: logger.error('Unknown test case: %s', test_case) sys.exit(1) + if client_process.poll() is not None: + raise Exception( + 'Client process exited prematurely with exit code %d' % + client_process.returncode) result.state = 'PASSED' result.returncode = 0 except Exception as e: @@ -1250,7 +1260,7 @@ try: result.state = 'FAILED' result.message = str(e) finally: - if client_process: + if client_process and not client_process.returncode: client_process.terminate() test_log_file.close() # Workaround for Python 3, as report_utils will invoke decode() on From d39c981d4fd9868e0bb7251fcce89911872e8e61 Mon Sep 17 00:00:00 2001 From: "Mark D. Roth" Date: Fri, 24 Apr 2020 10:32:15 -0700 Subject: [PATCH 609/758] Revert "Remove StringLess and src/core/lib/gprpp/map.h" --- BUILD | 1 + BUILD.gn | 1 + build_autogenerated.yaml | 1 + gRPC-C++.podspec | 2 + gRPC-Core.podspec | 2 + grpc.gemspec | 1 + package.xml | 1 + .../filters/client_channel/backend_metric.cc | 4 +- .../filters/client_channel/client_channel.cc | 47 +++++++++-------- .../health/health_check_client.cc | 7 ++- .../health/health_check_client.h | 6 +-- .../ext/filters/client_channel/lb_policy.h | 5 +- .../client_channel/resolver_result_parsing.cc | 15 +++--- .../client_channel/resolver_result_parsing.h | 6 +-- .../ext/filters/client_channel/subchannel.cc | 43 ++++++++-------- .../ext/filters/client_channel/subchannel.h | 18 +++---- .../client_channel/xds/xds_bootstrap.h | 1 + .../filters/client_channel/xds/xds_client.cc | 3 +- .../filters/client_channel/xds/xds_client.h | 2 +- .../client_channel/xds/xds_client_stats.h | 4 +- src/core/lib/channel/channelz.h | 2 +- src/core/lib/channel/channelz_registry.h | 3 +- src/core/lib/gprpp/map.h | 51 +++++++++++++++++++ src/core/lib/transport/connectivity_state.h | 3 +- .../client_channel/service_config_test.cc | 4 +- test/cpp/end2end/xds_end2end_test.cc | 2 +- tools/doxygen/Doxyfile.c++.internal | 1 + tools/doxygen/Doxyfile.core.internal | 1 + 28 files changed, 152 insertions(+), 85 deletions(-) create mode 100644 src/core/lib/gprpp/map.h diff --git a/BUILD b/BUILD index 8be2c685cd8..91cd3488408 100644 --- a/BUILD +++ b/BUILD @@ -551,6 +551,7 @@ grpc_cc_library( "src/core/lib/gprpp/global_config_generic.h", "src/core/lib/gprpp/host_port.h", "src/core/lib/gprpp/manual_constructor.h", + "src/core/lib/gprpp/map.h", "src/core/lib/gprpp/memory.h", "src/core/lib/gprpp/mpscq.h", "src/core/lib/gprpp/string_view.h", diff --git a/BUILD.gn b/BUILD.gn index 40dfa4bf46c..9ec801e373c 100644 --- a/BUILD.gn +++ b/BUILD.gn @@ -156,6 +156,7 @@ config("grpc_config") { "src/core/lib/gprpp/host_port.cc", "src/core/lib/gprpp/host_port.h", "src/core/lib/gprpp/manual_constructor.h", + "src/core/lib/gprpp/map.h", "src/core/lib/gprpp/memory.h", "src/core/lib/gprpp/mpscq.cc", "src/core/lib/gprpp/mpscq.h", diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml index 560904729ad..d01ff14cc58 100644 --- a/build_autogenerated.yaml +++ b/build_autogenerated.yaml @@ -299,6 +299,7 @@ libs: - src/core/lib/gprpp/global_config_generic.h - src/core/lib/gprpp/host_port.h - src/core/lib/gprpp/manual_constructor.h + - src/core/lib/gprpp/map.h - src/core/lib/gprpp/memory.h - src/core/lib/gprpp/mpscq.h - src/core/lib/gprpp/string_view.h diff --git a/gRPC-C++.podspec b/gRPC-C++.podspec index b94955f47a4..77e015d1d97 100644 --- a/gRPC-C++.podspec +++ b/gRPC-C++.podspec @@ -419,6 +419,7 @@ Pod::Spec.new do |s| 'src/core/lib/gprpp/global_config_generic.h', 'src/core/lib/gprpp/host_port.h', 'src/core/lib/gprpp/manual_constructor.h', + 'src/core/lib/gprpp/map.h', 'src/core/lib/gprpp/memory.h', 'src/core/lib/gprpp/mpscq.h', 'src/core/lib/gprpp/orphanable.h', @@ -868,6 +869,7 @@ Pod::Spec.new do |s| 'src/core/lib/gprpp/global_config_generic.h', 'src/core/lib/gprpp/host_port.h', 'src/core/lib/gprpp/manual_constructor.h', + 'src/core/lib/gprpp/map.h', 'src/core/lib/gprpp/memory.h', 'src/core/lib/gprpp/mpscq.h', 'src/core/lib/gprpp/orphanable.h', diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec index d04fa0aaabc..a9c11d7d933 100644 --- a/gRPC-Core.podspec +++ b/gRPC-Core.podspec @@ -611,6 +611,7 @@ Pod::Spec.new do |s| 'src/core/lib/gprpp/host_port.cc', 'src/core/lib/gprpp/host_port.h', 'src/core/lib/gprpp/manual_constructor.h', + 'src/core/lib/gprpp/map.h', 'src/core/lib/gprpp/memory.h', 'src/core/lib/gprpp/mpscq.cc', 'src/core/lib/gprpp/mpscq.h', @@ -1224,6 +1225,7 @@ Pod::Spec.new do |s| 'src/core/lib/gprpp/global_config_generic.h', 'src/core/lib/gprpp/host_port.h', 'src/core/lib/gprpp/manual_constructor.h', + 'src/core/lib/gprpp/map.h', 'src/core/lib/gprpp/memory.h', 'src/core/lib/gprpp/mpscq.h', 'src/core/lib/gprpp/orphanable.h', diff --git a/grpc.gemspec b/grpc.gemspec index e2f6580651e..7042206375a 100644 --- a/grpc.gemspec +++ b/grpc.gemspec @@ -533,6 +533,7 @@ Gem::Specification.new do |s| s.files += %w( src/core/lib/gprpp/host_port.cc ) s.files += %w( src/core/lib/gprpp/host_port.h ) s.files += %w( src/core/lib/gprpp/manual_constructor.h ) + s.files += %w( src/core/lib/gprpp/map.h ) s.files += %w( src/core/lib/gprpp/memory.h ) s.files += %w( src/core/lib/gprpp/mpscq.cc ) s.files += %w( src/core/lib/gprpp/mpscq.h ) diff --git a/package.xml b/package.xml index c5294e90da6..862ea4f566c 100644 --- a/package.xml +++ b/package.xml @@ -513,6 +513,7 @@ + diff --git a/src/core/ext/filters/client_channel/backend_metric.cc b/src/core/ext/filters/client_channel/backend_metric.cc index dbc296a39d4..b36614f5b80 100644 --- a/src/core/ext/filters/client_channel/backend_metric.cc +++ b/src/core/ext/filters/client_channel/backend_metric.cc @@ -26,12 +26,12 @@ namespace grpc_core { namespace { template -std::map ParseMap( +std::map ParseMap( udpa_data_orca_v1_OrcaLoadReport* msg, EntryType** (*entry_func)(udpa_data_orca_v1_OrcaLoadReport*, size_t*), upb_strview (*key_func)(const EntryType*), double (*value_func)(const EntryType*), Arena* arena) { - std::map result; + std::map result; size_t size; const auto* const* entries = entry_func(msg, &size); for (size_t i = 0; i < size; ++i) { diff --git a/src/core/ext/filters/client_channel/client_channel.cc b/src/core/ext/filters/client_channel/client_channel.cc index 97fc16822ef..a66a3a615c7 100644 --- a/src/core/ext/filters/client_channel/client_channel.cc +++ b/src/core/ext/filters/client_channel/client_channel.cc @@ -26,7 +26,6 @@ #include #include -#include #include #include @@ -57,6 +56,7 @@ #include "src/core/lib/channel/status_util.h" #include "src/core/lib/gpr/string.h" #include "src/core/lib/gprpp/manual_constructor.h" +#include "src/core/lib/gprpp/map.h" #include "src/core/lib/gprpp/sync.h" #include "src/core/lib/iomgr/iomgr.h" #include "src/core/lib/iomgr/polling_entity.h" @@ -295,7 +295,7 @@ class ChannelData { RefCountedPtr subchannel_pool_; OrphanablePtr resolving_lb_policy_; ConnectivityStateTracker state_tracker_; - std::string health_check_service_name_; + grpc_core::UniquePtr health_check_service_name_; RefCountedPtr saved_service_config_; bool received_first_resolver_result_ = false; // The number of SubchannelWrapper instances referencing a given Subchannel. @@ -850,7 +850,7 @@ class CallData { class ChannelData::SubchannelWrapper : public SubchannelInterface { public: SubchannelWrapper(ChannelData* chand, Subchannel* subchannel, - std::string health_check_service_name) + grpc_core::UniquePtr health_check_service_name) : SubchannelInterface(&grpc_client_channel_routing_trace), chand_(chand), subchannel_(subchannel), @@ -897,7 +897,7 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface { grpc_connectivity_state CheckConnectivityState() override { RefCountedPtr connected_subchannel; grpc_connectivity_state connectivity_state = - subchannel_->CheckConnectivityState(health_check_service_name_, + subchannel_->CheckConnectivityState(health_check_service_name_.get(), &connected_subchannel); MaybeUpdateConnectedSubchannel(std::move(connected_subchannel)); return connectivity_state; @@ -912,7 +912,9 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface { Ref(DEBUG_LOCATION, "WatcherWrapper"), initial_state); subchannel_->WatchConnectivityState( - initial_state, health_check_service_name_, + initial_state, + grpc_core::UniquePtr( + gpr_strdup(health_check_service_name_.get())), RefCountedPtr( watcher_wrapper)); } @@ -921,7 +923,7 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface { ConnectivityStateWatcherInterface* watcher) override { auto it = watcher_map_.find(watcher); GPR_ASSERT(it != watcher_map_.end()); - subchannel_->CancelConnectivityStateWatch(health_check_service_name_, + subchannel_->CancelConnectivityStateWatch(health_check_service_name_.get(), it->second); watcher_map_.erase(it); } @@ -934,13 +936,14 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface { return subchannel_->channel_args(); } - void UpdateHealthCheckServiceName(std::string health_check_service_name) { + void UpdateHealthCheckServiceName( + grpc_core::UniquePtr health_check_service_name) { if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) { gpr_log(GPR_INFO, "chand=%p: subchannel wrapper %p: updating health check service " "name from \"%s\" to \"%s\"", - chand_, this, health_check_service_name_.c_str(), - health_check_service_name.c_str()); + chand_, this, health_check_service_name_.get(), + health_check_service_name.get()); } for (auto& p : watcher_map_) { WatcherWrapper*& watcher_wrapper = p.second; @@ -955,11 +958,13 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface { // problem, we may be able to handle it by waiting for the new // watcher to report READY before we use it to replace the old one. WatcherWrapper* replacement = watcher_wrapper->MakeReplacement(); - subchannel_->CancelConnectivityStateWatch(health_check_service_name_, - watcher_wrapper); + subchannel_->CancelConnectivityStateWatch( + health_check_service_name_.get(), watcher_wrapper); watcher_wrapper = replacement; subchannel_->WatchConnectivityState( - replacement->last_seen_state(), health_check_service_name, + replacement->last_seen_state(), + grpc_core::UniquePtr( + gpr_strdup(health_check_service_name.get())), RefCountedPtr( replacement)); } @@ -1097,7 +1102,7 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface { ChannelData* chand_; Subchannel* subchannel_; - std::string health_check_service_name_; + grpc_core::UniquePtr health_check_service_name_; // Maps from the address of the watcher passed to us by the LB policy // to the address of the WrapperWatcher that we passed to the underlying // subchannel. This is needed so that when the LB policy calls @@ -1260,9 +1265,10 @@ class ChannelData::ClientChannelControlHelper const grpc_channel_args& args) override { bool inhibit_health_checking = grpc_channel_arg_get_bool( grpc_channel_args_find(&args, GRPC_ARG_INHIBIT_HEALTH_CHECKING), false); - std::string health_check_service_name; + grpc_core::UniquePtr health_check_service_name; if (!inhibit_health_checking) { - health_check_service_name = chand_->health_check_service_name_; + health_check_service_name.reset( + gpr_strdup(chand_->health_check_service_name_.get())); } static const char* args_to_remove[] = { GRPC_ARG_INHIBIT_HEALTH_CHECKING, @@ -1457,7 +1463,7 @@ void ChannelData::UpdateStateAndPickerLocked( std::unique_ptr picker) { // Clean the control plane when entering IDLE. if (picker_ == nullptr) { - health_check_service_name_.clear(); + health_check_service_name_.reset(); saved_service_config_.reset(); received_first_resolver_result_ = false; } @@ -1700,15 +1706,16 @@ bool ChannelData::ProcessResolverResultLocked( } // Save health check service name. if (service_config != nullptr) { - chand->health_check_service_name_ = - parsed_service_config->health_check_service_name(); + chand->health_check_service_name_.reset( + gpr_strdup(parsed_service_config->health_check_service_name())); } else { - chand->health_check_service_name_.clear(); + chand->health_check_service_name_.reset(); } // Update health check service name used by existing subchannel wrappers. for (auto* subchannel_wrapper : chand->subchannel_wrappers_) { subchannel_wrapper->UpdateHealthCheckServiceName( - chand->health_check_service_name_); + grpc_core::UniquePtr( + gpr_strdup(chand->health_check_service_name_.get()))); } // Save service config. chand->saved_service_config_ = std::move(service_config); diff --git a/src/core/ext/filters/client_channel/health/health_check_client.cc b/src/core/ext/filters/client_channel/health/health_check_client.cc index ba1bc26d293..5c4aa986e80 100644 --- a/src/core/ext/filters/client_channel/health/health_check_client.cc +++ b/src/core/ext/filters/client_channel/health/health_check_client.cc @@ -44,7 +44,7 @@ TraceFlag grpc_health_check_client_trace(false, "health_check_client"); // HealthCheckClient::HealthCheckClient( - absl::string_view service_name, + const char* service_name, RefCountedPtr connected_subchannel, grpc_pollset_set* interested_parties, RefCountedPtr channelz_node, @@ -171,14 +171,13 @@ void HealthCheckClient::OnRetryTimer(void* arg, grpc_error* error) { namespace { -void EncodeRequest(absl::string_view service_name, +void EncodeRequest(const char* service_name, ManualConstructor* send_message) { upb::Arena arena; grpc_health_v1_HealthCheckRequest* request_struct = grpc_health_v1_HealthCheckRequest_new(arena.ptr()); grpc_health_v1_HealthCheckRequest_set_service( - request_struct, - upb_strview_make(service_name.data(), service_name.size())); + request_struct, upb_strview_makez(service_name)); size_t buf_length; char* buf = grpc_health_v1_HealthCheckRequest_serialize( request_struct, arena.ptr(), &buf_length); diff --git a/src/core/ext/filters/client_channel/health/health_check_client.h b/src/core/ext/filters/client_channel/health/health_check_client.h index 9b90e607631..f8b9ade5ab6 100644 --- a/src/core/ext/filters/client_channel/health/health_check_client.h +++ b/src/core/ext/filters/client_channel/health/health_check_client.h @@ -21,8 +21,6 @@ #include -#include "absl/strings/string_view.h" - #include #include @@ -46,7 +44,7 @@ namespace grpc_core { class HealthCheckClient : public InternallyRefCounted { public: - HealthCheckClient(absl::string_view service_name, + HealthCheckClient(const char* service_name, RefCountedPtr connected_subchannel, grpc_pollset_set* interested_parties, RefCountedPtr channelz_node, @@ -152,7 +150,7 @@ class HealthCheckClient : public InternallyRefCounted { void SetHealthStatusLocked(grpc_connectivity_state state, const char* reason); // Requires holding mu_. - absl::string_view service_name_; + const char* service_name_; // Do not own. RefCountedPtr connected_subchannel_; grpc_pollset_set* interested_parties_; // Do not own. RefCountedPtr channelz_node_; diff --git a/src/core/ext/filters/client_channel/lb_policy.h b/src/core/ext/filters/client_channel/lb_policy.h index 9cdd1d478f5..4f269e9d383 100644 --- a/src/core/ext/filters/client_channel/lb_policy.h +++ b/src/core/ext/filters/client_channel/lb_policy.h @@ -27,6 +27,7 @@ #include "src/core/ext/filters/client_channel/server_address.h" #include "src/core/ext/filters/client_channel/service_config.h" #include "src/core/ext/filters/client_channel/subchannel_interface.h" +#include "src/core/lib/gprpp/map.h" #include "src/core/lib/gprpp/orphanable.h" #include "src/core/lib/gprpp/ref_counted_ptr.h" #include "src/core/lib/gprpp/string_view.h" @@ -92,11 +93,11 @@ class LoadBalancingPolicy : public InternallyRefCounted { /// Application-specific requests cost metrics. Metric names are /// determined by the application. Each value is an absolute cost /// (e.g. 3487 bytes of storage) associated with the request. - std::map request_cost; + std::map request_cost; /// Application-specific resource utilization metrics. Metric names /// are determined by the application. Each value is expressed as a /// fraction of total resources available. - std::map utilization; + std::map utilization; }; /// Interface for accessing per-call state. diff --git a/src/core/ext/filters/client_channel/resolver_result_parsing.cc b/src/core/ext/filters/client_channel/resolver_result_parsing.cc index 0c23269c66a..77ee5fad3cd 100644 --- a/src/core/ext/filters/client_channel/resolver_result_parsing.cc +++ b/src/core/ext/filters/client_channel/resolver_result_parsing.cc @@ -284,13 +284,13 @@ grpc_error* ParseRetryThrottling( return GRPC_ERROR_CREATE_FROM_VECTOR("retryPolicy", &error_list); } -std::string ParseHealthCheckConfig(const Json& field, grpc_error** error) { +const char* ParseHealthCheckConfig(const Json& field, grpc_error** error) { GPR_DEBUG_ASSERT(error != nullptr && *error == GRPC_ERROR_NONE); - std::string service_name; + const char* service_name = nullptr; if (field.type() != Json::Type::OBJECT) { *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING( "field:healthCheckConfig error:should be of type object"); - return service_name; + return nullptr; } std::vector error_list; auto it = field.object_value().find("serviceName"); @@ -299,9 +299,12 @@ std::string ParseHealthCheckConfig(const Json& field, grpc_error** error) { error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING( "field:serviceName error:should be of type string")); } else { - service_name = it->second.string_value(); + service_name = it->second.string_value().c_str(); } } + if (!error_list.empty()) { + return nullptr; + } *error = GRPC_ERROR_CREATE_FROM_VECTOR("field:healthCheckConfig", &error_list); return service_name; @@ -318,7 +321,7 @@ ClientChannelServiceConfigParser::ParseGlobalParams(const Json& json, std::string lb_policy_name; absl::optional retry_throttling; - std::string health_check_service_name; + const char* health_check_service_name = nullptr; // Parse LB config. auto it = json.object_value().find("loadBalancingConfig"); if (it != json.object_value().end()) { @@ -385,7 +388,7 @@ ClientChannelServiceConfigParser::ParseGlobalParams(const Json& json, if (*error == GRPC_ERROR_NONE) { return absl::make_unique( std::move(parsed_lb_config), std::move(lb_policy_name), - retry_throttling, std::move(health_check_service_name)); + retry_throttling, health_check_service_name); } return nullptr; } diff --git a/src/core/ext/filters/client_channel/resolver_result_parsing.h b/src/core/ext/filters/client_channel/resolver_result_parsing.h index c736a2ef91f..b38ae730708 100644 --- a/src/core/ext/filters/client_channel/resolver_result_parsing.h +++ b/src/core/ext/filters/client_channel/resolver_result_parsing.h @@ -49,7 +49,7 @@ class ClientChannelGlobalParsedConfig : public ServiceConfig::ParsedConfig { RefCountedPtr parsed_lb_config, std::string parsed_deprecated_lb_policy, const absl::optional& retry_throttling, - std::string health_check_service_name) + const char* health_check_service_name) : parsed_lb_config_(std::move(parsed_lb_config)), parsed_deprecated_lb_policy_(std::move(parsed_deprecated_lb_policy)), retry_throttling_(retry_throttling), @@ -67,7 +67,7 @@ class ClientChannelGlobalParsedConfig : public ServiceConfig::ParsedConfig { return parsed_deprecated_lb_policy_; } - const std::string& health_check_service_name() const { + const char* health_check_service_name() const { return health_check_service_name_; } @@ -75,7 +75,7 @@ class ClientChannelGlobalParsedConfig : public ServiceConfig::ParsedConfig { RefCountedPtr parsed_lb_config_; std::string parsed_deprecated_lb_policy_; absl::optional retry_throttling_; - std::string health_check_service_name_; + const char* health_check_service_name_; }; class ClientChannelMethodParsedConfig : public ServiceConfig::ParsedConfig { diff --git a/src/core/ext/filters/client_channel/subchannel.cc b/src/core/ext/filters/client_channel/subchannel.cc index 62d2eff4fa1..f350b2ec36a 100644 --- a/src/core/ext/filters/client_channel/subchannel.cc +++ b/src/core/ext/filters/client_channel/subchannel.cc @@ -424,10 +424,11 @@ void Subchannel::ConnectivityStateWatcherList::NotifyLocked( class Subchannel::HealthWatcherMap::HealthWatcher : public AsyncConnectivityStateWatcherInterface { public: - HealthWatcher(Subchannel* c, absl::string_view health_check_service_name, + HealthWatcher(Subchannel* c, + grpc_core::UniquePtr health_check_service_name, grpc_connectivity_state subchannel_state) : subchannel_(c), - health_check_service_name_(std::string(health_check_service_name)), + health_check_service_name_(std::move(health_check_service_name)), state_(subchannel_state == GRPC_CHANNEL_READY ? GRPC_CHANNEL_CONNECTING : subchannel_state) { GRPC_SUBCHANNEL_WEAK_REF(subchannel_, "health_watcher"); @@ -439,8 +440,8 @@ class Subchannel::HealthWatcherMap::HealthWatcher GRPC_SUBCHANNEL_WEAK_UNREF(subchannel_, "health_watcher"); } - absl::string_view health_check_service_name() const { - return health_check_service_name_; + const char* health_check_service_name() const { + return health_check_service_name_.get(); } grpc_connectivity_state state() const { return state_; } @@ -499,12 +500,12 @@ class Subchannel::HealthWatcherMap::HealthWatcher void StartHealthCheckingLocked() { GPR_ASSERT(health_check_client_ == nullptr); health_check_client_ = MakeOrphanable( - health_check_service_name_, subchannel_->connected_subchannel_, + health_check_service_name_.get(), subchannel_->connected_subchannel_, subchannel_->pollset_set_, subchannel_->channelz_node_, Ref()); } Subchannel* subchannel_; - std::string health_check_service_name_; + grpc_core::UniquePtr health_check_service_name_; OrphanablePtr health_check_client_; grpc_connectivity_state state_; ConnectivityStateWatcherList watcher_list_; @@ -516,17 +517,18 @@ class Subchannel::HealthWatcherMap::HealthWatcher void Subchannel::HealthWatcherMap::AddWatcherLocked( Subchannel* subchannel, grpc_connectivity_state initial_state, - absl::string_view health_check_service_name, + grpc_core::UniquePtr health_check_service_name, RefCountedPtr watcher) { // If the health check service name is not already present in the map, // add it. - auto it = map_.find(health_check_service_name); + auto it = map_.find(health_check_service_name.get()); HealthWatcher* health_watcher; if (it == map_.end()) { + const char* key = health_check_service_name.get(); auto w = MakeOrphanable( - subchannel, health_check_service_name, subchannel->state_); + subchannel, std::move(health_check_service_name), subchannel->state_); health_watcher = w.get(); - map_[w->health_check_service_name()] = std::move(w); + map_[key] = std::move(w); } else { health_watcher = it->second.get(); } @@ -535,7 +537,7 @@ void Subchannel::HealthWatcherMap::AddWatcherLocked( } void Subchannel::HealthWatcherMap::RemoveWatcherLocked( - absl::string_view health_check_service_name, + const char* health_check_service_name, ConnectivityStateWatcherInterface* watcher) { auto it = map_.find(health_check_service_name); GPR_ASSERT(it != map_.end()); @@ -553,7 +555,7 @@ void Subchannel::HealthWatcherMap::NotifyLocked(grpc_connectivity_state state) { grpc_connectivity_state Subchannel::HealthWatcherMap::CheckConnectivityStateLocked( - Subchannel* subchannel, absl::string_view health_check_service_name) { + Subchannel* subchannel, const char* health_check_service_name) { auto it = map_.find(health_check_service_name); if (it == map_.end()) { // If the health check service name is not found in the map, we're @@ -797,11 +799,11 @@ channelz::SubchannelNode* Subchannel::channelz_node() { } grpc_connectivity_state Subchannel::CheckConnectivityState( - absl::string_view health_check_service_name, + const char* health_check_service_name, RefCountedPtr* connected_subchannel) { MutexLock lock(&mu_); grpc_connectivity_state state; - if (health_check_service_name.empty()) { + if (health_check_service_name == nullptr) { state = state_; } else { state = health_watcher_map_.CheckConnectivityStateLocked( @@ -815,33 +817,34 @@ grpc_connectivity_state Subchannel::CheckConnectivityState( void Subchannel::WatchConnectivityState( grpc_connectivity_state initial_state, - absl::string_view health_check_service_name, + grpc_core::UniquePtr health_check_service_name, RefCountedPtr watcher) { MutexLock lock(&mu_); grpc_pollset_set* interested_parties = watcher->interested_parties(); if (interested_parties != nullptr) { grpc_pollset_set_add_pollset_set(pollset_set_, interested_parties); } - if (health_check_service_name.empty()) { + if (health_check_service_name == nullptr) { if (state_ != initial_state) { new AsyncWatcherNotifierLocked(watcher, this, state_); } watcher_list_.AddWatcherLocked(std::move(watcher)); } else { - health_watcher_map_.AddWatcherLocked( - this, initial_state, health_check_service_name, std::move(watcher)); + health_watcher_map_.AddWatcherLocked(this, initial_state, + std::move(health_check_service_name), + std::move(watcher)); } } void Subchannel::CancelConnectivityStateWatch( - absl::string_view health_check_service_name, + const char* health_check_service_name, ConnectivityStateWatcherInterface* watcher) { MutexLock lock(&mu_); grpc_pollset_set* interested_parties = watcher->interested_parties(); if (interested_parties != nullptr) { grpc_pollset_set_del_pollset_set(pollset_set_, interested_parties); } - if (health_check_service_name.empty()) { + if (health_check_service_name == nullptr) { watcher_list_.RemoveWatcherLocked(watcher); } else { health_watcher_map_.RemoveWatcherLocked(health_check_service_name, watcher); diff --git a/src/core/ext/filters/client_channel/subchannel.h b/src/core/ext/filters/client_channel/subchannel.h index bc45c28dd36..9478fa7340c 100644 --- a/src/core/ext/filters/client_channel/subchannel.h +++ b/src/core/ext/filters/client_channel/subchannel.h @@ -23,8 +23,6 @@ #include -#include "absl/strings/string_view.h" - #include "src/core/ext/filters/client_channel/client_channel_channelz.h" #include "src/core/ext/filters/client_channel/connector.h" #include "src/core/ext/filters/client_channel/subchannel_pool_interface.h" @@ -32,6 +30,7 @@ #include "src/core/lib/channel/channel_stack.h" #include "src/core/lib/gpr/time_precise.h" #include "src/core/lib/gprpp/arena.h" +#include "src/core/lib/gprpp/map.h" #include "src/core/lib/gprpp/ref_counted.h" #include "src/core/lib/gprpp/ref_counted_ptr.h" #include "src/core/lib/gprpp/sync.h" @@ -252,7 +251,7 @@ class Subchannel { // service name. // If the return value is GRPC_CHANNEL_READY, also sets *connected_subchannel. grpc_connectivity_state CheckConnectivityState( - absl::string_view health_check_service_name, + const char* health_check_service_name, RefCountedPtr* connected_subchannel); // Starts watching the subchannel's connectivity state. @@ -265,12 +264,12 @@ class Subchannel { // destroyed or when CancelConnectivityStateWatch() is called. void WatchConnectivityState( grpc_connectivity_state initial_state, - absl::string_view health_check_service_name, + grpc_core::UniquePtr health_check_service_name, RefCountedPtr watcher); // Cancels a connectivity state watch. // If the watcher has already been destroyed, this is a no-op. - void CancelConnectivityStateWatch(absl::string_view health_check_service_name, + void CancelConnectivityStateWatch(const char* health_check_service_name, ConnectivityStateWatcherInterface* watcher); // Attempt to connect to the backend. Has no effect if already connected. @@ -334,24 +333,23 @@ class Subchannel { public: void AddWatcherLocked( Subchannel* subchannel, grpc_connectivity_state initial_state, - absl::string_view health_check_service_name, + grpc_core::UniquePtr health_check_service_name, RefCountedPtr watcher); - void RemoveWatcherLocked(absl::string_view health_check_service_name, + void RemoveWatcherLocked(const char* health_check_service_name, ConnectivityStateWatcherInterface* watcher); // Notifies the watcher when the subchannel's state changes. void NotifyLocked(grpc_connectivity_state state); grpc_connectivity_state CheckConnectivityStateLocked( - Subchannel* subchannel, absl::string_view health_check_service_name); + Subchannel* subchannel, const char* health_check_service_name); void ShutdownLocked(); private: class HealthWatcher; - // Key points to the health_check_service_name_ field in the value object. - std::map> map_; + std::map, StringLess> map_; }; class ConnectedSubchannelStateWatcher; diff --git a/src/core/ext/filters/client_channel/xds/xds_bootstrap.h b/src/core/ext/filters/client_channel/xds/xds_bootstrap.h index f3e49ba0e5a..13eff49f575 100644 --- a/src/core/ext/filters/client_channel/xds/xds_bootstrap.h +++ b/src/core/ext/filters/client_channel/xds/xds_bootstrap.h @@ -27,6 +27,7 @@ #include +#include "src/core/lib/gprpp/map.h" #include "src/core/lib/gprpp/memory.h" #include "src/core/lib/iomgr/error.h" #include "src/core/lib/json/json.h" diff --git a/src/core/ext/filters/client_channel/xds/xds_client.cc b/src/core/ext/filters/client_channel/xds/xds_client.cc index abfcc452526..9dc7b97773c 100644 --- a/src/core/ext/filters/client_channel/xds/xds_client.cc +++ b/src/core/ext/filters/client_channel/xds/xds_client.cc @@ -22,8 +22,6 @@ #include #include -#include - #include "absl/container/inlined_vector.h" #include "absl/strings/str_format.h" #include "absl/strings/str_join.h" @@ -47,6 +45,7 @@ #include "src/core/lib/channel/channel_args.h" #include "src/core/lib/channel/channel_stack.h" #include "src/core/lib/gpr/string.h" +#include "src/core/lib/gprpp/map.h" #include "src/core/lib/gprpp/memory.h" #include "src/core/lib/gprpp/orphanable.h" #include "src/core/lib/gprpp/ref_counted_ptr.h" diff --git a/src/core/ext/filters/client_channel/xds/xds_client.h b/src/core/ext/filters/client_channel/xds/xds_client.h index ccdffc5f417..267a0fe9e19 100644 --- a/src/core/ext/filters/client_channel/xds/xds_client.h +++ b/src/core/ext/filters/client_channel/xds/xds_client.h @@ -19,7 +19,6 @@ #include -#include #include #include "absl/types/optional.h" @@ -28,6 +27,7 @@ #include "src/core/ext/filters/client_channel/xds/xds_api.h" #include "src/core/ext/filters/client_channel/xds/xds_bootstrap.h" #include "src/core/ext/filters/client_channel/xds/xds_client_stats.h" +#include "src/core/lib/gprpp/map.h" #include "src/core/lib/gprpp/memory.h" #include "src/core/lib/gprpp/orphanable.h" #include "src/core/lib/gprpp/ref_counted.h" diff --git a/src/core/ext/filters/client_channel/xds/xds_client_stats.h b/src/core/ext/filters/client_channel/xds/xds_client_stats.h index 1539c9a4986..7a358d47b91 100644 --- a/src/core/ext/filters/client_channel/xds/xds_client_stats.h +++ b/src/core/ext/filters/client_channel/xds/xds_client_stats.h @@ -21,14 +21,12 @@ #include -#include - #include #include "src/core/lib/gprpp/atomic.h" +#include "src/core/lib/gprpp/map.h" #include "src/core/lib/gprpp/memory.h" #include "src/core/lib/gprpp/ref_counted.h" -#include "src/core/lib/gprpp/string_view.h" #include "src/core/lib/gprpp/sync.h" #include "src/core/lib/iomgr/exec_ctx.h" diff --git a/src/core/lib/channel/channelz.h b/src/core/lib/channel/channelz.h index 3bf2598414e..63502030966 100644 --- a/src/core/lib/channel/channelz.h +++ b/src/core/lib/channel/channelz.h @@ -23,7 +23,6 @@ #include -#include #include #include "absl/container/inlined_vector.h" @@ -32,6 +31,7 @@ #include "src/core/lib/gpr/time_precise.h" #include "src/core/lib/gprpp/atomic.h" #include "src/core/lib/gprpp/manual_constructor.h" +#include "src/core/lib/gprpp/map.h" #include "src/core/lib/gprpp/ref_counted.h" #include "src/core/lib/gprpp/ref_counted_ptr.h" #include "src/core/lib/gprpp/sync.h" diff --git a/src/core/lib/channel/channelz_registry.h b/src/core/lib/channel/channelz_registry.h index ac6d442eff5..d777651c12f 100644 --- a/src/core/lib/channel/channelz_registry.h +++ b/src/core/lib/channel/channelz_registry.h @@ -23,10 +23,9 @@ #include -#include - #include "src/core/lib/channel/channel_trace.h" #include "src/core/lib/channel/channelz.h" +#include "src/core/lib/gprpp/map.h" #include "src/core/lib/gprpp/sync.h" namespace grpc_core { diff --git a/src/core/lib/gprpp/map.h b/src/core/lib/gprpp/map.h new file mode 100644 index 00000000000..f14f3f6fc84 --- /dev/null +++ b/src/core/lib/gprpp/map.h @@ -0,0 +1,51 @@ +/* + * + * Copyright 2017 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#ifndef GRPC_CORE_LIB_GPRPP_MAP_H +#define GRPC_CORE_LIB_GPRPP_MAP_H + +#include + +#include + +#include + +#include "src/core/lib/gprpp/ref_counted_ptr.h" +#include "src/core/lib/gprpp/string_view.h" + +namespace grpc_core { + +struct StringLess { + bool operator()(const char* a, const char* b) const { + return strcmp(a, b) < 0; + } + bool operator()(const grpc_core::UniquePtr& a, + const grpc_core::UniquePtr& b) const { + return strcmp(a.get(), b.get()) < 0; + } + bool operator()(const StringView& a, const StringView& b) const { + const size_t min_size = std::min(a.size(), b.size()); + int c = strncmp(a.data(), b.data(), min_size); + if (c != 0) return c < 0; + return a.size() < b.size(); + } +}; + +} // namespace grpc_core + +#endif /* GRPC_CORE_LIB_GPRPP_MAP_H */ diff --git a/src/core/lib/transport/connectivity_state.h b/src/core/lib/transport/connectivity_state.h index ba9cc927e61..5ab62bed40c 100644 --- a/src/core/lib/transport/connectivity_state.h +++ b/src/core/lib/transport/connectivity_state.h @@ -21,12 +21,11 @@ #include -#include - #include #include "src/core/lib/debug/trace.h" #include "src/core/lib/gprpp/atomic.h" +#include "src/core/lib/gprpp/map.h" #include "src/core/lib/gprpp/orphanable.h" #include "src/core/lib/iomgr/closure.h" #include "src/core/lib/iomgr/exec_ctx.h" diff --git a/test/core/client_channel/service_config_test.cc b/test/core/client_channel/service_config_test.cc index b0f5a3ae70f..5cdb51341ab 100644 --- a/test/core/client_channel/service_config_test.cc +++ b/test/core/client_channel/service_config_test.cc @@ -913,8 +913,8 @@ TEST_F(ClientChannelParserTest, ValidHealthCheck) { static_cast( svc_cfg->GetGlobalParsedConfig(0)); ASSERT_NE(parsed_config, nullptr); - EXPECT_EQ(parsed_config->health_check_service_name(), - "health_check_service_name"); + EXPECT_STREQ(parsed_config->health_check_service_name(), + "health_check_service_name"); } TEST_F(ClientChannelParserTest, InvalidHealthCheckMultipleEntries) { diff --git a/test/cpp/end2end/xds_end2end_test.cc b/test/cpp/end2end/xds_end2end_test.cc index 3ec43c61e72..aa873490ca4 100644 --- a/test/cpp/end2end/xds_end2end_test.cc +++ b/test/cpp/end2end/xds_end2end_test.cc @@ -17,7 +17,6 @@ */ #include -#include #include #include #include @@ -48,6 +47,7 @@ #include "src/core/ext/filters/client_channel/xds/xds_api.h" #include "src/core/lib/gpr/env.h" #include "src/core/lib/gpr/tmpfile.h" +#include "src/core/lib/gprpp/map.h" #include "src/core/lib/gprpp/ref_counted_ptr.h" #include "src/core/lib/gprpp/sync.h" #include "src/core/lib/iomgr/sockaddr.h" diff --git a/tools/doxygen/Doxyfile.c++.internal b/tools/doxygen/Doxyfile.c++.internal index 36a25781429..c5d220fabf1 100644 --- a/tools/doxygen/Doxyfile.c++.internal +++ b/tools/doxygen/Doxyfile.c++.internal @@ -1496,6 +1496,7 @@ src/core/lib/gprpp/global_config_generic.h \ src/core/lib/gprpp/host_port.cc \ src/core/lib/gprpp/host_port.h \ src/core/lib/gprpp/manual_constructor.h \ +src/core/lib/gprpp/map.h \ src/core/lib/gprpp/memory.h \ src/core/lib/gprpp/mpscq.cc \ src/core/lib/gprpp/mpscq.h \ diff --git a/tools/doxygen/Doxyfile.core.internal b/tools/doxygen/Doxyfile.core.internal index dbbf9104c61..04f37228424 100644 --- a/tools/doxygen/Doxyfile.core.internal +++ b/tools/doxygen/Doxyfile.core.internal @@ -1307,6 +1307,7 @@ src/core/lib/gprpp/global_config_generic.h \ src/core/lib/gprpp/host_port.cc \ src/core/lib/gprpp/host_port.h \ src/core/lib/gprpp/manual_constructor.h \ +src/core/lib/gprpp/map.h \ src/core/lib/gprpp/memory.h \ src/core/lib/gprpp/mpscq.cc \ src/core/lib/gprpp/mpscq.h \ From 4f9425086b4b3249bed7301830cde52d8361bf83 Mon Sep 17 00:00:00 2001 From: Muxi Yan Date: Fri, 24 Apr 2020 16:15:43 -0700 Subject: [PATCH 610/758] Fix client_lb_end2end_test flake --- src/core/lib/surface/init.cc | 2 +- test/cpp/end2end/client_lb_end2end_test.cc | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/core/lib/surface/init.cc b/src/core/lib/surface/init.cc index d8bc4e4dd32..aaa1bcafc94 100644 --- a/src/core/lib/surface/init.cc +++ b/src/core/lib/surface/init.cc @@ -243,7 +243,7 @@ int grpc_is_initialized(void) { void grpc_maybe_wait_for_async_shutdown(void) { gpr_once_init(&g_basic_init, do_basic_init); grpc_core::MutexLock lock(&g_init_mu); - while (g_shutting_down) { + while (g_shutting_down || g_initializations > 0) { gpr_cv_wait(g_shutting_down_cv, &g_init_mu, gpr_inf_future(GPR_CLOCK_REALTIME)); } diff --git a/test/cpp/end2end/client_lb_end2end_test.cc b/test/cpp/end2end/client_lb_end2end_test.cc index d066a00a29d..cc2e638671d 100644 --- a/test/cpp/end2end/client_lb_end2end_test.cc +++ b/test/cpp/end2end/client_lb_end2end_test.cc @@ -50,6 +50,7 @@ #include "src/core/lib/gprpp/ref_counted_ptr.h" #include "src/core/lib/iomgr/tcp_client.h" #include "src/core/lib/security/credentials/fake/fake_credentials.h" +#include "src/core/lib/surface/init.h" #include "src/cpp/client/secure_credentials.h" #include "src/cpp/server/secure_server_credentials.h" @@ -239,6 +240,7 @@ class ClientLbEnd2endTest : public ::testing::Test { servers_.clear(); creds_.reset(); grpc_shutdown_blocking(); + grpc_maybe_wait_for_async_shutdown(); } void CreateServers(size_t num_servers, From c13f3c5a50c9c2503acb7f2020ba03d572d39ea5 Mon Sep 17 00:00:00 2001 From: ZhenLian Date: Sat, 25 Apr 2020 11:49:51 -0700 Subject: [PATCH 611/758] test using ReadFile --- test/cpp/util/test_credentials_provider.cc | 38 +++++++--------------- test/cpp/util/test_credentials_provider.h | 4 --- 2 files changed, 11 insertions(+), 31 deletions(-) diff --git a/test/cpp/util/test_credentials_provider.cc b/test/cpp/util/test_credentials_provider.cc index 0893fb2bf3e..d96c60896dc 100644 --- a/test/cpp/util/test_credentials_provider.cc +++ b/test/cpp/util/test_credentials_provider.cc @@ -65,6 +65,9 @@ class DefaultCredentialsProvider : public CredentialsProvider { if (!FLAGS_tls_cert_file.empty()) { custom_server_cert_ = ReadFile(FLAGS_tls_cert_file); } + test_root_cert_ = ReadFile(CA_CERT_PATH); + server_key_ = ReadFile(SERVER_KEY_PATH); + server_cert_ = ReadFile(SERVER_CERT_PATH); } ~DefaultCredentialsProvider() override {} @@ -93,17 +96,9 @@ class DefaultCredentialsProvider : public CredentialsProvider { grpc::experimental::AltsCredentialsOptions alts_opts; return grpc::experimental::AltsCredentials(alts_opts); } else if (type == grpc::testing::kTlsCredentialsType) { - grpc_slice ca_slice; - GPR_ASSERT(GRPC_LOG_IF_ERROR("load_file", - grpc_load_file(CA_CERT_PATH, 1, &ca_slice))); - const char* test_root_cert = - reinterpret_cast GRPC_SLICE_START_PTR(ca_slice); - SslCredentialsOptions ssl_opts = {test_root_cert, "", ""}; + SslCredentialsOptions ssl_opts = {test_root_cert_, "", ""}; args->SetSslTargetNameOverride("foo.test.google.fr"); - std::shared_ptr credential_ptr = - grpc::SslCredentials(grpc::SslCredentialsOptions(ssl_opts)); - grpc_slice_unref(ca_slice); - return credential_ptr; + return grpc::SslCredentials(ssl_opts); } else if (type == grpc::testing::kGoogleDefaultCredentialsType) { return grpc::GoogleDefaultCredentials(); } else { @@ -133,26 +128,12 @@ class DefaultCredentialsProvider : public CredentialsProvider { SslServerCredentialsOptions::PemKeyCertPair pkcp = { custom_server_key_, custom_server_cert_}; ssl_opts.pem_key_cert_pairs.push_back(pkcp); - return SslServerCredentials(ssl_opts); } else { - grpc_slice cert_slice, key_slice; - GPR_ASSERT(GRPC_LOG_IF_ERROR( - "load_file", grpc_load_file(SERVER_CERT_PATH, 1, &cert_slice))); - GPR_ASSERT(GRPC_LOG_IF_ERROR( - "load_file", grpc_load_file(SERVER_KEY_PATH, 1, &key_slice))); - const char* server_cert = - reinterpret_cast GRPC_SLICE_START_PTR(cert_slice); - const char* server_key = - reinterpret_cast GRPC_SLICE_START_PTR(key_slice); - SslServerCredentialsOptions::PemKeyCertPair pkcp = {server_key, - server_cert}; + SslServerCredentialsOptions::PemKeyCertPair pkcp = {server_key_, + server_cert_}; ssl_opts.pem_key_cert_pairs.push_back(pkcp); - std::shared_ptr credential_ptr = - SslServerCredentials(ssl_opts); - grpc_slice_unref(cert_slice); - grpc_slice_unref(key_slice); - return credential_ptr; } + return SslServerCredentials(ssl_opts); } else { std::unique_lock lock(mu_); auto it(std::find(added_secure_type_names_.begin(), @@ -183,6 +164,9 @@ class DefaultCredentialsProvider : public CredentialsProvider { added_secure_type_providers_; grpc::string custom_server_key_; grpc::string custom_server_cert_; + grpc::string test_root_cert_; + grpc::string server_key_; + grpc::string server_cert_; }; CredentialsProvider* g_provider = nullptr; diff --git a/test/cpp/util/test_credentials_provider.h b/test/cpp/util/test_credentials_provider.h index 2e4bf7f1370..b634406e4b4 100644 --- a/test/cpp/util/test_credentials_provider.h +++ b/test/cpp/util/test_credentials_provider.h @@ -19,10 +19,6 @@ #ifndef GRPC_TEST_CPP_UTIL_TEST_CREDENTIALS_PROVIDER_H #define GRPC_TEST_CPP_UTIL_TEST_CREDENTIALS_PROVIDER_H -extern const char test_root_cert[]; -extern const char server_cert[]; -extern const char server_key[]; - #include #include #include From 0ce79a560b3e055b10b34290bf9702a7d5b16059 Mon Sep 17 00:00:00 2001 From: Donna Dionne Date: Sat, 25 Apr 2020 20:54:05 -0700 Subject: [PATCH 612/758] Revert a change to XdsTest/ClientLoadReportingWithDropTest This test was a bit flaky, but after the change, the msan runs are failing more often. Reverting the change while investigating futher --- test/cpp/end2end/xds_end2end_test.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/cpp/end2end/xds_end2end_test.cc b/test/cpp/end2end/xds_end2end_test.cc index aa873490ca4..65fdac91040 100644 --- a/test/cpp/end2end/xds_end2end_test.cc +++ b/test/cpp/end2end/xds_end2end_test.cc @@ -3956,7 +3956,7 @@ class ClientLoadReportingWithDropTest : public XdsEnd2endTest { TEST_P(ClientLoadReportingWithDropTest, Vanilla) { SetNextResolution({}); SetNextResolutionForLbChannelAllBalancers(); - const size_t kNumRpcs = 5000; + const size_t kNumRpcs = 3000; const uint32_t kDropPerMillionForLb = 100000; const uint32_t kDropPerMillionForThrottle = 200000; const double kDropRateForLb = kDropPerMillionForLb / 1000000.0; From 326a81bf87811a313028f62d3ce3cbfc9f453502 Mon Sep 17 00:00:00 2001 From: Donna Dionne Date: Sat, 25 Apr 2020 23:04:35 -0700 Subject: [PATCH 613/758] Ensuring each action is only generated once in service config, even if the same one is referred to multiple times by routes. Added this test case in existing test case. --- src/core/ext/filters/client_channel/xds/xds_client.cc | 8 ++++++-- test/cpp/end2end/xds_end2end_test.cc | 3 +++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/core/ext/filters/client_channel/xds/xds_client.cc b/src/core/ext/filters/client_channel/xds/xds_client.cc index 9dc7b97773c..aec4ec4e708 100644 --- a/src/core/ext/filters/client_channel/xds/xds_client.cc +++ b/src/core/ext/filters/client_channel/xds/xds_client.cc @@ -2068,10 +2068,14 @@ grpc_error* XdsClient::CreateServiceConfig( " { \"xds_routing_experimental\":{\n" " \"actions\":{\n"); std::vector actions_vector; + std::set actions_set; for (size_t i = 0; i < rds_update.routes.size(); ++i) { auto route = rds_update.routes[i]; - actions_vector.push_back( - CreateServiceConfigActionCluster(route.cluster_name.c_str())); + if (actions_set.find(route.cluster_name) == actions_set.end()) { + actions_vector.push_back( + CreateServiceConfigActionCluster(route.cluster_name.c_str())); + actions_set.emplace(route.cluster_name); + } } config_parts.push_back(absl::StrJoin(actions_vector, ",\n")); config_parts.push_back( diff --git a/test/cpp/end2end/xds_end2end_test.cc b/test/cpp/end2end/xds_end2end_test.cc index aa873490ca4..8eb897233e9 100644 --- a/test/cpp/end2end/xds_end2end_test.cc +++ b/test/cpp/end2end/xds_end2end_test.cc @@ -2576,6 +2576,9 @@ TEST_P(LdsTest, XdsRoutingPathMatching) { auto* route2 = new_route_config.mutable_virtual_hosts(0)->add_routes(); route2->mutable_match()->set_path("/grpc.testing.EchoTest2Service/Echo2"); route2->mutable_route()->set_cluster(kNewCluster2Name); + auto* route3 = new_route_config.mutable_virtual_hosts(0)->add_routes(); + route3->mutable_match()->set_path("/grpc.testing.EchoTest3Service/Echo3"); + route3->mutable_route()->set_cluster(kDefaultResourceName); auto* default_route = new_route_config.mutable_virtual_hosts(0)->add_routes(); default_route->mutable_match()->set_prefix(""); default_route->mutable_route()->set_cluster(kDefaultResourceName); From d067c7e663684554c80e369af4d7a3a7b53d6ee3 Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Fri, 24 Apr 2020 12:46:13 -0400 Subject: [PATCH 614/758] update third_party/protobuf to 3.11.4 --- bazel/grpc_deps.bzl | 8 ++++---- third_party/protobuf | 2 +- tools/run_tests/sanity/check_submodules.sh | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/bazel/grpc_deps.bzl b/bazel/grpc_deps.bzl index baf70f30db5..3b86fefd9cb 100644 --- a/bazel/grpc_deps.bzl +++ b/bazel/grpc_deps.bzl @@ -154,11 +154,11 @@ def grpc_deps(): if "com_google_protobuf" not in native.existing_rules(): http_archive( name = "com_google_protobuf", - sha256 = "51398b0b97b353c1c226d0ade0bae80c80380e691cba7c1a108918986784a1c7", - strip_prefix = "protobuf-29cd005ce1fe1a8fabf11e325cb13006a6646d59", + sha256 = "2435b7fb83b8a608c24ca677907aa9a35e482a7f018e65ca69481b3c8c9f7caf", + strip_prefix = "protobuf-d0bfd5221182da1a7cc280f3337b5e41a89539cf", urls = [ - "https://storage.googleapis.com/grpc-bazel-mirror/github.com/google/protobuf/archive/29cd005ce1fe1a8fabf11e325cb13006a6646d59.tar.gz", - "https://github.com/google/protobuf/archive/29cd005ce1fe1a8fabf11e325cb13006a6646d59.tar.gz", + "https://storage.googleapis.com/grpc-bazel-mirror/github.com/google/protobuf/archive/d0bfd5221182da1a7cc280f3337b5e41a89539cf.tar.gz", + "https://github.com/google/protobuf/archive/d0bfd5221182da1a7cc280f3337b5e41a89539cf.tar.gz", ], ) diff --git a/third_party/protobuf b/third_party/protobuf index fe1790ca0df..d0bfd522118 160000 --- a/third_party/protobuf +++ b/third_party/protobuf @@ -1 +1 @@ -Subproject commit fe1790ca0df67173702f70d5646b82f48f412b99 +Subproject commit d0bfd5221182da1a7cc280f3337b5e41a89539cf diff --git a/tools/run_tests/sanity/check_submodules.sh b/tools/run_tests/sanity/check_submodules.sh index 05a28eae178..9195189ea46 100755 --- a/tools/run_tests/sanity/check_submodules.sh +++ b/tools/run_tests/sanity/check_submodules.sh @@ -36,7 +36,7 @@ cat << EOF | awk '{ print $1 }' | sort > "$want_submodules" 80ed4d0bbf65d57cc267dfc63bd2584557f11f9b third_party/googleapis (common-protos-1_3_1-915-g80ed4d0bb) c9ccac7cb7345901884aabf5d1a786cfa6e2f397 third_party/googletest (6e2f397) 15ae750151ac9341e5945eb38f8982d59fb99201 third_party/libuv (v1.34.0) - fe1790ca0df67173702f70d5646b82f48f412b99 protobuf (v3.7.0-rc.2-756-gfe1790ca0) + d0bfd5221182da1a7cc280f3337b5e41a89539cf third_party/protobuf (v3.7.0-rc.2-784-gd0bfd5221) c0a080f4bea50bc087cdd8551143ee538cf3459e third_party/protoc-gen-validate (v0.0.10) db4b343e48c1264bb4d9ff491b059300701dc7c7 third_party/udpa (heads/master) cacf7f1d4e3d44d871b605da3b647f07d718623f third_party/zlib (v1.2.11) From a3e9c0b92adb3433d923c103340d58bdecc43daa Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Fri, 24 Apr 2020 12:51:18 -0400 Subject: [PATCH 615/758] regenerate PHP code --- .../tests/generated_code/GPBMetadata/Math.php | 14 +-- .../tests/generated_code/Math/MathClient.php | 4 + .../Src/Proto/Grpc/Testing/Messages.php | 64 +--------- .../Src/Proto/Grpc/Testing/PBEmpty.php | 4 +- .../Src/Proto/Grpc/Testing/Test.php | 42 +------ .../LoadBalancerStatsServiceClient.php | 1 + .../Grpc/Testing/ReconnectServiceClient.php | 2 + .../Grpc/Testing/TestServiceClient.php | 8 ++ .../Testing/UnimplementedServiceClient.php | 1 + .../GPBMetadata/Src/Proto/Grpc/Core/Stats.php | 11 +- .../Proto/Grpc/Testing/BenchmarkService.php | 18 +-- .../Src/Proto/Grpc/Testing/CompilerTest.php | 15 +-- .../Src/Proto/Grpc/Testing/Control.php | 119 +----------------- .../Src/Proto/Grpc/Testing/EchoMessages.php | 36 +----- .../Src/Proto/Grpc/Testing/EmptyService.php | 4 +- .../Src/Proto/Grpc/Testing/Messages.php | 64 +--------- .../Src/Proto/Grpc/Testing/PBEmpty.php | 4 +- .../Src/Proto/Grpc/Testing/Payloads.php | 15 +-- .../Src/Proto/Grpc/Testing/ProxyService.php | 13 +- .../Grpc/Testing/ReportQpsScenarioService.php | 7 +- .../Src/Proto/Grpc/Testing/Stats.php | 26 +--- .../Src/Proto/Grpc/Testing/Test.php | 42 +------ .../Src/Proto/Grpc/Testing/WorkerService.php | 13 +- .../Grpc/Testing/BenchmarkServiceClient.php | 5 + .../LoadBalancerStatsServiceClient.php | 1 + .../Grpc/Testing/ProxyClientServiceClient.php | 3 + .../Grpc/Testing/ReconnectServiceClient.php | 2 + .../ReportQpsScenarioServiceClient.php | 1 + .../Grpc/Testing/ServiceAClient.php | 4 + .../Grpc/Testing/ServiceBClient.php | 1 + .../Grpc/Testing/TestServiceClient.php | 8 ++ .../Testing/UnimplementedServiceClient.php | 1 + .../Grpc/Testing/WorkerServiceClient.php | 4 + 33 files changed, 64 insertions(+), 493 deletions(-) diff --git a/src/php/tests/generated_code/GPBMetadata/Math.php b/src/php/tests/generated_code/GPBMetadata/Math.php index 07c886701b7..10f043607ac 100644 --- a/src/php/tests/generated_code/GPBMetadata/Math.php +++ b/src/php/tests/generated_code/GPBMetadata/Math.php @@ -15,19 +15,7 @@ class Math return; } $pool->internalAddGeneratedFile(hex2bin( - "0ae9020a0a6d6174682e70726f746f12046d617468222c0a074469764172" . - "677312100a086469766964656e64180120012803120f0a0764697669736f" . - "72180220012803222f0a084469765265706c7912100a0871756f7469656e" . - "7418012001280312110a0972656d61696e64657218022001280322180a07" . - "46696241726773120d0a056c696d697418012001280322120a034e756d12" . - "0b0a036e756d18012001280322190a084669625265706c79120d0a05636f" . - "756e7418012001280332a4010a044d61746812260a03446976120d2e6d61" . - "74682e446976417267731a0e2e6d6174682e4469765265706c792200122e" . - "0a074469764d616e79120d2e6d6174682e446976417267731a0e2e6d6174" . - "682e4469765265706c7922002801300112230a03466962120d2e6d617468" . - "2e466962417267731a092e6d6174682e4e756d22003001121f0a0353756d" . - "12092e6d6174682e4e756d1a092e6d6174682e4e756d2200280162067072" . - "6f746f33" + "0ae9020a0a6d6174682e70726f746f12046d617468222c0a074469764172677312100a086469766964656e64180120012803120f0a0764697669736f72180220012803222f0a084469765265706c7912100a0871756f7469656e7418012001280312110a0972656d61696e64657218022001280322180a0746696241726773120d0a056c696d697418012001280322120a034e756d120b0a036e756d18012001280322190a084669625265706c79120d0a05636f756e7418012001280332a4010a044d61746812260a03446976120d2e6d6174682e446976417267731a0e2e6d6174682e4469765265706c792200122e0a074469764d616e79120d2e6d6174682e446976417267731a0e2e6d6174682e4469765265706c7922002801300112230a03466962120d2e6d6174682e466962417267731a092e6d6174682e4e756d22003001121f0a0353756d12092e6d6174682e4e756d1a092e6d6174682e4e756d22002801620670726f746f33" ), true); static::$is_initialized = true; diff --git a/src/php/tests/generated_code/Math/MathClient.php b/src/php/tests/generated_code/Math/MathClient.php index 92c980afe16..f8b626b1bb5 100644 --- a/src/php/tests/generated_code/Math/MathClient.php +++ b/src/php/tests/generated_code/Math/MathClient.php @@ -37,6 +37,7 @@ class MathClient extends \Grpc\BaseStub { * @param \Math\DivArgs $argument input argument * @param array $metadata metadata * @param array $options call options + * @return \Math\DivReply */ public function Div(\Math\DivArgs $argument, $metadata = [], $options = []) { @@ -53,6 +54,7 @@ class MathClient extends \Grpc\BaseStub { * replies. The stream ends immediately if either end aborts. * @param array $metadata metadata * @param array $options call options + * @return \Math\DivReply */ public function DivMany($metadata = [], $options = []) { return $this->_bidiRequest('/math.Math/DivMany', @@ -67,6 +69,7 @@ class MathClient extends \Grpc\BaseStub { * @param \Math\FibArgs $argument input argument * @param array $metadata metadata * @param array $options call options + * @return \Math\Num */ public function Fib(\Math\FibArgs $argument, $metadata = [], $options = []) { @@ -81,6 +84,7 @@ class MathClient extends \Grpc\BaseStub { * is closed. * @param array $metadata metadata * @param array $options call options + * @return \Math\Num */ public function Sum($metadata = [], $options = []) { return $this->_clientStreamRequest('/math.Math/Sum', diff --git a/src/php/tests/interop/GPBMetadata/Src/Proto/Grpc/Testing/Messages.php b/src/php/tests/interop/GPBMetadata/Src/Proto/Grpc/Testing/Messages.php index 72c17046a24..91a9c7bfcf1 100644 --- a/src/php/tests/interop/GPBMetadata/Src/Proto/Grpc/Testing/Messages.php +++ b/src/php/tests/interop/GPBMetadata/Src/Proto/Grpc/Testing/Messages.php @@ -15,69 +15,7 @@ class Messages return; } $pool->internalAddGeneratedFile(hex2bin( - "0ad70e0a257372632f70726f746f2f677270632f74657374696e672f6d65" . - "7373616765732e70726f746f120c677270632e74657374696e67221a0a09" . - "426f6f6c56616c7565120d0a0576616c756518012001280822400a075061" . - "796c6f616412270a047479706518012001280e32192e677270632e746573" . - "74696e672e5061796c6f616454797065120c0a04626f647918022001280c" . - "222b0a0a4563686f537461747573120c0a04636f6465180120012805120f" . - "0a076d6573736167651802200128092286030a0d53696d706c6552657175" . - "65737412300a0d726573706f6e73655f7479706518012001280e32192e67" . - "7270632e74657374696e672e5061796c6f61645479706512150a0d726573" . - "706f6e73655f73697a6518022001280512260a077061796c6f6164180320" . - "01280b32152e677270632e74657374696e672e5061796c6f616412150a0d" . - "66696c6c5f757365726e616d6518042001280812180a1066696c6c5f6f61" . - "7574685f73636f706518052001280812340a13726573706f6e73655f636f" . - "6d7072657373656418062001280b32172e677270632e74657374696e672e" . - "426f6f6c56616c756512310a0f726573706f6e73655f7374617475731807" . - "2001280b32182e677270632e74657374696e672e4563686f537461747573" . - "12320a116578706563745f636f6d7072657373656418082001280b32172e" . - "677270632e74657374696e672e426f6f6c56616c756512160a0e66696c6c" . - "5f7365727665725f6964180920012808121e0a1666696c6c5f677270636c" . - "625f726f7574655f74797065180a2001280822be010a0e53696d706c6552" . - "6573706f6e736512260a077061796c6f616418012001280b32152e677270" . - "632e74657374696e672e5061796c6f616412100a08757365726e616d6518" . - "022001280912130a0b6f617574685f73636f706518032001280912110a09" . - "7365727665725f696418042001280912380a11677270636c625f726f7574" . - "655f7479706518052001280e321d2e677270632e74657374696e672e4772" . - "70636c62526f7574655479706512100a08686f73746e616d651806200128" . - "0922770a1953747265616d696e67496e70757443616c6c52657175657374" . - "12260a077061796c6f616418012001280b32152e677270632e7465737469" . - "6e672e5061796c6f616412320a116578706563745f636f6d707265737365" . - "6418022001280b32172e677270632e74657374696e672e426f6f6c56616c" . - "7565223d0a1a53747265616d696e67496e70757443616c6c526573706f6e" . - "7365121f0a17616767726567617465645f7061796c6f61645f73697a6518" . - "012001280522640a12526573706f6e7365506172616d6574657273120c0a" . - "0473697a6518012001280512130a0b696e74657276616c5f757318022001" . - "2805122b0a0a636f6d7072657373656418032001280b32172e677270632e" . - "74657374696e672e426f6f6c56616c756522e8010a1a53747265616d696e" . - "674f757470757443616c6c5265717565737412300a0d726573706f6e7365" . - "5f7479706518012001280e32192e677270632e74657374696e672e506179" . - "6c6f616454797065123d0a13726573706f6e73655f706172616d65746572" . - "7318022003280b32202e677270632e74657374696e672e526573706f6e73" . - "65506172616d657465727312260a077061796c6f616418032001280b3215" . - "2e677270632e74657374696e672e5061796c6f616412310a0f726573706f" . - "6e73655f73746174757318072001280b32182e677270632e74657374696e" . - "672e4563686f53746174757322450a1b53747265616d696e674f75747075" . - "7443616c6c526573706f6e736512260a077061796c6f616418012001280b" . - "32152e677270632e74657374696e672e5061796c6f616422330a0f526563" . - "6f6e6e656374506172616d7312200a186d61785f7265636f6e6e6563745f" . - "6261636b6f66665f6d7318012001280522330a0d5265636f6e6e65637449" . - "6e666f120e0a0670617373656418012001280812120a0a6261636b6f6666" . - "5f6d7318022003280522410a184c6f616442616c616e6365725374617473" . - "5265717565737412100a086e756d5f7270637318012001280512130a0b74" . - "696d656f75745f73656318022001280522b3010a194c6f616442616c616e" . - "6365725374617473526573706f6e7365124d0a0c727063735f62795f7065" . - "657218012003280b32372e677270632e74657374696e672e4c6f61644261" . - "6c616e6365725374617473526573706f6e73652e52706373427950656572" . - "456e74727912140a0c6e756d5f6661696c757265731802200128051a310a" . - "0f52706373427950656572456e747279120b0a036b657918012001280912" . - "0d0a0576616c75651802200128053a0238012a1f0a0b5061796c6f616454" . - "79706512100a0c434f4d505245535341424c4510002a6f0a0f477270636c" . - "62526f75746554797065121d0a19475250434c425f524f5554455f545950" . - "455f554e4b4e4f574e1000121e0a1a475250434c425f524f5554455f5459" . - "50455f46414c4c4241434b1001121d0a19475250434c425f524f5554455f" . - "545950455f4241434b454e441002620670726f746f33" + "0ad70e0a257372632f70726f746f2f677270632f74657374696e672f6d657373616765732e70726f746f120c677270632e74657374696e67221a0a09426f6f6c56616c7565120d0a0576616c756518012001280822400a075061796c6f616412270a047479706518012001280e32192e677270632e74657374696e672e5061796c6f616454797065120c0a04626f647918022001280c222b0a0a4563686f537461747573120c0a04636f6465180120012805120f0a076d6573736167651802200128092286030a0d53696d706c655265717565737412300a0d726573706f6e73655f7479706518012001280e32192e677270632e74657374696e672e5061796c6f61645479706512150a0d726573706f6e73655f73697a6518022001280512260a077061796c6f616418032001280b32152e677270632e74657374696e672e5061796c6f616412150a0d66696c6c5f757365726e616d6518042001280812180a1066696c6c5f6f617574685f73636f706518052001280812340a13726573706f6e73655f636f6d7072657373656418062001280b32172e677270632e74657374696e672e426f6f6c56616c756512310a0f726573706f6e73655f73746174757318072001280b32182e677270632e74657374696e672e4563686f53746174757312320a116578706563745f636f6d7072657373656418082001280b32172e677270632e74657374696e672e426f6f6c56616c756512160a0e66696c6c5f7365727665725f6964180920012808121e0a1666696c6c5f677270636c625f726f7574655f74797065180a2001280822be010a0e53696d706c65526573706f6e736512260a077061796c6f616418012001280b32152e677270632e74657374696e672e5061796c6f616412100a08757365726e616d6518022001280912130a0b6f617574685f73636f706518032001280912110a097365727665725f696418042001280912380a11677270636c625f726f7574655f7479706518052001280e321d2e677270632e74657374696e672e477270636c62526f7574655479706512100a08686f73746e616d6518062001280922770a1953747265616d696e67496e70757443616c6c5265717565737412260a077061796c6f616418012001280b32152e677270632e74657374696e672e5061796c6f616412320a116578706563745f636f6d7072657373656418022001280b32172e677270632e74657374696e672e426f6f6c56616c7565223d0a1a53747265616d696e67496e70757443616c6c526573706f6e7365121f0a17616767726567617465645f7061796c6f61645f73697a6518012001280522640a12526573706f6e7365506172616d6574657273120c0a0473697a6518012001280512130a0b696e74657276616c5f7573180220012805122b0a0a636f6d7072657373656418032001280b32172e677270632e74657374696e672e426f6f6c56616c756522e8010a1a53747265616d696e674f757470757443616c6c5265717565737412300a0d726573706f6e73655f7479706518012001280e32192e677270632e74657374696e672e5061796c6f616454797065123d0a13726573706f6e73655f706172616d657465727318022003280b32202e677270632e74657374696e672e526573706f6e7365506172616d657465727312260a077061796c6f616418032001280b32152e677270632e74657374696e672e5061796c6f616412310a0f726573706f6e73655f73746174757318072001280b32182e677270632e74657374696e672e4563686f53746174757322450a1b53747265616d696e674f757470757443616c6c526573706f6e736512260a077061796c6f616418012001280b32152e677270632e74657374696e672e5061796c6f616422330a0f5265636f6e6e656374506172616d7312200a186d61785f7265636f6e6e6563745f6261636b6f66665f6d7318012001280522330a0d5265636f6e6e656374496e666f120e0a0670617373656418012001280812120a0a6261636b6f66665f6d7318022003280522410a184c6f616442616c616e63657253746174735265717565737412100a086e756d5f7270637318012001280512130a0b74696d656f75745f73656318022001280522b3010a194c6f616442616c616e6365725374617473526573706f6e7365124d0a0c727063735f62795f7065657218012003280b32372e677270632e74657374696e672e4c6f616442616c616e6365725374617473526573706f6e73652e52706373427950656572456e74727912140a0c6e756d5f6661696c757265731802200128051a310a0f52706373427950656572456e747279120b0a036b6579180120012809120d0a0576616c75651802200128053a0238012a1f0a0b5061796c6f61645479706512100a0c434f4d505245535341424c4510002a6f0a0f477270636c62526f75746554797065121d0a19475250434c425f524f5554455f545950455f554e4b4e4f574e1000121e0a1a475250434c425f524f5554455f545950455f46414c4c4241434b1001121d0a19475250434c425f524f5554455f545950455f4241434b454e441002620670726f746f33" ), true); static::$is_initialized = true; diff --git a/src/php/tests/interop/GPBMetadata/Src/Proto/Grpc/Testing/PBEmpty.php b/src/php/tests/interop/GPBMetadata/Src/Proto/Grpc/Testing/PBEmpty.php index 6118c2609c0..f103e2e3ed2 100644 --- a/src/php/tests/interop/GPBMetadata/Src/Proto/Grpc/Testing/PBEmpty.php +++ b/src/php/tests/interop/GPBMetadata/Src/Proto/Grpc/Testing/PBEmpty.php @@ -15,9 +15,7 @@ class PBEmpty return; } $pool->internalAddGeneratedFile(hex2bin( - "0a4a0a227372632f70726f746f2f677270632f74657374696e672f656d70" . - "74792e70726f746f120c677270632e74657374696e67220e0a0c456d7074" . - "794d657373616765620670726f746f33" + "0a4a0a227372632f70726f746f2f677270632f74657374696e672f656d7074792e70726f746f120c677270632e74657374696e67220e0a0c456d7074794d657373616765620670726f746f33" ), true); static::$is_initialized = true; diff --git a/src/php/tests/interop/GPBMetadata/Src/Proto/Grpc/Testing/Test.php b/src/php/tests/interop/GPBMetadata/Src/Proto/Grpc/Testing/Test.php index c3063340d00..2ae2dadabdc 100644 --- a/src/php/tests/interop/GPBMetadata/Src/Proto/Grpc/Testing/Test.php +++ b/src/php/tests/interop/GPBMetadata/Src/Proto/Grpc/Testing/Test.php @@ -17,47 +17,7 @@ class Test \GPBMetadata\Src\Proto\Grpc\Testing\PBEmpty::initOnce(); \GPBMetadata\Src\Proto\Grpc\Testing\Messages::initOnce(); $pool->internalAddGeneratedFile(hex2bin( - "0aca090a217372632f70726f746f2f677270632f74657374696e672f7465" . - "73742e70726f746f120c677270632e74657374696e671a257372632f7072" . - "6f746f2f677270632f74657374696e672f6d657373616765732e70726f74" . - "6f32e7050a0b546573745365727669636512430a09456d70747943616c6c" . - "121a2e677270632e74657374696e672e456d7074794d6573736167651a1a" . - "2e677270632e74657374696e672e456d7074794d65737361676512460a09" . - "556e61727943616c6c121b2e677270632e74657374696e672e53696d706c" . - "65526571756573741a1c2e677270632e74657374696e672e53696d706c65" . - "526573706f6e7365124f0a12436163686561626c65556e61727943616c6c" . - "121b2e677270632e74657374696e672e53696d706c65526571756573741a" . - "1c2e677270632e74657374696e672e53696d706c65526573706f6e736512" . - "6c0a1353747265616d696e674f757470757443616c6c12282e677270632e" . - "74657374696e672e53747265616d696e674f757470757443616c6c526571" . - "756573741a292e677270632e74657374696e672e53747265616d696e674f" . - "757470757443616c6c526573706f6e7365300112690a1253747265616d69" . - "6e67496e70757443616c6c12272e677270632e74657374696e672e537472" . - "65616d696e67496e70757443616c6c526571756573741a282e677270632e" . - "74657374696e672e53747265616d696e67496e70757443616c6c52657370" . - "6f6e7365280112690a0e46756c6c4475706c657843616c6c12282e677270" . - "632e74657374696e672e53747265616d696e674f757470757443616c6c52" . - "6571756573741a292e677270632e74657374696e672e53747265616d696e" . - "674f757470757443616c6c526573706f6e73652801300112690a0e48616c" . - "664475706c657843616c6c12282e677270632e74657374696e672e537472" . - "65616d696e674f757470757443616c6c526571756573741a292e67727063" . - "2e74657374696e672e53747265616d696e674f757470757443616c6c5265" . - "73706f6e736528013001124b0a11556e696d706c656d656e74656443616c" . - "6c121a2e677270632e74657374696e672e456d7074794d6573736167651a" . - "1a2e677270632e74657374696e672e456d7074794d65737361676532630a" . - "14556e696d706c656d656e74656453657276696365124b0a11556e696d70" . - "6c656d656e74656443616c6c121a2e677270632e74657374696e672e456d" . - "7074794d6573736167651a1a2e677270632e74657374696e672e456d7074" . - "794d6573736167653297010a105265636f6e6e6563745365727669636512" . - "420a055374617274121d2e677270632e74657374696e672e5265636f6e6e" . - "656374506172616d731a1a2e677270632e74657374696e672e456d707479" . - "4d657373616765123f0a0453746f70121a2e677270632e74657374696e67" . - "2e456d7074794d6573736167651a1b2e677270632e74657374696e672e52" . - "65636f6e6e656374496e666f327f0a184c6f616442616c616e6365725374" . - "6174735365727669636512630a0e476574436c69656e7453746174731226" . - "2e677270632e74657374696e672e4c6f616442616c616e63657253746174" . - "73526571756573741a272e677270632e74657374696e672e4c6f61644261" . - "6c616e6365725374617473526573706f6e73652200620670726f746f33" + "0aca090a217372632f70726f746f2f677270632f74657374696e672f746573742e70726f746f120c677270632e74657374696e671a257372632f70726f746f2f677270632f74657374696e672f6d657373616765732e70726f746f32e7050a0b546573745365727669636512430a09456d70747943616c6c121a2e677270632e74657374696e672e456d7074794d6573736167651a1a2e677270632e74657374696e672e456d7074794d65737361676512460a09556e61727943616c6c121b2e677270632e74657374696e672e53696d706c65526571756573741a1c2e677270632e74657374696e672e53696d706c65526573706f6e7365124f0a12436163686561626c65556e61727943616c6c121b2e677270632e74657374696e672e53696d706c65526571756573741a1c2e677270632e74657374696e672e53696d706c65526573706f6e7365126c0a1353747265616d696e674f757470757443616c6c12282e677270632e74657374696e672e53747265616d696e674f757470757443616c6c526571756573741a292e677270632e74657374696e672e53747265616d696e674f757470757443616c6c526573706f6e7365300112690a1253747265616d696e67496e70757443616c6c12272e677270632e74657374696e672e53747265616d696e67496e70757443616c6c526571756573741a282e677270632e74657374696e672e53747265616d696e67496e70757443616c6c526573706f6e7365280112690a0e46756c6c4475706c657843616c6c12282e677270632e74657374696e672e53747265616d696e674f757470757443616c6c526571756573741a292e677270632e74657374696e672e53747265616d696e674f757470757443616c6c526573706f6e73652801300112690a0e48616c664475706c657843616c6c12282e677270632e74657374696e672e53747265616d696e674f757470757443616c6c526571756573741a292e677270632e74657374696e672e53747265616d696e674f757470757443616c6c526573706f6e736528013001124b0a11556e696d706c656d656e74656443616c6c121a2e677270632e74657374696e672e456d7074794d6573736167651a1a2e677270632e74657374696e672e456d7074794d65737361676532630a14556e696d706c656d656e74656453657276696365124b0a11556e696d706c656d656e74656443616c6c121a2e677270632e74657374696e672e456d7074794d6573736167651a1a2e677270632e74657374696e672e456d7074794d6573736167653297010a105265636f6e6e6563745365727669636512420a055374617274121d2e677270632e74657374696e672e5265636f6e6e656374506172616d731a1a2e677270632e74657374696e672e456d7074794d657373616765123f0a0453746f70121a2e677270632e74657374696e672e456d7074794d6573736167651a1b2e677270632e74657374696e672e5265636f6e6e656374496e666f327f0a184c6f616442616c616e63657253746174735365727669636512630a0e476574436c69656e74537461747312262e677270632e74657374696e672e4c6f616442616c616e6365725374617473526571756573741a272e677270632e74657374696e672e4c6f616442616c616e6365725374617473526573706f6e73652200620670726f746f33" ), true); static::$is_initialized = true; diff --git a/src/php/tests/interop/Grpc/Testing/LoadBalancerStatsServiceClient.php b/src/php/tests/interop/Grpc/Testing/LoadBalancerStatsServiceClient.php index 129776d8a30..cfbd0fd0a59 100644 --- a/src/php/tests/interop/Grpc/Testing/LoadBalancerStatsServiceClient.php +++ b/src/php/tests/interop/Grpc/Testing/LoadBalancerStatsServiceClient.php @@ -40,6 +40,7 @@ class LoadBalancerStatsServiceClient extends \Grpc\BaseStub { * @param \Grpc\Testing\LoadBalancerStatsRequest $argument input argument * @param array $metadata metadata * @param array $options call options + * @return \Grpc\Testing\LoadBalancerStatsResponse */ public function GetClientStats(\Grpc\Testing\LoadBalancerStatsRequest $argument, $metadata = [], $options = []) { diff --git a/src/php/tests/interop/Grpc/Testing/ReconnectServiceClient.php b/src/php/tests/interop/Grpc/Testing/ReconnectServiceClient.php index 50beca20e00..695d83a6871 100644 --- a/src/php/tests/interop/Grpc/Testing/ReconnectServiceClient.php +++ b/src/php/tests/interop/Grpc/Testing/ReconnectServiceClient.php @@ -39,6 +39,7 @@ class ReconnectServiceClient extends \Grpc\BaseStub { * @param \Grpc\Testing\ReconnectParams $argument input argument * @param array $metadata metadata * @param array $options call options + * @return \Grpc\Testing\EmptyMessage */ public function Start(\Grpc\Testing\ReconnectParams $argument, $metadata = [], $options = []) { @@ -52,6 +53,7 @@ class ReconnectServiceClient extends \Grpc\BaseStub { * @param \Grpc\Testing\EmptyMessage $argument input argument * @param array $metadata metadata * @param array $options call options + * @return \Grpc\Testing\ReconnectInfo */ public function Stop(\Grpc\Testing\EmptyMessage $argument, $metadata = [], $options = []) { diff --git a/src/php/tests/interop/Grpc/Testing/TestServiceClient.php b/src/php/tests/interop/Grpc/Testing/TestServiceClient.php index e6fef125b8b..770c6090034 100644 --- a/src/php/tests/interop/Grpc/Testing/TestServiceClient.php +++ b/src/php/tests/interop/Grpc/Testing/TestServiceClient.php @@ -41,6 +41,7 @@ class TestServiceClient extends \Grpc\BaseStub { * @param \Grpc\Testing\EmptyMessage $argument input argument * @param array $metadata metadata * @param array $options call options + * @return \Grpc\Testing\EmptyMessage */ public function EmptyCall(\Grpc\Testing\EmptyMessage $argument, $metadata = [], $options = []) { @@ -55,6 +56,7 @@ class TestServiceClient extends \Grpc\BaseStub { * @param \Grpc\Testing\SimpleRequest $argument input argument * @param array $metadata metadata * @param array $options call options + * @return \Grpc\Testing\SimpleResponse */ public function UnaryCall(\Grpc\Testing\SimpleRequest $argument, $metadata = [], $options = []) { @@ -71,6 +73,7 @@ class TestServiceClient extends \Grpc\BaseStub { * @param \Grpc\Testing\SimpleRequest $argument input argument * @param array $metadata metadata * @param array $options call options + * @return \Grpc\Testing\SimpleResponse */ public function CacheableUnaryCall(\Grpc\Testing\SimpleRequest $argument, $metadata = [], $options = []) { @@ -86,6 +89,7 @@ class TestServiceClient extends \Grpc\BaseStub { * @param \Grpc\Testing\StreamingOutputCallRequest $argument input argument * @param array $metadata metadata * @param array $options call options + * @return \Grpc\Testing\StreamingOutputCallResponse */ public function StreamingOutputCall(\Grpc\Testing\StreamingOutputCallRequest $argument, $metadata = [], $options = []) { @@ -100,6 +104,7 @@ class TestServiceClient extends \Grpc\BaseStub { * The server returns the aggregated size of client payload as the result. * @param array $metadata metadata * @param array $options call options + * @return \Grpc\Testing\StreamingInputCallResponse */ public function StreamingInputCall($metadata = [], $options = []) { return $this->_clientStreamRequest('/grpc.testing.TestService/StreamingInputCall', @@ -113,6 +118,7 @@ class TestServiceClient extends \Grpc\BaseStub { * demonstrates the idea of full duplexing. * @param array $metadata metadata * @param array $options call options + * @return \Grpc\Testing\StreamingOutputCallResponse */ public function FullDuplexCall($metadata = [], $options = []) { return $this->_bidiRequest('/grpc.testing.TestService/FullDuplexCall', @@ -127,6 +133,7 @@ class TestServiceClient extends \Grpc\BaseStub { * first request. * @param array $metadata metadata * @param array $options call options + * @return \Grpc\Testing\StreamingOutputCallResponse */ public function HalfDuplexCall($metadata = [], $options = []) { return $this->_bidiRequest('/grpc.testing.TestService/HalfDuplexCall', @@ -140,6 +147,7 @@ class TestServiceClient extends \Grpc\BaseStub { * @param \Grpc\Testing\EmptyMessage $argument input argument * @param array $metadata metadata * @param array $options call options + * @return \Grpc\Testing\EmptyMessage */ public function UnimplementedCall(\Grpc\Testing\EmptyMessage $argument, $metadata = [], $options = []) { diff --git a/src/php/tests/interop/Grpc/Testing/UnimplementedServiceClient.php b/src/php/tests/interop/Grpc/Testing/UnimplementedServiceClient.php index 2c1d921bfcc..9988a6c4d06 100644 --- a/src/php/tests/interop/Grpc/Testing/UnimplementedServiceClient.php +++ b/src/php/tests/interop/Grpc/Testing/UnimplementedServiceClient.php @@ -41,6 +41,7 @@ class UnimplementedServiceClient extends \Grpc\BaseStub { * @param \Grpc\Testing\EmptyMessage $argument input argument * @param array $metadata metadata * @param array $options call options + * @return \Grpc\Testing\EmptyMessage */ public function UnimplementedCall(\Grpc\Testing\EmptyMessage $argument, $metadata = [], $options = []) { diff --git a/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Core/Stats.php b/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Core/Stats.php index 36aaad2884b..9c9832405f7 100644 --- a/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Core/Stats.php +++ b/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Core/Stats.php @@ -15,16 +15,7 @@ class Stats return; } $pool->internalAddGeneratedFile(hex2bin( - "0a97020a1f7372632f70726f746f2f677270632f636f72652f7374617473" . - "2e70726f746f1209677270632e636f726522260a064275636b6574120d0a" . - "057374617274180120012801120d0a05636f756e74180220012804222f0a" . - "09486973746f6772616d12220a076275636b65747318012003280b32112e" . - "677270632e636f72652e4275636b6574225b0a064d6574726963120c0a04" . - "6e616d65180120012809120f0a05636f756e74180a20012804480012290a" . - "09686973746f6772616d180b2001280b32142e677270632e636f72652e48" . - "6973746f6772616d480042070a0576616c7565222b0a0553746174731222" . - "0a076d65747269637318012003280b32112e677270632e636f72652e4d65" . - "74726963620670726f746f33" + "0a97020a1f7372632f70726f746f2f677270632f636f72652f73746174732e70726f746f1209677270632e636f726522260a064275636b6574120d0a057374617274180120012801120d0a05636f756e74180220012804222f0a09486973746f6772616d12220a076275636b65747318012003280b32112e677270632e636f72652e4275636b6574225b0a064d6574726963120c0a046e616d65180120012809120f0a05636f756e74180a20012804480012290a09686973746f6772616d180b2001280b32142e677270632e636f72652e486973746f6772616d480042070a0576616c7565222b0a05537461747312220a076d65747269637318012003280b32112e677270632e636f72652e4d6574726963620670726f746f33" ), true); static::$is_initialized = true; diff --git a/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/BenchmarkService.php b/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/BenchmarkService.php index ead856ba901..ab8c356f451 100644 --- a/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/BenchmarkService.php +++ b/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/BenchmarkService.php @@ -16,23 +16,7 @@ class BenchmarkService } \GPBMetadata\Src\Proto\Grpc\Testing\Messages::initOnce(); $pool->internalAddGeneratedFile(hex2bin( - "0aef030a2e7372632f70726f746f2f677270632f74657374696e672f6265" . - "6e63686d61726b5f736572766963652e70726f746f120c677270632e7465" . - "7374696e6732a6030a1042656e63686d61726b5365727669636512460a09" . - "556e61727943616c6c121b2e677270632e74657374696e672e53696d706c" . - "65526571756573741a1c2e677270632e74657374696e672e53696d706c65" . - "526573706f6e7365124e0a0d53747265616d696e6743616c6c121b2e6772" . - "70632e74657374696e672e53696d706c65526571756573741a1c2e677270" . - "632e74657374696e672e53696d706c65526573706f6e7365280130011252" . - "0a1353747265616d696e6746726f6d436c69656e74121b2e677270632e74" . - "657374696e672e53696d706c65526571756573741a1c2e677270632e7465" . - "7374696e672e53696d706c65526573706f6e7365280112520a1353747265" . - "616d696e6746726f6d536572766572121b2e677270632e74657374696e67" . - "2e53696d706c65526571756573741a1c2e677270632e74657374696e672e" . - "53696d706c65526573706f6e7365300112520a1153747265616d696e6742" . - "6f746857617973121b2e677270632e74657374696e672e53696d706c6552" . - "6571756573741a1c2e677270632e74657374696e672e53696d706c655265" . - "73706f6e736528013001620670726f746f33" + "0aef030a2e7372632f70726f746f2f677270632f74657374696e672f62656e63686d61726b5f736572766963652e70726f746f120c677270632e74657374696e6732a6030a1042656e63686d61726b5365727669636512460a09556e61727943616c6c121b2e677270632e74657374696e672e53696d706c65526571756573741a1c2e677270632e74657374696e672e53696d706c65526573706f6e7365124e0a0d53747265616d696e6743616c6c121b2e677270632e74657374696e672e53696d706c65526571756573741a1c2e677270632e74657374696e672e53696d706c65526573706f6e73652801300112520a1353747265616d696e6746726f6d436c69656e74121b2e677270632e74657374696e672e53696d706c65526571756573741a1c2e677270632e74657374696e672e53696d706c65526573706f6e7365280112520a1353747265616d696e6746726f6d536572766572121b2e677270632e74657374696e672e53696d706c65526571756573741a1c2e677270632e74657374696e672e53696d706c65526573706f6e7365300112520a1153747265616d696e67426f746857617973121b2e677270632e74657374696e672e53696d706c65526571756573741a1c2e677270632e74657374696e672e53696d706c65526573706f6e736528013001620670726f746f33" ), true); static::$is_initialized = true; diff --git a/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/CompilerTest.php b/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/CompilerTest.php index 3eb7acd5729..0321b966d22 100644 --- a/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/CompilerTest.php +++ b/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/CompilerTest.php @@ -15,20 +15,7 @@ class CompilerTest return; } $pool->internalAddGeneratedFile(hex2bin( - "0aa1030a2a7372632f70726f746f2f677270632f74657374696e672f636f" . - "6d70696c65725f746573742e70726f746f120c677270632e74657374696e" . - "6722090a0752657175657374220a0a08526573706f6e736532fe010a0853" . - "6572766963654112390a084d6574686f64413112152e677270632e746573" . - "74696e672e526571756573741a162e677270632e74657374696e672e5265" . - "73706f6e7365123b0a084d6574686f64413212152e677270632e74657374" . - "696e672e526571756573741a162e677270632e74657374696e672e526573" . - "706f6e73652801123b0a084d6574686f64413312152e677270632e746573" . - "74696e672e526571756573741a162e677270632e74657374696e672e5265" . - "73706f6e73653001123d0a084d6574686f64413412152e677270632e7465" . - "7374696e672e526571756573741a162e677270632e74657374696e672e52" . - "6573706f6e73652801300132450a08536572766963654212390a084d6574" . - "686f64423112152e677270632e74657374696e672e526571756573741a16" . - "2e677270632e74657374696e672e526573706f6e7365620670726f746f33" + "0aa1030a2a7372632f70726f746f2f677270632f74657374696e672f636f6d70696c65725f746573742e70726f746f120c677270632e74657374696e6722090a0752657175657374220a0a08526573706f6e736532fe010a08536572766963654112390a084d6574686f64413112152e677270632e74657374696e672e526571756573741a162e677270632e74657374696e672e526573706f6e7365123b0a084d6574686f64413212152e677270632e74657374696e672e526571756573741a162e677270632e74657374696e672e526573706f6e73652801123b0a084d6574686f64413312152e677270632e74657374696e672e526571756573741a162e677270632e74657374696e672e526573706f6e73653001123d0a084d6574686f64413412152e677270632e74657374696e672e526571756573741a162e677270632e74657374696e672e526573706f6e73652801300132450a08536572766963654212390a084d6574686f64423112152e677270632e74657374696e672e526571756573741a162e677270632e74657374696e672e526573706f6e7365620670726f746f33" ), true); static::$is_initialized = true; diff --git a/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/Control.php b/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/Control.php index b92e61bf25a..0f111cc8eb5 100644 --- a/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/Control.php +++ b/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/Control.php @@ -17,124 +17,7 @@ class Control \GPBMetadata\Src\Proto\Grpc\Testing\Payloads::initOnce(); \GPBMetadata\Src\Proto\Grpc\Testing\Stats::initOnce(); $pool->internalAddGeneratedFile(hex2bin( - "0acd1b0a247372632f70726f746f2f677270632f74657374696e672f636f" . - "6e74726f6c2e70726f746f120c677270632e74657374696e671a22737263" . - "2f70726f746f2f677270632f74657374696e672f73746174732e70726f74" . - "6f22250a0d506f6973736f6e506172616d7312140a0c6f6666657265645f" . - "6c6f616418012001280122120a10436c6f7365644c6f6f70506172616d73" . - "227b0a0a4c6f6164506172616d7312350a0b636c6f7365645f6c6f6f7018" . - "012001280b321e2e677270632e74657374696e672e436c6f7365644c6f6f" . - "70506172616d734800122e0a07706f6973736f6e18022001280b321b2e67" . - "7270632e74657374696e672e506f6973736f6e506172616d73480042060a" . - "046c6f616422560a0e5365637572697479506172616d7312130a0b757365" . - "5f746573745f6361180120012808121c0a147365727665725f686f73745f" . - "6f7665727269646518022001280912110a09637265645f74797065180320" . - "012809224d0a0a4368616e6e656c417267120c0a046e616d651801200128" . - "0912130a097374725f76616c7565180220012809480012130a09696e745f" . - "76616c7565180320012805480042070a0576616c756522bc050a0c436c69" . - "656e74436f6e66696712160a0e7365727665725f74617267657473180120" . - "032809122d0a0b636c69656e745f7479706518022001280e32182e677270" . - "632e74657374696e672e436c69656e745479706512350a0f736563757269" . - "74795f706172616d7318032001280b321c2e677270632e74657374696e67" . - "2e5365637572697479506172616d7312240a1c6f75747374616e64696e67" . - "5f727063735f7065725f6368616e6e656c18042001280512170a0f636c69" . - "656e745f6368616e6e656c73180520012805121c0a146173796e635f636c" . - "69656e745f7468726561647318072001280512270a087270635f74797065" . - "18082001280e32152e677270632e74657374696e672e5270635479706512" . - "2d0a0b6c6f61645f706172616d73180a2001280b32182e677270632e7465" . - "7374696e672e4c6f6164506172616d7312330a0e7061796c6f61645f636f" . - "6e666967180b2001280b321b2e677270632e74657374696e672e5061796c" . - "6f6164436f6e66696712370a10686973746f6772616d5f706172616d7318" . - "0c2001280b321d2e677270632e74657374696e672e486973746f6772616d" . - "506172616d7312110a09636f72655f6c697374180d2003280512120a0a63" . - "6f72655f6c696d6974180e2001280512180a106f746865725f636c69656e" . - "745f617069180f20012809122e0a0c6368616e6e656c5f61726773181020" . - "03280b32182e677270632e74657374696e672e4368616e6e656c41726712" . - "160a0e746872656164735f7065725f6371181120012805121b0a136d6573" . - "73616765735f7065725f73747265616d18122001280512180a107573655f" . - "636f616c657363655f61706918132001280812310a296d656469616e5f6c" . - "6174656e63795f636f6c6c656374696f6e5f696e74657276616c5f6d696c" . - "6c697318142001280512180a10636c69656e745f70726f63657373657318" . - "152001280522380a0c436c69656e7453746174757312280a057374617473" . - "18012001280b32192e677270632e74657374696e672e436c69656e745374" . - "61747322150a044d61726b120d0a05726573657418012001280822680a0a" . - "436c69656e7441726773122b0a05736574757018012001280b321a2e6772" . - "70632e74657374696e672e436c69656e74436f6e666967480012220a046d" . - "61726b18022001280b32122e677270632e74657374696e672e4d61726b48" . - "0042090a07617267747970652297030a0c536572766572436f6e66696712" . - "2d0a0b7365727665725f7479706518012001280e32182e677270632e7465" . - "7374696e672e5365727665725479706512350a0f73656375726974795f70" . - "6172616d7318022001280b321c2e677270632e74657374696e672e536563" . - "7572697479506172616d73120c0a04706f7274180420012805121c0a1461" . - "73796e635f7365727665725f7468726561647318072001280512120a0a63" . - "6f72655f6c696d697418082001280512330a0e7061796c6f61645f636f6e" . - "66696718092001280b321b2e677270632e74657374696e672e5061796c6f" . - "6164436f6e66696712110a09636f72655f6c697374180a2003280512180a" . - "106f746865725f7365727665725f617069180b2001280912160a0e746872" . - "656164735f7065725f6371180c20012805121c0a137265736f757263655f" . - "71756f74615f73697a6518e90720012805122f0a0c6368616e6e656c5f61" . - "72677318ea072003280b32182e677270632e74657374696e672e4368616e" . - "6e656c41726712180a107365727665725f70726f63657373657318152001" . - "280522680a0a53657276657241726773122b0a0573657475701801200128" . - "0b321a2e677270632e74657374696e672e536572766572436f6e66696748" . - "0012220a046d61726b18022001280b32122e677270632e74657374696e67" . - "2e4d61726b480042090a076172677479706522550a0c5365727665725374" . - "6174757312280a05737461747318012001280b32192e677270632e746573" . - "74696e672e5365727665725374617473120c0a04706f7274180220012805" . - "120d0a05636f726573180320012805220d0a0b436f726552657175657374" . - "221d0a0c436f7265526573706f6e7365120d0a05636f7265731801200128" . - "0522060a04566f696422fd010a085363656e6172696f120c0a046e616d65" . - "18012001280912310a0d636c69656e745f636f6e66696718022001280b32" . - "1a2e677270632e74657374696e672e436c69656e74436f6e66696712130a" . - "0b6e756d5f636c69656e747318032001280512310a0d7365727665725f63" . - "6f6e66696718042001280b321a2e677270632e74657374696e672e536572" . - "766572436f6e66696712130a0b6e756d5f73657276657273180520012805" . - "12160a0e7761726d75705f7365636f6e647318062001280512190a116265" . - "6e63686d61726b5f7365636f6e647318072001280512200a18737061776e" . - "5f6c6f63616c5f776f726b65725f636f756e7418082001280522360a0953" . - "63656e6172696f7312290a097363656e6172696f7318012003280b32162e" . - "677270632e74657374696e672e5363656e6172696f2284040a155363656e" . - "6172696f526573756c7453756d6d617279120b0a03717073180120012801" . - "121b0a137170735f7065725f7365727665725f636f726518022001280112" . - "1a0a127365727665725f73797374656d5f74696d6518032001280112180a" . - "107365727665725f757365725f74696d65180420012801121a0a12636c69" . - "656e745f73797374656d5f74696d6518052001280112180a10636c69656e" . - "745f757365725f74696d6518062001280112120a0a6c6174656e63795f35" . - "3018072001280112120a0a6c6174656e63795f393018082001280112120a" . - "0a6c6174656e63795f393518092001280112120a0a6c6174656e63795f39" . - "39180a2001280112130a0b6c6174656e63795f393939180b200128011218" . - "0a107365727665725f6370755f7573616765180c2001280112260a1e7375" . - "636365737366756c5f72657175657374735f7065725f7365636f6e64180d" . - "2001280112220a1a6661696c65645f72657175657374735f7065725f7365" . - "636f6e64180e2001280112200a18636c69656e745f706f6c6c735f706572" . - "5f72657175657374180f2001280112200a187365727665725f706f6c6c73" . - "5f7065725f7265717565737418102001280112220a1a7365727665725f71" . - "7565726965735f7065725f6370755f73656318112001280112220a1a636c" . - "69656e745f717565726965735f7065725f6370755f736563181220012801" . - "2283030a0e5363656e6172696f526573756c7412280a087363656e617269" . - "6f18012001280b32162e677270632e74657374696e672e5363656e617269" . - "6f122e0a096c6174656e6369657318022001280b321b2e677270632e7465" . - "7374696e672e486973746f6772616d44617461122f0a0c636c69656e745f" . - "737461747318032003280b32192e677270632e74657374696e672e436c69" . - "656e745374617473122f0a0c7365727665725f737461747318042003280b" . - "32192e677270632e74657374696e672e536572766572537461747312140a" . - "0c7365727665725f636f72657318052003280512340a0773756d6d617279" . - "18062001280b32232e677270632e74657374696e672e5363656e6172696f" . - "526573756c7453756d6d61727912160a0e636c69656e745f737563636573" . - "7318072003280812160a0e7365727665725f737563636573731808200328" . - "0812390a0f726571756573745f726573756c747318092003280b32202e67" . - "7270632e74657374696e672e52657175657374526573756c74436f756e74" . - "2a560a0a436c69656e7454797065120f0a0b53594e435f434c49454e5410" . - "0012100a0c4153594e435f434c49454e54100112100a0c4f544845525f43" . - "4c49454e54100212130a0f43414c4c4241434b5f434c49454e5410032a70" . - "0a0a53657276657254797065120f0a0b53594e435f534552564552100012" . - "100a0c4153594e435f534552564552100112180a144153594e435f47454e" . - "455249435f534552564552100212100a0c4f544845525f53455256455210" . - "0312130a0f43414c4c4241434b5f53455256455210042a720a0752706354" . - "79706512090a05554e4152591000120d0a0953545245414d494e47100112" . - "190a1553545245414d494e475f46524f4d5f434c49454e54100212190a15" . - "53545245414d494e475f46524f4d5f534552564552100312170a13535452" . - "45414d494e475f424f54485f574159531004620670726f746f33" + "0acd1b0a247372632f70726f746f2f677270632f74657374696e672f636f6e74726f6c2e70726f746f120c677270632e74657374696e671a227372632f70726f746f2f677270632f74657374696e672f73746174732e70726f746f22250a0d506f6973736f6e506172616d7312140a0c6f6666657265645f6c6f616418012001280122120a10436c6f7365644c6f6f70506172616d73227b0a0a4c6f6164506172616d7312350a0b636c6f7365645f6c6f6f7018012001280b321e2e677270632e74657374696e672e436c6f7365644c6f6f70506172616d734800122e0a07706f6973736f6e18022001280b321b2e677270632e74657374696e672e506f6973736f6e506172616d73480042060a046c6f616422560a0e5365637572697479506172616d7312130a0b7573655f746573745f6361180120012808121c0a147365727665725f686f73745f6f7665727269646518022001280912110a09637265645f74797065180320012809224d0a0a4368616e6e656c417267120c0a046e616d6518012001280912130a097374725f76616c7565180220012809480012130a09696e745f76616c7565180320012805480042070a0576616c756522bc050a0c436c69656e74436f6e66696712160a0e7365727665725f74617267657473180120032809122d0a0b636c69656e745f7479706518022001280e32182e677270632e74657374696e672e436c69656e745479706512350a0f73656375726974795f706172616d7318032001280b321c2e677270632e74657374696e672e5365637572697479506172616d7312240a1c6f75747374616e64696e675f727063735f7065725f6368616e6e656c18042001280512170a0f636c69656e745f6368616e6e656c73180520012805121c0a146173796e635f636c69656e745f7468726561647318072001280512270a087270635f7479706518082001280e32152e677270632e74657374696e672e52706354797065122d0a0b6c6f61645f706172616d73180a2001280b32182e677270632e74657374696e672e4c6f6164506172616d7312330a0e7061796c6f61645f636f6e666967180b2001280b321b2e677270632e74657374696e672e5061796c6f6164436f6e66696712370a10686973746f6772616d5f706172616d73180c2001280b321d2e677270632e74657374696e672e486973746f6772616d506172616d7312110a09636f72655f6c697374180d2003280512120a0a636f72655f6c696d6974180e2001280512180a106f746865725f636c69656e745f617069180f20012809122e0a0c6368616e6e656c5f6172677318102003280b32182e677270632e74657374696e672e4368616e6e656c41726712160a0e746872656164735f7065725f6371181120012805121b0a136d657373616765735f7065725f73747265616d18122001280512180a107573655f636f616c657363655f61706918132001280812310a296d656469616e5f6c6174656e63795f636f6c6c656374696f6e5f696e74657276616c5f6d696c6c697318142001280512180a10636c69656e745f70726f63657373657318152001280522380a0c436c69656e7453746174757312280a05737461747318012001280b32192e677270632e74657374696e672e436c69656e74537461747322150a044d61726b120d0a05726573657418012001280822680a0a436c69656e7441726773122b0a05736574757018012001280b321a2e677270632e74657374696e672e436c69656e74436f6e666967480012220a046d61726b18022001280b32122e677270632e74657374696e672e4d61726b480042090a07617267747970652297030a0c536572766572436f6e666967122d0a0b7365727665725f7479706518012001280e32182e677270632e74657374696e672e5365727665725479706512350a0f73656375726974795f706172616d7318022001280b321c2e677270632e74657374696e672e5365637572697479506172616d73120c0a04706f7274180420012805121c0a146173796e635f7365727665725f7468726561647318072001280512120a0a636f72655f6c696d697418082001280512330a0e7061796c6f61645f636f6e66696718092001280b321b2e677270632e74657374696e672e5061796c6f6164436f6e66696712110a09636f72655f6c697374180a2003280512180a106f746865725f7365727665725f617069180b2001280912160a0e746872656164735f7065725f6371180c20012805121c0a137265736f757263655f71756f74615f73697a6518e90720012805122f0a0c6368616e6e656c5f6172677318ea072003280b32182e677270632e74657374696e672e4368616e6e656c41726712180a107365727665725f70726f63657373657318152001280522680a0a53657276657241726773122b0a05736574757018012001280b321a2e677270632e74657374696e672e536572766572436f6e666967480012220a046d61726b18022001280b32122e677270632e74657374696e672e4d61726b480042090a076172677479706522550a0c53657276657253746174757312280a05737461747318012001280b32192e677270632e74657374696e672e5365727665725374617473120c0a04706f7274180220012805120d0a05636f726573180320012805220d0a0b436f726552657175657374221d0a0c436f7265526573706f6e7365120d0a05636f72657318012001280522060a04566f696422fd010a085363656e6172696f120c0a046e616d6518012001280912310a0d636c69656e745f636f6e66696718022001280b321a2e677270632e74657374696e672e436c69656e74436f6e66696712130a0b6e756d5f636c69656e747318032001280512310a0d7365727665725f636f6e66696718042001280b321a2e677270632e74657374696e672e536572766572436f6e66696712130a0b6e756d5f7365727665727318052001280512160a0e7761726d75705f7365636f6e647318062001280512190a1162656e63686d61726b5f7365636f6e647318072001280512200a18737061776e5f6c6f63616c5f776f726b65725f636f756e7418082001280522360a095363656e6172696f7312290a097363656e6172696f7318012003280b32162e677270632e74657374696e672e5363656e6172696f2284040a155363656e6172696f526573756c7453756d6d617279120b0a03717073180120012801121b0a137170735f7065725f7365727665725f636f7265180220012801121a0a127365727665725f73797374656d5f74696d6518032001280112180a107365727665725f757365725f74696d65180420012801121a0a12636c69656e745f73797374656d5f74696d6518052001280112180a10636c69656e745f757365725f74696d6518062001280112120a0a6c6174656e63795f353018072001280112120a0a6c6174656e63795f393018082001280112120a0a6c6174656e63795f393518092001280112120a0a6c6174656e63795f3939180a2001280112130a0b6c6174656e63795f393939180b2001280112180a107365727665725f6370755f7573616765180c2001280112260a1e7375636365737366756c5f72657175657374735f7065725f7365636f6e64180d2001280112220a1a6661696c65645f72657175657374735f7065725f7365636f6e64180e2001280112200a18636c69656e745f706f6c6c735f7065725f72657175657374180f2001280112200a187365727665725f706f6c6c735f7065725f7265717565737418102001280112220a1a7365727665725f717565726965735f7065725f6370755f73656318112001280112220a1a636c69656e745f717565726965735f7065725f6370755f7365631812200128012283030a0e5363656e6172696f526573756c7412280a087363656e6172696f18012001280b32162e677270632e74657374696e672e5363656e6172696f122e0a096c6174656e6369657318022001280b321b2e677270632e74657374696e672e486973746f6772616d44617461122f0a0c636c69656e745f737461747318032003280b32192e677270632e74657374696e672e436c69656e745374617473122f0a0c7365727665725f737461747318042003280b32192e677270632e74657374696e672e536572766572537461747312140a0c7365727665725f636f72657318052003280512340a0773756d6d61727918062001280b32232e677270632e74657374696e672e5363656e6172696f526573756c7453756d6d61727912160a0e636c69656e745f7375636365737318072003280812160a0e7365727665725f7375636365737318082003280812390a0f726571756573745f726573756c747318092003280b32202e677270632e74657374696e672e52657175657374526573756c74436f756e742a560a0a436c69656e7454797065120f0a0b53594e435f434c49454e54100012100a0c4153594e435f434c49454e54100112100a0c4f544845525f434c49454e54100212130a0f43414c4c4241434b5f434c49454e5410032a700a0a53657276657254797065120f0a0b53594e435f534552564552100012100a0c4153594e435f534552564552100112180a144153594e435f47454e455249435f534552564552100212100a0c4f544845525f534552564552100312130a0f43414c4c4241434b5f53455256455210042a720a075270635479706512090a05554e4152591000120d0a0953545245414d494e47100112190a1553545245414d494e475f46524f4d5f434c49454e54100212190a1553545245414d494e475f46524f4d5f534552564552100312170a1353545245414d494e475f424f54485f574159531004620670726f746f33" ), true); static::$is_initialized = true; diff --git a/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/EchoMessages.php b/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/EchoMessages.php index 940b6bd21e7..efcc9b3fe03 100644 --- a/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/EchoMessages.php +++ b/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/EchoMessages.php @@ -15,41 +15,7 @@ class EchoMessages return; } $pool->internalAddGeneratedFile(hex2bin( - "0afd070a2a7372632f70726f746f2f677270632f74657374696e672f6563" . - "686f5f6d657373616765732e70726f746f120c677270632e74657374696e" . - "6722320a094465627567496e666f12150a0d737461636b5f656e74726965" . - "73180120032809120e0a0664657461696c18022001280922500a0b457272" . - "6f72537461747573120c0a04636f646518012001280512150a0d6572726f" . - "725f6d657373616765180220012809121c0a1462696e6172795f6572726f" . - "725f64657461696c7318032001280922cb040a0d52657175657374506172" . - "616d7312150a0d6563686f5f646561646c696e65180120012808121e0a16" . - "636c69656e745f63616e63656c5f61667465725f7573180220012805121e" . - "0a167365727665725f63616e63656c5f61667465725f7573180320012805" . - "12150a0d6563686f5f6d65746164617461180420012808121a0a12636865" . - "636b5f617574685f636f6e74657874180520012808121f0a17726573706f" . - "6e73655f6d6573736167655f6c656e67746818062001280512110a096563" . - "686f5f7065657218072001280812200a1865787065637465645f636c6965" . - "6e745f6964656e74697479180820012809121c0a14736b69705f63616e63" . - "656c6c65645f636865636b18092001280812280a2065787065637465645f" . - "7472616e73706f72745f73656375726974795f74797065180a2001280912" . - "2b0a0a64656275675f696e666f180b2001280b32172e677270632e746573" . - "74696e672e4465627567496e666f12120a0a7365727665725f646965180c" . - "20012808121c0a1462696e6172795f6572726f725f64657461696c73180d" . - "2001280912310a0e65787065637465645f6572726f72180e2001280b3219" . - "2e677270632e74657374696e672e4572726f7253746174757312170a0f73" . - "65727665725f736c6565705f7573180f20012805121b0a136261636b656e" . - "645f6368616e6e656c5f696478181020012805121f0a176563686f5f6d65" . - "7461646174615f696e697469616c6c7918112001280812290a2173657276" . - "65725f6e6f746966795f636c69656e745f7768656e5f7374617274656418" . - "1220012808224a0a0b4563686f52657175657374120f0a076d6573736167" . - "65180120012809122a0a05706172616d18022001280b321b2e677270632e" . - "74657374696e672e52657175657374506172616d7322460a0e526573706f" . - "6e7365506172616d7312180a10726571756573745f646561646c696e6518" . - "0120012803120c0a04686f7374180220012809120c0a0470656572180320" . - "012809224c0a0c4563686f526573706f6e7365120f0a076d657373616765" . - "180120012809122b0a05706172616d18022001280b321c2e677270632e74" . - "657374696e672e526573706f6e7365506172616d734203f8010162067072" . - "6f746f33" + "0afd070a2a7372632f70726f746f2f677270632f74657374696e672f6563686f5f6d657373616765732e70726f746f120c677270632e74657374696e6722320a094465627567496e666f12150a0d737461636b5f656e7472696573180120032809120e0a0664657461696c18022001280922500a0b4572726f72537461747573120c0a04636f646518012001280512150a0d6572726f725f6d657373616765180220012809121c0a1462696e6172795f6572726f725f64657461696c7318032001280922cb040a0d52657175657374506172616d7312150a0d6563686f5f646561646c696e65180120012808121e0a16636c69656e745f63616e63656c5f61667465725f7573180220012805121e0a167365727665725f63616e63656c5f61667465725f757318032001280512150a0d6563686f5f6d65746164617461180420012808121a0a12636865636b5f617574685f636f6e74657874180520012808121f0a17726573706f6e73655f6d6573736167655f6c656e67746818062001280512110a096563686f5f7065657218072001280812200a1865787065637465645f636c69656e745f6964656e74697479180820012809121c0a14736b69705f63616e63656c6c65645f636865636b18092001280812280a2065787065637465645f7472616e73706f72745f73656375726974795f74797065180a20012809122b0a0a64656275675f696e666f180b2001280b32172e677270632e74657374696e672e4465627567496e666f12120a0a7365727665725f646965180c20012808121c0a1462696e6172795f6572726f725f64657461696c73180d2001280912310a0e65787065637465645f6572726f72180e2001280b32192e677270632e74657374696e672e4572726f7253746174757312170a0f7365727665725f736c6565705f7573180f20012805121b0a136261636b656e645f6368616e6e656c5f696478181020012805121f0a176563686f5f6d657461646174615f696e697469616c6c7918112001280812290a217365727665725f6e6f746966795f636c69656e745f7768656e5f73746172746564181220012808224a0a0b4563686f52657175657374120f0a076d657373616765180120012809122a0a05706172616d18022001280b321b2e677270632e74657374696e672e52657175657374506172616d7322460a0e526573706f6e7365506172616d7312180a10726571756573745f646561646c696e65180120012803120c0a04686f7374180220012809120c0a0470656572180320012809224c0a0c4563686f526573706f6e7365120f0a076d657373616765180120012809122b0a05706172616d18022001280b321c2e677270632e74657374696e672e526573706f6e7365506172616d734203f80101620670726f746f33" ), true); static::$is_initialized = true; diff --git a/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/EmptyService.php b/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/EmptyService.php index d0a2f5473d6..3451b486aeb 100644 --- a/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/EmptyService.php +++ b/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/EmptyService.php @@ -15,9 +15,7 @@ class EmptyService return; } $pool->internalAddGeneratedFile(hex2bin( - "0a520a2a7372632f70726f746f2f677270632f74657374696e672f656d70" . - "74795f736572766963652e70726f746f120c677270632e74657374696e67" . - "320e0a0c456d70747953657276696365620670726f746f33" + "0a520a2a7372632f70726f746f2f677270632f74657374696e672f656d7074795f736572766963652e70726f746f120c677270632e74657374696e67320e0a0c456d70747953657276696365620670726f746f33" ), true); static::$is_initialized = true; diff --git a/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/Messages.php b/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/Messages.php index 72c17046a24..91a9c7bfcf1 100644 --- a/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/Messages.php +++ b/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/Messages.php @@ -15,69 +15,7 @@ class Messages return; } $pool->internalAddGeneratedFile(hex2bin( - "0ad70e0a257372632f70726f746f2f677270632f74657374696e672f6d65" . - "7373616765732e70726f746f120c677270632e74657374696e67221a0a09" . - "426f6f6c56616c7565120d0a0576616c756518012001280822400a075061" . - "796c6f616412270a047479706518012001280e32192e677270632e746573" . - "74696e672e5061796c6f616454797065120c0a04626f647918022001280c" . - "222b0a0a4563686f537461747573120c0a04636f6465180120012805120f" . - "0a076d6573736167651802200128092286030a0d53696d706c6552657175" . - "65737412300a0d726573706f6e73655f7479706518012001280e32192e67" . - "7270632e74657374696e672e5061796c6f61645479706512150a0d726573" . - "706f6e73655f73697a6518022001280512260a077061796c6f6164180320" . - "01280b32152e677270632e74657374696e672e5061796c6f616412150a0d" . - "66696c6c5f757365726e616d6518042001280812180a1066696c6c5f6f61" . - "7574685f73636f706518052001280812340a13726573706f6e73655f636f" . - "6d7072657373656418062001280b32172e677270632e74657374696e672e" . - "426f6f6c56616c756512310a0f726573706f6e73655f7374617475731807" . - "2001280b32182e677270632e74657374696e672e4563686f537461747573" . - "12320a116578706563745f636f6d7072657373656418082001280b32172e" . - "677270632e74657374696e672e426f6f6c56616c756512160a0e66696c6c" . - "5f7365727665725f6964180920012808121e0a1666696c6c5f677270636c" . - "625f726f7574655f74797065180a2001280822be010a0e53696d706c6552" . - "6573706f6e736512260a077061796c6f616418012001280b32152e677270" . - "632e74657374696e672e5061796c6f616412100a08757365726e616d6518" . - "022001280912130a0b6f617574685f73636f706518032001280912110a09" . - "7365727665725f696418042001280912380a11677270636c625f726f7574" . - "655f7479706518052001280e321d2e677270632e74657374696e672e4772" . - "70636c62526f7574655479706512100a08686f73746e616d651806200128" . - "0922770a1953747265616d696e67496e70757443616c6c52657175657374" . - "12260a077061796c6f616418012001280b32152e677270632e7465737469" . - "6e672e5061796c6f616412320a116578706563745f636f6d707265737365" . - "6418022001280b32172e677270632e74657374696e672e426f6f6c56616c" . - "7565223d0a1a53747265616d696e67496e70757443616c6c526573706f6e" . - "7365121f0a17616767726567617465645f7061796c6f61645f73697a6518" . - "012001280522640a12526573706f6e7365506172616d6574657273120c0a" . - "0473697a6518012001280512130a0b696e74657276616c5f757318022001" . - "2805122b0a0a636f6d7072657373656418032001280b32172e677270632e" . - "74657374696e672e426f6f6c56616c756522e8010a1a53747265616d696e" . - "674f757470757443616c6c5265717565737412300a0d726573706f6e7365" . - "5f7479706518012001280e32192e677270632e74657374696e672e506179" . - "6c6f616454797065123d0a13726573706f6e73655f706172616d65746572" . - "7318022003280b32202e677270632e74657374696e672e526573706f6e73" . - "65506172616d657465727312260a077061796c6f616418032001280b3215" . - "2e677270632e74657374696e672e5061796c6f616412310a0f726573706f" . - "6e73655f73746174757318072001280b32182e677270632e74657374696e" . - "672e4563686f53746174757322450a1b53747265616d696e674f75747075" . - "7443616c6c526573706f6e736512260a077061796c6f616418012001280b" . - "32152e677270632e74657374696e672e5061796c6f616422330a0f526563" . - "6f6e6e656374506172616d7312200a186d61785f7265636f6e6e6563745f" . - "6261636b6f66665f6d7318012001280522330a0d5265636f6e6e65637449" . - "6e666f120e0a0670617373656418012001280812120a0a6261636b6f6666" . - "5f6d7318022003280522410a184c6f616442616c616e6365725374617473" . - "5265717565737412100a086e756d5f7270637318012001280512130a0b74" . - "696d656f75745f73656318022001280522b3010a194c6f616442616c616e" . - "6365725374617473526573706f6e7365124d0a0c727063735f62795f7065" . - "657218012003280b32372e677270632e74657374696e672e4c6f61644261" . - "6c616e6365725374617473526573706f6e73652e52706373427950656572" . - "456e74727912140a0c6e756d5f6661696c757265731802200128051a310a" . - "0f52706373427950656572456e747279120b0a036b657918012001280912" . - "0d0a0576616c75651802200128053a0238012a1f0a0b5061796c6f616454" . - "79706512100a0c434f4d505245535341424c4510002a6f0a0f477270636c" . - "62526f75746554797065121d0a19475250434c425f524f5554455f545950" . - "455f554e4b4e4f574e1000121e0a1a475250434c425f524f5554455f5459" . - "50455f46414c4c4241434b1001121d0a19475250434c425f524f5554455f" . - "545950455f4241434b454e441002620670726f746f33" + "0ad70e0a257372632f70726f746f2f677270632f74657374696e672f6d657373616765732e70726f746f120c677270632e74657374696e67221a0a09426f6f6c56616c7565120d0a0576616c756518012001280822400a075061796c6f616412270a047479706518012001280e32192e677270632e74657374696e672e5061796c6f616454797065120c0a04626f647918022001280c222b0a0a4563686f537461747573120c0a04636f6465180120012805120f0a076d6573736167651802200128092286030a0d53696d706c655265717565737412300a0d726573706f6e73655f7479706518012001280e32192e677270632e74657374696e672e5061796c6f61645479706512150a0d726573706f6e73655f73697a6518022001280512260a077061796c6f616418032001280b32152e677270632e74657374696e672e5061796c6f616412150a0d66696c6c5f757365726e616d6518042001280812180a1066696c6c5f6f617574685f73636f706518052001280812340a13726573706f6e73655f636f6d7072657373656418062001280b32172e677270632e74657374696e672e426f6f6c56616c756512310a0f726573706f6e73655f73746174757318072001280b32182e677270632e74657374696e672e4563686f53746174757312320a116578706563745f636f6d7072657373656418082001280b32172e677270632e74657374696e672e426f6f6c56616c756512160a0e66696c6c5f7365727665725f6964180920012808121e0a1666696c6c5f677270636c625f726f7574655f74797065180a2001280822be010a0e53696d706c65526573706f6e736512260a077061796c6f616418012001280b32152e677270632e74657374696e672e5061796c6f616412100a08757365726e616d6518022001280912130a0b6f617574685f73636f706518032001280912110a097365727665725f696418042001280912380a11677270636c625f726f7574655f7479706518052001280e321d2e677270632e74657374696e672e477270636c62526f7574655479706512100a08686f73746e616d6518062001280922770a1953747265616d696e67496e70757443616c6c5265717565737412260a077061796c6f616418012001280b32152e677270632e74657374696e672e5061796c6f616412320a116578706563745f636f6d7072657373656418022001280b32172e677270632e74657374696e672e426f6f6c56616c7565223d0a1a53747265616d696e67496e70757443616c6c526573706f6e7365121f0a17616767726567617465645f7061796c6f61645f73697a6518012001280522640a12526573706f6e7365506172616d6574657273120c0a0473697a6518012001280512130a0b696e74657276616c5f7573180220012805122b0a0a636f6d7072657373656418032001280b32172e677270632e74657374696e672e426f6f6c56616c756522e8010a1a53747265616d696e674f757470757443616c6c5265717565737412300a0d726573706f6e73655f7479706518012001280e32192e677270632e74657374696e672e5061796c6f616454797065123d0a13726573706f6e73655f706172616d657465727318022003280b32202e677270632e74657374696e672e526573706f6e7365506172616d657465727312260a077061796c6f616418032001280b32152e677270632e74657374696e672e5061796c6f616412310a0f726573706f6e73655f73746174757318072001280b32182e677270632e74657374696e672e4563686f53746174757322450a1b53747265616d696e674f757470757443616c6c526573706f6e736512260a077061796c6f616418012001280b32152e677270632e74657374696e672e5061796c6f616422330a0f5265636f6e6e656374506172616d7312200a186d61785f7265636f6e6e6563745f6261636b6f66665f6d7318012001280522330a0d5265636f6e6e656374496e666f120e0a0670617373656418012001280812120a0a6261636b6f66665f6d7318022003280522410a184c6f616442616c616e63657253746174735265717565737412100a086e756d5f7270637318012001280512130a0b74696d656f75745f73656318022001280522b3010a194c6f616442616c616e6365725374617473526573706f6e7365124d0a0c727063735f62795f7065657218012003280b32372e677270632e74657374696e672e4c6f616442616c616e6365725374617473526573706f6e73652e52706373427950656572456e74727912140a0c6e756d5f6661696c757265731802200128051a310a0f52706373427950656572456e747279120b0a036b6579180120012809120d0a0576616c75651802200128053a0238012a1f0a0b5061796c6f61645479706512100a0c434f4d505245535341424c4510002a6f0a0f477270636c62526f75746554797065121d0a19475250434c425f524f5554455f545950455f554e4b4e4f574e1000121e0a1a475250434c425f524f5554455f545950455f46414c4c4241434b1001121d0a19475250434c425f524f5554455f545950455f4241434b454e441002620670726f746f33" ), true); static::$is_initialized = true; diff --git a/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/PBEmpty.php b/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/PBEmpty.php index 6118c2609c0..f103e2e3ed2 100644 --- a/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/PBEmpty.php +++ b/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/PBEmpty.php @@ -15,9 +15,7 @@ class PBEmpty return; } $pool->internalAddGeneratedFile(hex2bin( - "0a4a0a227372632f70726f746f2f677270632f74657374696e672f656d70" . - "74792e70726f746f120c677270632e74657374696e67220e0a0c456d7074" . - "794d657373616765620670726f746f33" + "0a4a0a227372632f70726f746f2f677270632f74657374696e672f656d7074792e70726f746f120c677270632e74657374696e67220e0a0c456d7074794d657373616765620670726f746f33" ), true); static::$is_initialized = true; diff --git a/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/Payloads.php b/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/Payloads.php index 31a51708e96..84ccb0bfef9 100644 --- a/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/Payloads.php +++ b/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/Payloads.php @@ -15,20 +15,7 @@ class Payloads return; } $pool->internalAddGeneratedFile(hex2bin( - "0a93030a257372632f70726f746f2f677270632f74657374696e672f7061" . - "796c6f6164732e70726f746f120c677270632e74657374696e6722370a10" . - "42797465427566666572506172616d7312100a087265715f73697a651801" . - "2001280512110a09726573705f73697a6518022001280522380a1153696d" . - "706c6550726f746f506172616d7312100a087265715f73697a6518012001" . - "280512110a09726573705f73697a6518022001280522140a12436f6d706c" . - "657850726f746f506172616d7322ca010a0d5061796c6f6164436f6e6669" . - "6712380a0e627974656275665f706172616d7318012001280b321e2e6772" . - "70632e74657374696e672e42797465427566666572506172616d73480012" . - "380a0d73696d706c655f706172616d7318022001280b321f2e677270632e" . - "74657374696e672e53696d706c6550726f746f506172616d734800123a0a" . - "0e636f6d706c65785f706172616d7318032001280b32202e677270632e74" . - "657374696e672e436f6d706c657850726f746f506172616d73480042090a" . - "077061796c6f6164620670726f746f33" + "0a93030a257372632f70726f746f2f677270632f74657374696e672f7061796c6f6164732e70726f746f120c677270632e74657374696e6722370a1042797465427566666572506172616d7312100a087265715f73697a6518012001280512110a09726573705f73697a6518022001280522380a1153696d706c6550726f746f506172616d7312100a087265715f73697a6518012001280512110a09726573705f73697a6518022001280522140a12436f6d706c657850726f746f506172616d7322ca010a0d5061796c6f6164436f6e66696712380a0e627974656275665f706172616d7318012001280b321e2e677270632e74657374696e672e42797465427566666572506172616d73480012380a0d73696d706c655f706172616d7318022001280b321f2e677270632e74657374696e672e53696d706c6550726f746f506172616d734800123a0a0e636f6d706c65785f706172616d7318032001280b32202e677270632e74657374696e672e436f6d706c657850726f746f506172616d73480042090a077061796c6f6164620670726f746f33" ), true); static::$is_initialized = true; diff --git a/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/ProxyService.php b/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/ProxyService.php index e8ed140b21b..ef7dae2bd99 100644 --- a/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/ProxyService.php +++ b/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/ProxyService.php @@ -17,18 +17,7 @@ class ProxyService \GPBMetadata\Src\Proto\Grpc\Testing\Control::initOnce(); \GPBMetadata\Src\Proto\Grpc\Testing\Stats::initOnce(); $pool->internalAddGeneratedFile(hex2bin( - "0ad6020a2a7372632f70726f746f2f677270632f74657374696e672f7072" . - "6f78792d736572766963652e70726f746f120c677270632e74657374696e" . - "671a227372632f70726f746f2f677270632f74657374696e672f73746174" . - "732e70726f746f221c0a0950726f787953746174120f0a076c6174656e63" . - "7918012001280132cf010a1250726f7879436c69656e7453657276696365" . - "123b0a09476574436f6e66696712122e677270632e74657374696e672e56" . - "6f69641a1a2e677270632e74657374696e672e436c69656e74436f6e6669" . - "67123b0a0a5265706f727454696d6512172e677270632e74657374696e67" . - "2e50726f7879537461741a122e677270632e74657374696e672e566f6964" . - "2801123f0a0a5265706f727448697374121b2e677270632e74657374696e" . - "672e486973746f6772616d446174611a122e677270632e74657374696e67" . - "2e566f69642801620670726f746f33" + "0ad6020a2a7372632f70726f746f2f677270632f74657374696e672f70726f78792d736572766963652e70726f746f120c677270632e74657374696e671a227372632f70726f746f2f677270632f74657374696e672f73746174732e70726f746f221c0a0950726f787953746174120f0a076c6174656e637918012001280132cf010a1250726f7879436c69656e7453657276696365123b0a09476574436f6e66696712122e677270632e74657374696e672e566f69641a1a2e677270632e74657374696e672e436c69656e74436f6e666967123b0a0a5265706f727454696d6512172e677270632e74657374696e672e50726f7879537461741a122e677270632e74657374696e672e566f69642801123f0a0a5265706f727448697374121b2e677270632e74657374696e672e486973746f6772616d446174611a122e677270632e74657374696e672e566f69642801620670726f746f33" ), true); static::$is_initialized = true; diff --git a/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/ReportQpsScenarioService.php b/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/ReportQpsScenarioService.php index 19edcc07ffa..f8de870356e 100644 --- a/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/ReportQpsScenarioService.php +++ b/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/ReportQpsScenarioService.php @@ -16,12 +16,7 @@ class ReportQpsScenarioService } \GPBMetadata\Src\Proto\Grpc\Testing\Control::initOnce(); $pool->internalAddGeneratedFile(hex2bin( - "0ab0010a387372632f70726f746f2f677270632f74657374696e672f7265" . - "706f72745f7170735f7363656e6172696f5f736572766963652e70726f74" . - "6f120c677270632e74657374696e67325e0a185265706f72745170735363" . - "656e6172696f5365727669636512420a0e5265706f72745363656e617269" . - "6f121c2e677270632e74657374696e672e5363656e6172696f526573756c" . - "741a122e677270632e74657374696e672e566f6964620670726f746f33" + "0ab0010a387372632f70726f746f2f677270632f74657374696e672f7265706f72745f7170735f7363656e6172696f5f736572766963652e70726f746f120c677270632e74657374696e67325e0a185265706f72745170735363656e6172696f5365727669636512420a0e5265706f72745363656e6172696f121c2e677270632e74657374696e672e5363656e6172696f526573756c741a122e677270632e74657374696e672e566f6964620670726f746f33" ), true); static::$is_initialized = true; diff --git a/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/Stats.php b/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/Stats.php index 186de704c77..8cce2f53673 100644 --- a/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/Stats.php +++ b/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/Stats.php @@ -16,31 +16,7 @@ class Stats } \GPBMetadata\Src\Proto\Grpc\Core\Stats::initOnce(); $pool->internalAddGeneratedFile(hex2bin( - "0ada050a227372632f70726f746f2f677270632f74657374696e672f7374" . - "6174732e70726f746f120c677270632e74657374696e6722b7010a0b5365" . - "72766572537461747312140a0c74696d655f656c61707365641801200128" . - "0112110a0974696d655f7573657218022001280112130a0b74696d655f73" . - "797374656d18032001280112160a0e746f74616c5f6370755f74696d6518" . - "042001280412150a0d69646c655f6370755f74696d651805200128041215" . - "0a0d63715f706f6c6c5f636f756e7418062001280412240a0a636f72655f" . - "737461747318072001280b32102e677270632e636f72652e537461747322" . - "3b0a0f486973746f6772616d506172616d7312120a0a7265736f6c757469" . - "6f6e18012001280112140a0c6d61785f706f737369626c65180220012801" . - "22770a0d486973746f6772616d44617461120e0a066275636b6574180120" . - "03280d12100a086d696e5f7365656e18022001280112100a086d61785f73" . - "65656e180320012801120b0a0373756d18042001280112160a0e73756d5f" . - "6f665f73717561726573180520012801120d0a05636f756e741806200128" . - "0122380a1252657175657374526573756c74436f756e7412130a0b737461" . - "7475735f636f6465180120012805120d0a05636f756e7418022001280322" . - "f3010a0b436c69656e745374617473122e0a096c6174656e636965731801" . - "2001280b321b2e677270632e74657374696e672e486973746f6772616d44" . - "61746112140a0c74696d655f656c617073656418022001280112110a0974" . - "696d655f7573657218032001280112130a0b74696d655f73797374656d18" . - "042001280112390a0f726571756573745f726573756c747318052003280b" . - "32202e677270632e74657374696e672e52657175657374526573756c7443" . - "6f756e7412150a0d63715f706f6c6c5f636f756e7418062001280412240a" . - "0a636f72655f737461747318072001280b32102e677270632e636f72652e" . - "5374617473620670726f746f33" + "0ada050a227372632f70726f746f2f677270632f74657374696e672f73746174732e70726f746f120c677270632e74657374696e6722b7010a0b536572766572537461747312140a0c74696d655f656c617073656418012001280112110a0974696d655f7573657218022001280112130a0b74696d655f73797374656d18032001280112160a0e746f74616c5f6370755f74696d6518042001280412150a0d69646c655f6370755f74696d6518052001280412150a0d63715f706f6c6c5f636f756e7418062001280412240a0a636f72655f737461747318072001280b32102e677270632e636f72652e5374617473223b0a0f486973746f6772616d506172616d7312120a0a7265736f6c7574696f6e18012001280112140a0c6d61785f706f737369626c6518022001280122770a0d486973746f6772616d44617461120e0a066275636b657418012003280d12100a086d696e5f7365656e18022001280112100a086d61785f7365656e180320012801120b0a0373756d18042001280112160a0e73756d5f6f665f73717561726573180520012801120d0a05636f756e7418062001280122380a1252657175657374526573756c74436f756e7412130a0b7374617475735f636f6465180120012805120d0a05636f756e7418022001280322f3010a0b436c69656e745374617473122e0a096c6174656e6369657318012001280b321b2e677270632e74657374696e672e486973746f6772616d4461746112140a0c74696d655f656c617073656418022001280112110a0974696d655f7573657218032001280112130a0b74696d655f73797374656d18042001280112390a0f726571756573745f726573756c747318052003280b32202e677270632e74657374696e672e52657175657374526573756c74436f756e7412150a0d63715f706f6c6c5f636f756e7418062001280412240a0a636f72655f737461747318072001280b32102e677270632e636f72652e5374617473620670726f746f33" ), true); static::$is_initialized = true; diff --git a/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/Test.php b/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/Test.php index c3063340d00..2ae2dadabdc 100644 --- a/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/Test.php +++ b/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/Test.php @@ -17,47 +17,7 @@ class Test \GPBMetadata\Src\Proto\Grpc\Testing\PBEmpty::initOnce(); \GPBMetadata\Src\Proto\Grpc\Testing\Messages::initOnce(); $pool->internalAddGeneratedFile(hex2bin( - "0aca090a217372632f70726f746f2f677270632f74657374696e672f7465" . - "73742e70726f746f120c677270632e74657374696e671a257372632f7072" . - "6f746f2f677270632f74657374696e672f6d657373616765732e70726f74" . - "6f32e7050a0b546573745365727669636512430a09456d70747943616c6c" . - "121a2e677270632e74657374696e672e456d7074794d6573736167651a1a" . - "2e677270632e74657374696e672e456d7074794d65737361676512460a09" . - "556e61727943616c6c121b2e677270632e74657374696e672e53696d706c" . - "65526571756573741a1c2e677270632e74657374696e672e53696d706c65" . - "526573706f6e7365124f0a12436163686561626c65556e61727943616c6c" . - "121b2e677270632e74657374696e672e53696d706c65526571756573741a" . - "1c2e677270632e74657374696e672e53696d706c65526573706f6e736512" . - "6c0a1353747265616d696e674f757470757443616c6c12282e677270632e" . - "74657374696e672e53747265616d696e674f757470757443616c6c526571" . - "756573741a292e677270632e74657374696e672e53747265616d696e674f" . - "757470757443616c6c526573706f6e7365300112690a1253747265616d69" . - "6e67496e70757443616c6c12272e677270632e74657374696e672e537472" . - "65616d696e67496e70757443616c6c526571756573741a282e677270632e" . - "74657374696e672e53747265616d696e67496e70757443616c6c52657370" . - "6f6e7365280112690a0e46756c6c4475706c657843616c6c12282e677270" . - "632e74657374696e672e53747265616d696e674f757470757443616c6c52" . - "6571756573741a292e677270632e74657374696e672e53747265616d696e" . - "674f757470757443616c6c526573706f6e73652801300112690a0e48616c" . - "664475706c657843616c6c12282e677270632e74657374696e672e537472" . - "65616d696e674f757470757443616c6c526571756573741a292e67727063" . - "2e74657374696e672e53747265616d696e674f757470757443616c6c5265" . - "73706f6e736528013001124b0a11556e696d706c656d656e74656443616c" . - "6c121a2e677270632e74657374696e672e456d7074794d6573736167651a" . - "1a2e677270632e74657374696e672e456d7074794d65737361676532630a" . - "14556e696d706c656d656e74656453657276696365124b0a11556e696d70" . - "6c656d656e74656443616c6c121a2e677270632e74657374696e672e456d" . - "7074794d6573736167651a1a2e677270632e74657374696e672e456d7074" . - "794d6573736167653297010a105265636f6e6e6563745365727669636512" . - "420a055374617274121d2e677270632e74657374696e672e5265636f6e6e" . - "656374506172616d731a1a2e677270632e74657374696e672e456d707479" . - "4d657373616765123f0a0453746f70121a2e677270632e74657374696e67" . - "2e456d7074794d6573736167651a1b2e677270632e74657374696e672e52" . - "65636f6e6e656374496e666f327f0a184c6f616442616c616e6365725374" . - "6174735365727669636512630a0e476574436c69656e7453746174731226" . - "2e677270632e74657374696e672e4c6f616442616c616e63657253746174" . - "73526571756573741a272e677270632e74657374696e672e4c6f61644261" . - "6c616e6365725374617473526573706f6e73652200620670726f746f33" + "0aca090a217372632f70726f746f2f677270632f74657374696e672f746573742e70726f746f120c677270632e74657374696e671a257372632f70726f746f2f677270632f74657374696e672f6d657373616765732e70726f746f32e7050a0b546573745365727669636512430a09456d70747943616c6c121a2e677270632e74657374696e672e456d7074794d6573736167651a1a2e677270632e74657374696e672e456d7074794d65737361676512460a09556e61727943616c6c121b2e677270632e74657374696e672e53696d706c65526571756573741a1c2e677270632e74657374696e672e53696d706c65526573706f6e7365124f0a12436163686561626c65556e61727943616c6c121b2e677270632e74657374696e672e53696d706c65526571756573741a1c2e677270632e74657374696e672e53696d706c65526573706f6e7365126c0a1353747265616d696e674f757470757443616c6c12282e677270632e74657374696e672e53747265616d696e674f757470757443616c6c526571756573741a292e677270632e74657374696e672e53747265616d696e674f757470757443616c6c526573706f6e7365300112690a1253747265616d696e67496e70757443616c6c12272e677270632e74657374696e672e53747265616d696e67496e70757443616c6c526571756573741a282e677270632e74657374696e672e53747265616d696e67496e70757443616c6c526573706f6e7365280112690a0e46756c6c4475706c657843616c6c12282e677270632e74657374696e672e53747265616d696e674f757470757443616c6c526571756573741a292e677270632e74657374696e672e53747265616d696e674f757470757443616c6c526573706f6e73652801300112690a0e48616c664475706c657843616c6c12282e677270632e74657374696e672e53747265616d696e674f757470757443616c6c526571756573741a292e677270632e74657374696e672e53747265616d696e674f757470757443616c6c526573706f6e736528013001124b0a11556e696d706c656d656e74656443616c6c121a2e677270632e74657374696e672e456d7074794d6573736167651a1a2e677270632e74657374696e672e456d7074794d65737361676532630a14556e696d706c656d656e74656453657276696365124b0a11556e696d706c656d656e74656443616c6c121a2e677270632e74657374696e672e456d7074794d6573736167651a1a2e677270632e74657374696e672e456d7074794d6573736167653297010a105265636f6e6e6563745365727669636512420a055374617274121d2e677270632e74657374696e672e5265636f6e6e656374506172616d731a1a2e677270632e74657374696e672e456d7074794d657373616765123f0a0453746f70121a2e677270632e74657374696e672e456d7074794d6573736167651a1b2e677270632e74657374696e672e5265636f6e6e656374496e666f327f0a184c6f616442616c616e63657253746174735365727669636512630a0e476574436c69656e74537461747312262e677270632e74657374696e672e4c6f616442616c616e6365725374617473526571756573741a272e677270632e74657374696e672e4c6f616442616c616e6365725374617473526573706f6e73652200620670726f746f33" ), true); static::$is_initialized = true; diff --git a/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/WorkerService.php b/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/WorkerService.php index 3f67c9918f8..e6b7f873e91 100644 --- a/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/WorkerService.php +++ b/src/php/tests/qps/generated_code/GPBMetadata/Src/Proto/Grpc/Testing/WorkerService.php @@ -16,18 +16,7 @@ class WorkerService } \GPBMetadata\Src\Proto\Grpc\Testing\Control::initOnce(); $pool->internalAddGeneratedFile(hex2bin( - "0add020a2b7372632f70726f746f2f677270632f74657374696e672f776f" . - "726b65725f736572766963652e70726f746f120c677270632e7465737469" . - "6e673297020a0d576f726b65725365727669636512450a0952756e536572" . - "76657212182e677270632e74657374696e672e536572766572417267731a" . - "1a2e677270632e74657374696e672e536572766572537461747573280130" . - "0112450a0952756e436c69656e7412182e677270632e74657374696e672e" . - "436c69656e74417267731a1a2e677270632e74657374696e672e436c6965" . - "6e745374617475732801300112420a09436f7265436f756e7412192e6772" . - "70632e74657374696e672e436f7265526571756573741a1a2e677270632e" . - "74657374696e672e436f7265526573706f6e736512340a0a51756974576f" . - "726b657212122e677270632e74657374696e672e566f69641a122e677270" . - "632e74657374696e672e566f6964620670726f746f33" + "0add020a2b7372632f70726f746f2f677270632f74657374696e672f776f726b65725f736572766963652e70726f746f120c677270632e74657374696e673297020a0d576f726b65725365727669636512450a0952756e53657276657212182e677270632e74657374696e672e536572766572417267731a1a2e677270632e74657374696e672e5365727665725374617475732801300112450a0952756e436c69656e7412182e677270632e74657374696e672e436c69656e74417267731a1a2e677270632e74657374696e672e436c69656e745374617475732801300112420a09436f7265436f756e7412192e677270632e74657374696e672e436f7265526571756573741a1a2e677270632e74657374696e672e436f7265526573706f6e736512340a0a51756974576f726b657212122e677270632e74657374696e672e566f69641a122e677270632e74657374696e672e566f6964620670726f746f33" ), true); static::$is_initialized = true; diff --git a/src/php/tests/qps/generated_code/Grpc/Testing/BenchmarkServiceClient.php b/src/php/tests/qps/generated_code/Grpc/Testing/BenchmarkServiceClient.php index fa3e1479091..97819f392a6 100644 --- a/src/php/tests/qps/generated_code/Grpc/Testing/BenchmarkServiceClient.php +++ b/src/php/tests/qps/generated_code/Grpc/Testing/BenchmarkServiceClient.php @@ -39,6 +39,7 @@ class BenchmarkServiceClient extends \Grpc\BaseStub { * @param \Grpc\Testing\SimpleRequest $argument input argument * @param array $metadata metadata * @param array $options call options + * @return \Grpc\Testing\SimpleResponse */ public function UnaryCall(\Grpc\Testing\SimpleRequest $argument, $metadata = [], $options = []) { @@ -54,6 +55,7 @@ class BenchmarkServiceClient extends \Grpc\BaseStub { * The server returns the client payload as-is on each response * @param array $metadata metadata * @param array $options call options + * @return \Grpc\Testing\SimpleResponse */ public function StreamingCall($metadata = [], $options = []) { return $this->_bidiRequest('/grpc.testing.BenchmarkService/StreamingCall', @@ -66,6 +68,7 @@ class BenchmarkServiceClient extends \Grpc\BaseStub { * The server returns the client payload as-is once the client does WritesDone * @param array $metadata metadata * @param array $options call options + * @return \Grpc\Testing\SimpleResponse */ public function StreamingFromClient($metadata = [], $options = []) { return $this->_clientStreamRequest('/grpc.testing.BenchmarkService/StreamingFromClient', @@ -79,6 +82,7 @@ class BenchmarkServiceClient extends \Grpc\BaseStub { * @param \Grpc\Testing\SimpleRequest $argument input argument * @param array $metadata metadata * @param array $options call options + * @return \Grpc\Testing\SimpleResponse */ public function StreamingFromServer(\Grpc\Testing\SimpleRequest $argument, $metadata = [], $options = []) { @@ -93,6 +97,7 @@ class BenchmarkServiceClient extends \Grpc\BaseStub { * Both sides send the content of their own choice to the other * @param array $metadata metadata * @param array $options call options + * @return \Grpc\Testing\SimpleResponse */ public function StreamingBothWays($metadata = [], $options = []) { return $this->_bidiRequest('/grpc.testing.BenchmarkService/StreamingBothWays', diff --git a/src/php/tests/qps/generated_code/Grpc/Testing/LoadBalancerStatsServiceClient.php b/src/php/tests/qps/generated_code/Grpc/Testing/LoadBalancerStatsServiceClient.php index 129776d8a30..cfbd0fd0a59 100644 --- a/src/php/tests/qps/generated_code/Grpc/Testing/LoadBalancerStatsServiceClient.php +++ b/src/php/tests/qps/generated_code/Grpc/Testing/LoadBalancerStatsServiceClient.php @@ -40,6 +40,7 @@ class LoadBalancerStatsServiceClient extends \Grpc\BaseStub { * @param \Grpc\Testing\LoadBalancerStatsRequest $argument input argument * @param array $metadata metadata * @param array $options call options + * @return \Grpc\Testing\LoadBalancerStatsResponse */ public function GetClientStats(\Grpc\Testing\LoadBalancerStatsRequest $argument, $metadata = [], $options = []) { diff --git a/src/php/tests/qps/generated_code/Grpc/Testing/ProxyClientServiceClient.php b/src/php/tests/qps/generated_code/Grpc/Testing/ProxyClientServiceClient.php index c0e304929d5..5b476ff4436 100644 --- a/src/php/tests/qps/generated_code/Grpc/Testing/ProxyClientServiceClient.php +++ b/src/php/tests/qps/generated_code/Grpc/Testing/ProxyClientServiceClient.php @@ -35,6 +35,7 @@ class ProxyClientServiceClient extends \Grpc\BaseStub { * @param \Grpc\Testing\PBVoid $argument input argument * @param array $metadata metadata * @param array $options call options + * @return \Grpc\Testing\ClientConfig */ public function GetConfig(\Grpc\Testing\PBVoid $argument, $metadata = [], $options = []) { @@ -47,6 +48,7 @@ class ProxyClientServiceClient extends \Grpc\BaseStub { /** * @param array $metadata metadata * @param array $options call options + * @return \Grpc\Testing\PBVoid */ public function ReportTime($metadata = [], $options = []) { return $this->_clientStreamRequest('/grpc.testing.ProxyClientService/ReportTime', @@ -57,6 +59,7 @@ class ProxyClientServiceClient extends \Grpc\BaseStub { /** * @param array $metadata metadata * @param array $options call options + * @return \Grpc\Testing\PBVoid */ public function ReportHist($metadata = [], $options = []) { return $this->_clientStreamRequest('/grpc.testing.ProxyClientService/ReportHist', diff --git a/src/php/tests/qps/generated_code/Grpc/Testing/ReconnectServiceClient.php b/src/php/tests/qps/generated_code/Grpc/Testing/ReconnectServiceClient.php index 50beca20e00..695d83a6871 100644 --- a/src/php/tests/qps/generated_code/Grpc/Testing/ReconnectServiceClient.php +++ b/src/php/tests/qps/generated_code/Grpc/Testing/ReconnectServiceClient.php @@ -39,6 +39,7 @@ class ReconnectServiceClient extends \Grpc\BaseStub { * @param \Grpc\Testing\ReconnectParams $argument input argument * @param array $metadata metadata * @param array $options call options + * @return \Grpc\Testing\EmptyMessage */ public function Start(\Grpc\Testing\ReconnectParams $argument, $metadata = [], $options = []) { @@ -52,6 +53,7 @@ class ReconnectServiceClient extends \Grpc\BaseStub { * @param \Grpc\Testing\EmptyMessage $argument input argument * @param array $metadata metadata * @param array $options call options + * @return \Grpc\Testing\ReconnectInfo */ public function Stop(\Grpc\Testing\EmptyMessage $argument, $metadata = [], $options = []) { diff --git a/src/php/tests/qps/generated_code/Grpc/Testing/ReportQpsScenarioServiceClient.php b/src/php/tests/qps/generated_code/Grpc/Testing/ReportQpsScenarioServiceClient.php index 3abb5abe6d0..0238798f624 100644 --- a/src/php/tests/qps/generated_code/Grpc/Testing/ReportQpsScenarioServiceClient.php +++ b/src/php/tests/qps/generated_code/Grpc/Testing/ReportQpsScenarioServiceClient.php @@ -38,6 +38,7 @@ class ReportQpsScenarioServiceClient extends \Grpc\BaseStub { * @param \Grpc\Testing\ScenarioResult $argument input argument * @param array $metadata metadata * @param array $options call options + * @return \Grpc\Testing\PBVoid */ public function ReportScenario(\Grpc\Testing\ScenarioResult $argument, $metadata = [], $options = []) { diff --git a/src/php/tests/qps/generated_code/Grpc/Testing/ServiceAClient.php b/src/php/tests/qps/generated_code/Grpc/Testing/ServiceAClient.php index df469cbea34..d9469631e7f 100644 --- a/src/php/tests/qps/generated_code/Grpc/Testing/ServiceAClient.php +++ b/src/php/tests/qps/generated_code/Grpc/Testing/ServiceAClient.php @@ -46,6 +46,7 @@ class ServiceAClient extends \Grpc\BaseStub { * @param \Grpc\Testing\Request $argument input argument * @param array $metadata metadata * @param array $options call options + * @return \Grpc\Testing\Response */ public function MethodA1(\Grpc\Testing\Request $argument, $metadata = [], $options = []) { @@ -62,6 +63,7 @@ class ServiceAClient extends \Grpc\BaseStub { * Method A2 leading comment 2 * @param array $metadata metadata * @param array $options call options + * @return \Grpc\Testing\Response */ public function MethodA2($metadata = [], $options = []) { return $this->_clientStreamRequest('/grpc.testing.ServiceA/MethodA2', @@ -74,6 +76,7 @@ class ServiceAClient extends \Grpc\BaseStub { * @param \Grpc\Testing\Request $argument input argument * @param array $metadata metadata * @param array $options call options + * @return \Grpc\Testing\Response */ public function MethodA3(\Grpc\Testing\Request $argument, $metadata = [], $options = []) { @@ -87,6 +90,7 @@ class ServiceAClient extends \Grpc\BaseStub { * Method A4 leading comment 1 * @param array $metadata metadata * @param array $options call options + * @return \Grpc\Testing\Response */ public function MethodA4($metadata = [], $options = []) { return $this->_bidiRequest('/grpc.testing.ServiceA/MethodA4', diff --git a/src/php/tests/qps/generated_code/Grpc/Testing/ServiceBClient.php b/src/php/tests/qps/generated_code/Grpc/Testing/ServiceBClient.php index 54acf6364f9..5090e0aa9a3 100644 --- a/src/php/tests/qps/generated_code/Grpc/Testing/ServiceBClient.php +++ b/src/php/tests/qps/generated_code/Grpc/Testing/ServiceBClient.php @@ -42,6 +42,7 @@ class ServiceBClient extends \Grpc\BaseStub { * @param \Grpc\Testing\Request $argument input argument * @param array $metadata metadata * @param array $options call options + * @return \Grpc\Testing\Response */ public function MethodB1(\Grpc\Testing\Request $argument, $metadata = [], $options = []) { diff --git a/src/php/tests/qps/generated_code/Grpc/Testing/TestServiceClient.php b/src/php/tests/qps/generated_code/Grpc/Testing/TestServiceClient.php index e6fef125b8b..770c6090034 100644 --- a/src/php/tests/qps/generated_code/Grpc/Testing/TestServiceClient.php +++ b/src/php/tests/qps/generated_code/Grpc/Testing/TestServiceClient.php @@ -41,6 +41,7 @@ class TestServiceClient extends \Grpc\BaseStub { * @param \Grpc\Testing\EmptyMessage $argument input argument * @param array $metadata metadata * @param array $options call options + * @return \Grpc\Testing\EmptyMessage */ public function EmptyCall(\Grpc\Testing\EmptyMessage $argument, $metadata = [], $options = []) { @@ -55,6 +56,7 @@ class TestServiceClient extends \Grpc\BaseStub { * @param \Grpc\Testing\SimpleRequest $argument input argument * @param array $metadata metadata * @param array $options call options + * @return \Grpc\Testing\SimpleResponse */ public function UnaryCall(\Grpc\Testing\SimpleRequest $argument, $metadata = [], $options = []) { @@ -71,6 +73,7 @@ class TestServiceClient extends \Grpc\BaseStub { * @param \Grpc\Testing\SimpleRequest $argument input argument * @param array $metadata metadata * @param array $options call options + * @return \Grpc\Testing\SimpleResponse */ public function CacheableUnaryCall(\Grpc\Testing\SimpleRequest $argument, $metadata = [], $options = []) { @@ -86,6 +89,7 @@ class TestServiceClient extends \Grpc\BaseStub { * @param \Grpc\Testing\StreamingOutputCallRequest $argument input argument * @param array $metadata metadata * @param array $options call options + * @return \Grpc\Testing\StreamingOutputCallResponse */ public function StreamingOutputCall(\Grpc\Testing\StreamingOutputCallRequest $argument, $metadata = [], $options = []) { @@ -100,6 +104,7 @@ class TestServiceClient extends \Grpc\BaseStub { * The server returns the aggregated size of client payload as the result. * @param array $metadata metadata * @param array $options call options + * @return \Grpc\Testing\StreamingInputCallResponse */ public function StreamingInputCall($metadata = [], $options = []) { return $this->_clientStreamRequest('/grpc.testing.TestService/StreamingInputCall', @@ -113,6 +118,7 @@ class TestServiceClient extends \Grpc\BaseStub { * demonstrates the idea of full duplexing. * @param array $metadata metadata * @param array $options call options + * @return \Grpc\Testing\StreamingOutputCallResponse */ public function FullDuplexCall($metadata = [], $options = []) { return $this->_bidiRequest('/grpc.testing.TestService/FullDuplexCall', @@ -127,6 +133,7 @@ class TestServiceClient extends \Grpc\BaseStub { * first request. * @param array $metadata metadata * @param array $options call options + * @return \Grpc\Testing\StreamingOutputCallResponse */ public function HalfDuplexCall($metadata = [], $options = []) { return $this->_bidiRequest('/grpc.testing.TestService/HalfDuplexCall', @@ -140,6 +147,7 @@ class TestServiceClient extends \Grpc\BaseStub { * @param \Grpc\Testing\EmptyMessage $argument input argument * @param array $metadata metadata * @param array $options call options + * @return \Grpc\Testing\EmptyMessage */ public function UnimplementedCall(\Grpc\Testing\EmptyMessage $argument, $metadata = [], $options = []) { diff --git a/src/php/tests/qps/generated_code/Grpc/Testing/UnimplementedServiceClient.php b/src/php/tests/qps/generated_code/Grpc/Testing/UnimplementedServiceClient.php index 2c1d921bfcc..9988a6c4d06 100644 --- a/src/php/tests/qps/generated_code/Grpc/Testing/UnimplementedServiceClient.php +++ b/src/php/tests/qps/generated_code/Grpc/Testing/UnimplementedServiceClient.php @@ -41,6 +41,7 @@ class UnimplementedServiceClient extends \Grpc\BaseStub { * @param \Grpc\Testing\EmptyMessage $argument input argument * @param array $metadata metadata * @param array $options call options + * @return \Grpc\Testing\EmptyMessage */ public function UnimplementedCall(\Grpc\Testing\EmptyMessage $argument, $metadata = [], $options = []) { diff --git a/src/php/tests/qps/generated_code/Grpc/Testing/WorkerServiceClient.php b/src/php/tests/qps/generated_code/Grpc/Testing/WorkerServiceClient.php index 366e36529e9..a2f28cd883d 100644 --- a/src/php/tests/qps/generated_code/Grpc/Testing/WorkerServiceClient.php +++ b/src/php/tests/qps/generated_code/Grpc/Testing/WorkerServiceClient.php @@ -42,6 +42,7 @@ class WorkerServiceClient extends \Grpc\BaseStub { * this RPC. * @param array $metadata metadata * @param array $options call options + * @return \Grpc\Testing\ServerStatus */ public function RunServer($metadata = [], $options = []) { return $this->_bidiRequest('/grpc.testing.WorkerService/RunServer', @@ -58,6 +59,7 @@ class WorkerServiceClient extends \Grpc\BaseStub { * this RPC. * @param array $metadata metadata * @param array $options call options + * @return \Grpc\Testing\ClientStatus */ public function RunClient($metadata = [], $options = []) { return $this->_bidiRequest('/grpc.testing.WorkerService/RunClient', @@ -70,6 +72,7 @@ class WorkerServiceClient extends \Grpc\BaseStub { * @param \Grpc\Testing\CoreRequest $argument input argument * @param array $metadata metadata * @param array $options call options + * @return \Grpc\Testing\CoreResponse */ public function CoreCount(\Grpc\Testing\CoreRequest $argument, $metadata = [], $options = []) { @@ -84,6 +87,7 @@ class WorkerServiceClient extends \Grpc\BaseStub { * @param \Grpc\Testing\PBVoid $argument input argument * @param array $metadata metadata * @param array $options call options + * @return \Grpc\Testing\PBVoid */ public function QuitWorker(\Grpc\Testing\PBVoid $argument, $metadata = [], $options = []) { From 93e227c2f4d72d6fcb21d1b2cf893c05a7cfa2bd Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Fri, 24 Apr 2020 12:53:36 -0400 Subject: [PATCH 616/758] run tools/distrib/python/make_grpcio_tools.py --- tools/distrib/python/grpcio_tools/protoc_lib_deps.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/distrib/python/grpcio_tools/protoc_lib_deps.py b/tools/distrib/python/grpcio_tools/protoc_lib_deps.py index a557be55f7b..e1dc4fb862e 100644 --- a/tools/distrib/python/grpcio_tools/protoc_lib_deps.py +++ b/tools/distrib/python/grpcio_tools/protoc_lib_deps.py @@ -20,4 +20,4 @@ PROTO_FILES=['google/protobuf/wrappers.proto', 'google/protobuf/type.proto', 'go CC_INCLUDE='third_party/protobuf/src' PROTO_INCLUDE='third_party/protobuf/src' -PROTOBUF_SUBMODULE_VERSION="fe1790ca0df67173702f70d5646b82f48f412b99" +PROTOBUF_SUBMODULE_VERSION="d0bfd5221182da1a7cc280f3337b5e41a89539cf" From d3abb4dce5da02f4e82174016652e78d459738b4 Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Fri, 24 Apr 2020 12:58:19 -0400 Subject: [PATCH 617/758] upgrade Google.Protobuf nugets to 3.11.4 --- src/csharp/build/dependencies.props | 2 +- templates/src/csharp/build/dependencies.props.template | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/csharp/build/dependencies.props b/src/csharp/build/dependencies.props index c9305b34974..355cfcf7b40 100644 --- a/src/csharp/build/dependencies.props +++ b/src/csharp/build/dependencies.props @@ -2,6 +2,6 @@ 2.29.0-dev - 3.11.2 + 3.11.4 diff --git a/templates/src/csharp/build/dependencies.props.template b/templates/src/csharp/build/dependencies.props.template index d3edb751c83..388a5c2b8ab 100755 --- a/templates/src/csharp/build/dependencies.props.template +++ b/templates/src/csharp/build/dependencies.props.template @@ -4,6 +4,6 @@ ${settings.csharp_version} - 3.11.2 + 3.11.4 From 7f2af36ddc5e6f4f62d58df051dc08b4f665b30a Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Fri, 24 Apr 2020 13:02:19 -0400 Subject: [PATCH 618/758] update ObjC podspecs to protobuf 3.11.4 --- src/cpp/Protobuf-C++.podspec | 2 +- src/objective-c/!ProtoCompiler-gRPCCppPlugin.podspec | 2 +- src/objective-c/!ProtoCompiler-gRPCPlugin.podspec | 2 +- src/objective-c/!ProtoCompiler.podspec | 2 +- .../objective-c/!ProtoCompiler-gRPCCppPlugin.podspec.template | 2 +- .../src/objective-c/!ProtoCompiler-gRPCPlugin.podspec.template | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/cpp/Protobuf-C++.podspec b/src/cpp/Protobuf-C++.podspec index 1359d0294db..dcb9f4d705d 100644 --- a/src/cpp/Protobuf-C++.podspec +++ b/src/cpp/Protobuf-C++.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'Protobuf-C++' - s.version = '3.11.2' + s.version = '3.11.4' s.summary = 'Protocol Buffers v3 runtime library for C++.' s.homepage = 'https://github.com/google/protobuf' s.license = '3-Clause BSD License' diff --git a/src/objective-c/!ProtoCompiler-gRPCCppPlugin.podspec b/src/objective-c/!ProtoCompiler-gRPCCppPlugin.podspec index 763d29b9dee..1385b2b396c 100644 --- a/src/objective-c/!ProtoCompiler-gRPCCppPlugin.podspec +++ b/src/objective-c/!ProtoCompiler-gRPCCppPlugin.podspec @@ -100,7 +100,7 @@ Pod::Spec.new do |s| s.preserve_paths = plugin # Restrict the protoc version to the one supported by this plugin. - s.dependency '!ProtoCompiler', '3.11.2' + s.dependency '!ProtoCompiler', '3.11.4' # For the Protobuf dependency not to complain: s.ios.deployment_target = '7.0' s.osx.deployment_target = '10.9' diff --git a/src/objective-c/!ProtoCompiler-gRPCPlugin.podspec b/src/objective-c/!ProtoCompiler-gRPCPlugin.podspec index fed939b2fde..9ab5bba68e3 100644 --- a/src/objective-c/!ProtoCompiler-gRPCPlugin.podspec +++ b/src/objective-c/!ProtoCompiler-gRPCPlugin.podspec @@ -102,7 +102,7 @@ Pod::Spec.new do |s| s.preserve_paths = plugin # Restrict the protoc version to the one supported by this plugin. - s.dependency '!ProtoCompiler', '3.11.2' + s.dependency '!ProtoCompiler', '3.11.4' # For the Protobuf dependency not to complain: s.ios.deployment_target = '7.0' s.osx.deployment_target = '10.9' diff --git a/src/objective-c/!ProtoCompiler.podspec b/src/objective-c/!ProtoCompiler.podspec index 36ec44d6498..cf894bc7441 100644 --- a/src/objective-c/!ProtoCompiler.podspec +++ b/src/objective-c/!ProtoCompiler.podspec @@ -36,7 +36,7 @@ Pod::Spec.new do |s| # exclamation mark ensures that other "regular" pods will be able to find it as it'll be installed # before them. s.name = '!ProtoCompiler' - v = '3.11.2' + v = '3.11.4' s.version = v s.summary = 'The Protobuf Compiler (protoc) generates Objective-C files from .proto files' s.description = <<-DESC diff --git a/templates/src/objective-c/!ProtoCompiler-gRPCCppPlugin.podspec.template b/templates/src/objective-c/!ProtoCompiler-gRPCCppPlugin.podspec.template index 4c9fce97086..b0aba409bb8 100644 --- a/templates/src/objective-c/!ProtoCompiler-gRPCCppPlugin.podspec.template +++ b/templates/src/objective-c/!ProtoCompiler-gRPCCppPlugin.podspec.template @@ -102,7 +102,7 @@ s.preserve_paths = plugin # Restrict the protoc version to the one supported by this plugin. - s.dependency '!ProtoCompiler', '3.11.2' + s.dependency '!ProtoCompiler', '3.11.4' # For the Protobuf dependency not to complain: s.ios.deployment_target = '7.0' s.osx.deployment_target = '10.9' diff --git a/templates/src/objective-c/!ProtoCompiler-gRPCPlugin.podspec.template b/templates/src/objective-c/!ProtoCompiler-gRPCPlugin.podspec.template index 1e1d1ef8751..14754fe278a 100644 --- a/templates/src/objective-c/!ProtoCompiler-gRPCPlugin.podspec.template +++ b/templates/src/objective-c/!ProtoCompiler-gRPCPlugin.podspec.template @@ -104,7 +104,7 @@ s.preserve_paths = plugin # Restrict the protoc version to the one supported by this plugin. - s.dependency '!ProtoCompiler', '3.11.2' + s.dependency '!ProtoCompiler', '3.11.4' # For the Protobuf dependency not to complain: s.ios.deployment_target = '7.0' s.osx.deployment_target = '10.9' From d6bebcd248a2822177b9d14e99dd47e294b9b3df Mon Sep 17 00:00:00 2001 From: Jean Boussier Date: Tue, 1 Oct 2019 12:44:31 +0200 Subject: [PATCH 619/758] Fix Ruby 2.7 compatibility in GenericService.underscore --- src/ruby/lib/grpc/generic/service.rb | 1 + src/ruby/spec/generic/service_spec.rb | 2 ++ 2 files changed, 3 insertions(+) diff --git a/src/ruby/lib/grpc/generic/service.rb b/src/ruby/lib/grpc/generic/service.rb index 169a62f11d3..399d0355c8a 100644 --- a/src/ruby/lib/grpc/generic/service.rb +++ b/src/ruby/lib/grpc/generic/service.rb @@ -31,6 +31,7 @@ module GRPC # # @param s [String] the string to be converted. def self.underscore(s) + s = +s # Avoid mutating the argument, as it might be frozen. s.gsub!(/([A-Z]+)([A-Z][a-z])/, '\1_\2') s.gsub!(/([a-z\d])([A-Z])/, '\1_\2') s.tr!('-', '_') diff --git a/src/ruby/spec/generic/service_spec.rb b/src/ruby/spec/generic/service_spec.rb index 57aec89ce51..16f8783152e 100644 --- a/src/ruby/spec/generic/service_spec.rb +++ b/src/ruby/spec/generic/service_spec.rb @@ -55,6 +55,8 @@ describe GenericService do expect(GenericService.underscore('AMethod')).to eq('a_method') expect(GenericService.underscore('PrintHTML')).to eq('print_html') expect(GenericService.underscore('SeeHTMLBooks')).to eq('see_html_books') + + expect(GenericService.underscore('SeeHTMLBooks'.freeze)).to eq('see_html_books') end end From f091a66999718fa429208d3fe86c423afe3e485c Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Mon, 27 Apr 2020 13:02:37 +0200 Subject: [PATCH 620/758] Revert "Fix client_lb_end2end_test flake" --- src/core/lib/surface/init.cc | 2 +- test/cpp/end2end/client_lb_end2end_test.cc | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/core/lib/surface/init.cc b/src/core/lib/surface/init.cc index aaa1bcafc94..d8bc4e4dd32 100644 --- a/src/core/lib/surface/init.cc +++ b/src/core/lib/surface/init.cc @@ -243,7 +243,7 @@ int grpc_is_initialized(void) { void grpc_maybe_wait_for_async_shutdown(void) { gpr_once_init(&g_basic_init, do_basic_init); grpc_core::MutexLock lock(&g_init_mu); - while (g_shutting_down || g_initializations > 0) { + while (g_shutting_down) { gpr_cv_wait(g_shutting_down_cv, &g_init_mu, gpr_inf_future(GPR_CLOCK_REALTIME)); } diff --git a/test/cpp/end2end/client_lb_end2end_test.cc b/test/cpp/end2end/client_lb_end2end_test.cc index cc2e638671d..d066a00a29d 100644 --- a/test/cpp/end2end/client_lb_end2end_test.cc +++ b/test/cpp/end2end/client_lb_end2end_test.cc @@ -50,7 +50,6 @@ #include "src/core/lib/gprpp/ref_counted_ptr.h" #include "src/core/lib/iomgr/tcp_client.h" #include "src/core/lib/security/credentials/fake/fake_credentials.h" -#include "src/core/lib/surface/init.h" #include "src/cpp/client/secure_credentials.h" #include "src/cpp/server/secure_server_credentials.h" @@ -240,7 +239,6 @@ class ClientLbEnd2endTest : public ::testing::Test { servers_.clear(); creds_.reset(); grpc_shutdown_blocking(); - grpc_maybe_wait_for_async_shutdown(); } void CreateServers(size_t num_servers, From 3c83ce518723023bd84727739d0f868da15ea7aa Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Fri, 24 Apr 2020 12:00:44 -0400 Subject: [PATCH 621/758] add back check removed by mistake in #15070 --- tools/run_tests/sanity/check_bazel_workspace.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tools/run_tests/sanity/check_bazel_workspace.py b/tools/run_tests/sanity/check_bazel_workspace.py index 99252b717af..574551298da 100755 --- a/tools/run_tests/sanity/check_bazel_workspace.py +++ b/tools/run_tests/sanity/check_bazel_workspace.py @@ -170,6 +170,11 @@ if len(workspace_git_hashes - git_submodule_hashes) > 0: print( "Found discrepancies between git submodules and Bazel WORKSPACE dependencies" ) + print("workspace_git_hashes: %s" % workspace_git_hashes) + print("git_submodule_hashes: %s" % git_submodule_hashes) + print("workspace_git_hashes - git_submodule_hashes: %s" % + (workspace_git_hashes - git_submodule_hashes)) + sys.exit(1) # Also check that we can override each dependency for name in _GRPC_DEP_NAMES: From c6d788c395b8ddac4aebadf619db78f2bbec8ba4 Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Fri, 24 Apr 2020 12:01:33 -0400 Subject: [PATCH 622/758] add upb to _GRPC_BAZEL_ONLY_DEPS --- tools/run_tests/sanity/check_bazel_workspace.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/run_tests/sanity/check_bazel_workspace.py b/tools/run_tests/sanity/check_bazel_workspace.py index 574551298da..6a01e71a9e1 100755 --- a/tools/run_tests/sanity/check_bazel_workspace.py +++ b/tools/run_tests/sanity/check_bazel_workspace.py @@ -68,6 +68,7 @@ _GRPC_DEP_NAMES = [ ] _GRPC_BAZEL_ONLY_DEPS = [ + 'upb', # third_party/upb is checked in locally 'rules_cc', 'com_google_absl', 'io_opencensus_cpp', From d05332c00054783a746bee283e2dc731cf77e13b Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Mon, 27 Apr 2020 14:42:39 +0200 Subject: [PATCH 623/758] better error when tools/bazel fails to download --- tools/bazel | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/bazel b/tools/bazel index bc8f78c24b7..3e82c8fb54c 100755 --- a/tools/bazel +++ b/tools/bazel @@ -63,7 +63,7 @@ esac filename="bazel-$VERSION-$suffix" if [ ! -x "$filename" ] ; then - curl -L "$BASEURL/$VERSION/$filename" > "$filename" + curl --fail -L "$BASEURL/$VERSION/$filename" > "$filename" chmod a+x "$filename" fi From 20bca3dc807e4de69b2b3094fedda18fa6dafa19 Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Mon, 27 Apr 2020 15:12:44 +0200 Subject: [PATCH 624/758] use mirror for more reliable tools/bazel downloads --- bazel/update_mirror.sh | 5 +++++ tools/bazel | 8 ++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/bazel/update_mirror.sh b/bazel/update_mirror.sh index 81e3acdc97e..7c2fe4658b6 100755 --- a/bazel/update_mirror.sh +++ b/bazel/update_mirror.sh @@ -51,6 +51,11 @@ function upload { # A specific link can be upload manually by running e.g. # upload "github.com/google/boringssl/archive/1c2769383f027befac5b75b6cedd25daf3bf4dcf.tar.gz" +# bazel binaries used by the tools/bazel wrapper script +upload github.com/bazelbuild/bazel/releases/download/1.0.0/bazel-1.0.0-linux-x86_64 +upload github.com/bazelbuild/bazel/releases/download/1.0.0/bazel-1.0.0-darwin-x86_64 +upload github.com/bazelbuild/bazel/releases/download/1.0.0/bazel-1.0.0-windows-x86_64.exe + # Collect the github archives to mirror from grpc_deps.bzl grep -o '"https://github.com/[^"]*"' bazel/grpc_deps.bzl | sed 's/^"https:\/\///' | sed 's/"$//' | while read -r line ; do echo "Updating mirror for ${line}" diff --git a/tools/bazel b/tools/bazel index 3e82c8fb54c..ba564927eb9 100755 --- a/tools/bazel +++ b/tools/bazel @@ -43,7 +43,9 @@ fi VERSION=1.0.0 echo "INFO: Running bazel wrapper (see //tools/bazel for details), bazel version $VERSION will be used instead of system-wide bazel installation." >&2 -BASEURL=https://github.com/bazelbuild/bazel/releases/download/ +# update tools/update_mirror.sh to populate the mirror with new bazel archives +BASEURL_MIRROR="https://storage.googleapis.com/grpc-bazel-mirror/github.com/bazelbuild/bazel/releases/download" +BASEURL="https://github.com/bazelbuild/bazel/releases/download" pushd "$(dirname "$0")" >/dev/null TOOLDIR=$(pwd) @@ -63,7 +65,9 @@ esac filename="bazel-$VERSION-$suffix" if [ ! -x "$filename" ] ; then - curl --fail -L "$BASEURL/$VERSION/$filename" > "$filename" + # first try to download using mirror, fallback to download from github + echo "Downloading bazel, will try URLs: ${BASEURL_MIRROR}/${VERSION}/${filename} ${BASEURL}/${VERSION}/${filename}" >&2 + curl --fail -L --output "${filename}" "${BASEURL_MIRROR}/${VERSION}/${filename}" || curl --fail -L --output "${filename}" "${BASEURL}/${VERSION}/${filename}" chmod a+x "$filename" fi From fc6f26c89be961fa464b5103d87289b94e6546b2 Mon Sep 17 00:00:00 2001 From: "Mark D. Roth" Date: Fri, 24 Apr 2020 15:35:45 -0700 Subject: [PATCH 625/758] Remove grpc_core::StringView. --- .../filters/client_channel/backend_metric.cc | 9 +- .../filters/client_channel/client_channel.cc | 9 +- .../ext/filters/client_channel/lb_policy.h | 27 ++-- .../lb_policy/child_policy_handler.cc | 3 +- .../client_channel/lb_policy/grpclb/grpclb.cc | 8 +- .../lb_policy/priority/priority.cc | 7 +- .../weighted_target/weighted_target.cc | 5 +- .../client_channel/lb_policy/xds/cds.cc | 18 +-- .../client_channel/lb_policy/xds/eds.cc | 10 +- .../client_channel/lb_policy/xds/lrs.cc | 6 +- .../lb_policy/xds/xds_routing.cc | 5 +- .../resolver/xds/xds_resolver.cc | 1 - .../client_channel/resolving_lb_policy.cc | 5 +- .../filters/client_channel/service_config.cc | 4 +- .../filters/client_channel/service_config.h | 2 +- .../ext/filters/client_channel/xds/xds_api.cc | 50 ++++--- .../ext/filters/client_channel/xds/xds_api.h | 14 +- .../client_channel/xds/xds_bootstrap.cc | 4 +- .../filters/client_channel/xds/xds_client.cc | 47 ++++--- .../filters/client_channel/xds/xds_client.h | 31 +++-- .../client_channel/xds/xds_client_stats.cc | 10 +- .../client_channel/xds/xds_client_stats.h | 22 +-- src/core/lib/gprpp/host_port.cc | 29 ++-- src/core/lib/gprpp/host_port.h | 10 +- src/core/lib/gprpp/map.h | 3 +- src/core/lib/gprpp/string_view.h | 12 +- .../lib/http/httpcli_security_connector.cc | 5 +- src/core/lib/json/json.h | 5 +- src/core/lib/json/json_reader.cc | 8 +- src/core/lib/json/json_writer.cc | 25 ++-- .../google_default_credentials.cc | 6 +- .../security/credentials/jwt/jwt_verifier.cc | 6 +- .../alts/alts_security_connector.cc | 2 +- .../fake/fake_security_connector.cc | 14 +- .../local/local_security_connector.cc | 2 +- .../security_connector/security_connector.h | 2 +- .../ssl/ssl_security_connector.cc | 8 +- .../security/security_connector/ssl_utils.cc | 24 ++-- .../security/security_connector/ssl_utils.h | 21 +-- .../tls/tls_security_connector.cc | 9 +- .../tls/tls_security_connector.h | 3 +- .../security/transport/client_auth_filter.cc | 3 +- src/core/lib/slice/slice_utils.h | 9 ++ src/core/tsi/ssl_transport_security.cc | 22 +-- src/core/tsi/ssl_transport_security.h | 5 +- test/core/gprpp/string_view_test.cc | 130 +----------------- test/core/json/fuzzer.cc | 2 +- test/core/security/credentials_test.cc | 4 +- test/core/security/json_token_test.cc | 4 +- test/core/slice/slice_test.cc | 8 ++ test/core/util/test_lb_policies.cc | 3 +- test/cpp/end2end/client_lb_end2end_test.cc | 1 + test/cpp/qps/driver.cc | 4 +- 53 files changed, 304 insertions(+), 382 deletions(-) diff --git a/src/core/ext/filters/client_channel/backend_metric.cc b/src/core/ext/filters/client_channel/backend_metric.cc index b36614f5b80..cfb18c172d0 100644 --- a/src/core/ext/filters/client_channel/backend_metric.cc +++ b/src/core/ext/filters/client_channel/backend_metric.cc @@ -18,7 +18,8 @@ #include "src/core/ext/filters/client_channel/backend_metric.h" -#include "src/core/lib/gprpp/string_view.h" +#include "absl/strings/string_view.h" + #include "udpa/data/orca/v1/orca_load_report.upb.h" namespace grpc_core { @@ -26,19 +27,19 @@ namespace grpc_core { namespace { template -std::map ParseMap( +std::map ParseMap( udpa_data_orca_v1_OrcaLoadReport* msg, EntryType** (*entry_func)(udpa_data_orca_v1_OrcaLoadReport*, size_t*), upb_strview (*key_func)(const EntryType*), double (*value_func)(const EntryType*), Arena* arena) { - std::map result; + std::map result; size_t size; const auto* const* entries = entry_func(msg, &size); for (size_t i = 0; i < size; ++i) { upb_strview key_view = key_func(entries[i]); char* key = static_cast(arena->Alloc(key_view.size + 1)); memcpy(key, key_view.data, key_view.size); - result[StringView(key, key_view.size)] = value_func(entries[i]); + result[absl::string_view(key, key_view.size)] = value_func(entries[i]); } return result; } diff --git a/src/core/ext/filters/client_channel/client_channel.cc b/src/core/ext/filters/client_channel/client_channel.cc index a66a3a615c7..673546e84e2 100644 --- a/src/core/ext/filters/client_channel/client_channel.cc +++ b/src/core/ext/filters/client_channel/client_channel.cc @@ -28,6 +28,8 @@ #include +#include "absl/strings/string_view.h" + #include #include #include @@ -372,7 +374,7 @@ class CallData { Metadata(CallData* calld, grpc_metadata_batch* batch) : calld_(calld), batch_(batch) {} - void Add(StringView key, StringView value) override { + void Add(absl::string_view key, absl::string_view value) override { grpc_linked_mdelem* linked_mdelem = static_cast( calld_->arena_->Alloc(sizeof(grpc_linked_mdelem))); linked_mdelem->md = grpc_mdelem_from_slices( @@ -407,7 +409,7 @@ class CallData { reinterpret_cast(handle); return reinterpret_cast(linked_mdelem->next); } - std::pair IteratorHandleGet( + std::pair IteratorHandleGet( intptr_t handle) const override { grpc_linked_mdelem* linked_mdelem = reinterpret_cast(handle); @@ -1306,7 +1308,8 @@ class ChannelData::ClientChannelControlHelper // No-op -- we should never get this from ResolvingLoadBalancingPolicy. void RequestReresolution() override {} - void AddTraceEvent(TraceSeverity severity, StringView message) override { + void AddTraceEvent(TraceSeverity severity, + absl::string_view message) override { if (chand_->channelz_node_ != nullptr) { chand_->channelz_node_->AddTraceEvent( ConvertSeverityEnum(severity), diff --git a/src/core/ext/filters/client_channel/lb_policy.h b/src/core/ext/filters/client_channel/lb_policy.h index 4f269e9d383..f76708c4e65 100644 --- a/src/core/ext/filters/client_channel/lb_policy.h +++ b/src/core/ext/filters/client_channel/lb_policy.h @@ -24,13 +24,14 @@ #include #include +#include "absl/strings/string_view.h" + #include "src/core/ext/filters/client_channel/server_address.h" #include "src/core/ext/filters/client_channel/service_config.h" #include "src/core/ext/filters/client_channel/subchannel_interface.h" #include "src/core/lib/gprpp/map.h" #include "src/core/lib/gprpp/orphanable.h" #include "src/core/lib/gprpp/ref_counted_ptr.h" -#include "src/core/lib/gprpp/string_view.h" #include "src/core/lib/iomgr/polling_entity.h" #include "src/core/lib/iomgr/work_serializer.h" #include "src/core/lib/transport/connectivity_state.h" @@ -93,11 +94,11 @@ class LoadBalancingPolicy : public InternallyRefCounted { /// Application-specific requests cost metrics. Metric names are /// determined by the application. Each value is an absolute cost /// (e.g. 3487 bytes of storage) associated with the request. - std::map request_cost; + std::map request_cost; /// Application-specific resource utilization metrics. Metric names /// are determined by the application. Each value is expressed as a /// fraction of total resources available. - std::map utilization; + std::map utilization; }; /// Interface for accessing per-call state. @@ -123,12 +124,13 @@ class LoadBalancingPolicy : public InternallyRefCounted { class MetadataInterface { public: class iterator - : public std::iterator, // value_type - std::ptrdiff_t, // difference_type - std::pair*, // pointer - std::pair& // reference - > { + : public std::iterator< + std::input_iterator_tag, + std::pair, // value_type + std::ptrdiff_t, // difference_type + std::pair*, // pointer + std::pair& // reference + > { public: iterator(const MetadataInterface* md, intptr_t handle) : md_(md), handle_(handle) {} @@ -155,7 +157,7 @@ class LoadBalancingPolicy : public InternallyRefCounted { /// Implementations must ensure that the key and value remain alive /// until the call ends. If desired, they may be allocated via /// CallState::Alloc(). - virtual void Add(StringView key, StringView value) = 0; + virtual void Add(absl::string_view key, absl::string_view value) = 0; /// Iteration interface. virtual iterator begin() const = 0; @@ -172,7 +174,7 @@ class LoadBalancingPolicy : public InternallyRefCounted { friend class iterator; virtual intptr_t IteratorHandleNext(intptr_t handle) const = 0; - virtual std::pair + virtual std::pair IteratorHandleGet(intptr_t handle) const = 0; }; @@ -276,7 +278,8 @@ class LoadBalancingPolicy : public InternallyRefCounted { /// Adds a trace message associated with the channel. enum TraceSeverity { TRACE_INFO, TRACE_WARNING, TRACE_ERROR }; - virtual void AddTraceEvent(TraceSeverity severity, StringView message) = 0; + virtual void AddTraceEvent(TraceSeverity severity, + absl::string_view message) = 0; }; /// Interface for configuration data used by an LB policy implementation. diff --git a/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc b/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc index 94338ff0ca6..ac5b82e98b8 100644 --- a/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +++ b/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc @@ -86,7 +86,8 @@ class ChildPolicyHandler::Helper parent_->channel_control_helper()->RequestReresolution(); } - void AddTraceEvent(TraceSeverity severity, StringView message) override { + void AddTraceEvent(TraceSeverity severity, + absl::string_view message) override { if (parent_->shutting_down_) return; if (!CalledByPendingChild() && !CalledByCurrentChild()) return; parent_->channel_control_helper()->AddTraceEvent(severity, message); diff --git a/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc b/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc index 5a7a3840fa7..786332e3902 100644 --- a/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +++ b/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc @@ -297,7 +297,8 @@ class GrpcLb : public LoadBalancingPolicy { void UpdateState(grpc_connectivity_state state, std::unique_ptr picker) override; void RequestReresolution() override; - void AddTraceEvent(TraceSeverity severity, StringView message) override; + void AddTraceEvent(TraceSeverity severity, + absl::string_view message) override; private: RefCountedPtr parent_; @@ -628,7 +629,7 @@ GrpcLb::PickResult GrpcLb::Picker::Pick(PickArgs args) { // how to interpret it. args.initial_metadata->Add( kGrpcLbClientStatsMetadataKey, - StringView(reinterpret_cast(client_stats), 0)); + absl::string_view(reinterpret_cast(client_stats), 0)); // Update calls-started. client_stats->AddCallStarted(); } @@ -721,7 +722,8 @@ void GrpcLb::Helper::RequestReresolution() { } } -void GrpcLb::Helper::AddTraceEvent(TraceSeverity severity, StringView message) { +void GrpcLb::Helper::AddTraceEvent(TraceSeverity severity, + absl::string_view message) { if (parent_->shutting_down_) return; parent_->channel_control_helper()->AddTraceEvent(severity, message); } diff --git a/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc b/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc index 6bcb9bf2231..19fc45f4f87 100644 --- a/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +++ b/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc @@ -152,7 +152,8 @@ class PriorityLb : public LoadBalancingPolicy { void UpdateState(grpc_connectivity_state state, std::unique_ptr picker) override; void RequestReresolution() override; - void AddTraceEvent(TraceSeverity severity, StringView message) override; + void AddTraceEvent(TraceSeverity severity, + absl::string_view message) override; private: RefCountedPtr priority_; @@ -730,8 +731,8 @@ void PriorityLb::ChildPriority::Helper::UpdateState( priority_->OnConnectivityStateUpdateLocked(state, std::move(picker)); } -void PriorityLb::ChildPriority::Helper::AddTraceEvent(TraceSeverity severity, - StringView message) { +void PriorityLb::ChildPriority::Helper::AddTraceEvent( + TraceSeverity severity, absl::string_view message) { if (priority_->priority_policy_->shutting_down_) return; priority_->priority_policy_->channel_control_helper()->AddTraceEvent(severity, message); diff --git a/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc b/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc index 5a59dc00226..a0b0fef04a3 100644 --- a/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +++ b/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc @@ -148,7 +148,8 @@ class WeightedTargetLb : public LoadBalancingPolicy { void UpdateState(grpc_connectivity_state state, std::unique_ptr picker) override; void RequestReresolution() override; - void AddTraceEvent(TraceSeverity severity, StringView message) override; + void AddTraceEvent(TraceSeverity severity, + absl::string_view message) override; private: RefCountedPtr weighted_child_; @@ -589,7 +590,7 @@ void WeightedTargetLb::WeightedChild::Helper::RequestReresolution() { } void WeightedTargetLb::WeightedChild::Helper::AddTraceEvent( - TraceSeverity severity, StringView message) { + TraceSeverity severity, absl::string_view message) { if (weighted_child_->weighted_target_policy_->shutting_down_) return; weighted_child_->weighted_target_policy_->channel_control_helper() ->AddTraceEvent(severity, message); diff --git a/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc b/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc index 90e36d1320f..3c1a38a8c0c 100644 --- a/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +++ b/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc @@ -79,7 +79,8 @@ class CdsLb : public LoadBalancingPolicy { void UpdateState(grpc_connectivity_state state, std::unique_ptr picker) override; void RequestReresolution() override; - void AddTraceEvent(TraceSeverity severity, StringView message) override; + void AddTraceEvent(TraceSeverity severity, + absl::string_view message) override; private: RefCountedPtr parent_; @@ -239,7 +240,8 @@ void CdsLb::Helper::RequestReresolution() { parent_->channel_control_helper()->RequestReresolution(); } -void CdsLb::Helper::AddTraceEvent(TraceSeverity severity, StringView message) { +void CdsLb::Helper::AddTraceEvent(TraceSeverity severity, + absl::string_view message) { if (parent_->shutting_down_) return; parent_->channel_control_helper()->AddTraceEvent(severity, message); } @@ -279,8 +281,7 @@ void CdsLb::ShutdownLocked() { gpr_log(GPR_INFO, "[cdslb %p] cancelling watch for cluster %s", this, config_->cluster().c_str()); } - xds_client_->CancelClusterDataWatch( - StringView(config_->cluster().c_str()), cluster_watcher_); + xds_client_->CancelClusterDataWatch(config_->cluster(), cluster_watcher_); } xds_client_.reset(); } @@ -309,9 +310,9 @@ void CdsLb::UpdateLocked(UpdateArgs args) { gpr_log(GPR_INFO, "[cdslb %p] cancelling watch for cluster %s", this, old_config->cluster().c_str()); } - xds_client_->CancelClusterDataWatch( - StringView(old_config->cluster().c_str()), cluster_watcher_, - /*delay_unsubscription=*/true); + xds_client_->CancelClusterDataWatch(old_config->cluster(), + cluster_watcher_, + /*delay_unsubscription=*/true); } if (GRPC_TRACE_FLAG_ENABLED(grpc_cds_lb_trace)) { gpr_log(GPR_INFO, "[cdslb %p] starting watch for cluster %s", this, @@ -319,8 +320,7 @@ void CdsLb::UpdateLocked(UpdateArgs args) { } auto watcher = absl::make_unique(Ref()); cluster_watcher_ = watcher.get(); - xds_client_->WatchClusterData(StringView(config_->cluster().c_str()), - std::move(watcher)); + xds_client_->WatchClusterData(config_->cluster(), std::move(watcher)); } } diff --git a/src/core/ext/filters/client_channel/lb_policy/xds/eds.cc b/src/core/ext/filters/client_channel/lb_policy/xds/eds.cc index c4235a6305f..9a159b3f4d0 100644 --- a/src/core/ext/filters/client_channel/lb_policy/xds/eds.cc +++ b/src/core/ext/filters/client_channel/lb_policy/xds/eds.cc @@ -137,7 +137,8 @@ class EdsLb : public LoadBalancingPolicy { // This is a no-op, because we get the addresses from the xds // client, which is a watch-based API. void RequestReresolution() override {} - void AddTraceEvent(TraceSeverity severity, StringView message) override; + void AddTraceEvent(TraceSeverity severity, + absl::string_view message) override; private: RefCountedPtr eds_policy_; @@ -158,7 +159,7 @@ class EdsLb : public LoadBalancingPolicy { void MaybeUpdateDropPickerLocked(); // Caller must ensure that config_ is set before calling. - const StringView GetEdsResourceName() const { + const absl::string_view GetEdsResourceName() const { if (xds_client_from_channel_ == nullptr) return server_name_; if (!config_->eds_service_name().empty()) { return config_->eds_service_name(); @@ -169,7 +170,7 @@ class EdsLb : public LoadBalancingPolicy { // Returns a pair containing the cluster and eds_service_name to use // for LRS load reporting. // Caller must ensure that config_ is set before calling. - std::pair GetLrsClusterKey() const { + std::pair GetLrsClusterKey() const { if (xds_client_from_channel_ == nullptr) return {server_name_, nullptr}; return {config_->cluster_name(), config_->eds_service_name()}; } @@ -275,7 +276,8 @@ void EdsLb::Helper::UpdateState(grpc_connectivity_state state, eds_policy_->MaybeUpdateDropPickerLocked(); } -void EdsLb::Helper::AddTraceEvent(TraceSeverity severity, StringView message) { +void EdsLb::Helper::AddTraceEvent(TraceSeverity severity, + absl::string_view message) { if (eds_policy_->shutting_down_) return; eds_policy_->channel_control_helper()->AddTraceEvent(severity, message); } diff --git a/src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc b/src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc index 30dbd20b9ad..28a9d76c12d 100644 --- a/src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc +++ b/src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc @@ -123,7 +123,8 @@ class LrsLb : public LoadBalancingPolicy { void UpdateState(grpc_connectivity_state state, std::unique_ptr picker) override; void RequestReresolution() override; - void AddTraceEvent(TraceSeverity severity, StringView message) override; + void AddTraceEvent(TraceSeverity severity, + absl::string_view message) override; private: RefCountedPtr lrs_policy_; @@ -341,7 +342,8 @@ void LrsLb::Helper::RequestReresolution() { lrs_policy_->channel_control_helper()->RequestReresolution(); } -void LrsLb::Helper::AddTraceEvent(TraceSeverity severity, StringView message) { +void LrsLb::Helper::AddTraceEvent(TraceSeverity severity, + absl::string_view message) { if (lrs_policy_->shutting_down_) return; lrs_policy_->channel_control_helper()->AddTraceEvent(severity, message); } diff --git a/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc b/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc index b72ac3bab55..226c7ec3e12 100644 --- a/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc +++ b/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc @@ -161,7 +161,8 @@ class XdsRoutingLb : public LoadBalancingPolicy { void UpdateState(grpc_connectivity_state state, std::unique_ptr picker) override; void RequestReresolution() override; - void AddTraceEvent(TraceSeverity severity, StringView message) override; + void AddTraceEvent(TraceSeverity severity, + absl::string_view message) override; private: RefCountedPtr xds_routing_child_; @@ -579,7 +580,7 @@ void XdsRoutingLb::XdsRoutingChild::Helper::RequestReresolution() { } void XdsRoutingLb::XdsRoutingChild::Helper::AddTraceEvent( - TraceSeverity severity, StringView message) { + TraceSeverity severity, absl::string_view message) { if (xds_routing_child_->xds_routing_policy_->shutting_down_) return; xds_routing_child_->xds_routing_policy_->channel_control_helper() ->AddTraceEvent(severity, message); diff --git a/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc b/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc index c83a5cca2e4..5dec92ba7ef 100644 --- a/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +++ b/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc @@ -20,7 +20,6 @@ #include "src/core/ext/filters/client_channel/resolver_registry.h" #include "src/core/ext/filters/client_channel/xds/xds_client.h" -#include "src/core/lib/gprpp/string_view.h" namespace grpc_core { diff --git a/src/core/ext/filters/client_channel/resolving_lb_policy.cc b/src/core/ext/filters/client_channel/resolving_lb_policy.cc index f0c29ec0183..bc69bae01cc 100644 --- a/src/core/ext/filters/client_channel/resolving_lb_policy.cc +++ b/src/core/ext/filters/client_channel/resolving_lb_policy.cc @@ -126,7 +126,8 @@ class ResolvingLoadBalancingPolicy::ResolvingControlHelper parent_->resolver_->RequestReresolutionLocked(); } - void AddTraceEvent(TraceSeverity severity, StringView message) override { + void AddTraceEvent(TraceSeverity severity, + absl::string_view message) override { if (parent_->resolver_ == nullptr) return; // Shutting down. parent_->channel_control_helper()->AddTraceEvent(severity, message); } @@ -287,7 +288,7 @@ void ResolvingLoadBalancingPolicy::ConcatenateAndAddChannelTraceLocked( size_t len = 0; grpc_core::UniquePtr message(gpr_strvec_flatten(&v, &len)); channel_control_helper()->AddTraceEvent(ChannelControlHelper::TRACE_INFO, - StringView(message.get())); + absl::string_view(message.get())); gpr_strvec_destroy(&v); } } diff --git a/src/core/ext/filters/client_channel/service_config.cc b/src/core/ext/filters/client_channel/service_config.cc index 04ef477204b..b2847c20e7b 100644 --- a/src/core/ext/filters/client_channel/service_config.cc +++ b/src/core/ext/filters/client_channel/service_config.cc @@ -40,8 +40,8 @@ typedef absl::InlinedVector, ServiceConfigParserList* g_registered_parsers; } // namespace -RefCountedPtr ServiceConfig::Create(StringView json_string, - grpc_error** error) { +RefCountedPtr ServiceConfig::Create( + absl::string_view json_string, grpc_error** error) { GPR_DEBUG_ASSERT(error != nullptr); Json json = Json::Parse(json_string, error); if (*error != GRPC_ERROR_NONE) return nullptr; diff --git a/src/core/ext/filters/client_channel/service_config.h b/src/core/ext/filters/client_channel/service_config.h index 73157db50d3..2718c93b625 100644 --- a/src/core/ext/filters/client_channel/service_config.h +++ b/src/core/ext/filters/client_channel/service_config.h @@ -129,7 +129,7 @@ class ServiceConfig : public RefCounted { /// Creates a new service config from parsing \a json_string. /// Returns null on parse error. - static RefCountedPtr Create(StringView json_string, + static RefCountedPtr Create(absl::string_view json_string, grpc_error** error); ServiceConfig(std::string json_string, Json json, grpc_error** error); diff --git a/src/core/ext/filters/client_channel/xds/xds_api.cc b/src/core/ext/filters/client_channel/xds/xds_api.cc index 08ba9f925a0..3c977d6152f 100644 --- a/src/core/ext/filters/client_channel/xds/xds_api.cc +++ b/src/core/ext/filters/client_channel/xds/xds_api.cc @@ -31,6 +31,7 @@ #include #include "src/core/ext/filters/client_channel/xds/xds_api.h" +#include "src/core/lib/gpr/useful.h" #include "src/core/lib/iomgr/error.h" #include "src/core/lib/iomgr/sockaddr_utils.h" @@ -514,10 +515,10 @@ grpc_slice XdsApi::CreateRdsRequest(const std::string& route_config_name, return SerializeDiscoveryRequest(arena.ptr(), request); } -grpc_slice XdsApi::CreateCdsRequest(const std::set& cluster_names, - const std::string& version, - const std::string& nonce, grpc_error* error, - bool populate_node) { +grpc_slice XdsApi::CreateCdsRequest( + const std::set& cluster_names, + const std::string& version, const std::string& nonce, grpc_error* error, + bool populate_node) { upb::Arena arena; envoy_api_v2_DiscoveryRequest* request = CreateDiscoveryRequest(arena.ptr(), kCdsTypeUrl, version, nonce, error); @@ -539,8 +540,9 @@ grpc_slice XdsApi::CreateCdsRequest(const std::set& cluster_names, } grpc_slice XdsApi::CreateEdsRequest( - const std::set& eds_service_names, const std::string& version, - const std::string& nonce, grpc_error* error, bool populate_node) { + const std::set& eds_service_names, + const std::string& version, const std::string& nonce, grpc_error* error, + bool populate_node) { upb::Arena arena; envoy_api_v2_DiscoveryRequest* request = CreateDiscoveryRequest(arena.ptr(), kEdsTypeUrl, version, nonce, error); @@ -923,16 +925,18 @@ bool DomainMatch(MatchType match_type, std::string domain_pattern, } else if (match_type == SUFFIX_MATCH) { // Asterisk must match at least one char. if (expected_host_name.size() < domain_pattern.size()) return false; - StringView pattern_suffix(domain_pattern.c_str() + 1); - StringView host_suffix(expected_host_name.c_str() + - expected_host_name.size() - pattern_suffix.size()); + absl::string_view pattern_suffix(domain_pattern.c_str() + 1); + absl::string_view host_suffix(expected_host_name.c_str() + + expected_host_name.size() - + pattern_suffix.size()); return pattern_suffix == host_suffix; } else if (match_type == PREFIX_MATCH) { // Asterisk must match at least one char. if (expected_host_name.size() < domain_pattern.size()) return false; - StringView pattern_prefix(domain_pattern.c_str(), - domain_pattern.size() - 1); - StringView host_prefix(expected_host_name.c_str(), pattern_prefix.size()); + absl::string_view pattern_prefix(domain_pattern.c_str(), + domain_pattern.size() - 1); + absl::string_view host_prefix(expected_host_name.c_str(), + pattern_prefix.size()); return pattern_prefix == host_prefix; } else { return match_type == UNIVERSE_MATCH; @@ -1228,11 +1232,11 @@ grpc_error* RdsResponseParse(XdsClient* client, TraceFlag* tracer, return GRPC_ERROR_NONE; } -grpc_error* CdsResponseParse(XdsClient* client, TraceFlag* tracer, - const envoy_api_v2_DiscoveryResponse* response, - const std::set& expected_cluster_names, - XdsApi::CdsUpdateMap* cds_update_map, - upb_arena* arena) { +grpc_error* CdsResponseParse( + XdsClient* client, TraceFlag* tracer, + const envoy_api_v2_DiscoveryResponse* response, + const std::set& expected_cluster_names, + XdsApi::CdsUpdateMap* cds_update_map, upb_arena* arena) { // Get the resources from the response. size_t size; const google_protobuf_Any* const* resources = @@ -1255,7 +1259,8 @@ grpc_error* CdsResponseParse(XdsClient* client, TraceFlag* tracer, MaybeLogCluster(client, tracer, cluster); // Ignore unexpected cluster names. upb_strview cluster_name = envoy_api_v2_Cluster_name(cluster); - StringView cluster_name_strview(cluster_name.data, cluster_name.size); + absl::string_view cluster_name_strview(cluster_name.data, + cluster_name.size); if (expected_cluster_names.find(cluster_name_strview) == expected_cluster_names.end()) { continue; @@ -1418,7 +1423,7 @@ grpc_error* DropParseAndAppend( grpc_error* EdsResponseParse( XdsClient* client, TraceFlag* tracer, const envoy_api_v2_DiscoveryResponse* response, - const std::set& expected_eds_service_names, + const std::set& expected_eds_service_names, XdsApi::EdsUpdateMap* eds_update_map, upb_arena* arena) { // Get the resources from the response. size_t size; @@ -1447,7 +1452,8 @@ grpc_error* EdsResponseParse( // unexpected names. upb_strview cluster_name = envoy_api_v2_ClusterLoadAssignment_cluster_name( cluster_load_assignment); - StringView cluster_name_strview(cluster_name.data, cluster_name.size); + absl::string_view cluster_name_strview(cluster_name.data, + cluster_name.size); if (expected_eds_service_names.find(cluster_name_strview) == expected_eds_service_names.end()) { continue; @@ -1501,8 +1507,8 @@ grpc_error* XdsApi::ParseAdsResponse( const grpc_slice& encoded_response, const std::string& expected_server_name, const std::string& expected_route_config_name, const bool xds_routing_enabled, - const std::set& expected_cluster_names, - const std::set& expected_eds_service_names, + const std::set& expected_cluster_names, + const std::set& expected_eds_service_names, absl::optional* lds_update, absl::optional* rds_update, CdsUpdateMap* cds_update_map, EdsUpdateMap* eds_update_map, std::string* version, std::string* nonce, diff --git a/src/core/ext/filters/client_channel/xds/xds_api.h b/src/core/ext/filters/client_channel/xds/xds_api.h index 9117466fe84..a2d2d629f69 100644 --- a/src/core/ext/filters/client_channel/xds/xds_api.h +++ b/src/core/ext/filters/client_channel/xds/xds_api.h @@ -239,17 +239,17 @@ class XdsApi { // Creates a CDS request querying \a cluster_names. // Takes ownership of \a error. - grpc_slice CreateCdsRequest(const std::set& cluster_names, + grpc_slice CreateCdsRequest(const std::set& cluster_names, const std::string& version, const std::string& nonce, grpc_error* error, bool populate_node); // Creates an EDS request querying \a eds_service_names. // Takes ownership of \a error. - grpc_slice CreateEdsRequest(const std::set& eds_service_names, - const std::string& version, - const std::string& nonce, grpc_error* error, - bool populate_node); + grpc_slice CreateEdsRequest( + const std::set& eds_service_names, + const std::string& version, const std::string& nonce, grpc_error* error, + bool populate_node); // Parses the ADS response and outputs the validated update for either CDS or // EDS. If the response can't be parsed at the top level, \a type_url will @@ -259,8 +259,8 @@ class XdsApi { const std::string& expected_server_name, const std::string& expected_route_config_name, const bool xds_routing_enabled, - const std::set& expected_cluster_names, - const std::set& expected_eds_service_names, + const std::set& expected_cluster_names, + const std::set& expected_eds_service_names, absl::optional* lds_update, absl::optional* rds_update, CdsUpdateMap* cds_update_map, EdsUpdateMap* eds_update_map, std::string* version, std::string* nonce, diff --git a/src/core/ext/filters/client_channel/xds/xds_bootstrap.cc b/src/core/ext/filters/client_channel/xds/xds_bootstrap.cc index 9caee17a852..0b5c9510b07 100644 --- a/src/core/ext/filters/client_channel/xds/xds_bootstrap.cc +++ b/src/core/ext/filters/client_channel/xds/xds_bootstrap.cc @@ -26,6 +26,8 @@ #include #include "src/core/lib/gpr/env.h" +#include "src/core/lib/gpr/string.h" +#include "src/core/lib/gprpp/string_view.h" #include "src/core/lib/iomgr/load_file.h" #include "src/core/lib/slice/slice_internal.h" @@ -96,7 +98,7 @@ std::unique_ptr XdsBootstrap::ReadFromFile(XdsClient* client, grpc_slice contents; *error = grpc_load_file(path.get(), /*add_null_terminator=*/true, &contents); if (*error != GRPC_ERROR_NONE) return nullptr; - StringView contents_str_view = StringViewFromSlice(contents); + absl::string_view contents_str_view = StringViewFromSlice(contents); if (GRPC_TRACE_FLAG_ENABLED(*tracer)) { UniquePtr str = StringViewToCString(contents_str_view); gpr_log(GPR_DEBUG, "[xds_client %p] Bootstrap file contents: %s", client, diff --git a/src/core/ext/filters/client_channel/xds/xds_client.cc b/src/core/ext/filters/client_channel/xds/xds_client.cc index 9dc7b97773c..246f5be8e64 100644 --- a/src/core/ext/filters/client_channel/xds/xds_client.cc +++ b/src/core/ext/filters/client_channel/xds/xds_client.cc @@ -49,6 +49,7 @@ #include "src/core/lib/gprpp/memory.h" #include "src/core/lib/gprpp/orphanable.h" #include "src/core/lib/gprpp/ref_counted_ptr.h" +#include "src/core/lib/gprpp/string_view.h" #include "src/core/lib/gprpp/sync.h" #include "src/core/lib/iomgr/sockaddr.h" #include "src/core/lib/iomgr/sockaddr_utils.h" @@ -254,8 +255,8 @@ class XdsClient::ChannelState::AdsCallState bool IsCurrentCallOnChannel() const; - std::set ClusterNamesForRequest(); - std::set EdsServiceNamesForRequest(); + std::set ClusterNamesForRequest(); + std::set EdsServiceNamesForRequest(); // The owning RetryableCall<>. RefCountedPtr> parent_; @@ -802,7 +803,7 @@ void XdsClient::ChannelState::AdsCallState::SendMessageLocked( } auto& state = state_map_[type_url]; grpc_slice request_payload_slice; - std::set resource_names; + std::set resource_names; if (type_url == XdsApi::kLdsTypeUrl) { resource_names.insert(xds_client()->server_name_); request_payload_slice = xds_client()->api_.CreateLdsRequest( @@ -1345,9 +1346,9 @@ bool XdsClient::ChannelState::AdsCallState::IsCurrentCallOnChannel() const { return this == chand()->ads_calld_->calld(); } -std::set +std::set XdsClient::ChannelState::AdsCallState::ClusterNamesForRequest() { - std::set cluster_names; + std::set cluster_names; for (auto& p : state_map_[XdsApi::kCdsTypeUrl].subscribed_resources) { cluster_names.insert(p.first); OrphanablePtr& state = p.second; @@ -1356,9 +1357,9 @@ XdsClient::ChannelState::AdsCallState::ClusterNamesForRequest() { return cluster_names; } -std::set +std::set XdsClient::ChannelState::AdsCallState::EdsServiceNamesForRequest() { - std::set eds_names; + std::set eds_names; for (auto& p : state_map_[XdsApi::kEdsTypeUrl].subscribed_resources) { eds_names.insert(p.first); OrphanablePtr& state = p.second; @@ -1800,7 +1801,7 @@ bool GetXdsRoutingEnabled(const grpc_channel_args& args) { XdsClient::XdsClient(std::shared_ptr work_serializer, grpc_pollset_set* interested_parties, - StringView server_name, + absl::string_view server_name, std::unique_ptr watcher, const grpc_channel_args& channel_args, grpc_error** error) : InternallyRefCounted(&grpc_xds_client_trace), @@ -1867,7 +1868,8 @@ void XdsClient::Orphan() { } void XdsClient::WatchClusterData( - StringView cluster_name, std::unique_ptr watcher) { + absl::string_view cluster_name, + std::unique_ptr watcher) { std::string cluster_name_str = std::string(cluster_name); ClusterState& cluster_state = cluster_map_[cluster_name_str]; ClusterWatcherInterface* w = watcher.get(); @@ -1884,7 +1886,7 @@ void XdsClient::WatchClusterData( chand_->Subscribe(XdsApi::kCdsTypeUrl, cluster_name_str); } -void XdsClient::CancelClusterDataWatch(StringView cluster_name, +void XdsClient::CancelClusterDataWatch(absl::string_view cluster_name, ClusterWatcherInterface* watcher, bool delay_unsubscription) { if (shutting_down_) return; @@ -1902,7 +1904,7 @@ void XdsClient::CancelClusterDataWatch(StringView cluster_name, } void XdsClient::WatchEndpointData( - StringView eds_service_name, + absl::string_view eds_service_name, std::unique_ptr watcher) { std::string eds_service_name_str = std::string(eds_service_name); EndpointState& endpoint_state = endpoint_map_[eds_service_name_str]; @@ -1920,7 +1922,7 @@ void XdsClient::WatchEndpointData( chand_->Subscribe(XdsApi::kEdsTypeUrl, eds_service_name_str); } -void XdsClient::CancelEndpointDataWatch(StringView eds_service_name, +void XdsClient::CancelEndpointDataWatch(absl::string_view eds_service_name, EndpointWatcherInterface* watcher, bool delay_unsubscription) { if (shutting_down_) return; @@ -1938,13 +1940,13 @@ void XdsClient::CancelEndpointDataWatch(StringView eds_service_name, } RefCountedPtr XdsClient::AddClusterDropStats( - StringView lrs_server, StringView cluster_name, - StringView eds_service_name) { + absl::string_view lrs_server, absl::string_view cluster_name, + absl::string_view eds_service_name) { // TODO(roth): When we add support for direct federation, use the // server name specified in lrs_server. auto key = std::make_pair(std::string(cluster_name), std::string(eds_service_name)); - // We jump through some hoops here to make sure that the StringViews + // We jump through some hoops here to make sure that the absl::string_views // stored in the XdsClusterDropStats object point to the strings // in the load_report_map_ key, so that they have the same lifetime. auto it = load_report_map_ @@ -1959,8 +1961,9 @@ RefCountedPtr XdsClient::AddClusterDropStats( } void XdsClient::RemoveClusterDropStats( - StringView /*lrs_server*/, StringView cluster_name, - StringView eds_service_name, XdsClusterDropStats* cluster_drop_stats) { + absl::string_view /*lrs_server*/, absl::string_view cluster_name, + absl::string_view eds_service_name, + XdsClusterDropStats* cluster_drop_stats) { auto load_report_it = load_report_map_.find( std::make_pair(std::string(cluster_name), std::string(eds_service_name))); if (load_report_it == load_report_map_.end()) return; @@ -1979,13 +1982,14 @@ void XdsClient::RemoveClusterDropStats( } RefCountedPtr XdsClient::AddClusterLocalityStats( - StringView lrs_server, StringView cluster_name, StringView eds_service_name, + absl::string_view lrs_server, absl::string_view cluster_name, + absl::string_view eds_service_name, RefCountedPtr locality) { // TODO(roth): When we add support for direct federation, use the // server name specified in lrs_server. auto key = std::make_pair(std::string(cluster_name), std::string(eds_service_name)); - // We jump through some hoops here to make sure that the StringViews + // We jump through some hoops here to make sure that the absl::string_views // stored in the XdsClusterLocalityStats object point to the strings // in the load_report_map_ key, so that they have the same lifetime. auto it = load_report_map_ @@ -2002,8 +2006,9 @@ RefCountedPtr XdsClient::AddClusterLocalityStats( } void XdsClient::RemoveClusterLocalityStats( - StringView /*lrs_server*/, StringView cluster_name, - StringView eds_service_name, const RefCountedPtr& locality, + absl::string_view /*lrs_server*/, absl::string_view cluster_name, + absl::string_view eds_service_name, + const RefCountedPtr& locality, XdsClusterLocalityStats* cluster_locality_stats) { auto load_report_it = load_report_map_.find( std::make_pair(std::string(cluster_name), std::string(eds_service_name))); diff --git a/src/core/ext/filters/client_channel/xds/xds_client.h b/src/core/ext/filters/client_channel/xds/xds_client.h index 267a0fe9e19..2b0e3281b86 100644 --- a/src/core/ext/filters/client_channel/xds/xds_client.h +++ b/src/core/ext/filters/client_channel/xds/xds_client.h @@ -21,6 +21,7 @@ #include +#include "absl/strings/string_view.h" #include "absl/types/optional.h" #include "src/core/ext/filters/client_channel/service_config.h" @@ -32,7 +33,6 @@ #include "src/core/lib/gprpp/orphanable.h" #include "src/core/lib/gprpp/ref_counted.h" #include "src/core/lib/gprpp/ref_counted_ptr.h" -#include "src/core/lib/gprpp/string_view.h" #include "src/core/lib/iomgr/work_serializer.h" namespace grpc_core { @@ -75,7 +75,7 @@ class XdsClient : public InternallyRefCounted { // If *error is not GRPC_ERROR_NONE after construction, then there was // an error initializing the client. XdsClient(std::shared_ptr work_serializer, - grpc_pollset_set* interested_parties, StringView server_name, + grpc_pollset_set* interested_parties, absl::string_view server_name, std::unique_ptr watcher, const grpc_channel_args& channel_args, grpc_error** error); ~XdsClient(); @@ -89,9 +89,9 @@ class XdsClient : public InternallyRefCounted { // pointer must not be used for any other purpose.) // If the caller is going to start a new watch after cancelling the // old one, it should set delay_unsubscription to true. - void WatchClusterData(StringView cluster_name, + void WatchClusterData(absl::string_view cluster_name, std::unique_ptr watcher); - void CancelClusterDataWatch(StringView cluster_name, + void CancelClusterDataWatch(absl::string_view cluster_name, ClusterWatcherInterface* watcher, bool delay_unsubscription = false); @@ -102,29 +102,30 @@ class XdsClient : public InternallyRefCounted { // pointer must not be used for any other purpose.) // If the caller is going to start a new watch after cancelling the // old one, it should set delay_unsubscription to true. - void WatchEndpointData(StringView eds_service_name, + void WatchEndpointData(absl::string_view eds_service_name, std::unique_ptr watcher); - void CancelEndpointDataWatch(StringView eds_service_name, + void CancelEndpointDataWatch(absl::string_view eds_service_name, EndpointWatcherInterface* watcher, bool delay_unsubscription = false); // Adds and removes drop stats for cluster_name and eds_service_name. RefCountedPtr AddClusterDropStats( - StringView lrs_server, StringView cluster_name, - StringView eds_service_name); - void RemoveClusterDropStats(StringView /*lrs_server*/, - StringView cluster_name, - StringView eds_service_name, + absl::string_view lrs_server, absl::string_view cluster_name, + absl::string_view eds_service_name); + void RemoveClusterDropStats(absl::string_view /*lrs_server*/, + absl::string_view cluster_name, + absl::string_view eds_service_name, XdsClusterDropStats* cluster_drop_stats); // Adds and removes locality stats for cluster_name and eds_service_name // for the specified locality. RefCountedPtr AddClusterLocalityStats( - StringView lrs_server, StringView cluster_name, - StringView eds_service_name, RefCountedPtr locality); + absl::string_view lrs_server, absl::string_view cluster_name, + absl::string_view eds_service_name, + RefCountedPtr locality); void RemoveClusterLocalityStats( - StringView /*lrs_server*/, StringView cluster_name, - StringView eds_service_name, + absl::string_view /*lrs_server*/, absl::string_view cluster_name, + absl::string_view eds_service_name, const RefCountedPtr& locality, XdsClusterLocalityStats* cluster_locality_stats); diff --git a/src/core/ext/filters/client_channel/xds/xds_client_stats.cc b/src/core/ext/filters/client_channel/xds/xds_client_stats.cc index cf115603450..1cfac0a0d30 100644 --- a/src/core/ext/filters/client_channel/xds/xds_client_stats.cc +++ b/src/core/ext/filters/client_channel/xds/xds_client_stats.cc @@ -34,9 +34,9 @@ namespace grpc_core { // XdsClusterDropStats::XdsClusterDropStats(RefCountedPtr xds_client, - StringView lrs_server_name, - StringView cluster_name, - StringView eds_service_name) + absl::string_view lrs_server_name, + absl::string_view cluster_name, + absl::string_view eds_service_name) : xds_client_(std::move(xds_client)), lrs_server_name_(lrs_server_name), cluster_name_(cluster_name), @@ -64,8 +64,8 @@ void XdsClusterDropStats::AddCallDropped(const std::string& category) { // XdsClusterLocalityStats::XdsClusterLocalityStats( - RefCountedPtr xds_client, StringView lrs_server_name, - StringView cluster_name, StringView eds_service_name, + RefCountedPtr xds_client, absl::string_view lrs_server_name, + absl::string_view cluster_name, absl::string_view eds_service_name, RefCountedPtr name) : xds_client_(std::move(xds_client)), lrs_server_name_(lrs_server_name), diff --git a/src/core/ext/filters/client_channel/xds/xds_client_stats.h b/src/core/ext/filters/client_channel/xds/xds_client_stats.h index 7a358d47b91..b977bd9b7df 100644 --- a/src/core/ext/filters/client_channel/xds/xds_client_stats.h +++ b/src/core/ext/filters/client_channel/xds/xds_client_stats.h @@ -99,8 +99,9 @@ class XdsClusterDropStats : public RefCounted { using DroppedRequestsMap = std::map; XdsClusterDropStats(RefCountedPtr xds_client, - StringView lrs_server_name, StringView cluster_name, - StringView eds_service_name); + absl::string_view lrs_server_name, + absl::string_view cluster_name, + absl::string_view eds_service_name); ~XdsClusterDropStats(); // Returns a snapshot of this instance and resets all the counters. @@ -110,9 +111,9 @@ class XdsClusterDropStats : public RefCounted { private: RefCountedPtr xds_client_; - StringView lrs_server_name_; - StringView cluster_name_; - StringView eds_service_name_; + absl::string_view lrs_server_name_; + absl::string_view cluster_name_; + absl::string_view eds_service_name_; // Protects dropped_requests_. A mutex is necessary because the length of // dropped_requests_ can be accessed by both the picker (from data plane // mutex) and the load reporting thread (from the control plane combiner). @@ -170,8 +171,9 @@ class XdsClusterLocalityStats : public RefCounted { }; XdsClusterLocalityStats(RefCountedPtr xds_client, - StringView lrs_server_name, StringView cluster_name, - StringView eds_service_name, + absl::string_view lrs_server_name, + absl::string_view cluster_name, + absl::string_view eds_service_name, RefCountedPtr name); ~XdsClusterLocalityStats(); @@ -183,9 +185,9 @@ class XdsClusterLocalityStats : public RefCounted { private: RefCountedPtr xds_client_; - StringView lrs_server_name_; - StringView cluster_name_; - StringView eds_service_name_; + absl::string_view lrs_server_name_; + absl::string_view cluster_name_; + absl::string_view eds_service_name_; RefCountedPtr name_; Atomic total_successful_requests_{0}; diff --git a/src/core/lib/gprpp/host_port.cc b/src/core/lib/gprpp/host_port.cc index d5aa6e1f64e..4a3efc38b30 100644 --- a/src/core/lib/gprpp/host_port.cc +++ b/src/core/lib/gprpp/host_port.cc @@ -22,6 +22,8 @@ #include +#include "absl/strings/string_view.h" + #include #include #include @@ -45,19 +47,19 @@ int JoinHostPort(grpc_core::UniquePtr* out, const char* host, int port) { } namespace { -bool DoSplitHostPort(StringView name, StringView* host, StringView* port, - bool* has_port) { +bool DoSplitHostPort(absl::string_view name, absl::string_view* host, + absl::string_view* port, bool* has_port) { *has_port = false; if (!name.empty() && name[0] == '[') { /* Parse a bracketed host, typically an IPv6 literal. */ const size_t rbracket = name.find(']', 1); - if (rbracket == grpc_core::StringView::npos) { + if (rbracket == absl::string_view::npos) { /* Unmatched [ */ return false; } if (rbracket == name.size() - 1) { /* ] */ - *port = StringView(); + *port = absl::string_view(); } else if (name[rbracket + 1] == ':') { /* ]: */ *port = name.substr(rbracket + 2, name.size() - rbracket - 2); @@ -67,16 +69,16 @@ bool DoSplitHostPort(StringView name, StringView* host, StringView* port, return false; } *host = name.substr(1, rbracket - 1); - if (host->find(':') == grpc_core::StringView::npos) { + if (host->find(':') == absl::string_view::npos) { /* Require all bracketed hosts to contain a colon, because a hostname or IPv4 address should never use brackets. */ - *host = StringView(); + *host = absl::string_view(); return false; } } else { size_t colon = name.find(':'); - if (colon != grpc_core::StringView::npos && - name.find(':', colon + 1) == grpc_core::StringView::npos) { + if (colon != absl::string_view::npos && + name.find(':', colon + 1) == absl::string_view::npos) { /* Exactly 1 colon. Split into host:port. */ *host = name.substr(0, colon); *port = name.substr(colon + 1, name.size() - colon - 1); @@ -84,24 +86,25 @@ bool DoSplitHostPort(StringView name, StringView* host, StringView* port, } else { /* 0 or 2+ colons. Bare hostname or IPv6 litearal. */ *host = name; - *port = StringView(); + *port = absl::string_view(); } } return true; } } // namespace -bool SplitHostPort(StringView name, StringView* host, StringView* port) { +bool SplitHostPort(absl::string_view name, absl::string_view* host, + absl::string_view* port) { bool unused; return DoSplitHostPort(name, host, port, &unused); } -bool SplitHostPort(StringView name, grpc_core::UniquePtr* host, +bool SplitHostPort(absl::string_view name, grpc_core::UniquePtr* host, grpc_core::UniquePtr* port) { GPR_DEBUG_ASSERT(host != nullptr && *host == nullptr); GPR_DEBUG_ASSERT(port != nullptr && *port == nullptr); - StringView host_view; - StringView port_view; + absl::string_view host_view; + absl::string_view port_view; bool has_port; const bool ret = DoSplitHostPort(name, &host_view, &port_view, &has_port); if (ret) { diff --git a/src/core/lib/gprpp/host_port.h b/src/core/lib/gprpp/host_port.h index c692f99ed13..de397f7f3fa 100644 --- a/src/core/lib/gprpp/host_port.h +++ b/src/core/lib/gprpp/host_port.h @@ -21,8 +21,9 @@ #include +#include "absl/strings/string_view.h" + #include "src/core/lib/gprpp/memory.h" -#include "src/core/lib/gprpp/string_view.h" namespace grpc_core { @@ -41,7 +42,7 @@ int JoinHostPort(grpc_core::UniquePtr* out, const char* host, int port); and port number. There are two variants of this method: - 1) StringView output: port and host are returned as views on name. + 1) absl::string_view output: port and host are returned as views on name. 2) char* output: port and host are copied into newly allocated strings. Prefer variant (1) over (2), because no allocation or copy is performed in @@ -50,8 +51,9 @@ int JoinHostPort(grpc_core::UniquePtr* out, const char* host, int port); Return true on success, false on failure. Guarantees *host and *port are cleared on failure. */ -bool SplitHostPort(StringView name, StringView* host, StringView* port); -bool SplitHostPort(StringView name, grpc_core::UniquePtr* host, +bool SplitHostPort(absl::string_view name, absl::string_view* host, + absl::string_view* port); +bool SplitHostPort(absl::string_view name, grpc_core::UniquePtr* host, grpc_core::UniquePtr* port); } // namespace grpc_core diff --git a/src/core/lib/gprpp/map.h b/src/core/lib/gprpp/map.h index f14f3f6fc84..51778c02892 100644 --- a/src/core/lib/gprpp/map.h +++ b/src/core/lib/gprpp/map.h @@ -38,7 +38,8 @@ struct StringLess { const grpc_core::UniquePtr& b) const { return strcmp(a.get(), b.get()) < 0; } - bool operator()(const StringView& a, const StringView& b) const { + bool operator()(const absl::string_view& a, + const absl::string_view& b) const { const size_t min_size = std::min(a.size(), b.size()); int c = strncmp(a.data(), b.data(), min_size); if (c != 0) return c < 0; diff --git a/src/core/lib/gprpp/string_view.h b/src/core/lib/gprpp/string_view.h index bd4724bc1e9..0b8cf311354 100644 --- a/src/core/lib/gprpp/string_view.h +++ b/src/core/lib/gprpp/string_view.h @@ -37,18 +37,10 @@ namespace grpc_core { -using StringView = absl::string_view; - -// Converts grpc_slice to StringView. -inline absl::string_view StringViewFromSlice(const grpc_slice& slice) { - return absl::string_view( - reinterpret_cast(GRPC_SLICE_START_PTR(slice)), - GRPC_SLICE_LENGTH(slice)); -} - // Creates a dup of the string viewed by this class. // Return value is null-terminated and never nullptr. -inline grpc_core::UniquePtr StringViewToCString(const StringView sv) { +inline grpc_core::UniquePtr StringViewToCString( + const absl::string_view sv) { char* str = static_cast(gpr_malloc(sv.size() + 1)); if (sv.size() > 0) memcpy(str, sv.data(), sv.size()); str[sv.size()] = '\0'; diff --git a/src/core/lib/http/httpcli_security_connector.cc b/src/core/lib/http/httpcli_security_connector.cc index 3d95cdfea9a..92f3c45b0df 100644 --- a/src/core/lib/http/httpcli_security_connector.cc +++ b/src/core/lib/http/httpcli_security_connector.cc @@ -22,6 +22,8 @@ #include +#include "absl/strings/string_view.h" + #include #include #include @@ -30,7 +32,6 @@ #include "src/core/lib/channel/handshaker_registry.h" #include "src/core/lib/gpr/string.h" #include "src/core/lib/gprpp/ref_counted_ptr.h" -#include "src/core/lib/gprpp/string_view.h" #include "src/core/lib/iomgr/pollset.h" #include "src/core/lib/security/credentials/credentials.h" #include "src/core/lib/security/security_connector/ssl_utils.h" @@ -111,7 +112,7 @@ class grpc_httpcli_ssl_channel_security_connector final return strcmp(secure_peer_name_, other->secure_peer_name_); } - bool check_call_host(grpc_core::StringView /*host*/, + bool check_call_host(absl::string_view /*host*/, grpc_auth_context* /*auth_context*/, grpc_closure* /*on_call_host_checked*/, grpc_error** error) override { diff --git a/src/core/lib/json/json.h b/src/core/lib/json/json.h index a949ae502b1..8e26a462a62 100644 --- a/src/core/lib/json/json.h +++ b/src/core/lib/json/json.h @@ -27,7 +27,8 @@ #include #include -#include "src/core/lib/gprpp/string_view.h" +#include "absl/strings/string_view.h" + #include "src/core/lib/iomgr/error.h" namespace grpc_core { @@ -55,7 +56,7 @@ class Json { using Array = std::vector; // Parses JSON string from json_str. On error, sets *error. - static Json Parse(StringView json_str, grpc_error** error); + static Json Parse(absl::string_view json_str, grpc_error** error); Json() = default; diff --git a/src/core/lib/json/json_reader.cc b/src/core/lib/json/json_reader.cc index 6a1aaa33687..208e9721db4 100644 --- a/src/core/lib/json/json_reader.cc +++ b/src/core/lib/json/json_reader.cc @@ -34,7 +34,7 @@ namespace { class JsonReader { public: - static grpc_error* Parse(StringView input, Json* output); + static grpc_error* Parse(absl::string_view input, Json* output); private: enum class Status { @@ -80,7 +80,7 @@ class JsonReader { */ static constexpr uint32_t GRPC_JSON_READ_CHAR_EOF = 0x7ffffff0; - explicit JsonReader(StringView input) + explicit JsonReader(absl::string_view input) : original_input_(reinterpret_cast(input.data())), input_(original_input_), remaining_input_(input.size()) {} @@ -815,7 +815,7 @@ JsonReader::Status JsonReader::Run() { GPR_UNREACHABLE_CODE(return Status::GRPC_JSON_INTERNAL_ERROR); } -grpc_error* JsonReader::Parse(StringView input, Json* output) { +grpc_error* JsonReader::Parse(absl::string_view input, Json* output) { JsonReader reader(input); Status status = reader.Run(); if (reader.truncated_errors_) { @@ -846,7 +846,7 @@ grpc_error* JsonReader::Parse(StringView input, Json* output) { } // namespace -Json Json::Parse(StringView json_str, grpc_error** error) { +Json Json::Parse(absl::string_view json_str, grpc_error** error) { Json value; *error = JsonReader::Parse(json_str, &value); return value; diff --git a/src/core/lib/json/json_writer.cc b/src/core/lib/json/json_writer.cc index 3f371902f88..6235a3d2b4d 100644 --- a/src/core/lib/json/json_writer.cc +++ b/src/core/lib/json/json_writer.cc @@ -21,13 +21,13 @@ #include #include +#include "absl/strings/string_view.h" + #include #include #include "src/core/lib/json/json.h" -#include "src/core/lib/gprpp/string_view.h" - namespace grpc_core { namespace { @@ -52,7 +52,7 @@ class JsonWriter { void OutputCheck(size_t needed); void OutputChar(char c); - void OutputString(const StringView str); + void OutputString(const absl::string_view str); void OutputIndent(); void ValueEnd(); void EscapeUtf16(uint16_t utf16); @@ -92,7 +92,7 @@ void JsonWriter::OutputChar(char c) { output_.push_back(c); } -void JsonWriter::OutputString(const StringView str) { +void JsonWriter::OutputString(const absl::string_view str) { OutputCheck(str.size()); output_.append(str.data(), str.size()); } @@ -110,11 +110,12 @@ void JsonWriter::OutputIndent() { return; } while (spaces >= (sizeof(spacesstr) - 1)) { - OutputString(StringView(spacesstr, sizeof(spacesstr) - 1)); + OutputString(absl::string_view(spacesstr, sizeof(spacesstr) - 1)); spaces -= static_cast(sizeof(spacesstr) - 1); } if (spaces == 0) return; - OutputString(StringView(spacesstr + sizeof(spacesstr) - 1 - spaces, spaces)); + OutputString( + absl::string_view(spacesstr + sizeof(spacesstr) - 1 - spaces, spaces)); } void JsonWriter::ValueEnd() { @@ -131,7 +132,7 @@ void JsonWriter::ValueEnd() { void JsonWriter::EscapeUtf16(uint16_t utf16) { static const char hex[] = "0123456789abcdef"; - OutputString(StringView("\\u", 2)); + OutputString(absl::string_view("\\u", 2)); OutputChar(hex[(utf16 >> 12) & 0x0f]); OutputChar(hex[(utf16 >> 8) & 0x0f]); OutputChar(hex[(utf16 >> 4) & 0x0f]); @@ -150,19 +151,19 @@ void JsonWriter::EscapeString(const std::string& string) { } else if (c < 32 || c == 127) { switch (c) { case '\b': - OutputString(StringView("\\b", 2)); + OutputString(absl::string_view("\\b", 2)); break; case '\f': - OutputString(StringView("\\f", 2)); + OutputString(absl::string_view("\\f", 2)); break; case '\n': - OutputString(StringView("\\n", 2)); + OutputString(absl::string_view("\\n", 2)); break; case '\r': - OutputString(StringView("\\r", 2)); + OutputString(absl::string_view("\\r", 2)); break; case '\t': - OutputString(StringView("\\t", 2)); + OutputString(absl::string_view("\\t", 2)); break; default: EscapeUtf16(c); diff --git a/src/core/lib/security/credentials/google_default/google_default_credentials.cc b/src/core/lib/security/credentials/google_default/google_default_credentials.cc index 58e550ed694..8bf61c221ef 100644 --- a/src/core/lib/security/credentials/google_default/google_default_credentials.cc +++ b/src/core/lib/security/credentials/google_default/google_default_credentials.cc @@ -224,17 +224,13 @@ static grpc_error* create_default_creds_from_path( grpc_slice creds_data = grpc_empty_slice(); grpc_error* error = GRPC_ERROR_NONE; Json json; - grpc_core::StringView str; if (creds_path == nullptr) { error = GRPC_ERROR_CREATE_FROM_STATIC_STRING("creds_path unset"); goto end; } error = grpc_load_file(creds_path, 0, &creds_data); if (error != GRPC_ERROR_NONE) goto end; - str = grpc_core::StringView( - reinterpret_cast(GRPC_SLICE_START_PTR(creds_data)), - GRPC_SLICE_LENGTH(creds_data)); - json = Json::Parse(str, &error); + json = Json::Parse(grpc_core::StringViewFromSlice(creds_data), &error); if (error != GRPC_ERROR_NONE) goto end; if (json.type() != Json::Type::OBJECT) { error = grpc_error_set_str( diff --git a/src/core/lib/security/credentials/jwt/jwt_verifier.cc b/src/core/lib/security/credentials/jwt/jwt_verifier.cc index 1d082b258c7..a2ea9132193 100644 --- a/src/core/lib/security/credentials/jwt/jwt_verifier.cc +++ b/src/core/lib/security/credentials/jwt/jwt_verifier.cc @@ -86,9 +86,7 @@ static Json parse_json_part_from_jwt(const char* str, size_t len) { gpr_log(GPR_ERROR, "Invalid base64."); return Json(); // JSON null } - grpc_core::StringView string( - reinterpret_cast(GRPC_SLICE_START_PTR(slice)), - GRPC_SLICE_LENGTH(slice)); + absl::string_view string = grpc_core::StringViewFromSlice(slice); grpc_error* error = GRPC_ERROR_NONE; Json json = Json::Parse(string, &error); if (error != GRPC_ERROR_NONE) { @@ -418,7 +416,7 @@ static Json json_from_http(const grpc_httpcli_response* response) { } grpc_error* error = GRPC_ERROR_NONE; Json json = Json::Parse( - grpc_core::StringView(response->body, response->body_length), &error); + absl::string_view(response->body, response->body_length), &error); if (error != GRPC_ERROR_NONE) { gpr_log(GPR_ERROR, "Invalid JSON found in response."); return Json(); // JSON null diff --git a/src/core/lib/security/security_connector/alts/alts_security_connector.cc b/src/core/lib/security/security_connector/alts/alts_security_connector.cc index 6bfe6ea74c3..47c357f8fab 100644 --- a/src/core/lib/security/security_connector/alts/alts_security_connector.cc +++ b/src/core/lib/security/security_connector/alts/alts_security_connector.cc @@ -111,7 +111,7 @@ class grpc_alts_channel_security_connector final return strcmp(target_name_, other->target_name_); } - bool check_call_host(grpc_core::StringView host, + bool check_call_host(absl::string_view host, grpc_auth_context* /*auth_context*/, grpc_closure* /*on_call_host_checked*/, grpc_error** error) override { diff --git a/src/core/lib/security/security_connector/fake/fake_security_connector.cc b/src/core/lib/security/security_connector/fake/fake_security_connector.cc index 7a81e68d618..f0f515c53e1 100644 --- a/src/core/lib/security/security_connector/fake/fake_security_connector.cc +++ b/src/core/lib/security/security_connector/fake/fake_security_connector.cc @@ -103,20 +103,20 @@ class grpc_fake_channel_security_connector final tsi_create_fake_handshaker(/*is_client=*/true), this, args)); } - bool check_call_host(grpc_core::StringView host, + bool check_call_host(absl::string_view host, grpc_auth_context* /*auth_context*/, grpc_closure* /*on_call_host_checked*/, grpc_error** /*error*/) override { - grpc_core::StringView authority_hostname; - grpc_core::StringView authority_ignored_port; - grpc_core::StringView target_hostname; - grpc_core::StringView target_ignored_port; + absl::string_view authority_hostname; + absl::string_view authority_ignored_port; + absl::string_view target_hostname; + absl::string_view target_ignored_port; grpc_core::SplitHostPort(host, &authority_hostname, &authority_ignored_port); grpc_core::SplitHostPort(target_, &target_hostname, &target_ignored_port); if (target_name_override_ != nullptr) { - grpc_core::StringView fake_security_target_name_override_hostname; - grpc_core::StringView fake_security_target_name_override_ignored_port; + absl::string_view fake_security_target_name_override_hostname; + absl::string_view fake_security_target_name_override_ignored_port; grpc_core::SplitHostPort( target_name_override_, &fake_security_target_name_override_hostname, &fake_security_target_name_override_ignored_port); diff --git a/src/core/lib/security/security_connector/local/local_security_connector.cc b/src/core/lib/security/security_connector/local/local_security_connector.cc index f2e4e0c36d9..585c170e937 100644 --- a/src/core/lib/security/security_connector/local/local_security_connector.cc +++ b/src/core/lib/security/security_connector/local/local_security_connector.cc @@ -181,7 +181,7 @@ class grpc_local_channel_security_connector final creds->connect_type()); } - bool check_call_host(grpc_core::StringView host, + bool check_call_host(absl::string_view host, grpc_auth_context* /*auth_context*/, grpc_closure* /*on_call_host_checked*/, grpc_error** error) override { diff --git a/src/core/lib/security/security_connector/security_connector.h b/src/core/lib/security/security_connector/security_connector.h index 32033ec5c92..0f1ac64a44f 100644 --- a/src/core/lib/security/security_connector/security_connector.h +++ b/src/core/lib/security/security_connector/security_connector.h @@ -98,7 +98,7 @@ class grpc_channel_security_connector : public grpc_security_connector { /// Returns true if completed synchronously, in which case \a error will /// be set to indicate the result. Otherwise, \a on_call_host_checked /// will be invoked when complete. - virtual bool check_call_host(grpc_core::StringView host, + virtual bool check_call_host(absl::string_view host, grpc_auth_context* auth_context, grpc_closure* on_call_host_checked, grpc_error** error) = 0; diff --git a/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc b/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc index 13180724cdc..54f538c9032 100644 --- a/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +++ b/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc @@ -31,6 +31,7 @@ #include "src/core/lib/gpr/string.h" #include "src/core/lib/gprpp/host_port.h" #include "src/core/lib/gprpp/ref_counted_ptr.h" +#include "src/core/lib/gprpp/string_view.h" #include "src/core/lib/security/context/security_context.h" #include "src/core/lib/security/credentials/credentials.h" #include "src/core/lib/security/credentials/ssl/ssl_credentials.h" @@ -76,8 +77,8 @@ class grpc_ssl_channel_security_connector final ? nullptr : gpr_strdup(overridden_target_name)), verify_options_(&config->verify_options) { - grpc_core::StringView host; - grpc_core::StringView port; + absl::string_view host; + absl::string_view port; grpc_core::SplitHostPort(target_name, &host, &port); target_name_ = grpc_core::StringViewToCString(host); } @@ -186,8 +187,7 @@ class grpc_ssl_channel_security_connector final other->overridden_target_name_.get()); } - bool check_call_host(grpc_core::StringView host, - grpc_auth_context* auth_context, + bool check_call_host(absl::string_view host, grpc_auth_context* auth_context, grpc_closure* /*on_call_host_checked*/, grpc_error** error) override { return grpc_ssl_check_call_host( diff --git a/src/core/lib/security/security_connector/ssl_utils.cc b/src/core/lib/security/security_connector/ssl_utils.cc index 2a3f3005ab2..4f043c35c07 100644 --- a/src/core/lib/security/security_connector/ssl_utils.cc +++ b/src/core/lib/security/security_connector/ssl_utils.cc @@ -149,7 +149,7 @@ grpc_error* grpc_ssl_check_alpn(const tsi_peer* peer) { return GRPC_ERROR_NONE; } -grpc_error* grpc_ssl_check_peer_name(grpc_core::StringView peer_name, +grpc_error* grpc_ssl_check_peer_name(absl::string_view peer_name, const tsi_peer* peer) { /* Check the peer name if specified. */ if (!peer_name.empty() && !grpc_ssl_host_matches_name(peer, peer_name)) { @@ -163,9 +163,9 @@ grpc_error* grpc_ssl_check_peer_name(grpc_core::StringView peer_name, return GRPC_ERROR_NONE; } -bool grpc_ssl_check_call_host(grpc_core::StringView host, - grpc_core::StringView target_name, - grpc_core::StringView overridden_target_name, +bool grpc_ssl_check_call_host(absl::string_view host, + absl::string_view target_name, + absl::string_view overridden_target_name, grpc_auth_context* auth_context, grpc_error** error) { grpc_security_status status = GRPC_SECURITY_ERROR; @@ -197,24 +197,24 @@ const char** grpc_fill_alpn_protocol_strings(size_t* num_alpn_protocols) { } int grpc_ssl_host_matches_name(const tsi_peer* peer, - grpc_core::StringView peer_name) { - grpc_core::StringView allocated_name; - grpc_core::StringView ignored_port; + absl::string_view peer_name) { + absl::string_view allocated_name; + absl::string_view ignored_port; grpc_core::SplitHostPort(peer_name, &allocated_name, &ignored_port); if (allocated_name.empty()) return 0; // IPv6 zone-id should not be included in comparisons. const size_t zone_id = allocated_name.find('%'); - if (zone_id != grpc_core::StringView::npos) { + if (zone_id != absl::string_view::npos) { allocated_name.remove_suffix(allocated_name.size() - zone_id); } return tsi_ssl_peer_matches_name(peer, allocated_name); } -int grpc_ssl_cmp_target_name( - grpc_core::StringView target_name, grpc_core::StringView other_target_name, - grpc_core::StringView overridden_target_name, - grpc_core::StringView other_overridden_target_name) { +int grpc_ssl_cmp_target_name(absl::string_view target_name, + absl::string_view other_target_name, + absl::string_view overridden_target_name, + absl::string_view other_overridden_target_name) { int c = target_name.compare(other_target_name); if (c != 0) return c; return overridden_target_name.compare(other_overridden_target_name); diff --git a/src/core/lib/security/security_connector/ssl_utils.h b/src/core/lib/security/security_connector/ssl_utils.h index c521b1f6c60..abbb4e953bf 100644 --- a/src/core/lib/security/security_connector/ssl_utils.h +++ b/src/core/lib/security/security_connector/ssl_utils.h @@ -23,12 +23,13 @@ #include +#include "absl/strings/string_view.h" + #include #include #include "src/core/lib/gprpp/global_config.h" #include "src/core/lib/gprpp/ref_counted_ptr.h" -#include "src/core/lib/gprpp/string_view.h" #include "src/core/lib/iomgr/error.h" #include "src/core/lib/security/security_connector/security_connector.h" #include "src/core/lib/security/security_connector/ssl_utils_config.h" @@ -45,17 +46,17 @@ grpc_error* grpc_ssl_check_alpn(const tsi_peer* peer); /* Check peer name information returned from SSL handshakes. */ -grpc_error* grpc_ssl_check_peer_name(grpc_core::StringView peer_name, +grpc_error* grpc_ssl_check_peer_name(absl::string_view peer_name, const tsi_peer* peer); /* Compare targer_name information extracted from SSL security connectors. */ -int grpc_ssl_cmp_target_name( - grpc_core::StringView target_name, grpc_core::StringView other_target_name, - grpc_core::StringView overridden_target_name, - grpc_core::StringView other_overridden_target_name); +int grpc_ssl_cmp_target_name(absl::string_view target_name, + absl::string_view other_target_name, + absl::string_view overridden_target_name, + absl::string_view other_overridden_target_name); /* Check the host that will be set for a call is acceptable.*/ -bool grpc_ssl_check_call_host(grpc_core::StringView host, - grpc_core::StringView target_name, - grpc_core::StringView overridden_target_name, +bool grpc_ssl_check_call_host(absl::string_view host, + absl::string_view target_name, + absl::string_view overridden_target_name, grpc_auth_context* auth_context, grpc_error** error); /* Return HTTP2-compliant cipher suites that gRPC accepts by default. */ @@ -101,7 +102,7 @@ tsi_peer grpc_shallow_peer_from_ssl_auth_context( const grpc_auth_context* auth_context); void grpc_shallow_peer_destruct(tsi_peer* peer); int grpc_ssl_host_matches_name(const tsi_peer* peer, - grpc_core::StringView peer_name); + absl::string_view peer_name); /* --- Default SSL Root Store. --- */ namespace grpc_core { diff --git a/src/core/lib/security/security_connector/tls/tls_security_connector.cc b/src/core/lib/security/security_connector/tls/tls_security_connector.cc index ca361aa074f..4c142e2edfb 100644 --- a/src/core/lib/security/security_connector/tls/tls_security_connector.cc +++ b/src/core/lib/security/security_connector/tls/tls_security_connector.cc @@ -29,6 +29,7 @@ #include #include "src/core/lib/gprpp/host_port.h" +#include "src/core/lib/gprpp/string_view.h" #include "src/core/lib/security/credentials/ssl/ssl_credentials.h" #include "src/core/lib/security/credentials/tls/tls_credentials.h" #include "src/core/lib/security/security_connector/ssl_utils.h" @@ -149,10 +150,10 @@ TlsChannelSecurityConnector::TlsChannelSecurityConnector( : gpr_strdup(overridden_target_name)) { key_materials_config_ = grpc_tls_key_materials_config_create()->Ref(); check_arg_ = ServerAuthorizationCheckArgCreate(this); - grpc_core::StringView host; - grpc_core::StringView port; + absl::string_view host; + absl::string_view port; grpc_core::SplitHostPort(target_name, &host, &port); - target_name_ = grpc_core::StringViewToCString(host); + target_name_ = StringViewToCString(host); } TlsChannelSecurityConnector::~TlsChannelSecurityConnector() { @@ -277,7 +278,7 @@ int TlsChannelSecurityConnector::cmp( } bool TlsChannelSecurityConnector::check_call_host( - grpc_core::StringView host, grpc_auth_context* auth_context, + absl::string_view host, grpc_auth_context* auth_context, grpc_closure* on_call_host_checked, grpc_error** error) { return grpc_ssl_check_call_host(host, target_name_.get(), overridden_target_name_.get(), auth_context, diff --git a/src/core/lib/security/security_connector/tls/tls_security_connector.h b/src/core/lib/security/security_connector/tls/tls_security_connector.h index 4ac831f1ec1..69ac8eef58c 100644 --- a/src/core/lib/security/security_connector/tls/tls_security_connector.h +++ b/src/core/lib/security/security_connector/tls/tls_security_connector.h @@ -57,8 +57,7 @@ class TlsChannelSecurityConnector final int cmp(const grpc_security_connector* other_sc) const override; - bool check_call_host(grpc_core::StringView host, - grpc_auth_context* auth_context, + bool check_call_host(absl::string_view host, grpc_auth_context* auth_context, grpc_closure* on_call_host_checked, grpc_error** error) override; diff --git a/src/core/lib/security/transport/client_auth_filter.cc b/src/core/lib/security/transport/client_auth_filter.cc index c3658a99d2e..ed24b4f6622 100644 --- a/src/core/lib/security/transport/client_auth_filter.cc +++ b/src/core/lib/security/transport/client_auth_filter.cc @@ -379,8 +379,7 @@ static void client_auth_start_transport_stream_op_batch( GRPC_CALL_STACK_REF(calld->owning_call, "check_call_host"); GRPC_CLOSURE_INIT(&calld->async_result_closure, on_host_checked, batch, grpc_schedule_on_exec_ctx); - grpc_core::StringView call_host( - grpc_core::StringViewFromSlice(calld->host)); + absl::string_view call_host(grpc_core::StringViewFromSlice(calld->host)); grpc_error* error = GRPC_ERROR_NONE; if (chand->security_connector->check_call_host( call_host, chand->auth_context.get(), diff --git a/src/core/lib/slice/slice_utils.h b/src/core/lib/slice/slice_utils.h index b203a1662a6..d9a4253c1aa 100644 --- a/src/core/lib/slice/slice_utils.h +++ b/src/core/lib/slice/slice_utils.h @@ -23,6 +23,8 @@ #include +#include "absl/strings/string_view.h" + #include #include "src/core/lib/gpr/murmur_hash.h" @@ -186,6 +188,13 @@ struct InternedSlice : public ManagedMemorySlice { explicit InternedSlice(InternedSliceRefcount* s); }; +// Converts grpc_slice to absl::string_view. +inline absl::string_view StringViewFromSlice(const grpc_slice& slice) { + return absl::string_view( + reinterpret_cast(GRPC_SLICE_START_PTR(slice)), + GRPC_SLICE_LENGTH(slice)); +} + } // namespace grpc_core #endif /* GRPC_CORE_LIB_SLICE_SLICE_UTILS_H */ diff --git a/src/core/tsi/ssl_transport_security.cc b/src/core/tsi/ssl_transport_security.cc index e53e1b1faf0..bd82dc1db47 100644 --- a/src/core/tsi/ssl_transport_security.cc +++ b/src/core/tsi/ssl_transport_security.cc @@ -53,6 +53,7 @@ extern "C" { } #include "src/core/lib/gpr/useful.h" +#include "src/core/lib/gprpp/string_view.h" #include "src/core/tsi/ssl/session_cache/ssl_session_cache.h" #include "src/core/tsi/ssl_types.h" #include "src/core/tsi/transport_security.h" @@ -238,7 +239,7 @@ static void ssl_info_callback(const SSL* ssl, int where, int ret) { /* Returns 1 if name looks like an IP address, 0 otherwise. This is a very rough heuristic, and only handles IPv6 in hexadecimal form. */ -static int looks_like_ip_address(grpc_core::StringView name) { +static int looks_like_ip_address(absl::string_view name) { size_t dot_count = 0; size_t num_size = 0; for (size_t i = 0; i < name.size(); ++i) { @@ -1645,8 +1646,8 @@ static void tsi_ssl_server_handshaker_factory_destroy( gpr_free(self); } -static int does_entry_match_name(grpc_core::StringView entry, - grpc_core::StringView name) { +static int does_entry_match_name(absl::string_view entry, + absl::string_view name) { if (entry.empty()) return 0; /* Take care of '.' terminations. */ @@ -1669,13 +1670,13 @@ static int does_entry_match_name(grpc_core::StringView entry, return 0; } size_t name_subdomain_pos = name.find('.'); - if (name_subdomain_pos == grpc_core::StringView::npos) return 0; + if (name_subdomain_pos == absl::string_view::npos) return 0; if (name_subdomain_pos >= name.size() - 2) return 0; - grpc_core::StringView name_subdomain = + absl::string_view name_subdomain = name.substr(name_subdomain_pos + 1); /* Starts after the dot. */ entry.remove_prefix(2); /* Remove *. */ size_t dot = name_subdomain.find('.'); - if (dot == grpc_core::StringView::npos || dot == name_subdomain.size() - 1) { + if (dot == absl::string_view::npos || dot == name_subdomain.size() - 1) { grpc_core::UniquePtr name_subdomain_cstr( grpc_core::StringViewToCString(name_subdomain)); gpr_log(GPR_ERROR, "Invalid toplevel subdomain: %s", @@ -2058,8 +2059,7 @@ tsi_result tsi_create_ssl_server_handshaker_factory_with_options( /* --- tsi_ssl utils. --- */ -int tsi_ssl_peer_matches_name(const tsi_peer* peer, - grpc_core::StringView name) { +int tsi_ssl_peer_matches_name(const tsi_peer* peer, absl::string_view name) { size_t i = 0; size_t san_count = 0; const tsi_peer_property* cn_property = nullptr; @@ -2073,7 +2073,7 @@ int tsi_ssl_peer_matches_name(const tsi_peer* peer, TSI_X509_SUBJECT_ALTERNATIVE_NAME_PEER_PROPERTY) == 0) { san_count++; - grpc_core::StringView entry(property->value.data, property->value.length); + absl::string_view entry(property->value.data, property->value.length); if (!like_ip && does_entry_match_name(entry, name)) { return 1; } else if (like_ip && name == entry) { @@ -2088,8 +2088,8 @@ int tsi_ssl_peer_matches_name(const tsi_peer* peer, /* If there's no SAN, try the CN, but only if its not like an IP Address */ if (san_count == 0 && cn_property != nullptr && !like_ip) { - if (does_entry_match_name(grpc_core::StringView(cn_property->value.data, - cn_property->value.length), + if (does_entry_match_name(absl::string_view(cn_property->value.data, + cn_property->value.length), name)) { return 1; } diff --git a/src/core/tsi/ssl_transport_security.h b/src/core/tsi/ssl_transport_security.h index ae1e413aad3..4c3b9b68b38 100644 --- a/src/core/tsi/ssl_transport_security.h +++ b/src/core/tsi/ssl_transport_security.h @@ -21,7 +21,8 @@ #include -#include "src/core/lib/gprpp/string_view.h" +#include "absl/strings/string_view.h" + #include "src/core/tsi/transport_security_interface.h" extern "C" { @@ -317,7 +318,7 @@ void tsi_ssl_server_handshaker_factory_unref( - handle mixed case. - handle %encoded chars. - handle public suffix wildchar more strictly (e.g. *.co.uk) */ -int tsi_ssl_peer_matches_name(const tsi_peer* peer, grpc_core::StringView name); +int tsi_ssl_peer_matches_name(const tsi_peer* peer, absl::string_view name); /* --- Testing support. --- diff --git a/test/core/gprpp/string_view_test.cc b/test/core/gprpp/string_view_test.cc index a48967ee170..5f9f8df76b5 100644 --- a/test/core/gprpp/string_view_test.cc +++ b/test/core/gprpp/string_view_test.cc @@ -27,135 +27,11 @@ namespace grpc_core { namespace testing { -TEST(StringViewTest, Empty) { - grpc_core::StringView empty; - EXPECT_TRUE(empty.empty()); - EXPECT_EQ(empty.size(), 0lu); - - grpc_core::StringView empty_buf(""); - EXPECT_TRUE(empty_buf.empty()); - EXPECT_EQ(empty_buf.size(), 0lu); - - grpc_core::StringView empty_trimmed("foo", 0); - EXPECT_TRUE(empty_trimmed.empty()); - EXPECT_EQ(empty_trimmed.size(), 0lu); - - grpc_core::StringView empty_slice( - grpc_core::StringViewFromSlice(grpc_empty_slice())); - EXPECT_TRUE(empty_slice.empty()); - EXPECT_EQ(empty_slice.size(), 0lu); -} - -TEST(StringViewTest, Size) { - constexpr char kStr[] = "foo"; - grpc_core::StringView str1(kStr); - EXPECT_EQ(str1.size(), strlen(kStr)); - grpc_core::StringView str2(kStr, 2); - EXPECT_EQ(str2.size(), 2lu); -} - -TEST(StringViewTest, Data) { - constexpr char kStr[] = "foo-bar"; - grpc_core::StringView str(kStr); - EXPECT_EQ(str.size(), strlen(kStr)); - for (size_t i = 0; i < strlen(kStr); ++i) { - EXPECT_EQ(str[i], kStr[i]); - } -} - -TEST(StringViewTest, Slice) { - constexpr char kStr[] = "foo"; - grpc_core::StringView slice( - grpc_core::StringViewFromSlice(grpc_slice_from_static_string(kStr))); - EXPECT_EQ(slice.size(), strlen(kStr)); -} - TEST(StringViewTest, Dup) { constexpr char kStr[] = "foo"; - grpc_core::StringView slice( - grpc_core::StringViewFromSlice(grpc_slice_from_static_string(kStr))); - grpc_core::UniquePtr dup = grpc_core::StringViewToCString(slice); - EXPECT_EQ(0, strcmp(kStr, dup.get())); - EXPECT_EQ(slice.size(), strlen(kStr)); -} - -TEST(StringViewTest, Eq) { - constexpr char kStr1[] = "foo"; - constexpr char kStr2[] = "bar"; - grpc_core::StringView str1(kStr1); - EXPECT_EQ(kStr1, str1); - EXPECT_EQ(str1, kStr1); - grpc_core::StringView slice1( - grpc_core::StringViewFromSlice(grpc_slice_from_static_string(kStr1))); - EXPECT_EQ(slice1, str1); - EXPECT_EQ(str1, slice1); - EXPECT_NE(slice1, kStr2); - EXPECT_NE(kStr2, slice1); - grpc_core::StringView slice2( - grpc_core::StringViewFromSlice(grpc_slice_from_static_string(kStr2))); - EXPECT_NE(slice2, str1); - EXPECT_NE(str1, slice2); -} - -TEST(StringViewTest, Cmp) { - constexpr char kStr1[] = "abc"; - constexpr char kStr2[] = "abd"; - constexpr char kStr3[] = "abcd"; - grpc_core::StringView str1(kStr1); - grpc_core::StringView str2(kStr2); - grpc_core::StringView str3(kStr3); - EXPECT_EQ(str1.compare(str1), 0); - EXPECT_LT(str1.compare(str2), 0); - EXPECT_LT(str1.compare(str3), 0); - EXPECT_EQ(str2.compare(str2), 0); - EXPECT_GT(str2.compare(str1), 0); - EXPECT_GT(str2.compare(str3), 0); - EXPECT_EQ(str3.compare(str3), 0); - EXPECT_GT(str3.compare(str1), 0); - EXPECT_LT(str3.compare(str2), 0); -} - -TEST(StringViewTest, RemovePrefix) { - constexpr char kStr[] = "abcd"; - grpc_core::StringView str(kStr); - str.remove_prefix(1); - EXPECT_EQ("bcd", str); - str.remove_prefix(2); - EXPECT_EQ("d", str); - str.remove_prefix(1); - EXPECT_EQ("", str); -} - -TEST(StringViewTest, RemoveSuffix) { - constexpr char kStr[] = "abcd"; - grpc_core::StringView str(kStr); - str.remove_suffix(1); - EXPECT_EQ("abc", str); - str.remove_suffix(2); - EXPECT_EQ("a", str); - str.remove_suffix(1); - EXPECT_EQ("", str); -} - -TEST(StringViewTest, Substring) { - constexpr char kStr[] = "abcd"; - grpc_core::StringView str(kStr); - EXPECT_EQ("bcd", str.substr(1)); - EXPECT_EQ("bc", str.substr(1, 2)); -} - -TEST(StringViewTest, Find) { - // Passing StringView::npos directly to GTEST macros result in link errors. - // Store the value in a local variable and use it in the test. - const size_t npos = grpc_core::StringView::npos; - constexpr char kStr[] = "abacad"; - grpc_core::StringView str(kStr); - EXPECT_EQ(0ul, str.find('a')); - EXPECT_EQ(2ul, str.find('a', 1)); - EXPECT_EQ(4ul, str.find('a', 3)); - EXPECT_EQ(1ul, str.find('b')); - EXPECT_EQ(npos, str.find('b', 2)); - EXPECT_EQ(npos, str.find('z')); + absl::string_view sv = kStr; + grpc_core::UniquePtr dup = grpc_core::StringViewToCString(sv); + EXPECT_EQ(std::string(sv), dup.get()); } } // namespace testing diff --git a/test/core/json/fuzzer.cc b/test/core/json/fuzzer.cc index 6d27ee2c566..e9eecf2332b 100644 --- a/test/core/json/fuzzer.cc +++ b/test/core/json/fuzzer.cc @@ -31,7 +31,7 @@ bool leak_check = true; extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { grpc_error* error = GRPC_ERROR_NONE; grpc_core::Json::Parse( - grpc_core::StringView(reinterpret_cast(data), size), &error); + absl::string_view(reinterpret_cast(data), size), &error); GRPC_ERROR_UNREF(error); return 0; } diff --git a/test/core/security/credentials_test.cc b/test/core/security/credentials_test.cc index fd0cf6cc403..75eb00ec83d 100644 --- a/test/core/security/credentials_test.cc +++ b/test/core/security/credentials_test.cc @@ -788,8 +788,8 @@ static void test_valid_sts_creds_options(void) { grpc_core::ValidateStsCredentialsOptions(&valid_options, &sts_url); GPR_ASSERT(error == GRPC_ERROR_NONE); GPR_ASSERT(sts_url != nullptr); - grpc_core::StringView host; - grpc_core::StringView port; + absl::string_view host; + absl::string_view port; GPR_ASSERT(grpc_core::SplitHostPort(sts_url->authority, &host, &port)); GPR_ASSERT(host == "foo.com"); GPR_ASSERT(port == "5555"); diff --git a/test/core/security/json_token_test.cc b/test/core/security/json_token_test.cc index d93be88aba5..6b032bb7430 100644 --- a/test/core/security/json_token_test.cc +++ b/test/core/security/json_token_test.cc @@ -216,9 +216,7 @@ static Json parse_json_part_from_jwt(const char* str, size_t len) { gpr_free(b64); GPR_ASSERT(!GRPC_SLICE_IS_EMPTY(slice)); grpc_error* error = GRPC_ERROR_NONE; - grpc_core::StringView string( - reinterpret_cast(GRPC_SLICE_START_PTR(slice)), - GRPC_SLICE_LENGTH(slice)); + absl::string_view string = grpc_core::StringViewFromSlice(slice); Json json = Json::Parse(string, &error); if (error != GRPC_ERROR_NONE) { gpr_log(GPR_ERROR, "JSON parse error: %s", grpc_error_string(error)); diff --git a/test/core/slice/slice_test.cc b/test/core/slice/slice_test.cc index 83a6db4a113..975bedfcd47 100644 --- a/test/core/slice/slice_test.cc +++ b/test/core/slice/slice_test.cc @@ -330,6 +330,13 @@ static void test_moved_string_slice(void) { grpc_shutdown(); } +void test_string_view_from_slice() { + constexpr char kStr[] = "foo"; + absl::string_view sv( + grpc_core::StringViewFromSlice(grpc_slice_from_static_string(kStr))); + GPR_ASSERT(std::string(sv) == kStr); +} + int main(int argc, char** argv) { unsigned length; grpc::testing::TestEnvironment env(argc, argv); @@ -348,6 +355,7 @@ int main(int argc, char** argv) { test_static_slice_interning(); test_static_slice_copy_interning(); test_moved_string_slice(); + test_string_view_from_slice(); grpc_shutdown(); return 0; } diff --git a/test/core/util/test_lb_policies.cc b/test/core/util/test_lb_policies.cc index 46ddf59351d..eae25bc4265 100644 --- a/test/core/util/test_lb_policies.cc +++ b/test/core/util/test_lb_policies.cc @@ -161,7 +161,8 @@ class InterceptRecvTrailingMetadataLoadBalancingPolicy parent_->channel_control_helper()->RequestReresolution(); } - void AddTraceEvent(TraceSeverity severity, StringView message) override { + void AddTraceEvent(TraceSeverity severity, + absl::string_view message) override { parent_->channel_control_helper()->AddTraceEvent(severity, message); } diff --git a/test/cpp/end2end/client_lb_end2end_test.cc b/test/cpp/end2end/client_lb_end2end_test.cc index d066a00a29d..295afb312b6 100644 --- a/test/cpp/end2end/client_lb_end2end_test.cc +++ b/test/cpp/end2end/client_lb_end2end_test.cc @@ -48,6 +48,7 @@ #include "src/core/lib/gpr/env.h" #include "src/core/lib/gprpp/debug_location.h" #include "src/core/lib/gprpp/ref_counted_ptr.h" +#include "src/core/lib/gprpp/string_view.h" #include "src/core/lib/iomgr/tcp_client.h" #include "src/core/lib/security/credentials/fake/fake_credentials.h" #include "src/cpp/client/secure_credentials.h" diff --git a/test/cpp/qps/driver.cc b/test/cpp/qps/driver.cc index 03a4477b4d8..1f3176f5548 100644 --- a/test/cpp/qps/driver.cc +++ b/test/cpp/qps/driver.cc @@ -52,8 +52,8 @@ using std::vector; namespace grpc { namespace testing { static std::string get_host(const std::string& worker) { - grpc_core::StringView host; - grpc_core::StringView port; + absl::string_view host; + absl::string_view port; grpc_core::SplitHostPort(worker.c_str(), &host, &port); return std::string(host.data(), host.size()); } From 2ea571a92a1cbc2be57debfc467f192c8cbd5d6b Mon Sep 17 00:00:00 2001 From: Richard Belleville Date: Mon, 27 Apr 2020 09:59:21 -0700 Subject: [PATCH 626/758] Pin astroid --- tools/distrib/pylint_code.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/distrib/pylint_code.sh b/tools/distrib/pylint_code.sh index 25189db12aa..5e6b818dc99 100755 --- a/tools/distrib/pylint_code.sh +++ b/tools/distrib/pylint_code.sh @@ -40,7 +40,7 @@ python3 -m virtualenv $VIRTUALENV -p $(which python3) PYTHON=$VIRTUALENV/bin/python $PYTHON -m pip install --upgrade pip==19.3.1 -$PYTHON -m pip install --upgrade pylint==2.2.2 +$PYTHON -m pip install --upgrade astroid==2.3.3 pylint==2.2.2 EXIT=0 for dir in "${DIRS[@]}"; do From d74548e611c63acbd544035ac97391ddaf96a6aa Mon Sep 17 00:00:00 2001 From: "Mark D. Roth" Date: Mon, 27 Apr 2020 12:28:28 -0700 Subject: [PATCH 627/758] Remove StringViewToCString() and src/core/lib/gprpp/string_view.h --- BUILD | 1 - BUILD.gn | 1 - CMakeLists.txt | 39 ---------- Makefile | 48 ------------ build_autogenerated.yaml | 14 ---- gRPC-C++.podspec | 2 - gRPC-Core.podspec | 2 - grpc.gemspec | 1 - package.xml | 1 - .../filters/client_channel/backend_metric.cc | 2 + .../ext/filters/client_channel/http_proxy.cc | 9 ++- .../filters/client_channel/parse_address.cc | 43 +++++----- .../resolver/dns/c_ares/grpc_ares_wrapper.cc | 78 +++++++++---------- .../client_channel/xds/xds_bootstrap.cc | 6 +- .../filters/client_channel/xds/xds_client.cc | 6 +- src/core/lib/channel/channelz.cc | 11 ++- src/core/lib/gprpp/host_port.cc | 25 ++++-- src/core/lib/gprpp/host_port.h | 21 ++--- src/core/lib/gprpp/map.h | 5 +- src/core/lib/gprpp/string_view.h | 52 ------------- src/core/lib/iomgr/resolve_address_custom.cc | 68 +++++++--------- src/core/lib/iomgr/resolve_address_custom.h | 6 +- src/core/lib/iomgr/resolve_address_posix.cc | 16 ++-- src/core/lib/iomgr/resolve_address_windows.cc | 12 +-- src/core/lib/iomgr/sockaddr_utils.h | 2 + src/core/lib/iomgr/tcp_client_cfstream.cc | 8 +- src/core/lib/iomgr/tcp_uv.cc | 5 +- .../ssl/ssl_security_connector.cc | 40 ++++------ .../tls/tls_security_connector.cc | 30 +++---- .../tls/tls_security_connector.h | 4 +- src/core/tsi/ssl_transport_security.cc | 6 +- .../_cython/_cygrpc/aio/iomgr/iomgr.pyx.pxi | 8 +- .../_cygrpc/aio/iomgr/resolver.pxd.pxi | 2 +- .../_cygrpc/aio/iomgr/resolver.pyx.pxi | 2 +- .../grpc/_cython/_cygrpc/grpc_gevent.pxd.pxi | 4 +- .../grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi | 4 +- .../grpcio/grpc/_cython/_cygrpc/iomgr.pxd.pxi | 4 +- .../parse_address_with_named_scope_id_test.cc | 8 +- test/core/gprpp/BUILD | 13 ---- test/core/gprpp/host_port_test.cc | 16 +--- test/core/gprpp/string_view_test.cc | 44 ----------- test/cpp/end2end/client_lb_end2end_test.cc | 13 ++-- test/cpp/naming/address_sorting_test.cc | 12 +-- test/cpp/naming/resolver_component_test.cc | 8 +- tools/doxygen/Doxyfile.c++.internal | 1 - tools/doxygen/Doxyfile.core.internal | 1 - tools/run_tests/generated/tests.json | 24 ------ 47 files changed, 238 insertions(+), 490 deletions(-) delete mode 100644 src/core/lib/gprpp/string_view.h delete mode 100644 test/core/gprpp/string_view_test.cc diff --git a/BUILD b/BUILD index 91cd3488408..edc09c315ff 100644 --- a/BUILD +++ b/BUILD @@ -554,7 +554,6 @@ grpc_cc_library( "src/core/lib/gprpp/map.h", "src/core/lib/gprpp/memory.h", "src/core/lib/gprpp/mpscq.h", - "src/core/lib/gprpp/string_view.h", "src/core/lib/gprpp/sync.h", "src/core/lib/gprpp/thd.h", "src/core/lib/profiling/timers.h", diff --git a/BUILD.gn b/BUILD.gn index 9ec801e373c..121b57c75f7 100644 --- a/BUILD.gn +++ b/BUILD.gn @@ -160,7 +160,6 @@ config("grpc_config") { "src/core/lib/gprpp/memory.h", "src/core/lib/gprpp/mpscq.cc", "src/core/lib/gprpp/mpscq.h", - "src/core/lib/gprpp/string_view.h", "src/core/lib/gprpp/sync.h", "src/core/lib/gprpp/thd.h", "src/core/lib/gprpp/thd_posix.cc", diff --git a/CMakeLists.txt b/CMakeLists.txt index a82784d07db..ed5d9579c57 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -798,7 +798,6 @@ if(gRPC_BUILD_TESTS) add_dependencies(buildtests_cxx streaming_throughput_test) endif() add_dependencies(buildtests_cxx string_ref_test) - add_dependencies(buildtests_cxx string_view_test) add_dependencies(buildtests_cxx test_cpp_client_credentials_test) add_dependencies(buildtests_cxx test_cpp_util_slice_test) add_dependencies(buildtests_cxx test_cpp_util_time_test) @@ -13766,44 +13765,6 @@ target_link_libraries(string_ref_test ) -endif() -if(gRPC_BUILD_TESTS) - -add_executable(string_view_test - test/core/gprpp/string_view_test.cc - third_party/googletest/googletest/src/gtest-all.cc - third_party/googletest/googlemock/src/gmock-all.cc -) - -target_include_directories(string_view_test - PRIVATE - ${CMAKE_CURRENT_SOURCE_DIR} - ${CMAKE_CURRENT_SOURCE_DIR}/include - ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} - ${_gRPC_SSL_INCLUDE_DIR} - ${_gRPC_UPB_GENERATED_DIR} - ${_gRPC_UPB_GRPC_GENERATED_DIR} - ${_gRPC_UPB_INCLUDE_DIR} - ${_gRPC_ZLIB_INCLUDE_DIR} - third_party/googletest/googletest/include - third_party/googletest/googletest - third_party/googletest/googlemock/include - third_party/googletest/googlemock - ${_gRPC_PROTO_GENS_DIR} -) - -target_link_libraries(string_view_test - ${_gRPC_PROTOBUF_LIBRARIES} - ${_gRPC_ALLTARGETS_LIBRARIES} - grpc_test_util - grpc - gpr - address_sorting - upb - ${_gRPC_GFLAGS_LIBRARIES} -) - - endif() if(gRPC_BUILD_TESTS) diff --git a/Makefile b/Makefile index 1ccc7e99fd5..62d0d31011b 100644 --- a/Makefile +++ b/Makefile @@ -1289,7 +1289,6 @@ status_metadata_test: $(BINDIR)/$(CONFIG)/status_metadata_test status_util_test: $(BINDIR)/$(CONFIG)/status_util_test streaming_throughput_test: $(BINDIR)/$(CONFIG)/streaming_throughput_test string_ref_test: $(BINDIR)/$(CONFIG)/string_ref_test -string_view_test: $(BINDIR)/$(CONFIG)/string_view_test test_cpp_client_credentials_test: $(BINDIR)/$(CONFIG)/test_cpp_client_credentials_test test_cpp_util_slice_test: $(BINDIR)/$(CONFIG)/test_cpp_util_slice_test test_cpp_util_time_test: $(BINDIR)/$(CONFIG)/test_cpp_util_time_test @@ -1649,7 +1648,6 @@ buildtests_cxx: privatelibs_cxx \ $(BINDIR)/$(CONFIG)/status_util_test \ $(BINDIR)/$(CONFIG)/streaming_throughput_test \ $(BINDIR)/$(CONFIG)/string_ref_test \ - $(BINDIR)/$(CONFIG)/string_view_test \ $(BINDIR)/$(CONFIG)/test_cpp_client_credentials_test \ $(BINDIR)/$(CONFIG)/test_cpp_util_slice_test \ $(BINDIR)/$(CONFIG)/test_cpp_util_time_test \ @@ -1806,7 +1804,6 @@ buildtests_cxx: privatelibs_cxx \ $(BINDIR)/$(CONFIG)/status_util_test \ $(BINDIR)/$(CONFIG)/streaming_throughput_test \ $(BINDIR)/$(CONFIG)/string_ref_test \ - $(BINDIR)/$(CONFIG)/string_view_test \ $(BINDIR)/$(CONFIG)/test_cpp_client_credentials_test \ $(BINDIR)/$(CONFIG)/test_cpp_util_slice_test \ $(BINDIR)/$(CONFIG)/test_cpp_util_time_test \ @@ -2335,8 +2332,6 @@ test_cxx: buildtests_cxx $(Q) $(BINDIR)/$(CONFIG)/streaming_throughput_test || ( echo test streaming_throughput_test failed ; exit 1 ) $(E) "[RUN] Testing string_ref_test" $(Q) $(BINDIR)/$(CONFIG)/string_ref_test || ( echo test string_ref_test failed ; exit 1 ) - $(E) "[RUN] Testing string_view_test" - $(Q) $(BINDIR)/$(CONFIG)/string_view_test || ( echo test string_view_test failed ; exit 1 ) $(E) "[RUN] Testing test_cpp_client_credentials_test" $(Q) $(BINDIR)/$(CONFIG)/test_cpp_client_credentials_test || ( echo test test_cpp_client_credentials_test failed ; exit 1 ) $(E) "[RUN] Testing test_cpp_util_slice_test" @@ -18197,49 +18192,6 @@ endif endif -STRING_VIEW_TEST_SRC = \ - test/core/gprpp/string_view_test.cc \ - -STRING_VIEW_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(STRING_VIEW_TEST_SRC)))) -ifeq ($(NO_SECURE),true) - -# You can't build secure targets if you don't have OpenSSL. - -$(BINDIR)/$(CONFIG)/string_view_test: openssl_dep_error - -else - - - - -ifeq ($(NO_PROTOBUF),true) - -# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+. - -$(BINDIR)/$(CONFIG)/string_view_test: protobuf_dep_error - -else - -$(BINDIR)/$(CONFIG)/string_view_test: $(PROTOBUF_DEP) $(STRING_VIEW_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a - $(E) "[LD] Linking $@" - $(Q) mkdir -p `dirname $@` - $(Q) $(LDXX) $(LDFLAGS) $(STRING_VIEW_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/string_view_test - -endif - -endif - -$(OBJDIR)/$(CONFIG)/test/core/gprpp/string_view_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a - -deps_string_view_test: $(STRING_VIEW_TEST_OBJS:.o=.dep) - -ifneq ($(NO_SECURE),true) -ifneq ($(NO_DEPS),true) --include $(STRING_VIEW_TEST_OBJS:.o=.dep) -endif -endif - - TEST_CPP_CLIENT_CREDENTIALS_TEST_SRC = \ test/cpp/client/credentials_test.cc \ diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml index d01ff14cc58..eeb81843c74 100644 --- a/build_autogenerated.yaml +++ b/build_autogenerated.yaml @@ -302,7 +302,6 @@ libs: - src/core/lib/gprpp/map.h - src/core/lib/gprpp/memory.h - src/core/lib/gprpp/mpscq.h - - src/core/lib/gprpp/string_view.h - src/core/lib/gprpp/sync.h - src/core/lib/gprpp/thd.h - src/core/lib/profiling/timers.h @@ -7241,19 +7240,6 @@ targets: - address_sorting - upb uses_polling: false -- name: string_view_test - gtest: true - build: test - language: c++ - headers: [] - src: - - test/core/gprpp/string_view_test.cc - deps: - - grpc_test_util - - grpc - - gpr - - address_sorting - - upb - name: test_cpp_client_credentials_test gtest: true build: test diff --git a/gRPC-C++.podspec b/gRPC-C++.podspec index 77e015d1d97..a3c35cbc912 100644 --- a/gRPC-C++.podspec +++ b/gRPC-C++.podspec @@ -425,7 +425,6 @@ Pod::Spec.new do |s| 'src/core/lib/gprpp/orphanable.h', 'src/core/lib/gprpp/ref_counted.h', 'src/core/lib/gprpp/ref_counted_ptr.h', - 'src/core/lib/gprpp/string_view.h', 'src/core/lib/gprpp/sync.h', 'src/core/lib/gprpp/thd.h', 'src/core/lib/http/format_request.h', @@ -875,7 +874,6 @@ Pod::Spec.new do |s| 'src/core/lib/gprpp/orphanable.h', 'src/core/lib/gprpp/ref_counted.h', 'src/core/lib/gprpp/ref_counted_ptr.h', - 'src/core/lib/gprpp/string_view.h', 'src/core/lib/gprpp/sync.h', 'src/core/lib/gprpp/thd.h', 'src/core/lib/http/format_request.h', diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec index a9c11d7d933..8bf16911cc6 100644 --- a/gRPC-Core.podspec +++ b/gRPC-Core.podspec @@ -618,7 +618,6 @@ Pod::Spec.new do |s| 'src/core/lib/gprpp/orphanable.h', 'src/core/lib/gprpp/ref_counted.h', 'src/core/lib/gprpp/ref_counted_ptr.h', - 'src/core/lib/gprpp/string_view.h', 'src/core/lib/gprpp/sync.h', 'src/core/lib/gprpp/thd.h', 'src/core/lib/gprpp/thd_posix.cc', @@ -1231,7 +1230,6 @@ Pod::Spec.new do |s| 'src/core/lib/gprpp/orphanable.h', 'src/core/lib/gprpp/ref_counted.h', 'src/core/lib/gprpp/ref_counted_ptr.h', - 'src/core/lib/gprpp/string_view.h', 'src/core/lib/gprpp/sync.h', 'src/core/lib/gprpp/thd.h', 'src/core/lib/http/format_request.h', diff --git a/grpc.gemspec b/grpc.gemspec index 7042206375a..a1f538c1501 100644 --- a/grpc.gemspec +++ b/grpc.gemspec @@ -540,7 +540,6 @@ Gem::Specification.new do |s| s.files += %w( src/core/lib/gprpp/orphanable.h ) s.files += %w( src/core/lib/gprpp/ref_counted.h ) s.files += %w( src/core/lib/gprpp/ref_counted_ptr.h ) - s.files += %w( src/core/lib/gprpp/string_view.h ) s.files += %w( src/core/lib/gprpp/sync.h ) s.files += %w( src/core/lib/gprpp/thd.h ) s.files += %w( src/core/lib/gprpp/thd_posix.cc ) diff --git a/package.xml b/package.xml index 862ea4f566c..42f91a37b8c 100644 --- a/package.xml +++ b/package.xml @@ -520,7 +520,6 @@ - diff --git a/src/core/ext/filters/client_channel/backend_metric.cc b/src/core/ext/filters/client_channel/backend_metric.cc index cfb18c172d0..4c6024853da 100644 --- a/src/core/ext/filters/client_channel/backend_metric.cc +++ b/src/core/ext/filters/client_channel/backend_metric.cc @@ -22,6 +22,8 @@ #include "udpa/data/orca/v1/orca_load_report.upb.h" +#include "src/core/lib/gprpp/map.h" + namespace grpc_core { namespace { diff --git a/src/core/ext/filters/client_channel/http_proxy.cc b/src/core/ext/filters/client_channel/http_proxy.cc index efd188c165e..0ccad5b6595 100644 --- a/src/core/ext/filters/client_channel/http_proxy.cc +++ b/src/core/ext/filters/client_channel/http_proxy.cc @@ -125,8 +125,8 @@ class HttpProxyMapper : public ProxyMapperInterface { if (no_proxy_str != nullptr) { static const char* NO_PROXY_SEPARATOR = ","; bool use_proxy = true; - grpc_core::UniquePtr server_host; - grpc_core::UniquePtr server_port; + std::string server_host; + std::string server_port; if (!grpc_core::SplitHostPort( uri->path[0] == '/' ? uri->path + 1 : uri->path, &server_host, &server_port)) { @@ -136,7 +136,7 @@ class HttpProxyMapper : public ProxyMapperInterface { server_uri); gpr_free(no_proxy_str); } else { - size_t uri_len = strlen(server_host.get()); + size_t uri_len = server_host.size(); char** no_proxy_hosts; size_t num_no_proxy_hosts; gpr_string_split(no_proxy_str, NO_PROXY_SEPARATOR, &no_proxy_hosts, @@ -146,7 +146,8 @@ class HttpProxyMapper : public ProxyMapperInterface { size_t no_proxy_len = strlen(no_proxy_entry); if (no_proxy_len <= uri_len && gpr_stricmp(no_proxy_entry, - &(server_host.get()[uri_len - no_proxy_len])) == 0) { + &(server_host.c_str()[uri_len - no_proxy_len])) == + 0) { gpr_log(GPR_INFO, "not using proxy for host in no_proxy list '%s'", server_uri); use_proxy = false; diff --git a/src/core/ext/filters/client_channel/parse_address.cc b/src/core/ext/filters/client_channel/parse_address.cc index fbfbb4445f3..e9950ac5a94 100644 --- a/src/core/ext/filters/client_channel/parse_address.cc +++ b/src/core/ext/filters/client_channel/parse_address.cc @@ -73,8 +73,8 @@ bool grpc_parse_ipv4_hostport(const char* hostport, grpc_resolved_address* addr, bool log_errors) { bool success = false; // Split host and port. - grpc_core::UniquePtr host; - grpc_core::UniquePtr port; + std::string host; + std::string port; if (!grpc_core::SplitHostPort(hostport, &host, &port)) { if (log_errors) { gpr_log(GPR_ERROR, "Failed gpr_split_host_port(%s, ...)", hostport); @@ -86,21 +86,21 @@ bool grpc_parse_ipv4_hostport(const char* hostport, grpc_resolved_address* addr, addr->len = static_cast(sizeof(grpc_sockaddr_in)); grpc_sockaddr_in* in = reinterpret_cast(addr->addr); in->sin_family = GRPC_AF_INET; - if (grpc_inet_pton(GRPC_AF_INET, host.get(), &in->sin_addr) == 0) { + if (grpc_inet_pton(GRPC_AF_INET, host.c_str(), &in->sin_addr) == 0) { if (log_errors) { - gpr_log(GPR_ERROR, "invalid ipv4 address: '%s'", host.get()); + gpr_log(GPR_ERROR, "invalid ipv4 address: '%s'", host.c_str()); } goto done; } // Parse port. - if (port == nullptr) { + if (port.empty()) { if (log_errors) gpr_log(GPR_ERROR, "no port given for ipv4 scheme"); goto done; } int port_num; - if (sscanf(port.get(), "%d", &port_num) != 1 || port_num < 0 || + if (sscanf(port.c_str(), "%d", &port_num) != 1 || port_num < 0 || port_num > 65535) { - if (log_errors) gpr_log(GPR_ERROR, "invalid ipv4 port: '%s'", port.get()); + if (log_errors) gpr_log(GPR_ERROR, "invalid ipv4 port: '%s'", port.c_str()); goto done; } in->sin_port = grpc_htons(static_cast(port_num)); @@ -125,8 +125,8 @@ bool grpc_parse_ipv6_hostport(const char* hostport, grpc_resolved_address* addr, bool log_errors) { bool success = false; // Split host and port. - grpc_core::UniquePtr host; - grpc_core::UniquePtr port; + std::string host; + std::string port; if (!grpc_core::SplitHostPort(hostport, &host, &port)) { if (log_errors) { gpr_log(GPR_ERROR, "Failed gpr_split_host_port(%s, ...)", hostport); @@ -140,11 +140,12 @@ bool grpc_parse_ipv6_hostport(const char* hostport, grpc_resolved_address* addr, in6->sin6_family = GRPC_AF_INET6; // Handle the RFC6874 syntax for IPv6 zone identifiers. char* host_end = - static_cast(gpr_memrchr(host.get(), '%', strlen(host.get()))); + static_cast(gpr_memrchr(host.c_str(), '%', host.size())); if (host_end != nullptr) { - GPR_ASSERT(host_end >= host.get()); + GPR_ASSERT(host_end >= host.c_str()); char host_without_scope[GRPC_INET6_ADDRSTRLEN + 1]; - size_t host_without_scope_len = static_cast(host_end - host.get()); + size_t host_without_scope_len = + static_cast(host_end - host.c_str()); uint32_t sin6_scope_id = 0; if (host_without_scope_len > GRPC_INET6_ADDRSTRLEN) { if (log_errors) { @@ -156,7 +157,7 @@ bool grpc_parse_ipv6_hostport(const char* hostport, grpc_resolved_address* addr, } goto done; } - strncpy(host_without_scope, host.get(), host_without_scope_len); + strncpy(host_without_scope, host.c_str(), host_without_scope_len); host_without_scope[host_without_scope_len] = '\0'; if (grpc_inet_pton(GRPC_AF_INET6, host_without_scope, &in6->sin6_addr) == 0) { @@ -165,9 +166,9 @@ bool grpc_parse_ipv6_hostport(const char* hostport, grpc_resolved_address* addr, } goto done; } - if (gpr_parse_bytes_to_uint32( - host_end + 1, strlen(host.get()) - host_without_scope_len - 1, - &sin6_scope_id) == 0) { + if (gpr_parse_bytes_to_uint32(host_end + 1, + host.size() - host_without_scope_len - 1, + &sin6_scope_id) == 0) { if ((sin6_scope_id = grpc_if_nametoindex(host_end + 1)) == 0) { gpr_log(GPR_ERROR, "Invalid interface name: '%s'. " @@ -179,22 +180,22 @@ bool grpc_parse_ipv6_hostport(const char* hostport, grpc_resolved_address* addr, // Handle "sin6_scope_id" being type "u_long". See grpc issue #10027. in6->sin6_scope_id = sin6_scope_id; } else { - if (grpc_inet_pton(GRPC_AF_INET6, host.get(), &in6->sin6_addr) == 0) { + if (grpc_inet_pton(GRPC_AF_INET6, host.c_str(), &in6->sin6_addr) == 0) { if (log_errors) { - gpr_log(GPR_ERROR, "invalid ipv6 address: '%s'", host.get()); + gpr_log(GPR_ERROR, "invalid ipv6 address: '%s'", host.c_str()); } goto done; } } // Parse port. - if (port == nullptr) { + if (port.empty()) { if (log_errors) gpr_log(GPR_ERROR, "no port given for ipv6 scheme"); goto done; } int port_num; - if (sscanf(port.get(), "%d", &port_num) != 1 || port_num < 0 || + if (sscanf(port.c_str(), "%d", &port_num) != 1 || port_num < 0 || port_num > 65535) { - if (log_errors) gpr_log(GPR_ERROR, "invalid ipv6 port: '%s'", port.get()); + if (log_errors) gpr_log(GPR_ERROR, "invalid ipv6 port: '%s'", port.c_str()); goto done; } in6->sin6_port = grpc_htons(static_cast(port_num)); diff --git a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc index 32784b0eded..7e82c5b12a9 100644 --- a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +++ b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc @@ -163,7 +163,7 @@ void grpc_ares_complete_request_locked(grpc_ares_request* r) { } static grpc_ares_hostbyname_request* create_hostbyname_request_locked( - grpc_ares_request* parent_request, char* host, uint16_t port, + grpc_ares_request* parent_request, const char* host, uint16_t port, bool is_balancer) { GRPC_CARES_TRACE_LOG( "request:%p create_hostbyname_request_locked host:%s port:%d " @@ -367,22 +367,22 @@ void grpc_dns_lookup_ares_continue_after_check_localhost_and_ip_literals_locked( grpc_ares_hostbyname_request* hr = nullptr; ares_channel* channel = nullptr; /* parse name, splitting it into host and port parts */ - grpc_core::UniquePtr host; - grpc_core::UniquePtr port; + std::string host; + std::string port; grpc_core::SplitHostPort(name, &host, &port); - if (host == nullptr) { + if (host.empty()) { error = grpc_error_set_str( GRPC_ERROR_CREATE_FROM_STATIC_STRING("unparseable host:port"), GRPC_ERROR_STR_TARGET_ADDRESS, grpc_slice_from_copied_string(name)); goto error_cleanup; - } else if (port == nullptr) { + } else if (port.empty()) { if (default_port == nullptr) { error = grpc_error_set_str( GRPC_ERROR_CREATE_FROM_STATIC_STRING("no port in name"), GRPC_ERROR_STR_TARGET_ADDRESS, grpc_slice_from_copied_string(name)); goto error_cleanup; } - port.reset(gpr_strdup(default_port)); + port = default_port; } error = grpc_ares_ev_driver_create_locked(&r->ev_driver, interested_parties, query_timeout_ms, @@ -427,22 +427,22 @@ void grpc_dns_lookup_ares_continue_after_check_localhost_and_ip_literals_locked( } r->pending_queries = 1; if (grpc_ares_query_ipv6()) { - hr = create_hostbyname_request_locked(r, host.get(), - grpc_strhtons(port.get()), + hr = create_hostbyname_request_locked(r, host.c_str(), + grpc_strhtons(port.c_str()), /*is_balancer=*/false); ares_gethostbyname(*channel, hr->host, AF_INET6, on_hostbyname_done_locked, hr); } - hr = - create_hostbyname_request_locked(r, host.get(), grpc_strhtons(port.get()), - /*is_balancer=*/false); + hr = create_hostbyname_request_locked(r, host.c_str(), + grpc_strhtons(port.c_str()), + /*is_balancer=*/false); ares_gethostbyname(*channel, hr->host, AF_INET, on_hostbyname_done_locked, hr); if (r->balancer_addresses_out != nullptr) { /* Query the SRV record */ grpc_ares_request_ref_locked(r); char* service_name; - gpr_asprintf(&service_name, "_grpclb._tcp.%s", host.get()); + gpr_asprintf(&service_name, "_grpclb._tcp.%s", host.c_str()); ares_query(*channel, service_name, ns_c_in, ns_t_srv, on_srv_query_done_locked, r); gpr_free(service_name); @@ -450,7 +450,7 @@ void grpc_dns_lookup_ares_continue_after_check_localhost_and_ip_literals_locked( if (r->service_config_json_out != nullptr) { grpc_ares_request_ref_locked(r); char* config_name; - gpr_asprintf(&config_name, "_grpc_config.%s", host.get()); + gpr_asprintf(&config_name, "_grpc_config.%s", host.c_str()); ares_search(*channel, config_name, ns_c_in, ns_t_txt, on_txt_done_locked, r); gpr_free(config_name); @@ -465,18 +465,17 @@ error_cleanup: static bool inner_resolve_as_ip_literal_locked( const char* name, const char* default_port, - std::unique_ptr* addrs, - grpc_core::UniquePtr* host, grpc_core::UniquePtr* port, - grpc_core::UniquePtr* hostport) { + std::unique_ptr* addrs, std::string* host, + std::string* port, std::string* hostport) { grpc_core::SplitHostPort(name, host, port); - if (*host == nullptr) { + if (host->empty()) { gpr_log(GPR_ERROR, "Failed to parse %s to host:port while attempting to resolve as ip " "literal.", name); return false; } - if (*port == nullptr) { + if (port->empty()) { if (default_port == nullptr) { gpr_log(GPR_ERROR, "No port or default port for %s while attempting to resolve as " @@ -484,13 +483,13 @@ static bool inner_resolve_as_ip_literal_locked( name); return false; } - port->reset(gpr_strdup(default_port)); + *port = default_port; } grpc_resolved_address addr; - GPR_ASSERT(grpc_core::JoinHostPort(hostport, host->get(), atoi(port->get()))); - if (grpc_parse_ipv4_hostport(hostport->get(), &addr, + *hostport = grpc_core::JoinHostPort(*host, atoi(port->c_str())); + if (grpc_parse_ipv4_hostport(hostport->c_str(), &addr, false /* log errors */) || - grpc_parse_ipv6_hostport(hostport->get(), &addr, + grpc_parse_ipv6_hostport(hostport->c_str(), &addr, false /* log errors */)) { GPR_ASSERT(*addrs == nullptr); *addrs = absl::make_unique(); @@ -503,22 +502,21 @@ static bool inner_resolve_as_ip_literal_locked( static bool resolve_as_ip_literal_locked( const char* name, const char* default_port, std::unique_ptr* addrs) { - grpc_core::UniquePtr host; - grpc_core::UniquePtr port; - grpc_core::UniquePtr hostport; + std::string host; + std::string port; + std::string hostport; bool out = inner_resolve_as_ip_literal_locked(name, default_port, addrs, &host, &port, &hostport); return out; } -static bool target_matches_localhost_inner(const char* name, - grpc_core::UniquePtr* host, - grpc_core::UniquePtr* port) { +static bool target_matches_localhost_inner(const char* name, std::string* host, + std::string* port) { if (!grpc_core::SplitHostPort(name, host, port)) { gpr_log(GPR_ERROR, "Unable to split host and port for name: %s", name); return false; } - if (gpr_stricmp(host->get(), "localhost") == 0) { + if (gpr_stricmp(host->c_str(), "localhost") == 0) { return true; } else { return false; @@ -526,25 +524,25 @@ static bool target_matches_localhost_inner(const char* name, } static bool target_matches_localhost(const char* name) { - grpc_core::UniquePtr host; - grpc_core::UniquePtr port; + std::string host; + std::string port; return target_matches_localhost_inner(name, &host, &port); } #ifdef GRPC_ARES_RESOLVE_LOCALHOST_MANUALLY static bool inner_maybe_resolve_localhost_manually_locked( const grpc_ares_request* r, const char* name, const char* default_port, - std::unique_ptr* addrs, - grpc_core::UniquePtr* host, grpc_core::UniquePtr* port) { + std::unique_ptr* addrs, std::string* host, + std::string* port) { grpc_core::SplitHostPort(name, host, port); - if (*host == nullptr) { + if (host->empty()) { gpr_log(GPR_ERROR, "Failed to parse %s into host:port during manual localhost " "resolution check.", name); return false; } - if (*port == nullptr) { + if (port->empty()) { if (default_port == nullptr) { gpr_log(GPR_ERROR, "No port or default port for %s during manual localhost " @@ -552,12 +550,12 @@ static bool inner_maybe_resolve_localhost_manually_locked( name); return false; } - port->reset(gpr_strdup(default_port)); + *port = default_port; } - if (gpr_stricmp(host->get(), "localhost") == 0) { + if (gpr_stricmp(host->c_str(), "localhost") == 0) { GPR_ASSERT(*addrs == nullptr); *addrs = absl::make_unique(); - uint16_t numeric_port = grpc_strhtons(port->get()); + uint16_t numeric_port = grpc_strhtons(port->c_str()); // Append the ipv6 loopback address. struct sockaddr_in6 ipv6_loopback_addr; memset(&ipv6_loopback_addr, 0, sizeof(ipv6_loopback_addr)); @@ -585,8 +583,8 @@ static bool inner_maybe_resolve_localhost_manually_locked( static bool grpc_ares_maybe_resolve_localhost_manually_locked( const grpc_ares_request* r, const char* name, const char* default_port, std::unique_ptr* addrs) { - grpc_core::UniquePtr host; - grpc_core::UniquePtr port; + std::string host; + std::string port; return inner_maybe_resolve_localhost_manually_locked(r, name, default_port, addrs, &host, &port); } diff --git a/src/core/ext/filters/client_channel/xds/xds_bootstrap.cc b/src/core/ext/filters/client_channel/xds/xds_bootstrap.cc index 0b5c9510b07..d7d39c5b6f6 100644 --- a/src/core/ext/filters/client_channel/xds/xds_bootstrap.cc +++ b/src/core/ext/filters/client_channel/xds/xds_bootstrap.cc @@ -23,11 +23,12 @@ #include #include +#include "absl/strings/string_view.h" + #include #include "src/core/lib/gpr/env.h" #include "src/core/lib/gpr/string.h" -#include "src/core/lib/gprpp/string_view.h" #include "src/core/lib/iomgr/load_file.h" #include "src/core/lib/slice/slice_internal.h" @@ -100,9 +101,8 @@ std::unique_ptr XdsBootstrap::ReadFromFile(XdsClient* client, if (*error != GRPC_ERROR_NONE) return nullptr; absl::string_view contents_str_view = StringViewFromSlice(contents); if (GRPC_TRACE_FLAG_ENABLED(*tracer)) { - UniquePtr str = StringViewToCString(contents_str_view); gpr_log(GPR_DEBUG, "[xds_client %p] Bootstrap file contents: %s", client, - str.get()); + std::string(contents_str_view).c_str()); } Json json = Json::Parse(contents_str_view, error); grpc_slice_unref_internal(contents); diff --git a/src/core/ext/filters/client_channel/xds/xds_client.cc b/src/core/ext/filters/client_channel/xds/xds_client.cc index 4bf5f0d63a2..70c6ebf1889 100644 --- a/src/core/ext/filters/client_channel/xds/xds_client.cc +++ b/src/core/ext/filters/client_channel/xds/xds_client.cc @@ -25,6 +25,7 @@ #include "absl/container/inlined_vector.h" #include "absl/strings/str_format.h" #include "absl/strings/str_join.h" +#include "absl/strings/string_view.h" #include #include @@ -49,7 +50,6 @@ #include "src/core/lib/gprpp/memory.h" #include "src/core/lib/gprpp/orphanable.h" #include "src/core/lib/gprpp/ref_counted_ptr.h" -#include "src/core/lib/gprpp/string_view.h" #include "src/core/lib/gprpp/sync.h" #include "src/core/lib/iomgr/sockaddr.h" #include "src/core/lib/iomgr/sockaddr_utils.h" @@ -1879,7 +1879,7 @@ void XdsClient::WatchClusterData( if (cluster_state.update.has_value()) { if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) { gpr_log(GPR_INFO, "[xds_client %p] returning cached cluster data for %s", - this, StringViewToCString(cluster_name).get()); + this, cluster_name_str.c_str()); } w->OnClusterChanged(cluster_state.update.value()); } @@ -1915,7 +1915,7 @@ void XdsClient::WatchEndpointData( if (endpoint_state.update.has_value()) { if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) { gpr_log(GPR_INFO, "[xds_client %p] returning cached endpoint data for %s", - this, StringViewToCString(eds_service_name).get()); + this, eds_service_name_str.c_str()); } w->OnEndpointChanged(endpoint_state.update.value()); } diff --git a/src/core/lib/channel/channelz.cc b/src/core/lib/channel/channelz.cc index ff6b7a71789..fab9dd86c64 100644 --- a/src/core/lib/channel/channelz.cc +++ b/src/core/lib/channel/channelz.cc @@ -387,15 +387,14 @@ void PopulateSocketAddressJson(Json::Object* json, const char* name, (strcmp(uri->scheme, "ipv6") == 0))) { const char* host_port = uri->path; if (*host_port == '/') ++host_port; - grpc_core::UniquePtr host; - grpc_core::UniquePtr port; + std::string host; + std::string port; GPR_ASSERT(SplitHostPort(host_port, &host, &port)); int port_num = -1; - if (port != nullptr) { - port_num = atoi(port.get()); + if (!port.empty()) { + port_num = atoi(port.data()); } - char* b64_host = - grpc_base64_encode(host.get(), strlen(host.get()), false, false); + char* b64_host = grpc_base64_encode(host.data(), host.size(), false, false); data["tcpip_address"] = Json::Object{ {"port", port_num}, {"ip_address", b64_host}, diff --git a/src/core/lib/gprpp/host_port.cc b/src/core/lib/gprpp/host_port.cc index 4a3efc38b30..5170559b1bf 100644 --- a/src/core/lib/gprpp/host_port.cc +++ b/src/core/lib/gprpp/host_port.cc @@ -22,6 +22,7 @@ #include +#include "absl/strings/str_format.h" #include "absl/strings/string_view.h" #include @@ -29,9 +30,18 @@ #include #include "src/core/lib/gpr/string.h" -#include "src/core/lib/gprpp/string_view.h" namespace grpc_core { + +std::string JoinHostPort(absl::string_view host, int port) { + if (host[0] != '[' && host.rfind(':') != host.npos) { + // IPv6 literals must be enclosed in brackets. + return absl::StrFormat("[%s]:%d", host, port); + } + // Ordinary non-bracketed host:port. + return absl::StrFormat("%s:%d", host, port); +} + int JoinHostPort(grpc_core::UniquePtr* out, const char* host, int port) { char* tmp; int ret; @@ -99,10 +109,10 @@ bool SplitHostPort(absl::string_view name, absl::string_view* host, return DoSplitHostPort(name, host, port, &unused); } -bool SplitHostPort(absl::string_view name, grpc_core::UniquePtr* host, - grpc_core::UniquePtr* port) { - GPR_DEBUG_ASSERT(host != nullptr && *host == nullptr); - GPR_DEBUG_ASSERT(port != nullptr && *port == nullptr); +bool SplitHostPort(absl::string_view name, std::string* host, + std::string* port) { + GPR_DEBUG_ASSERT(host != nullptr && host->empty()); + GPR_DEBUG_ASSERT(port != nullptr && port->empty()); absl::string_view host_view; absl::string_view port_view; bool has_port; @@ -111,11 +121,12 @@ bool SplitHostPort(absl::string_view name, grpc_core::UniquePtr* host, // We always set the host, but port is set only when DoSplitHostPort find a // port in the string, to remain backward compatible with the old // gpr_split_host_port API. - *host = StringViewToCString(host_view); + *host = std::string(host_view); if (has_port) { - *port = StringViewToCString(port_view); + *port = std::string(port_view); } } return ret; } + } // namespace grpc_core diff --git a/src/core/lib/gprpp/host_port.h b/src/core/lib/gprpp/host_port.h index de397f7f3fa..1521e2b3831 100644 --- a/src/core/lib/gprpp/host_port.h +++ b/src/core/lib/gprpp/host_port.h @@ -27,14 +27,15 @@ namespace grpc_core { -/** Given a host and port, creates a newly-allocated string of the form - "host:port" or "[ho:st]:port", depending on whether the host contains colons - like an IPv6 literal. If the host is already bracketed, then additional - brackets will not be added. - - Usage is similar to gpr_asprintf: returns the number of bytes written +// Given a host and port, creates a newly-allocated string of the form +// "host:port" or "[ho:st]:port", depending on whether the host contains colons +// like an IPv6 literal. If the host is already bracketed, then additional +// brackets will not be added. +std::string JoinHostPort(absl::string_view host, int port); +// TODO(roth): Change all callers to use the above variant and then +// remove this one. +/* Usage is similar to gpr_asprintf: returns the number of bytes written (excluding the final '\0'), and *out points to a string. - In the unlikely event of an error, returns -1 and sets *out to NULL. */ int JoinHostPort(grpc_core::UniquePtr* out, const char* host, int port); @@ -43,7 +44,7 @@ int JoinHostPort(grpc_core::UniquePtr* out, const char* host, int port); There are two variants of this method: 1) absl::string_view output: port and host are returned as views on name. - 2) char* output: port and host are copied into newly allocated strings. + 2) std::string output: port and host are copied into newly allocated strings. Prefer variant (1) over (2), because no allocation or copy is performed in variant (1). Use (2) only when interacting with C API that mandate @@ -53,8 +54,8 @@ int JoinHostPort(grpc_core::UniquePtr* out, const char* host, int port); cleared on failure. */ bool SplitHostPort(absl::string_view name, absl::string_view* host, absl::string_view* port); -bool SplitHostPort(absl::string_view name, grpc_core::UniquePtr* host, - grpc_core::UniquePtr* port); +bool SplitHostPort(absl::string_view name, std::string* host, + std::string* port); } // namespace grpc_core diff --git a/src/core/lib/gprpp/map.h b/src/core/lib/gprpp/map.h index 51778c02892..47fcdddf23a 100644 --- a/src/core/lib/gprpp/map.h +++ b/src/core/lib/gprpp/map.h @@ -25,8 +25,9 @@ #include -#include "src/core/lib/gprpp/ref_counted_ptr.h" -#include "src/core/lib/gprpp/string_view.h" +#include "absl/strings/string_view.h" + +#include "src/core/lib/gprpp/memory.h" namespace grpc_core { diff --git a/src/core/lib/gprpp/string_view.h b/src/core/lib/gprpp/string_view.h deleted file mode 100644 index 0b8cf311354..00000000000 --- a/src/core/lib/gprpp/string_view.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * - * Copyright 2019 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -#ifndef GRPC_CORE_LIB_GPRPP_STRING_VIEW_H -#define GRPC_CORE_LIB_GPRPP_STRING_VIEW_H - -#include - -#include -#include -#include - -#include -#include -#include -#include -#include - -#include "absl/strings/string_view.h" -#include "src/core/lib/gpr/string.h" -#include "src/core/lib/gpr/useful.h" -#include "src/core/lib/gprpp/memory.h" - -namespace grpc_core { - -// Creates a dup of the string viewed by this class. -// Return value is null-terminated and never nullptr. -inline grpc_core::UniquePtr StringViewToCString( - const absl::string_view sv) { - char* str = static_cast(gpr_malloc(sv.size() + 1)); - if (sv.size() > 0) memcpy(str, sv.data(), sv.size()); - str[sv.size()] = '\0'; - return grpc_core::UniquePtr(str); -} - -} // namespace grpc_core - -#endif /* GRPC_CORE_LIB_GPRPP_STRING_VIEW_H */ diff --git a/src/core/lib/iomgr/resolve_address_custom.cc b/src/core/lib/iomgr/resolve_address_custom.cc index 1d5230d74d0..a19c5a78892 100644 --- a/src/core/lib/iomgr/resolve_address_custom.cc +++ b/src/core/lib/iomgr/resolve_address_custom.cc @@ -34,12 +34,12 @@ #include -typedef struct grpc_custom_resolver { - grpc_closure* on_done; - grpc_resolved_addresses** addresses; - char* host; - char* port; -} grpc_custom_resolver; +struct grpc_custom_resolver { + grpc_closure* on_done = nullptr; + grpc_resolved_addresses** addresses = nullptr; + std::string host; + std::string port; +}; static grpc_custom_resolver_vtable* resolve_address_vtable = nullptr; @@ -48,18 +48,18 @@ static int retry_named_port_failure(grpc_custom_resolver* r, // This loop is copied from resolve_address_posix.c const char* svc[][2] = {{"http", "80"}, {"https", "443"}}; for (size_t i = 0; i < GPR_ARRAY_SIZE(svc); i++) { - if (strcmp(r->port, svc[i][0]) == 0) { - gpr_free(r->port); - r->port = gpr_strdup(svc[i][1]); + if (r->port == svc[i][0]) { + r->port = svc[i][1]; if (res) { - grpc_error* error = - resolve_address_vtable->resolve(r->host, r->port, res); + grpc_error* error = resolve_address_vtable->resolve( + r->host.c_str(), r->port.c_str(), res); if (error != GRPC_ERROR_NONE) { GRPC_ERROR_UNREF(error); return 0; } } else { - resolve_address_vtable->resolve_async(r, r->host, r->port); + resolve_address_vtable->resolve_async(r, r->host.c_str(), + r->port.c_str()); } return 1; } @@ -81,26 +81,23 @@ void grpc_custom_resolve_callback(grpc_custom_resolver* r, if (r->on_done) { grpc_core::ExecCtx::Run(DEBUG_LOCATION, r->on_done, error); } - gpr_free(r->host); - gpr_free(r->port); - gpr_free(r); + delete r; } static grpc_error* try_split_host_port(const char* name, const char* default_port, - grpc_core::UniquePtr* host, - grpc_core::UniquePtr* port) { + std::string* host, std::string* port) { /* parse name, splitting it into host and port parts */ grpc_error* error; grpc_core::SplitHostPort(name, host, port); - if (*host == nullptr) { + if (host->empty()) { char* msg; gpr_asprintf(&msg, "unparseable host:port: '%s'", name); error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(msg); gpr_free(msg); return error; } - if (*port == nullptr) { + if (port->empty()) { // TODO(murgatroid99): add tests for this case if (default_port == nullptr) { char* msg; @@ -109,7 +106,7 @@ static grpc_error* try_split_host_port(const char* name, gpr_free(msg); return error; } - port->reset(gpr_strdup(default_port)); + *port = default_port; } return GRPC_ERROR_NONE; } @@ -117,26 +114,21 @@ static grpc_error* try_split_host_port(const char* name, static grpc_error* blocking_resolve_address_impl( const char* name, const char* default_port, grpc_resolved_addresses** addresses) { - grpc_core::UniquePtr host; - grpc_core::UniquePtr port; - grpc_error* err; - GRPC_CUSTOM_IOMGR_ASSERT_SAME_THREAD(); - err = try_split_host_port(name, default_port, &host, &port); + grpc_custom_resolver resolver; + grpc_error* err = + try_split_host_port(name, default_port, &resolver.host, &resolver.port); if (err != GRPC_ERROR_NONE) { return err; } /* Call getaddrinfo */ - grpc_custom_resolver resolver; - resolver.host = host.get(); - resolver.port = port.get(); - grpc_resolved_addresses* addrs; grpc_core::ExecCtx* curr = grpc_core::ExecCtx::Get(); grpc_core::ExecCtx::Set(nullptr); - err = resolve_address_vtable->resolve(host.get(), port.get(), &addrs); + err = resolve_address_vtable->resolve(resolver.host.c_str(), + resolver.port.c_str(), &addrs); if (err != GRPC_ERROR_NONE) { if (retry_named_port_failure(&resolver, &addrs)) { GRPC_ERROR_UNREF(err); @@ -154,24 +146,22 @@ static void resolve_address_impl(const char* name, const char* default_port, grpc_pollset_set* /*interested_parties*/, grpc_closure* on_done, grpc_resolved_addresses** addrs) { - grpc_custom_resolver* r = nullptr; - grpc_core::UniquePtr host; - grpc_core::UniquePtr port; - grpc_error* err; GRPC_CUSTOM_IOMGR_ASSERT_SAME_THREAD(); - err = try_split_host_port(name, default_port, &host, &port); + std::string host; + std::string port; + grpc_error* err = try_split_host_port(name, default_port, &host, &port); if (err != GRPC_ERROR_NONE) { grpc_core::ExecCtx::Run(DEBUG_LOCATION, on_done, err); return; } - r = (grpc_custom_resolver*)gpr_malloc(sizeof(grpc_custom_resolver)); + grpc_custom_resolver* r = new grpc_custom_resolver(); r->on_done = on_done; r->addresses = addrs; - r->host = host.release(); - r->port = port.release(); + r->host = std::move(host); + r->port = std::move(port); /* Call getaddrinfo */ - resolve_address_vtable->resolve_async(r, r->host, r->port); + resolve_address_vtable->resolve_async(r, r->host.c_str(), r->port.c_str()); } static grpc_address_resolver_vtable custom_resolver_vtable = { diff --git a/src/core/lib/iomgr/resolve_address_custom.h b/src/core/lib/iomgr/resolve_address_custom.h index e0c6714087a..f5f68ca32dd 100644 --- a/src/core/lib/iomgr/resolve_address_custom.h +++ b/src/core/lib/iomgr/resolve_address_custom.h @@ -29,8 +29,10 @@ typedef struct grpc_custom_resolver grpc_custom_resolver; typedef struct grpc_custom_resolver_vtable { - grpc_error* (*resolve)(char* host, char* port, grpc_resolved_addresses** res); - void (*resolve_async)(grpc_custom_resolver* resolver, char* host, char* port); + grpc_error* (*resolve)(const char* host, const char* port, + grpc_resolved_addresses** res); + void (*resolve_async)(grpc_custom_resolver* resolver, const char* host, + const char* port); } grpc_custom_resolver_vtable; void grpc_custom_resolve_callback(grpc_custom_resolver* resolver, diff --git a/src/core/lib/iomgr/resolve_address_posix.cc b/src/core/lib/iomgr/resolve_address_posix.cc index 1d2a79f41d8..aed52b2455a 100644 --- a/src/core/lib/iomgr/resolve_address_posix.cc +++ b/src/core/lib/iomgr/resolve_address_posix.cc @@ -57,24 +57,24 @@ static grpc_error* posix_blocking_resolve_address( return grpc_resolve_unix_domain_address(name + 5, addresses); } - grpc_core::UniquePtr host; - grpc_core::UniquePtr port; + std::string host; + std::string port; /* parse name, splitting it into host and port parts */ grpc_core::SplitHostPort(name, &host, &port); - if (host == nullptr) { + if (host.empty()) { err = grpc_error_set_str( GRPC_ERROR_CREATE_FROM_STATIC_STRING("unparseable host:port"), GRPC_ERROR_STR_TARGET_ADDRESS, grpc_slice_from_copied_string(name)); goto done; } - if (port == nullptr) { + if (port.empty()) { if (default_port == nullptr) { err = grpc_error_set_str( GRPC_ERROR_CREATE_FROM_STATIC_STRING("no port in name"), GRPC_ERROR_STR_TARGET_ADDRESS, grpc_slice_from_copied_string(name)); goto done; } - port.reset(gpr_strdup(default_port)); + port = default_port; } /* Call getaddrinfo */ @@ -84,16 +84,16 @@ static grpc_error* posix_blocking_resolve_address( hints.ai_flags = AI_PASSIVE; /* for wildcard IP address */ GRPC_SCHEDULING_START_BLOCKING_REGION; - s = getaddrinfo(host.get(), port.get(), &hints, &result); + s = getaddrinfo(host.c_str(), port.c_str(), &hints, &result); GRPC_SCHEDULING_END_BLOCKING_REGION; if (s != 0) { /* Retry if well-known service name is recognized */ const char* svc[][2] = {{"http", "80"}, {"https", "443"}}; for (i = 0; i < GPR_ARRAY_SIZE(svc); i++) { - if (strcmp(port.get(), svc[i][0]) == 0) { + if (port == svc[i][0]) { GRPC_SCHEDULING_START_BLOCKING_REGION; - s = getaddrinfo(host.get(), svc[i][1], &hints, &result); + s = getaddrinfo(host.c_str(), svc[i][1], &hints, &result); GRPC_SCHEDULING_END_BLOCKING_REGION; break; } diff --git a/src/core/lib/iomgr/resolve_address_windows.cc b/src/core/lib/iomgr/resolve_address_windows.cc index 5a9d4421bb4..894ea993588 100644 --- a/src/core/lib/iomgr/resolve_address_windows.cc +++ b/src/core/lib/iomgr/resolve_address_windows.cc @@ -62,17 +62,17 @@ static grpc_error* windows_blocking_resolve_address( grpc_error* error = GRPC_ERROR_NONE; /* parse name, splitting it into host and port parts */ - grpc_core::UniquePtr host; - grpc_core::UniquePtr port; + std::string host; + std::string port; grpc_core::SplitHostPort(name, &host, &port); - if (host == NULL) { + if (host.empty()) { char* msg; gpr_asprintf(&msg, "unparseable host:port: '%s'", name); error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(msg); gpr_free(msg); goto done; } - if (port == NULL) { + if (port.empty()) { if (default_port == NULL) { char* msg; gpr_asprintf(&msg, "no port in name '%s'", name); @@ -80,7 +80,7 @@ static grpc_error* windows_blocking_resolve_address( gpr_free(msg); goto done; } - port.reset(gpr_strdup(default_port)); + port = default_port; } /* Call getaddrinfo */ @@ -90,7 +90,7 @@ static grpc_error* windows_blocking_resolve_address( hints.ai_flags = AI_PASSIVE; /* for wildcard IP address */ GRPC_SCHEDULING_START_BLOCKING_REGION; - s = getaddrinfo(host.get(), port.get(), &hints, &result); + s = getaddrinfo(host.c_str(), port.c_str(), &hints, &result); GRPC_SCHEDULING_END_BLOCKING_REGION; if (s != 0) { error = GRPC_WSA_ERROR(WSAGetLastError(), "getaddrinfo"); diff --git a/src/core/lib/iomgr/sockaddr_utils.h b/src/core/lib/iomgr/sockaddr_utils.h index a4e90a73ab3..677f953831b 100644 --- a/src/core/lib/iomgr/sockaddr_utils.h +++ b/src/core/lib/iomgr/sockaddr_utils.h @@ -68,6 +68,8 @@ int grpc_sockaddr_set_port(const grpc_resolved_address* addr, int port); In the unlikely event of an error, returns -1 and sets *out to NULL. The existing value of errno is always preserved. */ +// TODO(roth): Change this to return std::string as part of eliminating +// the old API for JoinHostPort(). int grpc_sockaddr_to_string(char** out, const grpc_resolved_address* addr, int normalize); diff --git a/src/core/lib/iomgr/tcp_client_cfstream.cc b/src/core/lib/iomgr/tcp_client_cfstream.cc index 23d8c0c0089..3e701f8c13e 100644 --- a/src/core/lib/iomgr/tcp_client_cfstream.cc +++ b/src/core/lib/iomgr/tcp_client_cfstream.cc @@ -145,11 +145,11 @@ static void ParseResolvedAddress(const grpc_resolved_address* addr, CFStringRef* host, int* port) { char* host_port; grpc_sockaddr_to_string(&host_port, addr, 1); - grpc_core::UniquePtr host_string; - grpc_core::UniquePtr port_string; + std::string host_string; + std::string port_string; grpc_core::SplitHostPort(host_port, &host_string, &port_string); - *host = - CFStringCreateWithCString(NULL, host_string.get(), kCFStringEncodingUTF8); + *host = CFStringCreateWithCString(NULL, host_string.c_str(), + kCFStringEncodingUTF8); gpr_free(host_port); *port = grpc_sockaddr_get_port(addr); } diff --git a/src/core/lib/iomgr/tcp_uv.cc b/src/core/lib/iomgr/tcp_uv.cc index f0847a195ca..942b7d60e45 100644 --- a/src/core/lib/iomgr/tcp_uv.cc +++ b/src/core/lib/iomgr/tcp_uv.cc @@ -370,7 +370,7 @@ static void uv_resolve_callback(uv_getaddrinfo_t* req, int status, tcp_error_create("getaddrinfo failed", status)); } -static grpc_error* uv_resolve(char* host, char* port, +static grpc_error* uv_resolve(const char* host, const char* port, grpc_resolved_addresses** result) { int status; uv_getaddrinfo_t req; @@ -388,7 +388,8 @@ static grpc_error* uv_resolve(char* host, char* port, return tcp_error_create("getaddrinfo failed", status); } -static void uv_resolve_async(grpc_custom_resolver* r, char* host, char* port) { +static void uv_resolve_async(grpc_custom_resolver* r, const char* host, + const char* port) { int status; uv_getaddrinfo_t* req = (uv_getaddrinfo_t*)gpr_malloc(sizeof(uv_getaddrinfo_t)); diff --git a/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc b/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc index 54f538c9032..762069a0e73 100644 --- a/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +++ b/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc @@ -22,6 +22,8 @@ #include +#include "absl/strings/string_view.h" + #include #include #include @@ -31,7 +33,6 @@ #include "src/core/lib/gpr/string.h" #include "src/core/lib/gprpp/host_port.h" #include "src/core/lib/gprpp/ref_counted_ptr.h" -#include "src/core/lib/gprpp/string_view.h" #include "src/core/lib/security/context/security_context.h" #include "src/core/lib/security/credentials/credentials.h" #include "src/core/lib/security/credentials/ssl/ssl_credentials.h" @@ -73,14 +74,13 @@ class grpc_ssl_channel_security_connector final : grpc_channel_security_connector(GRPC_SSL_URL_SCHEME, std::move(channel_creds), std::move(request_metadata_creds)), - overridden_target_name_(overridden_target_name == nullptr - ? nullptr - : gpr_strdup(overridden_target_name)), + overridden_target_name_( + overridden_target_name == nullptr ? "" : overridden_target_name), verify_options_(&config->verify_options) { absl::string_view host; absl::string_view port; grpc_core::SplitHostPort(target_name, &host, &port); - target_name_ = grpc_core::StringViewToCString(host); + target_name_ = std::string(host); } ~grpc_ssl_channel_security_connector() override { @@ -125,8 +125,8 @@ class grpc_ssl_channel_security_connector final tsi_handshaker* tsi_hs = nullptr; tsi_result result = tsi_ssl_client_handshaker_factory_create_handshaker( client_handshaker_factory_, - overridden_target_name_ != nullptr ? overridden_target_name_.get() - : target_name_.get(), + overridden_target_name_.empty() ? target_name_.c_str() + : overridden_target_name_.c_str(), &tsi_hs); if (result != TSI_OK) { gpr_log(GPR_ERROR, "Handshaker creation failed with error %s.", @@ -140,9 +140,9 @@ class grpc_ssl_channel_security_connector final void check_peer(tsi_peer peer, grpc_endpoint* /*ep*/, grpc_core::RefCountedPtr* auth_context, grpc_closure* on_peer_checked) override { - const char* target_name = overridden_target_name_ != nullptr - ? overridden_target_name_.get() - : target_name_.get(); + const char* target_name = overridden_target_name_.empty() + ? target_name_.c_str() + : overridden_target_name_.c_str(); grpc_error* error = ssl_check_peer(target_name, &peer, auth_context); if (error == GRPC_ERROR_NONE && verify_options_->verify_peer_callback != nullptr) { @@ -177,23 +177,17 @@ class grpc_ssl_channel_security_connector final reinterpret_cast(other_sc); int c = channel_security_connector_cmp(other); if (c != 0) return c; - c = strcmp(target_name_.get(), other->target_name_.get()); + c = target_name_.compare(other->target_name_); if (c != 0) return c; - return (overridden_target_name_ == nullptr || - other->overridden_target_name_ == nullptr) - ? GPR_ICMP(overridden_target_name_.get(), - other->overridden_target_name_.get()) - : strcmp(overridden_target_name_.get(), - other->overridden_target_name_.get()); + return overridden_target_name_.compare(other->overridden_target_name_); } bool check_call_host(absl::string_view host, grpc_auth_context* auth_context, grpc_closure* /*on_call_host_checked*/, grpc_error** error) override { - return grpc_ssl_check_call_host( - host, target_name_.get(), - overridden_target_name_ != nullptr ? overridden_target_name_.get() : "", - auth_context, error); + return grpc_ssl_check_call_host(host, target_name_.c_str(), + overridden_target_name_.c_str(), + auth_context, error); } void cancel_check_call_host(grpc_closure* /*on_call_host_checked*/, @@ -203,8 +197,8 @@ class grpc_ssl_channel_security_connector final private: tsi_ssl_client_handshaker_factory* client_handshaker_factory_; - grpc_core::UniquePtr target_name_; - grpc_core::UniquePtr overridden_target_name_; + std::string target_name_; + std::string overridden_target_name_; const verify_peer_options* verify_options_; }; diff --git a/src/core/lib/security/security_connector/tls/tls_security_connector.cc b/src/core/lib/security/security_connector/tls/tls_security_connector.cc index 4c142e2edfb..6cc2d840e2b 100644 --- a/src/core/lib/security/security_connector/tls/tls_security_connector.cc +++ b/src/core/lib/security/security_connector/tls/tls_security_connector.cc @@ -23,13 +23,14 @@ #include #include +#include "absl/strings/string_view.h" + #include #include #include #include #include "src/core/lib/gprpp/host_port.h" -#include "src/core/lib/gprpp/string_view.h" #include "src/core/lib/security/credentials/ssl/ssl_credentials.h" #include "src/core/lib/security/credentials/tls/tls_credentials.h" #include "src/core/lib/security/security_connector/ssl_utils.h" @@ -145,15 +146,14 @@ TlsChannelSecurityConnector::TlsChannelSecurityConnector( : grpc_channel_security_connector(GRPC_SSL_URL_SCHEME, std::move(channel_creds), std::move(request_metadata_creds)), - overridden_target_name_(overridden_target_name == nullptr - ? nullptr - : gpr_strdup(overridden_target_name)) { + overridden_target_name_( + overridden_target_name == nullptr ? "" : overridden_target_name) { key_materials_config_ = grpc_tls_key_materials_config_create()->Ref(); check_arg_ = ServerAuthorizationCheckArgCreate(this); absl::string_view host; absl::string_view port; grpc_core::SplitHostPort(target_name, &host, &port); - target_name_ = StringViewToCString(host); + target_name_ = std::string(host); } TlsChannelSecurityConnector::~TlsChannelSecurityConnector() { @@ -177,8 +177,8 @@ void TlsChannelSecurityConnector::add_handshakers( tsi_handshaker* tsi_hs = nullptr; tsi_result result = tsi_ssl_client_handshaker_factory_create_handshaker( client_handshaker_factory_, - overridden_target_name_ != nullptr ? overridden_target_name_.get() - : target_name_.get(), + overridden_target_name_.empty() ? target_name_.c_str() + : overridden_target_name_.c_str(), &tsi_hs); if (result != TSI_OK) { gpr_log(GPR_ERROR, "Handshaker creation failed with error %s.", @@ -193,9 +193,9 @@ void TlsChannelSecurityConnector::check_peer( tsi_peer peer, grpc_endpoint* /*ep*/, grpc_core::RefCountedPtr* auth_context, grpc_closure* on_peer_checked) { - const char* target_name = overridden_target_name_ != nullptr - ? overridden_target_name_.get() - : target_name_.get(); + const char* target_name = overridden_target_name_.empty() + ? target_name_.c_str() + : overridden_target_name_.c_str(); grpc_error* error = grpc_ssl_check_alpn(&peer); if (error != GRPC_ERROR_NONE) { grpc_core::ExecCtx::Run(DEBUG_LOCATION, on_peer_checked, error); @@ -272,16 +272,16 @@ int TlsChannelSecurityConnector::cmp( if (c != 0) { return c; } - return grpc_ssl_cmp_target_name(target_name_.get(), other->target_name_.get(), - overridden_target_name_.get(), - other->overridden_target_name_.get()); + return grpc_ssl_cmp_target_name( + target_name_.c_str(), other->target_name_.c_str(), + overridden_target_name_.c_str(), other->overridden_target_name_.c_str()); } bool TlsChannelSecurityConnector::check_call_host( absl::string_view host, grpc_auth_context* auth_context, grpc_closure* on_call_host_checked, grpc_error** error) { - return grpc_ssl_check_call_host(host, target_name_.get(), - overridden_target_name_.get(), auth_context, + return grpc_ssl_check_call_host(host, target_name_.c_str(), + overridden_target_name_.c_str(), auth_context, error); } diff --git a/src/core/lib/security/security_connector/tls/tls_security_connector.h b/src/core/lib/security/security_connector/tls/tls_security_connector.h index 69ac8eef58c..db5c87bdaef 100644 --- a/src/core/lib/security/security_connector/tls/tls_security_connector.h +++ b/src/core/lib/security/security_connector/tls/tls_security_connector.h @@ -97,8 +97,8 @@ class TlsChannelSecurityConnector final grpc_core::Mutex mu_; grpc_closure* on_peer_checked_; - grpc_core::UniquePtr target_name_; - grpc_core::UniquePtr overridden_target_name_; + std::string target_name_; + std::string overridden_target_name_; tsi_ssl_client_handshaker_factory* client_handshaker_factory_ = nullptr; grpc_tls_server_authorization_check_arg* check_arg_; grpc_core::RefCountedPtr key_materials_config_; diff --git a/src/core/tsi/ssl_transport_security.cc b/src/core/tsi/ssl_transport_security.cc index bd82dc1db47..138fe36a8d6 100644 --- a/src/core/tsi/ssl_transport_security.cc +++ b/src/core/tsi/ssl_transport_security.cc @@ -34,6 +34,7 @@ #endif #include "absl/strings/match.h" +#include "absl/strings/string_view.h" #include #include @@ -53,7 +54,6 @@ extern "C" { } #include "src/core/lib/gpr/useful.h" -#include "src/core/lib/gprpp/string_view.h" #include "src/core/tsi/ssl/session_cache/ssl_session_cache.h" #include "src/core/tsi/ssl_types.h" #include "src/core/tsi/transport_security.h" @@ -1677,10 +1677,8 @@ static int does_entry_match_name(absl::string_view entry, entry.remove_prefix(2); /* Remove *. */ size_t dot = name_subdomain.find('.'); if (dot == absl::string_view::npos || dot == name_subdomain.size() - 1) { - grpc_core::UniquePtr name_subdomain_cstr( - grpc_core::StringViewToCString(name_subdomain)); gpr_log(GPR_ERROR, "Invalid toplevel subdomain: %s", - name_subdomain_cstr.get()); + std::string(name_subdomain).c_str()); return 0; } if (name_subdomain.back() == '.') { diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/iomgr/iomgr.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/iomgr/iomgr.pyx.pxi index f5b62af5287..65ec0c8f202 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/iomgr/iomgr.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/iomgr/iomgr.pyx.pxi @@ -167,8 +167,8 @@ cdef void asyncio_socket_accept( cdef grpc_error* asyncio_resolve( - char* host, - char* port, + const char* host, + const char* port, grpc_resolved_addresses** res) with gil: result = native_socket.getaddrinfo(host, port) res[0] = tuples_to_resolvaddr(result) @@ -176,8 +176,8 @@ cdef grpc_error* asyncio_resolve( cdef void asyncio_resolve_async( grpc_custom_resolver* grpc_resolver, - char* host, - char* port) with gil: + const char* host, + const char* port) with gil: resolver = _AsyncioResolver.create(grpc_resolver) resolver.resolve(host, port) diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/iomgr/resolver.pxd.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/iomgr/resolver.pxd.pxi index 35d4e484b09..51730c15976 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/iomgr/resolver.pxd.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/iomgr/resolver.pxd.pxi @@ -21,4 +21,4 @@ cdef class _AsyncioResolver: @staticmethod cdef _AsyncioResolver create(grpc_custom_resolver* grpc_resolver) - cdef void resolve(self, char* host, char* port) + cdef void resolve(self, const char* host, const char* port) diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/iomgr/resolver.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/iomgr/resolver.pyx.pxi index 4983eab5113..3e664245aac 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/iomgr/resolver.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/iomgr/resolver.pyx.pxi @@ -48,7 +48,7 @@ cdef class _AsyncioResolver: 0 ) - cdef void resolve(self, char* host, char* port): + cdef void resolve(self, const char* host, const char* port): assert not self._task_resolve self._task_resolve = self._loop.create_task( diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pxd.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pxd.pxi index 4f5033b8e44..bd1d73145b9 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pxd.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pxd.pxi @@ -37,5 +37,5 @@ cdef class SocketWrapper: cdef class ResolveWrapper: cdef grpc_custom_resolver *c_resolver - cdef char* c_host - cdef char* c_port + cdef const char* c_host + cdef const char* c_port diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi index 05e185ddd47..0f693ec6911 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx.pxi @@ -283,14 +283,14 @@ cdef socket_resolve_async_cython(ResolveWrapper resolve_wrapper): def socket_resolve_async_python(resolve_wrapper): socket_resolve_async_cython(resolve_wrapper) -cdef void socket_resolve_async(grpc_custom_resolver* r, char* host, char* port) with gil: +cdef void socket_resolve_async(grpc_custom_resolver* r, const char* host, const char* port) with gil: rw = ResolveWrapper() rw.c_resolver = r rw.c_host = host rw.c_port = port _spawn_greenlet(socket_resolve_async_python, rw) -cdef grpc_error* socket_resolve(char* host, char* port, +cdef grpc_error* socket_resolve(const char* host, const char* port, grpc_resolved_addresses** res) with gil: try: result = gevent_socket.getaddrinfo(host, port) diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/iomgr.pxd.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/iomgr.pxd.pxi index 7bf90c38884..bb934ebb77c 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/iomgr.pxd.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/iomgr.pxd.pxi @@ -46,8 +46,8 @@ cdef extern from "src/core/lib/iomgr/resolve_address_custom.h": pass struct grpc_custom_resolver_vtable: - grpc_error* (*resolve)(char* host, char* port, grpc_resolved_addresses** res); - void (*resolve_async)(grpc_custom_resolver* resolver, char* host, char* port); + grpc_error* (*resolve)(const char* host, const char* port, grpc_resolved_addresses** res); + void (*resolve_async)(grpc_custom_resolver* resolver, const char* host, const char* port); void grpc_custom_resolve_callback(grpc_custom_resolver* resolver, grpc_resolved_addresses* result, diff --git a/test/core/client_channel/parse_address_with_named_scope_id_test.cc b/test/core/client_channel/parse_address_with_named_scope_id_test.cc index 79b50d03864..fedbc25ace3 100644 --- a/test/core/client_channel/parse_address_with_named_scope_id_test.cc +++ b/test/core/client_channel/parse_address_with_named_scope_id_test.cc @@ -61,8 +61,8 @@ static void test_grpc_parse_ipv6_parity_with_getaddrinfo( struct sockaddr_in6 resolve_with_gettaddrinfo(const char* uri_text) { grpc_uri* uri = grpc_uri_parse(uri_text, 0); - grpc_core::UniquePtr host; - grpc_core::UniquePtr port; + std::string host; + std::string port; grpc_core::SplitHostPort(uri->path, &host, &port); struct addrinfo hints; memset(&hints, 0, sizeof(hints)); @@ -70,11 +70,11 @@ struct sockaddr_in6 resolve_with_gettaddrinfo(const char* uri_text) { hints.ai_socktype = SOCK_STREAM; hints.ai_flags = AI_NUMERICHOST; struct addrinfo* result; - int res = getaddrinfo(host.get(), port.get(), &hints, &result); + int res = getaddrinfo(host.c_str(), port.c_str(), &hints, &result); if (res != 0) { gpr_log(GPR_ERROR, "getaddrinfo failed to resolve host:%s port:%s. Error: %d.", - host.get(), port.get(), res); + host.c_str(), port.c_str(), res); abort(); } size_t num_addrs_from_getaddrinfo = 0; diff --git a/test/core/gprpp/BUILD b/test/core/gprpp/BUILD index 4eb81c3db23..4c9e82fa868 100644 --- a/test/core/gprpp/BUILD +++ b/test/core/gprpp/BUILD @@ -135,19 +135,6 @@ grpc_cc_test( ], ) -grpc_cc_test( - name = "string_view_test", - srcs = ["string_view_test.cc"], - external_deps = [ - "gtest", - ], - language = "C++", - deps = [ - "//:gpr_base", - "//test/core/util:grpc_test_util", - ], -) - grpc_cc_test( name = "thd_test", srcs = ["thd_test.cc"], diff --git a/test/core/gprpp/host_port_test.cc b/test/core/gprpp/host_port_test.cc index cfe0eddb036..54914808545 100644 --- a/test/core/gprpp/host_port_test.cc +++ b/test/core/gprpp/host_port_test.cc @@ -50,21 +50,13 @@ static void test_join_host_port_garbage(void) { static void split_host_port_expect(const char* name, const char* host, const char* port, bool ret) { - grpc_core::UniquePtr actual_host; - grpc_core::UniquePtr actual_port; + std::string actual_host; + std::string actual_port; const bool actual_ret = grpc_core::SplitHostPort(name, &actual_host, &actual_port); GPR_ASSERT(actual_ret == ret); - if (host == nullptr) { - GPR_ASSERT(actual_host == nullptr); - } else { - GPR_ASSERT(strcmp(host, actual_host.get()) == 0); - } - if (port == nullptr) { - GPR_ASSERT(actual_port == nullptr); - } else { - GPR_ASSERT(strcmp(port, actual_port.get()) == 0); - } + GPR_ASSERT(actual_host == (host == nullptr ? "" : host)); + GPR_ASSERT(actual_port == (port == nullptr ? "" : port)); } static void test_split_host_port() { diff --git a/test/core/gprpp/string_view_test.cc b/test/core/gprpp/string_view_test.cc deleted file mode 100644 index 5f9f8df76b5..00000000000 --- a/test/core/gprpp/string_view_test.cc +++ /dev/null @@ -1,44 +0,0 @@ -/* - * - * Copyright 2017 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#include - -#include "src/core/lib/gprpp/string_view.h" - -#include -#include "src/core/lib/gprpp/memory.h" -#include "test/core/util/test_config.h" - -namespace grpc_core { -namespace testing { - -TEST(StringViewTest, Dup) { - constexpr char kStr[] = "foo"; - absl::string_view sv = kStr; - grpc_core::UniquePtr dup = grpc_core::StringViewToCString(sv); - EXPECT_EQ(std::string(sv), dup.get()); -} - -} // namespace testing -} // namespace grpc_core - -int main(int argc, char** argv) { - grpc::testing::TestEnvironment env(argc, argv); - ::testing::InitGoogleTest(&argc, argv); - return RUN_ALL_TESTS(); -} diff --git a/test/cpp/end2end/client_lb_end2end_test.cc b/test/cpp/end2end/client_lb_end2end_test.cc index f1fde6a99e4..cd95e670861 100644 --- a/test/cpp/end2end/client_lb_end2end_test.cc +++ b/test/cpp/end2end/client_lb_end2end_test.cc @@ -48,7 +48,6 @@ #include "src/core/lib/gpr/env.h" #include "src/core/lib/gprpp/debug_location.h" #include "src/core/lib/gprpp/ref_counted_ptr.h" -#include "src/core/lib/gprpp/string_view.h" #include "src/core/lib/iomgr/tcp_client.h" #include "src/core/lib/security/credentials/fake/fake_credentials.h" #include "src/core/lib/surface/init.h" @@ -1674,14 +1673,14 @@ class ClientLbInterceptTrailingMetadataTest : public ClientLbEnd2endTest { backend_metric_data->mem_utilization); self->load_report_->set_rps(backend_metric_data->requests_per_second); for (const auto& p : backend_metric_data->request_cost) { - grpc_core::UniquePtr name = - grpc_core::StringViewToCString(p.first); - (*self->load_report_->mutable_request_cost())[name.get()] = p.second; + std::string name = std::string(p.first); + (*self->load_report_->mutable_request_cost())[std::move(name)] = + p.second; } for (const auto& p : backend_metric_data->utilization) { - grpc_core::UniquePtr name = - grpc_core::StringViewToCString(p.first); - (*self->load_report_->mutable_utilization())[name.get()] = p.second; + std::string name = std::string(p.first); + (*self->load_report_->mutable_utilization())[std::move(name)] = + p.second; } } } diff --git a/test/cpp/naming/address_sorting_test.cc b/test/cpp/naming/address_sorting_test.cc index dd49a2c92e5..6f94635927d 100644 --- a/test/cpp/naming/address_sorting_test.cc +++ b/test/cpp/naming/address_sorting_test.cc @@ -64,25 +64,25 @@ struct TestAddress { }; grpc_resolved_address TestAddressToGrpcResolvedAddress(TestAddress test_addr) { - grpc_core::UniquePtr host; - grpc_core::UniquePtr port; + std::string host; + std::string port; grpc_resolved_address resolved_addr; grpc_core::SplitHostPort(test_addr.dest_addr.c_str(), &host, &port); if (test_addr.family == AF_INET) { sockaddr_in in_dest; memset(&in_dest, 0, sizeof(sockaddr_in)); - in_dest.sin_port = htons(atoi(port.get())); + in_dest.sin_port = htons(atoi(port.c_str())); in_dest.sin_family = AF_INET; - GPR_ASSERT(inet_pton(AF_INET, host.get(), &in_dest.sin_addr) == 1); + GPR_ASSERT(inet_pton(AF_INET, host.c_str(), &in_dest.sin_addr) == 1); memcpy(&resolved_addr.addr, &in_dest, sizeof(sockaddr_in)); resolved_addr.len = sizeof(sockaddr_in); } else { GPR_ASSERT(test_addr.family == AF_INET6); sockaddr_in6 in6_dest; memset(&in6_dest, 0, sizeof(sockaddr_in6)); - in6_dest.sin6_port = htons(atoi(port.get())); + in6_dest.sin6_port = htons(atoi(port.c_str())); in6_dest.sin6_family = AF_INET6; - GPR_ASSERT(inet_pton(AF_INET6, host.get(), &in6_dest.sin6_addr) == 1); + GPR_ASSERT(inet_pton(AF_INET6, host.c_str(), &in6_dest.sin6_addr) == 1); memcpy(&resolved_addr.addr, &in6_dest, sizeof(sockaddr_in6)); resolved_addr.len = sizeof(sockaddr_in6); } diff --git a/test/cpp/naming/resolver_component_test.cc b/test/cpp/naming/resolver_component_test.cc index 47b17973d53..c5dfc777397 100644 --- a/test/cpp/naming/resolver_component_test.cc +++ b/test/cpp/naming/resolver_component_test.cc @@ -521,8 +521,8 @@ int g_fake_non_responsive_dns_server_port = -1; void InjectBrokenNameServerList(ares_channel channel) { struct ares_addr_port_node dns_server_addrs[2]; memset(dns_server_addrs, 0, sizeof(dns_server_addrs)); - grpc_core::UniquePtr unused_host; - grpc_core::UniquePtr local_dns_server_port; + std::string unused_host; + std::string local_dns_server_port; GPR_ASSERT(grpc_core::SplitHostPort(FLAGS_local_dns_server_address.c_str(), &unused_host, &local_dns_server_port)); gpr_log(GPR_DEBUG, @@ -543,8 +543,8 @@ void InjectBrokenNameServerList(ares_channel channel) { dns_server_addrs[1].family = AF_INET; ((char*)&dns_server_addrs[1].addr.addr4)[0] = 0x7f; ((char*)&dns_server_addrs[1].addr.addr4)[3] = 0x1; - dns_server_addrs[1].tcp_port = atoi(local_dns_server_port.get()); - dns_server_addrs[1].udp_port = atoi(local_dns_server_port.get()); + dns_server_addrs[1].tcp_port = atoi(local_dns_server_port.c_str()); + dns_server_addrs[1].udp_port = atoi(local_dns_server_port.c_str()); dns_server_addrs[1].next = nullptr; GPR_ASSERT(ares_set_servers_ports(channel, dns_server_addrs) == ARES_SUCCESS); } diff --git a/tools/doxygen/Doxyfile.c++.internal b/tools/doxygen/Doxyfile.c++.internal index c5d220fabf1..94b242dbeb6 100644 --- a/tools/doxygen/Doxyfile.c++.internal +++ b/tools/doxygen/Doxyfile.c++.internal @@ -1503,7 +1503,6 @@ src/core/lib/gprpp/mpscq.h \ src/core/lib/gprpp/orphanable.h \ src/core/lib/gprpp/ref_counted.h \ src/core/lib/gprpp/ref_counted_ptr.h \ -src/core/lib/gprpp/string_view.h \ src/core/lib/gprpp/sync.h \ src/core/lib/gprpp/thd.h \ src/core/lib/gprpp/thd_posix.cc \ diff --git a/tools/doxygen/Doxyfile.core.internal b/tools/doxygen/Doxyfile.core.internal index 04f37228424..72db4df6142 100644 --- a/tools/doxygen/Doxyfile.core.internal +++ b/tools/doxygen/Doxyfile.core.internal @@ -1314,7 +1314,6 @@ src/core/lib/gprpp/mpscq.h \ src/core/lib/gprpp/orphanable.h \ src/core/lib/gprpp/ref_counted.h \ src/core/lib/gprpp/ref_counted_ptr.h \ -src/core/lib/gprpp/string_view.h \ src/core/lib/gprpp/sync.h \ src/core/lib/gprpp/thd.h \ src/core/lib/gprpp/thd_posix.cc \ diff --git a/tools/run_tests/generated/tests.json b/tools/run_tests/generated/tests.json index ab8760486a7..8d568daff05 100644 --- a/tools/run_tests/generated/tests.json +++ b/tools/run_tests/generated/tests.json @@ -5667,30 +5667,6 @@ ], "uses_polling": false }, - { - "args": [], - "benchmark": false, - "ci_platforms": [ - "linux", - "mac", - "posix", - "windows" - ], - "cpu_cost": 1.0, - "exclude_configs": [], - "exclude_iomgrs": [], - "flaky": false, - "gtest": true, - "language": "c++", - "name": "string_view_test", - "platforms": [ - "linux", - "mac", - "posix", - "windows" - ], - "uses_polling": true - }, { "args": [], "benchmark": false, From bb557bb6ffd98facba018a2c89d9b06cd717fd90 Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Tue, 28 Apr 2020 09:59:54 +1200 Subject: [PATCH 628/758] Unit tests --- src/csharp/Grpc.Core.Api/Metadata.cs | 15 ++- src/csharp/Grpc.Core.Tests/MetadataTest.cs | 106 +++++++++++++++++++++ 2 files changed, 117 insertions(+), 4 deletions(-) diff --git a/src/csharp/Grpc.Core.Api/Metadata.cs b/src/csharp/Grpc.Core.Api/Metadata.cs index 376ccc531b7..9c564766568 100644 --- a/src/csharp/Grpc.Core.Api/Metadata.cs +++ b/src/csharp/Grpc.Core.Api/Metadata.cs @@ -76,7 +76,8 @@ namespace Grpc.Core } /// - /// Gets the last metadata entry with the specified key. If there are no matching entries then null is returned. + /// Gets the last metadata entry with the specified key. + /// If there are no matching entries then null is returned. /// public Entry Get(string key) { @@ -92,7 +93,9 @@ namespace Grpc.Core } /// - /// Gets the string value of the last metadata entry with the specified key. If there are no matching entries then null is returned. + /// Gets the string value of the last metadata entry with the specified key. + /// If the metadata entry is binary then an exception is thrown. + /// If there are no matching entries then null is returned. /// public string GetValue(string key) { @@ -100,7 +103,9 @@ namespace Grpc.Core } /// - /// Gets the bytes value of the last metadata entry with the specified key. If there are no matching entries then null is returned. + /// Gets the bytes value of the last metadata entry with the specified key. + /// If the metadata entry is not binary the string value will be returned as ASCII encoded bytes. + /// If there are no matching entries then null is returned. /// public byte[] GetValueBytes(string key) { @@ -324,6 +329,7 @@ namespace Grpc.Core /// /// Gets the binary value of this metadata entry. + /// If the metadata entry is not binary the string value will be returned as ASCII encoded bytes. /// public byte[] ValueBytes { @@ -343,13 +349,14 @@ namespace Grpc.Core /// /// Gets the string value of this metadata entry. + /// If the metadata entry is binary then an exception is thrown. /// public string Value { get { GrpcPreconditions.CheckState(!IsBinary, "Cannot access string value of a binary metadata entry"); - return value ?? EncodingASCII.GetString(valueBytes); + return value; } } diff --git a/src/csharp/Grpc.Core.Tests/MetadataTest.cs b/src/csharp/Grpc.Core.Tests/MetadataTest.cs index 0b5f1c76e0c..991f8b6f91b 100644 --- a/src/csharp/Grpc.Core.Tests/MetadataTest.cs +++ b/src/csharp/Grpc.Core.Tests/MetadataTest.cs @@ -18,7 +18,9 @@ using System; using System.Diagnostics; +using System.Linq; using System.Runtime.InteropServices; +using System.Text; using System.Threading; using System.Threading.Tasks; using Grpc.Core; @@ -242,6 +244,110 @@ namespace Grpc.Core.Tests Assert.Throws(() => metadata.Remove(metadata[0])); } + [Test] + public void GetAll() + { + var metadata = new Metadata + { + { "abc", "abc-value1" }, + { "abc", "abc-value2" }, + { "xyz", "xyz-value1" }, + }; + + var abcEntries = metadata.GetAll("abc").ToList(); + Assert.AreEqual(2, abcEntries.Count); + Assert.AreEqual("abc-value1", abcEntries[0].Value); + Assert.AreEqual("abc-value2", abcEntries[1].Value); + + var xyzEntries = metadata.GetAll("xyz").ToList(); + Assert.AreEqual(1, xyzEntries.Count); + Assert.AreEqual("xyz-value1", xyzEntries[0].Value); + } + + [Test] + public void Get() + { + var metadata = new Metadata + { + { "abc", "abc-value1" }, + { "abc", "abc-value2" }, + { "xyz", "xyz-value1" }, + }; + + var abcEntry = metadata.Get("abc"); + Assert.AreEqual("abc-value2", abcEntry.Value); + + var xyzEntry = metadata.Get("xyz"); + Assert.AreEqual("xyz-value1", xyzEntry.Value); + + var notFound = metadata.Get("not-found"); + Assert.AreEqual(null, notFound); + } + + [Test] + public void GetValue() + { + var metadata = new Metadata + { + { "abc", "abc-value1" }, + { "abc", "abc-value2" }, + { "xyz", "xyz-value1" }, + { "xyz-bin", Encoding.ASCII.GetBytes("xyz-value1") }, + }; + + var abcEntry = metadata.GetValue("abc"); + Assert.AreEqual("abc-value2", abcEntry); + + var xyzEntry = metadata.GetValue("xyz"); + Assert.AreEqual("xyz-value1", xyzEntry); + + var notFound = metadata.GetValue("not-found"); + Assert.AreEqual(null, notFound); + } + + [Test] + public void GetValue_BytesValue() + { + var metadata = new Metadata + { + { "xyz-bin", Encoding.ASCII.GetBytes("xyz-value1") }, + }; + + Assert.Throws(() => metadata.GetValue("xyz-bin")); + } + + [Test] + public void GetValueBytes() + { + var metadata = new Metadata + { + { "abc-bin", Encoding.ASCII.GetBytes("abc-value1") }, + { "abc-bin", Encoding.ASCII.GetBytes("abc-value2") }, + { "xyz-bin", Encoding.ASCII.GetBytes("xyz-value1") }, + }; + + var abcEntry = metadata.GetValueBytes("abc-bin"); + Assert.AreEqual(Encoding.ASCII.GetBytes("abc-value2"), abcEntry); + + var xyzEntry = metadata.GetValueBytes("xyz-bin"); + Assert.AreEqual(Encoding.ASCII.GetBytes("xyz-value1"), xyzEntry); + + var notFound = metadata.GetValueBytes("not-found"); + Assert.AreEqual(null, notFound); + } + + [Test] + public void GetValueBytes_StringValue() + { + var metadata = new Metadata + { + { "xyz", "xyz-value1" }, + }; + + var xyzEntry = metadata.GetValueBytes("xyz"); + Assert.AreEqual(Encoding.ASCII.GetBytes("xyz-value1"), xyzEntry); + } + private Metadata CreateMetadata() { return new Metadata From 99c6d5b9ab7ebc8e2ae17a2ad224eeb9f574000e Mon Sep 17 00:00:00 2001 From: ZhenLian Date: Sun, 26 Apr 2020 17:15:42 -0700 Subject: [PATCH 629/758] remove hard-coded credential --- test/core/bad_ssl/generate_tests.bzl | 3 +++ test/core/bad_ssl/servers/alpn.cc | 24 +++++++++++++++++++----- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/test/core/bad_ssl/generate_tests.bzl b/test/core/bad_ssl/generate_tests.bzl index 6f9698ef5f3..1c755912ed8 100755 --- a/test/core/bad_ssl/generate_tests.bzl +++ b/test/core/bad_ssl/generate_tests.bzl @@ -45,6 +45,9 @@ def grpc_bad_ssl_tests(): ":bad_ssl_%s_server" % t, "//src/core/tsi/test_creds:badserver.key", "//src/core/tsi/test_creds:badserver.pem", + "//src/core/tsi/test_creds:ca.pem", + "//src/core/tsi/test_creds:server1.key", + "//src/core/tsi/test_creds:server1.pem", ], deps = [ "//test/core/util:grpc_test_util", diff --git a/test/core/bad_ssl/servers/alpn.cc b/test/core/bad_ssl/servers/alpn.cc index 4a04178b1c7..795a856bcd2 100644 --- a/test/core/bad_ssl/servers/alpn.cc +++ b/test/core/bad_ssl/servers/alpn.cc @@ -16,16 +16,20 @@ * */ -#include +#include "src/core/ext/transport/chttp2/alpn/alpn.h" #include #include #include +#include -#include "src/core/ext/transport/chttp2/alpn/alpn.h" #include "src/core/lib/gpr/useful.h" +#include "src/core/lib/iomgr/load_file.h" #include "test/core/bad_ssl/server_common.h" -#include "test/core/end2end/data/ssl_test_data.h" + +#define CA_CERT_PATH "src/core/tsi/test_creds/ca.pem" +#define SERVER_CERT_PATH "src/core/tsi/test_creds/server1.pem" +#define SERVER_KEY_PATH "src/core/tsi/test_creds/server1.key" /* This test starts a server that is configured to advertise (via alpn and npn) * a protocol that the connecting client does not support. It does this by @@ -52,8 +56,16 @@ const char* grpc_chttp2_get_alpn_version_index(size_t i) { int main(int argc, char** argv) { const char* addr = bad_ssl_addr(argc, argv); - grpc_ssl_pem_key_cert_pair pem_key_cert_pair = {test_server1_key, - test_server1_cert}; + grpc_slice cert_slice, key_slice; + GPR_ASSERT(GRPC_LOG_IF_ERROR( + "load_file", grpc_load_file(SERVER_CERT_PATH, 1, &cert_slice))); + GPR_ASSERT(GRPC_LOG_IF_ERROR("load_file", + grpc_load_file(SERVER_KEY_PATH, 1, &key_slice))); + const char* server_cert = + reinterpret_cast GRPC_SLICE_START_PTR(cert_slice); + const char* server_key = + reinterpret_cast GRPC_SLICE_START_PTR(key_slice); + grpc_ssl_pem_key_cert_pair pem_key_cert_pair = {server_key, server_cert}; grpc_server_credentials* ssl_creds; grpc_server* server; @@ -65,6 +77,8 @@ int main(int argc, char** argv) { grpc_server_credentials_release(ssl_creds); bad_ssl_run(server); + grpc_slice_unref(cert_slice); + grpc_slice_unref(key_slice); grpc_shutdown(); return 0; From 2ade1dbe89f8d2b029445eeebcf20728b75d4a16 Mon Sep 17 00:00:00 2001 From: Muxi Yan Date: Mon, 27 Apr 2020 12:23:57 -0700 Subject: [PATCH 630/758] Fix client_lb_end2end_test flake --- test/cpp/end2end/client_lb_end2end_test.cc | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/test/cpp/end2end/client_lb_end2end_test.cc b/test/cpp/end2end/client_lb_end2end_test.cc index 295afb312b6..0e526a0ec80 100644 --- a/test/cpp/end2end/client_lb_end2end_test.cc +++ b/test/cpp/end2end/client_lb_end2end_test.cc @@ -234,9 +234,6 @@ class ClientLbEnd2endTest : public ::testing::Test { for (size_t i = 0; i < servers_.size(); ++i) { servers_[i]->Shutdown(); } - // Explicitly destroy all the members so that we can make sure grpc_shutdown - // has finished by the end of this function, and thus all the registered - // LB policy factories are removed. servers_.clear(); creds_.reset(); grpc_shutdown_blocking(); @@ -1640,12 +1637,19 @@ class ClientLbInterceptTrailingMetadataTest : public ClientLbEnd2endTest { protected: void SetUp() override { ClientLbEnd2endTest::SetUp(); - grpc_core::RegisterInterceptRecvTrailingMetadataLoadBalancingPolicy( - ReportTrailerIntercepted, this); + current_test_instance_ = this; } void TearDown() override { ClientLbEnd2endTest::TearDown(); } + static void SetUpTestCase() { + grpc_init(); + grpc_core::RegisterInterceptRecvTrailingMetadataLoadBalancingPolicy( + ReportTrailerIntercepted, nullptr); + } + + static void TearDownTestCase() { grpc_shutdown_blocking(); } + int trailers_intercepted() { grpc::internal::MutexLock lock(&mu_); return trailers_intercepted_; @@ -1660,8 +1664,7 @@ class ClientLbInterceptTrailingMetadataTest : public ClientLbEnd2endTest { static void ReportTrailerIntercepted( void* arg, const grpc_core::LoadBalancingPolicy::BackendMetricData* backend_metric_data) { - ClientLbInterceptTrailingMetadataTest* self = - static_cast(arg); + ClientLbInterceptTrailingMetadataTest* self = current_test_instance_; grpc::internal::MutexLock lock(&self->mu_); self->trailers_intercepted_++; if (backend_metric_data != nullptr) { @@ -1684,11 +1687,15 @@ class ClientLbInterceptTrailingMetadataTest : public ClientLbEnd2endTest { } } + static ClientLbInterceptTrailingMetadataTest* current_test_instance_; grpc::internal::Mutex mu_; int trailers_intercepted_ = 0; std::unique_ptr load_report_; }; +ClientLbInterceptTrailingMetadataTest* + ClientLbInterceptTrailingMetadataTest::current_test_instance_ = nullptr; + TEST_F(ClientLbInterceptTrailingMetadataTest, InterceptsRetriesDisabled) { const int kNumServers = 1; const int kNumRpcs = 10; From a960546ff9f5a0c60535af3a83583766cdf31ed0 Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Tue, 28 Apr 2020 17:41:24 +0200 Subject: [PATCH 631/758] Revert "[7/n] Avoid using hardcoded test credentials" --- test/cpp/util/BUILD | 5 ---- test/cpp/util/test_credentials_provider.cc | 27 ++++++++-------------- test/cpp/util/test_credentials_provider.h | 4 ++-- 3 files changed, 11 insertions(+), 25 deletions(-) diff --git a/test/cpp/util/BUILD b/test/cpp/util/BUILD index bb2e9a0be85..c3695ba0fa6 100644 --- a/test/cpp/util/BUILD +++ b/test/cpp/util/BUILD @@ -74,11 +74,6 @@ grpc_cc_library( "create_test_channel.h", "test_credentials_provider.h", ], - data = [ - "//src/core/tsi/test_creds:ca.pem", - "//src/core/tsi/test_creds:server1.key", - "//src/core/tsi/test_creds:server1.pem", - ], external_deps = [ "gflags", "protobuf", diff --git a/test/cpp/util/test_credentials_provider.cc b/test/cpp/util/test_credentials_provider.cc index d96c60896dc..fd796372c8c 100644 --- a/test/cpp/util/test_credentials_provider.cc +++ b/test/cpp/util/test_credentials_provider.cc @@ -19,22 +19,19 @@ #include "test/cpp/util/test_credentials_provider.h" -#include -#include -#include -#include - #include #include #include + #include #include -#include "src/core/lib/iomgr/load_file.h" +#include +#include +#include +#include -#define CA_CERT_PATH "src/core/tsi/test_creds/ca.pem" -#define SERVER_CERT_PATH "src/core/tsi/test_creds/server1.pem" -#define SERVER_KEY_PATH "src/core/tsi/test_creds/server1.key" +#include "test/core/end2end/data/ssl_test_data.h" DEFINE_string(tls_cert_file, "", "The TLS cert file used when --use_tls=true"); DEFINE_string(tls_key_file, "", "The TLS key file used when --use_tls=true"); @@ -65,9 +62,6 @@ class DefaultCredentialsProvider : public CredentialsProvider { if (!FLAGS_tls_cert_file.empty()) { custom_server_cert_ = ReadFile(FLAGS_tls_cert_file); } - test_root_cert_ = ReadFile(CA_CERT_PATH); - server_key_ = ReadFile(SERVER_KEY_PATH); - server_cert_ = ReadFile(SERVER_CERT_PATH); } ~DefaultCredentialsProvider() override {} @@ -96,7 +90,7 @@ class DefaultCredentialsProvider : public CredentialsProvider { grpc::experimental::AltsCredentialsOptions alts_opts; return grpc::experimental::AltsCredentials(alts_opts); } else if (type == grpc::testing::kTlsCredentialsType) { - SslCredentialsOptions ssl_opts = {test_root_cert_, "", ""}; + SslCredentialsOptions ssl_opts = {test_root_cert, "", ""}; args->SetSslTargetNameOverride("foo.test.google.fr"); return grpc::SslCredentials(ssl_opts); } else if (type == grpc::testing::kGoogleDefaultCredentialsType) { @@ -129,8 +123,8 @@ class DefaultCredentialsProvider : public CredentialsProvider { custom_server_key_, custom_server_cert_}; ssl_opts.pem_key_cert_pairs.push_back(pkcp); } else { - SslServerCredentialsOptions::PemKeyCertPair pkcp = {server_key_, - server_cert_}; + SslServerCredentialsOptions::PemKeyCertPair pkcp = {test_server1_key, + test_server1_cert}; ssl_opts.pem_key_cert_pairs.push_back(pkcp); } return SslServerCredentials(ssl_opts); @@ -164,9 +158,6 @@ class DefaultCredentialsProvider : public CredentialsProvider { added_secure_type_providers_; grpc::string custom_server_key_; grpc::string custom_server_cert_; - grpc::string test_root_cert_; - grpc::string server_key_; - grpc::string server_cert_; }; CredentialsProvider* g_provider = nullptr; diff --git a/test/cpp/util/test_credentials_provider.h b/test/cpp/util/test_credentials_provider.h index b634406e4b4..0bc910dbc09 100644 --- a/test/cpp/util/test_credentials_provider.h +++ b/test/cpp/util/test_credentials_provider.h @@ -19,12 +19,12 @@ #ifndef GRPC_TEST_CPP_UTIL_TEST_CREDENTIALS_PROVIDER_H #define GRPC_TEST_CPP_UTIL_TEST_CREDENTIALS_PROVIDER_H +#include + #include #include #include -#include - namespace grpc { namespace testing { From 29f6ab78aa92be61de1a8985bb313e34e8042f09 Mon Sep 17 00:00:00 2001 From: Eric Gribkoff Date: Tue, 28 Apr 2020 13:15:25 -0700 Subject: [PATCH 632/758] Disable --fail_on_failed_rpc for change_backend_service test --- tools/run_tests/run_xds_tests.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tools/run_tests/run_xds_tests.py b/tools/run_tests/run_xds_tests.py index 4dc18494e6b..ef3b0e91294 100755 --- a/tools/run_tests/run_xds_tests.py +++ b/tools/run_tests/run_xds_tests.py @@ -222,9 +222,12 @@ _BOOTSTRAP_TEMPLATE = """ ] }}] }}""" % (args.network.split('/')[-1], args.zone, args.xds_server) + +# TODO(ericgribkoff) Add change_backend_service to this list once TD no longer +# sends an update with no localities when adding the MIG to the backend service +# can race with the URL map patch. _TESTS_TO_FAIL_ON_RPC_FAILURE = [ - 'change_backend_service', 'new_instance_group_receives_traffic', - 'ping_pong', 'round_robin' + 'new_instance_group_receives_traffic', 'ping_pong', 'round_robin' ] _TESTS_USING_SECONDARY_IG = [ 'secondary_locality_gets_no_requests_on_partial_primary_failure', @@ -348,9 +351,6 @@ def test_change_backend_service(gcp, original_backend_service, instance_group, _WAIT_FOR_STATS_SEC) try: patch_url_map_backend_service(gcp, alternate_backend_service) - # TODO(ericgribkoff) Verify no RPCs fail during backend switch. - # Currently TD may briefly send an update with no localities if adding - # the MIG to the backend service above races with the URL map patch. wait_until_all_rpcs_go_to_given_backends(alternate_backend_instances, _WAIT_FOR_URL_MAP_PATCH_SEC) finally: From e714d0fcb876853da7edae71babcae2b0be9659a Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Tue, 28 Apr 2020 13:24:23 -0700 Subject: [PATCH 633/758] Reviewer comments --- include/grpcpp/impl/codegen/call_op_set.h | 20 +++++++++++++------ .../grpcpp/impl/codegen/interceptor_common.h | 8 ++++---- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/include/grpcpp/impl/codegen/call_op_set.h b/include/grpcpp/impl/codegen/call_op_set.h index 5bfd541c8f4..79fa08ad6dc 100644 --- a/include/grpcpp/impl/codegen/call_op_set.h +++ b/include/grpcpp/impl/codegen/call_op_set.h @@ -453,8 +453,12 @@ class CallOpRecvMessage { recv_buf_.Clear(); } } else if (hijacked_) { - if (!hijacked_recv_message_status_) { + if (hijacked_recv_message_failed_) { FinishOpRecvMessageFailureHandler(status); + } else { + // The op was hijacked and it was successful. There is no further action + // to be performed since the message is already in its non-serialized + // form. } } else { FinishOpRecvMessageFailureHandler(status); @@ -465,7 +469,7 @@ class CallOpRecvMessage { InterceptorBatchMethodsImpl* interceptor_methods) { if (message_ == nullptr) return; interceptor_methods->SetRecvMessage(message_, - &hijacked_recv_message_status_); + &hijacked_recv_message_failed_); } void SetFinishInterceptionHookPoint( @@ -496,7 +500,7 @@ class CallOpRecvMessage { ByteBuffer recv_buf_; bool allow_not_getting_message_ = false; bool hijacked_ = false; - bool hijacked_recv_message_status_ = true; + bool hijacked_recv_message_failed_ = false; }; class DeserializeFunc { @@ -559,8 +563,12 @@ class CallOpGenericRecvMessage { recv_buf_.Clear(); } } else if (hijacked_) { - if (!hijacked_recv_message_status_) { + if (hijacked_recv_message_failed_) { FinishOpRecvMessageFailureHandler(status); + } else { + // The op was hijacked and it was successful. There is no further action + // to be performed since the message is already in its non-serialized + // form. } } else { got_message = false; @@ -574,7 +582,7 @@ class CallOpGenericRecvMessage { InterceptorBatchMethodsImpl* interceptor_methods) { if (!deserialize_) return; interceptor_methods->SetRecvMessage(message_, - &hijacked_recv_message_status_); + &hijacked_recv_message_failed_); } void SetFinishInterceptionHookPoint( @@ -607,7 +615,7 @@ class CallOpGenericRecvMessage { ByteBuffer recv_buf_; bool allow_not_getting_message_ = false; bool hijacked_ = false; - bool hijacked_recv_message_status_ = true; + bool hijacked_recv_message_failed_ = false; }; class CallOpClientSendClose { diff --git a/include/grpcpp/impl/codegen/interceptor_common.h b/include/grpcpp/impl/codegen/interceptor_common.h index 9b124197ff0..c87c8034c77 100644 --- a/include/grpcpp/impl/codegen/interceptor_common.h +++ b/include/grpcpp/impl/codegen/interceptor_common.h @@ -166,9 +166,9 @@ class InterceptorBatchMethodsImpl send_trailing_metadata_ = metadata; } - void SetRecvMessage(void* message, bool* hijacked_recv_message_status) { + void SetRecvMessage(void* message, bool* hijacked_recv_message_failed) { recv_message_ = message; - hijacked_recv_message_status_ = hijacked_recv_message_status; + hijacked_recv_message_failed_ = hijacked_recv_message_failed; } void SetRecvInitialMetadata(MetadataMap* map) { @@ -195,7 +195,7 @@ class InterceptorBatchMethodsImpl void FailHijackedRecvMessage() override { GPR_CODEGEN_ASSERT(hooks_[static_cast( experimental::InterceptionHookPoints::PRE_RECV_MESSAGE)]); - *hijacked_recv_message_status_ = false; + *hijacked_recv_message_failed_ = true; } // Clears all state @@ -407,7 +407,7 @@ class InterceptorBatchMethodsImpl std::multimap* send_trailing_metadata_ = nullptr; void* recv_message_ = nullptr; - bool* hijacked_recv_message_status_ = nullptr; + bool* hijacked_recv_message_failed_ = nullptr; MetadataMap* recv_initial_metadata_ = nullptr; From bba2a77199e21e607a5fbadaf4066c94341405da Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Wed, 29 Apr 2020 14:08:59 +1200 Subject: [PATCH 634/758] PR feedback --- src/csharp/Grpc.Core.Tests/MetadataTest.cs | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/csharp/Grpc.Core.Tests/MetadataTest.cs b/src/csharp/Grpc.Core.Tests/MetadataTest.cs index 991f8b6f91b..56112fb360b 100644 --- a/src/csharp/Grpc.Core.Tests/MetadataTest.cs +++ b/src/csharp/Grpc.Core.Tests/MetadataTest.cs @@ -295,11 +295,11 @@ namespace Grpc.Core.Tests { "xyz-bin", Encoding.ASCII.GetBytes("xyz-value1") }, }; - var abcEntry = metadata.GetValue("abc"); - Assert.AreEqual("abc-value2", abcEntry); + var abcValue = metadata.GetValue("abc"); + Assert.AreEqual("abc-value2", abcValue); - var xyzEntry = metadata.GetValue("xyz"); - Assert.AreEqual("xyz-value1", xyzEntry); + var xyzValue = metadata.GetValue("xyz"); + Assert.AreEqual("xyz-value1", xyzValue); var notFound = metadata.GetValue("not-found"); Assert.AreEqual(null, notFound); @@ -326,11 +326,11 @@ namespace Grpc.Core.Tests { "xyz-bin", Encoding.ASCII.GetBytes("xyz-value1") }, }; - var abcEntry = metadata.GetValueBytes("abc-bin"); - Assert.AreEqual(Encoding.ASCII.GetBytes("abc-value2"), abcEntry); + var abcValue = metadata.GetValueBytes("abc-bin"); + Assert.AreEqual(Encoding.ASCII.GetBytes("abc-value2"), abcValue); - var xyzEntry = metadata.GetValueBytes("xyz-bin"); - Assert.AreEqual(Encoding.ASCII.GetBytes("xyz-value1"), xyzEntry); + var xyzValue = metadata.GetValueBytes("xyz-bin"); + Assert.AreEqual(Encoding.ASCII.GetBytes("xyz-value1"), xyzValue); var notFound = metadata.GetValueBytes("not-found"); Assert.AreEqual(null, notFound); @@ -344,8 +344,8 @@ namespace Grpc.Core.Tests { "xyz", "xyz-value1" }, }; - var xyzEntry = metadata.GetValueBytes("xyz"); - Assert.AreEqual(Encoding.ASCII.GetBytes("xyz-value1"), xyzEntry); + var xyzValue = metadata.GetValueBytes("xyz"); + Assert.AreEqual(Encoding.ASCII.GetBytes("xyz-value1"), xyzValue); } private Metadata CreateMetadata() From ffd7b275775c933547fec2dabf6bcf93160c6a11 Mon Sep 17 00:00:00 2001 From: "Mark D. Roth" Date: Wed, 29 Apr 2020 08:14:41 -0700 Subject: [PATCH 635/758] Fix c-ares resolver to properly handle error from SplitHostPort(). --- .../client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc index 7e82c5b12a9..42df9af6c57 100644 --- a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +++ b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc @@ -467,8 +467,7 @@ static bool inner_resolve_as_ip_literal_locked( const char* name, const char* default_port, std::unique_ptr* addrs, std::string* host, std::string* port, std::string* hostport) { - grpc_core::SplitHostPort(name, host, port); - if (host->empty()) { + if (!grpc_core::SplitHostPort(name, host, port)) { gpr_log(GPR_ERROR, "Failed to parse %s to host:port while attempting to resolve as ip " "literal.", From 234b356e2f30be8e840b9dd1f0fea662ce9c689b Mon Sep 17 00:00:00 2001 From: Esun Kim Date: Sat, 25 Apr 2020 20:46:02 -0700 Subject: [PATCH 636/758] Fix the flaky bm_opencensus_plugin --- test/cpp/microbenchmarks/bm_opencensus_plugin.cc | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/test/cpp/microbenchmarks/bm_opencensus_plugin.cc b/test/cpp/microbenchmarks/bm_opencensus_plugin.cc index 908d34aa19f..5f335f0bb98 100644 --- a/test/cpp/microbenchmarks/bm_opencensus_plugin.cc +++ b/test/cpp/microbenchmarks/bm_opencensus_plugin.cc @@ -28,6 +28,7 @@ #include "opencensus/stats/stats.h" #include "src/cpp/ext/filters/census/grpc_plugin.h" #include "src/proto/grpc/testing/echo.grpc.pb.h" +#include "test/core/util/test_config.h" #include "test/cpp/microbenchmarks/helpers.h" using ::grpc::RegisterOpenCensusPlugin; @@ -86,6 +87,8 @@ class EchoServerThread final { }; static void BM_E2eLatencyCensusDisabled(benchmark::State& state) { + grpc::testing::TestEnvironment env(0, {}); + EchoServerThread server; std::unique_ptr stub = grpc::testing::EchoTestService::NewStub(grpc::CreateChannel( @@ -101,11 +104,7 @@ static void BM_E2eLatencyCensusDisabled(benchmark::State& state) { BENCHMARK(BM_E2eLatencyCensusDisabled); static void BM_E2eLatencyCensusEnabled(benchmark::State& state) { - // Avoid a data race between registering plugin and shutdown of previous - // test (order-dependent) by doing an init/shutdown so that any previous - // shutdowns are fully complete first. - grpc_init(); - grpc_shutdown_blocking(); + grpc::testing::TestEnvironment env(0, {}); // Now start the test by registering the plugin (once in the execution) RegisterOnce(); From 8c64e96458188000a7c883db1a6014e97888b7c6 Mon Sep 17 00:00:00 2001 From: Esun Kim Date: Sat, 25 Apr 2020 17:30:17 -0700 Subject: [PATCH 637/758] Fix flaky LastCallStartedTime --- test/core/channel/channelz_test.cc | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/test/core/channel/channelz_test.cc b/test/core/channel/channelz_test.cc index b16d2d53e0b..338cd0f7ee6 100644 --- a/test/core/channel/channelz_test.cc +++ b/test/core/channel/channelz_test.cc @@ -48,11 +48,11 @@ namespace testing { class CallCountingHelperPeer { public: explicit CallCountingHelperPeer(CallCountingHelper* node) : node_(node) {} - grpc_millis last_call_started_millis() const { + + gpr_timespec last_call_started_time() const { CallCountingHelper::CounterData data; node_->CollectData(&data); - gpr_timespec ts = gpr_cycle_counter_to_time(data.last_call_started_cycle); - return grpc_timespec_to_millis_round_up(ts); + return gpr_cycle_counter_to_time(data.last_call_started_cycle); } private: @@ -243,9 +243,9 @@ void ValidateServer(ServerNode* server, const ValidateChannelDataArgs& args) { gpr_free(core_api_json_str); } -grpc_millis GetLastCallStartedMillis(CallCountingHelper* channel) { +gpr_timespec GetLastCallStartedTime(CallCountingHelper* channel) { CallCountingHelperPeer peer(channel); - return peer.last_call_started_millis(); + return peer.last_call_started_time(); } void ChannelzSleep(int64_t sleep_us) { @@ -301,28 +301,28 @@ TEST_P(ChannelzChannelTest, BasicChannelAPIFunctionality) { ValidateChannel(channelz_channel, {3, 3, 3}); } -TEST_P(ChannelzChannelTest, LastCallStartedMillis) { +TEST_P(ChannelzChannelTest, LastCallStartedTime) { grpc_core::ExecCtx exec_ctx; CallCountingHelper counter; // start a call to set the last call started timestamp counter.RecordCallStarted(); - grpc_millis millis1 = GetLastCallStartedMillis(&counter); + gpr_timespec time1 = GetLastCallStartedTime(&counter); // time gone by should not affect the timestamp ChannelzSleep(100); - grpc_millis millis2 = GetLastCallStartedMillis(&counter); - EXPECT_EQ(millis1, millis2); + gpr_timespec time2 = GetLastCallStartedTime(&counter); + EXPECT_EQ(gpr_time_cmp(time1, time2), 0); // calls succeeded or failed should not affect the timestamp ChannelzSleep(100); counter.RecordCallFailed(); counter.RecordCallSucceeded(); - grpc_millis millis3 = GetLastCallStartedMillis(&counter); - EXPECT_EQ(millis1, millis3); + gpr_timespec time3 = GetLastCallStartedTime(&counter); + EXPECT_EQ(gpr_time_cmp(time1, time3), 0); // another call started should affect the timestamp // sleep for extra long to avoid flakes (since we cache Now()) ChannelzSleep(5000); counter.RecordCallStarted(); - grpc_millis millis4 = GetLastCallStartedMillis(&counter); - EXPECT_NE(millis1, millis4); + gpr_timespec time4 = GetLastCallStartedTime(&counter); + EXPECT_NE(gpr_time_cmp(time1, time4), 0); } class ChannelzRegistryBasedTest : public ::testing::TestWithParam { From 657275fbc01dc41014dc9dab131f5e21dc4144a2 Mon Sep 17 00:00:00 2001 From: Esun Kim Date: Wed, 29 Apr 2020 09:56:22 -0700 Subject: [PATCH 638/758] Add note to gpr_convert_clock_type --- src/core/lib/gpr/time.cc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/core/lib/gpr/time.cc b/src/core/lib/gpr/time.cc index 8927dab5a30..db5a7f64f70 100644 --- a/src/core/lib/gpr/time.cc +++ b/src/core/lib/gpr/time.cc @@ -254,6 +254,10 @@ gpr_timespec gpr_convert_clock_type(gpr_timespec t, gpr_clock_type clock_type) { return gpr_time_add(gpr_now(clock_type), t); } + // If the given input hits this code, the same result is not guaranteed for + // the same input because it relies on `gpr_now` to calculate the difference + // between two different clocks. Please be careful when you want to use this + // function in unit tests. (e.g. https://github.com/grpc/grpc/pull/22655) return gpr_time_add(gpr_now(clock_type), gpr_time_sub(t, gpr_now(t.clock_type))); } From d75de51e43e6d1844c086f338d8ed5a6348f5b35 Mon Sep 17 00:00:00 2001 From: ZhenLian Date: Tue, 28 Apr 2020 23:23:38 -0700 Subject: [PATCH 639/758] [10/n] remove hard-coded credential paths and rebuild the project --- CMakeLists.txt | 24 -------- Makefile | 72 ++---------------------- build_autogenerated.yaml | 38 ++----------- gRPC-Core.podspec | 5 -- grpc.gyp | 8 --- test/core/bad_ssl/generate_tests.bzl | 1 - test/core/bad_ssl/servers/cert.cc | 1 - test/core/end2end/fixtures/h2_fakesec.cc | 1 - test/core/end2end/generate_tests.bzl | 2 - test/core/security/BUILD | 3 - test/core/surface/BUILD | 1 - test/cpp/util/BUILD | 1 - 12 files changed, 8 insertions(+), 149 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ed5d9579c57..71f87ec3574 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -895,10 +895,6 @@ if(gRPC_BUILD_TESTS) add_library(end2end_nosec_tests test/core/end2end/cq_verifier.cc - test/core/end2end/data/client_certs.cc - test/core/end2end/data/server1_cert.cc - test/core/end2end/data/server1_key.cc - test/core/end2end/data/test_root_cert.cc test/core/end2end/end2end_nosec_tests.cc test/core/end2end/end2end_test_utils.cc test/core/end2end/fixtures/http_proxy_fixture.cc @@ -1026,10 +1022,6 @@ if(gRPC_BUILD_TESTS) add_library(end2end_tests test/core/end2end/cq_verifier.cc - test/core/end2end/data/client_certs.cc - test/core/end2end/data/server1_cert.cc - test/core/end2end/data/server1_key.cc - test/core/end2end/data/test_root_cert.cc test/core/end2end/end2end_test_utils.cc test/core/end2end/end2end_tests.cc test/core/end2end/fixtures/http_proxy_fixture.cc @@ -6767,10 +6759,6 @@ endif() if(gRPC_BUILD_TESTS) add_executable(sequential_connectivity_test - test/core/end2end/data/client_certs.cc - test/core/end2end/data/server1_cert.cc - test/core/end2end/data/server1_key.cc - test/core/end2end/data/test_root_cert.cc test/core/surface/sequential_connectivity_test.cc ) @@ -11073,10 +11061,6 @@ endif() if(gRPC_BUILD_TESTS) add_executable(grpc_tls_credentials_options_test - test/core/end2end/data/client_certs.cc - test/core/end2end/data/server1_cert.cc - test/core/end2end/data/server1_key.cc - test/core/end2end/data/test_root_cert.cc test/core/security/grpc_tls_credentials_options_test.cc third_party/googletest/googletest/src/gtest-all.cc third_party/googletest/googlemock/src/gmock-all.cc @@ -14067,10 +14051,6 @@ endif() if(gRPC_BUILD_TESTS) add_executable(tls_security_connector_test - test/core/end2end/data/client_certs.cc - test/core/end2end/data/server1_cert.cc - test/core/end2end/data/server1_key.cc - test/core/end2end/data/test_root_cert.cc test/core/security/tls_security_connector_test.cc third_party/googletest/googletest/src/gtest-all.cc third_party/googletest/googlemock/src/gmock-all.cc @@ -14962,10 +14942,6 @@ endif() if(gRPC_BUILD_TESTS) add_executable(ssl_server_fuzzer_one_entry - test/core/end2end/data/client_certs.cc - test/core/end2end/data/server1_cert.cc - test/core/end2end/data/server1_key.cc - test/core/end2end/data/test_root_cert.cc test/core/security/ssl_server_fuzzer.cc test/core/util/one_corpus_entry_fuzzer.cc third_party/googletest/googletest/src/gtest-all.cc diff --git a/Makefile b/Makefile index 62d0d31011b..175c22a52bc 100644 --- a/Makefile +++ b/Makefile @@ -3258,10 +3258,6 @@ endif LIBEND2END_NOSEC_TESTS_SRC = \ test/core/end2end/cq_verifier.cc \ - test/core/end2end/data/client_certs.cc \ - test/core/end2end/data/server1_cert.cc \ - test/core/end2end/data/server1_key.cc \ - test/core/end2end/data/test_root_cert.cc \ test/core/end2end/end2end_nosec_tests.cc \ test/core/end2end/end2end_test_utils.cc \ test/core/end2end/fixtures/http_proxy_fixture.cc \ @@ -3370,10 +3366,6 @@ endif LIBEND2END_TESTS_SRC = \ test/core/end2end/cq_verifier.cc \ - test/core/end2end/data/client_certs.cc \ - test/core/end2end/data/server1_cert.cc \ - test/core/end2end/data/server1_key.cc \ - test/core/end2end/data/test_root_cert.cc \ test/core/end2end/end2end_test_utils.cc \ test/core/end2end/end2end_tests.cc \ test/core/end2end/fixtures/http_proxy_fixture.cc \ @@ -9999,10 +9991,6 @@ endif SEQUENTIAL_CONNECTIVITY_TEST_SRC = \ - test/core/end2end/data/client_certs.cc \ - test/core/end2end/data/server1_cert.cc \ - test/core/end2end/data/server1_key.cc \ - test/core/end2end/data/test_root_cert.cc \ test/core/surface/sequential_connectivity_test.cc \ SEQUENTIAL_CONNECTIVITY_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(SEQUENTIAL_CONNECTIVITY_TEST_SRC)))) @@ -10023,14 +10011,6 @@ $(BINDIR)/$(CONFIG)/sequential_connectivity_test: $(SEQUENTIAL_CONNECTIVITY_TEST endif -$(OBJDIR)/$(CONFIG)/test/core/end2end/data/client_certs.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a - -$(OBJDIR)/$(CONFIG)/test/core/end2end/data/server1_cert.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a - -$(OBJDIR)/$(CONFIG)/test/core/end2end/data/server1_key.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a - -$(OBJDIR)/$(CONFIG)/test/core/end2end/data/test_root_cert.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a - $(OBJDIR)/$(CONFIG)/test/core/surface/sequential_connectivity_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a deps_sequential_connectivity_test: $(SEQUENTIAL_CONNECTIVITY_TEST_OBJS:.o=.dep) @@ -14701,10 +14681,6 @@ endif GRPC_TLS_CREDENTIALS_OPTIONS_TEST_SRC = \ - test/core/end2end/data/client_certs.cc \ - test/core/end2end/data/server1_cert.cc \ - test/core/end2end/data/server1_key.cc \ - test/core/end2end/data/test_root_cert.cc \ test/core/security/grpc_tls_credentials_options_test.cc \ GRPC_TLS_CREDENTIALS_OPTIONS_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(GRPC_TLS_CREDENTIALS_OPTIONS_TEST_SRC)))) @@ -14736,14 +14712,6 @@ endif endif -$(OBJDIR)/$(CONFIG)/test/core/end2end/data/client_certs.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a - -$(OBJDIR)/$(CONFIG)/test/core/end2end/data/server1_cert.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a - -$(OBJDIR)/$(CONFIG)/test/core/end2end/data/server1_key.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a - -$(OBJDIR)/$(CONFIG)/test/core/end2end/data/test_root_cert.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a - $(OBJDIR)/$(CONFIG)/test/core/security/grpc_tls_credentials_options_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a deps_grpc_tls_credentials_options_test: $(GRPC_TLS_CREDENTIALS_OPTIONS_TEST_OBJS:.o=.dep) @@ -17864,10 +17832,6 @@ endif SSL_SERVER_FUZZER_SRC = \ - test/core/end2end/data/client_certs.cc \ - test/core/end2end/data/server1_cert.cc \ - test/core/end2end/data/server1_key.cc \ - test/core/end2end/data/test_root_cert.cc \ test/core/security/ssl_server_fuzzer.cc \ test/core/util/fuzzer_corpus_test.cc \ @@ -17900,14 +17864,6 @@ endif endif -$(OBJDIR)/$(CONFIG)/test/core/end2end/data/client_certs.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a - -$(OBJDIR)/$(CONFIG)/test/core/end2end/data/server1_cert.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a - -$(OBJDIR)/$(CONFIG)/test/core/end2end/data/server1_key.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a - -$(OBJDIR)/$(CONFIG)/test/core/end2end/data/test_root_cert.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a - $(OBJDIR)/$(CONFIG)/test/core/security/ssl_server_fuzzer.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(OBJDIR)/$(CONFIG)/test/core/util/fuzzer_corpus_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a @@ -18507,10 +18463,6 @@ endif TLS_SECURITY_CONNECTOR_TEST_SRC = \ - test/core/end2end/data/client_certs.cc \ - test/core/end2end/data/server1_cert.cc \ - test/core/end2end/data/server1_key.cc \ - test/core/end2end/data/test_root_cert.cc \ test/core/security/tls_security_connector_test.cc \ TLS_SECURITY_CONNECTOR_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(TLS_SECURITY_CONNECTOR_TEST_SRC)))) @@ -18542,14 +18494,6 @@ endif endif -$(OBJDIR)/$(CONFIG)/test/core/end2end/data/client_certs.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a - -$(OBJDIR)/$(CONFIG)/test/core/end2end/data/server1_cert.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a - -$(OBJDIR)/$(CONFIG)/test/core/end2end/data/server1_key.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a - -$(OBJDIR)/$(CONFIG)/test/core/end2end/data/test_root_cert.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a - $(OBJDIR)/$(CONFIG)/test/core/security/tls_security_connector_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a deps_tls_security_connector_test: $(TLS_SECURITY_CONNECTOR_TEST_OBJS:.o=.dep) @@ -19884,10 +19828,6 @@ endif SSL_SERVER_FUZZER_ONE_ENTRY_SRC = \ - test/core/end2end/data/client_certs.cc \ - test/core/end2end/data/server1_cert.cc \ - test/core/end2end/data/server1_key.cc \ - test/core/end2end/data/test_root_cert.cc \ test/core/security/ssl_server_fuzzer.cc \ test/core/util/one_corpus_entry_fuzzer.cc \ @@ -19920,14 +19860,6 @@ endif endif -$(OBJDIR)/$(CONFIG)/test/core/end2end/data/client_certs.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a - -$(OBJDIR)/$(CONFIG)/test/core/end2end/data/server1_cert.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a - -$(OBJDIR)/$(CONFIG)/test/core/end2end/data/server1_key.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a - -$(OBJDIR)/$(CONFIG)/test/core/end2end/data/test_root_cert.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a - $(OBJDIR)/$(CONFIG)/test/core/security/ssl_server_fuzzer.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a $(OBJDIR)/$(CONFIG)/test/core/util/one_corpus_entry_fuzzer.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_config.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libaddress_sorting.a $(LIBDIR)/$(CONFIG)/libupb.a @@ -20091,6 +20023,10 @@ src/cpp/server/channelz/channelz_service_plugin.cc: $(OPENSSL_DEP) src/cpp/server/secure_server_credentials.cc: $(OPENSSL_DEP) src/cpp/util/error_details.cc: $(OPENSSL_DEP) src/csharp/ext/grpc_csharp_ext.c: $(OPENSSL_DEP) +test/core/end2end/data/client_certs.cc: $(OPENSSL_DEP) +test/core/end2end/data/server1_cert.cc: $(OPENSSL_DEP) +test/core/end2end/data/server1_key.cc: $(OPENSSL_DEP) +test/core/end2end/data/test_root_cert.cc: $(OPENSSL_DEP) test/core/end2end/end2end_tests.cc: $(OPENSSL_DEP) test/core/end2end/tests/call_creds.cc: $(OPENSSL_DEP) test/cpp/microbenchmarks/helpers.cc: $(OPENSSL_DEP) diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml index eeb81843c74..60d8870c93d 100644 --- a/build_autogenerated.yaml +++ b/build_autogenerated.yaml @@ -19,7 +19,6 @@ libs: public_headers: [] headers: - test/core/end2end/cq_verifier.h - - test/core/end2end/data/ssl_test_data.h - test/core/end2end/end2end_tests.h - test/core/end2end/fixtures/http_proxy_fixture.h - test/core/end2end/fixtures/local_util.h @@ -27,10 +26,6 @@ libs: - test/core/end2end/tests/cancel_test_helpers.h src: - test/core/end2end/cq_verifier.cc - - test/core/end2end/data/client_certs.cc - - test/core/end2end/data/server1_cert.cc - - test/core/end2end/data/server1_key.cc - - test/core/end2end/data/test_root_cert.cc - test/core/end2end/end2end_nosec_tests.cc - test/core/end2end/end2end_test_utils.cc - test/core/end2end/fixtures/http_proxy_fixture.cc @@ -127,7 +122,6 @@ libs: public_headers: [] headers: - test/core/end2end/cq_verifier.h - - test/core/end2end/data/ssl_test_data.h - test/core/end2end/end2end_tests.h - test/core/end2end/fixtures/http_proxy_fixture.h - test/core/end2end/fixtures/local_util.h @@ -135,10 +129,6 @@ libs: - test/core/end2end/tests/cancel_test_helpers.h src: - test/core/end2end/cq_verifier.cc - - test/core/end2end/data/client_certs.cc - - test/core/end2end/data/server1_cert.cc - - test/core/end2end/data/server1_key.cc - - test/core/end2end/data/test_root_cert.cc - test/core/end2end/end2end_test_utils.cc - test/core/end2end/end2end_tests.cc - test/core/end2end/fixtures/http_proxy_fixture.cc @@ -4086,13 +4076,8 @@ targets: build: test run: false language: c - headers: - - test/core/end2end/data/ssl_test_data.h + headers: [] src: - - test/core/end2end/data/client_certs.cc - - test/core/end2end/data/server1_cert.cc - - test/core/end2end/data/server1_key.cc - - test/core/end2end/data/test_root_cert.cc - test/core/surface/sequential_connectivity_test.cc deps: - grpc_test_util @@ -5989,13 +5974,8 @@ targets: gtest: true build: test language: c++ - headers: - - test/core/end2end/data/ssl_test_data.h + headers: [] src: - - test/core/end2end/data/client_certs.cc - - test/core/end2end/data/server1_cert.cc - - test/core/end2end/data/server1_key.cc - - test/core/end2end/data/test_root_cert.cc - test/core/security/grpc_tls_credentials_options_test.cc deps: - grpc_test_util @@ -7128,13 +7108,8 @@ targets: - name: ssl_server_fuzzer build: fuzzer language: c++ - headers: - - test/core/end2end/data/ssl_test_data.h + headers: [] src: - - test/core/end2end/data/client_certs.cc - - test/core/end2end/data/server1_cert.cc - - test/core/end2end/data/server1_key.cc - - test/core/end2end/data/test_root_cert.cc - test/core/security/ssl_server_fuzzer.cc - test/core/util/fuzzer_corpus_test.cc deps: @@ -7362,13 +7337,8 @@ targets: gtest: true build: test language: c++ - headers: - - test/core/end2end/data/ssl_test_data.h + headers: [] src: - - test/core/end2end/data/client_certs.cc - - test/core/end2end/data/server1_cert.cc - - test/core/end2end/data/server1_key.cc - - test/core/end2end/data/test_root_cert.cc - test/core/security/tls_security_connector_test.cc deps: - grpc_test_util diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec index 8bf16911cc6..fe383edf797 100644 --- a/gRPC-Core.podspec +++ b/gRPC-Core.podspec @@ -1452,11 +1452,6 @@ Pod::Spec.new do |s| ss.source_files = 'test/core/end2end/cq_verifier.cc', 'test/core/end2end/cq_verifier.h', - 'test/core/end2end/data/client_certs.cc', - 'test/core/end2end/data/server1_cert.cc', - 'test/core/end2end/data/server1_key.cc', - 'test/core/end2end/data/ssl_test_data.h', - 'test/core/end2end/data/test_root_cert.cc', 'test/core/end2end/end2end_test_utils.cc', 'test/core/end2end/end2end_tests.cc', 'test/core/end2end/end2end_tests.h', diff --git a/grpc.gyp b/grpc.gyp index 865c403fde7..67165946a75 100644 --- a/grpc.gyp +++ b/grpc.gyp @@ -176,10 +176,6 @@ ], 'sources': [ 'test/core/end2end/cq_verifier.cc', - 'test/core/end2end/data/client_certs.cc', - 'test/core/end2end/data/server1_cert.cc', - 'test/core/end2end/data/server1_key.cc', - 'test/core/end2end/data/test_root_cert.cc', 'test/core/end2end/end2end_nosec_tests.cc', 'test/core/end2end/end2end_test_utils.cc', 'test/core/end2end/fixtures/http_proxy_fixture.cc', @@ -277,10 +273,6 @@ ], 'sources': [ 'test/core/end2end/cq_verifier.cc', - 'test/core/end2end/data/client_certs.cc', - 'test/core/end2end/data/server1_cert.cc', - 'test/core/end2end/data/server1_key.cc', - 'test/core/end2end/data/test_root_cert.cc', 'test/core/end2end/end2end_test_utils.cc', 'test/core/end2end/end2end_tests.cc', 'test/core/end2end/fixtures/http_proxy_fixture.cc', diff --git a/test/core/bad_ssl/generate_tests.bzl b/test/core/bad_ssl/generate_tests.bzl index 1c755912ed8..79e82b3093b 100755 --- a/test/core/bad_ssl/generate_tests.bzl +++ b/test/core/bad_ssl/generate_tests.bzl @@ -29,7 +29,6 @@ def grpc_bad_ssl_tests(): deps = [ "//test/core/util:grpc_test_util", "//:grpc", - "//test/core/end2end:ssl_test_data", ], ) for t in BAD_SSL_TESTS: diff --git a/test/core/bad_ssl/servers/cert.cc b/test/core/bad_ssl/servers/cert.cc index 0722d6b57cd..785e10b99bb 100644 --- a/test/core/bad_ssl/servers/cert.cc +++ b/test/core/bad_ssl/servers/cert.cc @@ -25,7 +25,6 @@ #include "src/core/lib/iomgr/load_file.h" #include "test/core/bad_ssl/server_common.h" -#include "test/core/end2end/data/ssl_test_data.h" /* This server will present an untrusted cert to the connecting client, * causing the SSL handshake to fail */ diff --git a/test/core/end2end/fixtures/h2_fakesec.cc b/test/core/end2end/fixtures/h2_fakesec.cc index 5dacbe43ba4..6a8ba43e3d6 100644 --- a/test/core/end2end/fixtures/h2_fakesec.cc +++ b/test/core/end2end/fixtures/h2_fakesec.cc @@ -27,7 +27,6 @@ #include "src/core/lib/channel/channel_args.h" #include "src/core/lib/gprpp/host_port.h" #include "src/core/lib/security/credentials/fake/fake_credentials.h" -#include "test/core/end2end/data/ssl_test_data.h" #include "test/core/util/port.h" #include "test/core/util/test_config.h" diff --git a/test/core/end2end/generate_tests.bzl b/test/core/end2end/generate_tests.bzl index 7eabb251413..b124947f1ee 100755 --- a/test/core/end2end/generate_tests.bzl +++ b/test/core/end2end/generate_tests.bzl @@ -422,7 +422,6 @@ def grpc_end2end_tests(): language = "C++", deps = [ ":cq_verifier", - ":ssl_test_data", ":http_proxy", ":proxy", ":local_util", @@ -497,7 +496,6 @@ def grpc_end2end_nosec_tests(): language = "C++", deps = [ ":cq_verifier", - ":ssl_test_data", ":http_proxy", ":proxy", ":local_util", diff --git a/test/core/security/BUILD b/test/core/security/BUILD index ad698aa68ad..bd94a80ef75 100644 --- a/test/core/security/BUILD +++ b/test/core/security/BUILD @@ -47,7 +47,6 @@ grpc_fuzzer( deps = [ "//:gpr", "//:grpc", - "//test/core/end2end:ssl_test_data", "//test/core/util:grpc_test_util", ], ) @@ -268,7 +267,6 @@ grpc_cc_test( "//:grpc_secure", "//:tsi", "//:tsi_interface", - "//test/core/end2end:ssl_test_data", "//test/core/util:grpc_test_util", ], ) @@ -287,7 +285,6 @@ grpc_cc_test( "//:gpr", "//:grpc", "//:grpc_secure", - "//test/core/end2end:ssl_test_data", "//test/core/util:grpc_test_util", ], ) diff --git a/test/core/surface/BUILD b/test/core/surface/BUILD index cce1fd70902..37fa57e6927 100644 --- a/test/core/surface/BUILD +++ b/test/core/surface/BUILD @@ -148,7 +148,6 @@ grpc_cc_test( deps = [ "//:gpr", "//:grpc", - "//test/core/end2end:ssl_test_data", "//test/core/util:grpc_test_util", ], ) diff --git a/test/cpp/util/BUILD b/test/cpp/util/BUILD index c3695ba0fa6..2a8ad6d9587 100644 --- a/test/cpp/util/BUILD +++ b/test/cpp/util/BUILD @@ -202,7 +202,6 @@ grpc_cc_test( "//src/proto/grpc/testing:echo_messages_proto", "//src/proto/grpc/testing:echo_proto", "//src/proto/grpc/testing:simple_messages_proto", - "//test/core/end2end:ssl_test_data", "//test/core/util:grpc_test_util", ], ) From 4413d412e2c4c074d6e1a87e04b504e272ede24e Mon Sep 17 00:00:00 2001 From: Taras Galkovskyi Date: Wed, 29 Apr 2020 18:26:20 +0000 Subject: [PATCH 640/758] fix referencing variable out of scope that broke tests --- src/python/grpcio_tests/tests/interop/server.py | 6 +++--- src/python/grpcio_tests/tests_aio/interop/server.py | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/python/grpcio_tests/tests/interop/server.py b/src/python/grpcio_tests/tests/interop/server.py index e389533aa85..c966271e2a3 100644 --- a/src/python/grpcio_tests/tests/interop/server.py +++ b/src/python/grpcio_tests/tests/interop/server.py @@ -45,8 +45,8 @@ def parse_interop_server_arguments(): return parser.parse_args() -def get_server_credentials(): - if args.use_tls: +def get_server_credentials(use_tls): + if use_tls: private_key = resources.private_key() certificate_chain = resources.certificate_chain() return grpc.ssl_server_credentials(((private_key, certificate_chain),)) @@ -63,7 +63,7 @@ def serve(): test_pb2_grpc.add_TestServiceServicer_to_server(service.TestService(), server) if args.use_tls or args.use_alts: - credentials = get_server_credentials() + credentials = get_server_credentials(use_tls) server.add_secure_port('[::]:{}'.format(args.port), credentials) else: server.add_insecure_port('[::]:{}'.format(args.port)) diff --git a/src/python/grpcio_tests/tests_aio/interop/server.py b/src/python/grpcio_tests/tests_aio/interop/server.py index 82c52cebf0c..509abdf0b2f 100644 --- a/src/python/grpcio_tests/tests_aio/interop/server.py +++ b/src/python/grpcio_tests/tests_aio/interop/server.py @@ -31,7 +31,7 @@ async def serve(): args = interop_server_lib.parse_interop_server_arguments() if args.use_tls or args.use_alts: - credentials = interop_server_lib.get_server_credentials() + credentials = interop_server_lib.get_server_credentials(args.use_tls) address, server = await _test_server.start_test_server( port=args.port, secure=True, server_credentials=credentials) else: From 025ebf7d0721bd06adf0e8dbe8bce01a647a0ad9 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Fri, 24 Apr 2020 10:31:40 -0700 Subject: [PATCH 641/758] Revert "Revert "[Aio] Add AsyncIO support to grpcio-status"" --- .../grpc/_cython/_cygrpc/aio/server.pyx.pxi | 3 + .../grpcio_status/grpc_status/BUILD.bazel | 2 +- .../grpcio_status/grpc_status/_async.py | 56 ++++++ .../grpcio_status/grpc_status/_common.py | 27 +++ .../grpcio_status/grpc_status/rpc_status.py | 32 ++-- .../grpcio_tests/tests_aio/status/BUILD.bazel | 30 +++ .../grpcio_tests/tests_aio/status/__init__.py | 13 ++ .../tests_aio/status/grpc_status_test.py | 175 ++++++++++++++++++ src/python/grpcio_tests/tests_aio/tests.json | 1 + 9 files changed, 322 insertions(+), 17 deletions(-) create mode 100644 src/python/grpcio_status/grpc_status/_async.py create mode 100644 src/python/grpcio_status/grpc_status/_common.py create mode 100644 src/python/grpcio_tests/tests_aio/status/BUILD.bazel create mode 100644 src/python/grpcio_tests/tests_aio/status/__init__.py create mode 100644 src/python/grpcio_tests/tests_aio/status/grpc_status_test.py diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi index 0e407172806..a0d51a14325 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi @@ -189,6 +189,9 @@ cdef class _ServicerContext: raise self._rpc_state.abort_exception + async def abort_with_status(self, object status): + await self.abort(status.code, status.details, status.trailing_metadata) + def set_trailing_metadata(self, tuple metadata): self._rpc_state.trailing_metadata = metadata diff --git a/src/python/grpcio_status/grpc_status/BUILD.bazel b/src/python/grpcio_status/grpc_status/BUILD.bazel index 122a94f411a..a6abdd3ef56 100644 --- a/src/python/grpcio_status/grpc_status/BUILD.bazel +++ b/src/python/grpcio_status/grpc_status/BUILD.bazel @@ -4,7 +4,7 @@ package(default_visibility = ["//visibility:public"]) py_library( name = "grpc_status", - srcs = ["rpc_status.py"], + srcs = glob(["*.py"]), imports = ["../"], deps = [ "//src/python/grpcio/grpc:grpcio", diff --git a/src/python/grpcio_status/grpc_status/_async.py b/src/python/grpcio_status/grpc_status/_async.py new file mode 100644 index 00000000000..a6a6f7ef6ad --- /dev/null +++ b/src/python/grpcio_status/grpc_status/_async.py @@ -0,0 +1,56 @@ +# Copyright 2020 The gRPC Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Reference implementation for status mapping in gRPC Python.""" + +from grpc.experimental import aio + +from google.rpc import status_pb2 + +from ._common import code_to_grpc_status_code, GRPC_DETAILS_METADATA_KEY + + +async def from_call(call: aio.Call): + """Returns a google.rpc.status.Status message from a given grpc.aio.Call. + + This is an EXPERIMENTAL API. + + Args: + call: An grpc.aio.Call instance. + + Returns: + A google.rpc.status.Status message representing the status of the RPC. + """ + code = await call.code() + details = await call.details() + trailing_metadata = await call.trailing_metadata() + if trailing_metadata is None: + return None + for key, value in trailing_metadata: + if key == GRPC_DETAILS_METADATA_KEY: + rich_status = status_pb2.Status.FromString(value) + if code.value[0] != rich_status.code: + raise ValueError( + 'Code in Status proto (%s) doesn\'t match status code (%s)' + % (code_to_grpc_status_code(rich_status.code), code)) + if details != rich_status.message: + raise ValueError( + 'Message in Status proto (%s) doesn\'t match status details (%s)' + % (rich_status.message, details)) + return rich_status + return None + + +__all__ = [ + 'from_call', +] diff --git a/src/python/grpcio_status/grpc_status/_common.py b/src/python/grpcio_status/grpc_status/_common.py new file mode 100644 index 00000000000..4bec0ba1372 --- /dev/null +++ b/src/python/grpcio_status/grpc_status/_common.py @@ -0,0 +1,27 @@ +# Copyright 2020 The gRPC Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Reference implementation for status mapping in gRPC Python.""" + +import grpc + +_CODE_TO_GRPC_CODE_MAPPING = {x.value[0]: x for x in grpc.StatusCode} + +GRPC_DETAILS_METADATA_KEY = 'grpc-status-details-bin' + + +def code_to_grpc_status_code(code): + try: + return _CODE_TO_GRPC_CODE_MAPPING[code] + except KeyError: + raise ValueError('Invalid status code %s' % code) diff --git a/src/python/grpcio_status/grpc_status/rpc_status.py b/src/python/grpcio_status/grpc_status/rpc_status.py index ec78c477694..d0ec08e3a5d 100644 --- a/src/python/grpcio_status/grpc_status/rpc_status.py +++ b/src/python/grpcio_status/grpc_status/rpc_status.py @@ -14,14 +14,12 @@ """Reference implementation for status mapping in gRPC Python.""" import collections +import sys import grpc from google.rpc import status_pb2 - -_CODE_TO_GRPC_CODE_MAPPING = {x.value[0]: x for x in grpc.StatusCode} - -_GRPC_DETAILS_METADATA_KEY = 'grpc-status-details-bin' +from ._common import code_to_grpc_status_code, GRPC_DETAILS_METADATA_KEY class _Status( @@ -31,13 +29,6 @@ class _Status( pass -def _code_to_grpc_status_code(code): - try: - return _CODE_TO_GRPC_CODE_MAPPING[code] - except KeyError: - raise ValueError('Invalid status code %s' % code) - - def from_call(call): """Returns a google.rpc.status.Status message corresponding to a given grpc.Call. @@ -56,13 +47,12 @@ def from_call(call): if call.trailing_metadata() is None: return None for key, value in call.trailing_metadata(): - if key == _GRPC_DETAILS_METADATA_KEY: + if key == GRPC_DETAILS_METADATA_KEY: rich_status = status_pb2.Status.FromString(value) if call.code().value[0] != rich_status.code: raise ValueError( 'Code in Status proto (%s) doesn\'t match status code (%s)' - % - (_code_to_grpc_status_code(rich_status.code), call.code())) + % (code_to_grpc_status_code(rich_status.code), call.code())) if call.details() != rich_status.message: raise ValueError( 'Message in Status proto (%s) doesn\'t match status details (%s)' @@ -83,7 +73,17 @@ def to_status(status): Returns: A grpc.Status instance representing the input google.rpc.status.Status message. """ - return _Status(code=_code_to_grpc_status_code(status.code), + return _Status(code=code_to_grpc_status_code(status.code), details=status.message, - trailing_metadata=((_GRPC_DETAILS_METADATA_KEY, + trailing_metadata=((GRPC_DETAILS_METADATA_KEY, status.SerializeToString()),)) + + +__all__ = [ + 'from_call', + 'to_status', +] + +if sys.version_info[0] >= 3 and sys.version_info[1] >= 6: + from . import _async as aio # pylint: disable=unused-import + __all__.append('aio') diff --git a/src/python/grpcio_tests/tests_aio/status/BUILD.bazel b/src/python/grpcio_tests/tests_aio/status/BUILD.bazel new file mode 100644 index 00000000000..2fd82f2684c --- /dev/null +++ b/src/python/grpcio_tests/tests_aio/status/BUILD.bazel @@ -0,0 +1,30 @@ +# Copyright 2020 The gRPC Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +load("@grpc_python_dependencies//:requirements.bzl", "requirement") + +py_test( + name = "grpc_status_test", + size = "small", + srcs = ["grpc_status_test.py"], + imports = ["../../"], + python_version = "PY3", + deps = [ + "//src/python/grpcio/grpc:grpcio", + "//src/python/grpcio_status/grpc_status", + "//src/python/grpcio_tests/tests_aio/unit:_test_base", + requirement("protobuf"), + requirement("googleapis-common-protos"), + ], +) diff --git a/src/python/grpcio_tests/tests_aio/status/__init__.py b/src/python/grpcio_tests/tests_aio/status/__init__.py new file mode 100644 index 00000000000..1517f71d093 --- /dev/null +++ b/src/python/grpcio_tests/tests_aio/status/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2020 The gRPC Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/src/python/grpcio_tests/tests_aio/status/grpc_status_test.py b/src/python/grpcio_tests/tests_aio/status/grpc_status_test.py new file mode 100644 index 00000000000..980cf5a67e7 --- /dev/null +++ b/src/python/grpcio_tests/tests_aio/status/grpc_status_test.py @@ -0,0 +1,175 @@ +# Copyright 2020 The gRPC Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Tests of grpc_status with gRPC AsyncIO stack.""" + +import logging +import traceback +import unittest + +import grpc +from google.protobuf import any_pb2 +from google.rpc import code_pb2, error_details_pb2, status_pb2 +from grpc.experimental import aio + +from grpc_status import rpc_status +from tests_aio.unit._test_base import AioTestBase + +_STATUS_OK = '/test/StatusOK' +_STATUS_NOT_OK = '/test/StatusNotOk' +_ERROR_DETAILS = '/test/ErrorDetails' +_INCONSISTENT = '/test/Inconsistent' +_INVALID_CODE = '/test/InvalidCode' + +_REQUEST = b'\x00\x00\x00' +_RESPONSE = b'\x01\x01\x01' + +_GRPC_DETAILS_METADATA_KEY = 'grpc-status-details-bin' + +_STATUS_DETAILS = 'This is an error detail' +_STATUS_DETAILS_ANOTHER = 'This is another error detail' + + +async def _ok_unary_unary(request, servicer_context): + return _RESPONSE + + +async def _not_ok_unary_unary(request, servicer_context): + await servicer_context.abort(grpc.StatusCode.INTERNAL, _STATUS_DETAILS) + + +async def _error_details_unary_unary(request, servicer_context): + details = any_pb2.Any() + details.Pack( + error_details_pb2.DebugInfo(stack_entries=traceback.format_stack(), + detail='Intentionally invoked')) + rich_status = status_pb2.Status( + code=code_pb2.INTERNAL, + message=_STATUS_DETAILS, + details=[details], + ) + await servicer_context.abort_with_status(rpc_status.to_status(rich_status)) + + +async def _inconsistent_unary_unary(request, servicer_context): + rich_status = status_pb2.Status( + code=code_pb2.INTERNAL, + message=_STATUS_DETAILS, + ) + servicer_context.set_code(grpc.StatusCode.NOT_FOUND) + servicer_context.set_details(_STATUS_DETAILS_ANOTHER) + # User put inconsistent status information in trailing metadata + servicer_context.set_trailing_metadata( + ((_GRPC_DETAILS_METADATA_KEY, rich_status.SerializeToString()),)) + + +async def _invalid_code_unary_unary(request, servicer_context): + rich_status = status_pb2.Status( + code=42, + message='Invalid code', + ) + await servicer_context.abort_with_status(rpc_status.to_status(rich_status)) + + +class _GenericHandler(grpc.GenericRpcHandler): + + def service(self, handler_call_details): + if handler_call_details.method == _STATUS_OK: + return grpc.unary_unary_rpc_method_handler(_ok_unary_unary) + elif handler_call_details.method == _STATUS_NOT_OK: + return grpc.unary_unary_rpc_method_handler(_not_ok_unary_unary) + elif handler_call_details.method == _ERROR_DETAILS: + return grpc.unary_unary_rpc_method_handler( + _error_details_unary_unary) + elif handler_call_details.method == _INCONSISTENT: + return grpc.unary_unary_rpc_method_handler( + _inconsistent_unary_unary) + elif handler_call_details.method == _INVALID_CODE: + return grpc.unary_unary_rpc_method_handler( + _invalid_code_unary_unary) + else: + return None + + +class StatusTest(AioTestBase): + + async def setUp(self): + self._server = aio.server() + self._server.add_generic_rpc_handlers((_GenericHandler(),)) + port = self._server.add_insecure_port('[::]:0') + await self._server.start() + + self._channel = aio.insecure_channel('localhost:%d' % port) + + async def tearDown(self): + await self._server.stop(None) + await self._channel.close() + + async def test_status_ok(self): + call = self._channel.unary_unary(_STATUS_OK)(_REQUEST) + + # Succeed RPC doesn't have status + status = await rpc_status.aio.from_call(call) + self.assertIs(status, None) + + async def test_status_not_ok(self): + call = self._channel.unary_unary(_STATUS_NOT_OK)(_REQUEST) + with self.assertRaises(aio.AioRpcError) as exception_context: + await call + rpc_error = exception_context.exception + + self.assertEqual(rpc_error.code(), grpc.StatusCode.INTERNAL) + # Failed RPC doesn't automatically generate status + status = await rpc_status.aio.from_call(call) + self.assertIs(status, None) + + async def test_error_details(self): + call = self._channel.unary_unary(_ERROR_DETAILS)(_REQUEST) + with self.assertRaises(aio.AioRpcError) as exception_context: + await call + rpc_error = exception_context.exception + + status = await rpc_status.aio.from_call(call) + self.assertEqual(rpc_error.code(), grpc.StatusCode.INTERNAL) + self.assertEqual(status.code, code_pb2.Code.Value('INTERNAL')) + + # Check if the underlying proto message is intact + self.assertTrue(status.details[0].Is( + error_details_pb2.DebugInfo.DESCRIPTOR)) + info = error_details_pb2.DebugInfo() + status.details[0].Unpack(info) + self.assertIn('_error_details_unary_unary', info.stack_entries[-1]) + + async def test_code_message_validation(self): + call = self._channel.unary_unary(_INCONSISTENT)(_REQUEST) + with self.assertRaises(aio.AioRpcError) as exception_context: + await call + rpc_error = exception_context.exception + self.assertEqual(rpc_error.code(), grpc.StatusCode.NOT_FOUND) + + # Code/Message validation failed + with self.assertRaises(ValueError): + await rpc_status.aio.from_call(call) + + async def test_invalid_code(self): + with self.assertRaises(aio.AioRpcError) as exception_context: + await self._channel.unary_unary(_INVALID_CODE)(_REQUEST) + rpc_error = exception_context.exception + self.assertEqual(rpc_error.code(), grpc.StatusCode.UNKNOWN) + # Invalid status code exception raised during coversion + self.assertIn('Invalid status code', rpc_error.details()) + + +if __name__ == '__main__': + logging.basicConfig() + unittest.main(verbosity=2) diff --git a/src/python/grpcio_tests/tests_aio/tests.json b/src/python/grpcio_tests/tests_aio/tests.json index e657cfa7e4d..a1e6f88d38f 100644 --- a/src/python/grpcio_tests/tests_aio/tests.json +++ b/src/python/grpcio_tests/tests_aio/tests.json @@ -4,6 +4,7 @@ "interop.local_interop_test.InsecureLocalInteropTest", "interop.local_interop_test.SecureLocalInteropTest", "reflection.reflection_servicer_test.ReflectionServicerTest", + "status.grpc_status_test.StatusTest", "unit._metadata_test.TestTypeMetadata", "unit.abort_test.TestAbort", "unit.aio_rpc_error_test.TestAioRpcError", From ca6e62998c746ffed8bea0e240908d64055b2192 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Fri, 24 Apr 2020 10:55:22 -0700 Subject: [PATCH 642/758] Remove circular dependency --- src/python/grpcio_status/grpc_status/_async.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/python/grpcio_status/grpc_status/_async.py b/src/python/grpcio_status/grpc_status/_async.py index a6a6f7ef6ad..c9201810486 100644 --- a/src/python/grpcio_status/grpc_status/_async.py +++ b/src/python/grpcio_status/grpc_status/_async.py @@ -13,14 +13,12 @@ # limitations under the License. """Reference implementation for status mapping in gRPC Python.""" -from grpc.experimental import aio - from google.rpc import status_pb2 from ._common import code_to_grpc_status_code, GRPC_DETAILS_METADATA_KEY -async def from_call(call: aio.Call): +async def from_call(call): """Returns a google.rpc.status.Status message from a given grpc.aio.Call. This is an EXPERIMENTAL API. From 3a6d73f808ba22449d13060fd38105de4df04930 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Wed, 29 Apr 2020 11:42:05 -0700 Subject: [PATCH 643/758] Revert "Remove circular dependency" This reverts commit dc2b02aad15c66c52e07abe5fdc85be92e13b867. --- src/python/grpcio_status/grpc_status/_async.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/python/grpcio_status/grpc_status/_async.py b/src/python/grpcio_status/grpc_status/_async.py index c9201810486..a6a6f7ef6ad 100644 --- a/src/python/grpcio_status/grpc_status/_async.py +++ b/src/python/grpcio_status/grpc_status/_async.py @@ -13,12 +13,14 @@ # limitations under the License. """Reference implementation for status mapping in gRPC Python.""" +from grpc.experimental import aio + from google.rpc import status_pb2 from ._common import code_to_grpc_status_code, GRPC_DETAILS_METADATA_KEY -async def from_call(call): +async def from_call(call: aio.Call): """Returns a google.rpc.status.Status message from a given grpc.aio.Call. This is an EXPERIMENTAL API. From 6a045297c2f52c1c7f283ca3485f72985c0a92a2 Mon Sep 17 00:00:00 2001 From: ZhenLian Date: Wed, 29 Apr 2020 12:22:12 -0700 Subject: [PATCH 644/758] remove dependencies that cause failures --- CMakeLists.txt | 8 ++++++++ Makefile | 12 ++++++++---- build_autogenerated.yaml | 10 ++++++++++ gRPC-Core.podspec | 5 +++++ grpc.gyp | 8 ++++++++ test/core/end2end/generate_tests.bzl | 2 ++ 6 files changed, 41 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 71f87ec3574..32f328341d7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -895,6 +895,10 @@ if(gRPC_BUILD_TESTS) add_library(end2end_nosec_tests test/core/end2end/cq_verifier.cc + test/core/end2end/data/client_certs.cc + test/core/end2end/data/server1_cert.cc + test/core/end2end/data/server1_key.cc + test/core/end2end/data/test_root_cert.cc test/core/end2end/end2end_nosec_tests.cc test/core/end2end/end2end_test_utils.cc test/core/end2end/fixtures/http_proxy_fixture.cc @@ -1022,6 +1026,10 @@ if(gRPC_BUILD_TESTS) add_library(end2end_tests test/core/end2end/cq_verifier.cc + test/core/end2end/data/client_certs.cc + test/core/end2end/data/server1_cert.cc + test/core/end2end/data/server1_key.cc + test/core/end2end/data/test_root_cert.cc test/core/end2end/end2end_test_utils.cc test/core/end2end/end2end_tests.cc test/core/end2end/fixtures/http_proxy_fixture.cc diff --git a/Makefile b/Makefile index 175c22a52bc..bbd8ae81ff6 100644 --- a/Makefile +++ b/Makefile @@ -3258,6 +3258,10 @@ endif LIBEND2END_NOSEC_TESTS_SRC = \ test/core/end2end/cq_verifier.cc \ + test/core/end2end/data/client_certs.cc \ + test/core/end2end/data/server1_cert.cc \ + test/core/end2end/data/server1_key.cc \ + test/core/end2end/data/test_root_cert.cc \ test/core/end2end/end2end_nosec_tests.cc \ test/core/end2end/end2end_test_utils.cc \ test/core/end2end/fixtures/http_proxy_fixture.cc \ @@ -3366,6 +3370,10 @@ endif LIBEND2END_TESTS_SRC = \ test/core/end2end/cq_verifier.cc \ + test/core/end2end/data/client_certs.cc \ + test/core/end2end/data/server1_cert.cc \ + test/core/end2end/data/server1_key.cc \ + test/core/end2end/data/test_root_cert.cc \ test/core/end2end/end2end_test_utils.cc \ test/core/end2end/end2end_tests.cc \ test/core/end2end/fixtures/http_proxy_fixture.cc \ @@ -20023,10 +20031,6 @@ src/cpp/server/channelz/channelz_service_plugin.cc: $(OPENSSL_DEP) src/cpp/server/secure_server_credentials.cc: $(OPENSSL_DEP) src/cpp/util/error_details.cc: $(OPENSSL_DEP) src/csharp/ext/grpc_csharp_ext.c: $(OPENSSL_DEP) -test/core/end2end/data/client_certs.cc: $(OPENSSL_DEP) -test/core/end2end/data/server1_cert.cc: $(OPENSSL_DEP) -test/core/end2end/data/server1_key.cc: $(OPENSSL_DEP) -test/core/end2end/data/test_root_cert.cc: $(OPENSSL_DEP) test/core/end2end/end2end_tests.cc: $(OPENSSL_DEP) test/core/end2end/tests/call_creds.cc: $(OPENSSL_DEP) test/cpp/microbenchmarks/helpers.cc: $(OPENSSL_DEP) diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml index 60d8870c93d..361a9955fb8 100644 --- a/build_autogenerated.yaml +++ b/build_autogenerated.yaml @@ -19,6 +19,7 @@ libs: public_headers: [] headers: - test/core/end2end/cq_verifier.h + - test/core/end2end/data/ssl_test_data.h - test/core/end2end/end2end_tests.h - test/core/end2end/fixtures/http_proxy_fixture.h - test/core/end2end/fixtures/local_util.h @@ -26,6 +27,10 @@ libs: - test/core/end2end/tests/cancel_test_helpers.h src: - test/core/end2end/cq_verifier.cc + - test/core/end2end/data/client_certs.cc + - test/core/end2end/data/server1_cert.cc + - test/core/end2end/data/server1_key.cc + - test/core/end2end/data/test_root_cert.cc - test/core/end2end/end2end_nosec_tests.cc - test/core/end2end/end2end_test_utils.cc - test/core/end2end/fixtures/http_proxy_fixture.cc @@ -122,6 +127,7 @@ libs: public_headers: [] headers: - test/core/end2end/cq_verifier.h + - test/core/end2end/data/ssl_test_data.h - test/core/end2end/end2end_tests.h - test/core/end2end/fixtures/http_proxy_fixture.h - test/core/end2end/fixtures/local_util.h @@ -129,6 +135,10 @@ libs: - test/core/end2end/tests/cancel_test_helpers.h src: - test/core/end2end/cq_verifier.cc + - test/core/end2end/data/client_certs.cc + - test/core/end2end/data/server1_cert.cc + - test/core/end2end/data/server1_key.cc + - test/core/end2end/data/test_root_cert.cc - test/core/end2end/end2end_test_utils.cc - test/core/end2end/end2end_tests.cc - test/core/end2end/fixtures/http_proxy_fixture.cc diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec index fe383edf797..8bf16911cc6 100644 --- a/gRPC-Core.podspec +++ b/gRPC-Core.podspec @@ -1452,6 +1452,11 @@ Pod::Spec.new do |s| ss.source_files = 'test/core/end2end/cq_verifier.cc', 'test/core/end2end/cq_verifier.h', + 'test/core/end2end/data/client_certs.cc', + 'test/core/end2end/data/server1_cert.cc', + 'test/core/end2end/data/server1_key.cc', + 'test/core/end2end/data/ssl_test_data.h', + 'test/core/end2end/data/test_root_cert.cc', 'test/core/end2end/end2end_test_utils.cc', 'test/core/end2end/end2end_tests.cc', 'test/core/end2end/end2end_tests.h', diff --git a/grpc.gyp b/grpc.gyp index 67165946a75..865c403fde7 100644 --- a/grpc.gyp +++ b/grpc.gyp @@ -176,6 +176,10 @@ ], 'sources': [ 'test/core/end2end/cq_verifier.cc', + 'test/core/end2end/data/client_certs.cc', + 'test/core/end2end/data/server1_cert.cc', + 'test/core/end2end/data/server1_key.cc', + 'test/core/end2end/data/test_root_cert.cc', 'test/core/end2end/end2end_nosec_tests.cc', 'test/core/end2end/end2end_test_utils.cc', 'test/core/end2end/fixtures/http_proxy_fixture.cc', @@ -273,6 +277,10 @@ ], 'sources': [ 'test/core/end2end/cq_verifier.cc', + 'test/core/end2end/data/client_certs.cc', + 'test/core/end2end/data/server1_cert.cc', + 'test/core/end2end/data/server1_key.cc', + 'test/core/end2end/data/test_root_cert.cc', 'test/core/end2end/end2end_test_utils.cc', 'test/core/end2end/end2end_tests.cc', 'test/core/end2end/fixtures/http_proxy_fixture.cc', diff --git a/test/core/end2end/generate_tests.bzl b/test/core/end2end/generate_tests.bzl index b124947f1ee..7eabb251413 100755 --- a/test/core/end2end/generate_tests.bzl +++ b/test/core/end2end/generate_tests.bzl @@ -422,6 +422,7 @@ def grpc_end2end_tests(): language = "C++", deps = [ ":cq_verifier", + ":ssl_test_data", ":http_proxy", ":proxy", ":local_util", @@ -496,6 +497,7 @@ def grpc_end2end_nosec_tests(): language = "C++", deps = [ ":cq_verifier", + ":ssl_test_data", ":http_proxy", ":proxy", ":local_util", From 486e27e2ded4288a17fe6587998248cc96de6ba1 Mon Sep 17 00:00:00 2001 From: Taras Galkovskyi Date: Wed, 29 Apr 2020 19:43:45 +0000 Subject: [PATCH 645/758] fix formatting issues --- examples/python/data_transmission/BUILD | 14 +++++++------- examples/python/data_transmission/alts_client.py | 3 ++- src/python/grpcio_tests/tests/interop/server.py | 2 +- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/examples/python/data_transmission/BUILD b/examples/python/data_transmission/BUILD index 528cd325a1b..7c2980d5a5b 100644 --- a/examples/python/data_transmission/BUILD +++ b/examples/python/data_transmission/BUILD @@ -16,17 +16,17 @@ licenses(["notice"]) # 3-clause BSD load("@grpc_python_dependencies//:requirements.bzl", "requirement") -py_binary( +py_binary( name = "alts_server", - python_version = "PY3", - srcs_version = "PY2AND3", - main = "alts_server.py", srcs = [ "alts_server.py", "demo_pb2.py", "demo_pb2_grpc.py", "server.py", ], + main = "alts_server.py", + python_version = "PY3", + srcs_version = "PY2AND3", deps = [ "//src/python/grpcio/grpc:grpcio", ], @@ -34,15 +34,15 @@ py_binary( py_binary( name = "alts_client", - python_version = "PY3", - srcs_version = "PY2AND3", - main = "alts_client.py", srcs = [ "alts_client.py", "client.py", "demo_pb2.py", "demo_pb2_grpc.py", ], + main = "alts_client.py", + python_version = "PY3", + srcs_version = "PY2AND3", deps = [ "//src/python/grpcio/grpc:grpcio", ], diff --git a/examples/python/data_transmission/alts_client.py b/examples/python/data_transmission/alts_client.py index 0bfcede9465..a2ff05e3646 100644 --- a/examples/python/data_transmission/alts_client.py +++ b/examples/python/data_transmission/alts_client.py @@ -23,7 +23,8 @@ import demo_pb2_grpc SERVER_ADDRESS = "localhost:23333" def main(): - with grpc.secure_channel(SERVER_ADDRESS, credentials=grpc.alts_channel_credentials()) as channel: + with grpc.secure_channel( + SERVER_ADDRESS, credentials=grpc.alts_channel_credentials()) as channel: stub = demo_pb2_grpc.GRPCDemoStub(channel) client.simple_method(stub) client.client_streaming_method(stub) diff --git a/src/python/grpcio_tests/tests/interop/server.py b/src/python/grpcio_tests/tests/interop/server.py index c966271e2a3..a72294aeac8 100644 --- a/src/python/grpcio_tests/tests/interop/server.py +++ b/src/python/grpcio_tests/tests/interop/server.py @@ -63,7 +63,7 @@ def serve(): test_pb2_grpc.add_TestServiceServicer_to_server(service.TestService(), server) if args.use_tls or args.use_alts: - credentials = get_server_credentials(use_tls) + credentials = get_server_credentials(args.use_tls) server.add_secure_port('[::]:{}'.format(args.port), credentials) else: server.add_insecure_port('[::]:{}'.format(args.port)) From 32acd9d5fd2c9a5ce4530f964ca7405a17511757 Mon Sep 17 00:00:00 2001 From: Pau Freixes Date: Wed, 29 Apr 2020 22:55:50 +0200 Subject: [PATCH 646/758] [Aio] Stream Unary client interceptor Add support for Stream Unary client interceptor --- .../grpcio/grpc/experimental/aio/__init__.py | 4 +- .../grpcio/grpc/experimental/aio/_call.py | 11 +- .../grpcio/grpc/experimental/aio/_channel.py | 37 +- .../grpc/experimental/aio/_interceptor.py | 211 ++++++- src/python/grpcio_tests/tests_aio/tests.json | 1 + .../client_stream_unary_interceptor_test.py | 531 ++++++++++++++++++ 6 files changed, 769 insertions(+), 26 deletions(-) create mode 100644 src/python/grpcio_tests/tests_aio/unit/client_stream_unary_interceptor_test.py diff --git a/src/python/grpcio/grpc/experimental/aio/__init__.py b/src/python/grpcio/grpc/experimental/aio/__init__.py index d0b6a58a149..c0fc17eeb92 100644 --- a/src/python/grpcio/grpc/experimental/aio/__init__.py +++ b/src/python/grpcio/grpc/experimental/aio/__init__.py @@ -33,7 +33,8 @@ from ._call import AioRpcError from ._interceptor import (ClientCallDetails, ClientInterceptor, InterceptedUnaryUnaryCall, UnaryUnaryClientInterceptor, - UnaryStreamClientInterceptor, ServerInterceptor) + UnaryStreamClientInterceptor, + StreamUnaryClientInterceptor, ServerInterceptor) from ._server import server from ._base_server import Server, ServicerContext from ._typing import ChannelArgumentType @@ -61,6 +62,7 @@ __all__ = ( 'ClientInterceptor', 'UnaryStreamClientInterceptor', 'UnaryUnaryClientInterceptor', + 'StreamUnaryClientInterceptor', 'InterceptedUnaryUnaryCall', 'ServerInterceptor', 'insecure_channel', diff --git a/src/python/grpcio/grpc/experimental/aio/_call.py b/src/python/grpcio/grpc/experimental/aio/_call.py index 00778184658..9cab7052318 100644 --- a/src/python/grpcio/grpc/experimental/aio/_call.py +++ b/src/python/grpcio/grpc/experimental/aio/_call.py @@ -35,6 +35,7 @@ _LOCAL_CANCELLATION_DETAILS = 'Locally cancelled by application!' _GC_CANCELLATION_DETAILS = 'Cancelled upon garbage collection!' _RPC_ALREADY_FINISHED_DETAILS = 'RPC already finished.' _RPC_HALF_CLOSED_DETAILS = 'RPC is half closed after calling "done_writing".' +_API_STYLE_ERROR = 'Please don\'t mix two styles of API for streaming requests' _OK_CALL_REPRESENTATION = ('<{} of RPC that terminated with:\n' '\tstatus = {}\n' @@ -302,8 +303,7 @@ class _StreamResponseMixin(Call): if self._response_style is _APIStyle.UNKNOWN: self._response_style = style elif self._response_style is not style: - raise cygrpc.UsageError( - 'Please don\'t mix two styles of API for streaming responses') + raise cygrpc.UsageError(_API_STYLE_ERROR) def cancel(self) -> bool: if super().cancel(): @@ -381,8 +381,7 @@ class _StreamRequestMixin(Call): def _raise_for_different_style(self, style: _APIStyle): if self._request_style is not style: - raise cygrpc.UsageError( - 'Please don\'t mix two styles of API for streaming requests') + raise cygrpc.UsageError(_API_STYLE_ERROR) def cancel(self) -> bool: if super().cancel(): @@ -399,7 +398,8 @@ class _StreamRequestMixin(Call): request_iterator: RequestIterableType ) -> None: try: - if inspect.isasyncgen(request_iterator): + if inspect.isasyncgen(request_iterator) or hasattr( + request_iterator, '__aiter__'): async for request in request_iterator: await self._write(request) else: @@ -426,7 +426,6 @@ class _StreamRequestMixin(Call): serialized_request = _common.serialize(request, self._request_serializer) - try: await self._cython_call.send_serialized_message(serialized_request) except asyncio.CancelledError: diff --git a/src/python/grpcio/grpc/experimental/aio/_channel.py b/src/python/grpcio/grpc/experimental/aio/_channel.py index afa9cf30630..731a3351b48 100644 --- a/src/python/grpcio/grpc/experimental/aio/_channel.py +++ b/src/python/grpcio/grpc/experimental/aio/_channel.py @@ -25,9 +25,11 @@ from . import _base_call, _base_channel from ._call import (StreamStreamCall, StreamUnaryCall, UnaryStreamCall, UnaryUnaryCall) from ._interceptor import (InterceptedUnaryUnaryCall, - InterceptedUnaryStreamCall, ClientInterceptor, + InterceptedUnaryStreamCall, + InterceptedStreamUnaryCall, ClientInterceptor, UnaryUnaryClientInterceptor, - UnaryStreamClientInterceptor) + UnaryStreamClientInterceptor, + StreamUnaryClientInterceptor) from ._typing import (ChannelArgumentType, DeserializingFunction, MetadataType, SerializingFunction, RequestIterableType) from ._utils import _timeout_to_deadline @@ -167,10 +169,17 @@ class StreamUnaryMultiCallable(_BaseMultiCallable, deadline = _timeout_to_deadline(timeout) - call = StreamUnaryCall(request_iterator, deadline, metadata, - credentials, wait_for_ready, self._channel, - self._method, self._request_serializer, - self._response_deserializer, self._loop) + if not self._interceptors: + call = StreamUnaryCall(request_iterator, deadline, metadata, + credentials, wait_for_ready, self._channel, + self._method, self._request_serializer, + self._response_deserializer, self._loop) + else: + call = InterceptedStreamUnaryCall( + self._interceptors, request_iterator, deadline, metadata, + credentials, wait_for_ready, self._channel, self._method, + self._request_serializer, self._response_deserializer, + self._loop) return call @@ -204,6 +213,7 @@ class Channel(_base_channel.Channel): _channel: cygrpc.AioChannel _unary_unary_interceptors: List[UnaryUnaryClientInterceptor] _unary_stream_interceptors: List[UnaryStreamClientInterceptor] + _stream_unary_interceptors: List[StreamUnaryClientInterceptor] def __init__(self, target: str, options: ChannelArgumentType, credentials: Optional[grpc.ChannelCredentials], @@ -222,12 +232,15 @@ class Channel(_base_channel.Channel): """ self._unary_unary_interceptors = [] self._unary_stream_interceptors = [] + self._stream_unary_interceptors = [] if interceptors: attrs_and_interceptor_classes = ((self._unary_unary_interceptors, UnaryUnaryClientInterceptor), (self._unary_stream_interceptors, - UnaryStreamClientInterceptor)) + UnaryStreamClientInterceptor), + (self._stream_unary_interceptors, + StreamUnaryClientInterceptor)) # pylint: disable=cell-var-from-loop for attr, interceptor_class in attrs_and_interceptor_classes: @@ -238,13 +251,15 @@ class Channel(_base_channel.Channel): invalid_interceptors = set(interceptors) - set( self._unary_unary_interceptors) - set( - self._unary_stream_interceptors) + self._unary_stream_interceptors) - set( + self._stream_unary_interceptors) if invalid_interceptors: raise ValueError( "Interceptor must be "+\ "UnaryUnaryClientInterceptors or "+\ - "UnaryStreamClientInterceptors. The following are invalid: {}"\ + "UnaryUnaryClientInterceptors or "+\ + "StreamUnaryClientInterceptors. The following are invalid: {}"\ .format(invalid_interceptors)) self._loop = asyncio.get_event_loop() @@ -383,7 +398,9 @@ class Channel(_base_channel.Channel): ) -> StreamUnaryMultiCallable: return StreamUnaryMultiCallable(self._channel, _common.encode(method), request_serializer, - response_deserializer, None, self._loop) + response_deserializer, + self._stream_unary_interceptors, + self._loop) def stream_stream( self, diff --git a/src/python/grpcio/grpc/experimental/aio/_interceptor.py b/src/python/grpcio/grpc/experimental/aio/_interceptor.py index b9f786e5522..6a9f8434a0a 100644 --- a/src/python/grpcio/grpc/experimental/aio/_interceptor.py +++ b/src/python/grpcio/grpc/experimental/aio/_interceptor.py @@ -22,10 +22,13 @@ import grpc from grpc._cython import cygrpc from . import _base_call -from ._call import UnaryUnaryCall, UnaryStreamCall, AioRpcError +from ._call import UnaryUnaryCall, UnaryStreamCall, StreamUnaryCall, AioRpcError +from ._call import _RPC_ALREADY_FINISHED_DETAILS, _RPC_HALF_CLOSED_DETAILS +from ._call import _API_STYLE_ERROR from ._utils import _timeout_to_deadline from ._typing import (RequestType, SerializingFunction, DeserializingFunction, - MetadataType, ResponseType, DoneCallbackType) + MetadataType, ResponseType, DoneCallbackType, + RequestIterableType) _LOCAL_CANCELLATION_DETAILS = 'Locally cancelled by application!' @@ -132,13 +135,17 @@ class UnaryStreamClientInterceptor(ClientInterceptor, metaclass=ABCMeta): ) -> Union[AsyncIterable[ResponseType], UnaryStreamCall]: """Intercepts a unary-stream invocation asynchronously. + The function could return the call object or an asynchronous + iterator, in case of being an asyncrhonous iterator this will + become the source of the reads done by the caller. + Args: continuation: A coroutine that proceeds with the invocation by executing the next interceptor in chain or invoking the actual RPC on the underlying Channel. It is the interceptor's responsibility to call it if it decides to move the RPC forward. The interceptor can use - `call = await continuation(client_call_details, request, response_iterator))` + `call = await continuation(client_call_details, request)` to continue with the RPC. `continuation` returns the call to the RPC. client_call_details: A ClientCallDetails object describing the @@ -154,6 +161,42 @@ class UnaryStreamClientInterceptor(ClientInterceptor, metaclass=ABCMeta): """ +class StreamUnaryClientInterceptor(ClientInterceptor, metaclass=ABCMeta): + """Affords intercepting stream-unary invocations.""" + + @abstractmethod + async def intercept_stream_unary( + self, + continuation: Callable[[ClientCallDetails, RequestType], + UnaryStreamCall], + client_call_details: ClientCallDetails, + request_iterator: RequestIterableType, + ) -> StreamUnaryCall: + """Intercepts a stream-unary invocation asynchronously. + + Args: + continuation: A coroutine that proceeds with the invocation by + executing the next interceptor in chain or invoking the + actual RPC on the underlying Channel. It is the interceptor's + responsibility to call it if it decides to move the RPC forward. + The interceptor can use + `call = await continuation(client_call_details, request_iterator)` + to continue with the RPC. `continuation` returns the call to the + RPC. + client_call_details: A ClientCallDetails object describing the + outgoing RPC. + request_iterator: The request iterator that will produce requests + for the RPC. + + Returns: + The RPC Call. + + Raises: + AioRpcError: Indicating that the RPC terminated with non-OK status. + asyncio.CancelledError: Indicating that the RPC was canceled. + """ + + class InterceptedCall: """Base implementation for all intecepted call arities. @@ -332,7 +375,16 @@ class InterceptedCall: return await call.wait_for_connection() -class InterceptedUnaryUnaryCall(InterceptedCall, _base_call.UnaryUnaryCall): +class _InterceptedUnaryResponseMixin: + + def __await__(self): + call = yield from self._interceptors_task.__await__() + response = yield from call.__await__() + return response + + +class InterceptedUnaryUnaryCall(_InterceptedUnaryResponseMixin, InterceptedCall, + _base_call.UnaryUnaryCall): """Used for running a `UnaryUnaryCall` wrapped by interceptors. For the `__await__` method is it is proxied to the intercepted call only when @@ -402,11 +454,6 @@ class InterceptedUnaryUnaryCall(InterceptedCall, _base_call.UnaryUnaryCall): return await _run_interceptor(iter(interceptors), client_call_details, request) - def __await__(self): - call = yield from self._interceptors_task.__await__() - response = yield from call.__await__() - return response - def time_remaining(self) -> Optional[float]: raise NotImplementedError() @@ -504,6 +551,152 @@ class InterceptedUnaryStreamCall(InterceptedCall, _base_call.UnaryStreamCall): raise NotImplementedError() +class InterceptedStreamUnaryCall(_InterceptedUnaryResponseMixin, + InterceptedCall, _base_call.StreamUnaryCall): + """Used for running a `StreamUnaryCall` wrapped by interceptors. + + For the `__await__` method is it is proxied to the intercepted call only when + the interceptor task is finished. + """ + + _loop: asyncio.AbstractEventLoop + _channel: cygrpc.AioChannel + _write_to_iterator_async_gen: Optional[AsyncIterable[RequestType]] + _write_to_iterator_queue: Optional[asyncio.Queue] + + _FINISH_ITERATOR_SENTINEL = tuple() + + # pylint: disable=too-many-arguments + def __init__(self, interceptors: Sequence[StreamUnaryClientInterceptor], + request_iterator: Optional[RequestIterableType], + timeout: Optional[float], metadata: MetadataType, + credentials: Optional[grpc.CallCredentials], + wait_for_ready: Optional[bool], channel: cygrpc.AioChannel, + method: bytes, request_serializer: SerializingFunction, + response_deserializer: DeserializingFunction, + loop: asyncio.AbstractEventLoop) -> None: + self._loop = loop + self._channel = channel + if not request_iterator: + # We provide our own request iterator which is a proxy + # of the future wries done by the caller. This iterator + # will use internally a queue for consuming messages produced + # by the write method. + self._write_to_iterator_queue = asyncio.Queue(maxsize=1) + self._write_to_iterator_async_gen = self._proxies_writes_as_a_request_iteerator( + ) + request_iterator = self._write_to_iterator_async_gen + else: + self._write_to_iterator_queue = None + + interceptors_task = loop.create_task( + self._invoke(interceptors, method, timeout, metadata, credentials, + wait_for_ready, request_iterator, request_serializer, + response_deserializer)) + super().__init__(interceptors_task) + + # pylint: disable=too-many-arguments + async def _invoke( + self, interceptors: Sequence[StreamUnaryClientInterceptor], + method: bytes, timeout: Optional[float], + metadata: Optional[MetadataType], + credentials: Optional[grpc.CallCredentials], + wait_for_ready: Optional[bool], + request_iterator: RequestIterableType, + request_serializer: SerializingFunction, + response_deserializer: DeserializingFunction) -> StreamUnaryCall: + """Run the RPC call wrapped in interceptors""" + + async def _run_interceptor( + interceptors: Iterator[UnaryUnaryClientInterceptor], + client_call_details: ClientCallDetails, + request_iterator: RequestIterableType + ) -> _base_call.StreamUnaryCall: + + interceptor = next(interceptors, None) + + if interceptor: + continuation = functools.partial(_run_interceptor, interceptors) + + return await interceptor.intercept_stream_unary( + continuation, client_call_details, request_iterator) + else: + return StreamUnaryCall( + request_iterator, + _timeout_to_deadline(client_call_details.timeout), + client_call_details.metadata, + client_call_details.credentials, + client_call_details.wait_for_ready, self._channel, + client_call_details.method, request_serializer, + response_deserializer, self._loop) + + client_call_details = ClientCallDetails(method, timeout, metadata, + credentials, wait_for_ready) + return await _run_interceptor(iter(interceptors), client_call_details, + request_iterator) + + def time_remaining(self) -> Optional[float]: + raise NotImplementedError() + + async def _proxies_writes_as_a_request_iteerator(self): + await self._interceptors_task + + while True: + value = await self._write_to_iterator_queue.get() + if value is InterceptedStreamUnaryCall._FINISH_ITERATOR_SENTINEL: + break + yield value + + async def write(self, request: RequestType) -> None: + # If no queue was created it means that requests + # should be expected through an iterators provided + # by the caller. + if self._write_to_iterator_queue is None: + raise cygrpc.UsageError( + 'Please don\'t mix two styles of API for streaming requests') + + try: + call = await self._interceptors_task + except (asyncio.CancelledError, AioRpcError): + raise asyncio.InvalidStateError(_RPC_ALREADY_FINISHED_DETAILS) + + if call.done(): + raise asyncio.InvalidStateError(_RPC_ALREADY_FINISHED_DETAILS) + elif call._done_writing_flag: + raise asyncio.InvalidStateError(_RPC_HALF_CLOSED_DETAILS) + + # Write might never end up since the call could abrubtly finish, + # we give up on the first awaitable object that finishes.. + _, _ = await asyncio.wait( + (self._write_to_iterator_queue.put(request), call), + return_when=asyncio.FIRST_COMPLETED) + + if call.done(): + raise asyncio.InvalidStateError(_RPC_ALREADY_FINISHED_DETAILS) + + async def done_writing(self) -> None: + """Signal peer that client is done writing. + + This method is idempotent. + """ + # If no queue was created it means that requests + # should be expected through an iterators provided + # by the caller. + if self._write_to_iterator_queue is None: + raise cygrpc.UsageError(_API_STYLE_ERROR) + + try: + call = await self._interceptors_task + except asyncio.CancelledError: + raise asyncio.InvalidStateError(_RPC_ALREADY_FINISHED_DETAILS) + + # Write might never end up since the call could abrubtly finish, + # we give up on the first awaitable object that finishes. + _, _ = await asyncio.wait((self._write_to_iterator_queue.put( + InterceptedStreamUnaryCall._FINISH_ITERATOR_SENTINEL), call), + return_when=asyncio.FIRST_COMPLETED) + + class UnaryUnaryCallResponse(_base_call.UnaryUnaryCall): """Final UnaryUnaryCall class finished with a response.""" _response: ResponseType diff --git a/src/python/grpcio_tests/tests_aio/tests.json b/src/python/grpcio_tests/tests_aio/tests.json index 0bdd1f72e50..aeed4363319 100644 --- a/src/python/grpcio_tests/tests_aio/tests.json +++ b/src/python/grpcio_tests/tests_aio/tests.json @@ -13,6 +13,7 @@ "unit.channel_argument_test.TestChannelArgument", "unit.channel_ready_test.TestChannelReady", "unit.channel_test.TestChannel", + "unit.client_stream_unary_interceptor_test.TestStreamUnaryClientInterceptor", "unit.client_unary_stream_interceptor_test.TestUnaryStreamClientInterceptor", "unit.client_unary_unary_interceptor_test.TestInterceptedUnaryUnaryCall", "unit.client_unary_unary_interceptor_test.TestUnaryUnaryClientInterceptor", diff --git a/src/python/grpcio_tests/tests_aio/unit/client_stream_unary_interceptor_test.py b/src/python/grpcio_tests/tests_aio/unit/client_stream_unary_interceptor_test.py new file mode 100644 index 00000000000..318a117ffe4 --- /dev/null +++ b/src/python/grpcio_tests/tests_aio/unit/client_stream_unary_interceptor_test.py @@ -0,0 +1,531 @@ +# Copyright 2020 The gRPC Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import asyncio +import logging +import unittest +import datetime + +import grpc + +from grpc.experimental import aio +from tests_aio.unit._constants import UNREACHABLE_TARGET +from tests_aio.unit._common import inject_callbacks +from tests_aio.unit._test_server import start_test_server +from tests_aio.unit._test_base import AioTestBase +from tests.unit.framework.common import test_constants +from src.proto.grpc.testing import messages_pb2, test_pb2_grpc + +_SHORT_TIMEOUT_S = 1.0 + +_NUM_STREAM_REQUESTS = 5 +_REQUEST_PAYLOAD_SIZE = 7 +_RESPONSE_INTERVAL_US = int(_SHORT_TIMEOUT_S * 1000 * 1000) + + +class _CountingRequestIterator: + + def __init__(self, request_iterator): + self.request_cnt = 0 + self._request_iterator = request_iterator + + async def _forward_requests(self): + async for request in self._request_iterator: + self.request_cnt += 1 + yield request + + def __aiter__(self): + return self._forward_requests() + + +class _StreamUnaryInterceptorEmpty(aio.StreamUnaryClientInterceptor): + + async def intercept_stream_unary(self, continuation, client_call_details, + request_iterator): + return await continuation(client_call_details, request_iterator) + + def assert_in_final_state(self, test: unittest.TestCase): + pass + + +class _StreamUnaryInterceptorWithRequestIterator( + aio.StreamUnaryClientInterceptor): + + async def intercept_stream_unary(self, continuation, client_call_details, + request_iterator): + self.request_iterator = _CountingRequestIterator(request_iterator) + call = await continuation(client_call_details, self.request_iterator) + return call + + def assert_in_final_state(self, test: unittest.TestCase): + test.assertEqual(_NUM_STREAM_REQUESTS, + self.request_iterator.request_cnt) + + +class TestStreamUnaryClientInterceptor(AioTestBase): + + async def setUp(self): + self._server_target, self._server = await start_test_server() + + async def tearDown(self): + await self._server.stop(None) + + async def test_intercepts(self): + for interceptor_class in (_StreamUnaryInterceptorEmpty, + _StreamUnaryInterceptorWithRequestIterator): + + with self.subTest(name=interceptor_class): + interceptor = interceptor_class() + channel = aio.insecure_channel(self._server_target, + interceptors=[interceptor]) + stub = test_pb2_grpc.TestServiceStub(channel) + + payload = messages_pb2.Payload(body=b'\0' * + _REQUEST_PAYLOAD_SIZE) + request = messages_pb2.StreamingInputCallRequest( + payload=payload) + + async def request_iterator(): + for _ in range(_NUM_STREAM_REQUESTS): + yield request + + call = stub.StreamingInputCall(request_iterator()) + + response = await call + + self.assertEqual(_NUM_STREAM_REQUESTS * _REQUEST_PAYLOAD_SIZE, + response.aggregated_payload_size) + self.assertEqual(await call.code(), grpc.StatusCode.OK) + self.assertEqual(await call.initial_metadata(), ()) + self.assertEqual(await call.trailing_metadata(), ()) + self.assertEqual(await call.details(), '') + self.assertEqual(await call.debug_error_string(), '') + self.assertEqual(call.cancel(), False) + self.assertEqual(call.cancelled(), False) + self.assertEqual(call.done(), True) + + interceptor.assert_in_final_state(self) + + await channel.close() + + async def test_intercepts_using_write(self): + for interceptor_class in (_StreamUnaryInterceptorEmpty, + _StreamUnaryInterceptorWithRequestIterator): + + with self.subTest(name=interceptor_class): + interceptor = interceptor_class() + channel = aio.insecure_channel(self._server_target, + interceptors=[interceptor]) + stub = test_pb2_grpc.TestServiceStub(channel) + + payload = messages_pb2.Payload(body=b'\0' * + _REQUEST_PAYLOAD_SIZE) + request = messages_pb2.StreamingInputCallRequest( + payload=payload) + + call = stub.StreamingInputCall() + + for _ in range(_NUM_STREAM_REQUESTS): + await call.write(request) + + await call.done_writing() + + response = await call + + self.assertEqual(_NUM_STREAM_REQUESTS * _REQUEST_PAYLOAD_SIZE, + response.aggregated_payload_size) + self.assertEqual(await call.code(), grpc.StatusCode.OK) + self.assertEqual(await call.initial_metadata(), ()) + self.assertEqual(await call.trailing_metadata(), ()) + self.assertEqual(await call.details(), '') + self.assertEqual(await call.debug_error_string(), '') + self.assertEqual(call.cancel(), False) + self.assertEqual(call.cancelled(), False) + self.assertEqual(call.done(), True) + + interceptor.assert_in_final_state(self) + + await channel.close() + + async def test_add_done_callback_interceptor_task_not_finished(self): + for interceptor_class in (_StreamUnaryInterceptorEmpty, + _StreamUnaryInterceptorWithRequestIterator): + + with self.subTest(name=interceptor_class): + interceptor = interceptor_class() + + channel = aio.insecure_channel(self._server_target, + interceptors=[interceptor]) + stub = test_pb2_grpc.TestServiceStub(channel) + + payload = messages_pb2.Payload(body=b'\0' * + _REQUEST_PAYLOAD_SIZE) + request = messages_pb2.StreamingInputCallRequest( + payload=payload) + + async def request_iterator(): + for _ in range(_NUM_STREAM_REQUESTS): + yield request + + call = stub.StreamingInputCall(request_iterator()) + + validation = inject_callbacks(call) + + response = await call + + await validation + + await channel.close() + + async def test_add_done_callback_interceptor_task_finished(self): + for interceptor_class in (_StreamUnaryInterceptorEmpty, + _StreamUnaryInterceptorWithRequestIterator): + + with self.subTest(name=interceptor_class): + interceptor = interceptor_class() + + channel = aio.insecure_channel(self._server_target, + interceptors=[interceptor]) + stub = test_pb2_grpc.TestServiceStub(channel) + + payload = messages_pb2.Payload(body=b'\0' * + _REQUEST_PAYLOAD_SIZE) + request = messages_pb2.StreamingInputCallRequest( + payload=payload) + + async def request_iterator(): + for _ in range(_NUM_STREAM_REQUESTS): + yield request + + call = stub.StreamingInputCall(request_iterator()) + + response = await call + + validation = inject_callbacks(call) + + await validation + + await channel.close() + + async def test_multiple_interceptors_request_iterator(self): + for interceptor_class in (_StreamUnaryInterceptorEmpty, + _StreamUnaryInterceptorWithRequestIterator): + + with self.subTest(name=interceptor_class): + + interceptors = [interceptor_class(), interceptor_class()] + channel = aio.insecure_channel(self._server_target, + interceptors=interceptors) + stub = test_pb2_grpc.TestServiceStub(channel) + + payload = messages_pb2.Payload(body=b'\0' * + _REQUEST_PAYLOAD_SIZE) + request = messages_pb2.StreamingInputCallRequest( + payload=payload) + + async def request_iterator(): + for _ in range(_NUM_STREAM_REQUESTS): + yield request + + call = stub.StreamingInputCall(request_iterator()) + + response = await call + + self.assertEqual(_NUM_STREAM_REQUESTS * _REQUEST_PAYLOAD_SIZE, + response.aggregated_payload_size) + self.assertEqual(await call.code(), grpc.StatusCode.OK) + self.assertEqual(await call.initial_metadata(), ()) + self.assertEqual(await call.trailing_metadata(), ()) + self.assertEqual(await call.details(), '') + self.assertEqual(await call.debug_error_string(), '') + self.assertEqual(call.cancel(), False) + self.assertEqual(call.cancelled(), False) + self.assertEqual(call.done(), True) + + for interceptor in interceptors: + interceptor.assert_in_final_state(self) + + await channel.close() + + async def test_intercepts_request_iterator_rpc_error(self): + for interceptor_class in (_StreamUnaryInterceptorEmpty, + _StreamUnaryInterceptorWithRequestIterator): + + with self.subTest(name=interceptor_class): + channel = aio.insecure_channel( + UNREACHABLE_TARGET, interceptors=[interceptor_class()]) + stub = test_pb2_grpc.TestServiceStub(channel) + + payload = messages_pb2.Payload(body=b'\0' * + _REQUEST_PAYLOAD_SIZE) + request = messages_pb2.StreamingInputCallRequest( + payload=payload) + + # When there is an error the request iterator is no longer + # consumed. + async def request_iterator(): + for _ in range(_NUM_STREAM_REQUESTS): + yield request + + call = stub.StreamingInputCall(request_iterator()) + + with self.assertRaises(aio.AioRpcError) as exception_context: + await call + + self.assertEqual(grpc.StatusCode.UNAVAILABLE, + exception_context.exception.code()) + self.assertTrue(call.done()) + self.assertEqual(grpc.StatusCode.UNAVAILABLE, await call.code()) + + await channel.close() + + async def test_intercepts_request_iterator_rpc_error_using_write(self): + for interceptor_class in (_StreamUnaryInterceptorEmpty, + _StreamUnaryInterceptorWithRequestIterator): + + with self.subTest(name=interceptor_class): + channel = aio.insecure_channel( + UNREACHABLE_TARGET, interceptors=[interceptor_class()]) + stub = test_pb2_grpc.TestServiceStub(channel) + + payload = messages_pb2.Payload(body=b'\0' * + _REQUEST_PAYLOAD_SIZE) + request = messages_pb2.StreamingInputCallRequest( + payload=payload) + + call = stub.StreamingInputCall() + + # When there is an error during the write, exception is raised. + with self.assertRaises(asyncio.InvalidStateError): + for _ in range(_NUM_STREAM_REQUESTS): + await call.write(request) + + with self.assertRaises(aio.AioRpcError) as exception_context: + await call + + self.assertEqual(grpc.StatusCode.UNAVAILABLE, + exception_context.exception.code()) + self.assertTrue(call.done()) + self.assertEqual(grpc.StatusCode.UNAVAILABLE, await call.code()) + + await channel.close() + + async def test_cancel_before_rpc(self): + + interceptor_reached = asyncio.Event() + wait_for_ever = self.loop.create_future() + + class Interceptor(aio.StreamUnaryClientInterceptor): + + async def intercept_stream_unary(self, continuation, + client_call_details, + request_iterator): + interceptor_reached.set() + await wait_for_ever + + channel = aio.insecure_channel(self._server_target, + interceptors=[Interceptor()]) + stub = test_pb2_grpc.TestServiceStub(channel) + + payload = messages_pb2.Payload(body=b'\0' * _REQUEST_PAYLOAD_SIZE) + request = messages_pb2.StreamingInputCallRequest(payload=payload) + + call = stub.StreamingInputCall() + + self.assertFalse(call.cancelled()) + self.assertFalse(call.done()) + + await interceptor_reached.wait() + self.assertTrue(call.cancel()) + + # When there is an error during the write, exception is raised. + with self.assertRaises(asyncio.InvalidStateError): + for _ in range(_NUM_STREAM_REQUESTS): + await call.write(request) + + with self.assertRaises(asyncio.CancelledError): + await call + + self.assertTrue(call.cancelled()) + self.assertTrue(call.done()) + self.assertEqual(await call.code(), grpc.StatusCode.CANCELLED) + self.assertEqual(await call.initial_metadata(), None) + self.assertEqual(await call.trailing_metadata(), None) + await channel.close() + + async def test_cancel_after_rpc(self): + + interceptor_reached = asyncio.Event() + wait_for_ever = self.loop.create_future() + + class Interceptor(aio.StreamUnaryClientInterceptor): + + async def intercept_stream_unary(self, continuation, + client_call_details, + request_iterator): + call = await continuation(client_call_details, request_iterator) + interceptor_reached.set() + await wait_for_ever + + channel = aio.insecure_channel(self._server_target, + interceptors=[Interceptor()]) + stub = test_pb2_grpc.TestServiceStub(channel) + + payload = messages_pb2.Payload(body=b'\0' * _REQUEST_PAYLOAD_SIZE) + request = messages_pb2.StreamingInputCallRequest(payload=payload) + + call = stub.StreamingInputCall() + + self.assertFalse(call.cancelled()) + self.assertFalse(call.done()) + + await interceptor_reached.wait() + self.assertTrue(call.cancel()) + + # When there is an error during the write, exception is raised. + with self.assertRaises(asyncio.InvalidStateError): + for _ in range(_NUM_STREAM_REQUESTS): + await call.write(request) + + with self.assertRaises(asyncio.CancelledError): + await call + + self.assertTrue(call.cancelled()) + self.assertTrue(call.done()) + self.assertEqual(await call.code(), grpc.StatusCode.CANCELLED) + self.assertEqual(await call.initial_metadata(), None) + self.assertEqual(await call.trailing_metadata(), None) + await channel.close() + + async def test_cancel_while_writing(self): + # Test cancelation before making any write or after doing at least 1 + for num_writes_before_cancel in (0, 1): + with self.subTest(name="Num writes before cancel: {}".format( + num_writes_before_cancel)): + + channel = aio.insecure_channel( + UNREACHABLE_TARGET, + interceptors=[_StreamUnaryInterceptorWithRequestIterator()]) + stub = test_pb2_grpc.TestServiceStub(channel) + + payload = messages_pb2.Payload(body=b'\0' * + _REQUEST_PAYLOAD_SIZE) + request = messages_pb2.StreamingInputCallRequest( + payload=payload) + + call = stub.StreamingInputCall() + + with self.assertRaises(asyncio.InvalidStateError): + for i in range(_NUM_STREAM_REQUESTS): + if i == num_writes_before_cancel: + self.assertTrue(call.cancel()) + await call.write(request) + + with self.assertRaises(asyncio.CancelledError): + await call + + self.assertTrue(call.cancelled()) + self.assertTrue(call.done()) + self.assertEqual(await call.code(), grpc.StatusCode.CANCELLED) + + await channel.close() + + async def test_cancel_by_the_interceptor(self): + + class Interceptor(aio.StreamUnaryClientInterceptor): + + async def intercept_stream_unary(self, continuation, + client_call_details, + request_iterator): + call = await continuation(client_call_details, request_iterator) + call.cancel() + return call + + channel = aio.insecure_channel(UNREACHABLE_TARGET, + interceptors=[Interceptor()]) + stub = test_pb2_grpc.TestServiceStub(channel) + + payload = messages_pb2.Payload(body=b'\0' * _REQUEST_PAYLOAD_SIZE) + request = messages_pb2.StreamingInputCallRequest(payload=payload) + + call = stub.StreamingInputCall() + + with self.assertRaises(asyncio.InvalidStateError): + for i in range(_NUM_STREAM_REQUESTS): + await call.write(request) + + with self.assertRaises(asyncio.CancelledError): + await call + + self.assertTrue(call.cancelled()) + self.assertTrue(call.done()) + self.assertEqual(await call.code(), grpc.StatusCode.CANCELLED) + + await channel.close() + + async def test_exception_raised_by_interceptor(self): + + class InterceptorException(Exception): + pass + + class Interceptor(aio.StreamUnaryClientInterceptor): + + async def intercept_stream_unary(self, continuation, + client_call_details, + request_iterator): + raise InterceptorException + + channel = aio.insecure_channel(UNREACHABLE_TARGET, + interceptors=[Interceptor()]) + stub = test_pb2_grpc.TestServiceStub(channel) + + payload = messages_pb2.Payload(body=b'\0' * _REQUEST_PAYLOAD_SIZE) + request = messages_pb2.StreamingInputCallRequest(payload=payload) + + call = stub.StreamingInputCall() + + with self.assertRaises(InterceptorException): + for i in range(_NUM_STREAM_REQUESTS): + await call.write(request) + + with self.assertRaises(InterceptorException): + await call + + await channel.close() + + async def test_intercepts_prohibit_mixing_style(self): + channel = aio.insecure_channel( + self._server_target, interceptors=[_StreamUnaryInterceptorEmpty()]) + stub = test_pb2_grpc.TestServiceStub(channel) + + payload = messages_pb2.Payload(body=b'\0' * _REQUEST_PAYLOAD_SIZE) + request = messages_pb2.StreamingInputCallRequest(payload=payload) + + async def request_iterator(): + for _ in range(_NUM_STREAM_REQUESTS): + yield request + + call = stub.StreamingInputCall(request_iterator()) + + with self.assertRaises(grpc._cython.cygrpc.UsageError): + await call.write(request) + + with self.assertRaises(grpc._cython.cygrpc.UsageError): + await call.done_writing() + + await channel.close() + + +if __name__ == '__main__': + logging.basicConfig(level=logging.DEBUG) + unittest.main(verbosity=2) From b9558026b1f7f15de8a27d5361404b1e61bb3f8b Mon Sep 17 00:00:00 2001 From: Pau Freixes Date: Wed, 29 Apr 2020 23:10:32 +0200 Subject: [PATCH 647/758] Improve message redability --- src/python/grpcio/grpc/experimental/aio/_interceptor.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/python/grpcio/grpc/experimental/aio/_interceptor.py b/src/python/grpcio/grpc/experimental/aio/_interceptor.py index 6a9f8434a0a..855f8aba708 100644 --- a/src/python/grpcio/grpc/experimental/aio/_interceptor.py +++ b/src/python/grpcio/grpc/experimental/aio/_interceptor.py @@ -579,9 +579,7 @@ class InterceptedStreamUnaryCall(_InterceptedUnaryResponseMixin, self._channel = channel if not request_iterator: # We provide our own request iterator which is a proxy - # of the future wries done by the caller. This iterator - # will use internally a queue for consuming messages produced - # by the write method. + # of the futures writes that will be done by the caller. self._write_to_iterator_queue = asyncio.Queue(maxsize=1) self._write_to_iterator_async_gen = self._proxies_writes_as_a_request_iteerator( ) From 7b869e8442111cf2fe5810459446431bd8d03766 Mon Sep 17 00:00:00 2001 From: Pau Freixes Date: Wed, 29 Apr 2020 23:12:02 +0200 Subject: [PATCH 648/758] Use message constant --- src/python/grpcio/grpc/experimental/aio/_interceptor.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/python/grpcio/grpc/experimental/aio/_interceptor.py b/src/python/grpcio/grpc/experimental/aio/_interceptor.py index 855f8aba708..eff5e03fc1e 100644 --- a/src/python/grpcio/grpc/experimental/aio/_interceptor.py +++ b/src/python/grpcio/grpc/experimental/aio/_interceptor.py @@ -650,8 +650,7 @@ class InterceptedStreamUnaryCall(_InterceptedUnaryResponseMixin, # should be expected through an iterators provided # by the caller. if self._write_to_iterator_queue is None: - raise cygrpc.UsageError( - 'Please don\'t mix two styles of API for streaming requests') + raise cygrpc.UsageError(_API_STYLE_ERROR) try: call = await self._interceptors_task From 2a523b03f36c943f95ec4851cc653b303d6a7fa9 Mon Sep 17 00:00:00 2001 From: Donna Dionne Date: Wed, 29 Apr 2020 14:53:05 -0700 Subject: [PATCH 649/758] Passing C repo manager to donnadionne --- .github/ISSUE_TEMPLATE/bug_report.md | 2 +- .github/ISSUE_TEMPLATE/cleanup_request.md | 2 +- .github/ISSUE_TEMPLATE/feature_request.md | 2 +- .github/pull_request_template.md | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 74060283ce2..680cd706703 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -2,7 +2,7 @@ name: Report a bug about: Create a report to help us improve labels: kind/bug, priority/P2 -assignees: veblush +assignees: donnadionne --- diff --git a/.github/ISSUE_TEMPLATE/cleanup_request.md b/.github/ISSUE_TEMPLATE/cleanup_request.md index 6e5c5aec48a..96c8bda3c4c 100644 --- a/.github/ISSUE_TEMPLATE/cleanup_request.md +++ b/.github/ISSUE_TEMPLATE/cleanup_request.md @@ -2,7 +2,7 @@ name: Request a cleanup about: Suggest a cleanup in our repository labels: kind/internal cleanup, priority/P2 -assignees: veblush +assignees: donnadionne --- diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index ba5d92da901..a7b05e99004 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -2,7 +2,7 @@ name: Request a feature about: Suggest an idea for this project labels: kind/enhancement, priority/P2 -assignees: veblush +assignees: donnadionne --- diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 366b68604df..eddba6676da 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -8,4 +8,4 @@ If you know who should review your pull request, please remove the mentioning be --> -@veblush +@donnadionne From 6cf73030a9f3cc498813f251a7916b59014fee19 Mon Sep 17 00:00:00 2001 From: ZhenLian Date: Wed, 29 Apr 2020 14:48:45 -0700 Subject: [PATCH 650/758] add comments to avoid future use of hard-coded creds --- test/core/end2end/data/ssl_test_data.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/test/core/end2end/data/ssl_test_data.h b/test/core/end2end/data/ssl_test_data.h index 303f3a6eda3..c679ffaf131 100644 --- a/test/core/end2end/data/ssl_test_data.h +++ b/test/core/end2end/data/ssl_test_data.h @@ -19,6 +19,10 @@ #ifndef GRPC_TEST_CORE_END2END_DATA_SSL_TEST_DATA_H #define GRPC_TEST_CORE_END2END_DATA_SSL_TEST_DATA_H +// These credentials are hardcoded as char arrays and are hence considered to +// be deprecated. Please consider using credentials in +// "src/core/tsi/test_creds" instead. + extern const char test_root_cert[]; extern const char test_server1_cert[]; extern const char test_server1_key[]; From df065d41fa958485c0d9207152356ce861f1dc64 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Tue, 28 Apr 2020 17:55:13 -0700 Subject: [PATCH 651/758] Make sync handlers runnable in AsyncIO server --- .../grpc/_cython/_cygrpc/aio/common.pyx.pxi | 54 ++++++ .../grpc/_cython/_cygrpc/aio/server.pxd.pxi | 10 +- .../grpc/_cython/_cygrpc/aio/server.pyx.pxi | 171 ++++++++++++++--- .../tests_aio/unit/_test_server.py | 6 +- .../tests_aio/unit/compatibility_test.py | 179 +++++++++++++++++- 5 files changed, 385 insertions(+), 35 deletions(-) diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi index 6af2499e6e8..73b43815a1d 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi @@ -112,3 +112,57 @@ def schedule_coro_threadsafe(object coro, object loop): ) else: raise + + +def async_generator_to_generator(object agen, object loop): + """Converts an async generator into generator.""" + try: + while True: + future = asyncio.run_coroutine_threadsafe( + agen.__anext__(), + loop + ) + response = future.result() + if response is EOF: + break + else: + yield response + except StopAsyncIteration: + # If StopAsyncIteration is raised, end this generator. + pass + + +async def generator_to_async_generator(object gen, object loop, object thread_pool): + """Converts a generator into async generator. + + The generator might block, so we need to delegate the iteration to thread + pool. Also, we can't simply delegate __next__ to the thread pool, otherwise + we will see following error: + + TypeError: StopIteration interacts badly with generators and cannot be + raised into a Future + """ + queue = asyncio.Queue(loop=loop) + + def yield_to_queue(): + try: + for item in gen: + # For an infinite sized queue, the put_nowait should always success + loop.call_soon_threadsafe(queue.put_nowait, item) + finally: + loop.call_soon_threadsafe(queue.put_nowait, EOF) + + future = loop.run_in_executor( + thread_pool, + yield_to_queue, + ) + + while True: + response = await queue.get() + if response is EOF: + break + else: + yield response + + # Port the exception if there is any + future.result() diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pxd.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pxd.pxi index 52f491614f1..46a47bd1ba7 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pxd.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pxd.pxi @@ -48,6 +48,12 @@ cdef class _ServicerContext: cdef object _response_serializer # Callable[[Any], bytes] +cdef class _SyncServicerContext: + cdef _ServicerContext _context + cdef list _callbacks + cdef object _loop # asyncio.AbstractEventLoop + + cdef class _MessageReceiver: cdef _ServicerContext _servicer_context cdef object _agen @@ -71,5 +77,7 @@ cdef class AioServer: cdef object _shutdown_completed # asyncio.Future cdef CallbackWrapper _shutdown_callback_wrapper cdef object _crash_exception # Exception - cdef set _ongoing_rpc_tasks cdef tuple _interceptors + cdef object _thread_pool # concurrent.futures.ThreadPoolExecutor + + cdef thread_pool(self) diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi index 0e407172806..f015bce5c3b 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi @@ -211,6 +211,65 @@ cdef class _ServicerContext: self._rpc_state.disable_next_compression = True +cdef class _SyncServicerContext: + """Sync servicer context for sync handler compatibility.""" + + def __cinit__(self, + _ServicerContext context): + self._context = context + self._callbacks = [] + self._loop = context._loop + + def read(self): + future = asyncio.run_coroutine_threadsafe( + self._context.read(), + self._loop) + return future.result() + + def write(self, object message): + future = asyncio.run_coroutine_threadsafe( + self._context.write(message), + self._loop) + future.result() + + def abort(self, + object code, + str details='', + tuple trailing_metadata=_IMMUTABLE_EMPTY_METADATA): + future = asyncio.run_coroutine_threadsafe( + self._context.abort(code, details, trailing_metadata), + self._loop) + # Abort should raise an AbortError + future.exception() + + def send_initial_metadata(self, tuple metadata): + future = asyncio.run_coroutine_threadsafe( + self._context.send_initial_metadata(metadata), + self._loop) + future.result() + + def set_trailing_metadata(self, tuple metadata): + self._context.set_trailing_metadata(metadata) + + def invocation_metadata(self): + return self._context.invocation_metadata() + + def set_code(self, object code): + self._context.set_code(code) + + def set_details(self, str details): + self._context.set_details(details) + + def set_compression(self, object compression): + self._context.set_compression(compression) + + def disable_next_message_compression(self): + self._context.disable_next_message_compression() + + def add_callback(self, object callback): + self._callbacks.append(callback) + + async def _run_interceptor(object interceptors, object query_handler, object handler_call_details): interceptor = next(interceptors, None) @@ -222,6 +281,11 @@ async def _run_interceptor(object interceptors, object query_handler, return query_handler(handler_call_details) +def _is_async_handler(object handler): + """Inspect if a method handler is async or sync.""" + return inspect.isawaitable(handler) or inspect.iscoroutinefunction(handler) or inspect.isasyncgenfunction(handler) + + async def _find_method_handler(str method, tuple metadata, list generic_handlers, tuple interceptors): def query_handlers(handler_call_details): @@ -254,11 +318,27 @@ async def _finish_handler_with_unary_response(RPCState rpc_state, stream-unary handlers. """ # Executes application logic - - cdef object response_message = await unary_handler( - request, - servicer_context, - ) + cdef object response_message + cdef _SyncServicerContext sync_servicer_context + + if _is_async_handler(unary_handler): + # Run async method handlers in this coroutine + response_message = await unary_handler( + request, + servicer_context, + ) + else: + # Run sync method handlers in the thread pool + sync_servicer_context = _SyncServicerContext(servicer_context) + response_message = await loop.run_in_executor( + rpc_state.server.thread_pool(), + unary_handler, + request, + sync_servicer_context, + ) + # Support sync-stack callback + for callback in sync_servicer_context._callbacks: + callback() # Raises exception if aborted rpc_state.raise_for_termination() @@ -307,18 +387,31 @@ async def _finish_handler_with_stream_responses(RPCState rpc_state, """ cdef object async_response_generator cdef object response_message + if inspect.iscoroutinefunction(stream_handler): + # Case 1: Coroutine async handler - using reader-writer API # The handler uses reader / writer API, returns None. await stream_handler( request, servicer_context, ) else: - # The handler uses async generator API - async_response_generator = stream_handler( - request, - servicer_context, - ) + if inspect.isasyncgenfunction(stream_handler): + # Case 2: Async handler - async generator + # The handler uses async generator API + async_response_generator = stream_handler( + request, + servicer_context, + ) + else: + # Case 3: Sync handler - normal generator + # NOTE(lidiz) Streaming handler in sync stack is either a generator + # function or a function returns a generator. + sync_servicer_context = _SyncServicerContext(servicer_context) + gen = stream_handler(request, sync_servicer_context) + async_response_generator = generator_to_async_generator(gen, + loop, + rpc_state.server.thread_pool()) # Consumes messages from the generator async for response_message in async_response_generator: @@ -438,6 +531,9 @@ cdef class _MessageReceiver: self._agen = self._async_message_receiver() return self._agen + async def __anext__(self): + return await self.__aiter__().__anext__() + async def _handle_stream_unary_rpc(object method_handler, RPCState rpc_state, @@ -451,13 +547,20 @@ async def _handle_stream_unary_rpc(object method_handler, ) # Prepares the request generator - cdef object request_async_iterator = _MessageReceiver(servicer_context) + cdef object request_iterator + if _is_async_handler(method_handler.stream_unary): + request_iterator = _MessageReceiver(servicer_context) + else: + request_iterator = async_generator_to_generator( + _MessageReceiver(servicer_context), + loop + ) # Finishes the application handler await _finish_handler_with_unary_response( rpc_state, method_handler.stream_unary, - request_async_iterator, + request_iterator, servicer_context, method_handler.response_serializer, loop @@ -476,13 +579,20 @@ async def _handle_stream_stream_rpc(object method_handler, ) # Prepares the request generator - cdef object request_async_iterator = _MessageReceiver(servicer_context) + cdef object request_iterator + if _is_async_handler(method_handler.stream_stream): + request_iterator = _MessageReceiver(servicer_context) + else: + request_iterator = async_generator_to_generator( + _MessageReceiver(servicer_context), + loop + ) # Finishes the application handler await _finish_handler_with_stream_responses( rpc_state, method_handler.stream_stream, - request_async_iterator, + request_iterator, servicer_context, loop, ) @@ -591,22 +701,22 @@ async def _handle_rpc(list generic_handlers, tuple interceptors, # Handles unary-unary case if not method_handler.request_streaming and not method_handler.response_streaming: await _handle_unary_unary_rpc(method_handler, - rpc_state, - loop) + rpc_state, + loop) return # Handles unary-stream case if not method_handler.request_streaming and method_handler.response_streaming: await _handle_unary_stream_rpc(method_handler, - rpc_state, - loop) + rpc_state, + loop) return # Handles stream-unary case if method_handler.request_streaming and not method_handler.response_streaming: await _handle_stream_unary_rpc(method_handler, - rpc_state, - loop) + rpc_state, + loop) return # Handles stream-stream case @@ -648,7 +758,6 @@ cdef class AioServer: self._generic_handlers = [] self.add_generic_rpc_handlers(generic_handlers) self._serving_task = None - self._ongoing_rpc_tasks = set() self._shutdown_lock = asyncio.Lock(loop=self._loop) self._shutdown_completed = self._loop.create_future() @@ -658,17 +767,18 @@ cdef class AioServer: SERVER_SHUTDOWN_FAILURE_HANDLER) self._crash_exception = None - self._interceptors = () if interceptors: self._interceptors = interceptors + else: + self._interceptors = () + + self._thread_pool = thread_pool + if maximum_concurrent_rpcs: raise NotImplementedError() - if thread_pool: - raise NotImplementedError() - def add_generic_rpc_handlers(self, generic_rpc_handlers): - for h in generic_rpc_handlers: - self._generic_handlers.append(h) + def add_generic_rpc_handlers(self, object generic_rpc_handlers): + self._generic_handlers.extend(generic_rpc_handlers) def add_insecure_port(self, address): return self._server.add_http2_port(address) @@ -846,3 +956,10 @@ cdef class AioServer: self._status ) shutdown_grpc_aio() + + cdef thread_pool(self): + """Access the thread pool instance.""" + if self._thread_pool: + return self._thread_pool + else: + raise UsageError('Please provide an Executor upon server creation.') diff --git a/src/python/grpcio_tests/tests_aio/unit/_test_server.py b/src/python/grpcio_tests/tests_aio/unit/_test_server.py index 2396608e5cc..5e5081a38d0 100644 --- a/src/python/grpcio_tests/tests_aio/unit/_test_server.py +++ b/src/python/grpcio_tests/tests_aio/unit/_test_server.py @@ -47,7 +47,7 @@ async def _maybe_echo_status(request: messages_pb2.SimpleRequest, request.response_status.message) -class _TestServiceServicer(test_pb2_grpc.TestServiceServicer): +class TestServiceServicer(test_pb2_grpc.TestServiceServicer): async def UnaryCall(self, request, context): await _maybe_echo_metadata(context) @@ -102,7 +102,7 @@ class _TestServiceServicer(test_pb2_grpc.TestServiceServicer): response_parameters.size)) -def _create_extra_generic_handler(servicer: _TestServiceServicer): +def _create_extra_generic_handler(servicer: TestServiceServicer): # Add programatically extra methods not provided by the proto file # that are used during the tests rpc_method_handlers = { @@ -123,7 +123,7 @@ async def start_test_server(port=0, interceptors=None): server = aio.server(options=(('grpc.so_reuseport', 0),), interceptors=interceptors) - servicer = _TestServiceServicer() + servicer = TestServiceServicer() test_pb2_grpc.add_TestServiceServicer_to_server(servicer, server) server.add_generic_rpc_handlers((_create_extra_generic_handler(servicer),)) diff --git a/src/python/grpcio_tests/tests_aio/unit/compatibility_test.py b/src/python/grpcio_tests/tests_aio/unit/compatibility_test.py index e3d85e70e69..fac39c427ec 100644 --- a/src/python/grpcio_tests/tests_aio/unit/compatibility_test.py +++ b/src/python/grpcio_tests/tests_aio/unit/compatibility_test.py @@ -20,32 +20,63 @@ import random import threading import unittest from concurrent.futures import ThreadPoolExecutor -from typing import Callable, Sequence, Tuple +from typing import Callable, Iterable, Sequence, Tuple import grpc from grpc.experimental import aio from src.proto.grpc.testing import messages_pb2, test_pb2_grpc from tests.unit.framework.common import test_constants +from tests_aio.unit import _common from tests_aio.unit._test_base import AioTestBase -from tests_aio.unit._test_server import start_test_server +from tests_aio.unit._test_server import TestServiceServicer, start_test_server _NUM_STREAM_RESPONSES = 5 _REQUEST_PAYLOAD_SIZE = 7 _RESPONSE_PAYLOAD_SIZE = 42 +_REQUEST = b'\x03\x07' +_ADHOC_METHOD = '/test/AdHoc' def _unique_options() -> Sequence[Tuple[str, float]]: return (('iv', random.random()),) +class _AdhocGenericHandler(grpc.GenericRpcHandler): + _handler: grpc.RpcMethodHandler + + def __init__(self): + self._handler = None + + def set_adhoc_handler(self, handler: grpc.RpcMethodHandler): + self._handler = handler + + def service(self, handler_call_details: grpc.HandlerCallDetails): + if handler_call_details.method == _ADHOC_METHOD: + return self._handler + else: + return None + + @unittest.skipIf( - os.environ.get('GRPC_ASYNCIO_ENGINE', '').lower() != 'poller', + os.environ.get('GRPC_ASYNCIO_ENGINE', '').lower() == 'custom_io_manager', 'Compatible mode needs POLLER completion queue.') class TestCompatibility(AioTestBase): async def setUp(self): - address, self._async_server = await start_test_server() + self._async_server = aio.server( + options=(('grpc.so_reuseport', 0),), + migration_thread_pool=ThreadPoolExecutor()) + + test_pb2_grpc.add_TestServiceServicer_to_server(TestServiceServicer(), + self._async_server) + self._adhoc_handlers = _AdhocGenericHandler() + self._async_server.add_generic_rpc_handlers((self._adhoc_handlers,)) + + port = self._async_server.add_insecure_port('[::]:0') + address = 'localhost:%d' % port + await self._async_server.start() + # Create async stub self._async_channel = aio.insecure_channel(address, options=_unique_options()) @@ -202,6 +233,146 @@ class TestCompatibility(AioTestBase): await self._run_in_another_thread(sync_work) await server.stop(None) + async def test_sync_unary_unary_success(self): + + @grpc.unary_unary_rpc_method_handler + def echo_unary_unary(request: bytes, unused_context): + return request + + self._adhoc_handlers.set_adhoc_handler(echo_unary_unary) + response = await self._async_channel.unary_unary(_ADHOC_METHOD)(_REQUEST + ) + self.assertEqual(_REQUEST, response) + + async def test_sync_unary_unary_metadata(self): + metadata = (('unique', 'key-42'),) + + @grpc.unary_unary_rpc_method_handler + def metadata_unary_unary(request: bytes, context: grpc.ServicerContext): + context.send_initial_metadata(metadata) + return request + + self._adhoc_handlers.set_adhoc_handler(metadata_unary_unary) + call = self._async_channel.unary_unary(_ADHOC_METHOD)(_REQUEST) + self.assertTrue( + _common.seen_metadata(metadata, await call.initial_metadata())) + + async def test_sync_unary_unary_abort(self): + + @grpc.unary_unary_rpc_method_handler + def abort_unary_unary(request: bytes, context: grpc.ServicerContext): + context.abort(grpc.StatusCode.INTERNAL, 'Test') + + self._adhoc_handlers.set_adhoc_handler(abort_unary_unary) + with self.assertRaises(aio.AioRpcError) as exception_context: + await self._async_channel.unary_unary(_ADHOC_METHOD)(_REQUEST) + self.assertEqual(grpc.StatusCode.INTERNAL, + exception_context.exception.code()) + + async def test_sync_unary_unary_set_code(self): + + @grpc.unary_unary_rpc_method_handler + def set_code_unary_unary(request: bytes, context: grpc.ServicerContext): + context.set_code(grpc.StatusCode.INTERNAL) + + self._adhoc_handlers.set_adhoc_handler(set_code_unary_unary) + with self.assertRaises(aio.AioRpcError) as exception_context: + await self._async_channel.unary_unary(_ADHOC_METHOD)(_REQUEST) + self.assertEqual(grpc.StatusCode.INTERNAL, + exception_context.exception.code()) + + async def test_sync_unary_stream_success(self): + + @grpc.unary_stream_rpc_method_handler + def echo_unary_stream(request: bytes, unused_context): + for _ in range(_NUM_STREAM_RESPONSES): + yield request + + self._adhoc_handlers.set_adhoc_handler(echo_unary_stream) + call = self._async_channel.unary_stream(_ADHOC_METHOD)(_REQUEST) + async for response in call: + self.assertEqual(_REQUEST, response) + + async def test_sync_unary_stream_error(self): + + @grpc.unary_stream_rpc_method_handler + def error_unary_stream(request: bytes, unused_context): + for _ in range(_NUM_STREAM_RESPONSES): + yield request + raise RuntimeError('Test') + + self._adhoc_handlers.set_adhoc_handler(error_unary_stream) + call = self._async_channel.unary_stream(_ADHOC_METHOD)(_REQUEST) + with self.assertRaises(aio.AioRpcError) as exception_context: + async for response in call: + self.assertEqual(_REQUEST, response) + self.assertEqual(grpc.StatusCode.UNKNOWN, + exception_context.exception.code()) + + async def test_sync_stream_unary_success(self): + + @grpc.stream_unary_rpc_method_handler + def echo_stream_unary(request_iterator: Iterable[bytes], + unused_context): + self.assertEqual(len(list(request_iterator)), _NUM_STREAM_RESPONSES) + return _REQUEST + + self._adhoc_handlers.set_adhoc_handler(echo_stream_unary) + request_iterator = iter([_REQUEST] * _NUM_STREAM_RESPONSES) + response = await self._async_channel.stream_unary(_ADHOC_METHOD)( + request_iterator) + self.assertEqual(_REQUEST, response) + + async def test_sync_stream_unary_error(self): + + @grpc.stream_unary_rpc_method_handler + def echo_stream_unary(request_iterator: Iterable[bytes], + unused_context): + self.assertEqual(len(list(request_iterator)), _NUM_STREAM_RESPONSES) + raise RuntimeError('Test') + + self._adhoc_handlers.set_adhoc_handler(echo_stream_unary) + request_iterator = iter([_REQUEST] * _NUM_STREAM_RESPONSES) + with self.assertRaises(aio.AioRpcError) as exception_context: + response = await self._async_channel.stream_unary(_ADHOC_METHOD)( + request_iterator) + self.assertEqual(grpc.StatusCode.UNKNOWN, + exception_context.exception.code()) + + async def test_sync_stream_stream_success(self): + + @grpc.stream_stream_rpc_method_handler + def echo_stream_stream(request_iterator: Iterable[bytes], + unused_context): + for request in request_iterator: + yield request + + self._adhoc_handlers.set_adhoc_handler(echo_stream_stream) + request_iterator = iter([_REQUEST] * _NUM_STREAM_RESPONSES) + call = self._async_channel.stream_stream(_ADHOC_METHOD)( + request_iterator) + async for response in call: + self.assertEqual(_REQUEST, response) + + async def test_sync_stream_stream_error(self): + + @grpc.stream_stream_rpc_method_handler + def echo_stream_stream(request_iterator: Iterable[bytes], + unused_context): + for request in request_iterator: + yield request + raise RuntimeError('test') + + self._adhoc_handlers.set_adhoc_handler(echo_stream_stream) + request_iterator = iter([_REQUEST] * _NUM_STREAM_RESPONSES) + call = self._async_channel.stream_stream(_ADHOC_METHOD)( + request_iterator) + with self.assertRaises(aio.AioRpcError) as exception_context: + async for response in call: + self.assertEqual(_REQUEST, response) + self.assertEqual(grpc.StatusCode.UNKNOWN, + exception_context.exception.code()) + if __name__ == '__main__': logging.basicConfig(level=logging.DEBUG) From d40c1b84081d28859cd2e9402e8c3ec5b1510dad Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Wed, 29 Apr 2020 11:40:31 -0700 Subject: [PATCH 652/758] Fix the error on mac and win && make pytype happy --- src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi | 3 ++- src/python/grpcio_tests/tests_aio/unit/compatibility_test.py | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi index f015bce5c3b..b92d681aba0 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi @@ -962,4 +962,5 @@ cdef class AioServer: if self._thread_pool: return self._thread_pool else: - raise UsageError('Please provide an Executor upon server creation.') + # Use the event loop's default executor + return None diff --git a/src/python/grpcio_tests/tests_aio/unit/compatibility_test.py b/src/python/grpcio_tests/tests_aio/unit/compatibility_test.py index fac39c427ec..1e6e3598b8b 100644 --- a/src/python/grpcio_tests/tests_aio/unit/compatibility_test.py +++ b/src/python/grpcio_tests/tests_aio/unit/compatibility_test.py @@ -51,7 +51,7 @@ class _AdhocGenericHandler(grpc.GenericRpcHandler): def set_adhoc_handler(self, handler: grpc.RpcMethodHandler): self._handler = handler - def service(self, handler_call_details: grpc.HandlerCallDetails): + def service(self, handler_call_details): if handler_call_details.method == _ADHOC_METHOD: return self._handler else: From 8be1251e2c5e15b0439fcdcc6b00dd2232e43d3c Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Wed, 29 Apr 2020 15:37:15 -0700 Subject: [PATCH 653/758] Remove read/write API && simplify the logic of getting the pool --- .../grpc/_cython/_cygrpc/aio/server.pyx.pxi | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi index b92d681aba0..7ca16e23198 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/server.pyx.pxi @@ -220,18 +220,6 @@ cdef class _SyncServicerContext: self._callbacks = [] self._loop = context._loop - def read(self): - future = asyncio.run_coroutine_threadsafe( - self._context.read(), - self._loop) - return future.result() - - def write(self, object message): - future = asyncio.run_coroutine_threadsafe( - self._context.write(message), - self._loop) - future.result() - def abort(self, object code, str details='', @@ -959,8 +947,4 @@ cdef class AioServer: cdef thread_pool(self): """Access the thread pool instance.""" - if self._thread_pool: - return self._thread_pool - else: - # Use the event loop's default executor - return None + return self._thread_pool From 469631f54965ac972794fd10a55159287298f629 Mon Sep 17 00:00:00 2001 From: Taras Galkovskyi Date: Wed, 29 Apr 2020 22:50:35 +0000 Subject: [PATCH 654/758] run yapf; delete alts unit tests --- .../python/data_transmission/alts_client.py | 4 +- .../python/data_transmission/alts_server.py | 3 +- src/python/grpcio/grpc/__init__.py | 5 +- .../grpc/_cython/_cygrpc/credentials.pyx.pxi | 1 + .../grpcio_tests/tests/interop/server.py | 2 - src/python/grpcio_tests/tests/tests.json | 1 - .../grpcio_tests/tests/unit/BUILD.bazel | 1 - .../tests/unit/_alts_credentials_test.py | 57 ------------------- 8 files changed, 9 insertions(+), 65 deletions(-) delete mode 100644 src/python/grpcio_tests/tests/unit/_alts_credentials_test.py diff --git a/examples/python/data_transmission/alts_client.py b/examples/python/data_transmission/alts_client.py index a2ff05e3646..d196dbd17c2 100644 --- a/examples/python/data_transmission/alts_client.py +++ b/examples/python/data_transmission/alts_client.py @@ -22,9 +22,11 @@ import demo_pb2_grpc SERVER_ADDRESS = "localhost:23333" + def main(): with grpc.secure_channel( - SERVER_ADDRESS, credentials=grpc.alts_channel_credentials()) as channel: + SERVER_ADDRESS, + credentials=grpc.alts_channel_credentials()) as channel: stub = demo_pb2_grpc.GRPCDemoStub(channel) client.simple_method(stub) client.client_streaming_method(stub) diff --git a/examples/python/data_transmission/alts_server.py b/examples/python/data_transmission/alts_server.py index 4f7b84d9ca6..9189405c916 100644 --- a/examples/python/data_transmission/alts_server.py +++ b/examples/python/data_transmission/alts_server.py @@ -27,7 +27,8 @@ SERVER_ADDRESS = 'localhost:23333' def main(): svr = grpc.server(futures.ThreadPoolExecutor()) demo_pb2_grpc.add_GRPCDemoServicer_to_server(server.DemoServer(), svr) - svr.add_secure_port(SERVER_ADDRESS, server_credentials=grpc.alts_server_credentials()) + svr.add_secure_port(SERVER_ADDRESS, + server_credentials=grpc.alts_server_credentials()) print("------------------start Python GRPC server with ALTS encryption") svr.start() svr.wait_for_termination() diff --git a/src/python/grpcio/grpc/__init__.py b/src/python/grpcio/grpc/__init__.py index 717c1734453..258fb5cf52b 100644 --- a/src/python/grpcio/grpc/__init__.py +++ b/src/python/grpcio/grpc/__init__.py @@ -1832,7 +1832,7 @@ def local_server_credentials(local_connect_type=LocalConnectionType.LOCAL_TCP): return ServerCredentials( _cygrpc.server_credentials_local(local_connect_type.value)) - + def alts_channel_credentials(service_accounts=[]): """Creates a ChannelCredentials for use with an ALTS-enabled Channel. @@ -1850,7 +1850,8 @@ def alts_channel_credentials(service_accounts=[]): Returns: A ChannelCredentials for use with an ALTS-enabled Channel """ - return ChannelCredentials(_cygrpc.channel_credentials_alts(service_accounts)) + return ChannelCredentials( + _cygrpc.channel_credentials_alts(service_accounts)) def alts_server_credentials(): diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi index d3d0f758b16..0ff3706d134 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi @@ -357,6 +357,7 @@ cdef class ALTSChannelCredentials(ChannelCredentials): def __cinit__(self, list service_accounts): self.c_options = grpc_alts_credentials_client_options_create() + cdef str account for account in service_accounts: grpc_alts_credentials_client_options_add_target_service_account(self.c_options, account) diff --git a/src/python/grpcio_tests/tests/interop/server.py b/src/python/grpcio_tests/tests/interop/server.py index a72294aeac8..c85adb0b0bb 100644 --- a/src/python/grpcio_tests/tests/interop/server.py +++ b/src/python/grpcio_tests/tests/interop/server.py @@ -54,8 +54,6 @@ def get_server_credentials(use_tls): return grpc.alts_server_credentials() - - def serve(): args = parse_interop_server_arguments() diff --git a/src/python/grpcio_tests/tests/tests.json b/src/python/grpcio_tests/tests/tests.json index 95fc8c77cf0..196e9f08b0a 100644 --- a/src/python/grpcio_tests/tests/tests.json +++ b/src/python/grpcio_tests/tests/tests.json @@ -24,7 +24,6 @@ "testing._time_test.StrictFakeTimeTest", "testing._time_test.StrictRealTimeTest", "unit._abort_test.AbortTest", - "unit._alts_credentials_test.ALTSCredentialsTest", "unit._api_test.AllTest", "unit._api_test.ChannelConnectivityTest", "unit._api_test.ChannelTest", diff --git a/src/python/grpcio_tests/tests/unit/BUILD.bazel b/src/python/grpcio_tests/tests/unit/BUILD.bazel index ec2e93538e2..42b99023463 100644 --- a/src/python/grpcio_tests/tests/unit/BUILD.bazel +++ b/src/python/grpcio_tests/tests/unit/BUILD.bazel @@ -4,7 +4,6 @@ package(default_visibility = ["//visibility:public"]) GRPCIO_TESTS_UNIT = [ "_abort_test.py", - "_alts_credentials_test.py", "_api_test.py", "_auth_context_test.py", "_auth_test.py", diff --git a/src/python/grpcio_tests/tests/unit/_alts_credentials_test.py b/src/python/grpcio_tests/tests/unit/_alts_credentials_test.py deleted file mode 100644 index 07a3c849c8b..00000000000 --- a/src/python/grpcio_tests/tests/unit/_alts_credentials_test.py +++ /dev/null @@ -1,57 +0,0 @@ -# Copyright 2020 The gRPC Authors -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Test of RPCs made using ALTS credentials.""" - -import unittest -import os -from concurrent.futures import ThreadPoolExecutor -import grpc - - -REQUEST = b'abc' - - -class _GenericHandler(grpc.GenericRpcHandler): - - def service(self, handler_call_details): - return grpc.unary_unary_rpc_method_handler( - lambda request, unused_context: request) - - -class ALTSCredentialsTest(unittest.TestCase): - - def _create_server(self): - server = grpc.server(ThreadPoolExecutor()) - server.add_generic_rpc_handlers((_GenericHandler(),)) - return server - - def test_alts(self): - server_addr = 'localhost:{}' - channel_creds = grpc.alts_channel_credentials([]) - server_creds = grpc.alts_server_credentials() - - server = self._create_server() - port = server.add_secure_port(server_addr.format(0), server_creds) - server.start() - with grpc.secure_channel(server_addr.format(port), - channel_creds) as channel: - self.assertEqual( - REQUEST, - channel.unary_unary('/test/method')(REQUEST, - wait_for_ready=True)) - server.stop(None) - - -if __name__ == '__main__': - unittest.main() From fb60bf235e66ce11c72ba27456b2773ef8c5cf49 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Wed, 29 Apr 2020 16:11:55 -0700 Subject: [PATCH 655/758] Synchonize the production and consumption of request messages --- .../grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi index 73b43815a1d..1798bef72f5 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/aio/common.pyx.pxi @@ -142,15 +142,14 @@ async def generator_to_async_generator(object gen, object loop, object thread_po TypeError: StopIteration interacts badly with generators and cannot be raised into a Future """ - queue = asyncio.Queue(loop=loop) + queue = asyncio.Queue(maxsize=1, loop=loop) def yield_to_queue(): try: for item in gen: - # For an infinite sized queue, the put_nowait should always success - loop.call_soon_threadsafe(queue.put_nowait, item) + asyncio.run_coroutine_threadsafe(queue.put(item), loop).result() finally: - loop.call_soon_threadsafe(queue.put_nowait, EOF) + asyncio.run_coroutine_threadsafe(queue.put(EOF), loop).result() future = loop.run_in_executor( thread_pool, @@ -165,4 +164,4 @@ async def generator_to_async_generator(object gen, object loop, object thread_po yield response # Port the exception if there is any - future.result() + await future From d62df731a0db57185d378397a6fe21c63af1bd00 Mon Sep 17 00:00:00 2001 From: Taras Galkovskyi Date: Wed, 29 Apr 2020 23:22:22 +0000 Subject: [PATCH 656/758] pacify pylint on examples folder --- examples/python/data_transmission/client.py | 5 +++++ examples/python/data_transmission/server.py | 1 + 2 files changed, 6 insertions(+) diff --git a/examples/python/data_transmission/client.py b/examples/python/data_transmission/client.py index 262e366665f..cc4a68e3435 100644 --- a/examples/python/data_transmission/client.py +++ b/examples/python/data_transmission/client.py @@ -19,6 +19,11 @@ import grpc import demo_pb2_grpc import demo_pb2 +__all__ = [ + 'simple_method', 'client_streaming_method', 'server_streaming_method', + 'bidirectional_streaming_method' +] + SERVER_ADDRESS = "localhost:23333" CLIENT_ID = 1 diff --git a/examples/python/data_transmission/server.py b/examples/python/data_transmission/server.py index 0a659281261..3c990945ece 100644 --- a/examples/python/data_transmission/server.py +++ b/examples/python/data_transmission/server.py @@ -20,6 +20,7 @@ import grpc import demo_pb2_grpc import demo_pb2 +__all__ = 'DemoServer' SERVER_ADDRESS = 'localhost:23333' SERVER_ID = 1 From bad263d533cb3957b0d5c2066bac18878e8a2cbf Mon Sep 17 00:00:00 2001 From: Alexander Polcyn Date: Wed, 29 Apr 2020 16:04:37 -0700 Subject: [PATCH 657/758] update ruby gem email to grpc-io@googlegroups.com --- grpc.gemspec | 2 +- templates/grpc.gemspec.template | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/grpc.gemspec b/grpc.gemspec index a1f538c1501..77e05b656f5 100644 --- a/grpc.gemspec +++ b/grpc.gemspec @@ -7,7 +7,7 @@ Gem::Specification.new do |s| s.name = 'grpc' s.version = GRPC::VERSION s.authors = ['gRPC Authors'] - s.email = 'temiola@google.com' + s.email = 'grpc-io@googlegroups.com' s.homepage = 'https://github.com/google/grpc/tree/master/src/ruby' s.summary = 'GRPC system in Ruby' s.description = 'Send RPCs from Ruby using GRPC' diff --git a/templates/grpc.gemspec.template b/templates/grpc.gemspec.template index ba6ea179c5c..6a2f812f751 100644 --- a/templates/grpc.gemspec.template +++ b/templates/grpc.gemspec.template @@ -9,7 +9,7 @@ s.name = 'grpc' s.version = GRPC::VERSION s.authors = ['gRPC Authors'] - s.email = 'temiola@google.com' + s.email = 'grpc-io@googlegroups.com' s.homepage = 'https://github.com/google/grpc/tree/master/src/ruby' s.summary = 'GRPC system in Ruby' s.description = 'Send RPCs from Ruby using GRPC' From 121a59ba4d6fc474ab4db14c71bb03c65eee81f8 Mon Sep 17 00:00:00 2001 From: Eric Gribkoff Date: Wed, 29 Apr 2020 20:38:13 -0700 Subject: [PATCH 658/758] Disable strict --fail_on_failed_rpc flag generally --- tools/run_tests/run_xds_tests.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/run_tests/run_xds_tests.py b/tools/run_tests/run_xds_tests.py index ef3b0e91294..9b47b28d1ba 100755 --- a/tools/run_tests/run_xds_tests.py +++ b/tools/run_tests/run_xds_tests.py @@ -226,9 +226,9 @@ _BOOTSTRAP_TEMPLATE = """ # TODO(ericgribkoff) Add change_backend_service to this list once TD no longer # sends an update with no localities when adding the MIG to the backend service # can race with the URL map patch. -_TESTS_TO_FAIL_ON_RPC_FAILURE = [ - 'new_instance_group_receives_traffic', 'ping_pong', 'round_robin' -] +# TODO(ericgribkoff) Add new_instance_group_receives_traffic, ping_pong, and +# round_robin when empty update issue is resolved. +_TESTS_TO_FAIL_ON_RPC_FAILURE = [] _TESTS_USING_SECONDARY_IG = [ 'secondary_locality_gets_no_requests_on_partial_primary_failure', 'secondary_locality_gets_requests_on_primary_failure' From 791729d09ffb227d739fdb17c89502fc14b5870a Mon Sep 17 00:00:00 2001 From: "Nicolas \"Pixel\" Noble" Date: Thu, 30 Apr 2020 08:12:29 +0200 Subject: [PATCH 659/758] Bumping version. --- BUILD | 4 ++-- CMakeLists.txt | 6 +++--- Makefile | 4 ++-- build_handwritten.yaml | 4 ++-- doc/g_stands_for.md | 3 ++- gRPC-C++.podspec | 2 +- gRPC-Core.podspec | 2 +- gRPC-ProtoRPC.podspec | 2 +- gRPC-RxLibrary.podspec | 2 +- gRPC.podspec | 2 +- package.xml | 6 +++--- src/core/lib/surface/version.cc | 2 +- src/cpp/common/version_cc.cc | 2 +- src/csharp/Grpc.Core.Api/VersionInfo.cs | 4 ++-- src/csharp/build/dependencies.props | 2 +- src/csharp/build_unitypackage.bat | 2 +- src/objective-c/!ProtoCompiler-gRPCCppPlugin.podspec | 2 +- src/objective-c/!ProtoCompiler-gRPCPlugin.podspec | 2 +- src/objective-c/GRPCClient/version.h | 2 +- src/objective-c/tests/version.h | 2 +- src/php/composer.json | 2 +- src/php/ext/grpc/version.h | 2 +- src/python/grpcio/grpc/_grpcio_metadata.py | 2 +- src/python/grpcio/grpc_version.py | 2 +- src/python/grpcio_channelz/grpc_version.py | 2 +- src/python/grpcio_health_checking/grpc_version.py | 2 +- src/python/grpcio_reflection/grpc_version.py | 2 +- src/python/grpcio_status/grpc_version.py | 2 +- src/python/grpcio_testing/grpc_version.py | 2 +- src/python/grpcio_tests/grpc_version.py | 2 +- src/ruby/lib/grpc/version.rb | 2 +- src/ruby/tools/version.rb | 2 +- tools/distrib/python/grpcio_tools/grpc_version.py | 2 +- tools/doxygen/Doxyfile.c++ | 2 +- tools/doxygen/Doxyfile.c++.internal | 2 +- tools/doxygen/Doxyfile.objc | 2 +- tools/doxygen/Doxyfile.objc.internal | 2 +- 37 files changed, 46 insertions(+), 45 deletions(-) diff --git a/BUILD b/BUILD index edc09c315ff..0eb776e785b 100644 --- a/BUILD +++ b/BUILD @@ -75,11 +75,11 @@ config_setting( python_config_settings() # This should be updated along with build.yaml -g_stands_for = "gringotts" +g_stands_for = "gradius" core_version = "10.0.0" -version = "1.29.0-dev" +version = "1.30.0-dev" GPR_PUBLIC_HDRS = [ "include/grpc/support/alloc.h", diff --git a/CMakeLists.txt b/CMakeLists.txt index 32f328341d7..7f18b7f77f5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -25,12 +25,12 @@ cmake_minimum_required(VERSION 3.5.1) set(PACKAGE_NAME "grpc") -set(PACKAGE_VERSION "1.29.0-dev") +set(PACKAGE_VERSION "1.30.0-dev") set(gRPC_CORE_VERSION "10.0.0") set(gRPC_CORE_SOVERSION "10") -set(gRPC_CPP_VERSION "1.29.0-dev") +set(gRPC_CPP_VERSION "1.30.0-dev") set(gRPC_CPP_SOVERSION "1") -set(gRPC_CSHARP_VERSION "2.29.0-dev") +set(gRPC_CSHARP_VERSION "2.30.0-dev") set(gRPC_CSHARP_SOVERSION "2") set(PACKAGE_STRING "${PACKAGE_NAME} ${PACKAGE_VERSION}") set(PACKAGE_TARNAME "${PACKAGE_NAME}-${PACKAGE_VERSION}") diff --git a/Makefile b/Makefile index bbd8ae81ff6..436b140b975 100644 --- a/Makefile +++ b/Makefile @@ -470,8 +470,8 @@ Q = @ endif CORE_VERSION = 10.0.0 -CPP_VERSION = 1.29.0-dev -CSHARP_VERSION = 2.29.0-dev +CPP_VERSION = 1.30.0-dev +CSHARP_VERSION = 2.30.0-dev CPPFLAGS_NO_ARCH += $(addprefix -I, $(INCLUDES)) $(addprefix -D, $(DEFINES)) CPPFLAGS += $(CPPFLAGS_NO_ARCH) $(ARCH_FLAGS) diff --git a/build_handwritten.yaml b/build_handwritten.yaml index 0b572a91ee0..eaf209d1db1 100644 --- a/build_handwritten.yaml +++ b/build_handwritten.yaml @@ -14,8 +14,8 @@ settings: '#10': See the expand_version.py for all the quirks here core_version: 10.0.0 csharp_major_version: 2 - g_stands_for: gringotts - version: 1.29.0-dev + g_stands_for: gradius + version: 1.30.0-dev targets: - name: check_epollexclusive build: tool diff --git a/doc/g_stands_for.md b/doc/g_stands_for.md index 382ccbf56f8..0ae28e66f57 100644 --- a/doc/g_stands_for.md +++ b/doc/g_stands_for.md @@ -28,4 +28,5 @@ - 1.26 'g' stands for ['gon'](https://github.com/grpc/grpc/tree/v1.26.x) - 1.27 'g' stands for ['guantao'](https://github.com/grpc/grpc/tree/v1.27.x) - 1.28 'g' stands for ['galactic'](https://github.com/grpc/grpc/tree/v1.28.x) -- 1.29 'g' stands for ['gringotts'](https://github.com/grpc/grpc/tree/master) +- 1.29 'g' stands for ['gringotts'](https://github.com/grpc/grpc/tree/v1.29.x) +- 1.30 'g' stands for ['gradius'](https://github.com/grpc/grpc/tree/master) diff --git a/gRPC-C++.podspec b/gRPC-C++.podspec index a3c35cbc912..95ba2391077 100644 --- a/gRPC-C++.podspec +++ b/gRPC-C++.podspec @@ -22,7 +22,7 @@ Pod::Spec.new do |s| s.name = 'gRPC-C++' # TODO (mxyan): use version that match gRPC version when pod is stabilized - version = '1.29.0-dev' + version = '1.30.0-dev' s.version = version s.summary = 'gRPC C++ library' s.homepage = 'https://grpc.io' diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec index 8bf16911cc6..15b284a2675 100644 --- a/gRPC-Core.podspec +++ b/gRPC-Core.podspec @@ -21,7 +21,7 @@ Pod::Spec.new do |s| s.name = 'gRPC-Core' - version = '1.29.0-dev' + version = '1.30.0-dev' s.version = version s.summary = 'Core cross-platform gRPC library, written in C' s.homepage = 'https://grpc.io' diff --git a/gRPC-ProtoRPC.podspec b/gRPC-ProtoRPC.podspec index 14389f87089..ff1576d71e8 100644 --- a/gRPC-ProtoRPC.podspec +++ b/gRPC-ProtoRPC.podspec @@ -21,7 +21,7 @@ Pod::Spec.new do |s| s.name = 'gRPC-ProtoRPC' - version = '1.29.0-dev' + version = '1.30.0-dev' s.version = version s.summary = 'RPC library for Protocol Buffers, based on gRPC' s.homepage = 'https://grpc.io' diff --git a/gRPC-RxLibrary.podspec b/gRPC-RxLibrary.podspec index 4f061d9bbc2..551909e8c89 100644 --- a/gRPC-RxLibrary.podspec +++ b/gRPC-RxLibrary.podspec @@ -21,7 +21,7 @@ Pod::Spec.new do |s| s.name = 'gRPC-RxLibrary' - version = '1.29.0-dev' + version = '1.30.0-dev' s.version = version s.summary = 'Reactive Extensions library for iOS/OSX.' s.homepage = 'https://grpc.io' diff --git a/gRPC.podspec b/gRPC.podspec index 53a715e6072..194ddcd9f0c 100644 --- a/gRPC.podspec +++ b/gRPC.podspec @@ -20,7 +20,7 @@ Pod::Spec.new do |s| s.name = 'gRPC' - version = '1.29.0-dev' + version = '1.30.0-dev' s.version = version s.summary = 'gRPC client library for iOS/OSX' s.homepage = 'https://grpc.io' diff --git a/package.xml b/package.xml index 42f91a37b8c..6ce43b0d564 100644 --- a/package.xml +++ b/package.xml @@ -13,8 +13,8 @@ 2019-09-24 - 1.29.0dev - 1.29.0dev + 1.30.0dev + 1.30.0dev beta @@ -22,7 +22,7 @@ Apache 2.0 -- gRPC Core 1.29.0 update +- gRPC Core 1.30.0 update diff --git a/src/core/lib/surface/version.cc b/src/core/lib/surface/version.cc index b16e8ddedf2..207fbfe6ca5 100644 --- a/src/core/lib/surface/version.cc +++ b/src/core/lib/surface/version.cc @@ -25,4 +25,4 @@ const char* grpc_version_string(void) { return "10.0.0"; } -const char* grpc_g_stands_for(void) { return "gringotts"; } +const char* grpc_g_stands_for(void) { return "gradius"; } diff --git a/src/cpp/common/version_cc.cc b/src/cpp/common/version_cc.cc index 208fcd06113..cefbd9e6556 100644 --- a/src/cpp/common/version_cc.cc +++ b/src/cpp/common/version_cc.cc @@ -22,5 +22,5 @@ #include namespace grpc { -grpc::string Version() { return "1.29.0-dev"; } +grpc::string Version() { return "1.30.0-dev"; } } // namespace grpc diff --git a/src/csharp/Grpc.Core.Api/VersionInfo.cs b/src/csharp/Grpc.Core.Api/VersionInfo.cs index 7a61bc7f21e..bd4f3e1926e 100644 --- a/src/csharp/Grpc.Core.Api/VersionInfo.cs +++ b/src/csharp/Grpc.Core.Api/VersionInfo.cs @@ -33,11 +33,11 @@ namespace Grpc.Core /// /// Current AssemblyFileVersion of gRPC C# assemblies /// - public const string CurrentAssemblyFileVersion = "2.29.0.0"; + public const string CurrentAssemblyFileVersion = "2.30.0.0"; /// /// Current version of gRPC C# /// - public const string CurrentVersion = "2.29.0-dev"; + public const string CurrentVersion = "2.30.0-dev"; } } diff --git a/src/csharp/build/dependencies.props b/src/csharp/build/dependencies.props index 355cfcf7b40..9e85adf72f5 100644 --- a/src/csharp/build/dependencies.props +++ b/src/csharp/build/dependencies.props @@ -1,7 +1,7 @@ - 2.29.0-dev + 2.30.0-dev 3.11.4 diff --git a/src/csharp/build_unitypackage.bat b/src/csharp/build_unitypackage.bat index 4129a00bdb9..72e8fcc5cd9 100644 --- a/src/csharp/build_unitypackage.bat +++ b/src/csharp/build_unitypackage.bat @@ -13,7 +13,7 @@ @rem limitations under the License. @rem Current package versions -set VERSION=2.29.0-dev +set VERSION=2.30.0-dev @rem Adjust the location of nuget.exe set NUGET=C:\nuget\nuget.exe diff --git a/src/objective-c/!ProtoCompiler-gRPCCppPlugin.podspec b/src/objective-c/!ProtoCompiler-gRPCCppPlugin.podspec index 1385b2b396c..ca1490bcc0a 100644 --- a/src/objective-c/!ProtoCompiler-gRPCCppPlugin.podspec +++ b/src/objective-c/!ProtoCompiler-gRPCCppPlugin.podspec @@ -42,7 +42,7 @@ Pod::Spec.new do |s| # exclamation mark ensures that other "regular" pods will be able to find it as it'll be installed # before them. s.name = '!ProtoCompiler-gRPCCppPlugin' - v = '1.29.0-dev' + v = '1.30.0-dev' s.version = v s.summary = 'The gRPC ProtoC plugin generates C++ files from .proto services.' s.description = <<-DESC diff --git a/src/objective-c/!ProtoCompiler-gRPCPlugin.podspec b/src/objective-c/!ProtoCompiler-gRPCPlugin.podspec index 9ab5bba68e3..e48d3de8828 100644 --- a/src/objective-c/!ProtoCompiler-gRPCPlugin.podspec +++ b/src/objective-c/!ProtoCompiler-gRPCPlugin.podspec @@ -42,7 +42,7 @@ Pod::Spec.new do |s| # exclamation mark ensures that other "regular" pods will be able to find it as it'll be installed # before them. s.name = '!ProtoCompiler-gRPCPlugin' - v = '1.29.0-dev' + v = '1.30.0-dev' s.version = v s.summary = 'The gRPC ProtoC plugin generates Objective-C files from .proto services.' s.description = <<-DESC diff --git a/src/objective-c/GRPCClient/version.h b/src/objective-c/GRPCClient/version.h index 43c7a0bcdeb..8b399a26ca9 100644 --- a/src/objective-c/GRPCClient/version.h +++ b/src/objective-c/GRPCClient/version.h @@ -22,4 +22,4 @@ // instead. This file can be regenerated from the template by running // `tools/buildgen/generate_projects.sh`. -#define GRPC_OBJC_VERSION_STRING @"1.29.0-dev" +#define GRPC_OBJC_VERSION_STRING @"1.30.0-dev" diff --git a/src/objective-c/tests/version.h b/src/objective-c/tests/version.h index 64d3191a7d4..78714dd7968 100644 --- a/src/objective-c/tests/version.h +++ b/src/objective-c/tests/version.h @@ -22,5 +22,5 @@ // instead. This file can be regenerated from the template by running // `tools/buildgen/generate_projects.sh`. -#define GRPC_OBJC_VERSION_STRING @"1.29.0-dev" +#define GRPC_OBJC_VERSION_STRING @"1.30.0-dev" #define GRPC_C_VERSION_STRING @"10.0.0" diff --git a/src/php/composer.json b/src/php/composer.json index 24ed00401b9..41a7d9ad093 100644 --- a/src/php/composer.json +++ b/src/php/composer.json @@ -2,7 +2,7 @@ "name": "grpc/grpc-dev", "description": "gRPC library for PHP - for Development use only", "license": "Apache-2.0", - "version": "1.29.0", + "version": "1.30.0", "require": { "php": ">=5.5.0", "google/protobuf": "^v3.3.0" diff --git a/src/php/ext/grpc/version.h b/src/php/ext/grpc/version.h index 817ec68c1f2..6e60f2cdb27 100644 --- a/src/php/ext/grpc/version.h +++ b/src/php/ext/grpc/version.h @@ -20,6 +20,6 @@ #ifndef VERSION_H #define VERSION_H -#define PHP_GRPC_VERSION "1.29.0dev" +#define PHP_GRPC_VERSION "1.30.0dev" #endif /* VERSION_H */ diff --git a/src/python/grpcio/grpc/_grpcio_metadata.py b/src/python/grpcio/grpc/_grpcio_metadata.py index b6c1f3b1ccd..a483c9fbd65 100644 --- a/src/python/grpcio/grpc/_grpcio_metadata.py +++ b/src/python/grpcio/grpc/_grpcio_metadata.py @@ -14,4 +14,4 @@ # AUTO-GENERATED FROM `$REPO_ROOT/templates/src/python/grpcio/grpc/_grpcio_metadata.py.template`!!! -__version__ = """1.29.0.dev0""" +__version__ = """1.30.0.dev0""" diff --git a/src/python/grpcio/grpc_version.py b/src/python/grpcio/grpc_version.py index 4a2da07dce9..f03b1b74439 100644 --- a/src/python/grpcio/grpc_version.py +++ b/src/python/grpcio/grpc_version.py @@ -14,4 +14,4 @@ # AUTO-GENERATED FROM `$REPO_ROOT/templates/src/python/grpcio/grpc_version.py.template`!!! -VERSION = '1.29.0.dev0' +VERSION = '1.30.0.dev0' diff --git a/src/python/grpcio_channelz/grpc_version.py b/src/python/grpcio_channelz/grpc_version.py index 41f84117965..bb30eefa837 100644 --- a/src/python/grpcio_channelz/grpc_version.py +++ b/src/python/grpcio_channelz/grpc_version.py @@ -14,4 +14,4 @@ # AUTO-GENERATED FROM `$REPO_ROOT/templates/src/python/grpcio_channelz/grpc_version.py.template`!!! -VERSION = '1.29.0.dev0' +VERSION = '1.30.0.dev0' diff --git a/src/python/grpcio_health_checking/grpc_version.py b/src/python/grpcio_health_checking/grpc_version.py index 33b5ed79c86..b4c9f7652da 100644 --- a/src/python/grpcio_health_checking/grpc_version.py +++ b/src/python/grpcio_health_checking/grpc_version.py @@ -14,4 +14,4 @@ # AUTO-GENERATED FROM `$REPO_ROOT/templates/src/python/grpcio_health_checking/grpc_version.py.template`!!! -VERSION = '1.29.0.dev0' +VERSION = '1.30.0.dev0' diff --git a/src/python/grpcio_reflection/grpc_version.py b/src/python/grpcio_reflection/grpc_version.py index 09dc3617bbd..f370320520a 100644 --- a/src/python/grpcio_reflection/grpc_version.py +++ b/src/python/grpcio_reflection/grpc_version.py @@ -14,4 +14,4 @@ # AUTO-GENERATED FROM `$REPO_ROOT/templates/src/python/grpcio_reflection/grpc_version.py.template`!!! -VERSION = '1.29.0.dev0' +VERSION = '1.30.0.dev0' diff --git a/src/python/grpcio_status/grpc_version.py b/src/python/grpcio_status/grpc_version.py index 3d4010d2f9c..7956a946b7b 100644 --- a/src/python/grpcio_status/grpc_version.py +++ b/src/python/grpcio_status/grpc_version.py @@ -14,4 +14,4 @@ # AUTO-GENERATED FROM `$REPO_ROOT/templates/src/python/grpcio_status/grpc_version.py.template`!!! -VERSION = '1.29.0.dev0' +VERSION = '1.30.0.dev0' diff --git a/src/python/grpcio_testing/grpc_version.py b/src/python/grpcio_testing/grpc_version.py index ee6e1b52605..54753d30de8 100644 --- a/src/python/grpcio_testing/grpc_version.py +++ b/src/python/grpcio_testing/grpc_version.py @@ -14,4 +14,4 @@ # AUTO-GENERATED FROM `$REPO_ROOT/templates/src/python/grpcio_testing/grpc_version.py.template`!!! -VERSION = '1.29.0.dev0' +VERSION = '1.30.0.dev0' diff --git a/src/python/grpcio_tests/grpc_version.py b/src/python/grpcio_tests/grpc_version.py index efa361e32f3..d532daac8ce 100644 --- a/src/python/grpcio_tests/grpc_version.py +++ b/src/python/grpcio_tests/grpc_version.py @@ -14,4 +14,4 @@ # AUTO-GENERATED FROM `$REPO_ROOT/templates/src/python/grpcio_tests/grpc_version.py.template`!!! -VERSION = '1.29.0.dev0' +VERSION = '1.30.0.dev0' diff --git a/src/ruby/lib/grpc/version.rb b/src/ruby/lib/grpc/version.rb index f9e332f9eaa..40d0994cb33 100644 --- a/src/ruby/lib/grpc/version.rb +++ b/src/ruby/lib/grpc/version.rb @@ -14,5 +14,5 @@ # GRPC contains the General RPC module. module GRPC - VERSION = '1.29.0.dev' + VERSION = '1.30.0.dev' end diff --git a/src/ruby/tools/version.rb b/src/ruby/tools/version.rb index d43814ef8a6..561468ca85b 100644 --- a/src/ruby/tools/version.rb +++ b/src/ruby/tools/version.rb @@ -14,6 +14,6 @@ module GRPC module Tools - VERSION = '1.29.0.dev' + VERSION = '1.30.0.dev' end end diff --git a/tools/distrib/python/grpcio_tools/grpc_version.py b/tools/distrib/python/grpcio_tools/grpc_version.py index b561bb5ba1c..5cf5d94839c 100644 --- a/tools/distrib/python/grpcio_tools/grpc_version.py +++ b/tools/distrib/python/grpcio_tools/grpc_version.py @@ -14,4 +14,4 @@ # AUTO-GENERATED FROM `$REPO_ROOT/templates/tools/distrib/python/grpcio_tools/grpc_version.py.template`!!! -VERSION = '1.29.0.dev0' +VERSION = '1.30.0.dev0' diff --git a/tools/doxygen/Doxyfile.c++ b/tools/doxygen/Doxyfile.c++ index 412d506e53e..46959747465 100644 --- a/tools/doxygen/Doxyfile.c++ +++ b/tools/doxygen/Doxyfile.c++ @@ -40,7 +40,7 @@ PROJECT_NAME = "GRPC C++" # could be handy for archiving the generated documentation or if some version # control system is used. -PROJECT_NUMBER = 1.29.0-dev +PROJECT_NUMBER = 1.30.0-dev # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a diff --git a/tools/doxygen/Doxyfile.c++.internal b/tools/doxygen/Doxyfile.c++.internal index 94b242dbeb6..1761430d9e4 100644 --- a/tools/doxygen/Doxyfile.c++.internal +++ b/tools/doxygen/Doxyfile.c++.internal @@ -40,7 +40,7 @@ PROJECT_NAME = "GRPC C++" # could be handy for archiving the generated documentation or if some version # control system is used. -PROJECT_NUMBER = 1.29.0-dev +PROJECT_NUMBER = 1.30.0-dev # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a diff --git a/tools/doxygen/Doxyfile.objc b/tools/doxygen/Doxyfile.objc index e23315f40cb..bb1645f8305 100644 --- a/tools/doxygen/Doxyfile.objc +++ b/tools/doxygen/Doxyfile.objc @@ -40,7 +40,7 @@ PROJECT_NAME = "GRPC Objective-C" # could be handy for archiving the generated documentation or if some version # control system is used. -PROJECT_NUMBER = 1.29.0-dev +PROJECT_NUMBER = 1.30.0-dev # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a diff --git a/tools/doxygen/Doxyfile.objc.internal b/tools/doxygen/Doxyfile.objc.internal index 80dd661e4cd..a78d5b6d86c 100644 --- a/tools/doxygen/Doxyfile.objc.internal +++ b/tools/doxygen/Doxyfile.objc.internal @@ -40,7 +40,7 @@ PROJECT_NAME = "GRPC Objective-C" # could be handy for archiving the generated documentation or if some version # control system is used. -PROJECT_NUMBER = 1.29.0-dev +PROJECT_NUMBER = 1.30.0-dev # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a From 1e9dc62db8ade88b0537eb857e0dd63d8a210b4f Mon Sep 17 00:00:00 2001 From: "Mark D. Roth" Date: Thu, 30 Apr 2020 07:34:50 -0700 Subject: [PATCH 660/758] weighted_target: Create all children before updating any of them. --- .../weighted_target/weighted_target.cc | 20 ++++++++++++++----- test/cpp/end2end/xds_end2end_test.cc | 16 +++++++++++++++ 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc b/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc index a0b0fef04a3..acbbcf0f957 100644 --- a/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +++ b/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc @@ -278,19 +278,29 @@ void WeightedTargetLb::UpdateLocked(UpdateArgs args) { child->DeactivateLocked(); } } - // Add or update the targets in the new config. - HierarchicalAddressMap address_map = - MakeHierarchicalAddressMap(args.addresses); + // Create any children that don't already exist. + // Note that we add all children before updating any of them, because + // an update may trigger a child to immediately update its + // connectivity state (e.g., reporting TRANSIENT_FAILURE immediately when + // receiving an empty address list), and we don't want to return an + // overall state with incomplete data. for (const auto& p : config_->target_map()) { const std::string& name = p.first; - const WeightedTargetLbConfig::ChildConfig& config = p.second; auto it = targets_.find(name); if (it == targets_.end()) { it = targets_.emplace(std::make_pair(name, nullptr)).first; it->second = MakeOrphanable( Ref(DEBUG_LOCATION, "WeightedChild"), it->first); } - it->second->UpdateLocked(config, std::move(address_map[name]), args.args); + } + // Update all children. + HierarchicalAddressMap address_map = + MakeHierarchicalAddressMap(args.addresses); + for (const auto& p : config_->target_map()) { + const std::string& name = p.first; + const WeightedTargetLbConfig::ChildConfig& config = p.second; + targets_[name]->UpdateLocked(config, std::move(address_map[name]), + args.args); } } diff --git a/test/cpp/end2end/xds_end2end_test.cc b/test/cpp/end2end/xds_end2end_test.cc index f993bb88e78..0b4d671fa84 100644 --- a/test/cpp/end2end/xds_end2end_test.cc +++ b/test/cpp/end2end/xds_end2end_test.cc @@ -3196,6 +3196,22 @@ TEST_P(FailoverTest, DoesNotUsePriorityWithNoEndpoints) { } } +// Does not choose locality with no endpoints. +TEST_P(FailoverTest, DoesNotUseLocalityWithNoEndpoints) { + SetNextResolution({}); + SetNextResolutionForLbChannelAllBalancers(); + AdsServiceImpl::EdsResourceArgs args({ + {"locality0", {}, kDefaultLocalityWeight, 0}, + {"locality1", GetBackendPorts(), kDefaultLocalityWeight, 0}, + }); + balancers_[0]->ads_service()->SetEdsResource( + AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); + // Wait for all backends to be used. + std::tuple counts = WaitForAllBackends(); + // Make sure no RPCs failed in the transition. + EXPECT_EQ(0, std::get<1>(counts)); +} + // If the higher priority localities are not reachable, failover to the highest // priority among the rest. TEST_P(FailoverTest, Failover) { From 0324afa89eaff68c6103ed725e50fdf468f8ced1 Mon Sep 17 00:00:00 2001 From: "Mark D. Roth" Date: Thu, 30 Apr 2020 10:09:03 -0700 Subject: [PATCH 661/758] grpclb: Add test showing that backend status is returned to client. --- test/cpp/end2end/grpclb_end2end_test.cc | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/test/cpp/end2end/grpclb_end2end_test.cc b/test/cpp/end2end/grpclb_end2end_test.cc index 3d5b6f8cc2c..2e3b4e9ca78 100644 --- a/test/cpp/end2end/grpclb_end2end_test.cc +++ b/test/cpp/end2end/grpclb_end2end_test.cc @@ -618,11 +618,17 @@ class GrpclbEnd2endTest : public ::testing::Test { } Status SendRpc(EchoResponse* response = nullptr, int timeout_ms = 1000, - bool wait_for_ready = false) { + bool wait_for_ready = false, + const Status& expected_status = Status::OK) { const bool local_response = (response == nullptr); if (local_response) response = new EchoResponse; EchoRequest request; request.set_message(kRequestMessage_); + if (!expected_status.ok()) { + auto* error = request.mutable_param()->mutable_expected_error(); + error->set_code(expected_status.error_code()); + error->set_error_message(expected_status.error_message()); + } ClientContext context; context.set_deadline(grpc_timeout_milliseconds_to_deadline(timeout_ms)); if (wait_for_ready) context.set_wait_for_ready(true); @@ -751,6 +757,22 @@ TEST_F(SingleBalancerTest, Vanilla) { EXPECT_EQ("grpclb", channel_->GetLoadBalancingPolicyName()); } +TEST_F(SingleBalancerTest, ReturnServerStatus) { + SetNextResolutionAllBalancers(); + ScheduleResponseForBalancer( + 0, BalancerServiceImpl::BuildResponseForBackends(GetBackendPorts(), {}), + 0); + // We need to wait for all backends to come online. + WaitForAllBackends(); + // Send a request that the backend will fail, and make sure we get + // back the right status. + Status expected(StatusCode::INVALID_ARGUMENT, "He's dead, Jim!"); + Status actual = SendRpc(/*response=*/nullptr, /*timeout_ms=*/1000, + /*wait_for_ready=*/false, expected); + EXPECT_EQ(actual.error_code(), expected.error_code()); + EXPECT_EQ(actual.error_message(), expected.error_message()); +} + TEST_F(SingleBalancerTest, SelectGrpclbWithMigrationServiceConfig) { SetNextResolutionAllBalancers( "{\n" From 9793af2b0923670bb3c2cb2bc47ba8a25fa31002 Mon Sep 17 00:00:00 2001 From: Donna Dionne Date: Thu, 30 Apr 2020 11:55:02 -0700 Subject: [PATCH 662/758] Consolidating LDS and RDS tests together And refactoring the code to be able to reuse the same helper methods. Updating all tests to use helper methods. --- test/cpp/end2end/xds_end2end_test.cc | 351 ++++++++------------------- 1 file changed, 105 insertions(+), 246 deletions(-) diff --git a/test/cpp/end2end/xds_end2end_test.cc b/test/cpp/end2end/xds_end2end_test.cc index 0b4d671fa84..c109c6834a3 100644 --- a/test/cpp/end2end/xds_end2end_test.cc +++ b/test/cpp/end2end/xds_end2end_test.cc @@ -1074,22 +1074,27 @@ class LrsServiceImpl : public LrsService, class TestType { public: - TestType(bool use_xds_resolver, bool enable_load_reporting) + TestType(bool use_xds_resolver, bool enable_load_reporting, + bool enable_rds_testing = false) : use_xds_resolver_(use_xds_resolver), - enable_load_reporting_(enable_load_reporting) {} + enable_load_reporting_(enable_load_reporting), + enable_rds_testing_(enable_rds_testing) {} bool use_xds_resolver() const { return use_xds_resolver_; } bool enable_load_reporting() const { return enable_load_reporting_; } + bool enable_rds_testing() const { return enable_rds_testing_; } grpc::string AsString() const { grpc::string retval = (use_xds_resolver_ ? "XdsResolver" : "FakeResolver"); if (enable_load_reporting_) retval += "WithLoadReporting"; + if (enable_rds_testing_) retval += "Rds"; return retval; } private: const bool use_xds_resolver_; const bool enable_load_reporting_; + const bool enable_rds_testing_; }; class XdsEnd2endTest : public ::testing::TestWithParam { @@ -1133,6 +1138,9 @@ class XdsEnd2endTest : public ::testing::TestWithParam { ? client_load_reporting_interval_seconds_ : 0)); balancers_.back()->Start(); + if (GetParam().enable_rds_testing()) { + balancers_[i]->ads_service()->SetLdsToUseDynamicRds(); + } } ResetStub(); } @@ -1468,6 +1476,24 @@ class XdsEnd2endTest : public ::testing::TestWithParam { } } + void SetRouteConfiguration(int idx, const RouteConfiguration& route_config) { + if (GetParam().enable_rds_testing()) { + balancers_[idx]->ads_service()->SetRdsResource(route_config, + kDefaultResourceName); + } else { + balancers_[idx]->ads_service()->SetLdsResource( + AdsServiceImpl::BuildListener(route_config), kDefaultResourceName); + } + } + + AdsServiceImpl::ResponseState RouteConfigurationResponseState(int idx) const { + AdsServiceImpl* ads_service = balancers_[idx]->ads_service(); + if (GetParam().enable_rds_testing()) { + return ads_service->rds_response_state(); + } + return ads_service->lds_response_state(); + } + public: // This method could benefit test subclasses; to make it accessible // via bind with a qualified name, it needs to be public. @@ -2128,16 +2154,6 @@ TEST_P(SecureNamingTest, TargetNameIsUnexpected) { using LdsTest = BasicTest; -// Tests that LDS client should send an ACK upon correct LDS response (with -// inlined RDS result). -TEST_P(LdsTest, Vanilla) { - SetNextResolution({}); - SetNextResolutionForLbChannelAllBalancers(); - (void)SendRpc(); - EXPECT_EQ(balancers_[0]->ads_service()->lds_response_state(), - AdsServiceImpl::ACKED); -} - // Tests that LDS client should send a NACK if there is no API listener in the // Listener in the LDS response. TEST_P(LdsTest, NoApiListener) { @@ -2167,25 +2183,34 @@ TEST_P(LdsTest, WrongRouteSpecifier) { AdsServiceImpl::NACKED); } +using LdsRdsTest = BasicTest; + +// Tests that LDS client should send an ACK upon correct LDS response (with +// inlined RDS result). +TEST_P(LdsRdsTest, Vanilla) { + SetNextResolution({}); + SetNextResolutionForLbChannelAllBalancers(); + (void)SendRpc(); + EXPECT_EQ(RouteConfigurationResponseState(0), AdsServiceImpl::ACKED); +} + // Tests that LDS client should send a NACK if matching domain can't be found in // the LDS response. -TEST_P(LdsTest, NoMatchedDomain) { +TEST_P(LdsRdsTest, NoMatchedDomain) { RouteConfiguration route_config = balancers_[0]->ads_service()->default_route_config(); route_config.mutable_virtual_hosts(0)->clear_domains(); route_config.mutable_virtual_hosts(0)->add_domains("unmatched_domain"); - balancers_[0]->ads_service()->SetLdsResource( - AdsServiceImpl::BuildListener(route_config), kDefaultResourceName); + SetRouteConfiguration(0, route_config); SetNextResolution({}); SetNextResolutionForLbChannelAllBalancers(); CheckRpcSendFailure(); - EXPECT_EQ(balancers_[0]->ads_service()->lds_response_state(), - AdsServiceImpl::NACKED); + EXPECT_EQ(RouteConfigurationResponseState(0), AdsServiceImpl::NACKED); } // Tests that LDS client should choose the virtual host with matching domain if // multiple virtual hosts exist in the LDS response. -TEST_P(LdsTest, ChooseMatchedDomain) { +TEST_P(LdsRdsTest, ChooseMatchedDomain) { RouteConfiguration route_config = balancers_[0]->ads_service()->default_route_config(); *(route_config.add_virtual_hosts()) = route_config.virtual_hosts(0); @@ -2195,18 +2220,16 @@ TEST_P(LdsTest, ChooseMatchedDomain) { ->mutable_routes(0) ->mutable_route() ->mutable_cluster_header(); - balancers_[0]->ads_service()->SetLdsResource( - AdsServiceImpl::BuildListener(route_config), kDefaultResourceName); + SetRouteConfiguration(0, route_config); SetNextResolution({}); SetNextResolutionForLbChannelAllBalancers(); (void)SendRpc(); - EXPECT_EQ(balancers_[0]->ads_service()->lds_response_state(), - AdsServiceImpl::ACKED); + EXPECT_EQ(RouteConfigurationResponseState(0), AdsServiceImpl::ACKED); } // Tests that LDS client should choose the last route in the virtual host if // multiple routes exist in the LDS response. -TEST_P(LdsTest, ChooseLastRoute) { +TEST_P(LdsRdsTest, ChooseLastRoute) { RouteConfiguration route_config = balancers_[0]->ads_service()->default_route_config(); *(route_config.mutable_virtual_hosts(0)->add_routes()) = @@ -2215,36 +2238,32 @@ TEST_P(LdsTest, ChooseLastRoute) { ->mutable_routes(0) ->mutable_route() ->mutable_cluster_header(); - balancers_[0]->ads_service()->SetLdsResource( - AdsServiceImpl::BuildListener(route_config), kDefaultResourceName); + SetRouteConfiguration(0, route_config); SetNextResolution({}); SetNextResolutionForLbChannelAllBalancers(); (void)SendRpc(); - EXPECT_EQ(balancers_[0]->ads_service()->lds_response_state(), - AdsServiceImpl::ACKED); + EXPECT_EQ(RouteConfigurationResponseState(0), AdsServiceImpl::ACKED); } // Tests that LDS client should send a NACK if route match has non-empty prefix // as the only route (default) in the LDS response. -TEST_P(LdsTest, RouteMatchHasNonemptyPrefix) { +TEST_P(LdsRdsTest, RouteMatchHasNonemptyPrefix) { RouteConfiguration route_config = balancers_[0]->ads_service()->default_route_config(); route_config.mutable_virtual_hosts(0) ->mutable_routes(0) ->mutable_match() ->set_prefix("nonempty_prefix"); - balancers_[0]->ads_service()->SetLdsResource( - AdsServiceImpl::BuildListener(route_config), kDefaultResourceName); + SetRouteConfiguration(0, route_config); SetNextResolution({}); SetNextResolutionForLbChannelAllBalancers(); CheckRpcSendFailure(); - EXPECT_EQ(balancers_[0]->ads_service()->lds_response_state(), - AdsServiceImpl::NACKED); + EXPECT_EQ(RouteConfigurationResponseState(0), AdsServiceImpl::NACKED); } // Tests that LDS client should send a NACK if route match has a prefix // string with no "/". -TEST_P(LdsTest, RouteMatchHasInvalidPrefixNonEmptyNoSlash) { +TEST_P(LdsRdsTest, RouteMatchHasInvalidPrefixNonEmptyNoSlash) { ResetStub(/*failover_timeout=*/0, /*expected_targets=*/"", /*xds_resource_does_not_exist_timeout*/ 0, @@ -2256,18 +2275,16 @@ TEST_P(LdsTest, RouteMatchHasInvalidPrefixNonEmptyNoSlash) { auto* default_route = route_config.mutable_virtual_hosts(0)->add_routes(); default_route->mutable_match()->set_prefix(""); default_route->mutable_route()->set_cluster(kDefaultResourceName); - balancers_[0]->ads_service()->SetLdsResource( - AdsServiceImpl::BuildListener(route_config), kDefaultResourceName); + SetRouteConfiguration(0, route_config); SetNextResolution({}); SetNextResolutionForLbChannelAllBalancers(); CheckRpcSendFailure(); - EXPECT_EQ(balancers_[0]->ads_service()->lds_response_state(), - AdsServiceImpl::NACKED); + EXPECT_EQ(RouteConfigurationResponseState(0), AdsServiceImpl::NACKED); } // Tests that LDS client should send a NACK if route match has a prefix // string does not end with "/". -TEST_P(LdsTest, RouteMatchHasInvalidPrefixNoEndingSlash) { +TEST_P(LdsRdsTest, RouteMatchHasInvalidPrefixNoEndingSlash) { ResetStub(/*failover_timeout=*/0, /*expected_targets=*/"", /*xds_resource_does_not_exist_timeout*/ 0, @@ -2276,18 +2293,16 @@ TEST_P(LdsTest, RouteMatchHasInvalidPrefixNoEndingSlash) { balancers_[0]->ads_service()->default_route_config(); auto* route1 = route_config.mutable_virtual_hosts(0)->mutable_routes(0); route1->mutable_match()->set_prefix("/grpc.testing.EchoTest1Service"); - balancers_[0]->ads_service()->SetLdsResource( - AdsServiceImpl::BuildListener(route_config), kDefaultResourceName); + SetRouteConfiguration(0, route_config); SetNextResolution({}); SetNextResolutionForLbChannelAllBalancers(); CheckRpcSendFailure(); - EXPECT_EQ(balancers_[0]->ads_service()->lds_response_state(), - AdsServiceImpl::NACKED); + EXPECT_EQ(RouteConfigurationResponseState(0), AdsServiceImpl::NACKED); } // Tests that LDS client should send a NACK if route match has a prefix // string does not start with "/". -TEST_P(LdsTest, RouteMatchHasInvalidPrefixNoLeadingSlash) { +TEST_P(LdsRdsTest, RouteMatchHasInvalidPrefixNoLeadingSlash) { ResetStub(/*failover_timeout=*/0, /*expected_targets=*/"", /*xds_resource_does_not_exist_timeout*/ 0, @@ -2296,18 +2311,16 @@ TEST_P(LdsTest, RouteMatchHasInvalidPrefixNoLeadingSlash) { balancers_[0]->ads_service()->default_route_config(); auto* route1 = route_config.mutable_virtual_hosts(0)->mutable_routes(0); route1->mutable_match()->set_prefix("grpc.testing.EchoTest1Service/"); - balancers_[0]->ads_service()->SetLdsResource( - AdsServiceImpl::BuildListener(route_config), kDefaultResourceName); + SetRouteConfiguration(0, route_config); SetNextResolution({}); SetNextResolutionForLbChannelAllBalancers(); CheckRpcSendFailure(); - EXPECT_EQ(balancers_[0]->ads_service()->lds_response_state(), - AdsServiceImpl::NACKED); + EXPECT_EQ(RouteConfigurationResponseState(0), AdsServiceImpl::NACKED); } // Tests that LDS client should send a NACK if route match has a prefix // string with extra content outside of "/service/". -TEST_P(LdsTest, RouteMatchHasInvalidPrefixExtraContent) { +TEST_P(LdsRdsTest, RouteMatchHasInvalidPrefixExtraContent) { ResetStub(/*failover_timeout=*/0, /*expected_targets=*/"", /*xds_resource_does_not_exist_timeout*/ 0, @@ -2316,18 +2329,16 @@ TEST_P(LdsTest, RouteMatchHasInvalidPrefixExtraContent) { balancers_[0]->ads_service()->default_route_config(); auto* route1 = route_config.mutable_virtual_hosts(0)->mutable_routes(0); route1->mutable_match()->set_prefix("/grpc.testing.EchoTest1Service/Echo1"); - balancers_[0]->ads_service()->SetLdsResource( - AdsServiceImpl::BuildListener(route_config), kDefaultResourceName); + SetRouteConfiguration(0, route_config); SetNextResolution({}); SetNextResolutionForLbChannelAllBalancers(); CheckRpcSendFailure(); - EXPECT_EQ(balancers_[0]->ads_service()->lds_response_state(), - AdsServiceImpl::NACKED); + EXPECT_EQ(RouteConfigurationResponseState(0), AdsServiceImpl::NACKED); } // Tests that LDS client should send a NACK if route match has a prefix // string "//". -TEST_P(LdsTest, RouteMatchHasInvalidPrefixNoContent) { +TEST_P(LdsRdsTest, RouteMatchHasInvalidPrefixNoContent) { ResetStub(/*failover_timeout=*/0, /*expected_targets=*/"", /*xds_resource_does_not_exist_timeout*/ 0, @@ -2336,18 +2347,16 @@ TEST_P(LdsTest, RouteMatchHasInvalidPrefixNoContent) { balancers_[0]->ads_service()->default_route_config(); auto* route1 = route_config.mutable_virtual_hosts(0)->mutable_routes(0); route1->mutable_match()->set_prefix("//"); - balancers_[0]->ads_service()->SetLdsResource( - AdsServiceImpl::BuildListener(route_config), kDefaultResourceName); + SetRouteConfiguration(0, route_config); SetNextResolution({}); SetNextResolutionForLbChannelAllBalancers(); CheckRpcSendFailure(); - EXPECT_EQ(balancers_[0]->ads_service()->lds_response_state(), - AdsServiceImpl::NACKED); + EXPECT_EQ(RouteConfigurationResponseState(0), AdsServiceImpl::NACKED); } // Tests that LDS client should send a NACK if route match has path // but it's empty. -TEST_P(LdsTest, RouteMatchHasInvalidPathEmptyPath) { +TEST_P(LdsRdsTest, RouteMatchHasInvalidPathEmptyPath) { ResetStub(/*failover_timeout=*/0, /*expected_targets=*/"", /*xds_resource_does_not_exist_timeout*/ 0, @@ -2359,18 +2368,16 @@ TEST_P(LdsTest, RouteMatchHasInvalidPathEmptyPath) { default_route->mutable_match()->set_prefix(""); default_route->mutable_route()->set_cluster(kDefaultResourceName); route1->mutable_match()->set_path(""); - balancers_[0]->ads_service()->SetLdsResource( - AdsServiceImpl::BuildListener(route_config), kDefaultResourceName); + SetRouteConfiguration(0, route_config); SetNextResolution({}); SetNextResolutionForLbChannelAllBalancers(); CheckRpcSendFailure(); - EXPECT_EQ(balancers_[0]->ads_service()->lds_response_state(), - AdsServiceImpl::NACKED); + EXPECT_EQ(RouteConfigurationResponseState(0), AdsServiceImpl::NACKED); } // Tests that LDS client should send a NACK if route match has path // string does not start with "/". -TEST_P(LdsTest, RouteMatchHasInvalidPathNoLeadingSlash) { +TEST_P(LdsRdsTest, RouteMatchHasInvalidPathNoLeadingSlash) { ResetStub(/*failover_timeout=*/0, /*expected_targets=*/"", /*xds_resource_does_not_exist_timeout*/ 0, @@ -2382,18 +2389,16 @@ TEST_P(LdsTest, RouteMatchHasInvalidPathNoLeadingSlash) { default_route->mutable_match()->set_prefix(""); default_route->mutable_route()->set_cluster(kDefaultResourceName); route1->mutable_match()->set_path("grpc.testing.EchoTest1Service/Echo1"); - balancers_[0]->ads_service()->SetLdsResource( - AdsServiceImpl::BuildListener(route_config), kDefaultResourceName); + SetRouteConfiguration(0, route_config); SetNextResolution({}); SetNextResolutionForLbChannelAllBalancers(); CheckRpcSendFailure(); - EXPECT_EQ(balancers_[0]->ads_service()->lds_response_state(), - AdsServiceImpl::NACKED); + EXPECT_EQ(RouteConfigurationResponseState(0), AdsServiceImpl::NACKED); } // Tests that LDS client should send a NACK if route match has path // string that ends with "/". -TEST_P(LdsTest, RouteMatchHasInvalidPathEndsWithSlash) { +TEST_P(LdsRdsTest, RouteMatchHasInvalidPathEndsWithSlash) { ResetStub(/*failover_timeout=*/0, /*expected_targets=*/"", /*xds_resource_does_not_exist_timeout*/ 0, @@ -2405,18 +2410,16 @@ TEST_P(LdsTest, RouteMatchHasInvalidPathEndsWithSlash) { default_route->mutable_match()->set_prefix(""); default_route->mutable_route()->set_cluster(kDefaultResourceName); route1->mutable_match()->set_path("/grpc.testing.EchoTest1Service/Echo1/"); - balancers_[0]->ads_service()->SetLdsResource( - AdsServiceImpl::BuildListener(route_config), kDefaultResourceName); + SetRouteConfiguration(0, route_config); SetNextResolution({}); SetNextResolutionForLbChannelAllBalancers(); CheckRpcSendFailure(); - EXPECT_EQ(balancers_[0]->ads_service()->lds_response_state(), - AdsServiceImpl::NACKED); + EXPECT_EQ(RouteConfigurationResponseState(0), AdsServiceImpl::NACKED); } // Tests that LDS client should send a NACK if route match has path // string that misses "/" between service and method. -TEST_P(LdsTest, RouteMatchHasInvalidPathMissingMiddleSlash) { +TEST_P(LdsRdsTest, RouteMatchHasInvalidPathMissingMiddleSlash) { ResetStub(/*failover_timeout=*/0, /*expected_targets=*/"", /*xds_resource_does_not_exist_timeout*/ 0, @@ -2428,18 +2431,16 @@ TEST_P(LdsTest, RouteMatchHasInvalidPathMissingMiddleSlash) { default_route->mutable_match()->set_prefix(""); default_route->mutable_route()->set_cluster(kDefaultResourceName); route1->mutable_match()->set_path("/grpc.testing.EchoTest1Service.Echo1"); - balancers_[0]->ads_service()->SetLdsResource( - AdsServiceImpl::BuildListener(route_config), kDefaultResourceName); + SetRouteConfiguration(0, route_config); SetNextResolution({}); SetNextResolutionForLbChannelAllBalancers(); CheckRpcSendFailure(); - EXPECT_EQ(balancers_[0]->ads_service()->lds_response_state(), - AdsServiceImpl::NACKED); + EXPECT_EQ(RouteConfigurationResponseState(0), AdsServiceImpl::NACKED); } // Tests that LDS client should send a NACK if route match has path // string that is missing service. -TEST_P(LdsTest, RouteMatchHasInvalidPathMissingService) { +TEST_P(LdsRdsTest, RouteMatchHasInvalidPathMissingService) { ResetStub(/*failover_timeout=*/0, /*expected_targets=*/"", /*xds_resource_does_not_exist_timeout*/ 0, @@ -2451,18 +2452,16 @@ TEST_P(LdsTest, RouteMatchHasInvalidPathMissingService) { default_route->mutable_match()->set_prefix(""); default_route->mutable_route()->set_cluster(kDefaultResourceName); route1->mutable_match()->set_path("//Echo1"); - balancers_[0]->ads_service()->SetLdsResource( - AdsServiceImpl::BuildListener(route_config), kDefaultResourceName); + SetRouteConfiguration(0, route_config); SetNextResolution({}); SetNextResolutionForLbChannelAllBalancers(); CheckRpcSendFailure(); - EXPECT_EQ(balancers_[0]->ads_service()->lds_response_state(), - AdsServiceImpl::NACKED); + EXPECT_EQ(RouteConfigurationResponseState(0), AdsServiceImpl::NACKED); } // Tests that LDS client should send a NACK if route match has path // string that is missing method. -TEST_P(LdsTest, RouteMatchHasInvalidPathMissingMethod) { +TEST_P(LdsRdsTest, RouteMatchHasInvalidPathMissingMethod) { ResetStub(/*failover_timeout=*/0, /*expected_targets=*/"", /*xds_resource_does_not_exist_timeout*/ 0, @@ -2474,28 +2473,24 @@ TEST_P(LdsTest, RouteMatchHasInvalidPathMissingMethod) { default_route->mutable_match()->set_prefix(""); default_route->mutable_route()->set_cluster(kDefaultResourceName); route1->mutable_match()->set_path("/grpc.testing.EchoTest1Service/"); - balancers_[0]->ads_service()->SetLdsResource( - AdsServiceImpl::BuildListener(route_config), kDefaultResourceName); + SetRouteConfiguration(0, route_config); SetNextResolution({}); SetNextResolutionForLbChannelAllBalancers(); CheckRpcSendFailure(); - EXPECT_EQ(balancers_[0]->ads_service()->lds_response_state(), - AdsServiceImpl::NACKED); + EXPECT_EQ(RouteConfigurationResponseState(0), AdsServiceImpl::NACKED); } // Tests that LDS client should send a NACK if route has an action other than // RouteAction in the LDS response. -TEST_P(LdsTest, RouteHasNoRouteAction) { +TEST_P(LdsRdsTest, RouteHasNoRouteAction) { RouteConfiguration route_config = balancers_[0]->ads_service()->default_route_config(); route_config.mutable_virtual_hosts(0)->mutable_routes(0)->mutable_redirect(); - balancers_[0]->ads_service()->SetLdsResource( - AdsServiceImpl::BuildListener(route_config), kDefaultResourceName); + SetRouteConfiguration(0, route_config); SetNextResolution({}); SetNextResolutionForLbChannelAllBalancers(); CheckRpcSendFailure(); - EXPECT_EQ(balancers_[0]->ads_service()->lds_response_state(), - AdsServiceImpl::NACKED); + EXPECT_EQ(RouteConfigurationResponseState(0), AdsServiceImpl::NACKED); } // TODO@donnadionne: Add more invalid config tests to cover all errors in @@ -2503,26 +2498,28 @@ TEST_P(LdsTest, RouteHasNoRouteAction) { // Tests that LDS client should send a NACK if RouteAction has a // cluster_specifier other than cluster in the LDS response. -TEST_P(LdsTest, RouteActionHasNoCluster) { +TEST_P(LdsRdsTest, RouteActionHasNoCluster) { RouteConfiguration route_config = balancers_[0]->ads_service()->default_route_config(); route_config.mutable_virtual_hosts(0) ->mutable_routes(0) ->mutable_route() ->mutable_cluster_header(); - balancers_[0]->ads_service()->SetLdsResource( - AdsServiceImpl::BuildListener(route_config), kDefaultResourceName); + SetRouteConfiguration(0, route_config); SetNextResolution({}); SetNextResolutionForLbChannelAllBalancers(); CheckRpcSendFailure(); - EXPECT_EQ(balancers_[0]->ads_service()->lds_response_state(), - AdsServiceImpl::NACKED); + EXPECT_EQ(RouteConfigurationResponseState(0), AdsServiceImpl::NACKED); } // Tests that LDS client times out when no response received. -TEST_P(LdsTest, Timeout) { +TEST_P(LdsRdsTest, Timeout) { ResetStub(0, "", 500); - balancers_[0]->ads_service()->SetResourceIgnore(kLdsTypeUrl); + if (GetParam().enable_rds_testing()) { + balancers_[0]->ads_service()->SetResourceIgnore(kRdsTypeUrl); + } else { + balancers_[0]->ads_service()->SetResourceIgnore(kLdsTypeUrl); + } SetNextResolution({}); SetNextResolutionForLbChannelAllBalancers(); CheckRpcSendFailure(); @@ -2530,7 +2527,7 @@ TEST_P(LdsTest, Timeout) { // Tests that LDS client should choose the default route (with no matching // specified) after unable to find a match with previous routes. -TEST_P(LdsTest, XdsRoutingPathMatching) { +TEST_P(LdsRdsTest, XdsRoutingPathMatching) { ResetStub(/*failover_timeout=*/0, /*expected_targets=*/"", /*xds_resource_does_not_exist_timeout*/ 0, @@ -2582,9 +2579,7 @@ TEST_P(LdsTest, XdsRoutingPathMatching) { auto* default_route = new_route_config.mutable_virtual_hosts(0)->add_routes(); default_route->mutable_match()->set_prefix(""); default_route->mutable_route()->set_cluster(kDefaultResourceName); - Listener listener = - balancers_[0]->ads_service()->BuildListener(new_route_config); - balancers_[0]->ads_service()->SetLdsResource(listener, kDefaultResourceName); + SetRouteConfiguration(0, new_route_config); WaitForAllBackends(0, 2); CheckRpcSendOk(kNumEchoRpcs, RpcOptions().set_wait_for_ready(true)); CheckRpcSendOk(kNumEcho1Rpcs, RpcOptions() @@ -2610,7 +2605,7 @@ TEST_P(LdsTest, XdsRoutingPathMatching) { EXPECT_EQ(kNumEcho2Rpcs, backends_[3]->backend_service2()->request_count()); } -TEST_P(LdsTest, XdsRoutingPrefixMatching) { +TEST_P(LdsRdsTest, XdsRoutingPrefixMatching) { ResetStub(/*failover_timeout=*/0, /*expected_targets=*/"", /*xds_resource_does_not_exist_timeout*/ 0, @@ -2659,9 +2654,7 @@ TEST_P(LdsTest, XdsRoutingPrefixMatching) { auto* default_route = new_route_config.mutable_virtual_hosts(0)->add_routes(); default_route->mutable_match()->set_prefix(""); default_route->mutable_route()->set_cluster(kDefaultResourceName); - Listener listener = - balancers_[0]->ads_service()->BuildListener(new_route_config); - balancers_[0]->ads_service()->SetLdsResource(listener, kDefaultResourceName); + SetRouteConfiguration(0, new_route_config); WaitForAllBackends(0, 2); CheckRpcSendOk(kNumEchoRpcs, RpcOptions().set_wait_for_ready(true)); CheckRpcSendOk( @@ -2685,142 +2678,6 @@ TEST_P(LdsTest, XdsRoutingPrefixMatching) { EXPECT_EQ(kNumEcho2Rpcs, backends_[3]->backend_service2()->request_count()); } -using RdsTest = BasicTest; - -// Tests that RDS client should send an ACK upon correct RDS response. -TEST_P(RdsTest, Vanilla) { - balancers_[0]->ads_service()->SetLdsToUseDynamicRds(); - SetNextResolution({}); - SetNextResolutionForLbChannelAllBalancers(); - (void)SendRpc(); - EXPECT_EQ(balancers_[0]->ads_service()->rds_response_state(), - AdsServiceImpl::ACKED); -} - -// Tests that RDS client should send a NACK if matching domain can't be found in -// the RDS response. -TEST_P(RdsTest, NoMatchedDomain) { - balancers_[0]->ads_service()->SetLdsToUseDynamicRds(); - RouteConfiguration route_config = - balancers_[0]->ads_service()->default_route_config(); - route_config.mutable_virtual_hosts(0)->clear_domains(); - route_config.mutable_virtual_hosts(0)->add_domains("unmatched_domain"); - balancers_[0]->ads_service()->SetRdsResource(route_config, - kDefaultResourceName); - SetNextResolution({}); - SetNextResolutionForLbChannelAllBalancers(); - CheckRpcSendFailure(); - EXPECT_EQ(balancers_[0]->ads_service()->rds_response_state(), - AdsServiceImpl::NACKED); -} - -// Tests that RDS client should choose the virtual host with matching domain if -// multiple virtual hosts exist in the RDS response. -TEST_P(RdsTest, ChooseMatchedDomain) { - balancers_[0]->ads_service()->SetLdsToUseDynamicRds(); - RouteConfiguration route_config = - balancers_[0]->ads_service()->default_route_config(); - *(route_config.add_virtual_hosts()) = route_config.virtual_hosts(0); - route_config.mutable_virtual_hosts(0)->clear_domains(); - route_config.mutable_virtual_hosts(0)->add_domains("unmatched_domain"); - route_config.mutable_virtual_hosts(0) - ->mutable_routes(0) - ->mutable_route() - ->mutable_cluster_header(); - balancers_[0]->ads_service()->SetRdsResource(route_config, - kDefaultResourceName); - SetNextResolution({}); - SetNextResolutionForLbChannelAllBalancers(); - (void)SendRpc(); - EXPECT_EQ(balancers_[0]->ads_service()->rds_response_state(), - AdsServiceImpl::ACKED); -} - -// Tests that RDS client should choose the last route in the virtual host if -// multiple routes exist in the RDS response. -TEST_P(RdsTest, ChooseLastRoute) { - balancers_[0]->ads_service()->SetLdsToUseDynamicRds(); - RouteConfiguration route_config = - balancers_[0]->ads_service()->default_route_config(); - *(route_config.mutable_virtual_hosts(0)->add_routes()) = - route_config.virtual_hosts(0).routes(0); - route_config.mutable_virtual_hosts(0) - ->mutable_routes(0) - ->mutable_route() - ->mutable_cluster_header(); - balancers_[0]->ads_service()->SetRdsResource(route_config, - kDefaultResourceName); - SetNextResolution({}); - SetNextResolutionForLbChannelAllBalancers(); - (void)SendRpc(); - EXPECT_EQ(balancers_[0]->ads_service()->rds_response_state(), - AdsServiceImpl::ACKED); -} - -// Tests that RDS client should send a NACK if route match has non-empty prefix -// as the only route (default) in the RDS response. -TEST_P(RdsTest, RouteMatchHasNonemptyPrefix) { - balancers_[0]->ads_service()->SetLdsToUseDynamicRds(); - RouteConfiguration route_config = - balancers_[0]->ads_service()->default_route_config(); - route_config.mutable_virtual_hosts(0) - ->mutable_routes(0) - ->mutable_match() - ->set_prefix("/nonempty_prefix/"); - balancers_[0]->ads_service()->SetRdsResource(route_config, - kDefaultResourceName); - SetNextResolution({}); - SetNextResolutionForLbChannelAllBalancers(); - CheckRpcSendFailure(); - EXPECT_EQ(balancers_[0]->ads_service()->rds_response_state(), - AdsServiceImpl::NACKED); -} - -// Tests that RDS client should send a NACK if route has an action other than -// RouteAction in the RDS response. -TEST_P(RdsTest, RouteHasNoRouteAction) { - balancers_[0]->ads_service()->SetLdsToUseDynamicRds(); - RouteConfiguration route_config = - balancers_[0]->ads_service()->default_route_config(); - route_config.mutable_virtual_hosts(0)->mutable_routes(0)->mutable_redirect(); - balancers_[0]->ads_service()->SetRdsResource(route_config, - kDefaultResourceName); - SetNextResolution({}); - SetNextResolutionForLbChannelAllBalancers(); - CheckRpcSendFailure(); - EXPECT_EQ(balancers_[0]->ads_service()->rds_response_state(), - AdsServiceImpl::NACKED); -} - -// Tests that RDS client should send a NACK if RouteAction has a -// cluster_specifier other than cluster in the RDS response. -TEST_P(RdsTest, RouteActionHasNoCluster) { - balancers_[0]->ads_service()->SetLdsToUseDynamicRds(); - RouteConfiguration route_config = - balancers_[0]->ads_service()->default_route_config(); - route_config.mutable_virtual_hosts(0) - ->mutable_routes(0) - ->mutable_route() - ->mutable_cluster_header(); - balancers_[0]->ads_service()->SetRdsResource(route_config, - kDefaultResourceName); - SetNextResolution({}); - SetNextResolutionForLbChannelAllBalancers(); - CheckRpcSendFailure(); - EXPECT_EQ(balancers_[0]->ads_service()->rds_response_state(), - AdsServiceImpl::NACKED); -} - -// Tests that RDS client times out when no response received. -TEST_P(RdsTest, Timeout) { - ResetStub(0, "", 500); - balancers_[0]->ads_service()->SetResourceIgnore(kRdsTypeUrl); - balancers_[0]->ads_service()->SetLdsToUseDynamicRds(); - SetNextResolution({}); - SetNextResolutionForLbChannelAllBalancers(); - CheckRpcSendFailure(); -} - using CdsTest = BasicTest; // Tests that CDS client should send an ACK upon correct CDS response. @@ -4060,10 +3917,12 @@ INSTANTIATE_TEST_SUITE_P(XdsTest, LdsTest, TestType(true, true)), &TestTypeName); -// RDS depends on XdsResolver. -INSTANTIATE_TEST_SUITE_P(XdsTest, RdsTest, +// LDS RDS Commmon tests depends on XdsResolver. +INSTANTIATE_TEST_SUITE_P(XdsTest, LdsRdsTest, ::testing::Values(TestType(true, false), - TestType(true, true)), + TestType(true, true), + TestType(true, false, true), + TestType(true, true, true)), &TestTypeName); // CDS depends on XdsResolver. From f375c0b548278f81a21d3263cd00e57295cbf39a Mon Sep 17 00:00:00 2001 From: Taras Galkovskyi Date: Thu, 30 Apr 2020 18:58:44 +0000 Subject: [PATCH 663/758] minor stylistic fixes --- examples/python/data_transmission/BUILD | 2 +- examples/python/data_transmission/alts_server.py | 2 +- src/python/grpcio/grpc/__init__.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/python/data_transmission/BUILD b/examples/python/data_transmission/BUILD index 7c2980d5a5b..2eefb7a3ed2 100644 --- a/examples/python/data_transmission/BUILD +++ b/examples/python/data_transmission/BUILD @@ -1,4 +1,4 @@ -# Copyright 2017 gRPC authors. +# Copyright 2020 gRPC authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/examples/python/data_transmission/alts_server.py b/examples/python/data_transmission/alts_server.py index 9189405c916..7f1d2f8983d 100644 --- a/examples/python/data_transmission/alts_server.py +++ b/examples/python/data_transmission/alts_server.py @@ -1,4 +1,4 @@ -# Copyright 2019 gRPC authors. +# Copyright 2020 gRPC authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/src/python/grpcio/grpc/__init__.py b/src/python/grpcio/grpc/__init__.py index 258fb5cf52b..f4c261c23f2 100644 --- a/src/python/grpcio/grpc/__init__.py +++ b/src/python/grpcio/grpc/__init__.py @@ -1861,7 +1861,7 @@ def alts_server_credentials(): ALTS credentials API can only be used in GCP environment as it relies on handshaker service being available. For more info about ALTS see https://cloud.google.com/security/encryption-in-transit/application-layer-transport-security - + Returns: A ServerCredentials for use with an ALTS-enabled Server """ From 39d8fa3f0bc5491edc67dfaa49e8ea843360eab2 Mon Sep 17 00:00:00 2001 From: Pau Freixes Date: Thu, 30 Apr 2020 22:32:12 +0200 Subject: [PATCH 664/758] Apply feedback review --- .../grpcio/grpc/experimental/aio/_call.py | 2 +- .../grpcio/grpc/experimental/aio/_channel.py | 11 ++++++----- .../grpc/experimental/aio/_interceptor.py | 19 ++++++++++++------- 3 files changed, 19 insertions(+), 13 deletions(-) diff --git a/src/python/grpcio/grpc/experimental/aio/_call.py b/src/python/grpcio/grpc/experimental/aio/_call.py index 9cab7052318..a0693921461 100644 --- a/src/python/grpcio/grpc/experimental/aio/_call.py +++ b/src/python/grpcio/grpc/experimental/aio/_call.py @@ -35,7 +35,7 @@ _LOCAL_CANCELLATION_DETAILS = 'Locally cancelled by application!' _GC_CANCELLATION_DETAILS = 'Cancelled upon garbage collection!' _RPC_ALREADY_FINISHED_DETAILS = 'RPC already finished.' _RPC_HALF_CLOSED_DETAILS = 'RPC is half closed after calling "done_writing".' -_API_STYLE_ERROR = 'Please don\'t mix two styles of API for streaming requests' +_API_STYLE_ERROR = 'The iterator and read/write APIs may not be mixed on a single RPC.' _OK_CALL_REPRESENTATION = ('<{} of RPC that terminated with:\n' '\tstatus = {}\n' diff --git a/src/python/grpcio/grpc/experimental/aio/_channel.py b/src/python/grpcio/grpc/experimental/aio/_channel.py index 731a3351b48..97ffa833bbf 100644 --- a/src/python/grpcio/grpc/experimental/aio/_channel.py +++ b/src/python/grpcio/grpc/experimental/aio/_channel.py @@ -256,11 +256,12 @@ class Channel(_base_channel.Channel): if invalid_interceptors: raise ValueError( - "Interceptor must be "+\ - "UnaryUnaryClientInterceptors or "+\ - "UnaryUnaryClientInterceptors or "+\ - "StreamUnaryClientInterceptors. The following are invalid: {}"\ - .format(invalid_interceptors)) + "Interceptor must be " + + "{} or ".format(UnaryUnaryClientInterceptor.__name__) + + "{} or ".format(UnaryStreamClientInterceptor.__name__) + + "{}. ".format(StreamUnaryClientInterceptor.__name__) + + "The following are invalid: {}".format(invalid_interceptors) + ) self._loop = asyncio.get_event_loop() self._channel = cygrpc.AioChannel( diff --git a/src/python/grpcio/grpc/experimental/aio/_interceptor.py b/src/python/grpcio/grpc/experimental/aio/_interceptor.py index eff5e03fc1e..e4969ddb4a5 100644 --- a/src/python/grpcio/grpc/experimental/aio/_interceptor.py +++ b/src/python/grpcio/grpc/experimental/aio/_interceptor.py @@ -104,7 +104,7 @@ class UnaryUnaryClientInterceptor(ClientInterceptor, metaclass=ABCMeta): Args: continuation: A coroutine that proceeds with the invocation by - executing the next interceptor in chain or invoking the + executing the next interceptor in the chain or invoking the actual RPC on the underlying Channel. It is the interceptor's responsibility to call it if it decides to move the RPC forward. The interceptor can use @@ -141,7 +141,7 @@ class UnaryStreamClientInterceptor(ClientInterceptor, metaclass=ABCMeta): Args: continuation: A coroutine that proceeds with the invocation by - executing the next interceptor in chain or invoking the + executing the next interceptor in the chain or invoking the actual RPC on the underlying Channel. It is the interceptor's responsibility to call it if it decides to move the RPC forward. The interceptor can use @@ -174,9 +174,14 @@ class StreamUnaryClientInterceptor(ClientInterceptor, metaclass=ABCMeta): ) -> StreamUnaryCall: """Intercepts a stream-unary invocation asynchronously. + Within the interceptor the usage of the call methods like `write` or + even awaiting the call should be done carefully, since the caller + could be expecting an untouched call, for example for start writing + messages to it. + Args: continuation: A coroutine that proceeds with the invocation by - executing the next interceptor in chain or invoking the + executing the next interceptor in the chain or invoking the actual RPC on the underlying Channel. It is the interceptor's responsibility to call it if it decides to move the RPC forward. The interceptor can use @@ -564,7 +569,7 @@ class InterceptedStreamUnaryCall(_InterceptedUnaryResponseMixin, _write_to_iterator_async_gen: Optional[AsyncIterable[RequestType]] _write_to_iterator_queue: Optional[asyncio.Queue] - _FINISH_ITERATOR_SENTINEL = tuple() + _FINISH_ITERATOR_SENTINEL = object() # pylint: disable=too-many-arguments def __init__(self, interceptors: Sequence[StreamUnaryClientInterceptor], @@ -577,11 +582,11 @@ class InterceptedStreamUnaryCall(_InterceptedUnaryResponseMixin, loop: asyncio.AbstractEventLoop) -> None: self._loop = loop self._channel = channel - if not request_iterator: + if request_iterator is None: # We provide our own request iterator which is a proxy # of the futures writes that will be done by the caller. self._write_to_iterator_queue = asyncio.Queue(maxsize=1) - self._write_to_iterator_async_gen = self._proxies_writes_as_a_request_iteerator( + self._write_to_iterator_async_gen = self._proxy_writes_as_request_iterator( ) request_iterator = self._write_to_iterator_async_gen else: @@ -636,7 +641,7 @@ class InterceptedStreamUnaryCall(_InterceptedUnaryResponseMixin, def time_remaining(self) -> Optional[float]: raise NotImplementedError() - async def _proxies_writes_as_a_request_iteerator(self): + async def _proxy_writes_as_request_iterator(self): await self._interceptors_task while True: From 092932b4dddbcdf20c8ec5aa9dc7c356b309b93f Mon Sep 17 00:00:00 2001 From: Donna Dionne Date: Thu, 30 Apr 2020 14:57:29 -0700 Subject: [PATCH 665/758] Squash the last 2 commits. --- .../ext/filters/client_channel/xds/xds_api.cc | 7 +- test/cpp/end2end/xds_end2end_test.cc | 231 +++++++++++------- 2 files changed, 147 insertions(+), 91 deletions(-) diff --git a/src/core/ext/filters/client_channel/xds/xds_api.cc b/src/core/ext/filters/client_channel/xds/xds_api.cc index 3c977d6152f..60ca930e060 100644 --- a/src/core/ext/filters/client_channel/xds/xds_api.cc +++ b/src/core/ext/filters/client_channel/xds/xds_api.cc @@ -1145,7 +1145,7 @@ grpc_error* LdsResponseParse(XdsClient* client, TraceFlag* tracer, envoy_api_v2_Listener_api_listener(listener); if (api_listener == nullptr) { return GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "Listener doesn't have ApiListener."); + "Listener has no ApiListener."); } const upb_strview encoded_api_listener = google_protobuf_Any_value( envoy_config_listener_v2_ApiListener_api_listener(api_listener)); @@ -1278,7 +1278,8 @@ grpc_error* CdsResponseParse( const envoy_api_v2_core_ConfigSource* eds_config = envoy_api_v2_Cluster_EdsClusterConfig_eds_config(eds_cluster_config); if (!envoy_api_v2_core_ConfigSource_has_ads(eds_config)) { - return GRPC_ERROR_CREATE_FROM_STATIC_STRING("ConfigSource is not ADS."); + return GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "EDS ConfigSource is not ADS."); } // Record EDS service_name (if any). upb_strview service_name = @@ -1299,7 +1300,7 @@ grpc_error* CdsResponseParse( if (lrs_server != nullptr) { if (!envoy_api_v2_core_ConfigSource_has_self(lrs_server)) { return GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "ConfigSource is not self."); + "LRS ConfigSource is not self."); } cds_update.lrs_load_reporting_server_name.emplace(""); } diff --git a/test/cpp/end2end/xds_end2end_test.cc b/test/cpp/end2end/xds_end2end_test.cc index c109c6834a3..5fb6a62b19d 100644 --- a/test/cpp/end2end/xds_end2end_test.cc +++ b/test/cpp/end2end/xds_end2end_test.cc @@ -375,11 +375,10 @@ class ClientStats { class AdsServiceImpl : public AggregatedDiscoveryService::Service, public std::enable_shared_from_this { public: - enum ResponseState { - NOT_SENT, - SENT, - ACKED, - NACKED, + struct ResponseState { + enum State { NOT_SENT, SENT, ACKED, NACKED }; + State state = NOT_SENT; + std::string error_message; }; struct EdsResourceArgs { @@ -487,11 +486,15 @@ class AdsServiceImpl : public AggregatedDiscoveryService::Service, // comparing it to nonce (this server ensures they are always set to // the same in a response.) if (!request.response_nonce().empty()) { - resource_type_response_state_[request.type_url()] = + resource_type_response_state_[request.type_url()].state = (!request.version_info().empty() && request.version_info() == request.response_nonce()) - ? ACKED - : NACKED; + ? ResponseState::ACKED + : ResponseState::NACKED; + } + if (request.has_error_detail()) { + resource_type_response_state_[request.type_url()].error_message = + request.error_detail().message(); } // As long as the test did not tell us to ignore this type of // request, we will loop through all resources to: @@ -920,7 +923,7 @@ class AdsServiceImpl : public AggregatedDiscoveryService::Service, const SubscriptionNameMap& subscription_name_map, const std::set& resources_added_to_response, DiscoveryResponse* response) { - resource_type_response_state_[resource_type] = SENT; + resource_type_response_state_[resource_type].state = ResponseState::SENT; response->set_type_url(resource_type); response->set_version_info(absl::StrCat(version)); response->set_nonce(absl::StrCat(version)); @@ -949,7 +952,7 @@ class AdsServiceImpl : public AggregatedDiscoveryService::Service, Listener default_listener_; RouteConfiguration default_route_config_; Cluster default_cluster_; - std::map + std::map resource_type_response_state_; std::set resource_types_to_ignore_; // An instance data member containing the current state of all resources. @@ -1904,8 +1907,8 @@ TEST_P(XdsResolverOnlyTest, ClusterRemoved) { // Make sure RPCs are still succeeding. CheckRpcSendOk(100 * num_backends_); // Make sure we ACK'ed the update. - EXPECT_EQ(balancers_[0]->ads_service()->cds_response_state(), - AdsServiceImpl::ACKED); + EXPECT_EQ(balancers_[0]->ads_service()->cds_response_state().state, + AdsServiceImpl::ResponseState::ACKED); } // Tests that we restart all xDS requests when we reestablish the ADS call. @@ -2163,8 +2166,10 @@ TEST_P(LdsTest, NoApiListener) { SetNextResolution({}); SetNextResolutionForLbChannelAllBalancers(); CheckRpcSendFailure(); - EXPECT_EQ(balancers_[0]->ads_service()->lds_response_state(), - AdsServiceImpl::NACKED); + const auto& response_state = + balancers_[0]->ads_service()->lds_response_state(); + EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED); + EXPECT_EQ(response_state.error_message, "Listener has no ApiListener."); } // Tests that LDS client should send a NACK if the route_specifier in the @@ -2179,8 +2184,11 @@ TEST_P(LdsTest, WrongRouteSpecifier) { SetNextResolution({}); SetNextResolutionForLbChannelAllBalancers(); CheckRpcSendFailure(); - EXPECT_EQ(balancers_[0]->ads_service()->lds_response_state(), - AdsServiceImpl::NACKED); + const auto& response_state = + balancers_[0]->ads_service()->lds_response_state(); + EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED); + EXPECT_EQ(response_state.error_message, + "HttpConnectionManager neither has inlined route_config nor RDS."); } using LdsRdsTest = BasicTest; @@ -2191,7 +2199,8 @@ TEST_P(LdsRdsTest, Vanilla) { SetNextResolution({}); SetNextResolutionForLbChannelAllBalancers(); (void)SendRpc(); - EXPECT_EQ(RouteConfigurationResponseState(0), AdsServiceImpl::ACKED); + EXPECT_EQ(RouteConfigurationResponseState(0).state, + AdsServiceImpl::ResponseState::ACKED); } // Tests that LDS client should send a NACK if matching domain can't be found in @@ -2205,7 +2214,10 @@ TEST_P(LdsRdsTest, NoMatchedDomain) { SetNextResolution({}); SetNextResolutionForLbChannelAllBalancers(); CheckRpcSendFailure(); - EXPECT_EQ(RouteConfigurationResponseState(0), AdsServiceImpl::NACKED); + const auto& response_state = RouteConfigurationResponseState(0); + EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED); + EXPECT_EQ(response_state.error_message, + "No matched virtual host found in the route config."); } // Tests that LDS client should choose the virtual host with matching domain if @@ -2224,7 +2236,8 @@ TEST_P(LdsRdsTest, ChooseMatchedDomain) { SetNextResolution({}); SetNextResolutionForLbChannelAllBalancers(); (void)SendRpc(); - EXPECT_EQ(RouteConfigurationResponseState(0), AdsServiceImpl::ACKED); + EXPECT_EQ(RouteConfigurationResponseState(0).state, + AdsServiceImpl::ResponseState::ACKED); } // Tests that LDS client should choose the last route in the virtual host if @@ -2242,7 +2255,8 @@ TEST_P(LdsRdsTest, ChooseLastRoute) { SetNextResolution({}); SetNextResolutionForLbChannelAllBalancers(); (void)SendRpc(); - EXPECT_EQ(RouteConfigurationResponseState(0), AdsServiceImpl::ACKED); + EXPECT_EQ(RouteConfigurationResponseState(0).state, + AdsServiceImpl::ResponseState::ACKED); } // Tests that LDS client should send a NACK if route match has non-empty prefix @@ -2253,12 +2267,16 @@ TEST_P(LdsRdsTest, RouteMatchHasNonemptyPrefix) { route_config.mutable_virtual_hosts(0) ->mutable_routes(0) ->mutable_match() - ->set_prefix("nonempty_prefix"); + ->set_prefix("/nonempty_prefix/"); SetRouteConfiguration(0, route_config); SetNextResolution({}); SetNextResolutionForLbChannelAllBalancers(); CheckRpcSendFailure(); - EXPECT_EQ(RouteConfigurationResponseState(0), AdsServiceImpl::NACKED); + const auto& response_state = RouteConfigurationResponseState(0); + balancers_[0]->ads_service()->lds_response_state(); + EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED); + EXPECT_EQ(response_state.error_message, + "Default route must have empty service and method"); } // Tests that LDS client should send a NACK if route match has a prefix @@ -2279,7 +2297,9 @@ TEST_P(LdsRdsTest, RouteMatchHasInvalidPrefixNonEmptyNoSlash) { SetNextResolution({}); SetNextResolutionForLbChannelAllBalancers(); CheckRpcSendFailure(); - EXPECT_EQ(RouteConfigurationResponseState(0), AdsServiceImpl::NACKED); + const auto& response_state = RouteConfigurationResponseState(0); + EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED); + EXPECT_EQ(response_state.error_message, "Prefix does not start with a /"); } // Tests that LDS client should send a NACK if route match has a prefix @@ -2297,7 +2317,10 @@ TEST_P(LdsRdsTest, RouteMatchHasInvalidPrefixNoEndingSlash) { SetNextResolution({}); SetNextResolutionForLbChannelAllBalancers(); CheckRpcSendFailure(); - EXPECT_EQ(RouteConfigurationResponseState(0), AdsServiceImpl::NACKED); + const auto& response_state = RouteConfigurationResponseState(0); + EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED); + EXPECT_EQ(response_state.error_message, + "Prefix not in the required format of /service/"); } // Tests that LDS client should send a NACK if route match has a prefix @@ -2315,7 +2338,9 @@ TEST_P(LdsRdsTest, RouteMatchHasInvalidPrefixNoLeadingSlash) { SetNextResolution({}); SetNextResolutionForLbChannelAllBalancers(); CheckRpcSendFailure(); - EXPECT_EQ(RouteConfigurationResponseState(0), AdsServiceImpl::NACKED); + const auto& response_state = RouteConfigurationResponseState(0); + EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED); + EXPECT_EQ(response_state.error_message, "Prefix does not start with a /"); } // Tests that LDS client should send a NACK if route match has a prefix @@ -2333,7 +2358,9 @@ TEST_P(LdsRdsTest, RouteMatchHasInvalidPrefixExtraContent) { SetNextResolution({}); SetNextResolutionForLbChannelAllBalancers(); CheckRpcSendFailure(); - EXPECT_EQ(RouteConfigurationResponseState(0), AdsServiceImpl::NACKED); + const auto& response_state = RouteConfigurationResponseState(0); + EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED); + EXPECT_EQ(response_state.error_message, "Prefix does not end with a /"); } // Tests that LDS client should send a NACK if route match has a prefix @@ -2351,7 +2378,9 @@ TEST_P(LdsRdsTest, RouteMatchHasInvalidPrefixNoContent) { SetNextResolution({}); SetNextResolutionForLbChannelAllBalancers(); CheckRpcSendFailure(); - EXPECT_EQ(RouteConfigurationResponseState(0), AdsServiceImpl::NACKED); + const auto& response_state = RouteConfigurationResponseState(0); + EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED); + EXPECT_EQ(response_state.error_message, "Prefix contains empty service name"); } // Tests that LDS client should send a NACK if route match has path @@ -2372,7 +2401,9 @@ TEST_P(LdsRdsTest, RouteMatchHasInvalidPathEmptyPath) { SetNextResolution({}); SetNextResolutionForLbChannelAllBalancers(); CheckRpcSendFailure(); - EXPECT_EQ(RouteConfigurationResponseState(0), AdsServiceImpl::NACKED); + const auto& response_state = RouteConfigurationResponseState(0); + EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED); + EXPECT_EQ(response_state.error_message, "Path if set cannot be empty"); } // Tests that LDS client should send a NACK if route match has path @@ -2393,7 +2424,9 @@ TEST_P(LdsRdsTest, RouteMatchHasInvalidPathNoLeadingSlash) { SetNextResolution({}); SetNextResolutionForLbChannelAllBalancers(); CheckRpcSendFailure(); - EXPECT_EQ(RouteConfigurationResponseState(0), AdsServiceImpl::NACKED); + const auto& response_state = RouteConfigurationResponseState(0); + EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED); + EXPECT_EQ(response_state.error_message, "Path does not start with a /"); } // Tests that LDS client should send a NACK if route match has path @@ -2414,7 +2447,10 @@ TEST_P(LdsRdsTest, RouteMatchHasInvalidPathEndsWithSlash) { SetNextResolution({}); SetNextResolutionForLbChannelAllBalancers(); CheckRpcSendFailure(); - EXPECT_EQ(RouteConfigurationResponseState(0), AdsServiceImpl::NACKED); + const auto& response_state = RouteConfigurationResponseState(0); + EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED); + EXPECT_EQ(response_state.error_message, + "Path not in the required format of /service/method"); } // Tests that LDS client should send a NACK if route match has path @@ -2435,7 +2471,10 @@ TEST_P(LdsRdsTest, RouteMatchHasInvalidPathMissingMiddleSlash) { SetNextResolution({}); SetNextResolutionForLbChannelAllBalancers(); CheckRpcSendFailure(); - EXPECT_EQ(RouteConfigurationResponseState(0), AdsServiceImpl::NACKED); + const auto& response_state = RouteConfigurationResponseState(0); + EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED); + EXPECT_EQ(response_state.error_message, + "Path not in the required format of /service/method"); } // Tests that LDS client should send a NACK if route match has path @@ -2456,7 +2495,9 @@ TEST_P(LdsRdsTest, RouteMatchHasInvalidPathMissingService) { SetNextResolution({}); SetNextResolutionForLbChannelAllBalancers(); CheckRpcSendFailure(); - EXPECT_EQ(RouteConfigurationResponseState(0), AdsServiceImpl::NACKED); + const auto& response_state = RouteConfigurationResponseState(0); + EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED); + EXPECT_EQ(response_state.error_message, "Path contains empty service name"); } // Tests that LDS client should send a NACK if route match has path @@ -2477,7 +2518,9 @@ TEST_P(LdsRdsTest, RouteMatchHasInvalidPathMissingMethod) { SetNextResolution({}); SetNextResolutionForLbChannelAllBalancers(); CheckRpcSendFailure(); - EXPECT_EQ(RouteConfigurationResponseState(0), AdsServiceImpl::NACKED); + const auto& response_state = RouteConfigurationResponseState(0); + EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED); + EXPECT_EQ(response_state.error_message, "Path contains empty method name"); } // Tests that LDS client should send a NACK if route has an action other than @@ -2490,12 +2533,11 @@ TEST_P(LdsRdsTest, RouteHasNoRouteAction) { SetNextResolution({}); SetNextResolutionForLbChannelAllBalancers(); CheckRpcSendFailure(); - EXPECT_EQ(RouteConfigurationResponseState(0), AdsServiceImpl::NACKED); + const auto& response_state = RouteConfigurationResponseState(0); + EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED); + EXPECT_EQ(response_state.error_message, "No RouteAction found in route."); } -// TODO@donnadionne: Add more invalid config tests to cover all errors in -// xds_api.cc - // Tests that LDS client should send a NACK if RouteAction has a // cluster_specifier other than cluster in the LDS response. TEST_P(LdsRdsTest, RouteActionHasNoCluster) { @@ -2509,7 +2551,9 @@ TEST_P(LdsRdsTest, RouteActionHasNoCluster) { SetNextResolution({}); SetNextResolutionForLbChannelAllBalancers(); CheckRpcSendFailure(); - EXPECT_EQ(RouteConfigurationResponseState(0), AdsServiceImpl::NACKED); + const auto& response_state = RouteConfigurationResponseState(0); + EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED); + EXPECT_EQ(response_state.error_message, "No cluster found in RouteAction."); } // Tests that LDS client times out when no response received. @@ -2685,8 +2729,8 @@ TEST_P(CdsTest, Vanilla) { SetNextResolution({}); SetNextResolutionForLbChannelAllBalancers(); (void)SendRpc(); - EXPECT_EQ(balancers_[0]->ads_service()->cds_response_state(), - AdsServiceImpl::ACKED); + EXPECT_EQ(balancers_[0]->ads_service()->cds_response_state().state, + AdsServiceImpl::ResponseState::ACKED); } // Tests that CDS client should send a NACK if the cluster type in CDS response @@ -2698,8 +2742,10 @@ TEST_P(CdsTest, WrongClusterType) { SetNextResolution({}); SetNextResolutionForLbChannelAllBalancers(); CheckRpcSendFailure(); - EXPECT_EQ(balancers_[0]->ads_service()->cds_response_state(), - AdsServiceImpl::NACKED); + const auto& response_state = + balancers_[0]->ads_service()->cds_response_state(); + EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED); + EXPECT_EQ(response_state.error_message, "DiscoveryType is not EDS."); } // Tests that CDS client should send a NACK if the eds_config in CDS response is @@ -2711,8 +2757,10 @@ TEST_P(CdsTest, WrongEdsConfig) { SetNextResolution({}); SetNextResolutionForLbChannelAllBalancers(); CheckRpcSendFailure(); - EXPECT_EQ(balancers_[0]->ads_service()->cds_response_state(), - AdsServiceImpl::NACKED); + const auto& response_state = + balancers_[0]->ads_service()->cds_response_state(); + EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED); + EXPECT_EQ(response_state.error_message, "EDS ConfigSource is not ADS."); } // Tests that CDS client should send a NACK if the lb_policy in CDS response is @@ -2724,8 +2772,10 @@ TEST_P(CdsTest, WrongLbPolicy) { SetNextResolution({}); SetNextResolutionForLbChannelAllBalancers(); CheckRpcSendFailure(); - EXPECT_EQ(balancers_[0]->ads_service()->cds_response_state(), - AdsServiceImpl::NACKED); + const auto& response_state = + balancers_[0]->ads_service()->cds_response_state(); + EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED); + EXPECT_EQ(response_state.error_message, "LB policy is not ROUND_ROBIN."); } // Tests that CDS client should send a NACK if the lrs_server in CDS response is @@ -2737,8 +2787,10 @@ TEST_P(CdsTest, WrongLrsServer) { SetNextResolution({}); SetNextResolutionForLbChannelAllBalancers(); CheckRpcSendFailure(); - EXPECT_EQ(balancers_[0]->ads_service()->cds_response_state(), - AdsServiceImpl::NACKED); + const auto& response_state = + balancers_[0]->ads_service()->cds_response_state(); + EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED); + EXPECT_EQ(response_state.error_message, "LRS ConfigSource is not self."); } // Tests that CDS client times out when no response received. @@ -2771,8 +2823,11 @@ TEST_P(EdsTest, NacksSparsePriorityList) { balancers_[0]->ads_service()->SetEdsResource( AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); CheckRpcSendFailure(); - EXPECT_EQ(balancers_[0]->ads_service()->eds_response_state(), - AdsServiceImpl::NACKED); + const auto& response_state = + balancers_[0]->ads_service()->eds_response_state(); + EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED); + EXPECT_EQ(response_state.error_message, + "EDS update includes sparse priority list"); } using LocalityMapTest = BasicTest; @@ -3221,8 +3276,8 @@ TEST_P(FailoverTest, MoveAllLocalitiesInCurrentPriorityToHigherPriority) { // When backend 3 gets traffic, we know the second update has been seen. WaitForBackend(3); // The ADS service of balancer 0 got at least 1 response. - EXPECT_GT(balancers_[0]->ads_service()->eds_response_state(), - AdsServiceImpl::NOT_SENT); + EXPECT_GT(balancers_[0]->ads_service()->eds_response_state().state, + AdsServiceImpl::ResponseState::NOT_SENT); delayed_resource_setter.join(); } @@ -3495,12 +3550,12 @@ TEST_P(BalancerUpdateTest, UpdateBalancersButKeepUsingOriginalBalancer) { // All 10 requests should have gone to the first backend. EXPECT_EQ(10U, backends_[0]->backend_service()->request_count()); // The ADS service of balancer 0 sent at least 1 response. - EXPECT_GT(balancers_[0]->ads_service()->eds_response_state(), - AdsServiceImpl::NOT_SENT); - EXPECT_EQ(balancers_[1]->ads_service()->eds_response_state(), - AdsServiceImpl::NOT_SENT); - EXPECT_EQ(balancers_[2]->ads_service()->eds_response_state(), - AdsServiceImpl::NOT_SENT); + EXPECT_GT(balancers_[0]->ads_service()->eds_response_state().state, + AdsServiceImpl::ResponseState::NOT_SENT); + EXPECT_EQ(balancers_[1]->ads_service()->eds_response_state().state, + AdsServiceImpl::ResponseState::NOT_SENT); + EXPECT_EQ(balancers_[2]->ads_service()->eds_response_state().state, + AdsServiceImpl::ResponseState::NOT_SENT); gpr_log(GPR_INFO, "========= ABOUT TO UPDATE 1 =========="); SetNextResolutionForLbChannel({balancers_[1]->port()}); gpr_log(GPR_INFO, "========= UPDATE 1 DONE =========="); @@ -3515,12 +3570,12 @@ TEST_P(BalancerUpdateTest, UpdateBalancersButKeepUsingOriginalBalancer) { // first balancer, which doesn't assign the second backend. EXPECT_EQ(0U, backends_[1]->backend_service()->request_count()); // The ADS service of balancer 0 sent at least 1 response. - EXPECT_GT(balancers_[0]->ads_service()->eds_response_state(), - AdsServiceImpl::NOT_SENT); - EXPECT_EQ(balancers_[1]->ads_service()->eds_response_state(), - AdsServiceImpl::NOT_SENT); - EXPECT_EQ(balancers_[2]->ads_service()->eds_response_state(), - AdsServiceImpl::NOT_SENT); + EXPECT_GT(balancers_[0]->ads_service()->eds_response_state().state, + AdsServiceImpl::ResponseState::NOT_SENT); + EXPECT_EQ(balancers_[1]->ads_service()->eds_response_state().state, + AdsServiceImpl::ResponseState::NOT_SENT); + EXPECT_EQ(balancers_[2]->ads_service()->eds_response_state().state, + AdsServiceImpl::ResponseState::NOT_SENT); } // Tests that the old LB call is still used after multiple balancer address @@ -3550,12 +3605,12 @@ TEST_P(BalancerUpdateTest, Repeated) { // All 10 requests should have gone to the first backend. EXPECT_EQ(10U, backends_[0]->backend_service()->request_count()); // The ADS service of balancer 0 sent at least 1 response. - EXPECT_GT(balancers_[0]->ads_service()->eds_response_state(), - AdsServiceImpl::NOT_SENT); - EXPECT_EQ(balancers_[1]->ads_service()->eds_response_state(), - AdsServiceImpl::NOT_SENT); - EXPECT_EQ(balancers_[2]->ads_service()->eds_response_state(), - AdsServiceImpl::NOT_SENT); + EXPECT_GT(balancers_[0]->ads_service()->eds_response_state().state, + AdsServiceImpl::ResponseState::NOT_SENT); + EXPECT_EQ(balancers_[1]->ads_service()->eds_response_state().state, + AdsServiceImpl::ResponseState::NOT_SENT); + EXPECT_EQ(balancers_[2]->ads_service()->eds_response_state().state, + AdsServiceImpl::ResponseState::NOT_SENT); std::vector ports; ports.emplace_back(balancers_[0]->port()); ports.emplace_back(balancers_[1]->port()); @@ -3614,12 +3669,12 @@ TEST_P(BalancerUpdateTest, DeadUpdate) { // All 10 requests should have gone to the first backend. EXPECT_EQ(10U, backends_[0]->backend_service()->request_count()); // The ADS service of balancer 0 sent at least 1 response. - EXPECT_GT(balancers_[0]->ads_service()->eds_response_state(), - AdsServiceImpl::NOT_SENT); - EXPECT_EQ(balancers_[1]->ads_service()->eds_response_state(), - AdsServiceImpl::NOT_SENT); - EXPECT_EQ(balancers_[2]->ads_service()->eds_response_state(), - AdsServiceImpl::NOT_SENT); + EXPECT_GT(balancers_[0]->ads_service()->eds_response_state().state, + AdsServiceImpl::ResponseState::NOT_SENT); + EXPECT_EQ(balancers_[1]->ads_service()->eds_response_state().state, + AdsServiceImpl::ResponseState::NOT_SENT); + EXPECT_EQ(balancers_[2]->ads_service()->eds_response_state().state, + AdsServiceImpl::ResponseState::NOT_SENT); // Kill balancer 0 gpr_log(GPR_INFO, "********** ABOUT TO KILL BALANCER 0 *************"); balancers_[0]->Shutdown(); @@ -3632,12 +3687,12 @@ TEST_P(BalancerUpdateTest, DeadUpdate) { EXPECT_EQ(20U, backends_[0]->backend_service()->request_count()); EXPECT_EQ(0U, backends_[1]->backend_service()->request_count()); // The ADS service of no balancers sent anything - EXPECT_EQ(balancers_[0]->ads_service()->eds_response_state(), - AdsServiceImpl::NOT_SENT); - EXPECT_EQ(balancers_[1]->ads_service()->eds_response_state(), - AdsServiceImpl::NOT_SENT); - EXPECT_EQ(balancers_[2]->ads_service()->eds_response_state(), - AdsServiceImpl::NOT_SENT); + EXPECT_EQ(balancers_[0]->ads_service()->eds_response_state().state, + AdsServiceImpl::ResponseState::NOT_SENT); + EXPECT_EQ(balancers_[1]->ads_service()->eds_response_state().state, + AdsServiceImpl::ResponseState::NOT_SENT); + EXPECT_EQ(balancers_[2]->ads_service()->eds_response_state().state, + AdsServiceImpl::ResponseState::NOT_SENT); gpr_log(GPR_INFO, "========= ABOUT TO UPDATE 1 =========="); SetNextResolutionForLbChannel({balancers_[1]->port()}); gpr_log(GPR_INFO, "========= UPDATE 1 DONE =========="); @@ -3654,12 +3709,12 @@ TEST_P(BalancerUpdateTest, DeadUpdate) { // All 10 requests should have gone to the second backend. EXPECT_EQ(10U, backends_[1]->backend_service()->request_count()); // The ADS service of balancer 1 sent at least 1 response. - EXPECT_EQ(balancers_[0]->ads_service()->eds_response_state(), - AdsServiceImpl::NOT_SENT); - EXPECT_GT(balancers_[1]->ads_service()->eds_response_state(), - AdsServiceImpl::NOT_SENT); - EXPECT_EQ(balancers_[2]->ads_service()->eds_response_state(), - AdsServiceImpl::NOT_SENT); + EXPECT_EQ(balancers_[0]->ads_service()->eds_response_state().state, + AdsServiceImpl::ResponseState::NOT_SENT); + EXPECT_GT(balancers_[1]->ads_service()->eds_response_state().state, + AdsServiceImpl::ResponseState::NOT_SENT); + EXPECT_EQ(balancers_[2]->ads_service()->eds_response_state().state, + AdsServiceImpl::ResponseState::NOT_SENT); } // The re-resolution tests are deferred because they rely on the fallback mode, From f6e6b9f64032a2ba9119acb120dd2c2f30391446 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Thu, 30 Apr 2020 15:14:54 -0700 Subject: [PATCH 666/758] Fix the pylint complain --- examples/python/data_transmission/alts_client.py | 11 ++++++----- examples/python/data_transmission/alts_server.py | 5 +++-- src/python/grpcio/grpc/__init__.py | 4 ++-- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/examples/python/data_transmission/alts_client.py b/examples/python/data_transmission/alts_client.py index d196dbd17c2..eb328667cd6 100644 --- a/examples/python/data_transmission/alts_client.py +++ b/examples/python/data_transmission/alts_client.py @@ -17,8 +17,9 @@ The example would only successfully run in GCP environment.""" import grpc -import client import demo_pb2_grpc +from client import (bidirectional_streaming_method, client_streaming_method, + server_streaming_method, simple_method) SERVER_ADDRESS = "localhost:23333" @@ -28,10 +29,10 @@ def main(): SERVER_ADDRESS, credentials=grpc.alts_channel_credentials()) as channel: stub = demo_pb2_grpc.GRPCDemoStub(channel) - client.simple_method(stub) - client.client_streaming_method(stub) - client.server_streaming_method(stub) - client.bidirectional_streaming_method(stub) + simple_method(stub) + client_streaming_method(stub) + server_streaming_method(stub) + bidirectional_streaming_method(stub) if __name__ == '__main__': diff --git a/examples/python/data_transmission/alts_server.py b/examples/python/data_transmission/alts_server.py index 7f1d2f8983d..4e8747ce7a9 100644 --- a/examples/python/data_transmission/alts_server.py +++ b/examples/python/data_transmission/alts_server.py @@ -18,15 +18,16 @@ The example would only successfully run in GCP environment.""" from concurrent import futures import grpc + import demo_pb2_grpc -import server +from server import DemoServer SERVER_ADDRESS = 'localhost:23333' def main(): svr = grpc.server(futures.ThreadPoolExecutor()) - demo_pb2_grpc.add_GRPCDemoServicer_to_server(server.DemoServer(), svr) + demo_pb2_grpc.add_GRPCDemoServicer_to_server(DemoServer(), svr) svr.add_secure_port(SERVER_ADDRESS, server_credentials=grpc.alts_server_credentials()) print("------------------start Python GRPC server with ALTS encryption") diff --git a/src/python/grpcio/grpc/__init__.py b/src/python/grpcio/grpc/__init__.py index f4c261c23f2..303d89c6263 100644 --- a/src/python/grpcio/grpc/__init__.py +++ b/src/python/grpcio/grpc/__init__.py @@ -1833,7 +1833,7 @@ def local_server_credentials(local_connect_type=LocalConnectionType.LOCAL_TCP): _cygrpc.server_credentials_local(local_connect_type.value)) -def alts_channel_credentials(service_accounts=[]): +def alts_channel_credentials(service_accounts=None): """Creates a ChannelCredentials for use with an ALTS-enabled Channel. This is an EXPERIMENTAL API. @@ -1851,7 +1851,7 @@ def alts_channel_credentials(service_accounts=[]): A ChannelCredentials for use with an ALTS-enabled Channel """ return ChannelCredentials( - _cygrpc.channel_credentials_alts(service_accounts)) + _cygrpc.channel_credentials_alts(service_accounts or [])) def alts_server_credentials(): From 6a6481cb8378cec31bf043ded593d8c07c56b46d Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Thu, 30 Apr 2020 15:44:48 -0700 Subject: [PATCH 667/758] Reviewer comments --- include/grpcpp/impl/codegen/call_op_set.h | 4 ---- 1 file changed, 4 deletions(-) diff --git a/include/grpcpp/impl/codegen/call_op_set.h b/include/grpcpp/impl/codegen/call_op_set.h index 79fa08ad6dc..994b9998390 100644 --- a/include/grpcpp/impl/codegen/call_op_set.h +++ b/include/grpcpp/impl/codegen/call_op_set.h @@ -421,8 +421,6 @@ Status CallOpSendMessage::SendMessagePtr(const M* message) { template class CallOpRecvMessage { public: - CallOpRecvMessage() {} - void RecvMessage(R* message) { message_ = message; } // Do not change status if no message is received. @@ -525,8 +523,6 @@ class DeserializeFuncType final : public DeserializeFunc { class CallOpGenericRecvMessage { public: - CallOpGenericRecvMessage() {} - template void RecvMessage(R* message) { // Use an explicit base class pointer to avoid resolution error in the From 88e43d9901ebb0c948c3cdef900e397c41cc41c8 Mon Sep 17 00:00:00 2001 From: yang-g Date: Thu, 30 Apr 2020 15:46:47 -0700 Subject: [PATCH 668/758] Adjust wait timeout according to test slowdown factor --- test/core/util/test_config.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/core/util/test_config.cc b/test/core/util/test_config.cc index 115a9833c44..c6ee9fc2400 100644 --- a/test/core/util/test_config.cc +++ b/test/core/util/test_config.cc @@ -18,6 +18,7 @@ #include "test/core/util/test_config.h" +#include #include #include #include @@ -402,13 +403,12 @@ TestEnvironment::TestEnvironment(int argc, char** argv) { TestEnvironment::~TestEnvironment() { // This will wait until gRPC shutdown has actually happened to make sure // no gRPC resources (such as thread) are active. (timeout = 10s) - gpr_timespec timeout = gpr_time_add(gpr_now(GPR_CLOCK_REALTIME), - gpr_time_from_seconds(10, GPR_TIMESPAN)); + gpr_timespec deadline = grpc_timeout_seconds_to_deadline(10); while (grpc_is_initialized()) { grpc_maybe_wait_for_async_shutdown(); gpr_sleep_until(gpr_time_add(gpr_now(GPR_CLOCK_REALTIME), gpr_time_from_millis(1, GPR_TIMESPAN))); - if (gpr_time_cmp(gpr_now(GPR_CLOCK_REALTIME), timeout) > 0) { + if (gpr_time_cmp(gpr_now(GPR_CLOCK_MONOTONIC), deadline) > 0) { gpr_log(GPR_ERROR, "Timeout in waiting for gRPC shutdown"); break; } From 72a42151edcf6d60da129d8baa264281fbeda137 Mon Sep 17 00:00:00 2001 From: "Mark D. Roth" Date: Fri, 1 May 2020 07:23:01 -0700 Subject: [PATCH 669/758] xds: Check RDS ConfigSource in LDS response. --- .../ext/filters/client_channel/xds/xds_api.cc | 14 +++++- test/cpp/end2end/xds_end2end_test.cc | 46 ++++++++++++++++++- 2 files changed, 57 insertions(+), 3 deletions(-) diff --git a/src/core/ext/filters/client_channel/xds/xds_api.cc b/src/core/ext/filters/client_channel/xds/xds_api.cc index 60ca930e060..f124052ce84 100644 --- a/src/core/ext/filters/client_channel/xds/xds_api.cc +++ b/src/core/ext/filters/client_channel/xds/xds_api.cc @@ -1174,10 +1174,22 @@ grpc_error* LdsResponseParse(XdsClient* client, TraceFlag* tracer, return GRPC_ERROR_CREATE_FROM_STATIC_STRING( "HttpConnectionManager neither has inlined route_config nor RDS."); } - // Get the route_config_name. const envoy_config_filter_network_http_connection_manager_v2_Rds* rds = envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_rds( http_connection_manager); + // Check that the ConfigSource specifies ADS. + const envoy_api_v2_core_ConfigSource* config_source = + envoy_config_filter_network_http_connection_manager_v2_Rds_config_source( + rds); + if (config_source == nullptr) { + return GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "HttpConnectionManager missing config_source for RDS."); + } + if (!envoy_api_v2_core_ConfigSource_has_ads(config_source)) { + return GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "HttpConnectionManager ConfigSource for RDS does not specify ADS."); + } + // Get the route_config_name. const upb_strview route_config_name = envoy_config_filter_network_http_connection_manager_v2_Rds_route_config_name( rds); diff --git a/test/cpp/end2end/xds_end2end_test.cc b/test/cpp/end2end/xds_end2end_test.cc index 5fb6a62b19d..7d70feadbad 100644 --- a/test/cpp/end2end/xds_end2end_test.cc +++ b/test/cpp/end2end/xds_end2end_test.cc @@ -713,8 +713,9 @@ class AdsServiceImpl : public AggregatedDiscoveryService::Service, void SetLdsToUseDynamicRds() { auto listener = default_listener_; HttpConnectionManager http_connection_manager; - http_connection_manager.mutable_rds()->set_route_config_name( - kDefaultResourceName); + auto* rds = http_connection_manager.mutable_rds(); + rds->set_route_config_name(kDefaultResourceName); + rds->mutable_config_source()->mutable_ads(); listener.mutable_api_listener()->mutable_api_listener()->PackFrom( http_connection_manager); SetLdsResource(listener, kDefaultResourceName); @@ -2191,6 +2192,47 @@ TEST_P(LdsTest, WrongRouteSpecifier) { "HttpConnectionManager neither has inlined route_config nor RDS."); } +// Tests that LDS client should send a NACK if the rds message in the +// http_connection_manager is missing the config_source field. +TEST_P(LdsTest, RdsMissingConfigSource) { + auto listener = balancers_[0]->ads_service()->default_listener(); + HttpConnectionManager http_connection_manager; + http_connection_manager.mutable_rds()->set_route_config_name( + kDefaultResourceName); + listener.mutable_api_listener()->mutable_api_listener()->PackFrom( + http_connection_manager); + balancers_[0]->ads_service()->SetLdsResource(listener, kDefaultResourceName); + SetNextResolution({}); + SetNextResolutionForLbChannelAllBalancers(); + CheckRpcSendFailure(); + const auto& response_state = + balancers_[0]->ads_service()->lds_response_state(); + EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED); + EXPECT_EQ(response_state.error_message, + "HttpConnectionManager missing config_source for RDS."); +} + +// Tests that LDS client should send a NACK if the rds message in the +// http_connection_manager has a config_source field that does not specify ADS. +TEST_P(LdsTest, RdsConfigSourceDoesNotSpecifyAds) { + auto listener = balancers_[0]->ads_service()->default_listener(); + HttpConnectionManager http_connection_manager; + auto* rds = http_connection_manager.mutable_rds(); + rds->set_route_config_name(kDefaultResourceName); + rds->mutable_config_source()->mutable_self(); + listener.mutable_api_listener()->mutable_api_listener()->PackFrom( + http_connection_manager); + balancers_[0]->ads_service()->SetLdsResource(listener, kDefaultResourceName); + SetNextResolution({}); + SetNextResolutionForLbChannelAllBalancers(); + CheckRpcSendFailure(); + const auto& response_state = + balancers_[0]->ads_service()->lds_response_state(); + EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED); + EXPECT_EQ(response_state.error_message, + "HttpConnectionManager ConfigSource for RDS does not specify ADS."); +} + using LdsRdsTest = BasicTest; // Tests that LDS client should send an ACK upon correct LDS response (with From eb2b24ce25a134beea04a0fdc5593539e7a1a7d9 Mon Sep 17 00:00:00 2001 From: Muxi Yan Date: Fri, 1 May 2020 16:21:42 -0700 Subject: [PATCH 670/758] Patch typo --- src/core/lib/iomgr/iomgr_posix_cfstream.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/lib/iomgr/iomgr_posix_cfstream.cc b/src/core/lib/iomgr/iomgr_posix_cfstream.cc index 24f9f4101b2..30c44edb5d6 100644 --- a/src/core/lib/iomgr/iomgr_posix_cfstream.cc +++ b/src/core/lib/iomgr/iomgr_posix_cfstream.cc @@ -25,7 +25,7 @@ /// platforms), the users can disable CFStream with environment variable /// "grpc_cfstream=0". This will let gRPC to fallback to use POSIX sockets. In /// addition, the users may choose to use an alternative CFRunLoop based pollset -/// "ev_apple" by setting environment variable "grpc_cfstream_run_loop=1". This +/// "ev_apple" by setting environment variable "GRPC_CFSTREAM_RUN_LOOP=1". This /// pollset resolves a bug from Apple when CFStream streams dispatch events to /// dispatch queues. The caveat of this pollset is that users may not be able to /// run a gRPC server in the same process. From 9f6ce14dd97fa537fb9c0c251b46fb40d4471edd Mon Sep 17 00:00:00 2001 From: Muxi Yan Date: Fri, 1 May 2020 16:30:39 -0700 Subject: [PATCH 671/758] Update CFStream doc with CFRunLoop poller info --- src/objective-c/README-CFSTREAM.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/objective-c/README-CFSTREAM.md b/src/objective-c/README-CFSTREAM.md index d4d26828534..7d75d47a606 100644 --- a/src/objective-c/README-CFSTREAM.md +++ b/src/objective-c/README-CFSTREAM.md @@ -23,8 +23,18 @@ platforms, you can turn it on with macro `GRPC_CFSTREAM=1` for the pod 'gRPC-Cor case of problem and you want to disable CFStream on iOS, you can set environment variable "grpc\_cfstream=0". +## Caveats +It is known to us that the CFStream API has some bug which will cause gRPC's CFStream networking +layer to stall occasionally. The issue mostly occur on MacOS systems (including iOS simulators on +MacOS); iOS may be affected too but we have not seen issue there. gRPC provides a workaround to this +problem with an alternative poller based on CFRunLoop. The poller can be enabled by setting +environment variable `GRPC_CFSTREAM_RUN_LOOP=1`. Note that the poller is a client side only poller +that does not support running a server on it. That means if an app opts in to the CFRunLoop-based +poller, the app cannot host a gRPC server (gRPC Objective-C does not support running a server but +other languages running on iOS do support it). + ## Notes - Currently we do not support platforms other than iOS, although it is likely that this integration can run on MacOS targets with Apple's compiler. -- Let us know if you meet any issue by filing issue and ping @muxi. +- Let us know if you meet any issue by filing issue and ping @stanleycheung. From 5557f80ac41ea6ef4f1542009280346c6ed949cd Mon Sep 17 00:00:00 2001 From: Donna Dionne Date: Mon, 4 May 2020 10:36:27 -0700 Subject: [PATCH 672/758] Passing C repo manager to markdroth --- .github/ISSUE_TEMPLATE/bug_report.md | 2 +- .github/ISSUE_TEMPLATE/cleanup_request.md | 2 +- .github/ISSUE_TEMPLATE/feature_request.md | 2 +- .github/pull_request_template.md | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 680cd706703..9011a669d3d 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -2,7 +2,7 @@ name: Report a bug about: Create a report to help us improve labels: kind/bug, priority/P2 -assignees: donnadionne +assignees: markdroth --- diff --git a/.github/ISSUE_TEMPLATE/cleanup_request.md b/.github/ISSUE_TEMPLATE/cleanup_request.md index 96c8bda3c4c..9cf36e6fa0b 100644 --- a/.github/ISSUE_TEMPLATE/cleanup_request.md +++ b/.github/ISSUE_TEMPLATE/cleanup_request.md @@ -2,7 +2,7 @@ name: Request a cleanup about: Suggest a cleanup in our repository labels: kind/internal cleanup, priority/P2 -assignees: donnadionne +assignees: markdroth --- diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index a7b05e99004..0d9906a9eb0 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -2,7 +2,7 @@ name: Request a feature about: Suggest an idea for this project labels: kind/enhancement, priority/P2 -assignees: donnadionne +assignees: markdroth --- diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index eddba6676da..a85cfad9c7a 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -8,4 +8,4 @@ If you know who should review your pull request, please remove the mentioning be --> -@donnadionne +@markdroth From 5d8a5ef8c7c99f68022e7ad30fba30eeca333940 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Thu, 30 Apr 2020 11:07:58 -0700 Subject: [PATCH 673/758] Add AsyncIO support for grpcio-channelz --- .../grpc_channelz/v1/BUILD.bazel | 2 +- .../grpc_channelz/v1/_async.py | 66 +++ .../grpc_channelz/v1/_servicer.py | 120 +++++ .../grpc_channelz/v1/channelz.py | 177 +++---- .../tests_aio/channelz/BUILD.bazel | 29 ++ .../tests_aio/channelz/__init__.py | 13 + .../channelz/channelz_servicer_test.py | 446 ++++++++++++++++++ src/python/grpcio_tests/tests_aio/tests.json | 1 + 8 files changed, 730 insertions(+), 124 deletions(-) create mode 100644 src/python/grpcio_channelz/grpc_channelz/v1/_async.py create mode 100644 src/python/grpcio_channelz/grpc_channelz/v1/_servicer.py create mode 100644 src/python/grpcio_tests/tests_aio/channelz/BUILD.bazel create mode 100644 src/python/grpcio_tests/tests_aio/channelz/__init__.py create mode 100644 src/python/grpcio_tests/tests_aio/channelz/channelz_servicer_test.py diff --git a/src/python/grpcio_channelz/grpc_channelz/v1/BUILD.bazel b/src/python/grpcio_channelz/grpc_channelz/v1/BUILD.bazel index 942d861b158..d2393b06e0a 100644 --- a/src/python/grpcio_channelz/grpc_channelz/v1/BUILD.bazel +++ b/src/python/grpcio_channelz/grpc_channelz/v1/BUILD.bazel @@ -16,7 +16,7 @@ py_grpc_library( py_library( name = "grpc_channelz", - srcs = ["channelz.py"], + srcs = glob(["*.py"]), imports = ["../../"], deps = [ ":channelz_py_pb2", diff --git a/src/python/grpcio_channelz/grpc_channelz/v1/_async.py b/src/python/grpcio_channelz/grpc_channelz/v1/_async.py new file mode 100644 index 00000000000..50911b0fd95 --- /dev/null +++ b/src/python/grpcio_channelz/grpc_channelz/v1/_async.py @@ -0,0 +1,66 @@ +# Copyright 2020 The gRPC Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""AsyncIO version of Channelz servicer.""" + +from grpc.experimental import aio + +import grpc_channelz.v1.channelz_pb2 as _channelz_pb2 +import grpc_channelz.v1.channelz_pb2_grpc as _channelz_pb2_grpc +from grpc_channelz.v1._servicer import ChannelzServicer as _SyncChannelzServicer + + +class ChannelzServicer(_channelz_pb2_grpc.ChannelzServicer): + """AsyncIO servicer for handling RPCs for service statuses.""" + + @staticmethod + async def GetTopChannels(request: _channelz_pb2.GetTopChannelsRequest, + context: aio.ServicerContext + ) -> _channelz_pb2.GetTopChannelsResponse: + return _SyncChannelzServicer.GetTopChannels(request, context) + + @staticmethod + async def GetServers(request: _channelz_pb2.GetServersRequest, + context: aio.ServicerContext + ) -> _channelz_pb2.GetServersResponse: + return _SyncChannelzServicer.GetServers(request, context) + + @staticmethod + async def GetServer(request: _channelz_pb2.GetServerRequest, + context: aio.ServicerContext + ) -> _channelz_pb2.GetServerResponse: + return _SyncChannelzServicer.GetServer(request, context) + + @staticmethod + async def GetServerSockets(request: _channelz_pb2.GetServerSocketsRequest, + context: aio.ServicerContext + ) -> _channelz_pb2.GetServerSocketsResponse: + return _SyncChannelzServicer.GetServerSockets(request, context) + + @staticmethod + async def GetChannel(request: _channelz_pb2.GetChannelRequest, + context: aio.ServicerContext + ) -> _channelz_pb2.GetChannelResponse: + return _SyncChannelzServicer.GetChannel(request, context) + + @staticmethod + async def GetSubchannel(request: _channelz_pb2.GetSubchannelRequest, + context: aio.ServicerContext + ) -> _channelz_pb2.GetSubchannelResponse: + return _SyncChannelzServicer.GetSubchannel(request, context) + + @staticmethod + async def GetSocket(request: _channelz_pb2.GetSocketRequest, + context: aio.ServicerContext + ) -> _channelz_pb2.GetSocketResponse: + return _SyncChannelzServicer.GetSocket(request, context) diff --git a/src/python/grpcio_channelz/grpc_channelz/v1/_servicer.py b/src/python/grpcio_channelz/grpc_channelz/v1/_servicer.py new file mode 100644 index 00000000000..6ba28f56a39 --- /dev/null +++ b/src/python/grpcio_channelz/grpc_channelz/v1/_servicer.py @@ -0,0 +1,120 @@ +# Copyright 2020 The gRPC Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Channelz debug service implementation in gRPC Python.""" + +import grpc +from grpc._cython import cygrpc + +import grpc_channelz.v1.channelz_pb2 as _channelz_pb2 +import grpc_channelz.v1.channelz_pb2_grpc as _channelz_pb2_grpc + +from google.protobuf import json_format + + +class ChannelzServicer(_channelz_pb2_grpc.ChannelzServicer): + """Servicer handling RPCs for service statuses.""" + + @staticmethod + def GetTopChannels(request, context): + try: + return json_format.Parse( + cygrpc.channelz_get_top_channels(request.start_channel_id), + _channelz_pb2.GetTopChannelsResponse(), + ) + except (ValueError, json_format.ParseError) as e: + context.set_code(grpc.StatusCode.INTERNAL) + context.set_details(str(e)) + + @staticmethod + def GetServers(request, context): + try: + return json_format.Parse( + cygrpc.channelz_get_servers(request.start_server_id), + _channelz_pb2.GetServersResponse(), + ) + except (ValueError, json_format.ParseError) as e: + context.set_code(grpc.StatusCode.INTERNAL) + context.set_details(str(e)) + + @staticmethod + def GetServer(request, context): + try: + return json_format.Parse( + cygrpc.channelz_get_server(request.server_id), + _channelz_pb2.GetServerResponse(), + ) + except ValueError as e: + context.set_code(grpc.StatusCode.NOT_FOUND) + context.set_details(str(e)) + except json_format.ParseError as e: + context.set_code(grpc.StatusCode.INTERNAL) + context.set_details(str(e)) + + @staticmethod + def GetServerSockets(request, context): + try: + return json_format.Parse( + cygrpc.channelz_get_server_sockets(request.server_id, + request.start_socket_id, + request.max_results), + _channelz_pb2.GetServerSocketsResponse(), + ) + except ValueError as e: + context.set_code(grpc.StatusCode.NOT_FOUND) + context.set_details(str(e)) + except json_format.ParseError as e: + context.set_code(grpc.StatusCode.INTERNAL) + context.set_details(str(e)) + + @staticmethod + def GetChannel(request, context): + try: + return json_format.Parse( + cygrpc.channelz_get_channel(request.channel_id), + _channelz_pb2.GetChannelResponse(), + ) + except ValueError as e: + context.set_code(grpc.StatusCode.NOT_FOUND) + context.set_details(str(e)) + except json_format.ParseError as e: + context.set_code(grpc.StatusCode.INTERNAL) + context.set_details(str(e)) + + @staticmethod + def GetSubchannel(request, context): + try: + return json_format.Parse( + cygrpc.channelz_get_subchannel(request.subchannel_id), + _channelz_pb2.GetSubchannelResponse(), + ) + except ValueError as e: + context.set_code(grpc.StatusCode.NOT_FOUND) + context.set_details(str(e)) + except json_format.ParseError as e: + context.set_code(grpc.StatusCode.INTERNAL) + context.set_details(str(e)) + + @staticmethod + def GetSocket(request, context): + try: + return json_format.Parse( + cygrpc.channelz_get_socket(request.socket_id), + _channelz_pb2.GetSocketResponse(), + ) + except ValueError as e: + context.set_code(grpc.StatusCode.NOT_FOUND) + context.set_details(str(e)) + except json_format.ParseError as e: + context.set_code(grpc.StatusCode.INTERNAL) + context.set_details(str(e)) diff --git a/src/python/grpcio_channelz/grpc_channelz/v1/channelz.py b/src/python/grpcio_channelz/grpc_channelz/v1/channelz.py index 00eca311dc1..508fad53974 100644 --- a/src/python/grpcio_channelz/grpc_channelz/v1/channelz.py +++ b/src/python/grpcio_channelz/grpc_channelz/v1/channelz.py @@ -13,130 +13,61 @@ # limitations under the License. """Channelz debug service implementation in gRPC Python.""" +import sys import grpc -from grpc._cython import cygrpc -import grpc_channelz.v1.channelz_pb2 as _channelz_pb2 import grpc_channelz.v1.channelz_pb2_grpc as _channelz_pb2_grpc +from grpc_channelz.v1._servicer import ChannelzServicer -from google.protobuf import json_format - - -class ChannelzServicer(_channelz_pb2_grpc.ChannelzServicer): - """Servicer handling RPCs for service statuses.""" - - @staticmethod - def GetTopChannels(request, context): - try: - return json_format.Parse( - cygrpc.channelz_get_top_channels(request.start_channel_id), - _channelz_pb2.GetTopChannelsResponse(), - ) - except (ValueError, json_format.ParseError) as e: - context.set_code(grpc.StatusCode.INTERNAL) - context.set_details(str(e)) - - @staticmethod - def GetServers(request, context): - try: - return json_format.Parse( - cygrpc.channelz_get_servers(request.start_server_id), - _channelz_pb2.GetServersResponse(), - ) - except (ValueError, json_format.ParseError) as e: - context.set_code(grpc.StatusCode.INTERNAL) - context.set_details(str(e)) - - @staticmethod - def GetServer(request, context): - try: - return json_format.Parse( - cygrpc.channelz_get_server(request.server_id), - _channelz_pb2.GetServerResponse(), - ) - except ValueError as e: - context.set_code(grpc.StatusCode.NOT_FOUND) - context.set_details(str(e)) - except json_format.ParseError as e: - context.set_code(grpc.StatusCode.INTERNAL) - context.set_details(str(e)) - - @staticmethod - def GetServerSockets(request, context): - try: - return json_format.Parse( - cygrpc.channelz_get_server_sockets(request.server_id, - request.start_socket_id, - request.max_results), - _channelz_pb2.GetServerSocketsResponse(), - ) - except ValueError as e: - context.set_code(grpc.StatusCode.NOT_FOUND) - context.set_details(str(e)) - except json_format.ParseError as e: - context.set_code(grpc.StatusCode.INTERNAL) - context.set_details(str(e)) - - @staticmethod - def GetChannel(request, context): - try: - return json_format.Parse( - cygrpc.channelz_get_channel(request.channel_id), - _channelz_pb2.GetChannelResponse(), - ) - except ValueError as e: - context.set_code(grpc.StatusCode.NOT_FOUND) - context.set_details(str(e)) - except json_format.ParseError as e: - context.set_code(grpc.StatusCode.INTERNAL) - context.set_details(str(e)) - - @staticmethod - def GetSubchannel(request, context): - try: - return json_format.Parse( - cygrpc.channelz_get_subchannel(request.subchannel_id), - _channelz_pb2.GetSubchannelResponse(), - ) - except ValueError as e: - context.set_code(grpc.StatusCode.NOT_FOUND) - context.set_details(str(e)) - except json_format.ParseError as e: - context.set_code(grpc.StatusCode.INTERNAL) - context.set_details(str(e)) - - @staticmethod - def GetSocket(request, context): - try: - return json_format.Parse( - cygrpc.channelz_get_socket(request.socket_id), - _channelz_pb2.GetSocketResponse(), - ) - except ValueError as e: - context.set_code(grpc.StatusCode.NOT_FOUND) - context.set_details(str(e)) - except json_format.ParseError as e: - context.set_code(grpc.StatusCode.INTERNAL) - context.set_details(str(e)) - - -def add_channelz_servicer(server): - """Add Channelz servicer to a server. Channelz servicer is in charge of - pulling information from C-Core for entire process. It will allow the - server to response to Channelz queries. - - The Channelz statistic is enabled by default inside C-Core. Whether the - statistic is enabled or not is isolated from adding Channelz servicer. - That means you can query Channelz info with a Channelz-disabled channel, - and you can add Channelz servicer to a Channelz-disabled server. - - The Channelz statistic can be enabled or disabled by channel option - 'grpc.enable_channelz'. Set to 1 to enable, set to 0 to disable. - - This is an EXPERIMENTAL API. - - Args: - server: grpc.Server to which Channelz service will be added. - """ - _channelz_pb2_grpc.add_ChannelzServicer_to_server(ChannelzServicer(), - server) +_add_channelz_servicer_doc = """Add Channelz servicer to a server. + +Channelz servicer is in charge of +pulling information from C-Core for entire process. It will allow the +server to response to Channelz queries. + +The Channelz statistic is enabled by default inside C-Core. Whether the +statistic is enabled or not is isolated from adding Channelz servicer. +That means you can query Channelz info with a Channelz-disabled channel, +and you can add Channelz servicer to a Channelz-disabled server. + +The Channelz statistic can be enabled or disabled by channel option +'grpc.enable_channelz'. Set to 1 to enable, set to 0 to disable. + +This is an EXPERIMENTAL API. + +Args: + server: A gRPC server to which Channelz service will be added. +""" + +if sys.version_info[0] >= 3 and sys.version_info[1] >= 6: + from grpc_channelz.v1 import _async as aio + + def add_channelz_servicer(server): + + if isinstance(server, grpc.experimental.aio.Server): + _channelz_pb2_grpc.add_ChannelzServicer_to_server( + aio.ChannelzServicer(), server) + else: + _channelz_pb2_grpc.add_ChannelzServicer_to_server( + ChannelzServicer(), server) + + add_channelz_servicer.__doc__ = _add_channelz_servicer_doc + + __all__ = [ + "aio", + "add_channelz_servicer", + "ChannelzServicer", + ] + +else: + + def add_channelz_servicer(server): + _channelz_pb2_grpc.add_ChannelzServicer_to_server( + ChannelzServicer(), server) + + add_channelz_servicer.__doc__ = _add_channelz_servicer_doc + + __all__ = [ + "add_channelz_servicer", + "ChannelzServicer", + ] diff --git a/src/python/grpcio_tests/tests_aio/channelz/BUILD.bazel b/src/python/grpcio_tests/tests_aio/channelz/BUILD.bazel new file mode 100644 index 00000000000..2ead714e446 --- /dev/null +++ b/src/python/grpcio_tests/tests_aio/channelz/BUILD.bazel @@ -0,0 +1,29 @@ +# Copyright 2020 The gRPC Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +package(default_visibility = ["//visibility:public"]) + +py_test( + name = "channelz_servicer_test", + size = "small", + srcs = ["channelz_servicer_test.py"], + imports = ["../../"], + python_version = "PY3", + deps = [ + "//src/python/grpcio/grpc:grpcio", + "//src/python/grpcio_channelz/grpc_channelz/v1:grpc_channelz", + "//src/python/grpcio_tests/tests/unit/framework/common", + "//src/python/grpcio_tests/tests_aio/unit:_test_base", + ], +) diff --git a/src/python/grpcio_tests/tests_aio/channelz/__init__.py b/src/python/grpcio_tests/tests_aio/channelz/__init__.py new file mode 100644 index 00000000000..1517f71d093 --- /dev/null +++ b/src/python/grpcio_tests/tests_aio/channelz/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2020 The gRPC Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/src/python/grpcio_tests/tests_aio/channelz/channelz_servicer_test.py b/src/python/grpcio_tests/tests_aio/channelz/channelz_servicer_test.py new file mode 100644 index 00000000000..021340462e0 --- /dev/null +++ b/src/python/grpcio_tests/tests_aio/channelz/channelz_servicer_test.py @@ -0,0 +1,446 @@ +# Copyright 2020 The gRPC Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Tests of grpc_channelz.v1.channelz.""" + +import unittest +import logging +import asyncio + +import grpc +from grpc.experimental import aio + +from grpc_channelz.v1 import channelz +from grpc_channelz.v1 import channelz_pb2 +from grpc_channelz.v1 import channelz_pb2_grpc + +from tests.unit.framework.common import test_constants +from tests_aio.unit._test_base import AioTestBase + +aio.shutdown_grpc_aio() + +_SUCCESSFUL_UNARY_UNARY = '/test/SuccessfulUnaryUnary' +_FAILED_UNARY_UNARY = '/test/FailedUnaryUnary' +_SUCCESSFUL_STREAM_STREAM = '/test/SuccessfulStreamStream' + +_REQUEST = b'\x00\x00\x00' +_RESPONSE = b'\x01\x01\x01' + +_DISABLE_REUSE_PORT = (('grpc.so_reuseport', 0),) +_ENABLE_CHANNELZ = (('grpc.enable_channelz', 1),) +_DISABLE_CHANNELZ = (('grpc.enable_channelz', 0),) + + +async def _successful_unary_unary(request, servicer_context): + return _RESPONSE + + +async def _failed_unary_unary(request, servicer_context): + servicer_context.set_code(grpc.StatusCode.INTERNAL) + servicer_context.set_details("Channelz Test Intended Failure") + + +async def _successful_stream_stream(request_iterator, servicer_context): + async for _ in request_iterator: + yield _RESPONSE + + +class _GenericHandler(grpc.GenericRpcHandler): + + def service(self, handler_call_details): + if handler_call_details.method == _SUCCESSFUL_UNARY_UNARY: + return grpc.unary_unary_rpc_method_handler(_successful_unary_unary) + elif handler_call_details.method == _FAILED_UNARY_UNARY: + return grpc.unary_unary_rpc_method_handler(_failed_unary_unary) + elif handler_call_details.method == _SUCCESSFUL_STREAM_STREAM: + return grpc.stream_stream_rpc_method_handler( + _successful_stream_stream) + else: + return None + + +class _ChannelServerPair(object): + + async def start(self): + # Server will enable channelz service + self.server = aio.server(options=_DISABLE_REUSE_PORT + _ENABLE_CHANNELZ) + port = self.server.add_insecure_port('[::]:0') + self.server.add_generic_rpc_handlers((_GenericHandler(),)) + await self.server.start() + + # Channel will enable channelz service... + self.channel = aio.insecure_channel('localhost:%d' % port, + options=_ENABLE_CHANNELZ) + + +# Stores channel-server pairs globally, since the memory deallocation is +# non-deterministic in both Core and Python with multiple threads. The +# destroyed Channelz node might still present. So, as a work around, this +# test doesn't close channel-server-pairs between cases. +_pairs = [] + + +async def _generate_channel_server_pairs(n): + """Creates channel-server pairs globally, returns their indexes.""" + new_pairs = [_ChannelServerPair() for i in range(n)] + for pair in new_pairs: + await pair.start() + _pairs.extend(new_pairs) + return list(range(len(_pairs) - n, len(_pairs))) + + +class ChannelzServicerTest(AioTestBase): + + async def setUp(self): + self._pairs = [] + # This server is for Channelz info fetching only + # It self should not enable Channelz + self._server = aio.server(options=_DISABLE_REUSE_PORT + + _DISABLE_CHANNELZ) + port = self._server.add_insecure_port('[::]:0') + channelz.add_channelz_servicer(self._server) + await self._server.start() + + # This channel is used to fetch Channelz info only + # Channelz should not be enabled + self._channel = aio.insecure_channel('localhost:%d' % port, + options=_DISABLE_CHANNELZ) + self._channelz_stub = channelz_pb2_grpc.ChannelzStub(self._channel) + + async def tearDown(self): + await self._server.stop(None) + await self._channel.close() + + async def _send_successful_unary_unary(self, idx): + call = _pairs[idx].channel.unary_unary(_SUCCESSFUL_UNARY_UNARY)( + _REQUEST) + self.assertEqual(grpc.StatusCode.OK, await call.code()) + + async def _send_failed_unary_unary(self, idx): + try: + await _pairs[idx].channel.unary_unary(_FAILED_UNARY_UNARY)(_REQUEST) + except grpc.RpcError: + return + else: + self.fail("This call supposed to fail") + + async def _send_successful_stream_stream(self, idx): + call = _pairs[idx].channel.stream_stream(_SUCCESSFUL_STREAM_STREAM)( + iter([_REQUEST] * test_constants.STREAM_LENGTH)) + cnt = 0 + async for _ in call: + cnt += 1 + self.assertEqual(cnt, test_constants.STREAM_LENGTH) + + async def _get_channel_id(self, idx): + """Channel id may not be consecutive""" + resp = await self._channelz_stub.GetTopChannels( + channelz_pb2.GetTopChannelsRequest(start_channel_id=0)) + self.assertGreater(len(resp.channel), idx) + return resp.channel[idx].ref.channel_id + + async def _get_server_by_id(self, idx): + """Server id may not be consecutive""" + resp = await self._channelz_stub.GetServers( + channelz_pb2.GetServersRequest(start_server_id=0)) + return resp.server[idx] + + async def test_get_top_channels_basic(self): + before = await self._channelz_stub.GetTopChannels( + channelz_pb2.GetTopChannelsRequest(start_channel_id=0)) + await _generate_channel_server_pairs(1) + after = await self._channelz_stub.GetTopChannels( + channelz_pb2.GetTopChannelsRequest(start_channel_id=0)) + self.assertEqual(len(after.channel) - len(before.channel), 1) + self.assertEqual(after.end, True) + + async def test_get_top_channels_high_start_id(self): + await _generate_channel_server_pairs(1) + resp = await self._channelz_stub.GetTopChannels( + channelz_pb2.GetTopChannelsRequest(start_channel_id=10000)) + self.assertEqual(len(resp.channel), 0) + self.assertEqual(resp.end, True) + + async def test_successful_request(self): + idx = await _generate_channel_server_pairs(1) + await self._send_successful_unary_unary(idx[0]) + resp = await self._channelz_stub.GetChannel( + channelz_pb2.GetChannelRequest( + channel_id=await self._get_channel_id(idx[0]))) + self.assertEqual(resp.channel.data.calls_started, 1) + self.assertEqual(resp.channel.data.calls_succeeded, 1) + self.assertEqual(resp.channel.data.calls_failed, 0) + + async def test_failed_request(self): + idx = await _generate_channel_server_pairs(1) + await self._send_failed_unary_unary(idx[0]) + resp = await self._channelz_stub.GetChannel( + channelz_pb2.GetChannelRequest( + channel_id=await self._get_channel_id(idx[0]))) + self.assertEqual(resp.channel.data.calls_started, 1) + self.assertEqual(resp.channel.data.calls_succeeded, 0) + self.assertEqual(resp.channel.data.calls_failed, 1) + + async def test_many_requests(self): + idx = await _generate_channel_server_pairs(1) + k_success = 7 + k_failed = 9 + for i in range(k_success): + await self._send_successful_unary_unary(idx[0]) + for i in range(k_failed): + await self._send_failed_unary_unary(idx[0]) + resp = await self._channelz_stub.GetChannel( + channelz_pb2.GetChannelRequest( + channel_id=await self._get_channel_id(idx[0]))) + self.assertEqual(resp.channel.data.calls_started, k_success + k_failed) + self.assertEqual(resp.channel.data.calls_succeeded, k_success) + self.assertEqual(resp.channel.data.calls_failed, k_failed) + + async def test_many_requests_many_channel(self): + k_channels = 4 + idx = await _generate_channel_server_pairs(k_channels) + k_success = 11 + k_failed = 13 + for i in range(k_success): + await self._send_successful_unary_unary(idx[0]) + await self._send_successful_unary_unary(idx[2]) + for i in range(k_failed): + await self._send_failed_unary_unary(idx[1]) + await self._send_failed_unary_unary(idx[2]) + + # The first channel saw only successes + resp = await self._channelz_stub.GetChannel( + channelz_pb2.GetChannelRequest( + channel_id=await self._get_channel_id(idx[0]))) + self.assertEqual(resp.channel.data.calls_started, k_success) + self.assertEqual(resp.channel.data.calls_succeeded, k_success) + self.assertEqual(resp.channel.data.calls_failed, 0) + + # The second channel saw only failures + resp = await self._channelz_stub.GetChannel( + channelz_pb2.GetChannelRequest( + channel_id=await self._get_channel_id(idx[1]))) + self.assertEqual(resp.channel.data.calls_started, k_failed) + self.assertEqual(resp.channel.data.calls_succeeded, 0) + self.assertEqual(resp.channel.data.calls_failed, k_failed) + + # The third channel saw both successes and failures + resp = await self._channelz_stub.GetChannel( + channelz_pb2.GetChannelRequest( + channel_id=await self._get_channel_id(idx[2]))) + self.assertEqual(resp.channel.data.calls_started, k_success + k_failed) + self.assertEqual(resp.channel.data.calls_succeeded, k_success) + self.assertEqual(resp.channel.data.calls_failed, k_failed) + + # The fourth channel saw nothing + resp = await self._channelz_stub.GetChannel( + channelz_pb2.GetChannelRequest( + channel_id=await self._get_channel_id(idx[3]))) + self.assertEqual(resp.channel.data.calls_started, 0) + self.assertEqual(resp.channel.data.calls_succeeded, 0) + self.assertEqual(resp.channel.data.calls_failed, 0) + + async def test_many_subchannels(self): + k_channels = 4 + idx = await _generate_channel_server_pairs(k_channels) + k_success = 17 + k_failed = 19 + for i in range(k_success): + await self._send_successful_unary_unary(idx[0]) + await self._send_successful_unary_unary(idx[2]) + for i in range(k_failed): + await self._send_failed_unary_unary(idx[1]) + await self._send_failed_unary_unary(idx[2]) + + for i in range(k_channels): + gc_resp = await self._channelz_stub.GetChannel( + channelz_pb2.GetChannelRequest( + channel_id=await self._get_channel_id(idx[i]))) + # If no call performed in the channel, there shouldn't be any subchannel + if gc_resp.channel.data.calls_started == 0: + self.assertEqual(len(gc_resp.channel.subchannel_ref), 0) + continue + + # Otherwise, the subchannel should exist + self.assertGreater(len(gc_resp.channel.subchannel_ref), 0) + gsc_resp = await self._channelz_stub.GetSubchannel( + channelz_pb2.GetSubchannelRequest( + subchannel_id=gc_resp.channel.subchannel_ref[0]. + subchannel_id)) + self.assertEqual(gc_resp.channel.data.calls_started, + gsc_resp.subchannel.data.calls_started) + self.assertEqual(gc_resp.channel.data.calls_succeeded, + gsc_resp.subchannel.data.calls_succeeded) + self.assertEqual(gc_resp.channel.data.calls_failed, + gsc_resp.subchannel.data.calls_failed) + + async def test_server_call(self): + idx = await _generate_channel_server_pairs(1) + k_success = 23 + k_failed = 29 + for i in range(k_success): + await self._send_successful_unary_unary(idx[0]) + for i in range(k_failed): + await self._send_failed_unary_unary(idx[0]) + + resp = await self._get_server_by_id(idx[0]) + self.assertEqual(resp.data.calls_started, k_success + k_failed) + self.assertEqual(resp.data.calls_succeeded, k_success) + self.assertEqual(resp.data.calls_failed, k_failed) + + async def test_many_subchannels_and_sockets(self): + k_channels = 4 + idx = await _generate_channel_server_pairs(k_channels) + k_success = 3 + k_failed = 5 + for i in range(k_success): + await self._send_successful_unary_unary(idx[0]) + await self._send_successful_unary_unary(idx[2]) + for i in range(k_failed): + await self._send_failed_unary_unary(idx[1]) + await self._send_failed_unary_unary(idx[2]) + + for i in range(k_channels): + gc_resp = await self._channelz_stub.GetChannel( + channelz_pb2.GetChannelRequest( + channel_id=await self._get_channel_id(idx[i]))) + + # If no call performed in the channel, there shouldn't be any subchannel + if gc_resp.channel.data.calls_started == 0: + self.assertEqual(len(gc_resp.channel.subchannel_ref), 0) + continue + + # Otherwise, the subchannel should exist + self.assertGreater(len(gc_resp.channel.subchannel_ref), 0) + gsc_resp = await self._channelz_stub.GetSubchannel( + channelz_pb2.GetSubchannelRequest( + subchannel_id=gc_resp.channel.subchannel_ref[0]. + subchannel_id)) + self.assertEqual(len(gsc_resp.subchannel.socket_ref), 1) + + gs_resp = await self._channelz_stub.GetSocket( + channelz_pb2.GetSocketRequest( + socket_id=gsc_resp.subchannel.socket_ref[0].socket_id)) + self.assertEqual(gsc_resp.subchannel.data.calls_started, + gs_resp.socket.data.streams_started) + self.assertEqual(gsc_resp.subchannel.data.calls_started, + gs_resp.socket.data.streams_succeeded) + # Calls started == messages sent, only valid for unary calls + self.assertEqual(gsc_resp.subchannel.data.calls_started, + gs_resp.socket.data.messages_sent) + + async def test_streaming_rpc(self): + idx = await _generate_channel_server_pairs(1) + # In C++, the argument for _send_successful_stream_stream is message length. + # Here the argument is still channel idx, to be consistent with the other two. + await self._send_successful_stream_stream(idx[0]) + + gc_resp = await self._channelz_stub.GetChannel( + channelz_pb2.GetChannelRequest( + channel_id=await self._get_channel_id(idx[0]))) + self.assertEqual(gc_resp.channel.data.calls_started, 1) + self.assertEqual(gc_resp.channel.data.calls_succeeded, 1) + self.assertEqual(gc_resp.channel.data.calls_failed, 0) + # Subchannel exists + self.assertGreater(len(gc_resp.channel.subchannel_ref), 0) + + gsc_resp = await self._channelz_stub.GetSubchannel( + channelz_pb2.GetSubchannelRequest( + subchannel_id=gc_resp.channel.subchannel_ref[0].subchannel_id)) + self.assertEqual(gsc_resp.subchannel.data.calls_started, 1) + self.assertEqual(gsc_resp.subchannel.data.calls_succeeded, 1) + self.assertEqual(gsc_resp.subchannel.data.calls_failed, 0) + # Socket exists + self.assertEqual(len(gsc_resp.subchannel.socket_ref), 1) + + gs_resp = await self._channelz_stub.GetSocket( + channelz_pb2.GetSocketRequest( + socket_id=gsc_resp.subchannel.socket_ref[0].socket_id)) + self.assertEqual(gs_resp.socket.data.streams_started, 1) + self.assertEqual(gs_resp.socket.data.streams_succeeded, 1) + self.assertEqual(gs_resp.socket.data.streams_failed, 0) + self.assertEqual(gs_resp.socket.data.messages_sent, + test_constants.STREAM_LENGTH) + self.assertEqual(gs_resp.socket.data.messages_received, + test_constants.STREAM_LENGTH) + + async def test_server_sockets(self): + idx = await _generate_channel_server_pairs(1) + await self._send_successful_unary_unary(idx[0]) + await self._send_failed_unary_unary(idx[0]) + + resp = await self._get_server_by_id(idx[0]) + self.assertEqual(resp.data.calls_started, 2) + self.assertEqual(resp.data.calls_succeeded, 1) + self.assertEqual(resp.data.calls_failed, 1) + + gss_resp = await self._channelz_stub.GetServerSockets( + channelz_pb2.GetServerSocketsRequest(server_id=resp.ref.server_id, + start_socket_id=0)) + # If the RPC call failed, it will raise a grpc.RpcError + # So, if there is no exception raised, considered pass + + async def test_server_listen_sockets(self): + idx = await _generate_channel_server_pairs(1) + + resp = await self._get_server_by_id(idx[0]) + self.assertEqual(len(resp.listen_socket), 1) + + gs_resp = await self._channelz_stub.GetSocket( + channelz_pb2.GetSocketRequest( + socket_id=resp.listen_socket[0].socket_id)) + # If the RPC call failed, it will raise a grpc.RpcError + # So, if there is no exception raised, considered pass + + async def test_invalid_query_get_server(self): + with self.assertRaises(aio.AioRpcError) as exception_context: + await self._channelz_stub.GetServer( + channelz_pb2.GetServerRequest(server_id=10000)) + self.assertEqual(grpc.StatusCode.NOT_FOUND, + exception_context.exception.code()) + + async def test_invalid_query_get_channel(self): + with self.assertRaises(aio.AioRpcError) as exception_context: + await self._channelz_stub.GetChannel( + channelz_pb2.GetChannelRequest(channel_id=10000)) + self.assertEqual(grpc.StatusCode.NOT_FOUND, + exception_context.exception.code()) + + async def test_invalid_query_get_subchannel(self): + with self.assertRaises(aio.AioRpcError) as exception_context: + await self._channelz_stub.GetSubchannel( + channelz_pb2.GetSubchannelRequest(subchannel_id=10000)) + self.assertEqual(grpc.StatusCode.NOT_FOUND, + exception_context.exception.code()) + + async def test_invalid_query_get_socket(self): + with self.assertRaises(aio.AioRpcError) as exception_context: + await self._channelz_stub.GetSocket( + channelz_pb2.GetSocketRequest(socket_id=10000)) + self.assertEqual(grpc.StatusCode.NOT_FOUND, + exception_context.exception.code()) + + async def test_invalid_query_get_server_sockets(self): + with self.assertRaises(aio.AioRpcError) as exception_context: + await self._channelz_stub.GetServerSockets( + channelz_pb2.GetServerSocketsRequest( + server_id=10000, + start_socket_id=0, + )) + self.assertEqual(grpc.StatusCode.NOT_FOUND, + exception_context.exception.code()) + + +if __name__ == '__main__': + logging.basicConfig(level=logging.DEBUG) + unittest.main(verbosity=2) diff --git a/src/python/grpcio_tests/tests_aio/tests.json b/src/python/grpcio_tests/tests_aio/tests.json index e657cfa7e4d..1b5b17b7d8b 100644 --- a/src/python/grpcio_tests/tests_aio/tests.json +++ b/src/python/grpcio_tests/tests_aio/tests.json @@ -1,5 +1,6 @@ [ "_sanity._sanity_test.AioSanityTest", + "channelz.channelz_servicer_test.ChannelzServicerTest", "health_check.health_servicer_test.HealthServicerTest", "interop.local_interop_test.InsecureLocalInteropTest", "interop.local_interop_test.SecureLocalInteropTest", From aaa0f328c91cc4c1b8fa5601e4fbf54c173769ed Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Mon, 4 May 2020 11:03:08 -0700 Subject: [PATCH 674/758] Further simplifify the test --- .../channelz/channelz_servicer_test.py | 119 ------------------ 1 file changed, 119 deletions(-) diff --git a/src/python/grpcio_tests/tests_aio/channelz/channelz_servicer_test.py b/src/python/grpcio_tests/tests_aio/channelz/channelz_servicer_test.py index 021340462e0..5afed60ddd4 100644 --- a/src/python/grpcio_tests/tests_aio/channelz/channelz_servicer_test.py +++ b/src/python/grpcio_tests/tests_aio/channelz/channelz_servicer_test.py @@ -206,84 +206,6 @@ class ChannelzServicerTest(AioTestBase): self.assertEqual(resp.channel.data.calls_succeeded, k_success) self.assertEqual(resp.channel.data.calls_failed, k_failed) - async def test_many_requests_many_channel(self): - k_channels = 4 - idx = await _generate_channel_server_pairs(k_channels) - k_success = 11 - k_failed = 13 - for i in range(k_success): - await self._send_successful_unary_unary(idx[0]) - await self._send_successful_unary_unary(idx[2]) - for i in range(k_failed): - await self._send_failed_unary_unary(idx[1]) - await self._send_failed_unary_unary(idx[2]) - - # The first channel saw only successes - resp = await self._channelz_stub.GetChannel( - channelz_pb2.GetChannelRequest( - channel_id=await self._get_channel_id(idx[0]))) - self.assertEqual(resp.channel.data.calls_started, k_success) - self.assertEqual(resp.channel.data.calls_succeeded, k_success) - self.assertEqual(resp.channel.data.calls_failed, 0) - - # The second channel saw only failures - resp = await self._channelz_stub.GetChannel( - channelz_pb2.GetChannelRequest( - channel_id=await self._get_channel_id(idx[1]))) - self.assertEqual(resp.channel.data.calls_started, k_failed) - self.assertEqual(resp.channel.data.calls_succeeded, 0) - self.assertEqual(resp.channel.data.calls_failed, k_failed) - - # The third channel saw both successes and failures - resp = await self._channelz_stub.GetChannel( - channelz_pb2.GetChannelRequest( - channel_id=await self._get_channel_id(idx[2]))) - self.assertEqual(resp.channel.data.calls_started, k_success + k_failed) - self.assertEqual(resp.channel.data.calls_succeeded, k_success) - self.assertEqual(resp.channel.data.calls_failed, k_failed) - - # The fourth channel saw nothing - resp = await self._channelz_stub.GetChannel( - channelz_pb2.GetChannelRequest( - channel_id=await self._get_channel_id(idx[3]))) - self.assertEqual(resp.channel.data.calls_started, 0) - self.assertEqual(resp.channel.data.calls_succeeded, 0) - self.assertEqual(resp.channel.data.calls_failed, 0) - - async def test_many_subchannels(self): - k_channels = 4 - idx = await _generate_channel_server_pairs(k_channels) - k_success = 17 - k_failed = 19 - for i in range(k_success): - await self._send_successful_unary_unary(idx[0]) - await self._send_successful_unary_unary(idx[2]) - for i in range(k_failed): - await self._send_failed_unary_unary(idx[1]) - await self._send_failed_unary_unary(idx[2]) - - for i in range(k_channels): - gc_resp = await self._channelz_stub.GetChannel( - channelz_pb2.GetChannelRequest( - channel_id=await self._get_channel_id(idx[i]))) - # If no call performed in the channel, there shouldn't be any subchannel - if gc_resp.channel.data.calls_started == 0: - self.assertEqual(len(gc_resp.channel.subchannel_ref), 0) - continue - - # Otherwise, the subchannel should exist - self.assertGreater(len(gc_resp.channel.subchannel_ref), 0) - gsc_resp = await self._channelz_stub.GetSubchannel( - channelz_pb2.GetSubchannelRequest( - subchannel_id=gc_resp.channel.subchannel_ref[0]. - subchannel_id)) - self.assertEqual(gc_resp.channel.data.calls_started, - gsc_resp.subchannel.data.calls_started) - self.assertEqual(gc_resp.channel.data.calls_succeeded, - gsc_resp.subchannel.data.calls_succeeded) - self.assertEqual(gc_resp.channel.data.calls_failed, - gsc_resp.subchannel.data.calls_failed) - async def test_server_call(self): idx = await _generate_channel_server_pairs(1) k_success = 23 @@ -298,47 +220,6 @@ class ChannelzServicerTest(AioTestBase): self.assertEqual(resp.data.calls_succeeded, k_success) self.assertEqual(resp.data.calls_failed, k_failed) - async def test_many_subchannels_and_sockets(self): - k_channels = 4 - idx = await _generate_channel_server_pairs(k_channels) - k_success = 3 - k_failed = 5 - for i in range(k_success): - await self._send_successful_unary_unary(idx[0]) - await self._send_successful_unary_unary(idx[2]) - for i in range(k_failed): - await self._send_failed_unary_unary(idx[1]) - await self._send_failed_unary_unary(idx[2]) - - for i in range(k_channels): - gc_resp = await self._channelz_stub.GetChannel( - channelz_pb2.GetChannelRequest( - channel_id=await self._get_channel_id(idx[i]))) - - # If no call performed in the channel, there shouldn't be any subchannel - if gc_resp.channel.data.calls_started == 0: - self.assertEqual(len(gc_resp.channel.subchannel_ref), 0) - continue - - # Otherwise, the subchannel should exist - self.assertGreater(len(gc_resp.channel.subchannel_ref), 0) - gsc_resp = await self._channelz_stub.GetSubchannel( - channelz_pb2.GetSubchannelRequest( - subchannel_id=gc_resp.channel.subchannel_ref[0]. - subchannel_id)) - self.assertEqual(len(gsc_resp.subchannel.socket_ref), 1) - - gs_resp = await self._channelz_stub.GetSocket( - channelz_pb2.GetSocketRequest( - socket_id=gsc_resp.subchannel.socket_ref[0].socket_id)) - self.assertEqual(gsc_resp.subchannel.data.calls_started, - gs_resp.socket.data.streams_started) - self.assertEqual(gsc_resp.subchannel.data.calls_started, - gs_resp.socket.data.streams_succeeded) - # Calls started == messages sent, only valid for unary calls - self.assertEqual(gsc_resp.subchannel.data.calls_started, - gs_resp.socket.data.messages_sent) - async def test_streaming_rpc(self): idx = await _generate_channel_server_pairs(1) # In C++, the argument for _send_successful_stream_stream is message length. From b95843c1b7ec2913d65810468f9dc72af2d38104 Mon Sep 17 00:00:00 2001 From: "Mark D. Roth" Date: Tue, 28 Apr 2020 14:18:27 -0700 Subject: [PATCH 675/758] xds: Add support for send_all_clusters field in LRS. --- BUILD | 16 + BUILD.gn | 16 + CMakeLists.txt | 16 + Makefile | 16 + bazel/grpc_deps.bzl | 8 +- build_autogenerated.yaml | 32 + config.m4 | 9 + config.w32 | 10 + gRPC-C++.podspec | 16 + gRPC-Core.podspec | 24 + grpc.gemspec | 16 + grpc.gyp | 16 + package.xml | 16 + .../ext/filters/client_channel/xds/xds_api.cc | 24 +- .../ext/filters/client_channel/xds/xds_api.h | 1 + .../filters/client_channel/xds/xds_client.cc | 29 +- .../filters/client_channel/xds/xds_client.h | 2 +- .../envoy/api/v2/auth/cert.upb.c | 233 +---- .../envoy/api/v2/auth/cert.upb.h | 880 +----------------- .../envoy/api/v2/auth/common.upb.c | 114 +++ .../envoy/api/v2/auth/common.upb.h | 418 +++++++++ .../envoy/api/v2/auth/secret.upb.c | 72 ++ .../envoy/api/v2/auth/secret.upb.h | 197 ++++ .../upb-generated/envoy/api/v2/auth/tls.upb.c | 105 +++ .../upb-generated/envoy/api/v2/auth/tls.upb.h | 378 ++++++++ .../ext/upb-generated/envoy/api/v2/cds.upb.c | 1 + .../upb-generated/envoy/api/v2/cluster.upb.c | 29 +- .../upb-generated/envoy/api/v2/cluster.upb.h | 50 +- .../api/v2/cluster/circuit_breaker.upb.c | 1 + .../envoy/api/v2/cluster/filter.upb.c | 1 + .../api/v2/cluster/outlier_detection.upb.c | 1 + .../envoy/api/v2/core/address.upb.c | 3 +- .../envoy/api/v2/core/backoff.upb.c | 35 + .../envoy/api/v2/core/backoff.upb.h | 78 ++ .../envoy/api/v2/core/base.upb.c | 73 +- .../envoy/api/v2/core/base.upb.h | 180 ++-- .../envoy/api/v2/core/config_source.upb.c | 1 + .../api/v2/core/event_service_config.upb.c | 34 + .../api/v2/core/event_service_config.upb.h | 72 ++ .../envoy/api/v2/core/grpc_service.upb.c | 3 +- .../envoy/api/v2/core/health_check.upb.c | 44 +- .../envoy/api/v2/core/health_check.upb.h | 41 +- .../envoy/api/v2/core/http_uri.upb.c | 1 + .../envoy/api/v2/core/protocol.upb.c | 56 +- .../envoy/api/v2/core/protocol.upb.h | 94 +- .../envoy/api/v2/core/socket_option.upb.c | 34 + .../envoy/api/v2/core/socket_option.upb.h | 89 ++ .../envoy/api/v2/discovery.upb.c | 1 + .../ext/upb-generated/envoy/api/v2/eds.upb.c | 1 + .../upb-generated/envoy/api/v2/endpoint.upb.c | 1 + .../envoy/api/v2/endpoint/endpoint.upb.c | 1 + .../api/v2/endpoint/endpoint_components.upb.c | 15 +- .../api/v2/endpoint/endpoint_components.upb.h | 16 +- .../envoy/api/v2/endpoint/load_report.upb.c | 1 + .../ext/upb-generated/envoy/api/v2/lds.upb.c | 1 + .../upb-generated/envoy/api/v2/listener.upb.c | 25 +- .../upb-generated/envoy/api/v2/listener.upb.h | 16 + .../envoy/api/v2/listener/listener.upb.c | 1 + .../api/v2/listener/listener_components.upb.c | 3 +- .../api/v2/listener/udp_listener_config.upb.c | 1 + .../ext/upb-generated/envoy/api/v2/rds.upb.c | 1 + .../upb-generated/envoy/api/v2/route.upb.c | 1 + .../envoy/api/v2/route/route.upb.c | 1 + .../envoy/api/v2/route/route_components.upb.c | 104 ++- .../envoy/api/v2/route/route_components.upb.h | 250 +++-- .../envoy/api/v2/scoped_route.upb.c | 1 + .../ext/upb-generated/envoy/api/v2/srds.upb.c | 1 + .../filter/accesslog/v2/accesslog.upb.c | 1 + .../v2/http_connection_manager.upb.c | 76 +- .../v2/http_connection_manager.upb.h | 120 ++- .../config/listener/v2/api_listener.upb.c | 1 + .../envoy/config/trace/v2/http_tracer.upb.c | 51 + .../envoy/config/trace/v2/http_tracer.upb.h | 125 +++ .../envoy/service/discovery/v2/ads.upb.c | 1 + .../envoy/service/load_stats/v2/lrs.upb.c | 6 +- .../envoy/service/load_stats/v2/lrs.upb.h | 4 + .../ext/upb-generated/envoy/type/http.upb.c | 1 + .../envoy/type/matcher/regex.upb.c | 16 + .../envoy/type/matcher/regex.upb.h | 36 + .../envoy/type/matcher/string.upb.c | 1 + .../envoy/type/metadata/v2/metadata.upb.c | 1 + .../upb-generated/envoy/type/percent.upb.c | 1 + .../ext/upb-generated/envoy/type/range.upb.c | 1 + .../envoy/type/semantic_version.upb.c | 1 + .../envoy/type/tracing/v2/custom_tag.upb.c | 1 + .../udpa/annotations/status.upb.c | 28 + .../udpa/annotations/status.upb.h | 65 ++ .../ext/upb-generated/validate/validate.upb.c | 41 +- .../ext/upb-generated/validate/validate.upb.h | 132 +-- src/proto/grpc/testing/xds/lrs_for_test.proto | 6 + src/python/grpcio/grpc_core_dependencies.py | 8 + test/cpp/end2end/xds_end2end_test.cc | 62 +- third_party/envoy-api | 2 +- third_party/protoc-gen-validate | 2 +- third_party/udpa | 2 +- tools/codegen/core/gen_upb_api.sh | 8 + tools/doxygen/Doxyfile.c++.internal | 16 + tools/doxygen/Doxyfile.core.internal | 16 + tools/run_tests/sanity/check_submodules.sh | 6 +- 99 files changed, 3283 insertions(+), 1582 deletions(-) create mode 100644 src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.c create mode 100644 src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.h create mode 100644 src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.c create mode 100644 src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.h create mode 100644 src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.c create mode 100644 src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.h create mode 100644 src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.c create mode 100644 src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.h create mode 100644 src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.c create mode 100644 src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.h create mode 100644 src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.c create mode 100644 src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.h create mode 100644 src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.c create mode 100644 src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.h create mode 100644 src/core/ext/upb-generated/udpa/annotations/status.upb.c create mode 100644 src/core/ext/upb-generated/udpa/annotations/status.upb.h diff --git a/BUILD b/BUILD index edc09c315ff..671b2531c09 100644 --- a/BUILD +++ b/BUILD @@ -2482,6 +2482,9 @@ grpc_cc_library( name = "envoy_ads_upb", srcs = [ "src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.c", "src/core/ext/upb-generated/envoy/api/v2/cds.upb.c", "src/core/ext/upb-generated/envoy/api/v2/cluster.upb.c", "src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c", @@ -2507,11 +2510,15 @@ grpc_cc_library( "src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.c", "src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.c", "src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.c", + "src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.c", "src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.c", "src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.c", ], hdrs = [ "src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.h", "src/core/ext/upb-generated/envoy/api/v2/cds.upb.h", "src/core/ext/upb-generated/envoy/api/v2/cluster.upb.h", "src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.h", @@ -2537,6 +2544,7 @@ grpc_cc_library( "src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.h", "src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.h", "src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.h", + "src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.h", "src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.h", "src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.h", ], @@ -2577,21 +2585,27 @@ grpc_cc_library( name = "envoy_core_upb", srcs = [ "src/core/ext/upb-generated/envoy/api/v2/core/address.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.c", "src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c", "src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.c", "src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c", "src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c", "src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.c", "src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.c", ], hdrs = [ "src/core/ext/upb-generated/envoy/api/v2/core/address.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.h", "src/core/ext/upb-generated/envoy/api/v2/core/base.upb.h", "src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.h", "src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.h", "src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.h", "src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.h", "src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.h", ], external_deps = [ "upb_lib", @@ -2687,10 +2701,12 @@ grpc_cc_library( srcs = [ "src/core/ext/upb-generated/udpa/annotations/migrate.upb.c", "src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c", + "src/core/ext/upb-generated/udpa/annotations/status.upb.c", ], hdrs = [ "src/core/ext/upb-generated/udpa/annotations/migrate.upb.h", "src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h", + "src/core/ext/upb-generated/udpa/annotations/status.upb.h", ], external_deps = [ "upb_lib", diff --git a/BUILD.gn b/BUILD.gn index 121b57c75f7..39cffa99dee 100644 --- a/BUILD.gn +++ b/BUILD.gn @@ -397,6 +397,12 @@ config("grpc_config") { "src/core/ext/upb-generated/envoy/annotations/resource.upb.h", "src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c", "src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.h", "src/core/ext/upb-generated/envoy/api/v2/cds.upb.c", "src/core/ext/upb-generated/envoy/api/v2/cds.upb.h", "src/core/ext/upb-generated/envoy/api/v2/cluster.upb.c", @@ -409,10 +415,14 @@ config("grpc_config") { "src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.h", "src/core/ext/upb-generated/envoy/api/v2/core/address.upb.c", "src/core/ext/upb-generated/envoy/api/v2/core/address.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.h", "src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c", "src/core/ext/upb-generated/envoy/api/v2/core/base.upb.h", "src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c", "src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.h", "src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c", "src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.h", "src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c", @@ -421,6 +431,8 @@ config("grpc_config") { "src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.h", "src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c", "src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h", + "src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.c", + "src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.h", "src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c", "src/core/ext/upb-generated/envoy/api/v2/discovery.upb.h", "src/core/ext/upb-generated/envoy/api/v2/eds.upb.c", @@ -461,6 +473,8 @@ config("grpc_config") { "src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.h", "src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.c", "src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.h", + "src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.c", + "src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.h", "src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.c", "src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.h", "src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.c", @@ -517,6 +531,8 @@ config("grpc_config") { "src/core/ext/upb-generated/udpa/annotations/migrate.upb.h", "src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c", "src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h", + "src/core/ext/upb-generated/udpa/annotations/status.upb.c", + "src/core/ext/upb-generated/udpa/annotations/status.upb.h", "src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c", "src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h", "src/core/ext/upb-generated/validate/validate.upb.c", diff --git a/CMakeLists.txt b/CMakeLists.txt index ed5d9579c57..aa149b104cb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1414,18 +1414,24 @@ add_library(grpc src/core/ext/upb-generated/envoy/annotations/deprecation.upb.c src/core/ext/upb-generated/envoy/annotations/resource.upb.c src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c + src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.c + src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.c + src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.c src/core/ext/upb-generated/envoy/api/v2/cds.upb.c src/core/ext/upb-generated/envoy/api/v2/cluster.upb.c src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.c src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c src/core/ext/upb-generated/envoy/api/v2/core/address.upb.c + src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.c src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c + src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.c src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.c src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c + src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.c src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c src/core/ext/upb-generated/envoy/api/v2/eds.upb.c src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.c @@ -1446,6 +1452,7 @@ add_library(grpc src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.c src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.c src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.c + src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.c src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.c src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.c src/core/ext/upb-generated/envoy/type/http.upb.c @@ -1474,6 +1481,7 @@ add_library(grpc src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c src/core/ext/upb-generated/udpa/annotations/migrate.upb.c src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c + src/core/ext/upb-generated/udpa/annotations/status.upb.c src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c src/core/ext/upb-generated/validate/validate.upb.c src/core/lib/avl/avl.cc @@ -2074,18 +2082,24 @@ add_library(grpc_unsecure src/core/ext/upb-generated/envoy/annotations/deprecation.upb.c src/core/ext/upb-generated/envoy/annotations/resource.upb.c src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c + src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.c + src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.c + src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.c src/core/ext/upb-generated/envoy/api/v2/cds.upb.c src/core/ext/upb-generated/envoy/api/v2/cluster.upb.c src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.c src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c src/core/ext/upb-generated/envoy/api/v2/core/address.upb.c + src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.c src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c + src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.c src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.c src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c + src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.c src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c src/core/ext/upb-generated/envoy/api/v2/eds.upb.c src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.c @@ -2106,6 +2120,7 @@ add_library(grpc_unsecure src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.c src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.c src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.c + src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.c src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.c src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.c src/core/ext/upb-generated/envoy/type/http.upb.c @@ -2131,6 +2146,7 @@ add_library(grpc_unsecure src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c src/core/ext/upb-generated/udpa/annotations/migrate.upb.c src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c + src/core/ext/upb-generated/udpa/annotations/status.upb.c src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c src/core/ext/upb-generated/validate/validate.upb.c src/core/lib/avl/avl.cc diff --git a/Makefile b/Makefile index 62d0d31011b..acd586a74d7 100644 --- a/Makefile +++ b/Makefile @@ -3731,18 +3731,24 @@ LIBGRPC_SRC = \ src/core/ext/upb-generated/envoy/annotations/deprecation.upb.c \ src/core/ext/upb-generated/envoy/annotations/resource.upb.c \ src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.c \ src/core/ext/upb-generated/envoy/api/v2/cds.upb.c \ src/core/ext/upb-generated/envoy/api/v2/cluster.upb.c \ src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c \ src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.c \ src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c \ src/core/ext/upb-generated/envoy/api/v2/core/address.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.c \ src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c \ src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.c \ src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c \ src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c \ src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.c \ src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.c \ src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c \ src/core/ext/upb-generated/envoy/api/v2/eds.upb.c \ src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.c \ @@ -3763,6 +3769,7 @@ LIBGRPC_SRC = \ src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.c \ src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.c \ src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.c \ + src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.c \ src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.c \ src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.c \ src/core/ext/upb-generated/envoy/type/http.upb.c \ @@ -3791,6 +3798,7 @@ LIBGRPC_SRC = \ src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c \ src/core/ext/upb-generated/udpa/annotations/migrate.upb.c \ src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c \ + src/core/ext/upb-generated/udpa/annotations/status.upb.c \ src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c \ src/core/ext/upb-generated/validate/validate.upb.c \ src/core/lib/avl/avl.cc \ @@ -4365,18 +4373,24 @@ LIBGRPC_UNSECURE_SRC = \ src/core/ext/upb-generated/envoy/annotations/deprecation.upb.c \ src/core/ext/upb-generated/envoy/annotations/resource.upb.c \ src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.c \ src/core/ext/upb-generated/envoy/api/v2/cds.upb.c \ src/core/ext/upb-generated/envoy/api/v2/cluster.upb.c \ src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c \ src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.c \ src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c \ src/core/ext/upb-generated/envoy/api/v2/core/address.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.c \ src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c \ src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.c \ src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c \ src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c \ src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.c \ src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.c \ src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c \ src/core/ext/upb-generated/envoy/api/v2/eds.upb.c \ src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.c \ @@ -4397,6 +4411,7 @@ LIBGRPC_UNSECURE_SRC = \ src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.c \ src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.c \ src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.c \ + src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.c \ src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.c \ src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.c \ src/core/ext/upb-generated/envoy/type/http.upb.c \ @@ -4422,6 +4437,7 @@ LIBGRPC_UNSECURE_SRC = \ src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c \ src/core/ext/upb-generated/udpa/annotations/migrate.upb.c \ src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c \ + src/core/ext/upb-generated/udpa/annotations/status.upb.c \ src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c \ src/core/ext/upb-generated/validate/validate.upb.c \ src/core/lib/avl/avl.cc \ diff --git a/bazel/grpc_deps.bzl b/bazel/grpc_deps.bzl index 3b86fefd9cb..96b8347a109 100644 --- a/bazel/grpc_deps.bzl +++ b/bazel/grpc_deps.bzl @@ -277,11 +277,11 @@ def grpc_deps(): if "envoy_api" not in native.existing_rules(): http_archive( name = "envoy_api", - sha256 = "4ba23e0370ec358d1050c020e00cd020f03644a733aaf8fd85cc43d17b92236a", - strip_prefix = "data-plane-api-0487bbb43c3e8b54c7332f74ba7344d8265774f7", + sha256 = "9150f920abd3e710e0e58519cd769822f13d7a56988f2c34c2008815ec8d9c88", + strip_prefix = "data-plane-api-8dcc476be69437b505af181a6e8b167fdb101d7e", urls = [ - "https://storage.googleapis.com/grpc-bazel-mirror/github.com/envoyproxy/data-plane-api/archive/0487bbb43c3e8b54c7332f74ba7344d8265774f7.tar.gz", - "https://github.com/envoyproxy/data-plane-api/archive/0487bbb43c3e8b54c7332f74ba7344d8265774f7.tar.gz", + "https://storage.googleapis.com/grpc-bazel-mirror/github.com/envoyproxy/data-plane-api/archive/8dcc476be69437b505af181a6e8b167fdb101d7e.tar.gz", + "https://github.com/envoyproxy/data-plane-api/archive/8dcc476be69437b505af181a6e8b167fdb101d7e.tar.gz", ], ) diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml index eeb81843c74..8c9118d22a7 100644 --- a/build_autogenerated.yaml +++ b/build_autogenerated.yaml @@ -459,18 +459,24 @@ libs: - src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h - src/core/ext/upb-generated/envoy/annotations/resource.upb.h - src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h + - src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.h + - src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.h + - src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.h - src/core/ext/upb-generated/envoy/api/v2/cds.upb.h - src/core/ext/upb-generated/envoy/api/v2/cluster.upb.h - src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.h - src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.h - src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.h - src/core/ext/upb-generated/envoy/api/v2/core/address.upb.h + - src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.h - src/core/ext/upb-generated/envoy/api/v2/core/base.upb.h - src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.h + - src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.h - src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.h - src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.h - src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.h - src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h + - src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.h - src/core/ext/upb-generated/envoy/api/v2/discovery.upb.h - src/core/ext/upb-generated/envoy/api/v2/eds.upb.h - src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.h @@ -491,6 +497,7 @@ libs: - src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.h - src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.h - src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.h + - src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.h - src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.h - src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.h - src/core/ext/upb-generated/envoy/type/http.upb.h @@ -519,6 +526,7 @@ libs: - src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h - src/core/ext/upb-generated/udpa/annotations/migrate.upb.h - src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h + - src/core/ext/upb-generated/udpa/annotations/status.upb.h - src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h - src/core/ext/upb-generated/validate/validate.upb.h - src/core/lib/avl/avl.h @@ -840,18 +848,24 @@ libs: - src/core/ext/upb-generated/envoy/annotations/deprecation.upb.c - src/core/ext/upb-generated/envoy/annotations/resource.upb.c - src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c + - src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.c + - src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.c + - src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.c - src/core/ext/upb-generated/envoy/api/v2/cds.upb.c - src/core/ext/upb-generated/envoy/api/v2/cluster.upb.c - src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c - src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.c - src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c - src/core/ext/upb-generated/envoy/api/v2/core/address.upb.c + - src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.c - src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c - src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c + - src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.c - src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c - src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c - src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.c - src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c + - src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.c - src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c - src/core/ext/upb-generated/envoy/api/v2/eds.upb.c - src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.c @@ -872,6 +886,7 @@ libs: - src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.c - src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.c - src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.c + - src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.c - src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.c - src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.c - src/core/ext/upb-generated/envoy/type/http.upb.c @@ -900,6 +915,7 @@ libs: - src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c - src/core/ext/upb-generated/udpa/annotations/migrate.upb.c - src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c + - src/core/ext/upb-generated/udpa/annotations/status.upb.c - src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c - src/core/ext/upb-generated/validate/validate.upb.c - src/core/lib/avl/avl.cc @@ -1363,18 +1379,24 @@ libs: - src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h - src/core/ext/upb-generated/envoy/annotations/resource.upb.h - src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h + - src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.h + - src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.h + - src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.h - src/core/ext/upb-generated/envoy/api/v2/cds.upb.h - src/core/ext/upb-generated/envoy/api/v2/cluster.upb.h - src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.h - src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.h - src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.h - src/core/ext/upb-generated/envoy/api/v2/core/address.upb.h + - src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.h - src/core/ext/upb-generated/envoy/api/v2/core/base.upb.h - src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.h + - src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.h - src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.h - src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.h - src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.h - src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h + - src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.h - src/core/ext/upb-generated/envoy/api/v2/discovery.upb.h - src/core/ext/upb-generated/envoy/api/v2/eds.upb.h - src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.h @@ -1395,6 +1417,7 @@ libs: - src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.h - src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.h - src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.h + - src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.h - src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.h - src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.h - src/core/ext/upb-generated/envoy/type/http.upb.h @@ -1420,6 +1443,7 @@ libs: - src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h - src/core/ext/upb-generated/udpa/annotations/migrate.upb.h - src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h + - src/core/ext/upb-generated/udpa/annotations/status.upb.h - src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h - src/core/ext/upb-generated/validate/validate.upb.h - src/core/lib/avl/avl.h @@ -1678,18 +1702,24 @@ libs: - src/core/ext/upb-generated/envoy/annotations/deprecation.upb.c - src/core/ext/upb-generated/envoy/annotations/resource.upb.c - src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c + - src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.c + - src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.c + - src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.c - src/core/ext/upb-generated/envoy/api/v2/cds.upb.c - src/core/ext/upb-generated/envoy/api/v2/cluster.upb.c - src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c - src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.c - src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c - src/core/ext/upb-generated/envoy/api/v2/core/address.upb.c + - src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.c - src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c - src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c + - src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.c - src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c - src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c - src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.c - src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c + - src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.c - src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c - src/core/ext/upb-generated/envoy/api/v2/eds.upb.c - src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.c @@ -1710,6 +1740,7 @@ libs: - src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.c - src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.c - src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.c + - src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.c - src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.c - src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.c - src/core/ext/upb-generated/envoy/type/http.upb.c @@ -1735,6 +1766,7 @@ libs: - src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c - src/core/ext/upb-generated/udpa/annotations/migrate.upb.c - src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c + - src/core/ext/upb-generated/udpa/annotations/status.upb.c - src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c - src/core/ext/upb-generated/validate/validate.upb.c - src/core/lib/avl/avl.cc diff --git a/config.m4 b/config.m4 index 325945b4976..77652ca42df 100644 --- a/config.m4 +++ b/config.m4 @@ -149,18 +149,24 @@ if test "$PHP_GRPC" != "no"; then src/core/ext/upb-generated/envoy/annotations/deprecation.upb.c \ src/core/ext/upb-generated/envoy/annotations/resource.upb.c \ src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.c \ src/core/ext/upb-generated/envoy/api/v2/cds.upb.c \ src/core/ext/upb-generated/envoy/api/v2/cluster.upb.c \ src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c \ src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.c \ src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c \ src/core/ext/upb-generated/envoy/api/v2/core/address.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.c \ src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c \ src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.c \ src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c \ src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c \ src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.c \ src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c \ + src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.c \ src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c \ src/core/ext/upb-generated/envoy/api/v2/eds.upb.c \ src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.c \ @@ -181,6 +187,7 @@ if test "$PHP_GRPC" != "no"; then src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.c \ src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.c \ src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.c \ + src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.c \ src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.c \ src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.c \ src/core/ext/upb-generated/envoy/type/http.upb.c \ @@ -209,6 +216,7 @@ if test "$PHP_GRPC" != "no"; then src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c \ src/core/ext/upb-generated/udpa/annotations/migrate.upb.c \ src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c \ + src/core/ext/upb-generated/udpa/annotations/status.upb.c \ src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c \ src/core/ext/upb-generated/validate/validate.upb.c \ src/core/lib/avl/avl.cc \ @@ -868,6 +876,7 @@ if test "$PHP_GRPC" != "no"; then PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/config/filter/accesslog/v2) PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2) PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/config/listener/v2) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/config/trace/v2) PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/service/discovery/v2) PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/service/load_stats/v2) PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/envoy/type) diff --git a/config.w32 b/config.w32 index 2cad1c40ec8..a090827e55c 100644 --- a/config.w32 +++ b/config.w32 @@ -118,18 +118,24 @@ if (PHP_GRPC != "no") { "src\\core\\ext\\upb-generated\\envoy\\annotations\\deprecation.upb.c " + "src\\core\\ext\\upb-generated\\envoy\\annotations\\resource.upb.c " + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\auth\\cert.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\auth\\common.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\auth\\secret.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\auth\\tls.upb.c " + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\cds.upb.c " + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\cluster.upb.c " + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\cluster\\circuit_breaker.upb.c " + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\cluster\\filter.upb.c " + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\cluster\\outlier_detection.upb.c " + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\core\\address.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\core\\backoff.upb.c " + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\core\\base.upb.c " + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\core\\config_source.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\core\\event_service_config.upb.c " + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\core\\grpc_service.upb.c " + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\core\\health_check.upb.c " + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\core\\http_uri.upb.c " + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\core\\protocol.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\core\\socket_option.upb.c " + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\discovery.upb.c " + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\eds.upb.c " + "src\\core\\ext\\upb-generated\\envoy\\api\\v2\\endpoint.upb.c " + @@ -150,6 +156,7 @@ if (PHP_GRPC != "no") { "src\\core\\ext\\upb-generated\\envoy\\config\\filter\\accesslog\\v2\\accesslog.upb.c " + "src\\core\\ext\\upb-generated\\envoy\\config\\filter\\network\\http_connection_manager\\v2\\http_connection_manager.upb.c " + "src\\core\\ext\\upb-generated\\envoy\\config\\listener\\v2\\api_listener.upb.c " + + "src\\core\\ext\\upb-generated\\envoy\\config\\trace\\v2\\http_tracer.upb.c " + "src\\core\\ext\\upb-generated\\envoy\\service\\discovery\\v2\\ads.upb.c " + "src\\core\\ext\\upb-generated\\envoy\\service\\load_stats\\v2\\lrs.upb.c " + "src\\core\\ext\\upb-generated\\envoy\\type\\http.upb.c " + @@ -178,6 +185,7 @@ if (PHP_GRPC != "no") { "src\\core\\ext\\upb-generated\\src\\proto\\grpc\\lb\\v1\\load_balancer.upb.c " + "src\\core\\ext\\upb-generated\\udpa\\annotations\\migrate.upb.c " + "src\\core\\ext\\upb-generated\\udpa\\annotations\\sensitive.upb.c " + + "src\\core\\ext\\upb-generated\\udpa\\annotations\\status.upb.c " + "src\\core\\ext\\upb-generated\\udpa\\data\\orca\\v1\\orca_load_report.upb.c " + "src\\core\\ext\\upb-generated\\validate\\validate.upb.c " + "src\\core\\lib\\avl\\avl.cc " + @@ -880,6 +888,8 @@ if (PHP_GRPC != "no") { FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\config\\filter\\network\\http_connection_manager\\v2"); FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\config\\listener"); FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\config\\listener\\v2"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\config\\trace"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\config\\trace\\v2"); FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\service"); FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\service\\discovery"); FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\envoy\\service\\discovery\\v2"); diff --git a/gRPC-C++.podspec b/gRPC-C++.podspec index a3c35cbc912..a361c475fa3 100644 --- a/gRPC-C++.podspec +++ b/gRPC-C++.podspec @@ -309,18 +309,24 @@ Pod::Spec.new do |s| 'src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h', 'src/core/ext/upb-generated/envoy/annotations/resource.upb.h', 'src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.h', 'src/core/ext/upb-generated/envoy/api/v2/cds.upb.h', 'src/core/ext/upb-generated/envoy/api/v2/cluster.upb.h', 'src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.h', 'src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.h', 'src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.h', 'src/core/ext/upb-generated/envoy/api/v2/core/address.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.h', 'src/core/ext/upb-generated/envoy/api/v2/core/base.upb.h', 'src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.h', 'src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.h', 'src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.h', 'src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.h', 'src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.h', 'src/core/ext/upb-generated/envoy/api/v2/discovery.upb.h', 'src/core/ext/upb-generated/envoy/api/v2/eds.upb.h', 'src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.h', @@ -341,6 +347,7 @@ Pod::Spec.new do |s| 'src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.h', 'src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.h', 'src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.h', + 'src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.h', 'src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.h', 'src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.h', 'src/core/ext/upb-generated/envoy/type/http.upb.h', @@ -369,6 +376,7 @@ Pod::Spec.new do |s| 'src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h', 'src/core/ext/upb-generated/udpa/annotations/migrate.upb.h', 'src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h', + 'src/core/ext/upb-generated/udpa/annotations/status.upb.h', 'src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h', 'src/core/ext/upb-generated/validate/validate.upb.h', 'src/core/lib/avl/avl.h', @@ -758,18 +766,24 @@ Pod::Spec.new do |s| 'src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h', 'src/core/ext/upb-generated/envoy/annotations/resource.upb.h', 'src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.h', 'src/core/ext/upb-generated/envoy/api/v2/cds.upb.h', 'src/core/ext/upb-generated/envoy/api/v2/cluster.upb.h', 'src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.h', 'src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.h', 'src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.h', 'src/core/ext/upb-generated/envoy/api/v2/core/address.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.h', 'src/core/ext/upb-generated/envoy/api/v2/core/base.upb.h', 'src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.h', 'src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.h', 'src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.h', 'src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.h', 'src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.h', 'src/core/ext/upb-generated/envoy/api/v2/discovery.upb.h', 'src/core/ext/upb-generated/envoy/api/v2/eds.upb.h', 'src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.h', @@ -790,6 +804,7 @@ Pod::Spec.new do |s| 'src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.h', 'src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.h', 'src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.h', + 'src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.h', 'src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.h', 'src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.h', 'src/core/ext/upb-generated/envoy/type/http.upb.h', @@ -818,6 +833,7 @@ Pod::Spec.new do |s| 'src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h', 'src/core/ext/upb-generated/udpa/annotations/migrate.upb.h', 'src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h', + 'src/core/ext/upb-generated/udpa/annotations/status.upb.h', 'src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h', 'src/core/ext/upb-generated/validate/validate.upb.h', 'src/core/lib/avl/avl.h', diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec index 8bf16911cc6..53a81031b6c 100644 --- a/gRPC-Core.podspec +++ b/gRPC-Core.podspec @@ -381,6 +381,12 @@ Pod::Spec.new do |s| 'src/core/ext/upb-generated/envoy/annotations/resource.upb.h', 'src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c', 'src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.h', 'src/core/ext/upb-generated/envoy/api/v2/cds.upb.c', 'src/core/ext/upb-generated/envoy/api/v2/cds.upb.h', 'src/core/ext/upb-generated/envoy/api/v2/cluster.upb.c', @@ -393,10 +399,14 @@ Pod::Spec.new do |s| 'src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.h', 'src/core/ext/upb-generated/envoy/api/v2/core/address.upb.c', 'src/core/ext/upb-generated/envoy/api/v2/core/address.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.h', 'src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c', 'src/core/ext/upb-generated/envoy/api/v2/core/base.upb.h', 'src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c', 'src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.h', 'src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c', 'src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.h', 'src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c', @@ -405,6 +415,8 @@ Pod::Spec.new do |s| 'src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.h', 'src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c', 'src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.h', 'src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c', 'src/core/ext/upb-generated/envoy/api/v2/discovery.upb.h', 'src/core/ext/upb-generated/envoy/api/v2/eds.upb.c', @@ -445,6 +457,8 @@ Pod::Spec.new do |s| 'src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.h', 'src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.c', 'src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.h', + 'src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.c', + 'src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.h', 'src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.c', 'src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.h', 'src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.c', @@ -501,6 +515,8 @@ Pod::Spec.new do |s| 'src/core/ext/upb-generated/udpa/annotations/migrate.upb.h', 'src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c', 'src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h', + 'src/core/ext/upb-generated/udpa/annotations/status.upb.c', + 'src/core/ext/upb-generated/udpa/annotations/status.upb.h', 'src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c', 'src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h', 'src/core/ext/upb-generated/validate/validate.upb.c', @@ -1114,18 +1130,24 @@ Pod::Spec.new do |s| 'src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h', 'src/core/ext/upb-generated/envoy/annotations/resource.upb.h', 'src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.h', 'src/core/ext/upb-generated/envoy/api/v2/cds.upb.h', 'src/core/ext/upb-generated/envoy/api/v2/cluster.upb.h', 'src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.h', 'src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.h', 'src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.h', 'src/core/ext/upb-generated/envoy/api/v2/core/address.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.h', 'src/core/ext/upb-generated/envoy/api/v2/core/base.upb.h', 'src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.h', 'src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.h', 'src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.h', 'src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.h', 'src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h', + 'src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.h', 'src/core/ext/upb-generated/envoy/api/v2/discovery.upb.h', 'src/core/ext/upb-generated/envoy/api/v2/eds.upb.h', 'src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.h', @@ -1146,6 +1168,7 @@ Pod::Spec.new do |s| 'src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.h', 'src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.h', 'src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.h', + 'src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.h', 'src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.h', 'src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.h', 'src/core/ext/upb-generated/envoy/type/http.upb.h', @@ -1174,6 +1197,7 @@ Pod::Spec.new do |s| 'src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h', 'src/core/ext/upb-generated/udpa/annotations/migrate.upb.h', 'src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h', + 'src/core/ext/upb-generated/udpa/annotations/status.upb.h', 'src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h', 'src/core/ext/upb-generated/validate/validate.upb.h', 'src/core/lib/avl/avl.h', diff --git a/grpc.gemspec b/grpc.gemspec index a1f538c1501..4a56747d940 100644 --- a/grpc.gemspec +++ b/grpc.gemspec @@ -303,6 +303,12 @@ Gem::Specification.new do |s| s.files += %w( src/core/ext/upb-generated/envoy/annotations/resource.upb.h ) s.files += %w( src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c ) s.files += %w( src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.h ) s.files += %w( src/core/ext/upb-generated/envoy/api/v2/cds.upb.c ) s.files += %w( src/core/ext/upb-generated/envoy/api/v2/cds.upb.h ) s.files += %w( src/core/ext/upb-generated/envoy/api/v2/cluster.upb.c ) @@ -315,10 +321,14 @@ Gem::Specification.new do |s| s.files += %w( src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.h ) s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/address.upb.c ) s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/address.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.h ) s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c ) s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/base.upb.h ) s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c ) s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.h ) s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c ) s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.h ) s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c ) @@ -327,6 +337,8 @@ Gem::Specification.new do |s| s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.h ) s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c ) s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.h ) s.files += %w( src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c ) s.files += %w( src/core/ext/upb-generated/envoy/api/v2/discovery.upb.h ) s.files += %w( src/core/ext/upb-generated/envoy/api/v2/eds.upb.c ) @@ -367,6 +379,8 @@ Gem::Specification.new do |s| s.files += %w( src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.h ) s.files += %w( src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.c ) s.files += %w( src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.h ) + s.files += %w( src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.c ) + s.files += %w( src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.h ) s.files += %w( src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.c ) s.files += %w( src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.h ) s.files += %w( src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.c ) @@ -423,6 +437,8 @@ Gem::Specification.new do |s| s.files += %w( src/core/ext/upb-generated/udpa/annotations/migrate.upb.h ) s.files += %w( src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c ) s.files += %w( src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h ) + s.files += %w( src/core/ext/upb-generated/udpa/annotations/status.upb.c ) + s.files += %w( src/core/ext/upb-generated/udpa/annotations/status.upb.h ) s.files += %w( src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c ) s.files += %w( src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h ) s.files += %w( src/core/ext/upb-generated/validate/validate.upb.c ) diff --git a/grpc.gyp b/grpc.gyp index 865c403fde7..71c8fcf0a21 100644 --- a/grpc.gyp +++ b/grpc.gyp @@ -544,18 +544,24 @@ 'src/core/ext/upb-generated/envoy/annotations/deprecation.upb.c', 'src/core/ext/upb-generated/envoy/annotations/resource.upb.c', 'src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.c', 'src/core/ext/upb-generated/envoy/api/v2/cds.upb.c', 'src/core/ext/upb-generated/envoy/api/v2/cluster.upb.c', 'src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c', 'src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.c', 'src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c', 'src/core/ext/upb-generated/envoy/api/v2/core/address.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.c', 'src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c', 'src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.c', 'src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c', 'src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c', 'src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.c', 'src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.c', 'src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c', 'src/core/ext/upb-generated/envoy/api/v2/eds.upb.c', 'src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.c', @@ -576,6 +582,7 @@ 'src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.c', 'src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.c', 'src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.c', + 'src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.c', 'src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.c', 'src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.c', 'src/core/ext/upb-generated/envoy/type/http.upb.c', @@ -604,6 +611,7 @@ 'src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c', 'src/core/ext/upb-generated/udpa/annotations/migrate.upb.c', 'src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c', + 'src/core/ext/upb-generated/udpa/annotations/status.upb.c', 'src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c', 'src/core/ext/upb-generated/validate/validate.upb.c', 'src/core/lib/avl/avl.cc', @@ -1040,18 +1048,24 @@ 'src/core/ext/upb-generated/envoy/annotations/deprecation.upb.c', 'src/core/ext/upb-generated/envoy/annotations/resource.upb.c', 'src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.c', 'src/core/ext/upb-generated/envoy/api/v2/cds.upb.c', 'src/core/ext/upb-generated/envoy/api/v2/cluster.upb.c', 'src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c', 'src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.c', 'src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c', 'src/core/ext/upb-generated/envoy/api/v2/core/address.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.c', 'src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c', 'src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.c', 'src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c', 'src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c', 'src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.c', 'src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.c', 'src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c', 'src/core/ext/upb-generated/envoy/api/v2/eds.upb.c', 'src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.c', @@ -1072,6 +1086,7 @@ 'src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.c', 'src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.c', 'src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.c', + 'src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.c', 'src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.c', 'src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.c', 'src/core/ext/upb-generated/envoy/type/http.upb.c', @@ -1097,6 +1112,7 @@ 'src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c', 'src/core/ext/upb-generated/udpa/annotations/migrate.upb.c', 'src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c', + 'src/core/ext/upb-generated/udpa/annotations/status.upb.c', 'src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c', 'src/core/ext/upb-generated/validate/validate.upb.c', 'src/core/lib/avl/avl.cc', diff --git a/package.xml b/package.xml index 42f91a37b8c..7a57d6102cf 100644 --- a/package.xml +++ b/package.xml @@ -283,6 +283,12 @@ + + + + + + @@ -295,10 +301,14 @@ + + + + @@ -307,6 +317,8 @@ + + @@ -347,6 +359,8 @@ + + @@ -403,6 +417,8 @@ + + diff --git a/src/core/ext/filters/client_channel/xds/xds_api.cc b/src/core/ext/filters/client_channel/xds/xds_api.cc index 3c977d6152f..8ae63167262 100644 --- a/src/core/ext/filters/client_channel/xds/xds_api.cc +++ b/src/core/ext/filters/client_channel/xds/xds_api.cc @@ -1695,6 +1695,9 @@ grpc_slice XdsApi::CreateLrsInitialRequest(const std::string& server_name) { arena.ptr()); PopulateNode(arena.ptr(), node_, build_version_, user_agent_name_, server_name, node_msg); + envoy_api_v2_core_Node_add_client_features( + node_msg, upb_strview_makez("envoy.lrs.supports_send_all_clusters"), + arena.ptr()); MaybeLogLrsRequest(client_, tracer_, request); return SerializeLrsRequest(request, arena.ptr()); } @@ -1813,6 +1816,7 @@ grpc_slice XdsApi::CreateLrsRequest( } grpc_error* XdsApi::ParseLrsResponse(const grpc_slice& encoded_response, + bool* send_all_clusters, std::set* cluster_names, grpc_millis* load_reporting_interval) { upb::Arena arena; @@ -1825,13 +1829,19 @@ grpc_error* XdsApi::ParseLrsResponse(const grpc_slice& encoded_response, if (decoded_response == nullptr) { return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Can't decode response."); } - // Store the cluster names. - size_t size; - const upb_strview* clusters = - envoy_service_load_stats_v2_LoadStatsResponse_clusters(decoded_response, - &size); - for (size_t i = 0; i < size; ++i) { - cluster_names->emplace(clusters[i].data, clusters[i].size); + // Check send_all_clusters. + if (envoy_service_load_stats_v2_LoadStatsResponse_send_all_clusters( + decoded_response)) { + *send_all_clusters = true; + } else { + // Store the cluster names. + size_t size; + const upb_strview* clusters = + envoy_service_load_stats_v2_LoadStatsResponse_clusters(decoded_response, + &size); + for (size_t i = 0; i < size; ++i) { + cluster_names->emplace(clusters[i].data, clusters[i].size); + } } // Get the load report interval. const google_protobuf_Duration* load_reporting_interval_duration = diff --git a/src/core/ext/filters/client_channel/xds/xds_api.h b/src/core/ext/filters/client_channel/xds/xds_api.h index a2d2d629f69..f9a906400ee 100644 --- a/src/core/ext/filters/client_channel/xds/xds_api.h +++ b/src/core/ext/filters/client_channel/xds/xds_api.h @@ -276,6 +276,7 @@ class XdsApi { // load_reporting_interval for client-side load reporting. If there is any // error, the output config is invalid. grpc_error* ParseLrsResponse(const grpc_slice& encoded_response, + bool* send_all_clusters, std::set* cluster_names, grpc_millis* load_reporting_interval); diff --git a/src/core/ext/filters/client_channel/xds/xds_client.cc b/src/core/ext/filters/client_channel/xds/xds_client.cc index 70c6ebf1889..b57aa15725d 100644 --- a/src/core/ext/filters/client_channel/xds/xds_client.cc +++ b/src/core/ext/filters/client_channel/xds/xds_client.cc @@ -382,6 +382,7 @@ class XdsClient::ChannelState::LrsCallState grpc_closure on_status_received_; // Load reporting state. + bool send_all_clusters_ = false; std::set cluster_names_; // Asked for by the LRS server. grpc_millis load_reporting_interval_ = 0; OrphanablePtr reporter_; @@ -1426,8 +1427,8 @@ bool LoadReportCountersAreZero(const XdsApi::ClusterLoadReportMap& snapshot) { void XdsClient::ChannelState::LrsCallState::Reporter::SendReportLocked() { // Construct snapshot from all reported stats. - XdsApi::ClusterLoadReportMap snapshot = - xds_client()->BuildLoadReportSnapshot(parent_->cluster_names_); + XdsApi::ClusterLoadReportMap snapshot = xds_client()->BuildLoadReportSnapshot( + parent_->send_all_clusters_, parent_->cluster_names_); // Skip client load report if the counters were all zero in the last // report and they are still zero in this one. const bool old_val = last_report_counters_were_zero_; @@ -1669,10 +1670,12 @@ void XdsClient::ChannelState::LrsCallState::OnResponseReceivedLocked() { // This anonymous lambda is a hack to avoid the usage of goto. [&]() { // Parse the response. + bool send_all_clusters = false; std::set new_cluster_names; grpc_millis new_load_reporting_interval; grpc_error* parse_error = xds_client()->api_.ParseLrsResponse( - response_slice, &new_cluster_names, &new_load_reporting_interval); + response_slice, &send_all_clusters, &new_cluster_names, + &new_load_reporting_interval); if (parse_error != GRPC_ERROR_NONE) { gpr_log(GPR_ERROR, "[xds_client %p] LRS response parsing failed. error=%s", @@ -1682,11 +1685,13 @@ void XdsClient::ChannelState::LrsCallState::OnResponseReceivedLocked() { } seen_response_ = true; if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) { - gpr_log(GPR_INFO, - "[xds_client %p] LRS response received, %" PRIuPTR - " cluster names, load_report_interval=%" PRId64 "ms", - xds_client(), new_cluster_names.size(), - new_load_reporting_interval); + gpr_log( + GPR_INFO, + "[xds_client %p] LRS response received, %" PRIuPTR + " cluster names, send_all_clusters=%d, load_report_interval=%" PRId64 + "ms", + xds_client(), new_cluster_names.size(), send_all_clusters, + new_load_reporting_interval); size_t i = 0; for (const auto& name : new_cluster_names) { gpr_log(GPR_INFO, "[xds_client %p] cluster_name %" PRIuPTR ": %s", @@ -1705,7 +1710,8 @@ void XdsClient::ChannelState::LrsCallState::OnResponseReceivedLocked() { } } // Ignore identical update. - if (cluster_names_ == new_cluster_names && + if (send_all_clusters == send_all_clusters_ && + cluster_names_ == new_cluster_names && load_reporting_interval_ == new_load_reporting_interval) { if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) { gpr_log(GPR_INFO, @@ -1718,6 +1724,7 @@ void XdsClient::ChannelState::LrsCallState::OnResponseReceivedLocked() { // Stop current load reporting (if any) to adopt the new config. reporter_.reset(); // Record the new config. + send_all_clusters_ = send_all_clusters; cluster_names_ = std::move(new_cluster_names); load_reporting_interval_ = new_load_reporting_interval; // Try starting sending load report. @@ -2106,7 +2113,7 @@ grpc_error* XdsClient::CreateServiceConfig( } XdsApi::ClusterLoadReportMap XdsClient::BuildLoadReportSnapshot( - const std::set& clusters) { + bool send_all_clusters, const std::set& clusters) { XdsApi::ClusterLoadReportMap snapshot_map; for (auto load_report_it = load_report_map_.begin(); load_report_it != load_report_map_.end();) { @@ -2121,7 +2128,7 @@ XdsApi::ClusterLoadReportMap XdsClient::BuildLoadReportSnapshot( // asking for the data in the future, we don't incorrectly include // data from previous reporting intervals in that future report. const bool record_stats = - clusters.find(cluster_key.first) != clusters.end(); + send_all_clusters || clusters.find(cluster_key.first) != clusters.end(); XdsApi::ClusterLoadReport snapshot; // Aggregate drop stats. snapshot.dropped_requests = std::move(load_report.deleted_drop_stats); diff --git a/src/core/ext/filters/client_channel/xds/xds_client.h b/src/core/ext/filters/client_channel/xds/xds_client.h index 2b0e3281b86..725c5da011a 100644 --- a/src/core/ext/filters/client_channel/xds/xds_client.h +++ b/src/core/ext/filters/client_channel/xds/xds_client.h @@ -231,7 +231,7 @@ class XdsClient : public InternallyRefCounted { RefCountedPtr* service_config) const; XdsApi::ClusterLoadReportMap BuildLoadReportSnapshot( - const std::set& clusters); + bool send_all_clusters, const std::set& clusters); // Channel arg vtable functions. static void* ChannelArgCopy(void* p); diff --git a/src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c b/src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c index e56cf2225cd..e27f8989135 100644 --- a/src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c +++ b/src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c @@ -9,238 +9,13 @@ #include #include "upb/msg.h" #include "envoy/api/v2/auth/cert.upb.h" -#include "envoy/api/v2/core/base.upb.h" -#include "envoy/api/v2/core/config_source.upb.h" -#include "envoy/type/matcher/string.upb.h" -#include "google/protobuf/any.upb.h" -#include "google/protobuf/duration.upb.h" -#include "google/protobuf/struct.upb.h" -#include "google/protobuf/wrappers.upb.h" -#include "udpa/annotations/sensitive.upb.h" #include "udpa/annotations/migrate.upb.h" -#include "validate/validate.upb.h" +#include "udpa/annotations/status.upb.h" +#include "envoy/api/v2/auth/common.upb.h" +#include "envoy/api/v2/auth/secret.upb.h" +#include "envoy/api/v2/auth/tls.upb.h" #include "upb/port_def.inc" -static const upb_msglayout_field envoy_api_v2_auth_TlsParameters__fields[4] = { - {1, UPB_SIZE(0, 0), 0, 0, 14, 1}, - {2, UPB_SIZE(8, 8), 0, 0, 14, 1}, - {3, UPB_SIZE(16, 16), 0, 0, 9, 3}, - {4, UPB_SIZE(20, 24), 0, 0, 9, 3}, -}; - -const upb_msglayout envoy_api_v2_auth_TlsParameters_msginit = { - NULL, - &envoy_api_v2_auth_TlsParameters__fields[0], - UPB_SIZE(24, 32), 4, false, -}; - -static const upb_msglayout *const envoy_api_v2_auth_PrivateKeyProvider_submsgs[2] = { - &google_protobuf_Any_msginit, - &google_protobuf_Struct_msginit, -}; - -static const upb_msglayout_field envoy_api_v2_auth_PrivateKeyProvider__fields[3] = { - {1, UPB_SIZE(0, 0), 0, 0, 9, 1}, - {2, UPB_SIZE(8, 16), UPB_SIZE(-13, -25), 1, 11, 1}, - {3, UPB_SIZE(8, 16), UPB_SIZE(-13, -25), 0, 11, 1}, -}; - -const upb_msglayout envoy_api_v2_auth_PrivateKeyProvider_msginit = { - &envoy_api_v2_auth_PrivateKeyProvider_submsgs[0], - &envoy_api_v2_auth_PrivateKeyProvider__fields[0], - UPB_SIZE(16, 32), 3, false, -}; - -static const upb_msglayout *const envoy_api_v2_auth_TlsCertificate_submsgs[6] = { - &envoy_api_v2_auth_PrivateKeyProvider_msginit, - &envoy_api_v2_core_DataSource_msginit, -}; - -static const upb_msglayout_field envoy_api_v2_auth_TlsCertificate__fields[6] = { - {1, UPB_SIZE(0, 0), 0, 1, 11, 1}, - {2, UPB_SIZE(4, 8), 0, 1, 11, 1}, - {3, UPB_SIZE(8, 16), 0, 1, 11, 1}, - {4, UPB_SIZE(12, 24), 0, 1, 11, 1}, - {5, UPB_SIZE(20, 40), 0, 1, 11, 3}, - {6, UPB_SIZE(16, 32), 0, 0, 11, 1}, -}; - -const upb_msglayout envoy_api_v2_auth_TlsCertificate_msginit = { - &envoy_api_v2_auth_TlsCertificate_submsgs[0], - &envoy_api_v2_auth_TlsCertificate__fields[0], - UPB_SIZE(24, 48), 6, false, -}; - -static const upb_msglayout *const envoy_api_v2_auth_TlsSessionTicketKeys_submsgs[1] = { - &envoy_api_v2_core_DataSource_msginit, -}; - -static const upb_msglayout_field envoy_api_v2_auth_TlsSessionTicketKeys__fields[1] = { - {1, UPB_SIZE(0, 0), 0, 0, 11, 3}, -}; - -const upb_msglayout envoy_api_v2_auth_TlsSessionTicketKeys_msginit = { - &envoy_api_v2_auth_TlsSessionTicketKeys_submsgs[0], - &envoy_api_v2_auth_TlsSessionTicketKeys__fields[0], - UPB_SIZE(4, 8), 1, false, -}; - -static const upb_msglayout *const envoy_api_v2_auth_CertificateValidationContext_submsgs[5] = { - &envoy_api_v2_core_DataSource_msginit, - &envoy_type_matcher_StringMatcher_msginit, - &google_protobuf_BoolValue_msginit, -}; - -static const upb_msglayout_field envoy_api_v2_auth_CertificateValidationContext__fields[10] = { - {1, UPB_SIZE(12, 16), 0, 0, 11, 1}, - {2, UPB_SIZE(28, 48), 0, 0, 9, 3}, - {3, UPB_SIZE(32, 56), 0, 0, 9, 3}, - {4, UPB_SIZE(36, 64), 0, 0, 9, 3}, - {5, UPB_SIZE(16, 24), 0, 2, 11, 1}, - {6, UPB_SIZE(20, 32), 0, 2, 11, 1}, - {7, UPB_SIZE(24, 40), 0, 0, 11, 1}, - {8, UPB_SIZE(8, 8), 0, 0, 8, 1}, - {9, UPB_SIZE(40, 72), 0, 1, 11, 3}, - {10, UPB_SIZE(0, 0), 0, 0, 14, 1}, -}; - -const upb_msglayout envoy_api_v2_auth_CertificateValidationContext_msginit = { - &envoy_api_v2_auth_CertificateValidationContext_submsgs[0], - &envoy_api_v2_auth_CertificateValidationContext__fields[0], - UPB_SIZE(48, 80), 10, false, -}; - -static const upb_msglayout *const envoy_api_v2_auth_CommonTlsContext_submsgs[6] = { - &envoy_api_v2_auth_CertificateValidationContext_msginit, - &envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext_msginit, - &envoy_api_v2_auth_SdsSecretConfig_msginit, - &envoy_api_v2_auth_TlsCertificate_msginit, - &envoy_api_v2_auth_TlsParameters_msginit, -}; - -static const upb_msglayout_field envoy_api_v2_auth_CommonTlsContext__fields[7] = { - {1, UPB_SIZE(0, 0), 0, 4, 11, 1}, - {2, UPB_SIZE(4, 8), 0, 3, 11, 3}, - {3, UPB_SIZE(16, 32), UPB_SIZE(-21, -41), 0, 11, 1}, - {4, UPB_SIZE(8, 16), 0, 0, 9, 3}, - {6, UPB_SIZE(12, 24), 0, 2, 11, 3}, - {7, UPB_SIZE(16, 32), UPB_SIZE(-21, -41), 2, 11, 1}, - {8, UPB_SIZE(16, 32), UPB_SIZE(-21, -41), 1, 11, 1}, -}; - -const upb_msglayout envoy_api_v2_auth_CommonTlsContext_msginit = { - &envoy_api_v2_auth_CommonTlsContext_submsgs[0], - &envoy_api_v2_auth_CommonTlsContext__fields[0], - UPB_SIZE(24, 48), 7, false, -}; - -static const upb_msglayout *const envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext_submsgs[2] = { - &envoy_api_v2_auth_CertificateValidationContext_msginit, - &envoy_api_v2_auth_SdsSecretConfig_msginit, -}; - -static const upb_msglayout_field envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext__fields[2] = { - {1, UPB_SIZE(0, 0), 0, 0, 11, 1}, - {2, UPB_SIZE(4, 8), 0, 1, 11, 1}, -}; - -const upb_msglayout envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext_msginit = { - &envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext_submsgs[0], - &envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext__fields[0], - UPB_SIZE(8, 16), 2, false, -}; - -static const upb_msglayout *const envoy_api_v2_auth_UpstreamTlsContext_submsgs[2] = { - &envoy_api_v2_auth_CommonTlsContext_msginit, - &google_protobuf_UInt32Value_msginit, -}; - -static const upb_msglayout_field envoy_api_v2_auth_UpstreamTlsContext__fields[4] = { - {1, UPB_SIZE(12, 24), 0, 0, 11, 1}, - {2, UPB_SIZE(4, 8), 0, 0, 9, 1}, - {3, UPB_SIZE(0, 0), 0, 0, 8, 1}, - {4, UPB_SIZE(16, 32), 0, 1, 11, 1}, -}; - -const upb_msglayout envoy_api_v2_auth_UpstreamTlsContext_msginit = { - &envoy_api_v2_auth_UpstreamTlsContext_submsgs[0], - &envoy_api_v2_auth_UpstreamTlsContext__fields[0], - UPB_SIZE(24, 48), 4, false, -}; - -static const upb_msglayout *const envoy_api_v2_auth_DownstreamTlsContext_submsgs[6] = { - &envoy_api_v2_auth_CommonTlsContext_msginit, - &envoy_api_v2_auth_SdsSecretConfig_msginit, - &envoy_api_v2_auth_TlsSessionTicketKeys_msginit, - &google_protobuf_BoolValue_msginit, - &google_protobuf_Duration_msginit, -}; - -static const upb_msglayout_field envoy_api_v2_auth_DownstreamTlsContext__fields[6] = { - {1, UPB_SIZE(0, 0), 0, 0, 11, 1}, - {2, UPB_SIZE(4, 8), 0, 3, 11, 1}, - {3, UPB_SIZE(8, 16), 0, 3, 11, 1}, - {4, UPB_SIZE(16, 32), UPB_SIZE(-21, -41), 2, 11, 1}, - {5, UPB_SIZE(16, 32), UPB_SIZE(-21, -41), 1, 11, 1}, - {6, UPB_SIZE(12, 24), 0, 4, 11, 1}, -}; - -const upb_msglayout envoy_api_v2_auth_DownstreamTlsContext_msginit = { - &envoy_api_v2_auth_DownstreamTlsContext_submsgs[0], - &envoy_api_v2_auth_DownstreamTlsContext__fields[0], - UPB_SIZE(24, 48), 6, false, -}; - -static const upb_msglayout *const envoy_api_v2_auth_GenericSecret_submsgs[1] = { - &envoy_api_v2_core_DataSource_msginit, -}; - -static const upb_msglayout_field envoy_api_v2_auth_GenericSecret__fields[1] = { - {1, UPB_SIZE(0, 0), 0, 0, 11, 1}, -}; - -const upb_msglayout envoy_api_v2_auth_GenericSecret_msginit = { - &envoy_api_v2_auth_GenericSecret_submsgs[0], - &envoy_api_v2_auth_GenericSecret__fields[0], - UPB_SIZE(4, 8), 1, false, -}; - -static const upb_msglayout *const envoy_api_v2_auth_SdsSecretConfig_submsgs[1] = { - &envoy_api_v2_core_ConfigSource_msginit, -}; - -static const upb_msglayout_field envoy_api_v2_auth_SdsSecretConfig__fields[2] = { - {1, UPB_SIZE(0, 0), 0, 0, 9, 1}, - {2, UPB_SIZE(8, 16), 0, 0, 11, 1}, -}; - -const upb_msglayout envoy_api_v2_auth_SdsSecretConfig_msginit = { - &envoy_api_v2_auth_SdsSecretConfig_submsgs[0], - &envoy_api_v2_auth_SdsSecretConfig__fields[0], - UPB_SIZE(16, 32), 2, false, -}; - -static const upb_msglayout *const envoy_api_v2_auth_Secret_submsgs[4] = { - &envoy_api_v2_auth_CertificateValidationContext_msginit, - &envoy_api_v2_auth_GenericSecret_msginit, - &envoy_api_v2_auth_TlsCertificate_msginit, - &envoy_api_v2_auth_TlsSessionTicketKeys_msginit, -}; - -static const upb_msglayout_field envoy_api_v2_auth_Secret__fields[5] = { - {1, UPB_SIZE(0, 0), 0, 0, 9, 1}, - {2, UPB_SIZE(8, 16), UPB_SIZE(-13, -25), 2, 11, 1}, - {3, UPB_SIZE(8, 16), UPB_SIZE(-13, -25), 3, 11, 1}, - {4, UPB_SIZE(8, 16), UPB_SIZE(-13, -25), 0, 11, 1}, - {5, UPB_SIZE(8, 16), UPB_SIZE(-13, -25), 1, 11, 1}, -}; - -const upb_msglayout envoy_api_v2_auth_Secret_msginit = { - &envoy_api_v2_auth_Secret_submsgs[0], - &envoy_api_v2_auth_Secret__fields[0], - UPB_SIZE(16, 32), 5, false, -}; - #include "upb/port_undef.inc" diff --git a/src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h b/src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h index 397be401b57..96c8ade7787 100644 --- a/src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h +++ b/src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h @@ -14,887 +14,17 @@ #include "upb/decode.h" #include "upb/encode.h" +/* Public Imports. */ +#include "envoy/api/v2/auth/common.upb.h" +#include "envoy/api/v2/auth/secret.upb.h" +#include "envoy/api/v2/auth/tls.upb.h" + #include "upb/port_def.inc" #ifdef __cplusplus extern "C" { #endif -struct envoy_api_v2_auth_TlsParameters; -struct envoy_api_v2_auth_PrivateKeyProvider; -struct envoy_api_v2_auth_TlsCertificate; -struct envoy_api_v2_auth_TlsSessionTicketKeys; -struct envoy_api_v2_auth_CertificateValidationContext; -struct envoy_api_v2_auth_CommonTlsContext; -struct envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext; -struct envoy_api_v2_auth_UpstreamTlsContext; -struct envoy_api_v2_auth_DownstreamTlsContext; -struct envoy_api_v2_auth_GenericSecret; -struct envoy_api_v2_auth_SdsSecretConfig; -struct envoy_api_v2_auth_Secret; -typedef struct envoy_api_v2_auth_TlsParameters envoy_api_v2_auth_TlsParameters; -typedef struct envoy_api_v2_auth_PrivateKeyProvider envoy_api_v2_auth_PrivateKeyProvider; -typedef struct envoy_api_v2_auth_TlsCertificate envoy_api_v2_auth_TlsCertificate; -typedef struct envoy_api_v2_auth_TlsSessionTicketKeys envoy_api_v2_auth_TlsSessionTicketKeys; -typedef struct envoy_api_v2_auth_CertificateValidationContext envoy_api_v2_auth_CertificateValidationContext; -typedef struct envoy_api_v2_auth_CommonTlsContext envoy_api_v2_auth_CommonTlsContext; -typedef struct envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext; -typedef struct envoy_api_v2_auth_UpstreamTlsContext envoy_api_v2_auth_UpstreamTlsContext; -typedef struct envoy_api_v2_auth_DownstreamTlsContext envoy_api_v2_auth_DownstreamTlsContext; -typedef struct envoy_api_v2_auth_GenericSecret envoy_api_v2_auth_GenericSecret; -typedef struct envoy_api_v2_auth_SdsSecretConfig envoy_api_v2_auth_SdsSecretConfig; -typedef struct envoy_api_v2_auth_Secret envoy_api_v2_auth_Secret; -extern const upb_msglayout envoy_api_v2_auth_TlsParameters_msginit; -extern const upb_msglayout envoy_api_v2_auth_PrivateKeyProvider_msginit; -extern const upb_msglayout envoy_api_v2_auth_TlsCertificate_msginit; -extern const upb_msglayout envoy_api_v2_auth_TlsSessionTicketKeys_msginit; -extern const upb_msglayout envoy_api_v2_auth_CertificateValidationContext_msginit; -extern const upb_msglayout envoy_api_v2_auth_CommonTlsContext_msginit; -extern const upb_msglayout envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext_msginit; -extern const upb_msglayout envoy_api_v2_auth_UpstreamTlsContext_msginit; -extern const upb_msglayout envoy_api_v2_auth_DownstreamTlsContext_msginit; -extern const upb_msglayout envoy_api_v2_auth_GenericSecret_msginit; -extern const upb_msglayout envoy_api_v2_auth_SdsSecretConfig_msginit; -extern const upb_msglayout envoy_api_v2_auth_Secret_msginit; -struct envoy_api_v2_core_ConfigSource; -struct envoy_api_v2_core_DataSource; -struct envoy_type_matcher_StringMatcher; -struct google_protobuf_Any; -struct google_protobuf_BoolValue; -struct google_protobuf_Duration; -struct google_protobuf_Struct; -struct google_protobuf_UInt32Value; -extern const upb_msglayout envoy_api_v2_core_ConfigSource_msginit; -extern const upb_msglayout envoy_api_v2_core_DataSource_msginit; -extern const upb_msglayout envoy_type_matcher_StringMatcher_msginit; -extern const upb_msglayout google_protobuf_Any_msginit; -extern const upb_msglayout google_protobuf_BoolValue_msginit; -extern const upb_msglayout google_protobuf_Duration_msginit; -extern const upb_msglayout google_protobuf_Struct_msginit; -extern const upb_msglayout google_protobuf_UInt32Value_msginit; - -typedef enum { - envoy_api_v2_auth_CertificateValidationContext_VERIFY_TRUST_CHAIN = 0, - envoy_api_v2_auth_CertificateValidationContext_ACCEPT_UNTRUSTED = 1 -} envoy_api_v2_auth_CertificateValidationContext_TrustChainVerification; - -typedef enum { - envoy_api_v2_auth_TlsParameters_TLS_AUTO = 0, - envoy_api_v2_auth_TlsParameters_TLSv1_0 = 1, - envoy_api_v2_auth_TlsParameters_TLSv1_1 = 2, - envoy_api_v2_auth_TlsParameters_TLSv1_2 = 3, - envoy_api_v2_auth_TlsParameters_TLSv1_3 = 4 -} envoy_api_v2_auth_TlsParameters_TlsProtocol; - - -/* envoy.api.v2.auth.TlsParameters */ - -UPB_INLINE envoy_api_v2_auth_TlsParameters *envoy_api_v2_auth_TlsParameters_new(upb_arena *arena) { - return (envoy_api_v2_auth_TlsParameters *)upb_msg_new(&envoy_api_v2_auth_TlsParameters_msginit, arena); -} -UPB_INLINE envoy_api_v2_auth_TlsParameters *envoy_api_v2_auth_TlsParameters_parse(const char *buf, size_t size, - upb_arena *arena) { - envoy_api_v2_auth_TlsParameters *ret = envoy_api_v2_auth_TlsParameters_new(arena); - return (ret && upb_decode(buf, size, ret, &envoy_api_v2_auth_TlsParameters_msginit, arena)) ? ret : NULL; -} -UPB_INLINE char *envoy_api_v2_auth_TlsParameters_serialize(const envoy_api_v2_auth_TlsParameters *msg, upb_arena *arena, size_t *len) { - return upb_encode(msg, &envoy_api_v2_auth_TlsParameters_msginit, arena, len); -} - -UPB_INLINE int32_t envoy_api_v2_auth_TlsParameters_tls_minimum_protocol_version(const envoy_api_v2_auth_TlsParameters *msg) { return UPB_FIELD_AT(msg, int32_t, UPB_SIZE(0, 0)); } -UPB_INLINE int32_t envoy_api_v2_auth_TlsParameters_tls_maximum_protocol_version(const envoy_api_v2_auth_TlsParameters *msg) { return UPB_FIELD_AT(msg, int32_t, UPB_SIZE(8, 8)); } -UPB_INLINE upb_strview const* envoy_api_v2_auth_TlsParameters_cipher_suites(const envoy_api_v2_auth_TlsParameters *msg, size_t *len) { return (upb_strview const*)_upb_array_accessor(msg, UPB_SIZE(16, 16), len); } -UPB_INLINE upb_strview const* envoy_api_v2_auth_TlsParameters_ecdh_curves(const envoy_api_v2_auth_TlsParameters *msg, size_t *len) { return (upb_strview const*)_upb_array_accessor(msg, UPB_SIZE(20, 24), len); } - -UPB_INLINE void envoy_api_v2_auth_TlsParameters_set_tls_minimum_protocol_version(envoy_api_v2_auth_TlsParameters *msg, int32_t value) { - UPB_FIELD_AT(msg, int32_t, UPB_SIZE(0, 0)) = value; -} -UPB_INLINE void envoy_api_v2_auth_TlsParameters_set_tls_maximum_protocol_version(envoy_api_v2_auth_TlsParameters *msg, int32_t value) { - UPB_FIELD_AT(msg, int32_t, UPB_SIZE(8, 8)) = value; -} -UPB_INLINE upb_strview* envoy_api_v2_auth_TlsParameters_mutable_cipher_suites(envoy_api_v2_auth_TlsParameters *msg, size_t *len) { - return (upb_strview*)_upb_array_mutable_accessor(msg, UPB_SIZE(16, 16), len); -} -UPB_INLINE upb_strview* envoy_api_v2_auth_TlsParameters_resize_cipher_suites(envoy_api_v2_auth_TlsParameters *msg, size_t len, upb_arena *arena) { - return (upb_strview*)_upb_array_resize_accessor(msg, UPB_SIZE(16, 16), len, UPB_SIZE(8, 16), UPB_TYPE_STRING, arena); -} -UPB_INLINE bool envoy_api_v2_auth_TlsParameters_add_cipher_suites(envoy_api_v2_auth_TlsParameters *msg, upb_strview val, upb_arena *arena) { - return _upb_array_append_accessor( - msg, UPB_SIZE(16, 16), UPB_SIZE(8, 16), UPB_TYPE_STRING, &val, arena); -} -UPB_INLINE upb_strview* envoy_api_v2_auth_TlsParameters_mutable_ecdh_curves(envoy_api_v2_auth_TlsParameters *msg, size_t *len) { - return (upb_strview*)_upb_array_mutable_accessor(msg, UPB_SIZE(20, 24), len); -} -UPB_INLINE upb_strview* envoy_api_v2_auth_TlsParameters_resize_ecdh_curves(envoy_api_v2_auth_TlsParameters *msg, size_t len, upb_arena *arena) { - return (upb_strview*)_upb_array_resize_accessor(msg, UPB_SIZE(20, 24), len, UPB_SIZE(8, 16), UPB_TYPE_STRING, arena); -} -UPB_INLINE bool envoy_api_v2_auth_TlsParameters_add_ecdh_curves(envoy_api_v2_auth_TlsParameters *msg, upb_strview val, upb_arena *arena) { - return _upb_array_append_accessor( - msg, UPB_SIZE(20, 24), UPB_SIZE(8, 16), UPB_TYPE_STRING, &val, arena); -} - -/* envoy.api.v2.auth.PrivateKeyProvider */ - -UPB_INLINE envoy_api_v2_auth_PrivateKeyProvider *envoy_api_v2_auth_PrivateKeyProvider_new(upb_arena *arena) { - return (envoy_api_v2_auth_PrivateKeyProvider *)upb_msg_new(&envoy_api_v2_auth_PrivateKeyProvider_msginit, arena); -} -UPB_INLINE envoy_api_v2_auth_PrivateKeyProvider *envoy_api_v2_auth_PrivateKeyProvider_parse(const char *buf, size_t size, - upb_arena *arena) { - envoy_api_v2_auth_PrivateKeyProvider *ret = envoy_api_v2_auth_PrivateKeyProvider_new(arena); - return (ret && upb_decode(buf, size, ret, &envoy_api_v2_auth_PrivateKeyProvider_msginit, arena)) ? ret : NULL; -} -UPB_INLINE char *envoy_api_v2_auth_PrivateKeyProvider_serialize(const envoy_api_v2_auth_PrivateKeyProvider *msg, upb_arena *arena, size_t *len) { - return upb_encode(msg, &envoy_api_v2_auth_PrivateKeyProvider_msginit, arena, len); -} - -typedef enum { - envoy_api_v2_auth_PrivateKeyProvider_config_type_config = 2, - envoy_api_v2_auth_PrivateKeyProvider_config_type_typed_config = 3, - envoy_api_v2_auth_PrivateKeyProvider_config_type_NOT_SET = 0 -} envoy_api_v2_auth_PrivateKeyProvider_config_type_oneofcases; -UPB_INLINE envoy_api_v2_auth_PrivateKeyProvider_config_type_oneofcases envoy_api_v2_auth_PrivateKeyProvider_config_type_case(const envoy_api_v2_auth_PrivateKeyProvider* msg) { return (envoy_api_v2_auth_PrivateKeyProvider_config_type_oneofcases)UPB_FIELD_AT(msg, int32_t, UPB_SIZE(12, 24)); } - -UPB_INLINE upb_strview envoy_api_v2_auth_PrivateKeyProvider_provider_name(const envoy_api_v2_auth_PrivateKeyProvider *msg) { return UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(0, 0)); } -UPB_INLINE bool envoy_api_v2_auth_PrivateKeyProvider_has_config(const envoy_api_v2_auth_PrivateKeyProvider *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(12, 24), 2); } -UPB_INLINE const struct google_protobuf_Struct* envoy_api_v2_auth_PrivateKeyProvider_config(const envoy_api_v2_auth_PrivateKeyProvider *msg) { return UPB_READ_ONEOF(msg, const struct google_protobuf_Struct*, UPB_SIZE(8, 16), UPB_SIZE(12, 24), 2, NULL); } -UPB_INLINE bool envoy_api_v2_auth_PrivateKeyProvider_has_typed_config(const envoy_api_v2_auth_PrivateKeyProvider *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(12, 24), 3); } -UPB_INLINE const struct google_protobuf_Any* envoy_api_v2_auth_PrivateKeyProvider_typed_config(const envoy_api_v2_auth_PrivateKeyProvider *msg) { return UPB_READ_ONEOF(msg, const struct google_protobuf_Any*, UPB_SIZE(8, 16), UPB_SIZE(12, 24), 3, NULL); } - -UPB_INLINE void envoy_api_v2_auth_PrivateKeyProvider_set_provider_name(envoy_api_v2_auth_PrivateKeyProvider *msg, upb_strview value) { - UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(0, 0)) = value; -} -UPB_INLINE void envoy_api_v2_auth_PrivateKeyProvider_set_config(envoy_api_v2_auth_PrivateKeyProvider *msg, struct google_protobuf_Struct* value) { - UPB_WRITE_ONEOF(msg, struct google_protobuf_Struct*, UPB_SIZE(8, 16), value, UPB_SIZE(12, 24), 2); -} -UPB_INLINE struct google_protobuf_Struct* envoy_api_v2_auth_PrivateKeyProvider_mutable_config(envoy_api_v2_auth_PrivateKeyProvider *msg, upb_arena *arena) { - struct google_protobuf_Struct* sub = (struct google_protobuf_Struct*)envoy_api_v2_auth_PrivateKeyProvider_config(msg); - if (sub == NULL) { - sub = (struct google_protobuf_Struct*)upb_msg_new(&google_protobuf_Struct_msginit, arena); - if (!sub) return NULL; - envoy_api_v2_auth_PrivateKeyProvider_set_config(msg, sub); - } - return sub; -} -UPB_INLINE void envoy_api_v2_auth_PrivateKeyProvider_set_typed_config(envoy_api_v2_auth_PrivateKeyProvider *msg, struct google_protobuf_Any* value) { - UPB_WRITE_ONEOF(msg, struct google_protobuf_Any*, UPB_SIZE(8, 16), value, UPB_SIZE(12, 24), 3); -} -UPB_INLINE struct google_protobuf_Any* envoy_api_v2_auth_PrivateKeyProvider_mutable_typed_config(envoy_api_v2_auth_PrivateKeyProvider *msg, upb_arena *arena) { - struct google_protobuf_Any* sub = (struct google_protobuf_Any*)envoy_api_v2_auth_PrivateKeyProvider_typed_config(msg); - if (sub == NULL) { - sub = (struct google_protobuf_Any*)upb_msg_new(&google_protobuf_Any_msginit, arena); - if (!sub) return NULL; - envoy_api_v2_auth_PrivateKeyProvider_set_typed_config(msg, sub); - } - return sub; -} - -/* envoy.api.v2.auth.TlsCertificate */ - -UPB_INLINE envoy_api_v2_auth_TlsCertificate *envoy_api_v2_auth_TlsCertificate_new(upb_arena *arena) { - return (envoy_api_v2_auth_TlsCertificate *)upb_msg_new(&envoy_api_v2_auth_TlsCertificate_msginit, arena); -} -UPB_INLINE envoy_api_v2_auth_TlsCertificate *envoy_api_v2_auth_TlsCertificate_parse(const char *buf, size_t size, - upb_arena *arena) { - envoy_api_v2_auth_TlsCertificate *ret = envoy_api_v2_auth_TlsCertificate_new(arena); - return (ret && upb_decode(buf, size, ret, &envoy_api_v2_auth_TlsCertificate_msginit, arena)) ? ret : NULL; -} -UPB_INLINE char *envoy_api_v2_auth_TlsCertificate_serialize(const envoy_api_v2_auth_TlsCertificate *msg, upb_arena *arena, size_t *len) { - return upb_encode(msg, &envoy_api_v2_auth_TlsCertificate_msginit, arena, len); -} - -UPB_INLINE const struct envoy_api_v2_core_DataSource* envoy_api_v2_auth_TlsCertificate_certificate_chain(const envoy_api_v2_auth_TlsCertificate *msg) { return UPB_FIELD_AT(msg, const struct envoy_api_v2_core_DataSource*, UPB_SIZE(0, 0)); } -UPB_INLINE const struct envoy_api_v2_core_DataSource* envoy_api_v2_auth_TlsCertificate_private_key(const envoy_api_v2_auth_TlsCertificate *msg) { return UPB_FIELD_AT(msg, const struct envoy_api_v2_core_DataSource*, UPB_SIZE(4, 8)); } -UPB_INLINE const struct envoy_api_v2_core_DataSource* envoy_api_v2_auth_TlsCertificate_password(const envoy_api_v2_auth_TlsCertificate *msg) { return UPB_FIELD_AT(msg, const struct envoy_api_v2_core_DataSource*, UPB_SIZE(8, 16)); } -UPB_INLINE const struct envoy_api_v2_core_DataSource* envoy_api_v2_auth_TlsCertificate_ocsp_staple(const envoy_api_v2_auth_TlsCertificate *msg) { return UPB_FIELD_AT(msg, const struct envoy_api_v2_core_DataSource*, UPB_SIZE(12, 24)); } -UPB_INLINE const struct envoy_api_v2_core_DataSource* const* envoy_api_v2_auth_TlsCertificate_signed_certificate_timestamp(const envoy_api_v2_auth_TlsCertificate *msg, size_t *len) { return (const struct envoy_api_v2_core_DataSource* const*)_upb_array_accessor(msg, UPB_SIZE(20, 40), len); } -UPB_INLINE const envoy_api_v2_auth_PrivateKeyProvider* envoy_api_v2_auth_TlsCertificate_private_key_provider(const envoy_api_v2_auth_TlsCertificate *msg) { return UPB_FIELD_AT(msg, const envoy_api_v2_auth_PrivateKeyProvider*, UPB_SIZE(16, 32)); } - -UPB_INLINE void envoy_api_v2_auth_TlsCertificate_set_certificate_chain(envoy_api_v2_auth_TlsCertificate *msg, struct envoy_api_v2_core_DataSource* value) { - UPB_FIELD_AT(msg, struct envoy_api_v2_core_DataSource*, UPB_SIZE(0, 0)) = value; -} -UPB_INLINE struct envoy_api_v2_core_DataSource* envoy_api_v2_auth_TlsCertificate_mutable_certificate_chain(envoy_api_v2_auth_TlsCertificate *msg, upb_arena *arena) { - struct envoy_api_v2_core_DataSource* sub = (struct envoy_api_v2_core_DataSource*)envoy_api_v2_auth_TlsCertificate_certificate_chain(msg); - if (sub == NULL) { - sub = (struct envoy_api_v2_core_DataSource*)upb_msg_new(&envoy_api_v2_core_DataSource_msginit, arena); - if (!sub) return NULL; - envoy_api_v2_auth_TlsCertificate_set_certificate_chain(msg, sub); - } - return sub; -} -UPB_INLINE void envoy_api_v2_auth_TlsCertificate_set_private_key(envoy_api_v2_auth_TlsCertificate *msg, struct envoy_api_v2_core_DataSource* value) { - UPB_FIELD_AT(msg, struct envoy_api_v2_core_DataSource*, UPB_SIZE(4, 8)) = value; -} -UPB_INLINE struct envoy_api_v2_core_DataSource* envoy_api_v2_auth_TlsCertificate_mutable_private_key(envoy_api_v2_auth_TlsCertificate *msg, upb_arena *arena) { - struct envoy_api_v2_core_DataSource* sub = (struct envoy_api_v2_core_DataSource*)envoy_api_v2_auth_TlsCertificate_private_key(msg); - if (sub == NULL) { - sub = (struct envoy_api_v2_core_DataSource*)upb_msg_new(&envoy_api_v2_core_DataSource_msginit, arena); - if (!sub) return NULL; - envoy_api_v2_auth_TlsCertificate_set_private_key(msg, sub); - } - return sub; -} -UPB_INLINE void envoy_api_v2_auth_TlsCertificate_set_password(envoy_api_v2_auth_TlsCertificate *msg, struct envoy_api_v2_core_DataSource* value) { - UPB_FIELD_AT(msg, struct envoy_api_v2_core_DataSource*, UPB_SIZE(8, 16)) = value; -} -UPB_INLINE struct envoy_api_v2_core_DataSource* envoy_api_v2_auth_TlsCertificate_mutable_password(envoy_api_v2_auth_TlsCertificate *msg, upb_arena *arena) { - struct envoy_api_v2_core_DataSource* sub = (struct envoy_api_v2_core_DataSource*)envoy_api_v2_auth_TlsCertificate_password(msg); - if (sub == NULL) { - sub = (struct envoy_api_v2_core_DataSource*)upb_msg_new(&envoy_api_v2_core_DataSource_msginit, arena); - if (!sub) return NULL; - envoy_api_v2_auth_TlsCertificate_set_password(msg, sub); - } - return sub; -} -UPB_INLINE void envoy_api_v2_auth_TlsCertificate_set_ocsp_staple(envoy_api_v2_auth_TlsCertificate *msg, struct envoy_api_v2_core_DataSource* value) { - UPB_FIELD_AT(msg, struct envoy_api_v2_core_DataSource*, UPB_SIZE(12, 24)) = value; -} -UPB_INLINE struct envoy_api_v2_core_DataSource* envoy_api_v2_auth_TlsCertificate_mutable_ocsp_staple(envoy_api_v2_auth_TlsCertificate *msg, upb_arena *arena) { - struct envoy_api_v2_core_DataSource* sub = (struct envoy_api_v2_core_DataSource*)envoy_api_v2_auth_TlsCertificate_ocsp_staple(msg); - if (sub == NULL) { - sub = (struct envoy_api_v2_core_DataSource*)upb_msg_new(&envoy_api_v2_core_DataSource_msginit, arena); - if (!sub) return NULL; - envoy_api_v2_auth_TlsCertificate_set_ocsp_staple(msg, sub); - } - return sub; -} -UPB_INLINE struct envoy_api_v2_core_DataSource** envoy_api_v2_auth_TlsCertificate_mutable_signed_certificate_timestamp(envoy_api_v2_auth_TlsCertificate *msg, size_t *len) { - return (struct envoy_api_v2_core_DataSource**)_upb_array_mutable_accessor(msg, UPB_SIZE(20, 40), len); -} -UPB_INLINE struct envoy_api_v2_core_DataSource** envoy_api_v2_auth_TlsCertificate_resize_signed_certificate_timestamp(envoy_api_v2_auth_TlsCertificate *msg, size_t len, upb_arena *arena) { - return (struct envoy_api_v2_core_DataSource**)_upb_array_resize_accessor(msg, UPB_SIZE(20, 40), len, UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, arena); -} -UPB_INLINE struct envoy_api_v2_core_DataSource* envoy_api_v2_auth_TlsCertificate_add_signed_certificate_timestamp(envoy_api_v2_auth_TlsCertificate *msg, upb_arena *arena) { - struct envoy_api_v2_core_DataSource* sub = (struct envoy_api_v2_core_DataSource*)upb_msg_new(&envoy_api_v2_core_DataSource_msginit, arena); - bool ok = _upb_array_append_accessor( - msg, UPB_SIZE(20, 40), UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, &sub, arena); - if (!ok) return NULL; - return sub; -} -UPB_INLINE void envoy_api_v2_auth_TlsCertificate_set_private_key_provider(envoy_api_v2_auth_TlsCertificate *msg, envoy_api_v2_auth_PrivateKeyProvider* value) { - UPB_FIELD_AT(msg, envoy_api_v2_auth_PrivateKeyProvider*, UPB_SIZE(16, 32)) = value; -} -UPB_INLINE struct envoy_api_v2_auth_PrivateKeyProvider* envoy_api_v2_auth_TlsCertificate_mutable_private_key_provider(envoy_api_v2_auth_TlsCertificate *msg, upb_arena *arena) { - struct envoy_api_v2_auth_PrivateKeyProvider* sub = (struct envoy_api_v2_auth_PrivateKeyProvider*)envoy_api_v2_auth_TlsCertificate_private_key_provider(msg); - if (sub == NULL) { - sub = (struct envoy_api_v2_auth_PrivateKeyProvider*)upb_msg_new(&envoy_api_v2_auth_PrivateKeyProvider_msginit, arena); - if (!sub) return NULL; - envoy_api_v2_auth_TlsCertificate_set_private_key_provider(msg, sub); - } - return sub; -} - -/* envoy.api.v2.auth.TlsSessionTicketKeys */ - -UPB_INLINE envoy_api_v2_auth_TlsSessionTicketKeys *envoy_api_v2_auth_TlsSessionTicketKeys_new(upb_arena *arena) { - return (envoy_api_v2_auth_TlsSessionTicketKeys *)upb_msg_new(&envoy_api_v2_auth_TlsSessionTicketKeys_msginit, arena); -} -UPB_INLINE envoy_api_v2_auth_TlsSessionTicketKeys *envoy_api_v2_auth_TlsSessionTicketKeys_parse(const char *buf, size_t size, - upb_arena *arena) { - envoy_api_v2_auth_TlsSessionTicketKeys *ret = envoy_api_v2_auth_TlsSessionTicketKeys_new(arena); - return (ret && upb_decode(buf, size, ret, &envoy_api_v2_auth_TlsSessionTicketKeys_msginit, arena)) ? ret : NULL; -} -UPB_INLINE char *envoy_api_v2_auth_TlsSessionTicketKeys_serialize(const envoy_api_v2_auth_TlsSessionTicketKeys *msg, upb_arena *arena, size_t *len) { - return upb_encode(msg, &envoy_api_v2_auth_TlsSessionTicketKeys_msginit, arena, len); -} - -UPB_INLINE const struct envoy_api_v2_core_DataSource* const* envoy_api_v2_auth_TlsSessionTicketKeys_keys(const envoy_api_v2_auth_TlsSessionTicketKeys *msg, size_t *len) { return (const struct envoy_api_v2_core_DataSource* const*)_upb_array_accessor(msg, UPB_SIZE(0, 0), len); } - -UPB_INLINE struct envoy_api_v2_core_DataSource** envoy_api_v2_auth_TlsSessionTicketKeys_mutable_keys(envoy_api_v2_auth_TlsSessionTicketKeys *msg, size_t *len) { - return (struct envoy_api_v2_core_DataSource**)_upb_array_mutable_accessor(msg, UPB_SIZE(0, 0), len); -} -UPB_INLINE struct envoy_api_v2_core_DataSource** envoy_api_v2_auth_TlsSessionTicketKeys_resize_keys(envoy_api_v2_auth_TlsSessionTicketKeys *msg, size_t len, upb_arena *arena) { - return (struct envoy_api_v2_core_DataSource**)_upb_array_resize_accessor(msg, UPB_SIZE(0, 0), len, UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, arena); -} -UPB_INLINE struct envoy_api_v2_core_DataSource* envoy_api_v2_auth_TlsSessionTicketKeys_add_keys(envoy_api_v2_auth_TlsSessionTicketKeys *msg, upb_arena *arena) { - struct envoy_api_v2_core_DataSource* sub = (struct envoy_api_v2_core_DataSource*)upb_msg_new(&envoy_api_v2_core_DataSource_msginit, arena); - bool ok = _upb_array_append_accessor( - msg, UPB_SIZE(0, 0), UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, &sub, arena); - if (!ok) return NULL; - return sub; -} - -/* envoy.api.v2.auth.CertificateValidationContext */ - -UPB_INLINE envoy_api_v2_auth_CertificateValidationContext *envoy_api_v2_auth_CertificateValidationContext_new(upb_arena *arena) { - return (envoy_api_v2_auth_CertificateValidationContext *)upb_msg_new(&envoy_api_v2_auth_CertificateValidationContext_msginit, arena); -} -UPB_INLINE envoy_api_v2_auth_CertificateValidationContext *envoy_api_v2_auth_CertificateValidationContext_parse(const char *buf, size_t size, - upb_arena *arena) { - envoy_api_v2_auth_CertificateValidationContext *ret = envoy_api_v2_auth_CertificateValidationContext_new(arena); - return (ret && upb_decode(buf, size, ret, &envoy_api_v2_auth_CertificateValidationContext_msginit, arena)) ? ret : NULL; -} -UPB_INLINE char *envoy_api_v2_auth_CertificateValidationContext_serialize(const envoy_api_v2_auth_CertificateValidationContext *msg, upb_arena *arena, size_t *len) { - return upb_encode(msg, &envoy_api_v2_auth_CertificateValidationContext_msginit, arena, len); -} - -UPB_INLINE const struct envoy_api_v2_core_DataSource* envoy_api_v2_auth_CertificateValidationContext_trusted_ca(const envoy_api_v2_auth_CertificateValidationContext *msg) { return UPB_FIELD_AT(msg, const struct envoy_api_v2_core_DataSource*, UPB_SIZE(12, 16)); } -UPB_INLINE upb_strview const* envoy_api_v2_auth_CertificateValidationContext_verify_certificate_hash(const envoy_api_v2_auth_CertificateValidationContext *msg, size_t *len) { return (upb_strview const*)_upb_array_accessor(msg, UPB_SIZE(28, 48), len); } -UPB_INLINE upb_strview const* envoy_api_v2_auth_CertificateValidationContext_verify_certificate_spki(const envoy_api_v2_auth_CertificateValidationContext *msg, size_t *len) { return (upb_strview const*)_upb_array_accessor(msg, UPB_SIZE(32, 56), len); } -UPB_INLINE upb_strview const* envoy_api_v2_auth_CertificateValidationContext_verify_subject_alt_name(const envoy_api_v2_auth_CertificateValidationContext *msg, size_t *len) { return (upb_strview const*)_upb_array_accessor(msg, UPB_SIZE(36, 64), len); } -UPB_INLINE const struct google_protobuf_BoolValue* envoy_api_v2_auth_CertificateValidationContext_require_ocsp_staple(const envoy_api_v2_auth_CertificateValidationContext *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_BoolValue*, UPB_SIZE(16, 24)); } -UPB_INLINE const struct google_protobuf_BoolValue* envoy_api_v2_auth_CertificateValidationContext_require_signed_certificate_timestamp(const envoy_api_v2_auth_CertificateValidationContext *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_BoolValue*, UPB_SIZE(20, 32)); } -UPB_INLINE const struct envoy_api_v2_core_DataSource* envoy_api_v2_auth_CertificateValidationContext_crl(const envoy_api_v2_auth_CertificateValidationContext *msg) { return UPB_FIELD_AT(msg, const struct envoy_api_v2_core_DataSource*, UPB_SIZE(24, 40)); } -UPB_INLINE bool envoy_api_v2_auth_CertificateValidationContext_allow_expired_certificate(const envoy_api_v2_auth_CertificateValidationContext *msg) { return UPB_FIELD_AT(msg, bool, UPB_SIZE(8, 8)); } -UPB_INLINE const struct envoy_type_matcher_StringMatcher* const* envoy_api_v2_auth_CertificateValidationContext_match_subject_alt_names(const envoy_api_v2_auth_CertificateValidationContext *msg, size_t *len) { return (const struct envoy_type_matcher_StringMatcher* const*)_upb_array_accessor(msg, UPB_SIZE(40, 72), len); } -UPB_INLINE int32_t envoy_api_v2_auth_CertificateValidationContext_trust_chain_verification(const envoy_api_v2_auth_CertificateValidationContext *msg) { return UPB_FIELD_AT(msg, int32_t, UPB_SIZE(0, 0)); } - -UPB_INLINE void envoy_api_v2_auth_CertificateValidationContext_set_trusted_ca(envoy_api_v2_auth_CertificateValidationContext *msg, struct envoy_api_v2_core_DataSource* value) { - UPB_FIELD_AT(msg, struct envoy_api_v2_core_DataSource*, UPB_SIZE(12, 16)) = value; -} -UPB_INLINE struct envoy_api_v2_core_DataSource* envoy_api_v2_auth_CertificateValidationContext_mutable_trusted_ca(envoy_api_v2_auth_CertificateValidationContext *msg, upb_arena *arena) { - struct envoy_api_v2_core_DataSource* sub = (struct envoy_api_v2_core_DataSource*)envoy_api_v2_auth_CertificateValidationContext_trusted_ca(msg); - if (sub == NULL) { - sub = (struct envoy_api_v2_core_DataSource*)upb_msg_new(&envoy_api_v2_core_DataSource_msginit, arena); - if (!sub) return NULL; - envoy_api_v2_auth_CertificateValidationContext_set_trusted_ca(msg, sub); - } - return sub; -} -UPB_INLINE upb_strview* envoy_api_v2_auth_CertificateValidationContext_mutable_verify_certificate_hash(envoy_api_v2_auth_CertificateValidationContext *msg, size_t *len) { - return (upb_strview*)_upb_array_mutable_accessor(msg, UPB_SIZE(28, 48), len); -} -UPB_INLINE upb_strview* envoy_api_v2_auth_CertificateValidationContext_resize_verify_certificate_hash(envoy_api_v2_auth_CertificateValidationContext *msg, size_t len, upb_arena *arena) { - return (upb_strview*)_upb_array_resize_accessor(msg, UPB_SIZE(28, 48), len, UPB_SIZE(8, 16), UPB_TYPE_STRING, arena); -} -UPB_INLINE bool envoy_api_v2_auth_CertificateValidationContext_add_verify_certificate_hash(envoy_api_v2_auth_CertificateValidationContext *msg, upb_strview val, upb_arena *arena) { - return _upb_array_append_accessor( - msg, UPB_SIZE(28, 48), UPB_SIZE(8, 16), UPB_TYPE_STRING, &val, arena); -} -UPB_INLINE upb_strview* envoy_api_v2_auth_CertificateValidationContext_mutable_verify_certificate_spki(envoy_api_v2_auth_CertificateValidationContext *msg, size_t *len) { - return (upb_strview*)_upb_array_mutable_accessor(msg, UPB_SIZE(32, 56), len); -} -UPB_INLINE upb_strview* envoy_api_v2_auth_CertificateValidationContext_resize_verify_certificate_spki(envoy_api_v2_auth_CertificateValidationContext *msg, size_t len, upb_arena *arena) { - return (upb_strview*)_upb_array_resize_accessor(msg, UPB_SIZE(32, 56), len, UPB_SIZE(8, 16), UPB_TYPE_STRING, arena); -} -UPB_INLINE bool envoy_api_v2_auth_CertificateValidationContext_add_verify_certificate_spki(envoy_api_v2_auth_CertificateValidationContext *msg, upb_strview val, upb_arena *arena) { - return _upb_array_append_accessor( - msg, UPB_SIZE(32, 56), UPB_SIZE(8, 16), UPB_TYPE_STRING, &val, arena); -} -UPB_INLINE upb_strview* envoy_api_v2_auth_CertificateValidationContext_mutable_verify_subject_alt_name(envoy_api_v2_auth_CertificateValidationContext *msg, size_t *len) { - return (upb_strview*)_upb_array_mutable_accessor(msg, UPB_SIZE(36, 64), len); -} -UPB_INLINE upb_strview* envoy_api_v2_auth_CertificateValidationContext_resize_verify_subject_alt_name(envoy_api_v2_auth_CertificateValidationContext *msg, size_t len, upb_arena *arena) { - return (upb_strview*)_upb_array_resize_accessor(msg, UPB_SIZE(36, 64), len, UPB_SIZE(8, 16), UPB_TYPE_STRING, arena); -} -UPB_INLINE bool envoy_api_v2_auth_CertificateValidationContext_add_verify_subject_alt_name(envoy_api_v2_auth_CertificateValidationContext *msg, upb_strview val, upb_arena *arena) { - return _upb_array_append_accessor( - msg, UPB_SIZE(36, 64), UPB_SIZE(8, 16), UPB_TYPE_STRING, &val, arena); -} -UPB_INLINE void envoy_api_v2_auth_CertificateValidationContext_set_require_ocsp_staple(envoy_api_v2_auth_CertificateValidationContext *msg, struct google_protobuf_BoolValue* value) { - UPB_FIELD_AT(msg, struct google_protobuf_BoolValue*, UPB_SIZE(16, 24)) = value; -} -UPB_INLINE struct google_protobuf_BoolValue* envoy_api_v2_auth_CertificateValidationContext_mutable_require_ocsp_staple(envoy_api_v2_auth_CertificateValidationContext *msg, upb_arena *arena) { - struct google_protobuf_BoolValue* sub = (struct google_protobuf_BoolValue*)envoy_api_v2_auth_CertificateValidationContext_require_ocsp_staple(msg); - if (sub == NULL) { - sub = (struct google_protobuf_BoolValue*)upb_msg_new(&google_protobuf_BoolValue_msginit, arena); - if (!sub) return NULL; - envoy_api_v2_auth_CertificateValidationContext_set_require_ocsp_staple(msg, sub); - } - return sub; -} -UPB_INLINE void envoy_api_v2_auth_CertificateValidationContext_set_require_signed_certificate_timestamp(envoy_api_v2_auth_CertificateValidationContext *msg, struct google_protobuf_BoolValue* value) { - UPB_FIELD_AT(msg, struct google_protobuf_BoolValue*, UPB_SIZE(20, 32)) = value; -} -UPB_INLINE struct google_protobuf_BoolValue* envoy_api_v2_auth_CertificateValidationContext_mutable_require_signed_certificate_timestamp(envoy_api_v2_auth_CertificateValidationContext *msg, upb_arena *arena) { - struct google_protobuf_BoolValue* sub = (struct google_protobuf_BoolValue*)envoy_api_v2_auth_CertificateValidationContext_require_signed_certificate_timestamp(msg); - if (sub == NULL) { - sub = (struct google_protobuf_BoolValue*)upb_msg_new(&google_protobuf_BoolValue_msginit, arena); - if (!sub) return NULL; - envoy_api_v2_auth_CertificateValidationContext_set_require_signed_certificate_timestamp(msg, sub); - } - return sub; -} -UPB_INLINE void envoy_api_v2_auth_CertificateValidationContext_set_crl(envoy_api_v2_auth_CertificateValidationContext *msg, struct envoy_api_v2_core_DataSource* value) { - UPB_FIELD_AT(msg, struct envoy_api_v2_core_DataSource*, UPB_SIZE(24, 40)) = value; -} -UPB_INLINE struct envoy_api_v2_core_DataSource* envoy_api_v2_auth_CertificateValidationContext_mutable_crl(envoy_api_v2_auth_CertificateValidationContext *msg, upb_arena *arena) { - struct envoy_api_v2_core_DataSource* sub = (struct envoy_api_v2_core_DataSource*)envoy_api_v2_auth_CertificateValidationContext_crl(msg); - if (sub == NULL) { - sub = (struct envoy_api_v2_core_DataSource*)upb_msg_new(&envoy_api_v2_core_DataSource_msginit, arena); - if (!sub) return NULL; - envoy_api_v2_auth_CertificateValidationContext_set_crl(msg, sub); - } - return sub; -} -UPB_INLINE void envoy_api_v2_auth_CertificateValidationContext_set_allow_expired_certificate(envoy_api_v2_auth_CertificateValidationContext *msg, bool value) { - UPB_FIELD_AT(msg, bool, UPB_SIZE(8, 8)) = value; -} -UPB_INLINE struct envoy_type_matcher_StringMatcher** envoy_api_v2_auth_CertificateValidationContext_mutable_match_subject_alt_names(envoy_api_v2_auth_CertificateValidationContext *msg, size_t *len) { - return (struct envoy_type_matcher_StringMatcher**)_upb_array_mutable_accessor(msg, UPB_SIZE(40, 72), len); -} -UPB_INLINE struct envoy_type_matcher_StringMatcher** envoy_api_v2_auth_CertificateValidationContext_resize_match_subject_alt_names(envoy_api_v2_auth_CertificateValidationContext *msg, size_t len, upb_arena *arena) { - return (struct envoy_type_matcher_StringMatcher**)_upb_array_resize_accessor(msg, UPB_SIZE(40, 72), len, UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, arena); -} -UPB_INLINE struct envoy_type_matcher_StringMatcher* envoy_api_v2_auth_CertificateValidationContext_add_match_subject_alt_names(envoy_api_v2_auth_CertificateValidationContext *msg, upb_arena *arena) { - struct envoy_type_matcher_StringMatcher* sub = (struct envoy_type_matcher_StringMatcher*)upb_msg_new(&envoy_type_matcher_StringMatcher_msginit, arena); - bool ok = _upb_array_append_accessor( - msg, UPB_SIZE(40, 72), UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, &sub, arena); - if (!ok) return NULL; - return sub; -} -UPB_INLINE void envoy_api_v2_auth_CertificateValidationContext_set_trust_chain_verification(envoy_api_v2_auth_CertificateValidationContext *msg, int32_t value) { - UPB_FIELD_AT(msg, int32_t, UPB_SIZE(0, 0)) = value; -} - -/* envoy.api.v2.auth.CommonTlsContext */ - -UPB_INLINE envoy_api_v2_auth_CommonTlsContext *envoy_api_v2_auth_CommonTlsContext_new(upb_arena *arena) { - return (envoy_api_v2_auth_CommonTlsContext *)upb_msg_new(&envoy_api_v2_auth_CommonTlsContext_msginit, arena); -} -UPB_INLINE envoy_api_v2_auth_CommonTlsContext *envoy_api_v2_auth_CommonTlsContext_parse(const char *buf, size_t size, - upb_arena *arena) { - envoy_api_v2_auth_CommonTlsContext *ret = envoy_api_v2_auth_CommonTlsContext_new(arena); - return (ret && upb_decode(buf, size, ret, &envoy_api_v2_auth_CommonTlsContext_msginit, arena)) ? ret : NULL; -} -UPB_INLINE char *envoy_api_v2_auth_CommonTlsContext_serialize(const envoy_api_v2_auth_CommonTlsContext *msg, upb_arena *arena, size_t *len) { - return upb_encode(msg, &envoy_api_v2_auth_CommonTlsContext_msginit, arena, len); -} - -typedef enum { - envoy_api_v2_auth_CommonTlsContext_validation_context_type_validation_context = 3, - envoy_api_v2_auth_CommonTlsContext_validation_context_type_validation_context_sds_secret_config = 7, - envoy_api_v2_auth_CommonTlsContext_validation_context_type_combined_validation_context = 8, - envoy_api_v2_auth_CommonTlsContext_validation_context_type_NOT_SET = 0 -} envoy_api_v2_auth_CommonTlsContext_validation_context_type_oneofcases; -UPB_INLINE envoy_api_v2_auth_CommonTlsContext_validation_context_type_oneofcases envoy_api_v2_auth_CommonTlsContext_validation_context_type_case(const envoy_api_v2_auth_CommonTlsContext* msg) { return (envoy_api_v2_auth_CommonTlsContext_validation_context_type_oneofcases)UPB_FIELD_AT(msg, int32_t, UPB_SIZE(20, 40)); } - -UPB_INLINE const envoy_api_v2_auth_TlsParameters* envoy_api_v2_auth_CommonTlsContext_tls_params(const envoy_api_v2_auth_CommonTlsContext *msg) { return UPB_FIELD_AT(msg, const envoy_api_v2_auth_TlsParameters*, UPB_SIZE(0, 0)); } -UPB_INLINE const envoy_api_v2_auth_TlsCertificate* const* envoy_api_v2_auth_CommonTlsContext_tls_certificates(const envoy_api_v2_auth_CommonTlsContext *msg, size_t *len) { return (const envoy_api_v2_auth_TlsCertificate* const*)_upb_array_accessor(msg, UPB_SIZE(4, 8), len); } -UPB_INLINE bool envoy_api_v2_auth_CommonTlsContext_has_validation_context(const envoy_api_v2_auth_CommonTlsContext *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(20, 40), 3); } -UPB_INLINE const envoy_api_v2_auth_CertificateValidationContext* envoy_api_v2_auth_CommonTlsContext_validation_context(const envoy_api_v2_auth_CommonTlsContext *msg) { return UPB_READ_ONEOF(msg, const envoy_api_v2_auth_CertificateValidationContext*, UPB_SIZE(16, 32), UPB_SIZE(20, 40), 3, NULL); } -UPB_INLINE upb_strview const* envoy_api_v2_auth_CommonTlsContext_alpn_protocols(const envoy_api_v2_auth_CommonTlsContext *msg, size_t *len) { return (upb_strview const*)_upb_array_accessor(msg, UPB_SIZE(8, 16), len); } -UPB_INLINE const envoy_api_v2_auth_SdsSecretConfig* const* envoy_api_v2_auth_CommonTlsContext_tls_certificate_sds_secret_configs(const envoy_api_v2_auth_CommonTlsContext *msg, size_t *len) { return (const envoy_api_v2_auth_SdsSecretConfig* const*)_upb_array_accessor(msg, UPB_SIZE(12, 24), len); } -UPB_INLINE bool envoy_api_v2_auth_CommonTlsContext_has_validation_context_sds_secret_config(const envoy_api_v2_auth_CommonTlsContext *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(20, 40), 7); } -UPB_INLINE const envoy_api_v2_auth_SdsSecretConfig* envoy_api_v2_auth_CommonTlsContext_validation_context_sds_secret_config(const envoy_api_v2_auth_CommonTlsContext *msg) { return UPB_READ_ONEOF(msg, const envoy_api_v2_auth_SdsSecretConfig*, UPB_SIZE(16, 32), UPB_SIZE(20, 40), 7, NULL); } -UPB_INLINE bool envoy_api_v2_auth_CommonTlsContext_has_combined_validation_context(const envoy_api_v2_auth_CommonTlsContext *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(20, 40), 8); } -UPB_INLINE const envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext* envoy_api_v2_auth_CommonTlsContext_combined_validation_context(const envoy_api_v2_auth_CommonTlsContext *msg) { return UPB_READ_ONEOF(msg, const envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext*, UPB_SIZE(16, 32), UPB_SIZE(20, 40), 8, NULL); } - -UPB_INLINE void envoy_api_v2_auth_CommonTlsContext_set_tls_params(envoy_api_v2_auth_CommonTlsContext *msg, envoy_api_v2_auth_TlsParameters* value) { - UPB_FIELD_AT(msg, envoy_api_v2_auth_TlsParameters*, UPB_SIZE(0, 0)) = value; -} -UPB_INLINE struct envoy_api_v2_auth_TlsParameters* envoy_api_v2_auth_CommonTlsContext_mutable_tls_params(envoy_api_v2_auth_CommonTlsContext *msg, upb_arena *arena) { - struct envoy_api_v2_auth_TlsParameters* sub = (struct envoy_api_v2_auth_TlsParameters*)envoy_api_v2_auth_CommonTlsContext_tls_params(msg); - if (sub == NULL) { - sub = (struct envoy_api_v2_auth_TlsParameters*)upb_msg_new(&envoy_api_v2_auth_TlsParameters_msginit, arena); - if (!sub) return NULL; - envoy_api_v2_auth_CommonTlsContext_set_tls_params(msg, sub); - } - return sub; -} -UPB_INLINE envoy_api_v2_auth_TlsCertificate** envoy_api_v2_auth_CommonTlsContext_mutable_tls_certificates(envoy_api_v2_auth_CommonTlsContext *msg, size_t *len) { - return (envoy_api_v2_auth_TlsCertificate**)_upb_array_mutable_accessor(msg, UPB_SIZE(4, 8), len); -} -UPB_INLINE envoy_api_v2_auth_TlsCertificate** envoy_api_v2_auth_CommonTlsContext_resize_tls_certificates(envoy_api_v2_auth_CommonTlsContext *msg, size_t len, upb_arena *arena) { - return (envoy_api_v2_auth_TlsCertificate**)_upb_array_resize_accessor(msg, UPB_SIZE(4, 8), len, UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, arena); -} -UPB_INLINE struct envoy_api_v2_auth_TlsCertificate* envoy_api_v2_auth_CommonTlsContext_add_tls_certificates(envoy_api_v2_auth_CommonTlsContext *msg, upb_arena *arena) { - struct envoy_api_v2_auth_TlsCertificate* sub = (struct envoy_api_v2_auth_TlsCertificate*)upb_msg_new(&envoy_api_v2_auth_TlsCertificate_msginit, arena); - bool ok = _upb_array_append_accessor( - msg, UPB_SIZE(4, 8), UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, &sub, arena); - if (!ok) return NULL; - return sub; -} -UPB_INLINE void envoy_api_v2_auth_CommonTlsContext_set_validation_context(envoy_api_v2_auth_CommonTlsContext *msg, envoy_api_v2_auth_CertificateValidationContext* value) { - UPB_WRITE_ONEOF(msg, envoy_api_v2_auth_CertificateValidationContext*, UPB_SIZE(16, 32), value, UPB_SIZE(20, 40), 3); -} -UPB_INLINE struct envoy_api_v2_auth_CertificateValidationContext* envoy_api_v2_auth_CommonTlsContext_mutable_validation_context(envoy_api_v2_auth_CommonTlsContext *msg, upb_arena *arena) { - struct envoy_api_v2_auth_CertificateValidationContext* sub = (struct envoy_api_v2_auth_CertificateValidationContext*)envoy_api_v2_auth_CommonTlsContext_validation_context(msg); - if (sub == NULL) { - sub = (struct envoy_api_v2_auth_CertificateValidationContext*)upb_msg_new(&envoy_api_v2_auth_CertificateValidationContext_msginit, arena); - if (!sub) return NULL; - envoy_api_v2_auth_CommonTlsContext_set_validation_context(msg, sub); - } - return sub; -} -UPB_INLINE upb_strview* envoy_api_v2_auth_CommonTlsContext_mutable_alpn_protocols(envoy_api_v2_auth_CommonTlsContext *msg, size_t *len) { - return (upb_strview*)_upb_array_mutable_accessor(msg, UPB_SIZE(8, 16), len); -} -UPB_INLINE upb_strview* envoy_api_v2_auth_CommonTlsContext_resize_alpn_protocols(envoy_api_v2_auth_CommonTlsContext *msg, size_t len, upb_arena *arena) { - return (upb_strview*)_upb_array_resize_accessor(msg, UPB_SIZE(8, 16), len, UPB_SIZE(8, 16), UPB_TYPE_STRING, arena); -} -UPB_INLINE bool envoy_api_v2_auth_CommonTlsContext_add_alpn_protocols(envoy_api_v2_auth_CommonTlsContext *msg, upb_strview val, upb_arena *arena) { - return _upb_array_append_accessor( - msg, UPB_SIZE(8, 16), UPB_SIZE(8, 16), UPB_TYPE_STRING, &val, arena); -} -UPB_INLINE envoy_api_v2_auth_SdsSecretConfig** envoy_api_v2_auth_CommonTlsContext_mutable_tls_certificate_sds_secret_configs(envoy_api_v2_auth_CommonTlsContext *msg, size_t *len) { - return (envoy_api_v2_auth_SdsSecretConfig**)_upb_array_mutable_accessor(msg, UPB_SIZE(12, 24), len); -} -UPB_INLINE envoy_api_v2_auth_SdsSecretConfig** envoy_api_v2_auth_CommonTlsContext_resize_tls_certificate_sds_secret_configs(envoy_api_v2_auth_CommonTlsContext *msg, size_t len, upb_arena *arena) { - return (envoy_api_v2_auth_SdsSecretConfig**)_upb_array_resize_accessor(msg, UPB_SIZE(12, 24), len, UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, arena); -} -UPB_INLINE struct envoy_api_v2_auth_SdsSecretConfig* envoy_api_v2_auth_CommonTlsContext_add_tls_certificate_sds_secret_configs(envoy_api_v2_auth_CommonTlsContext *msg, upb_arena *arena) { - struct envoy_api_v2_auth_SdsSecretConfig* sub = (struct envoy_api_v2_auth_SdsSecretConfig*)upb_msg_new(&envoy_api_v2_auth_SdsSecretConfig_msginit, arena); - bool ok = _upb_array_append_accessor( - msg, UPB_SIZE(12, 24), UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, &sub, arena); - if (!ok) return NULL; - return sub; -} -UPB_INLINE void envoy_api_v2_auth_CommonTlsContext_set_validation_context_sds_secret_config(envoy_api_v2_auth_CommonTlsContext *msg, envoy_api_v2_auth_SdsSecretConfig* value) { - UPB_WRITE_ONEOF(msg, envoy_api_v2_auth_SdsSecretConfig*, UPB_SIZE(16, 32), value, UPB_SIZE(20, 40), 7); -} -UPB_INLINE struct envoy_api_v2_auth_SdsSecretConfig* envoy_api_v2_auth_CommonTlsContext_mutable_validation_context_sds_secret_config(envoy_api_v2_auth_CommonTlsContext *msg, upb_arena *arena) { - struct envoy_api_v2_auth_SdsSecretConfig* sub = (struct envoy_api_v2_auth_SdsSecretConfig*)envoy_api_v2_auth_CommonTlsContext_validation_context_sds_secret_config(msg); - if (sub == NULL) { - sub = (struct envoy_api_v2_auth_SdsSecretConfig*)upb_msg_new(&envoy_api_v2_auth_SdsSecretConfig_msginit, arena); - if (!sub) return NULL; - envoy_api_v2_auth_CommonTlsContext_set_validation_context_sds_secret_config(msg, sub); - } - return sub; -} -UPB_INLINE void envoy_api_v2_auth_CommonTlsContext_set_combined_validation_context(envoy_api_v2_auth_CommonTlsContext *msg, envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext* value) { - UPB_WRITE_ONEOF(msg, envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext*, UPB_SIZE(16, 32), value, UPB_SIZE(20, 40), 8); -} -UPB_INLINE struct envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext* envoy_api_v2_auth_CommonTlsContext_mutable_combined_validation_context(envoy_api_v2_auth_CommonTlsContext *msg, upb_arena *arena) { - struct envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext* sub = (struct envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext*)envoy_api_v2_auth_CommonTlsContext_combined_validation_context(msg); - if (sub == NULL) { - sub = (struct envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext*)upb_msg_new(&envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext_msginit, arena); - if (!sub) return NULL; - envoy_api_v2_auth_CommonTlsContext_set_combined_validation_context(msg, sub); - } - return sub; -} - -/* envoy.api.v2.auth.CommonTlsContext.CombinedCertificateValidationContext */ - -UPB_INLINE envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext *envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext_new(upb_arena *arena) { - return (envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext *)upb_msg_new(&envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext_msginit, arena); -} -UPB_INLINE envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext *envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext_parse(const char *buf, size_t size, - upb_arena *arena) { - envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext *ret = envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext_new(arena); - return (ret && upb_decode(buf, size, ret, &envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext_msginit, arena)) ? ret : NULL; -} -UPB_INLINE char *envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext_serialize(const envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext *msg, upb_arena *arena, size_t *len) { - return upb_encode(msg, &envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext_msginit, arena, len); -} - -UPB_INLINE const envoy_api_v2_auth_CertificateValidationContext* envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext_default_validation_context(const envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext *msg) { return UPB_FIELD_AT(msg, const envoy_api_v2_auth_CertificateValidationContext*, UPB_SIZE(0, 0)); } -UPB_INLINE const envoy_api_v2_auth_SdsSecretConfig* envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext_validation_context_sds_secret_config(const envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext *msg) { return UPB_FIELD_AT(msg, const envoy_api_v2_auth_SdsSecretConfig*, UPB_SIZE(4, 8)); } - -UPB_INLINE void envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext_set_default_validation_context(envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext *msg, envoy_api_v2_auth_CertificateValidationContext* value) { - UPB_FIELD_AT(msg, envoy_api_v2_auth_CertificateValidationContext*, UPB_SIZE(0, 0)) = value; -} -UPB_INLINE struct envoy_api_v2_auth_CertificateValidationContext* envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext_mutable_default_validation_context(envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext *msg, upb_arena *arena) { - struct envoy_api_v2_auth_CertificateValidationContext* sub = (struct envoy_api_v2_auth_CertificateValidationContext*)envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext_default_validation_context(msg); - if (sub == NULL) { - sub = (struct envoy_api_v2_auth_CertificateValidationContext*)upb_msg_new(&envoy_api_v2_auth_CertificateValidationContext_msginit, arena); - if (!sub) return NULL; - envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext_set_default_validation_context(msg, sub); - } - return sub; -} -UPB_INLINE void envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext_set_validation_context_sds_secret_config(envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext *msg, envoy_api_v2_auth_SdsSecretConfig* value) { - UPB_FIELD_AT(msg, envoy_api_v2_auth_SdsSecretConfig*, UPB_SIZE(4, 8)) = value; -} -UPB_INLINE struct envoy_api_v2_auth_SdsSecretConfig* envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext_mutable_validation_context_sds_secret_config(envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext *msg, upb_arena *arena) { - struct envoy_api_v2_auth_SdsSecretConfig* sub = (struct envoy_api_v2_auth_SdsSecretConfig*)envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext_validation_context_sds_secret_config(msg); - if (sub == NULL) { - sub = (struct envoy_api_v2_auth_SdsSecretConfig*)upb_msg_new(&envoy_api_v2_auth_SdsSecretConfig_msginit, arena); - if (!sub) return NULL; - envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext_set_validation_context_sds_secret_config(msg, sub); - } - return sub; -} - -/* envoy.api.v2.auth.UpstreamTlsContext */ - -UPB_INLINE envoy_api_v2_auth_UpstreamTlsContext *envoy_api_v2_auth_UpstreamTlsContext_new(upb_arena *arena) { - return (envoy_api_v2_auth_UpstreamTlsContext *)upb_msg_new(&envoy_api_v2_auth_UpstreamTlsContext_msginit, arena); -} -UPB_INLINE envoy_api_v2_auth_UpstreamTlsContext *envoy_api_v2_auth_UpstreamTlsContext_parse(const char *buf, size_t size, - upb_arena *arena) { - envoy_api_v2_auth_UpstreamTlsContext *ret = envoy_api_v2_auth_UpstreamTlsContext_new(arena); - return (ret && upb_decode(buf, size, ret, &envoy_api_v2_auth_UpstreamTlsContext_msginit, arena)) ? ret : NULL; -} -UPB_INLINE char *envoy_api_v2_auth_UpstreamTlsContext_serialize(const envoy_api_v2_auth_UpstreamTlsContext *msg, upb_arena *arena, size_t *len) { - return upb_encode(msg, &envoy_api_v2_auth_UpstreamTlsContext_msginit, arena, len); -} - -UPB_INLINE const envoy_api_v2_auth_CommonTlsContext* envoy_api_v2_auth_UpstreamTlsContext_common_tls_context(const envoy_api_v2_auth_UpstreamTlsContext *msg) { return UPB_FIELD_AT(msg, const envoy_api_v2_auth_CommonTlsContext*, UPB_SIZE(12, 24)); } -UPB_INLINE upb_strview envoy_api_v2_auth_UpstreamTlsContext_sni(const envoy_api_v2_auth_UpstreamTlsContext *msg) { return UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(4, 8)); } -UPB_INLINE bool envoy_api_v2_auth_UpstreamTlsContext_allow_renegotiation(const envoy_api_v2_auth_UpstreamTlsContext *msg) { return UPB_FIELD_AT(msg, bool, UPB_SIZE(0, 0)); } -UPB_INLINE const struct google_protobuf_UInt32Value* envoy_api_v2_auth_UpstreamTlsContext_max_session_keys(const envoy_api_v2_auth_UpstreamTlsContext *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_UInt32Value*, UPB_SIZE(16, 32)); } - -UPB_INLINE void envoy_api_v2_auth_UpstreamTlsContext_set_common_tls_context(envoy_api_v2_auth_UpstreamTlsContext *msg, envoy_api_v2_auth_CommonTlsContext* value) { - UPB_FIELD_AT(msg, envoy_api_v2_auth_CommonTlsContext*, UPB_SIZE(12, 24)) = value; -} -UPB_INLINE struct envoy_api_v2_auth_CommonTlsContext* envoy_api_v2_auth_UpstreamTlsContext_mutable_common_tls_context(envoy_api_v2_auth_UpstreamTlsContext *msg, upb_arena *arena) { - struct envoy_api_v2_auth_CommonTlsContext* sub = (struct envoy_api_v2_auth_CommonTlsContext*)envoy_api_v2_auth_UpstreamTlsContext_common_tls_context(msg); - if (sub == NULL) { - sub = (struct envoy_api_v2_auth_CommonTlsContext*)upb_msg_new(&envoy_api_v2_auth_CommonTlsContext_msginit, arena); - if (!sub) return NULL; - envoy_api_v2_auth_UpstreamTlsContext_set_common_tls_context(msg, sub); - } - return sub; -} -UPB_INLINE void envoy_api_v2_auth_UpstreamTlsContext_set_sni(envoy_api_v2_auth_UpstreamTlsContext *msg, upb_strview value) { - UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(4, 8)) = value; -} -UPB_INLINE void envoy_api_v2_auth_UpstreamTlsContext_set_allow_renegotiation(envoy_api_v2_auth_UpstreamTlsContext *msg, bool value) { - UPB_FIELD_AT(msg, bool, UPB_SIZE(0, 0)) = value; -} -UPB_INLINE void envoy_api_v2_auth_UpstreamTlsContext_set_max_session_keys(envoy_api_v2_auth_UpstreamTlsContext *msg, struct google_protobuf_UInt32Value* value) { - UPB_FIELD_AT(msg, struct google_protobuf_UInt32Value*, UPB_SIZE(16, 32)) = value; -} -UPB_INLINE struct google_protobuf_UInt32Value* envoy_api_v2_auth_UpstreamTlsContext_mutable_max_session_keys(envoy_api_v2_auth_UpstreamTlsContext *msg, upb_arena *arena) { - struct google_protobuf_UInt32Value* sub = (struct google_protobuf_UInt32Value*)envoy_api_v2_auth_UpstreamTlsContext_max_session_keys(msg); - if (sub == NULL) { - sub = (struct google_protobuf_UInt32Value*)upb_msg_new(&google_protobuf_UInt32Value_msginit, arena); - if (!sub) return NULL; - envoy_api_v2_auth_UpstreamTlsContext_set_max_session_keys(msg, sub); - } - return sub; -} - -/* envoy.api.v2.auth.DownstreamTlsContext */ - -UPB_INLINE envoy_api_v2_auth_DownstreamTlsContext *envoy_api_v2_auth_DownstreamTlsContext_new(upb_arena *arena) { - return (envoy_api_v2_auth_DownstreamTlsContext *)upb_msg_new(&envoy_api_v2_auth_DownstreamTlsContext_msginit, arena); -} -UPB_INLINE envoy_api_v2_auth_DownstreamTlsContext *envoy_api_v2_auth_DownstreamTlsContext_parse(const char *buf, size_t size, - upb_arena *arena) { - envoy_api_v2_auth_DownstreamTlsContext *ret = envoy_api_v2_auth_DownstreamTlsContext_new(arena); - return (ret && upb_decode(buf, size, ret, &envoy_api_v2_auth_DownstreamTlsContext_msginit, arena)) ? ret : NULL; -} -UPB_INLINE char *envoy_api_v2_auth_DownstreamTlsContext_serialize(const envoy_api_v2_auth_DownstreamTlsContext *msg, upb_arena *arena, size_t *len) { - return upb_encode(msg, &envoy_api_v2_auth_DownstreamTlsContext_msginit, arena, len); -} - -typedef enum { - envoy_api_v2_auth_DownstreamTlsContext_session_ticket_keys_type_session_ticket_keys = 4, - envoy_api_v2_auth_DownstreamTlsContext_session_ticket_keys_type_session_ticket_keys_sds_secret_config = 5, - envoy_api_v2_auth_DownstreamTlsContext_session_ticket_keys_type_NOT_SET = 0 -} envoy_api_v2_auth_DownstreamTlsContext_session_ticket_keys_type_oneofcases; -UPB_INLINE envoy_api_v2_auth_DownstreamTlsContext_session_ticket_keys_type_oneofcases envoy_api_v2_auth_DownstreamTlsContext_session_ticket_keys_type_case(const envoy_api_v2_auth_DownstreamTlsContext* msg) { return (envoy_api_v2_auth_DownstreamTlsContext_session_ticket_keys_type_oneofcases)UPB_FIELD_AT(msg, int32_t, UPB_SIZE(20, 40)); } - -UPB_INLINE const envoy_api_v2_auth_CommonTlsContext* envoy_api_v2_auth_DownstreamTlsContext_common_tls_context(const envoy_api_v2_auth_DownstreamTlsContext *msg) { return UPB_FIELD_AT(msg, const envoy_api_v2_auth_CommonTlsContext*, UPB_SIZE(0, 0)); } -UPB_INLINE const struct google_protobuf_BoolValue* envoy_api_v2_auth_DownstreamTlsContext_require_client_certificate(const envoy_api_v2_auth_DownstreamTlsContext *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_BoolValue*, UPB_SIZE(4, 8)); } -UPB_INLINE const struct google_protobuf_BoolValue* envoy_api_v2_auth_DownstreamTlsContext_require_sni(const envoy_api_v2_auth_DownstreamTlsContext *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_BoolValue*, UPB_SIZE(8, 16)); } -UPB_INLINE bool envoy_api_v2_auth_DownstreamTlsContext_has_session_ticket_keys(const envoy_api_v2_auth_DownstreamTlsContext *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(20, 40), 4); } -UPB_INLINE const envoy_api_v2_auth_TlsSessionTicketKeys* envoy_api_v2_auth_DownstreamTlsContext_session_ticket_keys(const envoy_api_v2_auth_DownstreamTlsContext *msg) { return UPB_READ_ONEOF(msg, const envoy_api_v2_auth_TlsSessionTicketKeys*, UPB_SIZE(16, 32), UPB_SIZE(20, 40), 4, NULL); } -UPB_INLINE bool envoy_api_v2_auth_DownstreamTlsContext_has_session_ticket_keys_sds_secret_config(const envoy_api_v2_auth_DownstreamTlsContext *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(20, 40), 5); } -UPB_INLINE const envoy_api_v2_auth_SdsSecretConfig* envoy_api_v2_auth_DownstreamTlsContext_session_ticket_keys_sds_secret_config(const envoy_api_v2_auth_DownstreamTlsContext *msg) { return UPB_READ_ONEOF(msg, const envoy_api_v2_auth_SdsSecretConfig*, UPB_SIZE(16, 32), UPB_SIZE(20, 40), 5, NULL); } -UPB_INLINE const struct google_protobuf_Duration* envoy_api_v2_auth_DownstreamTlsContext_session_timeout(const envoy_api_v2_auth_DownstreamTlsContext *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_Duration*, UPB_SIZE(12, 24)); } - -UPB_INLINE void envoy_api_v2_auth_DownstreamTlsContext_set_common_tls_context(envoy_api_v2_auth_DownstreamTlsContext *msg, envoy_api_v2_auth_CommonTlsContext* value) { - UPB_FIELD_AT(msg, envoy_api_v2_auth_CommonTlsContext*, UPB_SIZE(0, 0)) = value; -} -UPB_INLINE struct envoy_api_v2_auth_CommonTlsContext* envoy_api_v2_auth_DownstreamTlsContext_mutable_common_tls_context(envoy_api_v2_auth_DownstreamTlsContext *msg, upb_arena *arena) { - struct envoy_api_v2_auth_CommonTlsContext* sub = (struct envoy_api_v2_auth_CommonTlsContext*)envoy_api_v2_auth_DownstreamTlsContext_common_tls_context(msg); - if (sub == NULL) { - sub = (struct envoy_api_v2_auth_CommonTlsContext*)upb_msg_new(&envoy_api_v2_auth_CommonTlsContext_msginit, arena); - if (!sub) return NULL; - envoy_api_v2_auth_DownstreamTlsContext_set_common_tls_context(msg, sub); - } - return sub; -} -UPB_INLINE void envoy_api_v2_auth_DownstreamTlsContext_set_require_client_certificate(envoy_api_v2_auth_DownstreamTlsContext *msg, struct google_protobuf_BoolValue* value) { - UPB_FIELD_AT(msg, struct google_protobuf_BoolValue*, UPB_SIZE(4, 8)) = value; -} -UPB_INLINE struct google_protobuf_BoolValue* envoy_api_v2_auth_DownstreamTlsContext_mutable_require_client_certificate(envoy_api_v2_auth_DownstreamTlsContext *msg, upb_arena *arena) { - struct google_protobuf_BoolValue* sub = (struct google_protobuf_BoolValue*)envoy_api_v2_auth_DownstreamTlsContext_require_client_certificate(msg); - if (sub == NULL) { - sub = (struct google_protobuf_BoolValue*)upb_msg_new(&google_protobuf_BoolValue_msginit, arena); - if (!sub) return NULL; - envoy_api_v2_auth_DownstreamTlsContext_set_require_client_certificate(msg, sub); - } - return sub; -} -UPB_INLINE void envoy_api_v2_auth_DownstreamTlsContext_set_require_sni(envoy_api_v2_auth_DownstreamTlsContext *msg, struct google_protobuf_BoolValue* value) { - UPB_FIELD_AT(msg, struct google_protobuf_BoolValue*, UPB_SIZE(8, 16)) = value; -} -UPB_INLINE struct google_protobuf_BoolValue* envoy_api_v2_auth_DownstreamTlsContext_mutable_require_sni(envoy_api_v2_auth_DownstreamTlsContext *msg, upb_arena *arena) { - struct google_protobuf_BoolValue* sub = (struct google_protobuf_BoolValue*)envoy_api_v2_auth_DownstreamTlsContext_require_sni(msg); - if (sub == NULL) { - sub = (struct google_protobuf_BoolValue*)upb_msg_new(&google_protobuf_BoolValue_msginit, arena); - if (!sub) return NULL; - envoy_api_v2_auth_DownstreamTlsContext_set_require_sni(msg, sub); - } - return sub; -} -UPB_INLINE void envoy_api_v2_auth_DownstreamTlsContext_set_session_ticket_keys(envoy_api_v2_auth_DownstreamTlsContext *msg, envoy_api_v2_auth_TlsSessionTicketKeys* value) { - UPB_WRITE_ONEOF(msg, envoy_api_v2_auth_TlsSessionTicketKeys*, UPB_SIZE(16, 32), value, UPB_SIZE(20, 40), 4); -} -UPB_INLINE struct envoy_api_v2_auth_TlsSessionTicketKeys* envoy_api_v2_auth_DownstreamTlsContext_mutable_session_ticket_keys(envoy_api_v2_auth_DownstreamTlsContext *msg, upb_arena *arena) { - struct envoy_api_v2_auth_TlsSessionTicketKeys* sub = (struct envoy_api_v2_auth_TlsSessionTicketKeys*)envoy_api_v2_auth_DownstreamTlsContext_session_ticket_keys(msg); - if (sub == NULL) { - sub = (struct envoy_api_v2_auth_TlsSessionTicketKeys*)upb_msg_new(&envoy_api_v2_auth_TlsSessionTicketKeys_msginit, arena); - if (!sub) return NULL; - envoy_api_v2_auth_DownstreamTlsContext_set_session_ticket_keys(msg, sub); - } - return sub; -} -UPB_INLINE void envoy_api_v2_auth_DownstreamTlsContext_set_session_ticket_keys_sds_secret_config(envoy_api_v2_auth_DownstreamTlsContext *msg, envoy_api_v2_auth_SdsSecretConfig* value) { - UPB_WRITE_ONEOF(msg, envoy_api_v2_auth_SdsSecretConfig*, UPB_SIZE(16, 32), value, UPB_SIZE(20, 40), 5); -} -UPB_INLINE struct envoy_api_v2_auth_SdsSecretConfig* envoy_api_v2_auth_DownstreamTlsContext_mutable_session_ticket_keys_sds_secret_config(envoy_api_v2_auth_DownstreamTlsContext *msg, upb_arena *arena) { - struct envoy_api_v2_auth_SdsSecretConfig* sub = (struct envoy_api_v2_auth_SdsSecretConfig*)envoy_api_v2_auth_DownstreamTlsContext_session_ticket_keys_sds_secret_config(msg); - if (sub == NULL) { - sub = (struct envoy_api_v2_auth_SdsSecretConfig*)upb_msg_new(&envoy_api_v2_auth_SdsSecretConfig_msginit, arena); - if (!sub) return NULL; - envoy_api_v2_auth_DownstreamTlsContext_set_session_ticket_keys_sds_secret_config(msg, sub); - } - return sub; -} -UPB_INLINE void envoy_api_v2_auth_DownstreamTlsContext_set_session_timeout(envoy_api_v2_auth_DownstreamTlsContext *msg, struct google_protobuf_Duration* value) { - UPB_FIELD_AT(msg, struct google_protobuf_Duration*, UPB_SIZE(12, 24)) = value; -} -UPB_INLINE struct google_protobuf_Duration* envoy_api_v2_auth_DownstreamTlsContext_mutable_session_timeout(envoy_api_v2_auth_DownstreamTlsContext *msg, upb_arena *arena) { - struct google_protobuf_Duration* sub = (struct google_protobuf_Duration*)envoy_api_v2_auth_DownstreamTlsContext_session_timeout(msg); - if (sub == NULL) { - sub = (struct google_protobuf_Duration*)upb_msg_new(&google_protobuf_Duration_msginit, arena); - if (!sub) return NULL; - envoy_api_v2_auth_DownstreamTlsContext_set_session_timeout(msg, sub); - } - return sub; -} - -/* envoy.api.v2.auth.GenericSecret */ - -UPB_INLINE envoy_api_v2_auth_GenericSecret *envoy_api_v2_auth_GenericSecret_new(upb_arena *arena) { - return (envoy_api_v2_auth_GenericSecret *)upb_msg_new(&envoy_api_v2_auth_GenericSecret_msginit, arena); -} -UPB_INLINE envoy_api_v2_auth_GenericSecret *envoy_api_v2_auth_GenericSecret_parse(const char *buf, size_t size, - upb_arena *arena) { - envoy_api_v2_auth_GenericSecret *ret = envoy_api_v2_auth_GenericSecret_new(arena); - return (ret && upb_decode(buf, size, ret, &envoy_api_v2_auth_GenericSecret_msginit, arena)) ? ret : NULL; -} -UPB_INLINE char *envoy_api_v2_auth_GenericSecret_serialize(const envoy_api_v2_auth_GenericSecret *msg, upb_arena *arena, size_t *len) { - return upb_encode(msg, &envoy_api_v2_auth_GenericSecret_msginit, arena, len); -} - -UPB_INLINE const struct envoy_api_v2_core_DataSource* envoy_api_v2_auth_GenericSecret_secret(const envoy_api_v2_auth_GenericSecret *msg) { return UPB_FIELD_AT(msg, const struct envoy_api_v2_core_DataSource*, UPB_SIZE(0, 0)); } - -UPB_INLINE void envoy_api_v2_auth_GenericSecret_set_secret(envoy_api_v2_auth_GenericSecret *msg, struct envoy_api_v2_core_DataSource* value) { - UPB_FIELD_AT(msg, struct envoy_api_v2_core_DataSource*, UPB_SIZE(0, 0)) = value; -} -UPB_INLINE struct envoy_api_v2_core_DataSource* envoy_api_v2_auth_GenericSecret_mutable_secret(envoy_api_v2_auth_GenericSecret *msg, upb_arena *arena) { - struct envoy_api_v2_core_DataSource* sub = (struct envoy_api_v2_core_DataSource*)envoy_api_v2_auth_GenericSecret_secret(msg); - if (sub == NULL) { - sub = (struct envoy_api_v2_core_DataSource*)upb_msg_new(&envoy_api_v2_core_DataSource_msginit, arena); - if (!sub) return NULL; - envoy_api_v2_auth_GenericSecret_set_secret(msg, sub); - } - return sub; -} - -/* envoy.api.v2.auth.SdsSecretConfig */ - -UPB_INLINE envoy_api_v2_auth_SdsSecretConfig *envoy_api_v2_auth_SdsSecretConfig_new(upb_arena *arena) { - return (envoy_api_v2_auth_SdsSecretConfig *)upb_msg_new(&envoy_api_v2_auth_SdsSecretConfig_msginit, arena); -} -UPB_INLINE envoy_api_v2_auth_SdsSecretConfig *envoy_api_v2_auth_SdsSecretConfig_parse(const char *buf, size_t size, - upb_arena *arena) { - envoy_api_v2_auth_SdsSecretConfig *ret = envoy_api_v2_auth_SdsSecretConfig_new(arena); - return (ret && upb_decode(buf, size, ret, &envoy_api_v2_auth_SdsSecretConfig_msginit, arena)) ? ret : NULL; -} -UPB_INLINE char *envoy_api_v2_auth_SdsSecretConfig_serialize(const envoy_api_v2_auth_SdsSecretConfig *msg, upb_arena *arena, size_t *len) { - return upb_encode(msg, &envoy_api_v2_auth_SdsSecretConfig_msginit, arena, len); -} - -UPB_INLINE upb_strview envoy_api_v2_auth_SdsSecretConfig_name(const envoy_api_v2_auth_SdsSecretConfig *msg) { return UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(0, 0)); } -UPB_INLINE const struct envoy_api_v2_core_ConfigSource* envoy_api_v2_auth_SdsSecretConfig_sds_config(const envoy_api_v2_auth_SdsSecretConfig *msg) { return UPB_FIELD_AT(msg, const struct envoy_api_v2_core_ConfigSource*, UPB_SIZE(8, 16)); } - -UPB_INLINE void envoy_api_v2_auth_SdsSecretConfig_set_name(envoy_api_v2_auth_SdsSecretConfig *msg, upb_strview value) { - UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(0, 0)) = value; -} -UPB_INLINE void envoy_api_v2_auth_SdsSecretConfig_set_sds_config(envoy_api_v2_auth_SdsSecretConfig *msg, struct envoy_api_v2_core_ConfigSource* value) { - UPB_FIELD_AT(msg, struct envoy_api_v2_core_ConfigSource*, UPB_SIZE(8, 16)) = value; -} -UPB_INLINE struct envoy_api_v2_core_ConfigSource* envoy_api_v2_auth_SdsSecretConfig_mutable_sds_config(envoy_api_v2_auth_SdsSecretConfig *msg, upb_arena *arena) { - struct envoy_api_v2_core_ConfigSource* sub = (struct envoy_api_v2_core_ConfigSource*)envoy_api_v2_auth_SdsSecretConfig_sds_config(msg); - if (sub == NULL) { - sub = (struct envoy_api_v2_core_ConfigSource*)upb_msg_new(&envoy_api_v2_core_ConfigSource_msginit, arena); - if (!sub) return NULL; - envoy_api_v2_auth_SdsSecretConfig_set_sds_config(msg, sub); - } - return sub; -} - -/* envoy.api.v2.auth.Secret */ - -UPB_INLINE envoy_api_v2_auth_Secret *envoy_api_v2_auth_Secret_new(upb_arena *arena) { - return (envoy_api_v2_auth_Secret *)upb_msg_new(&envoy_api_v2_auth_Secret_msginit, arena); -} -UPB_INLINE envoy_api_v2_auth_Secret *envoy_api_v2_auth_Secret_parse(const char *buf, size_t size, - upb_arena *arena) { - envoy_api_v2_auth_Secret *ret = envoy_api_v2_auth_Secret_new(arena); - return (ret && upb_decode(buf, size, ret, &envoy_api_v2_auth_Secret_msginit, arena)) ? ret : NULL; -} -UPB_INLINE char *envoy_api_v2_auth_Secret_serialize(const envoy_api_v2_auth_Secret *msg, upb_arena *arena, size_t *len) { - return upb_encode(msg, &envoy_api_v2_auth_Secret_msginit, arena, len); -} - -typedef enum { - envoy_api_v2_auth_Secret_type_tls_certificate = 2, - envoy_api_v2_auth_Secret_type_session_ticket_keys = 3, - envoy_api_v2_auth_Secret_type_validation_context = 4, - envoy_api_v2_auth_Secret_type_generic_secret = 5, - envoy_api_v2_auth_Secret_type_NOT_SET = 0 -} envoy_api_v2_auth_Secret_type_oneofcases; -UPB_INLINE envoy_api_v2_auth_Secret_type_oneofcases envoy_api_v2_auth_Secret_type_case(const envoy_api_v2_auth_Secret* msg) { return (envoy_api_v2_auth_Secret_type_oneofcases)UPB_FIELD_AT(msg, int32_t, UPB_SIZE(12, 24)); } - -UPB_INLINE upb_strview envoy_api_v2_auth_Secret_name(const envoy_api_v2_auth_Secret *msg) { return UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(0, 0)); } -UPB_INLINE bool envoy_api_v2_auth_Secret_has_tls_certificate(const envoy_api_v2_auth_Secret *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(12, 24), 2); } -UPB_INLINE const envoy_api_v2_auth_TlsCertificate* envoy_api_v2_auth_Secret_tls_certificate(const envoy_api_v2_auth_Secret *msg) { return UPB_READ_ONEOF(msg, const envoy_api_v2_auth_TlsCertificate*, UPB_SIZE(8, 16), UPB_SIZE(12, 24), 2, NULL); } -UPB_INLINE bool envoy_api_v2_auth_Secret_has_session_ticket_keys(const envoy_api_v2_auth_Secret *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(12, 24), 3); } -UPB_INLINE const envoy_api_v2_auth_TlsSessionTicketKeys* envoy_api_v2_auth_Secret_session_ticket_keys(const envoy_api_v2_auth_Secret *msg) { return UPB_READ_ONEOF(msg, const envoy_api_v2_auth_TlsSessionTicketKeys*, UPB_SIZE(8, 16), UPB_SIZE(12, 24), 3, NULL); } -UPB_INLINE bool envoy_api_v2_auth_Secret_has_validation_context(const envoy_api_v2_auth_Secret *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(12, 24), 4); } -UPB_INLINE const envoy_api_v2_auth_CertificateValidationContext* envoy_api_v2_auth_Secret_validation_context(const envoy_api_v2_auth_Secret *msg) { return UPB_READ_ONEOF(msg, const envoy_api_v2_auth_CertificateValidationContext*, UPB_SIZE(8, 16), UPB_SIZE(12, 24), 4, NULL); } -UPB_INLINE bool envoy_api_v2_auth_Secret_has_generic_secret(const envoy_api_v2_auth_Secret *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(12, 24), 5); } -UPB_INLINE const envoy_api_v2_auth_GenericSecret* envoy_api_v2_auth_Secret_generic_secret(const envoy_api_v2_auth_Secret *msg) { return UPB_READ_ONEOF(msg, const envoy_api_v2_auth_GenericSecret*, UPB_SIZE(8, 16), UPB_SIZE(12, 24), 5, NULL); } - -UPB_INLINE void envoy_api_v2_auth_Secret_set_name(envoy_api_v2_auth_Secret *msg, upb_strview value) { - UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(0, 0)) = value; -} -UPB_INLINE void envoy_api_v2_auth_Secret_set_tls_certificate(envoy_api_v2_auth_Secret *msg, envoy_api_v2_auth_TlsCertificate* value) { - UPB_WRITE_ONEOF(msg, envoy_api_v2_auth_TlsCertificate*, UPB_SIZE(8, 16), value, UPB_SIZE(12, 24), 2); -} -UPB_INLINE struct envoy_api_v2_auth_TlsCertificate* envoy_api_v2_auth_Secret_mutable_tls_certificate(envoy_api_v2_auth_Secret *msg, upb_arena *arena) { - struct envoy_api_v2_auth_TlsCertificate* sub = (struct envoy_api_v2_auth_TlsCertificate*)envoy_api_v2_auth_Secret_tls_certificate(msg); - if (sub == NULL) { - sub = (struct envoy_api_v2_auth_TlsCertificate*)upb_msg_new(&envoy_api_v2_auth_TlsCertificate_msginit, arena); - if (!sub) return NULL; - envoy_api_v2_auth_Secret_set_tls_certificate(msg, sub); - } - return sub; -} -UPB_INLINE void envoy_api_v2_auth_Secret_set_session_ticket_keys(envoy_api_v2_auth_Secret *msg, envoy_api_v2_auth_TlsSessionTicketKeys* value) { - UPB_WRITE_ONEOF(msg, envoy_api_v2_auth_TlsSessionTicketKeys*, UPB_SIZE(8, 16), value, UPB_SIZE(12, 24), 3); -} -UPB_INLINE struct envoy_api_v2_auth_TlsSessionTicketKeys* envoy_api_v2_auth_Secret_mutable_session_ticket_keys(envoy_api_v2_auth_Secret *msg, upb_arena *arena) { - struct envoy_api_v2_auth_TlsSessionTicketKeys* sub = (struct envoy_api_v2_auth_TlsSessionTicketKeys*)envoy_api_v2_auth_Secret_session_ticket_keys(msg); - if (sub == NULL) { - sub = (struct envoy_api_v2_auth_TlsSessionTicketKeys*)upb_msg_new(&envoy_api_v2_auth_TlsSessionTicketKeys_msginit, arena); - if (!sub) return NULL; - envoy_api_v2_auth_Secret_set_session_ticket_keys(msg, sub); - } - return sub; -} -UPB_INLINE void envoy_api_v2_auth_Secret_set_validation_context(envoy_api_v2_auth_Secret *msg, envoy_api_v2_auth_CertificateValidationContext* value) { - UPB_WRITE_ONEOF(msg, envoy_api_v2_auth_CertificateValidationContext*, UPB_SIZE(8, 16), value, UPB_SIZE(12, 24), 4); -} -UPB_INLINE struct envoy_api_v2_auth_CertificateValidationContext* envoy_api_v2_auth_Secret_mutable_validation_context(envoy_api_v2_auth_Secret *msg, upb_arena *arena) { - struct envoy_api_v2_auth_CertificateValidationContext* sub = (struct envoy_api_v2_auth_CertificateValidationContext*)envoy_api_v2_auth_Secret_validation_context(msg); - if (sub == NULL) { - sub = (struct envoy_api_v2_auth_CertificateValidationContext*)upb_msg_new(&envoy_api_v2_auth_CertificateValidationContext_msginit, arena); - if (!sub) return NULL; - envoy_api_v2_auth_Secret_set_validation_context(msg, sub); - } - return sub; -} -UPB_INLINE void envoy_api_v2_auth_Secret_set_generic_secret(envoy_api_v2_auth_Secret *msg, envoy_api_v2_auth_GenericSecret* value) { - UPB_WRITE_ONEOF(msg, envoy_api_v2_auth_GenericSecret*, UPB_SIZE(8, 16), value, UPB_SIZE(12, 24), 5); -} -UPB_INLINE struct envoy_api_v2_auth_GenericSecret* envoy_api_v2_auth_Secret_mutable_generic_secret(envoy_api_v2_auth_Secret *msg, upb_arena *arena) { - struct envoy_api_v2_auth_GenericSecret* sub = (struct envoy_api_v2_auth_GenericSecret*)envoy_api_v2_auth_Secret_generic_secret(msg); - if (sub == NULL) { - sub = (struct envoy_api_v2_auth_GenericSecret*)upb_msg_new(&envoy_api_v2_auth_GenericSecret_msginit, arena); - if (!sub) return NULL; - envoy_api_v2_auth_Secret_set_generic_secret(msg, sub); - } - return sub; -} #ifdef __cplusplus } /* extern "C" */ diff --git a/src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.c b/src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.c new file mode 100644 index 00000000000..9903593ac99 --- /dev/null +++ b/src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.c @@ -0,0 +1,114 @@ +/* This file was generated by upbc (the upb compiler) from the input + * file: + * + * envoy/api/v2/auth/common.proto + * + * Do not edit -- your changes will be discarded when the file is + * regenerated. */ + +#include +#include "upb/msg.h" +#include "envoy/api/v2/auth/common.upb.h" +#include "envoy/api/v2/core/base.upb.h" +#include "envoy/type/matcher/string.upb.h" +#include "google/protobuf/any.upb.h" +#include "google/protobuf/struct.upb.h" +#include "google/protobuf/wrappers.upb.h" +#include "udpa/annotations/migrate.upb.h" +#include "udpa/annotations/sensitive.upb.h" +#include "udpa/annotations/status.upb.h" +#include "validate/validate.upb.h" + +#include "upb/port_def.inc" + +static const upb_msglayout_field envoy_api_v2_auth_TlsParameters__fields[4] = { + {1, UPB_SIZE(0, 0), 0, 0, 14, 1}, + {2, UPB_SIZE(8, 8), 0, 0, 14, 1}, + {3, UPB_SIZE(16, 16), 0, 0, 9, 3}, + {4, UPB_SIZE(20, 24), 0, 0, 9, 3}, +}; + +const upb_msglayout envoy_api_v2_auth_TlsParameters_msginit = { + NULL, + &envoy_api_v2_auth_TlsParameters__fields[0], + UPB_SIZE(24, 32), 4, false, +}; + +static const upb_msglayout *const envoy_api_v2_auth_PrivateKeyProvider_submsgs[2] = { + &google_protobuf_Any_msginit, + &google_protobuf_Struct_msginit, +}; + +static const upb_msglayout_field envoy_api_v2_auth_PrivateKeyProvider__fields[3] = { + {1, UPB_SIZE(0, 0), 0, 0, 9, 1}, + {2, UPB_SIZE(8, 16), UPB_SIZE(-13, -25), 1, 11, 1}, + {3, UPB_SIZE(8, 16), UPB_SIZE(-13, -25), 0, 11, 1}, +}; + +const upb_msglayout envoy_api_v2_auth_PrivateKeyProvider_msginit = { + &envoy_api_v2_auth_PrivateKeyProvider_submsgs[0], + &envoy_api_v2_auth_PrivateKeyProvider__fields[0], + UPB_SIZE(16, 32), 3, false, +}; + +static const upb_msglayout *const envoy_api_v2_auth_TlsCertificate_submsgs[6] = { + &envoy_api_v2_auth_PrivateKeyProvider_msginit, + &envoy_api_v2_core_DataSource_msginit, +}; + +static const upb_msglayout_field envoy_api_v2_auth_TlsCertificate__fields[6] = { + {1, UPB_SIZE(0, 0), 0, 1, 11, 1}, + {2, UPB_SIZE(4, 8), 0, 1, 11, 1}, + {3, UPB_SIZE(8, 16), 0, 1, 11, 1}, + {4, UPB_SIZE(12, 24), 0, 1, 11, 1}, + {5, UPB_SIZE(20, 40), 0, 1, 11, 3}, + {6, UPB_SIZE(16, 32), 0, 0, 11, 1}, +}; + +const upb_msglayout envoy_api_v2_auth_TlsCertificate_msginit = { + &envoy_api_v2_auth_TlsCertificate_submsgs[0], + &envoy_api_v2_auth_TlsCertificate__fields[0], + UPB_SIZE(24, 48), 6, false, +}; + +static const upb_msglayout *const envoy_api_v2_auth_TlsSessionTicketKeys_submsgs[1] = { + &envoy_api_v2_core_DataSource_msginit, +}; + +static const upb_msglayout_field envoy_api_v2_auth_TlsSessionTicketKeys__fields[1] = { + {1, UPB_SIZE(0, 0), 0, 0, 11, 3}, +}; + +const upb_msglayout envoy_api_v2_auth_TlsSessionTicketKeys_msginit = { + &envoy_api_v2_auth_TlsSessionTicketKeys_submsgs[0], + &envoy_api_v2_auth_TlsSessionTicketKeys__fields[0], + UPB_SIZE(4, 8), 1, false, +}; + +static const upb_msglayout *const envoy_api_v2_auth_CertificateValidationContext_submsgs[5] = { + &envoy_api_v2_core_DataSource_msginit, + &envoy_type_matcher_StringMatcher_msginit, + &google_protobuf_BoolValue_msginit, +}; + +static const upb_msglayout_field envoy_api_v2_auth_CertificateValidationContext__fields[10] = { + {1, UPB_SIZE(12, 16), 0, 0, 11, 1}, + {2, UPB_SIZE(28, 48), 0, 0, 9, 3}, + {3, UPB_SIZE(32, 56), 0, 0, 9, 3}, + {4, UPB_SIZE(36, 64), 0, 0, 9, 3}, + {5, UPB_SIZE(16, 24), 0, 2, 11, 1}, + {6, UPB_SIZE(20, 32), 0, 2, 11, 1}, + {7, UPB_SIZE(24, 40), 0, 0, 11, 1}, + {8, UPB_SIZE(8, 8), 0, 0, 8, 1}, + {9, UPB_SIZE(40, 72), 0, 1, 11, 3}, + {10, UPB_SIZE(0, 0), 0, 0, 14, 1}, +}; + +const upb_msglayout envoy_api_v2_auth_CertificateValidationContext_msginit = { + &envoy_api_v2_auth_CertificateValidationContext_submsgs[0], + &envoy_api_v2_auth_CertificateValidationContext__fields[0], + UPB_SIZE(48, 80), 10, false, +}; + +#include "upb/port_undef.inc" + diff --git a/src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.h b/src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.h new file mode 100644 index 00000000000..837d198700a --- /dev/null +++ b/src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.h @@ -0,0 +1,418 @@ +/* This file was generated by upbc (the upb compiler) from the input + * file: + * + * envoy/api/v2/auth/common.proto + * + * Do not edit -- your changes will be discarded when the file is + * regenerated. */ + +#ifndef ENVOY_API_V2_AUTH_COMMON_PROTO_UPB_H_ +#define ENVOY_API_V2_AUTH_COMMON_PROTO_UPB_H_ + +#include "upb/generated_util.h" +#include "upb/msg.h" +#include "upb/decode.h" +#include "upb/encode.h" + +#include "upb/port_def.inc" + +#ifdef __cplusplus +extern "C" { +#endif + +struct envoy_api_v2_auth_TlsParameters; +struct envoy_api_v2_auth_PrivateKeyProvider; +struct envoy_api_v2_auth_TlsCertificate; +struct envoy_api_v2_auth_TlsSessionTicketKeys; +struct envoy_api_v2_auth_CertificateValidationContext; +typedef struct envoy_api_v2_auth_TlsParameters envoy_api_v2_auth_TlsParameters; +typedef struct envoy_api_v2_auth_PrivateKeyProvider envoy_api_v2_auth_PrivateKeyProvider; +typedef struct envoy_api_v2_auth_TlsCertificate envoy_api_v2_auth_TlsCertificate; +typedef struct envoy_api_v2_auth_TlsSessionTicketKeys envoy_api_v2_auth_TlsSessionTicketKeys; +typedef struct envoy_api_v2_auth_CertificateValidationContext envoy_api_v2_auth_CertificateValidationContext; +extern const upb_msglayout envoy_api_v2_auth_TlsParameters_msginit; +extern const upb_msglayout envoy_api_v2_auth_PrivateKeyProvider_msginit; +extern const upb_msglayout envoy_api_v2_auth_TlsCertificate_msginit; +extern const upb_msglayout envoy_api_v2_auth_TlsSessionTicketKeys_msginit; +extern const upb_msglayout envoy_api_v2_auth_CertificateValidationContext_msginit; +struct envoy_api_v2_core_DataSource; +struct envoy_type_matcher_StringMatcher; +struct google_protobuf_Any; +struct google_protobuf_BoolValue; +struct google_protobuf_Struct; +extern const upb_msglayout envoy_api_v2_core_DataSource_msginit; +extern const upb_msglayout envoy_type_matcher_StringMatcher_msginit; +extern const upb_msglayout google_protobuf_Any_msginit; +extern const upb_msglayout google_protobuf_BoolValue_msginit; +extern const upb_msglayout google_protobuf_Struct_msginit; + +typedef enum { + envoy_api_v2_auth_CertificateValidationContext_VERIFY_TRUST_CHAIN = 0, + envoy_api_v2_auth_CertificateValidationContext_ACCEPT_UNTRUSTED = 1 +} envoy_api_v2_auth_CertificateValidationContext_TrustChainVerification; + +typedef enum { + envoy_api_v2_auth_TlsParameters_TLS_AUTO = 0, + envoy_api_v2_auth_TlsParameters_TLSv1_0 = 1, + envoy_api_v2_auth_TlsParameters_TLSv1_1 = 2, + envoy_api_v2_auth_TlsParameters_TLSv1_2 = 3, + envoy_api_v2_auth_TlsParameters_TLSv1_3 = 4 +} envoy_api_v2_auth_TlsParameters_TlsProtocol; + + +/* envoy.api.v2.auth.TlsParameters */ + +UPB_INLINE envoy_api_v2_auth_TlsParameters *envoy_api_v2_auth_TlsParameters_new(upb_arena *arena) { + return (envoy_api_v2_auth_TlsParameters *)upb_msg_new(&envoy_api_v2_auth_TlsParameters_msginit, arena); +} +UPB_INLINE envoy_api_v2_auth_TlsParameters *envoy_api_v2_auth_TlsParameters_parse(const char *buf, size_t size, + upb_arena *arena) { + envoy_api_v2_auth_TlsParameters *ret = envoy_api_v2_auth_TlsParameters_new(arena); + return (ret && upb_decode(buf, size, ret, &envoy_api_v2_auth_TlsParameters_msginit, arena)) ? ret : NULL; +} +UPB_INLINE char *envoy_api_v2_auth_TlsParameters_serialize(const envoy_api_v2_auth_TlsParameters *msg, upb_arena *arena, size_t *len) { + return upb_encode(msg, &envoy_api_v2_auth_TlsParameters_msginit, arena, len); +} + +UPB_INLINE int32_t envoy_api_v2_auth_TlsParameters_tls_minimum_protocol_version(const envoy_api_v2_auth_TlsParameters *msg) { return UPB_FIELD_AT(msg, int32_t, UPB_SIZE(0, 0)); } +UPB_INLINE int32_t envoy_api_v2_auth_TlsParameters_tls_maximum_protocol_version(const envoy_api_v2_auth_TlsParameters *msg) { return UPB_FIELD_AT(msg, int32_t, UPB_SIZE(8, 8)); } +UPB_INLINE upb_strview const* envoy_api_v2_auth_TlsParameters_cipher_suites(const envoy_api_v2_auth_TlsParameters *msg, size_t *len) { return (upb_strview const*)_upb_array_accessor(msg, UPB_SIZE(16, 16), len); } +UPB_INLINE upb_strview const* envoy_api_v2_auth_TlsParameters_ecdh_curves(const envoy_api_v2_auth_TlsParameters *msg, size_t *len) { return (upb_strview const*)_upb_array_accessor(msg, UPB_SIZE(20, 24), len); } + +UPB_INLINE void envoy_api_v2_auth_TlsParameters_set_tls_minimum_protocol_version(envoy_api_v2_auth_TlsParameters *msg, int32_t value) { + UPB_FIELD_AT(msg, int32_t, UPB_SIZE(0, 0)) = value; +} +UPB_INLINE void envoy_api_v2_auth_TlsParameters_set_tls_maximum_protocol_version(envoy_api_v2_auth_TlsParameters *msg, int32_t value) { + UPB_FIELD_AT(msg, int32_t, UPB_SIZE(8, 8)) = value; +} +UPB_INLINE upb_strview* envoy_api_v2_auth_TlsParameters_mutable_cipher_suites(envoy_api_v2_auth_TlsParameters *msg, size_t *len) { + return (upb_strview*)_upb_array_mutable_accessor(msg, UPB_SIZE(16, 16), len); +} +UPB_INLINE upb_strview* envoy_api_v2_auth_TlsParameters_resize_cipher_suites(envoy_api_v2_auth_TlsParameters *msg, size_t len, upb_arena *arena) { + return (upb_strview*)_upb_array_resize_accessor(msg, UPB_SIZE(16, 16), len, UPB_SIZE(8, 16), UPB_TYPE_STRING, arena); +} +UPB_INLINE bool envoy_api_v2_auth_TlsParameters_add_cipher_suites(envoy_api_v2_auth_TlsParameters *msg, upb_strview val, upb_arena *arena) { + return _upb_array_append_accessor( + msg, UPB_SIZE(16, 16), UPB_SIZE(8, 16), UPB_TYPE_STRING, &val, arena); +} +UPB_INLINE upb_strview* envoy_api_v2_auth_TlsParameters_mutable_ecdh_curves(envoy_api_v2_auth_TlsParameters *msg, size_t *len) { + return (upb_strview*)_upb_array_mutable_accessor(msg, UPB_SIZE(20, 24), len); +} +UPB_INLINE upb_strview* envoy_api_v2_auth_TlsParameters_resize_ecdh_curves(envoy_api_v2_auth_TlsParameters *msg, size_t len, upb_arena *arena) { + return (upb_strview*)_upb_array_resize_accessor(msg, UPB_SIZE(20, 24), len, UPB_SIZE(8, 16), UPB_TYPE_STRING, arena); +} +UPB_INLINE bool envoy_api_v2_auth_TlsParameters_add_ecdh_curves(envoy_api_v2_auth_TlsParameters *msg, upb_strview val, upb_arena *arena) { + return _upb_array_append_accessor( + msg, UPB_SIZE(20, 24), UPB_SIZE(8, 16), UPB_TYPE_STRING, &val, arena); +} + +/* envoy.api.v2.auth.PrivateKeyProvider */ + +UPB_INLINE envoy_api_v2_auth_PrivateKeyProvider *envoy_api_v2_auth_PrivateKeyProvider_new(upb_arena *arena) { + return (envoy_api_v2_auth_PrivateKeyProvider *)upb_msg_new(&envoy_api_v2_auth_PrivateKeyProvider_msginit, arena); +} +UPB_INLINE envoy_api_v2_auth_PrivateKeyProvider *envoy_api_v2_auth_PrivateKeyProvider_parse(const char *buf, size_t size, + upb_arena *arena) { + envoy_api_v2_auth_PrivateKeyProvider *ret = envoy_api_v2_auth_PrivateKeyProvider_new(arena); + return (ret && upb_decode(buf, size, ret, &envoy_api_v2_auth_PrivateKeyProvider_msginit, arena)) ? ret : NULL; +} +UPB_INLINE char *envoy_api_v2_auth_PrivateKeyProvider_serialize(const envoy_api_v2_auth_PrivateKeyProvider *msg, upb_arena *arena, size_t *len) { + return upb_encode(msg, &envoy_api_v2_auth_PrivateKeyProvider_msginit, arena, len); +} + +typedef enum { + envoy_api_v2_auth_PrivateKeyProvider_config_type_config = 2, + envoy_api_v2_auth_PrivateKeyProvider_config_type_typed_config = 3, + envoy_api_v2_auth_PrivateKeyProvider_config_type_NOT_SET = 0 +} envoy_api_v2_auth_PrivateKeyProvider_config_type_oneofcases; +UPB_INLINE envoy_api_v2_auth_PrivateKeyProvider_config_type_oneofcases envoy_api_v2_auth_PrivateKeyProvider_config_type_case(const envoy_api_v2_auth_PrivateKeyProvider* msg) { return (envoy_api_v2_auth_PrivateKeyProvider_config_type_oneofcases)UPB_FIELD_AT(msg, int32_t, UPB_SIZE(12, 24)); } + +UPB_INLINE upb_strview envoy_api_v2_auth_PrivateKeyProvider_provider_name(const envoy_api_v2_auth_PrivateKeyProvider *msg) { return UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(0, 0)); } +UPB_INLINE bool envoy_api_v2_auth_PrivateKeyProvider_has_config(const envoy_api_v2_auth_PrivateKeyProvider *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(12, 24), 2); } +UPB_INLINE const struct google_protobuf_Struct* envoy_api_v2_auth_PrivateKeyProvider_config(const envoy_api_v2_auth_PrivateKeyProvider *msg) { return UPB_READ_ONEOF(msg, const struct google_protobuf_Struct*, UPB_SIZE(8, 16), UPB_SIZE(12, 24), 2, NULL); } +UPB_INLINE bool envoy_api_v2_auth_PrivateKeyProvider_has_typed_config(const envoy_api_v2_auth_PrivateKeyProvider *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(12, 24), 3); } +UPB_INLINE const struct google_protobuf_Any* envoy_api_v2_auth_PrivateKeyProvider_typed_config(const envoy_api_v2_auth_PrivateKeyProvider *msg) { return UPB_READ_ONEOF(msg, const struct google_protobuf_Any*, UPB_SIZE(8, 16), UPB_SIZE(12, 24), 3, NULL); } + +UPB_INLINE void envoy_api_v2_auth_PrivateKeyProvider_set_provider_name(envoy_api_v2_auth_PrivateKeyProvider *msg, upb_strview value) { + UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(0, 0)) = value; +} +UPB_INLINE void envoy_api_v2_auth_PrivateKeyProvider_set_config(envoy_api_v2_auth_PrivateKeyProvider *msg, struct google_protobuf_Struct* value) { + UPB_WRITE_ONEOF(msg, struct google_protobuf_Struct*, UPB_SIZE(8, 16), value, UPB_SIZE(12, 24), 2); +} +UPB_INLINE struct google_protobuf_Struct* envoy_api_v2_auth_PrivateKeyProvider_mutable_config(envoy_api_v2_auth_PrivateKeyProvider *msg, upb_arena *arena) { + struct google_protobuf_Struct* sub = (struct google_protobuf_Struct*)envoy_api_v2_auth_PrivateKeyProvider_config(msg); + if (sub == NULL) { + sub = (struct google_protobuf_Struct*)upb_msg_new(&google_protobuf_Struct_msginit, arena); + if (!sub) return NULL; + envoy_api_v2_auth_PrivateKeyProvider_set_config(msg, sub); + } + return sub; +} +UPB_INLINE void envoy_api_v2_auth_PrivateKeyProvider_set_typed_config(envoy_api_v2_auth_PrivateKeyProvider *msg, struct google_protobuf_Any* value) { + UPB_WRITE_ONEOF(msg, struct google_protobuf_Any*, UPB_SIZE(8, 16), value, UPB_SIZE(12, 24), 3); +} +UPB_INLINE struct google_protobuf_Any* envoy_api_v2_auth_PrivateKeyProvider_mutable_typed_config(envoy_api_v2_auth_PrivateKeyProvider *msg, upb_arena *arena) { + struct google_protobuf_Any* sub = (struct google_protobuf_Any*)envoy_api_v2_auth_PrivateKeyProvider_typed_config(msg); + if (sub == NULL) { + sub = (struct google_protobuf_Any*)upb_msg_new(&google_protobuf_Any_msginit, arena); + if (!sub) return NULL; + envoy_api_v2_auth_PrivateKeyProvider_set_typed_config(msg, sub); + } + return sub; +} + +/* envoy.api.v2.auth.TlsCertificate */ + +UPB_INLINE envoy_api_v2_auth_TlsCertificate *envoy_api_v2_auth_TlsCertificate_new(upb_arena *arena) { + return (envoy_api_v2_auth_TlsCertificate *)upb_msg_new(&envoy_api_v2_auth_TlsCertificate_msginit, arena); +} +UPB_INLINE envoy_api_v2_auth_TlsCertificate *envoy_api_v2_auth_TlsCertificate_parse(const char *buf, size_t size, + upb_arena *arena) { + envoy_api_v2_auth_TlsCertificate *ret = envoy_api_v2_auth_TlsCertificate_new(arena); + return (ret && upb_decode(buf, size, ret, &envoy_api_v2_auth_TlsCertificate_msginit, arena)) ? ret : NULL; +} +UPB_INLINE char *envoy_api_v2_auth_TlsCertificate_serialize(const envoy_api_v2_auth_TlsCertificate *msg, upb_arena *arena, size_t *len) { + return upb_encode(msg, &envoy_api_v2_auth_TlsCertificate_msginit, arena, len); +} + +UPB_INLINE const struct envoy_api_v2_core_DataSource* envoy_api_v2_auth_TlsCertificate_certificate_chain(const envoy_api_v2_auth_TlsCertificate *msg) { return UPB_FIELD_AT(msg, const struct envoy_api_v2_core_DataSource*, UPB_SIZE(0, 0)); } +UPB_INLINE const struct envoy_api_v2_core_DataSource* envoy_api_v2_auth_TlsCertificate_private_key(const envoy_api_v2_auth_TlsCertificate *msg) { return UPB_FIELD_AT(msg, const struct envoy_api_v2_core_DataSource*, UPB_SIZE(4, 8)); } +UPB_INLINE const struct envoy_api_v2_core_DataSource* envoy_api_v2_auth_TlsCertificate_password(const envoy_api_v2_auth_TlsCertificate *msg) { return UPB_FIELD_AT(msg, const struct envoy_api_v2_core_DataSource*, UPB_SIZE(8, 16)); } +UPB_INLINE const struct envoy_api_v2_core_DataSource* envoy_api_v2_auth_TlsCertificate_ocsp_staple(const envoy_api_v2_auth_TlsCertificate *msg) { return UPB_FIELD_AT(msg, const struct envoy_api_v2_core_DataSource*, UPB_SIZE(12, 24)); } +UPB_INLINE const struct envoy_api_v2_core_DataSource* const* envoy_api_v2_auth_TlsCertificate_signed_certificate_timestamp(const envoy_api_v2_auth_TlsCertificate *msg, size_t *len) { return (const struct envoy_api_v2_core_DataSource* const*)_upb_array_accessor(msg, UPB_SIZE(20, 40), len); } +UPB_INLINE const envoy_api_v2_auth_PrivateKeyProvider* envoy_api_v2_auth_TlsCertificate_private_key_provider(const envoy_api_v2_auth_TlsCertificate *msg) { return UPB_FIELD_AT(msg, const envoy_api_v2_auth_PrivateKeyProvider*, UPB_SIZE(16, 32)); } + +UPB_INLINE void envoy_api_v2_auth_TlsCertificate_set_certificate_chain(envoy_api_v2_auth_TlsCertificate *msg, struct envoy_api_v2_core_DataSource* value) { + UPB_FIELD_AT(msg, struct envoy_api_v2_core_DataSource*, UPB_SIZE(0, 0)) = value; +} +UPB_INLINE struct envoy_api_v2_core_DataSource* envoy_api_v2_auth_TlsCertificate_mutable_certificate_chain(envoy_api_v2_auth_TlsCertificate *msg, upb_arena *arena) { + struct envoy_api_v2_core_DataSource* sub = (struct envoy_api_v2_core_DataSource*)envoy_api_v2_auth_TlsCertificate_certificate_chain(msg); + if (sub == NULL) { + sub = (struct envoy_api_v2_core_DataSource*)upb_msg_new(&envoy_api_v2_core_DataSource_msginit, arena); + if (!sub) return NULL; + envoy_api_v2_auth_TlsCertificate_set_certificate_chain(msg, sub); + } + return sub; +} +UPB_INLINE void envoy_api_v2_auth_TlsCertificate_set_private_key(envoy_api_v2_auth_TlsCertificate *msg, struct envoy_api_v2_core_DataSource* value) { + UPB_FIELD_AT(msg, struct envoy_api_v2_core_DataSource*, UPB_SIZE(4, 8)) = value; +} +UPB_INLINE struct envoy_api_v2_core_DataSource* envoy_api_v2_auth_TlsCertificate_mutable_private_key(envoy_api_v2_auth_TlsCertificate *msg, upb_arena *arena) { + struct envoy_api_v2_core_DataSource* sub = (struct envoy_api_v2_core_DataSource*)envoy_api_v2_auth_TlsCertificate_private_key(msg); + if (sub == NULL) { + sub = (struct envoy_api_v2_core_DataSource*)upb_msg_new(&envoy_api_v2_core_DataSource_msginit, arena); + if (!sub) return NULL; + envoy_api_v2_auth_TlsCertificate_set_private_key(msg, sub); + } + return sub; +} +UPB_INLINE void envoy_api_v2_auth_TlsCertificate_set_password(envoy_api_v2_auth_TlsCertificate *msg, struct envoy_api_v2_core_DataSource* value) { + UPB_FIELD_AT(msg, struct envoy_api_v2_core_DataSource*, UPB_SIZE(8, 16)) = value; +} +UPB_INLINE struct envoy_api_v2_core_DataSource* envoy_api_v2_auth_TlsCertificate_mutable_password(envoy_api_v2_auth_TlsCertificate *msg, upb_arena *arena) { + struct envoy_api_v2_core_DataSource* sub = (struct envoy_api_v2_core_DataSource*)envoy_api_v2_auth_TlsCertificate_password(msg); + if (sub == NULL) { + sub = (struct envoy_api_v2_core_DataSource*)upb_msg_new(&envoy_api_v2_core_DataSource_msginit, arena); + if (!sub) return NULL; + envoy_api_v2_auth_TlsCertificate_set_password(msg, sub); + } + return sub; +} +UPB_INLINE void envoy_api_v2_auth_TlsCertificate_set_ocsp_staple(envoy_api_v2_auth_TlsCertificate *msg, struct envoy_api_v2_core_DataSource* value) { + UPB_FIELD_AT(msg, struct envoy_api_v2_core_DataSource*, UPB_SIZE(12, 24)) = value; +} +UPB_INLINE struct envoy_api_v2_core_DataSource* envoy_api_v2_auth_TlsCertificate_mutable_ocsp_staple(envoy_api_v2_auth_TlsCertificate *msg, upb_arena *arena) { + struct envoy_api_v2_core_DataSource* sub = (struct envoy_api_v2_core_DataSource*)envoy_api_v2_auth_TlsCertificate_ocsp_staple(msg); + if (sub == NULL) { + sub = (struct envoy_api_v2_core_DataSource*)upb_msg_new(&envoy_api_v2_core_DataSource_msginit, arena); + if (!sub) return NULL; + envoy_api_v2_auth_TlsCertificate_set_ocsp_staple(msg, sub); + } + return sub; +} +UPB_INLINE struct envoy_api_v2_core_DataSource** envoy_api_v2_auth_TlsCertificate_mutable_signed_certificate_timestamp(envoy_api_v2_auth_TlsCertificate *msg, size_t *len) { + return (struct envoy_api_v2_core_DataSource**)_upb_array_mutable_accessor(msg, UPB_SIZE(20, 40), len); +} +UPB_INLINE struct envoy_api_v2_core_DataSource** envoy_api_v2_auth_TlsCertificate_resize_signed_certificate_timestamp(envoy_api_v2_auth_TlsCertificate *msg, size_t len, upb_arena *arena) { + return (struct envoy_api_v2_core_DataSource**)_upb_array_resize_accessor(msg, UPB_SIZE(20, 40), len, UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, arena); +} +UPB_INLINE struct envoy_api_v2_core_DataSource* envoy_api_v2_auth_TlsCertificate_add_signed_certificate_timestamp(envoy_api_v2_auth_TlsCertificate *msg, upb_arena *arena) { + struct envoy_api_v2_core_DataSource* sub = (struct envoy_api_v2_core_DataSource*)upb_msg_new(&envoy_api_v2_core_DataSource_msginit, arena); + bool ok = _upb_array_append_accessor( + msg, UPB_SIZE(20, 40), UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, &sub, arena); + if (!ok) return NULL; + return sub; +} +UPB_INLINE void envoy_api_v2_auth_TlsCertificate_set_private_key_provider(envoy_api_v2_auth_TlsCertificate *msg, envoy_api_v2_auth_PrivateKeyProvider* value) { + UPB_FIELD_AT(msg, envoy_api_v2_auth_PrivateKeyProvider*, UPB_SIZE(16, 32)) = value; +} +UPB_INLINE struct envoy_api_v2_auth_PrivateKeyProvider* envoy_api_v2_auth_TlsCertificate_mutable_private_key_provider(envoy_api_v2_auth_TlsCertificate *msg, upb_arena *arena) { + struct envoy_api_v2_auth_PrivateKeyProvider* sub = (struct envoy_api_v2_auth_PrivateKeyProvider*)envoy_api_v2_auth_TlsCertificate_private_key_provider(msg); + if (sub == NULL) { + sub = (struct envoy_api_v2_auth_PrivateKeyProvider*)upb_msg_new(&envoy_api_v2_auth_PrivateKeyProvider_msginit, arena); + if (!sub) return NULL; + envoy_api_v2_auth_TlsCertificate_set_private_key_provider(msg, sub); + } + return sub; +} + +/* envoy.api.v2.auth.TlsSessionTicketKeys */ + +UPB_INLINE envoy_api_v2_auth_TlsSessionTicketKeys *envoy_api_v2_auth_TlsSessionTicketKeys_new(upb_arena *arena) { + return (envoy_api_v2_auth_TlsSessionTicketKeys *)upb_msg_new(&envoy_api_v2_auth_TlsSessionTicketKeys_msginit, arena); +} +UPB_INLINE envoy_api_v2_auth_TlsSessionTicketKeys *envoy_api_v2_auth_TlsSessionTicketKeys_parse(const char *buf, size_t size, + upb_arena *arena) { + envoy_api_v2_auth_TlsSessionTicketKeys *ret = envoy_api_v2_auth_TlsSessionTicketKeys_new(arena); + return (ret && upb_decode(buf, size, ret, &envoy_api_v2_auth_TlsSessionTicketKeys_msginit, arena)) ? ret : NULL; +} +UPB_INLINE char *envoy_api_v2_auth_TlsSessionTicketKeys_serialize(const envoy_api_v2_auth_TlsSessionTicketKeys *msg, upb_arena *arena, size_t *len) { + return upb_encode(msg, &envoy_api_v2_auth_TlsSessionTicketKeys_msginit, arena, len); +} + +UPB_INLINE const struct envoy_api_v2_core_DataSource* const* envoy_api_v2_auth_TlsSessionTicketKeys_keys(const envoy_api_v2_auth_TlsSessionTicketKeys *msg, size_t *len) { return (const struct envoy_api_v2_core_DataSource* const*)_upb_array_accessor(msg, UPB_SIZE(0, 0), len); } + +UPB_INLINE struct envoy_api_v2_core_DataSource** envoy_api_v2_auth_TlsSessionTicketKeys_mutable_keys(envoy_api_v2_auth_TlsSessionTicketKeys *msg, size_t *len) { + return (struct envoy_api_v2_core_DataSource**)_upb_array_mutable_accessor(msg, UPB_SIZE(0, 0), len); +} +UPB_INLINE struct envoy_api_v2_core_DataSource** envoy_api_v2_auth_TlsSessionTicketKeys_resize_keys(envoy_api_v2_auth_TlsSessionTicketKeys *msg, size_t len, upb_arena *arena) { + return (struct envoy_api_v2_core_DataSource**)_upb_array_resize_accessor(msg, UPB_SIZE(0, 0), len, UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, arena); +} +UPB_INLINE struct envoy_api_v2_core_DataSource* envoy_api_v2_auth_TlsSessionTicketKeys_add_keys(envoy_api_v2_auth_TlsSessionTicketKeys *msg, upb_arena *arena) { + struct envoy_api_v2_core_DataSource* sub = (struct envoy_api_v2_core_DataSource*)upb_msg_new(&envoy_api_v2_core_DataSource_msginit, arena); + bool ok = _upb_array_append_accessor( + msg, UPB_SIZE(0, 0), UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, &sub, arena); + if (!ok) return NULL; + return sub; +} + +/* envoy.api.v2.auth.CertificateValidationContext */ + +UPB_INLINE envoy_api_v2_auth_CertificateValidationContext *envoy_api_v2_auth_CertificateValidationContext_new(upb_arena *arena) { + return (envoy_api_v2_auth_CertificateValidationContext *)upb_msg_new(&envoy_api_v2_auth_CertificateValidationContext_msginit, arena); +} +UPB_INLINE envoy_api_v2_auth_CertificateValidationContext *envoy_api_v2_auth_CertificateValidationContext_parse(const char *buf, size_t size, + upb_arena *arena) { + envoy_api_v2_auth_CertificateValidationContext *ret = envoy_api_v2_auth_CertificateValidationContext_new(arena); + return (ret && upb_decode(buf, size, ret, &envoy_api_v2_auth_CertificateValidationContext_msginit, arena)) ? ret : NULL; +} +UPB_INLINE char *envoy_api_v2_auth_CertificateValidationContext_serialize(const envoy_api_v2_auth_CertificateValidationContext *msg, upb_arena *arena, size_t *len) { + return upb_encode(msg, &envoy_api_v2_auth_CertificateValidationContext_msginit, arena, len); +} + +UPB_INLINE const struct envoy_api_v2_core_DataSource* envoy_api_v2_auth_CertificateValidationContext_trusted_ca(const envoy_api_v2_auth_CertificateValidationContext *msg) { return UPB_FIELD_AT(msg, const struct envoy_api_v2_core_DataSource*, UPB_SIZE(12, 16)); } +UPB_INLINE upb_strview const* envoy_api_v2_auth_CertificateValidationContext_verify_certificate_hash(const envoy_api_v2_auth_CertificateValidationContext *msg, size_t *len) { return (upb_strview const*)_upb_array_accessor(msg, UPB_SIZE(28, 48), len); } +UPB_INLINE upb_strview const* envoy_api_v2_auth_CertificateValidationContext_verify_certificate_spki(const envoy_api_v2_auth_CertificateValidationContext *msg, size_t *len) { return (upb_strview const*)_upb_array_accessor(msg, UPB_SIZE(32, 56), len); } +UPB_INLINE upb_strview const* envoy_api_v2_auth_CertificateValidationContext_verify_subject_alt_name(const envoy_api_v2_auth_CertificateValidationContext *msg, size_t *len) { return (upb_strview const*)_upb_array_accessor(msg, UPB_SIZE(36, 64), len); } +UPB_INLINE const struct google_protobuf_BoolValue* envoy_api_v2_auth_CertificateValidationContext_require_ocsp_staple(const envoy_api_v2_auth_CertificateValidationContext *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_BoolValue*, UPB_SIZE(16, 24)); } +UPB_INLINE const struct google_protobuf_BoolValue* envoy_api_v2_auth_CertificateValidationContext_require_signed_certificate_timestamp(const envoy_api_v2_auth_CertificateValidationContext *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_BoolValue*, UPB_SIZE(20, 32)); } +UPB_INLINE const struct envoy_api_v2_core_DataSource* envoy_api_v2_auth_CertificateValidationContext_crl(const envoy_api_v2_auth_CertificateValidationContext *msg) { return UPB_FIELD_AT(msg, const struct envoy_api_v2_core_DataSource*, UPB_SIZE(24, 40)); } +UPB_INLINE bool envoy_api_v2_auth_CertificateValidationContext_allow_expired_certificate(const envoy_api_v2_auth_CertificateValidationContext *msg) { return UPB_FIELD_AT(msg, bool, UPB_SIZE(8, 8)); } +UPB_INLINE const struct envoy_type_matcher_StringMatcher* const* envoy_api_v2_auth_CertificateValidationContext_match_subject_alt_names(const envoy_api_v2_auth_CertificateValidationContext *msg, size_t *len) { return (const struct envoy_type_matcher_StringMatcher* const*)_upb_array_accessor(msg, UPB_SIZE(40, 72), len); } +UPB_INLINE int32_t envoy_api_v2_auth_CertificateValidationContext_trust_chain_verification(const envoy_api_v2_auth_CertificateValidationContext *msg) { return UPB_FIELD_AT(msg, int32_t, UPB_SIZE(0, 0)); } + +UPB_INLINE void envoy_api_v2_auth_CertificateValidationContext_set_trusted_ca(envoy_api_v2_auth_CertificateValidationContext *msg, struct envoy_api_v2_core_DataSource* value) { + UPB_FIELD_AT(msg, struct envoy_api_v2_core_DataSource*, UPB_SIZE(12, 16)) = value; +} +UPB_INLINE struct envoy_api_v2_core_DataSource* envoy_api_v2_auth_CertificateValidationContext_mutable_trusted_ca(envoy_api_v2_auth_CertificateValidationContext *msg, upb_arena *arena) { + struct envoy_api_v2_core_DataSource* sub = (struct envoy_api_v2_core_DataSource*)envoy_api_v2_auth_CertificateValidationContext_trusted_ca(msg); + if (sub == NULL) { + sub = (struct envoy_api_v2_core_DataSource*)upb_msg_new(&envoy_api_v2_core_DataSource_msginit, arena); + if (!sub) return NULL; + envoy_api_v2_auth_CertificateValidationContext_set_trusted_ca(msg, sub); + } + return sub; +} +UPB_INLINE upb_strview* envoy_api_v2_auth_CertificateValidationContext_mutable_verify_certificate_hash(envoy_api_v2_auth_CertificateValidationContext *msg, size_t *len) { + return (upb_strview*)_upb_array_mutable_accessor(msg, UPB_SIZE(28, 48), len); +} +UPB_INLINE upb_strview* envoy_api_v2_auth_CertificateValidationContext_resize_verify_certificate_hash(envoy_api_v2_auth_CertificateValidationContext *msg, size_t len, upb_arena *arena) { + return (upb_strview*)_upb_array_resize_accessor(msg, UPB_SIZE(28, 48), len, UPB_SIZE(8, 16), UPB_TYPE_STRING, arena); +} +UPB_INLINE bool envoy_api_v2_auth_CertificateValidationContext_add_verify_certificate_hash(envoy_api_v2_auth_CertificateValidationContext *msg, upb_strview val, upb_arena *arena) { + return _upb_array_append_accessor( + msg, UPB_SIZE(28, 48), UPB_SIZE(8, 16), UPB_TYPE_STRING, &val, arena); +} +UPB_INLINE upb_strview* envoy_api_v2_auth_CertificateValidationContext_mutable_verify_certificate_spki(envoy_api_v2_auth_CertificateValidationContext *msg, size_t *len) { + return (upb_strview*)_upb_array_mutable_accessor(msg, UPB_SIZE(32, 56), len); +} +UPB_INLINE upb_strview* envoy_api_v2_auth_CertificateValidationContext_resize_verify_certificate_spki(envoy_api_v2_auth_CertificateValidationContext *msg, size_t len, upb_arena *arena) { + return (upb_strview*)_upb_array_resize_accessor(msg, UPB_SIZE(32, 56), len, UPB_SIZE(8, 16), UPB_TYPE_STRING, arena); +} +UPB_INLINE bool envoy_api_v2_auth_CertificateValidationContext_add_verify_certificate_spki(envoy_api_v2_auth_CertificateValidationContext *msg, upb_strview val, upb_arena *arena) { + return _upb_array_append_accessor( + msg, UPB_SIZE(32, 56), UPB_SIZE(8, 16), UPB_TYPE_STRING, &val, arena); +} +UPB_INLINE upb_strview* envoy_api_v2_auth_CertificateValidationContext_mutable_verify_subject_alt_name(envoy_api_v2_auth_CertificateValidationContext *msg, size_t *len) { + return (upb_strview*)_upb_array_mutable_accessor(msg, UPB_SIZE(36, 64), len); +} +UPB_INLINE upb_strview* envoy_api_v2_auth_CertificateValidationContext_resize_verify_subject_alt_name(envoy_api_v2_auth_CertificateValidationContext *msg, size_t len, upb_arena *arena) { + return (upb_strview*)_upb_array_resize_accessor(msg, UPB_SIZE(36, 64), len, UPB_SIZE(8, 16), UPB_TYPE_STRING, arena); +} +UPB_INLINE bool envoy_api_v2_auth_CertificateValidationContext_add_verify_subject_alt_name(envoy_api_v2_auth_CertificateValidationContext *msg, upb_strview val, upb_arena *arena) { + return _upb_array_append_accessor( + msg, UPB_SIZE(36, 64), UPB_SIZE(8, 16), UPB_TYPE_STRING, &val, arena); +} +UPB_INLINE void envoy_api_v2_auth_CertificateValidationContext_set_require_ocsp_staple(envoy_api_v2_auth_CertificateValidationContext *msg, struct google_protobuf_BoolValue* value) { + UPB_FIELD_AT(msg, struct google_protobuf_BoolValue*, UPB_SIZE(16, 24)) = value; +} +UPB_INLINE struct google_protobuf_BoolValue* envoy_api_v2_auth_CertificateValidationContext_mutable_require_ocsp_staple(envoy_api_v2_auth_CertificateValidationContext *msg, upb_arena *arena) { + struct google_protobuf_BoolValue* sub = (struct google_protobuf_BoolValue*)envoy_api_v2_auth_CertificateValidationContext_require_ocsp_staple(msg); + if (sub == NULL) { + sub = (struct google_protobuf_BoolValue*)upb_msg_new(&google_protobuf_BoolValue_msginit, arena); + if (!sub) return NULL; + envoy_api_v2_auth_CertificateValidationContext_set_require_ocsp_staple(msg, sub); + } + return sub; +} +UPB_INLINE void envoy_api_v2_auth_CertificateValidationContext_set_require_signed_certificate_timestamp(envoy_api_v2_auth_CertificateValidationContext *msg, struct google_protobuf_BoolValue* value) { + UPB_FIELD_AT(msg, struct google_protobuf_BoolValue*, UPB_SIZE(20, 32)) = value; +} +UPB_INLINE struct google_protobuf_BoolValue* envoy_api_v2_auth_CertificateValidationContext_mutable_require_signed_certificate_timestamp(envoy_api_v2_auth_CertificateValidationContext *msg, upb_arena *arena) { + struct google_protobuf_BoolValue* sub = (struct google_protobuf_BoolValue*)envoy_api_v2_auth_CertificateValidationContext_require_signed_certificate_timestamp(msg); + if (sub == NULL) { + sub = (struct google_protobuf_BoolValue*)upb_msg_new(&google_protobuf_BoolValue_msginit, arena); + if (!sub) return NULL; + envoy_api_v2_auth_CertificateValidationContext_set_require_signed_certificate_timestamp(msg, sub); + } + return sub; +} +UPB_INLINE void envoy_api_v2_auth_CertificateValidationContext_set_crl(envoy_api_v2_auth_CertificateValidationContext *msg, struct envoy_api_v2_core_DataSource* value) { + UPB_FIELD_AT(msg, struct envoy_api_v2_core_DataSource*, UPB_SIZE(24, 40)) = value; +} +UPB_INLINE struct envoy_api_v2_core_DataSource* envoy_api_v2_auth_CertificateValidationContext_mutable_crl(envoy_api_v2_auth_CertificateValidationContext *msg, upb_arena *arena) { + struct envoy_api_v2_core_DataSource* sub = (struct envoy_api_v2_core_DataSource*)envoy_api_v2_auth_CertificateValidationContext_crl(msg); + if (sub == NULL) { + sub = (struct envoy_api_v2_core_DataSource*)upb_msg_new(&envoy_api_v2_core_DataSource_msginit, arena); + if (!sub) return NULL; + envoy_api_v2_auth_CertificateValidationContext_set_crl(msg, sub); + } + return sub; +} +UPB_INLINE void envoy_api_v2_auth_CertificateValidationContext_set_allow_expired_certificate(envoy_api_v2_auth_CertificateValidationContext *msg, bool value) { + UPB_FIELD_AT(msg, bool, UPB_SIZE(8, 8)) = value; +} +UPB_INLINE struct envoy_type_matcher_StringMatcher** envoy_api_v2_auth_CertificateValidationContext_mutable_match_subject_alt_names(envoy_api_v2_auth_CertificateValidationContext *msg, size_t *len) { + return (struct envoy_type_matcher_StringMatcher**)_upb_array_mutable_accessor(msg, UPB_SIZE(40, 72), len); +} +UPB_INLINE struct envoy_type_matcher_StringMatcher** envoy_api_v2_auth_CertificateValidationContext_resize_match_subject_alt_names(envoy_api_v2_auth_CertificateValidationContext *msg, size_t len, upb_arena *arena) { + return (struct envoy_type_matcher_StringMatcher**)_upb_array_resize_accessor(msg, UPB_SIZE(40, 72), len, UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, arena); +} +UPB_INLINE struct envoy_type_matcher_StringMatcher* envoy_api_v2_auth_CertificateValidationContext_add_match_subject_alt_names(envoy_api_v2_auth_CertificateValidationContext *msg, upb_arena *arena) { + struct envoy_type_matcher_StringMatcher* sub = (struct envoy_type_matcher_StringMatcher*)upb_msg_new(&envoy_type_matcher_StringMatcher_msginit, arena); + bool ok = _upb_array_append_accessor( + msg, UPB_SIZE(40, 72), UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, &sub, arena); + if (!ok) return NULL; + return sub; +} +UPB_INLINE void envoy_api_v2_auth_CertificateValidationContext_set_trust_chain_verification(envoy_api_v2_auth_CertificateValidationContext *msg, int32_t value) { + UPB_FIELD_AT(msg, int32_t, UPB_SIZE(0, 0)) = value; +} + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#include "upb/port_undef.inc" + +#endif /* ENVOY_API_V2_AUTH_COMMON_PROTO_UPB_H_ */ diff --git a/src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.c b/src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.c new file mode 100644 index 00000000000..d34d2257cdf --- /dev/null +++ b/src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.c @@ -0,0 +1,72 @@ +/* This file was generated by upbc (the upb compiler) from the input + * file: + * + * envoy/api/v2/auth/secret.proto + * + * Do not edit -- your changes will be discarded when the file is + * regenerated. */ + +#include +#include "upb/msg.h" +#include "envoy/api/v2/auth/secret.upb.h" +#include "envoy/api/v2/auth/common.upb.h" +#include "envoy/api/v2/core/base.upb.h" +#include "envoy/api/v2/core/config_source.upb.h" +#include "udpa/annotations/migrate.upb.h" +#include "udpa/annotations/sensitive.upb.h" +#include "udpa/annotations/status.upb.h" + +#include "upb/port_def.inc" + +static const upb_msglayout *const envoy_api_v2_auth_GenericSecret_submsgs[1] = { + &envoy_api_v2_core_DataSource_msginit, +}; + +static const upb_msglayout_field envoy_api_v2_auth_GenericSecret__fields[1] = { + {1, UPB_SIZE(0, 0), 0, 0, 11, 1}, +}; + +const upb_msglayout envoy_api_v2_auth_GenericSecret_msginit = { + &envoy_api_v2_auth_GenericSecret_submsgs[0], + &envoy_api_v2_auth_GenericSecret__fields[0], + UPB_SIZE(4, 8), 1, false, +}; + +static const upb_msglayout *const envoy_api_v2_auth_SdsSecretConfig_submsgs[1] = { + &envoy_api_v2_core_ConfigSource_msginit, +}; + +static const upb_msglayout_field envoy_api_v2_auth_SdsSecretConfig__fields[2] = { + {1, UPB_SIZE(0, 0), 0, 0, 9, 1}, + {2, UPB_SIZE(8, 16), 0, 0, 11, 1}, +}; + +const upb_msglayout envoy_api_v2_auth_SdsSecretConfig_msginit = { + &envoy_api_v2_auth_SdsSecretConfig_submsgs[0], + &envoy_api_v2_auth_SdsSecretConfig__fields[0], + UPB_SIZE(16, 32), 2, false, +}; + +static const upb_msglayout *const envoy_api_v2_auth_Secret_submsgs[4] = { + &envoy_api_v2_auth_CertificateValidationContext_msginit, + &envoy_api_v2_auth_GenericSecret_msginit, + &envoy_api_v2_auth_TlsCertificate_msginit, + &envoy_api_v2_auth_TlsSessionTicketKeys_msginit, +}; + +static const upb_msglayout_field envoy_api_v2_auth_Secret__fields[5] = { + {1, UPB_SIZE(0, 0), 0, 0, 9, 1}, + {2, UPB_SIZE(8, 16), UPB_SIZE(-13, -25), 2, 11, 1}, + {3, UPB_SIZE(8, 16), UPB_SIZE(-13, -25), 3, 11, 1}, + {4, UPB_SIZE(8, 16), UPB_SIZE(-13, -25), 0, 11, 1}, + {5, UPB_SIZE(8, 16), UPB_SIZE(-13, -25), 1, 11, 1}, +}; + +const upb_msglayout envoy_api_v2_auth_Secret_msginit = { + &envoy_api_v2_auth_Secret_submsgs[0], + &envoy_api_v2_auth_Secret__fields[0], + UPB_SIZE(16, 32), 5, false, +}; + +#include "upb/port_undef.inc" + diff --git a/src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.h b/src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.h new file mode 100644 index 00000000000..cf3c7820a15 --- /dev/null +++ b/src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.h @@ -0,0 +1,197 @@ +/* This file was generated by upbc (the upb compiler) from the input + * file: + * + * envoy/api/v2/auth/secret.proto + * + * Do not edit -- your changes will be discarded when the file is + * regenerated. */ + +#ifndef ENVOY_API_V2_AUTH_SECRET_PROTO_UPB_H_ +#define ENVOY_API_V2_AUTH_SECRET_PROTO_UPB_H_ + +#include "upb/generated_util.h" +#include "upb/msg.h" +#include "upb/decode.h" +#include "upb/encode.h" + +#include "upb/port_def.inc" + +#ifdef __cplusplus +extern "C" { +#endif + +struct envoy_api_v2_auth_GenericSecret; +struct envoy_api_v2_auth_SdsSecretConfig; +struct envoy_api_v2_auth_Secret; +typedef struct envoy_api_v2_auth_GenericSecret envoy_api_v2_auth_GenericSecret; +typedef struct envoy_api_v2_auth_SdsSecretConfig envoy_api_v2_auth_SdsSecretConfig; +typedef struct envoy_api_v2_auth_Secret envoy_api_v2_auth_Secret; +extern const upb_msglayout envoy_api_v2_auth_GenericSecret_msginit; +extern const upb_msglayout envoy_api_v2_auth_SdsSecretConfig_msginit; +extern const upb_msglayout envoy_api_v2_auth_Secret_msginit; +struct envoy_api_v2_auth_CertificateValidationContext; +struct envoy_api_v2_auth_TlsCertificate; +struct envoy_api_v2_auth_TlsSessionTicketKeys; +struct envoy_api_v2_core_ConfigSource; +struct envoy_api_v2_core_DataSource; +extern const upb_msglayout envoy_api_v2_auth_CertificateValidationContext_msginit; +extern const upb_msglayout envoy_api_v2_auth_TlsCertificate_msginit; +extern const upb_msglayout envoy_api_v2_auth_TlsSessionTicketKeys_msginit; +extern const upb_msglayout envoy_api_v2_core_ConfigSource_msginit; +extern const upb_msglayout envoy_api_v2_core_DataSource_msginit; + + +/* envoy.api.v2.auth.GenericSecret */ + +UPB_INLINE envoy_api_v2_auth_GenericSecret *envoy_api_v2_auth_GenericSecret_new(upb_arena *arena) { + return (envoy_api_v2_auth_GenericSecret *)upb_msg_new(&envoy_api_v2_auth_GenericSecret_msginit, arena); +} +UPB_INLINE envoy_api_v2_auth_GenericSecret *envoy_api_v2_auth_GenericSecret_parse(const char *buf, size_t size, + upb_arena *arena) { + envoy_api_v2_auth_GenericSecret *ret = envoy_api_v2_auth_GenericSecret_new(arena); + return (ret && upb_decode(buf, size, ret, &envoy_api_v2_auth_GenericSecret_msginit, arena)) ? ret : NULL; +} +UPB_INLINE char *envoy_api_v2_auth_GenericSecret_serialize(const envoy_api_v2_auth_GenericSecret *msg, upb_arena *arena, size_t *len) { + return upb_encode(msg, &envoy_api_v2_auth_GenericSecret_msginit, arena, len); +} + +UPB_INLINE const struct envoy_api_v2_core_DataSource* envoy_api_v2_auth_GenericSecret_secret(const envoy_api_v2_auth_GenericSecret *msg) { return UPB_FIELD_AT(msg, const struct envoy_api_v2_core_DataSource*, UPB_SIZE(0, 0)); } + +UPB_INLINE void envoy_api_v2_auth_GenericSecret_set_secret(envoy_api_v2_auth_GenericSecret *msg, struct envoy_api_v2_core_DataSource* value) { + UPB_FIELD_AT(msg, struct envoy_api_v2_core_DataSource*, UPB_SIZE(0, 0)) = value; +} +UPB_INLINE struct envoy_api_v2_core_DataSource* envoy_api_v2_auth_GenericSecret_mutable_secret(envoy_api_v2_auth_GenericSecret *msg, upb_arena *arena) { + struct envoy_api_v2_core_DataSource* sub = (struct envoy_api_v2_core_DataSource*)envoy_api_v2_auth_GenericSecret_secret(msg); + if (sub == NULL) { + sub = (struct envoy_api_v2_core_DataSource*)upb_msg_new(&envoy_api_v2_core_DataSource_msginit, arena); + if (!sub) return NULL; + envoy_api_v2_auth_GenericSecret_set_secret(msg, sub); + } + return sub; +} + +/* envoy.api.v2.auth.SdsSecretConfig */ + +UPB_INLINE envoy_api_v2_auth_SdsSecretConfig *envoy_api_v2_auth_SdsSecretConfig_new(upb_arena *arena) { + return (envoy_api_v2_auth_SdsSecretConfig *)upb_msg_new(&envoy_api_v2_auth_SdsSecretConfig_msginit, arena); +} +UPB_INLINE envoy_api_v2_auth_SdsSecretConfig *envoy_api_v2_auth_SdsSecretConfig_parse(const char *buf, size_t size, + upb_arena *arena) { + envoy_api_v2_auth_SdsSecretConfig *ret = envoy_api_v2_auth_SdsSecretConfig_new(arena); + return (ret && upb_decode(buf, size, ret, &envoy_api_v2_auth_SdsSecretConfig_msginit, arena)) ? ret : NULL; +} +UPB_INLINE char *envoy_api_v2_auth_SdsSecretConfig_serialize(const envoy_api_v2_auth_SdsSecretConfig *msg, upb_arena *arena, size_t *len) { + return upb_encode(msg, &envoy_api_v2_auth_SdsSecretConfig_msginit, arena, len); +} + +UPB_INLINE upb_strview envoy_api_v2_auth_SdsSecretConfig_name(const envoy_api_v2_auth_SdsSecretConfig *msg) { return UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(0, 0)); } +UPB_INLINE const struct envoy_api_v2_core_ConfigSource* envoy_api_v2_auth_SdsSecretConfig_sds_config(const envoy_api_v2_auth_SdsSecretConfig *msg) { return UPB_FIELD_AT(msg, const struct envoy_api_v2_core_ConfigSource*, UPB_SIZE(8, 16)); } + +UPB_INLINE void envoy_api_v2_auth_SdsSecretConfig_set_name(envoy_api_v2_auth_SdsSecretConfig *msg, upb_strview value) { + UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(0, 0)) = value; +} +UPB_INLINE void envoy_api_v2_auth_SdsSecretConfig_set_sds_config(envoy_api_v2_auth_SdsSecretConfig *msg, struct envoy_api_v2_core_ConfigSource* value) { + UPB_FIELD_AT(msg, struct envoy_api_v2_core_ConfigSource*, UPB_SIZE(8, 16)) = value; +} +UPB_INLINE struct envoy_api_v2_core_ConfigSource* envoy_api_v2_auth_SdsSecretConfig_mutable_sds_config(envoy_api_v2_auth_SdsSecretConfig *msg, upb_arena *arena) { + struct envoy_api_v2_core_ConfigSource* sub = (struct envoy_api_v2_core_ConfigSource*)envoy_api_v2_auth_SdsSecretConfig_sds_config(msg); + if (sub == NULL) { + sub = (struct envoy_api_v2_core_ConfigSource*)upb_msg_new(&envoy_api_v2_core_ConfigSource_msginit, arena); + if (!sub) return NULL; + envoy_api_v2_auth_SdsSecretConfig_set_sds_config(msg, sub); + } + return sub; +} + +/* envoy.api.v2.auth.Secret */ + +UPB_INLINE envoy_api_v2_auth_Secret *envoy_api_v2_auth_Secret_new(upb_arena *arena) { + return (envoy_api_v2_auth_Secret *)upb_msg_new(&envoy_api_v2_auth_Secret_msginit, arena); +} +UPB_INLINE envoy_api_v2_auth_Secret *envoy_api_v2_auth_Secret_parse(const char *buf, size_t size, + upb_arena *arena) { + envoy_api_v2_auth_Secret *ret = envoy_api_v2_auth_Secret_new(arena); + return (ret && upb_decode(buf, size, ret, &envoy_api_v2_auth_Secret_msginit, arena)) ? ret : NULL; +} +UPB_INLINE char *envoy_api_v2_auth_Secret_serialize(const envoy_api_v2_auth_Secret *msg, upb_arena *arena, size_t *len) { + return upb_encode(msg, &envoy_api_v2_auth_Secret_msginit, arena, len); +} + +typedef enum { + envoy_api_v2_auth_Secret_type_tls_certificate = 2, + envoy_api_v2_auth_Secret_type_session_ticket_keys = 3, + envoy_api_v2_auth_Secret_type_validation_context = 4, + envoy_api_v2_auth_Secret_type_generic_secret = 5, + envoy_api_v2_auth_Secret_type_NOT_SET = 0 +} envoy_api_v2_auth_Secret_type_oneofcases; +UPB_INLINE envoy_api_v2_auth_Secret_type_oneofcases envoy_api_v2_auth_Secret_type_case(const envoy_api_v2_auth_Secret* msg) { return (envoy_api_v2_auth_Secret_type_oneofcases)UPB_FIELD_AT(msg, int32_t, UPB_SIZE(12, 24)); } + +UPB_INLINE upb_strview envoy_api_v2_auth_Secret_name(const envoy_api_v2_auth_Secret *msg) { return UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(0, 0)); } +UPB_INLINE bool envoy_api_v2_auth_Secret_has_tls_certificate(const envoy_api_v2_auth_Secret *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(12, 24), 2); } +UPB_INLINE const struct envoy_api_v2_auth_TlsCertificate* envoy_api_v2_auth_Secret_tls_certificate(const envoy_api_v2_auth_Secret *msg) { return UPB_READ_ONEOF(msg, const struct envoy_api_v2_auth_TlsCertificate*, UPB_SIZE(8, 16), UPB_SIZE(12, 24), 2, NULL); } +UPB_INLINE bool envoy_api_v2_auth_Secret_has_session_ticket_keys(const envoy_api_v2_auth_Secret *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(12, 24), 3); } +UPB_INLINE const struct envoy_api_v2_auth_TlsSessionTicketKeys* envoy_api_v2_auth_Secret_session_ticket_keys(const envoy_api_v2_auth_Secret *msg) { return UPB_READ_ONEOF(msg, const struct envoy_api_v2_auth_TlsSessionTicketKeys*, UPB_SIZE(8, 16), UPB_SIZE(12, 24), 3, NULL); } +UPB_INLINE bool envoy_api_v2_auth_Secret_has_validation_context(const envoy_api_v2_auth_Secret *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(12, 24), 4); } +UPB_INLINE const struct envoy_api_v2_auth_CertificateValidationContext* envoy_api_v2_auth_Secret_validation_context(const envoy_api_v2_auth_Secret *msg) { return UPB_READ_ONEOF(msg, const struct envoy_api_v2_auth_CertificateValidationContext*, UPB_SIZE(8, 16), UPB_SIZE(12, 24), 4, NULL); } +UPB_INLINE bool envoy_api_v2_auth_Secret_has_generic_secret(const envoy_api_v2_auth_Secret *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(12, 24), 5); } +UPB_INLINE const envoy_api_v2_auth_GenericSecret* envoy_api_v2_auth_Secret_generic_secret(const envoy_api_v2_auth_Secret *msg) { return UPB_READ_ONEOF(msg, const envoy_api_v2_auth_GenericSecret*, UPB_SIZE(8, 16), UPB_SIZE(12, 24), 5, NULL); } + +UPB_INLINE void envoy_api_v2_auth_Secret_set_name(envoy_api_v2_auth_Secret *msg, upb_strview value) { + UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(0, 0)) = value; +} +UPB_INLINE void envoy_api_v2_auth_Secret_set_tls_certificate(envoy_api_v2_auth_Secret *msg, struct envoy_api_v2_auth_TlsCertificate* value) { + UPB_WRITE_ONEOF(msg, struct envoy_api_v2_auth_TlsCertificate*, UPB_SIZE(8, 16), value, UPB_SIZE(12, 24), 2); +} +UPB_INLINE struct envoy_api_v2_auth_TlsCertificate* envoy_api_v2_auth_Secret_mutable_tls_certificate(envoy_api_v2_auth_Secret *msg, upb_arena *arena) { + struct envoy_api_v2_auth_TlsCertificate* sub = (struct envoy_api_v2_auth_TlsCertificate*)envoy_api_v2_auth_Secret_tls_certificate(msg); + if (sub == NULL) { + sub = (struct envoy_api_v2_auth_TlsCertificate*)upb_msg_new(&envoy_api_v2_auth_TlsCertificate_msginit, arena); + if (!sub) return NULL; + envoy_api_v2_auth_Secret_set_tls_certificate(msg, sub); + } + return sub; +} +UPB_INLINE void envoy_api_v2_auth_Secret_set_session_ticket_keys(envoy_api_v2_auth_Secret *msg, struct envoy_api_v2_auth_TlsSessionTicketKeys* value) { + UPB_WRITE_ONEOF(msg, struct envoy_api_v2_auth_TlsSessionTicketKeys*, UPB_SIZE(8, 16), value, UPB_SIZE(12, 24), 3); +} +UPB_INLINE struct envoy_api_v2_auth_TlsSessionTicketKeys* envoy_api_v2_auth_Secret_mutable_session_ticket_keys(envoy_api_v2_auth_Secret *msg, upb_arena *arena) { + struct envoy_api_v2_auth_TlsSessionTicketKeys* sub = (struct envoy_api_v2_auth_TlsSessionTicketKeys*)envoy_api_v2_auth_Secret_session_ticket_keys(msg); + if (sub == NULL) { + sub = (struct envoy_api_v2_auth_TlsSessionTicketKeys*)upb_msg_new(&envoy_api_v2_auth_TlsSessionTicketKeys_msginit, arena); + if (!sub) return NULL; + envoy_api_v2_auth_Secret_set_session_ticket_keys(msg, sub); + } + return sub; +} +UPB_INLINE void envoy_api_v2_auth_Secret_set_validation_context(envoy_api_v2_auth_Secret *msg, struct envoy_api_v2_auth_CertificateValidationContext* value) { + UPB_WRITE_ONEOF(msg, struct envoy_api_v2_auth_CertificateValidationContext*, UPB_SIZE(8, 16), value, UPB_SIZE(12, 24), 4); +} +UPB_INLINE struct envoy_api_v2_auth_CertificateValidationContext* envoy_api_v2_auth_Secret_mutable_validation_context(envoy_api_v2_auth_Secret *msg, upb_arena *arena) { + struct envoy_api_v2_auth_CertificateValidationContext* sub = (struct envoy_api_v2_auth_CertificateValidationContext*)envoy_api_v2_auth_Secret_validation_context(msg); + if (sub == NULL) { + sub = (struct envoy_api_v2_auth_CertificateValidationContext*)upb_msg_new(&envoy_api_v2_auth_CertificateValidationContext_msginit, arena); + if (!sub) return NULL; + envoy_api_v2_auth_Secret_set_validation_context(msg, sub); + } + return sub; +} +UPB_INLINE void envoy_api_v2_auth_Secret_set_generic_secret(envoy_api_v2_auth_Secret *msg, envoy_api_v2_auth_GenericSecret* value) { + UPB_WRITE_ONEOF(msg, envoy_api_v2_auth_GenericSecret*, UPB_SIZE(8, 16), value, UPB_SIZE(12, 24), 5); +} +UPB_INLINE struct envoy_api_v2_auth_GenericSecret* envoy_api_v2_auth_Secret_mutable_generic_secret(envoy_api_v2_auth_Secret *msg, upb_arena *arena) { + struct envoy_api_v2_auth_GenericSecret* sub = (struct envoy_api_v2_auth_GenericSecret*)envoy_api_v2_auth_Secret_generic_secret(msg); + if (sub == NULL) { + sub = (struct envoy_api_v2_auth_GenericSecret*)upb_msg_new(&envoy_api_v2_auth_GenericSecret_msginit, arena); + if (!sub) return NULL; + envoy_api_v2_auth_Secret_set_generic_secret(msg, sub); + } + return sub; +} + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#include "upb/port_undef.inc" + +#endif /* ENVOY_API_V2_AUTH_SECRET_PROTO_UPB_H_ */ diff --git a/src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.c b/src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.c new file mode 100644 index 00000000000..67cc1492b92 --- /dev/null +++ b/src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.c @@ -0,0 +1,105 @@ +/* This file was generated by upbc (the upb compiler) from the input + * file: + * + * envoy/api/v2/auth/tls.proto + * + * Do not edit -- your changes will be discarded when the file is + * regenerated. */ + +#include +#include "upb/msg.h" +#include "envoy/api/v2/auth/tls.upb.h" +#include "envoy/api/v2/auth/common.upb.h" +#include "envoy/api/v2/auth/secret.upb.h" +#include "google/protobuf/duration.upb.h" +#include "google/protobuf/wrappers.upb.h" +#include "udpa/annotations/migrate.upb.h" +#include "udpa/annotations/status.upb.h" +#include "validate/validate.upb.h" + +#include "upb/port_def.inc" + +static const upb_msglayout *const envoy_api_v2_auth_UpstreamTlsContext_submsgs[2] = { + &envoy_api_v2_auth_CommonTlsContext_msginit, + &google_protobuf_UInt32Value_msginit, +}; + +static const upb_msglayout_field envoy_api_v2_auth_UpstreamTlsContext__fields[4] = { + {1, UPB_SIZE(12, 24), 0, 0, 11, 1}, + {2, UPB_SIZE(4, 8), 0, 0, 9, 1}, + {3, UPB_SIZE(0, 0), 0, 0, 8, 1}, + {4, UPB_SIZE(16, 32), 0, 1, 11, 1}, +}; + +const upb_msglayout envoy_api_v2_auth_UpstreamTlsContext_msginit = { + &envoy_api_v2_auth_UpstreamTlsContext_submsgs[0], + &envoy_api_v2_auth_UpstreamTlsContext__fields[0], + UPB_SIZE(24, 48), 4, false, +}; + +static const upb_msglayout *const envoy_api_v2_auth_DownstreamTlsContext_submsgs[6] = { + &envoy_api_v2_auth_CommonTlsContext_msginit, + &envoy_api_v2_auth_SdsSecretConfig_msginit, + &envoy_api_v2_auth_TlsSessionTicketKeys_msginit, + &google_protobuf_BoolValue_msginit, + &google_protobuf_Duration_msginit, +}; + +static const upb_msglayout_field envoy_api_v2_auth_DownstreamTlsContext__fields[7] = { + {1, UPB_SIZE(0, 0), 0, 0, 11, 1}, + {2, UPB_SIZE(4, 8), 0, 3, 11, 1}, + {3, UPB_SIZE(8, 16), 0, 3, 11, 1}, + {4, UPB_SIZE(16, 32), UPB_SIZE(-21, -41), 2, 11, 1}, + {5, UPB_SIZE(16, 32), UPB_SIZE(-21, -41), 1, 11, 1}, + {6, UPB_SIZE(12, 24), 0, 4, 11, 1}, + {7, UPB_SIZE(16, 32), UPB_SIZE(-21, -41), 0, 8, 1}, +}; + +const upb_msglayout envoy_api_v2_auth_DownstreamTlsContext_msginit = { + &envoy_api_v2_auth_DownstreamTlsContext_submsgs[0], + &envoy_api_v2_auth_DownstreamTlsContext__fields[0], + UPB_SIZE(24, 48), 7, false, +}; + +static const upb_msglayout *const envoy_api_v2_auth_CommonTlsContext_submsgs[6] = { + &envoy_api_v2_auth_CertificateValidationContext_msginit, + &envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext_msginit, + &envoy_api_v2_auth_SdsSecretConfig_msginit, + &envoy_api_v2_auth_TlsCertificate_msginit, + &envoy_api_v2_auth_TlsParameters_msginit, +}; + +static const upb_msglayout_field envoy_api_v2_auth_CommonTlsContext__fields[7] = { + {1, UPB_SIZE(0, 0), 0, 4, 11, 1}, + {2, UPB_SIZE(4, 8), 0, 3, 11, 3}, + {3, UPB_SIZE(16, 32), UPB_SIZE(-21, -41), 0, 11, 1}, + {4, UPB_SIZE(8, 16), 0, 0, 9, 3}, + {6, UPB_SIZE(12, 24), 0, 2, 11, 3}, + {7, UPB_SIZE(16, 32), UPB_SIZE(-21, -41), 2, 11, 1}, + {8, UPB_SIZE(16, 32), UPB_SIZE(-21, -41), 1, 11, 1}, +}; + +const upb_msglayout envoy_api_v2_auth_CommonTlsContext_msginit = { + &envoy_api_v2_auth_CommonTlsContext_submsgs[0], + &envoy_api_v2_auth_CommonTlsContext__fields[0], + UPB_SIZE(24, 48), 7, false, +}; + +static const upb_msglayout *const envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext_submsgs[2] = { + &envoy_api_v2_auth_CertificateValidationContext_msginit, + &envoy_api_v2_auth_SdsSecretConfig_msginit, +}; + +static const upb_msglayout_field envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext__fields[2] = { + {1, UPB_SIZE(0, 0), 0, 0, 11, 1}, + {2, UPB_SIZE(4, 8), 0, 1, 11, 1}, +}; + +const upb_msglayout envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext_msginit = { + &envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext_submsgs[0], + &envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext__fields[0], + UPB_SIZE(8, 16), 2, false, +}; + +#include "upb/port_undef.inc" + diff --git a/src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.h b/src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.h new file mode 100644 index 00000000000..4875017ba1e --- /dev/null +++ b/src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.h @@ -0,0 +1,378 @@ +/* This file was generated by upbc (the upb compiler) from the input + * file: + * + * envoy/api/v2/auth/tls.proto + * + * Do not edit -- your changes will be discarded when the file is + * regenerated. */ + +#ifndef ENVOY_API_V2_AUTH_TLS_PROTO_UPB_H_ +#define ENVOY_API_V2_AUTH_TLS_PROTO_UPB_H_ + +#include "upb/generated_util.h" +#include "upb/msg.h" +#include "upb/decode.h" +#include "upb/encode.h" + +#include "upb/port_def.inc" + +#ifdef __cplusplus +extern "C" { +#endif + +struct envoy_api_v2_auth_UpstreamTlsContext; +struct envoy_api_v2_auth_DownstreamTlsContext; +struct envoy_api_v2_auth_CommonTlsContext; +struct envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext; +typedef struct envoy_api_v2_auth_UpstreamTlsContext envoy_api_v2_auth_UpstreamTlsContext; +typedef struct envoy_api_v2_auth_DownstreamTlsContext envoy_api_v2_auth_DownstreamTlsContext; +typedef struct envoy_api_v2_auth_CommonTlsContext envoy_api_v2_auth_CommonTlsContext; +typedef struct envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext; +extern const upb_msglayout envoy_api_v2_auth_UpstreamTlsContext_msginit; +extern const upb_msglayout envoy_api_v2_auth_DownstreamTlsContext_msginit; +extern const upb_msglayout envoy_api_v2_auth_CommonTlsContext_msginit; +extern const upb_msglayout envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext_msginit; +struct envoy_api_v2_auth_CertificateValidationContext; +struct envoy_api_v2_auth_SdsSecretConfig; +struct envoy_api_v2_auth_TlsCertificate; +struct envoy_api_v2_auth_TlsParameters; +struct envoy_api_v2_auth_TlsSessionTicketKeys; +struct google_protobuf_BoolValue; +struct google_protobuf_Duration; +struct google_protobuf_UInt32Value; +extern const upb_msglayout envoy_api_v2_auth_CertificateValidationContext_msginit; +extern const upb_msglayout envoy_api_v2_auth_SdsSecretConfig_msginit; +extern const upb_msglayout envoy_api_v2_auth_TlsCertificate_msginit; +extern const upb_msglayout envoy_api_v2_auth_TlsParameters_msginit; +extern const upb_msglayout envoy_api_v2_auth_TlsSessionTicketKeys_msginit; +extern const upb_msglayout google_protobuf_BoolValue_msginit; +extern const upb_msglayout google_protobuf_Duration_msginit; +extern const upb_msglayout google_protobuf_UInt32Value_msginit; + + +/* envoy.api.v2.auth.UpstreamTlsContext */ + +UPB_INLINE envoy_api_v2_auth_UpstreamTlsContext *envoy_api_v2_auth_UpstreamTlsContext_new(upb_arena *arena) { + return (envoy_api_v2_auth_UpstreamTlsContext *)upb_msg_new(&envoy_api_v2_auth_UpstreamTlsContext_msginit, arena); +} +UPB_INLINE envoy_api_v2_auth_UpstreamTlsContext *envoy_api_v2_auth_UpstreamTlsContext_parse(const char *buf, size_t size, + upb_arena *arena) { + envoy_api_v2_auth_UpstreamTlsContext *ret = envoy_api_v2_auth_UpstreamTlsContext_new(arena); + return (ret && upb_decode(buf, size, ret, &envoy_api_v2_auth_UpstreamTlsContext_msginit, arena)) ? ret : NULL; +} +UPB_INLINE char *envoy_api_v2_auth_UpstreamTlsContext_serialize(const envoy_api_v2_auth_UpstreamTlsContext *msg, upb_arena *arena, size_t *len) { + return upb_encode(msg, &envoy_api_v2_auth_UpstreamTlsContext_msginit, arena, len); +} + +UPB_INLINE const envoy_api_v2_auth_CommonTlsContext* envoy_api_v2_auth_UpstreamTlsContext_common_tls_context(const envoy_api_v2_auth_UpstreamTlsContext *msg) { return UPB_FIELD_AT(msg, const envoy_api_v2_auth_CommonTlsContext*, UPB_SIZE(12, 24)); } +UPB_INLINE upb_strview envoy_api_v2_auth_UpstreamTlsContext_sni(const envoy_api_v2_auth_UpstreamTlsContext *msg) { return UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(4, 8)); } +UPB_INLINE bool envoy_api_v2_auth_UpstreamTlsContext_allow_renegotiation(const envoy_api_v2_auth_UpstreamTlsContext *msg) { return UPB_FIELD_AT(msg, bool, UPB_SIZE(0, 0)); } +UPB_INLINE const struct google_protobuf_UInt32Value* envoy_api_v2_auth_UpstreamTlsContext_max_session_keys(const envoy_api_v2_auth_UpstreamTlsContext *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_UInt32Value*, UPB_SIZE(16, 32)); } + +UPB_INLINE void envoy_api_v2_auth_UpstreamTlsContext_set_common_tls_context(envoy_api_v2_auth_UpstreamTlsContext *msg, envoy_api_v2_auth_CommonTlsContext* value) { + UPB_FIELD_AT(msg, envoy_api_v2_auth_CommonTlsContext*, UPB_SIZE(12, 24)) = value; +} +UPB_INLINE struct envoy_api_v2_auth_CommonTlsContext* envoy_api_v2_auth_UpstreamTlsContext_mutable_common_tls_context(envoy_api_v2_auth_UpstreamTlsContext *msg, upb_arena *arena) { + struct envoy_api_v2_auth_CommonTlsContext* sub = (struct envoy_api_v2_auth_CommonTlsContext*)envoy_api_v2_auth_UpstreamTlsContext_common_tls_context(msg); + if (sub == NULL) { + sub = (struct envoy_api_v2_auth_CommonTlsContext*)upb_msg_new(&envoy_api_v2_auth_CommonTlsContext_msginit, arena); + if (!sub) return NULL; + envoy_api_v2_auth_UpstreamTlsContext_set_common_tls_context(msg, sub); + } + return sub; +} +UPB_INLINE void envoy_api_v2_auth_UpstreamTlsContext_set_sni(envoy_api_v2_auth_UpstreamTlsContext *msg, upb_strview value) { + UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(4, 8)) = value; +} +UPB_INLINE void envoy_api_v2_auth_UpstreamTlsContext_set_allow_renegotiation(envoy_api_v2_auth_UpstreamTlsContext *msg, bool value) { + UPB_FIELD_AT(msg, bool, UPB_SIZE(0, 0)) = value; +} +UPB_INLINE void envoy_api_v2_auth_UpstreamTlsContext_set_max_session_keys(envoy_api_v2_auth_UpstreamTlsContext *msg, struct google_protobuf_UInt32Value* value) { + UPB_FIELD_AT(msg, struct google_protobuf_UInt32Value*, UPB_SIZE(16, 32)) = value; +} +UPB_INLINE struct google_protobuf_UInt32Value* envoy_api_v2_auth_UpstreamTlsContext_mutable_max_session_keys(envoy_api_v2_auth_UpstreamTlsContext *msg, upb_arena *arena) { + struct google_protobuf_UInt32Value* sub = (struct google_protobuf_UInt32Value*)envoy_api_v2_auth_UpstreamTlsContext_max_session_keys(msg); + if (sub == NULL) { + sub = (struct google_protobuf_UInt32Value*)upb_msg_new(&google_protobuf_UInt32Value_msginit, arena); + if (!sub) return NULL; + envoy_api_v2_auth_UpstreamTlsContext_set_max_session_keys(msg, sub); + } + return sub; +} + +/* envoy.api.v2.auth.DownstreamTlsContext */ + +UPB_INLINE envoy_api_v2_auth_DownstreamTlsContext *envoy_api_v2_auth_DownstreamTlsContext_new(upb_arena *arena) { + return (envoy_api_v2_auth_DownstreamTlsContext *)upb_msg_new(&envoy_api_v2_auth_DownstreamTlsContext_msginit, arena); +} +UPB_INLINE envoy_api_v2_auth_DownstreamTlsContext *envoy_api_v2_auth_DownstreamTlsContext_parse(const char *buf, size_t size, + upb_arena *arena) { + envoy_api_v2_auth_DownstreamTlsContext *ret = envoy_api_v2_auth_DownstreamTlsContext_new(arena); + return (ret && upb_decode(buf, size, ret, &envoy_api_v2_auth_DownstreamTlsContext_msginit, arena)) ? ret : NULL; +} +UPB_INLINE char *envoy_api_v2_auth_DownstreamTlsContext_serialize(const envoy_api_v2_auth_DownstreamTlsContext *msg, upb_arena *arena, size_t *len) { + return upb_encode(msg, &envoy_api_v2_auth_DownstreamTlsContext_msginit, arena, len); +} + +typedef enum { + envoy_api_v2_auth_DownstreamTlsContext_session_ticket_keys_type_session_ticket_keys = 4, + envoy_api_v2_auth_DownstreamTlsContext_session_ticket_keys_type_session_ticket_keys_sds_secret_config = 5, + envoy_api_v2_auth_DownstreamTlsContext_session_ticket_keys_type_disable_stateless_session_resumption = 7, + envoy_api_v2_auth_DownstreamTlsContext_session_ticket_keys_type_NOT_SET = 0 +} envoy_api_v2_auth_DownstreamTlsContext_session_ticket_keys_type_oneofcases; +UPB_INLINE envoy_api_v2_auth_DownstreamTlsContext_session_ticket_keys_type_oneofcases envoy_api_v2_auth_DownstreamTlsContext_session_ticket_keys_type_case(const envoy_api_v2_auth_DownstreamTlsContext* msg) { return (envoy_api_v2_auth_DownstreamTlsContext_session_ticket_keys_type_oneofcases)UPB_FIELD_AT(msg, int32_t, UPB_SIZE(20, 40)); } + +UPB_INLINE const envoy_api_v2_auth_CommonTlsContext* envoy_api_v2_auth_DownstreamTlsContext_common_tls_context(const envoy_api_v2_auth_DownstreamTlsContext *msg) { return UPB_FIELD_AT(msg, const envoy_api_v2_auth_CommonTlsContext*, UPB_SIZE(0, 0)); } +UPB_INLINE const struct google_protobuf_BoolValue* envoy_api_v2_auth_DownstreamTlsContext_require_client_certificate(const envoy_api_v2_auth_DownstreamTlsContext *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_BoolValue*, UPB_SIZE(4, 8)); } +UPB_INLINE const struct google_protobuf_BoolValue* envoy_api_v2_auth_DownstreamTlsContext_require_sni(const envoy_api_v2_auth_DownstreamTlsContext *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_BoolValue*, UPB_SIZE(8, 16)); } +UPB_INLINE bool envoy_api_v2_auth_DownstreamTlsContext_has_session_ticket_keys(const envoy_api_v2_auth_DownstreamTlsContext *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(20, 40), 4); } +UPB_INLINE const struct envoy_api_v2_auth_TlsSessionTicketKeys* envoy_api_v2_auth_DownstreamTlsContext_session_ticket_keys(const envoy_api_v2_auth_DownstreamTlsContext *msg) { return UPB_READ_ONEOF(msg, const struct envoy_api_v2_auth_TlsSessionTicketKeys*, UPB_SIZE(16, 32), UPB_SIZE(20, 40), 4, NULL); } +UPB_INLINE bool envoy_api_v2_auth_DownstreamTlsContext_has_session_ticket_keys_sds_secret_config(const envoy_api_v2_auth_DownstreamTlsContext *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(20, 40), 5); } +UPB_INLINE const struct envoy_api_v2_auth_SdsSecretConfig* envoy_api_v2_auth_DownstreamTlsContext_session_ticket_keys_sds_secret_config(const envoy_api_v2_auth_DownstreamTlsContext *msg) { return UPB_READ_ONEOF(msg, const struct envoy_api_v2_auth_SdsSecretConfig*, UPB_SIZE(16, 32), UPB_SIZE(20, 40), 5, NULL); } +UPB_INLINE const struct google_protobuf_Duration* envoy_api_v2_auth_DownstreamTlsContext_session_timeout(const envoy_api_v2_auth_DownstreamTlsContext *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_Duration*, UPB_SIZE(12, 24)); } +UPB_INLINE bool envoy_api_v2_auth_DownstreamTlsContext_has_disable_stateless_session_resumption(const envoy_api_v2_auth_DownstreamTlsContext *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(20, 40), 7); } +UPB_INLINE bool envoy_api_v2_auth_DownstreamTlsContext_disable_stateless_session_resumption(const envoy_api_v2_auth_DownstreamTlsContext *msg) { return UPB_READ_ONEOF(msg, bool, UPB_SIZE(16, 32), UPB_SIZE(20, 40), 7, false); } + +UPB_INLINE void envoy_api_v2_auth_DownstreamTlsContext_set_common_tls_context(envoy_api_v2_auth_DownstreamTlsContext *msg, envoy_api_v2_auth_CommonTlsContext* value) { + UPB_FIELD_AT(msg, envoy_api_v2_auth_CommonTlsContext*, UPB_SIZE(0, 0)) = value; +} +UPB_INLINE struct envoy_api_v2_auth_CommonTlsContext* envoy_api_v2_auth_DownstreamTlsContext_mutable_common_tls_context(envoy_api_v2_auth_DownstreamTlsContext *msg, upb_arena *arena) { + struct envoy_api_v2_auth_CommonTlsContext* sub = (struct envoy_api_v2_auth_CommonTlsContext*)envoy_api_v2_auth_DownstreamTlsContext_common_tls_context(msg); + if (sub == NULL) { + sub = (struct envoy_api_v2_auth_CommonTlsContext*)upb_msg_new(&envoy_api_v2_auth_CommonTlsContext_msginit, arena); + if (!sub) return NULL; + envoy_api_v2_auth_DownstreamTlsContext_set_common_tls_context(msg, sub); + } + return sub; +} +UPB_INLINE void envoy_api_v2_auth_DownstreamTlsContext_set_require_client_certificate(envoy_api_v2_auth_DownstreamTlsContext *msg, struct google_protobuf_BoolValue* value) { + UPB_FIELD_AT(msg, struct google_protobuf_BoolValue*, UPB_SIZE(4, 8)) = value; +} +UPB_INLINE struct google_protobuf_BoolValue* envoy_api_v2_auth_DownstreamTlsContext_mutable_require_client_certificate(envoy_api_v2_auth_DownstreamTlsContext *msg, upb_arena *arena) { + struct google_protobuf_BoolValue* sub = (struct google_protobuf_BoolValue*)envoy_api_v2_auth_DownstreamTlsContext_require_client_certificate(msg); + if (sub == NULL) { + sub = (struct google_protobuf_BoolValue*)upb_msg_new(&google_protobuf_BoolValue_msginit, arena); + if (!sub) return NULL; + envoy_api_v2_auth_DownstreamTlsContext_set_require_client_certificate(msg, sub); + } + return sub; +} +UPB_INLINE void envoy_api_v2_auth_DownstreamTlsContext_set_require_sni(envoy_api_v2_auth_DownstreamTlsContext *msg, struct google_protobuf_BoolValue* value) { + UPB_FIELD_AT(msg, struct google_protobuf_BoolValue*, UPB_SIZE(8, 16)) = value; +} +UPB_INLINE struct google_protobuf_BoolValue* envoy_api_v2_auth_DownstreamTlsContext_mutable_require_sni(envoy_api_v2_auth_DownstreamTlsContext *msg, upb_arena *arena) { + struct google_protobuf_BoolValue* sub = (struct google_protobuf_BoolValue*)envoy_api_v2_auth_DownstreamTlsContext_require_sni(msg); + if (sub == NULL) { + sub = (struct google_protobuf_BoolValue*)upb_msg_new(&google_protobuf_BoolValue_msginit, arena); + if (!sub) return NULL; + envoy_api_v2_auth_DownstreamTlsContext_set_require_sni(msg, sub); + } + return sub; +} +UPB_INLINE void envoy_api_v2_auth_DownstreamTlsContext_set_session_ticket_keys(envoy_api_v2_auth_DownstreamTlsContext *msg, struct envoy_api_v2_auth_TlsSessionTicketKeys* value) { + UPB_WRITE_ONEOF(msg, struct envoy_api_v2_auth_TlsSessionTicketKeys*, UPB_SIZE(16, 32), value, UPB_SIZE(20, 40), 4); +} +UPB_INLINE struct envoy_api_v2_auth_TlsSessionTicketKeys* envoy_api_v2_auth_DownstreamTlsContext_mutable_session_ticket_keys(envoy_api_v2_auth_DownstreamTlsContext *msg, upb_arena *arena) { + struct envoy_api_v2_auth_TlsSessionTicketKeys* sub = (struct envoy_api_v2_auth_TlsSessionTicketKeys*)envoy_api_v2_auth_DownstreamTlsContext_session_ticket_keys(msg); + if (sub == NULL) { + sub = (struct envoy_api_v2_auth_TlsSessionTicketKeys*)upb_msg_new(&envoy_api_v2_auth_TlsSessionTicketKeys_msginit, arena); + if (!sub) return NULL; + envoy_api_v2_auth_DownstreamTlsContext_set_session_ticket_keys(msg, sub); + } + return sub; +} +UPB_INLINE void envoy_api_v2_auth_DownstreamTlsContext_set_session_ticket_keys_sds_secret_config(envoy_api_v2_auth_DownstreamTlsContext *msg, struct envoy_api_v2_auth_SdsSecretConfig* value) { + UPB_WRITE_ONEOF(msg, struct envoy_api_v2_auth_SdsSecretConfig*, UPB_SIZE(16, 32), value, UPB_SIZE(20, 40), 5); +} +UPB_INLINE struct envoy_api_v2_auth_SdsSecretConfig* envoy_api_v2_auth_DownstreamTlsContext_mutable_session_ticket_keys_sds_secret_config(envoy_api_v2_auth_DownstreamTlsContext *msg, upb_arena *arena) { + struct envoy_api_v2_auth_SdsSecretConfig* sub = (struct envoy_api_v2_auth_SdsSecretConfig*)envoy_api_v2_auth_DownstreamTlsContext_session_ticket_keys_sds_secret_config(msg); + if (sub == NULL) { + sub = (struct envoy_api_v2_auth_SdsSecretConfig*)upb_msg_new(&envoy_api_v2_auth_SdsSecretConfig_msginit, arena); + if (!sub) return NULL; + envoy_api_v2_auth_DownstreamTlsContext_set_session_ticket_keys_sds_secret_config(msg, sub); + } + return sub; +} +UPB_INLINE void envoy_api_v2_auth_DownstreamTlsContext_set_session_timeout(envoy_api_v2_auth_DownstreamTlsContext *msg, struct google_protobuf_Duration* value) { + UPB_FIELD_AT(msg, struct google_protobuf_Duration*, UPB_SIZE(12, 24)) = value; +} +UPB_INLINE struct google_protobuf_Duration* envoy_api_v2_auth_DownstreamTlsContext_mutable_session_timeout(envoy_api_v2_auth_DownstreamTlsContext *msg, upb_arena *arena) { + struct google_protobuf_Duration* sub = (struct google_protobuf_Duration*)envoy_api_v2_auth_DownstreamTlsContext_session_timeout(msg); + if (sub == NULL) { + sub = (struct google_protobuf_Duration*)upb_msg_new(&google_protobuf_Duration_msginit, arena); + if (!sub) return NULL; + envoy_api_v2_auth_DownstreamTlsContext_set_session_timeout(msg, sub); + } + return sub; +} +UPB_INLINE void envoy_api_v2_auth_DownstreamTlsContext_set_disable_stateless_session_resumption(envoy_api_v2_auth_DownstreamTlsContext *msg, bool value) { + UPB_WRITE_ONEOF(msg, bool, UPB_SIZE(16, 32), value, UPB_SIZE(20, 40), 7); +} + +/* envoy.api.v2.auth.CommonTlsContext */ + +UPB_INLINE envoy_api_v2_auth_CommonTlsContext *envoy_api_v2_auth_CommonTlsContext_new(upb_arena *arena) { + return (envoy_api_v2_auth_CommonTlsContext *)upb_msg_new(&envoy_api_v2_auth_CommonTlsContext_msginit, arena); +} +UPB_INLINE envoy_api_v2_auth_CommonTlsContext *envoy_api_v2_auth_CommonTlsContext_parse(const char *buf, size_t size, + upb_arena *arena) { + envoy_api_v2_auth_CommonTlsContext *ret = envoy_api_v2_auth_CommonTlsContext_new(arena); + return (ret && upb_decode(buf, size, ret, &envoy_api_v2_auth_CommonTlsContext_msginit, arena)) ? ret : NULL; +} +UPB_INLINE char *envoy_api_v2_auth_CommonTlsContext_serialize(const envoy_api_v2_auth_CommonTlsContext *msg, upb_arena *arena, size_t *len) { + return upb_encode(msg, &envoy_api_v2_auth_CommonTlsContext_msginit, arena, len); +} + +typedef enum { + envoy_api_v2_auth_CommonTlsContext_validation_context_type_validation_context = 3, + envoy_api_v2_auth_CommonTlsContext_validation_context_type_validation_context_sds_secret_config = 7, + envoy_api_v2_auth_CommonTlsContext_validation_context_type_combined_validation_context = 8, + envoy_api_v2_auth_CommonTlsContext_validation_context_type_NOT_SET = 0 +} envoy_api_v2_auth_CommonTlsContext_validation_context_type_oneofcases; +UPB_INLINE envoy_api_v2_auth_CommonTlsContext_validation_context_type_oneofcases envoy_api_v2_auth_CommonTlsContext_validation_context_type_case(const envoy_api_v2_auth_CommonTlsContext* msg) { return (envoy_api_v2_auth_CommonTlsContext_validation_context_type_oneofcases)UPB_FIELD_AT(msg, int32_t, UPB_SIZE(20, 40)); } + +UPB_INLINE const struct envoy_api_v2_auth_TlsParameters* envoy_api_v2_auth_CommonTlsContext_tls_params(const envoy_api_v2_auth_CommonTlsContext *msg) { return UPB_FIELD_AT(msg, const struct envoy_api_v2_auth_TlsParameters*, UPB_SIZE(0, 0)); } +UPB_INLINE const struct envoy_api_v2_auth_TlsCertificate* const* envoy_api_v2_auth_CommonTlsContext_tls_certificates(const envoy_api_v2_auth_CommonTlsContext *msg, size_t *len) { return (const struct envoy_api_v2_auth_TlsCertificate* const*)_upb_array_accessor(msg, UPB_SIZE(4, 8), len); } +UPB_INLINE bool envoy_api_v2_auth_CommonTlsContext_has_validation_context(const envoy_api_v2_auth_CommonTlsContext *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(20, 40), 3); } +UPB_INLINE const struct envoy_api_v2_auth_CertificateValidationContext* envoy_api_v2_auth_CommonTlsContext_validation_context(const envoy_api_v2_auth_CommonTlsContext *msg) { return UPB_READ_ONEOF(msg, const struct envoy_api_v2_auth_CertificateValidationContext*, UPB_SIZE(16, 32), UPB_SIZE(20, 40), 3, NULL); } +UPB_INLINE upb_strview const* envoy_api_v2_auth_CommonTlsContext_alpn_protocols(const envoy_api_v2_auth_CommonTlsContext *msg, size_t *len) { return (upb_strview const*)_upb_array_accessor(msg, UPB_SIZE(8, 16), len); } +UPB_INLINE const struct envoy_api_v2_auth_SdsSecretConfig* const* envoy_api_v2_auth_CommonTlsContext_tls_certificate_sds_secret_configs(const envoy_api_v2_auth_CommonTlsContext *msg, size_t *len) { return (const struct envoy_api_v2_auth_SdsSecretConfig* const*)_upb_array_accessor(msg, UPB_SIZE(12, 24), len); } +UPB_INLINE bool envoy_api_v2_auth_CommonTlsContext_has_validation_context_sds_secret_config(const envoy_api_v2_auth_CommonTlsContext *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(20, 40), 7); } +UPB_INLINE const struct envoy_api_v2_auth_SdsSecretConfig* envoy_api_v2_auth_CommonTlsContext_validation_context_sds_secret_config(const envoy_api_v2_auth_CommonTlsContext *msg) { return UPB_READ_ONEOF(msg, const struct envoy_api_v2_auth_SdsSecretConfig*, UPB_SIZE(16, 32), UPB_SIZE(20, 40), 7, NULL); } +UPB_INLINE bool envoy_api_v2_auth_CommonTlsContext_has_combined_validation_context(const envoy_api_v2_auth_CommonTlsContext *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(20, 40), 8); } +UPB_INLINE const envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext* envoy_api_v2_auth_CommonTlsContext_combined_validation_context(const envoy_api_v2_auth_CommonTlsContext *msg) { return UPB_READ_ONEOF(msg, const envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext*, UPB_SIZE(16, 32), UPB_SIZE(20, 40), 8, NULL); } + +UPB_INLINE void envoy_api_v2_auth_CommonTlsContext_set_tls_params(envoy_api_v2_auth_CommonTlsContext *msg, struct envoy_api_v2_auth_TlsParameters* value) { + UPB_FIELD_AT(msg, struct envoy_api_v2_auth_TlsParameters*, UPB_SIZE(0, 0)) = value; +} +UPB_INLINE struct envoy_api_v2_auth_TlsParameters* envoy_api_v2_auth_CommonTlsContext_mutable_tls_params(envoy_api_v2_auth_CommonTlsContext *msg, upb_arena *arena) { + struct envoy_api_v2_auth_TlsParameters* sub = (struct envoy_api_v2_auth_TlsParameters*)envoy_api_v2_auth_CommonTlsContext_tls_params(msg); + if (sub == NULL) { + sub = (struct envoy_api_v2_auth_TlsParameters*)upb_msg_new(&envoy_api_v2_auth_TlsParameters_msginit, arena); + if (!sub) return NULL; + envoy_api_v2_auth_CommonTlsContext_set_tls_params(msg, sub); + } + return sub; +} +UPB_INLINE struct envoy_api_v2_auth_TlsCertificate** envoy_api_v2_auth_CommonTlsContext_mutable_tls_certificates(envoy_api_v2_auth_CommonTlsContext *msg, size_t *len) { + return (struct envoy_api_v2_auth_TlsCertificate**)_upb_array_mutable_accessor(msg, UPB_SIZE(4, 8), len); +} +UPB_INLINE struct envoy_api_v2_auth_TlsCertificate** envoy_api_v2_auth_CommonTlsContext_resize_tls_certificates(envoy_api_v2_auth_CommonTlsContext *msg, size_t len, upb_arena *arena) { + return (struct envoy_api_v2_auth_TlsCertificate**)_upb_array_resize_accessor(msg, UPB_SIZE(4, 8), len, UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, arena); +} +UPB_INLINE struct envoy_api_v2_auth_TlsCertificate* envoy_api_v2_auth_CommonTlsContext_add_tls_certificates(envoy_api_v2_auth_CommonTlsContext *msg, upb_arena *arena) { + struct envoy_api_v2_auth_TlsCertificate* sub = (struct envoy_api_v2_auth_TlsCertificate*)upb_msg_new(&envoy_api_v2_auth_TlsCertificate_msginit, arena); + bool ok = _upb_array_append_accessor( + msg, UPB_SIZE(4, 8), UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, &sub, arena); + if (!ok) return NULL; + return sub; +} +UPB_INLINE void envoy_api_v2_auth_CommonTlsContext_set_validation_context(envoy_api_v2_auth_CommonTlsContext *msg, struct envoy_api_v2_auth_CertificateValidationContext* value) { + UPB_WRITE_ONEOF(msg, struct envoy_api_v2_auth_CertificateValidationContext*, UPB_SIZE(16, 32), value, UPB_SIZE(20, 40), 3); +} +UPB_INLINE struct envoy_api_v2_auth_CertificateValidationContext* envoy_api_v2_auth_CommonTlsContext_mutable_validation_context(envoy_api_v2_auth_CommonTlsContext *msg, upb_arena *arena) { + struct envoy_api_v2_auth_CertificateValidationContext* sub = (struct envoy_api_v2_auth_CertificateValidationContext*)envoy_api_v2_auth_CommonTlsContext_validation_context(msg); + if (sub == NULL) { + sub = (struct envoy_api_v2_auth_CertificateValidationContext*)upb_msg_new(&envoy_api_v2_auth_CertificateValidationContext_msginit, arena); + if (!sub) return NULL; + envoy_api_v2_auth_CommonTlsContext_set_validation_context(msg, sub); + } + return sub; +} +UPB_INLINE upb_strview* envoy_api_v2_auth_CommonTlsContext_mutable_alpn_protocols(envoy_api_v2_auth_CommonTlsContext *msg, size_t *len) { + return (upb_strview*)_upb_array_mutable_accessor(msg, UPB_SIZE(8, 16), len); +} +UPB_INLINE upb_strview* envoy_api_v2_auth_CommonTlsContext_resize_alpn_protocols(envoy_api_v2_auth_CommonTlsContext *msg, size_t len, upb_arena *arena) { + return (upb_strview*)_upb_array_resize_accessor(msg, UPB_SIZE(8, 16), len, UPB_SIZE(8, 16), UPB_TYPE_STRING, arena); +} +UPB_INLINE bool envoy_api_v2_auth_CommonTlsContext_add_alpn_protocols(envoy_api_v2_auth_CommonTlsContext *msg, upb_strview val, upb_arena *arena) { + return _upb_array_append_accessor( + msg, UPB_SIZE(8, 16), UPB_SIZE(8, 16), UPB_TYPE_STRING, &val, arena); +} +UPB_INLINE struct envoy_api_v2_auth_SdsSecretConfig** envoy_api_v2_auth_CommonTlsContext_mutable_tls_certificate_sds_secret_configs(envoy_api_v2_auth_CommonTlsContext *msg, size_t *len) { + return (struct envoy_api_v2_auth_SdsSecretConfig**)_upb_array_mutable_accessor(msg, UPB_SIZE(12, 24), len); +} +UPB_INLINE struct envoy_api_v2_auth_SdsSecretConfig** envoy_api_v2_auth_CommonTlsContext_resize_tls_certificate_sds_secret_configs(envoy_api_v2_auth_CommonTlsContext *msg, size_t len, upb_arena *arena) { + return (struct envoy_api_v2_auth_SdsSecretConfig**)_upb_array_resize_accessor(msg, UPB_SIZE(12, 24), len, UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, arena); +} +UPB_INLINE struct envoy_api_v2_auth_SdsSecretConfig* envoy_api_v2_auth_CommonTlsContext_add_tls_certificate_sds_secret_configs(envoy_api_v2_auth_CommonTlsContext *msg, upb_arena *arena) { + struct envoy_api_v2_auth_SdsSecretConfig* sub = (struct envoy_api_v2_auth_SdsSecretConfig*)upb_msg_new(&envoy_api_v2_auth_SdsSecretConfig_msginit, arena); + bool ok = _upb_array_append_accessor( + msg, UPB_SIZE(12, 24), UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, &sub, arena); + if (!ok) return NULL; + return sub; +} +UPB_INLINE void envoy_api_v2_auth_CommonTlsContext_set_validation_context_sds_secret_config(envoy_api_v2_auth_CommonTlsContext *msg, struct envoy_api_v2_auth_SdsSecretConfig* value) { + UPB_WRITE_ONEOF(msg, struct envoy_api_v2_auth_SdsSecretConfig*, UPB_SIZE(16, 32), value, UPB_SIZE(20, 40), 7); +} +UPB_INLINE struct envoy_api_v2_auth_SdsSecretConfig* envoy_api_v2_auth_CommonTlsContext_mutable_validation_context_sds_secret_config(envoy_api_v2_auth_CommonTlsContext *msg, upb_arena *arena) { + struct envoy_api_v2_auth_SdsSecretConfig* sub = (struct envoy_api_v2_auth_SdsSecretConfig*)envoy_api_v2_auth_CommonTlsContext_validation_context_sds_secret_config(msg); + if (sub == NULL) { + sub = (struct envoy_api_v2_auth_SdsSecretConfig*)upb_msg_new(&envoy_api_v2_auth_SdsSecretConfig_msginit, arena); + if (!sub) return NULL; + envoy_api_v2_auth_CommonTlsContext_set_validation_context_sds_secret_config(msg, sub); + } + return sub; +} +UPB_INLINE void envoy_api_v2_auth_CommonTlsContext_set_combined_validation_context(envoy_api_v2_auth_CommonTlsContext *msg, envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext* value) { + UPB_WRITE_ONEOF(msg, envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext*, UPB_SIZE(16, 32), value, UPB_SIZE(20, 40), 8); +} +UPB_INLINE struct envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext* envoy_api_v2_auth_CommonTlsContext_mutable_combined_validation_context(envoy_api_v2_auth_CommonTlsContext *msg, upb_arena *arena) { + struct envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext* sub = (struct envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext*)envoy_api_v2_auth_CommonTlsContext_combined_validation_context(msg); + if (sub == NULL) { + sub = (struct envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext*)upb_msg_new(&envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext_msginit, arena); + if (!sub) return NULL; + envoy_api_v2_auth_CommonTlsContext_set_combined_validation_context(msg, sub); + } + return sub; +} + +/* envoy.api.v2.auth.CommonTlsContext.CombinedCertificateValidationContext */ + +UPB_INLINE envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext *envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext_new(upb_arena *arena) { + return (envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext *)upb_msg_new(&envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext_msginit, arena); +} +UPB_INLINE envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext *envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext_parse(const char *buf, size_t size, + upb_arena *arena) { + envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext *ret = envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext_new(arena); + return (ret && upb_decode(buf, size, ret, &envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext_msginit, arena)) ? ret : NULL; +} +UPB_INLINE char *envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext_serialize(const envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext *msg, upb_arena *arena, size_t *len) { + return upb_encode(msg, &envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext_msginit, arena, len); +} + +UPB_INLINE const struct envoy_api_v2_auth_CertificateValidationContext* envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext_default_validation_context(const envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext *msg) { return UPB_FIELD_AT(msg, const struct envoy_api_v2_auth_CertificateValidationContext*, UPB_SIZE(0, 0)); } +UPB_INLINE const struct envoy_api_v2_auth_SdsSecretConfig* envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext_validation_context_sds_secret_config(const envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext *msg) { return UPB_FIELD_AT(msg, const struct envoy_api_v2_auth_SdsSecretConfig*, UPB_SIZE(4, 8)); } + +UPB_INLINE void envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext_set_default_validation_context(envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext *msg, struct envoy_api_v2_auth_CertificateValidationContext* value) { + UPB_FIELD_AT(msg, struct envoy_api_v2_auth_CertificateValidationContext*, UPB_SIZE(0, 0)) = value; +} +UPB_INLINE struct envoy_api_v2_auth_CertificateValidationContext* envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext_mutable_default_validation_context(envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext *msg, upb_arena *arena) { + struct envoy_api_v2_auth_CertificateValidationContext* sub = (struct envoy_api_v2_auth_CertificateValidationContext*)envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext_default_validation_context(msg); + if (sub == NULL) { + sub = (struct envoy_api_v2_auth_CertificateValidationContext*)upb_msg_new(&envoy_api_v2_auth_CertificateValidationContext_msginit, arena); + if (!sub) return NULL; + envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext_set_default_validation_context(msg, sub); + } + return sub; +} +UPB_INLINE void envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext_set_validation_context_sds_secret_config(envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext *msg, struct envoy_api_v2_auth_SdsSecretConfig* value) { + UPB_FIELD_AT(msg, struct envoy_api_v2_auth_SdsSecretConfig*, UPB_SIZE(4, 8)) = value; +} +UPB_INLINE struct envoy_api_v2_auth_SdsSecretConfig* envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext_mutable_validation_context_sds_secret_config(envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext *msg, upb_arena *arena) { + struct envoy_api_v2_auth_SdsSecretConfig* sub = (struct envoy_api_v2_auth_SdsSecretConfig*)envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext_validation_context_sds_secret_config(msg); + if (sub == NULL) { + sub = (struct envoy_api_v2_auth_SdsSecretConfig*)upb_msg_new(&envoy_api_v2_auth_SdsSecretConfig_msginit, arena); + if (!sub) return NULL; + envoy_api_v2_auth_CommonTlsContext_CombinedCertificateValidationContext_set_validation_context_sds_secret_config(msg, sub); + } + return sub; +} + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#include "upb/port_undef.inc" + +#endif /* ENVOY_API_V2_AUTH_TLS_PROTO_UPB_H_ */ diff --git a/src/core/ext/upb-generated/envoy/api/v2/cds.upb.c b/src/core/ext/upb-generated/envoy/api/v2/cds.upb.c index e420bb443a9..3f20aa32631 100644 --- a/src/core/ext/upb-generated/envoy/api/v2/cds.upb.c +++ b/src/core/ext/upb-generated/envoy/api/v2/cds.upb.c @@ -13,6 +13,7 @@ #include "google/api/annotations.upb.h" #include "envoy/annotations/resource.upb.h" #include "udpa/annotations/migrate.upb.h" +#include "udpa/annotations/status.upb.h" #include "envoy/api/v2/cluster.upb.h" #include "upb/port_def.inc" diff --git a/src/core/ext/upb-generated/envoy/api/v2/cluster.upb.c b/src/core/ext/upb-generated/envoy/api/v2/cluster.upb.c index ca3b3511042..80607bbf75a 100644 --- a/src/core/ext/upb-generated/envoy/api/v2/cluster.upb.c +++ b/src/core/ext/upb-generated/envoy/api/v2/cluster.upb.c @@ -9,7 +9,7 @@ #include #include "upb/msg.h" #include "envoy/api/v2/cluster.upb.h" -#include "envoy/api/v2/auth/cert.upb.h" +#include "envoy/api/v2/auth/tls.upb.h" #include "envoy/api/v2/cluster/circuit_breaker.upb.h" #include "envoy/api/v2/cluster/filter.upb.h" #include "envoy/api/v2/cluster/outlier_detection.upb.h" @@ -26,6 +26,7 @@ #include "google/protobuf/wrappers.upb.h" #include "envoy/annotations/deprecation.upb.h" #include "udpa/annotations/migrate.upb.h" +#include "udpa/annotations/status.upb.h" #include "validate/validate.upb.h" #include "upb/port_def.inc" @@ -237,26 +238,28 @@ const upb_msglayout envoy_api_v2_Cluster_OriginalDstLbConfig_msginit = { UPB_SIZE(1, 1), 1, false, }; -static const upb_msglayout *const envoy_api_v2_Cluster_CommonLbConfig_submsgs[4] = { +static const upb_msglayout *const envoy_api_v2_Cluster_CommonLbConfig_submsgs[5] = { + &envoy_api_v2_Cluster_CommonLbConfig_ConsistentHashingLbConfig_msginit, &envoy_api_v2_Cluster_CommonLbConfig_LocalityWeightedLbConfig_msginit, &envoy_api_v2_Cluster_CommonLbConfig_ZoneAwareLbConfig_msginit, &envoy_type_Percent_msginit, &google_protobuf_Duration_msginit, }; -static const upb_msglayout_field envoy_api_v2_Cluster_CommonLbConfig__fields[6] = { - {1, UPB_SIZE(4, 8), 0, 2, 11, 1}, - {2, UPB_SIZE(12, 24), UPB_SIZE(-17, -33), 1, 11, 1}, - {3, UPB_SIZE(12, 24), UPB_SIZE(-17, -33), 0, 11, 1}, - {4, UPB_SIZE(8, 16), 0, 3, 11, 1}, +static const upb_msglayout_field envoy_api_v2_Cluster_CommonLbConfig__fields[7] = { + {1, UPB_SIZE(4, 8), 0, 3, 11, 1}, + {2, UPB_SIZE(16, 32), UPB_SIZE(-21, -41), 2, 11, 1}, + {3, UPB_SIZE(16, 32), UPB_SIZE(-21, -41), 1, 11, 1}, + {4, UPB_SIZE(8, 16), 0, 4, 11, 1}, {5, UPB_SIZE(0, 0), 0, 0, 8, 1}, {6, UPB_SIZE(1, 1), 0, 0, 8, 1}, + {7, UPB_SIZE(12, 24), 0, 0, 11, 1}, }; const upb_msglayout envoy_api_v2_Cluster_CommonLbConfig_msginit = { &envoy_api_v2_Cluster_CommonLbConfig_submsgs[0], &envoy_api_v2_Cluster_CommonLbConfig__fields[0], - UPB_SIZE(20, 40), 6, false, + UPB_SIZE(24, 48), 7, false, }; static const upb_msglayout *const envoy_api_v2_Cluster_CommonLbConfig_ZoneAwareLbConfig_submsgs[2] = { @@ -282,6 +285,16 @@ const upb_msglayout envoy_api_v2_Cluster_CommonLbConfig_LocalityWeightedLbConfig UPB_SIZE(0, 0), 0, false, }; +static const upb_msglayout_field envoy_api_v2_Cluster_CommonLbConfig_ConsistentHashingLbConfig__fields[1] = { + {1, UPB_SIZE(0, 0), 0, 0, 8, 1}, +}; + +const upb_msglayout envoy_api_v2_Cluster_CommonLbConfig_ConsistentHashingLbConfig_msginit = { + NULL, + &envoy_api_v2_Cluster_CommonLbConfig_ConsistentHashingLbConfig__fields[0], + UPB_SIZE(1, 1), 1, false, +}; + static const upb_msglayout *const envoy_api_v2_Cluster_RefreshRate_submsgs[2] = { &google_protobuf_Duration_msginit, }; diff --git a/src/core/ext/upb-generated/envoy/api/v2/cluster.upb.h b/src/core/ext/upb-generated/envoy/api/v2/cluster.upb.h index 28cce1bb2f6..fe825c6047b 100644 --- a/src/core/ext/upb-generated/envoy/api/v2/cluster.upb.h +++ b/src/core/ext/upb-generated/envoy/api/v2/cluster.upb.h @@ -32,6 +32,7 @@ struct envoy_api_v2_Cluster_OriginalDstLbConfig; struct envoy_api_v2_Cluster_CommonLbConfig; struct envoy_api_v2_Cluster_CommonLbConfig_ZoneAwareLbConfig; struct envoy_api_v2_Cluster_CommonLbConfig_LocalityWeightedLbConfig; +struct envoy_api_v2_Cluster_CommonLbConfig_ConsistentHashingLbConfig; struct envoy_api_v2_Cluster_RefreshRate; struct envoy_api_v2_Cluster_ExtensionProtocolOptionsEntry; struct envoy_api_v2_Cluster_TypedExtensionProtocolOptionsEntry; @@ -51,6 +52,7 @@ typedef struct envoy_api_v2_Cluster_OriginalDstLbConfig envoy_api_v2_Cluster_Ori typedef struct envoy_api_v2_Cluster_CommonLbConfig envoy_api_v2_Cluster_CommonLbConfig; typedef struct envoy_api_v2_Cluster_CommonLbConfig_ZoneAwareLbConfig envoy_api_v2_Cluster_CommonLbConfig_ZoneAwareLbConfig; typedef struct envoy_api_v2_Cluster_CommonLbConfig_LocalityWeightedLbConfig envoy_api_v2_Cluster_CommonLbConfig_LocalityWeightedLbConfig; +typedef struct envoy_api_v2_Cluster_CommonLbConfig_ConsistentHashingLbConfig envoy_api_v2_Cluster_CommonLbConfig_ConsistentHashingLbConfig; typedef struct envoy_api_v2_Cluster_RefreshRate envoy_api_v2_Cluster_RefreshRate; typedef struct envoy_api_v2_Cluster_ExtensionProtocolOptionsEntry envoy_api_v2_Cluster_ExtensionProtocolOptionsEntry; typedef struct envoy_api_v2_Cluster_TypedExtensionProtocolOptionsEntry envoy_api_v2_Cluster_TypedExtensionProtocolOptionsEntry; @@ -70,6 +72,7 @@ extern const upb_msglayout envoy_api_v2_Cluster_OriginalDstLbConfig_msginit; extern const upb_msglayout envoy_api_v2_Cluster_CommonLbConfig_msginit; extern const upb_msglayout envoy_api_v2_Cluster_CommonLbConfig_ZoneAwareLbConfig_msginit; extern const upb_msglayout envoy_api_v2_Cluster_CommonLbConfig_LocalityWeightedLbConfig_msginit; +extern const upb_msglayout envoy_api_v2_Cluster_CommonLbConfig_ConsistentHashingLbConfig_msginit; extern const upb_msglayout envoy_api_v2_Cluster_RefreshRate_msginit; extern const upb_msglayout envoy_api_v2_Cluster_ExtensionProtocolOptionsEntry_msginit; extern const upb_msglayout envoy_api_v2_Cluster_TypedExtensionProtocolOptionsEntry_msginit; @@ -1032,16 +1035,17 @@ typedef enum { envoy_api_v2_Cluster_CommonLbConfig_locality_config_specifier_locality_weighted_lb_config = 3, envoy_api_v2_Cluster_CommonLbConfig_locality_config_specifier_NOT_SET = 0 } envoy_api_v2_Cluster_CommonLbConfig_locality_config_specifier_oneofcases; -UPB_INLINE envoy_api_v2_Cluster_CommonLbConfig_locality_config_specifier_oneofcases envoy_api_v2_Cluster_CommonLbConfig_locality_config_specifier_case(const envoy_api_v2_Cluster_CommonLbConfig* msg) { return (envoy_api_v2_Cluster_CommonLbConfig_locality_config_specifier_oneofcases)UPB_FIELD_AT(msg, int32_t, UPB_SIZE(16, 32)); } +UPB_INLINE envoy_api_v2_Cluster_CommonLbConfig_locality_config_specifier_oneofcases envoy_api_v2_Cluster_CommonLbConfig_locality_config_specifier_case(const envoy_api_v2_Cluster_CommonLbConfig* msg) { return (envoy_api_v2_Cluster_CommonLbConfig_locality_config_specifier_oneofcases)UPB_FIELD_AT(msg, int32_t, UPB_SIZE(20, 40)); } UPB_INLINE const struct envoy_type_Percent* envoy_api_v2_Cluster_CommonLbConfig_healthy_panic_threshold(const envoy_api_v2_Cluster_CommonLbConfig *msg) { return UPB_FIELD_AT(msg, const struct envoy_type_Percent*, UPB_SIZE(4, 8)); } -UPB_INLINE bool envoy_api_v2_Cluster_CommonLbConfig_has_zone_aware_lb_config(const envoy_api_v2_Cluster_CommonLbConfig *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(16, 32), 2); } -UPB_INLINE const envoy_api_v2_Cluster_CommonLbConfig_ZoneAwareLbConfig* envoy_api_v2_Cluster_CommonLbConfig_zone_aware_lb_config(const envoy_api_v2_Cluster_CommonLbConfig *msg) { return UPB_READ_ONEOF(msg, const envoy_api_v2_Cluster_CommonLbConfig_ZoneAwareLbConfig*, UPB_SIZE(12, 24), UPB_SIZE(16, 32), 2, NULL); } -UPB_INLINE bool envoy_api_v2_Cluster_CommonLbConfig_has_locality_weighted_lb_config(const envoy_api_v2_Cluster_CommonLbConfig *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(16, 32), 3); } -UPB_INLINE const envoy_api_v2_Cluster_CommonLbConfig_LocalityWeightedLbConfig* envoy_api_v2_Cluster_CommonLbConfig_locality_weighted_lb_config(const envoy_api_v2_Cluster_CommonLbConfig *msg) { return UPB_READ_ONEOF(msg, const envoy_api_v2_Cluster_CommonLbConfig_LocalityWeightedLbConfig*, UPB_SIZE(12, 24), UPB_SIZE(16, 32), 3, NULL); } +UPB_INLINE bool envoy_api_v2_Cluster_CommonLbConfig_has_zone_aware_lb_config(const envoy_api_v2_Cluster_CommonLbConfig *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(20, 40), 2); } +UPB_INLINE const envoy_api_v2_Cluster_CommonLbConfig_ZoneAwareLbConfig* envoy_api_v2_Cluster_CommonLbConfig_zone_aware_lb_config(const envoy_api_v2_Cluster_CommonLbConfig *msg) { return UPB_READ_ONEOF(msg, const envoy_api_v2_Cluster_CommonLbConfig_ZoneAwareLbConfig*, UPB_SIZE(16, 32), UPB_SIZE(20, 40), 2, NULL); } +UPB_INLINE bool envoy_api_v2_Cluster_CommonLbConfig_has_locality_weighted_lb_config(const envoy_api_v2_Cluster_CommonLbConfig *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(20, 40), 3); } +UPB_INLINE const envoy_api_v2_Cluster_CommonLbConfig_LocalityWeightedLbConfig* envoy_api_v2_Cluster_CommonLbConfig_locality_weighted_lb_config(const envoy_api_v2_Cluster_CommonLbConfig *msg) { return UPB_READ_ONEOF(msg, const envoy_api_v2_Cluster_CommonLbConfig_LocalityWeightedLbConfig*, UPB_SIZE(16, 32), UPB_SIZE(20, 40), 3, NULL); } UPB_INLINE const struct google_protobuf_Duration* envoy_api_v2_Cluster_CommonLbConfig_update_merge_window(const envoy_api_v2_Cluster_CommonLbConfig *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_Duration*, UPB_SIZE(8, 16)); } UPB_INLINE bool envoy_api_v2_Cluster_CommonLbConfig_ignore_new_hosts_until_first_hc(const envoy_api_v2_Cluster_CommonLbConfig *msg) { return UPB_FIELD_AT(msg, bool, UPB_SIZE(0, 0)); } UPB_INLINE bool envoy_api_v2_Cluster_CommonLbConfig_close_connections_on_host_set_change(const envoy_api_v2_Cluster_CommonLbConfig *msg) { return UPB_FIELD_AT(msg, bool, UPB_SIZE(1, 1)); } +UPB_INLINE const envoy_api_v2_Cluster_CommonLbConfig_ConsistentHashingLbConfig* envoy_api_v2_Cluster_CommonLbConfig_consistent_hashing_lb_config(const envoy_api_v2_Cluster_CommonLbConfig *msg) { return UPB_FIELD_AT(msg, const envoy_api_v2_Cluster_CommonLbConfig_ConsistentHashingLbConfig*, UPB_SIZE(12, 24)); } UPB_INLINE void envoy_api_v2_Cluster_CommonLbConfig_set_healthy_panic_threshold(envoy_api_v2_Cluster_CommonLbConfig *msg, struct envoy_type_Percent* value) { UPB_FIELD_AT(msg, struct envoy_type_Percent*, UPB_SIZE(4, 8)) = value; @@ -1056,7 +1060,7 @@ UPB_INLINE struct envoy_type_Percent* envoy_api_v2_Cluster_CommonLbConfig_mutabl return sub; } UPB_INLINE void envoy_api_v2_Cluster_CommonLbConfig_set_zone_aware_lb_config(envoy_api_v2_Cluster_CommonLbConfig *msg, envoy_api_v2_Cluster_CommonLbConfig_ZoneAwareLbConfig* value) { - UPB_WRITE_ONEOF(msg, envoy_api_v2_Cluster_CommonLbConfig_ZoneAwareLbConfig*, UPB_SIZE(12, 24), value, UPB_SIZE(16, 32), 2); + UPB_WRITE_ONEOF(msg, envoy_api_v2_Cluster_CommonLbConfig_ZoneAwareLbConfig*, UPB_SIZE(16, 32), value, UPB_SIZE(20, 40), 2); } UPB_INLINE struct envoy_api_v2_Cluster_CommonLbConfig_ZoneAwareLbConfig* envoy_api_v2_Cluster_CommonLbConfig_mutable_zone_aware_lb_config(envoy_api_v2_Cluster_CommonLbConfig *msg, upb_arena *arena) { struct envoy_api_v2_Cluster_CommonLbConfig_ZoneAwareLbConfig* sub = (struct envoy_api_v2_Cluster_CommonLbConfig_ZoneAwareLbConfig*)envoy_api_v2_Cluster_CommonLbConfig_zone_aware_lb_config(msg); @@ -1068,7 +1072,7 @@ UPB_INLINE struct envoy_api_v2_Cluster_CommonLbConfig_ZoneAwareLbConfig* envoy_a return sub; } UPB_INLINE void envoy_api_v2_Cluster_CommonLbConfig_set_locality_weighted_lb_config(envoy_api_v2_Cluster_CommonLbConfig *msg, envoy_api_v2_Cluster_CommonLbConfig_LocalityWeightedLbConfig* value) { - UPB_WRITE_ONEOF(msg, envoy_api_v2_Cluster_CommonLbConfig_LocalityWeightedLbConfig*, UPB_SIZE(12, 24), value, UPB_SIZE(16, 32), 3); + UPB_WRITE_ONEOF(msg, envoy_api_v2_Cluster_CommonLbConfig_LocalityWeightedLbConfig*, UPB_SIZE(16, 32), value, UPB_SIZE(20, 40), 3); } UPB_INLINE struct envoy_api_v2_Cluster_CommonLbConfig_LocalityWeightedLbConfig* envoy_api_v2_Cluster_CommonLbConfig_mutable_locality_weighted_lb_config(envoy_api_v2_Cluster_CommonLbConfig *msg, upb_arena *arena) { struct envoy_api_v2_Cluster_CommonLbConfig_LocalityWeightedLbConfig* sub = (struct envoy_api_v2_Cluster_CommonLbConfig_LocalityWeightedLbConfig*)envoy_api_v2_Cluster_CommonLbConfig_locality_weighted_lb_config(msg); @@ -1097,6 +1101,18 @@ UPB_INLINE void envoy_api_v2_Cluster_CommonLbConfig_set_ignore_new_hosts_until_f UPB_INLINE void envoy_api_v2_Cluster_CommonLbConfig_set_close_connections_on_host_set_change(envoy_api_v2_Cluster_CommonLbConfig *msg, bool value) { UPB_FIELD_AT(msg, bool, UPB_SIZE(1, 1)) = value; } +UPB_INLINE void envoy_api_v2_Cluster_CommonLbConfig_set_consistent_hashing_lb_config(envoy_api_v2_Cluster_CommonLbConfig *msg, envoy_api_v2_Cluster_CommonLbConfig_ConsistentHashingLbConfig* value) { + UPB_FIELD_AT(msg, envoy_api_v2_Cluster_CommonLbConfig_ConsistentHashingLbConfig*, UPB_SIZE(12, 24)) = value; +} +UPB_INLINE struct envoy_api_v2_Cluster_CommonLbConfig_ConsistentHashingLbConfig* envoy_api_v2_Cluster_CommonLbConfig_mutable_consistent_hashing_lb_config(envoy_api_v2_Cluster_CommonLbConfig *msg, upb_arena *arena) { + struct envoy_api_v2_Cluster_CommonLbConfig_ConsistentHashingLbConfig* sub = (struct envoy_api_v2_Cluster_CommonLbConfig_ConsistentHashingLbConfig*)envoy_api_v2_Cluster_CommonLbConfig_consistent_hashing_lb_config(msg); + if (sub == NULL) { + sub = (struct envoy_api_v2_Cluster_CommonLbConfig_ConsistentHashingLbConfig*)upb_msg_new(&envoy_api_v2_Cluster_CommonLbConfig_ConsistentHashingLbConfig_msginit, arena); + if (!sub) return NULL; + envoy_api_v2_Cluster_CommonLbConfig_set_consistent_hashing_lb_config(msg, sub); + } + return sub; +} /* envoy.api.v2.Cluster.CommonLbConfig.ZoneAwareLbConfig */ @@ -1160,6 +1176,26 @@ UPB_INLINE char *envoy_api_v2_Cluster_CommonLbConfig_LocalityWeightedLbConfig_se +/* envoy.api.v2.Cluster.CommonLbConfig.ConsistentHashingLbConfig */ + +UPB_INLINE envoy_api_v2_Cluster_CommonLbConfig_ConsistentHashingLbConfig *envoy_api_v2_Cluster_CommonLbConfig_ConsistentHashingLbConfig_new(upb_arena *arena) { + return (envoy_api_v2_Cluster_CommonLbConfig_ConsistentHashingLbConfig *)upb_msg_new(&envoy_api_v2_Cluster_CommonLbConfig_ConsistentHashingLbConfig_msginit, arena); +} +UPB_INLINE envoy_api_v2_Cluster_CommonLbConfig_ConsistentHashingLbConfig *envoy_api_v2_Cluster_CommonLbConfig_ConsistentHashingLbConfig_parse(const char *buf, size_t size, + upb_arena *arena) { + envoy_api_v2_Cluster_CommonLbConfig_ConsistentHashingLbConfig *ret = envoy_api_v2_Cluster_CommonLbConfig_ConsistentHashingLbConfig_new(arena); + return (ret && upb_decode(buf, size, ret, &envoy_api_v2_Cluster_CommonLbConfig_ConsistentHashingLbConfig_msginit, arena)) ? ret : NULL; +} +UPB_INLINE char *envoy_api_v2_Cluster_CommonLbConfig_ConsistentHashingLbConfig_serialize(const envoy_api_v2_Cluster_CommonLbConfig_ConsistentHashingLbConfig *msg, upb_arena *arena, size_t *len) { + return upb_encode(msg, &envoy_api_v2_Cluster_CommonLbConfig_ConsistentHashingLbConfig_msginit, arena, len); +} + +UPB_INLINE bool envoy_api_v2_Cluster_CommonLbConfig_ConsistentHashingLbConfig_use_hostname_for_hashing(const envoy_api_v2_Cluster_CommonLbConfig_ConsistentHashingLbConfig *msg) { return UPB_FIELD_AT(msg, bool, UPB_SIZE(0, 0)); } + +UPB_INLINE void envoy_api_v2_Cluster_CommonLbConfig_ConsistentHashingLbConfig_set_use_hostname_for_hashing(envoy_api_v2_Cluster_CommonLbConfig_ConsistentHashingLbConfig *msg, bool value) { + UPB_FIELD_AT(msg, bool, UPB_SIZE(0, 0)) = value; +} + /* envoy.api.v2.Cluster.RefreshRate */ UPB_INLINE envoy_api_v2_Cluster_RefreshRate *envoy_api_v2_Cluster_RefreshRate_new(upb_arena *arena) { diff --git a/src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c b/src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c index 02569a91bfa..85714e2a1b4 100644 --- a/src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c +++ b/src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c @@ -13,6 +13,7 @@ #include "envoy/type/percent.upb.h" #include "google/protobuf/wrappers.upb.h" #include "udpa/annotations/migrate.upb.h" +#include "udpa/annotations/status.upb.h" #include "validate/validate.upb.h" #include "upb/port_def.inc" diff --git a/src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.c b/src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.c index 1cfdbd7e7a9..7bfad137c9f 100644 --- a/src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.c +++ b/src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.c @@ -11,6 +11,7 @@ #include "envoy/api/v2/cluster/filter.upb.h" #include "google/protobuf/any.upb.h" #include "udpa/annotations/migrate.upb.h" +#include "udpa/annotations/status.upb.h" #include "validate/validate.upb.h" #include "upb/port_def.inc" diff --git a/src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c b/src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c index d62bf5fd373..b6d6d180834 100644 --- a/src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c +++ b/src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c @@ -12,6 +12,7 @@ #include "google/protobuf/duration.upb.h" #include "google/protobuf/wrappers.upb.h" #include "udpa/annotations/migrate.upb.h" +#include "udpa/annotations/status.upb.h" #include "validate/validate.upb.h" #include "upb/port_def.inc" diff --git a/src/core/ext/upb-generated/envoy/api/v2/core/address.upb.c b/src/core/ext/upb-generated/envoy/api/v2/core/address.upb.c index a5b58bf1d7c..7e9fae2e5b8 100644 --- a/src/core/ext/upb-generated/envoy/api/v2/core/address.upb.c +++ b/src/core/ext/upb-generated/envoy/api/v2/core/address.upb.c @@ -9,9 +9,10 @@ #include #include "upb/msg.h" #include "envoy/api/v2/core/address.upb.h" -#include "envoy/api/v2/core/base.upb.h" +#include "envoy/api/v2/core/socket_option.upb.h" #include "google/protobuf/wrappers.upb.h" #include "udpa/annotations/migrate.upb.h" +#include "udpa/annotations/status.upb.h" #include "validate/validate.upb.h" #include "upb/port_def.inc" diff --git a/src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.c b/src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.c new file mode 100644 index 00000000000..14bb789c372 --- /dev/null +++ b/src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.c @@ -0,0 +1,35 @@ +/* This file was generated by upbc (the upb compiler) from the input + * file: + * + * envoy/api/v2/core/backoff.proto + * + * Do not edit -- your changes will be discarded when the file is + * regenerated. */ + +#include +#include "upb/msg.h" +#include "envoy/api/v2/core/backoff.upb.h" +#include "google/protobuf/duration.upb.h" +#include "udpa/annotations/migrate.upb.h" +#include "udpa/annotations/status.upb.h" +#include "validate/validate.upb.h" + +#include "upb/port_def.inc" + +static const upb_msglayout *const envoy_api_v2_core_BackoffStrategy_submsgs[2] = { + &google_protobuf_Duration_msginit, +}; + +static const upb_msglayout_field envoy_api_v2_core_BackoffStrategy__fields[2] = { + {1, UPB_SIZE(0, 0), 0, 0, 11, 1}, + {2, UPB_SIZE(4, 8), 0, 0, 11, 1}, +}; + +const upb_msglayout envoy_api_v2_core_BackoffStrategy_msginit = { + &envoy_api_v2_core_BackoffStrategy_submsgs[0], + &envoy_api_v2_core_BackoffStrategy__fields[0], + UPB_SIZE(8, 16), 2, false, +}; + +#include "upb/port_undef.inc" + diff --git a/src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.h b/src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.h new file mode 100644 index 00000000000..853f03f0e81 --- /dev/null +++ b/src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.h @@ -0,0 +1,78 @@ +/* This file was generated by upbc (the upb compiler) from the input + * file: + * + * envoy/api/v2/core/backoff.proto + * + * Do not edit -- your changes will be discarded when the file is + * regenerated. */ + +#ifndef ENVOY_API_V2_CORE_BACKOFF_PROTO_UPB_H_ +#define ENVOY_API_V2_CORE_BACKOFF_PROTO_UPB_H_ + +#include "upb/generated_util.h" +#include "upb/msg.h" +#include "upb/decode.h" +#include "upb/encode.h" + +#include "upb/port_def.inc" + +#ifdef __cplusplus +extern "C" { +#endif + +struct envoy_api_v2_core_BackoffStrategy; +typedef struct envoy_api_v2_core_BackoffStrategy envoy_api_v2_core_BackoffStrategy; +extern const upb_msglayout envoy_api_v2_core_BackoffStrategy_msginit; +struct google_protobuf_Duration; +extern const upb_msglayout google_protobuf_Duration_msginit; + + +/* envoy.api.v2.core.BackoffStrategy */ + +UPB_INLINE envoy_api_v2_core_BackoffStrategy *envoy_api_v2_core_BackoffStrategy_new(upb_arena *arena) { + return (envoy_api_v2_core_BackoffStrategy *)upb_msg_new(&envoy_api_v2_core_BackoffStrategy_msginit, arena); +} +UPB_INLINE envoy_api_v2_core_BackoffStrategy *envoy_api_v2_core_BackoffStrategy_parse(const char *buf, size_t size, + upb_arena *arena) { + envoy_api_v2_core_BackoffStrategy *ret = envoy_api_v2_core_BackoffStrategy_new(arena); + return (ret && upb_decode(buf, size, ret, &envoy_api_v2_core_BackoffStrategy_msginit, arena)) ? ret : NULL; +} +UPB_INLINE char *envoy_api_v2_core_BackoffStrategy_serialize(const envoy_api_v2_core_BackoffStrategy *msg, upb_arena *arena, size_t *len) { + return upb_encode(msg, &envoy_api_v2_core_BackoffStrategy_msginit, arena, len); +} + +UPB_INLINE const struct google_protobuf_Duration* envoy_api_v2_core_BackoffStrategy_base_interval(const envoy_api_v2_core_BackoffStrategy *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_Duration*, UPB_SIZE(0, 0)); } +UPB_INLINE const struct google_protobuf_Duration* envoy_api_v2_core_BackoffStrategy_max_interval(const envoy_api_v2_core_BackoffStrategy *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_Duration*, UPB_SIZE(4, 8)); } + +UPB_INLINE void envoy_api_v2_core_BackoffStrategy_set_base_interval(envoy_api_v2_core_BackoffStrategy *msg, struct google_protobuf_Duration* value) { + UPB_FIELD_AT(msg, struct google_protobuf_Duration*, UPB_SIZE(0, 0)) = value; +} +UPB_INLINE struct google_protobuf_Duration* envoy_api_v2_core_BackoffStrategy_mutable_base_interval(envoy_api_v2_core_BackoffStrategy *msg, upb_arena *arena) { + struct google_protobuf_Duration* sub = (struct google_protobuf_Duration*)envoy_api_v2_core_BackoffStrategy_base_interval(msg); + if (sub == NULL) { + sub = (struct google_protobuf_Duration*)upb_msg_new(&google_protobuf_Duration_msginit, arena); + if (!sub) return NULL; + envoy_api_v2_core_BackoffStrategy_set_base_interval(msg, sub); + } + return sub; +} +UPB_INLINE void envoy_api_v2_core_BackoffStrategy_set_max_interval(envoy_api_v2_core_BackoffStrategy *msg, struct google_protobuf_Duration* value) { + UPB_FIELD_AT(msg, struct google_protobuf_Duration*, UPB_SIZE(4, 8)) = value; +} +UPB_INLINE struct google_protobuf_Duration* envoy_api_v2_core_BackoffStrategy_mutable_max_interval(envoy_api_v2_core_BackoffStrategy *msg, upb_arena *arena) { + struct google_protobuf_Duration* sub = (struct google_protobuf_Duration*)envoy_api_v2_core_BackoffStrategy_max_interval(msg); + if (sub == NULL) { + sub = (struct google_protobuf_Duration*)upb_msg_new(&google_protobuf_Duration_msginit, arena); + if (!sub) return NULL; + envoy_api_v2_core_BackoffStrategy_set_max_interval(msg, sub); + } + return sub; +} + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#include "upb/port_undef.inc" + +#endif /* ENVOY_API_V2_CORE_BACKOFF_PROTO_UPB_H_ */ diff --git a/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c b/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c index f6e37a5b8a6..886deb35300 100644 --- a/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c +++ b/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c @@ -9,14 +9,19 @@ #include #include "upb/msg.h" #include "envoy/api/v2/core/base.upb.h" +#include "envoy/api/v2/core/address.upb.h" +#include "envoy/api/v2/core/backoff.upb.h" #include "envoy/api/v2/core/http_uri.upb.h" #include "envoy/type/percent.upb.h" #include "envoy/type/semantic_version.upb.h" #include "google/protobuf/any.upb.h" +#include "google/protobuf/duration.upb.h" #include "google/protobuf/struct.upb.h" #include "google/protobuf/wrappers.upb.h" #include "udpa/annotations/migrate.upb.h" +#include "udpa/annotations/status.upb.h" #include "validate/validate.upb.h" +#include "envoy/api/v2/core/socket_option.upb.h" #include "upb/port_def.inc" @@ -66,30 +71,32 @@ const upb_msglayout envoy_api_v2_core_Extension_msginit = { UPB_SIZE(32, 64), 5, false, }; -static const upb_msglayout *const envoy_api_v2_core_Node_submsgs[4] = { +static const upb_msglayout *const envoy_api_v2_core_Node_submsgs[5] = { + &envoy_api_v2_core_Address_msginit, &envoy_api_v2_core_BuildVersion_msginit, &envoy_api_v2_core_Extension_msginit, &envoy_api_v2_core_Locality_msginit, &google_protobuf_Struct_msginit, }; -static const upb_msglayout_field envoy_api_v2_core_Node__fields[10] = { +static const upb_msglayout_field envoy_api_v2_core_Node__fields[11] = { {1, UPB_SIZE(0, 0), 0, 0, 9, 1}, {2, UPB_SIZE(8, 16), 0, 0, 9, 1}, - {3, UPB_SIZE(32, 64), 0, 3, 11, 1}, - {4, UPB_SIZE(36, 72), 0, 2, 11, 1}, + {3, UPB_SIZE(32, 64), 0, 4, 11, 1}, + {4, UPB_SIZE(36, 72), 0, 3, 11, 1}, {5, UPB_SIZE(16, 32), 0, 0, 9, 1}, {6, UPB_SIZE(24, 48), 0, 0, 9, 1}, - {7, UPB_SIZE(48, 96), UPB_SIZE(-57, -113), 0, 9, 1}, - {8, UPB_SIZE(48, 96), UPB_SIZE(-57, -113), 0, 11, 1}, - {9, UPB_SIZE(40, 80), 0, 1, 11, 3}, + {7, UPB_SIZE(52, 104), UPB_SIZE(-61, -121), 0, 9, 1}, + {8, UPB_SIZE(52, 104), UPB_SIZE(-61, -121), 1, 11, 1}, + {9, UPB_SIZE(40, 80), 0, 2, 11, 3}, {10, UPB_SIZE(44, 88), 0, 0, 9, 3}, + {11, UPB_SIZE(48, 96), 0, 0, 11, 3}, }; const upb_msglayout envoy_api_v2_core_Node_msginit = { &envoy_api_v2_core_Node_submsgs[0], &envoy_api_v2_core_Node__fields[0], - UPB_SIZE(64, 128), 10, false, + UPB_SIZE(64, 128), 11, false, }; static const upb_msglayout *const envoy_api_v2_core_Metadata_submsgs[1] = { @@ -132,6 +139,17 @@ const upb_msglayout envoy_api_v2_core_RuntimeUInt32_msginit = { UPB_SIZE(16, 32), 2, false, }; +static const upb_msglayout_field envoy_api_v2_core_RuntimeDouble__fields[2] = { + {1, UPB_SIZE(0, 0), 0, 0, 1, 1}, + {2, UPB_SIZE(8, 8), 0, 0, 9, 1}, +}; + +const upb_msglayout envoy_api_v2_core_RuntimeDouble_msginit = { + NULL, + &envoy_api_v2_core_RuntimeDouble__fields[0], + UPB_SIZE(16, 32), 2, false, +}; + static const upb_msglayout *const envoy_api_v2_core_RuntimeFeatureFlag_submsgs[1] = { &google_protobuf_BoolValue_msginit, }; @@ -200,19 +218,37 @@ const upb_msglayout envoy_api_v2_core_DataSource_msginit = { UPB_SIZE(16, 32), 3, false, }; -static const upb_msglayout *const envoy_api_v2_core_RemoteDataSource_submsgs[1] = { +static const upb_msglayout *const envoy_api_v2_core_RetryPolicy_submsgs[2] = { + &envoy_api_v2_core_BackoffStrategy_msginit, + &google_protobuf_UInt32Value_msginit, +}; + +static const upb_msglayout_field envoy_api_v2_core_RetryPolicy__fields[2] = { + {1, UPB_SIZE(0, 0), 0, 0, 11, 1}, + {2, UPB_SIZE(4, 8), 0, 1, 11, 1}, +}; + +const upb_msglayout envoy_api_v2_core_RetryPolicy_msginit = { + &envoy_api_v2_core_RetryPolicy_submsgs[0], + &envoy_api_v2_core_RetryPolicy__fields[0], + UPB_SIZE(8, 16), 2, false, +}; + +static const upb_msglayout *const envoy_api_v2_core_RemoteDataSource_submsgs[2] = { &envoy_api_v2_core_HttpUri_msginit, + &envoy_api_v2_core_RetryPolicy_msginit, }; -static const upb_msglayout_field envoy_api_v2_core_RemoteDataSource__fields[2] = { +static const upb_msglayout_field envoy_api_v2_core_RemoteDataSource__fields[3] = { {1, UPB_SIZE(8, 16), 0, 0, 11, 1}, {2, UPB_SIZE(0, 0), 0, 0, 9, 1}, + {3, UPB_SIZE(12, 24), 0, 1, 11, 1}, }; const upb_msglayout envoy_api_v2_core_RemoteDataSource_msginit = { &envoy_api_v2_core_RemoteDataSource_submsgs[0], &envoy_api_v2_core_RemoteDataSource__fields[0], - UPB_SIZE(16, 32), 2, false, + UPB_SIZE(16, 32), 3, false, }; static const upb_msglayout *const envoy_api_v2_core_AsyncDataSource_submsgs[2] = { @@ -248,21 +284,6 @@ const upb_msglayout envoy_api_v2_core_TransportSocket_msginit = { UPB_SIZE(16, 32), 3, false, }; -static const upb_msglayout_field envoy_api_v2_core_SocketOption__fields[6] = { - {1, UPB_SIZE(24, 24), 0, 0, 9, 1}, - {2, UPB_SIZE(0, 0), 0, 0, 3, 1}, - {3, UPB_SIZE(8, 8), 0, 0, 3, 1}, - {4, UPB_SIZE(32, 40), UPB_SIZE(-41, -57), 0, 3, 1}, - {5, UPB_SIZE(32, 40), UPB_SIZE(-41, -57), 0, 12, 1}, - {6, UPB_SIZE(16, 16), 0, 0, 14, 1}, -}; - -const upb_msglayout envoy_api_v2_core_SocketOption_msginit = { - NULL, - &envoy_api_v2_core_SocketOption__fields[0], - UPB_SIZE(48, 64), 6, false, -}; - static const upb_msglayout *const envoy_api_v2_core_RuntimeFractionalPercent_submsgs[1] = { &envoy_type_FractionalPercent_msginit, }; diff --git a/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.h b/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.h index 2d2070b2d15..191c321a218 100644 --- a/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.h +++ b/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.h @@ -14,6 +14,9 @@ #include "upb/decode.h" #include "upb/encode.h" +/* Public Imports. */ +#include "envoy/api/v2/core/socket_option.upb.h" + #include "upb/port_def.inc" #ifdef __cplusplus @@ -27,15 +30,16 @@ struct envoy_api_v2_core_Node; struct envoy_api_v2_core_Metadata; struct envoy_api_v2_core_Metadata_FilterMetadataEntry; struct envoy_api_v2_core_RuntimeUInt32; +struct envoy_api_v2_core_RuntimeDouble; struct envoy_api_v2_core_RuntimeFeatureFlag; struct envoy_api_v2_core_HeaderValue; struct envoy_api_v2_core_HeaderValueOption; struct envoy_api_v2_core_HeaderMap; struct envoy_api_v2_core_DataSource; +struct envoy_api_v2_core_RetryPolicy; struct envoy_api_v2_core_RemoteDataSource; struct envoy_api_v2_core_AsyncDataSource; struct envoy_api_v2_core_TransportSocket; -struct envoy_api_v2_core_SocketOption; struct envoy_api_v2_core_RuntimeFractionalPercent; struct envoy_api_v2_core_ControlPlane; typedef struct envoy_api_v2_core_Locality envoy_api_v2_core_Locality; @@ -45,15 +49,16 @@ typedef struct envoy_api_v2_core_Node envoy_api_v2_core_Node; typedef struct envoy_api_v2_core_Metadata envoy_api_v2_core_Metadata; typedef struct envoy_api_v2_core_Metadata_FilterMetadataEntry envoy_api_v2_core_Metadata_FilterMetadataEntry; typedef struct envoy_api_v2_core_RuntimeUInt32 envoy_api_v2_core_RuntimeUInt32; +typedef struct envoy_api_v2_core_RuntimeDouble envoy_api_v2_core_RuntimeDouble; typedef struct envoy_api_v2_core_RuntimeFeatureFlag envoy_api_v2_core_RuntimeFeatureFlag; typedef struct envoy_api_v2_core_HeaderValue envoy_api_v2_core_HeaderValue; typedef struct envoy_api_v2_core_HeaderValueOption envoy_api_v2_core_HeaderValueOption; typedef struct envoy_api_v2_core_HeaderMap envoy_api_v2_core_HeaderMap; typedef struct envoy_api_v2_core_DataSource envoy_api_v2_core_DataSource; +typedef struct envoy_api_v2_core_RetryPolicy envoy_api_v2_core_RetryPolicy; typedef struct envoy_api_v2_core_RemoteDataSource envoy_api_v2_core_RemoteDataSource; typedef struct envoy_api_v2_core_AsyncDataSource envoy_api_v2_core_AsyncDataSource; typedef struct envoy_api_v2_core_TransportSocket envoy_api_v2_core_TransportSocket; -typedef struct envoy_api_v2_core_SocketOption envoy_api_v2_core_SocketOption; typedef struct envoy_api_v2_core_RuntimeFractionalPercent envoy_api_v2_core_RuntimeFractionalPercent; typedef struct envoy_api_v2_core_ControlPlane envoy_api_v2_core_ControlPlane; extern const upb_msglayout envoy_api_v2_core_Locality_msginit; @@ -63,29 +68,36 @@ extern const upb_msglayout envoy_api_v2_core_Node_msginit; extern const upb_msglayout envoy_api_v2_core_Metadata_msginit; extern const upb_msglayout envoy_api_v2_core_Metadata_FilterMetadataEntry_msginit; extern const upb_msglayout envoy_api_v2_core_RuntimeUInt32_msginit; +extern const upb_msglayout envoy_api_v2_core_RuntimeDouble_msginit; extern const upb_msglayout envoy_api_v2_core_RuntimeFeatureFlag_msginit; extern const upb_msglayout envoy_api_v2_core_HeaderValue_msginit; extern const upb_msglayout envoy_api_v2_core_HeaderValueOption_msginit; extern const upb_msglayout envoy_api_v2_core_HeaderMap_msginit; extern const upb_msglayout envoy_api_v2_core_DataSource_msginit; +extern const upb_msglayout envoy_api_v2_core_RetryPolicy_msginit; extern const upb_msglayout envoy_api_v2_core_RemoteDataSource_msginit; extern const upb_msglayout envoy_api_v2_core_AsyncDataSource_msginit; extern const upb_msglayout envoy_api_v2_core_TransportSocket_msginit; -extern const upb_msglayout envoy_api_v2_core_SocketOption_msginit; extern const upb_msglayout envoy_api_v2_core_RuntimeFractionalPercent_msginit; extern const upb_msglayout envoy_api_v2_core_ControlPlane_msginit; +struct envoy_api_v2_core_Address; +struct envoy_api_v2_core_BackoffStrategy; struct envoy_api_v2_core_HttpUri; struct envoy_type_FractionalPercent; struct envoy_type_SemanticVersion; struct google_protobuf_Any; struct google_protobuf_BoolValue; struct google_protobuf_Struct; +struct google_protobuf_UInt32Value; +extern const upb_msglayout envoy_api_v2_core_Address_msginit; +extern const upb_msglayout envoy_api_v2_core_BackoffStrategy_msginit; extern const upb_msglayout envoy_api_v2_core_HttpUri_msginit; extern const upb_msglayout envoy_type_FractionalPercent_msginit; extern const upb_msglayout envoy_type_SemanticVersion_msginit; extern const upb_msglayout google_protobuf_Any_msginit; extern const upb_msglayout google_protobuf_BoolValue_msginit; extern const upb_msglayout google_protobuf_Struct_msginit; +extern const upb_msglayout google_protobuf_UInt32Value_msginit; typedef enum { envoy_api_v2_core_METHOD_UNSPECIFIED = 0, @@ -105,12 +117,6 @@ typedef enum { envoy_api_v2_core_HIGH = 1 } envoy_api_v2_core_RoutingPriority; -typedef enum { - envoy_api_v2_core_SocketOption_STATE_PREBIND = 0, - envoy_api_v2_core_SocketOption_STATE_BOUND = 1, - envoy_api_v2_core_SocketOption_STATE_LISTENING = 2 -} envoy_api_v2_core_SocketOption_SocketState; - typedef enum { envoy_api_v2_core_UNSPECIFIED = 0, envoy_api_v2_core_INBOUND = 1, @@ -252,7 +258,7 @@ typedef enum { envoy_api_v2_core_Node_user_agent_version_type_user_agent_build_version = 8, envoy_api_v2_core_Node_user_agent_version_type_NOT_SET = 0 } envoy_api_v2_core_Node_user_agent_version_type_oneofcases; -UPB_INLINE envoy_api_v2_core_Node_user_agent_version_type_oneofcases envoy_api_v2_core_Node_user_agent_version_type_case(const envoy_api_v2_core_Node* msg) { return (envoy_api_v2_core_Node_user_agent_version_type_oneofcases)UPB_FIELD_AT(msg, int32_t, UPB_SIZE(56, 112)); } +UPB_INLINE envoy_api_v2_core_Node_user_agent_version_type_oneofcases envoy_api_v2_core_Node_user_agent_version_type_case(const envoy_api_v2_core_Node* msg) { return (envoy_api_v2_core_Node_user_agent_version_type_oneofcases)UPB_FIELD_AT(msg, int32_t, UPB_SIZE(60, 120)); } UPB_INLINE upb_strview envoy_api_v2_core_Node_id(const envoy_api_v2_core_Node *msg) { return UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(0, 0)); } UPB_INLINE upb_strview envoy_api_v2_core_Node_cluster(const envoy_api_v2_core_Node *msg) { return UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(8, 16)); } @@ -260,12 +266,13 @@ UPB_INLINE const struct google_protobuf_Struct* envoy_api_v2_core_Node_metadata( UPB_INLINE const envoy_api_v2_core_Locality* envoy_api_v2_core_Node_locality(const envoy_api_v2_core_Node *msg) { return UPB_FIELD_AT(msg, const envoy_api_v2_core_Locality*, UPB_SIZE(36, 72)); } UPB_INLINE upb_strview envoy_api_v2_core_Node_build_version(const envoy_api_v2_core_Node *msg) { return UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(16, 32)); } UPB_INLINE upb_strview envoy_api_v2_core_Node_user_agent_name(const envoy_api_v2_core_Node *msg) { return UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(24, 48)); } -UPB_INLINE bool envoy_api_v2_core_Node_has_user_agent_version(const envoy_api_v2_core_Node *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(56, 112), 7); } -UPB_INLINE upb_strview envoy_api_v2_core_Node_user_agent_version(const envoy_api_v2_core_Node *msg) { return UPB_READ_ONEOF(msg, upb_strview, UPB_SIZE(48, 96), UPB_SIZE(56, 112), 7, upb_strview_make("", strlen(""))); } -UPB_INLINE bool envoy_api_v2_core_Node_has_user_agent_build_version(const envoy_api_v2_core_Node *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(56, 112), 8); } -UPB_INLINE const envoy_api_v2_core_BuildVersion* envoy_api_v2_core_Node_user_agent_build_version(const envoy_api_v2_core_Node *msg) { return UPB_READ_ONEOF(msg, const envoy_api_v2_core_BuildVersion*, UPB_SIZE(48, 96), UPB_SIZE(56, 112), 8, NULL); } +UPB_INLINE bool envoy_api_v2_core_Node_has_user_agent_version(const envoy_api_v2_core_Node *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(60, 120), 7); } +UPB_INLINE upb_strview envoy_api_v2_core_Node_user_agent_version(const envoy_api_v2_core_Node *msg) { return UPB_READ_ONEOF(msg, upb_strview, UPB_SIZE(52, 104), UPB_SIZE(60, 120), 7, upb_strview_make("", strlen(""))); } +UPB_INLINE bool envoy_api_v2_core_Node_has_user_agent_build_version(const envoy_api_v2_core_Node *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(60, 120), 8); } +UPB_INLINE const envoy_api_v2_core_BuildVersion* envoy_api_v2_core_Node_user_agent_build_version(const envoy_api_v2_core_Node *msg) { return UPB_READ_ONEOF(msg, const envoy_api_v2_core_BuildVersion*, UPB_SIZE(52, 104), UPB_SIZE(60, 120), 8, NULL); } UPB_INLINE const envoy_api_v2_core_Extension* const* envoy_api_v2_core_Node_extensions(const envoy_api_v2_core_Node *msg, size_t *len) { return (const envoy_api_v2_core_Extension* const*)_upb_array_accessor(msg, UPB_SIZE(40, 80), len); } UPB_INLINE upb_strview const* envoy_api_v2_core_Node_client_features(const envoy_api_v2_core_Node *msg, size_t *len) { return (upb_strview const*)_upb_array_accessor(msg, UPB_SIZE(44, 88), len); } +UPB_INLINE const struct envoy_api_v2_core_Address* const* envoy_api_v2_core_Node_listening_addresses(const envoy_api_v2_core_Node *msg, size_t *len) { return (const struct envoy_api_v2_core_Address* const*)_upb_array_accessor(msg, UPB_SIZE(48, 96), len); } UPB_INLINE void envoy_api_v2_core_Node_set_id(envoy_api_v2_core_Node *msg, upb_strview value) { UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(0, 0)) = value; @@ -304,10 +311,10 @@ UPB_INLINE void envoy_api_v2_core_Node_set_user_agent_name(envoy_api_v2_core_Nod UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(24, 48)) = value; } UPB_INLINE void envoy_api_v2_core_Node_set_user_agent_version(envoy_api_v2_core_Node *msg, upb_strview value) { - UPB_WRITE_ONEOF(msg, upb_strview, UPB_SIZE(48, 96), value, UPB_SIZE(56, 112), 7); + UPB_WRITE_ONEOF(msg, upb_strview, UPB_SIZE(52, 104), value, UPB_SIZE(60, 120), 7); } UPB_INLINE void envoy_api_v2_core_Node_set_user_agent_build_version(envoy_api_v2_core_Node *msg, envoy_api_v2_core_BuildVersion* value) { - UPB_WRITE_ONEOF(msg, envoy_api_v2_core_BuildVersion*, UPB_SIZE(48, 96), value, UPB_SIZE(56, 112), 8); + UPB_WRITE_ONEOF(msg, envoy_api_v2_core_BuildVersion*, UPB_SIZE(52, 104), value, UPB_SIZE(60, 120), 8); } UPB_INLINE struct envoy_api_v2_core_BuildVersion* envoy_api_v2_core_Node_mutable_user_agent_build_version(envoy_api_v2_core_Node *msg, upb_arena *arena) { struct envoy_api_v2_core_BuildVersion* sub = (struct envoy_api_v2_core_BuildVersion*)envoy_api_v2_core_Node_user_agent_build_version(msg); @@ -341,6 +348,19 @@ UPB_INLINE bool envoy_api_v2_core_Node_add_client_features(envoy_api_v2_core_Nod return _upb_array_append_accessor( msg, UPB_SIZE(44, 88), UPB_SIZE(8, 16), UPB_TYPE_STRING, &val, arena); } +UPB_INLINE struct envoy_api_v2_core_Address** envoy_api_v2_core_Node_mutable_listening_addresses(envoy_api_v2_core_Node *msg, size_t *len) { + return (struct envoy_api_v2_core_Address**)_upb_array_mutable_accessor(msg, UPB_SIZE(48, 96), len); +} +UPB_INLINE struct envoy_api_v2_core_Address** envoy_api_v2_core_Node_resize_listening_addresses(envoy_api_v2_core_Node *msg, size_t len, upb_arena *arena) { + return (struct envoy_api_v2_core_Address**)_upb_array_resize_accessor(msg, UPB_SIZE(48, 96), len, UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, arena); +} +UPB_INLINE struct envoy_api_v2_core_Address* envoy_api_v2_core_Node_add_listening_addresses(envoy_api_v2_core_Node *msg, upb_arena *arena) { + struct envoy_api_v2_core_Address* sub = (struct envoy_api_v2_core_Address*)upb_msg_new(&envoy_api_v2_core_Address_msginit, arena); + bool ok = _upb_array_append_accessor( + msg, UPB_SIZE(48, 96), UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, &sub, arena); + if (!ok) return NULL; + return sub; +} /* envoy.api.v2.core.Metadata */ @@ -429,6 +449,30 @@ UPB_INLINE void envoy_api_v2_core_RuntimeUInt32_set_runtime_key(envoy_api_v2_cor UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(4, 8)) = value; } +/* envoy.api.v2.core.RuntimeDouble */ + +UPB_INLINE envoy_api_v2_core_RuntimeDouble *envoy_api_v2_core_RuntimeDouble_new(upb_arena *arena) { + return (envoy_api_v2_core_RuntimeDouble *)upb_msg_new(&envoy_api_v2_core_RuntimeDouble_msginit, arena); +} +UPB_INLINE envoy_api_v2_core_RuntimeDouble *envoy_api_v2_core_RuntimeDouble_parse(const char *buf, size_t size, + upb_arena *arena) { + envoy_api_v2_core_RuntimeDouble *ret = envoy_api_v2_core_RuntimeDouble_new(arena); + return (ret && upb_decode(buf, size, ret, &envoy_api_v2_core_RuntimeDouble_msginit, arena)) ? ret : NULL; +} +UPB_INLINE char *envoy_api_v2_core_RuntimeDouble_serialize(const envoy_api_v2_core_RuntimeDouble *msg, upb_arena *arena, size_t *len) { + return upb_encode(msg, &envoy_api_v2_core_RuntimeDouble_msginit, arena, len); +} + +UPB_INLINE double envoy_api_v2_core_RuntimeDouble_default_value(const envoy_api_v2_core_RuntimeDouble *msg) { return UPB_FIELD_AT(msg, double, UPB_SIZE(0, 0)); } +UPB_INLINE upb_strview envoy_api_v2_core_RuntimeDouble_runtime_key(const envoy_api_v2_core_RuntimeDouble *msg) { return UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(8, 8)); } + +UPB_INLINE void envoy_api_v2_core_RuntimeDouble_set_default_value(envoy_api_v2_core_RuntimeDouble *msg, double value) { + UPB_FIELD_AT(msg, double, UPB_SIZE(0, 0)) = value; +} +UPB_INLINE void envoy_api_v2_core_RuntimeDouble_set_runtime_key(envoy_api_v2_core_RuntimeDouble *msg, upb_strview value) { + UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(8, 8)) = value; +} + /* envoy.api.v2.core.RuntimeFeatureFlag */ UPB_INLINE envoy_api_v2_core_RuntimeFeatureFlag *envoy_api_v2_core_RuntimeFeatureFlag_new(upb_arena *arena) { @@ -597,6 +641,48 @@ UPB_INLINE void envoy_api_v2_core_DataSource_set_inline_string(envoy_api_v2_core UPB_WRITE_ONEOF(msg, upb_strview, UPB_SIZE(0, 0), value, UPB_SIZE(8, 16), 3); } +/* envoy.api.v2.core.RetryPolicy */ + +UPB_INLINE envoy_api_v2_core_RetryPolicy *envoy_api_v2_core_RetryPolicy_new(upb_arena *arena) { + return (envoy_api_v2_core_RetryPolicy *)upb_msg_new(&envoy_api_v2_core_RetryPolicy_msginit, arena); +} +UPB_INLINE envoy_api_v2_core_RetryPolicy *envoy_api_v2_core_RetryPolicy_parse(const char *buf, size_t size, + upb_arena *arena) { + envoy_api_v2_core_RetryPolicy *ret = envoy_api_v2_core_RetryPolicy_new(arena); + return (ret && upb_decode(buf, size, ret, &envoy_api_v2_core_RetryPolicy_msginit, arena)) ? ret : NULL; +} +UPB_INLINE char *envoy_api_v2_core_RetryPolicy_serialize(const envoy_api_v2_core_RetryPolicy *msg, upb_arena *arena, size_t *len) { + return upb_encode(msg, &envoy_api_v2_core_RetryPolicy_msginit, arena, len); +} + +UPB_INLINE const struct envoy_api_v2_core_BackoffStrategy* envoy_api_v2_core_RetryPolicy_retry_back_off(const envoy_api_v2_core_RetryPolicy *msg) { return UPB_FIELD_AT(msg, const struct envoy_api_v2_core_BackoffStrategy*, UPB_SIZE(0, 0)); } +UPB_INLINE const struct google_protobuf_UInt32Value* envoy_api_v2_core_RetryPolicy_num_retries(const envoy_api_v2_core_RetryPolicy *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_UInt32Value*, UPB_SIZE(4, 8)); } + +UPB_INLINE void envoy_api_v2_core_RetryPolicy_set_retry_back_off(envoy_api_v2_core_RetryPolicy *msg, struct envoy_api_v2_core_BackoffStrategy* value) { + UPB_FIELD_AT(msg, struct envoy_api_v2_core_BackoffStrategy*, UPB_SIZE(0, 0)) = value; +} +UPB_INLINE struct envoy_api_v2_core_BackoffStrategy* envoy_api_v2_core_RetryPolicy_mutable_retry_back_off(envoy_api_v2_core_RetryPolicy *msg, upb_arena *arena) { + struct envoy_api_v2_core_BackoffStrategy* sub = (struct envoy_api_v2_core_BackoffStrategy*)envoy_api_v2_core_RetryPolicy_retry_back_off(msg); + if (sub == NULL) { + sub = (struct envoy_api_v2_core_BackoffStrategy*)upb_msg_new(&envoy_api_v2_core_BackoffStrategy_msginit, arena); + if (!sub) return NULL; + envoy_api_v2_core_RetryPolicy_set_retry_back_off(msg, sub); + } + return sub; +} +UPB_INLINE void envoy_api_v2_core_RetryPolicy_set_num_retries(envoy_api_v2_core_RetryPolicy *msg, struct google_protobuf_UInt32Value* value) { + UPB_FIELD_AT(msg, struct google_protobuf_UInt32Value*, UPB_SIZE(4, 8)) = value; +} +UPB_INLINE struct google_protobuf_UInt32Value* envoy_api_v2_core_RetryPolicy_mutable_num_retries(envoy_api_v2_core_RetryPolicy *msg, upb_arena *arena) { + struct google_protobuf_UInt32Value* sub = (struct google_protobuf_UInt32Value*)envoy_api_v2_core_RetryPolicy_num_retries(msg); + if (sub == NULL) { + sub = (struct google_protobuf_UInt32Value*)upb_msg_new(&google_protobuf_UInt32Value_msginit, arena); + if (!sub) return NULL; + envoy_api_v2_core_RetryPolicy_set_num_retries(msg, sub); + } + return sub; +} + /* envoy.api.v2.core.RemoteDataSource */ UPB_INLINE envoy_api_v2_core_RemoteDataSource *envoy_api_v2_core_RemoteDataSource_new(upb_arena *arena) { @@ -613,6 +699,7 @@ UPB_INLINE char *envoy_api_v2_core_RemoteDataSource_serialize(const envoy_api_v2 UPB_INLINE const struct envoy_api_v2_core_HttpUri* envoy_api_v2_core_RemoteDataSource_http_uri(const envoy_api_v2_core_RemoteDataSource *msg) { return UPB_FIELD_AT(msg, const struct envoy_api_v2_core_HttpUri*, UPB_SIZE(8, 16)); } UPB_INLINE upb_strview envoy_api_v2_core_RemoteDataSource_sha256(const envoy_api_v2_core_RemoteDataSource *msg) { return UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(0, 0)); } +UPB_INLINE const envoy_api_v2_core_RetryPolicy* envoy_api_v2_core_RemoteDataSource_retry_policy(const envoy_api_v2_core_RemoteDataSource *msg) { return UPB_FIELD_AT(msg, const envoy_api_v2_core_RetryPolicy*, UPB_SIZE(12, 24)); } UPB_INLINE void envoy_api_v2_core_RemoteDataSource_set_http_uri(envoy_api_v2_core_RemoteDataSource *msg, struct envoy_api_v2_core_HttpUri* value) { UPB_FIELD_AT(msg, struct envoy_api_v2_core_HttpUri*, UPB_SIZE(8, 16)) = value; @@ -629,6 +716,18 @@ UPB_INLINE struct envoy_api_v2_core_HttpUri* envoy_api_v2_core_RemoteDataSource_ UPB_INLINE void envoy_api_v2_core_RemoteDataSource_set_sha256(envoy_api_v2_core_RemoteDataSource *msg, upb_strview value) { UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(0, 0)) = value; } +UPB_INLINE void envoy_api_v2_core_RemoteDataSource_set_retry_policy(envoy_api_v2_core_RemoteDataSource *msg, envoy_api_v2_core_RetryPolicy* value) { + UPB_FIELD_AT(msg, envoy_api_v2_core_RetryPolicy*, UPB_SIZE(12, 24)) = value; +} +UPB_INLINE struct envoy_api_v2_core_RetryPolicy* envoy_api_v2_core_RemoteDataSource_mutable_retry_policy(envoy_api_v2_core_RemoteDataSource *msg, upb_arena *arena) { + struct envoy_api_v2_core_RetryPolicy* sub = (struct envoy_api_v2_core_RetryPolicy*)envoy_api_v2_core_RemoteDataSource_retry_policy(msg); + if (sub == NULL) { + sub = (struct envoy_api_v2_core_RetryPolicy*)upb_msg_new(&envoy_api_v2_core_RetryPolicy_msginit, arena); + if (!sub) return NULL; + envoy_api_v2_core_RemoteDataSource_set_retry_policy(msg, sub); + } + return sub; +} /* envoy.api.v2.core.AsyncDataSource */ @@ -736,55 +835,6 @@ UPB_INLINE struct google_protobuf_Any* envoy_api_v2_core_TransportSocket_mutable return sub; } -/* envoy.api.v2.core.SocketOption */ - -UPB_INLINE envoy_api_v2_core_SocketOption *envoy_api_v2_core_SocketOption_new(upb_arena *arena) { - return (envoy_api_v2_core_SocketOption *)upb_msg_new(&envoy_api_v2_core_SocketOption_msginit, arena); -} -UPB_INLINE envoy_api_v2_core_SocketOption *envoy_api_v2_core_SocketOption_parse(const char *buf, size_t size, - upb_arena *arena) { - envoy_api_v2_core_SocketOption *ret = envoy_api_v2_core_SocketOption_new(arena); - return (ret && upb_decode(buf, size, ret, &envoy_api_v2_core_SocketOption_msginit, arena)) ? ret : NULL; -} -UPB_INLINE char *envoy_api_v2_core_SocketOption_serialize(const envoy_api_v2_core_SocketOption *msg, upb_arena *arena, size_t *len) { - return upb_encode(msg, &envoy_api_v2_core_SocketOption_msginit, arena, len); -} - -typedef enum { - envoy_api_v2_core_SocketOption_value_int_value = 4, - envoy_api_v2_core_SocketOption_value_buf_value = 5, - envoy_api_v2_core_SocketOption_value_NOT_SET = 0 -} envoy_api_v2_core_SocketOption_value_oneofcases; -UPB_INLINE envoy_api_v2_core_SocketOption_value_oneofcases envoy_api_v2_core_SocketOption_value_case(const envoy_api_v2_core_SocketOption* msg) { return (envoy_api_v2_core_SocketOption_value_oneofcases)UPB_FIELD_AT(msg, int32_t, UPB_SIZE(40, 56)); } - -UPB_INLINE upb_strview envoy_api_v2_core_SocketOption_description(const envoy_api_v2_core_SocketOption *msg) { return UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(24, 24)); } -UPB_INLINE int64_t envoy_api_v2_core_SocketOption_level(const envoy_api_v2_core_SocketOption *msg) { return UPB_FIELD_AT(msg, int64_t, UPB_SIZE(0, 0)); } -UPB_INLINE int64_t envoy_api_v2_core_SocketOption_name(const envoy_api_v2_core_SocketOption *msg) { return UPB_FIELD_AT(msg, int64_t, UPB_SIZE(8, 8)); } -UPB_INLINE bool envoy_api_v2_core_SocketOption_has_int_value(const envoy_api_v2_core_SocketOption *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(40, 56), 4); } -UPB_INLINE int64_t envoy_api_v2_core_SocketOption_int_value(const envoy_api_v2_core_SocketOption *msg) { return UPB_READ_ONEOF(msg, int64_t, UPB_SIZE(32, 40), UPB_SIZE(40, 56), 4, 0); } -UPB_INLINE bool envoy_api_v2_core_SocketOption_has_buf_value(const envoy_api_v2_core_SocketOption *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(40, 56), 5); } -UPB_INLINE upb_strview envoy_api_v2_core_SocketOption_buf_value(const envoy_api_v2_core_SocketOption *msg) { return UPB_READ_ONEOF(msg, upb_strview, UPB_SIZE(32, 40), UPB_SIZE(40, 56), 5, upb_strview_make("", strlen(""))); } -UPB_INLINE int32_t envoy_api_v2_core_SocketOption_state(const envoy_api_v2_core_SocketOption *msg) { return UPB_FIELD_AT(msg, int32_t, UPB_SIZE(16, 16)); } - -UPB_INLINE void envoy_api_v2_core_SocketOption_set_description(envoy_api_v2_core_SocketOption *msg, upb_strview value) { - UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(24, 24)) = value; -} -UPB_INLINE void envoy_api_v2_core_SocketOption_set_level(envoy_api_v2_core_SocketOption *msg, int64_t value) { - UPB_FIELD_AT(msg, int64_t, UPB_SIZE(0, 0)) = value; -} -UPB_INLINE void envoy_api_v2_core_SocketOption_set_name(envoy_api_v2_core_SocketOption *msg, int64_t value) { - UPB_FIELD_AT(msg, int64_t, UPB_SIZE(8, 8)) = value; -} -UPB_INLINE void envoy_api_v2_core_SocketOption_set_int_value(envoy_api_v2_core_SocketOption *msg, int64_t value) { - UPB_WRITE_ONEOF(msg, int64_t, UPB_SIZE(32, 40), value, UPB_SIZE(40, 56), 4); -} -UPB_INLINE void envoy_api_v2_core_SocketOption_set_buf_value(envoy_api_v2_core_SocketOption *msg, upb_strview value) { - UPB_WRITE_ONEOF(msg, upb_strview, UPB_SIZE(32, 40), value, UPB_SIZE(40, 56), 5); -} -UPB_INLINE void envoy_api_v2_core_SocketOption_set_state(envoy_api_v2_core_SocketOption *msg, int32_t value) { - UPB_FIELD_AT(msg, int32_t, UPB_SIZE(16, 16)) = value; -} - /* envoy.api.v2.core.RuntimeFractionalPercent */ UPB_INLINE envoy_api_v2_core_RuntimeFractionalPercent *envoy_api_v2_core_RuntimeFractionalPercent_new(upb_arena *arena) { diff --git a/src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c b/src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c index dd17a79caf9..3f0fc4c16a2 100644 --- a/src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c +++ b/src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c @@ -14,6 +14,7 @@ #include "google/protobuf/wrappers.upb.h" #include "envoy/annotations/deprecation.upb.h" #include "udpa/annotations/migrate.upb.h" +#include "udpa/annotations/status.upb.h" #include "validate/validate.upb.h" #include "upb/port_def.inc" diff --git a/src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.c b/src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.c new file mode 100644 index 00000000000..5c7d8abef18 --- /dev/null +++ b/src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.c @@ -0,0 +1,34 @@ +/* This file was generated by upbc (the upb compiler) from the input + * file: + * + * envoy/api/v2/core/event_service_config.proto + * + * Do not edit -- your changes will be discarded when the file is + * regenerated. */ + +#include +#include "upb/msg.h" +#include "envoy/api/v2/core/event_service_config.upb.h" +#include "envoy/api/v2/core/grpc_service.upb.h" +#include "udpa/annotations/migrate.upb.h" +#include "udpa/annotations/status.upb.h" +#include "validate/validate.upb.h" + +#include "upb/port_def.inc" + +static const upb_msglayout *const envoy_api_v2_core_EventServiceConfig_submsgs[1] = { + &envoy_api_v2_core_GrpcService_msginit, +}; + +static const upb_msglayout_field envoy_api_v2_core_EventServiceConfig__fields[1] = { + {1, UPB_SIZE(0, 0), UPB_SIZE(-5, -9), 0, 11, 1}, +}; + +const upb_msglayout envoy_api_v2_core_EventServiceConfig_msginit = { + &envoy_api_v2_core_EventServiceConfig_submsgs[0], + &envoy_api_v2_core_EventServiceConfig__fields[0], + UPB_SIZE(8, 16), 1, false, +}; + +#include "upb/port_undef.inc" + diff --git a/src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.h b/src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.h new file mode 100644 index 00000000000..47cc54d5d17 --- /dev/null +++ b/src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.h @@ -0,0 +1,72 @@ +/* This file was generated by upbc (the upb compiler) from the input + * file: + * + * envoy/api/v2/core/event_service_config.proto + * + * Do not edit -- your changes will be discarded when the file is + * regenerated. */ + +#ifndef ENVOY_API_V2_CORE_EVENT_SERVICE_CONFIG_PROTO_UPB_H_ +#define ENVOY_API_V2_CORE_EVENT_SERVICE_CONFIG_PROTO_UPB_H_ + +#include "upb/generated_util.h" +#include "upb/msg.h" +#include "upb/decode.h" +#include "upb/encode.h" + +#include "upb/port_def.inc" + +#ifdef __cplusplus +extern "C" { +#endif + +struct envoy_api_v2_core_EventServiceConfig; +typedef struct envoy_api_v2_core_EventServiceConfig envoy_api_v2_core_EventServiceConfig; +extern const upb_msglayout envoy_api_v2_core_EventServiceConfig_msginit; +struct envoy_api_v2_core_GrpcService; +extern const upb_msglayout envoy_api_v2_core_GrpcService_msginit; + + +/* envoy.api.v2.core.EventServiceConfig */ + +UPB_INLINE envoy_api_v2_core_EventServiceConfig *envoy_api_v2_core_EventServiceConfig_new(upb_arena *arena) { + return (envoy_api_v2_core_EventServiceConfig *)upb_msg_new(&envoy_api_v2_core_EventServiceConfig_msginit, arena); +} +UPB_INLINE envoy_api_v2_core_EventServiceConfig *envoy_api_v2_core_EventServiceConfig_parse(const char *buf, size_t size, + upb_arena *arena) { + envoy_api_v2_core_EventServiceConfig *ret = envoy_api_v2_core_EventServiceConfig_new(arena); + return (ret && upb_decode(buf, size, ret, &envoy_api_v2_core_EventServiceConfig_msginit, arena)) ? ret : NULL; +} +UPB_INLINE char *envoy_api_v2_core_EventServiceConfig_serialize(const envoy_api_v2_core_EventServiceConfig *msg, upb_arena *arena, size_t *len) { + return upb_encode(msg, &envoy_api_v2_core_EventServiceConfig_msginit, arena, len); +} + +typedef enum { + envoy_api_v2_core_EventServiceConfig_config_source_specifier_grpc_service = 1, + envoy_api_v2_core_EventServiceConfig_config_source_specifier_NOT_SET = 0 +} envoy_api_v2_core_EventServiceConfig_config_source_specifier_oneofcases; +UPB_INLINE envoy_api_v2_core_EventServiceConfig_config_source_specifier_oneofcases envoy_api_v2_core_EventServiceConfig_config_source_specifier_case(const envoy_api_v2_core_EventServiceConfig* msg) { return (envoy_api_v2_core_EventServiceConfig_config_source_specifier_oneofcases)UPB_FIELD_AT(msg, int32_t, UPB_SIZE(4, 8)); } + +UPB_INLINE bool envoy_api_v2_core_EventServiceConfig_has_grpc_service(const envoy_api_v2_core_EventServiceConfig *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(4, 8), 1); } +UPB_INLINE const struct envoy_api_v2_core_GrpcService* envoy_api_v2_core_EventServiceConfig_grpc_service(const envoy_api_v2_core_EventServiceConfig *msg) { return UPB_READ_ONEOF(msg, const struct envoy_api_v2_core_GrpcService*, UPB_SIZE(0, 0), UPB_SIZE(4, 8), 1, NULL); } + +UPB_INLINE void envoy_api_v2_core_EventServiceConfig_set_grpc_service(envoy_api_v2_core_EventServiceConfig *msg, struct envoy_api_v2_core_GrpcService* value) { + UPB_WRITE_ONEOF(msg, struct envoy_api_v2_core_GrpcService*, UPB_SIZE(0, 0), value, UPB_SIZE(4, 8), 1); +} +UPB_INLINE struct envoy_api_v2_core_GrpcService* envoy_api_v2_core_EventServiceConfig_mutable_grpc_service(envoy_api_v2_core_EventServiceConfig *msg, upb_arena *arena) { + struct envoy_api_v2_core_GrpcService* sub = (struct envoy_api_v2_core_GrpcService*)envoy_api_v2_core_EventServiceConfig_grpc_service(msg); + if (sub == NULL) { + sub = (struct envoy_api_v2_core_GrpcService*)upb_msg_new(&envoy_api_v2_core_GrpcService_msginit, arena); + if (!sub) return NULL; + envoy_api_v2_core_EventServiceConfig_set_grpc_service(msg, sub); + } + return sub; +} + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#include "upb/port_undef.inc" + +#endif /* ENVOY_API_V2_CORE_EVENT_SERVICE_CONFIG_PROTO_UPB_H_ */ diff --git a/src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c b/src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c index f1b76b8ad46..bcf33a0744a 100644 --- a/src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c +++ b/src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c @@ -14,8 +14,9 @@ #include "google/protobuf/duration.upb.h" #include "google/protobuf/empty.upb.h" #include "google/protobuf/struct.upb.h" -#include "udpa/annotations/sensitive.upb.h" #include "udpa/annotations/migrate.upb.h" +#include "udpa/annotations/sensitive.upb.h" +#include "udpa/annotations/status.upb.h" #include "validate/validate.upb.h" #include "upb/port_def.inc" diff --git a/src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c b/src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c index 01573ebaeba..f62e741d480 100644 --- a/src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c +++ b/src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c @@ -10,6 +10,7 @@ #include "upb/msg.h" #include "envoy/api/v2/core/health_check.upb.h" #include "envoy/api/v2/core/base.upb.h" +#include "envoy/api/v2/core/event_service_config.upb.h" #include "envoy/type/http.upb.h" #include "envoy/type/matcher/string.upb.h" #include "envoy/type/range.upb.h" @@ -19,11 +20,13 @@ #include "google/protobuf/wrappers.upb.h" #include "envoy/annotations/deprecation.upb.h" #include "udpa/annotations/migrate.upb.h" +#include "udpa/annotations/status.upb.h" #include "validate/validate.upb.h" #include "upb/port_def.inc" -static const upb_msglayout *const envoy_api_v2_core_HealthCheck_submsgs[17] = { +static const upb_msglayout *const envoy_api_v2_core_HealthCheck_submsgs[18] = { + &envoy_api_v2_core_EventServiceConfig_msginit, &envoy_api_v2_core_HealthCheck_CustomHealthCheck_msginit, &envoy_api_v2_core_HealthCheck_GrpcHealthCheck_msginit, &envoy_api_v2_core_HealthCheck_HttpHealthCheck_msginit, @@ -34,33 +37,34 @@ static const upb_msglayout *const envoy_api_v2_core_HealthCheck_submsgs[17] = { &google_protobuf_UInt32Value_msginit, }; -static const upb_msglayout_field envoy_api_v2_core_HealthCheck__fields[20] = { - {1, UPB_SIZE(16, 24), 0, 6, 11, 1}, - {2, UPB_SIZE(20, 32), 0, 6, 11, 1}, - {3, UPB_SIZE(24, 40), 0, 6, 11, 1}, - {4, UPB_SIZE(28, 48), 0, 7, 11, 1}, - {5, UPB_SIZE(32, 56), 0, 7, 11, 1}, - {6, UPB_SIZE(36, 64), 0, 7, 11, 1}, - {7, UPB_SIZE(40, 72), 0, 5, 11, 1}, - {8, UPB_SIZE(68, 128), UPB_SIZE(-73, -137), 2, 11, 1}, - {9, UPB_SIZE(68, 128), UPB_SIZE(-73, -137), 3, 11, 1}, - {11, UPB_SIZE(68, 128), UPB_SIZE(-73, -137), 1, 11, 1}, - {12, UPB_SIZE(44, 80), 0, 6, 11, 1}, - {13, UPB_SIZE(68, 128), UPB_SIZE(-73, -137), 0, 11, 1}, - {14, UPB_SIZE(48, 88), 0, 6, 11, 1}, - {15, UPB_SIZE(52, 96), 0, 6, 11, 1}, - {16, UPB_SIZE(56, 104), 0, 6, 11, 1}, +static const upb_msglayout_field envoy_api_v2_core_HealthCheck__fields[21] = { + {1, UPB_SIZE(16, 24), 0, 7, 11, 1}, + {2, UPB_SIZE(20, 32), 0, 7, 11, 1}, + {3, UPB_SIZE(24, 40), 0, 7, 11, 1}, + {4, UPB_SIZE(28, 48), 0, 8, 11, 1}, + {5, UPB_SIZE(32, 56), 0, 8, 11, 1}, + {6, UPB_SIZE(36, 64), 0, 8, 11, 1}, + {7, UPB_SIZE(40, 72), 0, 6, 11, 1}, + {8, UPB_SIZE(72, 136), UPB_SIZE(-77, -145), 3, 11, 1}, + {9, UPB_SIZE(72, 136), UPB_SIZE(-77, -145), 4, 11, 1}, + {11, UPB_SIZE(72, 136), UPB_SIZE(-77, -145), 2, 11, 1}, + {12, UPB_SIZE(44, 80), 0, 7, 11, 1}, + {13, UPB_SIZE(72, 136), UPB_SIZE(-77, -145), 1, 11, 1}, + {14, UPB_SIZE(48, 88), 0, 7, 11, 1}, + {15, UPB_SIZE(52, 96), 0, 7, 11, 1}, + {16, UPB_SIZE(56, 104), 0, 7, 11, 1}, {17, UPB_SIZE(8, 8), 0, 0, 9, 1}, {18, UPB_SIZE(0, 0), 0, 0, 13, 1}, {19, UPB_SIZE(4, 4), 0, 0, 8, 1}, - {20, UPB_SIZE(60, 112), 0, 6, 11, 1}, - {21, UPB_SIZE(64, 120), 0, 4, 11, 1}, + {20, UPB_SIZE(60, 112), 0, 7, 11, 1}, + {21, UPB_SIZE(64, 120), 0, 5, 11, 1}, + {22, UPB_SIZE(68, 128), 0, 0, 11, 1}, }; const upb_msglayout envoy_api_v2_core_HealthCheck_msginit = { &envoy_api_v2_core_HealthCheck_submsgs[0], &envoy_api_v2_core_HealthCheck__fields[0], - UPB_SIZE(80, 144), 20, false, + UPB_SIZE(80, 160), 21, false, }; static const upb_msglayout_field envoy_api_v2_core_HealthCheck_Payload__fields[2] = { diff --git a/src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.h b/src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.h index 587beac26be..bfe7af10ac6 100644 --- a/src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.h +++ b/src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.h @@ -44,6 +44,7 @@ extern const upb_msglayout envoy_api_v2_core_HealthCheck_RedisHealthCheck_msgini extern const upb_msglayout envoy_api_v2_core_HealthCheck_GrpcHealthCheck_msginit; extern const upb_msglayout envoy_api_v2_core_HealthCheck_CustomHealthCheck_msginit; extern const upb_msglayout envoy_api_v2_core_HealthCheck_TlsOptions_msginit; +struct envoy_api_v2_core_EventServiceConfig; struct envoy_api_v2_core_HeaderValueOption; struct envoy_type_Int64Range; struct envoy_type_matcher_StringMatcher; @@ -52,6 +53,7 @@ struct google_protobuf_BoolValue; struct google_protobuf_Duration; struct google_protobuf_Struct; struct google_protobuf_UInt32Value; +extern const upb_msglayout envoy_api_v2_core_EventServiceConfig_msginit; extern const upb_msglayout envoy_api_v2_core_HeaderValueOption_msginit; extern const upb_msglayout envoy_type_Int64Range_msginit; extern const upb_msglayout envoy_type_matcher_StringMatcher_msginit; @@ -92,7 +94,7 @@ typedef enum { envoy_api_v2_core_HealthCheck_health_checker_custom_health_check = 13, envoy_api_v2_core_HealthCheck_health_checker_NOT_SET = 0 } envoy_api_v2_core_HealthCheck_health_checker_oneofcases; -UPB_INLINE envoy_api_v2_core_HealthCheck_health_checker_oneofcases envoy_api_v2_core_HealthCheck_health_checker_case(const envoy_api_v2_core_HealthCheck* msg) { return (envoy_api_v2_core_HealthCheck_health_checker_oneofcases)UPB_FIELD_AT(msg, int32_t, UPB_SIZE(72, 136)); } +UPB_INLINE envoy_api_v2_core_HealthCheck_health_checker_oneofcases envoy_api_v2_core_HealthCheck_health_checker_case(const envoy_api_v2_core_HealthCheck* msg) { return (envoy_api_v2_core_HealthCheck_health_checker_oneofcases)UPB_FIELD_AT(msg, int32_t, UPB_SIZE(76, 144)); } UPB_INLINE const struct google_protobuf_Duration* envoy_api_v2_core_HealthCheck_timeout(const envoy_api_v2_core_HealthCheck *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_Duration*, UPB_SIZE(16, 24)); } UPB_INLINE const struct google_protobuf_Duration* envoy_api_v2_core_HealthCheck_interval(const envoy_api_v2_core_HealthCheck *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_Duration*, UPB_SIZE(20, 32)); } @@ -101,15 +103,15 @@ UPB_INLINE const struct google_protobuf_UInt32Value* envoy_api_v2_core_HealthChe UPB_INLINE const struct google_protobuf_UInt32Value* envoy_api_v2_core_HealthCheck_healthy_threshold(const envoy_api_v2_core_HealthCheck *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_UInt32Value*, UPB_SIZE(32, 56)); } UPB_INLINE const struct google_protobuf_UInt32Value* envoy_api_v2_core_HealthCheck_alt_port(const envoy_api_v2_core_HealthCheck *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_UInt32Value*, UPB_SIZE(36, 64)); } UPB_INLINE const struct google_protobuf_BoolValue* envoy_api_v2_core_HealthCheck_reuse_connection(const envoy_api_v2_core_HealthCheck *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_BoolValue*, UPB_SIZE(40, 72)); } -UPB_INLINE bool envoy_api_v2_core_HealthCheck_has_http_health_check(const envoy_api_v2_core_HealthCheck *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(72, 136), 8); } -UPB_INLINE const envoy_api_v2_core_HealthCheck_HttpHealthCheck* envoy_api_v2_core_HealthCheck_http_health_check(const envoy_api_v2_core_HealthCheck *msg) { return UPB_READ_ONEOF(msg, const envoy_api_v2_core_HealthCheck_HttpHealthCheck*, UPB_SIZE(68, 128), UPB_SIZE(72, 136), 8, NULL); } -UPB_INLINE bool envoy_api_v2_core_HealthCheck_has_tcp_health_check(const envoy_api_v2_core_HealthCheck *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(72, 136), 9); } -UPB_INLINE const envoy_api_v2_core_HealthCheck_TcpHealthCheck* envoy_api_v2_core_HealthCheck_tcp_health_check(const envoy_api_v2_core_HealthCheck *msg) { return UPB_READ_ONEOF(msg, const envoy_api_v2_core_HealthCheck_TcpHealthCheck*, UPB_SIZE(68, 128), UPB_SIZE(72, 136), 9, NULL); } -UPB_INLINE bool envoy_api_v2_core_HealthCheck_has_grpc_health_check(const envoy_api_v2_core_HealthCheck *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(72, 136), 11); } -UPB_INLINE const envoy_api_v2_core_HealthCheck_GrpcHealthCheck* envoy_api_v2_core_HealthCheck_grpc_health_check(const envoy_api_v2_core_HealthCheck *msg) { return UPB_READ_ONEOF(msg, const envoy_api_v2_core_HealthCheck_GrpcHealthCheck*, UPB_SIZE(68, 128), UPB_SIZE(72, 136), 11, NULL); } +UPB_INLINE bool envoy_api_v2_core_HealthCheck_has_http_health_check(const envoy_api_v2_core_HealthCheck *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(76, 144), 8); } +UPB_INLINE const envoy_api_v2_core_HealthCheck_HttpHealthCheck* envoy_api_v2_core_HealthCheck_http_health_check(const envoy_api_v2_core_HealthCheck *msg) { return UPB_READ_ONEOF(msg, const envoy_api_v2_core_HealthCheck_HttpHealthCheck*, UPB_SIZE(72, 136), UPB_SIZE(76, 144), 8, NULL); } +UPB_INLINE bool envoy_api_v2_core_HealthCheck_has_tcp_health_check(const envoy_api_v2_core_HealthCheck *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(76, 144), 9); } +UPB_INLINE const envoy_api_v2_core_HealthCheck_TcpHealthCheck* envoy_api_v2_core_HealthCheck_tcp_health_check(const envoy_api_v2_core_HealthCheck *msg) { return UPB_READ_ONEOF(msg, const envoy_api_v2_core_HealthCheck_TcpHealthCheck*, UPB_SIZE(72, 136), UPB_SIZE(76, 144), 9, NULL); } +UPB_INLINE bool envoy_api_v2_core_HealthCheck_has_grpc_health_check(const envoy_api_v2_core_HealthCheck *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(76, 144), 11); } +UPB_INLINE const envoy_api_v2_core_HealthCheck_GrpcHealthCheck* envoy_api_v2_core_HealthCheck_grpc_health_check(const envoy_api_v2_core_HealthCheck *msg) { return UPB_READ_ONEOF(msg, const envoy_api_v2_core_HealthCheck_GrpcHealthCheck*, UPB_SIZE(72, 136), UPB_SIZE(76, 144), 11, NULL); } UPB_INLINE const struct google_protobuf_Duration* envoy_api_v2_core_HealthCheck_no_traffic_interval(const envoy_api_v2_core_HealthCheck *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_Duration*, UPB_SIZE(44, 80)); } -UPB_INLINE bool envoy_api_v2_core_HealthCheck_has_custom_health_check(const envoy_api_v2_core_HealthCheck *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(72, 136), 13); } -UPB_INLINE const envoy_api_v2_core_HealthCheck_CustomHealthCheck* envoy_api_v2_core_HealthCheck_custom_health_check(const envoy_api_v2_core_HealthCheck *msg) { return UPB_READ_ONEOF(msg, const envoy_api_v2_core_HealthCheck_CustomHealthCheck*, UPB_SIZE(68, 128), UPB_SIZE(72, 136), 13, NULL); } +UPB_INLINE bool envoy_api_v2_core_HealthCheck_has_custom_health_check(const envoy_api_v2_core_HealthCheck *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(76, 144), 13); } +UPB_INLINE const envoy_api_v2_core_HealthCheck_CustomHealthCheck* envoy_api_v2_core_HealthCheck_custom_health_check(const envoy_api_v2_core_HealthCheck *msg) { return UPB_READ_ONEOF(msg, const envoy_api_v2_core_HealthCheck_CustomHealthCheck*, UPB_SIZE(72, 136), UPB_SIZE(76, 144), 13, NULL); } UPB_INLINE const struct google_protobuf_Duration* envoy_api_v2_core_HealthCheck_unhealthy_interval(const envoy_api_v2_core_HealthCheck *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_Duration*, UPB_SIZE(48, 88)); } UPB_INLINE const struct google_protobuf_Duration* envoy_api_v2_core_HealthCheck_unhealthy_edge_interval(const envoy_api_v2_core_HealthCheck *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_Duration*, UPB_SIZE(52, 96)); } UPB_INLINE const struct google_protobuf_Duration* envoy_api_v2_core_HealthCheck_healthy_edge_interval(const envoy_api_v2_core_HealthCheck *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_Duration*, UPB_SIZE(56, 104)); } @@ -118,6 +120,7 @@ UPB_INLINE uint32_t envoy_api_v2_core_HealthCheck_interval_jitter_percent(const UPB_INLINE bool envoy_api_v2_core_HealthCheck_always_log_health_check_failures(const envoy_api_v2_core_HealthCheck *msg) { return UPB_FIELD_AT(msg, bool, UPB_SIZE(4, 4)); } UPB_INLINE const struct google_protobuf_Duration* envoy_api_v2_core_HealthCheck_initial_jitter(const envoy_api_v2_core_HealthCheck *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_Duration*, UPB_SIZE(60, 112)); } UPB_INLINE const envoy_api_v2_core_HealthCheck_TlsOptions* envoy_api_v2_core_HealthCheck_tls_options(const envoy_api_v2_core_HealthCheck *msg) { return UPB_FIELD_AT(msg, const envoy_api_v2_core_HealthCheck_TlsOptions*, UPB_SIZE(64, 120)); } +UPB_INLINE const struct envoy_api_v2_core_EventServiceConfig* envoy_api_v2_core_HealthCheck_event_service(const envoy_api_v2_core_HealthCheck *msg) { return UPB_FIELD_AT(msg, const struct envoy_api_v2_core_EventServiceConfig*, UPB_SIZE(68, 128)); } UPB_INLINE void envoy_api_v2_core_HealthCheck_set_timeout(envoy_api_v2_core_HealthCheck *msg, struct google_protobuf_Duration* value) { UPB_FIELD_AT(msg, struct google_protobuf_Duration*, UPB_SIZE(16, 24)) = value; @@ -204,7 +207,7 @@ UPB_INLINE struct google_protobuf_BoolValue* envoy_api_v2_core_HealthCheck_mutab return sub; } UPB_INLINE void envoy_api_v2_core_HealthCheck_set_http_health_check(envoy_api_v2_core_HealthCheck *msg, envoy_api_v2_core_HealthCheck_HttpHealthCheck* value) { - UPB_WRITE_ONEOF(msg, envoy_api_v2_core_HealthCheck_HttpHealthCheck*, UPB_SIZE(68, 128), value, UPB_SIZE(72, 136), 8); + UPB_WRITE_ONEOF(msg, envoy_api_v2_core_HealthCheck_HttpHealthCheck*, UPB_SIZE(72, 136), value, UPB_SIZE(76, 144), 8); } UPB_INLINE struct envoy_api_v2_core_HealthCheck_HttpHealthCheck* envoy_api_v2_core_HealthCheck_mutable_http_health_check(envoy_api_v2_core_HealthCheck *msg, upb_arena *arena) { struct envoy_api_v2_core_HealthCheck_HttpHealthCheck* sub = (struct envoy_api_v2_core_HealthCheck_HttpHealthCheck*)envoy_api_v2_core_HealthCheck_http_health_check(msg); @@ -216,7 +219,7 @@ UPB_INLINE struct envoy_api_v2_core_HealthCheck_HttpHealthCheck* envoy_api_v2_co return sub; } UPB_INLINE void envoy_api_v2_core_HealthCheck_set_tcp_health_check(envoy_api_v2_core_HealthCheck *msg, envoy_api_v2_core_HealthCheck_TcpHealthCheck* value) { - UPB_WRITE_ONEOF(msg, envoy_api_v2_core_HealthCheck_TcpHealthCheck*, UPB_SIZE(68, 128), value, UPB_SIZE(72, 136), 9); + UPB_WRITE_ONEOF(msg, envoy_api_v2_core_HealthCheck_TcpHealthCheck*, UPB_SIZE(72, 136), value, UPB_SIZE(76, 144), 9); } UPB_INLINE struct envoy_api_v2_core_HealthCheck_TcpHealthCheck* envoy_api_v2_core_HealthCheck_mutable_tcp_health_check(envoy_api_v2_core_HealthCheck *msg, upb_arena *arena) { struct envoy_api_v2_core_HealthCheck_TcpHealthCheck* sub = (struct envoy_api_v2_core_HealthCheck_TcpHealthCheck*)envoy_api_v2_core_HealthCheck_tcp_health_check(msg); @@ -228,7 +231,7 @@ UPB_INLINE struct envoy_api_v2_core_HealthCheck_TcpHealthCheck* envoy_api_v2_cor return sub; } UPB_INLINE void envoy_api_v2_core_HealthCheck_set_grpc_health_check(envoy_api_v2_core_HealthCheck *msg, envoy_api_v2_core_HealthCheck_GrpcHealthCheck* value) { - UPB_WRITE_ONEOF(msg, envoy_api_v2_core_HealthCheck_GrpcHealthCheck*, UPB_SIZE(68, 128), value, UPB_SIZE(72, 136), 11); + UPB_WRITE_ONEOF(msg, envoy_api_v2_core_HealthCheck_GrpcHealthCheck*, UPB_SIZE(72, 136), value, UPB_SIZE(76, 144), 11); } UPB_INLINE struct envoy_api_v2_core_HealthCheck_GrpcHealthCheck* envoy_api_v2_core_HealthCheck_mutable_grpc_health_check(envoy_api_v2_core_HealthCheck *msg, upb_arena *arena) { struct envoy_api_v2_core_HealthCheck_GrpcHealthCheck* sub = (struct envoy_api_v2_core_HealthCheck_GrpcHealthCheck*)envoy_api_v2_core_HealthCheck_grpc_health_check(msg); @@ -252,7 +255,7 @@ UPB_INLINE struct google_protobuf_Duration* envoy_api_v2_core_HealthCheck_mutabl return sub; } UPB_INLINE void envoy_api_v2_core_HealthCheck_set_custom_health_check(envoy_api_v2_core_HealthCheck *msg, envoy_api_v2_core_HealthCheck_CustomHealthCheck* value) { - UPB_WRITE_ONEOF(msg, envoy_api_v2_core_HealthCheck_CustomHealthCheck*, UPB_SIZE(68, 128), value, UPB_SIZE(72, 136), 13); + UPB_WRITE_ONEOF(msg, envoy_api_v2_core_HealthCheck_CustomHealthCheck*, UPB_SIZE(72, 136), value, UPB_SIZE(76, 144), 13); } UPB_INLINE struct envoy_api_v2_core_HealthCheck_CustomHealthCheck* envoy_api_v2_core_HealthCheck_mutable_custom_health_check(envoy_api_v2_core_HealthCheck *msg, upb_arena *arena) { struct envoy_api_v2_core_HealthCheck_CustomHealthCheck* sub = (struct envoy_api_v2_core_HealthCheck_CustomHealthCheck*)envoy_api_v2_core_HealthCheck_custom_health_check(msg); @@ -332,6 +335,18 @@ UPB_INLINE struct envoy_api_v2_core_HealthCheck_TlsOptions* envoy_api_v2_core_He } return sub; } +UPB_INLINE void envoy_api_v2_core_HealthCheck_set_event_service(envoy_api_v2_core_HealthCheck *msg, struct envoy_api_v2_core_EventServiceConfig* value) { + UPB_FIELD_AT(msg, struct envoy_api_v2_core_EventServiceConfig*, UPB_SIZE(68, 128)) = value; +} +UPB_INLINE struct envoy_api_v2_core_EventServiceConfig* envoy_api_v2_core_HealthCheck_mutable_event_service(envoy_api_v2_core_HealthCheck *msg, upb_arena *arena) { + struct envoy_api_v2_core_EventServiceConfig* sub = (struct envoy_api_v2_core_EventServiceConfig*)envoy_api_v2_core_HealthCheck_event_service(msg); + if (sub == NULL) { + sub = (struct envoy_api_v2_core_EventServiceConfig*)upb_msg_new(&envoy_api_v2_core_EventServiceConfig_msginit, arena); + if (!sub) return NULL; + envoy_api_v2_core_HealthCheck_set_event_service(msg, sub); + } + return sub; +} /* envoy.api.v2.core.HealthCheck.Payload */ diff --git a/src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.c b/src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.c index 4bd6c617e8e..34e945c39f9 100644 --- a/src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.c +++ b/src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.c @@ -11,6 +11,7 @@ #include "envoy/api/v2/core/http_uri.upb.h" #include "google/protobuf/duration.upb.h" #include "udpa/annotations/migrate.upb.h" +#include "udpa/annotations/status.upb.h" #include "validate/validate.upb.h" #include "upb/port_def.inc" diff --git a/src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c b/src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c index 982229903a1..07d783c2b58 100644 --- a/src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c +++ b/src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c @@ -12,6 +12,7 @@ #include "google/protobuf/duration.upb.h" #include "google/protobuf/wrappers.upb.h" #include "udpa/annotations/migrate.upb.h" +#include "udpa/annotations/status.upb.h" #include "validate/validate.upb.h" #include "upb/port_def.inc" @@ -33,21 +34,23 @@ const upb_msglayout envoy_api_v2_core_UpstreamHttpProtocolOptions_msginit = { UPB_SIZE(2, 2), 2, false, }; -static const upb_msglayout *const envoy_api_v2_core_HttpProtocolOptions_submsgs[3] = { +static const upb_msglayout *const envoy_api_v2_core_HttpProtocolOptions_submsgs[4] = { &google_protobuf_Duration_msginit, &google_protobuf_UInt32Value_msginit, }; -static const upb_msglayout_field envoy_api_v2_core_HttpProtocolOptions__fields[3] = { - {1, UPB_SIZE(0, 0), 0, 0, 11, 1}, - {2, UPB_SIZE(4, 8), 0, 1, 11, 1}, - {3, UPB_SIZE(8, 16), 0, 0, 11, 1}, +static const upb_msglayout_field envoy_api_v2_core_HttpProtocolOptions__fields[5] = { + {1, UPB_SIZE(8, 8), 0, 0, 11, 1}, + {2, UPB_SIZE(12, 16), 0, 1, 11, 1}, + {3, UPB_SIZE(16, 24), 0, 0, 11, 1}, + {4, UPB_SIZE(20, 32), 0, 0, 11, 1}, + {5, UPB_SIZE(0, 0), 0, 0, 14, 1}, }; const upb_msglayout envoy_api_v2_core_HttpProtocolOptions_msginit = { &envoy_api_v2_core_HttpProtocolOptions_submsgs[0], &envoy_api_v2_core_HttpProtocolOptions__fields[0], - UPB_SIZE(12, 24), 3, false, + UPB_SIZE(24, 40), 5, false, }; static const upb_msglayout *const envoy_api_v2_core_Http1ProtocolOptions_submsgs[2] = { @@ -89,29 +92,46 @@ const upb_msglayout envoy_api_v2_core_Http1ProtocolOptions_HeaderKeyFormat_Prope UPB_SIZE(0, 0), 0, false, }; -static const upb_msglayout *const envoy_api_v2_core_Http2ProtocolOptions_submsgs[9] = { +static const upb_msglayout *const envoy_api_v2_core_Http2ProtocolOptions_submsgs[10] = { + &envoy_api_v2_core_Http2ProtocolOptions_SettingsParameter_msginit, &google_protobuf_UInt32Value_msginit, }; -static const upb_msglayout_field envoy_api_v2_core_Http2ProtocolOptions__fields[12] = { - {1, UPB_SIZE(4, 8), 0, 0, 11, 1}, - {2, UPB_SIZE(8, 16), 0, 0, 11, 1}, - {3, UPB_SIZE(12, 24), 0, 0, 11, 1}, - {4, UPB_SIZE(16, 32), 0, 0, 11, 1}, +static const upb_msglayout_field envoy_api_v2_core_Http2ProtocolOptions__fields[13] = { + {1, UPB_SIZE(4, 8), 0, 1, 11, 1}, + {2, UPB_SIZE(8, 16), 0, 1, 11, 1}, + {3, UPB_SIZE(12, 24), 0, 1, 11, 1}, + {4, UPB_SIZE(16, 32), 0, 1, 11, 1}, {5, UPB_SIZE(0, 0), 0, 0, 8, 1}, {6, UPB_SIZE(1, 1), 0, 0, 8, 1}, - {7, UPB_SIZE(20, 40), 0, 0, 11, 1}, - {8, UPB_SIZE(24, 48), 0, 0, 11, 1}, - {9, UPB_SIZE(28, 56), 0, 0, 11, 1}, - {10, UPB_SIZE(32, 64), 0, 0, 11, 1}, - {11, UPB_SIZE(36, 72), 0, 0, 11, 1}, + {7, UPB_SIZE(20, 40), 0, 1, 11, 1}, + {8, UPB_SIZE(24, 48), 0, 1, 11, 1}, + {9, UPB_SIZE(28, 56), 0, 1, 11, 1}, + {10, UPB_SIZE(32, 64), 0, 1, 11, 1}, + {11, UPB_SIZE(36, 72), 0, 1, 11, 1}, {12, UPB_SIZE(2, 2), 0, 0, 8, 1}, + {13, UPB_SIZE(40, 80), 0, 0, 11, 3}, }; const upb_msglayout envoy_api_v2_core_Http2ProtocolOptions_msginit = { &envoy_api_v2_core_Http2ProtocolOptions_submsgs[0], &envoy_api_v2_core_Http2ProtocolOptions__fields[0], - UPB_SIZE(40, 80), 12, false, + UPB_SIZE(44, 88), 13, false, +}; + +static const upb_msglayout *const envoy_api_v2_core_Http2ProtocolOptions_SettingsParameter_submsgs[2] = { + &google_protobuf_UInt32Value_msginit, +}; + +static const upb_msglayout_field envoy_api_v2_core_Http2ProtocolOptions_SettingsParameter__fields[2] = { + {1, UPB_SIZE(0, 0), 0, 0, 11, 1}, + {2, UPB_SIZE(4, 8), 0, 0, 11, 1}, +}; + +const upb_msglayout envoy_api_v2_core_Http2ProtocolOptions_SettingsParameter_msginit = { + &envoy_api_v2_core_Http2ProtocolOptions_SettingsParameter_submsgs[0], + &envoy_api_v2_core_Http2ProtocolOptions_SettingsParameter__fields[0], + UPB_SIZE(8, 16), 2, false, }; static const upb_msglayout *const envoy_api_v2_core_GrpcProtocolOptions_submsgs[1] = { diff --git a/src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h b/src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h index 0cdebc67d47..075adcb608f 100644 --- a/src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h +++ b/src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h @@ -27,6 +27,7 @@ struct envoy_api_v2_core_Http1ProtocolOptions; struct envoy_api_v2_core_Http1ProtocolOptions_HeaderKeyFormat; struct envoy_api_v2_core_Http1ProtocolOptions_HeaderKeyFormat_ProperCaseWords; struct envoy_api_v2_core_Http2ProtocolOptions; +struct envoy_api_v2_core_Http2ProtocolOptions_SettingsParameter; struct envoy_api_v2_core_GrpcProtocolOptions; typedef struct envoy_api_v2_core_TcpProtocolOptions envoy_api_v2_core_TcpProtocolOptions; typedef struct envoy_api_v2_core_UpstreamHttpProtocolOptions envoy_api_v2_core_UpstreamHttpProtocolOptions; @@ -35,6 +36,7 @@ typedef struct envoy_api_v2_core_Http1ProtocolOptions envoy_api_v2_core_Http1Pro typedef struct envoy_api_v2_core_Http1ProtocolOptions_HeaderKeyFormat envoy_api_v2_core_Http1ProtocolOptions_HeaderKeyFormat; typedef struct envoy_api_v2_core_Http1ProtocolOptions_HeaderKeyFormat_ProperCaseWords envoy_api_v2_core_Http1ProtocolOptions_HeaderKeyFormat_ProperCaseWords; typedef struct envoy_api_v2_core_Http2ProtocolOptions envoy_api_v2_core_Http2ProtocolOptions; +typedef struct envoy_api_v2_core_Http2ProtocolOptions_SettingsParameter envoy_api_v2_core_Http2ProtocolOptions_SettingsParameter; typedef struct envoy_api_v2_core_GrpcProtocolOptions envoy_api_v2_core_GrpcProtocolOptions; extern const upb_msglayout envoy_api_v2_core_TcpProtocolOptions_msginit; extern const upb_msglayout envoy_api_v2_core_UpstreamHttpProtocolOptions_msginit; @@ -43,6 +45,7 @@ extern const upb_msglayout envoy_api_v2_core_Http1ProtocolOptions_msginit; extern const upb_msglayout envoy_api_v2_core_Http1ProtocolOptions_HeaderKeyFormat_msginit; extern const upb_msglayout envoy_api_v2_core_Http1ProtocolOptions_HeaderKeyFormat_ProperCaseWords_msginit; extern const upb_msglayout envoy_api_v2_core_Http2ProtocolOptions_msginit; +extern const upb_msglayout envoy_api_v2_core_Http2ProtocolOptions_SettingsParameter_msginit; extern const upb_msglayout envoy_api_v2_core_GrpcProtocolOptions_msginit; struct google_protobuf_BoolValue; struct google_protobuf_Duration; @@ -51,6 +54,12 @@ extern const upb_msglayout google_protobuf_BoolValue_msginit; extern const upb_msglayout google_protobuf_Duration_msginit; extern const upb_msglayout google_protobuf_UInt32Value_msginit; +typedef enum { + envoy_api_v2_core_HttpProtocolOptions_ALLOW = 0, + envoy_api_v2_core_HttpProtocolOptions_REJECT_REQUEST = 1, + envoy_api_v2_core_HttpProtocolOptions_DROP_HEADER = 2 +} envoy_api_v2_core_HttpProtocolOptions_HeadersWithUnderscoresAction; + /* envoy.api.v2.core.TcpProtocolOptions */ @@ -106,12 +115,14 @@ UPB_INLINE char *envoy_api_v2_core_HttpProtocolOptions_serialize(const envoy_api return upb_encode(msg, &envoy_api_v2_core_HttpProtocolOptions_msginit, arena, len); } -UPB_INLINE const struct google_protobuf_Duration* envoy_api_v2_core_HttpProtocolOptions_idle_timeout(const envoy_api_v2_core_HttpProtocolOptions *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_Duration*, UPB_SIZE(0, 0)); } -UPB_INLINE const struct google_protobuf_UInt32Value* envoy_api_v2_core_HttpProtocolOptions_max_headers_count(const envoy_api_v2_core_HttpProtocolOptions *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_UInt32Value*, UPB_SIZE(4, 8)); } -UPB_INLINE const struct google_protobuf_Duration* envoy_api_v2_core_HttpProtocolOptions_max_connection_duration(const envoy_api_v2_core_HttpProtocolOptions *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_Duration*, UPB_SIZE(8, 16)); } +UPB_INLINE const struct google_protobuf_Duration* envoy_api_v2_core_HttpProtocolOptions_idle_timeout(const envoy_api_v2_core_HttpProtocolOptions *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_Duration*, UPB_SIZE(8, 8)); } +UPB_INLINE const struct google_protobuf_UInt32Value* envoy_api_v2_core_HttpProtocolOptions_max_headers_count(const envoy_api_v2_core_HttpProtocolOptions *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_UInt32Value*, UPB_SIZE(12, 16)); } +UPB_INLINE const struct google_protobuf_Duration* envoy_api_v2_core_HttpProtocolOptions_max_connection_duration(const envoy_api_v2_core_HttpProtocolOptions *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_Duration*, UPB_SIZE(16, 24)); } +UPB_INLINE const struct google_protobuf_Duration* envoy_api_v2_core_HttpProtocolOptions_max_stream_duration(const envoy_api_v2_core_HttpProtocolOptions *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_Duration*, UPB_SIZE(20, 32)); } +UPB_INLINE int32_t envoy_api_v2_core_HttpProtocolOptions_headers_with_underscores_action(const envoy_api_v2_core_HttpProtocolOptions *msg) { return UPB_FIELD_AT(msg, int32_t, UPB_SIZE(0, 0)); } UPB_INLINE void envoy_api_v2_core_HttpProtocolOptions_set_idle_timeout(envoy_api_v2_core_HttpProtocolOptions *msg, struct google_protobuf_Duration* value) { - UPB_FIELD_AT(msg, struct google_protobuf_Duration*, UPB_SIZE(0, 0)) = value; + UPB_FIELD_AT(msg, struct google_protobuf_Duration*, UPB_SIZE(8, 8)) = value; } UPB_INLINE struct google_protobuf_Duration* envoy_api_v2_core_HttpProtocolOptions_mutable_idle_timeout(envoy_api_v2_core_HttpProtocolOptions *msg, upb_arena *arena) { struct google_protobuf_Duration* sub = (struct google_protobuf_Duration*)envoy_api_v2_core_HttpProtocolOptions_idle_timeout(msg); @@ -123,7 +134,7 @@ UPB_INLINE struct google_protobuf_Duration* envoy_api_v2_core_HttpProtocolOption return sub; } UPB_INLINE void envoy_api_v2_core_HttpProtocolOptions_set_max_headers_count(envoy_api_v2_core_HttpProtocolOptions *msg, struct google_protobuf_UInt32Value* value) { - UPB_FIELD_AT(msg, struct google_protobuf_UInt32Value*, UPB_SIZE(4, 8)) = value; + UPB_FIELD_AT(msg, struct google_protobuf_UInt32Value*, UPB_SIZE(12, 16)) = value; } UPB_INLINE struct google_protobuf_UInt32Value* envoy_api_v2_core_HttpProtocolOptions_mutable_max_headers_count(envoy_api_v2_core_HttpProtocolOptions *msg, upb_arena *arena) { struct google_protobuf_UInt32Value* sub = (struct google_protobuf_UInt32Value*)envoy_api_v2_core_HttpProtocolOptions_max_headers_count(msg); @@ -135,7 +146,7 @@ UPB_INLINE struct google_protobuf_UInt32Value* envoy_api_v2_core_HttpProtocolOpt return sub; } UPB_INLINE void envoy_api_v2_core_HttpProtocolOptions_set_max_connection_duration(envoy_api_v2_core_HttpProtocolOptions *msg, struct google_protobuf_Duration* value) { - UPB_FIELD_AT(msg, struct google_protobuf_Duration*, UPB_SIZE(8, 16)) = value; + UPB_FIELD_AT(msg, struct google_protobuf_Duration*, UPB_SIZE(16, 24)) = value; } UPB_INLINE struct google_protobuf_Duration* envoy_api_v2_core_HttpProtocolOptions_mutable_max_connection_duration(envoy_api_v2_core_HttpProtocolOptions *msg, upb_arena *arena) { struct google_protobuf_Duration* sub = (struct google_protobuf_Duration*)envoy_api_v2_core_HttpProtocolOptions_max_connection_duration(msg); @@ -146,6 +157,21 @@ UPB_INLINE struct google_protobuf_Duration* envoy_api_v2_core_HttpProtocolOption } return sub; } +UPB_INLINE void envoy_api_v2_core_HttpProtocolOptions_set_max_stream_duration(envoy_api_v2_core_HttpProtocolOptions *msg, struct google_protobuf_Duration* value) { + UPB_FIELD_AT(msg, struct google_protobuf_Duration*, UPB_SIZE(20, 32)) = value; +} +UPB_INLINE struct google_protobuf_Duration* envoy_api_v2_core_HttpProtocolOptions_mutable_max_stream_duration(envoy_api_v2_core_HttpProtocolOptions *msg, upb_arena *arena) { + struct google_protobuf_Duration* sub = (struct google_protobuf_Duration*)envoy_api_v2_core_HttpProtocolOptions_max_stream_duration(msg); + if (sub == NULL) { + sub = (struct google_protobuf_Duration*)upb_msg_new(&google_protobuf_Duration_msginit, arena); + if (!sub) return NULL; + envoy_api_v2_core_HttpProtocolOptions_set_max_stream_duration(msg, sub); + } + return sub; +} +UPB_INLINE void envoy_api_v2_core_HttpProtocolOptions_set_headers_with_underscores_action(envoy_api_v2_core_HttpProtocolOptions *msg, int32_t value) { + UPB_FIELD_AT(msg, int32_t, UPB_SIZE(0, 0)) = value; +} /* envoy.api.v2.core.Http1ProtocolOptions */ @@ -279,6 +305,7 @@ UPB_INLINE const struct google_protobuf_UInt32Value* envoy_api_v2_core_Http2Prot UPB_INLINE const struct google_protobuf_UInt32Value* envoy_api_v2_core_Http2ProtocolOptions_max_inbound_priority_frames_per_stream(const envoy_api_v2_core_Http2ProtocolOptions *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_UInt32Value*, UPB_SIZE(32, 64)); } UPB_INLINE const struct google_protobuf_UInt32Value* envoy_api_v2_core_Http2ProtocolOptions_max_inbound_window_update_frames_per_data_frame_sent(const envoy_api_v2_core_Http2ProtocolOptions *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_UInt32Value*, UPB_SIZE(36, 72)); } UPB_INLINE bool envoy_api_v2_core_Http2ProtocolOptions_stream_error_on_invalid_http_messaging(const envoy_api_v2_core_Http2ProtocolOptions *msg) { return UPB_FIELD_AT(msg, bool, UPB_SIZE(2, 2)); } +UPB_INLINE const envoy_api_v2_core_Http2ProtocolOptions_SettingsParameter* const* envoy_api_v2_core_Http2ProtocolOptions_custom_settings_parameters(const envoy_api_v2_core_Http2ProtocolOptions *msg, size_t *len) { return (const envoy_api_v2_core_Http2ProtocolOptions_SettingsParameter* const*)_upb_array_accessor(msg, UPB_SIZE(40, 80), len); } UPB_INLINE void envoy_api_v2_core_Http2ProtocolOptions_set_hpack_table_size(envoy_api_v2_core_Http2ProtocolOptions *msg, struct google_protobuf_UInt32Value* value) { UPB_FIELD_AT(msg, struct google_protobuf_UInt32Value*, UPB_SIZE(4, 8)) = value; @@ -397,6 +424,61 @@ UPB_INLINE struct google_protobuf_UInt32Value* envoy_api_v2_core_Http2ProtocolOp UPB_INLINE void envoy_api_v2_core_Http2ProtocolOptions_set_stream_error_on_invalid_http_messaging(envoy_api_v2_core_Http2ProtocolOptions *msg, bool value) { UPB_FIELD_AT(msg, bool, UPB_SIZE(2, 2)) = value; } +UPB_INLINE envoy_api_v2_core_Http2ProtocolOptions_SettingsParameter** envoy_api_v2_core_Http2ProtocolOptions_mutable_custom_settings_parameters(envoy_api_v2_core_Http2ProtocolOptions *msg, size_t *len) { + return (envoy_api_v2_core_Http2ProtocolOptions_SettingsParameter**)_upb_array_mutable_accessor(msg, UPB_SIZE(40, 80), len); +} +UPB_INLINE envoy_api_v2_core_Http2ProtocolOptions_SettingsParameter** envoy_api_v2_core_Http2ProtocolOptions_resize_custom_settings_parameters(envoy_api_v2_core_Http2ProtocolOptions *msg, size_t len, upb_arena *arena) { + return (envoy_api_v2_core_Http2ProtocolOptions_SettingsParameter**)_upb_array_resize_accessor(msg, UPB_SIZE(40, 80), len, UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, arena); +} +UPB_INLINE struct envoy_api_v2_core_Http2ProtocolOptions_SettingsParameter* envoy_api_v2_core_Http2ProtocolOptions_add_custom_settings_parameters(envoy_api_v2_core_Http2ProtocolOptions *msg, upb_arena *arena) { + struct envoy_api_v2_core_Http2ProtocolOptions_SettingsParameter* sub = (struct envoy_api_v2_core_Http2ProtocolOptions_SettingsParameter*)upb_msg_new(&envoy_api_v2_core_Http2ProtocolOptions_SettingsParameter_msginit, arena); + bool ok = _upb_array_append_accessor( + msg, UPB_SIZE(40, 80), UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, &sub, arena); + if (!ok) return NULL; + return sub; +} + +/* envoy.api.v2.core.Http2ProtocolOptions.SettingsParameter */ + +UPB_INLINE envoy_api_v2_core_Http2ProtocolOptions_SettingsParameter *envoy_api_v2_core_Http2ProtocolOptions_SettingsParameter_new(upb_arena *arena) { + return (envoy_api_v2_core_Http2ProtocolOptions_SettingsParameter *)upb_msg_new(&envoy_api_v2_core_Http2ProtocolOptions_SettingsParameter_msginit, arena); +} +UPB_INLINE envoy_api_v2_core_Http2ProtocolOptions_SettingsParameter *envoy_api_v2_core_Http2ProtocolOptions_SettingsParameter_parse(const char *buf, size_t size, + upb_arena *arena) { + envoy_api_v2_core_Http2ProtocolOptions_SettingsParameter *ret = envoy_api_v2_core_Http2ProtocolOptions_SettingsParameter_new(arena); + return (ret && upb_decode(buf, size, ret, &envoy_api_v2_core_Http2ProtocolOptions_SettingsParameter_msginit, arena)) ? ret : NULL; +} +UPB_INLINE char *envoy_api_v2_core_Http2ProtocolOptions_SettingsParameter_serialize(const envoy_api_v2_core_Http2ProtocolOptions_SettingsParameter *msg, upb_arena *arena, size_t *len) { + return upb_encode(msg, &envoy_api_v2_core_Http2ProtocolOptions_SettingsParameter_msginit, arena, len); +} + +UPB_INLINE const struct google_protobuf_UInt32Value* envoy_api_v2_core_Http2ProtocolOptions_SettingsParameter_identifier(const envoy_api_v2_core_Http2ProtocolOptions_SettingsParameter *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_UInt32Value*, UPB_SIZE(0, 0)); } +UPB_INLINE const struct google_protobuf_UInt32Value* envoy_api_v2_core_Http2ProtocolOptions_SettingsParameter_value(const envoy_api_v2_core_Http2ProtocolOptions_SettingsParameter *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_UInt32Value*, UPB_SIZE(4, 8)); } + +UPB_INLINE void envoy_api_v2_core_Http2ProtocolOptions_SettingsParameter_set_identifier(envoy_api_v2_core_Http2ProtocolOptions_SettingsParameter *msg, struct google_protobuf_UInt32Value* value) { + UPB_FIELD_AT(msg, struct google_protobuf_UInt32Value*, UPB_SIZE(0, 0)) = value; +} +UPB_INLINE struct google_protobuf_UInt32Value* envoy_api_v2_core_Http2ProtocolOptions_SettingsParameter_mutable_identifier(envoy_api_v2_core_Http2ProtocolOptions_SettingsParameter *msg, upb_arena *arena) { + struct google_protobuf_UInt32Value* sub = (struct google_protobuf_UInt32Value*)envoy_api_v2_core_Http2ProtocolOptions_SettingsParameter_identifier(msg); + if (sub == NULL) { + sub = (struct google_protobuf_UInt32Value*)upb_msg_new(&google_protobuf_UInt32Value_msginit, arena); + if (!sub) return NULL; + envoy_api_v2_core_Http2ProtocolOptions_SettingsParameter_set_identifier(msg, sub); + } + return sub; +} +UPB_INLINE void envoy_api_v2_core_Http2ProtocolOptions_SettingsParameter_set_value(envoy_api_v2_core_Http2ProtocolOptions_SettingsParameter *msg, struct google_protobuf_UInt32Value* value) { + UPB_FIELD_AT(msg, struct google_protobuf_UInt32Value*, UPB_SIZE(4, 8)) = value; +} +UPB_INLINE struct google_protobuf_UInt32Value* envoy_api_v2_core_Http2ProtocolOptions_SettingsParameter_mutable_value(envoy_api_v2_core_Http2ProtocolOptions_SettingsParameter *msg, upb_arena *arena) { + struct google_protobuf_UInt32Value* sub = (struct google_protobuf_UInt32Value*)envoy_api_v2_core_Http2ProtocolOptions_SettingsParameter_value(msg); + if (sub == NULL) { + sub = (struct google_protobuf_UInt32Value*)upb_msg_new(&google_protobuf_UInt32Value_msginit, arena); + if (!sub) return NULL; + envoy_api_v2_core_Http2ProtocolOptions_SettingsParameter_set_value(msg, sub); + } + return sub; +} /* envoy.api.v2.core.GrpcProtocolOptions */ diff --git a/src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.c b/src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.c new file mode 100644 index 00000000000..85c7167ea57 --- /dev/null +++ b/src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.c @@ -0,0 +1,34 @@ +/* This file was generated by upbc (the upb compiler) from the input + * file: + * + * envoy/api/v2/core/socket_option.proto + * + * Do not edit -- your changes will be discarded when the file is + * regenerated. */ + +#include +#include "upb/msg.h" +#include "envoy/api/v2/core/socket_option.upb.h" +#include "udpa/annotations/migrate.upb.h" +#include "udpa/annotations/status.upb.h" +#include "validate/validate.upb.h" + +#include "upb/port_def.inc" + +static const upb_msglayout_field envoy_api_v2_core_SocketOption__fields[6] = { + {1, UPB_SIZE(24, 24), 0, 0, 9, 1}, + {2, UPB_SIZE(0, 0), 0, 0, 3, 1}, + {3, UPB_SIZE(8, 8), 0, 0, 3, 1}, + {4, UPB_SIZE(32, 40), UPB_SIZE(-41, -57), 0, 3, 1}, + {5, UPB_SIZE(32, 40), UPB_SIZE(-41, -57), 0, 12, 1}, + {6, UPB_SIZE(16, 16), 0, 0, 14, 1}, +}; + +const upb_msglayout envoy_api_v2_core_SocketOption_msginit = { + NULL, + &envoy_api_v2_core_SocketOption__fields[0], + UPB_SIZE(48, 64), 6, false, +}; + +#include "upb/port_undef.inc" + diff --git a/src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.h b/src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.h new file mode 100644 index 00000000000..6c4ee2e995a --- /dev/null +++ b/src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.h @@ -0,0 +1,89 @@ +/* This file was generated by upbc (the upb compiler) from the input + * file: + * + * envoy/api/v2/core/socket_option.proto + * + * Do not edit -- your changes will be discarded when the file is + * regenerated. */ + +#ifndef ENVOY_API_V2_CORE_SOCKET_OPTION_PROTO_UPB_H_ +#define ENVOY_API_V2_CORE_SOCKET_OPTION_PROTO_UPB_H_ + +#include "upb/generated_util.h" +#include "upb/msg.h" +#include "upb/decode.h" +#include "upb/encode.h" + +#include "upb/port_def.inc" + +#ifdef __cplusplus +extern "C" { +#endif + +struct envoy_api_v2_core_SocketOption; +typedef struct envoy_api_v2_core_SocketOption envoy_api_v2_core_SocketOption; +extern const upb_msglayout envoy_api_v2_core_SocketOption_msginit; + +typedef enum { + envoy_api_v2_core_SocketOption_STATE_PREBIND = 0, + envoy_api_v2_core_SocketOption_STATE_BOUND = 1, + envoy_api_v2_core_SocketOption_STATE_LISTENING = 2 +} envoy_api_v2_core_SocketOption_SocketState; + + +/* envoy.api.v2.core.SocketOption */ + +UPB_INLINE envoy_api_v2_core_SocketOption *envoy_api_v2_core_SocketOption_new(upb_arena *arena) { + return (envoy_api_v2_core_SocketOption *)upb_msg_new(&envoy_api_v2_core_SocketOption_msginit, arena); +} +UPB_INLINE envoy_api_v2_core_SocketOption *envoy_api_v2_core_SocketOption_parse(const char *buf, size_t size, + upb_arena *arena) { + envoy_api_v2_core_SocketOption *ret = envoy_api_v2_core_SocketOption_new(arena); + return (ret && upb_decode(buf, size, ret, &envoy_api_v2_core_SocketOption_msginit, arena)) ? ret : NULL; +} +UPB_INLINE char *envoy_api_v2_core_SocketOption_serialize(const envoy_api_v2_core_SocketOption *msg, upb_arena *arena, size_t *len) { + return upb_encode(msg, &envoy_api_v2_core_SocketOption_msginit, arena, len); +} + +typedef enum { + envoy_api_v2_core_SocketOption_value_int_value = 4, + envoy_api_v2_core_SocketOption_value_buf_value = 5, + envoy_api_v2_core_SocketOption_value_NOT_SET = 0 +} envoy_api_v2_core_SocketOption_value_oneofcases; +UPB_INLINE envoy_api_v2_core_SocketOption_value_oneofcases envoy_api_v2_core_SocketOption_value_case(const envoy_api_v2_core_SocketOption* msg) { return (envoy_api_v2_core_SocketOption_value_oneofcases)UPB_FIELD_AT(msg, int32_t, UPB_SIZE(40, 56)); } + +UPB_INLINE upb_strview envoy_api_v2_core_SocketOption_description(const envoy_api_v2_core_SocketOption *msg) { return UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(24, 24)); } +UPB_INLINE int64_t envoy_api_v2_core_SocketOption_level(const envoy_api_v2_core_SocketOption *msg) { return UPB_FIELD_AT(msg, int64_t, UPB_SIZE(0, 0)); } +UPB_INLINE int64_t envoy_api_v2_core_SocketOption_name(const envoy_api_v2_core_SocketOption *msg) { return UPB_FIELD_AT(msg, int64_t, UPB_SIZE(8, 8)); } +UPB_INLINE bool envoy_api_v2_core_SocketOption_has_int_value(const envoy_api_v2_core_SocketOption *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(40, 56), 4); } +UPB_INLINE int64_t envoy_api_v2_core_SocketOption_int_value(const envoy_api_v2_core_SocketOption *msg) { return UPB_READ_ONEOF(msg, int64_t, UPB_SIZE(32, 40), UPB_SIZE(40, 56), 4, 0); } +UPB_INLINE bool envoy_api_v2_core_SocketOption_has_buf_value(const envoy_api_v2_core_SocketOption *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(40, 56), 5); } +UPB_INLINE upb_strview envoy_api_v2_core_SocketOption_buf_value(const envoy_api_v2_core_SocketOption *msg) { return UPB_READ_ONEOF(msg, upb_strview, UPB_SIZE(32, 40), UPB_SIZE(40, 56), 5, upb_strview_make("", strlen(""))); } +UPB_INLINE int32_t envoy_api_v2_core_SocketOption_state(const envoy_api_v2_core_SocketOption *msg) { return UPB_FIELD_AT(msg, int32_t, UPB_SIZE(16, 16)); } + +UPB_INLINE void envoy_api_v2_core_SocketOption_set_description(envoy_api_v2_core_SocketOption *msg, upb_strview value) { + UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(24, 24)) = value; +} +UPB_INLINE void envoy_api_v2_core_SocketOption_set_level(envoy_api_v2_core_SocketOption *msg, int64_t value) { + UPB_FIELD_AT(msg, int64_t, UPB_SIZE(0, 0)) = value; +} +UPB_INLINE void envoy_api_v2_core_SocketOption_set_name(envoy_api_v2_core_SocketOption *msg, int64_t value) { + UPB_FIELD_AT(msg, int64_t, UPB_SIZE(8, 8)) = value; +} +UPB_INLINE void envoy_api_v2_core_SocketOption_set_int_value(envoy_api_v2_core_SocketOption *msg, int64_t value) { + UPB_WRITE_ONEOF(msg, int64_t, UPB_SIZE(32, 40), value, UPB_SIZE(40, 56), 4); +} +UPB_INLINE void envoy_api_v2_core_SocketOption_set_buf_value(envoy_api_v2_core_SocketOption *msg, upb_strview value) { + UPB_WRITE_ONEOF(msg, upb_strview, UPB_SIZE(32, 40), value, UPB_SIZE(40, 56), 5); +} +UPB_INLINE void envoy_api_v2_core_SocketOption_set_state(envoy_api_v2_core_SocketOption *msg, int32_t value) { + UPB_FIELD_AT(msg, int32_t, UPB_SIZE(16, 16)) = value; +} + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#include "upb/port_undef.inc" + +#endif /* ENVOY_API_V2_CORE_SOCKET_OPTION_PROTO_UPB_H_ */ diff --git a/src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c b/src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c index eaf14b38b69..0f80f724ab6 100644 --- a/src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c +++ b/src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c @@ -13,6 +13,7 @@ #include "google/protobuf/any.upb.h" #include "google/rpc/status.upb.h" #include "udpa/annotations/migrate.upb.h" +#include "udpa/annotations/status.upb.h" #include "upb/port_def.inc" diff --git a/src/core/ext/upb-generated/envoy/api/v2/eds.upb.c b/src/core/ext/upb-generated/envoy/api/v2/eds.upb.c index f68881a5f54..74de7ab91db 100644 --- a/src/core/ext/upb-generated/envoy/api/v2/eds.upb.c +++ b/src/core/ext/upb-generated/envoy/api/v2/eds.upb.c @@ -15,6 +15,7 @@ #include "google/protobuf/wrappers.upb.h" #include "envoy/annotations/resource.upb.h" #include "udpa/annotations/migrate.upb.h" +#include "udpa/annotations/status.upb.h" #include "validate/validate.upb.h" #include "envoy/api/v2/endpoint.upb.h" diff --git a/src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.c b/src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.c index 64a00d1fe5d..2481b6c3790 100644 --- a/src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.c +++ b/src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.c @@ -15,6 +15,7 @@ #include "google/protobuf/duration.upb.h" #include "google/protobuf/wrappers.upb.h" #include "udpa/annotations/migrate.upb.h" +#include "udpa/annotations/status.upb.h" #include "validate/validate.upb.h" #include "upb/port_def.inc" diff --git a/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.c b/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.c index d071a4fa14c..b291ee9a1c5 100644 --- a/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.c +++ b/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.c @@ -9,6 +9,7 @@ #include #include "upb/msg.h" #include "envoy/api/v2/endpoint/endpoint.upb.h" +#include "udpa/annotations/status.upb.h" #include "envoy/api/v2/endpoint/endpoint_components.upb.h" #include "upb/port_def.inc" diff --git a/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.c b/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.c index fc13392e205..ecdf2c2e03c 100644 --- a/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.c +++ b/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.c @@ -14,6 +14,7 @@ #include "envoy/api/v2/core/health_check.upb.h" #include "google/protobuf/wrappers.upb.h" #include "udpa/annotations/migrate.upb.h" +#include "udpa/annotations/status.upb.h" #include "validate/validate.upb.h" #include "upb/port_def.inc" @@ -23,25 +24,27 @@ static const upb_msglayout *const envoy_api_v2_endpoint_Endpoint_submsgs[2] = { &envoy_api_v2_endpoint_Endpoint_HealthCheckConfig_msginit, }; -static const upb_msglayout_field envoy_api_v2_endpoint_Endpoint__fields[2] = { - {1, UPB_SIZE(0, 0), 0, 0, 11, 1}, - {2, UPB_SIZE(4, 8), 0, 1, 11, 1}, +static const upb_msglayout_field envoy_api_v2_endpoint_Endpoint__fields[3] = { + {1, UPB_SIZE(8, 16), 0, 0, 11, 1}, + {2, UPB_SIZE(12, 24), 0, 1, 11, 1}, + {3, UPB_SIZE(0, 0), 0, 0, 9, 1}, }; const upb_msglayout envoy_api_v2_endpoint_Endpoint_msginit = { &envoy_api_v2_endpoint_Endpoint_submsgs[0], &envoy_api_v2_endpoint_Endpoint__fields[0], - UPB_SIZE(8, 16), 2, false, + UPB_SIZE(16, 32), 3, false, }; -static const upb_msglayout_field envoy_api_v2_endpoint_Endpoint_HealthCheckConfig__fields[1] = { +static const upb_msglayout_field envoy_api_v2_endpoint_Endpoint_HealthCheckConfig__fields[2] = { {1, UPB_SIZE(0, 0), 0, 0, 13, 1}, + {2, UPB_SIZE(4, 8), 0, 0, 9, 1}, }; const upb_msglayout envoy_api_v2_endpoint_Endpoint_HealthCheckConfig_msginit = { NULL, &envoy_api_v2_endpoint_Endpoint_HealthCheckConfig__fields[0], - UPB_SIZE(4, 4), 1, false, + UPB_SIZE(16, 32), 2, false, }; static const upb_msglayout *const envoy_api_v2_endpoint_LbEndpoint_submsgs[3] = { diff --git a/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.h b/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.h index da973c9d7cb..22e65027b35 100644 --- a/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.h +++ b/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.h @@ -56,11 +56,12 @@ UPB_INLINE char *envoy_api_v2_endpoint_Endpoint_serialize(const envoy_api_v2_end return upb_encode(msg, &envoy_api_v2_endpoint_Endpoint_msginit, arena, len); } -UPB_INLINE const struct envoy_api_v2_core_Address* envoy_api_v2_endpoint_Endpoint_address(const envoy_api_v2_endpoint_Endpoint *msg) { return UPB_FIELD_AT(msg, const struct envoy_api_v2_core_Address*, UPB_SIZE(0, 0)); } -UPB_INLINE const envoy_api_v2_endpoint_Endpoint_HealthCheckConfig* envoy_api_v2_endpoint_Endpoint_health_check_config(const envoy_api_v2_endpoint_Endpoint *msg) { return UPB_FIELD_AT(msg, const envoy_api_v2_endpoint_Endpoint_HealthCheckConfig*, UPB_SIZE(4, 8)); } +UPB_INLINE const struct envoy_api_v2_core_Address* envoy_api_v2_endpoint_Endpoint_address(const envoy_api_v2_endpoint_Endpoint *msg) { return UPB_FIELD_AT(msg, const struct envoy_api_v2_core_Address*, UPB_SIZE(8, 16)); } +UPB_INLINE const envoy_api_v2_endpoint_Endpoint_HealthCheckConfig* envoy_api_v2_endpoint_Endpoint_health_check_config(const envoy_api_v2_endpoint_Endpoint *msg) { return UPB_FIELD_AT(msg, const envoy_api_v2_endpoint_Endpoint_HealthCheckConfig*, UPB_SIZE(12, 24)); } +UPB_INLINE upb_strview envoy_api_v2_endpoint_Endpoint_hostname(const envoy_api_v2_endpoint_Endpoint *msg) { return UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(0, 0)); } UPB_INLINE void envoy_api_v2_endpoint_Endpoint_set_address(envoy_api_v2_endpoint_Endpoint *msg, struct envoy_api_v2_core_Address* value) { - UPB_FIELD_AT(msg, struct envoy_api_v2_core_Address*, UPB_SIZE(0, 0)) = value; + UPB_FIELD_AT(msg, struct envoy_api_v2_core_Address*, UPB_SIZE(8, 16)) = value; } UPB_INLINE struct envoy_api_v2_core_Address* envoy_api_v2_endpoint_Endpoint_mutable_address(envoy_api_v2_endpoint_Endpoint *msg, upb_arena *arena) { struct envoy_api_v2_core_Address* sub = (struct envoy_api_v2_core_Address*)envoy_api_v2_endpoint_Endpoint_address(msg); @@ -72,7 +73,7 @@ UPB_INLINE struct envoy_api_v2_core_Address* envoy_api_v2_endpoint_Endpoint_muta return sub; } UPB_INLINE void envoy_api_v2_endpoint_Endpoint_set_health_check_config(envoy_api_v2_endpoint_Endpoint *msg, envoy_api_v2_endpoint_Endpoint_HealthCheckConfig* value) { - UPB_FIELD_AT(msg, envoy_api_v2_endpoint_Endpoint_HealthCheckConfig*, UPB_SIZE(4, 8)) = value; + UPB_FIELD_AT(msg, envoy_api_v2_endpoint_Endpoint_HealthCheckConfig*, UPB_SIZE(12, 24)) = value; } UPB_INLINE struct envoy_api_v2_endpoint_Endpoint_HealthCheckConfig* envoy_api_v2_endpoint_Endpoint_mutable_health_check_config(envoy_api_v2_endpoint_Endpoint *msg, upb_arena *arena) { struct envoy_api_v2_endpoint_Endpoint_HealthCheckConfig* sub = (struct envoy_api_v2_endpoint_Endpoint_HealthCheckConfig*)envoy_api_v2_endpoint_Endpoint_health_check_config(msg); @@ -83,6 +84,9 @@ UPB_INLINE struct envoy_api_v2_endpoint_Endpoint_HealthCheckConfig* envoy_api_v2 } return sub; } +UPB_INLINE void envoy_api_v2_endpoint_Endpoint_set_hostname(envoy_api_v2_endpoint_Endpoint *msg, upb_strview value) { + UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(0, 0)) = value; +} /* envoy.api.v2.endpoint.Endpoint.HealthCheckConfig */ @@ -99,10 +103,14 @@ UPB_INLINE char *envoy_api_v2_endpoint_Endpoint_HealthCheckConfig_serialize(cons } UPB_INLINE uint32_t envoy_api_v2_endpoint_Endpoint_HealthCheckConfig_port_value(const envoy_api_v2_endpoint_Endpoint_HealthCheckConfig *msg) { return UPB_FIELD_AT(msg, uint32_t, UPB_SIZE(0, 0)); } +UPB_INLINE upb_strview envoy_api_v2_endpoint_Endpoint_HealthCheckConfig_hostname(const envoy_api_v2_endpoint_Endpoint_HealthCheckConfig *msg) { return UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(4, 8)); } UPB_INLINE void envoy_api_v2_endpoint_Endpoint_HealthCheckConfig_set_port_value(envoy_api_v2_endpoint_Endpoint_HealthCheckConfig *msg, uint32_t value) { UPB_FIELD_AT(msg, uint32_t, UPB_SIZE(0, 0)) = value; } +UPB_INLINE void envoy_api_v2_endpoint_Endpoint_HealthCheckConfig_set_hostname(envoy_api_v2_endpoint_Endpoint_HealthCheckConfig *msg, upb_strview value) { + UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(4, 8)) = value; +} /* envoy.api.v2.endpoint.LbEndpoint */ diff --git a/src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.c b/src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.c index 7cc681977c7..be3c982f156 100644 --- a/src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.c +++ b/src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.c @@ -14,6 +14,7 @@ #include "google/protobuf/duration.upb.h" #include "google/protobuf/struct.upb.h" #include "udpa/annotations/migrate.upb.h" +#include "udpa/annotations/status.upb.h" #include "validate/validate.upb.h" #include "upb/port_def.inc" diff --git a/src/core/ext/upb-generated/envoy/api/v2/lds.upb.c b/src/core/ext/upb-generated/envoy/api/v2/lds.upb.c index 5b372782ea2..5fe96bbe1ea 100644 --- a/src/core/ext/upb-generated/envoy/api/v2/lds.upb.c +++ b/src/core/ext/upb-generated/envoy/api/v2/lds.upb.c @@ -15,6 +15,7 @@ #include "google/protobuf/wrappers.upb.h" #include "envoy/annotations/resource.upb.h" #include "udpa/annotations/migrate.upb.h" +#include "udpa/annotations/status.upb.h" #include "validate/validate.upb.h" #include "envoy/api/v2/listener.upb.h" diff --git a/src/core/ext/upb-generated/envoy/api/v2/listener.upb.c b/src/core/ext/upb-generated/envoy/api/v2/listener.upb.c index 161c04d9606..455b3c2d414 100644 --- a/src/core/ext/upb-generated/envoy/api/v2/listener.upb.c +++ b/src/core/ext/upb-generated/envoy/api/v2/listener.upb.c @@ -11,18 +11,21 @@ #include "envoy/api/v2/listener.upb.h" #include "envoy/api/v2/core/address.upb.h" #include "envoy/api/v2/core/base.upb.h" +#include "envoy/api/v2/core/socket_option.upb.h" #include "envoy/api/v2/listener/listener_components.upb.h" #include "envoy/api/v2/listener/udp_listener_config.upb.h" +#include "envoy/config/filter/accesslog/v2/accesslog.upb.h" #include "envoy/config/listener/v2/api_listener.upb.h" #include "google/api/annotations.upb.h" #include "google/protobuf/duration.upb.h" #include "google/protobuf/wrappers.upb.h" #include "udpa/annotations/migrate.upb.h" +#include "udpa/annotations/status.upb.h" #include "validate/validate.upb.h" #include "upb/port_def.inc" -static const upb_msglayout *const envoy_api_v2_Listener_submsgs[15] = { +static const upb_msglayout *const envoy_api_v2_Listener_submsgs[16] = { &envoy_api_v2_Listener_ConnectionBalanceConfig_msginit, &envoy_api_v2_Listener_DeprecatedV1_msginit, &envoy_api_v2_core_Address_msginit, @@ -31,39 +34,41 @@ static const upb_msglayout *const envoy_api_v2_Listener_submsgs[15] = { &envoy_api_v2_listener_FilterChain_msginit, &envoy_api_v2_listener_ListenerFilter_msginit, &envoy_api_v2_listener_UdpListenerConfig_msginit, + &envoy_config_filter_accesslog_v2_AccessLog_msginit, &envoy_config_listener_v2_ApiListener_msginit, &google_protobuf_BoolValue_msginit, &google_protobuf_Duration_msginit, &google_protobuf_UInt32Value_msginit, }; -static const upb_msglayout_field envoy_api_v2_Listener__fields[20] = { +static const upb_msglayout_field envoy_api_v2_Listener__fields[21] = { {1, UPB_SIZE(20, 24), 0, 0, 9, 1}, {2, UPB_SIZE(28, 40), 0, 2, 11, 1}, {3, UPB_SIZE(76, 136), 0, 5, 11, 3}, - {4, UPB_SIZE(32, 48), 0, 9, 11, 1}, - {5, UPB_SIZE(36, 56), 0, 11, 11, 1}, + {4, UPB_SIZE(32, 48), 0, 10, 11, 1}, + {5, UPB_SIZE(36, 56), 0, 12, 11, 1}, {6, UPB_SIZE(40, 64), 0, 3, 11, 1}, {7, UPB_SIZE(44, 72), 0, 1, 11, 1}, {8, UPB_SIZE(0, 0), 0, 0, 14, 1}, {9, UPB_SIZE(80, 144), 0, 6, 11, 3}, - {10, UPB_SIZE(48, 80), 0, 9, 11, 1}, - {11, UPB_SIZE(52, 88), 0, 9, 11, 1}, - {12, UPB_SIZE(56, 96), 0, 11, 11, 1}, + {10, UPB_SIZE(48, 80), 0, 10, 11, 1}, + {11, UPB_SIZE(52, 88), 0, 10, 11, 1}, + {12, UPB_SIZE(56, 96), 0, 12, 11, 1}, {13, UPB_SIZE(84, 152), 0, 4, 11, 3}, - {15, UPB_SIZE(60, 104), 0, 10, 11, 1}, + {15, UPB_SIZE(60, 104), 0, 11, 11, 1}, {16, UPB_SIZE(8, 8), 0, 0, 14, 1}, {17, UPB_SIZE(16, 16), 0, 0, 8, 1}, {18, UPB_SIZE(64, 112), 0, 7, 11, 1}, - {19, UPB_SIZE(68, 120), 0, 8, 11, 1}, + {19, UPB_SIZE(68, 120), 0, 9, 11, 1}, {20, UPB_SIZE(72, 128), 0, 0, 11, 1}, {21, UPB_SIZE(17, 17), 0, 0, 8, 1}, + {22, UPB_SIZE(88, 160), 0, 8, 11, 3}, }; const upb_msglayout envoy_api_v2_Listener_msginit = { &envoy_api_v2_Listener_submsgs[0], &envoy_api_v2_Listener__fields[0], - UPB_SIZE(88, 160), 20, false, + UPB_SIZE(96, 176), 21, false, }; static const upb_msglayout *const envoy_api_v2_Listener_DeprecatedV1_submsgs[1] = { diff --git a/src/core/ext/upb-generated/envoy/api/v2/listener.upb.h b/src/core/ext/upb-generated/envoy/api/v2/listener.upb.h index 9689def3480..0d509e2671c 100644 --- a/src/core/ext/upb-generated/envoy/api/v2/listener.upb.h +++ b/src/core/ext/upb-generated/envoy/api/v2/listener.upb.h @@ -38,6 +38,7 @@ struct envoy_api_v2_core_SocketOption; struct envoy_api_v2_listener_FilterChain; struct envoy_api_v2_listener_ListenerFilter; struct envoy_api_v2_listener_UdpListenerConfig; +struct envoy_config_filter_accesslog_v2_AccessLog; struct envoy_config_listener_v2_ApiListener; struct google_protobuf_BoolValue; struct google_protobuf_Duration; @@ -48,6 +49,7 @@ extern const upb_msglayout envoy_api_v2_core_SocketOption_msginit; extern const upb_msglayout envoy_api_v2_listener_FilterChain_msginit; extern const upb_msglayout envoy_api_v2_listener_ListenerFilter_msginit; extern const upb_msglayout envoy_api_v2_listener_UdpListenerConfig_msginit; +extern const upb_msglayout envoy_config_filter_accesslog_v2_AccessLog_msginit; extern const upb_msglayout envoy_config_listener_v2_ApiListener_msginit; extern const upb_msglayout google_protobuf_BoolValue_msginit; extern const upb_msglayout google_protobuf_Duration_msginit; @@ -93,6 +95,7 @@ UPB_INLINE const struct envoy_api_v2_listener_UdpListenerConfig* envoy_api_v2_Li UPB_INLINE const struct envoy_config_listener_v2_ApiListener* envoy_api_v2_Listener_api_listener(const envoy_api_v2_Listener *msg) { return UPB_FIELD_AT(msg, const struct envoy_config_listener_v2_ApiListener*, UPB_SIZE(68, 120)); } UPB_INLINE const envoy_api_v2_Listener_ConnectionBalanceConfig* envoy_api_v2_Listener_connection_balance_config(const envoy_api_v2_Listener *msg) { return UPB_FIELD_AT(msg, const envoy_api_v2_Listener_ConnectionBalanceConfig*, UPB_SIZE(72, 128)); } UPB_INLINE bool envoy_api_v2_Listener_reuse_port(const envoy_api_v2_Listener *msg) { return UPB_FIELD_AT(msg, bool, UPB_SIZE(17, 17)); } +UPB_INLINE const struct envoy_config_filter_accesslog_v2_AccessLog* const* envoy_api_v2_Listener_access_log(const envoy_api_v2_Listener *msg, size_t *len) { return (const struct envoy_config_filter_accesslog_v2_AccessLog* const*)_upb_array_accessor(msg, UPB_SIZE(88, 160), len); } UPB_INLINE void envoy_api_v2_Listener_set_name(envoy_api_v2_Listener *msg, upb_strview value) { UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(20, 24)) = value; @@ -292,6 +295,19 @@ UPB_INLINE struct envoy_api_v2_Listener_ConnectionBalanceConfig* envoy_api_v2_Li UPB_INLINE void envoy_api_v2_Listener_set_reuse_port(envoy_api_v2_Listener *msg, bool value) { UPB_FIELD_AT(msg, bool, UPB_SIZE(17, 17)) = value; } +UPB_INLINE struct envoy_config_filter_accesslog_v2_AccessLog** envoy_api_v2_Listener_mutable_access_log(envoy_api_v2_Listener *msg, size_t *len) { + return (struct envoy_config_filter_accesslog_v2_AccessLog**)_upb_array_mutable_accessor(msg, UPB_SIZE(88, 160), len); +} +UPB_INLINE struct envoy_config_filter_accesslog_v2_AccessLog** envoy_api_v2_Listener_resize_access_log(envoy_api_v2_Listener *msg, size_t len, upb_arena *arena) { + return (struct envoy_config_filter_accesslog_v2_AccessLog**)_upb_array_resize_accessor(msg, UPB_SIZE(88, 160), len, UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, arena); +} +UPB_INLINE struct envoy_config_filter_accesslog_v2_AccessLog* envoy_api_v2_Listener_add_access_log(envoy_api_v2_Listener *msg, upb_arena *arena) { + struct envoy_config_filter_accesslog_v2_AccessLog* sub = (struct envoy_config_filter_accesslog_v2_AccessLog*)upb_msg_new(&envoy_config_filter_accesslog_v2_AccessLog_msginit, arena); + bool ok = _upb_array_append_accessor( + msg, UPB_SIZE(88, 160), UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, &sub, arena); + if (!ok) return NULL; + return sub; +} /* envoy.api.v2.Listener.DeprecatedV1 */ diff --git a/src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.c b/src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.c index ef74720bf6d..d9b3dc2ca9f 100644 --- a/src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.c +++ b/src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.c @@ -9,6 +9,7 @@ #include #include "upb/msg.h" #include "envoy/api/v2/listener/listener.upb.h" +#include "udpa/annotations/status.upb.h" #include "envoy/api/v2/listener/listener_components.upb.h" #include "upb/port_def.inc" diff --git a/src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.c b/src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.c index cbce3e19bd2..a014cd12d51 100644 --- a/src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.c +++ b/src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.c @@ -9,7 +9,7 @@ #include #include "upb/msg.h" #include "envoy/api/v2/listener/listener_components.upb.h" -#include "envoy/api/v2/auth/cert.upb.h" +#include "envoy/api/v2/auth/tls.upb.h" #include "envoy/api/v2/core/address.upb.h" #include "envoy/api/v2/core/base.upb.h" #include "envoy/type/range.upb.h" @@ -17,6 +17,7 @@ #include "google/protobuf/struct.upb.h" #include "google/protobuf/wrappers.upb.h" #include "udpa/annotations/migrate.upb.h" +#include "udpa/annotations/status.upb.h" #include "validate/validate.upb.h" #include "upb/port_def.inc" diff --git a/src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.c b/src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.c index f32ff0ba672..7c9df77d3b4 100644 --- a/src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.c +++ b/src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.c @@ -12,6 +12,7 @@ #include "google/protobuf/any.upb.h" #include "google/protobuf/struct.upb.h" #include "udpa/annotations/migrate.upb.h" +#include "udpa/annotations/status.upb.h" #include "upb/port_def.inc" diff --git a/src/core/ext/upb-generated/envoy/api/v2/rds.upb.c b/src/core/ext/upb-generated/envoy/api/v2/rds.upb.c index c17b86893e1..e360b58ab88 100644 --- a/src/core/ext/upb-generated/envoy/api/v2/rds.upb.c +++ b/src/core/ext/upb-generated/envoy/api/v2/rds.upb.c @@ -14,6 +14,7 @@ #include "google/protobuf/wrappers.upb.h" #include "envoy/annotations/resource.upb.h" #include "udpa/annotations/migrate.upb.h" +#include "udpa/annotations/status.upb.h" #include "validate/validate.upb.h" #include "envoy/api/v2/route.upb.h" diff --git a/src/core/ext/upb-generated/envoy/api/v2/route.upb.c b/src/core/ext/upb-generated/envoy/api/v2/route.upb.c index 7486cb42d84..85ab57c82b2 100644 --- a/src/core/ext/upb-generated/envoy/api/v2/route.upb.c +++ b/src/core/ext/upb-generated/envoy/api/v2/route.upb.c @@ -14,6 +14,7 @@ #include "envoy/api/v2/route/route_components.upb.h" #include "google/protobuf/wrappers.upb.h" #include "udpa/annotations/migrate.upb.h" +#include "udpa/annotations/status.upb.h" #include "validate/validate.upb.h" #include "upb/port_def.inc" diff --git a/src/core/ext/upb-generated/envoy/api/v2/route/route.upb.c b/src/core/ext/upb-generated/envoy/api/v2/route/route.upb.c index d8e9ffdf151..ba3139535fa 100644 --- a/src/core/ext/upb-generated/envoy/api/v2/route/route.upb.c +++ b/src/core/ext/upb-generated/envoy/api/v2/route/route.upb.c @@ -9,6 +9,7 @@ #include #include "upb/msg.h" #include "envoy/api/v2/route/route.upb.h" +#include "udpa/annotations/status.upb.h" #include "envoy/api/v2/route/route_components.upb.h" #include "upb/port_def.inc" diff --git a/src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.c b/src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.c index 7c56852726a..fdf7c4b3192 100644 --- a/src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.c +++ b/src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.c @@ -21,11 +21,12 @@ #include "google/protobuf/wrappers.upb.h" #include "envoy/annotations/deprecation.upb.h" #include "udpa/annotations/migrate.upb.h" +#include "udpa/annotations/status.upb.h" #include "validate/validate.upb.h" #include "upb/port_def.inc" -static const upb_msglayout *const envoy_api_v2_route_VirtualHost_submsgs[11] = { +static const upb_msglayout *const envoy_api_v2_route_VirtualHost_submsgs[12] = { &envoy_api_v2_core_HeaderValueOption_msginit, &envoy_api_v2_route_CorsPolicy_msginit, &envoy_api_v2_route_HedgePolicy_msginit, @@ -35,33 +36,36 @@ static const upb_msglayout *const envoy_api_v2_route_VirtualHost_submsgs[11] = { &envoy_api_v2_route_VirtualCluster_msginit, &envoy_api_v2_route_VirtualHost_PerFilterConfigEntry_msginit, &envoy_api_v2_route_VirtualHost_TypedPerFilterConfigEntry_msginit, + &google_protobuf_Any_msginit, &google_protobuf_UInt32Value_msginit, }; -static const upb_msglayout_field envoy_api_v2_route_VirtualHost__fields[17] = { +static const upb_msglayout_field envoy_api_v2_route_VirtualHost__fields[19] = { {1, UPB_SIZE(12, 16), 0, 0, 9, 1}, - {2, UPB_SIZE(36, 64), 0, 0, 9, 3}, - {3, UPB_SIZE(40, 72), 0, 5, 11, 3}, + {2, UPB_SIZE(40, 72), 0, 0, 9, 3}, + {3, UPB_SIZE(44, 80), 0, 5, 11, 3}, {4, UPB_SIZE(0, 0), 0, 0, 14, 1}, - {5, UPB_SIZE(44, 80), 0, 6, 11, 3}, - {6, UPB_SIZE(48, 88), 0, 3, 11, 3}, - {7, UPB_SIZE(52, 96), 0, 0, 11, 3}, + {5, UPB_SIZE(48, 88), 0, 6, 11, 3}, + {6, UPB_SIZE(52, 96), 0, 3, 11, 3}, + {7, UPB_SIZE(56, 104), 0, 0, 11, 3}, {8, UPB_SIZE(20, 32), 0, 1, 11, 1}, - {10, UPB_SIZE(56, 104), 0, 0, 11, 3}, - {11, UPB_SIZE(60, 112), 0, 0, 9, 3}, - {12, UPB_SIZE(64, 120), 0, 7, 11, 3}, - {13, UPB_SIZE(68, 128), 0, 0, 9, 3}, + {10, UPB_SIZE(60, 112), 0, 0, 11, 3}, + {11, UPB_SIZE(64, 120), 0, 0, 9, 3}, + {12, UPB_SIZE(68, 128), 0, 7, 11, 3}, + {13, UPB_SIZE(72, 136), 0, 0, 9, 3}, {14, UPB_SIZE(8, 8), 0, 0, 8, 1}, - {15, UPB_SIZE(72, 136), 0, 8, 11, 3}, + {15, UPB_SIZE(76, 144), 0, 8, 11, 3}, {16, UPB_SIZE(24, 40), 0, 4, 11, 1}, {17, UPB_SIZE(28, 48), 0, 2, 11, 1}, - {18, UPB_SIZE(32, 56), 0, 9, 11, 1}, + {18, UPB_SIZE(32, 56), 0, 10, 11, 1}, + {19, UPB_SIZE(9, 9), 0, 0, 8, 1}, + {20, UPB_SIZE(36, 64), 0, 9, 11, 1}, }; const upb_msglayout envoy_api_v2_route_VirtualHost_msginit = { &envoy_api_v2_route_VirtualHost_submsgs[0], &envoy_api_v2_route_VirtualHost__fields[0], - UPB_SIZE(80, 144), 17, false, + UPB_SIZE(80, 160), 19, false, }; static const upb_msglayout *const envoy_api_v2_route_VirtualHost_PerFilterConfigEntry_submsgs[1] = { @@ -327,7 +331,7 @@ const upb_msglayout envoy_api_v2_route_CorsPolicy_msginit = { UPB_SIZE(64, 128), 11, false, }; -static const upb_msglayout *const envoy_api_v2_route_RouteAction_submsgs[17] = { +static const upb_msglayout *const envoy_api_v2_route_RouteAction_submsgs[19] = { &envoy_api_v2_core_Metadata_msginit, &envoy_api_v2_route_CorsPolicy_msginit, &envoy_api_v2_route_HedgePolicy_msginit, @@ -337,80 +341,88 @@ static const upb_msglayout *const envoy_api_v2_route_RouteAction_submsgs[17] = { &envoy_api_v2_route_RouteAction_RequestMirrorPolicy_msginit, &envoy_api_v2_route_RouteAction_UpgradeConfig_msginit, &envoy_api_v2_route_WeightedCluster_msginit, + &envoy_type_matcher_RegexMatchAndSubstitute_msginit, + &google_protobuf_Any_msginit, &google_protobuf_BoolValue_msginit, &google_protobuf_Duration_msginit, &google_protobuf_UInt32Value_msginit, }; -static const upb_msglayout_field envoy_api_v2_route_RouteAction__fields[25] = { - {1, UPB_SIZE(92, 160), UPB_SIZE(-101, -177), 0, 9, 1}, - {2, UPB_SIZE(92, 160), UPB_SIZE(-101, -177), 0, 9, 1}, - {3, UPB_SIZE(92, 160), UPB_SIZE(-101, -177), 8, 11, 1}, +static const upb_msglayout_field envoy_api_v2_route_RouteAction__fields[27] = { + {1, UPB_SIZE(100, 176), UPB_SIZE(-109, -193), 0, 9, 1}, + {2, UPB_SIZE(100, 176), UPB_SIZE(-109, -193), 0, 9, 1}, + {3, UPB_SIZE(100, 176), UPB_SIZE(-109, -193), 8, 11, 1}, {4, UPB_SIZE(32, 40), 0, 0, 11, 1}, {5, UPB_SIZE(24, 24), 0, 0, 9, 1}, - {6, UPB_SIZE(104, 184), UPB_SIZE(-113, -201), 0, 9, 1}, - {7, UPB_SIZE(104, 184), UPB_SIZE(-113, -201), 9, 11, 1}, - {8, UPB_SIZE(36, 48), 0, 10, 11, 1}, + {6, UPB_SIZE(112, 200), UPB_SIZE(-121, -217), 0, 9, 1}, + {7, UPB_SIZE(112, 200), UPB_SIZE(-121, -217), 11, 11, 1}, + {8, UPB_SIZE(36, 48), 0, 12, 11, 1}, {9, UPB_SIZE(40, 56), 0, 4, 11, 1}, {10, UPB_SIZE(44, 64), 0, 6, 11, 1}, {11, UPB_SIZE(0, 0), 0, 0, 14, 1}, - {13, UPB_SIZE(76, 128), 0, 3, 11, 3}, - {14, UPB_SIZE(48, 72), 0, 9, 11, 1}, - {15, UPB_SIZE(80, 136), 0, 5, 11, 3}, + {13, UPB_SIZE(84, 144), 0, 3, 11, 3}, + {14, UPB_SIZE(48, 72), 0, 11, 11, 1}, + {15, UPB_SIZE(88, 152), 0, 5, 11, 3}, {17, UPB_SIZE(52, 80), 0, 1, 11, 1}, {20, UPB_SIZE(8, 8), 0, 0, 14, 1}, - {23, UPB_SIZE(56, 88), 0, 10, 11, 1}, - {24, UPB_SIZE(60, 96), 0, 10, 11, 1}, - {25, UPB_SIZE(84, 144), 0, 7, 11, 3}, + {23, UPB_SIZE(56, 88), 0, 12, 11, 1}, + {24, UPB_SIZE(60, 96), 0, 12, 11, 1}, + {25, UPB_SIZE(92, 160), 0, 7, 11, 3}, {26, UPB_SIZE(16, 16), 0, 0, 14, 1}, {27, UPB_SIZE(64, 104), 0, 2, 11, 1}, - {28, UPB_SIZE(68, 112), 0, 10, 11, 1}, - {29, UPB_SIZE(104, 184), UPB_SIZE(-113, -201), 0, 9, 1}, - {30, UPB_SIZE(88, 152), 0, 6, 11, 3}, - {31, UPB_SIZE(72, 120), 0, 11, 11, 1}, + {28, UPB_SIZE(68, 112), 0, 12, 11, 1}, + {29, UPB_SIZE(112, 200), UPB_SIZE(-121, -217), 0, 9, 1}, + {30, UPB_SIZE(96, 168), 0, 6, 11, 3}, + {31, UPB_SIZE(72, 120), 0, 13, 11, 1}, + {32, UPB_SIZE(76, 128), 0, 9, 11, 1}, + {33, UPB_SIZE(80, 136), 0, 10, 11, 1}, }; const upb_msglayout envoy_api_v2_route_RouteAction_msginit = { &envoy_api_v2_route_RouteAction_submsgs[0], &envoy_api_v2_route_RouteAction__fields[0], - UPB_SIZE(120, 208), 25, false, + UPB_SIZE(128, 224), 27, false, }; -static const upb_msglayout *const envoy_api_v2_route_RouteAction_RequestMirrorPolicy_submsgs[1] = { +static const upb_msglayout *const envoy_api_v2_route_RouteAction_RequestMirrorPolicy_submsgs[2] = { &envoy_api_v2_core_RuntimeFractionalPercent_msginit, + &google_protobuf_BoolValue_msginit, }; -static const upb_msglayout_field envoy_api_v2_route_RouteAction_RequestMirrorPolicy__fields[3] = { +static const upb_msglayout_field envoy_api_v2_route_RouteAction_RequestMirrorPolicy__fields[4] = { {1, UPB_SIZE(0, 0), 0, 0, 9, 1}, {2, UPB_SIZE(8, 16), 0, 0, 9, 1}, {3, UPB_SIZE(16, 32), 0, 0, 11, 1}, + {4, UPB_SIZE(20, 40), 0, 1, 11, 1}, }; const upb_msglayout envoy_api_v2_route_RouteAction_RequestMirrorPolicy_msginit = { &envoy_api_v2_route_RouteAction_RequestMirrorPolicy_submsgs[0], &envoy_api_v2_route_RouteAction_RequestMirrorPolicy__fields[0], - UPB_SIZE(24, 48), 3, false, + UPB_SIZE(24, 48), 4, false, }; -static const upb_msglayout *const envoy_api_v2_route_RouteAction_HashPolicy_submsgs[4] = { +static const upb_msglayout *const envoy_api_v2_route_RouteAction_HashPolicy_submsgs[5] = { &envoy_api_v2_route_RouteAction_HashPolicy_ConnectionProperties_msginit, &envoy_api_v2_route_RouteAction_HashPolicy_Cookie_msginit, + &envoy_api_v2_route_RouteAction_HashPolicy_FilterState_msginit, &envoy_api_v2_route_RouteAction_HashPolicy_Header_msginit, &envoy_api_v2_route_RouteAction_HashPolicy_QueryParameter_msginit, }; -static const upb_msglayout_field envoy_api_v2_route_RouteAction_HashPolicy__fields[5] = { - {1, UPB_SIZE(4, 8), UPB_SIZE(-9, -17), 2, 11, 1}, +static const upb_msglayout_field envoy_api_v2_route_RouteAction_HashPolicy__fields[6] = { + {1, UPB_SIZE(4, 8), UPB_SIZE(-9, -17), 3, 11, 1}, {2, UPB_SIZE(4, 8), UPB_SIZE(-9, -17), 1, 11, 1}, {3, UPB_SIZE(4, 8), UPB_SIZE(-9, -17), 0, 11, 1}, {4, UPB_SIZE(0, 0), 0, 0, 8, 1}, - {5, UPB_SIZE(4, 8), UPB_SIZE(-9, -17), 3, 11, 1}, + {5, UPB_SIZE(4, 8), UPB_SIZE(-9, -17), 4, 11, 1}, + {6, UPB_SIZE(4, 8), UPB_SIZE(-9, -17), 2, 11, 1}, }; const upb_msglayout envoy_api_v2_route_RouteAction_HashPolicy_msginit = { &envoy_api_v2_route_RouteAction_HashPolicy_submsgs[0], &envoy_api_v2_route_RouteAction_HashPolicy__fields[0], - UPB_SIZE(12, 24), 5, false, + UPB_SIZE(12, 24), 6, false, }; static const upb_msglayout_field envoy_api_v2_route_RouteAction_HashPolicy_Header__fields[1] = { @@ -459,6 +471,16 @@ const upb_msglayout envoy_api_v2_route_RouteAction_HashPolicy_QueryParameter_msg UPB_SIZE(8, 16), 1, false, }; +static const upb_msglayout_field envoy_api_v2_route_RouteAction_HashPolicy_FilterState__fields[1] = { + {1, UPB_SIZE(0, 0), 0, 0, 9, 1}, +}; + +const upb_msglayout envoy_api_v2_route_RouteAction_HashPolicy_FilterState_msginit = { + NULL, + &envoy_api_v2_route_RouteAction_HashPolicy_FilterState__fields[0], + UPB_SIZE(8, 16), 1, false, +}; + static const upb_msglayout *const envoy_api_v2_route_RouteAction_UpgradeConfig_submsgs[1] = { &google_protobuf_BoolValue_msginit, }; diff --git a/src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.h b/src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.h index ac2640b073c..8380be5450d 100644 --- a/src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.h +++ b/src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.h @@ -42,6 +42,7 @@ struct envoy_api_v2_route_RouteAction_HashPolicy_Header; struct envoy_api_v2_route_RouteAction_HashPolicy_Cookie; struct envoy_api_v2_route_RouteAction_HashPolicy_ConnectionProperties; struct envoy_api_v2_route_RouteAction_HashPolicy_QueryParameter; +struct envoy_api_v2_route_RouteAction_HashPolicy_FilterState; struct envoy_api_v2_route_RouteAction_UpgradeConfig; struct envoy_api_v2_route_RetryPolicy; struct envoy_api_v2_route_RetryPolicy_RetryPriority; @@ -85,6 +86,7 @@ typedef struct envoy_api_v2_route_RouteAction_HashPolicy_Header envoy_api_v2_rou typedef struct envoy_api_v2_route_RouteAction_HashPolicy_Cookie envoy_api_v2_route_RouteAction_HashPolicy_Cookie; typedef struct envoy_api_v2_route_RouteAction_HashPolicy_ConnectionProperties envoy_api_v2_route_RouteAction_HashPolicy_ConnectionProperties; typedef struct envoy_api_v2_route_RouteAction_HashPolicy_QueryParameter envoy_api_v2_route_RouteAction_HashPolicy_QueryParameter; +typedef struct envoy_api_v2_route_RouteAction_HashPolicy_FilterState envoy_api_v2_route_RouteAction_HashPolicy_FilterState; typedef struct envoy_api_v2_route_RouteAction_UpgradeConfig envoy_api_v2_route_RouteAction_UpgradeConfig; typedef struct envoy_api_v2_route_RetryPolicy envoy_api_v2_route_RetryPolicy; typedef struct envoy_api_v2_route_RetryPolicy_RetryPriority envoy_api_v2_route_RetryPolicy_RetryPriority; @@ -128,6 +130,7 @@ extern const upb_msglayout envoy_api_v2_route_RouteAction_HashPolicy_Header_msgi extern const upb_msglayout envoy_api_v2_route_RouteAction_HashPolicy_Cookie_msginit; extern const upb_msglayout envoy_api_v2_route_RouteAction_HashPolicy_ConnectionProperties_msginit; extern const upb_msglayout envoy_api_v2_route_RouteAction_HashPolicy_QueryParameter_msginit; +extern const upb_msglayout envoy_api_v2_route_RouteAction_HashPolicy_FilterState_msginit; extern const upb_msglayout envoy_api_v2_route_RouteAction_UpgradeConfig_msginit; extern const upb_msglayout envoy_api_v2_route_RetryPolicy_msginit; extern const upb_msglayout envoy_api_v2_route_RetryPolicy_RetryPriority_msginit; @@ -155,6 +158,7 @@ struct envoy_api_v2_core_Metadata; struct envoy_api_v2_core_RuntimeFractionalPercent; struct envoy_type_FractionalPercent; struct envoy_type_Int64Range; +struct envoy_type_matcher_RegexMatchAndSubstitute; struct envoy_type_matcher_RegexMatcher; struct envoy_type_matcher_StringMatcher; struct envoy_type_tracing_v2_CustomTag; @@ -169,6 +173,7 @@ extern const upb_msglayout envoy_api_v2_core_Metadata_msginit; extern const upb_msglayout envoy_api_v2_core_RuntimeFractionalPercent_msginit; extern const upb_msglayout envoy_type_FractionalPercent_msginit; extern const upb_msglayout envoy_type_Int64Range_msginit; +extern const upb_msglayout envoy_type_matcher_RegexMatchAndSubstitute_msginit; extern const upb_msglayout envoy_type_matcher_RegexMatcher_msginit; extern const upb_msglayout envoy_type_matcher_StringMatcher_msginit; extern const upb_msglayout envoy_type_tracing_v2_CustomTag_msginit; @@ -218,46 +223,48 @@ UPB_INLINE char *envoy_api_v2_route_VirtualHost_serialize(const envoy_api_v2_rou } UPB_INLINE upb_strview envoy_api_v2_route_VirtualHost_name(const envoy_api_v2_route_VirtualHost *msg) { return UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(12, 16)); } -UPB_INLINE upb_strview const* envoy_api_v2_route_VirtualHost_domains(const envoy_api_v2_route_VirtualHost *msg, size_t *len) { return (upb_strview const*)_upb_array_accessor(msg, UPB_SIZE(36, 64), len); } -UPB_INLINE const envoy_api_v2_route_Route* const* envoy_api_v2_route_VirtualHost_routes(const envoy_api_v2_route_VirtualHost *msg, size_t *len) { return (const envoy_api_v2_route_Route* const*)_upb_array_accessor(msg, UPB_SIZE(40, 72), len); } +UPB_INLINE upb_strview const* envoy_api_v2_route_VirtualHost_domains(const envoy_api_v2_route_VirtualHost *msg, size_t *len) { return (upb_strview const*)_upb_array_accessor(msg, UPB_SIZE(40, 72), len); } +UPB_INLINE const envoy_api_v2_route_Route* const* envoy_api_v2_route_VirtualHost_routes(const envoy_api_v2_route_VirtualHost *msg, size_t *len) { return (const envoy_api_v2_route_Route* const*)_upb_array_accessor(msg, UPB_SIZE(44, 80), len); } UPB_INLINE int32_t envoy_api_v2_route_VirtualHost_require_tls(const envoy_api_v2_route_VirtualHost *msg) { return UPB_FIELD_AT(msg, int32_t, UPB_SIZE(0, 0)); } -UPB_INLINE const envoy_api_v2_route_VirtualCluster* const* envoy_api_v2_route_VirtualHost_virtual_clusters(const envoy_api_v2_route_VirtualHost *msg, size_t *len) { return (const envoy_api_v2_route_VirtualCluster* const*)_upb_array_accessor(msg, UPB_SIZE(44, 80), len); } -UPB_INLINE const envoy_api_v2_route_RateLimit* const* envoy_api_v2_route_VirtualHost_rate_limits(const envoy_api_v2_route_VirtualHost *msg, size_t *len) { return (const envoy_api_v2_route_RateLimit* const*)_upb_array_accessor(msg, UPB_SIZE(48, 88), len); } -UPB_INLINE const struct envoy_api_v2_core_HeaderValueOption* const* envoy_api_v2_route_VirtualHost_request_headers_to_add(const envoy_api_v2_route_VirtualHost *msg, size_t *len) { return (const struct envoy_api_v2_core_HeaderValueOption* const*)_upb_array_accessor(msg, UPB_SIZE(52, 96), len); } +UPB_INLINE const envoy_api_v2_route_VirtualCluster* const* envoy_api_v2_route_VirtualHost_virtual_clusters(const envoy_api_v2_route_VirtualHost *msg, size_t *len) { return (const envoy_api_v2_route_VirtualCluster* const*)_upb_array_accessor(msg, UPB_SIZE(48, 88), len); } +UPB_INLINE const envoy_api_v2_route_RateLimit* const* envoy_api_v2_route_VirtualHost_rate_limits(const envoy_api_v2_route_VirtualHost *msg, size_t *len) { return (const envoy_api_v2_route_RateLimit* const*)_upb_array_accessor(msg, UPB_SIZE(52, 96), len); } +UPB_INLINE const struct envoy_api_v2_core_HeaderValueOption* const* envoy_api_v2_route_VirtualHost_request_headers_to_add(const envoy_api_v2_route_VirtualHost *msg, size_t *len) { return (const struct envoy_api_v2_core_HeaderValueOption* const*)_upb_array_accessor(msg, UPB_SIZE(56, 104), len); } UPB_INLINE const envoy_api_v2_route_CorsPolicy* envoy_api_v2_route_VirtualHost_cors(const envoy_api_v2_route_VirtualHost *msg) { return UPB_FIELD_AT(msg, const envoy_api_v2_route_CorsPolicy*, UPB_SIZE(20, 32)); } -UPB_INLINE const struct envoy_api_v2_core_HeaderValueOption* const* envoy_api_v2_route_VirtualHost_response_headers_to_add(const envoy_api_v2_route_VirtualHost *msg, size_t *len) { return (const struct envoy_api_v2_core_HeaderValueOption* const*)_upb_array_accessor(msg, UPB_SIZE(56, 104), len); } -UPB_INLINE upb_strview const* envoy_api_v2_route_VirtualHost_response_headers_to_remove(const envoy_api_v2_route_VirtualHost *msg, size_t *len) { return (upb_strview const*)_upb_array_accessor(msg, UPB_SIZE(60, 112), len); } -UPB_INLINE const envoy_api_v2_route_VirtualHost_PerFilterConfigEntry* const* envoy_api_v2_route_VirtualHost_per_filter_config(const envoy_api_v2_route_VirtualHost *msg, size_t *len) { return (const envoy_api_v2_route_VirtualHost_PerFilterConfigEntry* const*)_upb_array_accessor(msg, UPB_SIZE(64, 120), len); } -UPB_INLINE upb_strview const* envoy_api_v2_route_VirtualHost_request_headers_to_remove(const envoy_api_v2_route_VirtualHost *msg, size_t *len) { return (upb_strview const*)_upb_array_accessor(msg, UPB_SIZE(68, 128), len); } +UPB_INLINE const struct envoy_api_v2_core_HeaderValueOption* const* envoy_api_v2_route_VirtualHost_response_headers_to_add(const envoy_api_v2_route_VirtualHost *msg, size_t *len) { return (const struct envoy_api_v2_core_HeaderValueOption* const*)_upb_array_accessor(msg, UPB_SIZE(60, 112), len); } +UPB_INLINE upb_strview const* envoy_api_v2_route_VirtualHost_response_headers_to_remove(const envoy_api_v2_route_VirtualHost *msg, size_t *len) { return (upb_strview const*)_upb_array_accessor(msg, UPB_SIZE(64, 120), len); } +UPB_INLINE const envoy_api_v2_route_VirtualHost_PerFilterConfigEntry* const* envoy_api_v2_route_VirtualHost_per_filter_config(const envoy_api_v2_route_VirtualHost *msg, size_t *len) { return (const envoy_api_v2_route_VirtualHost_PerFilterConfigEntry* const*)_upb_array_accessor(msg, UPB_SIZE(68, 128), len); } +UPB_INLINE upb_strview const* envoy_api_v2_route_VirtualHost_request_headers_to_remove(const envoy_api_v2_route_VirtualHost *msg, size_t *len) { return (upb_strview const*)_upb_array_accessor(msg, UPB_SIZE(72, 136), len); } UPB_INLINE bool envoy_api_v2_route_VirtualHost_include_request_attempt_count(const envoy_api_v2_route_VirtualHost *msg) { return UPB_FIELD_AT(msg, bool, UPB_SIZE(8, 8)); } -UPB_INLINE const envoy_api_v2_route_VirtualHost_TypedPerFilterConfigEntry* const* envoy_api_v2_route_VirtualHost_typed_per_filter_config(const envoy_api_v2_route_VirtualHost *msg, size_t *len) { return (const envoy_api_v2_route_VirtualHost_TypedPerFilterConfigEntry* const*)_upb_array_accessor(msg, UPB_SIZE(72, 136), len); } +UPB_INLINE const envoy_api_v2_route_VirtualHost_TypedPerFilterConfigEntry* const* envoy_api_v2_route_VirtualHost_typed_per_filter_config(const envoy_api_v2_route_VirtualHost *msg, size_t *len) { return (const envoy_api_v2_route_VirtualHost_TypedPerFilterConfigEntry* const*)_upb_array_accessor(msg, UPB_SIZE(76, 144), len); } UPB_INLINE const envoy_api_v2_route_RetryPolicy* envoy_api_v2_route_VirtualHost_retry_policy(const envoy_api_v2_route_VirtualHost *msg) { return UPB_FIELD_AT(msg, const envoy_api_v2_route_RetryPolicy*, UPB_SIZE(24, 40)); } UPB_INLINE const envoy_api_v2_route_HedgePolicy* envoy_api_v2_route_VirtualHost_hedge_policy(const envoy_api_v2_route_VirtualHost *msg) { return UPB_FIELD_AT(msg, const envoy_api_v2_route_HedgePolicy*, UPB_SIZE(28, 48)); } UPB_INLINE const struct google_protobuf_UInt32Value* envoy_api_v2_route_VirtualHost_per_request_buffer_limit_bytes(const envoy_api_v2_route_VirtualHost *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_UInt32Value*, UPB_SIZE(32, 56)); } +UPB_INLINE bool envoy_api_v2_route_VirtualHost_include_attempt_count_in_response(const envoy_api_v2_route_VirtualHost *msg) { return UPB_FIELD_AT(msg, bool, UPB_SIZE(9, 9)); } +UPB_INLINE const struct google_protobuf_Any* envoy_api_v2_route_VirtualHost_retry_policy_typed_config(const envoy_api_v2_route_VirtualHost *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_Any*, UPB_SIZE(36, 64)); } UPB_INLINE void envoy_api_v2_route_VirtualHost_set_name(envoy_api_v2_route_VirtualHost *msg, upb_strview value) { UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(12, 16)) = value; } UPB_INLINE upb_strview* envoy_api_v2_route_VirtualHost_mutable_domains(envoy_api_v2_route_VirtualHost *msg, size_t *len) { - return (upb_strview*)_upb_array_mutable_accessor(msg, UPB_SIZE(36, 64), len); + return (upb_strview*)_upb_array_mutable_accessor(msg, UPB_SIZE(40, 72), len); } UPB_INLINE upb_strview* envoy_api_v2_route_VirtualHost_resize_domains(envoy_api_v2_route_VirtualHost *msg, size_t len, upb_arena *arena) { - return (upb_strview*)_upb_array_resize_accessor(msg, UPB_SIZE(36, 64), len, UPB_SIZE(8, 16), UPB_TYPE_STRING, arena); + return (upb_strview*)_upb_array_resize_accessor(msg, UPB_SIZE(40, 72), len, UPB_SIZE(8, 16), UPB_TYPE_STRING, arena); } UPB_INLINE bool envoy_api_v2_route_VirtualHost_add_domains(envoy_api_v2_route_VirtualHost *msg, upb_strview val, upb_arena *arena) { return _upb_array_append_accessor( - msg, UPB_SIZE(36, 64), UPB_SIZE(8, 16), UPB_TYPE_STRING, &val, arena); + msg, UPB_SIZE(40, 72), UPB_SIZE(8, 16), UPB_TYPE_STRING, &val, arena); } UPB_INLINE envoy_api_v2_route_Route** envoy_api_v2_route_VirtualHost_mutable_routes(envoy_api_v2_route_VirtualHost *msg, size_t *len) { - return (envoy_api_v2_route_Route**)_upb_array_mutable_accessor(msg, UPB_SIZE(40, 72), len); + return (envoy_api_v2_route_Route**)_upb_array_mutable_accessor(msg, UPB_SIZE(44, 80), len); } UPB_INLINE envoy_api_v2_route_Route** envoy_api_v2_route_VirtualHost_resize_routes(envoy_api_v2_route_VirtualHost *msg, size_t len, upb_arena *arena) { - return (envoy_api_v2_route_Route**)_upb_array_resize_accessor(msg, UPB_SIZE(40, 72), len, UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, arena); + return (envoy_api_v2_route_Route**)_upb_array_resize_accessor(msg, UPB_SIZE(44, 80), len, UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, arena); } UPB_INLINE struct envoy_api_v2_route_Route* envoy_api_v2_route_VirtualHost_add_routes(envoy_api_v2_route_VirtualHost *msg, upb_arena *arena) { struct envoy_api_v2_route_Route* sub = (struct envoy_api_v2_route_Route*)upb_msg_new(&envoy_api_v2_route_Route_msginit, arena); bool ok = _upb_array_append_accessor( - msg, UPB_SIZE(40, 72), UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, &sub, arena); + msg, UPB_SIZE(44, 80), UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, &sub, arena); if (!ok) return NULL; return sub; } @@ -265,41 +272,41 @@ UPB_INLINE void envoy_api_v2_route_VirtualHost_set_require_tls(envoy_api_v2_rout UPB_FIELD_AT(msg, int32_t, UPB_SIZE(0, 0)) = value; } UPB_INLINE envoy_api_v2_route_VirtualCluster** envoy_api_v2_route_VirtualHost_mutable_virtual_clusters(envoy_api_v2_route_VirtualHost *msg, size_t *len) { - return (envoy_api_v2_route_VirtualCluster**)_upb_array_mutable_accessor(msg, UPB_SIZE(44, 80), len); + return (envoy_api_v2_route_VirtualCluster**)_upb_array_mutable_accessor(msg, UPB_SIZE(48, 88), len); } UPB_INLINE envoy_api_v2_route_VirtualCluster** envoy_api_v2_route_VirtualHost_resize_virtual_clusters(envoy_api_v2_route_VirtualHost *msg, size_t len, upb_arena *arena) { - return (envoy_api_v2_route_VirtualCluster**)_upb_array_resize_accessor(msg, UPB_SIZE(44, 80), len, UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, arena); + return (envoy_api_v2_route_VirtualCluster**)_upb_array_resize_accessor(msg, UPB_SIZE(48, 88), len, UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, arena); } UPB_INLINE struct envoy_api_v2_route_VirtualCluster* envoy_api_v2_route_VirtualHost_add_virtual_clusters(envoy_api_v2_route_VirtualHost *msg, upb_arena *arena) { struct envoy_api_v2_route_VirtualCluster* sub = (struct envoy_api_v2_route_VirtualCluster*)upb_msg_new(&envoy_api_v2_route_VirtualCluster_msginit, arena); bool ok = _upb_array_append_accessor( - msg, UPB_SIZE(44, 80), UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, &sub, arena); + msg, UPB_SIZE(48, 88), UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, &sub, arena); if (!ok) return NULL; return sub; } UPB_INLINE envoy_api_v2_route_RateLimit** envoy_api_v2_route_VirtualHost_mutable_rate_limits(envoy_api_v2_route_VirtualHost *msg, size_t *len) { - return (envoy_api_v2_route_RateLimit**)_upb_array_mutable_accessor(msg, UPB_SIZE(48, 88), len); + return (envoy_api_v2_route_RateLimit**)_upb_array_mutable_accessor(msg, UPB_SIZE(52, 96), len); } UPB_INLINE envoy_api_v2_route_RateLimit** envoy_api_v2_route_VirtualHost_resize_rate_limits(envoy_api_v2_route_VirtualHost *msg, size_t len, upb_arena *arena) { - return (envoy_api_v2_route_RateLimit**)_upb_array_resize_accessor(msg, UPB_SIZE(48, 88), len, UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, arena); + return (envoy_api_v2_route_RateLimit**)_upb_array_resize_accessor(msg, UPB_SIZE(52, 96), len, UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, arena); } UPB_INLINE struct envoy_api_v2_route_RateLimit* envoy_api_v2_route_VirtualHost_add_rate_limits(envoy_api_v2_route_VirtualHost *msg, upb_arena *arena) { struct envoy_api_v2_route_RateLimit* sub = (struct envoy_api_v2_route_RateLimit*)upb_msg_new(&envoy_api_v2_route_RateLimit_msginit, arena); bool ok = _upb_array_append_accessor( - msg, UPB_SIZE(48, 88), UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, &sub, arena); + msg, UPB_SIZE(52, 96), UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, &sub, arena); if (!ok) return NULL; return sub; } UPB_INLINE struct envoy_api_v2_core_HeaderValueOption** envoy_api_v2_route_VirtualHost_mutable_request_headers_to_add(envoy_api_v2_route_VirtualHost *msg, size_t *len) { - return (struct envoy_api_v2_core_HeaderValueOption**)_upb_array_mutable_accessor(msg, UPB_SIZE(52, 96), len); + return (struct envoy_api_v2_core_HeaderValueOption**)_upb_array_mutable_accessor(msg, UPB_SIZE(56, 104), len); } UPB_INLINE struct envoy_api_v2_core_HeaderValueOption** envoy_api_v2_route_VirtualHost_resize_request_headers_to_add(envoy_api_v2_route_VirtualHost *msg, size_t len, upb_arena *arena) { - return (struct envoy_api_v2_core_HeaderValueOption**)_upb_array_resize_accessor(msg, UPB_SIZE(52, 96), len, UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, arena); + return (struct envoy_api_v2_core_HeaderValueOption**)_upb_array_resize_accessor(msg, UPB_SIZE(56, 104), len, UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, arena); } UPB_INLINE struct envoy_api_v2_core_HeaderValueOption* envoy_api_v2_route_VirtualHost_add_request_headers_to_add(envoy_api_v2_route_VirtualHost *msg, upb_arena *arena) { struct envoy_api_v2_core_HeaderValueOption* sub = (struct envoy_api_v2_core_HeaderValueOption*)upb_msg_new(&envoy_api_v2_core_HeaderValueOption_msginit, arena); bool ok = _upb_array_append_accessor( - msg, UPB_SIZE(52, 96), UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, &sub, arena); + msg, UPB_SIZE(56, 104), UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, &sub, arena); if (!ok) return NULL; return sub; } @@ -316,64 +323,64 @@ UPB_INLINE struct envoy_api_v2_route_CorsPolicy* envoy_api_v2_route_VirtualHost_ return sub; } UPB_INLINE struct envoy_api_v2_core_HeaderValueOption** envoy_api_v2_route_VirtualHost_mutable_response_headers_to_add(envoy_api_v2_route_VirtualHost *msg, size_t *len) { - return (struct envoy_api_v2_core_HeaderValueOption**)_upb_array_mutable_accessor(msg, UPB_SIZE(56, 104), len); + return (struct envoy_api_v2_core_HeaderValueOption**)_upb_array_mutable_accessor(msg, UPB_SIZE(60, 112), len); } UPB_INLINE struct envoy_api_v2_core_HeaderValueOption** envoy_api_v2_route_VirtualHost_resize_response_headers_to_add(envoy_api_v2_route_VirtualHost *msg, size_t len, upb_arena *arena) { - return (struct envoy_api_v2_core_HeaderValueOption**)_upb_array_resize_accessor(msg, UPB_SIZE(56, 104), len, UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, arena); + return (struct envoy_api_v2_core_HeaderValueOption**)_upb_array_resize_accessor(msg, UPB_SIZE(60, 112), len, UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, arena); } UPB_INLINE struct envoy_api_v2_core_HeaderValueOption* envoy_api_v2_route_VirtualHost_add_response_headers_to_add(envoy_api_v2_route_VirtualHost *msg, upb_arena *arena) { struct envoy_api_v2_core_HeaderValueOption* sub = (struct envoy_api_v2_core_HeaderValueOption*)upb_msg_new(&envoy_api_v2_core_HeaderValueOption_msginit, arena); bool ok = _upb_array_append_accessor( - msg, UPB_SIZE(56, 104), UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, &sub, arena); + msg, UPB_SIZE(60, 112), UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, &sub, arena); if (!ok) return NULL; return sub; } UPB_INLINE upb_strview* envoy_api_v2_route_VirtualHost_mutable_response_headers_to_remove(envoy_api_v2_route_VirtualHost *msg, size_t *len) { - return (upb_strview*)_upb_array_mutable_accessor(msg, UPB_SIZE(60, 112), len); + return (upb_strview*)_upb_array_mutable_accessor(msg, UPB_SIZE(64, 120), len); } UPB_INLINE upb_strview* envoy_api_v2_route_VirtualHost_resize_response_headers_to_remove(envoy_api_v2_route_VirtualHost *msg, size_t len, upb_arena *arena) { - return (upb_strview*)_upb_array_resize_accessor(msg, UPB_SIZE(60, 112), len, UPB_SIZE(8, 16), UPB_TYPE_STRING, arena); + return (upb_strview*)_upb_array_resize_accessor(msg, UPB_SIZE(64, 120), len, UPB_SIZE(8, 16), UPB_TYPE_STRING, arena); } UPB_INLINE bool envoy_api_v2_route_VirtualHost_add_response_headers_to_remove(envoy_api_v2_route_VirtualHost *msg, upb_strview val, upb_arena *arena) { return _upb_array_append_accessor( - msg, UPB_SIZE(60, 112), UPB_SIZE(8, 16), UPB_TYPE_STRING, &val, arena); + msg, UPB_SIZE(64, 120), UPB_SIZE(8, 16), UPB_TYPE_STRING, &val, arena); } UPB_INLINE envoy_api_v2_route_VirtualHost_PerFilterConfigEntry** envoy_api_v2_route_VirtualHost_mutable_per_filter_config(envoy_api_v2_route_VirtualHost *msg, size_t *len) { - return (envoy_api_v2_route_VirtualHost_PerFilterConfigEntry**)_upb_array_mutable_accessor(msg, UPB_SIZE(64, 120), len); + return (envoy_api_v2_route_VirtualHost_PerFilterConfigEntry**)_upb_array_mutable_accessor(msg, UPB_SIZE(68, 128), len); } UPB_INLINE envoy_api_v2_route_VirtualHost_PerFilterConfigEntry** envoy_api_v2_route_VirtualHost_resize_per_filter_config(envoy_api_v2_route_VirtualHost *msg, size_t len, upb_arena *arena) { - return (envoy_api_v2_route_VirtualHost_PerFilterConfigEntry**)_upb_array_resize_accessor(msg, UPB_SIZE(64, 120), len, UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, arena); + return (envoy_api_v2_route_VirtualHost_PerFilterConfigEntry**)_upb_array_resize_accessor(msg, UPB_SIZE(68, 128), len, UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, arena); } UPB_INLINE struct envoy_api_v2_route_VirtualHost_PerFilterConfigEntry* envoy_api_v2_route_VirtualHost_add_per_filter_config(envoy_api_v2_route_VirtualHost *msg, upb_arena *arena) { struct envoy_api_v2_route_VirtualHost_PerFilterConfigEntry* sub = (struct envoy_api_v2_route_VirtualHost_PerFilterConfigEntry*)upb_msg_new(&envoy_api_v2_route_VirtualHost_PerFilterConfigEntry_msginit, arena); bool ok = _upb_array_append_accessor( - msg, UPB_SIZE(64, 120), UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, &sub, arena); + msg, UPB_SIZE(68, 128), UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, &sub, arena); if (!ok) return NULL; return sub; } UPB_INLINE upb_strview* envoy_api_v2_route_VirtualHost_mutable_request_headers_to_remove(envoy_api_v2_route_VirtualHost *msg, size_t *len) { - return (upb_strview*)_upb_array_mutable_accessor(msg, UPB_SIZE(68, 128), len); + return (upb_strview*)_upb_array_mutable_accessor(msg, UPB_SIZE(72, 136), len); } UPB_INLINE upb_strview* envoy_api_v2_route_VirtualHost_resize_request_headers_to_remove(envoy_api_v2_route_VirtualHost *msg, size_t len, upb_arena *arena) { - return (upb_strview*)_upb_array_resize_accessor(msg, UPB_SIZE(68, 128), len, UPB_SIZE(8, 16), UPB_TYPE_STRING, arena); + return (upb_strview*)_upb_array_resize_accessor(msg, UPB_SIZE(72, 136), len, UPB_SIZE(8, 16), UPB_TYPE_STRING, arena); } UPB_INLINE bool envoy_api_v2_route_VirtualHost_add_request_headers_to_remove(envoy_api_v2_route_VirtualHost *msg, upb_strview val, upb_arena *arena) { return _upb_array_append_accessor( - msg, UPB_SIZE(68, 128), UPB_SIZE(8, 16), UPB_TYPE_STRING, &val, arena); + msg, UPB_SIZE(72, 136), UPB_SIZE(8, 16), UPB_TYPE_STRING, &val, arena); } UPB_INLINE void envoy_api_v2_route_VirtualHost_set_include_request_attempt_count(envoy_api_v2_route_VirtualHost *msg, bool value) { UPB_FIELD_AT(msg, bool, UPB_SIZE(8, 8)) = value; } UPB_INLINE envoy_api_v2_route_VirtualHost_TypedPerFilterConfigEntry** envoy_api_v2_route_VirtualHost_mutable_typed_per_filter_config(envoy_api_v2_route_VirtualHost *msg, size_t *len) { - return (envoy_api_v2_route_VirtualHost_TypedPerFilterConfigEntry**)_upb_array_mutable_accessor(msg, UPB_SIZE(72, 136), len); + return (envoy_api_v2_route_VirtualHost_TypedPerFilterConfigEntry**)_upb_array_mutable_accessor(msg, UPB_SIZE(76, 144), len); } UPB_INLINE envoy_api_v2_route_VirtualHost_TypedPerFilterConfigEntry** envoy_api_v2_route_VirtualHost_resize_typed_per_filter_config(envoy_api_v2_route_VirtualHost *msg, size_t len, upb_arena *arena) { - return (envoy_api_v2_route_VirtualHost_TypedPerFilterConfigEntry**)_upb_array_resize_accessor(msg, UPB_SIZE(72, 136), len, UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, arena); + return (envoy_api_v2_route_VirtualHost_TypedPerFilterConfigEntry**)_upb_array_resize_accessor(msg, UPB_SIZE(76, 144), len, UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, arena); } UPB_INLINE struct envoy_api_v2_route_VirtualHost_TypedPerFilterConfigEntry* envoy_api_v2_route_VirtualHost_add_typed_per_filter_config(envoy_api_v2_route_VirtualHost *msg, upb_arena *arena) { struct envoy_api_v2_route_VirtualHost_TypedPerFilterConfigEntry* sub = (struct envoy_api_v2_route_VirtualHost_TypedPerFilterConfigEntry*)upb_msg_new(&envoy_api_v2_route_VirtualHost_TypedPerFilterConfigEntry_msginit, arena); bool ok = _upb_array_append_accessor( - msg, UPB_SIZE(72, 136), UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, &sub, arena); + msg, UPB_SIZE(76, 144), UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, &sub, arena); if (!ok) return NULL; return sub; } @@ -413,6 +420,21 @@ UPB_INLINE struct google_protobuf_UInt32Value* envoy_api_v2_route_VirtualHost_mu } return sub; } +UPB_INLINE void envoy_api_v2_route_VirtualHost_set_include_attempt_count_in_response(envoy_api_v2_route_VirtualHost *msg, bool value) { + UPB_FIELD_AT(msg, bool, UPB_SIZE(9, 9)) = value; +} +UPB_INLINE void envoy_api_v2_route_VirtualHost_set_retry_policy_typed_config(envoy_api_v2_route_VirtualHost *msg, struct google_protobuf_Any* value) { + UPB_FIELD_AT(msg, struct google_protobuf_Any*, UPB_SIZE(36, 64)) = value; +} +UPB_INLINE struct google_protobuf_Any* envoy_api_v2_route_VirtualHost_mutable_retry_policy_typed_config(envoy_api_v2_route_VirtualHost *msg, upb_arena *arena) { + struct google_protobuf_Any* sub = (struct google_protobuf_Any*)envoy_api_v2_route_VirtualHost_retry_policy_typed_config(msg); + if (sub == NULL) { + sub = (struct google_protobuf_Any*)upb_msg_new(&google_protobuf_Any_msginit, arena); + if (!sub) return NULL; + envoy_api_v2_route_VirtualHost_set_retry_policy_typed_config(msg, sub); + } + return sub; +} /* envoy.api.v2.route.VirtualHost.PerFilterConfigEntry */ @@ -1381,7 +1403,7 @@ typedef enum { envoy_api_v2_route_RouteAction_cluster_specifier_weighted_clusters = 3, envoy_api_v2_route_RouteAction_cluster_specifier_NOT_SET = 0 } envoy_api_v2_route_RouteAction_cluster_specifier_oneofcases; -UPB_INLINE envoy_api_v2_route_RouteAction_cluster_specifier_oneofcases envoy_api_v2_route_RouteAction_cluster_specifier_case(const envoy_api_v2_route_RouteAction* msg) { return (envoy_api_v2_route_RouteAction_cluster_specifier_oneofcases)UPB_FIELD_AT(msg, int32_t, UPB_SIZE(100, 176)); } +UPB_INLINE envoy_api_v2_route_RouteAction_cluster_specifier_oneofcases envoy_api_v2_route_RouteAction_cluster_specifier_case(const envoy_api_v2_route_RouteAction* msg) { return (envoy_api_v2_route_RouteAction_cluster_specifier_oneofcases)UPB_FIELD_AT(msg, int32_t, UPB_SIZE(108, 192)); } typedef enum { envoy_api_v2_route_RouteAction_host_rewrite_specifier_host_rewrite = 6, @@ -1389,48 +1411,50 @@ typedef enum { envoy_api_v2_route_RouteAction_host_rewrite_specifier_auto_host_rewrite_header = 29, envoy_api_v2_route_RouteAction_host_rewrite_specifier_NOT_SET = 0 } envoy_api_v2_route_RouteAction_host_rewrite_specifier_oneofcases; -UPB_INLINE envoy_api_v2_route_RouteAction_host_rewrite_specifier_oneofcases envoy_api_v2_route_RouteAction_host_rewrite_specifier_case(const envoy_api_v2_route_RouteAction* msg) { return (envoy_api_v2_route_RouteAction_host_rewrite_specifier_oneofcases)UPB_FIELD_AT(msg, int32_t, UPB_SIZE(112, 200)); } - -UPB_INLINE bool envoy_api_v2_route_RouteAction_has_cluster(const envoy_api_v2_route_RouteAction *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(100, 176), 1); } -UPB_INLINE upb_strview envoy_api_v2_route_RouteAction_cluster(const envoy_api_v2_route_RouteAction *msg) { return UPB_READ_ONEOF(msg, upb_strview, UPB_SIZE(92, 160), UPB_SIZE(100, 176), 1, upb_strview_make("", strlen(""))); } -UPB_INLINE bool envoy_api_v2_route_RouteAction_has_cluster_header(const envoy_api_v2_route_RouteAction *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(100, 176), 2); } -UPB_INLINE upb_strview envoy_api_v2_route_RouteAction_cluster_header(const envoy_api_v2_route_RouteAction *msg) { return UPB_READ_ONEOF(msg, upb_strview, UPB_SIZE(92, 160), UPB_SIZE(100, 176), 2, upb_strview_make("", strlen(""))); } -UPB_INLINE bool envoy_api_v2_route_RouteAction_has_weighted_clusters(const envoy_api_v2_route_RouteAction *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(100, 176), 3); } -UPB_INLINE const envoy_api_v2_route_WeightedCluster* envoy_api_v2_route_RouteAction_weighted_clusters(const envoy_api_v2_route_RouteAction *msg) { return UPB_READ_ONEOF(msg, const envoy_api_v2_route_WeightedCluster*, UPB_SIZE(92, 160), UPB_SIZE(100, 176), 3, NULL); } +UPB_INLINE envoy_api_v2_route_RouteAction_host_rewrite_specifier_oneofcases envoy_api_v2_route_RouteAction_host_rewrite_specifier_case(const envoy_api_v2_route_RouteAction* msg) { return (envoy_api_v2_route_RouteAction_host_rewrite_specifier_oneofcases)UPB_FIELD_AT(msg, int32_t, UPB_SIZE(120, 216)); } + +UPB_INLINE bool envoy_api_v2_route_RouteAction_has_cluster(const envoy_api_v2_route_RouteAction *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(108, 192), 1); } +UPB_INLINE upb_strview envoy_api_v2_route_RouteAction_cluster(const envoy_api_v2_route_RouteAction *msg) { return UPB_READ_ONEOF(msg, upb_strview, UPB_SIZE(100, 176), UPB_SIZE(108, 192), 1, upb_strview_make("", strlen(""))); } +UPB_INLINE bool envoy_api_v2_route_RouteAction_has_cluster_header(const envoy_api_v2_route_RouteAction *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(108, 192), 2); } +UPB_INLINE upb_strview envoy_api_v2_route_RouteAction_cluster_header(const envoy_api_v2_route_RouteAction *msg) { return UPB_READ_ONEOF(msg, upb_strview, UPB_SIZE(100, 176), UPB_SIZE(108, 192), 2, upb_strview_make("", strlen(""))); } +UPB_INLINE bool envoy_api_v2_route_RouteAction_has_weighted_clusters(const envoy_api_v2_route_RouteAction *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(108, 192), 3); } +UPB_INLINE const envoy_api_v2_route_WeightedCluster* envoy_api_v2_route_RouteAction_weighted_clusters(const envoy_api_v2_route_RouteAction *msg) { return UPB_READ_ONEOF(msg, const envoy_api_v2_route_WeightedCluster*, UPB_SIZE(100, 176), UPB_SIZE(108, 192), 3, NULL); } UPB_INLINE const struct envoy_api_v2_core_Metadata* envoy_api_v2_route_RouteAction_metadata_match(const envoy_api_v2_route_RouteAction *msg) { return UPB_FIELD_AT(msg, const struct envoy_api_v2_core_Metadata*, UPB_SIZE(32, 40)); } UPB_INLINE upb_strview envoy_api_v2_route_RouteAction_prefix_rewrite(const envoy_api_v2_route_RouteAction *msg) { return UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(24, 24)); } -UPB_INLINE bool envoy_api_v2_route_RouteAction_has_host_rewrite(const envoy_api_v2_route_RouteAction *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(112, 200), 6); } -UPB_INLINE upb_strview envoy_api_v2_route_RouteAction_host_rewrite(const envoy_api_v2_route_RouteAction *msg) { return UPB_READ_ONEOF(msg, upb_strview, UPB_SIZE(104, 184), UPB_SIZE(112, 200), 6, upb_strview_make("", strlen(""))); } -UPB_INLINE bool envoy_api_v2_route_RouteAction_has_auto_host_rewrite(const envoy_api_v2_route_RouteAction *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(112, 200), 7); } -UPB_INLINE const struct google_protobuf_BoolValue* envoy_api_v2_route_RouteAction_auto_host_rewrite(const envoy_api_v2_route_RouteAction *msg) { return UPB_READ_ONEOF(msg, const struct google_protobuf_BoolValue*, UPB_SIZE(104, 184), UPB_SIZE(112, 200), 7, NULL); } +UPB_INLINE bool envoy_api_v2_route_RouteAction_has_host_rewrite(const envoy_api_v2_route_RouteAction *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(120, 216), 6); } +UPB_INLINE upb_strview envoy_api_v2_route_RouteAction_host_rewrite(const envoy_api_v2_route_RouteAction *msg) { return UPB_READ_ONEOF(msg, upb_strview, UPB_SIZE(112, 200), UPB_SIZE(120, 216), 6, upb_strview_make("", strlen(""))); } +UPB_INLINE bool envoy_api_v2_route_RouteAction_has_auto_host_rewrite(const envoy_api_v2_route_RouteAction *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(120, 216), 7); } +UPB_INLINE const struct google_protobuf_BoolValue* envoy_api_v2_route_RouteAction_auto_host_rewrite(const envoy_api_v2_route_RouteAction *msg) { return UPB_READ_ONEOF(msg, const struct google_protobuf_BoolValue*, UPB_SIZE(112, 200), UPB_SIZE(120, 216), 7, NULL); } UPB_INLINE const struct google_protobuf_Duration* envoy_api_v2_route_RouteAction_timeout(const envoy_api_v2_route_RouteAction *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_Duration*, UPB_SIZE(36, 48)); } UPB_INLINE const envoy_api_v2_route_RetryPolicy* envoy_api_v2_route_RouteAction_retry_policy(const envoy_api_v2_route_RouteAction *msg) { return UPB_FIELD_AT(msg, const envoy_api_v2_route_RetryPolicy*, UPB_SIZE(40, 56)); } UPB_INLINE const envoy_api_v2_route_RouteAction_RequestMirrorPolicy* envoy_api_v2_route_RouteAction_request_mirror_policy(const envoy_api_v2_route_RouteAction *msg) { return UPB_FIELD_AT(msg, const envoy_api_v2_route_RouteAction_RequestMirrorPolicy*, UPB_SIZE(44, 64)); } UPB_INLINE int32_t envoy_api_v2_route_RouteAction_priority(const envoy_api_v2_route_RouteAction *msg) { return UPB_FIELD_AT(msg, int32_t, UPB_SIZE(0, 0)); } -UPB_INLINE const envoy_api_v2_route_RateLimit* const* envoy_api_v2_route_RouteAction_rate_limits(const envoy_api_v2_route_RouteAction *msg, size_t *len) { return (const envoy_api_v2_route_RateLimit* const*)_upb_array_accessor(msg, UPB_SIZE(76, 128), len); } +UPB_INLINE const envoy_api_v2_route_RateLimit* const* envoy_api_v2_route_RouteAction_rate_limits(const envoy_api_v2_route_RouteAction *msg, size_t *len) { return (const envoy_api_v2_route_RateLimit* const*)_upb_array_accessor(msg, UPB_SIZE(84, 144), len); } UPB_INLINE const struct google_protobuf_BoolValue* envoy_api_v2_route_RouteAction_include_vh_rate_limits(const envoy_api_v2_route_RouteAction *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_BoolValue*, UPB_SIZE(48, 72)); } -UPB_INLINE const envoy_api_v2_route_RouteAction_HashPolicy* const* envoy_api_v2_route_RouteAction_hash_policy(const envoy_api_v2_route_RouteAction *msg, size_t *len) { return (const envoy_api_v2_route_RouteAction_HashPolicy* const*)_upb_array_accessor(msg, UPB_SIZE(80, 136), len); } +UPB_INLINE const envoy_api_v2_route_RouteAction_HashPolicy* const* envoy_api_v2_route_RouteAction_hash_policy(const envoy_api_v2_route_RouteAction *msg, size_t *len) { return (const envoy_api_v2_route_RouteAction_HashPolicy* const*)_upb_array_accessor(msg, UPB_SIZE(88, 152), len); } UPB_INLINE const envoy_api_v2_route_CorsPolicy* envoy_api_v2_route_RouteAction_cors(const envoy_api_v2_route_RouteAction *msg) { return UPB_FIELD_AT(msg, const envoy_api_v2_route_CorsPolicy*, UPB_SIZE(52, 80)); } UPB_INLINE int32_t envoy_api_v2_route_RouteAction_cluster_not_found_response_code(const envoy_api_v2_route_RouteAction *msg) { return UPB_FIELD_AT(msg, int32_t, UPB_SIZE(8, 8)); } UPB_INLINE const struct google_protobuf_Duration* envoy_api_v2_route_RouteAction_max_grpc_timeout(const envoy_api_v2_route_RouteAction *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_Duration*, UPB_SIZE(56, 88)); } UPB_INLINE const struct google_protobuf_Duration* envoy_api_v2_route_RouteAction_idle_timeout(const envoy_api_v2_route_RouteAction *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_Duration*, UPB_SIZE(60, 96)); } -UPB_INLINE const envoy_api_v2_route_RouteAction_UpgradeConfig* const* envoy_api_v2_route_RouteAction_upgrade_configs(const envoy_api_v2_route_RouteAction *msg, size_t *len) { return (const envoy_api_v2_route_RouteAction_UpgradeConfig* const*)_upb_array_accessor(msg, UPB_SIZE(84, 144), len); } +UPB_INLINE const envoy_api_v2_route_RouteAction_UpgradeConfig* const* envoy_api_v2_route_RouteAction_upgrade_configs(const envoy_api_v2_route_RouteAction *msg, size_t *len) { return (const envoy_api_v2_route_RouteAction_UpgradeConfig* const*)_upb_array_accessor(msg, UPB_SIZE(92, 160), len); } UPB_INLINE int32_t envoy_api_v2_route_RouteAction_internal_redirect_action(const envoy_api_v2_route_RouteAction *msg) { return UPB_FIELD_AT(msg, int32_t, UPB_SIZE(16, 16)); } UPB_INLINE const envoy_api_v2_route_HedgePolicy* envoy_api_v2_route_RouteAction_hedge_policy(const envoy_api_v2_route_RouteAction *msg) { return UPB_FIELD_AT(msg, const envoy_api_v2_route_HedgePolicy*, UPB_SIZE(64, 104)); } UPB_INLINE const struct google_protobuf_Duration* envoy_api_v2_route_RouteAction_grpc_timeout_offset(const envoy_api_v2_route_RouteAction *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_Duration*, UPB_SIZE(68, 112)); } -UPB_INLINE bool envoy_api_v2_route_RouteAction_has_auto_host_rewrite_header(const envoy_api_v2_route_RouteAction *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(112, 200), 29); } -UPB_INLINE upb_strview envoy_api_v2_route_RouteAction_auto_host_rewrite_header(const envoy_api_v2_route_RouteAction *msg) { return UPB_READ_ONEOF(msg, upb_strview, UPB_SIZE(104, 184), UPB_SIZE(112, 200), 29, upb_strview_make("", strlen(""))); } -UPB_INLINE const envoy_api_v2_route_RouteAction_RequestMirrorPolicy* const* envoy_api_v2_route_RouteAction_request_mirror_policies(const envoy_api_v2_route_RouteAction *msg, size_t *len) { return (const envoy_api_v2_route_RouteAction_RequestMirrorPolicy* const*)_upb_array_accessor(msg, UPB_SIZE(88, 152), len); } +UPB_INLINE bool envoy_api_v2_route_RouteAction_has_auto_host_rewrite_header(const envoy_api_v2_route_RouteAction *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(120, 216), 29); } +UPB_INLINE upb_strview envoy_api_v2_route_RouteAction_auto_host_rewrite_header(const envoy_api_v2_route_RouteAction *msg) { return UPB_READ_ONEOF(msg, upb_strview, UPB_SIZE(112, 200), UPB_SIZE(120, 216), 29, upb_strview_make("", strlen(""))); } +UPB_INLINE const envoy_api_v2_route_RouteAction_RequestMirrorPolicy* const* envoy_api_v2_route_RouteAction_request_mirror_policies(const envoy_api_v2_route_RouteAction *msg, size_t *len) { return (const envoy_api_v2_route_RouteAction_RequestMirrorPolicy* const*)_upb_array_accessor(msg, UPB_SIZE(96, 168), len); } UPB_INLINE const struct google_protobuf_UInt32Value* envoy_api_v2_route_RouteAction_max_internal_redirects(const envoy_api_v2_route_RouteAction *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_UInt32Value*, UPB_SIZE(72, 120)); } +UPB_INLINE const struct envoy_type_matcher_RegexMatchAndSubstitute* envoy_api_v2_route_RouteAction_regex_rewrite(const envoy_api_v2_route_RouteAction *msg) { return UPB_FIELD_AT(msg, const struct envoy_type_matcher_RegexMatchAndSubstitute*, UPB_SIZE(76, 128)); } +UPB_INLINE const struct google_protobuf_Any* envoy_api_v2_route_RouteAction_retry_policy_typed_config(const envoy_api_v2_route_RouteAction *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_Any*, UPB_SIZE(80, 136)); } UPB_INLINE void envoy_api_v2_route_RouteAction_set_cluster(envoy_api_v2_route_RouteAction *msg, upb_strview value) { - UPB_WRITE_ONEOF(msg, upb_strview, UPB_SIZE(92, 160), value, UPB_SIZE(100, 176), 1); + UPB_WRITE_ONEOF(msg, upb_strview, UPB_SIZE(100, 176), value, UPB_SIZE(108, 192), 1); } UPB_INLINE void envoy_api_v2_route_RouteAction_set_cluster_header(envoy_api_v2_route_RouteAction *msg, upb_strview value) { - UPB_WRITE_ONEOF(msg, upb_strview, UPB_SIZE(92, 160), value, UPB_SIZE(100, 176), 2); + UPB_WRITE_ONEOF(msg, upb_strview, UPB_SIZE(100, 176), value, UPB_SIZE(108, 192), 2); } UPB_INLINE void envoy_api_v2_route_RouteAction_set_weighted_clusters(envoy_api_v2_route_RouteAction *msg, envoy_api_v2_route_WeightedCluster* value) { - UPB_WRITE_ONEOF(msg, envoy_api_v2_route_WeightedCluster*, UPB_SIZE(92, 160), value, UPB_SIZE(100, 176), 3); + UPB_WRITE_ONEOF(msg, envoy_api_v2_route_WeightedCluster*, UPB_SIZE(100, 176), value, UPB_SIZE(108, 192), 3); } UPB_INLINE struct envoy_api_v2_route_WeightedCluster* envoy_api_v2_route_RouteAction_mutable_weighted_clusters(envoy_api_v2_route_RouteAction *msg, upb_arena *arena) { struct envoy_api_v2_route_WeightedCluster* sub = (struct envoy_api_v2_route_WeightedCluster*)envoy_api_v2_route_RouteAction_weighted_clusters(msg); @@ -1457,10 +1481,10 @@ UPB_INLINE void envoy_api_v2_route_RouteAction_set_prefix_rewrite(envoy_api_v2_r UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(24, 24)) = value; } UPB_INLINE void envoy_api_v2_route_RouteAction_set_host_rewrite(envoy_api_v2_route_RouteAction *msg, upb_strview value) { - UPB_WRITE_ONEOF(msg, upb_strview, UPB_SIZE(104, 184), value, UPB_SIZE(112, 200), 6); + UPB_WRITE_ONEOF(msg, upb_strview, UPB_SIZE(112, 200), value, UPB_SIZE(120, 216), 6); } UPB_INLINE void envoy_api_v2_route_RouteAction_set_auto_host_rewrite(envoy_api_v2_route_RouteAction *msg, struct google_protobuf_BoolValue* value) { - UPB_WRITE_ONEOF(msg, struct google_protobuf_BoolValue*, UPB_SIZE(104, 184), value, UPB_SIZE(112, 200), 7); + UPB_WRITE_ONEOF(msg, struct google_protobuf_BoolValue*, UPB_SIZE(112, 200), value, UPB_SIZE(120, 216), 7); } UPB_INLINE struct google_protobuf_BoolValue* envoy_api_v2_route_RouteAction_mutable_auto_host_rewrite(envoy_api_v2_route_RouteAction *msg, upb_arena *arena) { struct google_protobuf_BoolValue* sub = (struct google_protobuf_BoolValue*)envoy_api_v2_route_RouteAction_auto_host_rewrite(msg); @@ -1511,15 +1535,15 @@ UPB_INLINE void envoy_api_v2_route_RouteAction_set_priority(envoy_api_v2_route_R UPB_FIELD_AT(msg, int32_t, UPB_SIZE(0, 0)) = value; } UPB_INLINE envoy_api_v2_route_RateLimit** envoy_api_v2_route_RouteAction_mutable_rate_limits(envoy_api_v2_route_RouteAction *msg, size_t *len) { - return (envoy_api_v2_route_RateLimit**)_upb_array_mutable_accessor(msg, UPB_SIZE(76, 128), len); + return (envoy_api_v2_route_RateLimit**)_upb_array_mutable_accessor(msg, UPB_SIZE(84, 144), len); } UPB_INLINE envoy_api_v2_route_RateLimit** envoy_api_v2_route_RouteAction_resize_rate_limits(envoy_api_v2_route_RouteAction *msg, size_t len, upb_arena *arena) { - return (envoy_api_v2_route_RateLimit**)_upb_array_resize_accessor(msg, UPB_SIZE(76, 128), len, UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, arena); + return (envoy_api_v2_route_RateLimit**)_upb_array_resize_accessor(msg, UPB_SIZE(84, 144), len, UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, arena); } UPB_INLINE struct envoy_api_v2_route_RateLimit* envoy_api_v2_route_RouteAction_add_rate_limits(envoy_api_v2_route_RouteAction *msg, upb_arena *arena) { struct envoy_api_v2_route_RateLimit* sub = (struct envoy_api_v2_route_RateLimit*)upb_msg_new(&envoy_api_v2_route_RateLimit_msginit, arena); bool ok = _upb_array_append_accessor( - msg, UPB_SIZE(76, 128), UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, &sub, arena); + msg, UPB_SIZE(84, 144), UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, &sub, arena); if (!ok) return NULL; return sub; } @@ -1536,15 +1560,15 @@ UPB_INLINE struct google_protobuf_BoolValue* envoy_api_v2_route_RouteAction_muta return sub; } UPB_INLINE envoy_api_v2_route_RouteAction_HashPolicy** envoy_api_v2_route_RouteAction_mutable_hash_policy(envoy_api_v2_route_RouteAction *msg, size_t *len) { - return (envoy_api_v2_route_RouteAction_HashPolicy**)_upb_array_mutable_accessor(msg, UPB_SIZE(80, 136), len); + return (envoy_api_v2_route_RouteAction_HashPolicy**)_upb_array_mutable_accessor(msg, UPB_SIZE(88, 152), len); } UPB_INLINE envoy_api_v2_route_RouteAction_HashPolicy** envoy_api_v2_route_RouteAction_resize_hash_policy(envoy_api_v2_route_RouteAction *msg, size_t len, upb_arena *arena) { - return (envoy_api_v2_route_RouteAction_HashPolicy**)_upb_array_resize_accessor(msg, UPB_SIZE(80, 136), len, UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, arena); + return (envoy_api_v2_route_RouteAction_HashPolicy**)_upb_array_resize_accessor(msg, UPB_SIZE(88, 152), len, UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, arena); } UPB_INLINE struct envoy_api_v2_route_RouteAction_HashPolicy* envoy_api_v2_route_RouteAction_add_hash_policy(envoy_api_v2_route_RouteAction *msg, upb_arena *arena) { struct envoy_api_v2_route_RouteAction_HashPolicy* sub = (struct envoy_api_v2_route_RouteAction_HashPolicy*)upb_msg_new(&envoy_api_v2_route_RouteAction_HashPolicy_msginit, arena); bool ok = _upb_array_append_accessor( - msg, UPB_SIZE(80, 136), UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, &sub, arena); + msg, UPB_SIZE(88, 152), UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, &sub, arena); if (!ok) return NULL; return sub; } @@ -1588,15 +1612,15 @@ UPB_INLINE struct google_protobuf_Duration* envoy_api_v2_route_RouteAction_mutab return sub; } UPB_INLINE envoy_api_v2_route_RouteAction_UpgradeConfig** envoy_api_v2_route_RouteAction_mutable_upgrade_configs(envoy_api_v2_route_RouteAction *msg, size_t *len) { - return (envoy_api_v2_route_RouteAction_UpgradeConfig**)_upb_array_mutable_accessor(msg, UPB_SIZE(84, 144), len); + return (envoy_api_v2_route_RouteAction_UpgradeConfig**)_upb_array_mutable_accessor(msg, UPB_SIZE(92, 160), len); } UPB_INLINE envoy_api_v2_route_RouteAction_UpgradeConfig** envoy_api_v2_route_RouteAction_resize_upgrade_configs(envoy_api_v2_route_RouteAction *msg, size_t len, upb_arena *arena) { - return (envoy_api_v2_route_RouteAction_UpgradeConfig**)_upb_array_resize_accessor(msg, UPB_SIZE(84, 144), len, UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, arena); + return (envoy_api_v2_route_RouteAction_UpgradeConfig**)_upb_array_resize_accessor(msg, UPB_SIZE(92, 160), len, UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, arena); } UPB_INLINE struct envoy_api_v2_route_RouteAction_UpgradeConfig* envoy_api_v2_route_RouteAction_add_upgrade_configs(envoy_api_v2_route_RouteAction *msg, upb_arena *arena) { struct envoy_api_v2_route_RouteAction_UpgradeConfig* sub = (struct envoy_api_v2_route_RouteAction_UpgradeConfig*)upb_msg_new(&envoy_api_v2_route_RouteAction_UpgradeConfig_msginit, arena); bool ok = _upb_array_append_accessor( - msg, UPB_SIZE(84, 144), UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, &sub, arena); + msg, UPB_SIZE(92, 160), UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, &sub, arena); if (!ok) return NULL; return sub; } @@ -1628,18 +1652,18 @@ UPB_INLINE struct google_protobuf_Duration* envoy_api_v2_route_RouteAction_mutab return sub; } UPB_INLINE void envoy_api_v2_route_RouteAction_set_auto_host_rewrite_header(envoy_api_v2_route_RouteAction *msg, upb_strview value) { - UPB_WRITE_ONEOF(msg, upb_strview, UPB_SIZE(104, 184), value, UPB_SIZE(112, 200), 29); + UPB_WRITE_ONEOF(msg, upb_strview, UPB_SIZE(112, 200), value, UPB_SIZE(120, 216), 29); } UPB_INLINE envoy_api_v2_route_RouteAction_RequestMirrorPolicy** envoy_api_v2_route_RouteAction_mutable_request_mirror_policies(envoy_api_v2_route_RouteAction *msg, size_t *len) { - return (envoy_api_v2_route_RouteAction_RequestMirrorPolicy**)_upb_array_mutable_accessor(msg, UPB_SIZE(88, 152), len); + return (envoy_api_v2_route_RouteAction_RequestMirrorPolicy**)_upb_array_mutable_accessor(msg, UPB_SIZE(96, 168), len); } UPB_INLINE envoy_api_v2_route_RouteAction_RequestMirrorPolicy** envoy_api_v2_route_RouteAction_resize_request_mirror_policies(envoy_api_v2_route_RouteAction *msg, size_t len, upb_arena *arena) { - return (envoy_api_v2_route_RouteAction_RequestMirrorPolicy**)_upb_array_resize_accessor(msg, UPB_SIZE(88, 152), len, UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, arena); + return (envoy_api_v2_route_RouteAction_RequestMirrorPolicy**)_upb_array_resize_accessor(msg, UPB_SIZE(96, 168), len, UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, arena); } UPB_INLINE struct envoy_api_v2_route_RouteAction_RequestMirrorPolicy* envoy_api_v2_route_RouteAction_add_request_mirror_policies(envoy_api_v2_route_RouteAction *msg, upb_arena *arena) { struct envoy_api_v2_route_RouteAction_RequestMirrorPolicy* sub = (struct envoy_api_v2_route_RouteAction_RequestMirrorPolicy*)upb_msg_new(&envoy_api_v2_route_RouteAction_RequestMirrorPolicy_msginit, arena); bool ok = _upb_array_append_accessor( - msg, UPB_SIZE(88, 152), UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, &sub, arena); + msg, UPB_SIZE(96, 168), UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, &sub, arena); if (!ok) return NULL; return sub; } @@ -1655,6 +1679,30 @@ UPB_INLINE struct google_protobuf_UInt32Value* envoy_api_v2_route_RouteAction_mu } return sub; } +UPB_INLINE void envoy_api_v2_route_RouteAction_set_regex_rewrite(envoy_api_v2_route_RouteAction *msg, struct envoy_type_matcher_RegexMatchAndSubstitute* value) { + UPB_FIELD_AT(msg, struct envoy_type_matcher_RegexMatchAndSubstitute*, UPB_SIZE(76, 128)) = value; +} +UPB_INLINE struct envoy_type_matcher_RegexMatchAndSubstitute* envoy_api_v2_route_RouteAction_mutable_regex_rewrite(envoy_api_v2_route_RouteAction *msg, upb_arena *arena) { + struct envoy_type_matcher_RegexMatchAndSubstitute* sub = (struct envoy_type_matcher_RegexMatchAndSubstitute*)envoy_api_v2_route_RouteAction_regex_rewrite(msg); + if (sub == NULL) { + sub = (struct envoy_type_matcher_RegexMatchAndSubstitute*)upb_msg_new(&envoy_type_matcher_RegexMatchAndSubstitute_msginit, arena); + if (!sub) return NULL; + envoy_api_v2_route_RouteAction_set_regex_rewrite(msg, sub); + } + return sub; +} +UPB_INLINE void envoy_api_v2_route_RouteAction_set_retry_policy_typed_config(envoy_api_v2_route_RouteAction *msg, struct google_protobuf_Any* value) { + UPB_FIELD_AT(msg, struct google_protobuf_Any*, UPB_SIZE(80, 136)) = value; +} +UPB_INLINE struct google_protobuf_Any* envoy_api_v2_route_RouteAction_mutable_retry_policy_typed_config(envoy_api_v2_route_RouteAction *msg, upb_arena *arena) { + struct google_protobuf_Any* sub = (struct google_protobuf_Any*)envoy_api_v2_route_RouteAction_retry_policy_typed_config(msg); + if (sub == NULL) { + sub = (struct google_protobuf_Any*)upb_msg_new(&google_protobuf_Any_msginit, arena); + if (!sub) return NULL; + envoy_api_v2_route_RouteAction_set_retry_policy_typed_config(msg, sub); + } + return sub; +} /* envoy.api.v2.route.RouteAction.RequestMirrorPolicy */ @@ -1673,6 +1721,7 @@ UPB_INLINE char *envoy_api_v2_route_RouteAction_RequestMirrorPolicy_serialize(co UPB_INLINE upb_strview envoy_api_v2_route_RouteAction_RequestMirrorPolicy_cluster(const envoy_api_v2_route_RouteAction_RequestMirrorPolicy *msg) { return UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(0, 0)); } UPB_INLINE upb_strview envoy_api_v2_route_RouteAction_RequestMirrorPolicy_runtime_key(const envoy_api_v2_route_RouteAction_RequestMirrorPolicy *msg) { return UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(8, 16)); } UPB_INLINE const struct envoy_api_v2_core_RuntimeFractionalPercent* envoy_api_v2_route_RouteAction_RequestMirrorPolicy_runtime_fraction(const envoy_api_v2_route_RouteAction_RequestMirrorPolicy *msg) { return UPB_FIELD_AT(msg, const struct envoy_api_v2_core_RuntimeFractionalPercent*, UPB_SIZE(16, 32)); } +UPB_INLINE const struct google_protobuf_BoolValue* envoy_api_v2_route_RouteAction_RequestMirrorPolicy_trace_sampled(const envoy_api_v2_route_RouteAction_RequestMirrorPolicy *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_BoolValue*, UPB_SIZE(20, 40)); } UPB_INLINE void envoy_api_v2_route_RouteAction_RequestMirrorPolicy_set_cluster(envoy_api_v2_route_RouteAction_RequestMirrorPolicy *msg, upb_strview value) { UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(0, 0)) = value; @@ -1692,6 +1741,18 @@ UPB_INLINE struct envoy_api_v2_core_RuntimeFractionalPercent* envoy_api_v2_route } return sub; } +UPB_INLINE void envoy_api_v2_route_RouteAction_RequestMirrorPolicy_set_trace_sampled(envoy_api_v2_route_RouteAction_RequestMirrorPolicy *msg, struct google_protobuf_BoolValue* value) { + UPB_FIELD_AT(msg, struct google_protobuf_BoolValue*, UPB_SIZE(20, 40)) = value; +} +UPB_INLINE struct google_protobuf_BoolValue* envoy_api_v2_route_RouteAction_RequestMirrorPolicy_mutable_trace_sampled(envoy_api_v2_route_RouteAction_RequestMirrorPolicy *msg, upb_arena *arena) { + struct google_protobuf_BoolValue* sub = (struct google_protobuf_BoolValue*)envoy_api_v2_route_RouteAction_RequestMirrorPolicy_trace_sampled(msg); + if (sub == NULL) { + sub = (struct google_protobuf_BoolValue*)upb_msg_new(&google_protobuf_BoolValue_msginit, arena); + if (!sub) return NULL; + envoy_api_v2_route_RouteAction_RequestMirrorPolicy_set_trace_sampled(msg, sub); + } + return sub; +} /* envoy.api.v2.route.RouteAction.HashPolicy */ @@ -1712,6 +1773,7 @@ typedef enum { envoy_api_v2_route_RouteAction_HashPolicy_policy_specifier_cookie = 2, envoy_api_v2_route_RouteAction_HashPolicy_policy_specifier_connection_properties = 3, envoy_api_v2_route_RouteAction_HashPolicy_policy_specifier_query_parameter = 5, + envoy_api_v2_route_RouteAction_HashPolicy_policy_specifier_filter_state = 6, envoy_api_v2_route_RouteAction_HashPolicy_policy_specifier_NOT_SET = 0 } envoy_api_v2_route_RouteAction_HashPolicy_policy_specifier_oneofcases; UPB_INLINE envoy_api_v2_route_RouteAction_HashPolicy_policy_specifier_oneofcases envoy_api_v2_route_RouteAction_HashPolicy_policy_specifier_case(const envoy_api_v2_route_RouteAction_HashPolicy* msg) { return (envoy_api_v2_route_RouteAction_HashPolicy_policy_specifier_oneofcases)UPB_FIELD_AT(msg, int32_t, UPB_SIZE(8, 16)); } @@ -1725,6 +1787,8 @@ UPB_INLINE const envoy_api_v2_route_RouteAction_HashPolicy_ConnectionProperties* UPB_INLINE bool envoy_api_v2_route_RouteAction_HashPolicy_terminal(const envoy_api_v2_route_RouteAction_HashPolicy *msg) { return UPB_FIELD_AT(msg, bool, UPB_SIZE(0, 0)); } UPB_INLINE bool envoy_api_v2_route_RouteAction_HashPolicy_has_query_parameter(const envoy_api_v2_route_RouteAction_HashPolicy *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(8, 16), 5); } UPB_INLINE const envoy_api_v2_route_RouteAction_HashPolicy_QueryParameter* envoy_api_v2_route_RouteAction_HashPolicy_query_parameter(const envoy_api_v2_route_RouteAction_HashPolicy *msg) { return UPB_READ_ONEOF(msg, const envoy_api_v2_route_RouteAction_HashPolicy_QueryParameter*, UPB_SIZE(4, 8), UPB_SIZE(8, 16), 5, NULL); } +UPB_INLINE bool envoy_api_v2_route_RouteAction_HashPolicy_has_filter_state(const envoy_api_v2_route_RouteAction_HashPolicy *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(8, 16), 6); } +UPB_INLINE const envoy_api_v2_route_RouteAction_HashPolicy_FilterState* envoy_api_v2_route_RouteAction_HashPolicy_filter_state(const envoy_api_v2_route_RouteAction_HashPolicy *msg) { return UPB_READ_ONEOF(msg, const envoy_api_v2_route_RouteAction_HashPolicy_FilterState*, UPB_SIZE(4, 8), UPB_SIZE(8, 16), 6, NULL); } UPB_INLINE void envoy_api_v2_route_RouteAction_HashPolicy_set_header(envoy_api_v2_route_RouteAction_HashPolicy *msg, envoy_api_v2_route_RouteAction_HashPolicy_Header* value) { UPB_WRITE_ONEOF(msg, envoy_api_v2_route_RouteAction_HashPolicy_Header*, UPB_SIZE(4, 8), value, UPB_SIZE(8, 16), 1); @@ -1777,6 +1841,18 @@ UPB_INLINE struct envoy_api_v2_route_RouteAction_HashPolicy_QueryParameter* envo } return sub; } +UPB_INLINE void envoy_api_v2_route_RouteAction_HashPolicy_set_filter_state(envoy_api_v2_route_RouteAction_HashPolicy *msg, envoy_api_v2_route_RouteAction_HashPolicy_FilterState* value) { + UPB_WRITE_ONEOF(msg, envoy_api_v2_route_RouteAction_HashPolicy_FilterState*, UPB_SIZE(4, 8), value, UPB_SIZE(8, 16), 6); +} +UPB_INLINE struct envoy_api_v2_route_RouteAction_HashPolicy_FilterState* envoy_api_v2_route_RouteAction_HashPolicy_mutable_filter_state(envoy_api_v2_route_RouteAction_HashPolicy *msg, upb_arena *arena) { + struct envoy_api_v2_route_RouteAction_HashPolicy_FilterState* sub = (struct envoy_api_v2_route_RouteAction_HashPolicy_FilterState*)envoy_api_v2_route_RouteAction_HashPolicy_filter_state(msg); + if (sub == NULL) { + sub = (struct envoy_api_v2_route_RouteAction_HashPolicy_FilterState*)upb_msg_new(&envoy_api_v2_route_RouteAction_HashPolicy_FilterState_msginit, arena); + if (!sub) return NULL; + envoy_api_v2_route_RouteAction_HashPolicy_set_filter_state(msg, sub); + } + return sub; +} /* envoy.api.v2.route.RouteAction.HashPolicy.Header */ @@ -1875,6 +1951,26 @@ UPB_INLINE void envoy_api_v2_route_RouteAction_HashPolicy_QueryParameter_set_nam UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(0, 0)) = value; } +/* envoy.api.v2.route.RouteAction.HashPolicy.FilterState */ + +UPB_INLINE envoy_api_v2_route_RouteAction_HashPolicy_FilterState *envoy_api_v2_route_RouteAction_HashPolicy_FilterState_new(upb_arena *arena) { + return (envoy_api_v2_route_RouteAction_HashPolicy_FilterState *)upb_msg_new(&envoy_api_v2_route_RouteAction_HashPolicy_FilterState_msginit, arena); +} +UPB_INLINE envoy_api_v2_route_RouteAction_HashPolicy_FilterState *envoy_api_v2_route_RouteAction_HashPolicy_FilterState_parse(const char *buf, size_t size, + upb_arena *arena) { + envoy_api_v2_route_RouteAction_HashPolicy_FilterState *ret = envoy_api_v2_route_RouteAction_HashPolicy_FilterState_new(arena); + return (ret && upb_decode(buf, size, ret, &envoy_api_v2_route_RouteAction_HashPolicy_FilterState_msginit, arena)) ? ret : NULL; +} +UPB_INLINE char *envoy_api_v2_route_RouteAction_HashPolicy_FilterState_serialize(const envoy_api_v2_route_RouteAction_HashPolicy_FilterState *msg, upb_arena *arena, size_t *len) { + return upb_encode(msg, &envoy_api_v2_route_RouteAction_HashPolicy_FilterState_msginit, arena, len); +} + +UPB_INLINE upb_strview envoy_api_v2_route_RouteAction_HashPolicy_FilterState_key(const envoy_api_v2_route_RouteAction_HashPolicy_FilterState *msg) { return UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(0, 0)); } + +UPB_INLINE void envoy_api_v2_route_RouteAction_HashPolicy_FilterState_set_key(envoy_api_v2_route_RouteAction_HashPolicy_FilterState *msg, upb_strview value) { + UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(0, 0)) = value; +} + /* envoy.api.v2.route.RouteAction.UpgradeConfig */ UPB_INLINE envoy_api_v2_route_RouteAction_UpgradeConfig *envoy_api_v2_route_RouteAction_UpgradeConfig_new(upb_arena *arena) { diff --git a/src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.c b/src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.c index 6de0fdd9a0e..05261163799 100644 --- a/src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.c +++ b/src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.c @@ -10,6 +10,7 @@ #include "upb/msg.h" #include "envoy/api/v2/scoped_route.upb.h" #include "udpa/annotations/migrate.upb.h" +#include "udpa/annotations/status.upb.h" #include "validate/validate.upb.h" #include "upb/port_def.inc" diff --git a/src/core/ext/upb-generated/envoy/api/v2/srds.upb.c b/src/core/ext/upb-generated/envoy/api/v2/srds.upb.c index 1711cb772d0..9b5a7f5823d 100644 --- a/src/core/ext/upb-generated/envoy/api/v2/srds.upb.c +++ b/src/core/ext/upb-generated/envoy/api/v2/srds.upb.c @@ -13,6 +13,7 @@ #include "google/api/annotations.upb.h" #include "envoy/annotations/resource.upb.h" #include "udpa/annotations/migrate.upb.h" +#include "udpa/annotations/status.upb.h" #include "envoy/api/v2/scoped_route.upb.h" #include "upb/port_def.inc" diff --git a/src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.c b/src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.c index d551ab2f014..42aef4f9271 100644 --- a/src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.c +++ b/src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.c @@ -15,6 +15,7 @@ #include "google/protobuf/any.upb.h" #include "google/protobuf/struct.upb.h" #include "udpa/annotations/migrate.upb.h" +#include "udpa/annotations/status.upb.h" #include "validate/validate.upb.h" #include "upb/port_def.inc" diff --git a/src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.c b/src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.c index b062628c0b1..c7f2bb10d5b 100644 --- a/src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.c +++ b/src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.c @@ -14,6 +14,7 @@ #include "envoy/api/v2/route.upb.h" #include "envoy/api/v2/scoped_route.upb.h" #include "envoy/config/filter/accesslog/v2/accesslog.upb.h" +#include "envoy/config/trace/v2/http_tracer.upb.h" #include "envoy/type/percent.upb.h" #include "envoy/type/tracing/v2/custom_tag.upb.h" #include "google/protobuf/any.upb.h" @@ -22,11 +23,12 @@ #include "google/protobuf/wrappers.upb.h" #include "envoy/annotations/deprecation.upb.h" #include "udpa/annotations/migrate.upb.h" +#include "udpa/annotations/status.upb.h" #include "validate/validate.upb.h" #include "upb/port_def.inc" -static const upb_msglayout *const envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_submsgs[22] = { +static const upb_msglayout *const envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_submsgs[23] = { &envoy_api_v2_RouteConfiguration_msginit, &envoy_api_v2_core_Http1ProtocolOptions_msginit, &envoy_api_v2_core_Http2ProtocolOptions_msginit, @@ -38,28 +40,29 @@ static const upb_msglayout *const envoy_config_filter_network_http_connection_ma &envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_UpgradeConfig_msginit, &envoy_config_filter_network_http_connection_manager_v2_HttpFilter_msginit, &envoy_config_filter_network_http_connection_manager_v2_Rds_msginit, + &envoy_config_filter_network_http_connection_manager_v2_RequestIDExtension_msginit, &envoy_config_filter_network_http_connection_manager_v2_ScopedRoutes_msginit, &google_protobuf_BoolValue_msginit, &google_protobuf_Duration_msginit, &google_protobuf_UInt32Value_msginit, }; -static const upb_msglayout_field envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager__fields[34] = { +static const upb_msglayout_field envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager__fields[35] = { {1, UPB_SIZE(0, 0), 0, 0, 14, 1}, {2, UPB_SIZE(36, 40), 0, 0, 9, 1}, - {3, UPB_SIZE(136, 240), UPB_SIZE(-141, -249), 10, 11, 1}, - {4, UPB_SIZE(136, 240), UPB_SIZE(-141, -249), 0, 11, 1}, - {5, UPB_SIZE(124, 216), 0, 9, 11, 3}, - {6, UPB_SIZE(60, 88), 0, 12, 11, 1}, + {3, UPB_SIZE(140, 248), UPB_SIZE(-145, -257), 10, 11, 1}, + {4, UPB_SIZE(140, 248), UPB_SIZE(-145, -257), 0, 11, 1}, + {5, UPB_SIZE(128, 224), 0, 9, 11, 3}, + {6, UPB_SIZE(60, 88), 0, 13, 11, 1}, {7, UPB_SIZE(64, 96), 0, 7, 11, 1}, {8, UPB_SIZE(68, 104), 0, 1, 11, 1}, {9, UPB_SIZE(72, 112), 0, 2, 11, 1}, {10, UPB_SIZE(44, 56), 0, 0, 9, 1}, - {11, UPB_SIZE(76, 120), 0, 13, 11, 1}, - {12, UPB_SIZE(80, 128), 0, 13, 11, 1}, - {13, UPB_SIZE(128, 224), 0, 4, 11, 3}, - {14, UPB_SIZE(84, 136), 0, 12, 11, 1}, - {15, UPB_SIZE(88, 144), 0, 12, 11, 1}, + {11, UPB_SIZE(76, 120), 0, 14, 11, 1}, + {12, UPB_SIZE(80, 128), 0, 14, 11, 1}, + {13, UPB_SIZE(132, 232), 0, 4, 11, 3}, + {14, UPB_SIZE(84, 136), 0, 13, 11, 1}, + {15, UPB_SIZE(88, 144), 0, 13, 11, 1}, {16, UPB_SIZE(8, 8), 0, 0, 14, 1}, {17, UPB_SIZE(92, 152), 0, 6, 11, 1}, {18, UPB_SIZE(28, 28), 0, 0, 8, 1}, @@ -67,47 +70,50 @@ static const upb_msglayout_field envoy_config_filter_network_http_connection_man {20, UPB_SIZE(29, 29), 0, 0, 8, 1}, {21, UPB_SIZE(30, 30), 0, 0, 8, 1}, {22, UPB_SIZE(52, 72), 0, 0, 9, 1}, - {23, UPB_SIZE(132, 232), 0, 8, 11, 3}, - {24, UPB_SIZE(96, 160), 0, 13, 11, 1}, + {23, UPB_SIZE(136, 240), 0, 8, 11, 3}, + {24, UPB_SIZE(96, 160), 0, 14, 11, 1}, {25, UPB_SIZE(100, 168), 0, 5, 11, 1}, - {26, UPB_SIZE(104, 176), 0, 13, 11, 1}, - {28, UPB_SIZE(108, 184), 0, 13, 11, 1}, - {29, UPB_SIZE(112, 192), 0, 14, 11, 1}, - {30, UPB_SIZE(116, 200), 0, 12, 11, 1}, - {31, UPB_SIZE(136, 240), UPB_SIZE(-141, -249), 11, 11, 1}, + {26, UPB_SIZE(104, 176), 0, 14, 11, 1}, + {28, UPB_SIZE(108, 184), 0, 14, 11, 1}, + {29, UPB_SIZE(112, 192), 0, 15, 11, 1}, + {30, UPB_SIZE(116, 200), 0, 13, 11, 1}, + {31, UPB_SIZE(140, 248), UPB_SIZE(-145, -257), 12, 11, 1}, {32, UPB_SIZE(31, 31), 0, 0, 8, 1}, {33, UPB_SIZE(32, 32), 0, 0, 8, 1}, {34, UPB_SIZE(16, 16), 0, 0, 14, 1}, {35, UPB_SIZE(120, 208), 0, 3, 11, 1}, + {36, UPB_SIZE(124, 216), 0, 11, 11, 1}, }; const upb_msglayout envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_msginit = { &envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_submsgs[0], &envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager__fields[0], - UPB_SIZE(144, 256), 34, false, + UPB_SIZE(152, 272), 35, false, }; -static const upb_msglayout *const envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_Tracing_submsgs[5] = { +static const upb_msglayout *const envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_Tracing_submsgs[6] = { + &envoy_config_trace_v2_Tracing_Http_msginit, &envoy_type_Percent_msginit, &envoy_type_tracing_v2_CustomTag_msginit, &google_protobuf_UInt32Value_msginit, }; -static const upb_msglayout_field envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_Tracing__fields[8] = { +static const upb_msglayout_field envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_Tracing__fields[9] = { {1, UPB_SIZE(0, 0), 0, 0, 14, 1}, - {2, UPB_SIZE(28, 48), 0, 0, 9, 3}, - {3, UPB_SIZE(12, 16), 0, 0, 11, 1}, - {4, UPB_SIZE(16, 24), 0, 0, 11, 1}, - {5, UPB_SIZE(20, 32), 0, 0, 11, 1}, + {2, UPB_SIZE(32, 56), 0, 0, 9, 3}, + {3, UPB_SIZE(12, 16), 0, 1, 11, 1}, + {4, UPB_SIZE(16, 24), 0, 1, 11, 1}, + {5, UPB_SIZE(20, 32), 0, 1, 11, 1}, {6, UPB_SIZE(8, 8), 0, 0, 8, 1}, - {7, UPB_SIZE(24, 40), 0, 2, 11, 1}, - {8, UPB_SIZE(32, 56), 0, 1, 11, 3}, + {7, UPB_SIZE(24, 40), 0, 3, 11, 1}, + {8, UPB_SIZE(36, 64), 0, 2, 11, 3}, + {9, UPB_SIZE(28, 48), 0, 0, 11, 1}, }; const upb_msglayout envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_Tracing_msginit = { &envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_Tracing_submsgs[0], &envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_Tracing__fields[0], - UPB_SIZE(40, 64), 8, false, + UPB_SIZE(40, 72), 9, false, }; static const upb_msglayout_field envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_InternalAddressConfig__fields[1] = { @@ -292,5 +298,19 @@ const upb_msglayout envoy_config_filter_network_http_connection_manager_v2_HttpF UPB_SIZE(16, 32), 3, false, }; +static const upb_msglayout *const envoy_config_filter_network_http_connection_manager_v2_RequestIDExtension_submsgs[1] = { + &google_protobuf_Any_msginit, +}; + +static const upb_msglayout_field envoy_config_filter_network_http_connection_manager_v2_RequestIDExtension__fields[1] = { + {1, UPB_SIZE(0, 0), 0, 0, 11, 1}, +}; + +const upb_msglayout envoy_config_filter_network_http_connection_manager_v2_RequestIDExtension_msginit = { + &envoy_config_filter_network_http_connection_manager_v2_RequestIDExtension_submsgs[0], + &envoy_config_filter_network_http_connection_manager_v2_RequestIDExtension__fields[0], + UPB_SIZE(4, 8), 1, false, +}; + #include "upb/port_undef.inc" diff --git a/src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.h b/src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.h index 94252529984..a0fe5c74ce5 100644 --- a/src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.h +++ b/src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.h @@ -34,6 +34,7 @@ struct envoy_config_filter_network_http_connection_manager_v2_ScopedRoutes_Scope struct envoy_config_filter_network_http_connection_manager_v2_ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_HeaderValueExtractor_KvElement; struct envoy_config_filter_network_http_connection_manager_v2_ScopedRds; struct envoy_config_filter_network_http_connection_manager_v2_HttpFilter; +struct envoy_config_filter_network_http_connection_manager_v2_RequestIDExtension; typedef struct envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager; typedef struct envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_Tracing envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_Tracing; typedef struct envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_InternalAddressConfig envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_InternalAddressConfig; @@ -48,6 +49,7 @@ typedef struct envoy_config_filter_network_http_connection_manager_v2_ScopedRout typedef struct envoy_config_filter_network_http_connection_manager_v2_ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_HeaderValueExtractor_KvElement envoy_config_filter_network_http_connection_manager_v2_ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_HeaderValueExtractor_KvElement; typedef struct envoy_config_filter_network_http_connection_manager_v2_ScopedRds envoy_config_filter_network_http_connection_manager_v2_ScopedRds; typedef struct envoy_config_filter_network_http_connection_manager_v2_HttpFilter envoy_config_filter_network_http_connection_manager_v2_HttpFilter; +typedef struct envoy_config_filter_network_http_connection_manager_v2_RequestIDExtension envoy_config_filter_network_http_connection_manager_v2_RequestIDExtension; extern const upb_msglayout envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_msginit; extern const upb_msglayout envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_Tracing_msginit; extern const upb_msglayout envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_InternalAddressConfig_msginit; @@ -62,6 +64,7 @@ extern const upb_msglayout envoy_config_filter_network_http_connection_manager_v extern const upb_msglayout envoy_config_filter_network_http_connection_manager_v2_ScopedRoutes_ScopeKeyBuilder_FragmentBuilder_HeaderValueExtractor_KvElement_msginit; extern const upb_msglayout envoy_config_filter_network_http_connection_manager_v2_ScopedRds_msginit; extern const upb_msglayout envoy_config_filter_network_http_connection_manager_v2_HttpFilter_msginit; +extern const upb_msglayout envoy_config_filter_network_http_connection_manager_v2_RequestIDExtension_msginit; struct envoy_api_v2_RouteConfiguration; struct envoy_api_v2_ScopedRouteConfiguration; struct envoy_api_v2_core_ConfigSource; @@ -69,6 +72,7 @@ struct envoy_api_v2_core_Http1ProtocolOptions; struct envoy_api_v2_core_Http2ProtocolOptions; struct envoy_api_v2_core_HttpProtocolOptions; struct envoy_config_filter_accesslog_v2_AccessLog; +struct envoy_config_trace_v2_Tracing_Http; struct envoy_type_Percent; struct envoy_type_tracing_v2_CustomTag; struct google_protobuf_Any; @@ -83,6 +87,7 @@ extern const upb_msglayout envoy_api_v2_core_Http1ProtocolOptions_msginit; extern const upb_msglayout envoy_api_v2_core_Http2ProtocolOptions_msginit; extern const upb_msglayout envoy_api_v2_core_HttpProtocolOptions_msginit; extern const upb_msglayout envoy_config_filter_accesslog_v2_AccessLog_msginit; +extern const upb_msglayout envoy_config_trace_v2_Tracing_Http_msginit; extern const upb_msglayout envoy_type_Percent_msginit; extern const upb_msglayout envoy_type_tracing_v2_CustomTag_msginit; extern const upb_msglayout google_protobuf_Any_msginit; @@ -138,15 +143,15 @@ typedef enum { envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_route_specifier_scoped_routes = 31, envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_route_specifier_NOT_SET = 0 } envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_route_specifier_oneofcases; -UPB_INLINE envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_route_specifier_oneofcases envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_route_specifier_case(const envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager* msg) { return (envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_route_specifier_oneofcases)UPB_FIELD_AT(msg, int32_t, UPB_SIZE(140, 248)); } +UPB_INLINE envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_route_specifier_oneofcases envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_route_specifier_case(const envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager* msg) { return (envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_route_specifier_oneofcases)UPB_FIELD_AT(msg, int32_t, UPB_SIZE(144, 256)); } UPB_INLINE int32_t envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_codec_type(const envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager *msg) { return UPB_FIELD_AT(msg, int32_t, UPB_SIZE(0, 0)); } UPB_INLINE upb_strview envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_stat_prefix(const envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager *msg) { return UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(36, 40)); } -UPB_INLINE bool envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_has_rds(const envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(140, 248), 3); } -UPB_INLINE const envoy_config_filter_network_http_connection_manager_v2_Rds* envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_rds(const envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager *msg) { return UPB_READ_ONEOF(msg, const envoy_config_filter_network_http_connection_manager_v2_Rds*, UPB_SIZE(136, 240), UPB_SIZE(140, 248), 3, NULL); } -UPB_INLINE bool envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_has_route_config(const envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(140, 248), 4); } -UPB_INLINE const struct envoy_api_v2_RouteConfiguration* envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_route_config(const envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager *msg) { return UPB_READ_ONEOF(msg, const struct envoy_api_v2_RouteConfiguration*, UPB_SIZE(136, 240), UPB_SIZE(140, 248), 4, NULL); } -UPB_INLINE const envoy_config_filter_network_http_connection_manager_v2_HttpFilter* const* envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_http_filters(const envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager *msg, size_t *len) { return (const envoy_config_filter_network_http_connection_manager_v2_HttpFilter* const*)_upb_array_accessor(msg, UPB_SIZE(124, 216), len); } +UPB_INLINE bool envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_has_rds(const envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(144, 256), 3); } +UPB_INLINE const envoy_config_filter_network_http_connection_manager_v2_Rds* envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_rds(const envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager *msg) { return UPB_READ_ONEOF(msg, const envoy_config_filter_network_http_connection_manager_v2_Rds*, UPB_SIZE(140, 248), UPB_SIZE(144, 256), 3, NULL); } +UPB_INLINE bool envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_has_route_config(const envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(144, 256), 4); } +UPB_INLINE const struct envoy_api_v2_RouteConfiguration* envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_route_config(const envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager *msg) { return UPB_READ_ONEOF(msg, const struct envoy_api_v2_RouteConfiguration*, UPB_SIZE(140, 248), UPB_SIZE(144, 256), 4, NULL); } +UPB_INLINE const envoy_config_filter_network_http_connection_manager_v2_HttpFilter* const* envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_http_filters(const envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager *msg, size_t *len) { return (const envoy_config_filter_network_http_connection_manager_v2_HttpFilter* const*)_upb_array_accessor(msg, UPB_SIZE(128, 224), len); } UPB_INLINE const struct google_protobuf_BoolValue* envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_add_user_agent(const envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_BoolValue*, UPB_SIZE(60, 88)); } UPB_INLINE const envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_Tracing* envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_tracing(const envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager *msg) { return UPB_FIELD_AT(msg, const envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_Tracing*, UPB_SIZE(64, 96)); } UPB_INLINE const struct envoy_api_v2_core_Http1ProtocolOptions* envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_http_protocol_options(const envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager *msg) { return UPB_FIELD_AT(msg, const struct envoy_api_v2_core_Http1ProtocolOptions*, UPB_SIZE(68, 104)); } @@ -154,7 +159,7 @@ UPB_INLINE const struct envoy_api_v2_core_Http2ProtocolOptions* envoy_config_fil UPB_INLINE upb_strview envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_server_name(const envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager *msg) { return UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(44, 56)); } UPB_INLINE const struct google_protobuf_Duration* envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_idle_timeout(const envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_Duration*, UPB_SIZE(76, 120)); } UPB_INLINE const struct google_protobuf_Duration* envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_drain_timeout(const envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_Duration*, UPB_SIZE(80, 128)); } -UPB_INLINE const struct envoy_config_filter_accesslog_v2_AccessLog* const* envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_access_log(const envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager *msg, size_t *len) { return (const struct envoy_config_filter_accesslog_v2_AccessLog* const*)_upb_array_accessor(msg, UPB_SIZE(128, 224), len); } +UPB_INLINE const struct envoy_config_filter_accesslog_v2_AccessLog* const* envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_access_log(const envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager *msg, size_t *len) { return (const struct envoy_config_filter_accesslog_v2_AccessLog* const*)_upb_array_accessor(msg, UPB_SIZE(132, 232), len); } UPB_INLINE const struct google_protobuf_BoolValue* envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_use_remote_address(const envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_BoolValue*, UPB_SIZE(84, 136)); } UPB_INLINE const struct google_protobuf_BoolValue* envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_generate_request_id(const envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_BoolValue*, UPB_SIZE(88, 144)); } UPB_INLINE int32_t envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_forward_client_cert_details(const envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager *msg) { return UPB_FIELD_AT(msg, int32_t, UPB_SIZE(8, 8)); } @@ -164,19 +169,20 @@ UPB_INLINE uint32_t envoy_config_filter_network_http_connection_manager_v2_HttpC UPB_INLINE bool envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_represent_ipv4_remote_address_as_ipv4_mapped_ipv6(const envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager *msg) { return UPB_FIELD_AT(msg, bool, UPB_SIZE(29, 29)); } UPB_INLINE bool envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_skip_xff_append(const envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager *msg) { return UPB_FIELD_AT(msg, bool, UPB_SIZE(30, 30)); } UPB_INLINE upb_strview envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_via(const envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager *msg) { return UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(52, 72)); } -UPB_INLINE const envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_UpgradeConfig* const* envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_upgrade_configs(const envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager *msg, size_t *len) { return (const envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_UpgradeConfig* const*)_upb_array_accessor(msg, UPB_SIZE(132, 232), len); } +UPB_INLINE const envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_UpgradeConfig* const* envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_upgrade_configs(const envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager *msg, size_t *len) { return (const envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_UpgradeConfig* const*)_upb_array_accessor(msg, UPB_SIZE(136, 240), len); } UPB_INLINE const struct google_protobuf_Duration* envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_stream_idle_timeout(const envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_Duration*, UPB_SIZE(96, 160)); } UPB_INLINE const envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_InternalAddressConfig* envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_internal_address_config(const envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager *msg) { return UPB_FIELD_AT(msg, const envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_InternalAddressConfig*, UPB_SIZE(100, 168)); } UPB_INLINE const struct google_protobuf_Duration* envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_delayed_close_timeout(const envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_Duration*, UPB_SIZE(104, 176)); } UPB_INLINE const struct google_protobuf_Duration* envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_request_timeout(const envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_Duration*, UPB_SIZE(108, 184)); } UPB_INLINE const struct google_protobuf_UInt32Value* envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_max_request_headers_kb(const envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_UInt32Value*, UPB_SIZE(112, 192)); } UPB_INLINE const struct google_protobuf_BoolValue* envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_normalize_path(const envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_BoolValue*, UPB_SIZE(116, 200)); } -UPB_INLINE bool envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_has_scoped_routes(const envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(140, 248), 31); } -UPB_INLINE const envoy_config_filter_network_http_connection_manager_v2_ScopedRoutes* envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_scoped_routes(const envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager *msg) { return UPB_READ_ONEOF(msg, const envoy_config_filter_network_http_connection_manager_v2_ScopedRoutes*, UPB_SIZE(136, 240), UPB_SIZE(140, 248), 31, NULL); } +UPB_INLINE bool envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_has_scoped_routes(const envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(144, 256), 31); } +UPB_INLINE const envoy_config_filter_network_http_connection_manager_v2_ScopedRoutes* envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_scoped_routes(const envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager *msg) { return UPB_READ_ONEOF(msg, const envoy_config_filter_network_http_connection_manager_v2_ScopedRoutes*, UPB_SIZE(140, 248), UPB_SIZE(144, 256), 31, NULL); } UPB_INLINE bool envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_preserve_external_request_id(const envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager *msg) { return UPB_FIELD_AT(msg, bool, UPB_SIZE(31, 31)); } UPB_INLINE bool envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_merge_slashes(const envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager *msg) { return UPB_FIELD_AT(msg, bool, UPB_SIZE(32, 32)); } UPB_INLINE int32_t envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_server_header_transformation(const envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager *msg) { return UPB_FIELD_AT(msg, int32_t, UPB_SIZE(16, 16)); } UPB_INLINE const struct envoy_api_v2_core_HttpProtocolOptions* envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_common_http_protocol_options(const envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager *msg) { return UPB_FIELD_AT(msg, const struct envoy_api_v2_core_HttpProtocolOptions*, UPB_SIZE(120, 208)); } +UPB_INLINE const envoy_config_filter_network_http_connection_manager_v2_RequestIDExtension* envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_request_id_extension(const envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager *msg) { return UPB_FIELD_AT(msg, const envoy_config_filter_network_http_connection_manager_v2_RequestIDExtension*, UPB_SIZE(124, 216)); } UPB_INLINE void envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_set_codec_type(envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager *msg, int32_t value) { UPB_FIELD_AT(msg, int32_t, UPB_SIZE(0, 0)) = value; @@ -185,7 +191,7 @@ UPB_INLINE void envoy_config_filter_network_http_connection_manager_v2_HttpConne UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(36, 40)) = value; } UPB_INLINE void envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_set_rds(envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager *msg, envoy_config_filter_network_http_connection_manager_v2_Rds* value) { - UPB_WRITE_ONEOF(msg, envoy_config_filter_network_http_connection_manager_v2_Rds*, UPB_SIZE(136, 240), value, UPB_SIZE(140, 248), 3); + UPB_WRITE_ONEOF(msg, envoy_config_filter_network_http_connection_manager_v2_Rds*, UPB_SIZE(140, 248), value, UPB_SIZE(144, 256), 3); } UPB_INLINE struct envoy_config_filter_network_http_connection_manager_v2_Rds* envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_mutable_rds(envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager *msg, upb_arena *arena) { struct envoy_config_filter_network_http_connection_manager_v2_Rds* sub = (struct envoy_config_filter_network_http_connection_manager_v2_Rds*)envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_rds(msg); @@ -197,7 +203,7 @@ UPB_INLINE struct envoy_config_filter_network_http_connection_manager_v2_Rds* en return sub; } UPB_INLINE void envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_set_route_config(envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager *msg, struct envoy_api_v2_RouteConfiguration* value) { - UPB_WRITE_ONEOF(msg, struct envoy_api_v2_RouteConfiguration*, UPB_SIZE(136, 240), value, UPB_SIZE(140, 248), 4); + UPB_WRITE_ONEOF(msg, struct envoy_api_v2_RouteConfiguration*, UPB_SIZE(140, 248), value, UPB_SIZE(144, 256), 4); } UPB_INLINE struct envoy_api_v2_RouteConfiguration* envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_mutable_route_config(envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager *msg, upb_arena *arena) { struct envoy_api_v2_RouteConfiguration* sub = (struct envoy_api_v2_RouteConfiguration*)envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_route_config(msg); @@ -209,15 +215,15 @@ UPB_INLINE struct envoy_api_v2_RouteConfiguration* envoy_config_filter_network_h return sub; } UPB_INLINE envoy_config_filter_network_http_connection_manager_v2_HttpFilter** envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_mutable_http_filters(envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager *msg, size_t *len) { - return (envoy_config_filter_network_http_connection_manager_v2_HttpFilter**)_upb_array_mutable_accessor(msg, UPB_SIZE(124, 216), len); + return (envoy_config_filter_network_http_connection_manager_v2_HttpFilter**)_upb_array_mutable_accessor(msg, UPB_SIZE(128, 224), len); } UPB_INLINE envoy_config_filter_network_http_connection_manager_v2_HttpFilter** envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_resize_http_filters(envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager *msg, size_t len, upb_arena *arena) { - return (envoy_config_filter_network_http_connection_manager_v2_HttpFilter**)_upb_array_resize_accessor(msg, UPB_SIZE(124, 216), len, UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, arena); + return (envoy_config_filter_network_http_connection_manager_v2_HttpFilter**)_upb_array_resize_accessor(msg, UPB_SIZE(128, 224), len, UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, arena); } UPB_INLINE struct envoy_config_filter_network_http_connection_manager_v2_HttpFilter* envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_add_http_filters(envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager *msg, upb_arena *arena) { struct envoy_config_filter_network_http_connection_manager_v2_HttpFilter* sub = (struct envoy_config_filter_network_http_connection_manager_v2_HttpFilter*)upb_msg_new(&envoy_config_filter_network_http_connection_manager_v2_HttpFilter_msginit, arena); bool ok = _upb_array_append_accessor( - msg, UPB_SIZE(124, 216), UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, &sub, arena); + msg, UPB_SIZE(128, 224), UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, &sub, arena); if (!ok) return NULL; return sub; } @@ -297,15 +303,15 @@ UPB_INLINE struct google_protobuf_Duration* envoy_config_filter_network_http_con return sub; } UPB_INLINE struct envoy_config_filter_accesslog_v2_AccessLog** envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_mutable_access_log(envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager *msg, size_t *len) { - return (struct envoy_config_filter_accesslog_v2_AccessLog**)_upb_array_mutable_accessor(msg, UPB_SIZE(128, 224), len); + return (struct envoy_config_filter_accesslog_v2_AccessLog**)_upb_array_mutable_accessor(msg, UPB_SIZE(132, 232), len); } UPB_INLINE struct envoy_config_filter_accesslog_v2_AccessLog** envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_resize_access_log(envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager *msg, size_t len, upb_arena *arena) { - return (struct envoy_config_filter_accesslog_v2_AccessLog**)_upb_array_resize_accessor(msg, UPB_SIZE(128, 224), len, UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, arena); + return (struct envoy_config_filter_accesslog_v2_AccessLog**)_upb_array_resize_accessor(msg, UPB_SIZE(132, 232), len, UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, arena); } UPB_INLINE struct envoy_config_filter_accesslog_v2_AccessLog* envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_add_access_log(envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager *msg, upb_arena *arena) { struct envoy_config_filter_accesslog_v2_AccessLog* sub = (struct envoy_config_filter_accesslog_v2_AccessLog*)upb_msg_new(&envoy_config_filter_accesslog_v2_AccessLog_msginit, arena); bool ok = _upb_array_append_accessor( - msg, UPB_SIZE(128, 224), UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, &sub, arena); + msg, UPB_SIZE(132, 232), UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, &sub, arena); if (!ok) return NULL; return sub; } @@ -364,15 +370,15 @@ UPB_INLINE void envoy_config_filter_network_http_connection_manager_v2_HttpConne UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(52, 72)) = value; } UPB_INLINE envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_UpgradeConfig** envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_mutable_upgrade_configs(envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager *msg, size_t *len) { - return (envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_UpgradeConfig**)_upb_array_mutable_accessor(msg, UPB_SIZE(132, 232), len); + return (envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_UpgradeConfig**)_upb_array_mutable_accessor(msg, UPB_SIZE(136, 240), len); } UPB_INLINE envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_UpgradeConfig** envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_resize_upgrade_configs(envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager *msg, size_t len, upb_arena *arena) { - return (envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_UpgradeConfig**)_upb_array_resize_accessor(msg, UPB_SIZE(132, 232), len, UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, arena); + return (envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_UpgradeConfig**)_upb_array_resize_accessor(msg, UPB_SIZE(136, 240), len, UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, arena); } UPB_INLINE struct envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_UpgradeConfig* envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_add_upgrade_configs(envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager *msg, upb_arena *arena) { struct envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_UpgradeConfig* sub = (struct envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_UpgradeConfig*)upb_msg_new(&envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_UpgradeConfig_msginit, arena); bool ok = _upb_array_append_accessor( - msg, UPB_SIZE(132, 232), UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, &sub, arena); + msg, UPB_SIZE(136, 240), UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, &sub, arena); if (!ok) return NULL; return sub; } @@ -449,7 +455,7 @@ UPB_INLINE struct google_protobuf_BoolValue* envoy_config_filter_network_http_co return sub; } UPB_INLINE void envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_set_scoped_routes(envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager *msg, envoy_config_filter_network_http_connection_manager_v2_ScopedRoutes* value) { - UPB_WRITE_ONEOF(msg, envoy_config_filter_network_http_connection_manager_v2_ScopedRoutes*, UPB_SIZE(136, 240), value, UPB_SIZE(140, 248), 31); + UPB_WRITE_ONEOF(msg, envoy_config_filter_network_http_connection_manager_v2_ScopedRoutes*, UPB_SIZE(140, 248), value, UPB_SIZE(144, 256), 31); } UPB_INLINE struct envoy_config_filter_network_http_connection_manager_v2_ScopedRoutes* envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_mutable_scoped_routes(envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager *msg, upb_arena *arena) { struct envoy_config_filter_network_http_connection_manager_v2_ScopedRoutes* sub = (struct envoy_config_filter_network_http_connection_manager_v2_ScopedRoutes*)envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_scoped_routes(msg); @@ -481,6 +487,18 @@ UPB_INLINE struct envoy_api_v2_core_HttpProtocolOptions* envoy_config_filter_net } return sub; } +UPB_INLINE void envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_set_request_id_extension(envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager *msg, envoy_config_filter_network_http_connection_manager_v2_RequestIDExtension* value) { + UPB_FIELD_AT(msg, envoy_config_filter_network_http_connection_manager_v2_RequestIDExtension*, UPB_SIZE(124, 216)) = value; +} +UPB_INLINE struct envoy_config_filter_network_http_connection_manager_v2_RequestIDExtension* envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_mutable_request_id_extension(envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager *msg, upb_arena *arena) { + struct envoy_config_filter_network_http_connection_manager_v2_RequestIDExtension* sub = (struct envoy_config_filter_network_http_connection_manager_v2_RequestIDExtension*)envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_request_id_extension(msg); + if (sub == NULL) { + sub = (struct envoy_config_filter_network_http_connection_manager_v2_RequestIDExtension*)upb_msg_new(&envoy_config_filter_network_http_connection_manager_v2_RequestIDExtension_msginit, arena); + if (!sub) return NULL; + envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_set_request_id_extension(msg, sub); + } + return sub; +} /* envoy.config.filter.network.http_connection_manager.v2.HttpConnectionManager.Tracing */ @@ -497,26 +515,27 @@ UPB_INLINE char *envoy_config_filter_network_http_connection_manager_v2_HttpConn } UPB_INLINE int32_t envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_Tracing_operation_name(const envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_Tracing *msg) { return UPB_FIELD_AT(msg, int32_t, UPB_SIZE(0, 0)); } -UPB_INLINE upb_strview const* envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_Tracing_request_headers_for_tags(const envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_Tracing *msg, size_t *len) { return (upb_strview const*)_upb_array_accessor(msg, UPB_SIZE(28, 48), len); } +UPB_INLINE upb_strview const* envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_Tracing_request_headers_for_tags(const envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_Tracing *msg, size_t *len) { return (upb_strview const*)_upb_array_accessor(msg, UPB_SIZE(32, 56), len); } UPB_INLINE const struct envoy_type_Percent* envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_Tracing_client_sampling(const envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_Tracing *msg) { return UPB_FIELD_AT(msg, const struct envoy_type_Percent*, UPB_SIZE(12, 16)); } UPB_INLINE const struct envoy_type_Percent* envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_Tracing_random_sampling(const envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_Tracing *msg) { return UPB_FIELD_AT(msg, const struct envoy_type_Percent*, UPB_SIZE(16, 24)); } UPB_INLINE const struct envoy_type_Percent* envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_Tracing_overall_sampling(const envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_Tracing *msg) { return UPB_FIELD_AT(msg, const struct envoy_type_Percent*, UPB_SIZE(20, 32)); } UPB_INLINE bool envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_Tracing_verbose(const envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_Tracing *msg) { return UPB_FIELD_AT(msg, bool, UPB_SIZE(8, 8)); } UPB_INLINE const struct google_protobuf_UInt32Value* envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_Tracing_max_path_tag_length(const envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_Tracing *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_UInt32Value*, UPB_SIZE(24, 40)); } -UPB_INLINE const struct envoy_type_tracing_v2_CustomTag* const* envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_Tracing_custom_tags(const envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_Tracing *msg, size_t *len) { return (const struct envoy_type_tracing_v2_CustomTag* const*)_upb_array_accessor(msg, UPB_SIZE(32, 56), len); } +UPB_INLINE const struct envoy_type_tracing_v2_CustomTag* const* envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_Tracing_custom_tags(const envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_Tracing *msg, size_t *len) { return (const struct envoy_type_tracing_v2_CustomTag* const*)_upb_array_accessor(msg, UPB_SIZE(36, 64), len); } +UPB_INLINE const struct envoy_config_trace_v2_Tracing_Http* envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_Tracing_provider(const envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_Tracing *msg) { return UPB_FIELD_AT(msg, const struct envoy_config_trace_v2_Tracing_Http*, UPB_SIZE(28, 48)); } UPB_INLINE void envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_Tracing_set_operation_name(envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_Tracing *msg, int32_t value) { UPB_FIELD_AT(msg, int32_t, UPB_SIZE(0, 0)) = value; } UPB_INLINE upb_strview* envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_Tracing_mutable_request_headers_for_tags(envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_Tracing *msg, size_t *len) { - return (upb_strview*)_upb_array_mutable_accessor(msg, UPB_SIZE(28, 48), len); + return (upb_strview*)_upb_array_mutable_accessor(msg, UPB_SIZE(32, 56), len); } UPB_INLINE upb_strview* envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_Tracing_resize_request_headers_for_tags(envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_Tracing *msg, size_t len, upb_arena *arena) { - return (upb_strview*)_upb_array_resize_accessor(msg, UPB_SIZE(28, 48), len, UPB_SIZE(8, 16), UPB_TYPE_STRING, arena); + return (upb_strview*)_upb_array_resize_accessor(msg, UPB_SIZE(32, 56), len, UPB_SIZE(8, 16), UPB_TYPE_STRING, arena); } UPB_INLINE bool envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_Tracing_add_request_headers_for_tags(envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_Tracing *msg, upb_strview val, upb_arena *arena) { return _upb_array_append_accessor( - msg, UPB_SIZE(28, 48), UPB_SIZE(8, 16), UPB_TYPE_STRING, &val, arena); + msg, UPB_SIZE(32, 56), UPB_SIZE(8, 16), UPB_TYPE_STRING, &val, arena); } UPB_INLINE void envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_Tracing_set_client_sampling(envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_Tracing *msg, struct envoy_type_Percent* value) { UPB_FIELD_AT(msg, struct envoy_type_Percent*, UPB_SIZE(12, 16)) = value; @@ -570,18 +589,30 @@ UPB_INLINE struct google_protobuf_UInt32Value* envoy_config_filter_network_http_ return sub; } UPB_INLINE struct envoy_type_tracing_v2_CustomTag** envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_Tracing_mutable_custom_tags(envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_Tracing *msg, size_t *len) { - return (struct envoy_type_tracing_v2_CustomTag**)_upb_array_mutable_accessor(msg, UPB_SIZE(32, 56), len); + return (struct envoy_type_tracing_v2_CustomTag**)_upb_array_mutable_accessor(msg, UPB_SIZE(36, 64), len); } UPB_INLINE struct envoy_type_tracing_v2_CustomTag** envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_Tracing_resize_custom_tags(envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_Tracing *msg, size_t len, upb_arena *arena) { - return (struct envoy_type_tracing_v2_CustomTag**)_upb_array_resize_accessor(msg, UPB_SIZE(32, 56), len, UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, arena); + return (struct envoy_type_tracing_v2_CustomTag**)_upb_array_resize_accessor(msg, UPB_SIZE(36, 64), len, UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, arena); } UPB_INLINE struct envoy_type_tracing_v2_CustomTag* envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_Tracing_add_custom_tags(envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_Tracing *msg, upb_arena *arena) { struct envoy_type_tracing_v2_CustomTag* sub = (struct envoy_type_tracing_v2_CustomTag*)upb_msg_new(&envoy_type_tracing_v2_CustomTag_msginit, arena); bool ok = _upb_array_append_accessor( - msg, UPB_SIZE(32, 56), UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, &sub, arena); + msg, UPB_SIZE(36, 64), UPB_SIZE(4, 8), UPB_TYPE_MESSAGE, &sub, arena); if (!ok) return NULL; return sub; } +UPB_INLINE void envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_Tracing_set_provider(envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_Tracing *msg, struct envoy_config_trace_v2_Tracing_Http* value) { + UPB_FIELD_AT(msg, struct envoy_config_trace_v2_Tracing_Http*, UPB_SIZE(28, 48)) = value; +} +UPB_INLINE struct envoy_config_trace_v2_Tracing_Http* envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_Tracing_mutable_provider(envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_Tracing *msg, upb_arena *arena) { + struct envoy_config_trace_v2_Tracing_Http* sub = (struct envoy_config_trace_v2_Tracing_Http*)envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_Tracing_provider(msg); + if (sub == NULL) { + sub = (struct envoy_config_trace_v2_Tracing_Http*)upb_msg_new(&envoy_config_trace_v2_Tracing_Http_msginit, arena); + if (!sub) return NULL; + envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_Tracing_set_provider(msg, sub); + } + return sub; +} /* envoy.config.filter.network.http_connection_manager.v2.HttpConnectionManager.InternalAddressConfig */ @@ -1063,6 +1094,35 @@ UPB_INLINE struct google_protobuf_Any* envoy_config_filter_network_http_connecti return sub; } +/* envoy.config.filter.network.http_connection_manager.v2.RequestIDExtension */ + +UPB_INLINE envoy_config_filter_network_http_connection_manager_v2_RequestIDExtension *envoy_config_filter_network_http_connection_manager_v2_RequestIDExtension_new(upb_arena *arena) { + return (envoy_config_filter_network_http_connection_manager_v2_RequestIDExtension *)upb_msg_new(&envoy_config_filter_network_http_connection_manager_v2_RequestIDExtension_msginit, arena); +} +UPB_INLINE envoy_config_filter_network_http_connection_manager_v2_RequestIDExtension *envoy_config_filter_network_http_connection_manager_v2_RequestIDExtension_parse(const char *buf, size_t size, + upb_arena *arena) { + envoy_config_filter_network_http_connection_manager_v2_RequestIDExtension *ret = envoy_config_filter_network_http_connection_manager_v2_RequestIDExtension_new(arena); + return (ret && upb_decode(buf, size, ret, &envoy_config_filter_network_http_connection_manager_v2_RequestIDExtension_msginit, arena)) ? ret : NULL; +} +UPB_INLINE char *envoy_config_filter_network_http_connection_manager_v2_RequestIDExtension_serialize(const envoy_config_filter_network_http_connection_manager_v2_RequestIDExtension *msg, upb_arena *arena, size_t *len) { + return upb_encode(msg, &envoy_config_filter_network_http_connection_manager_v2_RequestIDExtension_msginit, arena, len); +} + +UPB_INLINE const struct google_protobuf_Any* envoy_config_filter_network_http_connection_manager_v2_RequestIDExtension_typed_config(const envoy_config_filter_network_http_connection_manager_v2_RequestIDExtension *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_Any*, UPB_SIZE(0, 0)); } + +UPB_INLINE void envoy_config_filter_network_http_connection_manager_v2_RequestIDExtension_set_typed_config(envoy_config_filter_network_http_connection_manager_v2_RequestIDExtension *msg, struct google_protobuf_Any* value) { + UPB_FIELD_AT(msg, struct google_protobuf_Any*, UPB_SIZE(0, 0)) = value; +} +UPB_INLINE struct google_protobuf_Any* envoy_config_filter_network_http_connection_manager_v2_RequestIDExtension_mutable_typed_config(envoy_config_filter_network_http_connection_manager_v2_RequestIDExtension *msg, upb_arena *arena) { + struct google_protobuf_Any* sub = (struct google_protobuf_Any*)envoy_config_filter_network_http_connection_manager_v2_RequestIDExtension_typed_config(msg); + if (sub == NULL) { + sub = (struct google_protobuf_Any*)upb_msg_new(&google_protobuf_Any_msginit, arena); + if (!sub) return NULL; + envoy_config_filter_network_http_connection_manager_v2_RequestIDExtension_set_typed_config(msg, sub); + } + return sub; +} + #ifdef __cplusplus } /* extern "C" */ #endif diff --git a/src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.c b/src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.c index 36f332f1991..ce2d53e6d3f 100644 --- a/src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.c +++ b/src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.c @@ -11,6 +11,7 @@ #include "envoy/config/listener/v2/api_listener.upb.h" #include "google/protobuf/any.upb.h" #include "udpa/annotations/migrate.upb.h" +#include "udpa/annotations/status.upb.h" #include "upb/port_def.inc" diff --git a/src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.c b/src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.c new file mode 100644 index 00000000000..2b5153a3062 --- /dev/null +++ b/src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.c @@ -0,0 +1,51 @@ +/* This file was generated by upbc (the upb compiler) from the input + * file: + * + * envoy/config/trace/v2/http_tracer.proto + * + * Do not edit -- your changes will be discarded when the file is + * regenerated. */ + +#include +#include "upb/msg.h" +#include "envoy/config/trace/v2/http_tracer.upb.h" +#include "google/protobuf/any.upb.h" +#include "google/protobuf/struct.upb.h" +#include "udpa/annotations/status.upb.h" +#include "validate/validate.upb.h" + +#include "upb/port_def.inc" + +static const upb_msglayout *const envoy_config_trace_v2_Tracing_submsgs[1] = { + &envoy_config_trace_v2_Tracing_Http_msginit, +}; + +static const upb_msglayout_field envoy_config_trace_v2_Tracing__fields[1] = { + {1, UPB_SIZE(0, 0), 0, 0, 11, 1}, +}; + +const upb_msglayout envoy_config_trace_v2_Tracing_msginit = { + &envoy_config_trace_v2_Tracing_submsgs[0], + &envoy_config_trace_v2_Tracing__fields[0], + UPB_SIZE(4, 8), 1, false, +}; + +static const upb_msglayout *const envoy_config_trace_v2_Tracing_Http_submsgs[2] = { + &google_protobuf_Any_msginit, + &google_protobuf_Struct_msginit, +}; + +static const upb_msglayout_field envoy_config_trace_v2_Tracing_Http__fields[3] = { + {1, UPB_SIZE(0, 0), 0, 0, 9, 1}, + {2, UPB_SIZE(8, 16), UPB_SIZE(-13, -25), 1, 11, 1}, + {3, UPB_SIZE(8, 16), UPB_SIZE(-13, -25), 0, 11, 1}, +}; + +const upb_msglayout envoy_config_trace_v2_Tracing_Http_msginit = { + &envoy_config_trace_v2_Tracing_Http_submsgs[0], + &envoy_config_trace_v2_Tracing_Http__fields[0], + UPB_SIZE(16, 32), 3, false, +}; + +#include "upb/port_undef.inc" + diff --git a/src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.h b/src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.h new file mode 100644 index 00000000000..093fc0afe76 --- /dev/null +++ b/src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.h @@ -0,0 +1,125 @@ +/* This file was generated by upbc (the upb compiler) from the input + * file: + * + * envoy/config/trace/v2/http_tracer.proto + * + * Do not edit -- your changes will be discarded when the file is + * regenerated. */ + +#ifndef ENVOY_CONFIG_TRACE_V2_HTTP_TRACER_PROTO_UPB_H_ +#define ENVOY_CONFIG_TRACE_V2_HTTP_TRACER_PROTO_UPB_H_ + +#include "upb/generated_util.h" +#include "upb/msg.h" +#include "upb/decode.h" +#include "upb/encode.h" + +#include "upb/port_def.inc" + +#ifdef __cplusplus +extern "C" { +#endif + +struct envoy_config_trace_v2_Tracing; +struct envoy_config_trace_v2_Tracing_Http; +typedef struct envoy_config_trace_v2_Tracing envoy_config_trace_v2_Tracing; +typedef struct envoy_config_trace_v2_Tracing_Http envoy_config_trace_v2_Tracing_Http; +extern const upb_msglayout envoy_config_trace_v2_Tracing_msginit; +extern const upb_msglayout envoy_config_trace_v2_Tracing_Http_msginit; +struct google_protobuf_Any; +struct google_protobuf_Struct; +extern const upb_msglayout google_protobuf_Any_msginit; +extern const upb_msglayout google_protobuf_Struct_msginit; + + +/* envoy.config.trace.v2.Tracing */ + +UPB_INLINE envoy_config_trace_v2_Tracing *envoy_config_trace_v2_Tracing_new(upb_arena *arena) { + return (envoy_config_trace_v2_Tracing *)upb_msg_new(&envoy_config_trace_v2_Tracing_msginit, arena); +} +UPB_INLINE envoy_config_trace_v2_Tracing *envoy_config_trace_v2_Tracing_parse(const char *buf, size_t size, + upb_arena *arena) { + envoy_config_trace_v2_Tracing *ret = envoy_config_trace_v2_Tracing_new(arena); + return (ret && upb_decode(buf, size, ret, &envoy_config_trace_v2_Tracing_msginit, arena)) ? ret : NULL; +} +UPB_INLINE char *envoy_config_trace_v2_Tracing_serialize(const envoy_config_trace_v2_Tracing *msg, upb_arena *arena, size_t *len) { + return upb_encode(msg, &envoy_config_trace_v2_Tracing_msginit, arena, len); +} + +UPB_INLINE const envoy_config_trace_v2_Tracing_Http* envoy_config_trace_v2_Tracing_http(const envoy_config_trace_v2_Tracing *msg) { return UPB_FIELD_AT(msg, const envoy_config_trace_v2_Tracing_Http*, UPB_SIZE(0, 0)); } + +UPB_INLINE void envoy_config_trace_v2_Tracing_set_http(envoy_config_trace_v2_Tracing *msg, envoy_config_trace_v2_Tracing_Http* value) { + UPB_FIELD_AT(msg, envoy_config_trace_v2_Tracing_Http*, UPB_SIZE(0, 0)) = value; +} +UPB_INLINE struct envoy_config_trace_v2_Tracing_Http* envoy_config_trace_v2_Tracing_mutable_http(envoy_config_trace_v2_Tracing *msg, upb_arena *arena) { + struct envoy_config_trace_v2_Tracing_Http* sub = (struct envoy_config_trace_v2_Tracing_Http*)envoy_config_trace_v2_Tracing_http(msg); + if (sub == NULL) { + sub = (struct envoy_config_trace_v2_Tracing_Http*)upb_msg_new(&envoy_config_trace_v2_Tracing_Http_msginit, arena); + if (!sub) return NULL; + envoy_config_trace_v2_Tracing_set_http(msg, sub); + } + return sub; +} + +/* envoy.config.trace.v2.Tracing.Http */ + +UPB_INLINE envoy_config_trace_v2_Tracing_Http *envoy_config_trace_v2_Tracing_Http_new(upb_arena *arena) { + return (envoy_config_trace_v2_Tracing_Http *)upb_msg_new(&envoy_config_trace_v2_Tracing_Http_msginit, arena); +} +UPB_INLINE envoy_config_trace_v2_Tracing_Http *envoy_config_trace_v2_Tracing_Http_parse(const char *buf, size_t size, + upb_arena *arena) { + envoy_config_trace_v2_Tracing_Http *ret = envoy_config_trace_v2_Tracing_Http_new(arena); + return (ret && upb_decode(buf, size, ret, &envoy_config_trace_v2_Tracing_Http_msginit, arena)) ? ret : NULL; +} +UPB_INLINE char *envoy_config_trace_v2_Tracing_Http_serialize(const envoy_config_trace_v2_Tracing_Http *msg, upb_arena *arena, size_t *len) { + return upb_encode(msg, &envoy_config_trace_v2_Tracing_Http_msginit, arena, len); +} + +typedef enum { + envoy_config_trace_v2_Tracing_Http_config_type_config = 2, + envoy_config_trace_v2_Tracing_Http_config_type_typed_config = 3, + envoy_config_trace_v2_Tracing_Http_config_type_NOT_SET = 0 +} envoy_config_trace_v2_Tracing_Http_config_type_oneofcases; +UPB_INLINE envoy_config_trace_v2_Tracing_Http_config_type_oneofcases envoy_config_trace_v2_Tracing_Http_config_type_case(const envoy_config_trace_v2_Tracing_Http* msg) { return (envoy_config_trace_v2_Tracing_Http_config_type_oneofcases)UPB_FIELD_AT(msg, int32_t, UPB_SIZE(12, 24)); } + +UPB_INLINE upb_strview envoy_config_trace_v2_Tracing_Http_name(const envoy_config_trace_v2_Tracing_Http *msg) { return UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(0, 0)); } +UPB_INLINE bool envoy_config_trace_v2_Tracing_Http_has_config(const envoy_config_trace_v2_Tracing_Http *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(12, 24), 2); } +UPB_INLINE const struct google_protobuf_Struct* envoy_config_trace_v2_Tracing_Http_config(const envoy_config_trace_v2_Tracing_Http *msg) { return UPB_READ_ONEOF(msg, const struct google_protobuf_Struct*, UPB_SIZE(8, 16), UPB_SIZE(12, 24), 2, NULL); } +UPB_INLINE bool envoy_config_trace_v2_Tracing_Http_has_typed_config(const envoy_config_trace_v2_Tracing_Http *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(12, 24), 3); } +UPB_INLINE const struct google_protobuf_Any* envoy_config_trace_v2_Tracing_Http_typed_config(const envoy_config_trace_v2_Tracing_Http *msg) { return UPB_READ_ONEOF(msg, const struct google_protobuf_Any*, UPB_SIZE(8, 16), UPB_SIZE(12, 24), 3, NULL); } + +UPB_INLINE void envoy_config_trace_v2_Tracing_Http_set_name(envoy_config_trace_v2_Tracing_Http *msg, upb_strview value) { + UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(0, 0)) = value; +} +UPB_INLINE void envoy_config_trace_v2_Tracing_Http_set_config(envoy_config_trace_v2_Tracing_Http *msg, struct google_protobuf_Struct* value) { + UPB_WRITE_ONEOF(msg, struct google_protobuf_Struct*, UPB_SIZE(8, 16), value, UPB_SIZE(12, 24), 2); +} +UPB_INLINE struct google_protobuf_Struct* envoy_config_trace_v2_Tracing_Http_mutable_config(envoy_config_trace_v2_Tracing_Http *msg, upb_arena *arena) { + struct google_protobuf_Struct* sub = (struct google_protobuf_Struct*)envoy_config_trace_v2_Tracing_Http_config(msg); + if (sub == NULL) { + sub = (struct google_protobuf_Struct*)upb_msg_new(&google_protobuf_Struct_msginit, arena); + if (!sub) return NULL; + envoy_config_trace_v2_Tracing_Http_set_config(msg, sub); + } + return sub; +} +UPB_INLINE void envoy_config_trace_v2_Tracing_Http_set_typed_config(envoy_config_trace_v2_Tracing_Http *msg, struct google_protobuf_Any* value) { + UPB_WRITE_ONEOF(msg, struct google_protobuf_Any*, UPB_SIZE(8, 16), value, UPB_SIZE(12, 24), 3); +} +UPB_INLINE struct google_protobuf_Any* envoy_config_trace_v2_Tracing_Http_mutable_typed_config(envoy_config_trace_v2_Tracing_Http *msg, upb_arena *arena) { + struct google_protobuf_Any* sub = (struct google_protobuf_Any*)envoy_config_trace_v2_Tracing_Http_typed_config(msg); + if (sub == NULL) { + sub = (struct google_protobuf_Any*)upb_msg_new(&google_protobuf_Any_msginit, arena); + if (!sub) return NULL; + envoy_config_trace_v2_Tracing_Http_set_typed_config(msg, sub); + } + return sub; +} + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#include "upb/port_undef.inc" + +#endif /* ENVOY_CONFIG_TRACE_V2_HTTP_TRACER_PROTO_UPB_H_ */ diff --git a/src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.c b/src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.c index 5611346c3fd..6c6f98fe34c 100644 --- a/src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.c +++ b/src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.c @@ -10,6 +10,7 @@ #include "upb/msg.h" #include "envoy/service/discovery/v2/ads.upb.h" #include "envoy/api/v2/discovery.upb.h" +#include "udpa/annotations/status.upb.h" #include "upb/port_def.inc" diff --git a/src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.c b/src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.c index a6e4bd2d18b..98bd8843223 100644 --- a/src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.c +++ b/src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.c @@ -12,6 +12,7 @@ #include "envoy/api/v2/core/base.upb.h" #include "envoy/api/v2/endpoint/load_report.upb.h" #include "google/protobuf/duration.upb.h" +#include "udpa/annotations/status.upb.h" #include "validate/validate.upb.h" #include "upb/port_def.inc" @@ -36,16 +37,17 @@ static const upb_msglayout *const envoy_service_load_stats_v2_LoadStatsResponse_ &google_protobuf_Duration_msginit, }; -static const upb_msglayout_field envoy_service_load_stats_v2_LoadStatsResponse__fields[3] = { +static const upb_msglayout_field envoy_service_load_stats_v2_LoadStatsResponse__fields[4] = { {1, UPB_SIZE(8, 16), 0, 0, 9, 3}, {2, UPB_SIZE(4, 8), 0, 0, 11, 1}, {3, UPB_SIZE(0, 0), 0, 0, 8, 1}, + {4, UPB_SIZE(1, 1), 0, 0, 8, 1}, }; const upb_msglayout envoy_service_load_stats_v2_LoadStatsResponse_msginit = { &envoy_service_load_stats_v2_LoadStatsResponse_submsgs[0], &envoy_service_load_stats_v2_LoadStatsResponse__fields[0], - UPB_SIZE(12, 24), 3, false, + UPB_SIZE(12, 24), 4, false, }; #include "upb/port_undef.inc" diff --git a/src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.h b/src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.h index 457deafdd9d..7e364eb6c06 100644 --- a/src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.h +++ b/src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.h @@ -94,6 +94,7 @@ UPB_INLINE char *envoy_service_load_stats_v2_LoadStatsResponse_serialize(const e UPB_INLINE upb_strview const* envoy_service_load_stats_v2_LoadStatsResponse_clusters(const envoy_service_load_stats_v2_LoadStatsResponse *msg, size_t *len) { return (upb_strview const*)_upb_array_accessor(msg, UPB_SIZE(8, 16), len); } UPB_INLINE const struct google_protobuf_Duration* envoy_service_load_stats_v2_LoadStatsResponse_load_reporting_interval(const envoy_service_load_stats_v2_LoadStatsResponse *msg) { return UPB_FIELD_AT(msg, const struct google_protobuf_Duration*, UPB_SIZE(4, 8)); } UPB_INLINE bool envoy_service_load_stats_v2_LoadStatsResponse_report_endpoint_granularity(const envoy_service_load_stats_v2_LoadStatsResponse *msg) { return UPB_FIELD_AT(msg, bool, UPB_SIZE(0, 0)); } +UPB_INLINE bool envoy_service_load_stats_v2_LoadStatsResponse_send_all_clusters(const envoy_service_load_stats_v2_LoadStatsResponse *msg) { return UPB_FIELD_AT(msg, bool, UPB_SIZE(1, 1)); } UPB_INLINE upb_strview* envoy_service_load_stats_v2_LoadStatsResponse_mutable_clusters(envoy_service_load_stats_v2_LoadStatsResponse *msg, size_t *len) { return (upb_strview*)_upb_array_mutable_accessor(msg, UPB_SIZE(8, 16), len); @@ -120,6 +121,9 @@ UPB_INLINE struct google_protobuf_Duration* envoy_service_load_stats_v2_LoadStat UPB_INLINE void envoy_service_load_stats_v2_LoadStatsResponse_set_report_endpoint_granularity(envoy_service_load_stats_v2_LoadStatsResponse *msg, bool value) { UPB_FIELD_AT(msg, bool, UPB_SIZE(0, 0)) = value; } +UPB_INLINE void envoy_service_load_stats_v2_LoadStatsResponse_set_send_all_clusters(envoy_service_load_stats_v2_LoadStatsResponse *msg, bool value) { + UPB_FIELD_AT(msg, bool, UPB_SIZE(1, 1)) = value; +} #ifdef __cplusplus } /* extern "C" */ diff --git a/src/core/ext/upb-generated/envoy/type/http.upb.c b/src/core/ext/upb-generated/envoy/type/http.upb.c index 3217029b098..a5175f678bd 100644 --- a/src/core/ext/upb-generated/envoy/type/http.upb.c +++ b/src/core/ext/upb-generated/envoy/type/http.upb.c @@ -9,6 +9,7 @@ #include #include "upb/msg.h" #include "envoy/type/http.upb.h" +#include "udpa/annotations/status.upb.h" #include "upb/port_def.inc" diff --git a/src/core/ext/upb-generated/envoy/type/matcher/regex.upb.c b/src/core/ext/upb-generated/envoy/type/matcher/regex.upb.c index 679e9bef33c..dd8fe6cf22e 100644 --- a/src/core/ext/upb-generated/envoy/type/matcher/regex.upb.c +++ b/src/core/ext/upb-generated/envoy/type/matcher/regex.upb.c @@ -10,6 +10,7 @@ #include "upb/msg.h" #include "envoy/type/matcher/regex.upb.h" #include "google/protobuf/wrappers.upb.h" +#include "udpa/annotations/status.upb.h" #include "validate/validate.upb.h" #include "upb/port_def.inc" @@ -43,5 +44,20 @@ const upb_msglayout envoy_type_matcher_RegexMatcher_GoogleRE2_msginit = { UPB_SIZE(4, 8), 1, false, }; +static const upb_msglayout *const envoy_type_matcher_RegexMatchAndSubstitute_submsgs[1] = { + &envoy_type_matcher_RegexMatcher_msginit, +}; + +static const upb_msglayout_field envoy_type_matcher_RegexMatchAndSubstitute__fields[2] = { + {1, UPB_SIZE(8, 16), 0, 0, 11, 1}, + {2, UPB_SIZE(0, 0), 0, 0, 9, 1}, +}; + +const upb_msglayout envoy_type_matcher_RegexMatchAndSubstitute_msginit = { + &envoy_type_matcher_RegexMatchAndSubstitute_submsgs[0], + &envoy_type_matcher_RegexMatchAndSubstitute__fields[0], + UPB_SIZE(16, 32), 2, false, +}; + #include "upb/port_undef.inc" diff --git a/src/core/ext/upb-generated/envoy/type/matcher/regex.upb.h b/src/core/ext/upb-generated/envoy/type/matcher/regex.upb.h index 1a396732e10..d6c4571d607 100644 --- a/src/core/ext/upb-generated/envoy/type/matcher/regex.upb.h +++ b/src/core/ext/upb-generated/envoy/type/matcher/regex.upb.h @@ -22,10 +22,13 @@ extern "C" { struct envoy_type_matcher_RegexMatcher; struct envoy_type_matcher_RegexMatcher_GoogleRE2; +struct envoy_type_matcher_RegexMatchAndSubstitute; typedef struct envoy_type_matcher_RegexMatcher envoy_type_matcher_RegexMatcher; typedef struct envoy_type_matcher_RegexMatcher_GoogleRE2 envoy_type_matcher_RegexMatcher_GoogleRE2; +typedef struct envoy_type_matcher_RegexMatchAndSubstitute envoy_type_matcher_RegexMatchAndSubstitute; extern const upb_msglayout envoy_type_matcher_RegexMatcher_msginit; extern const upb_msglayout envoy_type_matcher_RegexMatcher_GoogleRE2_msginit; +extern const upb_msglayout envoy_type_matcher_RegexMatchAndSubstitute_msginit; struct google_protobuf_UInt32Value; extern const upb_msglayout google_protobuf_UInt32Value_msginit; @@ -99,6 +102,39 @@ UPB_INLINE struct google_protobuf_UInt32Value* envoy_type_matcher_RegexMatcher_G return sub; } +/* envoy.type.matcher.RegexMatchAndSubstitute */ + +UPB_INLINE envoy_type_matcher_RegexMatchAndSubstitute *envoy_type_matcher_RegexMatchAndSubstitute_new(upb_arena *arena) { + return (envoy_type_matcher_RegexMatchAndSubstitute *)upb_msg_new(&envoy_type_matcher_RegexMatchAndSubstitute_msginit, arena); +} +UPB_INLINE envoy_type_matcher_RegexMatchAndSubstitute *envoy_type_matcher_RegexMatchAndSubstitute_parse(const char *buf, size_t size, + upb_arena *arena) { + envoy_type_matcher_RegexMatchAndSubstitute *ret = envoy_type_matcher_RegexMatchAndSubstitute_new(arena); + return (ret && upb_decode(buf, size, ret, &envoy_type_matcher_RegexMatchAndSubstitute_msginit, arena)) ? ret : NULL; +} +UPB_INLINE char *envoy_type_matcher_RegexMatchAndSubstitute_serialize(const envoy_type_matcher_RegexMatchAndSubstitute *msg, upb_arena *arena, size_t *len) { + return upb_encode(msg, &envoy_type_matcher_RegexMatchAndSubstitute_msginit, arena, len); +} + +UPB_INLINE const envoy_type_matcher_RegexMatcher* envoy_type_matcher_RegexMatchAndSubstitute_pattern(const envoy_type_matcher_RegexMatchAndSubstitute *msg) { return UPB_FIELD_AT(msg, const envoy_type_matcher_RegexMatcher*, UPB_SIZE(8, 16)); } +UPB_INLINE upb_strview envoy_type_matcher_RegexMatchAndSubstitute_substitution(const envoy_type_matcher_RegexMatchAndSubstitute *msg) { return UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(0, 0)); } + +UPB_INLINE void envoy_type_matcher_RegexMatchAndSubstitute_set_pattern(envoy_type_matcher_RegexMatchAndSubstitute *msg, envoy_type_matcher_RegexMatcher* value) { + UPB_FIELD_AT(msg, envoy_type_matcher_RegexMatcher*, UPB_SIZE(8, 16)) = value; +} +UPB_INLINE struct envoy_type_matcher_RegexMatcher* envoy_type_matcher_RegexMatchAndSubstitute_mutable_pattern(envoy_type_matcher_RegexMatchAndSubstitute *msg, upb_arena *arena) { + struct envoy_type_matcher_RegexMatcher* sub = (struct envoy_type_matcher_RegexMatcher*)envoy_type_matcher_RegexMatchAndSubstitute_pattern(msg); + if (sub == NULL) { + sub = (struct envoy_type_matcher_RegexMatcher*)upb_msg_new(&envoy_type_matcher_RegexMatcher_msginit, arena); + if (!sub) return NULL; + envoy_type_matcher_RegexMatchAndSubstitute_set_pattern(msg, sub); + } + return sub; +} +UPB_INLINE void envoy_type_matcher_RegexMatchAndSubstitute_set_substitution(envoy_type_matcher_RegexMatchAndSubstitute *msg, upb_strview value) { + UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(0, 0)) = value; +} + #ifdef __cplusplus } /* extern "C" */ #endif diff --git a/src/core/ext/upb-generated/envoy/type/matcher/string.upb.c b/src/core/ext/upb-generated/envoy/type/matcher/string.upb.c index 208a022ea88..beab52346fe 100644 --- a/src/core/ext/upb-generated/envoy/type/matcher/string.upb.c +++ b/src/core/ext/upb-generated/envoy/type/matcher/string.upb.c @@ -11,6 +11,7 @@ #include "envoy/type/matcher/string.upb.h" #include "envoy/type/matcher/regex.upb.h" #include "envoy/annotations/deprecation.upb.h" +#include "udpa/annotations/status.upb.h" #include "validate/validate.upb.h" #include "upb/port_def.inc" diff --git a/src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.c b/src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.c index e2f69c7b3f7..3f98ea08b8b 100644 --- a/src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.c +++ b/src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.c @@ -10,6 +10,7 @@ #include "upb/msg.h" #include "envoy/type/metadata/v2/metadata.upb.h" #include "udpa/annotations/migrate.upb.h" +#include "udpa/annotations/status.upb.h" #include "validate/validate.upb.h" #include "upb/port_def.inc" diff --git a/src/core/ext/upb-generated/envoy/type/percent.upb.c b/src/core/ext/upb-generated/envoy/type/percent.upb.c index 0754073040a..06d08e1ac2d 100644 --- a/src/core/ext/upb-generated/envoy/type/percent.upb.c +++ b/src/core/ext/upb-generated/envoy/type/percent.upb.c @@ -9,6 +9,7 @@ #include #include "upb/msg.h" #include "envoy/type/percent.upb.h" +#include "udpa/annotations/status.upb.h" #include "validate/validate.upb.h" #include "upb/port_def.inc" diff --git a/src/core/ext/upb-generated/envoy/type/range.upb.c b/src/core/ext/upb-generated/envoy/type/range.upb.c index 67de8d007ae..5a002f855cb 100644 --- a/src/core/ext/upb-generated/envoy/type/range.upb.c +++ b/src/core/ext/upb-generated/envoy/type/range.upb.c @@ -9,6 +9,7 @@ #include #include "upb/msg.h" #include "envoy/type/range.upb.h" +#include "udpa/annotations/status.upb.h" #include "upb/port_def.inc" diff --git a/src/core/ext/upb-generated/envoy/type/semantic_version.upb.c b/src/core/ext/upb-generated/envoy/type/semantic_version.upb.c index a4dd26eae6d..119269305c0 100644 --- a/src/core/ext/upb-generated/envoy/type/semantic_version.upb.c +++ b/src/core/ext/upb-generated/envoy/type/semantic_version.upb.c @@ -9,6 +9,7 @@ #include #include "upb/msg.h" #include "envoy/type/semantic_version.upb.h" +#include "udpa/annotations/status.upb.h" #include "upb/port_def.inc" diff --git a/src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.c b/src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.c index 5a058975986..064e7e26b50 100644 --- a/src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.c +++ b/src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.c @@ -10,6 +10,7 @@ #include "upb/msg.h" #include "envoy/type/tracing/v2/custom_tag.upb.h" #include "envoy/type/metadata/v2/metadata.upb.h" +#include "udpa/annotations/status.upb.h" #include "validate/validate.upb.h" #include "upb/port_def.inc" diff --git a/src/core/ext/upb-generated/udpa/annotations/status.upb.c b/src/core/ext/upb-generated/udpa/annotations/status.upb.c new file mode 100644 index 00000000000..05cb76c13a0 --- /dev/null +++ b/src/core/ext/upb-generated/udpa/annotations/status.upb.c @@ -0,0 +1,28 @@ +/* This file was generated by upbc (the upb compiler) from the input + * file: + * + * udpa/annotations/status.proto + * + * Do not edit -- your changes will be discarded when the file is + * regenerated. */ + +#include +#include "upb/msg.h" +#include "udpa/annotations/status.upb.h" +#include "google/protobuf/descriptor.upb.h" + +#include "upb/port_def.inc" + +static const upb_msglayout_field udpa_annotations_StatusAnnotation__fields[2] = { + {1, UPB_SIZE(8, 8), 0, 0, 8, 1}, + {2, UPB_SIZE(0, 0), 0, 0, 14, 1}, +}; + +const upb_msglayout udpa_annotations_StatusAnnotation_msginit = { + NULL, + &udpa_annotations_StatusAnnotation__fields[0], + UPB_SIZE(16, 16), 2, false, +}; + +#include "upb/port_undef.inc" + diff --git a/src/core/ext/upb-generated/udpa/annotations/status.upb.h b/src/core/ext/upb-generated/udpa/annotations/status.upb.h new file mode 100644 index 00000000000..e98e882194e --- /dev/null +++ b/src/core/ext/upb-generated/udpa/annotations/status.upb.h @@ -0,0 +1,65 @@ +/* This file was generated by upbc (the upb compiler) from the input + * file: + * + * udpa/annotations/status.proto + * + * Do not edit -- your changes will be discarded when the file is + * regenerated. */ + +#ifndef UDPA_ANNOTATIONS_STATUS_PROTO_UPB_H_ +#define UDPA_ANNOTATIONS_STATUS_PROTO_UPB_H_ + +#include "upb/generated_util.h" +#include "upb/msg.h" +#include "upb/decode.h" +#include "upb/encode.h" + +#include "upb/port_def.inc" + +#ifdef __cplusplus +extern "C" { +#endif + +struct udpa_annotations_StatusAnnotation; +typedef struct udpa_annotations_StatusAnnotation udpa_annotations_StatusAnnotation; +extern const upb_msglayout udpa_annotations_StatusAnnotation_msginit; + +typedef enum { + udpa_annotations_UNKNOWN = 0, + udpa_annotations_FROZEN = 1, + udpa_annotations_ACTIVE = 2, + udpa_annotations_NEXT_MAJOR_VERSION_CANDIDATE = 3 +} udpa_annotations_PackageVersionStatus; + + +/* udpa.annotations.StatusAnnotation */ + +UPB_INLINE udpa_annotations_StatusAnnotation *udpa_annotations_StatusAnnotation_new(upb_arena *arena) { + return (udpa_annotations_StatusAnnotation *)upb_msg_new(&udpa_annotations_StatusAnnotation_msginit, arena); +} +UPB_INLINE udpa_annotations_StatusAnnotation *udpa_annotations_StatusAnnotation_parse(const char *buf, size_t size, + upb_arena *arena) { + udpa_annotations_StatusAnnotation *ret = udpa_annotations_StatusAnnotation_new(arena); + return (ret && upb_decode(buf, size, ret, &udpa_annotations_StatusAnnotation_msginit, arena)) ? ret : NULL; +} +UPB_INLINE char *udpa_annotations_StatusAnnotation_serialize(const udpa_annotations_StatusAnnotation *msg, upb_arena *arena, size_t *len) { + return upb_encode(msg, &udpa_annotations_StatusAnnotation_msginit, arena, len); +} + +UPB_INLINE bool udpa_annotations_StatusAnnotation_work_in_progress(const udpa_annotations_StatusAnnotation *msg) { return UPB_FIELD_AT(msg, bool, UPB_SIZE(8, 8)); } +UPB_INLINE int32_t udpa_annotations_StatusAnnotation_package_version_status(const udpa_annotations_StatusAnnotation *msg) { return UPB_FIELD_AT(msg, int32_t, UPB_SIZE(0, 0)); } + +UPB_INLINE void udpa_annotations_StatusAnnotation_set_work_in_progress(udpa_annotations_StatusAnnotation *msg, bool value) { + UPB_FIELD_AT(msg, bool, UPB_SIZE(8, 8)) = value; +} +UPB_INLINE void udpa_annotations_StatusAnnotation_set_package_version_status(udpa_annotations_StatusAnnotation *msg, int32_t value) { + UPB_FIELD_AT(msg, int32_t, UPB_SIZE(0, 0)) = value; +} + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#include "upb/port_undef.inc" + +#endif /* UDPA_ANNOTATIONS_STATUS_PROTO_UPB_H_ */ diff --git a/src/core/ext/upb-generated/validate/validate.upb.c b/src/core/ext/upb-generated/validate/validate.upb.c index 2fd97f52f3d..1d6ab9bca75 100644 --- a/src/core/ext/upb-generated/validate/validate.upb.c +++ b/src/core/ext/upb-generated/validate/validate.upb.c @@ -273,37 +273,38 @@ const upb_msglayout validate_BoolRules_msginit = { UPB_SIZE(2, 2), 1, false, }; -static const upb_msglayout_field validate_StringRules__fields[24] = { - {1, UPB_SIZE(56, 56), 7, 0, 9, 1}, +static const upb_msglayout_field validate_StringRules__fields[25] = { + {1, UPB_SIZE(60, 64), 8, 0, 9, 1}, {2, UPB_SIZE(8, 8), 1, 0, 4, 1}, {3, UPB_SIZE(16, 16), 2, 0, 4, 1}, {4, UPB_SIZE(24, 24), 3, 0, 4, 1}, {5, UPB_SIZE(32, 32), 4, 0, 4, 1}, - {6, UPB_SIZE(64, 72), 8, 0, 9, 1}, - {7, UPB_SIZE(72, 88), 9, 0, 9, 1}, - {8, UPB_SIZE(80, 104), 10, 0, 9, 1}, - {9, UPB_SIZE(88, 120), 11, 0, 9, 1}, - {10, UPB_SIZE(104, 152), 0, 0, 9, 3}, - {11, UPB_SIZE(108, 160), 0, 0, 9, 3}, - {12, UPB_SIZE(112, 168), UPB_SIZE(-121, -177), 0, 8, 1}, - {13, UPB_SIZE(112, 168), UPB_SIZE(-121, -177), 0, 8, 1}, - {14, UPB_SIZE(112, 168), UPB_SIZE(-121, -177), 0, 8, 1}, - {15, UPB_SIZE(112, 168), UPB_SIZE(-121, -177), 0, 8, 1}, - {16, UPB_SIZE(112, 168), UPB_SIZE(-121, -177), 0, 8, 1}, - {17, UPB_SIZE(112, 168), UPB_SIZE(-121, -177), 0, 8, 1}, - {18, UPB_SIZE(112, 168), UPB_SIZE(-121, -177), 0, 8, 1}, + {6, UPB_SIZE(68, 80), 9, 0, 9, 1}, + {7, UPB_SIZE(76, 96), 10, 0, 9, 1}, + {8, UPB_SIZE(84, 112), 11, 0, 9, 1}, + {9, UPB_SIZE(92, 128), 12, 0, 9, 1}, + {10, UPB_SIZE(108, 160), 0, 0, 9, 3}, + {11, UPB_SIZE(112, 168), 0, 0, 9, 3}, + {12, UPB_SIZE(120, 176), UPB_SIZE(-129, -185), 0, 8, 1}, + {13, UPB_SIZE(120, 176), UPB_SIZE(-129, -185), 0, 8, 1}, + {14, UPB_SIZE(120, 176), UPB_SIZE(-129, -185), 0, 8, 1}, + {15, UPB_SIZE(120, 176), UPB_SIZE(-129, -185), 0, 8, 1}, + {16, UPB_SIZE(120, 176), UPB_SIZE(-129, -185), 0, 8, 1}, + {17, UPB_SIZE(120, 176), UPB_SIZE(-129, -185), 0, 8, 1}, + {18, UPB_SIZE(120, 176), UPB_SIZE(-129, -185), 0, 8, 1}, {19, UPB_SIZE(40, 40), 5, 0, 4, 1}, {20, UPB_SIZE(48, 48), 6, 0, 4, 1}, - {21, UPB_SIZE(112, 168), UPB_SIZE(-121, -177), 0, 8, 1}, - {22, UPB_SIZE(112, 168), UPB_SIZE(-121, -177), 0, 8, 1}, - {23, UPB_SIZE(96, 136), 12, 0, 9, 1}, - {24, UPB_SIZE(112, 168), UPB_SIZE(-121, -177), 0, 14, 1}, + {21, UPB_SIZE(120, 176), UPB_SIZE(-129, -185), 0, 8, 1}, + {22, UPB_SIZE(120, 176), UPB_SIZE(-129, -185), 0, 8, 1}, + {23, UPB_SIZE(100, 144), 13, 0, 9, 1}, + {24, UPB_SIZE(120, 176), UPB_SIZE(-129, -185), 0, 14, 1}, + {25, UPB_SIZE(56, 56), 7, 0, 8, 1}, }; const upb_msglayout validate_StringRules_msginit = { NULL, &validate_StringRules__fields[0], - UPB_SIZE(128, 192), 24, false, + UPB_SIZE(136, 192), 25, false, }; static const upb_msglayout_field validate_BytesRules__fields[13] = { diff --git a/src/core/ext/upb-generated/validate/validate.upb.h b/src/core/ext/upb-generated/validate/validate.upb.h index 1a1ba57ae81..1d381d8990c 100644 --- a/src/core/ext/upb-generated/validate/validate.upb.h +++ b/src/core/ext/upb-generated/validate/validate.upb.h @@ -1317,10 +1317,10 @@ typedef enum { validate_StringRules_well_known_well_known_regex = 24, validate_StringRules_well_known_NOT_SET = 0 } validate_StringRules_well_known_oneofcases; -UPB_INLINE validate_StringRules_well_known_oneofcases validate_StringRules_well_known_case(const validate_StringRules* msg) { return (validate_StringRules_well_known_oneofcases)UPB_FIELD_AT(msg, int32_t, UPB_SIZE(120, 176)); } +UPB_INLINE validate_StringRules_well_known_oneofcases validate_StringRules_well_known_case(const validate_StringRules* msg) { return (validate_StringRules_well_known_oneofcases)UPB_FIELD_AT(msg, int32_t, UPB_SIZE(128, 184)); } -UPB_INLINE bool validate_StringRules_has_const(const validate_StringRules *msg) { return _upb_has_field(msg, 7); } -UPB_INLINE upb_strview validate_StringRules_const(const validate_StringRules *msg) { return UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(56, 56)); } +UPB_INLINE bool validate_StringRules_has_const(const validate_StringRules *msg) { return _upb_has_field(msg, 8); } +UPB_INLINE upb_strview validate_StringRules_const(const validate_StringRules *msg) { return UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(60, 64)); } UPB_INLINE bool validate_StringRules_has_min_len(const validate_StringRules *msg) { return _upb_has_field(msg, 1); } UPB_INLINE uint64_t validate_StringRules_min_len(const validate_StringRules *msg) { return UPB_FIELD_AT(msg, uint64_t, UPB_SIZE(8, 8)); } UPB_INLINE bool validate_StringRules_has_max_len(const validate_StringRules *msg) { return _upb_has_field(msg, 2); } @@ -1329,46 +1329,48 @@ UPB_INLINE bool validate_StringRules_has_min_bytes(const validate_StringRules *m UPB_INLINE uint64_t validate_StringRules_min_bytes(const validate_StringRules *msg) { return UPB_FIELD_AT(msg, uint64_t, UPB_SIZE(24, 24)); } UPB_INLINE bool validate_StringRules_has_max_bytes(const validate_StringRules *msg) { return _upb_has_field(msg, 4); } UPB_INLINE uint64_t validate_StringRules_max_bytes(const validate_StringRules *msg) { return UPB_FIELD_AT(msg, uint64_t, UPB_SIZE(32, 32)); } -UPB_INLINE bool validate_StringRules_has_pattern(const validate_StringRules *msg) { return _upb_has_field(msg, 8); } -UPB_INLINE upb_strview validate_StringRules_pattern(const validate_StringRules *msg) { return UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(64, 72)); } -UPB_INLINE bool validate_StringRules_has_prefix(const validate_StringRules *msg) { return _upb_has_field(msg, 9); } -UPB_INLINE upb_strview validate_StringRules_prefix(const validate_StringRules *msg) { return UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(72, 88)); } -UPB_INLINE bool validate_StringRules_has_suffix(const validate_StringRules *msg) { return _upb_has_field(msg, 10); } -UPB_INLINE upb_strview validate_StringRules_suffix(const validate_StringRules *msg) { return UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(80, 104)); } -UPB_INLINE bool validate_StringRules_has_contains(const validate_StringRules *msg) { return _upb_has_field(msg, 11); } -UPB_INLINE upb_strview validate_StringRules_contains(const validate_StringRules *msg) { return UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(88, 120)); } -UPB_INLINE upb_strview const* validate_StringRules_in(const validate_StringRules *msg, size_t *len) { return (upb_strview const*)_upb_array_accessor(msg, UPB_SIZE(104, 152), len); } -UPB_INLINE upb_strview const* validate_StringRules_not_in(const validate_StringRules *msg, size_t *len) { return (upb_strview const*)_upb_array_accessor(msg, UPB_SIZE(108, 160), len); } -UPB_INLINE bool validate_StringRules_has_email(const validate_StringRules *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(120, 176), 12); } -UPB_INLINE bool validate_StringRules_email(const validate_StringRules *msg) { return UPB_READ_ONEOF(msg, bool, UPB_SIZE(112, 168), UPB_SIZE(120, 176), 12, false); } -UPB_INLINE bool validate_StringRules_has_hostname(const validate_StringRules *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(120, 176), 13); } -UPB_INLINE bool validate_StringRules_hostname(const validate_StringRules *msg) { return UPB_READ_ONEOF(msg, bool, UPB_SIZE(112, 168), UPB_SIZE(120, 176), 13, false); } -UPB_INLINE bool validate_StringRules_has_ip(const validate_StringRules *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(120, 176), 14); } -UPB_INLINE bool validate_StringRules_ip(const validate_StringRules *msg) { return UPB_READ_ONEOF(msg, bool, UPB_SIZE(112, 168), UPB_SIZE(120, 176), 14, false); } -UPB_INLINE bool validate_StringRules_has_ipv4(const validate_StringRules *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(120, 176), 15); } -UPB_INLINE bool validate_StringRules_ipv4(const validate_StringRules *msg) { return UPB_READ_ONEOF(msg, bool, UPB_SIZE(112, 168), UPB_SIZE(120, 176), 15, false); } -UPB_INLINE bool validate_StringRules_has_ipv6(const validate_StringRules *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(120, 176), 16); } -UPB_INLINE bool validate_StringRules_ipv6(const validate_StringRules *msg) { return UPB_READ_ONEOF(msg, bool, UPB_SIZE(112, 168), UPB_SIZE(120, 176), 16, false); } -UPB_INLINE bool validate_StringRules_has_uri(const validate_StringRules *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(120, 176), 17); } -UPB_INLINE bool validate_StringRules_uri(const validate_StringRules *msg) { return UPB_READ_ONEOF(msg, bool, UPB_SIZE(112, 168), UPB_SIZE(120, 176), 17, false); } -UPB_INLINE bool validate_StringRules_has_uri_ref(const validate_StringRules *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(120, 176), 18); } -UPB_INLINE bool validate_StringRules_uri_ref(const validate_StringRules *msg) { return UPB_READ_ONEOF(msg, bool, UPB_SIZE(112, 168), UPB_SIZE(120, 176), 18, false); } +UPB_INLINE bool validate_StringRules_has_pattern(const validate_StringRules *msg) { return _upb_has_field(msg, 9); } +UPB_INLINE upb_strview validate_StringRules_pattern(const validate_StringRules *msg) { return UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(68, 80)); } +UPB_INLINE bool validate_StringRules_has_prefix(const validate_StringRules *msg) { return _upb_has_field(msg, 10); } +UPB_INLINE upb_strview validate_StringRules_prefix(const validate_StringRules *msg) { return UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(76, 96)); } +UPB_INLINE bool validate_StringRules_has_suffix(const validate_StringRules *msg) { return _upb_has_field(msg, 11); } +UPB_INLINE upb_strview validate_StringRules_suffix(const validate_StringRules *msg) { return UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(84, 112)); } +UPB_INLINE bool validate_StringRules_has_contains(const validate_StringRules *msg) { return _upb_has_field(msg, 12); } +UPB_INLINE upb_strview validate_StringRules_contains(const validate_StringRules *msg) { return UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(92, 128)); } +UPB_INLINE upb_strview const* validate_StringRules_in(const validate_StringRules *msg, size_t *len) { return (upb_strview const*)_upb_array_accessor(msg, UPB_SIZE(108, 160), len); } +UPB_INLINE upb_strview const* validate_StringRules_not_in(const validate_StringRules *msg, size_t *len) { return (upb_strview const*)_upb_array_accessor(msg, UPB_SIZE(112, 168), len); } +UPB_INLINE bool validate_StringRules_has_email(const validate_StringRules *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(128, 184), 12); } +UPB_INLINE bool validate_StringRules_email(const validate_StringRules *msg) { return UPB_READ_ONEOF(msg, bool, UPB_SIZE(120, 176), UPB_SIZE(128, 184), 12, false); } +UPB_INLINE bool validate_StringRules_has_hostname(const validate_StringRules *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(128, 184), 13); } +UPB_INLINE bool validate_StringRules_hostname(const validate_StringRules *msg) { return UPB_READ_ONEOF(msg, bool, UPB_SIZE(120, 176), UPB_SIZE(128, 184), 13, false); } +UPB_INLINE bool validate_StringRules_has_ip(const validate_StringRules *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(128, 184), 14); } +UPB_INLINE bool validate_StringRules_ip(const validate_StringRules *msg) { return UPB_READ_ONEOF(msg, bool, UPB_SIZE(120, 176), UPB_SIZE(128, 184), 14, false); } +UPB_INLINE bool validate_StringRules_has_ipv4(const validate_StringRules *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(128, 184), 15); } +UPB_INLINE bool validate_StringRules_ipv4(const validate_StringRules *msg) { return UPB_READ_ONEOF(msg, bool, UPB_SIZE(120, 176), UPB_SIZE(128, 184), 15, false); } +UPB_INLINE bool validate_StringRules_has_ipv6(const validate_StringRules *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(128, 184), 16); } +UPB_INLINE bool validate_StringRules_ipv6(const validate_StringRules *msg) { return UPB_READ_ONEOF(msg, bool, UPB_SIZE(120, 176), UPB_SIZE(128, 184), 16, false); } +UPB_INLINE bool validate_StringRules_has_uri(const validate_StringRules *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(128, 184), 17); } +UPB_INLINE bool validate_StringRules_uri(const validate_StringRules *msg) { return UPB_READ_ONEOF(msg, bool, UPB_SIZE(120, 176), UPB_SIZE(128, 184), 17, false); } +UPB_INLINE bool validate_StringRules_has_uri_ref(const validate_StringRules *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(128, 184), 18); } +UPB_INLINE bool validate_StringRules_uri_ref(const validate_StringRules *msg) { return UPB_READ_ONEOF(msg, bool, UPB_SIZE(120, 176), UPB_SIZE(128, 184), 18, false); } UPB_INLINE bool validate_StringRules_has_len(const validate_StringRules *msg) { return _upb_has_field(msg, 5); } UPB_INLINE uint64_t validate_StringRules_len(const validate_StringRules *msg) { return UPB_FIELD_AT(msg, uint64_t, UPB_SIZE(40, 40)); } UPB_INLINE bool validate_StringRules_has_len_bytes(const validate_StringRules *msg) { return _upb_has_field(msg, 6); } UPB_INLINE uint64_t validate_StringRules_len_bytes(const validate_StringRules *msg) { return UPB_FIELD_AT(msg, uint64_t, UPB_SIZE(48, 48)); } -UPB_INLINE bool validate_StringRules_has_address(const validate_StringRules *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(120, 176), 21); } -UPB_INLINE bool validate_StringRules_address(const validate_StringRules *msg) { return UPB_READ_ONEOF(msg, bool, UPB_SIZE(112, 168), UPB_SIZE(120, 176), 21, false); } -UPB_INLINE bool validate_StringRules_has_uuid(const validate_StringRules *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(120, 176), 22); } -UPB_INLINE bool validate_StringRules_uuid(const validate_StringRules *msg) { return UPB_READ_ONEOF(msg, bool, UPB_SIZE(112, 168), UPB_SIZE(120, 176), 22, false); } -UPB_INLINE bool validate_StringRules_has_not_contains(const validate_StringRules *msg) { return _upb_has_field(msg, 12); } -UPB_INLINE upb_strview validate_StringRules_not_contains(const validate_StringRules *msg) { return UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(96, 136)); } -UPB_INLINE bool validate_StringRules_has_well_known_regex(const validate_StringRules *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(120, 176), 24); } -UPB_INLINE int32_t validate_StringRules_well_known_regex(const validate_StringRules *msg) { return UPB_READ_ONEOF(msg, int32_t, UPB_SIZE(112, 168), UPB_SIZE(120, 176), 24, validate_UNKNOWN); } +UPB_INLINE bool validate_StringRules_has_address(const validate_StringRules *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(128, 184), 21); } +UPB_INLINE bool validate_StringRules_address(const validate_StringRules *msg) { return UPB_READ_ONEOF(msg, bool, UPB_SIZE(120, 176), UPB_SIZE(128, 184), 21, false); } +UPB_INLINE bool validate_StringRules_has_uuid(const validate_StringRules *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(128, 184), 22); } +UPB_INLINE bool validate_StringRules_uuid(const validate_StringRules *msg) { return UPB_READ_ONEOF(msg, bool, UPB_SIZE(120, 176), UPB_SIZE(128, 184), 22, false); } +UPB_INLINE bool validate_StringRules_has_not_contains(const validate_StringRules *msg) { return _upb_has_field(msg, 13); } +UPB_INLINE upb_strview validate_StringRules_not_contains(const validate_StringRules *msg) { return UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(100, 144)); } +UPB_INLINE bool validate_StringRules_has_well_known_regex(const validate_StringRules *msg) { return _upb_has_oneof_field(msg, UPB_SIZE(128, 184), 24); } +UPB_INLINE int32_t validate_StringRules_well_known_regex(const validate_StringRules *msg) { return UPB_READ_ONEOF(msg, int32_t, UPB_SIZE(120, 176), UPB_SIZE(128, 184), 24, validate_UNKNOWN); } +UPB_INLINE bool validate_StringRules_has_strict(const validate_StringRules *msg) { return _upb_has_field(msg, 7); } +UPB_INLINE bool validate_StringRules_strict(const validate_StringRules *msg) { return UPB_FIELD_AT(msg, bool, UPB_SIZE(56, 56)); } UPB_INLINE void validate_StringRules_set_const(validate_StringRules *msg, upb_strview value) { - _upb_sethas(msg, 7); - UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(56, 56)) = value; + _upb_sethas(msg, 8); + UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(60, 64)) = value; } UPB_INLINE void validate_StringRules_set_min_len(validate_StringRules *msg, uint64_t value) { _upb_sethas(msg, 1); @@ -1387,61 +1389,61 @@ UPB_INLINE void validate_StringRules_set_max_bytes(validate_StringRules *msg, ui UPB_FIELD_AT(msg, uint64_t, UPB_SIZE(32, 32)) = value; } UPB_INLINE void validate_StringRules_set_pattern(validate_StringRules *msg, upb_strview value) { - _upb_sethas(msg, 8); - UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(64, 72)) = value; + _upb_sethas(msg, 9); + UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(68, 80)) = value; } UPB_INLINE void validate_StringRules_set_prefix(validate_StringRules *msg, upb_strview value) { - _upb_sethas(msg, 9); - UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(72, 88)) = value; + _upb_sethas(msg, 10); + UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(76, 96)) = value; } UPB_INLINE void validate_StringRules_set_suffix(validate_StringRules *msg, upb_strview value) { - _upb_sethas(msg, 10); - UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(80, 104)) = value; + _upb_sethas(msg, 11); + UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(84, 112)) = value; } UPB_INLINE void validate_StringRules_set_contains(validate_StringRules *msg, upb_strview value) { - _upb_sethas(msg, 11); - UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(88, 120)) = value; + _upb_sethas(msg, 12); + UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(92, 128)) = value; } UPB_INLINE upb_strview* validate_StringRules_mutable_in(validate_StringRules *msg, size_t *len) { - return (upb_strview*)_upb_array_mutable_accessor(msg, UPB_SIZE(104, 152), len); + return (upb_strview*)_upb_array_mutable_accessor(msg, UPB_SIZE(108, 160), len); } UPB_INLINE upb_strview* validate_StringRules_resize_in(validate_StringRules *msg, size_t len, upb_arena *arena) { - return (upb_strview*)_upb_array_resize_accessor(msg, UPB_SIZE(104, 152), len, UPB_SIZE(8, 16), UPB_TYPE_STRING, arena); + return (upb_strview*)_upb_array_resize_accessor(msg, UPB_SIZE(108, 160), len, UPB_SIZE(8, 16), UPB_TYPE_STRING, arena); } UPB_INLINE bool validate_StringRules_add_in(validate_StringRules *msg, upb_strview val, upb_arena *arena) { return _upb_array_append_accessor( - msg, UPB_SIZE(104, 152), UPB_SIZE(8, 16), UPB_TYPE_STRING, &val, arena); + msg, UPB_SIZE(108, 160), UPB_SIZE(8, 16), UPB_TYPE_STRING, &val, arena); } UPB_INLINE upb_strview* validate_StringRules_mutable_not_in(validate_StringRules *msg, size_t *len) { - return (upb_strview*)_upb_array_mutable_accessor(msg, UPB_SIZE(108, 160), len); + return (upb_strview*)_upb_array_mutable_accessor(msg, UPB_SIZE(112, 168), len); } UPB_INLINE upb_strview* validate_StringRules_resize_not_in(validate_StringRules *msg, size_t len, upb_arena *arena) { - return (upb_strview*)_upb_array_resize_accessor(msg, UPB_SIZE(108, 160), len, UPB_SIZE(8, 16), UPB_TYPE_STRING, arena); + return (upb_strview*)_upb_array_resize_accessor(msg, UPB_SIZE(112, 168), len, UPB_SIZE(8, 16), UPB_TYPE_STRING, arena); } UPB_INLINE bool validate_StringRules_add_not_in(validate_StringRules *msg, upb_strview val, upb_arena *arena) { return _upb_array_append_accessor( - msg, UPB_SIZE(108, 160), UPB_SIZE(8, 16), UPB_TYPE_STRING, &val, arena); + msg, UPB_SIZE(112, 168), UPB_SIZE(8, 16), UPB_TYPE_STRING, &val, arena); } UPB_INLINE void validate_StringRules_set_email(validate_StringRules *msg, bool value) { - UPB_WRITE_ONEOF(msg, bool, UPB_SIZE(112, 168), value, UPB_SIZE(120, 176), 12); + UPB_WRITE_ONEOF(msg, bool, UPB_SIZE(120, 176), value, UPB_SIZE(128, 184), 12); } UPB_INLINE void validate_StringRules_set_hostname(validate_StringRules *msg, bool value) { - UPB_WRITE_ONEOF(msg, bool, UPB_SIZE(112, 168), value, UPB_SIZE(120, 176), 13); + UPB_WRITE_ONEOF(msg, bool, UPB_SIZE(120, 176), value, UPB_SIZE(128, 184), 13); } UPB_INLINE void validate_StringRules_set_ip(validate_StringRules *msg, bool value) { - UPB_WRITE_ONEOF(msg, bool, UPB_SIZE(112, 168), value, UPB_SIZE(120, 176), 14); + UPB_WRITE_ONEOF(msg, bool, UPB_SIZE(120, 176), value, UPB_SIZE(128, 184), 14); } UPB_INLINE void validate_StringRules_set_ipv4(validate_StringRules *msg, bool value) { - UPB_WRITE_ONEOF(msg, bool, UPB_SIZE(112, 168), value, UPB_SIZE(120, 176), 15); + UPB_WRITE_ONEOF(msg, bool, UPB_SIZE(120, 176), value, UPB_SIZE(128, 184), 15); } UPB_INLINE void validate_StringRules_set_ipv6(validate_StringRules *msg, bool value) { - UPB_WRITE_ONEOF(msg, bool, UPB_SIZE(112, 168), value, UPB_SIZE(120, 176), 16); + UPB_WRITE_ONEOF(msg, bool, UPB_SIZE(120, 176), value, UPB_SIZE(128, 184), 16); } UPB_INLINE void validate_StringRules_set_uri(validate_StringRules *msg, bool value) { - UPB_WRITE_ONEOF(msg, bool, UPB_SIZE(112, 168), value, UPB_SIZE(120, 176), 17); + UPB_WRITE_ONEOF(msg, bool, UPB_SIZE(120, 176), value, UPB_SIZE(128, 184), 17); } UPB_INLINE void validate_StringRules_set_uri_ref(validate_StringRules *msg, bool value) { - UPB_WRITE_ONEOF(msg, bool, UPB_SIZE(112, 168), value, UPB_SIZE(120, 176), 18); + UPB_WRITE_ONEOF(msg, bool, UPB_SIZE(120, 176), value, UPB_SIZE(128, 184), 18); } UPB_INLINE void validate_StringRules_set_len(validate_StringRules *msg, uint64_t value) { _upb_sethas(msg, 5); @@ -1452,17 +1454,21 @@ UPB_INLINE void validate_StringRules_set_len_bytes(validate_StringRules *msg, ui UPB_FIELD_AT(msg, uint64_t, UPB_SIZE(48, 48)) = value; } UPB_INLINE void validate_StringRules_set_address(validate_StringRules *msg, bool value) { - UPB_WRITE_ONEOF(msg, bool, UPB_SIZE(112, 168), value, UPB_SIZE(120, 176), 21); + UPB_WRITE_ONEOF(msg, bool, UPB_SIZE(120, 176), value, UPB_SIZE(128, 184), 21); } UPB_INLINE void validate_StringRules_set_uuid(validate_StringRules *msg, bool value) { - UPB_WRITE_ONEOF(msg, bool, UPB_SIZE(112, 168), value, UPB_SIZE(120, 176), 22); + UPB_WRITE_ONEOF(msg, bool, UPB_SIZE(120, 176), value, UPB_SIZE(128, 184), 22); } UPB_INLINE void validate_StringRules_set_not_contains(validate_StringRules *msg, upb_strview value) { - _upb_sethas(msg, 12); - UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(96, 136)) = value; + _upb_sethas(msg, 13); + UPB_FIELD_AT(msg, upb_strview, UPB_SIZE(100, 144)) = value; } UPB_INLINE void validate_StringRules_set_well_known_regex(validate_StringRules *msg, int32_t value) { - UPB_WRITE_ONEOF(msg, int32_t, UPB_SIZE(112, 168), value, UPB_SIZE(120, 176), 24); + UPB_WRITE_ONEOF(msg, int32_t, UPB_SIZE(120, 176), value, UPB_SIZE(128, 184), 24); +} +UPB_INLINE void validate_StringRules_set_strict(validate_StringRules *msg, bool value) { + _upb_sethas(msg, 7); + UPB_FIELD_AT(msg, bool, UPB_SIZE(56, 56)) = value; } /* validate.BytesRules */ diff --git a/src/proto/grpc/testing/xds/lrs_for_test.proto b/src/proto/grpc/testing/xds/lrs_for_test.proto index 9d8ae267bc7..d46d5e2ccc5 100644 --- a/src/proto/grpc/testing/xds/lrs_for_test.proto +++ b/src/proto/grpc/testing/xds/lrs_for_test.proto @@ -166,8 +166,14 @@ message LoadStatsRequest { // [#not-implemented-hide:] Not configuration. TBD how to doc proto APIs. message LoadStatsResponse { // Clusters to report stats for. + // Not populated if *send_all_clusters* is true. repeated string clusters = 1; + // If true, the client should send all clusters it knows about. + // Only clients that advertise the "envoy.lrs.supports_send_all_clusters" capability in their + // :ref:`client_features` field will honor this field. + bool send_all_clusters = 4; + // The minimum interval of time to collect stats over. This is only a minimum for two reasons: // 1. There may be some delay from when the timer fires until stats sampling occurs. // 2. For clusters that were already feature in the previous *LoadStatsResponse*, any traffic diff --git a/src/python/grpcio/grpc_core_dependencies.py b/src/python/grpcio/grpc_core_dependencies.py index 08a60c079dc..d70bd30f925 100644 --- a/src/python/grpcio/grpc_core_dependencies.py +++ b/src/python/grpcio/grpc_core_dependencies.py @@ -127,18 +127,24 @@ CORE_SOURCE_FILES = [ 'src/core/ext/upb-generated/envoy/annotations/deprecation.upb.c', 'src/core/ext/upb-generated/envoy/annotations/resource.upb.c', 'src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.c', 'src/core/ext/upb-generated/envoy/api/v2/cds.upb.c', 'src/core/ext/upb-generated/envoy/api/v2/cluster.upb.c', 'src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c', 'src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.c', 'src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c', 'src/core/ext/upb-generated/envoy/api/v2/core/address.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.c', 'src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c', 'src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.c', 'src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c', 'src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c', 'src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.c', 'src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c', + 'src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.c', 'src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c', 'src/core/ext/upb-generated/envoy/api/v2/eds.upb.c', 'src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.c', @@ -159,6 +165,7 @@ CORE_SOURCE_FILES = [ 'src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.c', 'src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.c', 'src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.c', + 'src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.c', 'src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.c', 'src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.c', 'src/core/ext/upb-generated/envoy/type/http.upb.c', @@ -187,6 +194,7 @@ CORE_SOURCE_FILES = [ 'src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c', 'src/core/ext/upb-generated/udpa/annotations/migrate.upb.c', 'src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c', + 'src/core/ext/upb-generated/udpa/annotations/status.upb.c', 'src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c', 'src/core/ext/upb-generated/validate/validate.upb.c', 'src/core/lib/avl/avl.cc', diff --git a/test/cpp/end2end/xds_end2end_test.cc b/test/cpp/end2end/xds_end2end_test.cc index f993bb88e78..612338e1404 100644 --- a/test/cpp/end2end/xds_end2end_test.cc +++ b/test/cpp/end2end/xds_end2end_test.cc @@ -985,10 +985,17 @@ class LrsServiceImpl : public LrsService, request.node().metadata().fields().find("PROXYLESS_CLIENT_HOSTNAME"); GPR_ASSERT(it != request.node().metadata().fields().end()); EXPECT_EQ(it->second.string_value(), kDefaultResourceName); + // Verify client features. + EXPECT_THAT(request.node().client_features(), + ::testing::Contains("envoy.lrs.supports_send_all_clusters")); // Send initial response. LoadStatsResponse response; - for (const std::string& cluster_name : cluster_names_) { - response.add_clusters(cluster_name); + if (send_all_clusters_) { + response.set_send_all_clusters(true); + } else { + for (const std::string& cluster_name : cluster_names_) { + response.add_clusters(cluster_name); + } } response.mutable_load_reporting_interval()->set_seconds( client_load_reporting_interval_seconds_); @@ -1016,6 +1023,9 @@ class LrsServiceImpl : public LrsService, } // Must be called before the LRS call is started. + void set_send_all_clusters(bool send_all_clusters) { + send_all_clusters_ = send_all_clusters; + } void set_cluster_names(const std::set& cluster_names) { cluster_names_ = cluster_names; } @@ -1061,6 +1071,7 @@ class LrsServiceImpl : public LrsService, } const int client_load_reporting_interval_seconds_; + bool send_all_clusters_ = false; std::set cluster_names_; grpc_core::CondVar lrs_cv_; @@ -3848,6 +3859,53 @@ TEST_P(ClientLoadReportingTest, Vanilla) { EXPECT_EQ(1U, balancers_[0]->lrs_service()->response_count()); } +// Tests send_all_clusters. +TEST_P(ClientLoadReportingTest, SendAllClusters) { + balancers_[0]->lrs_service()->set_send_all_clusters(true); + SetNextResolution({}); + SetNextResolutionForLbChannel({balancers_[0]->port()}); + const size_t kNumRpcsPerAddress = 10; + const size_t kNumFailuresPerAddress = 3; + // TODO(juanlishen): Partition the backends after multiple localities is + // tested. + AdsServiceImpl::EdsResourceArgs args({ + {"locality0", GetBackendPorts()}, + }); + balancers_[0]->ads_service()->SetEdsResource( + AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); + // Wait until all backends are ready. + int num_ok = 0; + int num_failure = 0; + int num_drops = 0; + std::tie(num_ok, num_failure, num_drops) = WaitForAllBackends(); + // Send kNumRpcsPerAddress RPCs per server. + CheckRpcSendOk(kNumRpcsPerAddress * num_backends_); + CheckRpcSendFailure(kNumFailuresPerAddress * num_backends_, + /*server_fail=*/true); + // Check that each backend got the right number of requests. + for (size_t i = 0; i < backends_.size(); ++i) { + EXPECT_EQ(kNumRpcsPerAddress + kNumFailuresPerAddress, + backends_[i]->backend_service()->request_count()); + } + // The load report received at the balancer should be correct. + std::vector load_report = + balancers_[0]->lrs_service()->WaitForLoadReport(); + ASSERT_EQ(load_report.size(), 1UL); + ClientStats& client_stats = load_report.front(); + EXPECT_EQ(kNumRpcsPerAddress * num_backends_ + num_ok, + client_stats.total_successful_requests()); + EXPECT_EQ(0U, client_stats.total_requests_in_progress()); + EXPECT_EQ((kNumRpcsPerAddress + kNumFailuresPerAddress) * num_backends_ + + num_ok + num_failure, + client_stats.total_issued_requests()); + EXPECT_EQ(kNumFailuresPerAddress * num_backends_ + num_failure, + client_stats.total_error_requests()); + EXPECT_EQ(0U, client_stats.total_dropped_requests()); + // The LRS service got a single request, and sent a single response. + EXPECT_EQ(1U, balancers_[0]->lrs_service()->request_count()); + EXPECT_EQ(1U, balancers_[0]->lrs_service()->response_count()); +} + // Tests that we don't include stats for clusters that are not requested // by the LRS server. TEST_P(ClientLoadReportingTest, HonorsClustersRequestedByLrsServer) { diff --git a/third_party/envoy-api b/third_party/envoy-api index 0487bbb43c3..8dcc476be69 160000 --- a/third_party/envoy-api +++ b/third_party/envoy-api @@ -1 +1 @@ -Subproject commit 0487bbb43c3e8b54c7332f74ba7344d8265774f7 +Subproject commit 8dcc476be69437b505af181a6e8b167fdb101d7e diff --git a/third_party/protoc-gen-validate b/third_party/protoc-gen-validate index c0a080f4bea..0f2bc6c0fda 160000 --- a/third_party/protoc-gen-validate +++ b/third_party/protoc-gen-validate @@ -1 +1 @@ -Subproject commit c0a080f4bea50bc087cdd8551143ee538cf3459e +Subproject commit 0f2bc6c0fdac9113e3863ea6e30e5b2bd33e3b40 diff --git a/third_party/udpa b/third_party/udpa index db4b343e48c..e8cd3a4bb30 160000 --- a/third_party/udpa +++ b/third_party/udpa @@ -1 +1 @@ -Subproject commit db4b343e48c1264bb4d9ff491b059300701dc7c7 +Subproject commit e8cd3a4bb307e2c810cffff99f93e96e6d7fee85 diff --git a/tools/codegen/core/gen_upb_api.sh b/tools/codegen/core/gen_upb_api.sh index 8dd57c4474d..51d29930142 100755 --- a/tools/codegen/core/gen_upb_api.sh +++ b/tools/codegen/core/gen_upb_api.sh @@ -37,17 +37,23 @@ proto_files=( \ "envoy/annotations/deprecation.proto" \ "envoy/annotations/resource.proto" \ "envoy/api/v2/auth/cert.proto" \ + "envoy/api/v2/auth/common.proto" \ + "envoy/api/v2/auth/secret.proto" \ + "envoy/api/v2/auth/tls.proto" \ "envoy/api/v2/cds.proto" \ "envoy/api/v2/cluster/circuit_breaker.proto" \ "envoy/api/v2/cluster/filter.proto" \ "envoy/api/v2/cluster/outlier_detection.proto" \ "envoy/api/v2/core/address.proto" \ "envoy/api/v2/core/base.proto" \ + "envoy/api/v2/core/backoff.proto" \ "envoy/api/v2/core/config_source.proto" \ + "envoy/api/v2/core/event_service_config.proto" \ "envoy/api/v2/core/grpc_service.proto" \ "envoy/api/v2/core/health_check.proto" \ "envoy/api/v2/core/http_uri.proto" \ "envoy/api/v2/core/protocol.proto" \ + "envoy/api/v2/core/socket_option.proto" \ "envoy/api/v2/cluster.proto" \ "envoy/api/v2/discovery.proto" \ "envoy/api/v2/eds.proto" \ @@ -68,6 +74,7 @@ proto_files=( \ "envoy/config/listener/v2/api_listener.proto" \ "envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.proto" \ "envoy/config/filter/accesslog/v2/accesslog.proto" \ + "envoy/config/trace/v2/http_tracer.proto" \ "envoy/service/discovery/v2/ads.proto" \ "envoy/service/load_stats/v2/lrs.proto" \ "envoy/type/http.proto" \ @@ -98,6 +105,7 @@ proto_files=( \ "udpa/data/orca/v1/orca_load_report.proto" \ "udpa/annotations/migrate.proto" \ "udpa/annotations/sensitive.proto" \ + "udpa/annotations/status.proto" \ "validate/validate.proto") for i in "${proto_files[@]}" diff --git a/tools/doxygen/Doxyfile.c++.internal b/tools/doxygen/Doxyfile.c++.internal index 94b242dbeb6..a4081d4a7f9 100644 --- a/tools/doxygen/Doxyfile.c++.internal +++ b/tools/doxygen/Doxyfile.c++.internal @@ -1266,6 +1266,12 @@ src/core/ext/upb-generated/envoy/annotations/resource.upb.c \ src/core/ext/upb-generated/envoy/annotations/resource.upb.h \ src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c \ src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h \ +src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.c \ +src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.h \ +src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.c \ +src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.h \ +src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.c \ +src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.h \ src/core/ext/upb-generated/envoy/api/v2/cds.upb.c \ src/core/ext/upb-generated/envoy/api/v2/cds.upb.h \ src/core/ext/upb-generated/envoy/api/v2/cluster.upb.c \ @@ -1278,10 +1284,14 @@ src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c \ src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.h \ src/core/ext/upb-generated/envoy/api/v2/core/address.upb.c \ src/core/ext/upb-generated/envoy/api/v2/core/address.upb.h \ +src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.c \ +src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.h \ src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c \ src/core/ext/upb-generated/envoy/api/v2/core/base.upb.h \ src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c \ src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.h \ +src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.c \ +src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.h \ src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c \ src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.h \ src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c \ @@ -1290,6 +1300,8 @@ src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.c \ src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.h \ src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c \ src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h \ +src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.c \ +src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.h \ src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c \ src/core/ext/upb-generated/envoy/api/v2/discovery.upb.h \ src/core/ext/upb-generated/envoy/api/v2/eds.upb.c \ @@ -1330,6 +1342,8 @@ src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.h \ src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.c \ src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.h \ +src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.c \ +src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.h \ src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.c \ src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.h \ src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.c \ @@ -1386,6 +1400,8 @@ src/core/ext/upb-generated/udpa/annotations/migrate.upb.c \ src/core/ext/upb-generated/udpa/annotations/migrate.upb.h \ src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c \ src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h \ +src/core/ext/upb-generated/udpa/annotations/status.upb.c \ +src/core/ext/upb-generated/udpa/annotations/status.upb.h \ src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c \ src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h \ src/core/ext/upb-generated/validate/validate.upb.c \ diff --git a/tools/doxygen/Doxyfile.core.internal b/tools/doxygen/Doxyfile.core.internal index 72db4df6142..b95499dbbd8 100644 --- a/tools/doxygen/Doxyfile.core.internal +++ b/tools/doxygen/Doxyfile.core.internal @@ -1073,6 +1073,12 @@ src/core/ext/upb-generated/envoy/annotations/resource.upb.c \ src/core/ext/upb-generated/envoy/annotations/resource.upb.h \ src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c \ src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h \ +src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.c \ +src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.h \ +src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.c \ +src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.h \ +src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.c \ +src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.h \ src/core/ext/upb-generated/envoy/api/v2/cds.upb.c \ src/core/ext/upb-generated/envoy/api/v2/cds.upb.h \ src/core/ext/upb-generated/envoy/api/v2/cluster.upb.c \ @@ -1085,10 +1091,14 @@ src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c \ src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.h \ src/core/ext/upb-generated/envoy/api/v2/core/address.upb.c \ src/core/ext/upb-generated/envoy/api/v2/core/address.upb.h \ +src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.c \ +src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.h \ src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c \ src/core/ext/upb-generated/envoy/api/v2/core/base.upb.h \ src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c \ src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.h \ +src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.c \ +src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.h \ src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c \ src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.h \ src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c \ @@ -1097,6 +1107,8 @@ src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.c \ src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.h \ src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c \ src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h \ +src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.c \ +src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.h \ src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c \ src/core/ext/upb-generated/envoy/api/v2/discovery.upb.h \ src/core/ext/upb-generated/envoy/api/v2/eds.upb.c \ @@ -1137,6 +1149,8 @@ src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.h \ src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.c \ src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.h \ +src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.c \ +src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.h \ src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.c \ src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.h \ src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.c \ @@ -1193,6 +1207,8 @@ src/core/ext/upb-generated/udpa/annotations/migrate.upb.c \ src/core/ext/upb-generated/udpa/annotations/migrate.upb.h \ src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c \ src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h \ +src/core/ext/upb-generated/udpa/annotations/status.upb.c \ +src/core/ext/upb-generated/udpa/annotations/status.upb.h \ src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c \ src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h \ src/core/ext/upb-generated/validate/validate.upb.c \ diff --git a/tools/run_tests/sanity/check_submodules.sh b/tools/run_tests/sanity/check_submodules.sh index 9195189ea46..22ceb109054 100755 --- a/tools/run_tests/sanity/check_submodules.sh +++ b/tools/run_tests/sanity/check_submodules.sh @@ -31,14 +31,14 @@ cat << EOF | awk '{ print $1 }' | sort > "$want_submodules" 73594cde8c9a52a102c4341c244c833aa61b9c06 third_party/bloaty (remotes/origin/wide-14-g73594cd) 1c2769383f027befac5b75b6cedd25daf3bf4dcf third_party/boringssl-with-bazel (remotes/origin/master-with-bazel) e982924acee7f7313b4baa4ee5ec000c5e373c30 third_party/cares/cares (cares-1_15_0) - 0487bbb43c3e8b54c7332f74ba7344d8265774f7 third_party/envoy-api (heads/master) + 8dcc476be69437b505af181a6e8b167fdb101d7e third_party/envoy-api (heads/master) 28f50e0fed19872e0fd50dd23ce2ee8cd759338e third_party/gflags (v2.2.0-5-g30dbc81) 80ed4d0bbf65d57cc267dfc63bd2584557f11f9b third_party/googleapis (common-protos-1_3_1-915-g80ed4d0bb) c9ccac7cb7345901884aabf5d1a786cfa6e2f397 third_party/googletest (6e2f397) 15ae750151ac9341e5945eb38f8982d59fb99201 third_party/libuv (v1.34.0) d0bfd5221182da1a7cc280f3337b5e41a89539cf third_party/protobuf (v3.7.0-rc.2-784-gd0bfd5221) - c0a080f4bea50bc087cdd8551143ee538cf3459e third_party/protoc-gen-validate (v0.0.10) - db4b343e48c1264bb4d9ff491b059300701dc7c7 third_party/udpa (heads/master) + 0f2bc6c0fdac9113e3863ea6e30e5b2bd33e3b40 third_party/protoc-gen-validate (v0.0.10) + e8cd3a4bb307e2c810cffff99f93e96e6d7fee85 third_party/udpa (heads/master) cacf7f1d4e3d44d871b605da3b647f07d718623f third_party/zlib (v1.2.11) EOF From 9640aa3db80b20e131b4011f63da27dad79730fb Mon Sep 17 00:00:00 2001 From: Muxi Yan Date: Mon, 4 May 2020 16:55:33 -0700 Subject: [PATCH 676/758] Add FB number in the comment --- src/objective-c/README-CFSTREAM.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/objective-c/README-CFSTREAM.md b/src/objective-c/README-CFSTREAM.md index 7d75d47a606..94a43ff3d06 100644 --- a/src/objective-c/README-CFSTREAM.md +++ b/src/objective-c/README-CFSTREAM.md @@ -24,14 +24,14 @@ case of problem and you want to disable CFStream on iOS, you can set environment "grpc\_cfstream=0". ## Caveats -It is known to us that the CFStream API has some bug which will cause gRPC's CFStream networking -layer to stall occasionally. The issue mostly occur on MacOS systems (including iOS simulators on -MacOS); iOS may be affected too but we have not seen issue there. gRPC provides a workaround to this -problem with an alternative poller based on CFRunLoop. The poller can be enabled by setting -environment variable `GRPC_CFSTREAM_RUN_LOOP=1`. Note that the poller is a client side only poller -that does not support running a server on it. That means if an app opts in to the CFRunLoop-based -poller, the app cannot host a gRPC server (gRPC Objective-C does not support running a server but -other languages running on iOS do support it). +It is known to us that the CFStream API has some bug (FB6162039) which will cause gRPC's CFStream +networking layer to stall occasionally. The issue mostly occur on MacOS systems (including iOS +simulators on MacOS); iOS may be affected too but we have not seen issue there. gRPC provides a +workaround to this problem with an alternative poller based on CFRunLoop. The poller can be enabled +by setting environment variable `GRPC_CFSTREAM_RUN_LOOP=1`. Note that the poller is a client side +only poller that does not support running a server on it. That means if an app opts in to the +CFRunLoop-based poller, the app cannot host a gRPC server (gRPC Objective-C does not support running +a server but other languages running on iOS do support it). ## Notes From 4484918d346d8b116fd566737bc5394ecab8d4d0 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Mon, 4 May 2020 17:13:51 -0700 Subject: [PATCH 677/758] Close the socket to ensure falling into transient failure state --- .../tests/unit/_metadata_flags_test.py | 95 ++++++++++--------- 1 file changed, 51 insertions(+), 44 deletions(-) diff --git a/src/python/grpcio_tests/tests/unit/_metadata_flags_test.py b/src/python/grpcio_tests/tests/unit/_metadata_flags_test.py index de9ded2bafb..32bc6d48b1e 100644 --- a/src/python/grpcio_tests/tests/unit/_metadata_flags_test.py +++ b/src/python/grpcio_tests/tests/unit/_metadata_flags_test.py @@ -17,6 +17,7 @@ import time import weakref import unittest import threading +import logging import socket from six.moves import queue @@ -25,7 +26,7 @@ import grpc from tests.unit import test_common from tests.unit.framework.common import test_constants import tests.unit.framework.common -from tests.unit.framework.common import bound_socket +from tests.unit.framework.common import get_socket _UNARY_UNARY = '/test/UnaryUnary' _UNARY_STREAM = '/test/UnaryStream' @@ -101,8 +102,9 @@ class _GenericHandler(grpc.GenericRpcHandler): def create_dummy_channel(): """Creating dummy channels is a workaround for retries""" - with bound_socket() as (host, port): - return grpc.insecure_channel('{}:{}'.format(host, port)) + host, port, sock = get_socket() + sock.close() + return grpc.insecure_channel('{}:{}'.format(host, port)) def perform_unary_unary_call(channel, wait_for_ready=None): @@ -203,51 +205,56 @@ class MetadataFlagsTest(unittest.TestCase): # main thread. So, it need another method to store the # exceptions and raise them again in main thread. unhandled_exceptions = queue.Queue() - with bound_socket(listen=False) as (host, port): - addr = '{}:{}'.format(host, port) - wg = test_common.WaitGroup(len(_ALL_CALL_CASES)) - def wait_for_transient_failure(channel_connectivity): - if channel_connectivity == grpc.ChannelConnectivity.TRANSIENT_FAILURE: + # We just need an unused TCP port + host, port, sock = get_socket() + sock.close() + + addr = '{}:{}'.format(host, port) + wg = test_common.WaitGroup(len(_ALL_CALL_CASES)) + + def wait_for_transient_failure(channel_connectivity): + if channel_connectivity == grpc.ChannelConnectivity.TRANSIENT_FAILURE: + wg.done() + + def test_call(perform_call): + with grpc.insecure_channel(addr) as channel: + try: + channel.subscribe(wait_for_transient_failure) + perform_call(channel, wait_for_ready=True) + except BaseException as e: # pylint: disable=broad-except + # If the call failed, the thread would be destroyed. The + # channel object can be collected before calling the + # callback, which will result in a deadlock. wg.done() + unhandled_exceptions.put(e, True) - def test_call(perform_call): - with grpc.insecure_channel(addr) as channel: - try: - channel.subscribe(wait_for_transient_failure) - perform_call(channel, wait_for_ready=True) - except BaseException as e: # pylint: disable=broad-except - # If the call failed, the thread would be destroyed. The - # channel object can be collected before calling the - # callback, which will result in a deadlock. - wg.done() - unhandled_exceptions.put(e, True) - - test_threads = [] - for perform_call in _ALL_CALL_CASES: - test_thread = threading.Thread(target=test_call, - args=(perform_call,)) - test_thread.exception = None - test_thread.start() - test_threads.append(test_thread) - - # Start the server after the connections are waiting - wg.wait() - server = test_common.test_server(reuse_port=True) - server.add_generic_rpc_handlers( - (_GenericHandler(weakref.proxy(self)),)) - server.add_insecure_port(addr) - server.start() - - for test_thread in test_threads: - test_thread.join() - - # Stop the server to make test end properly - server.stop(0) - - if not unhandled_exceptions.empty(): - raise unhandled_exceptions.get(True) + test_threads = [] + for perform_call in _ALL_CALL_CASES: + test_thread = threading.Thread(target=test_call, + args=(perform_call,), + daemon=True) + test_thread.exception = None + test_thread.start() + test_threads.append(test_thread) + + # Start the server after the connections are waiting + wg.wait() + server = test_common.test_server(reuse_port=True) + server.add_generic_rpc_handlers((_GenericHandler(weakref.proxy(self)),)) + server.add_insecure_port(addr) + server.start() + + for test_thread in test_threads: + test_thread.join() + + # Stop the server to make test end properly + server.stop(0) + + if not unhandled_exceptions.empty(): + raise unhandled_exceptions.get(True) if __name__ == '__main__': + logging.basicConfig(level=logging.DEBUG) unittest.main(verbosity=2) From ac502892740dde352f70b132010d24f050565534 Mon Sep 17 00:00:00 2001 From: Donna Dionne Date: Mon, 4 May 2020 17:14:54 -0700 Subject: [PATCH 678/758] Modify the signature of all SetXdsResource methods to avoid un-necessary parameter "name". --- test/cpp/end2end/xds_end2end_test.cc | 222 +++++++++++++-------------- 1 file changed, 105 insertions(+), 117 deletions(-) diff --git a/test/cpp/end2end/xds_end2end_test.cc b/test/cpp/end2end/xds_end2end_test.cc index 7d70feadbad..f2dc6f08e0e 100644 --- a/test/cpp/end2end/xds_end2end_test.cc +++ b/test/cpp/end2end/xds_end2end_test.cc @@ -420,10 +420,10 @@ class AdsServiceImpl : public AggregatedDiscoveryService::Service, auto* route = virtual_host->add_routes(); route->mutable_match()->set_prefix(""); route->mutable_route()->set_cluster(kDefaultResourceName); - SetRdsResource(default_route_config_, kDefaultResourceName); + SetRdsResource(default_route_config_); // Construct LDS response data (with inlined RDS result). default_listener_ = BuildListener(default_route_config_); - SetLdsResource(default_listener_, kDefaultResourceName); + SetLdsResource(default_listener_); // Construct CDS response data. default_cluster_.set_name(kDefaultResourceName); default_cluster_.set_type(envoy::api::v2::Cluster::EDS); @@ -434,7 +434,7 @@ class AdsServiceImpl : public AggregatedDiscoveryService::Service, if (enable_load_reporting) { default_cluster_.mutable_lrs_server()->mutable_self(); } - SetCdsResource(default_cluster_, kDefaultResourceName); + SetCdsResource(default_cluster_); } Status StreamAggregatedResources(ServerContext* context, @@ -684,30 +684,28 @@ class AdsServiceImpl : public AggregatedDiscoveryService::Service, } } - void SetLdsResource(const Listener& listener, const std::string& name) { + void SetLdsResource(const Listener& listener) { google::protobuf::Any resource; resource.PackFrom(listener); - SetResource(std::move(resource), kLdsTypeUrl, name); + SetResource(std::move(resource), kLdsTypeUrl, listener.name()); } - void SetRdsResource(const RouteConfiguration& route, - const std::string& name) { + void SetRdsResource(const RouteConfiguration& route) { google::protobuf::Any resource; resource.PackFrom(route); - SetResource(std::move(resource), kRdsTypeUrl, name); + SetResource(std::move(resource), kRdsTypeUrl, route.name()); } - void SetCdsResource(const Cluster& cluster, const std::string& name) { + void SetCdsResource(const Cluster& cluster) { google::protobuf::Any resource; resource.PackFrom(cluster); - SetResource(std::move(resource), kCdsTypeUrl, name); + SetResource(std::move(resource), kCdsTypeUrl, cluster.name()); } - void SetEdsResource(const ClusterLoadAssignment& assignment, - const std::string& name) { + void SetEdsResource(const ClusterLoadAssignment& assignment) { google::protobuf::Any resource; resource.PackFrom(assignment); - SetResource(std::move(resource), kEdsTypeUrl, name); + SetResource(std::move(resource), kEdsTypeUrl, assignment.cluster_name()); } void SetLdsToUseDynamicRds() { @@ -718,7 +716,7 @@ class AdsServiceImpl : public AggregatedDiscoveryService::Service, rds->mutable_config_source()->mutable_ads(); listener.mutable_api_listener()->mutable_api_listener()->PackFrom( http_connection_manager); - SetLdsResource(listener, kDefaultResourceName); + SetLdsResource(listener); } static Listener BuildListener(const RouteConfiguration& route_config) { @@ -1482,11 +1480,10 @@ class XdsEnd2endTest : public ::testing::TestWithParam { void SetRouteConfiguration(int idx, const RouteConfiguration& route_config) { if (GetParam().enable_rds_testing()) { - balancers_[idx]->ads_service()->SetRdsResource(route_config, - kDefaultResourceName); + balancers_[idx]->ads_service()->SetRdsResource(route_config); } else { balancers_[idx]->ads_service()->SetLdsResource( - AdsServiceImpl::BuildListener(route_config), kDefaultResourceName); + AdsServiceImpl::BuildListener(route_config)); } } @@ -1503,10 +1500,10 @@ class XdsEnd2endTest : public ::testing::TestWithParam { // via bind with a qualified name, it needs to be public. void SetEdsResourceWithDelay(size_t i, const ClusterLoadAssignment& assignment, - int delay_ms, const std::string& name) { + int delay_ms) { GPR_ASSERT(delay_ms > 0); gpr_sleep_until(grpc_timeout_milliseconds_to_deadline(delay_ms)); - balancers_[i]->ads_service()->SetEdsResource(assignment, name); + balancers_[i]->ads_service()->SetEdsResource(assignment); } protected: @@ -1697,7 +1694,7 @@ TEST_P(BasicTest, Vanilla) { {"locality0", GetBackendPorts()}, }); balancers_[0]->ads_service()->SetEdsResource( - AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); + AdsServiceImpl::BuildEdsResource(args)); // Make sure that trying to connect works without a call. channel_->GetState(true /* try_to_connect */); // We need to wait for all backends to come online. @@ -1727,7 +1724,7 @@ TEST_P(BasicTest, IgnoresUnhealthyEndpoints) { {envoy::api::v2::HealthStatus::DRAINING}}, }); balancers_[0]->ads_service()->SetEdsResource( - AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); + AdsServiceImpl::BuildEdsResource(args)); // Make sure that trying to connect works without a call. channel_->GetState(true /* try_to_connect */); // We need to wait for all backends to come online. @@ -1753,7 +1750,7 @@ TEST_P(BasicTest, SameBackendListedMultipleTimes) { }); const size_t kNumRpcsPerAddress = 10; balancers_[0]->ads_service()->SetEdsResource( - AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); + AdsServiceImpl::BuildEdsResource(args)); // We need to wait for the backend to come online. WaitForBackend(0); // Send kNumRpcsPerAddress RPCs per server. @@ -1778,15 +1775,14 @@ TEST_P(BasicTest, InitiallyEmptyServerlist) { empty_locality, }); balancers_[0]->ads_service()->SetEdsResource( - AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); + AdsServiceImpl::BuildEdsResource(args)); // Send non-empty serverlist only after kServerlistDelayMs. args = AdsServiceImpl::EdsResourceArgs({ {"locality0", GetBackendPorts()}, }); std::thread delayed_resource_setter( std::bind(&BasicTest::SetEdsResourceWithDelay, this, 0, - AdsServiceImpl::BuildEdsResource(args), kServerlistDelayMs, - kDefaultResourceName)); + AdsServiceImpl::BuildEdsResource(args), kServerlistDelayMs)); const auto t0 = system_clock::now(); // Client will block: LB will initially send empty serverlist. CheckRpcSendOk( @@ -1816,7 +1812,7 @@ TEST_P(BasicTest, AllServersUnreachableFailFast) { {"locality0", ports}, }); balancers_[0]->ads_service()->SetEdsResource( - AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); + AdsServiceImpl::BuildEdsResource(args)); const Status status = SendRpc(); // The error shouldn't be DEADLINE_EXCEEDED. EXPECT_EQ(StatusCode::UNAVAILABLE, status.error_code()); @@ -1831,7 +1827,7 @@ TEST_P(BasicTest, BackendsRestart) { {"locality0", GetBackendPorts()}, }); balancers_[0]->ads_service()->SetEdsResource( - AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); + AdsServiceImpl::BuildEdsResource(args)); WaitForAllBackends(); // Stop backends. RPCs should fail. ShutdownAllBackends(); @@ -1861,7 +1857,7 @@ TEST_P(XdsResolverOnlyTest, ChangeClusters) { {"locality0", GetBackendPorts(0, 2)}, }); balancers_[0]->ads_service()->SetEdsResource( - AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); + AdsServiceImpl::BuildEdsResource(args)); // We need to wait for all backends to come online. WaitForAllBackends(0, 2); // Populate new EDS resource. @@ -1869,12 +1865,11 @@ TEST_P(XdsResolverOnlyTest, ChangeClusters) { {"locality0", GetBackendPorts(2, 4)}, }); balancers_[0]->ads_service()->SetEdsResource( - AdsServiceImpl::BuildEdsResource(args2, kNewClusterName), - kNewClusterName); + AdsServiceImpl::BuildEdsResource(args2, kNewClusterName)); // Populate new CDS resource. Cluster new_cluster = balancers_[0]->ads_service()->default_cluster(); new_cluster.set_name(kNewClusterName); - balancers_[0]->ads_service()->SetCdsResource(new_cluster, kNewClusterName); + balancers_[0]->ads_service()->SetCdsResource(new_cluster); // Change RDS resource to point to new cluster. RouteConfiguration new_route_config = balancers_[0]->ads_service()->default_route_config(); @@ -1884,7 +1879,7 @@ TEST_P(XdsResolverOnlyTest, ChangeClusters) { ->set_cluster(kNewClusterName); Listener listener = balancers_[0]->ads_service()->BuildListener(new_route_config); - balancers_[0]->ads_service()->SetLdsResource(listener, kDefaultResourceName); + balancers_[0]->ads_service()->SetLdsResource(listener); // Wait for all new backends to be used. std::tuple counts = WaitForAllBackends(2, 4); // Make sure no RPCs failed in the transition. @@ -1899,7 +1894,7 @@ TEST_P(XdsResolverOnlyTest, ClusterRemoved) { {"locality0", GetBackendPorts()}, }); balancers_[0]->ads_service()->SetEdsResource( - AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); + AdsServiceImpl::BuildEdsResource(args)); // We need to wait for all backends to come online. WaitForAllBackends(); // Unset CDS resource. @@ -1922,7 +1917,7 @@ TEST_P(XdsResolverOnlyTest, RestartsRequestsUponReconnection) { {"locality0", GetBackendPorts(0, 2)}, }); balancers_[0]->ads_service()->SetEdsResource( - AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); + AdsServiceImpl::BuildEdsResource(args)); // We need to wait for all backends to come online. WaitForAllBackends(0, 2); // Now shut down and restart the balancer. When the client @@ -1937,12 +1932,11 @@ TEST_P(XdsResolverOnlyTest, RestartsRequestsUponReconnection) { {"locality0", GetBackendPorts(2, 4)}, }); balancers_[0]->ads_service()->SetEdsResource( - AdsServiceImpl::BuildEdsResource(args2, kNewClusterName), - kNewClusterName); + AdsServiceImpl::BuildEdsResource(args2, kNewClusterName)); // Populate new CDS resource. Cluster new_cluster = balancers_[0]->ads_service()->default_cluster(); new_cluster.set_name(kNewClusterName); - balancers_[0]->ads_service()->SetCdsResource(new_cluster, kNewClusterName); + balancers_[0]->ads_service()->SetCdsResource(new_cluster); // Change RDS resource to point to new cluster. RouteConfiguration new_route_config = balancers_[0]->ads_service()->default_route_config(); @@ -1950,8 +1944,7 @@ TEST_P(XdsResolverOnlyTest, RestartsRequestsUponReconnection) { ->mutable_routes(0) ->mutable_route() ->set_cluster(kNewClusterName); - balancers_[0]->ads_service()->SetRdsResource(new_route_config, - kDefaultResourceName); + balancers_[0]->ads_service()->SetRdsResource(new_route_config); // Wait for all new backends to be used. std::tuple counts = WaitForAllBackends(2, 4); // Make sure no RPCs failed in the transition. @@ -1966,14 +1959,14 @@ TEST_P(XdsResolverOnlyTest, DefaultRouteSpecifiesSlashPrefix) { ->mutable_match() ->set_prefix("/"); balancers_[0]->ads_service()->SetLdsResource( - AdsServiceImpl::BuildListener(route_config), kDefaultResourceName); + AdsServiceImpl::BuildListener(route_config)); SetNextResolution({}); SetNextResolutionForLbChannelAllBalancers(); AdsServiceImpl::EdsResourceArgs args({ {"locality0", GetBackendPorts()}, }); balancers_[0]->ads_service()->SetEdsResource( - AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); + AdsServiceImpl::BuildEdsResource(args)); // We need to wait for all backends to come online. WaitForAllBackends(); } @@ -1995,18 +1988,17 @@ TEST_P(XdsResolverLoadReportingOnlyTest, ChangeClusters) { {"locality0", GetBackendPorts(0, 2)}, }); balancers_[0]->ads_service()->SetEdsResource( - AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); + AdsServiceImpl::BuildEdsResource(args)); // cluster kNewClusterName -> locality1 -> backends 2 and 3 AdsServiceImpl::EdsResourceArgs args2({ {"locality1", GetBackendPorts(2, 4)}, }); balancers_[0]->ads_service()->SetEdsResource( - AdsServiceImpl::BuildEdsResource(args2, kNewClusterName), - kNewClusterName); + AdsServiceImpl::BuildEdsResource(args2, kNewClusterName)); // CDS resource for kNewClusterName. Cluster new_cluster = balancers_[0]->ads_service()->default_cluster(); new_cluster.set_name(kNewClusterName); - balancers_[0]->ads_service()->SetCdsResource(new_cluster, kNewClusterName); + balancers_[0]->ads_service()->SetCdsResource(new_cluster); // Wait for all backends to come online. int num_ok = 0; int num_failure = 0; @@ -2047,7 +2039,7 @@ TEST_P(XdsResolverLoadReportingOnlyTest, ChangeClusters) { ->set_cluster(kNewClusterName); Listener listener = balancers_[0]->ads_service()->BuildListener(new_route_config); - balancers_[0]->ads_service()->SetLdsResource(listener, kDefaultResourceName); + balancers_[0]->ads_service()->SetLdsResource(listener); // Wait for all new backends to be used. std::tie(num_ok, num_failure, num_drops) = WaitForAllBackends(2, 4); // The load report received at the balancer should be correct. @@ -2126,7 +2118,7 @@ TEST_P(SecureNamingTest, TargetNameIsExpected) { {"locality0", GetBackendPorts()}, }); balancers_[0]->ads_service()->SetEdsResource( - AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); + AdsServiceImpl::BuildEdsResource(args)); // Make sure that trying to connect works without a call. channel_->GetState(true /* try_to_connect */); // We need to wait for all backends to come online. @@ -2163,7 +2155,7 @@ using LdsTest = BasicTest; TEST_P(LdsTest, NoApiListener) { auto listener = balancers_[0]->ads_service()->default_listener(); listener.clear_api_listener(); - balancers_[0]->ads_service()->SetLdsResource(listener, kDefaultResourceName); + balancers_[0]->ads_service()->SetLdsResource(listener); SetNextResolution({}); SetNextResolutionForLbChannelAllBalancers(); CheckRpcSendFailure(); @@ -2181,7 +2173,7 @@ TEST_P(LdsTest, WrongRouteSpecifier) { http_connection_manager.mutable_scoped_routes(); listener.mutable_api_listener()->mutable_api_listener()->PackFrom( http_connection_manager); - balancers_[0]->ads_service()->SetLdsResource(listener, kDefaultResourceName); + balancers_[0]->ads_service()->SetLdsResource(listener); SetNextResolution({}); SetNextResolutionForLbChannelAllBalancers(); CheckRpcSendFailure(); @@ -2201,7 +2193,7 @@ TEST_P(LdsTest, RdsMissingConfigSource) { kDefaultResourceName); listener.mutable_api_listener()->mutable_api_listener()->PackFrom( http_connection_manager); - balancers_[0]->ads_service()->SetLdsResource(listener, kDefaultResourceName); + balancers_[0]->ads_service()->SetLdsResource(listener); SetNextResolution({}); SetNextResolutionForLbChannelAllBalancers(); CheckRpcSendFailure(); @@ -2222,7 +2214,7 @@ TEST_P(LdsTest, RdsConfigSourceDoesNotSpecifyAds) { rds->mutable_config_source()->mutable_self(); listener.mutable_api_listener()->mutable_api_listener()->PackFrom( http_connection_manager); - balancers_[0]->ads_service()->SetLdsResource(listener, kDefaultResourceName); + balancers_[0]->ads_service()->SetLdsResource(listener); SetNextResolution({}); SetNextResolutionForLbChannelAllBalancers(); CheckRpcSendFailure(); @@ -2636,20 +2628,18 @@ TEST_P(LdsRdsTest, XdsRoutingPathMatching) { {"locality0", GetBackendPorts(3, 4)}, }); balancers_[0]->ads_service()->SetEdsResource( - AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); + AdsServiceImpl::BuildEdsResource(args)); balancers_[0]->ads_service()->SetEdsResource( - AdsServiceImpl::BuildEdsResource(args1, kNewCluster1Name), - kNewCluster1Name); + AdsServiceImpl::BuildEdsResource(args1, kNewCluster1Name)); balancers_[0]->ads_service()->SetEdsResource( - AdsServiceImpl::BuildEdsResource(args2, kNewCluster2Name), - kNewCluster2Name); + AdsServiceImpl::BuildEdsResource(args2, kNewCluster2Name)); // Populate new CDS resources. Cluster new_cluster1 = balancers_[0]->ads_service()->default_cluster(); new_cluster1.set_name(kNewCluster1Name); - balancers_[0]->ads_service()->SetCdsResource(new_cluster1, kNewCluster1Name); + balancers_[0]->ads_service()->SetCdsResource(new_cluster1); Cluster new_cluster2 = balancers_[0]->ads_service()->default_cluster(); new_cluster2.set_name(kNewCluster2Name); - balancers_[0]->ads_service()->SetCdsResource(new_cluster2, kNewCluster2Name); + balancers_[0]->ads_service()->SetCdsResource(new_cluster2); // Populating Route Configurations for LDS. RouteConfiguration new_route_config = balancers_[0]->ads_service()->default_route_config(); @@ -2714,20 +2704,18 @@ TEST_P(LdsRdsTest, XdsRoutingPrefixMatching) { {"locality0", GetBackendPorts(3, 4)}, }); balancers_[0]->ads_service()->SetEdsResource( - AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); + AdsServiceImpl::BuildEdsResource(args)); balancers_[0]->ads_service()->SetEdsResource( - AdsServiceImpl::BuildEdsResource(args1, kNewCluster1Name), - kNewCluster1Name); + AdsServiceImpl::BuildEdsResource(args1, kNewCluster1Name)); balancers_[0]->ads_service()->SetEdsResource( - AdsServiceImpl::BuildEdsResource(args2, kNewCluster2Name), - kNewCluster2Name); + AdsServiceImpl::BuildEdsResource(args2, kNewCluster2Name)); // Populate new CDS resources. Cluster new_cluster1 = balancers_[0]->ads_service()->default_cluster(); new_cluster1.set_name(kNewCluster1Name); - balancers_[0]->ads_service()->SetCdsResource(new_cluster1, kNewCluster1Name); + balancers_[0]->ads_service()->SetCdsResource(new_cluster1); Cluster new_cluster2 = balancers_[0]->ads_service()->default_cluster(); new_cluster2.set_name(kNewCluster2Name); - balancers_[0]->ads_service()->SetCdsResource(new_cluster2, kNewCluster2Name); + balancers_[0]->ads_service()->SetCdsResource(new_cluster2); // Populating Route Configurations for LDS. RouteConfiguration new_route_config = balancers_[0]->ads_service()->default_route_config(); @@ -2780,7 +2768,7 @@ TEST_P(CdsTest, Vanilla) { TEST_P(CdsTest, WrongClusterType) { auto cluster = balancers_[0]->ads_service()->default_cluster(); cluster.set_type(envoy::api::v2::Cluster::STATIC); - balancers_[0]->ads_service()->SetCdsResource(cluster, kDefaultResourceName); + balancers_[0]->ads_service()->SetCdsResource(cluster); SetNextResolution({}); SetNextResolutionForLbChannelAllBalancers(); CheckRpcSendFailure(); @@ -2795,7 +2783,7 @@ TEST_P(CdsTest, WrongClusterType) { TEST_P(CdsTest, WrongEdsConfig) { auto cluster = balancers_[0]->ads_service()->default_cluster(); cluster.mutable_eds_cluster_config()->mutable_eds_config()->mutable_self(); - balancers_[0]->ads_service()->SetCdsResource(cluster, kDefaultResourceName); + balancers_[0]->ads_service()->SetCdsResource(cluster); SetNextResolution({}); SetNextResolutionForLbChannelAllBalancers(); CheckRpcSendFailure(); @@ -2810,7 +2798,7 @@ TEST_P(CdsTest, WrongEdsConfig) { TEST_P(CdsTest, WrongLbPolicy) { auto cluster = balancers_[0]->ads_service()->default_cluster(); cluster.set_lb_policy(envoy::api::v2::Cluster::LEAST_REQUEST); - balancers_[0]->ads_service()->SetCdsResource(cluster, kDefaultResourceName); + balancers_[0]->ads_service()->SetCdsResource(cluster); SetNextResolution({}); SetNextResolutionForLbChannelAllBalancers(); CheckRpcSendFailure(); @@ -2825,7 +2813,7 @@ TEST_P(CdsTest, WrongLbPolicy) { TEST_P(CdsTest, WrongLrsServer) { auto cluster = balancers_[0]->ads_service()->default_cluster(); cluster.mutable_lrs_server()->mutable_ads(); - balancers_[0]->ads_service()->SetCdsResource(cluster, kDefaultResourceName); + balancers_[0]->ads_service()->SetCdsResource(cluster); SetNextResolution({}); SetNextResolutionForLbChannelAllBalancers(); CheckRpcSendFailure(); @@ -2863,7 +2851,7 @@ TEST_P(EdsTest, NacksSparsePriorityList) { {"locality0", GetBackendPorts(), kDefaultLocalityWeight, 1}, }); balancers_[0]->ads_service()->SetEdsResource( - AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); + AdsServiceImpl::BuildEdsResource(args)); CheckRpcSendFailure(); const auto& response_state = balancers_[0]->ads_service()->eds_response_state(); @@ -2893,7 +2881,7 @@ TEST_P(LocalityMapTest, WeightedRoundRobin) { {"locality1", GetBackendPorts(1, 2), kLocalityWeight1}, }); balancers_[0]->ads_service()->SetEdsResource( - AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); + AdsServiceImpl::BuildEdsResource(args)); // Wait for both backends to be ready. WaitForAllBackends(0, 2); // Send kNumRpcs RPCs. @@ -2927,7 +2915,7 @@ TEST_P(LocalityMapTest, LocalityContainingNoEndpoints) { {"locality1", {}}, }); balancers_[0]->ads_service()->SetEdsResource( - AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); + AdsServiceImpl::BuildEdsResource(args)); // Wait for both backends to be ready. WaitForAllBackends(); // Send kNumRpcs RPCs. @@ -2949,7 +2937,7 @@ TEST_P(LocalityMapTest, NoLocalities) { SetNextResolutionForLbChannelAllBalancers(); // EDS response contains 2 localities, one with no endpoints. balancers_[0]->ads_service()->SetEdsResource( - AdsServiceImpl::BuildEdsResource({}), kDefaultResourceName); + AdsServiceImpl::BuildEdsResource({})); Status status = SendRpc(); EXPECT_FALSE(status.ok()); EXPECT_EQ(status.error_code(), StatusCode::UNAVAILABLE); @@ -2971,14 +2959,14 @@ TEST_P(LocalityMapTest, StressTest) { args.locality_list.emplace_back(std::move(locality)); } balancers_[0]->ads_service()->SetEdsResource( - AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); + AdsServiceImpl::BuildEdsResource(args)); // The second ADS response contains 1 locality, which contains backend 1. args = AdsServiceImpl::EdsResourceArgs({ {"locality0", GetBackendPorts(1, 2)}, }); - std::thread delayed_resource_setter(std::bind( - &BasicTest::SetEdsResourceWithDelay, this, 0, - AdsServiceImpl::BuildEdsResource(args), 60 * 1000, kDefaultResourceName)); + std::thread delayed_resource_setter( + std::bind(&BasicTest::SetEdsResourceWithDelay, this, 0, + AdsServiceImpl::BuildEdsResource(args), 60 * 1000)); // Wait until backend 0 is ready, before which kNumLocalities localities are // received and handled by the xds policy. WaitForBackend(0, /*reset_counters=*/false); @@ -3019,7 +3007,7 @@ TEST_P(LocalityMapTest, UpdateMap) { {"locality2", GetBackendPorts(2, 3), 4}, }); balancers_[0]->ads_service()->SetEdsResource( - AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); + AdsServiceImpl::BuildEdsResource(args)); // Wait for the first 3 backends to be ready. WaitForAllBackends(0, 3); gpr_log(GPR_INFO, "========= BEFORE FIRST BATCH =========="); @@ -3050,7 +3038,7 @@ TEST_P(LocalityMapTest, UpdateMap) { {"locality3", GetBackendPorts(3, 4), 6}, }); balancers_[0]->ads_service()->SetEdsResource( - AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); + AdsServiceImpl::BuildEdsResource(args)); // Backend 3 hasn't received any request. EXPECT_EQ(0U, backends_[3]->backend_service()->request_count()); // Wait until the locality update has been processed, as signaled by backend 3 @@ -3090,13 +3078,13 @@ TEST_P(LocalityMapTest, ReplaceAllLocalitiesInPriority) { {"locality0", GetBackendPorts(0, 1)}, }); balancers_[0]->ads_service()->SetEdsResource( - AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); + AdsServiceImpl::BuildEdsResource(args)); args = AdsServiceImpl::EdsResourceArgs({ {"locality1", GetBackendPorts(1, 2)}, }); - std::thread delayed_resource_setter(std::bind( - &BasicTest::SetEdsResourceWithDelay, this, 0, - AdsServiceImpl::BuildEdsResource(args), 5000, kDefaultResourceName)); + std::thread delayed_resource_setter( + std::bind(&BasicTest::SetEdsResourceWithDelay, this, 0, + AdsServiceImpl::BuildEdsResource(args), 5000)); // Wait for the first backend to be ready. WaitForBackend(0); // Keep sending RPCs until we switch over to backend 1, which tells us @@ -3125,7 +3113,7 @@ TEST_P(FailoverTest, ChooseHighestPriority) { {"locality3", GetBackendPorts(3, 4), kDefaultLocalityWeight, 0}, }); balancers_[0]->ads_service()->SetEdsResource( - AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); + AdsServiceImpl::BuildEdsResource(args)); WaitForBackend(3, false); for (size_t i = 0; i < 3; ++i) { EXPECT_EQ(0U, backends_[i]->backend_service()->request_count()); @@ -3143,7 +3131,7 @@ TEST_P(FailoverTest, DoesNotUsePriorityWithNoEndpoints) { {"locality3", {}, kDefaultLocalityWeight, 0}, }); balancers_[0]->ads_service()->SetEdsResource( - AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); + AdsServiceImpl::BuildEdsResource(args)); WaitForBackend(0, false); for (size_t i = 1; i < 3; ++i) { EXPECT_EQ(0U, backends_[i]->backend_service()->request_count()); @@ -3159,7 +3147,7 @@ TEST_P(FailoverTest, DoesNotUseLocalityWithNoEndpoints) { {"locality1", GetBackendPorts(), kDefaultLocalityWeight, 0}, }); balancers_[0]->ads_service()->SetEdsResource( - AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); + AdsServiceImpl::BuildEdsResource(args)); // Wait for all backends to be used. std::tuple counts = WaitForAllBackends(); // Make sure no RPCs failed in the transition. @@ -3180,7 +3168,7 @@ TEST_P(FailoverTest, Failover) { ShutdownBackend(3); ShutdownBackend(0); balancers_[0]->ads_service()->SetEdsResource( - AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); + AdsServiceImpl::BuildEdsResource(args)); WaitForBackend(1, false); for (size_t i = 0; i < 4; ++i) { if (i == 1) continue; @@ -3203,7 +3191,7 @@ TEST_P(FailoverTest, SwitchBackToHigherPriority) { ShutdownBackend(3); ShutdownBackend(0); balancers_[0]->ads_service()->SetEdsResource( - AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); + AdsServiceImpl::BuildEdsResource(args)); WaitForBackend(1, false); for (size_t i = 0; i < 4; ++i) { if (i == 1) continue; @@ -3225,7 +3213,7 @@ TEST_P(FailoverTest, UpdateInitialUnavailable) { {"locality1", GetBackendPorts(1, 2), kDefaultLocalityWeight, 1}, }); balancers_[0]->ads_service()->SetEdsResource( - AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); + AdsServiceImpl::BuildEdsResource(args)); args = AdsServiceImpl::EdsResourceArgs({ {"locality0", GetBackendPorts(0, 1), kDefaultLocalityWeight, 0}, {"locality1", GetBackendPorts(1, 2), kDefaultLocalityWeight, 1}, @@ -3234,9 +3222,9 @@ TEST_P(FailoverTest, UpdateInitialUnavailable) { }); ShutdownBackend(0); ShutdownBackend(1); - std::thread delayed_resource_setter(std::bind( - &BasicTest::SetEdsResourceWithDelay, this, 0, - AdsServiceImpl::BuildEdsResource(args), 1000, kDefaultResourceName)); + std::thread delayed_resource_setter( + std::bind(&BasicTest::SetEdsResourceWithDelay, this, 0, + AdsServiceImpl::BuildEdsResource(args), 1000)); gpr_timespec deadline = gpr_time_add(gpr_now(GPR_CLOCK_REALTIME), gpr_time_from_millis(500, GPR_TIMESPAN)); // Send 0.5 second worth of RPCs. @@ -3264,16 +3252,16 @@ TEST_P(FailoverTest, UpdatePriority) { {"locality3", GetBackendPorts(3, 4), kDefaultLocalityWeight, 0}, }); balancers_[0]->ads_service()->SetEdsResource( - AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); + AdsServiceImpl::BuildEdsResource(args)); args = AdsServiceImpl::EdsResourceArgs({ {"locality0", GetBackendPorts(0, 1), kDefaultLocalityWeight, 2}, {"locality1", GetBackendPorts(1, 2), kDefaultLocalityWeight, 0}, {"locality2", GetBackendPorts(2, 3), kDefaultLocalityWeight, 1}, {"locality3", GetBackendPorts(3, 4), kDefaultLocalityWeight, 3}, }); - std::thread delayed_resource_setter(std::bind( - &BasicTest::SetEdsResourceWithDelay, this, 0, - AdsServiceImpl::BuildEdsResource(args), 1000, kDefaultResourceName)); + std::thread delayed_resource_setter( + std::bind(&BasicTest::SetEdsResourceWithDelay, this, 0, + AdsServiceImpl::BuildEdsResource(args), 1000)); WaitForBackend(3, false); for (size_t i = 0; i < 3; ++i) { EXPECT_EQ(0U, backends_[i]->backend_service()->request_count()); @@ -3297,7 +3285,7 @@ TEST_P(FailoverTest, MoveAllLocalitiesInCurrentPriorityToHigherPriority) { {"locality1", GetBackendPorts(1, 3), kDefaultLocalityWeight, 1}, }); balancers_[0]->ads_service()->SetEdsResource( - AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); + AdsServiceImpl::BuildEdsResource(args)); // Second update: // - Priority 0 contains both localities 0 and 1. // - Priority 1 is not present. @@ -3307,9 +3295,9 @@ TEST_P(FailoverTest, MoveAllLocalitiesInCurrentPriorityToHigherPriority) { {"locality0", GetBackendPorts(0, 1), kDefaultLocalityWeight, 0}, {"locality1", GetBackendPorts(1, 4), kDefaultLocalityWeight, 0}, }); - std::thread delayed_resource_setter(std::bind( - &BasicTest::SetEdsResourceWithDelay, this, 0, - AdsServiceImpl::BuildEdsResource(args), 1000, kDefaultResourceName)); + std::thread delayed_resource_setter( + std::bind(&BasicTest::SetEdsResourceWithDelay, this, 0, + AdsServiceImpl::BuildEdsResource(args), 1000)); // When we get the first update, all backends in priority 0 are down, // so we will create priority 1. Backends 1 and 2 should have traffic, // but backend 3 should not. @@ -3343,7 +3331,7 @@ TEST_P(DropTest, Vanilla) { args.drop_categories = {{kLbDropType, kDropPerMillionForLb}, {kThrottleDropType, kDropPerMillionForThrottle}}; balancers_[0]->ads_service()->SetEdsResource( - AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); + AdsServiceImpl::BuildEdsResource(args)); WaitForAllBackends(); // Send kNumRpcs RPCs and count the drops. size_t num_drops = 0; @@ -3383,7 +3371,7 @@ TEST_P(DropTest, DropPerHundred) { args.drop_categories = {{kLbDropType, kDropPerHundredForLb}}; args.drop_denominator = FractionalPercent::HUNDRED; balancers_[0]->ads_service()->SetEdsResource( - AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); + AdsServiceImpl::BuildEdsResource(args)); WaitForAllBackends(); // Send kNumRpcs RPCs and count the drops. size_t num_drops = 0; @@ -3422,7 +3410,7 @@ TEST_P(DropTest, DropPerTenThousand) { args.drop_categories = {{kLbDropType, kDropPerTenThousandForLb}}; args.drop_denominator = FractionalPercent::TEN_THOUSAND; balancers_[0]->ads_service()->SetEdsResource( - AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); + AdsServiceImpl::BuildEdsResource(args)); WaitForAllBackends(); // Send kNumRpcs RPCs and count the drops. size_t num_drops = 0; @@ -3464,7 +3452,7 @@ TEST_P(DropTest, Update) { }); args.drop_categories = {{kLbDropType, kDropPerMillionForLb}}; balancers_[0]->ads_service()->SetEdsResource( - AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); + AdsServiceImpl::BuildEdsResource(args)); WaitForAllBackends(); // Send kNumRpcs RPCs and count the drops. size_t num_drops = 0; @@ -3495,7 +3483,7 @@ TEST_P(DropTest, Update) { args.drop_categories = {{kLbDropType, kDropPerMillionForLb}, {kThrottleDropType, kDropPerMillionForThrottle}}; balancers_[0]->ads_service()->SetEdsResource( - AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); + AdsServiceImpl::BuildEdsResource(args)); // Wait until the drop rate increases to the middle of the two configs, which // implies that the update has been in effect. const double kDropRateThreshold = @@ -3553,7 +3541,7 @@ TEST_P(DropTest, DropAll) { args.drop_categories = {{kLbDropType, kDropPerMillionForLb}, {kThrottleDropType, kDropPerMillionForThrottle}}; balancers_[0]->ads_service()->SetEdsResource( - AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); + AdsServiceImpl::BuildEdsResource(args)); // Send kNumRpcs RPCs and all of them are dropped. for (size_t i = 0; i < kNumRpcs; ++i) { EchoResponse response; @@ -3577,12 +3565,12 @@ TEST_P(BalancerUpdateTest, UpdateBalancersButKeepUsingOriginalBalancer) { {"locality0", {backends_[0]->port()}}, }); balancers_[0]->ads_service()->SetEdsResource( - AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); + AdsServiceImpl::BuildEdsResource(args)); args = AdsServiceImpl::EdsResourceArgs({ {"locality0", {backends_[1]->port()}}, }); balancers_[1]->ads_service()->SetEdsResource( - AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); + AdsServiceImpl::BuildEdsResource(args)); // Wait until the first backend is ready. WaitForBackend(0); // Send 10 requests. @@ -3632,12 +3620,12 @@ TEST_P(BalancerUpdateTest, Repeated) { {"locality0", {backends_[0]->port()}}, }); balancers_[0]->ads_service()->SetEdsResource( - AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); + AdsServiceImpl::BuildEdsResource(args)); args = AdsServiceImpl::EdsResourceArgs({ {"locality0", {backends_[1]->port()}}, }); balancers_[1]->ads_service()->SetEdsResource( - AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); + AdsServiceImpl::BuildEdsResource(args)); // Wait until the first backend is ready. WaitForBackend(0); // Send 10 requests. @@ -3698,12 +3686,12 @@ TEST_P(BalancerUpdateTest, DeadUpdate) { {"locality0", {backends_[0]->port()}}, }); balancers_[0]->ads_service()->SetEdsResource( - AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); + AdsServiceImpl::BuildEdsResource(args)); args = AdsServiceImpl::EdsResourceArgs({ {"locality0", {backends_[1]->port()}}, }); balancers_[1]->ads_service()->SetEdsResource( - AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); + AdsServiceImpl::BuildEdsResource(args)); // Start servers and send 10 RPCs per server. gpr_log(GPR_INFO, "========= BEFORE FIRST BATCH =========="); CheckRpcSendOk(10); @@ -3784,7 +3772,7 @@ TEST_P(ClientLoadReportingTest, Vanilla) { {"locality0", GetBackendPorts()}, }); balancers_[0]->ads_service()->SetEdsResource( - AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); + AdsServiceImpl::BuildEdsResource(args)); // Wait until all backends are ready. int num_ok = 0; int num_failure = 0; @@ -3829,7 +3817,7 @@ TEST_P(ClientLoadReportingTest, HonorsClustersRequestedByLrsServer) { {"locality0", GetBackendPorts()}, }); balancers_[0]->ads_service()->SetEdsResource( - AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); + AdsServiceImpl::BuildEdsResource(args)); // Wait until all backends are ready. int num_ok = 0; int num_failure = 0; @@ -3863,7 +3851,7 @@ TEST_P(ClientLoadReportingTest, BalancerRestart) { {"locality0", GetBackendPorts(0, kNumBackendsFirstPass)}, }); balancers_[0]->ads_service()->SetEdsResource( - AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); + AdsServiceImpl::BuildEdsResource(args)); // Wait until all backends returned by the balancer are ready. int num_ok = 0; int num_failure = 0; @@ -3901,7 +3889,7 @@ TEST_P(ClientLoadReportingTest, BalancerRestart) { {"locality0", GetBackendPorts(kNumBackendsFirstPass)}, }); balancers_[0]->ads_service()->SetEdsResource( - AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); + AdsServiceImpl::BuildEdsResource(args)); // Wait for queries to start going to one of the new backends. // This tells us that we're now using the new serverlist. std::tie(num_ok, num_failure, num_drops) = @@ -3943,7 +3931,7 @@ TEST_P(ClientLoadReportingWithDropTest, Vanilla) { args.drop_categories = {{kLbDropType, kDropPerMillionForLb}, {kThrottleDropType, kDropPerMillionForThrottle}}; balancers_[0]->ads_service()->SetEdsResource( - AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); + AdsServiceImpl::BuildEdsResource(args)); int num_ok = 0; int num_failure = 0; int num_drops = 0; From c85a87981f791e24f514cf59a12762badda4c341 Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Tue, 5 May 2020 01:13:27 -0700 Subject: [PATCH 679/758] Update note on closed feature requests with help wanted label --- CONTRIBUTING.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c524257a5a3..1d074d8dce0 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -7,6 +7,9 @@ and [contribution guidelines](https://github.com/grpc/grpc-community/blob/master If you are new to github, please start by reading [Pull Request howto](https://help.github.com/articles/about-pull-requests/) +If you are looking for features to work on, please filter the issues list with the label ["disposition/help wanted"](https://github.com/grpc/grpc/issues?q=label%3A%22disposition%2Fhelp+wanted%22). +Please note that some of these feature requests might have been closed in the past as a result of them being marked as stale due to there being no activity, but these are still valid feature requests. + ## Legal requirements In order to protect both you and ourselves, you will need to sign the From cae6171860e0ca3471b275e04d99559b4554d04a Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Tue, 5 May 2020 01:29:39 -0700 Subject: [PATCH 680/758] Add a separate template for questions --- .github/ISSUE_TEMPLATE/bug_report.md | 7 +++++-- .github/ISSUE_TEMPLATE/cleanup_request.md | 8 +++++--- .github/ISSUE_TEMPLATE/feature_request.md | 8 +++++--- .github/ISSUE_TEMPLATE/question.md | 18 ++++++++++++++++++ 4 files changed, 33 insertions(+), 8 deletions(-) create mode 100644 .github/ISSUE_TEMPLATE/question.md diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 74060283ce2..da76ad4263f 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -7,10 +7,13 @@ assignees: veblush --- diff --git a/.github/ISSUE_TEMPLATE/cleanup_request.md b/.github/ISSUE_TEMPLATE/cleanup_request.md index 6e5c5aec48a..e0d45c214c9 100644 --- a/.github/ISSUE_TEMPLATE/cleanup_request.md +++ b/.github/ISSUE_TEMPLATE/cleanup_request.md @@ -7,11 +7,13 @@ assignees: veblush --- diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index ba5d92da901..b34ed32325b 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -7,11 +7,13 @@ assignees: veblush --- diff --git a/.github/ISSUE_TEMPLATE/question.md b/.github/ISSUE_TEMPLATE/question.md new file mode 100644 index 00000000000..b177589999a --- /dev/null +++ b/.github/ISSUE_TEMPLATE/question.md @@ -0,0 +1,18 @@ +--- +name: Ask a question +about: Ask a question +labels: kind/question, priority/P3 +assignees: veblush + +--- + +PLEASE DO NOT POST A QUESTION HERE. +This form is for bug reports and feature requests ONLY! + +For general questions and troubleshooting, please ask/look for answers at +- StackOverflow, with "grpc" tag: https://stackoverflow.com/questions/tagged/grpc +For questions that specifically need to be answered by gRPC team members, please ask/look for answers at +- grpc.io mailing list: https://groups.google.com/forum/#!forum/grpc-io + +This issue will be closed down once seen by the repo managers. + From abf8200f37e93bdef740a57c5d6fb27de9d0648d Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Tue, 5 May 2020 01:31:03 -0700 Subject: [PATCH 681/758] Merge master --- .github/ISSUE_TEMPLATE/question.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/question.md b/.github/ISSUE_TEMPLATE/question.md index b177589999a..8ba07914f73 100644 --- a/.github/ISSUE_TEMPLATE/question.md +++ b/.github/ISSUE_TEMPLATE/question.md @@ -2,7 +2,7 @@ name: Ask a question about: Ask a question labels: kind/question, priority/P3 -assignees: veblush +assignees: markdroth --- From cf9ee7f246cc0aecf87eb2805b31647ebf876bce Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Tue, 5 May 2020 01:43:10 -0700 Subject: [PATCH 682/758] Update stale bot to 30 days --- .github/stale.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/stale.yml b/.github/stale.yml index 12203930bc9..04f9d541a0c 100644 --- a/.github/stale.yml +++ b/.github/stale.yml @@ -1,7 +1,7 @@ # Configuration for probot-stale - https://github.com/probot/stale # Number of days of inactivity before an Issue or Pull Request becomes stale -daysUntilStale: 180 +daysUntilStale: 30 # Number of days of inactivity before an Issue or Pull Request with the stale label is closed. # Set to false to disable. If disabled, issues still need to be closed manually, but will remain marked as stale. @@ -29,8 +29,8 @@ staleLabel: "disposition/stale" # Comment to post when marking as stale. Set to `false` to disable markComment: > This issue/PR has been automatically marked as stale because it has not had any update (including - commits, comments, labels, milestones, etc) for 180 days. It will be closed automatically if no - further update occurs in 1 day. Thank you for your contributions! + commits, comments, labels, milestones, etc) for 30 days. It will be closed automatically if no + further update occurs in 7 day. Thank you for your contributions! # Comment to post when removing the stale label. # unmarkComment: > @@ -56,4 +56,4 @@ limitPerRun: 30 # issues: # exemptLabels: -# - confirmed \ No newline at end of file +# - confirmed From 65fdff36832e2fb5454ecbfe7341ba3a267ad8ab Mon Sep 17 00:00:00 2001 From: Alexander Polcyn Date: Tue, 5 May 2020 02:04:10 -0700 Subject: [PATCH 683/758] Include the destination address in synchronous TCP connect errors --- src/core/lib/iomgr/tcp_client_posix.cc | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/core/lib/iomgr/tcp_client_posix.cc b/src/core/lib/iomgr/tcp_client_posix.cc index 928c70d8a98..4abf33bc223 100644 --- a/src/core/lib/iomgr/tcp_client_posix.cc +++ b/src/core/lib/iomgr/tcp_client_posix.cc @@ -302,9 +302,13 @@ void grpc_tcp_client_create_from_prepared_fd( return; } if (errno != EWOULDBLOCK && errno != EINPROGRESS) { + grpc_error* error = GRPC_OS_ERROR(errno, "connect"); + char* addr_str = grpc_sockaddr_to_uri(addr); + error = grpc_error_set_str(error, GRPC_ERROR_STR_TARGET_ADDRESS, + grpc_slice_from_copied_string(addr_str)); + gpr_free(addr_str); grpc_fd_orphan(fdobj, nullptr, nullptr, "tcp_client_connect_error"); - grpc_core::ExecCtx::Run(DEBUG_LOCATION, closure, - GRPC_OS_ERROR(errno, "connect")); + grpc_core::ExecCtx::Run(DEBUG_LOCATION, closure, error); return; } From e2a41a100105d574041a763a09e187a884b8a8b6 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Tue, 5 May 2020 09:54:23 -0700 Subject: [PATCH 684/758] Restore for 2.7 --- src/python/grpcio_tests/tests/unit/_metadata_flags_test.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/python/grpcio_tests/tests/unit/_metadata_flags_test.py b/src/python/grpcio_tests/tests/unit/_metadata_flags_test.py index 32bc6d48b1e..f47ee77c012 100644 --- a/src/python/grpcio_tests/tests/unit/_metadata_flags_test.py +++ b/src/python/grpcio_tests/tests/unit/_metadata_flags_test.py @@ -232,8 +232,8 @@ class MetadataFlagsTest(unittest.TestCase): test_threads = [] for perform_call in _ALL_CALL_CASES: test_thread = threading.Thread(target=test_call, - args=(perform_call,), - daemon=True) + args=(perform_call,)) + test_thread.daemon = True test_thread.exception = None test_thread.start() test_threads.append(test_thread) From 9f9236565758d56f0e4c653f62bb1edd7bb049af Mon Sep 17 00:00:00 2001 From: ZhenLian Date: Mon, 4 May 2020 22:43:48 -0700 Subject: [PATCH 685/758] Expose Peer SPIFFE Identity --- include/grpc/grpc_security_constants.h | 1 + .../security/security_connector/ssl_utils.cc | 38 +++++++ .../security/security_connector/ssl_utils.h | 1 + src/core/tsi/ssl_transport_security.cc | 12 ++- src/core/tsi/ssl_transport_security.h | 3 +- test/core/security/security_connector_test.cc | 101 +++++++++++++++++- 6 files changed, 149 insertions(+), 7 deletions(-) diff --git a/include/grpc/grpc_security_constants.h b/include/grpc/grpc_security_constants.h index 053b2daa63c..e50829409b3 100644 --- a/include/grpc/grpc_security_constants.h +++ b/include/grpc/grpc_security_constants.h @@ -32,6 +32,7 @@ extern "C" { #define GRPC_X509_PEM_CERT_CHAIN_PROPERTY_NAME "x509_pem_cert_chain" #define GRPC_SSL_SESSION_REUSED_PROPERTY "ssl_session_reused" #define GRPC_TRANSPORT_SECURITY_LEVEL_PROPERTY_NAME "security_level" +#define GRPC_PEER_SPIFFE_ID_PROPERTY_NAME "peer_spiffe_id" /** Environment variable that points to the default SSL roots file. This file must be a PEM encoded file with all the roots such as the one that can be diff --git a/src/core/lib/security/security_connector/ssl_utils.cc b/src/core/lib/security/security_connector/ssl_utils.cc index 4f043c35c07..b876d734fbf 100644 --- a/src/core/lib/security/security_connector/ssl_utils.cc +++ b/src/core/lib/security/security_connector/ssl_utils.cc @@ -25,6 +25,8 @@ #include #include +#include + #include "src/core/ext/transport/chttp2/alpn/alpn.h" #include "src/core/lib/channel/channel_args.h" #include "src/core/lib/gpr/string.h" @@ -220,6 +222,27 @@ int grpc_ssl_cmp_target_name(absl::string_view target_name, return overridden_target_name.compare(other_overridden_target_name); } +bool isSpiffeID(absl::string_view spiffe_uri) { + if (spiffe_uri.size() > 2048) { + gpr_log(GPR_INFO, "Invalid SPIFFE ID: ID longer than 2048 bytes."); + return false; + } + std::vector splits = absl::StrSplit(spiffe_uri, '/'); + if (splits.size() < 4 || splits[0] != "spiffe:" || splits[1] != "") { + gpr_log(GPR_INFO, "Invalid SPIFFE ID: invalid format."); + return false; + } + if (splits[3] == "") { + gpr_log(GPR_INFO, "Invalid SPIFFE ID: workload id is empty."); + return false; + } + if (splits[2].size() > 255) { + gpr_log(GPR_INFO, "Invalid SPIFFE ID: domain longer than 255 characters."); + return false; + } + return true; +} + grpc_core::RefCountedPtr grpc_ssl_peer_to_auth_context( const tsi_peer* peer, const char* transport_security_type) { size_t i; @@ -232,6 +255,9 @@ grpc_core::RefCountedPtr grpc_ssl_peer_to_auth_context( grpc_auth_context_add_cstring_property( ctx.get(), GRPC_TRANSPORT_SECURITY_TYPE_PROPERTY_NAME, transport_security_type); + const char* spiffe_data = nullptr; + size_t spiffe_length; + int spiffe_id_count = 0; for (i = 0; i < peer->property_count; i++) { const tsi_peer_property* prop = &peer->properties[i]; if (prop->name == nullptr) continue; @@ -263,12 +289,24 @@ grpc_core::RefCountedPtr grpc_ssl_peer_to_auth_context( grpc_auth_context_add_property( ctx.get(), GRPC_TRANSPORT_SECURITY_LEVEL_PROPERTY_NAME, prop->value.data, prop->value.length); + } else if (strcmp(prop->name, TSI_X509_URI_PEER_PROPERTY) == 0) { + absl::string_view spiffe_id(prop->value.data, prop->value.length); + if (isSpiffeID(spiffe_id)) { + spiffe_data = prop->value.data; + spiffe_length = prop->value.length; + spiffe_id_count += 1; + } } } if (peer_identity_property_name != nullptr) { GPR_ASSERT(grpc_auth_context_set_peer_identity_property_name( ctx.get(), peer_identity_property_name) == 1); } + // SPIFFE ID should be unique. + if (spiffe_id_count == 1 && spiffe_length > 0 && spiffe_data != nullptr) { + grpc_auth_context_add_property(ctx.get(), GRPC_PEER_SPIFFE_ID_PROPERTY_NAME, + spiffe_data, spiffe_length); + } return ctx; } diff --git a/src/core/lib/security/security_connector/ssl_utils.h b/src/core/lib/security/security_connector/ssl_utils.h index abbb4e953bf..b7522e8ab7c 100644 --- a/src/core/lib/security/security_connector/ssl_utils.h +++ b/src/core/lib/security/security_connector/ssl_utils.h @@ -23,6 +23,7 @@ #include +#include "absl/strings/str_split.h" #include "absl/strings/string_view.h" #include diff --git a/src/core/tsi/ssl_transport_security.cc b/src/core/tsi/ssl_transport_security.cc index 138fe36a8d6..820a6537971 100644 --- a/src/core/tsi/ssl_transport_security.cc +++ b/src/core/tsi/ssl_transport_security.cc @@ -33,9 +33,6 @@ #include #endif -#include "absl/strings/match.h" -#include "absl/strings/string_view.h" - #include #include #include @@ -43,6 +40,9 @@ #include #include +#include "absl/strings/match.h" +#include "absl/strings/string_view.h" + extern "C" { #include #include /* For OPENSSL_free */ @@ -378,6 +378,12 @@ static tsi_result add_subject_alt_names_properties_to_peer( TSI_X509_SUBJECT_ALTERNATIVE_NAME_PEER_PROPERTY, reinterpret_cast(name), static_cast(name_size), &peer->properties[peer->property_count++]); + if (subject_alt_name->type == GEN_URI) { + result = tsi_construct_string_peer_property( + TSI_X509_URI_PEER_PROPERTY, reinterpret_cast(name), + static_cast(name_size), + &peer->properties[peer->property_count++]); + } OPENSSL_free(name); } else if (subject_alt_name->type == GEN_IPADD) { char ntop_buf[INET6_ADDRSTRLEN]; diff --git a/src/core/tsi/ssl_transport_security.h b/src/core/tsi/ssl_transport_security.h index 4c3b9b68b38..af2de0a7364 100644 --- a/src/core/tsi/ssl_transport_security.h +++ b/src/core/tsi/ssl_transport_security.h @@ -22,7 +22,6 @@ #include #include "absl/strings/string_view.h" - #include "src/core/tsi/transport_security_interface.h" extern "C" { @@ -44,6 +43,8 @@ extern "C" { #define TSI_SSL_ALPN_SELECTED_PROTOCOL "ssl_alpn_selected_protocol" +#define TSI_X509_URI_PEER_PROPERTY "x509_uri" + /* --- tsi_ssl_root_certs_store object --- This object stores SSL root certificates. It can be shared by multiple SSL diff --git a/test/core/security/security_connector_test.cc b/test/core/security/security_connector_test.cc index 971317842dc..76d0ba32115 100644 --- a/test/core/security/security_connector_test.cc +++ b/test/core/security/security_connector_test.cc @@ -16,19 +16,19 @@ * */ -#include -#include +#include "src/core/lib/security/security_connector/security_connector.h" #include #include #include #include +#include +#include #include "src/core/lib/gpr/string.h" #include "src/core/lib/gpr/tmpfile.h" #include "src/core/lib/gprpp/ref_counted_ptr.h" #include "src/core/lib/security/context/security_context.h" -#include "src/core/lib/security/security_connector/security_connector.h" #include "src/core/lib/security/security_connector/ssl_utils.h" #include "src/core/lib/slice/slice_string_helpers.h" #include "src/core/tsi/ssl_transport_security.h" @@ -222,6 +222,35 @@ static int check_x509_pem_cert_chain(const grpc_auth_context* ctx, return 1; } +static int check_spiffe_id(const grpc_auth_context* ctx, + const char* expected_spiffe_id, + bool expect_spiffe_id) { + grpc_auth_property_iterator it = grpc_auth_context_find_properties_by_name( + ctx, GRPC_PEER_SPIFFE_ID_PROPERTY_NAME); + const grpc_auth_property* prop = grpc_auth_property_iterator_next(&it); + if (prop == nullptr && !expect_spiffe_id) { + return 1; + } + if (prop != nullptr && !expect_spiffe_id) { + gpr_log(GPR_ERROR, "SPIFFE ID not expected, but got %s.", prop->value); + return 0; + } + if (prop == nullptr && expect_spiffe_id) { + gpr_log(GPR_ERROR, "SPIFFE ID expected, but got nullptr."); + return 0; + } + if (strncmp(prop->value, expected_spiffe_id, prop->value_length) != 0) { + gpr_log(GPR_ERROR, "Expected SPIFFE ID %s but got %s.", expected_spiffe_id, + prop->value); + return 0; + } + if (grpc_auth_property_iterator_next(&it) != nullptr) { + gpr_log(GPR_ERROR, "Expected only one property for SPIFFE ID."); + return 0; + } + return 1; +} + static void test_cn_only_ssl_peer_to_auth_context(void) { tsi_peer peer; tsi_peer rpeer; @@ -415,6 +444,71 @@ static void test_cn_and_multiple_sans_and_others_ssl_peer_to_auth_context( ctx.reset(DEBUG_LOCATION, "test"); } +static void test_spiffe_id_peer_to_auth_context(void) { + // Invalid SPIFFE IDs should not be plumbed. + std::string long_id(2050, 'x'); + std::string long_domain(256, 'x'); + tsi_peer invalid_peer; + std::vector invalid_spiffe_id = { + "", + "spi://", + "sfiffe://domain/wl", + "spiffe://domain", + "spiffe://domain/", + long_id, + "spiffe://" + long_domain + "/wl"}; + size_t i; + GPR_ASSERT(tsi_construct_peer(invalid_spiffe_id.size(), &invalid_peer) == + TSI_OK); + for (i = 0; i < invalid_spiffe_id.size(); i++) { + GPR_ASSERT(tsi_construct_string_peer_property_from_cstring( + TSI_X509_URI_PEER_PROPERTY, invalid_spiffe_id[i].c_str(), + &invalid_peer.properties[i]) == TSI_OK); + } + grpc_core::RefCountedPtr invalid_ctx = + grpc_ssl_peer_to_auth_context(&invalid_peer, + GRPC_SSL_TRANSPORT_SECURITY_TYPE); + GPR_ASSERT(invalid_ctx != nullptr); + GPR_ASSERT(check_spiffe_id(invalid_ctx.get(), "", false)); + tsi_peer_destruct(&invalid_peer); + invalid_ctx.reset(DEBUG_LOCATION, "test"); + // A valid SPIFFE ID with other URI fields should be plumbed. + tsi_peer valid_peer; + std::vector valid_spiffe_id = {"spiffe://foo.bar.com/wl", + "https://xyz"}; + GPR_ASSERT(tsi_construct_peer(valid_spiffe_id.size(), &valid_peer) == TSI_OK); + for (i = 0; i < valid_spiffe_id.size(); i++) { + GPR_ASSERT(tsi_construct_string_peer_property_from_cstring( + TSI_X509_URI_PEER_PROPERTY, valid_spiffe_id[i].c_str(), + &valid_peer.properties[i]) == TSI_OK); + } + grpc_core::RefCountedPtr valid_ctx = + grpc_ssl_peer_to_auth_context(&valid_peer, + GRPC_SSL_TRANSPORT_SECURITY_TYPE); + GPR_ASSERT(valid_ctx != nullptr); + GPR_ASSERT(check_spiffe_id(valid_ctx.get(), "spiffe://foo.bar.com/wl", true)); + tsi_peer_destruct(&valid_peer); + valid_ctx.reset(DEBUG_LOCATION, "test"); + // Multiple SPIFFE IDs should not be plumbed. + tsi_peer multiple_peer; + std::vector multiple_spiffe_id = { + "spiffe://foo.bar.com/wl", "https://xyz", "spiffe://foo.bar.com/wl2"}; + GPR_ASSERT(tsi_construct_peer(multiple_spiffe_id.size(), &multiple_peer) == + TSI_OK); + for (i = 0; i < multiple_spiffe_id.size(); i++) { + GPR_ASSERT(tsi_construct_string_peer_property_from_cstring( + TSI_X509_URI_PEER_PROPERTY, multiple_spiffe_id[i].c_str(), + &multiple_peer.properties[i]) == TSI_OK); + } + grpc_core::RefCountedPtr multiple_ctx = + grpc_ssl_peer_to_auth_context(&multiple_peer, + GRPC_SSL_TRANSPORT_SECURITY_TYPE); + GPR_ASSERT(multiple_ctx != nullptr); + GPR_ASSERT(check_spiffe_id(multiple_ctx.get(), "", false)); + tsi_peer_destruct(&multiple_peer); + multiple_ctx.reset(DEBUG_LOCATION, "test"); +} + static const char* roots_for_override_api = "roots for override api"; static grpc_ssl_roots_override_result override_roots_success( @@ -562,6 +656,7 @@ int main(int argc, char** argv) { test_cn_and_one_san_ssl_peer_to_auth_context(); test_cn_and_multiple_sans_ssl_peer_to_auth_context(); test_cn_and_multiple_sans_and_others_ssl_peer_to_auth_context(); + test_spiffe_id_peer_to_auth_context(); test_ipv6_address_san(); test_default_ssl_roots(); test_peer_alpn_check(); From 86ce622ed0cfdc091cd371e2714560f01a827e05 Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Tue, 5 May 2020 11:50:26 -0700 Subject: [PATCH 686/758] reviewer comments --- .github/ISSUE_TEMPLATE/bug_report.md | 7 +++---- .github/ISSUE_TEMPLATE/cleanup_request.md | 7 +++---- .github/ISSUE_TEMPLATE/feature_request.md | 7 +++---- .github/ISSUE_TEMPLATE/question.md | 7 +++---- 4 files changed, 12 insertions(+), 16 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index a66d93ef80c..663fcbde3fb 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -10,10 +10,9 @@ assignees: markdroth PLEASE DO NOT POST A QUESTION HERE. This form is for bug reports and feature requests ONLY! -For general questions and troubleshooting, please ask/look for answers at -- StackOverflow, with "grpc" tag: https://stackoverflow.com/questions/tagged/grpc -For questions that specifically need to be answered by gRPC team members, please ask/look for answers at -- grpc.io mailing list: https://groups.google.com/forum/#!forum/grpc-io +For general questions and troubleshooting, please ask/look for answers at StackOverflow, with "grpc" tag: https://stackoverflow.com/questions/tagged/grpc + +For questions that specifically need to be answered by gRPC team members, please ask/look for answers at grpc.io mailing list: https://groups.google.com/forum/#!forum/grpc-io Issues specific to *grpc-java*, *grpc-go*, *grpc-node*, *grpc-dart*, *grpc-web* should be created in the repository they belong to (e.g. https://github.com/grpc/grpc-LANGUAGE/issues/new) --> diff --git a/.github/ISSUE_TEMPLATE/cleanup_request.md b/.github/ISSUE_TEMPLATE/cleanup_request.md index ebcb4a4404d..cd547e286c1 100644 --- a/.github/ISSUE_TEMPLATE/cleanup_request.md +++ b/.github/ISSUE_TEMPLATE/cleanup_request.md @@ -10,10 +10,9 @@ assignees: markdroth PLEASE DO NOT POST A QUESTION HERE. This form is for bug reports and feature requests ONLY! -For general questions and troubleshooting, please ask/look for answers at -- StackOverflow, with "grpc" tag: https://stackoverflow.com/questions/tagged/grpc -For questions that specifically need to be answered by gRPC team members, please ask/look for answers at -- grpc.io mailing list: https://groups.google.com/forum/#!forum/grpc-io +For general questions and troubleshooting, please ask/look for answers at StackOverflow, with "grpc" tag: https://stackoverflow.com/questions/tagged/grpc + +For questions that specifically need to be answered by gRPC team members, please ask/look for answers at grpc.io mailing list: https://groups.google.com/forum/#!forum/grpc-io Issues specific to *grpc-java*, *grpc-go*, *grpc-node*, *grpc-dart*, *grpc-web* should be created in the repository they belong to (e.g. https://github.com/grpc/grpc-LANGUAGE/issues/new) --> diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index c94a69002ed..717752f9207 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -10,10 +10,9 @@ assignees: markdroth PLEASE DO NOT POST A QUESTION HERE. This form is for bug reports and feature requests ONLY! -For general questions and troubleshooting, please ask/look for answers at -- StackOverflow, with "grpc" tag: https://stackoverflow.com/questions/tagged/grpc -For questions that specifically need to be answered by gRPC team members, please ask/look for answers at -- grpc.io mailing list: https://groups.google.com/forum/#!forum/grpc-io +For general questions and troubleshooting, please ask/look for answers at StackOverflow, with "grpc" tag: https://stackoverflow.com/questions/tagged/grpc + +For questions that specifically need to be answered by gRPC team members, please ask/look for answers at grpc.io mailing list: https://groups.google.com/forum/#!forum/grpc-io Issues specific to *grpc-java*, *grpc-go*, *grpc-node*, *grpc-dart*, *grpc-web* should be created in the repository they belong to (e.g. https://github.com/grpc/grpc-LANGUAGE/issues/new) --> diff --git a/.github/ISSUE_TEMPLATE/question.md b/.github/ISSUE_TEMPLATE/question.md index 8ba07914f73..5dc067381f9 100644 --- a/.github/ISSUE_TEMPLATE/question.md +++ b/.github/ISSUE_TEMPLATE/question.md @@ -9,10 +9,9 @@ assignees: markdroth PLEASE DO NOT POST A QUESTION HERE. This form is for bug reports and feature requests ONLY! -For general questions and troubleshooting, please ask/look for answers at -- StackOverflow, with "grpc" tag: https://stackoverflow.com/questions/tagged/grpc -For questions that specifically need to be answered by gRPC team members, please ask/look for answers at -- grpc.io mailing list: https://groups.google.com/forum/#!forum/grpc-io +For general questions and troubleshooting, please ask/look for answers at StackOverflow, with "grpc" tag: https://stackoverflow.com/questions/tagged/grpc + +For questions that specifically need to be answered by gRPC team members, please ask/look for answers at grpc.io mailing list: https://groups.google.com/forum/#!forum/grpc-io This issue will be closed down once seen by the repo managers. From da428e90203d9e58f260833c6b725d3ba6463df4 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Tue, 5 May 2020 13:28:59 -0700 Subject: [PATCH 687/758] Pull out _LARGE_UNASSIGNED_ID --- .../channelz/channelz_servicer_test.py | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/python/grpcio_tests/tests_aio/channelz/channelz_servicer_test.py b/src/python/grpcio_tests/tests_aio/channelz/channelz_servicer_test.py index 5afed60ddd4..e5f09a5fd3f 100644 --- a/src/python/grpcio_tests/tests_aio/channelz/channelz_servicer_test.py +++ b/src/python/grpcio_tests/tests_aio/channelz/channelz_servicer_test.py @@ -27,8 +27,6 @@ from grpc_channelz.v1 import channelz_pb2_grpc from tests.unit.framework.common import test_constants from tests_aio.unit._test_base import AioTestBase -aio.shutdown_grpc_aio() - _SUCCESSFUL_UNARY_UNARY = '/test/SuccessfulUnaryUnary' _FAILED_UNARY_UNARY = '/test/FailedUnaryUnary' _SUCCESSFUL_STREAM_STREAM = '/test/SuccessfulStreamStream' @@ -40,6 +38,8 @@ _DISABLE_REUSE_PORT = (('grpc.so_reuseport', 0),) _ENABLE_CHANNELZ = (('grpc.enable_channelz', 1),) _DISABLE_CHANNELZ = (('grpc.enable_channelz', 0),) +_LARGE_UNASSIGNED_ID = 10000 + async def _successful_unary_unary(request, servicer_context): return _RESPONSE @@ -167,7 +167,8 @@ class ChannelzServicerTest(AioTestBase): async def test_get_top_channels_high_start_id(self): await _generate_channel_server_pairs(1) resp = await self._channelz_stub.GetTopChannels( - channelz_pb2.GetTopChannelsRequest(start_channel_id=10000)) + channelz_pb2.GetTopChannelsRequest( + start_channel_id=_LARGE_UNASSIGNED_ID)) self.assertEqual(len(resp.channel), 0) self.assertEqual(resp.end, True) @@ -286,28 +287,29 @@ class ChannelzServicerTest(AioTestBase): async def test_invalid_query_get_server(self): with self.assertRaises(aio.AioRpcError) as exception_context: await self._channelz_stub.GetServer( - channelz_pb2.GetServerRequest(server_id=10000)) + channelz_pb2.GetServerRequest(server_id=_LARGE_UNASSIGNED_ID)) self.assertEqual(grpc.StatusCode.NOT_FOUND, exception_context.exception.code()) async def test_invalid_query_get_channel(self): with self.assertRaises(aio.AioRpcError) as exception_context: await self._channelz_stub.GetChannel( - channelz_pb2.GetChannelRequest(channel_id=10000)) + channelz_pb2.GetChannelRequest(channel_id=_LARGE_UNASSIGNED_ID)) self.assertEqual(grpc.StatusCode.NOT_FOUND, exception_context.exception.code()) async def test_invalid_query_get_subchannel(self): with self.assertRaises(aio.AioRpcError) as exception_context: await self._channelz_stub.GetSubchannel( - channelz_pb2.GetSubchannelRequest(subchannel_id=10000)) + channelz_pb2.GetSubchannelRequest( + subchannel_id=_LARGE_UNASSIGNED_ID)) self.assertEqual(grpc.StatusCode.NOT_FOUND, exception_context.exception.code()) async def test_invalid_query_get_socket(self): with self.assertRaises(aio.AioRpcError) as exception_context: await self._channelz_stub.GetSocket( - channelz_pb2.GetSocketRequest(socket_id=10000)) + channelz_pb2.GetSocketRequest(socket_id=_LARGE_UNASSIGNED_ID)) self.assertEqual(grpc.StatusCode.NOT_FOUND, exception_context.exception.code()) @@ -315,7 +317,7 @@ class ChannelzServicerTest(AioTestBase): with self.assertRaises(aio.AioRpcError) as exception_context: await self._channelz_stub.GetServerSockets( channelz_pb2.GetServerSocketsRequest( - server_id=10000, + server_id=_LARGE_UNASSIGNED_ID, start_socket_id=0, )) self.assertEqual(grpc.StatusCode.NOT_FOUND, From a8c268500d2e54bd53e85c4d49c1291116120da5 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Tue, 5 May 2020 13:29:47 -0700 Subject: [PATCH 688/758] Revert "Further simplifify the test" This reverts commit aaa0f328c91cc4c1b8fa5601e4fbf54c173769ed. --- .../channelz/channelz_servicer_test.py | 119 ++++++++++++++++++ 1 file changed, 119 insertions(+) diff --git a/src/python/grpcio_tests/tests_aio/channelz/channelz_servicer_test.py b/src/python/grpcio_tests/tests_aio/channelz/channelz_servicer_test.py index e5f09a5fd3f..8504f05c3d0 100644 --- a/src/python/grpcio_tests/tests_aio/channelz/channelz_servicer_test.py +++ b/src/python/grpcio_tests/tests_aio/channelz/channelz_servicer_test.py @@ -207,6 +207,84 @@ class ChannelzServicerTest(AioTestBase): self.assertEqual(resp.channel.data.calls_succeeded, k_success) self.assertEqual(resp.channel.data.calls_failed, k_failed) + async def test_many_requests_many_channel(self): + k_channels = 4 + idx = await _generate_channel_server_pairs(k_channels) + k_success = 11 + k_failed = 13 + for i in range(k_success): + await self._send_successful_unary_unary(idx[0]) + await self._send_successful_unary_unary(idx[2]) + for i in range(k_failed): + await self._send_failed_unary_unary(idx[1]) + await self._send_failed_unary_unary(idx[2]) + + # The first channel saw only successes + resp = await self._channelz_stub.GetChannel( + channelz_pb2.GetChannelRequest( + channel_id=await self._get_channel_id(idx[0]))) + self.assertEqual(resp.channel.data.calls_started, k_success) + self.assertEqual(resp.channel.data.calls_succeeded, k_success) + self.assertEqual(resp.channel.data.calls_failed, 0) + + # The second channel saw only failures + resp = await self._channelz_stub.GetChannel( + channelz_pb2.GetChannelRequest( + channel_id=await self._get_channel_id(idx[1]))) + self.assertEqual(resp.channel.data.calls_started, k_failed) + self.assertEqual(resp.channel.data.calls_succeeded, 0) + self.assertEqual(resp.channel.data.calls_failed, k_failed) + + # The third channel saw both successes and failures + resp = await self._channelz_stub.GetChannel( + channelz_pb2.GetChannelRequest( + channel_id=await self._get_channel_id(idx[2]))) + self.assertEqual(resp.channel.data.calls_started, k_success + k_failed) + self.assertEqual(resp.channel.data.calls_succeeded, k_success) + self.assertEqual(resp.channel.data.calls_failed, k_failed) + + # The fourth channel saw nothing + resp = await self._channelz_stub.GetChannel( + channelz_pb2.GetChannelRequest( + channel_id=await self._get_channel_id(idx[3]))) + self.assertEqual(resp.channel.data.calls_started, 0) + self.assertEqual(resp.channel.data.calls_succeeded, 0) + self.assertEqual(resp.channel.data.calls_failed, 0) + + async def test_many_subchannels(self): + k_channels = 4 + idx = await _generate_channel_server_pairs(k_channels) + k_success = 17 + k_failed = 19 + for i in range(k_success): + await self._send_successful_unary_unary(idx[0]) + await self._send_successful_unary_unary(idx[2]) + for i in range(k_failed): + await self._send_failed_unary_unary(idx[1]) + await self._send_failed_unary_unary(idx[2]) + + for i in range(k_channels): + gc_resp = await self._channelz_stub.GetChannel( + channelz_pb2.GetChannelRequest( + channel_id=await self._get_channel_id(idx[i]))) + # If no call performed in the channel, there shouldn't be any subchannel + if gc_resp.channel.data.calls_started == 0: + self.assertEqual(len(gc_resp.channel.subchannel_ref), 0) + continue + + # Otherwise, the subchannel should exist + self.assertGreater(len(gc_resp.channel.subchannel_ref), 0) + gsc_resp = await self._channelz_stub.GetSubchannel( + channelz_pb2.GetSubchannelRequest( + subchannel_id=gc_resp.channel.subchannel_ref[0]. + subchannel_id)) + self.assertEqual(gc_resp.channel.data.calls_started, + gsc_resp.subchannel.data.calls_started) + self.assertEqual(gc_resp.channel.data.calls_succeeded, + gsc_resp.subchannel.data.calls_succeeded) + self.assertEqual(gc_resp.channel.data.calls_failed, + gsc_resp.subchannel.data.calls_failed) + async def test_server_call(self): idx = await _generate_channel_server_pairs(1) k_success = 23 @@ -221,6 +299,47 @@ class ChannelzServicerTest(AioTestBase): self.assertEqual(resp.data.calls_succeeded, k_success) self.assertEqual(resp.data.calls_failed, k_failed) + async def test_many_subchannels_and_sockets(self): + k_channels = 4 + idx = await _generate_channel_server_pairs(k_channels) + k_success = 3 + k_failed = 5 + for i in range(k_success): + await self._send_successful_unary_unary(idx[0]) + await self._send_successful_unary_unary(idx[2]) + for i in range(k_failed): + await self._send_failed_unary_unary(idx[1]) + await self._send_failed_unary_unary(idx[2]) + + for i in range(k_channels): + gc_resp = await self._channelz_stub.GetChannel( + channelz_pb2.GetChannelRequest( + channel_id=await self._get_channel_id(idx[i]))) + + # If no call performed in the channel, there shouldn't be any subchannel + if gc_resp.channel.data.calls_started == 0: + self.assertEqual(len(gc_resp.channel.subchannel_ref), 0) + continue + + # Otherwise, the subchannel should exist + self.assertGreater(len(gc_resp.channel.subchannel_ref), 0) + gsc_resp = await self._channelz_stub.GetSubchannel( + channelz_pb2.GetSubchannelRequest( + subchannel_id=gc_resp.channel.subchannel_ref[0]. + subchannel_id)) + self.assertEqual(len(gsc_resp.subchannel.socket_ref), 1) + + gs_resp = await self._channelz_stub.GetSocket( + channelz_pb2.GetSocketRequest( + socket_id=gsc_resp.subchannel.socket_ref[0].socket_id)) + self.assertEqual(gsc_resp.subchannel.data.calls_started, + gs_resp.socket.data.streams_started) + self.assertEqual(gsc_resp.subchannel.data.calls_started, + gs_resp.socket.data.streams_succeeded) + # Calls started == messages sent, only valid for unary calls + self.assertEqual(gsc_resp.subchannel.data.calls_started, + gs_resp.socket.data.messages_sent) + async def test_streaming_rpc(self): idx = await _generate_channel_server_pairs(1) # In C++, the argument for _send_successful_stream_stream is message length. From 76b79d0ef663e3a312d5cd32697f6e896051acdc Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Tue, 5 May 2020 14:36:53 -0700 Subject: [PATCH 689/758] Refactor the test case --- .../channelz/channelz_servicer_test.py | 216 ++++++++++-------- 1 file changed, 118 insertions(+), 98 deletions(-) diff --git a/src/python/grpcio_tests/tests_aio/channelz/channelz_servicer_test.py b/src/python/grpcio_tests/tests_aio/channelz/channelz_servicer_test.py index 8504f05c3d0..8cc0d4d2fcc 100644 --- a/src/python/grpcio_tests/tests_aio/channelz/channelz_servicer_test.py +++ b/src/python/grpcio_tests/tests_aio/channelz/channelz_servicer_test.py @@ -69,40 +69,54 @@ class _GenericHandler(grpc.GenericRpcHandler): return None -class _ChannelServerPair(object): +class _ChannelServerPair: async def start(self): # Server will enable channelz service self.server = aio.server(options=_DISABLE_REUSE_PORT + _ENABLE_CHANNELZ) port = self.server.add_insecure_port('[::]:0') + self.address = 'localhost:%d' % port self.server.add_generic_rpc_handlers((_GenericHandler(),)) await self.server.start() # Channel will enable channelz service... - self.channel = aio.insecure_channel('localhost:%d' % port, + self.channel = aio.insecure_channel(self.address, options=_ENABLE_CHANNELZ) + async def bind_channelz(self, channelz_stub): + resp = await channelz_stub.GetTopChannels( + channelz_pb2.GetTopChannelsRequest(start_channel_id=0)) + for channel in resp.channel: + if channel.data.target == self.address: + self.channel_ref_id = channel.ref.channel_id + + resp = await channelz_stub.GetServers( + channelz_pb2.GetServersRequest(start_server_id=0)) + self.server_ref_id = resp.server[-1].ref.server_id -# Stores channel-server pairs globally, since the memory deallocation is -# non-deterministic in both Core and Python with multiple threads. The -# destroyed Channelz node might still present. So, as a work around, this -# test doesn't close channel-server-pairs between cases. -_pairs = [] + async def stop(self): + await self.channel.close() + await self.server.stop(None) -async def _generate_channel_server_pairs(n): - """Creates channel-server pairs globally, returns their indexes.""" - new_pairs = [_ChannelServerPair() for i in range(n)] - for pair in new_pairs: +async def _create_channel_server_pairs(n, channelz_stub=None): + """Create channel-server pairs.""" + pairs = [_ChannelServerPair() for i in range(n)] + for pair in pairs: await pair.start() - _pairs.extend(new_pairs) - return list(range(len(_pairs) - n, len(_pairs))) + if channelz_stub: + await pair.bind_channelz(channelz_stub) + return pairs + + +async def _destroy_channel_server_pairs(pairs): + for pair in pairs: + await pair.stop() class ChannelzServicerTest(AioTestBase): async def setUp(self): - self._pairs = [] # This server is for Channelz info fetching only # It self should not enable Channelz self._server = aio.server(options=_DISABLE_REUSE_PORT + @@ -118,155 +132,149 @@ class ChannelzServicerTest(AioTestBase): self._channelz_stub = channelz_pb2_grpc.ChannelzStub(self._channel) async def tearDown(self): - await self._server.stop(None) await self._channel.close() + await self._server.stop(None) + + async def _get_server_by_ref_id(self, ref_id): + """Server id may not be consecutive""" + resp = await self._channelz_stub.GetServers( + channelz_pb2.GetServersRequest(start_server_id=ref_id)) + self.assertEqual(ref_id, resp.server[0].ref.server_id) + return resp.server[0] - async def _send_successful_unary_unary(self, idx): - call = _pairs[idx].channel.unary_unary(_SUCCESSFUL_UNARY_UNARY)( - _REQUEST) + async def _send_successful_unary_unary(self, pair): + call = pair.channel.unary_unary(_SUCCESSFUL_UNARY_UNARY)(_REQUEST) self.assertEqual(grpc.StatusCode.OK, await call.code()) - async def _send_failed_unary_unary(self, idx): + async def _send_failed_unary_unary(self, pair): try: - await _pairs[idx].channel.unary_unary(_FAILED_UNARY_UNARY)(_REQUEST) + await pair.channel.unary_unary(_FAILED_UNARY_UNARY)(_REQUEST) except grpc.RpcError: return else: self.fail("This call supposed to fail") - async def _send_successful_stream_stream(self, idx): - call = _pairs[idx].channel.stream_stream(_SUCCESSFUL_STREAM_STREAM)( - iter([_REQUEST] * test_constants.STREAM_LENGTH)) + async def _send_successful_stream_stream(self, pair): + call = pair.channel.stream_stream(_SUCCESSFUL_STREAM_STREAM)(iter( + [_REQUEST] * test_constants.STREAM_LENGTH)) cnt = 0 async for _ in call: cnt += 1 self.assertEqual(cnt, test_constants.STREAM_LENGTH) - async def _get_channel_id(self, idx): - """Channel id may not be consecutive""" - resp = await self._channelz_stub.GetTopChannels( - channelz_pb2.GetTopChannelsRequest(start_channel_id=0)) - self.assertGreater(len(resp.channel), idx) - return resp.channel[idx].ref.channel_id - - async def _get_server_by_id(self, idx): - """Server id may not be consecutive""" - resp = await self._channelz_stub.GetServers( - channelz_pb2.GetServersRequest(start_server_id=0)) - return resp.server[idx] - - async def test_get_top_channels_basic(self): - before = await self._channelz_stub.GetTopChannels( - channelz_pb2.GetTopChannelsRequest(start_channel_id=0)) - await _generate_channel_server_pairs(1) - after = await self._channelz_stub.GetTopChannels( - channelz_pb2.GetTopChannelsRequest(start_channel_id=0)) - self.assertEqual(len(after.channel) - len(before.channel), 1) - self.assertEqual(after.end, True) - async def test_get_top_channels_high_start_id(self): - await _generate_channel_server_pairs(1) + pairs = await _create_channel_server_pairs(1) + resp = await self._channelz_stub.GetTopChannels( channelz_pb2.GetTopChannelsRequest( start_channel_id=_LARGE_UNASSIGNED_ID)) self.assertEqual(len(resp.channel), 0) self.assertEqual(resp.end, True) + await _destroy_channel_server_pairs(pairs) + async def test_successful_request(self): - idx = await _generate_channel_server_pairs(1) - await self._send_successful_unary_unary(idx[0]) + pairs = await _create_channel_server_pairs(1, self._channelz_stub) + + await self._send_successful_unary_unary(pairs[0]) resp = await self._channelz_stub.GetChannel( - channelz_pb2.GetChannelRequest( - channel_id=await self._get_channel_id(idx[0]))) + channelz_pb2.GetChannelRequest(channel_id=pairs[0].channel_ref_id)) + self.assertEqual(resp.channel.data.calls_started, 1) self.assertEqual(resp.channel.data.calls_succeeded, 1) self.assertEqual(resp.channel.data.calls_failed, 0) + await _destroy_channel_server_pairs(pairs) + async def test_failed_request(self): - idx = await _generate_channel_server_pairs(1) - await self._send_failed_unary_unary(idx[0]) + pairs = await _create_channel_server_pairs(1, self._channelz_stub) + + await self._send_failed_unary_unary(pairs[0]) resp = await self._channelz_stub.GetChannel( - channelz_pb2.GetChannelRequest( - channel_id=await self._get_channel_id(idx[0]))) + channelz_pb2.GetChannelRequest(channel_id=pairs[0].channel_ref_id)) self.assertEqual(resp.channel.data.calls_started, 1) self.assertEqual(resp.channel.data.calls_succeeded, 0) self.assertEqual(resp.channel.data.calls_failed, 1) + await _destroy_channel_server_pairs(pairs) + async def test_many_requests(self): - idx = await _generate_channel_server_pairs(1) + pairs = await _create_channel_server_pairs(1, self._channelz_stub) + k_success = 7 k_failed = 9 for i in range(k_success): - await self._send_successful_unary_unary(idx[0]) + await self._send_successful_unary_unary(pairs[0]) for i in range(k_failed): - await self._send_failed_unary_unary(idx[0]) + await self._send_failed_unary_unary(pairs[0]) resp = await self._channelz_stub.GetChannel( - channelz_pb2.GetChannelRequest( - channel_id=await self._get_channel_id(idx[0]))) + channelz_pb2.GetChannelRequest(channel_id=pairs[0].channel_ref_id)) self.assertEqual(resp.channel.data.calls_started, k_success + k_failed) self.assertEqual(resp.channel.data.calls_succeeded, k_success) self.assertEqual(resp.channel.data.calls_failed, k_failed) + await _destroy_channel_server_pairs(pairs) + async def test_many_requests_many_channel(self): k_channels = 4 - idx = await _generate_channel_server_pairs(k_channels) + pairs = await _create_channel_server_pairs(k_channels, + self._channelz_stub) k_success = 11 k_failed = 13 for i in range(k_success): - await self._send_successful_unary_unary(idx[0]) - await self._send_successful_unary_unary(idx[2]) + await self._send_successful_unary_unary(pairs[0]) + await self._send_successful_unary_unary(pairs[2]) for i in range(k_failed): - await self._send_failed_unary_unary(idx[1]) - await self._send_failed_unary_unary(idx[2]) + await self._send_failed_unary_unary(pairs[1]) + await self._send_failed_unary_unary(pairs[2]) # The first channel saw only successes resp = await self._channelz_stub.GetChannel( - channelz_pb2.GetChannelRequest( - channel_id=await self._get_channel_id(idx[0]))) + channelz_pb2.GetChannelRequest(channel_id=pairs[0].channel_ref_id)) self.assertEqual(resp.channel.data.calls_started, k_success) self.assertEqual(resp.channel.data.calls_succeeded, k_success) self.assertEqual(resp.channel.data.calls_failed, 0) # The second channel saw only failures resp = await self._channelz_stub.GetChannel( - channelz_pb2.GetChannelRequest( - channel_id=await self._get_channel_id(idx[1]))) + channelz_pb2.GetChannelRequest(channel_id=pairs[1].channel_ref_id)) self.assertEqual(resp.channel.data.calls_started, k_failed) self.assertEqual(resp.channel.data.calls_succeeded, 0) self.assertEqual(resp.channel.data.calls_failed, k_failed) # The third channel saw both successes and failures resp = await self._channelz_stub.GetChannel( - channelz_pb2.GetChannelRequest( - channel_id=await self._get_channel_id(idx[2]))) + channelz_pb2.GetChannelRequest(channel_id=pairs[2].channel_ref_id)) self.assertEqual(resp.channel.data.calls_started, k_success + k_failed) self.assertEqual(resp.channel.data.calls_succeeded, k_success) self.assertEqual(resp.channel.data.calls_failed, k_failed) # The fourth channel saw nothing resp = await self._channelz_stub.GetChannel( - channelz_pb2.GetChannelRequest( - channel_id=await self._get_channel_id(idx[3]))) + channelz_pb2.GetChannelRequest(channel_id=pairs[3].channel_ref_id)) self.assertEqual(resp.channel.data.calls_started, 0) self.assertEqual(resp.channel.data.calls_succeeded, 0) self.assertEqual(resp.channel.data.calls_failed, 0) + await _destroy_channel_server_pairs(pairs) + async def test_many_subchannels(self): k_channels = 4 - idx = await _generate_channel_server_pairs(k_channels) + pairs = await _create_channel_server_pairs(k_channels, + self._channelz_stub) k_success = 17 k_failed = 19 for i in range(k_success): - await self._send_successful_unary_unary(idx[0]) - await self._send_successful_unary_unary(idx[2]) + await self._send_successful_unary_unary(pairs[0]) + await self._send_successful_unary_unary(pairs[2]) for i in range(k_failed): - await self._send_failed_unary_unary(idx[1]) - await self._send_failed_unary_unary(idx[2]) + await self._send_failed_unary_unary(pairs[1]) + await self._send_failed_unary_unary(pairs[2]) for i in range(k_channels): gc_resp = await self._channelz_stub.GetChannel( channelz_pb2.GetChannelRequest( - channel_id=await self._get_channel_id(idx[i]))) + channel_id=pairs[i].channel_ref_id)) # If no call performed in the channel, there shouldn't be any subchannel if gc_resp.channel.data.calls_started == 0: self.assertEqual(len(gc_resp.channel.subchannel_ref), 0) @@ -285,36 +293,42 @@ class ChannelzServicerTest(AioTestBase): self.assertEqual(gc_resp.channel.data.calls_failed, gsc_resp.subchannel.data.calls_failed) + await _destroy_channel_server_pairs(pairs) + async def test_server_call(self): - idx = await _generate_channel_server_pairs(1) + pairs = await _create_channel_server_pairs(1, self._channelz_stub) + k_success = 23 k_failed = 29 for i in range(k_success): - await self._send_successful_unary_unary(idx[0]) + await self._send_successful_unary_unary(pairs[0]) for i in range(k_failed): - await self._send_failed_unary_unary(idx[0]) + await self._send_failed_unary_unary(pairs[0]) - resp = await self._get_server_by_id(idx[0]) + resp = await self._get_server_by_ref_id(pairs[0].server_ref_id) self.assertEqual(resp.data.calls_started, k_success + k_failed) self.assertEqual(resp.data.calls_succeeded, k_success) self.assertEqual(resp.data.calls_failed, k_failed) + await _destroy_channel_server_pairs(pairs) + async def test_many_subchannels_and_sockets(self): k_channels = 4 - idx = await _generate_channel_server_pairs(k_channels) + pairs = await _create_channel_server_pairs(k_channels, + self._channelz_stub) k_success = 3 k_failed = 5 for i in range(k_success): - await self._send_successful_unary_unary(idx[0]) - await self._send_successful_unary_unary(idx[2]) + await self._send_successful_unary_unary(pairs[0]) + await self._send_successful_unary_unary(pairs[2]) for i in range(k_failed): - await self._send_failed_unary_unary(idx[1]) - await self._send_failed_unary_unary(idx[2]) + await self._send_failed_unary_unary(pairs[1]) + await self._send_failed_unary_unary(pairs[2]) for i in range(k_channels): gc_resp = await self._channelz_stub.GetChannel( channelz_pb2.GetChannelRequest( - channel_id=await self._get_channel_id(idx[i]))) + channel_id=pairs[i].channel_ref_id)) # If no call performed in the channel, there shouldn't be any subchannel if gc_resp.channel.data.calls_started == 0: @@ -340,15 +354,16 @@ class ChannelzServicerTest(AioTestBase): self.assertEqual(gsc_resp.subchannel.data.calls_started, gs_resp.socket.data.messages_sent) + await _destroy_channel_server_pairs(pairs) + async def test_streaming_rpc(self): - idx = await _generate_channel_server_pairs(1) + pairs = await _create_channel_server_pairs(1, self._channelz_stub) # In C++, the argument for _send_successful_stream_stream is message length. # Here the argument is still channel idx, to be consistent with the other two. - await self._send_successful_stream_stream(idx[0]) + await self._send_successful_stream_stream(pairs[0]) gc_resp = await self._channelz_stub.GetChannel( - channelz_pb2.GetChannelRequest( - channel_id=await self._get_channel_id(idx[0]))) + channelz_pb2.GetChannelRequest(channel_id=pairs[0].channel_ref_id)) self.assertEqual(gc_resp.channel.data.calls_started, 1) self.assertEqual(gc_resp.channel.data.calls_succeeded, 1) self.assertEqual(gc_resp.channel.data.calls_failed, 0) @@ -375,12 +390,15 @@ class ChannelzServicerTest(AioTestBase): self.assertEqual(gs_resp.socket.data.messages_received, test_constants.STREAM_LENGTH) + await _destroy_channel_server_pairs(pairs) + async def test_server_sockets(self): - idx = await _generate_channel_server_pairs(1) - await self._send_successful_unary_unary(idx[0]) - await self._send_failed_unary_unary(idx[0]) + pairs = await _create_channel_server_pairs(1, self._channelz_stub) + + await self._send_successful_unary_unary(pairs[0]) + await self._send_failed_unary_unary(pairs[0]) - resp = await self._get_server_by_id(idx[0]) + resp = await self._get_server_by_ref_id(pairs[0].server_ref_id) self.assertEqual(resp.data.calls_started, 2) self.assertEqual(resp.data.calls_succeeded, 1) self.assertEqual(resp.data.calls_failed, 1) @@ -390,11 +408,12 @@ class ChannelzServicerTest(AioTestBase): start_socket_id=0)) # If the RPC call failed, it will raise a grpc.RpcError # So, if there is no exception raised, considered pass + await _destroy_channel_server_pairs(pairs) async def test_server_listen_sockets(self): - idx = await _generate_channel_server_pairs(1) + pairs = await _create_channel_server_pairs(1, self._channelz_stub) - resp = await self._get_server_by_id(idx[0]) + resp = await self._get_server_by_ref_id(pairs[0].server_ref_id) self.assertEqual(len(resp.listen_socket), 1) gs_resp = await self._channelz_stub.GetSocket( @@ -402,6 +421,7 @@ class ChannelzServicerTest(AioTestBase): socket_id=resp.listen_socket[0].socket_id)) # If the RPC call failed, it will raise a grpc.RpcError # So, if there is no exception raised, considered pass + await _destroy_channel_server_pairs(pairs) async def test_invalid_query_get_server(self): with self.assertRaises(aio.AioRpcError) as exception_context: From 9c537f91f4e0d13970a9f78e3c2b65cf747edfd6 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Tue, 5 May 2020 15:11:16 -0700 Subject: [PATCH 690/758] Make pytype happy --- .../tests_aio/channelz/channelz_servicer_test.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/python/grpcio_tests/tests_aio/channelz/channelz_servicer_test.py b/src/python/grpcio_tests/tests_aio/channelz/channelz_servicer_test.py index 8cc0d4d2fcc..d6e9fd42791 100644 --- a/src/python/grpcio_tests/tests_aio/channelz/channelz_servicer_test.py +++ b/src/python/grpcio_tests/tests_aio/channelz/channelz_servicer_test.py @@ -71,6 +71,13 @@ class _GenericHandler(grpc.GenericRpcHandler): class _ChannelServerPair: + def __init__(self): + self.address = '' + self.server = None + self.channel = None + self.server_ref_id = None + self.channel_ref_id = None + async def start(self): # Server will enable channelz service self.server = aio.server(options=_DISABLE_REUSE_PORT + _ENABLE_CHANNELZ) @@ -348,8 +355,7 @@ class ChannelzServicerTest(AioTestBase): socket_id=gsc_resp.subchannel.socket_ref[0].socket_id)) self.assertEqual(gsc_resp.subchannel.data.calls_started, gs_resp.socket.data.streams_started) - self.assertEqual(gsc_resp.subchannel.data.calls_started, - gs_resp.socket.data.streams_succeeded) + self.assertEqual(0, gs_resp.socket.data.streams_failed) # Calls started == messages sent, only valid for unary calls self.assertEqual(gsc_resp.subchannel.data.calls_started, gs_resp.socket.data.messages_sent) From ee19ac2aba599d2c4d351109dcc0e903f3db34b4 Mon Sep 17 00:00:00 2001 From: ZhenLian Date: Tue, 5 May 2020 13:14:43 -0700 Subject: [PATCH 691/758] fix test failures --- .../security/security_connector/ssl_utils.cc | 5 +- src/core/tsi/ssl_transport_security.cc | 53 +++++++++++++------ test/core/tsi/ssl_transport_security_test.cc | 20 +++++-- 3 files changed, 57 insertions(+), 21 deletions(-) diff --git a/src/core/lib/security/security_connector/ssl_utils.cc b/src/core/lib/security/security_connector/ssl_utils.cc index b876d734fbf..74a7fa98768 100644 --- a/src/core/lib/security/security_connector/ssl_utils.cc +++ b/src/core/lib/security/security_connector/ssl_utils.cc @@ -256,7 +256,7 @@ grpc_core::RefCountedPtr grpc_ssl_peer_to_auth_context( ctx.get(), GRPC_TRANSPORT_SECURITY_TYPE_PROPERTY_NAME, transport_security_type); const char* spiffe_data = nullptr; - size_t spiffe_length; + size_t spiffe_length = 0; int spiffe_id_count = 0; for (i = 0; i < peer->property_count; i++) { const tsi_peer_property* prop = &peer->properties[i]; @@ -352,6 +352,9 @@ tsi_peer grpc_shallow_peer_from_ssl_auth_context( 0) { add_shallow_auth_property_to_peer(&peer, prop, TSI_X509_PEM_CERT_CHAIN_PROPERTY); + } else if (strcmp(prop->name, GRPC_PEER_SPIFFE_ID_PROPERTY_NAME) == 0) { + add_shallow_auth_property_to_peer(&peer, prop, + TSI_X509_URI_PEER_PROPERTY); } } } diff --git a/src/core/tsi/ssl_transport_security.cc b/src/core/tsi/ssl_transport_security.cc index 820a6537971..069b9f9f90a 100644 --- a/src/core/tsi/ssl_transport_security.cc +++ b/src/core/tsi/ssl_transport_security.cc @@ -346,13 +346,10 @@ static tsi_result add_pem_certificate(X509* cert, tsi_peer_property* property) { /* Gets the subject SANs from an X509 cert as a tsi_peer_property. */ static tsi_result add_subject_alt_names_properties_to_peer( tsi_peer* peer, GENERAL_NAMES* subject_alt_names, - size_t subject_alt_name_count) { + size_t subject_alt_name_count, int* current_insert_index) { size_t i; tsi_result result = TSI_OK; - /* Reset for DNS entries filtering. */ - peer->property_count -= subject_alt_name_count; - for (i = 0; i < subject_alt_name_count; i++) { GENERAL_NAME* subject_alt_name = sk_GENERAL_NAME_value(subject_alt_names, TSI_SIZE_AS_SIZE(i)); @@ -377,13 +374,7 @@ static tsi_result add_subject_alt_names_properties_to_peer( result = tsi_construct_string_peer_property( TSI_X509_SUBJECT_ALTERNATIVE_NAME_PEER_PROPERTY, reinterpret_cast(name), static_cast(name_size), - &peer->properties[peer->property_count++]); - if (subject_alt_name->type == GEN_URI) { - result = tsi_construct_string_peer_property( - TSI_X509_URI_PEER_PROPERTY, reinterpret_cast(name), - static_cast(name_size), - &peer->properties[peer->property_count++]); - } + &peer->properties[(*current_insert_index)++]); OPENSSL_free(name); } else if (subject_alt_name->type == GEN_IPADD) { char ntop_buf[INET6_ADDRSTRLEN]; @@ -408,7 +399,24 @@ static tsi_result add_subject_alt_names_properties_to_peer( result = tsi_construct_string_peer_property_from_cstring( TSI_X509_SUBJECT_ALTERNATIVE_NAME_PEER_PROPERTY, name, - &peer->properties[peer->property_count++]); + &peer->properties[(*current_insert_index)++]); + } + if (result != TSI_OK) break; + if (subject_alt_name->type == GEN_URI) { + unsigned char* name = nullptr; + int name_size; + name_size = ASN1_STRING_to_UTF8( + &name, subject_alt_name->d.uniformResourceIdentifier); + if (name_size < 0) { + gpr_log(GPR_ERROR, "Could not get utf8 from asn1 string."); + result = TSI_INTERNAL_ERROR; + break; + } + result = tsi_construct_string_peer_property( + TSI_X509_URI_PEER_PROPERTY, reinterpret_cast(name), + static_cast(name_size), + &peer->properties[(*current_insert_index)++]); + OPENSSL_free(name); } if (result != TSI_OK) break; } @@ -431,26 +439,35 @@ static tsi_result peer_from_x509(X509* cert, int include_certificate_type, property_count = (include_certificate_type ? static_cast(1) : 0) + 2 /* common name, certificate */ + static_cast(subject_alt_name_count); + for (int i = 0; i < subject_alt_name_count; i++) { + GENERAL_NAME* subject_alt_name = + sk_GENERAL_NAME_value(subject_alt_names, TSI_SIZE_AS_SIZE(i)); + if (subject_alt_name->type == GEN_URI) { + property_count += 1; + } + } result = tsi_construct_peer(property_count, peer); if (result != TSI_OK) return result; + int current_insert_index = 0; do { if (include_certificate_type) { result = tsi_construct_string_peer_property_from_cstring( TSI_CERTIFICATE_TYPE_PEER_PROPERTY, TSI_X509_CERTIFICATE_TYPE, - &peer->properties[0]); + &peer->properties[current_insert_index++]); if (result != TSI_OK) break; } result = peer_property_from_x509_common_name( - cert, &peer->properties[include_certificate_type ? 1 : 0]); + cert, &peer->properties[current_insert_index++]); if (result != TSI_OK) break; - result = add_pem_certificate( - cert, &peer->properties[include_certificate_type ? 2 : 1]); + result = + add_pem_certificate(cert, &peer->properties[current_insert_index++]); if (result != TSI_OK) break; if (subject_alt_name_count != 0) { result = add_subject_alt_names_properties_to_peer( - peer, subject_alt_names, static_cast(subject_alt_name_count)); + peer, subject_alt_names, static_cast(subject_alt_name_count), + ¤t_insert_index); if (result != TSI_OK) break; } } while (0); @@ -459,6 +476,8 @@ static tsi_result peer_from_x509(X509* cert, int include_certificate_type, sk_GENERAL_NAME_pop_free(subject_alt_names, GENERAL_NAME_free); } if (result != TSI_OK) tsi_peer_destruct(peer); + + GPR_ASSERT((int)peer->property_count == current_insert_index); return result; } diff --git a/test/core/tsi/ssl_transport_security_test.cc b/test/core/tsi/ssl_transport_security_test.cc index 70b8355bc79..1319004a9ca 100644 --- a/test/core/tsi/ssl_transport_security_test.cc +++ b/test/core/tsi/ssl_transport_security_test.cc @@ -259,6 +259,18 @@ static bool check_subject_alt_name(tsi_peer* peer, const char* name) { return false; } +static bool check_uri(tsi_peer* peer, const char* name) { + for (size_t i = 0; i < peer->property_count; i++) { + const tsi_peer_property* prop = &peer->properties[i]; + if (strcmp(prop->name, TSI_X509_URI_PEER_PROPERTY) == 0) { + if (memcmp(prop->value.data, name, prop->value.length) == 0) { + return true; + } + } + } + return false; +} + void check_server1_peer(tsi_peer* peer) { const tsi_peer_property* property = check_basic_authenticated_peer_and_get_common_name(peer); @@ -862,9 +874,9 @@ void ssl_tsi_test_extract_x509_subject_names() { tsi_peer peer; GPR_ASSERT(tsi_ssl_extract_x509_subject_names_from_pem_cert(cert, &peer) == TSI_OK); - // One for common name, one for certificate, one for security level, and six - // for SAN fields. - size_t expected_property_count = 8; + // tsi_peer should include one common name, one certificate, one security + // level, six SAN fields, and two URI fields. + size_t expected_property_count = 10; GPR_ASSERT(peer.property_count == expected_property_count); // Check common name const char* expected_cn = "xpigors"; @@ -885,6 +897,8 @@ void ssl_tsi_test_extract_x509_subject_names() { check_subject_alt_name(&peer, "https://foo.test.domain.com/test") == 1); GPR_ASSERT( check_subject_alt_name(&peer, "https://bar.test.domain.com/test") == 1); + GPR_ASSERT(check_uri(&peer, "https://foo.test.domain.com/test") == 1); + GPR_ASSERT(check_uri(&peer, "https://bar.test.domain.com/test") == 1); // Check email address GPR_ASSERT(check_subject_alt_name(&peer, "foo@test.domain.com") == 1); GPR_ASSERT(check_subject_alt_name(&peer, "bar@test.domain.com") == 1); From 9adad715bbb647f32f16ac9a62e1871ad3fd752c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jagoba=20Gasco=CC=81n?= Date: Tue, 5 May 2020 12:47:46 +0200 Subject: [PATCH 692/758] objc: add autogenerated header to generated files --- src/compiler/objective_c_plugin.cc | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/compiler/objective_c_plugin.cc b/src/compiler/objective_c_plugin.cc index a08064a08bd..d5174bc9386 100644 --- a/src/compiler/objective_c_plugin.cc +++ b/src/compiler/objective_c_plugin.cc @@ -127,6 +127,12 @@ class ObjectiveCGrpcGenerator : public grpc::protobuf::compiler::CodeGenerator { } } + // Write out a file header. + ::grpc::string file_header = + "// Code generated by gRPC proto compiler. DO NOT EDIT!\n" + "// source: " + + file->name() + "\n\n"; + { // Generate .pbrpc.h @@ -187,7 +193,7 @@ class ObjectiveCGrpcGenerator : public grpc::protobuf::compiler::CodeGenerator { } Write(context, file_name + ".pbrpc.h", - PreprocIfNot(kForwardDeclare, imports) + "\n" + + file_header + PreprocIfNot(kForwardDeclare, imports) + "\n" + PreprocIfNot(kProtocolOnly, system_imports) + "\n" + class_declarations + "\n" + PreprocIfNot(kForwardDeclare, class_imports) + "\n" + @@ -228,8 +234,9 @@ class ObjectiveCGrpcGenerator : public grpc::protobuf::compiler::CodeGenerator { } Write(context, file_name + ".pbrpc.m", - PreprocIfNot(kProtocolOnly, - imports + "\n" + class_imports + "\n" + definitions)); + file_header + + PreprocIfNot(kProtocolOnly, imports + "\n" + class_imports + + "\n" + definitions)); } return true; From 18dd95f735c4e63c906ed0a4390f81462e7bc02b Mon Sep 17 00:00:00 2001 From: Eric Anderson Date: Wed, 6 May 2020 11:23:23 -0700 Subject: [PATCH 693/758] doc/compression.md: Make it clear compression is per-RPC "initial call" should not be understood as "initial call on the connection" but "initial call of the RPC". All the data necessary for understanding client's compression abilities is provide per-RPC, so no connection-level state should be used. Using such state would break the use of proxies. --- doc/compression.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/compression.md b/doc/compression.md index 15e35ae350c..7f0c3823e77 100644 --- a/doc/compression.md +++ b/doc/compression.md @@ -76,8 +76,8 @@ of _compression levels_ (such as "low", "medium", "high"). Levels map to concrete algorithms and/or their settings (such as "low" mapping to "gzip -3" and "high" mapping to "gzip -9") automatically depending on what a peer is known to support. A server is always aware of what its clients support, -as clients disclose it in their Message-Accept-Encoding header as part of their -initial call. A client doesn't a priori (presently) know which algorithms a +as clients disclose it in the Message-Accept-Encoding header as part of the +RPC. A client doesn't a priori (presently) know which algorithms a server supports. This issue can be addressed with an initial negotiation of capabilities or an automatic retry mechanism. These features will be implemented in the future. Currently however, compression levels are only supported at the From 7fe44d8b1ebbf74907f2d2eafbf5eff3e32a4793 Mon Sep 17 00:00:00 2001 From: Donna Dionne Date: Wed, 6 May 2020 17:05:13 -0700 Subject: [PATCH 694/758] Fixing a build error A parameter has been removed, but the next PR merged cleanly while still using the removed parameter. --- test/cpp/end2end/xds_end2end_test.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/cpp/end2end/xds_end2end_test.cc b/test/cpp/end2end/xds_end2end_test.cc index 3792201c431..7e0b2733bb7 100644 --- a/test/cpp/end2end/xds_end2end_test.cc +++ b/test/cpp/end2end/xds_end2end_test.cc @@ -3830,7 +3830,7 @@ TEST_P(ClientLoadReportingTest, SendAllClusters) { {"locality0", GetBackendPorts()}, }); balancers_[0]->ads_service()->SetEdsResource( - AdsServiceImpl::BuildEdsResource(args), kDefaultResourceName); + AdsServiceImpl::BuildEdsResource(args)); // Wait until all backends are ready. int num_ok = 0; int num_failure = 0; From a37d5f14b07d7f73d049a41707bb2943b673bd2e Mon Sep 17 00:00:00 2001 From: Matthew Stevenson Date: Thu, 7 May 2020 07:22:29 -0700 Subject: [PATCH 695/758] Remove flaky test introduced in PR 21932. --- test/cpp/client/credentials_test.cc | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/test/cpp/client/credentials_test.cc b/test/cpp/client/credentials_test.cc index 7ca90f7ff68..c1293aebf30 100644 --- a/test/cpp/client/credentials_test.cc +++ b/test/cpp/client/credentials_test.cc @@ -686,22 +686,6 @@ TEST_F(CredentialsTest, LoadTlsChannelCredentials) { GPR_ASSERT(channel_credentials.get() != nullptr); } -// This test demonstrates how the TLS credentials will be used to create -// server credentials. -TEST_F(CredentialsTest, LoadTlsServerCredentials) { - std::shared_ptr test_credential_reload( - new TestTlsCredentialReload()); - std::shared_ptr credential_reload_config( - new TlsCredentialReloadConfig(test_credential_reload)); - - TlsCredentialsOptions options = TlsCredentialsOptions( - GRPC_SSL_REQUEST_CLIENT_CERTIFICATE_AND_VERIFY, - GRPC_TLS_SERVER_VERIFICATION, nullptr, credential_reload_config, nullptr); - std::shared_ptr<::grpc_impl::ServerCredentials> server_credentials = - grpc::experimental::TlsServerCredentials(options); - GPR_ASSERT(server_credentials.get() != nullptr); -} - TEST_F(CredentialsTest, TlsCredentialReloadConfigErrorMessages) { std::shared_ptr config( new TlsCredentialReloadConfig(nullptr)); From e9b4e168ba76163e5dfde30148d6bb7f5edd2563 Mon Sep 17 00:00:00 2001 From: Vijay Pai Date: Thu, 30 Apr 2020 15:38:28 -0700 Subject: [PATCH 696/758] Declare ApplicationCallbackExecCtx at channel's core entry points --- src/core/lib/surface/channel.cc | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/core/lib/surface/channel.cc b/src/core/lib/surface/channel.cc index 3a359a154df..bcfa5e6207d 100644 --- a/src/core/lib/surface/channel.cc +++ b/src/core/lib/surface/channel.cc @@ -329,6 +329,7 @@ char* grpc_channel_get_target(grpc_channel* channel) { void grpc_channel_get_info(grpc_channel* channel, const grpc_channel_info* channel_info) { + grpc_core::ApplicationCallbackExecCtx callback_exec_ctx; grpc_core::ExecCtx exec_ctx; grpc_channel_element* elem = grpc_channel_stack_element(CHANNEL_STACK_FROM_CHANNEL(channel), 0); @@ -336,6 +337,7 @@ void grpc_channel_get_info(grpc_channel* channel, } void grpc_channel_reset_connect_backoff(grpc_channel* channel) { + grpc_core::ApplicationCallbackExecCtx callback_exec_ctx; grpc_core::ExecCtx exec_ctx; GRPC_API_TRACE("grpc_channel_reset_connect_backoff(channel=%p)", 1, (channel)); @@ -386,6 +388,7 @@ grpc_call* grpc_channel_create_call(grpc_channel* channel, grpc_slice method, const grpc_slice* host, gpr_timespec deadline, void* reserved) { GPR_ASSERT(!reserved); + grpc_core::ApplicationCallbackExecCtx callback_exec_ctx; grpc_core::ExecCtx exec_ctx; grpc_call* call = grpc_channel_create_call_internal( channel, parent_call, propagation_mask, cq, nullptr, @@ -449,6 +452,7 @@ void* grpc_channel_register_call(grpc_channel* channel, const char* method, "grpc_channel_register_call(channel=%p, method=%s, host=%s, reserved=%p)", 4, (channel, method, host, reserved)); GPR_ASSERT(!reserved); + grpc_core::ApplicationCallbackExecCtx callback_exec_ctx; grpc_core::ExecCtx exec_ctx; grpc_core::MutexLock lock(&channel->registration_table->mu); @@ -481,6 +485,7 @@ grpc_call* grpc_channel_create_registered_call( registered_call_handle, deadline.tv_sec, deadline.tv_nsec, (int)deadline.clock_type, reserved)); GPR_ASSERT(!reserved); + grpc_core::ApplicationCallbackExecCtx callback_exec_ctx; grpc_core::ExecCtx exec_ctx; grpc_call* call = grpc_channel_create_call_internal( channel, parent_call, propagation_mask, completion_queue, nullptr, @@ -532,6 +537,7 @@ void grpc_channel_destroy_internal(grpc_channel* channel) { } void grpc_channel_destroy(grpc_channel* channel) { + grpc_core::ApplicationCallbackExecCtx callback_exec_ctx; grpc_core::ExecCtx exec_ctx; grpc_channel_destroy_internal(channel); } From 113c7fcb7c4a7ced7275a792f0a0bdc6fc28c3de Mon Sep 17 00:00:00 2001 From: Vijay Pai Date: Thu, 7 May 2020 08:35:24 -0700 Subject: [PATCH 697/758] Mark override on service method --- test/cpp/end2end/interceptors_util.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/cpp/end2end/interceptors_util.h b/test/cpp/end2end/interceptors_util.h index cac9f3a6bb8..2aafea2d54e 100644 --- a/test/cpp/end2end/interceptors_util.h +++ b/test/cpp/end2end/interceptors_util.h @@ -103,7 +103,7 @@ class EchoTestServiceStreamingImpl : public EchoTestService::Service { ~EchoTestServiceStreamingImpl() override {} Status Echo(ServerContext* context, const EchoRequest* request, - EchoResponse* response) { + EchoResponse* response) override { auto client_metadata = context->client_metadata(); for (const auto& pair : client_metadata) { context->AddTrailingMetadata(ToString(pair.first), ToString(pair.second)); From 415b71c98dce7af2de0b488ca9c5fdece512781a Mon Sep 17 00:00:00 2001 From: Vijay Pai Date: Thu, 7 May 2020 08:12:41 -0700 Subject: [PATCH 698/758] Defensive programming: ACEC is an optimization and not strictly needed --- src/core/lib/iomgr/exec_ctx.h | 5 +++++ src/core/lib/surface/completion_queue.cc | 9 ++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/core/lib/iomgr/exec_ctx.h b/src/core/lib/iomgr/exec_ctx.h index 4e746bc8505..ebea7cf6bfe 100644 --- a/src/core/lib/iomgr/exec_ctx.h +++ b/src/core/lib/iomgr/exec_ctx.h @@ -357,6 +357,11 @@ class ApplicationCallbackExecCtx { /** Global shutdown for ApplicationCallbackExecCtx. Called by init. */ static void GlobalShutdown(void) { gpr_tls_destroy(&callback_exec_ctx_); } + static bool Available() { + return reinterpret_cast( + gpr_tls_get(&callback_exec_ctx_)) != nullptr; + } + private: uintptr_t flags_{0u}; grpc_experimental_completion_queue_functor* head_{nullptr}; diff --git a/src/core/lib/surface/completion_queue.cc b/src/core/lib/surface/completion_queue.cc index 60cbb244678..7c0c9aeb972 100644 --- a/src/core/lib/surface/completion_queue.cc +++ b/src/core/lib/surface/completion_queue.cc @@ -874,8 +874,15 @@ static void cq_end_op_for_callback( cq_finish_shutdown_callback(cq); } + // If possible, schedule the callback onto an existing thread-local + // ApplicationCallbackExecCtx, which is a work queue. This is possible for: + // 1. The callback is internally-generated and there is an ACEC available + // 2. The callback is marked inlineable and there is an ACEC available + // 3. We are already running in a background poller thread (which always has + // an ACEC available at the base of the stack). auto* functor = static_cast(tag); - if (internal || functor->inlineable || + if (((internal || functor->inlineable) && + grpc_core::ApplicationCallbackExecCtx::Available()) || grpc_iomgr_is_any_background_poller_thread()) { grpc_core::ApplicationCallbackExecCtx::Enqueue(functor, (error == GRPC_ERROR_NONE)); From c6723399b8d7ed580e72220b7d880f57d1d5eae9 Mon Sep 17 00:00:00 2001 From: "Ville M. Vainio" Date: Thu, 7 May 2020 19:59:23 +0300 Subject: [PATCH 699/758] SkipGrpcNativeLibsCopying flag --- src/csharp/Grpc.Core/build/net45/Grpc.Core.targets | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/csharp/Grpc.Core/build/net45/Grpc.Core.targets b/src/csharp/Grpc.Core/build/net45/Grpc.Core.targets index 531760909f1..dba38203b84 100644 --- a/src/csharp/Grpc.Core/build/net45/Grpc.Core.targets +++ b/src/csharp/Grpc.Core/build/net45/Grpc.Core.targets @@ -1,6 +1,16 @@  - + + Always grpc_csharp_ext.x86.dll From f3fbec3c67b77a0d4f9b85dc631530a4703c00ad Mon Sep 17 00:00:00 2001 From: "Kraemer, Benjamin" Date: Thu, 7 May 2020 19:46:10 +0200 Subject: [PATCH 700/758] Keep properties if already set * Protobuf_ToolsOs * Protobuf_ToolsCpu * Protobuf_ProtocFullPath --- .../build/_protobuf/Google.Protobuf.Tools.targets | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/csharp/Grpc.Tools/build/_protobuf/Google.Protobuf.Tools.targets b/src/csharp/Grpc.Tools/build/_protobuf/Google.Protobuf.Tools.targets index ad6725f684a..668c731a321 100644 --- a/src/csharp/Grpc.Tools/build/_protobuf/Google.Protobuf.Tools.targets +++ b/src/csharp/Grpc.Tools/build/_protobuf/Google.Protobuf.Tools.targets @@ -68,9 +68,9 @@ - $(PROTOBUF_TOOLS_OS) - $(PROTOBUF_TOOLS_CPU) - $(PROTOBUF_PROTOC) + $(PROTOBUF_TOOLS_OS) + $(PROTOBUF_TOOLS_CPU) + $(PROTOBUF_PROTOC) $(_Protobuf_ToolsOs) From b872ffe2f2b9806b4774e93be23cd07e7f1ec5b1 Mon Sep 17 00:00:00 2001 From: Alexander Polcyn Date: Wed, 6 May 2020 15:17:15 -0700 Subject: [PATCH 701/758] Make channel soak interop test more debuggable, add max_failures and max_acceptable_latency_ms options --- test/cpp/interop/client.cc | 20 +++-- test/cpp/interop/interop_client.cc | 124 ++++++++++++++++++++++++----- test/cpp/interop/interop_client.h | 16 +++- 3 files changed, 135 insertions(+), 25 deletions(-) diff --git a/test/cpp/interop/client.cc b/test/cpp/interop/client.cc index 45fb68df5b5..fc12d4b8ae6 100644 --- a/test/cpp/interop/client.cc +++ b/test/cpp/interop/client.cc @@ -88,8 +88,15 @@ DEFINE_bool(do_not_abort_on_transient_failures, false, "test is retried in case of transient failures (and currently the " "interop tests are not retried even if this flag is set to true)"); DEFINE_int32(soak_iterations, 1000, - "number of iterations to use for the two soak tests; rpc_soak and " - "channel_soak"); + "The number of iterations to use for the two soak tests; rpc_soak " + "and channel_soak."); +DEFINE_int32(soak_max_failures, 0, + "The number of iterations in soak tests that are allowed to fail " + "(either due to non-OK status code or exceeding the " + "per-iteration max acceptable latency)."); +DEFINE_int64(soak_per_iteration_max_acceptable_latency_ms, 0, + "The number of milliseconds a single iteration in the two soak " + "tests (rpc_soak and channel_soak) is allowed to take."); DEFINE_int32(iteration_interval, 10, "The interval in seconds between rpcs. This is used by " "long_connection test"); @@ -257,9 +264,12 @@ int main(int argc, char** argv) { std::bind(&grpc::testing::InteropClient::DoCacheableUnary, &client); actions["channel_soak"] = std::bind(&grpc::testing::InteropClient::DoChannelSoakTest, &client, - FLAGS_soak_iterations); - actions["rpc_soak"] = std::bind(&grpc::testing::InteropClient::DoRpcSoakTest, - &client, FLAGS_soak_iterations); + FLAGS_soak_iterations, FLAGS_soak_max_failures, + FLAGS_soak_per_iteration_max_acceptable_latency_ms); + actions["rpc_soak"] = + std::bind(&grpc::testing::InteropClient::DoRpcSoakTest, &client, + FLAGS_soak_iterations, FLAGS_soak_max_failures, + FLAGS_soak_per_iteration_max_acceptable_latency_ms); actions["long_lived_channel"] = std::bind(&grpc::testing::InteropClient::DoLongLivedChannelTest, &client, FLAGS_soak_iterations, FLAGS_iteration_interval); diff --git a/test/cpp/interop/interop_client.cc b/test/cpp/interop/interop_client.cc index 71ee79a6e96..63343ded620 100644 --- a/test/cpp/interop/interop_client.cc +++ b/test/cpp/interop/interop_client.cc @@ -19,6 +19,7 @@ #include #include #include +#include #include #include @@ -30,6 +31,7 @@ #include #include +#include "src/core/lib/iomgr/exec_ctx.h" #include "src/proto/grpc/testing/empty.pb.h" #include "src/proto/grpc/testing/messages.pb.h" #include "src/proto/grpc/testing/test.grpc.pb.h" @@ -1065,36 +1067,122 @@ bool InteropClient::DoCustomMetadata() { return true; } -bool InteropClient::DoRpcSoakTest(int32_t soak_iterations) { - gpr_log(GPR_DEBUG, "Sending %d RPCs...", soak_iterations); - GPR_ASSERT(soak_iterations > 0); +std::tuple +InteropClient::PerformOneSoakTestIteration( + const bool reset_channel, + const int64_t max_acceptable_per_iteration_latency_ms) { + gpr_timespec start = gpr_now(GPR_CLOCK_MONOTONIC); SimpleRequest request; SimpleResponse response; + // Don't set the deadline on the RPC, and instead just + // record how long the RPC took and compare. This makes + // debugging easier when looking at failure results. + ClientContext context; + InteropClientContextInspector inspector(context); + request.set_response_size(kLargeResponseSize); + grpc::string payload(kLargeRequestSize, '\0'); + request.mutable_payload()->set_body(payload.c_str(), kLargeRequestSize); + if (reset_channel) { + serviceStub_.ResetChannel(); + } + Status s = serviceStub_.Get()->UnaryCall(&context, request, &response); + gpr_timespec now = gpr_now(GPR_CLOCK_MONOTONIC); + grpc_millis elapsed_ms = + grpc_timespec_to_millis_round_down(gpr_time_sub(now, start)); + if (!s.ok()) { + return std::make_tuple(false, elapsed_ms, context.debug_error_string()); + } else if (elapsed_ms > max_acceptable_per_iteration_latency_ms) { + char* out; + GPR_ASSERT(gpr_asprintf( + &out, "%ld ms exceeds max acceptable latency: %ld ms.", + elapsed_ms, max_acceptable_per_iteration_latency_ms) != -1); + std::string debug_string(out); + gpr_free(out); + return std::make_tuple(false, elapsed_ms, debug_string); + } else { + return std::make_tuple(true, elapsed_ms, ""); + } +} + +void InteropClient::PerformSoakTest( + const bool reset_channel_per_iteration, const int32_t soak_iterations, + const int32_t max_failures, + const int64_t max_acceptable_per_iteration_latency_ms) { + std::vector> results; + std::vector latencies_ms; for (int i = 0; i < soak_iterations; ++i) { - if (!PerformLargeUnary(&request, &response)) { - gpr_log(GPR_ERROR, "rpc_soak test failed on iteration %d", i); - return false; + auto result = PerformOneSoakTestIteration( + reset_channel_per_iteration, max_acceptable_per_iteration_latency_ms); + results.push_back(result); + latencies_ms.push_back(std::get<1>(result)); + } + int total_failures = 0; + for (size_t i = 0; i < results.size(); i++) { + bool success = std::get<0>(results[i]); + grpc_millis elapsed_ms = std::get<1>(results[i]); + std::string debug_string = std::get<2>(results[i]); + if (!success) { + gpr_log(GPR_DEBUG, "soak iteration:%ld elapsed_ms:%ld failed: %s", i, + elapsed_ms, debug_string.c_str()); + total_failures++; + } else { + gpr_log(GPR_DEBUG, "soak iteration:%ld elapsed_ms:%ld succeeded", i, + elapsed_ms); } } + std::sort(latencies_ms.begin(), latencies_ms.end()); + grpc_millis latency_ms_median = latencies_ms.size() >= 2 + ? latencies_ms[latencies_ms.size() / 2] + : latencies_ms.back(); + grpc_millis latency_ms_90th = + latencies_ms.size() >= 10 ? latencies_ms[(latencies_ms.size() / 10) * 9] + : latencies_ms.back(); + grpc_millis latency_ms_worst = latencies_ms.back(); + if (total_failures > max_failures) { + gpr_log(GPR_ERROR, + "soak test ran:%d iterations. total_failures:%d exceeds " + "max_failures_threshold:%d. " + "median_soak_iteration_latency:%ld ms. " + "90th_soak_iteration_latency:%ld ms. " + "worst_soak_iteration_latency:%ld ms. " + "See breakdown above for which iterations succeeded, failed, and " + "why for more info.", + soak_iterations, total_failures, max_failures, latency_ms_median, + latency_ms_90th, latency_ms_worst); + GPR_ASSERT(0); + } else { + gpr_log(GPR_INFO, + "soak test ran:%d iterations. total_failures:%d is within " + "max_failures_threshold:%d. " + "median_soak_iteration_latency:%ld ms. " + "90th_soak_iteration_latency:%ld ms. " + "worst_soak_iteration_latency:%ld ms. " + "See breakdown above for which iterations succeeded, failed, and " + "why for more info.", + soak_iterations, total_failures, max_failures, latency_ms_median, + latency_ms_90th, latency_ms_worst); + } +} + +bool InteropClient::DoRpcSoakTest( + int32_t soak_iterations, int32_t max_failures, + int64_t max_acceptable_per_iteration_latency_ms) { + gpr_log(GPR_DEBUG, "Sending %d RPCs...", soak_iterations); + GPR_ASSERT(soak_iterations > 0); + PerformSoakTest(false /* reset channel per iteration */, soak_iterations, + max_failures, max_acceptable_per_iteration_latency_ms); gpr_log(GPR_DEBUG, "rpc_soak test done."); return true; } -bool InteropClient::DoChannelSoakTest(int32_t soak_iterations) { +bool InteropClient::DoChannelSoakTest( + int32_t soak_iterations, int32_t max_failures, + int64_t max_acceptable_per_iteration_latency_ms) { gpr_log(GPR_DEBUG, "Sending %d RPCs, tearing down the channel each time...", soak_iterations); GPR_ASSERT(soak_iterations > 0); - SimpleRequest request; - SimpleResponse response; - for (int i = 0; i < soak_iterations; ++i) { - serviceStub_.ResetChannel(); - gpr_log(GPR_DEBUG, "Starting channel_soak iteration %d...", i); - if (!PerformLargeUnary(&request, &response)) { - gpr_log(GPR_ERROR, "channel_soak test failed on iteration %d", i); - return false; - } - gpr_log(GPR_DEBUG, "channel_soak iteration %d finished", i); - } + PerformSoakTest(true /* reset channel per iteration */, soak_iterations, + max_failures, max_acceptable_per_iteration_latency_ms); gpr_log(GPR_DEBUG, "channel_soak test done."); return true; } diff --git a/test/cpp/interop/interop_client.h b/test/cpp/interop/interop_client.h index 483d9becac2..42da648f336 100644 --- a/test/cpp/interop/interop_client.h +++ b/test/cpp/interop/interop_client.h @@ -23,6 +23,7 @@ #include #include +#include "src/core/lib/iomgr/exec_ctx.h" #include "src/proto/grpc/testing/messages.pb.h" #include "src/proto/grpc/testing/test.grpc.pb.h" @@ -76,8 +77,10 @@ class InteropClient { // not implemented cross-language. They are considered experimental for now, // but at some point in the future, might be codified and implemented in all // languages - bool DoChannelSoakTest(int32_t soak_iterations); - bool DoRpcSoakTest(int32_t soak_iterations); + bool DoChannelSoakTest(int32_t soak_iterations, int32_t max_failures, + int64_t max_acceptable_per_iteration_latency_ms); + bool DoRpcSoakTest(int32_t soak_iterations, int32_t max_failures, + int64_t max_acceptable_per_iteration_latency_ms); bool DoLongLivedChannelTest(int32_t soak_iterations, int32_t iteration_interval); @@ -128,6 +131,15 @@ class InteropClient { const grpc::string& optional_debug_string); bool TransientFailureOrAbort(); + std::tuple PerformOneSoakTestIteration( + const bool reset_channel, + const int64_t max_acceptable_per_iteration_latency_ms); + + void PerformSoakTest(const bool reset_channel_per_iteration, + const int32_t soak_iterations, + const int32_t max_failures, + const int64_t max_acceptable_per_iteration_latency_ms); + ServiceStub serviceStub_; /// If true, abort() is not called for transient failures bool do_not_abort_on_transient_failures_; From bbdfde55514ec9285c0ff60286f16639b6cea326 Mon Sep 17 00:00:00 2001 From: Alexander Polcyn Date: Tue, 5 May 2020 00:44:07 -0700 Subject: [PATCH 702/758] Include the relevant query type and name in all c-ares DNS resolution errors --- .../resolver/dns/c_ares/grpc_ares_wrapper.cc | 107 +++++++++++++----- 1 file changed, 76 insertions(+), 31 deletions(-) diff --git a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc index 42df9af6c57..467e7fa76aa 100644 --- a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +++ b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc @@ -75,6 +75,8 @@ struct grpc_ares_request { grpc_error* error; }; +// TODO(apolcyn): make grpc_ares_hostbyname_request a sub-class +// of GrpcAresQuery. typedef struct grpc_ares_hostbyname_request { /** following members are set in create_hostbyname_request_locked */ @@ -86,8 +88,37 @@ typedef struct grpc_ares_hostbyname_request { uint16_t port; /** is it a grpclb address */ bool is_balancer; + /** for logging and errors: the query type ("A" or "AAAA") */ + const char* qtype; } grpc_ares_hostbyname_request; +static void grpc_ares_request_ref_locked(grpc_ares_request* r); +static void grpc_ares_request_unref_locked(grpc_ares_request* r); + +// TODO(apolcyn): as a part of C++-ification, find a way to +// organize per-query and per-resolution information in such a way +// that doesn't involve allocating a number of different data +// structures. +class GrpcAresQuery { + public: + explicit GrpcAresQuery(grpc_ares_request* r, const std::string& name) + : r_(r), name_(name) { + grpc_ares_request_ref_locked(r_); + } + + ~GrpcAresQuery() { grpc_ares_request_unref_locked(r_); } + + grpc_ares_request* parent_request() { return r_; } + + const std::string& name() { return name_; } + + private: + /* the top level request instance */ + grpc_ares_request* r_; + /** for logging and errors */ + const std::string name_; +}; + static void log_address_sorting_list(const grpc_ares_request* r, const ServerAddressList& addresses, const char* input_output_str) { @@ -162,19 +193,21 @@ void grpc_ares_complete_request_locked(grpc_ares_request* r) { grpc_core::ExecCtx::Run(DEBUG_LOCATION, r->on_done, r->error); } +/* Note that the returned object takes a reference to qtype, so + * qtype must outlive it. */ static grpc_ares_hostbyname_request* create_hostbyname_request_locked( grpc_ares_request* parent_request, const char* host, uint16_t port, - bool is_balancer) { + bool is_balancer, const char* qtype) { GRPC_CARES_TRACE_LOG( "request:%p create_hostbyname_request_locked host:%s port:%d " - "is_balancer:%d", - parent_request, host, port, is_balancer); - grpc_ares_hostbyname_request* hr = static_cast( - gpr_zalloc(sizeof(grpc_ares_hostbyname_request))); + "is_balancer:%d qtype:%s", + parent_request, host, port, is_balancer, qtype); + grpc_ares_hostbyname_request* hr = new grpc_ares_hostbyname_request(); hr->parent_request = parent_request; hr->host = gpr_strdup(host); hr->port = port; hr->is_balancer = is_balancer; + hr->qtype = qtype; grpc_ares_request_ref_locked(parent_request); return hr; } @@ -183,7 +216,7 @@ static void destroy_hostbyname_request_locked( grpc_ares_hostbyname_request* hr) { grpc_ares_request_unref_locked(hr->parent_request); gpr_free(hr->host); - gpr_free(hr); + delete hr; } static void on_hostbyname_done_locked(void* arg, int status, int /*timeouts*/, @@ -193,8 +226,8 @@ static void on_hostbyname_done_locked(void* arg, int status, int /*timeouts*/, grpc_ares_request* r = hr->parent_request; if (status == ARES_SUCCESS) { GRPC_CARES_TRACE_LOG( - "request:%p on_hostbyname_done_locked host=%s ARES_SUCCESS", r, - hr->host); + "request:%p on_hostbyname_done_locked qtype=%s host=%s ARES_SUCCESS", r, + hr->qtype, hr->host); std::unique_ptr* address_list_ptr = hr->is_balancer ? r->balancer_addresses_out : r->addresses_out; if (*address_list_ptr == nullptr) { @@ -248,10 +281,12 @@ static void on_hostbyname_done_locked(void* arg, int status, int /*timeouts*/, } } else { char* error_msg; - gpr_asprintf(&error_msg, "C-ares status is not ARES_SUCCESS: %s", - ares_strerror(status)); - GRPC_CARES_TRACE_LOG("request:%p on_hostbyname_done_locked host=%s %s", r, - hr->host, error_msg); + gpr_asprintf(&error_msg, + "C-ares status is not ARES_SUCCESS " + "qtype=%s name=%s is_balancer=%d: %s", + hr->qtype, hr->host, hr->is_balancer, ares_strerror(status)); + GRPC_CARES_TRACE_LOG("request:%p on_hostbyname_done_locked: %s", r, + error_msg); grpc_error* error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(error_msg); gpr_free(error_msg); r->error = grpc_error_add_child(error, r->error); @@ -261,9 +296,12 @@ static void on_hostbyname_done_locked(void* arg, int status, int /*timeouts*/, static void on_srv_query_done_locked(void* arg, int status, int /*timeouts*/, unsigned char* abuf, int alen) { - grpc_ares_request* r = static_cast(arg); + GrpcAresQuery* q = static_cast(arg); + grpc_ares_request* r = q->parent_request(); if (status == ARES_SUCCESS) { - GRPC_CARES_TRACE_LOG("request:%p on_srv_query_done_locked ARES_SUCCESS", r); + GRPC_CARES_TRACE_LOG( + "request:%p on_srv_query_done_locked name=%s ARES_SUCCESS", r, + q->name().c_str()); struct ares_srv_reply* reply; const int parse_status = ares_parse_srv_reply(abuf, alen, &reply); GRPC_CARES_TRACE_LOG("request:%p ares_parse_srv_reply: %d", r, @@ -275,12 +313,13 @@ static void on_srv_query_done_locked(void* arg, int status, int /*timeouts*/, srv_it = srv_it->next) { if (grpc_ares_query_ipv6()) { grpc_ares_hostbyname_request* hr = create_hostbyname_request_locked( - r, srv_it->host, htons(srv_it->port), true /* is_balancer */); + r, srv_it->host, htons(srv_it->port), true /* is_balancer */, + "AAAA"); ares_gethostbyname(*channel, hr->host, AF_INET6, on_hostbyname_done_locked, hr); } grpc_ares_hostbyname_request* hr = create_hostbyname_request_locked( - r, srv_it->host, htons(srv_it->port), true /* is_balancer */); + r, srv_it->host, htons(srv_it->port), true /* is_balancer */, "A"); ares_gethostbyname(*channel, hr->host, AF_INET, on_hostbyname_done_locked, hr); grpc_ares_ev_driver_start_locked(r->ev_driver); @@ -291,15 +330,17 @@ static void on_srv_query_done_locked(void* arg, int status, int /*timeouts*/, } } else { char* error_msg; - gpr_asprintf(&error_msg, "C-ares status is not ARES_SUCCESS: %s", - ares_strerror(status)); - GRPC_CARES_TRACE_LOG("request:%p on_srv_query_done_locked %s", r, + gpr_asprintf(&error_msg, + "C-ares status is not ARES_SUCCESS " + "qtype=SRV name=%s: %s", + q->name().c_str(), ares_strerror(status)); + GRPC_CARES_TRACE_LOG("request:%p on_srv_query_done_locked: %s", r, error_msg); grpc_error* error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(error_msg); gpr_free(error_msg); r->error = grpc_error_add_child(error, r->error); } - grpc_ares_request_unref_locked(r); + delete q; } static const char g_service_config_attribute_prefix[] = "grpc_config="; @@ -307,13 +348,15 @@ static const char g_service_config_attribute_prefix[] = "grpc_config="; static void on_txt_done_locked(void* arg, int status, int /*timeouts*/, unsigned char* buf, int len) { char* error_msg; - grpc_ares_request* r = static_cast(arg); + GrpcAresQuery* q = static_cast(arg); + grpc_ares_request* r = q->parent_request(); const size_t prefix_len = sizeof(g_service_config_attribute_prefix) - 1; struct ares_txt_ext* result = nullptr; struct ares_txt_ext* reply = nullptr; grpc_error* error = GRPC_ERROR_NONE; if (status != ARES_SUCCESS) goto fail; - GRPC_CARES_TRACE_LOG("request:%p on_txt_done_locked ARES_SUCCESS", r); + GRPC_CARES_TRACE_LOG("request:%p on_txt_done_locked name=%s ARES_SUCCESS", r, + q->name().c_str()); status = ares_parse_txt_reply_ext(buf, len, &reply); if (status != ARES_SUCCESS) goto fail; // Find service config in TXT record. @@ -348,14 +391,16 @@ static void on_txt_done_locked(void* arg, int status, int /*timeouts*/, ares_free_data(reply); goto done; fail: - gpr_asprintf(&error_msg, "C-ares TXT lookup status is not ARES_SUCCESS: %s", - ares_strerror(status)); + gpr_asprintf(&error_msg, + "C-ares status is not ARES_SUCCESS " + "qtype=TXT name=%s: %s", + q->name().c_str(), ares_strerror(status)); error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(error_msg); GRPC_CARES_TRACE_LOG("request:%p on_txt_done_locked %s", r, error_msg); gpr_free(error_msg); r->error = grpc_error_add_child(error, r->error); done: - grpc_ares_request_unref_locked(r); + delete q; } void grpc_dns_lookup_ares_continue_after_check_localhost_and_ip_literals_locked( @@ -429,30 +474,30 @@ void grpc_dns_lookup_ares_continue_after_check_localhost_and_ip_literals_locked( if (grpc_ares_query_ipv6()) { hr = create_hostbyname_request_locked(r, host.c_str(), grpc_strhtons(port.c_str()), - /*is_balancer=*/false); + /*is_balancer=*/false, "AAAA"); ares_gethostbyname(*channel, hr->host, AF_INET6, on_hostbyname_done_locked, hr); } hr = create_hostbyname_request_locked(r, host.c_str(), grpc_strhtons(port.c_str()), - /*is_balancer=*/false); + /*is_balancer=*/false, "A"); ares_gethostbyname(*channel, hr->host, AF_INET, on_hostbyname_done_locked, hr); if (r->balancer_addresses_out != nullptr) { /* Query the SRV record */ - grpc_ares_request_ref_locked(r); char* service_name; gpr_asprintf(&service_name, "_grpclb._tcp.%s", host.c_str()); + GrpcAresQuery* srv_query = new GrpcAresQuery(r, service_name); ares_query(*channel, service_name, ns_c_in, ns_t_srv, - on_srv_query_done_locked, r); + on_srv_query_done_locked, srv_query); gpr_free(service_name); } if (r->service_config_json_out != nullptr) { - grpc_ares_request_ref_locked(r); char* config_name; gpr_asprintf(&config_name, "_grpc_config.%s", host.c_str()); + GrpcAresQuery* txt_query = new GrpcAresQuery(r, config_name); ares_search(*channel, config_name, ns_c_in, ns_t_txt, on_txt_done_locked, - r); + txt_query); gpr_free(config_name); } grpc_ares_ev_driver_start_locked(r->ev_driver); From 611dccb4926ae9f48e4f03e5fde39993ecf0a0b4 Mon Sep 17 00:00:00 2001 From: Vijay Pai Date: Thu, 7 May 2020 08:46:22 -0700 Subject: [PATCH 703/758] Add a test without WritesDone and reorder destruction --- .../end2end/client_callback_end2end_test.cc | 27 ++++++++++++++----- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/test/cpp/end2end/client_callback_end2end_test.cc b/test/cpp/end2end/client_callback_end2end_test.cc index c428cab8cce..4f8bfeba372 100644 --- a/test/cpp/end2end/client_callback_end2end_test.cc +++ b/test/cpp/end2end/client_callback_end2end_test.cc @@ -299,7 +299,7 @@ class ClientCallbackEnd2endTest } } - void SendGenericEchoAsBidi(int num_rpcs, int reuses) { + void SendGenericEchoAsBidi(int num_rpcs, int reuses, bool do_writes_done) { const grpc::string kMethodName("/grpc.testing.EchoTestService/Echo"); grpc::string test_string(""); for (int i = 0; i < num_rpcs; i++) { @@ -308,8 +308,8 @@ class ClientCallbackEnd2endTest ByteBuffer> { public: Client(ClientCallbackEnd2endTest* test, const grpc::string& method_name, - const grpc::string& test_str, int reuses) - : reuses_remaining_(reuses) { + const grpc::string& test_str, int reuses, bool do_writes_done) + : reuses_remaining_(reuses), do_writes_done_(do_writes_done) { activate_ = [this, test, method_name, test_str] { if (reuses_remaining_ > 0) { cli_ctx_.reset(new ClientContext); @@ -329,7 +329,11 @@ class ClientCallbackEnd2endTest }; activate_(); } - void OnWriteDone(bool /*ok*/) override { StartWritesDone(); } + void OnWriteDone(bool /*ok*/) override { + if (do_writes_done_) { + StartWritesDone(); + } + } void OnReadDone(bool /*ok*/) override { EchoResponse response; EXPECT_TRUE(ParseFromByteBuffer(&recv_buf_, &response)); @@ -355,7 +359,10 @@ class ClientCallbackEnd2endTest std::mutex mu_; std::condition_variable cv_; bool done_ = false; - } rpc{this, kMethodName, test_string, reuses}; + const bool do_writes_done_; + }; + + Client rpc(this, kMethodName, test_string, reuses, do_writes_done); rpc.Await(); } @@ -517,13 +524,19 @@ TEST_P(ClientCallbackEnd2endTest, SequentialGenericRpcs) { TEST_P(ClientCallbackEnd2endTest, SequentialGenericRpcsAsBidi) { MAYBE_SKIP_TEST; ResetStub(); - SendGenericEchoAsBidi(10, 1); + SendGenericEchoAsBidi(10, 1, /*do_writes_done=*/true); } TEST_P(ClientCallbackEnd2endTest, SequentialGenericRpcsAsBidiWithReactorReuse) { MAYBE_SKIP_TEST; ResetStub(); - SendGenericEchoAsBidi(10, 10); + SendGenericEchoAsBidi(10, 10, /*do_writes_done=*/true); +} + +TEST_P(ClientCallbackEnd2endTest, GenericRpcNoWritesDone) { + MAYBE_SKIP_TEST; + ResetStub(); + SendGenericEchoAsBidi(1, 1, /*do_writes_done=*/false); } #if GRPC_ALLOW_EXCEPTIONS From 376d8689d2fec00001a06676edf852474312cb44 Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Thu, 7 May 2020 16:55:08 -0700 Subject: [PATCH 704/758] Fix #19094 and #21947 - Fix HTTP status conversion inconsistencies --- .../filters/http/client/http_client_filter.cc | 4 +- .../chttp2/transport/chttp2_transport.cc | 3 +- src/core/lib/transport/status_conversion.cc | 20 +++------ test/core/end2end/bad_server_response_test.cc | 45 ++++++++++--------- test/core/transport/status_conversion_test.cc | 15 ++++--- 5 files changed, 42 insertions(+), 45 deletions(-) diff --git a/src/core/ext/filters/http/client/http_client_filter.cc b/src/core/ext/filters/http/client/http_client_filter.cc index d690d6f758c..a0bea07c2fc 100644 --- a/src/core/ext/filters/http/client/http_client_filter.cc +++ b/src/core/ext/filters/http/client/http_client_filter.cc @@ -31,6 +31,7 @@ #include "src/core/lib/slice/slice_internal.h" #include "src/core/lib/slice/slice_string_helpers.h" #include "src/core/lib/transport/static_metadata.h" +#include "src/core/lib/transport/status_conversion.h" #include "src/core/lib/transport/transport_impl.h" #define EXPECTED_CONTENT_TYPE "application/grpc" @@ -120,7 +121,8 @@ static grpc_error* client_filter_incoming_metadata(grpc_metadata_batch* b) { GRPC_ERROR_CREATE_FROM_STATIC_STRING( "Received http2 :status header with non-200 OK status"), GRPC_ERROR_STR_VALUE, grpc_slice_from_copied_string(val)), - GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_CANCELLED), + GRPC_ERROR_INT_GRPC_STATUS, + grpc_http2_status_to_grpc_status(atoi(val))), GRPC_ERROR_STR_GRPC_MESSAGE, grpc_slice_from_copied_string(msg)); gpr_free(val); gpr_free(msg); diff --git a/src/core/ext/transport/chttp2/transport/chttp2_transport.cc b/src/core/ext/transport/chttp2/transport/chttp2_transport.cc index cc03a406903..23985897b08 100644 --- a/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +++ b/src/core/ext/transport/chttp2/transport/chttp2_transport.cc @@ -2485,7 +2485,8 @@ static grpc_error* try_http_parsing(grpc_chttp2_transport* t) { grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING( "Trying to connect an http1.x server"), GRPC_ERROR_INT_HTTP_STATUS, response.status), - GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE); + GRPC_ERROR_INT_GRPC_STATUS, + grpc_http2_status_to_grpc_status(response.status)); } GRPC_ERROR_UNREF(parse_error); diff --git a/src/core/lib/transport/status_conversion.cc b/src/core/lib/transport/status_conversion.cc index 5f86dac078a..46c6cd8c3b0 100644 --- a/src/core/lib/transport/status_conversion.cc +++ b/src/core/lib/transport/status_conversion.cc @@ -68,29 +68,21 @@ grpc_status_code grpc_http2_status_to_grpc_status(int status) { case 200: return GRPC_STATUS_OK; case 400: - return GRPC_STATUS_INVALID_ARGUMENT; + return GRPC_STATUS_INTERNAL; case 401: return GRPC_STATUS_UNAUTHENTICATED; case 403: return GRPC_STATUS_PERMISSION_DENIED; case 404: - return GRPC_STATUS_NOT_FOUND; - case 409: - return GRPC_STATUS_ABORTED; - case 412: - return GRPC_STATUS_FAILED_PRECONDITION; - case 429: - return GRPC_STATUS_RESOURCE_EXHAUSTED; - case 499: - return GRPC_STATUS_CANCELLED; - case 500: - return GRPC_STATUS_UNKNOWN; - case 501: return GRPC_STATUS_UNIMPLEMENTED; + case 429: + return GRPC_STATUS_UNAVAILABLE; + case 502: + return GRPC_STATUS_UNAVAILABLE; case 503: return GRPC_STATUS_UNAVAILABLE; case 504: - return GRPC_STATUS_DEADLINE_EXCEEDED; + return GRPC_STATUS_UNAVAILABLE; /* everything else is unknown */ default: return GRPC_STATUS_UNKNOWN; diff --git a/test/core/end2end/bad_server_response_test.cc b/test/core/end2end/bad_server_response_test.cc index 3dac90e5225..7ee36ca4f3c 100644 --- a/test/core/end2end/bad_server_response_test.cc +++ b/test/core/end2end/bad_server_response_test.cc @@ -41,7 +41,7 @@ #include "test/core/util/test_config.h" #include "test/core/util/test_tcp_server.h" -#define HTTP1_RESP \ +#define HTTP1_RESP_400 \ "HTTP/1.0 400 Bad Request\n" \ "Content-Type: text/html; charset=UTF-8\n" \ "Content-Length: 0\n" \ @@ -309,40 +309,41 @@ int main(int argc, char** argv) { grpc_init(); /* status defined in hpack static table */ - run_test(HTTP2_RESP(204), sizeof(HTTP2_RESP(204)) - 1, GRPC_STATUS_CANCELLED, + run_test(HTTP2_RESP(204), sizeof(HTTP2_RESP(204)) - 1, GRPC_STATUS_UNKNOWN, HTTP2_DETAIL_MSG(204)); - - run_test(HTTP2_RESP(206), sizeof(HTTP2_RESP(206)) - 1, GRPC_STATUS_CANCELLED, + run_test(HTTP2_RESP(206), sizeof(HTTP2_RESP(206)) - 1, GRPC_STATUS_UNKNOWN, HTTP2_DETAIL_MSG(206)); - - run_test(HTTP2_RESP(304), sizeof(HTTP2_RESP(304)) - 1, GRPC_STATUS_CANCELLED, + run_test(HTTP2_RESP(304), sizeof(HTTP2_RESP(304)) - 1, GRPC_STATUS_UNKNOWN, HTTP2_DETAIL_MSG(304)); - - run_test(HTTP2_RESP(400), sizeof(HTTP2_RESP(400)) - 1, GRPC_STATUS_CANCELLED, + run_test(HTTP2_RESP(400), sizeof(HTTP2_RESP(400)) - 1, GRPC_STATUS_INTERNAL, HTTP2_DETAIL_MSG(400)); - - run_test(HTTP2_RESP(404), sizeof(HTTP2_RESP(404)) - 1, GRPC_STATUS_CANCELLED, - HTTP2_DETAIL_MSG(404)); - - run_test(HTTP2_RESP(500), sizeof(HTTP2_RESP(500)) - 1, GRPC_STATUS_CANCELLED, + run_test(HTTP2_RESP(404), sizeof(HTTP2_RESP(404)) - 1, + GRPC_STATUS_UNIMPLEMENTED, HTTP2_DETAIL_MSG(404)); + run_test(HTTP2_RESP(500), sizeof(HTTP2_RESP(500)) - 1, GRPC_STATUS_UNKNOWN, HTTP2_DETAIL_MSG(500)); /* status not defined in hpack static table */ - run_test(HTTP2_RESP(401), sizeof(HTTP2_RESP(401)) - 1, GRPC_STATUS_CANCELLED, - HTTP2_DETAIL_MSG(401)); - - run_test(HTTP2_RESP(403), sizeof(HTTP2_RESP(403)) - 1, GRPC_STATUS_CANCELLED, - HTTP2_DETAIL_MSG(403)); - - run_test(HTTP2_RESP(502), sizeof(HTTP2_RESP(502)) - 1, GRPC_STATUS_CANCELLED, - HTTP2_DETAIL_MSG(502)); + run_test(HTTP2_RESP(401), sizeof(HTTP2_RESP(401)) - 1, + GRPC_STATUS_UNAUTHENTICATED, HTTP2_DETAIL_MSG(401)); + run_test(HTTP2_RESP(403), sizeof(HTTP2_RESP(403)) - 1, + GRPC_STATUS_PERMISSION_DENIED, HTTP2_DETAIL_MSG(403)); + run_test(HTTP2_RESP(429), sizeof(HTTP2_RESP(429)) - 1, + GRPC_STATUS_UNAVAILABLE, HTTP2_DETAIL_MSG(429)); + run_test(HTTP2_RESP(499), sizeof(HTTP2_RESP(499)) - 1, GRPC_STATUS_UNKNOWN, + HTTP2_DETAIL_MSG(499)); + run_test(HTTP2_RESP(502), sizeof(HTTP2_RESP(502)) - 1, + GRPC_STATUS_UNAVAILABLE, HTTP2_DETAIL_MSG(502)); + run_test(HTTP2_RESP(503), sizeof(HTTP2_RESP(503)) - 1, + GRPC_STATUS_UNAVAILABLE, HTTP2_DETAIL_MSG(503)); + run_test(HTTP2_RESP(504), sizeof(HTTP2_RESP(504)) - 1, + GRPC_STATUS_UNAVAILABLE, HTTP2_DETAIL_MSG(504)); /* unparseable response */ run_test(UNPARSEABLE_RESP, sizeof(UNPARSEABLE_RESP) - 1, GRPC_STATUS_UNKNOWN, nullptr); /* http1 response */ - run_test(HTTP1_RESP, sizeof(HTTP1_RESP) - 1, GRPC_STATUS_UNAVAILABLE, + run_test(HTTP1_RESP_400, sizeof(HTTP1_RESP_400) - 1, GRPC_STATUS_INTERNAL, HTTP1_DETAIL_MSG); grpc_shutdown(); diff --git a/test/core/transport/status_conversion_test.cc b/test/core/transport/status_conversion_test.cc index 949be42aeb4..b09358bd991 100644 --- a/test/core/transport/status_conversion_test.cc +++ b/test/core/transport/status_conversion_test.cc @@ -147,17 +147,18 @@ static void test_http2_error_to_grpc_status() { static void test_http2_status_to_grpc_status() { HTTP2_STATUS_TO_GRPC_STATUS(200, GRPC_STATUS_OK); - HTTP2_STATUS_TO_GRPC_STATUS(400, GRPC_STATUS_INVALID_ARGUMENT); + HTTP2_STATUS_TO_GRPC_STATUS(400, GRPC_STATUS_INTERNAL); HTTP2_STATUS_TO_GRPC_STATUS(401, GRPC_STATUS_UNAUTHENTICATED); HTTP2_STATUS_TO_GRPC_STATUS(403, GRPC_STATUS_PERMISSION_DENIED); - HTTP2_STATUS_TO_GRPC_STATUS(404, GRPC_STATUS_NOT_FOUND); - HTTP2_STATUS_TO_GRPC_STATUS(409, GRPC_STATUS_ABORTED); - HTTP2_STATUS_TO_GRPC_STATUS(412, GRPC_STATUS_FAILED_PRECONDITION); - HTTP2_STATUS_TO_GRPC_STATUS(429, GRPC_STATUS_RESOURCE_EXHAUSTED); - HTTP2_STATUS_TO_GRPC_STATUS(499, GRPC_STATUS_CANCELLED); + HTTP2_STATUS_TO_GRPC_STATUS(404, GRPC_STATUS_UNIMPLEMENTED); + HTTP2_STATUS_TO_GRPC_STATUS(409, GRPC_STATUS_UNKNOWN); + HTTP2_STATUS_TO_GRPC_STATUS(412, GRPC_STATUS_UNKNOWN); + HTTP2_STATUS_TO_GRPC_STATUS(429, GRPC_STATUS_UNAVAILABLE); + HTTP2_STATUS_TO_GRPC_STATUS(499, GRPC_STATUS_UNKNOWN); HTTP2_STATUS_TO_GRPC_STATUS(500, GRPC_STATUS_UNKNOWN); + HTTP2_STATUS_TO_GRPC_STATUS(502, GRPC_STATUS_UNAVAILABLE); HTTP2_STATUS_TO_GRPC_STATUS(503, GRPC_STATUS_UNAVAILABLE); - HTTP2_STATUS_TO_GRPC_STATUS(504, GRPC_STATUS_DEADLINE_EXCEEDED); + HTTP2_STATUS_TO_GRPC_STATUS(504, GRPC_STATUS_UNAVAILABLE); } int main(int argc, char** argv) { From 29479667cc1bbac57950f9417b9a5d3511d9d338 Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Thu, 7 May 2020 18:13:38 -0700 Subject: [PATCH 705/758] Do not close kind/bug with stale for now --- .github/stale.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/stale.yml b/.github/stale.yml index 04f9d541a0c..5b5e1c8767b 100644 --- a/.github/stale.yml +++ b/.github/stale.yml @@ -13,6 +13,7 @@ onlyLabels: [] # Issues or Pull Requests with these labels will never be considered stale. Set to `[]` to disable exemptLabels: - "disposition/never stale" + - "kind/bug" # Set to true to ignore issues in a project (defaults to false) exemptProjects: false From b98457ff79238d590a5b012a96c397292b546326 Mon Sep 17 00:00:00 2001 From: ZhenLian Date: Thu, 7 May 2020 23:04:13 -0700 Subject: [PATCH 706/758] fix first round of feedback --- .../security/security_connector/ssl_utils.cc | 18 ++++++------- src/core/tsi/ssl_transport_security.cc | 27 +++++++------------ test/core/security/security_connector_test.cc | 4 +-- 3 files changed, 21 insertions(+), 28 deletions(-) diff --git a/src/core/lib/security/security_connector/ssl_utils.cc b/src/core/lib/security/security_connector/ssl_utils.cc index 74a7fa98768..210aafc806c 100644 --- a/src/core/lib/security/security_connector/ssl_utils.cc +++ b/src/core/lib/security/security_connector/ssl_utils.cc @@ -222,17 +222,17 @@ int grpc_ssl_cmp_target_name(absl::string_view target_name, return overridden_target_name.compare(other_overridden_target_name); } -bool isSpiffeID(absl::string_view spiffe_uri) { - if (spiffe_uri.size() > 2048) { - gpr_log(GPR_INFO, "Invalid SPIFFE ID: ID longer than 2048 bytes."); +static bool isSpiffeId(absl::string_view uri) { + // Return false without logging for a non-spiffe uri scheme. + if (!absl::StartsWith(uri, "spiffe://")) { return false; - } - std::vector splits = absl::StrSplit(spiffe_uri, '/'); - if (splits.size() < 4 || splits[0] != "spiffe:" || splits[1] != "") { - gpr_log(GPR_INFO, "Invalid SPIFFE ID: invalid format."); + }; + if (uri.size() > 2048) { + gpr_log(GPR_INFO, "Invalid SPIFFE ID: ID longer than 2048 bytes."); return false; } - if (splits[3] == "") { + std::vector splits = absl::StrSplit(uri, '/'); + if (splits.size() < 4 || splits[3] == "") { gpr_log(GPR_INFO, "Invalid SPIFFE ID: workload id is empty."); return false; } @@ -291,7 +291,7 @@ grpc_core::RefCountedPtr grpc_ssl_peer_to_auth_context( prop->value.data, prop->value.length); } else if (strcmp(prop->name, TSI_X509_URI_PEER_PROPERTY) == 0) { absl::string_view spiffe_id(prop->value.data, prop->value.length); - if (isSpiffeID(spiffe_id)) { + if (isSpiffeId(spiffe_id)) { spiffe_data = prop->value.data; spiffe_length = prop->value.length; spiffe_id_count += 1; diff --git a/src/core/tsi/ssl_transport_security.cc b/src/core/tsi/ssl_transport_security.cc index 069b9f9f90a..a258196cc5f 100644 --- a/src/core/tsi/ssl_transport_security.cc +++ b/src/core/tsi/ssl_transport_security.cc @@ -375,6 +375,16 @@ static tsi_result add_subject_alt_names_properties_to_peer( TSI_X509_SUBJECT_ALTERNATIVE_NAME_PEER_PROPERTY, reinterpret_cast(name), static_cast(name_size), &peer->properties[(*current_insert_index)++]); + if (result != TSI_OK) { + OPENSSL_free(name); + break; + } + if (subject_alt_name->type == GEN_URI) { + result = tsi_construct_string_peer_property( + TSI_X509_URI_PEER_PROPERTY, reinterpret_cast(name), + static_cast(name_size), + &peer->properties[(*current_insert_index)++]); + } OPENSSL_free(name); } else if (subject_alt_name->type == GEN_IPADD) { char ntop_buf[INET6_ADDRSTRLEN]; @@ -402,23 +412,6 @@ static tsi_result add_subject_alt_names_properties_to_peer( &peer->properties[(*current_insert_index)++]); } if (result != TSI_OK) break; - if (subject_alt_name->type == GEN_URI) { - unsigned char* name = nullptr; - int name_size; - name_size = ASN1_STRING_to_UTF8( - &name, subject_alt_name->d.uniformResourceIdentifier); - if (name_size < 0) { - gpr_log(GPR_ERROR, "Could not get utf8 from asn1 string."); - result = TSI_INTERNAL_ERROR; - break; - } - result = tsi_construct_string_peer_property( - TSI_X509_URI_PEER_PROPERTY, reinterpret_cast(name), - static_cast(name_size), - &peer->properties[(*current_insert_index)++]); - OPENSSL_free(name); - } - if (result != TSI_OK) break; } return result; } diff --git a/test/core/security/security_connector_test.cc b/test/core/security/security_connector_test.cc index 76d0ba32115..8f249bec97b 100644 --- a/test/core/security/security_connector_test.cc +++ b/test/core/security/security_connector_test.cc @@ -469,7 +469,7 @@ static void test_spiffe_id_peer_to_auth_context(void) { grpc_ssl_peer_to_auth_context(&invalid_peer, GRPC_SSL_TRANSPORT_SECURITY_TYPE); GPR_ASSERT(invalid_ctx != nullptr); - GPR_ASSERT(check_spiffe_id(invalid_ctx.get(), "", false)); + GPR_ASSERT(check_spiffe_id(invalid_ctx.get(), nullptr, false)); tsi_peer_destruct(&invalid_peer); invalid_ctx.reset(DEBUG_LOCATION, "test"); // A valid SPIFFE ID with other URI fields should be plumbed. @@ -504,7 +504,7 @@ static void test_spiffe_id_peer_to_auth_context(void) { grpc_ssl_peer_to_auth_context(&multiple_peer, GRPC_SSL_TRANSPORT_SECURITY_TYPE); GPR_ASSERT(multiple_ctx != nullptr); - GPR_ASSERT(check_spiffe_id(multiple_ctx.get(), "", false)); + GPR_ASSERT(check_spiffe_id(multiple_ctx.get(), nullptr, false)); tsi_peer_destruct(&multiple_peer); multiple_ctx.reset(DEBUG_LOCATION, "test"); } From 8c796fa7cff9e312cc67ba6666864e5d1609856f Mon Sep 17 00:00:00 2001 From: Oshiumi Date: Fri, 8 May 2020 18:21:29 +0900 Subject: [PATCH 707/758] Fix code style --- src/compiler/ruby_generator_string-inl.h | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/compiler/ruby_generator_string-inl.h b/src/compiler/ruby_generator_string-inl.h index bece54ac4dd..36f659d9973 100644 --- a/src/compiler/ruby_generator_string-inl.h +++ b/src/compiler/ruby_generator_string-inl.h @@ -119,14 +119,13 @@ inline grpc::string RubyPackage(const grpc::protobuf::FileDescriptor* file) { inline grpc::string RubyTypeOf(const grpc::protobuf::Descriptor* descriptor, const grpc::string& package) { std::string proto_type = descriptor->full_name(); - ReplacePrefix(&proto_type, package, ""); // remove the leading package if present - ReplacePrefix(&proto_type, ".", ""); // remove the leading . (no package) - + ReplacePrefix(&proto_type, package, + ""); // remove the leading package if present + ReplacePrefix(&proto_type, ".", ""); // remove the leading . (no package) if (descriptor->file()->options().has_ruby_package()) { proto_type = RubyPackage(descriptor->file()) + "." + proto_type; } grpc::string res(proto_type); - if (res.find('.') == grpc::string::npos) { return res; } else { From 5111d873f801576bee4e3aea9b9fa646eb605849 Mon Sep 17 00:00:00 2001 From: "Ville M. Vainio" Date: Fri, 8 May 2020 16:41:48 +0300 Subject: [PATCH 708/758] SkipGrpcNativeLibsCopying can now be False, false or FALSE --- src/csharp/Grpc.Core/build/net45/Grpc.Core.targets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/csharp/Grpc.Core/build/net45/Grpc.Core.targets b/src/csharp/Grpc.Core/build/net45/Grpc.Core.targets index dba38203b84..89b8f054a80 100644 --- a/src/csharp/Grpc.Core/build/net45/Grpc.Core.targets +++ b/src/csharp/Grpc.Core/build/net45/Grpc.Core.targets @@ -10,7 +10,7 @@ native libraries are used at all times. Mismatching native and managed library versions are not supported. --> - + Always grpc_csharp_ext.x86.dll From c76995176412c2d89e2bf8187a85d8675742f8e2 Mon Sep 17 00:00:00 2001 From: "Mark D. Roth" Date: Fri, 8 May 2020 08:38:52 -0700 Subject: [PATCH 709/758] Remove deprecated variant of JoinHostPort(). --- .../client_channel/lb_policy/grpclb/grpclb.cc | 9 ++-- .../lb_policy/grpclb/grpclb_channel_secure.cc | 9 ++-- .../resolver/dns/c_ares/grpc_ares_wrapper.cc | 21 +++----- .../filters/client_channel/xds/xds_client.cc | 8 ++- .../client_channel/xds/xds_client_stats.h | 5 +- src/core/lib/gprpp/host_port.cc | 22 +------- src/core/lib/gprpp/host_port.h | 10 +--- src/core/lib/iomgr/resolve_address_windows.cc | 8 --- src/core/lib/iomgr/sockaddr_utils.cc | 52 ++++++++----------- src/core/lib/iomgr/sockaddr_utils.h | 25 ++++----- .../lib/iomgr/socket_utils_common_posix.cc | 12 ++--- src/core/lib/iomgr/tcp_client_cfstream.cc | 4 +- src/core/lib/iomgr/tcp_server_custom.cc | 14 ++--- src/core/lib/iomgr/tcp_server_posix.cc | 9 ++-- .../iomgr/tcp_server_utils_posix_common.cc | 9 ++-- .../iomgr/tcp_server_utils_posix_ifaddrs.cc | 19 +++---- src/core/lib/iomgr/udp_server.cc | 18 +++---- .../CronetTests/CoreCronetEnd2EndTests.mm | 8 +-- .../tests/CronetTests/CronetUnitTests.mm | 10 ++-- .../grpcio/grpc/_cython/_cygrpc/iomgr.pxd.pxi | 7 ++- .../grpcio/grpc/_cython/_cygrpc/iomgr.pyx.pxi | 7 +-- test/core/bad_ssl/bad_ssl_test.cc | 5 +- test/core/end2end/bad_server_response_test.cc | 8 +-- test/core/end2end/connection_refused_test.cc | 7 ++- test/core/end2end/dualstack_socket_test.cc | 52 +++++++------------ test/core/end2end/fixtures/h2_census.cc | 10 ++-- test/core/end2end/fixtures/h2_compress.cc | 8 +-- test/core/end2end/fixtures/h2_fakesec.cc | 10 ++-- test/core/end2end/fixtures/h2_full+pipe.cc | 10 ++-- test/core/end2end/fixtures/h2_full+trace.cc | 10 ++-- .../end2end/fixtures/h2_full+workarounds.cc | 10 ++-- test/core/end2end/fixtures/h2_full.cc | 10 ++-- test/core/end2end/fixtures/h2_http_proxy.cc | 10 ++-- test/core/end2end/fixtures/h2_local_ipv4.cc | 6 +-- test/core/end2end/fixtures/h2_local_ipv6.cc | 6 +-- test/core/end2end/fixtures/h2_local_uds.cc | 7 +-- test/core/end2end/fixtures/h2_oauth2.cc | 10 ++-- test/core/end2end/fixtures/h2_ssl.cc | 10 ++-- .../end2end/fixtures/h2_ssl_cred_reload.cc | 10 ++-- test/core/end2end/fixtures/h2_tls.cc | 10 ++-- .../end2end/fixtures/http_proxy_fixture.cc | 8 +-- test/core/end2end/fixtures/local_util.cc | 6 +-- test/core/end2end/fixtures/local_util.h | 2 +- test/core/end2end/fixtures/proxy.cc | 20 +++---- test/core/end2end/h2_ssl_cert_test.cc | 10 ++-- .../core/end2end/h2_ssl_session_reuse_test.cc | 18 +++---- .../end2end/invalid_call_argument_test.cc | 10 ++-- test/core/fling/fling_stream_test.cc | 9 ++-- test/core/fling/fling_test.cc | 9 ++-- test/core/fling/server.cc | 8 +-- test/core/gprpp/host_port_test.cc | 8 +-- test/core/iomgr/sockaddr_utils_test.cc | 10 +--- test/core/iomgr/tcp_server_posix_test.cc | 15 +++--- ...num_external_connectivity_watchers_test.cc | 12 ++--- .../surface/sequential_connectivity_test.cc | 8 +-- test/core/surface/server_chttp2_test.cc | 8 +-- test/core/surface/server_test.cc | 9 ++-- .../alts_concurrent_connectivity_test.cc | 22 ++++---- test/cpp/naming/address_sorting_test.cc | 17 +++--- test/cpp/naming/resolver_component_test.cc | 9 ++-- test/cpp/qps/driver.cc | 9 ++-- test/cpp/qps/qps_worker.cc | 5 +- test/cpp/qps/server_async.cc | 5 +- test/cpp/qps/server_callback.cc | 5 +- test/cpp/qps/server_sync.cc | 5 +- 65 files changed, 316 insertions(+), 426 deletions(-) diff --git a/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc b/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc index 786332e3902..91f6e6ad946 100644 --- a/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +++ b/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc @@ -450,18 +450,17 @@ grpc_core::UniquePtr GrpcLb::Serverlist::AsText() const { gpr_strvec_init(&entries); for (size_t i = 0; i < serverlist_.size(); ++i) { const GrpcLbServer& server = serverlist_[i]; - char* ipport; + std::string ipport; if (server.drop) { - ipport = gpr_strdup("(drop)"); + ipport = "(drop)"; } else { grpc_resolved_address addr; ParseServer(server, &addr); - grpc_sockaddr_to_string(&ipport, &addr, false); + ipport = grpc_sockaddr_to_string(&addr, false); } char* entry; - gpr_asprintf(&entry, " %" PRIuPTR ": %s token=%s\n", i, ipport, + gpr_asprintf(&entry, " %" PRIuPTR ": %s token=%s\n", i, ipport.c_str(), server.load_balance_token); - gpr_free(ipport); gpr_strvec_add(&entries, entry); } grpc_core::UniquePtr result(gpr_strvec_flatten(&entries, nullptr)); diff --git a/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc b/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc index 92cf17ac751..ab179d30d7d 100644 --- a/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +++ b/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc @@ -53,11 +53,10 @@ RefCountedPtr CreateTargetAuthorityTable( static_cast( gpr_zalloc(sizeof(*target_authority_entries) * addresses.size())); for (size_t i = 0; i < addresses.size(); ++i) { - char* addr_str; - GPR_ASSERT( - grpc_sockaddr_to_string(&addr_str, &addresses[i].address(), true) > 0); - target_authority_entries[i].key = grpc_slice_from_copied_string(addr_str); - gpr_free(addr_str); + std::string addr_str = + grpc_sockaddr_to_string(&addresses[i].address(), true); + target_authority_entries[i].key = + grpc_slice_from_copied_string(addr_str.c_str()); const char* balancer_name = FindGrpclbBalancerNameInChannelArgs(*addresses[i].args()); target_authority_entries[i].value.reset(gpr_strdup(balancer_name)); diff --git a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc index 467e7fa76aa..aaf27d76e97 100644 --- a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +++ b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc @@ -123,21 +123,12 @@ static void log_address_sorting_list(const grpc_ares_request* r, const ServerAddressList& addresses, const char* input_output_str) { for (size_t i = 0; i < addresses.size(); i++) { - char* addr_str; - if (grpc_sockaddr_to_string(&addr_str, &addresses[i].address(), true)) { - gpr_log( - GPR_INFO, - "(c-ares resolver) request:%p c-ares address sorting: %s[%" PRIuPTR - "]=%s", - r, input_output_str, i, addr_str); - gpr_free(addr_str); - } else { - gpr_log( - GPR_INFO, - "(c-ares resolver) request:%p c-ares address sorting: %s[%" PRIuPTR - "]=", - r, input_output_str, i); - } + std::string addr_str = + grpc_sockaddr_to_string(&addresses[i].address(), true); + gpr_log(GPR_INFO, + "(c-ares resolver) request:%p c-ares address sorting: %s[%" PRIuPTR + "]=%s", + r, input_output_str, i, addr_str.c_str()); } } diff --git a/src/core/ext/filters/client_channel/xds/xds_client.cc b/src/core/ext/filters/client_channel/xds/xds_client.cc index b57aa15725d..a9a5a286670 100644 --- a/src/core/ext/filters/client_channel/xds/xds_client.cc +++ b/src/core/ext/filters/client_channel/xds/xds_client.cc @@ -1115,15 +1115,13 @@ void XdsClient::ChannelState::AdsCallState::AcceptEdsUpdate( locality.name->AsHumanReadableString(), locality.lb_weight, locality.serverlist.size()); for (size_t i = 0; i < locality.serverlist.size(); ++i) { - char* ipport; - grpc_sockaddr_to_string(&ipport, &locality.serverlist[i].address(), - false); + std::string ipport = grpc_sockaddr_to_string( + &locality.serverlist[i].address(), false); gpr_log(GPR_INFO, "[xds_client %p] Priority %" PRIuPTR ", locality %" PRIuPTR " %s, server address %" PRIuPTR ": %s", xds_client(), priority, locality_count, - locality.name->AsHumanReadableString(), i, ipport); - gpr_free(ipport); + locality.name->AsHumanReadableString(), i, ipport.c_str()); } ++locality_count; } diff --git a/src/core/ext/filters/client_channel/xds/xds_client_stats.h b/src/core/ext/filters/client_channel/xds/xds_client_stats.h index b977bd9b7df..2dab43c49bf 100644 --- a/src/core/ext/filters/client_channel/xds/xds_client_stats.h +++ b/src/core/ext/filters/client_channel/xds/xds_client_stats.h @@ -21,10 +21,13 @@ #include +#include + +#include "absl/strings/string_view.h" + #include #include "src/core/lib/gprpp/atomic.h" -#include "src/core/lib/gprpp/map.h" #include "src/core/lib/gprpp/memory.h" #include "src/core/lib/gprpp/ref_counted.h" #include "src/core/lib/gprpp/sync.h" diff --git a/src/core/lib/gprpp/host_port.cc b/src/core/lib/gprpp/host_port.cc index 5170559b1bf..77eb174702e 100644 --- a/src/core/lib/gprpp/host_port.cc +++ b/src/core/lib/gprpp/host_port.cc @@ -20,21 +20,15 @@ #include "src/core/lib/gprpp/host_port.h" -#include - #include "absl/strings/str_format.h" #include "absl/strings/string_view.h" -#include #include -#include - -#include "src/core/lib/gpr/string.h" namespace grpc_core { std::string JoinHostPort(absl::string_view host, int port) { - if (host[0] != '[' && host.rfind(':') != host.npos) { + if (!host.empty() && host[0] != '[' && host.rfind(':') != host.npos) { // IPv6 literals must be enclosed in brackets. return absl::StrFormat("[%s]:%d", host, port); } @@ -42,20 +36,6 @@ std::string JoinHostPort(absl::string_view host, int port) { return absl::StrFormat("%s:%d", host, port); } -int JoinHostPort(grpc_core::UniquePtr* out, const char* host, int port) { - char* tmp; - int ret; - if (host[0] != '[' && strchr(host, ':') != nullptr) { - /* IPv6 literals must be enclosed in brackets. */ - ret = gpr_asprintf(&tmp, "[%s]:%d", host, port); - } else { - /* Ordinary non-bracketed host:port. */ - ret = gpr_asprintf(&tmp, "%s:%d", host, port); - } - out->reset(tmp); - return ret; -} - namespace { bool DoSplitHostPort(absl::string_view name, absl::string_view* host, absl::string_view* port, bool* has_port) { diff --git a/src/core/lib/gprpp/host_port.h b/src/core/lib/gprpp/host_port.h index 1521e2b3831..2d5933508c6 100644 --- a/src/core/lib/gprpp/host_port.h +++ b/src/core/lib/gprpp/host_port.h @@ -21,9 +21,9 @@ #include -#include "absl/strings/string_view.h" +#include -#include "src/core/lib/gprpp/memory.h" +#include "absl/strings/string_view.h" namespace grpc_core { @@ -32,12 +32,6 @@ namespace grpc_core { // like an IPv6 literal. If the host is already bracketed, then additional // brackets will not be added. std::string JoinHostPort(absl::string_view host, int port); -// TODO(roth): Change all callers to use the above variant and then -// remove this one. -/* Usage is similar to gpr_asprintf: returns the number of bytes written - (excluding the final '\0'), and *out points to a string. - In the unlikely event of an error, returns -1 and sets *out to NULL. */ -int JoinHostPort(grpc_core::UniquePtr* out, const char* host, int port); /** Given a name in the form "host:port" or "[ho:st]:port", split into hostname and port number. diff --git a/src/core/lib/iomgr/resolve_address_windows.cc b/src/core/lib/iomgr/resolve_address_windows.cc index 894ea993588..2a07ed130cc 100644 --- a/src/core/lib/iomgr/resolve_address_windows.cc +++ b/src/core/lib/iomgr/resolve_address_windows.cc @@ -113,14 +113,6 @@ static grpc_error* windows_blocking_resolve_address( i++; } - { - for (i = 0; i < (*addresses)->naddrs; i++) { - char* buf; - grpc_sockaddr_to_string(&buf, &(*addresses)->addrs[i], 0); - gpr_free(buf); - } - } - done: if (result) { freeaddrinfo(result); diff --git a/src/core/lib/iomgr/sockaddr_utils.cc b/src/core/lib/iomgr/sockaddr_utils.cc index 2f8ed2225a6..c1447508f3f 100644 --- a/src/core/lib/iomgr/sockaddr_utils.cc +++ b/src/core/lib/iomgr/sockaddr_utils.cc @@ -24,6 +24,8 @@ #include #include +#include "absl/strings/str_format.h" + #include #include #include @@ -150,23 +152,18 @@ void grpc_sockaddr_make_wildcard6(int port, resolved_wild_out->len = static_cast(sizeof(grpc_sockaddr_in6)); } -int grpc_sockaddr_to_string(char** out, - const grpc_resolved_address* resolved_addr, - int normalize) { - const grpc_sockaddr* addr; +std::string grpc_sockaddr_to_string(const grpc_resolved_address* resolved_addr, + bool normalize) { const int save_errno = errno; grpc_resolved_address addr_normalized; - char ntop_buf[GRPC_INET6_ADDRSTRLEN]; - const void* ip = nullptr; - int port = 0; - uint32_t sin6_scope_id = 0; - int ret; - - *out = nullptr; if (normalize && grpc_sockaddr_is_v4mapped(resolved_addr, &addr_normalized)) { resolved_addr = &addr_normalized; } - addr = reinterpret_cast(resolved_addr->addr); + const grpc_sockaddr* addr = + reinterpret_cast(resolved_addr->addr); + const void* ip = nullptr; + int port = 0; + uint32_t sin6_scope_id = 0; if (addr->sa_family == GRPC_AF_INET) { const grpc_sockaddr_in* addr4 = reinterpret_cast(addr); @@ -179,25 +176,24 @@ int grpc_sockaddr_to_string(char** out, port = grpc_ntohs(addr6->sin6_port); sin6_scope_id = addr6->sin6_scope_id; } + char ntop_buf[GRPC_INET6_ADDRSTRLEN]; + std::string out; if (ip != nullptr && grpc_inet_ntop(addr->sa_family, ip, ntop_buf, sizeof(ntop_buf)) != nullptr) { - grpc_core::UniquePtr tmp_out; if (sin6_scope_id != 0) { - char* host_with_scope; - /* Enclose sin6_scope_id with the format defined in RFC 6784 section 2. */ - gpr_asprintf(&host_with_scope, "%s%%25%" PRIu32, ntop_buf, sin6_scope_id); - ret = grpc_core::JoinHostPort(&tmp_out, host_with_scope, port); - gpr_free(host_with_scope); + // Enclose sin6_scope_id with the format defined in RFC 6784 section 2. + std::string host_with_scope = + absl::StrFormat("%s%%25%" PRIu32, ntop_buf, sin6_scope_id); + out = grpc_core::JoinHostPort(host_with_scope, port); } else { - ret = grpc_core::JoinHostPort(&tmp_out, ntop_buf, port); + out = grpc_core::JoinHostPort(ntop_buf, port); } - *out = tmp_out.release(); } else { - ret = gpr_asprintf(out, "(sockaddr family=%d)", addr->sa_family); + out = absl::StrFormat("(sockaddr family=%d)", addr->sa_family); } /* This is probably redundant, but we wouldn't want to log the wrong error. */ errno = save_errno; - return ret; + return out; } void grpc_string_to_sockaddr(grpc_resolved_address* out, char* addr, int port) { @@ -226,15 +222,13 @@ char* grpc_sockaddr_to_uri(const grpc_resolved_address* resolved_addr) { if (scheme == nullptr || strcmp("unix", scheme) == 0) { return grpc_sockaddr_to_uri_unix_if_possible(resolved_addr); } - char* path = nullptr; + std::string path = + grpc_sockaddr_to_string(resolved_addr, false /* normalize */); char* uri_str = nullptr; - if (grpc_sockaddr_to_string(&path, resolved_addr, - false /* suppress errors */) && - scheme != nullptr) { - gpr_asprintf(&uri_str, "%s:%s", scheme, path); + if (scheme != nullptr) { + gpr_asprintf(&uri_str, "%s:%s", scheme, path.c_str()); } - gpr_free(path); - return uri_str != nullptr ? uri_str : nullptr; + return uri_str; } const char* grpc_sockaddr_get_uri_scheme( diff --git a/src/core/lib/iomgr/sockaddr_utils.h b/src/core/lib/iomgr/sockaddr_utils.h index 677f953831b..4a844e9d017 100644 --- a/src/core/lib/iomgr/sockaddr_utils.h +++ b/src/core/lib/iomgr/sockaddr_utils.h @@ -21,6 +21,8 @@ #include +#include + #include "src/core/lib/iomgr/resolve_address.h" /* Returns true if addr is an IPv4-mapped IPv6 address within the @@ -56,22 +58,13 @@ int grpc_sockaddr_get_port(const grpc_resolved_address* addr); /* Set IP port number of a sockaddr */ int grpc_sockaddr_set_port(const grpc_resolved_address* addr, int port); -/* Converts a sockaddr into a newly-allocated human-readable string. - - Currently, only the AF_INET and AF_INET6 families are recognized. - If the normalize flag is enabled, ::ffff:0.0.0.0/96 IPv6 addresses are - displayed as plain IPv4. - - Usage is similar to gpr_asprintf: returns the number of bytes written - (excluding the final '\0'), and *out points to a string which must later be - destroyed using gpr_free(). - - In the unlikely event of an error, returns -1 and sets *out to NULL. - The existing value of errno is always preserved. */ -// TODO(roth): Change this to return std::string as part of eliminating -// the old API for JoinHostPort(). -int grpc_sockaddr_to_string(char** out, const grpc_resolved_address* addr, - int normalize); +// Converts a sockaddr into a newly-allocated human-readable string. +// +// Currently, only the AF_INET and AF_INET6 families are recognized. +// If the normalize flag is enabled, ::ffff:0.0.0.0/96 IPv6 addresses are +// displayed as plain IPv4. +std::string grpc_sockaddr_to_string(const grpc_resolved_address* addr, + bool normalize); void grpc_string_to_sockaddr(grpc_resolved_address* out, char* addr, int port); diff --git a/src/core/lib/iomgr/socket_utils_common_posix.cc b/src/core/lib/iomgr/socket_utils_common_posix.cc index f368cb76f62..60432d47162 100644 --- a/src/core/lib/iomgr/socket_utils_common_posix.cc +++ b/src/core/lib/iomgr/socket_utils_common_posix.cc @@ -41,6 +41,8 @@ #include #include +#include + #include #include #include @@ -396,12 +398,10 @@ int grpc_ipv6_loopback_available(void) { static grpc_error* error_for_fd(int fd, const grpc_resolved_address* addr) { if (fd >= 0) return GRPC_ERROR_NONE; - char* addr_str; - grpc_sockaddr_to_string(&addr_str, addr, 0); - grpc_error* err = grpc_error_set_str(GRPC_OS_ERROR(errno, "socket"), - GRPC_ERROR_STR_TARGET_ADDRESS, - grpc_slice_from_copied_string(addr_str)); - gpr_free(addr_str); + std::string addr_str = grpc_sockaddr_to_string(addr, false); + grpc_error* err = grpc_error_set_str( + GRPC_OS_ERROR(errno, "socket"), GRPC_ERROR_STR_TARGET_ADDRESS, + grpc_slice_from_copied_string(addr_str.c_str())); return err; } diff --git a/src/core/lib/iomgr/tcp_client_cfstream.cc b/src/core/lib/iomgr/tcp_client_cfstream.cc index 3e701f8c13e..7461a75e658 100644 --- a/src/core/lib/iomgr/tcp_client_cfstream.cc +++ b/src/core/lib/iomgr/tcp_client_cfstream.cc @@ -143,14 +143,12 @@ static void OnOpen(void* arg, grpc_error* error) { static void ParseResolvedAddress(const grpc_resolved_address* addr, CFStringRef* host, int* port) { - char* host_port; - grpc_sockaddr_to_string(&host_port, addr, 1); + std::string host_port = grpc_sockaddr_to_string(addr, true); std::string host_string; std::string port_string; grpc_core::SplitHostPort(host_port, &host_string, &port_string); *host = CFStringCreateWithCString(NULL, host_string.c_str(), kCFStringEncodingUTF8); - gpr_free(host_port); *port = grpc_sockaddr_get_port(addr); } diff --git a/src/core/lib/iomgr/tcp_server_custom.cc b/src/core/lib/iomgr/tcp_server_custom.cc index 8de12586bbd..49781ada7b1 100644 --- a/src/core/lib/iomgr/tcp_server_custom.cc +++ b/src/core/lib/iomgr/tcp_server_custom.cc @@ -23,6 +23,8 @@ #include #include +#include + #include #include @@ -389,15 +391,9 @@ static grpc_error* tcp_server_add_port(grpc_tcp_server* s, } if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) { - char* port_string; - grpc_sockaddr_to_string(&port_string, addr, 0); - const char* str = grpc_error_string(error); - if (port_string) { - gpr_log(GPR_INFO, "SERVER %p add_port %s error=%s", s, port_string, str); - gpr_free(port_string); - } else { - gpr_log(GPR_INFO, "SERVER %p add_port error=%s", s, str); - } + gpr_log(GPR_INFO, "SERVER %p add_port %s error=%s", s, + grpc_sockaddr_to_string(addr, false).c_str(), + grpc_error_string(error)); } family = grpc_sockaddr_get_family(addr); diff --git a/src/core/lib/iomgr/tcp_server_posix.cc b/src/core/lib/iomgr/tcp_server_posix.cc index 25f2e7746bb..25dc7915adb 100644 --- a/src/core/lib/iomgr/tcp_server_posix.cc +++ b/src/core/lib/iomgr/tcp_server_posix.cc @@ -37,6 +37,8 @@ #include #include +#include + #include #include #include @@ -349,7 +351,7 @@ static grpc_error* add_wildcard_addrs_to_server(grpc_tcp_server* s, static grpc_error* clone_port(grpc_tcp_listener* listener, unsigned count) { grpc_tcp_listener* sp = nullptr; - char* addr_str; + std::string addr_str; char* name; grpc_error* err; @@ -368,8 +370,8 @@ static grpc_error* clone_port(grpc_tcp_listener* listener, unsigned count) { true, &port); if (err != GRPC_ERROR_NONE) return err; listener->server->nports++; - grpc_sockaddr_to_string(&addr_str, &listener->addr, 1); - gpr_asprintf(&name, "tcp-server-listener:%s/clone-%d", addr_str, i); + addr_str = grpc_sockaddr_to_string(&listener->addr, true); + gpr_asprintf(&name, "tcp-server-listener:%s/clone-%d", addr_str.c_str(), i); sp = static_cast(gpr_malloc(sizeof(grpc_tcp_listener))); sp->next = listener->next; listener->next = sp; @@ -389,7 +391,6 @@ static grpc_error* clone_port(grpc_tcp_listener* listener, unsigned count) { while (listener->server->tail->next != nullptr) { listener->server->tail = listener->server->tail->next; } - gpr_free(addr_str); gpr_free(name); } diff --git a/src/core/lib/iomgr/tcp_server_utils_posix_common.cc b/src/core/lib/iomgr/tcp_server_utils_posix_common.cc index da18cc39c51..6e9825622c4 100644 --- a/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +++ b/src/core/lib/iomgr/tcp_server_utils_posix_common.cc @@ -29,6 +29,8 @@ #include #include +#include + #include #include #include @@ -83,15 +85,15 @@ static grpc_error* add_socket_to_server(grpc_tcp_server* s, int fd, grpc_tcp_listener** listener) { grpc_tcp_listener* sp = nullptr; int port = -1; - char* addr_str; + std::string addr_str; char* name; grpc_error* err = grpc_tcp_server_prepare_socket(s, fd, addr, s->so_reuseport, &port); if (err == GRPC_ERROR_NONE) { GPR_ASSERT(port > 0); - grpc_sockaddr_to_string(&addr_str, addr, 1); - gpr_asprintf(&name, "tcp-server-listener:%s", addr_str); + addr_str = grpc_sockaddr_to_string(addr, true); + gpr_asprintf(&name, "tcp-server-listener:%s", addr_str.c_str()); gpr_mu_lock(&s->mu); s->nports++; GPR_ASSERT(!s->on_accept_cb && "must add ports before starting server"); @@ -114,7 +116,6 @@ static grpc_error* add_socket_to_server(grpc_tcp_server* s, int fd, sp->sibling = nullptr; GPR_ASSERT(sp->emfd); gpr_mu_unlock(&s->mu); - gpr_free(addr_str); gpr_free(name); } diff --git a/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc b/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc index 7fd86c57ebf..9a6c1694a71 100644 --- a/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +++ b/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc @@ -29,6 +29,8 @@ #include #include +#include + #include #include #include @@ -112,7 +114,6 @@ grpc_error* grpc_tcp_server_add_all_local_addrs(grpc_tcp_server* s, } for (ifa_it = ifa; ifa_it != nullptr; ifa_it = ifa_it->ifa_next) { grpc_resolved_address addr; - char* addr_str = nullptr; grpc_dualstack_mode dsmode; grpc_tcp_listener* new_sp = nullptr; const char* ifa_name = (ifa_it->ifa_name ? ifa_it->ifa_name : ""); @@ -131,30 +132,27 @@ grpc_error* grpc_tcp_server_add_all_local_addrs(grpc_tcp_server* s, err = GRPC_ERROR_CREATE_FROM_STATIC_STRING("Failed to set port"); break; } - if (grpc_sockaddr_to_string(&addr_str, &addr, 0) < 0) { - addr_str = gpr_strdup(""); - } + std::string addr_str = grpc_sockaddr_to_string(&addr, false); gpr_log(GPR_DEBUG, "Adding local addr from interface %s flags 0x%x to server: %s", - ifa_name, ifa_it->ifa_flags, addr_str); + ifa_name, ifa_it->ifa_flags, addr_str.c_str()); /* We could have multiple interfaces with the same address (e.g., bonding), so look for duplicates. */ if (find_listener_with_addr(s, &addr) != nullptr) { - gpr_log(GPR_DEBUG, "Skipping duplicate addr %s on interface %s", addr_str, - ifa_name); - gpr_free(addr_str); + gpr_log(GPR_DEBUG, "Skipping duplicate addr %s on interface %s", + addr_str.c_str(), ifa_name); continue; } if ((err = grpc_tcp_server_add_addr(s, &addr, port_index, fd_index, &dsmode, &new_sp)) != GRPC_ERROR_NONE) { char* err_str = nullptr; grpc_error* root_err; - if (gpr_asprintf(&err_str, "Failed to add listener: %s", addr_str) < 0) { + if (gpr_asprintf(&err_str, "Failed to add listener: %s", + addr_str.c_str()) < 0) { err_str = gpr_strdup("Failed to add listener"); } root_err = GRPC_ERROR_CREATE_FROM_COPIED_STRING(err_str); gpr_free(err_str); - gpr_free(addr_str); err = grpc_error_add_child(root_err, err); break; } else { @@ -166,7 +164,6 @@ grpc_error* grpc_tcp_server_add_all_local_addrs(grpc_tcp_server* s, } sp = new_sp; } - gpr_free(addr_str); } freeifaddrs(ifa); if (err != GRPC_ERROR_NONE) { diff --git a/src/core/lib/iomgr/udp_server.cc b/src/core/lib/iomgr/udp_server.cc index ce3531f3378..461f543d675 100644 --- a/src/core/lib/iomgr/udp_server.cc +++ b/src/core/lib/iomgr/udp_server.cc @@ -148,11 +148,9 @@ GrpcUdpListener::GrpcUdpListener(grpc_udp_server* server, int fd, server_(server), orphan_notified_(false), already_shutdown_(false) { - char* addr_str; char* name; - grpc_sockaddr_to_string(&addr_str, addr, 1); - gpr_asprintf(&name, "udp-server-listener:%s", addr_str); - gpr_free(addr_str); + std::string addr_str = grpc_sockaddr_to_string(addr, true); + gpr_asprintf(&name, "udp-server-listener:%s", addr_str.c_str()); emfd_ = grpc_fd_create(fd, name, true); memcpy(&addr_, addr, sizeof(grpc_resolved_address)); GPR_ASSERT(emfd_); @@ -413,10 +411,8 @@ static int prepare_socket(grpc_socket_factory* socket_factory, int fd, } if (bind_socket(socket_factory, fd, addr) < 0) { - char* addr_str; - grpc_sockaddr_to_string(&addr_str, addr, 0); - gpr_log(GPR_ERROR, "bind addr=%s: %s", addr_str, strerror(errno)); - gpr_free(addr_str); + std::string addr_str = grpc_sockaddr_to_string(addr, false); + gpr_log(GPR_ERROR, "bind addr=%s: %s", addr_str.c_str(), strerror(errno)); goto error; } @@ -583,10 +579,8 @@ int grpc_udp_server_add_port(grpc_udp_server* s, "Try to have multiple listeners on same port, but SO_REUSEPORT is " "not supported. Only create 1 listener."); } - char* addr_str; - grpc_sockaddr_to_string(&addr_str, addr, 1); - gpr_log(GPR_DEBUG, "add address: %s to server", addr_str); - gpr_free(addr_str); + std::string addr_str = grpc_sockaddr_to_string(addr, true); + gpr_log(GPR_DEBUG, "add address: %s to server", addr_str.c_str()); int allocated_port1 = -1; int allocated_port2 = -1; diff --git a/src/objective-c/tests/CronetTests/CoreCronetEnd2EndTests.mm b/src/objective-c/tests/CronetTests/CoreCronetEnd2EndTests.mm index f2715af6c98..9ed7b7d3122 100644 --- a/src/objective-c/tests/CronetTests/CoreCronetEnd2EndTests.mm +++ b/src/objective-c/tests/CronetTests/CoreCronetEnd2EndTests.mm @@ -52,7 +52,7 @@ #import "../ConfigureCronet.h" struct fullstack_secure_fixture_data { - grpc_core::UniquePtr localaddr; + std::string localaddr; }; static grpc_end2end_test_fixture chttp2_create_fixture_secure_fullstack( @@ -62,7 +62,7 @@ static grpc_end2end_test_fixture chttp2_create_fixture_secure_fullstack( fullstack_secure_fixture_data *ffd = new fullstack_secure_fixture_data(); memset(&f, 0, sizeof(f)); - grpc_core::JoinHostPort(&ffd->localaddr, "127.0.0.1", port); + ffd->localaddr = grpc_core::JoinHostPort("127.0.0.1", port); f.fixture_data = ffd; f.cq = grpc_completion_queue_create_for_next(NULL); @@ -83,7 +83,7 @@ static void cronet_init_client_secure_fullstack(grpc_end2end_test_fixture *f, stream_engine *cronetEngine) { fullstack_secure_fixture_data *ffd = (fullstack_secure_fixture_data *)f->fixture_data; f->client = - grpc_cronet_secure_channel_create(cronetEngine, ffd->localaddr.get(), client_args, NULL); + grpc_cronet_secure_channel_create(cronetEngine, ffd->localaddr.c_str(), client_args, NULL); GPR_ASSERT(f->client != NULL); } @@ -96,7 +96,7 @@ static void chttp2_init_server_secure_fullstack(grpc_end2end_test_fixture *f, } f->server = grpc_server_create(server_args, NULL); grpc_server_register_completion_queue(f->server, f->cq, NULL); - GPR_ASSERT(grpc_server_add_secure_http2_port(f->server, ffd->localaddr.get(), server_creds)); + GPR_ASSERT(grpc_server_add_secure_http2_port(f->server, ffd->localaddr.c_str(), server_creds)); grpc_server_credentials_release(server_creds); grpc_server_start(f->server); } diff --git a/src/objective-c/tests/CronetTests/CronetUnitTests.mm b/src/objective-c/tests/CronetTests/CronetUnitTests.mm index 82c995279ec..f3bf73eaa74 100644 --- a/src/objective-c/tests/CronetTests/CronetUnitTests.mm +++ b/src/objective-c/tests/CronetTests/CronetUnitTests.mm @@ -130,11 +130,10 @@ unsigned int parse_h2_length(const char *field) { {{NULL, NULL, NULL, NULL}}}}; int port = grpc_pick_unused_port_or_die(); - grpc_core::UniquePtr addr; - grpc_core::JoinHostPort(&addr, "127.0.0.1", port); + std::string addr = grpc_core::JoinHostPort("127.0.0.1", port); grpc_completion_queue *cq = grpc_completion_queue_create_for_next(NULL); stream_engine *cronetEngine = [Cronet getGlobalEngine]; - grpc_channel *client = grpc_cronet_secure_channel_create(cronetEngine, addr.get(), NULL, NULL); + grpc_channel *client = grpc_cronet_secure_channel_create(cronetEngine, addr.c_str(), NULL, NULL); cq_verifier *cqv = cq_verifier_create(cq); grpc_op ops[6]; @@ -261,11 +260,10 @@ unsigned int parse_h2_length(const char *field) { {{NULL, NULL, NULL, NULL}}}}; int port = grpc_pick_unused_port_or_die(); - grpc_core::UniquePtr addr; - grpc_core::JoinHostPort(&addr, "127.0.0.1", port); + std::string addr = grpc_core::JoinHostPort("127.0.0.1", port); grpc_completion_queue *cq = grpc_completion_queue_create_for_next(NULL); stream_engine *cronetEngine = [Cronet getGlobalEngine]; - grpc_channel *client = grpc_cronet_secure_channel_create(cronetEngine, addr.get(), args, NULL); + grpc_channel *client = grpc_cronet_secure_channel_create(cronetEngine, addr.c_str(), args, NULL); cq_verifier *cqv = cq_verifier_create(cq); grpc_op ops[6]; diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/iomgr.pxd.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/iomgr.pxd.pxi index bb934ebb77c..3b64b284aa9 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/iomgr.pxd.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/iomgr.pxd.pxi @@ -13,6 +13,9 @@ # limitations under the License. # distutils: language=c++ +from libcpp cimport bool as bool_t +from libcpp.string cimport string as cppstring + cdef extern from "grpc/impl/codegen/slice.h": struct grpc_slice_buffer: int count @@ -118,8 +121,8 @@ cdef extern from "src/core/lib/iomgr/iomgr_custom.h": cdef extern from "src/core/lib/iomgr/sockaddr_utils.h": int grpc_sockaddr_get_port(const grpc_resolved_address *addr); - int grpc_sockaddr_to_string(char **out, const grpc_resolved_address *addr, - int normalize); + cppstring grpc_sockaddr_to_string(const grpc_resolved_address *addr, + bool_t normalize); void grpc_string_to_sockaddr(grpc_resolved_address *out, char* addr, int port); int grpc_sockaddr_set_port(const grpc_resolved_address *resolved_addr, int port) diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/iomgr.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/iomgr.pyx.pxi index 9274f1c5fdb..3d6bb24f9a1 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/iomgr.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/iomgr.pyx.pxi @@ -15,6 +15,7 @@ from libc cimport string from libc.stdlib cimport malloc +from libcpp.string cimport string as cppstring cdef grpc_error* grpc_error_none(): return 0 @@ -25,10 +26,10 @@ cdef grpc_error* socket_error(str syscall, str err): return grpc_socket_error(error_bytes) cdef resolved_addr_to_tuple(grpc_resolved_address* address): - cdef char* res_str + cdef cppstring res_str port = grpc_sockaddr_get_port(address) - str_len = grpc_sockaddr_to_string(&res_str, address, 0) - byte_str = _decode(res_str[:str_len]) + res_str = grpc_sockaddr_to_string(address, False) + byte_str = _decode(res_str) if byte_str.endswith(':' + str(port)): byte_str = byte_str[:(0 - len(str(port)) - 1)] byte_str = byte_str.lstrip('[') diff --git a/test/core/bad_ssl/bad_ssl_test.cc b/test/core/bad_ssl/bad_ssl_test.cc index 4c1662d2221..9ef027f2470 100644 --- a/test/core/bad_ssl/bad_ssl_test.cc +++ b/test/core/bad_ssl/bad_ssl_test.cc @@ -145,9 +145,8 @@ int main(int argc, char** argv) { gpr_asprintf(&args[0], "%s/bad_ssl_%s_server%s", root, test, gpr_subprocess_binary_extension()); args[1] = const_cast("--bind"); - grpc_core::UniquePtr joined; - grpc_core::JoinHostPort(&joined, "::", port); - args[2] = joined.get(); + std::string joined = grpc_core::JoinHostPort("::", port); + args[2] = const_cast(joined.c_str()); svr = gpr_subprocess_create(4, (const char**)args); gpr_free(args[0]); diff --git a/test/core/end2end/bad_server_response_test.cc b/test/core/end2end/bad_server_response_test.cc index 3dac90e5225..cdff1079f03 100644 --- a/test/core/end2end/bad_server_response_test.cc +++ b/test/core/end2end/bad_server_response_test.cc @@ -71,7 +71,7 @@ #define SERVER_INCOMING_DATA_LENGTH_LOWER_THRESHOLD (size_t)200 struct rpc_state { - grpc_core::UniquePtr target; + std::string target; grpc_completion_queue* cq; grpc_channel* channel; grpc_call* call; @@ -165,9 +165,9 @@ static void start_rpc(int target_port, grpc_status_code expected_status, state.cq = grpc_completion_queue_create_for_next(nullptr); cqv = cq_verifier_create(state.cq); - grpc_core::JoinHostPort(&state.target, "127.0.0.1", target_port); + state.target = grpc_core::JoinHostPort("127.0.0.1", target_port); state.channel = - grpc_insecure_channel_create(state.target.get(), nullptr, nullptr); + grpc_insecure_channel_create(state.target.c_str(), nullptr, nullptr); grpc_slice host = grpc_slice_from_static_string("localhost"); state.call = grpc_channel_create_call( state.channel, nullptr, GRPC_PROPAGATE_DEFAULTS, state.cq, @@ -231,7 +231,7 @@ static void cleanup_rpc() { } while (ev.type != GRPC_QUEUE_SHUTDOWN); grpc_completion_queue_destroy(state.cq); grpc_channel_destroy(state.channel); - state.target.reset(); + state.target.clear(); } typedef struct { diff --git a/test/core/end2end/connection_refused_test.cc b/test/core/end2end/connection_refused_test.cc index 3bb6d2e23b6..bbbebe901b7 100644 --- a/test/core/end2end/connection_refused_test.cc +++ b/test/core/end2end/connection_refused_test.cc @@ -77,10 +77,9 @@ static void run_test(bool wait_for_ready, bool use_service_config) { /* create a call, channel to a port which will refuse connection */ int port = grpc_pick_unused_port_or_die(); - grpc_core::UniquePtr addr; - grpc_core::JoinHostPort(&addr, "127.0.0.1", port); - gpr_log(GPR_INFO, "server: %s", addr.get()); - chan = grpc_insecure_channel_create(addr.get(), args, nullptr); + std::string addr = grpc_core::JoinHostPort("127.0.0.1", port); + gpr_log(GPR_INFO, "server: %s", addr.c_str()); + chan = grpc_insecure_channel_create(addr.c_str(), args, nullptr); grpc_slice host = grpc_slice_from_static_string("nonexistant"); gpr_timespec deadline = grpc_timeout_seconds_to_deadline(2); call = diff --git a/test/core/end2end/dualstack_socket_test.cc b/test/core/end2end/dualstack_socket_test.cc index 9f0f9816635..affe6d973f8 100644 --- a/test/core/end2end/dualstack_socket_test.cc +++ b/test/core/end2end/dualstack_socket_test.cc @@ -23,6 +23,13 @@ #include +#include + +#include "absl/strings/str_format.h" +#include "absl/strings/str_join.h" +#include "absl/strings/str_split.h" +#include "absl/strings/string_view.h" + #include #include #include @@ -51,8 +58,6 @@ static void drain_cq(grpc_completion_queue* cq) { } while (ev.type != GRPC_QUEUE_SHUTDOWN); } -static void do_nothing(void* /*ignored*/) {} - static void log_resolved_addrs(const char* label, const char* hostname) { grpc_resolved_addresses* res = nullptr; grpc_error* error = grpc_blocking_resolve_address(hostname, "80", &res); @@ -97,8 +102,7 @@ void test_connect(const char* server_host, const char* client_host, int port, picked_port = 1; } - grpc_core::UniquePtr server_hostport; - grpc_core::JoinHostPort(&server_hostport, server_host, port); + std::string server_hostport = grpc_core::JoinHostPort(server_host, port); grpc_metadata_array_init(&initial_metadata_recv); grpc_metadata_array_init(&trailing_metadata_recv); @@ -110,7 +114,7 @@ void test_connect(const char* server_host, const char* client_host, int port, server = grpc_server_create(nullptr, nullptr); grpc_server_register_completion_queue(server, cq, nullptr); GPR_ASSERT((got_port = grpc_server_add_insecure_http2_port( - server, server_hostport.get())) > 0); + server, server_hostport.c_str())) > 0); if (port == 0) { port = got_port; } else { @@ -120,41 +124,25 @@ void test_connect(const char* server_host, const char* client_host, int port, cqv = cq_verifier_create(cq); /* Create client. */ - grpc_core::UniquePtr client_hostport; + std::string client_hostport; if (client_host[0] == 'i') { /* for ipv4:/ipv6: addresses, concatenate the port to each of the parts */ - size_t i; - grpc_slice uri_slice; - grpc_slice_buffer uri_parts; - char** hosts_with_port; - - uri_slice = grpc_slice_new(const_cast(client_host), - strlen(client_host), do_nothing); - grpc_slice_buffer_init(&uri_parts); - grpc_slice_split(uri_slice, ",", &uri_parts); - hosts_with_port = - static_cast(gpr_malloc(sizeof(char*) * uri_parts.count)); - for (i = 0; i < uri_parts.count; i++) { - char* uri_part_str = grpc_slice_to_c_string(uri_parts.slices[i]); - gpr_asprintf(&hosts_with_port[i], "%s:%d", uri_part_str, port); - gpr_free(uri_part_str); - } - client_hostport.reset(gpr_strjoin_sep((const char**)hosts_with_port, - uri_parts.count, ",", nullptr)); - for (i = 0; i < uri_parts.count; i++) { - gpr_free(hosts_with_port[i]); + std::vector uri_parts = + absl::StrSplit(client_host, ",", absl::SkipEmpty()); + std::vector hosts_with_port; + hosts_with_port.reserve(uri_parts.size()); + for (const absl::string_view& uri_part : uri_parts) { + hosts_with_port.push_back(absl::StrFormat("%s:%d", uri_part, port)); } - gpr_free(hosts_with_port); - grpc_slice_buffer_destroy(&uri_parts); - grpc_slice_unref(uri_slice); + client_hostport = absl::StrJoin(hosts_with_port, ","); } else { - grpc_core::JoinHostPort(&client_hostport, client_host, port); + client_hostport = grpc_core::JoinHostPort(client_host, port); } client = - grpc_insecure_channel_create(client_hostport.get(), nullptr, nullptr); + grpc_insecure_channel_create(client_hostport.c_str(), nullptr, nullptr); gpr_log(GPR_INFO, "Testing with server=%s client=%s (expecting %s)", - server_hostport.get(), client_hostport.get(), + server_hostport.c_str(), client_hostport.c_str(), expect_ok ? "success" : "failure"); log_resolved_addrs("server resolved addr", server_host); log_resolved_addrs("client resolved addr", client_host); diff --git a/test/core/end2end/fixtures/h2_census.cc b/test/core/end2end/fixtures/h2_census.cc index afabae10966..2e8429669df 100644 --- a/test/core/end2end/fixtures/h2_census.cc +++ b/test/core/end2end/fixtures/h2_census.cc @@ -36,7 +36,7 @@ #include "test/core/util/test_config.h" struct fullstack_fixture_data { - grpc_core::UniquePtr localaddr; + std::string localaddr; }; static grpc_end2end_test_fixture chttp2_create_fixture_fullstack( @@ -45,7 +45,7 @@ static grpc_end2end_test_fixture chttp2_create_fixture_fullstack( int port = grpc_pick_unused_port_or_die(); fullstack_fixture_data* ffd = new fullstack_fixture_data(); memset(&f, 0, sizeof(f)); - grpc_core::JoinHostPort(&ffd->localaddr, "localhost", port); + ffd->localaddr = grpc_core::JoinHostPort("localhost", port); f.fixture_data = ffd; f.cq = grpc_completion_queue_create_for_next(nullptr); @@ -68,8 +68,8 @@ void chttp2_init_client_fullstack(grpc_end2end_test_fixture* f, static_cast(f->fixture_data); grpc_arg arg = make_census_enable_arg(); client_args = grpc_channel_args_copy_and_add(client_args, &arg, 1); - f->client = - grpc_insecure_channel_create(ffd->localaddr.get(), client_args, nullptr); + f->client = grpc_insecure_channel_create(ffd->localaddr.c_str(), client_args, + nullptr); GPR_ASSERT(f->client); { grpc_core::ExecCtx exec_ctx; @@ -93,7 +93,7 @@ void chttp2_init_server_fullstack(grpc_end2end_test_fixture* f, } grpc_server_register_completion_queue(f->server, f->cq, nullptr); GPR_ASSERT( - grpc_server_add_insecure_http2_port(f->server, ffd->localaddr.get())); + grpc_server_add_insecure_http2_port(f->server, ffd->localaddr.c_str())); grpc_server_start(f->server); } diff --git a/test/core/end2end/fixtures/h2_compress.cc b/test/core/end2end/fixtures/h2_compress.cc index a0a7c298234..9bc359a8e77 100644 --- a/test/core/end2end/fixtures/h2_compress.cc +++ b/test/core/end2end/fixtures/h2_compress.cc @@ -41,7 +41,7 @@ struct fullstack_compression_fixture_data { grpc_channel_args_destroy(client_args_compression); grpc_channel_args_destroy(server_args_compression); } - grpc_core::UniquePtr localaddr; + std::string localaddr; grpc_channel_args* client_args_compression = nullptr; grpc_channel_args* server_args_compression = nullptr; }; @@ -52,7 +52,7 @@ static grpc_end2end_test_fixture chttp2_create_fixture_fullstack_compression( int port = grpc_pick_unused_port_or_die(); fullstack_compression_fixture_data* ffd = new fullstack_compression_fixture_data(); - grpc_core::JoinHostPort(&ffd->localaddr, "localhost", port); + ffd->localaddr = grpc_core::JoinHostPort("localhost", port); memset(&f, 0, sizeof(f)); f.fixture_data = ffd; @@ -74,7 +74,7 @@ void chttp2_init_client_fullstack_compression(grpc_end2end_test_fixture* f, grpc_channel_args_set_channel_default_compression_algorithm( client_args, GRPC_COMPRESS_GZIP); f->client = grpc_insecure_channel_create( - ffd->localaddr.get(), ffd->client_args_compression, nullptr); + ffd->localaddr.c_str(), ffd->client_args_compression, nullptr); } void chttp2_init_server_fullstack_compression(grpc_end2end_test_fixture* f, @@ -94,7 +94,7 @@ void chttp2_init_server_fullstack_compression(grpc_end2end_test_fixture* f, f->server = grpc_server_create(ffd->server_args_compression, nullptr); grpc_server_register_completion_queue(f->server, f->cq, nullptr); GPR_ASSERT( - grpc_server_add_insecure_http2_port(f->server, ffd->localaddr.get())); + grpc_server_add_insecure_http2_port(f->server, ffd->localaddr.c_str())); grpc_server_start(f->server); } diff --git a/test/core/end2end/fixtures/h2_fakesec.cc b/test/core/end2end/fixtures/h2_fakesec.cc index 6a8ba43e3d6..099bf0d8eef 100644 --- a/test/core/end2end/fixtures/h2_fakesec.cc +++ b/test/core/end2end/fixtures/h2_fakesec.cc @@ -31,7 +31,7 @@ #include "test/core/util/test_config.h" struct fullstack_secure_fixture_data { - grpc_core::UniquePtr localaddr; + std::string localaddr; }; static grpc_end2end_test_fixture chttp2_create_fixture_secure_fullstack( @@ -40,7 +40,7 @@ static grpc_end2end_test_fixture chttp2_create_fixture_secure_fullstack( int port = grpc_pick_unused_port_or_die(); fullstack_secure_fixture_data* ffd = new fullstack_secure_fixture_data(); memset(&f, 0, sizeof(f)); - grpc_core::JoinHostPort(&ffd->localaddr, "localhost", port); + ffd->localaddr = grpc_core::JoinHostPort("localhost", port); f.fixture_data = ffd; f.cq = grpc_completion_queue_create_for_next(nullptr); @@ -63,7 +63,7 @@ static void chttp2_init_client_secure_fullstack( grpc_channel_credentials* creds) { fullstack_secure_fixture_data* ffd = static_cast(f->fixture_data); - f->client = grpc_secure_channel_create(creds, ffd->localaddr.get(), + f->client = grpc_secure_channel_create(creds, ffd->localaddr.c_str(), client_args, nullptr); GPR_ASSERT(f->client != nullptr); grpc_channel_credentials_release(creds); @@ -79,8 +79,8 @@ static void chttp2_init_server_secure_fullstack( } f->server = grpc_server_create(server_args, nullptr); grpc_server_register_completion_queue(f->server, f->cq, nullptr); - GPR_ASSERT(grpc_server_add_secure_http2_port(f->server, ffd->localaddr.get(), - server_creds)); + GPR_ASSERT(grpc_server_add_secure_http2_port( + f->server, ffd->localaddr.c_str(), server_creds)); grpc_server_credentials_release(server_creds); grpc_server_start(f->server); } diff --git a/test/core/end2end/fixtures/h2_full+pipe.cc b/test/core/end2end/fixtures/h2_full+pipe.cc index a9807e620de..dd5ae5ba70a 100644 --- a/test/core/end2end/fixtures/h2_full+pipe.cc +++ b/test/core/end2end/fixtures/h2_full+pipe.cc @@ -41,7 +41,7 @@ #include "test/core/util/test_config.h" struct fullstack_fixture_data { - grpc_core::UniquePtr localaddr; + std::string localaddr; }; static grpc_end2end_test_fixture chttp2_create_fixture_fullstack( @@ -51,7 +51,7 @@ static grpc_end2end_test_fixture chttp2_create_fixture_fullstack( fullstack_fixture_data* ffd = new fullstack_fixture_data(); memset(&f, 0, sizeof(f)); - grpc_core::JoinHostPort(&ffd->localaddr, "localhost", port); + ffd->localaddr = grpc_core::JoinHostPort("localhost", port); f.fixture_data = ffd; f.cq = grpc_completion_queue_create_for_next(nullptr); @@ -64,8 +64,8 @@ void chttp2_init_client_fullstack(grpc_end2end_test_fixture* f, grpc_channel_args* client_args) { fullstack_fixture_data* ffd = static_cast(f->fixture_data); - f->client = - grpc_insecure_channel_create(ffd->localaddr.get(), client_args, nullptr); + f->client = grpc_insecure_channel_create(ffd->localaddr.c_str(), client_args, + nullptr); GPR_ASSERT(f->client); } @@ -79,7 +79,7 @@ void chttp2_init_server_fullstack(grpc_end2end_test_fixture* f, f->server = grpc_server_create(server_args, nullptr); grpc_server_register_completion_queue(f->server, f->cq, nullptr); GPR_ASSERT( - grpc_server_add_insecure_http2_port(f->server, ffd->localaddr.get())); + grpc_server_add_insecure_http2_port(f->server, ffd->localaddr.c_str())); grpc_server_start(f->server); } diff --git a/test/core/end2end/fixtures/h2_full+trace.cc b/test/core/end2end/fixtures/h2_full+trace.cc index 64fdca78a4a..68cf39a4c38 100644 --- a/test/core/end2end/fixtures/h2_full+trace.cc +++ b/test/core/end2end/fixtures/h2_full+trace.cc @@ -41,7 +41,7 @@ #include "test/core/util/test_config.h" struct fullstack_fixture_data { - grpc_core::UniquePtr localaddr; + std::string localaddr; }; static grpc_end2end_test_fixture chttp2_create_fixture_fullstack( @@ -51,7 +51,7 @@ static grpc_end2end_test_fixture chttp2_create_fixture_fullstack( fullstack_fixture_data* ffd = new fullstack_fixture_data(); memset(&f, 0, sizeof(f)); - grpc_core::JoinHostPort(&ffd->localaddr, "localhost", port); + ffd->localaddr = grpc_core::JoinHostPort("localhost", port); f.fixture_data = ffd; f.cq = grpc_completion_queue_create_for_next(nullptr); @@ -64,8 +64,8 @@ void chttp2_init_client_fullstack(grpc_end2end_test_fixture* f, grpc_channel_args* client_args) { fullstack_fixture_data* ffd = static_cast(f->fixture_data); - f->client = - grpc_insecure_channel_create(ffd->localaddr.get(), client_args, nullptr); + f->client = grpc_insecure_channel_create(ffd->localaddr.c_str(), client_args, + nullptr); GPR_ASSERT(f->client); } @@ -79,7 +79,7 @@ void chttp2_init_server_fullstack(grpc_end2end_test_fixture* f, f->server = grpc_server_create(server_args, nullptr); grpc_server_register_completion_queue(f->server, f->cq, nullptr); GPR_ASSERT( - grpc_server_add_insecure_http2_port(f->server, ffd->localaddr.get())); + grpc_server_add_insecure_http2_port(f->server, ffd->localaddr.c_str())); grpc_server_start(f->server); } diff --git a/test/core/end2end/fixtures/h2_full+workarounds.cc b/test/core/end2end/fixtures/h2_full+workarounds.cc index d524175925a..13c1f1fa181 100644 --- a/test/core/end2end/fixtures/h2_full+workarounds.cc +++ b/test/core/end2end/fixtures/h2_full+workarounds.cc @@ -40,7 +40,7 @@ static char* workarounds_arg[GRPC_MAX_WORKAROUND_ID] = { const_cast(GRPC_ARG_WORKAROUND_CRONET_COMPRESSION)}; struct fullstack_fixture_data { - grpc_core::UniquePtr localaddr; + std::string localaddr; }; static grpc_end2end_test_fixture chttp2_create_fixture_fullstack( @@ -49,7 +49,7 @@ static grpc_end2end_test_fixture chttp2_create_fixture_fullstack( int port = grpc_pick_unused_port_or_die(); fullstack_fixture_data* ffd = new fullstack_fixture_data(); memset(&f, 0, sizeof(f)); - grpc_core::JoinHostPort(&ffd->localaddr, "localhost", port); + ffd->localaddr = grpc_core::JoinHostPort("localhost", port); f.fixture_data = ffd; f.cq = grpc_completion_queue_create_for_next(nullptr); f.shutdown_cq = grpc_completion_queue_create_for_pluck(nullptr); @@ -60,8 +60,8 @@ void chttp2_init_client_fullstack(grpc_end2end_test_fixture* f, grpc_channel_args* client_args) { fullstack_fixture_data* ffd = static_cast(f->fixture_data); - f->client = - grpc_insecure_channel_create(ffd->localaddr.get(), client_args, nullptr); + f->client = grpc_insecure_channel_create(ffd->localaddr.c_str(), client_args, + nullptr); GPR_ASSERT(f->client); } @@ -85,7 +85,7 @@ void chttp2_init_server_fullstack(grpc_end2end_test_fixture* f, f->server = grpc_server_create(server_args_new, nullptr); grpc_server_register_completion_queue(f->server, f->cq, nullptr); GPR_ASSERT( - grpc_server_add_insecure_http2_port(f->server, ffd->localaddr.get())); + grpc_server_add_insecure_http2_port(f->server, ffd->localaddr.c_str())); grpc_server_start(f->server); grpc_channel_args_destroy(server_args_new); } diff --git a/test/core/end2end/fixtures/h2_full.cc b/test/core/end2end/fixtures/h2_full.cc index 485c792162c..16c9128e0a8 100644 --- a/test/core/end2end/fixtures/h2_full.cc +++ b/test/core/end2end/fixtures/h2_full.cc @@ -35,7 +35,7 @@ #include "test/core/util/test_config.h" struct fullstack_fixture_data { - grpc_core::UniquePtr localaddr; + std::string localaddr; }; static grpc_end2end_test_fixture chttp2_create_fixture_fullstack( @@ -45,7 +45,7 @@ static grpc_end2end_test_fixture chttp2_create_fixture_fullstack( fullstack_fixture_data* ffd = new fullstack_fixture_data(); memset(&f, 0, sizeof(f)); - grpc_core::JoinHostPort(&ffd->localaddr, "localhost", port); + ffd->localaddr = grpc_core::JoinHostPort("localhost", port); f.fixture_data = ffd; f.cq = grpc_completion_queue_create_for_next(nullptr); @@ -58,8 +58,8 @@ void chttp2_init_client_fullstack(grpc_end2end_test_fixture* f, grpc_channel_args* client_args) { fullstack_fixture_data* ffd = static_cast(f->fixture_data); - f->client = - grpc_insecure_channel_create(ffd->localaddr.get(), client_args, nullptr); + f->client = grpc_insecure_channel_create(ffd->localaddr.c_str(), client_args, + nullptr); GPR_ASSERT(f->client); } @@ -73,7 +73,7 @@ void chttp2_init_server_fullstack(grpc_end2end_test_fixture* f, f->server = grpc_server_create(server_args, nullptr); grpc_server_register_completion_queue(f->server, f->cq, nullptr); GPR_ASSERT( - grpc_server_add_insecure_http2_port(f->server, ffd->localaddr.get())); + grpc_server_add_insecure_http2_port(f->server, ffd->localaddr.c_str())); grpc_server_start(f->server); } diff --git a/test/core/end2end/fixtures/h2_http_proxy.cc b/test/core/end2end/fixtures/h2_http_proxy.cc index e88042d57fb..949356cab2a 100644 --- a/test/core/end2end/fixtures/h2_http_proxy.cc +++ b/test/core/end2end/fixtures/h2_http_proxy.cc @@ -39,7 +39,7 @@ struct fullstack_fixture_data { ~fullstack_fixture_data() { grpc_end2end_http_proxy_destroy(proxy); } - grpc_core::UniquePtr server_addr; + std::string server_addr; grpc_end2end_http_proxy* proxy = nullptr; }; @@ -49,7 +49,7 @@ static grpc_end2end_test_fixture chttp2_create_fixture_fullstack( memset(&f, 0, sizeof(f)); fullstack_fixture_data* ffd = new fullstack_fixture_data(); const int server_port = grpc_pick_unused_port_or_die(); - grpc_core::JoinHostPort(&ffd->server_addr, "localhost", server_port); + ffd->server_addr = grpc_core::JoinHostPort("localhost", server_port); /* Passing client_args to proxy_create for the case of checking for proxy auth */ @@ -81,8 +81,8 @@ void chttp2_init_client_fullstack(grpc_end2end_test_fixture* f, } gpr_setenv("http_proxy", proxy_uri); gpr_free(proxy_uri); - f->client = grpc_insecure_channel_create(ffd->server_addr.get(), client_args, - nullptr); + f->client = grpc_insecure_channel_create(ffd->server_addr.c_str(), + client_args, nullptr); GPR_ASSERT(f->client); } @@ -96,7 +96,7 @@ void chttp2_init_server_fullstack(grpc_end2end_test_fixture* f, f->server = grpc_server_create(server_args, nullptr); grpc_server_register_completion_queue(f->server, f->cq, nullptr); GPR_ASSERT( - grpc_server_add_insecure_http2_port(f->server, ffd->server_addr.get())); + grpc_server_add_insecure_http2_port(f->server, ffd->server_addr.c_str())); grpc_server_start(f->server); } diff --git a/test/core/end2end/fixtures/h2_local_ipv4.cc b/test/core/end2end/fixtures/h2_local_ipv4.cc index 4fbe787174d..f1748078e03 100644 --- a/test/core/end2end/fixtures/h2_local_ipv4.cc +++ b/test/core/end2end/fixtures/h2_local_ipv4.cc @@ -31,10 +31,8 @@ static grpc_end2end_test_fixture chttp2_create_fixture_fullstack_ipv4( grpc_end2end_test_fixture f = grpc_end2end_local_chttp2_create_fixture_fullstack(); int port = grpc_pick_unused_port_or_die(); - grpc_core::JoinHostPort( - &static_cast(f.fixture_data) - ->localaddr, - "127.0.0.1", port); + static_cast(f.fixture_data) + ->localaddr = grpc_core::JoinHostPort("127.0.0.1", port); return f; } diff --git a/test/core/end2end/fixtures/h2_local_ipv6.cc b/test/core/end2end/fixtures/h2_local_ipv6.cc index 3e6cdeec066..b074659de6c 100644 --- a/test/core/end2end/fixtures/h2_local_ipv6.cc +++ b/test/core/end2end/fixtures/h2_local_ipv6.cc @@ -31,10 +31,8 @@ static grpc_end2end_test_fixture chttp2_create_fixture_fullstack_ipv6( grpc_end2end_test_fixture f = grpc_end2end_local_chttp2_create_fixture_fullstack(); int port = grpc_pick_unused_port_or_die(); - grpc_core::JoinHostPort( - &static_cast(f.fixture_data) - ->localaddr, - "[::1]", port); + static_cast(f.fixture_data) + ->localaddr = grpc_core::JoinHostPort("[::1]", port); return f; } diff --git a/test/core/end2end/fixtures/h2_local_uds.cc b/test/core/end2end/fixtures/h2_local_uds.cc index 6b27c41816b..c8db899d524 100644 --- a/test/core/end2end/fixtures/h2_local_uds.cc +++ b/test/core/end2end/fixtures/h2_local_uds.cc @@ -18,6 +18,8 @@ #include +#include "absl/strings/str_format.h" + #include #include "test/core/end2end/end2end_tests.h" @@ -30,10 +32,9 @@ static grpc_end2end_test_fixture chttp2_create_fixture_fullstack_uds( grpc_channel_args* /*client_args*/, grpc_channel_args* /*server_args*/) { grpc_end2end_test_fixture f = grpc_end2end_local_chttp2_create_fixture_fullstack(); - char* out = nullptr; - gpr_asprintf(&out, "unix:/tmp/grpc_fullstack_test.%d.%d", getpid(), unique++); static_cast(f.fixture_data) - ->localaddr.reset(out); + ->localaddr = absl::StrFormat("unix:/tmp/grpc_fullstack_test.%d.%d", + getpid(), unique++); return f; } diff --git a/test/core/end2end/fixtures/h2_oauth2.cc b/test/core/end2end/fixtures/h2_oauth2.cc index 13a9e1c483b..ce37f89e478 100644 --- a/test/core/end2end/fixtures/h2_oauth2.cc +++ b/test/core/end2end/fixtures/h2_oauth2.cc @@ -39,7 +39,7 @@ static const char* client_identity_property_name = "smurf_name"; static const char* client_identity = "Brainy Smurf"; struct fullstack_secure_fixture_data { - grpc_core::UniquePtr localaddr; + std::string localaddr; }; static const grpc_metadata* find_metadata(const grpc_metadata* md, @@ -98,7 +98,7 @@ static grpc_end2end_test_fixture chttp2_create_fixture_secure_fullstack( int port = grpc_pick_unused_port_or_die(); fullstack_secure_fixture_data* ffd = new fullstack_secure_fixture_data(); memset(&f, 0, sizeof(f)); - grpc_core::JoinHostPort(&ffd->localaddr, "localhost", port); + ffd->localaddr = grpc_core::JoinHostPort("localhost", port); f.fixture_data = ffd; f.cq = grpc_completion_queue_create_for_next(nullptr); f.shutdown_cq = grpc_completion_queue_create_for_pluck(nullptr); @@ -110,7 +110,7 @@ static void chttp2_init_client_secure_fullstack( grpc_channel_credentials* creds) { fullstack_secure_fixture_data* ffd = static_cast(f->fixture_data); - f->client = grpc_secure_channel_create(creds, ffd->localaddr.get(), + f->client = grpc_secure_channel_create(creds, ffd->localaddr.c_str(), client_args, nullptr); GPR_ASSERT(f->client != nullptr); grpc_channel_credentials_release(creds); @@ -126,8 +126,8 @@ static void chttp2_init_server_secure_fullstack( } f->server = grpc_server_create(server_args, nullptr); grpc_server_register_completion_queue(f->server, f->cq, nullptr); - GPR_ASSERT(grpc_server_add_secure_http2_port(f->server, ffd->localaddr.get(), - server_creds)); + GPR_ASSERT(grpc_server_add_secure_http2_port( + f->server, ffd->localaddr.c_str(), server_creds)); grpc_server_credentials_release(server_creds); grpc_server_start(f->server); } diff --git a/test/core/end2end/fixtures/h2_ssl.cc b/test/core/end2end/fixtures/h2_ssl.cc index 9cb9aaf881a..c44e0699a32 100644 --- a/test/core/end2end/fixtures/h2_ssl.cc +++ b/test/core/end2end/fixtures/h2_ssl.cc @@ -37,7 +37,7 @@ #define SERVER_KEY_PATH "src/core/tsi/test_creds/server1.key" struct fullstack_secure_fixture_data { - grpc_core::UniquePtr localaddr; + std::string localaddr; }; static grpc_end2end_test_fixture chttp2_create_fixture_secure_fullstack( @@ -47,7 +47,7 @@ static grpc_end2end_test_fixture chttp2_create_fixture_secure_fullstack( fullstack_secure_fixture_data* ffd = new fullstack_secure_fixture_data(); memset(&f, 0, sizeof(f)); - grpc_core::JoinHostPort(&ffd->localaddr, "localhost", port); + ffd->localaddr = grpc_core::JoinHostPort("localhost", port); f.fixture_data = ffd; f.cq = grpc_completion_queue_create_for_next(nullptr); @@ -70,7 +70,7 @@ static void chttp2_init_client_secure_fullstack( grpc_channel_credentials* creds) { fullstack_secure_fixture_data* ffd = static_cast(f->fixture_data); - f->client = grpc_secure_channel_create(creds, ffd->localaddr.get(), + f->client = grpc_secure_channel_create(creds, ffd->localaddr.c_str(), client_args, nullptr); GPR_ASSERT(f->client != nullptr); grpc_channel_credentials_release(creds); @@ -86,8 +86,8 @@ static void chttp2_init_server_secure_fullstack( } f->server = grpc_server_create(server_args, nullptr); grpc_server_register_completion_queue(f->server, f->cq, nullptr); - GPR_ASSERT(grpc_server_add_secure_http2_port(f->server, ffd->localaddr.get(), - server_creds)); + GPR_ASSERT(grpc_server_add_secure_http2_port( + f->server, ffd->localaddr.c_str(), server_creds)); grpc_server_credentials_release(server_creds); grpc_server_start(f->server); } diff --git a/test/core/end2end/fixtures/h2_ssl_cred_reload.cc b/test/core/end2end/fixtures/h2_ssl_cred_reload.cc index 589f2fd3d92..96f796d0b27 100644 --- a/test/core/end2end/fixtures/h2_ssl_cred_reload.cc +++ b/test/core/end2end/fixtures/h2_ssl_cred_reload.cc @@ -37,7 +37,7 @@ #define SERVER_KEY_PATH "src/core/tsi/test_creds/server1.key" struct fullstack_secure_fixture_data { - grpc_core::UniquePtr localaddr; + std::string localaddr; bool server_credential_reloaded = false; }; @@ -82,7 +82,7 @@ static grpc_end2end_test_fixture chttp2_create_fixture_secure_fullstack( int port = grpc_pick_unused_port_or_die(); fullstack_secure_fixture_data* ffd = new fullstack_secure_fixture_data(); memset(&f, 0, sizeof(f)); - grpc_core::JoinHostPort(&ffd->localaddr, "localhost", port); + ffd->localaddr = grpc_core::JoinHostPort("localhost", port); f.fixture_data = ffd; f.cq = grpc_completion_queue_create_for_next(nullptr); @@ -105,7 +105,7 @@ static void chttp2_init_client_secure_fullstack( grpc_channel_credentials* creds) { fullstack_secure_fixture_data* ffd = static_cast(f->fixture_data); - f->client = grpc_secure_channel_create(creds, ffd->localaddr.get(), + f->client = grpc_secure_channel_create(creds, ffd->localaddr.c_str(), client_args, nullptr); GPR_ASSERT(f->client != nullptr); grpc_channel_credentials_release(creds); @@ -122,8 +122,8 @@ static void chttp2_init_server_secure_fullstack( ffd->server_credential_reloaded = false; f->server = grpc_server_create(server_args, nullptr); grpc_server_register_completion_queue(f->server, f->cq, nullptr); - GPR_ASSERT(grpc_server_add_secure_http2_port(f->server, ffd->localaddr.get(), - server_creds)); + GPR_ASSERT(grpc_server_add_secure_http2_port( + f->server, ffd->localaddr.c_str(), server_creds)); grpc_server_credentials_release(server_creds); grpc_server_start(f->server); } diff --git a/test/core/end2end/fixtures/h2_tls.cc b/test/core/end2end/fixtures/h2_tls.cc index 1a79bc96014..bacbf7efff4 100644 --- a/test/core/end2end/fixtures/h2_tls.cc +++ b/test/core/end2end/fixtures/h2_tls.cc @@ -51,7 +51,7 @@ struct fullstack_secure_fixture_data { thd_list[ind].Join(); } } - grpc_core::UniquePtr localaddr; + std::string localaddr; ThreadList thd_list; }; @@ -61,7 +61,7 @@ static grpc_end2end_test_fixture chttp2_create_fixture_secure_fullstack( int port = grpc_pick_unused_port_or_die(); fullstack_secure_fixture_data* ffd = new fullstack_secure_fixture_data(); memset(&f, 0, sizeof(f)); - grpc_core::JoinHostPort(&ffd->localaddr, "localhost", port); + ffd->localaddr = grpc_core::JoinHostPort("localhost", port); f.fixture_data = ffd; f.cq = grpc_completion_queue_create_for_next(nullptr); f.shutdown_cq = grpc_completion_queue_create_for_pluck(nullptr); @@ -82,7 +82,7 @@ static void chttp2_init_client_secure_fullstack( grpc_channel_credentials* creds) { fullstack_secure_fixture_data* ffd = static_cast(f->fixture_data); - f->client = grpc_secure_channel_create(creds, ffd->localaddr.get(), + f->client = grpc_secure_channel_create(creds, ffd->localaddr.c_str(), client_args, nullptr); GPR_ASSERT(f->client != nullptr); grpc_channel_credentials_release(creds); @@ -98,8 +98,8 @@ static void chttp2_init_server_secure_fullstack( } f->server = grpc_server_create(server_args, nullptr); grpc_server_register_completion_queue(f->server, f->cq, nullptr); - GPR_ASSERT(grpc_server_add_secure_http2_port(f->server, ffd->localaddr.get(), - server_creds)); + GPR_ASSERT(grpc_server_add_secure_http2_port( + f->server, ffd->localaddr.c_str(), server_creds)); grpc_server_credentials_release(server_creds); grpc_server_start(f->server); } diff --git a/test/core/end2end/fixtures/http_proxy_fixture.cc b/test/core/end2end/fixtures/http_proxy_fixture.cc index de8cec386d4..b827f58e795 100644 --- a/test/core/end2end/fixtures/http_proxy_fixture.cc +++ b/test/core/end2end/fixtures/http_proxy_fixture.cc @@ -61,7 +61,7 @@ struct grpc_end2end_http_proxy { gpr_ref_init(&users, 1); combiner = grpc_combiner_create(); } - grpc_core::UniquePtr proxy_name; + std::string proxy_name; grpc_core::Thread thd; grpc_tcp_server* server; grpc_channel_args* channel_args; @@ -612,8 +612,8 @@ grpc_end2end_http_proxy* grpc_end2end_http_proxy_create( grpc_end2end_http_proxy* proxy = new grpc_end2end_http_proxy(); // Construct proxy address. const int proxy_port = grpc_pick_unused_port_or_die(); - grpc_core::JoinHostPort(&proxy->proxy_name, "localhost", proxy_port); - gpr_log(GPR_INFO, "Proxy address: %s", proxy->proxy_name.get()); + proxy->proxy_name = grpc_core::JoinHostPort("localhost", proxy_port); + gpr_log(GPR_INFO, "Proxy address: %s", proxy->proxy_name.c_str()); // Create TCP server. proxy->channel_args = grpc_channel_args_copy(args); grpc_error* error = @@ -663,5 +663,5 @@ void grpc_end2end_http_proxy_destroy(grpc_end2end_http_proxy* proxy) { const char* grpc_end2end_http_proxy_get_proxy_name( grpc_end2end_http_proxy* proxy) { - return proxy->proxy_name.get(); + return proxy->proxy_name.c_str(); } diff --git a/test/core/end2end/fixtures/local_util.cc b/test/core/end2end/fixtures/local_util.cc index fadf80caf4f..73679dd5aeb 100644 --- a/test/core/end2end/fixtures/local_util.cc +++ b/test/core/end2end/fixtures/local_util.cc @@ -50,7 +50,7 @@ void grpc_end2end_local_chttp2_init_client_fullstack( grpc_channel_credentials* creds = grpc_local_credentials_create(type); grpc_end2end_local_fullstack_fixture_data* ffd = static_cast(f->fixture_data); - f->client = grpc_secure_channel_create(creds, ffd->localaddr.get(), + f->client = grpc_secure_channel_create(creds, ffd->localaddr.c_str(), client_args, nullptr); GPR_ASSERT(f->client != nullptr); grpc_channel_credentials_release(creds); @@ -98,8 +98,8 @@ void grpc_end2end_local_chttp2_init_server_fullstack( nullptr}; grpc_server_credentials_set_auth_metadata_processor(creds, processor); } - GPR_ASSERT(grpc_server_add_secure_http2_port(f->server, ffd->localaddr.get(), - creds)); + GPR_ASSERT(grpc_server_add_secure_http2_port(f->server, + ffd->localaddr.c_str(), creds)); grpc_server_credentials_release(creds); grpc_server_start(f->server); } diff --git a/test/core/end2end/fixtures/local_util.h b/test/core/end2end/fixtures/local_util.h index df204d2fab2..9e7a3345d0c 100644 --- a/test/core/end2end/fixtures/local_util.h +++ b/test/core/end2end/fixtures/local_util.h @@ -23,7 +23,7 @@ #include "src/core/lib/surface/channel.h" struct grpc_end2end_local_fullstack_fixture_data { - grpc_core::UniquePtr localaddr; + std::string localaddr; }; /* Utility functions shared by h2_local tests. */ diff --git a/test/core/end2end/fixtures/proxy.cc b/test/core/end2end/fixtures/proxy.cc index ff6ee12ca77..919d6321ed8 100644 --- a/test/core/end2end/fixtures/proxy.cc +++ b/test/core/end2end/fixtures/proxy.cc @@ -41,8 +41,8 @@ struct grpc_end2end_proxy { memset(&new_call_metadata, 0, sizeof(new_call_metadata)); } grpc_core::Thread thd; - grpc_core::UniquePtr proxy_port; - grpc_core::UniquePtr server_port; + std::string proxy_port; + std::string server_port; grpc_completion_queue* cq; grpc_server* server; grpc_channel* client; @@ -91,15 +91,15 @@ grpc_end2end_proxy* grpc_end2end_proxy_create(const grpc_end2end_proxy_def* def, grpc_end2end_proxy* proxy = new grpc_end2end_proxy(); - grpc_core::JoinHostPort(&proxy->proxy_port, "localhost", proxy_port); - grpc_core::JoinHostPort(&proxy->server_port, "localhost", server_port); + proxy->proxy_port = grpc_core::JoinHostPort("localhost", proxy_port); + proxy->server_port = grpc_core::JoinHostPort("localhost", server_port); - gpr_log(GPR_DEBUG, "PROXY ADDR:%s BACKEND:%s", proxy->proxy_port.get(), - proxy->server_port.get()); + gpr_log(GPR_DEBUG, "PROXY ADDR:%s BACKEND:%s", proxy->proxy_port.c_str(), + proxy->server_port.c_str()); proxy->cq = grpc_completion_queue_create_for_next(nullptr); - proxy->server = def->create_server(proxy->proxy_port.get(), server_args); - proxy->client = def->create_client(proxy->server_port.get(), client_args); + proxy->server = def->create_server(proxy->proxy_port.c_str(), server_args); + proxy->client = def->create_client(proxy->server_port.c_str(), client_args); grpc_server_register_completion_queue(proxy->server, proxy->cq, nullptr); grpc_server_start(proxy->server); @@ -440,9 +440,9 @@ static void thread_main(void* arg) { } const char* grpc_end2end_proxy_get_client_target(grpc_end2end_proxy* proxy) { - return proxy->proxy_port.get(); + return proxy->proxy_port.c_str(); } const char* grpc_end2end_proxy_get_server_port(grpc_end2end_proxy* proxy) { - return proxy->server_port.get(); + return proxy->server_port.c_str(); } diff --git a/test/core/end2end/h2_ssl_cert_test.cc b/test/core/end2end/h2_ssl_cert_test.cc index a555c5c4349..21c3d288a41 100644 --- a/test/core/end2end/h2_ssl_cert_test.cc +++ b/test/core/end2end/h2_ssl_cert_test.cc @@ -48,7 +48,7 @@ namespace grpc { namespace testing { struct fullstack_secure_fixture_data { - grpc_core::UniquePtr localaddr; + std::string localaddr; }; static grpc_end2end_test_fixture chttp2_create_fixture_secure_fullstack( @@ -58,7 +58,7 @@ static grpc_end2end_test_fixture chttp2_create_fixture_secure_fullstack( fullstack_secure_fixture_data* ffd = new fullstack_secure_fixture_data(); memset(&f, 0, sizeof(f)); - grpc_core::JoinHostPort(&ffd->localaddr, "localhost", port); + ffd->localaddr = grpc_core::JoinHostPort("localhost", port); f.fixture_data = ffd; f.cq = grpc_completion_queue_create_for_next(nullptr); @@ -79,7 +79,7 @@ static void chttp2_init_client_secure_fullstack( grpc_channel_credentials* creds) { fullstack_secure_fixture_data* ffd = static_cast(f->fixture_data); - f->client = grpc_secure_channel_create(creds, ffd->localaddr.get(), + f->client = grpc_secure_channel_create(creds, ffd->localaddr.c_str(), client_args, nullptr); GPR_ASSERT(f->client != nullptr); grpc_channel_credentials_release(creds); @@ -95,8 +95,8 @@ static void chttp2_init_server_secure_fullstack( } f->server = grpc_server_create(server_args, nullptr); grpc_server_register_completion_queue(f->server, f->cq, nullptr); - GPR_ASSERT(grpc_server_add_secure_http2_port(f->server, ffd->localaddr.get(), - server_creds)); + GPR_ASSERT(grpc_server_add_secure_http2_port( + f->server, ffd->localaddr.c_str(), server_creds)); grpc_server_credentials_release(server_creds); grpc_server_start(f->server); } diff --git a/test/core/end2end/h2_ssl_session_reuse_test.cc b/test/core/end2end/h2_ssl_session_reuse_test.cc index 2683f3df175..a209d8f62f8 100644 --- a/test/core/end2end/h2_ssl_session_reuse_test.cc +++ b/test/core/end2end/h2_ssl_session_reuse_test.cc @@ -48,7 +48,7 @@ void* tag(intptr_t t) { return (void*)t; } gpr_timespec five_seconds_time() { return grpc_timeout_seconds_to_deadline(5); } -grpc_server* server_create(grpc_completion_queue* cq, char* server_addr) { +grpc_server* server_create(grpc_completion_queue* cq, const char* server_addr) { grpc_slice ca_slice, cert_slice, key_slice; GPR_ASSERT(GRPC_LOG_IF_ERROR("load_file", grpc_load_file(CA_CERT_PATH, 1, &ca_slice))); @@ -80,7 +80,8 @@ grpc_server* server_create(grpc_completion_queue* cq, char* server_addr) { return server; } -grpc_channel* client_create(char* server_addr, grpc_ssl_session_cache* cache) { +grpc_channel* client_create(const char* server_addr, + grpc_ssl_session_cache* cache) { grpc_slice ca_slice, cert_slice, key_slice; GPR_ASSERT(GRPC_LOG_IF_ERROR("load_file", grpc_load_file(CA_CERT_PATH, 1, &ca_slice))); @@ -126,7 +127,7 @@ grpc_channel* client_create(char* server_addr, grpc_ssl_session_cache* cache) { } void do_round_trip(grpc_completion_queue* cq, grpc_server* server, - char* server_addr, grpc_ssl_session_cache* cache, + const char* server_addr, grpc_ssl_session_cache* cache, bool expect_session_reuse) { grpc_channel* client = client_create(server_addr, cache); @@ -249,17 +250,16 @@ void drain_cq(grpc_completion_queue* cq) { TEST(H2SessionReuseTest, SingleReuse) { int port = grpc_pick_unused_port_or_die(); - grpc_core::UniquePtr server_addr; - grpc_core::JoinHostPort(&server_addr, "localhost", port); + std::string server_addr = grpc_core::JoinHostPort("localhost", port); grpc_completion_queue* cq = grpc_completion_queue_create_for_next(nullptr); grpc_ssl_session_cache* cache = grpc_ssl_session_cache_create_lru(16); - grpc_server* server = server_create(cq, server_addr.get()); + grpc_server* server = server_create(cq, server_addr.c_str()); - do_round_trip(cq, server, server_addr.get(), cache, false); - do_round_trip(cq, server, server_addr.get(), cache, true); - do_round_trip(cq, server, server_addr.get(), cache, true); + do_round_trip(cq, server, server_addr.c_str(), cache, false); + do_round_trip(cq, server, server_addr.c_str(), cache, true); + do_round_trip(cq, server, server_addr.c_str(), cache, true); grpc_ssl_session_cache_destroy(cache); diff --git a/test/core/end2end/invalid_call_argument_test.cc b/test/core/end2end/invalid_call_argument_test.cc index 5f920fad638..75725a6ccef 100644 --- a/test/core/end2end/invalid_call_argument_test.cc +++ b/test/core/end2end/invalid_call_argument_test.cc @@ -77,13 +77,13 @@ static void prepare_test(int is_client) { } else { g_state.server = grpc_server_create(nullptr, nullptr); grpc_server_register_completion_queue(g_state.server, g_state.cq, nullptr); - grpc_core::UniquePtr server_hostport; - grpc_core::JoinHostPort(&server_hostport, "0.0.0.0", port); - grpc_server_add_insecure_http2_port(g_state.server, server_hostport.get()); + std::string server_hostport = grpc_core::JoinHostPort("0.0.0.0", port); + grpc_server_add_insecure_http2_port(g_state.server, + server_hostport.c_str()); grpc_server_start(g_state.server); - grpc_core::JoinHostPort(&server_hostport, "localhost", port); + server_hostport = grpc_core::JoinHostPort("localhost", port); g_state.chan = - grpc_insecure_channel_create(server_hostport.get(), nullptr, nullptr); + grpc_insecure_channel_create(server_hostport.c_str(), nullptr, nullptr); grpc_slice host = grpc_slice_from_static_string("bar"); g_state.call = grpc_channel_create_call( g_state.chan, nullptr, GRPC_PROPAGATE_DEFAULTS, g_state.cq, diff --git a/test/core/fling/fling_stream_test.cc b/test/core/fling/fling_stream_test.cc index edd5616c824..b4565eced6f 100644 --- a/test/core/fling/fling_stream_test.cc +++ b/test/core/fling/fling_stream_test.cc @@ -46,9 +46,8 @@ int main(int /*argc*/, char** argv) { gpr_asprintf(&args[0], "%s/fling_server%s", root, gpr_subprocess_binary_extension()); args[1] = const_cast("--bind"); - grpc_core::UniquePtr joined; - grpc_core::JoinHostPort(&joined, "::", port); - args[2] = joined.get(); + std::string joined = grpc_core::JoinHostPort("::", port); + args[2] = const_cast(joined.c_str()); args[3] = const_cast("--no-secure"); svr = gpr_subprocess_create(4, (const char**)args); gpr_free(args[0]); @@ -57,8 +56,8 @@ int main(int /*argc*/, char** argv) { gpr_asprintf(&args[0], "%s/fling_client%s", root, gpr_subprocess_binary_extension()); args[1] = const_cast("--target"); - grpc_core::JoinHostPort(&joined, "127.0.0.1", port); - args[2] = joined.get(); + joined = grpc_core::JoinHostPort("127.0.0.1", port); + args[2] = const_cast(joined.c_str()); args[3] = const_cast("--scenario=ping-pong-stream"); args[4] = const_cast("--no-secure"); args[5] = nullptr; diff --git a/test/core/fling/fling_test.cc b/test/core/fling/fling_test.cc index 00d399c4196..717bccd8544 100644 --- a/test/core/fling/fling_test.cc +++ b/test/core/fling/fling_test.cc @@ -47,9 +47,8 @@ int main(int /*argc*/, const char** argv) { gpr_asprintf(&args[0], "%s/fling_server%s", root, gpr_subprocess_binary_extension()); args[1] = const_cast("--bind"); - grpc_core::UniquePtr joined; - grpc_core::JoinHostPort(&joined, "::", port); - args[2] = joined.get(); + std::string joined = grpc_core::JoinHostPort("::", port); + args[2] = const_cast(joined.c_str()); args[3] = const_cast("--no-secure"); svr = gpr_subprocess_create(4, (const char**)args); gpr_free(args[0]); @@ -58,8 +57,8 @@ int main(int /*argc*/, const char** argv) { gpr_asprintf(&args[0], "%s/fling_client%s", root, gpr_subprocess_binary_extension()); args[1] = const_cast("--target"); - grpc_core::JoinHostPort(&joined, "127.0.0.1", port); - args[2] = joined.get(); + joined = grpc_core::JoinHostPort("127.0.0.1", port); + args[2] = const_cast(joined.c_str()); args[3] = const_cast("--scenario=ping-pong-request"); args[4] = const_cast("--no-secure"); args[5] = nullptr; diff --git a/test/core/fling/server.cc b/test/core/fling/server.cc index 878bff3a9fd..4085e28ed22 100644 --- a/test/core/fling/server.cc +++ b/test/core/fling/server.cc @@ -172,7 +172,7 @@ static void sigint_handler(int /*x*/) { _exit(0); } int main(int argc, char** argv) { grpc_event ev; call_state* s; - grpc_core::UniquePtr addr_buf; + std::string addr_buf; gpr_cmdline* cl; grpc_completion_queue* shutdown_cq; int shutdown_started = 0; @@ -199,8 +199,8 @@ int main(int argc, char** argv) { gpr_cmdline_destroy(cl); if (addr == nullptr) { - grpc_core::JoinHostPort(&addr_buf, "::", grpc_pick_unused_port_or_die()); - addr = addr_buf.get(); + addr_buf = grpc_core::JoinHostPort("::", grpc_pick_unused_port_or_die()); + addr = addr_buf.c_str(); } gpr_log(GPR_INFO, "creating server on: %s", addr); @@ -221,7 +221,7 @@ int main(int argc, char** argv) { grpc_server_start(server); addr = nullptr; - addr_buf.reset(); + addr_buf.clear(); grpc_call_details_init(&call_details); diff --git a/test/core/gprpp/host_port_test.cc b/test/core/gprpp/host_port_test.cc index 54914808545..0cff9975f1d 100644 --- a/test/core/gprpp/host_port_test.cc +++ b/test/core/gprpp/host_port_test.cc @@ -26,12 +26,8 @@ static void join_host_port_expect(const char* host, int port, const char* expected) { - grpc_core::UniquePtr buf; - int len; - len = grpc_core::JoinHostPort(&buf, host, port); - GPR_ASSERT(len >= 0); - GPR_ASSERT(strlen(expected) == static_cast(len)); - GPR_ASSERT(strcmp(expected, buf.get()) == 0); + std::string actual = grpc_core::JoinHostPort(host, port); + GPR_ASSERT(actual == expected); } static void test_join_host_port(void) { diff --git a/test/core/iomgr/sockaddr_utils_test.cc b/test/core/iomgr/sockaddr_utils_test.cc index 250d36a74a6..bd92426bfc2 100644 --- a/test/core/iomgr/sockaddr_utils_test.cc +++ b/test/core/iomgr/sockaddr_utils_test.cc @@ -175,15 +175,9 @@ static void test_sockaddr_is_wildcard(void) { static void expect_sockaddr_str(const char* expected, grpc_resolved_address* addr, int normalize) { - int result; - char* str; gpr_log(GPR_INFO, " expect_sockaddr_str(%s)", expected); - result = grpc_sockaddr_to_string(&str, addr, normalize); - GPR_ASSERT(str != nullptr); - GPR_ASSERT(result >= 0); - GPR_ASSERT((size_t)result == strlen(str)); - GPR_ASSERT(strcmp(expected, str) == 0); - gpr_free(str); + std::string actual = grpc_sockaddr_to_string(addr, normalize); + GPR_ASSERT(actual == expected); } static void expect_sockaddr_uri(const char* expected, diff --git a/test/core/iomgr/tcp_server_posix_test.cc b/test/core/iomgr/tcp_server_posix_test.cc index b2d64f4f42a..8594344ae97 100644 --- a/test/core/iomgr/tcp_server_posix_test.cc +++ b/test/core/iomgr/tcp_server_posix_test.cc @@ -32,6 +32,8 @@ #include #include +#include + #include #include #include @@ -133,15 +135,10 @@ static void server_weak_ref_set(server_weak_ref* weak_ref, } static void test_addr_init_str(test_addr* addr) { - char* str = nullptr; - if (grpc_sockaddr_to_string(&str, &addr->addr, 0) != -1) { - size_t str_len; - memcpy(addr->str, str, (str_len = strnlen(str, sizeof(addr->str) - 1))); - addr->str[str_len] = '\0'; - gpr_free(str); - } else { - addr->str[0] = '\0'; - } + std::string str = grpc_sockaddr_to_string(&addr->addr, false); + size_t str_len = std::min(str.size(), sizeof(addr->str) - 1); + memcpy(addr->str, str.c_str(), str_len); + addr->str[str_len] = '\0'; } static void on_connect(void* /*arg*/, grpc_endpoint* tcp, diff --git a/test/core/surface/num_external_connectivity_watchers_test.cc b/test/core/surface/num_external_connectivity_watchers_test.cc index 541e9abda0f..1b2cce86819 100644 --- a/test/core/surface/num_external_connectivity_watchers_test.cc +++ b/test/core/surface/num_external_connectivity_watchers_test.cc @@ -69,11 +69,11 @@ static void channel_idle_poll_for_timeout(grpc_channel* channel, static void run_timeouts_test(const test_fixture* fixture) { gpr_log(GPR_INFO, "TEST: %s", fixture->name); - grpc_core::UniquePtr addr; grpc_init(); - grpc_core::JoinHostPort(&addr, "localhost", grpc_pick_unused_port_or_die()); + std::string addr = + grpc_core::JoinHostPort("localhost", grpc_pick_unused_port_or_die()); - grpc_channel* channel = fixture->create_channel(addr.get()); + grpc_channel* channel = fixture->create_channel(addr.c_str()); grpc_completion_queue* cq = grpc_completion_queue_create_for_next(nullptr); /* start 1 watcher and then let it time out */ @@ -120,11 +120,11 @@ static void run_channel_shutdown_before_timeout_test( const test_fixture* fixture) { gpr_log(GPR_INFO, "TEST: %s", fixture->name); - grpc_core::UniquePtr addr; grpc_init(); - grpc_core::JoinHostPort(&addr, "localhost", grpc_pick_unused_port_or_die()); + std::string addr = + grpc_core::JoinHostPort("localhost", grpc_pick_unused_port_or_die()); - grpc_channel* channel = fixture->create_channel(addr.get()); + grpc_channel* channel = fixture->create_channel(addr.c_str()); grpc_completion_queue* cq = grpc_completion_queue_create_for_next(nullptr); /* start 1 watcher and then shut down the channel before the timer goes off */ diff --git a/test/core/surface/sequential_connectivity_test.cc b/test/core/surface/sequential_connectivity_test.cc index 8f7a46bfe38..ed20017d708 100644 --- a/test/core/surface/sequential_connectivity_test.cc +++ b/test/core/surface/sequential_connectivity_test.cc @@ -66,11 +66,11 @@ static void run_test(const test_fixture* fixture) { grpc_init(); - grpc_core::UniquePtr addr; - grpc_core::JoinHostPort(&addr, "localhost", grpc_pick_unused_port_or_die()); + std::string addr = + grpc_core::JoinHostPort("localhost", grpc_pick_unused_port_or_die()); grpc_server* server = grpc_server_create(nullptr, nullptr); - fixture->add_server_port(server, addr.get()); + fixture->add_server_port(server, addr.c_str()); grpc_completion_queue* server_cq = grpc_completion_queue_create_for_next(nullptr); grpc_server_register_completion_queue(server, server_cq, nullptr); @@ -83,7 +83,7 @@ static void run_test(const test_fixture* fixture) { grpc_completion_queue* cq = grpc_completion_queue_create_for_next(nullptr); grpc_channel* channels[NUM_CONNECTIONS]; for (size_t i = 0; i < NUM_CONNECTIONS; i++) { - channels[i] = fixture->create_channel(addr.get()); + channels[i] = fixture->create_channel(addr.c_str()); gpr_timespec connect_deadline = grpc_timeout_seconds_to_deadline(30); grpc_connectivity_state state; diff --git a/test/core/surface/server_chttp2_test.cc b/test/core/surface/server_chttp2_test.cc index a88362e13b0..3399b07a1c0 100644 --- a/test/core/surface/server_chttp2_test.cc +++ b/test/core/surface/server_chttp2_test.cc @@ -47,15 +47,15 @@ void test_add_same_port_twice() { grpc_channel_args args = {1, &a}; int port = grpc_pick_unused_port_or_die(); - grpc_core::UniquePtr addr; grpc_completion_queue* cq = grpc_completion_queue_create_for_pluck(nullptr); grpc_server* server = grpc_server_create(&args, nullptr); grpc_server_credentials* fake_creds = grpc_fake_transport_security_server_credentials_create(); - grpc_core::JoinHostPort(&addr, "localhost", port); - GPR_ASSERT(grpc_server_add_secure_http2_port(server, addr.get(), fake_creds)); + std::string addr = grpc_core::JoinHostPort("localhost", port); GPR_ASSERT( - grpc_server_add_secure_http2_port(server, addr.get(), fake_creds) == 0); + grpc_server_add_secure_http2_port(server, addr.c_str(), fake_creds)); + GPR_ASSERT( + grpc_server_add_secure_http2_port(server, addr.c_str(), fake_creds) == 0); grpc_server_credentials_release(fake_creds); grpc_server_shutdown_and_notify(server, cq, nullptr); diff --git a/test/core/surface/server_test.cc b/test/core/surface/server_test.cc index 185a6757743..e53d7eb90fa 100644 --- a/test/core/surface/server_test.cc +++ b/test/core/surface/server_test.cc @@ -106,19 +106,18 @@ void test_bind_server_twice(void) { void test_bind_server_to_addr(const char* host, bool secure) { int port = grpc_pick_unused_port_or_die(); - grpc_core::UniquePtr addr; - grpc_core::JoinHostPort(&addr, host, port); - gpr_log(GPR_INFO, "Test bind to %s", addr.get()); + std::string addr = grpc_core::JoinHostPort(host, port); + gpr_log(GPR_INFO, "Test bind to %s", addr.c_str()); grpc_server* server = grpc_server_create(nullptr, nullptr); if (secure) { grpc_server_credentials* fake_creds = grpc_fake_transport_security_server_credentials_create(); GPR_ASSERT( - grpc_server_add_secure_http2_port(server, addr.get(), fake_creds)); + grpc_server_add_secure_http2_port(server, addr.c_str(), fake_creds)); grpc_server_credentials_release(fake_creds); } else { - GPR_ASSERT(grpc_server_add_insecure_http2_port(server, addr.get())); + GPR_ASSERT(grpc_server_add_insecure_http2_port(server, addr.c_str())); } grpc_completion_queue* cq = grpc_completion_queue_create_for_next(nullptr); grpc_server_register_completion_queue(server, cq, nullptr); diff --git a/test/core/tsi/alts/handshaker/alts_concurrent_connectivity_test.cc b/test/core/tsi/alts/handshaker/alts_concurrent_connectivity_test.cc index 18cfa0dc4b3..521cabdf932 100644 --- a/test/core/tsi/alts/handshaker/alts_concurrent_connectivity_test.cc +++ b/test/core/tsi/alts/handshaker/alts_concurrent_connectivity_test.cc @@ -103,7 +103,7 @@ class FakeHandshakeServer { public: FakeHandshakeServer(bool check_num_concurrent_rpcs) { int port = grpc_pick_unused_port_or_die(); - grpc_core::JoinHostPort(&address_, "localhost", port); + address_ = grpc_core::JoinHostPort("localhost", port); if (check_num_concurrent_rpcs) { service_ = grpc::gcp:: CreateFakeHandshakerService(kFakeHandshakeServerMaxConcurrentStreams /* expected max concurrent rpcs */); @@ -112,22 +112,24 @@ class FakeHandshakeServer { 0 /* expected max concurrent rpcs unset */); } grpc::ServerBuilder builder; - builder.AddListeningPort(address_.get(), grpc::InsecureServerCredentials()); + builder.AddListeningPort(address_.c_str(), + grpc::InsecureServerCredentials()); builder.RegisterService(service_.get()); // TODO(apolcyn): when removing the global concurrent handshake limiting // queue, set MAX_CONCURRENT_STREAMS on this server. server_ = builder.BuildAndStart(); - gpr_log(GPR_INFO, "Fake handshaker server listening on %s", address_.get()); + gpr_log(GPR_INFO, "Fake handshaker server listening on %s", + address_.c_str()); } ~FakeHandshakeServer() { server_->Shutdown(grpc_timeout_milliseconds_to_deadline(0)); } - const char* address() { return address_.get(); } + const char* address() { return address_.c_str(); } private: - grpc_core::UniquePtr address_; + std::string address_; std::unique_ptr service_; std::unique_ptr server_; }; @@ -147,13 +149,13 @@ class TestServer { server_cq_ = grpc_completion_queue_create_for_next(nullptr); grpc_server_register_completion_queue(server_, server_cq_, nullptr); int port = grpc_pick_unused_port_or_die(); - GPR_ASSERT(grpc_core::JoinHostPort(&server_addr_, "localhost", port)); - GPR_ASSERT(grpc_server_add_secure_http2_port(server_, server_addr_.get(), + server_addr_ = grpc_core::JoinHostPort("localhost", port); + GPR_ASSERT(grpc_server_add_secure_http2_port(server_, server_addr_.c_str(), server_creds)); grpc_server_credentials_release(server_creds); grpc_server_start(server_); gpr_log(GPR_DEBUG, "Start TestServer %p. listen on %s", this, - server_addr_.get()); + server_addr_.c_str()); server_thd_ = std::unique_ptr(new std::thread(PollUntilShutdown, this)); } @@ -168,7 +170,7 @@ class TestServer { grpc_completion_queue_destroy(server_cq_); } - const char* address() { return server_addr_.get(); } + const char* address() { return server_addr_.c_str(); } static void PollUntilShutdown(const TestServer* self) { grpc_event ev = grpc_completion_queue_next( @@ -182,7 +184,7 @@ class TestServer { grpc_server* server_; grpc_completion_queue* server_cq_; std::unique_ptr server_thd_; - grpc_core::UniquePtr server_addr_; + std::string server_addr_; // Give this test server its own ALTS handshake server // so that we avoid competing for ALTS handshake server resources (e.g. // available HTTP2 streams on a globally shared handshaker subchannel) diff --git a/test/cpp/naming/address_sorting_test.cc b/test/cpp/naming/address_sorting_test.cc index 6f94635927d..38203bcfcca 100644 --- a/test/cpp/naming/address_sorting_test.cc +++ b/test/cpp/naming/address_sorting_test.cc @@ -108,19 +108,17 @@ class MockSourceAddrFactory : public address_sorting_source_addr_factory { !ipv6_supported_)) { return false; } - char* ip_addr_str; grpc_resolved_address dest_addr_as_resolved_addr; memcpy(&dest_addr_as_resolved_addr.addr, dest_addr, dest_addr->len); dest_addr_as_resolved_addr.len = dest_addr->len; - grpc_sockaddr_to_string(&ip_addr_str, &dest_addr_as_resolved_addr, - false /* normalize */); + std::string ip_addr_str = grpc_sockaddr_to_string( + &dest_addr_as_resolved_addr, false /* normalize */); auto it = dest_addr_to_src_addr_.find(ip_addr_str); if (it == dest_addr_to_src_addr_.end()) { - gpr_log(GPR_DEBUG, "can't find |%s| in dest to src map", ip_addr_str); - gpr_free(ip_addr_str); + gpr_log(GPR_DEBUG, "can't find |%s| in dest to src map", + ip_addr_str.c_str()); return false; } - gpr_free(ip_addr_str); grpc_resolved_address source_addr_as_resolved_addr = TestAddressToGrpcResolvedAddress(it->second); memcpy(source_addr->addr, &source_addr_as_resolved_addr.addr, @@ -180,13 +178,10 @@ void VerifyLbAddrOutputs(const grpc_core::ServerAddressList& addresses, std::vector expected_addrs) { EXPECT_EQ(addresses.size(), expected_addrs.size()); for (size_t i = 0; i < addresses.size(); ++i) { - char* ip_addr_str; - grpc_sockaddr_to_string(&ip_addr_str, &addresses[i].address(), - false /* normalize */); + std::string ip_addr_str = + grpc_sockaddr_to_string(&addresses[i].address(), false /* normalize */); EXPECT_EQ(expected_addrs[i], ip_addr_str); - gpr_free(ip_addr_str); } - grpc_core::ExecCtx exec_ctx; } /* We need to run each test case inside of its own diff --git a/test/cpp/naming/resolver_component_test.cc b/test/cpp/naming/resolver_component_test.cc index c5dfc777397..350806d6aa7 100644 --- a/test/cpp/naming/resolver_component_test.cc +++ b/test/cpp/naming/resolver_component_test.cc @@ -503,11 +503,10 @@ class CheckingResultHandler : public ResultHandler { std::vector* out) { for (size_t i = 0; i < addresses.size(); i++) { const grpc_core::ServerAddress& addr = addresses[i]; - char* str; - grpc_sockaddr_to_string(&str, &addr.address(), 1 /* normalize */); - gpr_log(GPR_INFO, "%s", str); - out->emplace_back(GrpcLBAddress(std::string(str), is_balancer)); - gpr_free(str); + std::string str = + grpc_sockaddr_to_string(&addr.address(), true /* normalize */); + gpr_log(GPR_INFO, "%s", str.c_str()); + out->emplace_back(GrpcLBAddress(std::move(str), is_balancer)); } } }; diff --git a/test/cpp/qps/driver.cc b/test/cpp/qps/driver.cc index 1f3176f5548..f26c11c8dca 100644 --- a/test/cpp/qps/driver.cc +++ b/test/cpp/qps/driver.cc @@ -347,11 +347,10 @@ std::unique_ptr RunScenario( cli_target += std::to_string(i); client_config.add_server_targets(cli_target); } else { - std::string host; - grpc_core::UniquePtr cli_target; - host = get_host(workers[i]); - grpc_core::JoinHostPort(&cli_target, host.c_str(), init_status.port()); - client_config.add_server_targets(cli_target.get()); + std::string host = get_host(workers[i]); + std::string cli_target = + grpc_core::JoinHostPort(host.c_str(), init_status.port()); + client_config.add_server_targets(cli_target.c_str()); } } diff --git a/test/cpp/qps/qps_worker.cc b/test/cpp/qps/qps_worker.cc index 78dae6207e0..8a725c03405 100644 --- a/test/cpp/qps/qps_worker.cc +++ b/test/cpp/qps/qps_worker.cc @@ -279,10 +279,9 @@ QpsWorker::QpsWorker(int driver_port, int server_port, std::unique_ptr builder = CreateQpsServerBuilder(); if (driver_port >= 0) { - grpc_core::UniquePtr server_address; - grpc_core::JoinHostPort(&server_address, "::", driver_port); + std::string server_address = grpc_core::JoinHostPort("::", driver_port); builder->AddListeningPort( - server_address.get(), + server_address.c_str(), GetCredentialsProvider()->GetServerCredentials(credential_type)); } builder->RegisterService(impl_.get()); diff --git a/test/cpp/qps/server_async.cc b/test/cpp/qps/server_async.cc index b6cb020a891..6a07accb151 100644 --- a/test/cpp/qps/server_async.cc +++ b/test/cpp/qps/server_async.cc @@ -80,9 +80,8 @@ class AsyncQpsServerTest final : public grpc::testing::Server { auto port_num = port(); // Negative port number means inproc server, so no listen port needed if (port_num >= 0) { - grpc_core::UniquePtr server_address; - grpc_core::JoinHostPort(&server_address, "::", port_num); - builder->AddListeningPort(server_address.get(), + std::string server_address = grpc_core::JoinHostPort("::", port_num); + builder->AddListeningPort(server_address.c_str(), Server::CreateServerCredentials(config)); } diff --git a/test/cpp/qps/server_callback.cc b/test/cpp/qps/server_callback.cc index 4b6f651e356..e4aa10946d2 100644 --- a/test/cpp/qps/server_callback.cc +++ b/test/cpp/qps/server_callback.cc @@ -102,9 +102,8 @@ class CallbackServer final : public grpc::testing::Server { auto port_num = port(); // Negative port number means inproc server, so no listen port needed if (port_num >= 0) { - grpc_core::UniquePtr server_address; - grpc_core::JoinHostPort(&server_address, "::", port_num); - builder->AddListeningPort(server_address.get(), + std::string server_address = grpc_core::JoinHostPort("::", port_num); + builder->AddListeningPort(server_address.c_str(), Server::CreateServerCredentials(config)); } diff --git a/test/cpp/qps/server_sync.cc b/test/cpp/qps/server_sync.cc index f69a8f07ace..19d406a167c 100644 --- a/test/cpp/qps/server_sync.cc +++ b/test/cpp/qps/server_sync.cc @@ -160,9 +160,8 @@ class SynchronousServer final : public grpc::testing::Server { auto port_num = port(); // Negative port number means inproc server, so no listen port needed if (port_num >= 0) { - grpc_core::UniquePtr server_address; - grpc_core::JoinHostPort(&server_address, "::", port_num); - builder->AddListeningPort(server_address.get(), + std::string server_address = grpc_core::JoinHostPort("::", port_num); + builder->AddListeningPort(server_address.c_str(), Server::CreateServerCredentials(config)); } From 581751b65bc833724b5e6bbb6f08de4515ddaced Mon Sep 17 00:00:00 2001 From: "Mark D. Roth" Date: Fri, 8 May 2020 11:46:53 -0700 Subject: [PATCH 710/758] xds: When listener does not exist, put channel in TRANSIENT_FAILURE. --- .../lb_policy/child_policy_handler.cc | 9 ++- .../client_channel/lb_policy/xds/cds.cc | 22 ++++++ .../client_channel/lb_policy/xds/eds.cc | 17 ++++ .../resolver/xds/xds_resolver.cc | 15 ++++ .../filters/client_channel/xds/xds_client.cc | 31 ++++---- .../filters/client_channel/xds/xds_client.h | 6 ++ test/cpp/end2end/grpclb_end2end_test.cc | 78 ------------------- test/cpp/end2end/xds_end2end_test.cc | 24 ++++++ 8 files changed, 109 insertions(+), 93 deletions(-) diff --git a/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc b/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc index ac5b82e98b8..8d8003d185a 100644 --- a/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +++ b/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc @@ -49,7 +49,8 @@ class ChildPolicyHandler::Helper std::unique_ptr picker) override { if (parent_->shutting_down_) return; // If this request is from the pending child policy, ignore it until - // it reports READY, at which point we swap it into place. + // it reports something other than CONNECTING, at which point we swap it + // into place. if (CalledByPendingChild()) { if (GRPC_TRACE_FLAG_ENABLED(*(parent_->tracer_))) { gpr_log(GPR_INFO, @@ -57,7 +58,7 @@ class ChildPolicyHandler::Helper "reports state=%s", parent_.get(), this, child_, ConnectivityStateName(state)); } - if (state != GRPC_CHANNEL_READY) return; + if (state == GRPC_CHANNEL_CONNECTING) return; grpc_pollset_set_del_pollset_set( parent_->child_policy_->interested_parties(), parent_->interested_parties()); @@ -202,6 +203,10 @@ void ChildPolicyHandler::UpdateLocked(UpdateArgs args) { // Cases 1, 2b, and 3b: create a new child policy. // If child_policy_ is null, we set it (case 1), else we set // pending_child_policy_ (cases 2b and 3b). + // TODO(roth): In cases 2b and 3b, we should start a timer here, so + // that there's an upper bound on the amount of time it takes us to + // switch to the new policy, even if the new policy stays in + // CONNECTING for a very long period of time. if (GRPC_TRACE_FLAG_ENABLED(*tracer_)) { gpr_log(GPR_INFO, "[child_policy_handler %p] creating new %schild policy %s", this, diff --git a/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc b/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc index 3c1a38a8c0c..58ce4516619 100644 --- a/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +++ b/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc @@ -18,6 +18,8 @@ #include +#include "absl/strings/str_cat.h" + #include "src/core/ext/filters/client_channel/lb_policy.h" #include "src/core/ext/filters/client_channel/lb_policy_factory.h" #include "src/core/ext/filters/client_channel/lb_policy_registry.h" @@ -65,6 +67,7 @@ class CdsLb : public LoadBalancingPolicy { : parent_(std::move(parent)) {} void OnClusterChanged(XdsApi::CdsUpdate cluster_data) override; void OnError(grpc_error* error) override; + void OnResourceDoesNotExist() override; private: RefCountedPtr parent_; @@ -211,6 +214,25 @@ void CdsLb::ClusterWatcher::OnError(grpc_error* error) { } } +void CdsLb::ClusterWatcher::OnResourceDoesNotExist() { + gpr_log(GPR_ERROR, "[cdslb %p] CDS resource for %s does not exist", + parent_.get(), parent_->config_->cluster().c_str()); + // Go into TRANSIENT_FAILURE if we have not yet created the child + // policy (i.e., we have not yet received data from xds). Otherwise, + // we keep running with the data we had previously. + // TODO(roth): Once traffic splitting is implemented, this should be + // fixed to report TRANSIENT_FAILURE unconditionally. + if (parent_->child_policy_ == nullptr) { + parent_->channel_control_helper()->UpdateState( + GRPC_CHANNEL_TRANSIENT_FAILURE, + absl::make_unique( + GRPC_ERROR_CREATE_FROM_COPIED_STRING( + absl::StrCat("CDS resource \"", parent_->config_->cluster(), + "\" does not exist") + .c_str()))); + } +} + // // CdsLb::Helper // diff --git a/src/core/ext/filters/client_channel/lb_policy/xds/eds.cc b/src/core/ext/filters/client_channel/lb_policy/xds/eds.cc index 9a159b3f4d0..cd49192fc4c 100644 --- a/src/core/ext/filters/client_channel/lb_policy/xds/eds.cc +++ b/src/core/ext/filters/client_channel/lb_policy/xds/eds.cc @@ -341,6 +341,23 @@ class EdsLb::EndpointWatcher : public XdsClient::EndpointWatcherInterface { } } + void OnResourceDoesNotExist() override { + gpr_log(GPR_ERROR, "[edslb %p] EDS resource does not exist", + eds_policy_.get()); + // Go into TRANSIENT_FAILURE if we have not yet created the child + // policy (i.e., we have not yet received data from xds). Otherwise, + // we keep running with the data we had previously. + // TODO(roth): Once traffic splitting is implemented, this should be + // fixed to report TRANSIENT_FAILURE unconditionally. + if (eds_policy_->child_policy_ == nullptr) { + eds_policy_->channel_control_helper()->UpdateState( + GRPC_CHANNEL_TRANSIENT_FAILURE, + absl::make_unique( + GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "EDS resource does not exist"))); + } + } + private: RefCountedPtr eds_policy_; }; diff --git a/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc b/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc index 5dec92ba7ef..28ea4bb5c17 100644 --- a/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +++ b/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc @@ -71,6 +71,7 @@ class XdsResolver : public Resolver { void OnServiceConfigChanged( RefCountedPtr service_config) override; void OnError(grpc_error* error) override; + void OnResourceDoesNotExist() override; private: RefCountedPtr resolver_; @@ -109,6 +110,20 @@ void XdsResolver::ServiceConfigWatcher::OnError(grpc_error* error) { resolver_->result_handler()->ReturnResult(std::move(result)); } +void XdsResolver::ServiceConfigWatcher::OnResourceDoesNotExist() { + if (resolver_->xds_client_ == nullptr) return; + gpr_log(GPR_ERROR, + "[xds_resolver %p] LDS/RDS resource does not exist -- returning " + "empty service config", + resolver_.get()); + Result result; + result.service_config = + ServiceConfig::Create("{}", &result.service_config_error); + GPR_ASSERT(result.service_config != nullptr); + result.args = grpc_channel_args_copy(resolver_->args_); + resolver_->result_handler()->ReturnResult(std::move(result)); +} + void XdsResolver::StartLocked() { grpc_error* error = GRPC_ERROR_NONE; xds_client_ = MakeOrphanable( diff --git a/src/core/ext/filters/client_channel/xds/xds_client.cc b/src/core/ext/filters/client_channel/xds/xds_client.cc index a9a5a286670..973b03ceb00 100644 --- a/src/core/ext/filters/client_channel/xds/xds_client.cc +++ b/src/core/ext/filters/client_channel/xds/xds_client.cc @@ -895,9 +895,15 @@ void XdsClient::ChannelState::AdsCallState::AcceptLdsUpdate( gpr_log(GPR_INFO, "[xds_client %p] LDS update does not include requested resource", xds_client()); - xds_client()->service_config_watcher_->OnError( - GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "LDS update does not include requested resource")); + if (xds_client()->lds_result_.has_value() && + !xds_client()->lds_result_->route_config_name.empty()) { + Unsubscribe(XdsApi::kRdsTypeUrl, + xds_client()->lds_result_->route_config_name, + /*delay_unsubscription=*/false); + xds_client()->rds_result_.reset(); + } + xds_client()->lds_result_.reset(); + xds_client()->service_config_watcher_->OnResourceDoesNotExist(); return; } if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) { @@ -936,6 +942,7 @@ void XdsClient::ChannelState::AdsCallState::AcceptLdsUpdate( Unsubscribe( XdsApi::kRdsTypeUrl, xds_client()->lds_result_->route_config_name, /*delay_unsubscription=*/!lds_update->route_config_name.empty()); + xds_client()->rds_result_.reset(); } xds_client()->lds_result_ = std::move(lds_update); if (xds_client()->lds_result_->rds_update.has_value()) { @@ -963,9 +970,8 @@ void XdsClient::ChannelState::AdsCallState::AcceptRdsUpdate( gpr_log(GPR_INFO, "[xds_client %p] RDS update does not include requested resource", xds_client()); - xds_client()->service_config_watcher_->OnError( - GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "RDS update does not include requested resource")); + xds_client()->rds_result_.reset(); + xds_client()->service_config_watcher_->OnResourceDoesNotExist(); return; } if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_client_trace)) { @@ -1051,20 +1057,20 @@ void XdsClient::ChannelState::AdsCallState::AcceptCdsUpdate( } } // For any subscribed resource that is not present in the update, - // remove it from the cache and notify watchers of the error. + // remove it from the cache and notify watchers that it does not exist. for (const auto& p : cds_state.subscribed_resources) { const std::string& cluster_name = p.first; if (cds_update_map.find(cluster_name) == cds_update_map.end()) { ClusterState& cluster_state = xds_client()->cluster_map_[cluster_name]; cluster_state.update.reset(); for (const auto& p : cluster_state.watchers) { - p.first->OnError(GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "Cluster not present in CDS update")); + p.first->OnResourceDoesNotExist(); } } } - // Also remove any EDS resources that are no longer referred to by any CDS - // resources. + // For any EDS resource that is no longer referred to by any CDS + // resources, remove it from the cache and notify watchers that it + // does not exist. auto& eds_state = state_map_[XdsApi::kEdsTypeUrl]; for (const auto& p : eds_state.subscribed_resources) { const std::string& eds_resource_name = p.first; @@ -1074,8 +1080,7 @@ void XdsClient::ChannelState::AdsCallState::AcceptCdsUpdate( xds_client()->endpoint_map_[eds_resource_name]; endpoint_state.update.reset(); for (const auto& p : endpoint_state.watchers) { - p.first->OnError(GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "ClusterLoadAssignment resource removed due to CDS update")); + p.first->OnResourceDoesNotExist(); } } } diff --git a/src/core/ext/filters/client_channel/xds/xds_client.h b/src/core/ext/filters/client_channel/xds/xds_client.h index 725c5da011a..8233c5d2e08 100644 --- a/src/core/ext/filters/client_channel/xds/xds_client.h +++ b/src/core/ext/filters/client_channel/xds/xds_client.h @@ -50,6 +50,8 @@ class XdsClient : public InternallyRefCounted { RefCountedPtr service_config) = 0; virtual void OnError(grpc_error* error) = 0; + + virtual void OnResourceDoesNotExist() = 0; }; // Cluster data watcher interface. Implemented by callers. @@ -60,6 +62,8 @@ class XdsClient : public InternallyRefCounted { virtual void OnClusterChanged(XdsApi::CdsUpdate cluster_data) = 0; virtual void OnError(grpc_error* error) = 0; + + virtual void OnResourceDoesNotExist() = 0; }; // Endpoint data watcher interface. Implemented by callers. @@ -70,6 +74,8 @@ class XdsClient : public InternallyRefCounted { virtual void OnEndpointChanged(XdsApi::EdsUpdate update) = 0; virtual void OnError(grpc_error* error) = 0; + + virtual void OnResourceDoesNotExist() = 0; }; // If *error is not GRPC_ERROR_NONE after construction, then there was diff --git a/test/cpp/end2end/grpclb_end2end_test.cc b/test/cpp/end2end/grpclb_end2end_test.cc index 2e3b4e9ca78..ac727688ca5 100644 --- a/test/cpp/end2end/grpclb_end2end_test.cc +++ b/test/cpp/end2end/grpclb_end2end_test.cc @@ -890,84 +890,6 @@ TEST_F(SingleBalancerTest, SwapChildPolicy) { EXPECT_EQ("grpclb", channel_->GetLoadBalancingPolicyName()); } -TEST_F(SingleBalancerTest, UpdatesGoToMostRecentChildPolicy) { - const int kFallbackTimeoutMs = 200 * grpc_test_slowdown_factor(); - ResetStub(kFallbackTimeoutMs); - int unreachable_balancer_port = grpc_pick_unused_port_or_die(); - int unreachable_backend_port = grpc_pick_unused_port_or_die(); - // Phase 1: Start with RR pointing to first backend. - gpr_log(GPR_INFO, "PHASE 1: Initial setup with RR with first backend"); - SetNextResolution( - { - // Unreachable balancer. - {unreachable_balancer_port, ""}, - }, - { - // Fallback address: first backend. - {backends_[0]->port_, ""}, - }, - "{\n" - " \"loadBalancingConfig\":[\n" - " { \"grpclb\":{\n" - " \"childPolicy\":[\n" - " { \"round_robin\":{} }\n" - " ]\n" - " } }\n" - " ]\n" - "}"); - // RPCs should go to first backend. - WaitForBackend(0); - // Phase 2: Switch to PF pointing to unreachable backend. - gpr_log(GPR_INFO, "PHASE 2: Update to use PF with unreachable backend"); - SetNextResolution( - { - // Unreachable balancer. - {unreachable_balancer_port, ""}, - }, - { - // Fallback address: unreachable backend. - {unreachable_backend_port, ""}, - }, - "{\n" - " \"loadBalancingConfig\":[\n" - " { \"grpclb\":{\n" - " \"childPolicy\":[\n" - " { \"pick_first\":{} }\n" - " ]\n" - " } }\n" - " ]\n" - "}"); - // RPCs should continue to go to the first backend, because the new - // PF child policy will never go into state READY. - WaitForBackend(0); - // Phase 3: Switch back to RR pointing to second and third backends. - // This ensures that we create a new policy rather than updating the - // pending PF policy. - gpr_log(GPR_INFO, "PHASE 3: Update to use RR again with two backends"); - SetNextResolution( - { - // Unreachable balancer. - {unreachable_balancer_port, ""}, - }, - { - // Fallback address: second and third backends. - {backends_[1]->port_, ""}, - {backends_[2]->port_, ""}, - }, - "{\n" - " \"loadBalancingConfig\":[\n" - " { \"grpclb\":{\n" - " \"childPolicy\":[\n" - " { \"round_robin\":{} }\n" - " ]\n" - " } }\n" - " ]\n" - "}"); - // RPCs should go to the second and third backends. - WaitForBackend(1); - WaitForBackend(2); -} - TEST_F(SingleBalancerTest, SameBackendListedMultipleTimes) { SetNextResolutionAllBalancers(); // Same backend listed twice. diff --git a/test/cpp/end2end/xds_end2end_test.cc b/test/cpp/end2end/xds_end2end_test.cc index 7e0b2733bb7..49a975ca2f4 100644 --- a/test/cpp/end2end/xds_end2end_test.cc +++ b/test/cpp/end2end/xds_end2end_test.cc @@ -1897,6 +1897,30 @@ TEST_P(XdsResolverOnlyTest, ChangeClusters) { EXPECT_EQ(0, std::get<1>(counts)); } +// Tests that we go into TRANSIENT_FAILURE if the Listener is removed. +TEST_P(XdsResolverOnlyTest, ListenerRemoved) { + SetNextResolution({}); + SetNextResolutionForLbChannelAllBalancers(); + AdsServiceImpl::EdsResourceArgs args({ + {"locality0", GetBackendPorts()}, + }); + balancers_[0]->ads_service()->SetEdsResource( + AdsServiceImpl::BuildEdsResource(args)); + // We need to wait for all backends to come online. + WaitForAllBackends(); + // Unset CDS resource. + balancers_[0]->ads_service()->UnsetResource(kLdsTypeUrl, + kDefaultResourceName); + // Wait for RPCs to start failing. + do { + } while (SendRpc(RpcOptions(), nullptr).ok()); + // Make sure RPCs are still failing. + CheckRpcSendFailure(1000); + // Make sure we ACK'ed the update. + EXPECT_EQ(balancers_[0]->ads_service()->lds_response_state().state, + AdsServiceImpl::ResponseState::ACKED); +} + // Tests that things keep workng if the cluster resource disappears. TEST_P(XdsResolverOnlyTest, ClusterRemoved) { SetNextResolution({}); From 290d187f60b8ad0b055874d76239a3f6f502808e Mon Sep 17 00:00:00 2001 From: Hannah Shi Date: Fri, 8 May 2020 19:13:55 +0000 Subject: [PATCH 711/758] ignore-valgrind-undef-errors from php7.3 --- src/php/bin/run_tests.sh | 4 +++- src/php/docker/php-future/Dockerfile | 6 +++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/php/bin/run_tests.sh b/src/php/bin/run_tests.sh index 31506c58936..0408a91a1f0 100755 --- a/src/php/bin/run_tests.sh +++ b/src/php/bin/run_tests.sh @@ -29,7 +29,8 @@ for arg in "$@" do if [[ "$arg" == "--skip-persistent-channel-tests" ]]; then SKIP_PERSISTENT_CHANNEL_TESTS=true - break + elif [[ "$arg" == "--ignore-valgrind-undef-errors" ]]; then + VALGRIND_UNDEF_VALUE_ERRORS="--undef-value-errors=no" fi done @@ -43,6 +44,7 @@ export USE_ZEND_ALLOC=0 # Detect whether valgrind is executable if [ -x "$(command -v valgrind)" ]; then $(which valgrind) --error-exitcode=10 --leak-check=yes \ + $VALGRIND_UNDEF_VALUE_ERRORS \ $(which php) $extension_dir -d max_execution_time=300 \ ../tests/MemoryLeakTest/MemoryLeakTest.php fi diff --git a/src/php/docker/php-future/Dockerfile b/src/php/docker/php-future/Dockerfile index b0f6c886902..b55513e6996 100644 --- a/src/php/docker/php-future/Dockerfile +++ b/src/php/docker/php-future/Dockerfile @@ -12,11 +12,11 @@ # See the License for the specific language governing permissions and # limitations under the License. -FROM php:7.4.0RC1-buster +FROM php:7.4.5-buster RUN apt-get -qq update && apt-get -qq install -y \ autoconf automake git libtool pkg-config \ - wget zlib1g-dev + valgrind wget zlib1g-dev ARG MAKEFLAGS=-j8 @@ -36,4 +36,4 @@ RUN pear package && \ find . -name grpc-*.tgz | xargs -I{} pecl install {} -CMD ["/github/grpc/src/php/bin/run_tests.sh", "--skip-persistent-channel-tests"] +CMD ["/github/grpc/src/php/bin/run_tests.sh", "--skip-persistent-channel-tests", "--ignore-valgrind-undef-errors"] From e844f301015ac7fd08e54d1ce8363f087b024b4f Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Fri, 8 May 2020 13:42:03 -0700 Subject: [PATCH 712/758] Close Core's channel when there is no reference to the channel --- src/python/grpcio/grpc/_channel.py | 3 + .../tests_py3_only/unit/_leak_test.py | 93 +++++++++++++++++++ 2 files changed, 96 insertions(+) create mode 100644 src/python/grpcio_tests/tests_py3_only/unit/_leak_test.py diff --git a/src/python/grpcio/grpc/_channel.py b/src/python/grpcio/grpc/_channel.py index f5c6656823a..8632ead740d 100644 --- a/src/python/grpcio/grpc/_channel.py +++ b/src/python/grpcio/grpc/_channel.py @@ -1122,6 +1122,9 @@ class _ChannelCallState(object): def reset_postfork_child(self): self.managed_calls = 0 + def __del__(self): + self.channel.close(cygrpc.StatusCode.cancelled, 'Channel deallocated!') + def _run_channel_spin_thread(state): diff --git a/src/python/grpcio_tests/tests_py3_only/unit/_leak_test.py b/src/python/grpcio_tests/tests_py3_only/unit/_leak_test.py new file mode 100644 index 00000000000..6858adadb36 --- /dev/null +++ b/src/python/grpcio_tests/tests_py3_only/unit/_leak_test.py @@ -0,0 +1,93 @@ +# Copyright 2020 The gRPC Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""A smoke test for memory leaks.""" + +import logging +import os +import resource +import sys +import unittest +from concurrent.futures import ThreadPoolExecutor + +import grpc + +_TEST_METHOD = '/test/Test' +_REQUEST = b'\x23\x33' +_LARGE_NUM_OF_ITERATIONS = 5000 + +# If MAX_RSS inflated more than this size, the test is failed. +_FAIL_THRESHOLD = 25 * 1024 * 1024 # 25 MiB + + +def _get_max_rss(): + return resource.getrusage(resource.RUSAGE_SELF).ru_maxrss + + +def _pretty_print_bytes(x): + if x > 1024 * 1024 * 1024: + return "%.2f GiB" % (x / 1024.0 / 1024 / 1024) + elif x > 1024 * 1024: + return "%.2f MiB" % (x / 1024.0 / 1024) + elif x > 1024: + return "%.2f KiB" % (x / 1024.0) + else: + return "%d B" % x + + +class _GenericHandler(grpc.GenericRpcHandler): + + def service(self, handler_call_details): + if handler_call_details.method == _TEST_METHOD: + return grpc.unary_unary_rpc_method_handler(lambda x, _: x) + + +def _start_a_test_server(): + server = grpc.server(ThreadPoolExecutor(max_workers=1), + options=(('grpc.so_reuseport', 0),)) + server.add_generic_rpc_handlers((_GenericHandler(),)) + port = server.add_insecure_port('localhost:0') + server.start() + return 'localhost:%d' % port, server + + +def _perform_an_rpc(address): + channel = grpc.insecure_channel(address) + multicallable = channel.unary_unary(_TEST_METHOD) + response = multicallable(_REQUEST) + assert _REQUEST == response + + +class TestLeak(unittest.TestCase): + + def test_leak_with_single_shot_rpcs(self): + address, server = _start_a_test_server() + + # Records memory before experiment. + before = _get_max_rss() + + # Amplifies the leak. + for n in range(_LARGE_NUM_OF_ITERATIONS): + _perform_an_rpc(address) + + # Fails the test if memory leak detected. + diff = _get_max_rss() - before + if diff > _FAIL_THRESHOLD: + self.fail("Max RSS inflated {} > {}".format( + _pretty_print_bytes(diff), + _pretty_print_bytes(_FAIL_THRESHOLD))) + + +if __name__ == "__main__": + logging.basicConfig(level=logging.DEBUG) + unittest.main(verbosity=2) From 1dad16c0d97b3cefb018d3f506e7914a39d679ee Mon Sep 17 00:00:00 2001 From: Alexander Polcyn Date: Fri, 8 May 2020 15:54:38 -0700 Subject: [PATCH 713/758] Use C-core's histogram, drop use of exec_ctx header --- test/cpp/interop/client.cc | 2 +- test/cpp/interop/interop_client.cc | 61 +++++++++++++++--------------- test/cpp/interop/interop_client.h | 7 ++-- 3 files changed, 34 insertions(+), 36 deletions(-) diff --git a/test/cpp/interop/client.cc b/test/cpp/interop/client.cc index fc12d4b8ae6..a23c5ddb6d5 100644 --- a/test/cpp/interop/client.cc +++ b/test/cpp/interop/client.cc @@ -94,7 +94,7 @@ DEFINE_int32(soak_max_failures, 0, "The number of iterations in soak tests that are allowed to fail " "(either due to non-OK status code or exceeding the " "per-iteration max acceptable latency)."); -DEFINE_int64(soak_per_iteration_max_acceptable_latency_ms, 0, +DEFINE_int32(soak_per_iteration_max_acceptable_latency_ms, 0, "The number of milliseconds a single iteration in the two soak " "tests (rpc_soak and channel_soak) is allowed to take."); DEFINE_int32(iteration_interval, 10, diff --git a/test/cpp/interop/interop_client.cc b/test/cpp/interop/interop_client.cc index 63343ded620..e889d2424c5 100644 --- a/test/cpp/interop/interop_client.cc +++ b/test/cpp/interop/interop_client.cc @@ -31,10 +31,10 @@ #include #include -#include "src/core/lib/iomgr/exec_ctx.h" #include "src/proto/grpc/testing/empty.pb.h" #include "src/proto/grpc/testing/messages.pb.h" #include "src/proto/grpc/testing/test.grpc.pb.h" +#include "test/core/util/histogram.h" #include "test/cpp/interop/client_helper.h" #include "test/cpp/interop/interop_client.h" @@ -1067,10 +1067,10 @@ bool InteropClient::DoCustomMetadata() { return true; } -std::tuple +std::tuple InteropClient::PerformOneSoakTestIteration( const bool reset_channel, - const int64_t max_acceptable_per_iteration_latency_ms) { + const int32_t max_acceptable_per_iteration_latency_ms) { gpr_timespec start = gpr_now(GPR_CLOCK_MONOTONIC); SimpleRequest request; SimpleResponse response; @@ -1087,14 +1087,13 @@ InteropClient::PerformOneSoakTestIteration( } Status s = serviceStub_.Get()->UnaryCall(&context, request, &response); gpr_timespec now = gpr_now(GPR_CLOCK_MONOTONIC); - grpc_millis elapsed_ms = - grpc_timespec_to_millis_round_down(gpr_time_sub(now, start)); + int32_t elapsed_ms = gpr_time_to_millis(gpr_time_sub(now, start)); if (!s.ok()) { return std::make_tuple(false, elapsed_ms, context.debug_error_string()); } else if (elapsed_ms > max_acceptable_per_iteration_latency_ms) { char* out; GPR_ASSERT(gpr_asprintf( - &out, "%ld ms exceeds max acceptable latency: %ld ms.", + &out, "%d ms exceeds max acceptable latency: %d ms.", elapsed_ms, max_acceptable_per_iteration_latency_ms) != -1); std::string debug_string(out); gpr_free(out); @@ -1107,44 +1106,44 @@ InteropClient::PerformOneSoakTestIteration( void InteropClient::PerformSoakTest( const bool reset_channel_per_iteration, const int32_t soak_iterations, const int32_t max_failures, - const int64_t max_acceptable_per_iteration_latency_ms) { - std::vector> results; - std::vector latencies_ms; + const int32_t max_acceptable_per_iteration_latency_ms) { + std::vector> results; + grpc_histogram* latencies_ms_histogram = grpc_histogram_create( + 1 /* resolution */, + 500 * 1e3 /* largest bucket; 500 seconds is unlikely */); for (int i = 0; i < soak_iterations; ++i) { auto result = PerformOneSoakTestIteration( reset_channel_per_iteration, max_acceptable_per_iteration_latency_ms); results.push_back(result); - latencies_ms.push_back(std::get<1>(result)); + grpc_histogram_add(latencies_ms_histogram, std::get<1>(result)); } int total_failures = 0; for (size_t i = 0; i < results.size(); i++) { bool success = std::get<0>(results[i]); - grpc_millis elapsed_ms = std::get<1>(results[i]); + int32_t elapsed_ms = std::get<1>(results[i]); std::string debug_string = std::get<2>(results[i]); if (!success) { - gpr_log(GPR_DEBUG, "soak iteration:%ld elapsed_ms:%ld failed: %s", i, + gpr_log(GPR_DEBUG, "soak iteration: %ld elapsed_ms: %d failed: %s", i, elapsed_ms, debug_string.c_str()); total_failures++; } else { - gpr_log(GPR_DEBUG, "soak iteration:%ld elapsed_ms:%ld succeeded", i, + gpr_log(GPR_DEBUG, "soak iteration: %ld elapsed_ms: %d succeeded", i, elapsed_ms); } } - std::sort(latencies_ms.begin(), latencies_ms.end()); - grpc_millis latency_ms_median = latencies_ms.size() >= 2 - ? latencies_ms[latencies_ms.size() / 2] - : latencies_ms.back(); - grpc_millis latency_ms_90th = - latencies_ms.size() >= 10 ? latencies_ms[(latencies_ms.size() / 10) * 9] - : latencies_ms.back(); - grpc_millis latency_ms_worst = latencies_ms.back(); + double latency_ms_median = + grpc_histogram_percentile(latencies_ms_histogram, 50); + double latency_ms_90th = + grpc_histogram_percentile(latencies_ms_histogram, 90); + double latency_ms_worst = grpc_histogram_maximum(latencies_ms_histogram); + grpc_histogram_destroy(latencies_ms_histogram); if (total_failures > max_failures) { gpr_log(GPR_ERROR, - "soak test ran:%d iterations. total_failures:%d exceeds " - "max_failures_threshold:%d. " - "median_soak_iteration_latency:%ld ms. " - "90th_soak_iteration_latency:%ld ms. " - "worst_soak_iteration_latency:%ld ms. " + "soak test ran: %d iterations. total_failures: %d exceeds " + "max_failures_threshold: %d. " + "median_soak_iteration_latency: %lf ms. " + "90th_soak_iteration_latency: %lf ms. " + "worst_soak_iteration_latency: %lf ms. " "See breakdown above for which iterations succeeded, failed, and " "why for more info.", soak_iterations, total_failures, max_failures, latency_ms_median, @@ -1152,11 +1151,11 @@ void InteropClient::PerformSoakTest( GPR_ASSERT(0); } else { gpr_log(GPR_INFO, - "soak test ran:%d iterations. total_failures:%d is within " - "max_failures_threshold:%d. " - "median_soak_iteration_latency:%ld ms. " - "90th_soak_iteration_latency:%ld ms. " - "worst_soak_iteration_latency:%ld ms. " + "soak test ran: %d iterations. total_failures: %d is within " + "max_failures_threshold: %d. " + "median_soak_iteration_latency: %lf ms. " + "90th_soak_iteration_latency: %lf ms. " + "worst_soak_iteration_latency: %lf ms. " "See breakdown above for which iterations succeeded, failed, and " "why for more info.", soak_iterations, total_failures, max_failures, latency_ms_median, diff --git a/test/cpp/interop/interop_client.h b/test/cpp/interop/interop_client.h index 42da648f336..2dc0d8047ec 100644 --- a/test/cpp/interop/interop_client.h +++ b/test/cpp/interop/interop_client.h @@ -23,7 +23,6 @@ #include #include -#include "src/core/lib/iomgr/exec_ctx.h" #include "src/proto/grpc/testing/messages.pb.h" #include "src/proto/grpc/testing/test.grpc.pb.h" @@ -131,14 +130,14 @@ class InteropClient { const grpc::string& optional_debug_string); bool TransientFailureOrAbort(); - std::tuple PerformOneSoakTestIteration( + std::tuple PerformOneSoakTestIteration( const bool reset_channel, - const int64_t max_acceptable_per_iteration_latency_ms); + const int32_t max_acceptable_per_iteration_latency_ms); void PerformSoakTest(const bool reset_channel_per_iteration, const int32_t soak_iterations, const int32_t max_failures, - const int64_t max_acceptable_per_iteration_latency_ms); + const int32_t max_acceptable_per_iteration_latency_ms); ServiceStub serviceStub_; /// If true, abort() is not called for transient failures From 6f828a9494266af9cef9a6c247ab5d8bdd6892cc Mon Sep 17 00:00:00 2001 From: Alexander Polcyn Date: Fri, 8 May 2020 17:36:06 -0700 Subject: [PATCH 714/758] Attempt to fix Android test Cmake build --- src/android/test/interop/app/CMakeLists.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/android/test/interop/app/CMakeLists.txt b/src/android/test/interop/app/CMakeLists.txt index 2e23a7759c5..e288dd63cec 100644 --- a/src/android/test/interop/app/CMakeLists.txt +++ b/src/android/test/interop/app/CMakeLists.txt @@ -110,7 +110,9 @@ add_library(grpc-interop SHARED src/main/cpp/grpc-interop.cc ${GRPC_SRC_DIR}/test/cpp/interop/interop_client.h - ${GRPC_SRC_DIR}/test/cpp/interop/interop_client.cc) + ${GRPC_SRC_DIR}/test/cpp/interop/interop_client.cc + ${GRPC_SRC_DIR}/test/core/util/histogram.h + ${GRPC_SRC_DIR}/test/core/util/histogram.cc) target_link_libraries(grpc-interop messages_proto_lib From f5c9fd94a50104880454f48826f0908c9e1f53c4 Mon Sep 17 00:00:00 2001 From: Thomas Etter Date: Sat, 9 May 2020 13:33:13 +0200 Subject: [PATCH 715/758] do not write unnecessary new lines in the grpc_cli as the formatters already write them --- test/cpp/util/grpc_cli.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/cpp/util/grpc_cli.cc b/test/cpp/util/grpc_cli.cc index 10e13d929bb..a4035c57758 100644 --- a/test/cpp/util/grpc_cli.cc +++ b/test/cpp/util/grpc_cli.cc @@ -68,10 +68,10 @@ DEFINE_string(outfile, "", "Output file (default is stdout)"); static bool SimplePrint(const grpc::string& outfile, const grpc::string& output) { if (outfile.empty()) { - std::cout << output << std::endl; + std::cout << output << std::flush; } else { std::ofstream output_file(outfile, std::ios::app | std::ios::binary); - output_file << output << std::endl; + output_file << output << std::flush; output_file.close(); } return true; From 3e17411774d81b0371375d729b1166994854212e Mon Sep 17 00:00:00 2001 From: Jason Meller Date: Sun, 10 May 2020 17:15:30 -0400 Subject: [PATCH 716/758] Covert hash to keyword arguments for ruby 2.7 Ruby 2.7 deprecated passing a hash as the last argument for a method that takes keyword params. This commit coverts the hash explicitly to keyword args using the double splat. ``` grpc-1.28.0-universal-darwin/src/ruby/lib/grpc/generic/service.rb:170: warning: Using the last argument as keyword parameters is deprecated; maybe ** should be added to the call ``` --- src/ruby/lib/grpc/generic/service.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/ruby/lib/grpc/generic/service.rb b/src/ruby/lib/grpc/generic/service.rb index 169a62f11d3..93577bdd6be 100644 --- a/src/ruby/lib/grpc/generic/service.rb +++ b/src/ruby/lib/grpc/generic/service.rb @@ -167,22 +167,22 @@ module GRPC if desc.request_response? define_method(mth_name) do |req, metadata = {}| GRPC.logger.debug("calling #{@host}:#{route}") - request_response(route, req, marshal, unmarshal, metadata) + request_response(route, req, marshal, unmarshal, **metadata) end elsif desc.client_streamer? define_method(mth_name) do |reqs, metadata = {}| GRPC.logger.debug("calling #{@host}:#{route}") - client_streamer(route, reqs, marshal, unmarshal, metadata) + client_streamer(route, reqs, marshal, unmarshal, **metadata) end elsif desc.server_streamer? define_method(mth_name) do |req, metadata = {}, &blk| GRPC.logger.debug("calling #{@host}:#{route}") - server_streamer(route, req, marshal, unmarshal, metadata, &blk) + server_streamer(route, req, marshal, unmarshal, **metadata, &blk) end else # is a bidi_stream define_method(mth_name) do |reqs, metadata = {}, &blk| GRPC.logger.debug("calling #{@host}:#{route}") - bidi_streamer(route, reqs, marshal, unmarshal, metadata, &blk) + bidi_streamer(route, reqs, marshal, unmarshal, **metadata, &blk) end end end From 56f0dfbb29c0e81e78d3a87b62677b708c2058f7 Mon Sep 17 00:00:00 2001 From: Uwe Kindler Date: Mon, 20 Jan 2020 13:58:50 +0100 Subject: [PATCH 717/758] Fixed MinGW 7.3.0 shared library compile and link issues added definition WIN32_WINNT=0x600 added missing libraries wsock32 ws2_32 crypt32 --- templates/CMakeLists.txt.template | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/templates/CMakeLists.txt.template b/templates/CMakeLists.txt.template index e6fc6c034ab..24fa7f0eb96 100644 --- a/templates/CMakeLists.txt.template +++ b/templates/CMakeLists.txt.template @@ -266,6 +266,9 @@ # TODO(jtattermusch): needed to build boringssl with VS2017, revisit later set(_gRPC_C_CXX_FLAGS "<%text>${_gRPC_C_CXX_FLAGS} /wd4987 /wd4774 /wd4819 /wd4996 /wd4619") endif() + if (MINGW) + add_definitions(-D_WIN32_WINNT=0x600) + endif() set(CMAKE_C_FLAGS "<%text>${CMAKE_C_FLAGS} ${_gRPC_C_CXX_FLAGS}") set(CMAKE_CXX_FLAGS "<%text>${CMAKE_CXX_FLAGS} ${_gRPC_C_CXX_FLAGS}") @@ -308,7 +311,7 @@ set(_gRPC_ALLTARGETS_LIBRARIES <%text>${CMAKE_DL_LIBS} rt m pthread) endif() - if(WIN32 AND MSVC) + if(WIN32) set(_gRPC_BASELIB_LIBRARIES wsock32 ws2_32 crypt32) endif() From c7efcf6824cd1edff9a9ac6fc7d6af36a73bae27 Mon Sep 17 00:00:00 2001 From: Uwe Kindler Date: Mon, 27 Jan 2020 13:32:06 +0100 Subject: [PATCH 718/758] regenerate CMakeLists.txt --- CMakeLists.txt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 490da4c7807..fc654747fca 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -175,6 +175,9 @@ if(MSVC) # TODO(jtattermusch): needed to build boringssl with VS2017, revisit later set(_gRPC_C_CXX_FLAGS "${_gRPC_C_CXX_FLAGS} /wd4987 /wd4774 /wd4819 /wd4996 /wd4619") endif() +if (MINGW) + add_definitions(-D_WIN32_WINNT=0x600) +endif() set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${_gRPC_C_CXX_FLAGS}") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${_gRPC_C_CXX_FLAGS}") @@ -217,7 +220,7 @@ elseif(UNIX) set(_gRPC_ALLTARGETS_LIBRARIES ${CMAKE_DL_LIBS} rt m pthread) endif() -if(WIN32 AND MSVC) +if(WIN32) set(_gRPC_BASELIB_LIBRARIES wsock32 ws2_32 crypt32) endif() From 05d2ce6c6d5aeff0b8b9ae5f2856fbfc865b60fd Mon Sep 17 00:00:00 2001 From: "Mark D. Roth" Date: Mon, 11 May 2020 07:20:22 -0700 Subject: [PATCH 719/758] Pass repo manager duty to nicolasnoble. --- .github/ISSUE_TEMPLATE/bug_report.md | 2 +- .github/ISSUE_TEMPLATE/cleanup_request.md | 2 +- .github/ISSUE_TEMPLATE/feature_request.md | 2 +- .github/ISSUE_TEMPLATE/question.md | 2 +- .github/pull_request_template.md | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 663fcbde3fb..e69dc0bd3ba 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -2,7 +2,7 @@ name: Report a bug about: Create a report to help us improve labels: kind/bug, priority/P2 -assignees: markdroth +assignees: nicolasnoble --- diff --git a/.github/ISSUE_TEMPLATE/cleanup_request.md b/.github/ISSUE_TEMPLATE/cleanup_request.md index cd547e286c1..c9a6d3f911d 100644 --- a/.github/ISSUE_TEMPLATE/cleanup_request.md +++ b/.github/ISSUE_TEMPLATE/cleanup_request.md @@ -2,7 +2,7 @@ name: Request a cleanup about: Suggest a cleanup in our repository labels: kind/internal cleanup, priority/P2 -assignees: markdroth +assignees: nicolasnoble --- diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index 717752f9207..e3137998ae0 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -2,7 +2,7 @@ name: Request a feature about: Suggest an idea for this project labels: kind/enhancement, priority/P2 -assignees: markdroth +assignees: nicolasnoble --- diff --git a/.github/ISSUE_TEMPLATE/question.md b/.github/ISSUE_TEMPLATE/question.md index 5dc067381f9..cfde18bec27 100644 --- a/.github/ISSUE_TEMPLATE/question.md +++ b/.github/ISSUE_TEMPLATE/question.md @@ -2,7 +2,7 @@ name: Ask a question about: Ask a question labels: kind/question, priority/P3 -assignees: markdroth +assignees: nicolasnoble --- diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index a85cfad9c7a..57af6c21597 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -8,4 +8,4 @@ If you know who should review your pull request, please remove the mentioning be --> -@markdroth +@nicolasnoble From 1b9df95bb0feb7e6bc718cf6ad9768a168ddb69d Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Mon, 11 May 2020 17:00:35 +0200 Subject: [PATCH 720/758] review comments --- src/csharp/Grpc.Core/build/net45/Grpc.Core.targets | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/csharp/Grpc.Core/build/net45/Grpc.Core.targets b/src/csharp/Grpc.Core/build/net45/Grpc.Core.targets index 89b8f054a80..88dd8456505 100644 --- a/src/csharp/Grpc.Core/build/net45/Grpc.Core.targets +++ b/src/csharp/Grpc.Core/build/net45/Grpc.Core.targets @@ -1,16 +1,15 @@  - + Always grpc_csharp_ext.x86.dll From 183a79f426c26d9e0c15458920f811bba2c5f13a Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Mon, 11 May 2020 17:02:42 +0200 Subject: [PATCH 721/758] A few more nits --- src/csharp/Grpc.Core/build/net45/Grpc.Core.targets | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/csharp/Grpc.Core/build/net45/Grpc.Core.targets b/src/csharp/Grpc.Core/build/net45/Grpc.Core.targets index 88dd8456505..3324e8eb4e5 100644 --- a/src/csharp/Grpc.Core/build/net45/Grpc.Core.targets +++ b/src/csharp/Grpc.Core/build/net45/Grpc.Core.targets @@ -1,7 +1,7 @@  - + Always grpc_csharp_ext.x86.dll From 6035ee7a5e6e4f0e0c120554fbb96bb3866b50b2 Mon Sep 17 00:00:00 2001 From: yang-g Date: Mon, 11 May 2020 09:42:59 -0700 Subject: [PATCH 722/758] add a static assert for gpr_once with abseil --- src/core/lib/gpr/sync_abseil.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/core/lib/gpr/sync_abseil.cc b/src/core/lib/gpr/sync_abseil.cc index 2a1ca05d9a0..56b1cc7b4a2 100644 --- a/src/core/lib/gpr/sync_abseil.cc +++ b/src/core/lib/gpr/sync_abseil.cc @@ -108,6 +108,8 @@ void gpr_cv_broadcast(gpr_cv* cv) { /*----------------------------------------*/ void gpr_once_init(gpr_once* once, void (*init_function)(void)) { + static_assert(sizeof(gpr_once) == sizeof(absl::once_flag), + "gpr_once and absl::once_flag must be the same size"); absl::call_once(*reinterpret_cast(once), init_function); } From 205ad35413035b5be8793ecf6f77a099b5c70159 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Mon, 11 May 2020 10:10:55 -0700 Subject: [PATCH 723/758] Add module docstring for the leak test --- src/python/grpcio_tests/tests_py3_only/unit/_leak_test.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/python/grpcio_tests/tests_py3_only/unit/_leak_test.py b/src/python/grpcio_tests/tests_py3_only/unit/_leak_test.py index 6858adadb36..3b3f12fa1f9 100644 --- a/src/python/grpcio_tests/tests_py3_only/unit/_leak_test.py +++ b/src/python/grpcio_tests/tests_py3_only/unit/_leak_test.py @@ -11,7 +11,12 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -"""A smoke test for memory leaks.""" +"""A smoke test for memory leaks on short-lived channels without close. + +This test doesn't guarantee all resources are cleaned if `Channel.close` is not +explicitly invoked. The recommended way of using Channel object is using `with` +clause, and let context manager automatically close the channel. +""" import logging import os From eee38e35dd31b46b1e3ef1935f2ac26984fbcc9d Mon Sep 17 00:00:00 2001 From: Eric Anderson Date: Mon, 11 May 2020 11:37:49 -0700 Subject: [PATCH 724/758] tools/dockerfile: Run Java build twice to reduce flakiness Downloads fail from time to time because Gradle does not retry certain types of network failures (https://github.com/gradle/gradle/issues/8264). Retrying twice should reduce the flake rate below noticeable without increasing the size of the interop image created for each new release for historical testing. Fixes #18892 --- templates/tools/dockerfile/java_build_interop.sh.include | 4 +++- .../dockerfile/interoptest/grpc_interop_java/build_interop.sh | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/templates/tools/dockerfile/java_build_interop.sh.include b/templates/tools/dockerfile/java_build_interop.sh.include index c8463da5b02..9c9cbcec6f8 100755 --- a/templates/tools/dockerfile/java_build_interop.sh.include +++ b/templates/tools/dockerfile/java_build_interop.sh.include @@ -22,7 +22,9 @@ cp -r /var/local/jenkins/grpc-java /tmp/grpc-java cp -r /var/local/jenkins/service_account $HOME || true pushd /tmp/grpc-java -./gradlew --no-daemon :grpc-interop-testing:installDist -PskipCodegen=true -PskipAndroid=true +# make two attempts; downloads can fail. See https://github.com/grpc/grpc/issues/18892 +./gradlew --no-daemon :grpc-interop-testing:installDist -PskipCodegen=true -PskipAndroid=true || ${'\\'} + ./gradlew --no-daemon :grpc-interop-testing:installDist -PskipCodegen=true -PskipAndroid=true mkdir -p /var/local/git/grpc-java/ cp -r --parents -t /var/local/git/grpc-java/ ${'\\'} diff --git a/tools/dockerfile/interoptest/grpc_interop_java/build_interop.sh b/tools/dockerfile/interoptest/grpc_interop_java/build_interop.sh index 5ef618ef338..06f2d12164e 100644 --- a/tools/dockerfile/interoptest/grpc_interop_java/build_interop.sh +++ b/tools/dockerfile/interoptest/grpc_interop_java/build_interop.sh @@ -22,7 +22,9 @@ cp -r /var/local/jenkins/grpc-java /tmp/grpc-java cp -r /var/local/jenkins/service_account $HOME || true pushd /tmp/grpc-java -./gradlew --no-daemon :grpc-interop-testing:installDist -PskipCodegen=true -PskipAndroid=true +# make two attempts; downloads can fail. See https://github.com/grpc/grpc/issues/18892 +./gradlew --no-daemon :grpc-interop-testing:installDist -PskipCodegen=true -PskipAndroid=true || \ + ./gradlew --no-daemon :grpc-interop-testing:installDist -PskipCodegen=true -PskipAndroid=true mkdir -p /var/local/git/grpc-java/ cp -r --parents -t /var/local/git/grpc-java/ \ From ae8770a3176c439bbd30efb316439154d558851c Mon Sep 17 00:00:00 2001 From: yang-g Date: Mon, 11 May 2020 11:57:19 -0700 Subject: [PATCH 725/758] Let the connectivity test use local subchannel pool to create multiple connections --- .../surface/sequential_connectivity_test.cc | 28 +++++++++++++++---- 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/test/core/surface/sequential_connectivity_test.cc b/test/core/surface/sequential_connectivity_test.cc index ed20017d708..9af60204a12 100644 --- a/test/core/surface/sequential_connectivity_test.cc +++ b/test/core/surface/sequential_connectivity_test.cc @@ -18,6 +18,7 @@ #include #include +#include #include #include @@ -133,7 +134,18 @@ static void insecure_test_add_port(grpc_server* server, const char* addr) { } static grpc_channel* insecure_test_create_channel(const char* addr) { - return grpc_insecure_channel_create(addr, nullptr, nullptr); + grpc_arg arg = {GRPC_ARG_INTEGER, + const_cast(GRPC_ARG_USE_LOCAL_SUBCHANNEL_POOL), + {.integer = 1}}; + grpc_channel_args* new_client_args = + grpc_channel_args_copy_and_add(nullptr, &arg, 1); + grpc_channel* channel = + grpc_insecure_channel_create(addr, new_client_args, nullptr); + { + grpc_core::ExecCtx exec_ctx; + grpc_channel_args_destroy(new_client_args); + } + return channel; } static const test_fixture insecure_test = { @@ -170,12 +182,16 @@ static grpc_channel* secure_test_create_channel(const char* addr) { grpc_channel_credentials* ssl_creds = grpc_ssl_credentials_create(test_root_cert, nullptr, nullptr, nullptr); grpc_slice_unref(ca_slice); - grpc_arg ssl_name_override = { - GRPC_ARG_STRING, - const_cast(GRPC_SSL_TARGET_NAME_OVERRIDE_ARG), - {const_cast("foo.test.google.fr")}}; + const int kNumArgs = 2; + grpc_arg args[kNumArgs] = { + {GRPC_ARG_STRING, + const_cast(GRPC_SSL_TARGET_NAME_OVERRIDE_ARG), + {const_cast("foo.test.google.fr")}}, + {GRPC_ARG_INTEGER, + const_cast(GRPC_ARG_USE_LOCAL_SUBCHANNEL_POOL), + {.integer = 1}}}; grpc_channel_args* new_client_args = - grpc_channel_args_copy_and_add(nullptr, &ssl_name_override, 1); + grpc_channel_args_copy_and_add(nullptr, args, kNumArgs); grpc_channel* channel = grpc_secure_channel_create(ssl_creds, addr, new_client_args, nullptr); { From bf0df18e52219cc9dbd3b0fb7492e9ee5036708e Mon Sep 17 00:00:00 2001 From: Esun Kim Date: Mon, 11 May 2020 13:39:19 -0700 Subject: [PATCH 726/758] Fix build in c++2a mode --- src/core/lib/gprpp/atomic.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/core/lib/gprpp/atomic.h b/src/core/lib/gprpp/atomic.h index 095ebf12565..4a53d2cfa55 100644 --- a/src/core/lib/gprpp/atomic.h +++ b/src/core/lib/gprpp/atomic.h @@ -28,12 +28,12 @@ namespace grpc_core { enum class MemoryOrder { - RELAXED = std::memory_order_relaxed, - CONSUME = std::memory_order_consume, - ACQUIRE = std::memory_order_acquire, - RELEASE = std::memory_order_release, - ACQ_REL = std::memory_order_acq_rel, - SEQ_CST = std::memory_order_seq_cst + RELAXED = static_cast(std::memory_order_relaxed), + CONSUME = static_cast(std::memory_order_consume), + ACQUIRE = static_cast(std::memory_order_acquire), + RELEASE = static_cast(std::memory_order_release), + ACQ_REL = static_cast(std::memory_order_acq_rel), + SEQ_CST = static_cast(std::memory_order_seq_cst) }; template From 028a7c4e79fcddd202b8bdc95aa6742000f8f0ab Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Mon, 11 May 2020 13:59:44 -0700 Subject: [PATCH 727/758] Add test cases for server interceptors --- src/python/grpcio/grpc/_common.py | 3 +- .../grpcio/grpc/experimental/__init__.py | 27 +++ .../tests_aio/unit/server_interceptor_test.py | 157 +++++++++++++++++- 3 files changed, 180 insertions(+), 7 deletions(-) diff --git a/src/python/grpcio/grpc/_common.py b/src/python/grpcio/grpc/_common.py index 6a170ac6ce2..3c455678ff0 100644 --- a/src/python/grpcio/grpc/_common.py +++ b/src/python/grpcio/grpc/_common.py @@ -14,11 +14,10 @@ """Shared implementation.""" import logging - import time -import six import grpc +import six from grpc._cython import cygrpc _LOGGER = logging.getLogger(__name__) diff --git a/src/python/grpcio/grpc/experimental/__init__.py b/src/python/grpcio/grpc/experimental/__init__.py index 2c63908fe6d..83f0b860eb7 100644 --- a/src/python/grpcio/grpc/experimental/__init__.py +++ b/src/python/grpcio/grpc/experimental/__init__.py @@ -16,6 +16,7 @@ These APIs are subject to be removed during any minor version release. """ +import copy import functools import sys import warnings @@ -78,11 +79,37 @@ def experimental_api(f): return _wrapper +def wrap_server_method_handler(wrapper, handler): + """Wraps the server method handler function. + + The server implementation requires all server handlers being wrapped as + RpcMethodHandler objects. This helper function ease the pain of writing + server handler wrappers. + """ + if not handler: + return None + + if not handler.request_streaming: + if not handler.response_streaming: + # NOTE(lidiz) _replace is a public API: + # https://docs.python.org/dev/library/collections.html#collections.somenamedtuple._replace + return handler._replace(unary_unary=wrapper(handler.unary_unary)) + else: + return handler._replace(unary_stream=wrapper(handler.unary_stream)) + else: + if not handler.response_streaming: + return handler._replace(stream_unary=wrapper(handler.stream_unary)) + else: + return handler._replace( + stream_stream=wrapper(handler.stream_stream)) + + __all__ = ( 'ChannelOptions', 'ExperimentalApiWarning', 'UsageError', 'insecure_channel_credentials', + 'wrap_server_method_handler', ) if sys.version_info[0] == 3 and sys.version_info[1] >= 6: diff --git a/src/python/grpcio_tests/tests_aio/unit/server_interceptor_test.py b/src/python/grpcio_tests/tests_aio/unit/server_interceptor_test.py index dabf005591f..ad56a44aa1c 100644 --- a/src/python/grpcio_tests/tests_aio/unit/server_interceptor_test.py +++ b/src/python/grpcio_tests/tests_aio/unit/server_interceptor_test.py @@ -11,17 +11,23 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. +"""Test the functionality of server interceptors.""" + +import functools import logging import unittest -from typing import Callable, Awaitable, Any +from typing import Any, Awaitable, Callable, Tuple import grpc +from grpc.experimental import aio, wrap_server_method_handler -from grpc.experimental import aio - -from tests_aio.unit._test_server import start_test_server +from src.proto.grpc.testing import messages_pb2, test_pb2_grpc from tests_aio.unit._test_base import AioTestBase -from src.proto.grpc.testing import messages_pb2 +from tests_aio.unit._test_server import start_test_server + +_NUM_STREAM_RESPONSES = 5 +_REQUEST_PAYLOAD_SIZE = 7 +_RESPONSE_PAYLOAD_SIZE = 42 class _LoggingInterceptor(aio.ServerInterceptor): @@ -73,6 +79,18 @@ def _filter_server_interceptor(condition: Callable, return _GenericInterceptor(intercept_service) +async def _create_server_stub_pair( + *interceptors: aio.ServerInterceptor +) -> Tuple[aio.Server, test_pb2_grpc.TestServiceStub]: + """Creates a server-stub pair with given interceptors. + + Returning the server object to protect it from being garbage collected. + """ + server_target, server = await start_test_server(interceptors=interceptors) + channel = aio.insecure_channel(server_target) + return server, test_pb2_grpc.TestServiceStub(channel) + + class TestServerInterceptor(AioTestBase): async def test_invalid_interceptor(self): @@ -162,6 +180,135 @@ class TestServerInterceptor(AioTestBase): 'log2:intercept_service', ], record) + async def test_response_caching(self): + # Prepares a preset value to help testing + cache_store = { + 42: + messages_pb2.SimpleResponse(payload=messages_pb2.Payload( + body=b'\x42')) + } + + async def intercept_and_cache( + continuation: Callable[[grpc.HandlerCallDetails], Awaitable[ + grpc.RpcMethodHandler]], + handler_call_details: grpc.HandlerCallDetails + ) -> grpc.RpcMethodHandler: + # Get the actual handler + handler = await continuation(handler_call_details) + + def wrap_handler(handler: grpc.RpcMethodHandler): + + @functools.wraps(handler) + async def wrapper(request: messages_pb2.SimpleRequest, + context: aio.ServicerContext): + if request.response_size not in cache_store: + cache_store[request.response_size] = await handler( + request, context) + return cache_store[request.response_size] + + return wrapper + + return wrap_server_method_handler(wrap_handler, handler) + + # Constructs a server with the cache interceptor + server, stub = await _create_server_stub_pair( + _GenericInterceptor(intercept_and_cache)) + + # Tests if the cache store is used + response = await stub.UnaryCall( + messages_pb2.SimpleRequest(response_size=42)) + self.assertEqual(1, len(cache_store[42].payload.body)) + self.assertEqual(cache_store[42], response) + + # Tests response can be cached + response = await stub.UnaryCall( + messages_pb2.SimpleRequest(response_size=1337)) + self.assertEqual(1337, len(cache_store[1337].payload.body)) + self.assertEqual(cache_store[1337], response) + response = await stub.UnaryCall( + messages_pb2.SimpleRequest(response_size=1337)) + self.assertEqual(cache_store[1337], response) + + async def test_interceptor_unary_stream(self): + record = [] + server, stub = await _create_server_stub_pair( + _LoggingInterceptor('log_unary_stream', record)) + + # Prepares the request + request = messages_pb2.StreamingOutputCallRequest() + for _ in range(_NUM_STREAM_RESPONSES): + request.response_parameters.append( + messages_pb2.ResponseParameters(size=_RESPONSE_PAYLOAD_SIZE,)) + + # Tests if the cache store is used + call = stub.StreamingOutputCall(request) + + # Ensures the RPC goes fine + async for response in call: + self.assertEqual(_RESPONSE_PAYLOAD_SIZE, len(response.payload.body)) + self.assertEqual(await call.code(), grpc.StatusCode.OK) + + self.assertSequenceEqual([ + 'log_unary_stream:intercept_service', + ], record) + + async def test_interceptor_stream_unary(self): + record = [] + server, stub = await _create_server_stub_pair( + _LoggingInterceptor('log_stream_unary', record)) + + # Invokes the actual RPC + call = stub.StreamingInputCall() + + # Prepares the request + payload = messages_pb2.Payload(body=b'\0' * _REQUEST_PAYLOAD_SIZE) + request = messages_pb2.StreamingInputCallRequest(payload=payload) + + # Sends out requests + for _ in range(_NUM_STREAM_RESPONSES): + await call.write(request) + await call.done_writing() + + # Validates the responses + response = await call + self.assertIsInstance(response, messages_pb2.StreamingInputCallResponse) + self.assertEqual(_NUM_STREAM_RESPONSES * _REQUEST_PAYLOAD_SIZE, + response.aggregated_payload_size) + + self.assertEqual(await call.code(), grpc.StatusCode.OK) + + self.assertSequenceEqual([ + 'log_stream_unary:intercept_service', + ], record) + + async def test_interceptor_stream_stream(self): + record = [] + server, stub = await _create_server_stub_pair( + _LoggingInterceptor('log_stream_stream', record)) + + # Prepares the request + payload = messages_pb2.Payload(body=b'\0' * _REQUEST_PAYLOAD_SIZE) + request = messages_pb2.StreamingInputCallRequest(payload=payload) + + async def gen(): + for _ in range(_NUM_STREAM_RESPONSES): + yield request + + # Invokes the actual RPC + call = stub.StreamingInputCall(gen()) + + # Validates the responses + response = await call + self.assertIsInstance(response, messages_pb2.StreamingInputCallResponse) + self.assertEqual(_NUM_STREAM_RESPONSES * _REQUEST_PAYLOAD_SIZE, + response.aggregated_payload_size) + + self.assertEqual(await call.code(), grpc.StatusCode.OK) + + self.assertSequenceEqual([ + 'log_stream_stream:intercept_service', + ], record) + if __name__ == '__main__': logging.basicConfig(level=logging.DEBUG) From dee079811b88e88d6c783cbb0366f5e0f7b414cf Mon Sep 17 00:00:00 2001 From: Alexander Polcyn Date: Mon, 27 Apr 2020 17:45:29 -0700 Subject: [PATCH 728/758] Include source address in TCP posix connect errors --- src/core/lib/iomgr/error.cc | 2 + src/core/lib/iomgr/error.h | 2 + src/core/lib/iomgr/tcp_client_posix.cc | 75 ++++++++++++++++++-------- 3 files changed, 57 insertions(+), 22 deletions(-) diff --git a/src/core/lib/iomgr/error.cc b/src/core/lib/iomgr/error.cc index dedc8376578..7118a14196c 100644 --- a/src/core/lib/iomgr/error.cc +++ b/src/core/lib/iomgr/error.cc @@ -91,6 +91,8 @@ static const char* error_str_name(grpc_error_strs key) { return "description"; case GRPC_ERROR_STR_OS_ERROR: return "os_error"; + case GRPC_ERROR_STR_SOURCE_ADDRESS: + return "source_address"; case GRPC_ERROR_STR_TARGET_ADDRESS: return "target_address"; case GRPC_ERROR_STR_SYSCALL: diff --git a/src/core/lib/iomgr/error.h b/src/core/lib/iomgr/error.h index ac3ff876289..b6d1180f358 100644 --- a/src/core/lib/iomgr/error.h +++ b/src/core/lib/iomgr/error.h @@ -88,6 +88,8 @@ typedef enum { GRPC_ERROR_STR_OS_ERROR, /// syscall that generated this error GRPC_ERROR_STR_SYSCALL, + /// source address of the socket associated with this error + GRPC_ERROR_STR_SOURCE_ADDRESS, /// peer that we were trying to communicate when this error occurred GRPC_ERROR_STR_TARGET_ADDRESS, /// grpc status message associated with this error diff --git a/src/core/lib/iomgr/tcp_client_posix.cc b/src/core/lib/iomgr/tcp_client_posix.cc index 4abf33bc223..1953141a6db 100644 --- a/src/core/lib/iomgr/tcp_client_posix.cc +++ b/src/core/lib/iomgr/tcp_client_posix.cc @@ -57,7 +57,8 @@ typedef struct { int refs; grpc_closure write_closure; grpc_pollset_set* interested_parties; - char* addr_str; + char* remote_addr_str; + char* source_addr_str; grpc_endpoint** ep; grpc_closure* closure; grpc_channel_args* channel_args; @@ -103,8 +104,8 @@ static void tc_on_alarm(void* acp, grpc_error* error) { async_connect* ac = static_cast(acp); if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) { const char* str = grpc_error_string(error); - gpr_log(GPR_INFO, "CLIENT_CONNECT: %s: on_alarm: error=%s", ac->addr_str, - str); + gpr_log(GPR_INFO, "CLIENT_CONNECT: %s: on_alarm: error=%s", + ac->remote_addr_str, str); } gpr_mu_lock(&ac->mu); if (ac->fd != nullptr) { @@ -115,15 +116,17 @@ static void tc_on_alarm(void* acp, grpc_error* error) { gpr_mu_unlock(&ac->mu); if (done) { gpr_mu_destroy(&ac->mu); - gpr_free(ac->addr_str); + gpr_free(ac->remote_addr_str); + gpr_free(ac->source_addr_str); grpc_channel_args_destroy(ac->channel_args); gpr_free(ac); } } grpc_endpoint* grpc_tcp_client_create_from_fd( - grpc_fd* fd, const grpc_channel_args* channel_args, const char* addr_str) { - return grpc_tcp_create(fd, channel_args, addr_str); + grpc_fd* fd, const grpc_channel_args* channel_args, + const char* remote_addr_str) { + return grpc_tcp_create(fd, channel_args, remote_addr_str); } static void on_writable(void* acp, grpc_error* error) { @@ -140,8 +143,8 @@ static void on_writable(void* acp, grpc_error* error) { if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) { const char* str = grpc_error_string(error); - gpr_log(GPR_INFO, "CLIENT_CONNECT: %s: on_writable: error=%s", ac->addr_str, - str); + gpr_log(GPR_INFO, "CLIENT_CONNECT: %s: on_writable: error=%s", + ac->remote_addr_str, str); } gpr_mu_lock(&ac->mu); @@ -173,7 +176,8 @@ static void on_writable(void* acp, grpc_error* error) { switch (so_error) { case 0: grpc_pollset_set_del_fd(ac->interested_parties, fd); - *ep = grpc_tcp_client_create_from_fd(fd, ac->channel_args, ac->addr_str); + *ep = grpc_tcp_client_create_from_fd(fd, ac->channel_args, + ac->remote_addr_str); fd = nullptr; break; case ENOBUFS: @@ -215,7 +219,8 @@ finish: done = (--ac->refs == 0); // Create a copy of the data from "ac" to be accessed after the unlock, as // "ac" and its contents may be deallocated by the time they are read. - const grpc_slice addr_str_slice = grpc_slice_from_copied_string(ac->addr_str); + const grpc_slice remote_addr_str_slice = + grpc_slice_from_copied_string(ac->remote_addr_str); gpr_mu_unlock(&ac->mu); if (error != GRPC_ERROR_NONE) { char* error_descr; @@ -229,15 +234,20 @@ finish: gpr_free(error_descr); gpr_free(desc); error = grpc_error_set_str(error, GRPC_ERROR_STR_TARGET_ADDRESS, - addr_str_slice /* takes ownership */); + remote_addr_str_slice /* takes ownership */); + const grpc_slice source_addr_str_slice = + grpc_slice_from_copied_string(ac->source_addr_str); + error = grpc_error_set_str(error, GRPC_ERROR_STR_SOURCE_ADDRESS, + source_addr_str_slice /* takes ownership */); } else { - grpc_slice_unref_internal(addr_str_slice); + grpc_slice_unref_internal(remote_addr_str_slice); } if (done) { // This is safe even outside the lock, because "done", the sentinel, is // populated *inside* the lock. gpr_mu_destroy(&ac->mu); - gpr_free(ac->addr_str); + gpr_free(ac->remote_addr_str); + gpr_free(ac->source_addr_str); grpc_channel_args_destroy(ac->channel_args); gpr_free(ac); } @@ -275,6 +285,26 @@ grpc_error* grpc_tcp_client_prepare_fd(const grpc_channel_args* channel_args, return GRPC_ERROR_NONE; } +/* Fills in dest with a new string containing the human readable + * source address of fd. If source address extraction fails for any reason, + * this then fills in dest with "source_address_extraction_failed". */ +static char* extract_source_ip(int fd) { + grpc_resolved_address resolved_address; + memset(&resolved_address, 0, sizeof(resolved_address)); + resolved_address.len = sizeof(resolved_address.addr); + char* out = nullptr; + if (getsockname(fd, reinterpret_cast(&resolved_address.addr), + &resolved_address.len) == -1 || + grpc_sockaddr_to_string(&out, &resolved_address, false /* normalize */) == + -1) { + gpr_log(GPR_INFO, + "source address will be missing from logs and errors. errno: %d", + errno); + out = gpr_strdup("source_address_extraction_failed"); + } + return out; +} + void grpc_tcp_client_create_from_prepared_fd( grpc_pollset_set* interested_parties, grpc_closure* closure, const int fd, const grpc_channel_args* channel_args, const grpc_resolved_address* addr, @@ -287,17 +317,17 @@ void grpc_tcp_client_create_from_prepared_fd( } while (err < 0 && errno == EINTR); char* name; - char* addr_str; - addr_str = grpc_sockaddr_to_uri(addr); - gpr_asprintf(&name, "tcp-client:%s", addr_str); + char* remote_addr_str; + remote_addr_str = grpc_sockaddr_to_uri(addr); + gpr_asprintf(&name, "tcp-client:%s", remote_addr_str); grpc_fd* fdobj = grpc_fd_create(fd, name, true); gpr_free(name); - gpr_free(addr_str); + gpr_free(remote_addr_str); if (err >= 0) { - char* addr_str = grpc_sockaddr_to_uri(addr); - *ep = grpc_tcp_client_create_from_fd(fdobj, channel_args, addr_str); - gpr_free(addr_str); + char* remote_addr_str = grpc_sockaddr_to_uri(addr); + *ep = grpc_tcp_client_create_from_fd(fdobj, channel_args, remote_addr_str); + gpr_free(remote_addr_str); grpc_core::ExecCtx::Run(DEBUG_LOCATION, closure, GRPC_ERROR_NONE); return; } @@ -319,7 +349,8 @@ void grpc_tcp_client_create_from_prepared_fd( ac->ep = ep; ac->fd = fdobj; ac->interested_parties = interested_parties; - ac->addr_str = grpc_sockaddr_to_uri(addr); + ac->remote_addr_str = grpc_sockaddr_to_uri(addr); + ac->source_addr_str = extract_source_ip(fd); gpr_mu_init(&ac->mu); ac->refs = 2; GRPC_CLOSURE_INIT(&ac->write_closure, on_writable, ac, @@ -328,7 +359,7 @@ void grpc_tcp_client_create_from_prepared_fd( if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) { gpr_log(GPR_INFO, "CLIENT_CONNECT: %s: asynchronously connecting fd %p", - ac->addr_str, fdobj); + ac->remote_addr_str, fdobj); } gpr_mu_lock(&ac->mu); From 52b3c66e536cb3044145c377ba445f7b446c5e8c Mon Sep 17 00:00:00 2001 From: yang-g Date: Mon, 11 May 2020 14:52:36 -0700 Subject: [PATCH 729/758] Cover both subchannel sharing/non-sharing cases in test --- .../surface/sequential_connectivity_test.cc | 124 +++++++++--------- 1 file changed, 64 insertions(+), 60 deletions(-) diff --git a/test/core/surface/sequential_connectivity_test.cc b/test/core/surface/sequential_connectivity_test.cc index 9af60204a12..a838237aef5 100644 --- a/test/core/surface/sequential_connectivity_test.cc +++ b/test/core/surface/sequential_connectivity_test.cc @@ -37,16 +37,15 @@ typedef struct test_fixture { const char* name; void (*add_server_port)(grpc_server* server, const char* addr); - grpc_channel* (*create_channel)(const char* addr); + grpc_channel* (*create_channel)(const char* addr, + grpc_channel_credentials* creds, + bool share_subchannel); + // Have the creds here so all the channels will share the same one to enabled + // subchannel sharing if needed. + grpc_channel_credentials* creds; } test_fixture; -/* TODO(yashykt): When our macos testing infrastructure becomes good enough, we - * wouldn't need to reduce the number of connections on MacOS */ -#ifdef __APPLE__ #define NUM_CONNECTIONS 100 -#else -#define NUM_CONNECTIONS 1000 -#endif /* __APPLE__ */ typedef struct { grpc_server* server; @@ -62,8 +61,32 @@ static void server_thread_func(void* args) { GPR_ASSERT(ev.success == true); } -static void run_test(const test_fixture* fixture) { - gpr_log(GPR_INFO, "TEST: %s", fixture->name); +static grpc_channel* create_test_channel(const char* addr, + grpc_channel_credentials* creds, + bool share_subchannel) { + grpc_channel* channel = nullptr; + const int kMaxArgs = 2; + grpc_arg args[kMaxArgs]; + size_t arg_count = 0; + args[arg_count++] = grpc_channel_arg_integer_create( + const_cast(GRPC_ARG_USE_LOCAL_SUBCHANNEL_POOL), !share_subchannel); + if (creds != nullptr) { + args[arg_count++] = grpc_channel_arg_string_create( + const_cast(GRPC_SSL_TARGET_NAME_OVERRIDE_ARG), + const_cast("foo.test.google.fr")); + } + grpc_channel_args channel_args = {arg_count, args}; + if (creds != nullptr) { + channel = grpc_secure_channel_create(creds, addr, &channel_args, nullptr); + } else { + channel = grpc_insecure_channel_create(addr, &channel_args, nullptr); + } + return channel; +} + +static void run_test(const test_fixture* fixture, bool share_subchannel) { + gpr_log(GPR_INFO, "TEST: %s sharing subchannel: %d", fixture->name, + share_subchannel); grpc_init(); @@ -84,7 +107,8 @@ static void run_test(const test_fixture* fixture) { grpc_completion_queue* cq = grpc_completion_queue_create_for_next(nullptr); grpc_channel* channels[NUM_CONNECTIONS]; for (size_t i = 0; i < NUM_CONNECTIONS; i++) { - channels[i] = fixture->create_channel(addr.c_str()); + channels[i] = + fixture->create_channel(addr.c_str(), fixture->creds, share_subchannel); gpr_timespec connect_deadline = grpc_timeout_seconds_to_deadline(30); grpc_connectivity_state state; @@ -133,27 +157,11 @@ static void insecure_test_add_port(grpc_server* server, const char* addr) { grpc_server_add_insecure_http2_port(server, addr); } -static grpc_channel* insecure_test_create_channel(const char* addr) { - grpc_arg arg = {GRPC_ARG_INTEGER, - const_cast(GRPC_ARG_USE_LOCAL_SUBCHANNEL_POOL), - {.integer = 1}}; - grpc_channel_args* new_client_args = - grpc_channel_args_copy_and_add(nullptr, &arg, 1); - grpc_channel* channel = - grpc_insecure_channel_create(addr, new_client_args, nullptr); - { - grpc_core::ExecCtx exec_ctx; - grpc_channel_args_destroy(new_client_args); - } - return channel; +static grpc_channel* insecure_test_create_channel( + const char* addr, grpc_channel_credentials* creds, bool share_subchannel) { + return create_test_channel(addr, creds, share_subchannel); } -static const test_fixture insecure_test = { - "insecure", - insecure_test_add_port, - insecure_test_create_channel, -}; - static void secure_test_add_port(grpc_server* server, const char* addr) { grpc_slice cert_slice, key_slice; GPR_ASSERT(GRPC_LOG_IF_ERROR( @@ -173,7 +181,25 @@ static void secure_test_add_port(grpc_server* server, const char* addr) { grpc_server_credentials_release(ssl_creds); } -static grpc_channel* secure_test_create_channel(const char* addr) { +static grpc_channel* secure_test_create_channel(const char* addr, + grpc_channel_credentials* creds, + bool share_subchannel) { + return create_test_channel(addr, creds, share_subchannel); +} + +int main(int argc, char** argv) { + grpc::testing::TestEnvironment env(argc, argv); + + const test_fixture insecure_test = { + "insecure", + insecure_test_add_port, + insecure_test_create_channel, + nullptr, + }; + + run_test(&insecure_test, /*share_subchannel=*/true); + run_test(&insecure_test, /*share_subchannel=*/false); + grpc_slice ca_slice; GPR_ASSERT(GRPC_LOG_IF_ERROR("load_file", grpc_load_file(CA_CERT_PATH, 1, &ca_slice))); @@ -182,35 +208,13 @@ static grpc_channel* secure_test_create_channel(const char* addr) { grpc_channel_credentials* ssl_creds = grpc_ssl_credentials_create(test_root_cert, nullptr, nullptr, nullptr); grpc_slice_unref(ca_slice); - const int kNumArgs = 2; - grpc_arg args[kNumArgs] = { - {GRPC_ARG_STRING, - const_cast(GRPC_SSL_TARGET_NAME_OVERRIDE_ARG), - {const_cast("foo.test.google.fr")}}, - {GRPC_ARG_INTEGER, - const_cast(GRPC_ARG_USE_LOCAL_SUBCHANNEL_POOL), - {.integer = 1}}}; - grpc_channel_args* new_client_args = - grpc_channel_args_copy_and_add(nullptr, args, kNumArgs); - grpc_channel* channel = - grpc_secure_channel_create(ssl_creds, addr, new_client_args, nullptr); - { - grpc_core::ExecCtx exec_ctx; - grpc_channel_args_destroy(new_client_args); - } + const test_fixture secure_test = { + "secure", + secure_test_add_port, + secure_test_create_channel, + ssl_creds, + }; + run_test(&secure_test, /*share_subchannel=*/true); + run_test(&secure_test, /*share_subchannel=*/false); grpc_channel_credentials_release(ssl_creds); - return channel; -} - -static const test_fixture secure_test = { - "secure", - secure_test_add_port, - secure_test_create_channel, -}; - -int main(int argc, char** argv) { - grpc::testing::TestEnvironment env(argc, argv); - - run_test(&insecure_test); - run_test(&secure_test); } From 401f76e573b9b2d5dd561cac1f497bed3749f515 Mon Sep 17 00:00:00 2001 From: Alexander Polcyn Date: Mon, 11 May 2020 15:00:31 -0700 Subject: [PATCH 730/758] Incorporate changes to grpc_sockaddr_to_string API --- src/core/lib/iomgr/tcp_client_posix.cc | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/core/lib/iomgr/tcp_client_posix.cc b/src/core/lib/iomgr/tcp_client_posix.cc index 1953141a6db..a01600a0e3b 100644 --- a/src/core/lib/iomgr/tcp_client_posix.cc +++ b/src/core/lib/iomgr/tcp_client_posix.cc @@ -294,11 +294,14 @@ static char* extract_source_ip(int fd) { resolved_address.len = sizeof(resolved_address.addr); char* out = nullptr; if (getsockname(fd, reinterpret_cast(&resolved_address.addr), - &resolved_address.len) == -1 || - grpc_sockaddr_to_string(&out, &resolved_address, false /* normalize */) == - -1) { + &resolved_address.len) != -1) { + std::string result = + grpc_sockaddr_to_string(&resolved_address, false /* normalize */); + out = gpr_strdup(result.c_str()); + } else { gpr_log(GPR_INFO, - "source address will be missing from logs and errors. errno: %d", + "source address will be missing from logs and errors. gotsockname " + "errno: %d", errno); out = gpr_strdup("source_address_extraction_failed"); } From 9c63d75e20a74d354ced3138d579e4c953dd532c Mon Sep 17 00:00:00 2001 From: yang-g Date: Mon, 11 May 2020 15:42:37 -0700 Subject: [PATCH 731/758] Resolve comments --- .../surface/sequential_connectivity_test.cc | 35 ++++++------------- 1 file changed, 10 insertions(+), 25 deletions(-) diff --git a/test/core/surface/sequential_connectivity_test.cc b/test/core/surface/sequential_connectivity_test.cc index a838237aef5..d0ed9a76ec0 100644 --- a/test/core/surface/sequential_connectivity_test.cc +++ b/test/core/surface/sequential_connectivity_test.cc @@ -16,6 +16,8 @@ * */ +#include + #include #include #include @@ -37,9 +39,6 @@ typedef struct test_fixture { const char* name; void (*add_server_port)(grpc_server* server, const char* addr); - grpc_channel* (*create_channel)(const char* addr, - grpc_channel_credentials* creds, - bool share_subchannel); // Have the creds here so all the channels will share the same one to enabled // subchannel sharing if needed. grpc_channel_credentials* creds; @@ -65,17 +64,16 @@ static grpc_channel* create_test_channel(const char* addr, grpc_channel_credentials* creds, bool share_subchannel) { grpc_channel* channel = nullptr; - const int kMaxArgs = 2; - grpc_arg args[kMaxArgs]; - size_t arg_count = 0; - args[arg_count++] = grpc_channel_arg_integer_create( - const_cast(GRPC_ARG_USE_LOCAL_SUBCHANNEL_POOL), !share_subchannel); + std::vector args; + args.push_back(grpc_channel_arg_integer_create( + const_cast(GRPC_ARG_USE_LOCAL_SUBCHANNEL_POOL), + !share_subchannel)); if (creds != nullptr) { - args[arg_count++] = grpc_channel_arg_string_create( + args.push_back(grpc_channel_arg_string_create( const_cast(GRPC_SSL_TARGET_NAME_OVERRIDE_ARG), - const_cast("foo.test.google.fr")); + const_cast("foo.test.google.fr"))); } - grpc_channel_args channel_args = {arg_count, args}; + grpc_channel_args channel_args = {args.size(), args.data()}; if (creds != nullptr) { channel = grpc_secure_channel_create(creds, addr, &channel_args, nullptr); } else { @@ -108,7 +106,7 @@ static void run_test(const test_fixture* fixture, bool share_subchannel) { grpc_channel* channels[NUM_CONNECTIONS]; for (size_t i = 0; i < NUM_CONNECTIONS; i++) { channels[i] = - fixture->create_channel(addr.c_str(), fixture->creds, share_subchannel); + create_test_channel(addr.c_str(), fixture->creds, share_subchannel); gpr_timespec connect_deadline = grpc_timeout_seconds_to_deadline(30); grpc_connectivity_state state; @@ -157,11 +155,6 @@ static void insecure_test_add_port(grpc_server* server, const char* addr) { grpc_server_add_insecure_http2_port(server, addr); } -static grpc_channel* insecure_test_create_channel( - const char* addr, grpc_channel_credentials* creds, bool share_subchannel) { - return create_test_channel(addr, creds, share_subchannel); -} - static void secure_test_add_port(grpc_server* server, const char* addr) { grpc_slice cert_slice, key_slice; GPR_ASSERT(GRPC_LOG_IF_ERROR( @@ -181,19 +174,12 @@ static void secure_test_add_port(grpc_server* server, const char* addr) { grpc_server_credentials_release(ssl_creds); } -static grpc_channel* secure_test_create_channel(const char* addr, - grpc_channel_credentials* creds, - bool share_subchannel) { - return create_test_channel(addr, creds, share_subchannel); -} - int main(int argc, char** argv) { grpc::testing::TestEnvironment env(argc, argv); const test_fixture insecure_test = { "insecure", insecure_test_add_port, - insecure_test_create_channel, nullptr, }; @@ -211,7 +197,6 @@ int main(int argc, char** argv) { const test_fixture secure_test = { "secure", secure_test_add_port, - secure_test_create_channel, ssl_creds, }; run_test(&secure_test, /*share_subchannel=*/true); From 12a64355574716598a7a2c1074e7b2e7c30dced1 Mon Sep 17 00:00:00 2001 From: jiangtaoli2016 Date: Mon, 11 May 2020 22:46:11 -0700 Subject: [PATCH 732/758] TlsCredentialsOption API optimization --- .../grpcpp/security/tls_credentials_options.h | 21 ++++++++++++++++--- src/cpp/common/tls_credentials_options.cc | 20 +++++++++++++++++- test/cpp/client/credentials_test.cc | 14 ++++++------- 3 files changed, 44 insertions(+), 11 deletions(-) diff --git a/include/grpcpp/security/tls_credentials_options.h b/include/grpcpp/security/tls_credentials_options.h index d83226865d8..d29e56eee40 100644 --- a/include/grpcpp/security/tls_credentials_options.h +++ b/include/grpcpp/security/tls_credentials_options.h @@ -19,14 +19,14 @@ #ifndef GRPCPP_SECURITY_TLS_CREDENTIALS_OPTIONS_H #define GRPCPP_SECURITY_TLS_CREDENTIALS_OPTIONS_H -#include -#include - #include #include #include #include +#include +#include + typedef struct grpc_tls_credential_reload_arg grpc_tls_credential_reload_arg; typedef struct grpc_tls_credential_reload_config grpc_tls_credential_reload_config; @@ -278,6 +278,21 @@ class TlsServerAuthorizationCheckConfig { * more details. **/ class TlsCredentialsOptions { public: + // Constructor for client. + explicit TlsCredentialsOptions( + grpc_tls_server_verification_option server_verification_option, + std::shared_ptr key_materials_config, + std::shared_ptr credential_reload_config, + std::shared_ptr + server_authorization_check_config); + + // Constructor for server. + explicit TlsCredentialsOptions( + grpc_ssl_client_certificate_request_type cert_request_type, + std::shared_ptr key_materials_config, + std::shared_ptr credential_reload_config); + + // This constructor will be deprecated. TlsCredentialsOptions( grpc_ssl_client_certificate_request_type cert_request_type, grpc_tls_server_verification_option server_verification_option, diff --git a/src/cpp/common/tls_credentials_options.cc b/src/cpp/common/tls_credentials_options.cc index 23d6495dd20..8c6fd51c0cf 100644 --- a/src/cpp/common/tls_credentials_options.cc +++ b/src/cpp/common/tls_credentials_options.cc @@ -20,7 +20,6 @@ #include #include "absl/container/inlined_vector.h" - #include "src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h" #include "src/cpp/common/tls_credentials_options_util.h" @@ -281,6 +280,25 @@ TlsServerAuthorizationCheckConfig::TlsServerAuthorizationCheckConfig( TlsServerAuthorizationCheckConfig::~TlsServerAuthorizationCheckConfig() {} /** gRPC TLS credential options API implementation **/ +TlsCredentialsOptions::TlsCredentialsOptions( + grpc_tls_server_verification_option server_verification_option, + std::shared_ptr key_materials_config, + std::shared_ptr credential_reload_config, + std::shared_ptr + server_authorization_check_config) + : TlsCredentialsOptions( + GRPC_SSL_DONT_REQUEST_CLIENT_CERTIFICATE, server_verification_option, + std::move(key_materials_config), std::move(credential_reload_config), + std::move(server_authorization_check_config)) {} + +TlsCredentialsOptions::TlsCredentialsOptions( + grpc_ssl_client_certificate_request_type cert_request_type, + std::shared_ptr key_materials_config, + std::shared_ptr credential_reload_config) + : TlsCredentialsOptions(cert_request_type, GRPC_TLS_SERVER_VERIFICATION, + std::move(key_materials_config), + std::move(credential_reload_config), nullptr) {} + TlsCredentialsOptions::TlsCredentialsOptions( grpc_ssl_client_certificate_request_type cert_request_type, grpc_tls_server_verification_option server_verification_option, diff --git a/test/cpp/client/credentials_test.cc b/test/cpp/client/credentials_test.cc index c1293aebf30..c8d2713140a 100644 --- a/test/cpp/client/credentials_test.cc +++ b/test/cpp/client/credentials_test.cc @@ -16,16 +16,16 @@ * */ +#include +#include #include #include #include #include -#include - -#include -#include #include +#include + #include "src/core/lib/gpr/env.h" #include "src/core/lib/gpr/tmpfile.h" #include "src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h" @@ -573,12 +573,13 @@ TEST_F(CredentialsTest, TlsCredentialsOptionsCppToC) { test_server_authorization_check)); TlsCredentialsOptions options = TlsCredentialsOptions( - GRPC_SSL_REQUEST_CLIENT_CERTIFICATE_AND_VERIFY, GRPC_TLS_SERVER_VERIFICATION, key_materials_config, credential_reload_config, server_authorization_check_config); grpc_tls_credentials_options* c_options = options.c_credentials_options(); EXPECT_EQ(c_options->cert_request_type(), - GRPC_SSL_REQUEST_CLIENT_CERTIFICATE_AND_VERIFY); + GRPC_SSL_DONT_REQUEST_CLIENT_CERTIFICATE); + EXPECT_EQ(c_options->server_verification_option(), + GRPC_TLS_SERVER_VERIFICATION); grpc_tls_key_materials_config* c_key_materials_config = c_options->key_materials_config(); grpc_tls_credential_reload_config* c_credential_reload_config = @@ -678,7 +679,6 @@ TEST_F(CredentialsTest, LoadTlsChannelCredentials) { test_server_authorization_check)); TlsCredentialsOptions options = TlsCredentialsOptions( - GRPC_SSL_REQUEST_CLIENT_CERTIFICATE_AND_VERIFY, GRPC_TLS_SERVER_VERIFICATION, nullptr, credential_reload_config, server_authorization_check_config); std::shared_ptr channel_credentials = From 516c2f591aa95f746c7bcd5d7de1650853930eed Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Tue, 12 May 2020 04:43:57 -0700 Subject: [PATCH 733/758] Fail decompression when the gzip trailer is missing --- src/core/lib/compression/message_compress.cc | 4 +++ .../core/compression/message_compress_test.cc | 29 +++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/src/core/lib/compression/message_compress.cc b/src/core/lib/compression/message_compress.cc index 7faa1dcd828..bea29798b6c 100644 --- a/src/core/lib/compression/message_compress.cc +++ b/src/core/lib/compression/message_compress.cc @@ -68,6 +68,10 @@ static int zlib_body(z_stream* zs, grpc_slice_buffer* input, goto error; } } + if (r != Z_STREAM_END) { + gpr_log(GPR_INFO, "zlib: Data error"); + goto error; + } GPR_ASSERT(outbuf.refcount); outbuf.data.refcounted.length -= zs->avail_out; diff --git a/test/core/compression/message_compress_test.cc b/test/core/compression/message_compress_test.cc index e2abf2d3215..5c833f33194 100644 --- a/test/core/compression/message_compress_test.cc +++ b/test/core/compression/message_compress_test.cc @@ -196,6 +196,34 @@ static void test_bad_decompression_data_crc(void) { grpc_slice_buffer_destroy(&output); } +static void test_bad_decompression_data_missing_trailer(void) { + grpc_slice_buffer input; + grpc_slice_buffer corrupted; + grpc_slice_buffer output; + size_t idx; + + grpc_slice_buffer_init(&input); + grpc_slice_buffer_init(&corrupted); + grpc_slice_buffer_init(&output); + grpc_slice_buffer_add(&input, create_test_value(ONE_MB_A)); + + grpc_core::ExecCtx exec_ctx; + /* compress it */ + grpc_msg_compress(GRPC_MESSAGE_COMPRESS_GZIP, &input, &corrupted); + /* corrupt the output by smashing the CRC */ + GPR_ASSERT(corrupted.count > 1); + GPR_ASSERT(GRPC_SLICE_LENGTH(corrupted.slices[1]) > 8); + corrupted.slices[1].data.refcounted.length -= 8; + + /* try (and fail) to decompress the corrupted compresed buffer */ + GPR_ASSERT(0 == grpc_msg_decompress(GRPC_MESSAGE_COMPRESS_GZIP, &corrupted, + &output)); + + grpc_slice_buffer_destroy(&input); + grpc_slice_buffer_destroy(&corrupted); + grpc_slice_buffer_destroy(&output); +} + static void test_bad_decompression_data_trailing_garbage(void) { grpc_slice_buffer input; grpc_slice_buffer output; @@ -315,6 +343,7 @@ int main(int argc, char** argv) { test_tiny_data_compress(); test_bad_decompression_data_crc(); + test_bad_decompression_data_missing_trailer(); test_bad_decompression_data_stream(); test_bad_decompression_data_trailing_garbage(); test_bad_compression_algorithm(); From d92cd56424fdba023fdd2cbbe596d436d014478e Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Tue, 12 May 2020 16:51:43 +0200 Subject: [PATCH 734/758] simplify running of C# RouteGuide example --- .../RouteGuide/RouteGuide/RouteGuide.csproj | 2 +- .../RouteGuide/RouteGuide/RouteGuideUtil.cs | 22 +++++++++++++++---- .../RouteGuide/RouteGuideClient/Program.cs | 2 +- .../RouteGuide/RouteGuideServer/Program.cs | 2 +- 4 files changed, 21 insertions(+), 7 deletions(-) diff --git a/examples/csharp/RouteGuide/RouteGuide/RouteGuide.csproj b/examples/csharp/RouteGuide/RouteGuide/RouteGuide.csproj index bd374a887c1..712df6150aa 100644 --- a/examples/csharp/RouteGuide/RouteGuide/RouteGuide.csproj +++ b/examples/csharp/RouteGuide/RouteGuide/RouteGuide.csproj @@ -16,7 +16,7 @@ - + diff --git a/examples/csharp/RouteGuide/RouteGuide/RouteGuideUtil.cs b/examples/csharp/RouteGuide/RouteGuide/RouteGuideUtil.cs index 96bd8ca09b9..29cd6b9bf9a 100644 --- a/examples/csharp/RouteGuide/RouteGuide/RouteGuideUtil.cs +++ b/examples/csharp/RouteGuide/RouteGuide/RouteGuideUtil.cs @@ -18,6 +18,7 @@ using System; using System.Collections.Generic; using System.IO; using System.Linq; +using System.Reflection; using System.Text; using System.Threading.Tasks; @@ -28,7 +29,7 @@ namespace Routeguide /// public static class RouteGuideUtil { - public const string DefaultFeaturesFile = "route_guide_db.json"; + public const string DefaultFeaturesResourceName = "RouteGuide.route_guide_db.json"; private const double CoordFactor = 1e7; @@ -90,12 +91,12 @@ namespace Routeguide } /// - /// Parses features from a JSON file. + /// Parses features from an embedded resource. /// - public static List ParseFeatures(string filename) + public static List LoadFeatures() { var features = new List(); - var jsonFeatures = JsonConvert.DeserializeObject>(File.ReadAllText(filename)); + var jsonFeatures = JsonConvert.DeserializeObject>(ReadFeaturesFromResource()); foreach(var jsonFeature in jsonFeatures) { @@ -108,6 +109,19 @@ namespace Routeguide return features; } + private static string ReadFeaturesFromResource() + { + var stream = typeof(RouteGuideUtil).GetTypeInfo().Assembly.GetManifestResourceStream(DefaultFeaturesResourceName); + if (stream == null) + { + throw new IOException(string.Format("Error loading the embedded resource \"{0}\"", DefaultFeaturesResourceName)); + } + using (var streamReader = new StreamReader(stream)) + { + return streamReader.ReadToEnd(); + } + } + #pragma warning disable 0649 // Suppresses "Field 'x' is never assigned to". private class JsonFeature { diff --git a/examples/csharp/RouteGuide/RouteGuideClient/Program.cs b/examples/csharp/RouteGuide/RouteGuideClient/Program.cs index 9ce0cbcad3a..accaf0a0ec9 100644 --- a/examples/csharp/RouteGuide/RouteGuideClient/Program.cs +++ b/examples/csharp/RouteGuide/RouteGuideClient/Program.cs @@ -228,7 +228,7 @@ namespace Routeguide client.ListFeatures(400000000, -750000000, 420000000, -730000000).Wait(); // Record a few randomly selected points from the features file. - client.RecordRoute(RouteGuideUtil.ParseFeatures(RouteGuideUtil.DefaultFeaturesFile), 10).Wait(); + client.RecordRoute(RouteGuideUtil.LoadFeatures(), 10).Wait(); // Send and receive some notes. client.RouteChat().Wait(); diff --git a/examples/csharp/RouteGuide/RouteGuideServer/Program.cs b/examples/csharp/RouteGuide/RouteGuideServer/Program.cs index 4548ddf8e73..a79f8a1a28f 100644 --- a/examples/csharp/RouteGuide/RouteGuideServer/Program.cs +++ b/examples/csharp/RouteGuide/RouteGuideServer/Program.cs @@ -27,7 +27,7 @@ namespace Routeguide { const int Port = 50052; - var features = RouteGuideUtil.ParseFeatures(RouteGuideUtil.DefaultFeaturesFile); + var features = RouteGuideUtil.LoadFeatures(); Server server = new Server { From ef6ff6dcfde7e65f114650c57151b73ea87e9ea1 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Tue, 12 May 2020 10:43:12 -0700 Subject: [PATCH 735/758] Make linters happy --- src/python/grpcio/grpc/_common.py | 2 +- src/python/grpcio/grpc/experimental/__init__.py | 2 +- .../tests_aio/unit/server_interceptor_test.py | 13 ++++++++----- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/python/grpcio/grpc/_common.py b/src/python/grpcio/grpc/_common.py index 3c455678ff0..27fc80b1498 100644 --- a/src/python/grpcio/grpc/_common.py +++ b/src/python/grpcio/grpc/_common.py @@ -15,9 +15,9 @@ import logging import time +import six import grpc -import six from grpc._cython import cygrpc _LOGGER = logging.getLogger(__name__) diff --git a/src/python/grpcio/grpc/experimental/__init__.py b/src/python/grpcio/grpc/experimental/__init__.py index 83f0b860eb7..083a7638486 100644 --- a/src/python/grpcio/grpc/experimental/__init__.py +++ b/src/python/grpcio/grpc/experimental/__init__.py @@ -92,7 +92,7 @@ def wrap_server_method_handler(wrapper, handler): if not handler.request_streaming: if not handler.response_streaming: # NOTE(lidiz) _replace is a public API: - # https://docs.python.org/dev/library/collections.html#collections.somenamedtuple._replace + # https://docs.python.org/dev/library/collections.html return handler._replace(unary_unary=wrapper(handler.unary_unary)) else: return handler._replace(unary_stream=wrapper(handler.unary_stream)) diff --git a/src/python/grpcio_tests/tests_aio/unit/server_interceptor_test.py b/src/python/grpcio_tests/tests_aio/unit/server_interceptor_test.py index ad56a44aa1c..c93fe1b7b0e 100644 --- a/src/python/grpcio_tests/tests_aio/unit/server_interceptor_test.py +++ b/src/python/grpcio_tests/tests_aio/unit/server_interceptor_test.py @@ -196,19 +196,22 @@ class TestServerInterceptor(AioTestBase): # Get the actual handler handler = await continuation(handler_call_details) - def wrap_handler(handler: grpc.RpcMethodHandler): + def wrapper(behavior: Callable[ + [messages_pb2.SimpleRequest, aio. + ServerInterceptor], messages_pb2.SimpleResponse]): - @functools.wraps(handler) + @functools.wraps(behavior) async def wrapper(request: messages_pb2.SimpleRequest, - context: aio.ServicerContext): + context: aio.ServicerContext + ) -> messages_pb2.SimpleResponse: if request.response_size not in cache_store: - cache_store[request.response_size] = await handler( + cache_store[request.response_size] = await behavior( request, context) return cache_store[request.response_size] return wrapper - return wrap_server_method_handler(wrap_handler, handler) + return wrap_server_method_handler(wrapper, handler) # Constructs a server with the cache interceptor server, stub = await _create_server_stub_pair( From 17b6be1ed8f5276a08c8eebb89d2d2fc9595f8ef Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Tue, 12 May 2020 11:13:38 -0700 Subject: [PATCH 736/758] Reviewer comments --- src/core/lib/compression/message_compress.cc | 2 +- test/core/compression/message_compress_test.cc | 8 +++----- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/core/lib/compression/message_compress.cc b/src/core/lib/compression/message_compress.cc index bea29798b6c..f7c7614d81e 100644 --- a/src/core/lib/compression/message_compress.cc +++ b/src/core/lib/compression/message_compress.cc @@ -34,7 +34,7 @@ static int zlib_body(z_stream* zs, grpc_slice_buffer* input, grpc_slice_buffer* output, int (*flate)(z_stream* zs, int flush)) { - int r; + int r = Z_OK; int flush; size_t i; grpc_slice outbuf = GRPC_SLICE_MALLOC(OUTPUT_BLOCK_SIZE); diff --git a/test/core/compression/message_compress_test.cc b/test/core/compression/message_compress_test.cc index 5c833f33194..6a2d46602ab 100644 --- a/test/core/compression/message_compress_test.cc +++ b/test/core/compression/message_compress_test.cc @@ -210,12 +210,10 @@ static void test_bad_decompression_data_missing_trailer(void) { grpc_core::ExecCtx exec_ctx; /* compress it */ grpc_msg_compress(GRPC_MESSAGE_COMPRESS_GZIP, &input, &corrupted); - /* corrupt the output by smashing the CRC */ - GPR_ASSERT(corrupted.count > 1); - GPR_ASSERT(GRPC_SLICE_LENGTH(corrupted.slices[1]) > 8); + GPR_ASSERT(GRPC_SLICE_LENGTH(corrupted.slices[corrupted.count - 1]) > 8); + /* Remove the footer by manipulating the slice length */ corrupted.slices[1].data.refcounted.length -= 8; - - /* try (and fail) to decompress the corrupted compresed buffer */ + /* try (and fail) to decompress the compressed buffer without the footer */ GPR_ASSERT(0 == grpc_msg_decompress(GRPC_MESSAGE_COMPRESS_GZIP, &corrupted, &output)); From 8f11aba81825b3307c3de211857ae857acd5d5e5 Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Tue, 12 May 2020 11:26:11 -0700 Subject: [PATCH 737/758] Reviewer comments --- .../core/compression/message_compress_test.cc | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/test/core/compression/message_compress_test.cc b/test/core/compression/message_compress_test.cc index 6a2d46602ab..9615582f78d 100644 --- a/test/core/compression/message_compress_test.cc +++ b/test/core/compression/message_compress_test.cc @@ -198,27 +198,29 @@ static void test_bad_decompression_data_crc(void) { static void test_bad_decompression_data_missing_trailer(void) { grpc_slice_buffer input; - grpc_slice_buffer corrupted; + grpc_slice_buffer decompressed; + grpc_slice_buffer garbage; grpc_slice_buffer output; - size_t idx; grpc_slice_buffer_init(&input); - grpc_slice_buffer_init(&corrupted); + grpc_slice_buffer_init(&decompressed); + grpc_slice_buffer_init(&garbage); grpc_slice_buffer_init(&output); grpc_slice_buffer_add(&input, create_test_value(ONE_MB_A)); grpc_core::ExecCtx exec_ctx; /* compress it */ - grpc_msg_compress(GRPC_MESSAGE_COMPRESS_GZIP, &input, &corrupted); - GPR_ASSERT(GRPC_SLICE_LENGTH(corrupted.slices[corrupted.count - 1]) > 8); - /* Remove the footer by manipulating the slice length */ - corrupted.slices[1].data.refcounted.length -= 8; + grpc_msg_compress(GRPC_MESSAGE_COMPRESS_GZIP, &input, &decompressed); + GPR_ASSERT(decompressed.length > 8); + /* Remove the footer from the decompressed message */ + grpc_slice_buffer_trim_end(&decompressed, 8, &garbage); /* try (and fail) to decompress the compressed buffer without the footer */ - GPR_ASSERT(0 == grpc_msg_decompress(GRPC_MESSAGE_COMPRESS_GZIP, &corrupted, + GPR_ASSERT(0 == grpc_msg_decompress(GRPC_MESSAGE_COMPRESS_GZIP, &decompressed, &output)); grpc_slice_buffer_destroy(&input); - grpc_slice_buffer_destroy(&corrupted); + grpc_slice_buffer_destroy(&decompressed); + grpc_slice_buffer_destroy(&garbage); grpc_slice_buffer_destroy(&output); } From 1d7f3b130b439c876db56461920dbadfd0f4c7ba Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Tue, 12 May 2020 11:31:36 -0700 Subject: [PATCH 738/758] Reviewer comments --- src/core/lib/compression/message_compress.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/lib/compression/message_compress.cc b/src/core/lib/compression/message_compress.cc index f7c7614d81e..7c2a70bad4e 100644 --- a/src/core/lib/compression/message_compress.cc +++ b/src/core/lib/compression/message_compress.cc @@ -34,7 +34,7 @@ static int zlib_body(z_stream* zs, grpc_slice_buffer* input, grpc_slice_buffer* output, int (*flate)(z_stream* zs, int flush)) { - int r = Z_OK; + int r = Z_STREAM_END; /* Do not fail on an empty input. */ int flush; size_t i; grpc_slice outbuf = GRPC_SLICE_MALLOC(OUTPUT_BLOCK_SIZE); From 7eeab2a23c1b9bf3abd97f380dd560f0175ed822 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Tue, 12 May 2020 12:52:27 -0700 Subject: [PATCH 739/758] Describe the expectations of input arguments and return values --- src/python/grpcio/grpc/experimental/__init__.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/python/grpcio/grpc/experimental/__init__.py b/src/python/grpcio/grpc/experimental/__init__.py index 083a7638486..eb642900d9c 100644 --- a/src/python/grpcio/grpc/experimental/__init__.py +++ b/src/python/grpcio/grpc/experimental/__init__.py @@ -85,6 +85,14 @@ def wrap_server_method_handler(wrapper, handler): The server implementation requires all server handlers being wrapped as RpcMethodHandler objects. This helper function ease the pain of writing server handler wrappers. + + Args: + wrapper: A wrapper function that takes in a method handler behavior + (the actual function) and returns a wrapped function. + handler: A RpcMethodHandler object to be wrapped. + + Returns: + A newly created RpcMethodHandler. """ if not handler: return None From 9ad561c436f1b437e08a8b2017b524ebd22829d4 Mon Sep 17 00:00:00 2001 From: Donna Dionne Date: Tue, 12 May 2020 13:52:10 -0700 Subject: [PATCH 740/758] Integrating weighted target policy into xds routing policy --- .../weighted_target/weighted_target.cc | 1 + .../ext/filters/client_channel/xds/xds_api.cc | 101 ++- .../ext/filters/client_channel/xds/xds_api.h | 35 +- .../filters/client_channel/xds/xds_client.cc | 206 +++++- .../filters/client_channel/xds/xds_client.h | 32 +- .../grpc/testing/xds/lds_rds_for_test.proto | 16 + test/cpp/end2end/xds_end2end_test.cc | 657 ++++++++++++++++-- 7 files changed, 908 insertions(+), 140 deletions(-) diff --git a/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc b/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc index acbbcf0f957..96491b68642 100644 --- a/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +++ b/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc @@ -302,6 +302,7 @@ void WeightedTargetLb::UpdateLocked(UpdateArgs args) { targets_[name]->UpdateLocked(config, std::move(address_map[name]), args.args); } + UpdateStateLocked(); } void WeightedTargetLb::UpdateStateLocked() { diff --git a/src/core/ext/filters/client_channel/xds/xds_api.cc b/src/core/ext/filters/client_channel/xds/xds_api.cc index 92acfc01486..b4186088496 100644 --- a/src/core/ext/filters/client_channel/xds/xds_api.cc +++ b/src/core/ext/filters/client_channel/xds/xds_api.cc @@ -298,6 +298,10 @@ inline absl::string_view UpbStringToAbsl(const upb_strview& str) { return absl::string_view(str.data, str.size); } +inline std::string UpbStringToStdString(const upb_strview& str) { + return std::string(str.data, str.size); +} + inline void AddStringField(const char* name, const upb_strview& value, std::vector* fields, bool add_if_empty = false) { @@ -1023,7 +1027,7 @@ grpc_error* RouteConfigParse( const envoy_api_v2_route_Route* route = routes[i]; const envoy_api_v2_route_RouteMatch* match = envoy_api_v2_route_Route_match(route); - XdsApi::RdsRoute rds_route; + XdsApi::RdsUpdate::RdsRoute rds_route; if (envoy_api_v2_route_RouteMatch_has_prefix(match)) { upb_strview prefix = envoy_api_v2_route_RouteMatch_prefix(match); // Empty prefix "" is accepted. @@ -1085,18 +1089,65 @@ grpc_error* RouteConfigParse( } const envoy_api_v2_route_RouteAction* route_action = envoy_api_v2_route_Route_route(route); - // Get the cluster in the RouteAction. - if (!envoy_api_v2_route_RouteAction_has_cluster(route_action)) { - return GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "No cluster found in RouteAction."); - } - const upb_strview action = - envoy_api_v2_route_RouteAction_cluster(route_action); - if (action.size == 0) { + // Get the cluster or weighted_clusters in the RouteAction. + if (envoy_api_v2_route_RouteAction_has_cluster(route_action)) { + const upb_strview cluster_name = + envoy_api_v2_route_RouteAction_cluster(route_action); + if (cluster_name.size == 0) { + return GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "RouteAction cluster contains empty cluster name."); + } + rds_route.cluster_name = UpbStringToStdString(cluster_name); + } else if (envoy_api_v2_route_RouteAction_has_weighted_clusters( + route_action)) { + const envoy_api_v2_route_WeightedCluster* weighted_cluster = + envoy_api_v2_route_RouteAction_weighted_clusters(route_action); + uint32_t total_weight = 100; + const google_protobuf_UInt32Value* weight = + envoy_api_v2_route_WeightedCluster_total_weight(weighted_cluster); + if (weight != nullptr) { + total_weight = google_protobuf_UInt32Value_value(weight); + } + size_t clusters_size; + const envoy_api_v2_route_WeightedCluster_ClusterWeight* const* clusters = + envoy_api_v2_route_WeightedCluster_clusters(weighted_cluster, + &clusters_size); + uint32_t sum_of_weights = 0; + for (size_t j = 0; j < clusters_size; ++j) { + const envoy_api_v2_route_WeightedCluster_ClusterWeight* cluster_weight = + clusters[j]; + XdsApi::RdsUpdate::RdsRoute::ClusterWeight cluster; + cluster.name = UpbStringToStdString( + envoy_api_v2_route_WeightedCluster_ClusterWeight_name( + cluster_weight)); + if (cluster.name.empty()) { + return GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "RouteAction weighted_cluster cluster contains empty cluster " + "name."); + } + const google_protobuf_UInt32Value* weight = + envoy_api_v2_route_WeightedCluster_ClusterWeight_weight( + cluster_weight); + if (weight == nullptr) { + return GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "RouteAction weighted_cluster cluster missing weight"); + } + cluster.weight = google_protobuf_UInt32Value_value(weight); + sum_of_weights += cluster.weight; + rds_route.weighted_clusters.emplace_back(std::move(cluster)); + } + if (total_weight != sum_of_weights) { + return GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "RouteAction weighted_cluster has incorrect total weight"); + } + if (rds_route.weighted_clusters.empty()) { + return GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "RouteAction weighted_cluster has no valid clusters specified."); + } + } else { return GRPC_ERROR_CREATE_FROM_STATIC_STRING( - "RouteAction contains empty cluster."); + "No cluster or weighted_clusters found in RouteAction."); } - rds_route.cluster_name = std::string(action.data, action.size); rds_update->routes.emplace_back(std::move(rds_route)); } if (rds_update->routes.empty()) { @@ -1190,12 +1241,10 @@ grpc_error* LdsResponseParse(XdsClient* client, TraceFlag* tracer, "HttpConnectionManager ConfigSource for RDS does not specify ADS."); } // Get the route_config_name. - const upb_strview route_config_name = - envoy_config_filter_network_http_connection_manager_v2_Rds_route_config_name( - rds); lds_update->emplace(); - (*lds_update)->route_config_name = - std::string(route_config_name.data, route_config_name.size); + (*lds_update)->route_config_name = UpbStringToStdString( + envoy_config_filter_network_http_connection_manager_v2_Rds_route_config_name( + rds)); return GRPC_ERROR_NONE; } return GRPC_ERROR_NONE; @@ -1297,8 +1346,7 @@ grpc_error* CdsResponseParse( upb_strview service_name = envoy_api_v2_Cluster_EdsClusterConfig_service_name(eds_cluster_config); if (service_name.size != 0) { - cds_update.eds_service_name = - std::string(service_name.data, service_name.size); + cds_update.eds_service_name = UpbStringToStdString(service_name); } // Check the LB policy. if (envoy_api_v2_Cluster_lb_policy(cluster) != @@ -1316,7 +1364,7 @@ grpc_error* CdsResponseParse( } cds_update.lrs_load_reporting_server_name.emplace(""); } - cds_update_map->emplace(std::string(cluster_name.data, cluster_name.size), + cds_update_map->emplace(UpbStringToStdString(cluster_name), std::move(cds_update)); } return GRPC_ERROR_NONE; @@ -1377,8 +1425,8 @@ grpc_error* LocalityParse( upb_strview zone = envoy_api_v2_core_Locality_region(locality); upb_strview sub_zone = envoy_api_v2_core_Locality_sub_zone(locality); output_locality->name = MakeRefCounted( - std::string(region.data, region.size), std::string(zone.data, zone.size), - std::string(sub_zone.data, sub_zone.size)); + UpbStringToStdString(region), UpbStringToStdString(zone), + UpbStringToStdString(sub_zone)); // Parse the addresses. size_t size; const envoy_api_v2_endpoint_LbEndpoint* const* lb_endpoints = @@ -1428,8 +1476,7 @@ grpc_error* DropParseAndAppend( } // Cap numerator to 1000000. numerator = GPR_MIN(numerator, 1000000); - drop_config->AddCategory(std::string(category.data, category.size), - numerator); + drop_config->AddCategory(UpbStringToStdString(category), numerator); return GRPC_ERROR_NONE; } @@ -1508,7 +1555,7 @@ grpc_error* EdsResponseParse( if (error != GRPC_ERROR_NONE) return error; } } - eds_update_map->emplace(std::string(cluster_name.data, cluster_name.size), + eds_update_map->emplace(UpbStringToStdString(cluster_name), std::move(eds_update)); } return GRPC_ERROR_NONE; @@ -1542,12 +1589,12 @@ grpc_error* XdsApi::ParseAdsResponse( // Record the type_url, the version_info, and the nonce of the response. upb_strview type_url_strview = envoy_api_v2_DiscoveryResponse_type_url(response); - *type_url = std::string(type_url_strview.data, type_url_strview.size); + *type_url = UpbStringToStdString(type_url_strview); upb_strview version_info = envoy_api_v2_DiscoveryResponse_version_info(response); - *version = std::string(version_info.data, version_info.size); + *version = UpbStringToStdString(version_info); upb_strview nonce_strview = envoy_api_v2_DiscoveryResponse_nonce(response); - *nonce = std::string(nonce_strview.data, nonce_strview.size); + *nonce = UpbStringToStdString(nonce_strview); // Parse the response according to the resource type. if (*type_url == kLdsTypeUrl) { return LdsResponseParse(client_, tracer_, response, expected_server_name, diff --git a/src/core/ext/filters/client_channel/xds/xds_api.h b/src/core/ext/filters/client_channel/xds/xds_api.h index f9a906400ee..cb77cb0bc45 100644 --- a/src/core/ext/filters/client_channel/xds/xds_api.h +++ b/src/core/ext/filters/client_channel/xds/xds_api.h @@ -45,18 +45,31 @@ class XdsApi { static const char* kCdsTypeUrl; static const char* kEdsTypeUrl; - struct RdsRoute { - std::string service; - std::string method; - std::string cluster_name; - - bool operator==(const RdsRoute& other) const { - return (service == other.service && method == other.method && - cluster_name == other.cluster_name); - } - }; - struct RdsUpdate { + struct RdsRoute { + std::string service; + std::string method; + // TODO(donnadionne): When we can use absl::variant<>, consider using that + // here, to enforce the fact that only one of cluster_name and + // weighted_clusters can be set. + std::string cluster_name; + struct ClusterWeight { + std::string name; + uint32_t weight; + + bool operator==(const ClusterWeight& other) const { + return (name == other.name && weight == other.weight); + } + }; + std::vector weighted_clusters; + + bool operator==(const RdsRoute& other) const { + return (service == other.service && method == other.method && + cluster_name == other.cluster_name && + weighted_clusters == other.weighted_clusters); + } + }; + std::vector routes; bool operator==(const RdsUpdate& other) const { diff --git a/src/core/ext/filters/client_channel/xds/xds_client.cc b/src/core/ext/filters/client_channel/xds/xds_client.cc index 973b03ceb00..49537dab8a2 100644 --- a/src/core/ext/filters/client_channel/xds/xds_client.cc +++ b/src/core/ext/filters/client_channel/xds/xds_client.cc @@ -2055,10 +2055,10 @@ std::string CreateServiceConfigActionCluster(const std::string& cluster_name) { " }\n" " } ]\n" " }", - cluster_name.c_str(), cluster_name.c_str()); + cluster_name, cluster_name); } -std::string CreateServiceConfigRoute(const std::string& cluster_name, +std::string CreateServiceConfigRoute(const std::string& action_name, const std::string& service, const std::string& method) { return absl::StrFormat( @@ -2067,43 +2067,203 @@ std::string CreateServiceConfigRoute(const std::string& cluster_name, " \"service\": \"%s\",\n" " \"method\": \"%s\"\n" " },\n" - " \"action\": \"cds:%s\"\n" + " \"action\": \"%s\"\n" " }", - service.c_str(), method.c_str(), cluster_name.c_str()); + service, method, action_name); } + +// Create the service config for one weighted cluster. +std::string CreateServiceConfigActionWeightedCluster( + const std::string& name, + const std::vector& clusters) { + std::vector config_parts; + config_parts.push_back( + absl::StrFormat(" \"weighted:%s\":{\n" + " \"child_policy\":[ {\n" + " \"weighted_target_experimental\":{\n" + " \"targets\":{\n", + name)); + std::vector weighted_targets; + weighted_targets.reserve(clusters.size()); + for (const auto& cluster_weight : clusters) { + weighted_targets.push_back(absl::StrFormat( + " \"%s\":{\n" + " \"weight\":%d,\n" + " \"childPolicy\":[ {\n" + " \"cds_experimental\":{\n" + " \"cluster\": \"%s\"\n" + " }\n" + " } ]\n" + " }", + cluster_weight.name, cluster_weight.weight, cluster_weight.name)); + } + config_parts.push_back(absl::StrJoin(weighted_targets, ",\n")); + config_parts.push_back( + " }\n" + " }\n" + " } ]\n" + " }"); + return absl::StrJoin(config_parts, ""); +} + +struct WeightedClustersKeys { + std::string cluster_names_key; + std::string cluster_weights_key; +}; + +// Returns the cluster names and weights key or the cluster names only key. +WeightedClustersKeys GetWeightedClustersKey( + const std::vector& + weighted_clusters) { + std::set cluster_names; + std::set cluster_weights; + for (const auto& cluster_weight : weighted_clusters) { + cluster_names.emplace(absl::StrFormat("%s", cluster_weight.name)); + cluster_weights.emplace( + absl::StrFormat("%s_%d", cluster_weight.name, cluster_weight.weight)); + } + return {absl::StrJoin(cluster_names, "_"), + absl::StrJoin(cluster_weights, "_")}; +} + } // namespace +std::string XdsClient::WeightedClustersActionName( + const std::vector& + weighted_clusters) { + WeightedClustersKeys keys = GetWeightedClustersKey(weighted_clusters); + auto cluster_names_map_it = + weighted_cluster_index_map_.find(keys.cluster_names_key); + GPR_ASSERT(cluster_names_map_it != weighted_cluster_index_map_.end()); + const auto& cluster_weights_map = + cluster_names_map_it->second.cluster_weights_map; + auto cluster_weights_map_it = + cluster_weights_map.find(keys.cluster_weights_key); + GPR_ASSERT(cluster_weights_map_it != cluster_weights_map.end()); + return absl::StrFormat("%s_%d", keys.cluster_names_key, + cluster_weights_map_it->second); +} + +void XdsClient::UpdateWeightedClusterIndexMap( + const XdsApi::RdsUpdate& rds_update) { + // Construct a list of unique WeightedCluster + // actions which we need to process: to find action names + std::map + actions_to_process; + for (const auto& route : rds_update.routes) { + if (!route.weighted_clusters.empty()) { + WeightedClustersKeys keys = + GetWeightedClustersKey(route.weighted_clusters); + auto action_it = actions_to_process.find(keys.cluster_weights_key); + if (action_it == actions_to_process.end()) { + actions_to_process[std::move(keys.cluster_weights_key)] = + std::move(keys.cluster_names_key); + } + } + } + // First pass of all unique WeightedCluster actions: if the exact same + // weighted target policy (same clusters and weights) appears in the old map, + // then that old action name is taken again and should be moved to the new + // map; any other action names from the old set of actions are candidates for + // reuse. + XdsClient::WeightedClusterIndexMap new_weighted_cluster_index_map; + for (auto action_it = actions_to_process.begin(); + action_it != actions_to_process.end();) { + const std::string& cluster_names_key = action_it->second; + const std::string& cluster_weights_key = action_it->first; + auto old_cluster_names_map_it = + weighted_cluster_index_map_.find(cluster_names_key); + if (old_cluster_names_map_it != weighted_cluster_index_map_.end()) { + // Add cluster_names_key to the new map and copy next_index. + auto& new_cluster_names_info = + new_weighted_cluster_index_map[cluster_names_key]; + new_cluster_names_info.next_index = + old_cluster_names_map_it->second.next_index; + // Lookup cluster_weights_key in old map. + auto& old_cluster_weights_map = + old_cluster_names_map_it->second.cluster_weights_map; + auto old_cluster_weights_map_it = + old_cluster_weights_map.find(cluster_weights_key); + if (old_cluster_weights_map_it != old_cluster_weights_map.end()) { + // same policy found, move from old map to new map. + new_cluster_names_info.cluster_weights_map[cluster_weights_key] = + old_cluster_weights_map_it->second; + old_cluster_weights_map.erase(old_cluster_weights_map_it); + // This action has been added to new map, so no need to process it + // again. + action_it = actions_to_process.erase(action_it); + continue; + } + } + ++action_it; + } + // Second pass of all remaining unique WeightedCluster actions: if clusters + // for a new action are the same as an old unused action, reuse the name. If + // clusters differ, use a brand new name. + for (const auto& action : actions_to_process) { + const std::string& cluster_names_key = action.second; + const std::string& cluster_weights_key = action.first; + auto& new_cluster_names_info = + new_weighted_cluster_index_map[cluster_names_key]; + auto& old_cluster_weights_map = + weighted_cluster_index_map_[cluster_names_key].cluster_weights_map; + auto old_cluster_weights_it = old_cluster_weights_map.begin(); + if (old_cluster_weights_it != old_cluster_weights_map.end()) { + // There is something to reuse: this action uses the same set + // of clusters as a previous action and that action name is not + // already taken. + new_cluster_names_info.cluster_weights_map[cluster_weights_key] = + old_cluster_weights_it->second; + // Remove the name from being able to reuse again. + old_cluster_weights_map.erase(old_cluster_weights_it); + } else { + // There is nothing to reuse, take the next index to use and + // increment. + new_cluster_names_info.cluster_weights_map[cluster_weights_key] = + new_cluster_names_info.next_index++; + } + } + weighted_cluster_index_map_ = std::move(new_weighted_cluster_index_map); +} + grpc_error* XdsClient::CreateServiceConfig( const XdsApi::RdsUpdate& rds_update, - RefCountedPtr* service_config) const { + RefCountedPtr* service_config) { + UpdateWeightedClusterIndexMap(rds_update); + std::vector actions_vector; + std::vector route_table; + std::set actions_set; + for (const auto& route : rds_update.routes) { + const std::string action_name = + route.weighted_clusters.empty() + ? route.cluster_name + : WeightedClustersActionName(route.weighted_clusters); + if (actions_set.find(action_name) == actions_set.end()) { + actions_set.emplace(action_name); + actions_vector.push_back( + route.weighted_clusters.empty() + ? CreateServiceConfigActionCluster(action_name) + : CreateServiceConfigActionWeightedCluster( + action_name, route.weighted_clusters)); + } + route_table.push_back(CreateServiceConfigRoute( + absl::StrFormat("%s:%s", + route.weighted_clusters.empty() ? "cds" : "weighted", + action_name), + route.service, route.method)); + } std::vector config_parts; config_parts.push_back( "{\n" " \"loadBalancingConfig\":[\n" " { \"xds_routing_experimental\":{\n" " \"actions\":{\n"); - std::vector actions_vector; - std::set actions_set; - for (size_t i = 0; i < rds_update.routes.size(); ++i) { - auto route = rds_update.routes[i]; - if (actions_set.find(route.cluster_name) == actions_set.end()) { - actions_vector.push_back( - CreateServiceConfigActionCluster(route.cluster_name.c_str())); - actions_set.emplace(route.cluster_name); - } - } config_parts.push_back(absl::StrJoin(actions_vector, ",\n")); config_parts.push_back( " },\n" " \"routes\":[\n"); - std::vector routes_vector; - for (size_t i = 0; i < rds_update.routes.size(); ++i) { - auto route_info = rds_update.routes[i]; - routes_vector.push_back(CreateServiceConfigRoute( - route_info.cluster_name.c_str(), route_info.service.c_str(), - route_info.method.c_str())); - } - config_parts.push_back(absl::StrJoin(routes_vector, ",\n")); + config_parts.push_back(absl::StrJoin(route_table, ",\n")); config_parts.push_back( " ]\n" " } }\n" diff --git a/src/core/ext/filters/client_channel/xds/xds_client.h b/src/core/ext/filters/client_channel/xds/xds_client.h index 8233c5d2e08..f5386e100dc 100644 --- a/src/core/ext/filters/client_channel/xds/xds_client.h +++ b/src/core/ext/filters/client_channel/xds/xds_client.h @@ -232,9 +232,19 @@ class XdsClient : public InternallyRefCounted { // Sends an error notification to all watchers. void NotifyOnError(grpc_error* error); - grpc_error* CreateServiceConfig( - const XdsApi::RdsUpdate& rds_update, - RefCountedPtr* service_config) const; + // Returns the weighted_clusters action name to use from + // weighted_cluster_index_map_ for a WeightedClusters route action. + std::string WeightedClustersActionName( + const std::vector& + weighted_clusters); + + // Updates weighted_cluster_index_map_ that will + // determine the names of the WeightedCluster actions for the current update. + void UpdateWeightedClusterIndexMap(const XdsApi::RdsUpdate& rds_update); + + // Create the service config generated by the RdsUpdate. + grpc_error* CreateServiceConfig(const XdsApi::RdsUpdate& rds_update, + RefCountedPtr* service_config); XdsApi::ClusterLoadReportMap BuildLoadReportSnapshot( bool send_all_clusters, const std::set& clusters); @@ -275,6 +285,22 @@ class XdsClient : public InternallyRefCounted { LoadReportState> load_report_map_; + // 2-level map to store WeightedCluster action names. + // Top level map is keyed by cluster names without weight like a_b_c; bottom + // level map is keyed by cluster names + weights like a10_b50_c40. + struct ClusterNamesInfo { + uint64_t next_index = 0; + std::map + cluster_weights_map; + }; + using WeightedClusterIndexMap = + std::map; + + // Cache of action names for WeightedCluster targets in the current + // service config. + WeightedClusterIndexMap weighted_cluster_index_map_; + bool shutting_down_ = false; }; diff --git a/src/proto/grpc/testing/xds/lds_rds_for_test.proto b/src/proto/grpc/testing/xds/lds_rds_for_test.proto index acf2186115c..ec2a46b7c88 100644 --- a/src/proto/grpc/testing/xds/lds_rds_for_test.proto +++ b/src/proto/grpc/testing/xds/lds_rds_for_test.proto @@ -26,6 +26,7 @@ syntax = "proto3"; package envoy.api.v2; import "google/protobuf/any.proto"; +import "google/protobuf/wrappers.proto"; import "src/proto/grpc/testing/xds/cds_for_test.proto"; @@ -38,6 +39,15 @@ message RouteMatch { } } +message WeightedCluster { + message ClusterWeight { + string name = 1; + google.protobuf.UInt32Value weight = 2; + } + repeated ClusterWeight clusters = 1; + google.protobuf.UInt32Value total_weight = 3; +} + message RouteAction { oneof cluster_specifier { // Indicates the upstream cluster to which the request should be routed @@ -54,6 +64,12 @@ message RouteAction { // Internally, Envoy always uses the HTTP/2 *:authority* header to represent the HTTP/1 // *Host* header. Thus, if attempting to match on *Host*, match on *:authority* instead. string cluster_header = 2; + // Multiple upstream clusters can be specified for a given route. The + // request is routed to one of the upstream clusters based on weights + // assigned to each cluster. See + // :ref:`traffic splitting ` + // for additional documentation. + WeightedCluster weighted_clusters = 3; } } diff --git a/test/cpp/end2end/xds_end2end_test.cc b/test/cpp/end2end/xds_end2end_test.cc index 49a975ca2f4..4a1841976fe 100644 --- a/test/cpp/end2end/xds_end2end_test.cc +++ b/test/cpp/end2end/xds_end2end_test.cc @@ -1226,21 +1226,102 @@ class XdsEnd2endTest : public ::testing::TestWithParam { stub2_ = grpc::testing::EchoTest2Service::NewStub(channel_); } - void ResetBackendCounters() { - for (auto& backend : backends_) backend->backend_service()->ResetCounters(); + enum RpcService { + SERVICE_ECHO, + SERVICE_ECHO1, + SERVICE_ECHO2, + }; + + enum RpcMethod { + METHOD_ECHO, + METHOD_ECHO1, + METHOD_ECHO2, + }; + + struct RpcOptions { + RpcService service = SERVICE_ECHO; + RpcMethod method = METHOD_ECHO; + int timeout_ms = 1000; + bool wait_for_ready = false; + bool server_fail = false; + + RpcOptions() {} + + RpcOptions& set_rpc_service(RpcService rpc_service) { + service = rpc_service; + return *this; + } + + RpcOptions& set_rpc_method(RpcMethod rpc_method) { + method = rpc_method; + return *this; + } + + RpcOptions& set_timeout_ms(int rpc_timeout_ms) { + timeout_ms = rpc_timeout_ms; + return *this; + } + + RpcOptions& set_wait_for_ready(bool rpc_wait_for_ready) { + wait_for_ready = rpc_wait_for_ready; + return *this; + } + + RpcOptions& set_server_fail(bool rpc_server_fail) { + server_fail = rpc_server_fail; + return *this; + } + }; + + template + Status SendRpcMethod(Stub* stub, const RpcOptions& rpc_options, + ClientContext* context, EchoRequest& request, + EchoResponse* response) { + switch (rpc_options.method) { + case METHOD_ECHO: + return (*stub)->Echo(context, request, response); + case METHOD_ECHO1: + return (*stub)->Echo1(context, request, response); + case METHOD_ECHO2: + return (*stub)->Echo2(context, request, response); + } } - bool SeenAllBackends(size_t start_index = 0, size_t stop_index = 0) { + void ResetBackendCounters(size_t start_index = 0, size_t stop_index = 0) { if (stop_index == 0) stop_index = backends_.size(); for (size_t i = start_index; i < stop_index; ++i) { - if (backends_[i]->backend_service()->request_count() == 0) return false; + backends_[i]->backend_service()->ResetCounters(); + backends_[i]->backend_service1()->ResetCounters(); + backends_[i]->backend_service2()->ResetCounters(); + } + } + + bool SeenAllBackends(size_t start_index = 0, size_t stop_index = 0, + const RpcOptions& rpc_options = RpcOptions()) { + if (stop_index == 0) stop_index = backends_.size(); + for (size_t i = start_index; i < stop_index; ++i) { + switch (rpc_options.service) { + case SERVICE_ECHO: + if (backends_[i]->backend_service()->request_count() == 0) + return false; + break; + case SERVICE_ECHO1: + if (backends_[i]->backend_service1()->request_count() == 0) + return false; + break; + case SERVICE_ECHO2: + if (backends_[i]->backend_service2()->request_count() == 0) + return false; + break; + } } return true; } void SendRpcAndCount(int* num_total, int* num_ok, int* num_failure, - int* num_drops) { - const Status status = SendRpc(); + int* num_drops, + const RpcOptions& rpc_options = RpcOptions()) { + const Status status = SendRpc(rpc_options); if (status.ok()) { ++*num_ok; } else { @@ -1253,15 +1334,16 @@ class XdsEnd2endTest : public ::testing::TestWithParam { ++*num_total; } - std::tuple WaitForAllBackends(size_t start_index = 0, - size_t stop_index = 0, - bool reset_counters = true) { + std::tuple WaitForAllBackends( + size_t start_index = 0, size_t stop_index = 0, bool reset_counters = true, + const RpcOptions& rpc_options = RpcOptions()) { int num_ok = 0; int num_failure = 0; int num_drops = 0; int num_total = 0; - while (!SeenAllBackends(start_index, stop_index)) { - SendRpcAndCount(&num_total, &num_ok, &num_failure, &num_drops); + while (!SeenAllBackends(start_index, stop_index, rpc_options)) { + SendRpcAndCount(&num_total, &num_ok, &num_failure, &num_drops, + rpc_options); } if (reset_counters) ResetBackendCounters(); gpr_log(GPR_INFO, @@ -1377,67 +1459,6 @@ class XdsEnd2endTest : public ::testing::TestWithParam { return backend_ports; } - enum RpcService { - SERVICE_ECHO, - SERVICE_ECHO1, - SERVICE_ECHO2, - }; - - enum RpcMethod { - METHOD_ECHO, - METHOD_ECHO1, - METHOD_ECHO2, - }; - - struct RpcOptions { - RpcService service = SERVICE_ECHO; - RpcMethod method = METHOD_ECHO; - int timeout_ms = 1000; - bool wait_for_ready = false; - bool server_fail = false; - - RpcOptions() {} - - RpcOptions& set_rpc_service(RpcService rpc_service) { - service = rpc_service; - return *this; - } - - RpcOptions& set_rpc_method(RpcMethod rpc_method) { - method = rpc_method; - return *this; - } - - RpcOptions& set_timeout_ms(int rpc_timeout_ms) { - timeout_ms = rpc_timeout_ms; - return *this; - } - - RpcOptions& set_wait_for_ready(bool rpc_wait_for_ready) { - wait_for_ready = rpc_wait_for_ready; - return *this; - } - - RpcOptions& set_server_fail(bool rpc_server_fail) { - server_fail = rpc_server_fail; - return *this; - } - }; - - template - Status SendRpcMethod(Stub* stub, const RpcOptions& rpc_options, - ClientContext* context, EchoRequest& request, - EchoResponse* response) { - switch (rpc_options.method) { - case METHOD_ECHO: - return (*stub)->Echo(context, request, response); - case METHOD_ECHO1: - return (*stub)->Echo1(context, request, response); - case METHOD_ECHO2: - return (*stub)->Echo2(context, request, response); - } - } - Status SendRpc(const RpcOptions& rpc_options = RpcOptions(), EchoResponse* response = nullptr) { const bool local_response = (response == nullptr); @@ -2607,9 +2628,10 @@ TEST_P(LdsRdsTest, RouteHasNoRouteAction) { EXPECT_EQ(response_state.error_message, "No RouteAction found in route."); } -// Tests that LDS client should send a NACK if RouteAction has a -// cluster_specifier other than cluster in the LDS response. -TEST_P(LdsRdsTest, RouteActionHasNoCluster) { +// Tests that LDS client should send a NACK if route has a +// cluster_specifier other than cluster or weighted_clusters in the LDS +// response. +TEST_P(LdsRdsTest, RouteActionUnsupportedClusterSpecifier) { RouteConfiguration route_config = balancers_[0]->ads_service()->default_route_config(); route_config.mutable_virtual_hosts(0) @@ -2622,7 +2644,126 @@ TEST_P(LdsRdsTest, RouteActionHasNoCluster) { CheckRpcSendFailure(); const auto& response_state = RouteConfigurationResponseState(0); EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED); - EXPECT_EQ(response_state.error_message, "No cluster found in RouteAction."); + EXPECT_EQ(response_state.error_message, + "No cluster or weighted_clusters found in RouteAction."); +} + +TEST_P(LdsRdsTest, RouteActionClusterHasEmptyClusterName) { + ResetStub(/*failover_timeout=*/0, + /*expected_targets=*/"", + /*xds_resource_does_not_exist_timeout*/ 0, + /*xds_routing_enabled=*/true); + RouteConfiguration route_config = + balancers_[0]->ads_service()->default_route_config(); + auto* route1 = route_config.mutable_virtual_hosts(0)->mutable_routes(0); + route1->mutable_match()->set_prefix("/grpc.testing.EchoTest1Service/"); + route1->mutable_route()->set_cluster(""); + auto* default_route = route_config.mutable_virtual_hosts(0)->add_routes(); + default_route->mutable_match()->set_prefix(""); + default_route->mutable_route()->set_cluster(kDefaultResourceName); + SetRouteConfiguration(0, route_config); + SetNextResolution({}); + SetNextResolutionForLbChannelAllBalancers(); + CheckRpcSendFailure(); + const auto& response_state = RouteConfigurationResponseState(0); + EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED); + EXPECT_EQ(response_state.error_message, + "RouteAction cluster contains empty cluster name."); +} + +TEST_P(LdsRdsTest, RouteActionWeightedTargetHasIncorrectTotalWeightSet) { + ResetStub(/*failover_timeout=*/0, + /*expected_targets=*/"", + /*xds_resource_does_not_exist_timeout*/ 0, + /*xds_routing_enabled=*/true); + const size_t kWeight75 = 75; + const char* kNewCluster1Name = "new_cluster_1"; + RouteConfiguration route_config = + balancers_[0]->ads_service()->default_route_config(); + auto* route1 = route_config.mutable_virtual_hosts(0)->mutable_routes(0); + route1->mutable_match()->set_prefix("/grpc.testing.EchoTest1Service/"); + auto* weighted_cluster1 = + route1->mutable_route()->mutable_weighted_clusters()->add_clusters(); + weighted_cluster1->set_name(kNewCluster1Name); + weighted_cluster1->mutable_weight()->set_value(kWeight75); + route1->mutable_route() + ->mutable_weighted_clusters() + ->mutable_total_weight() + ->set_value(kWeight75 + 1); + auto* default_route = route_config.mutable_virtual_hosts(0)->add_routes(); + default_route->mutable_match()->set_prefix(""); + default_route->mutable_route()->set_cluster(kDefaultResourceName); + SetRouteConfiguration(0, route_config); + SetNextResolution({}); + SetNextResolutionForLbChannelAllBalancers(); + CheckRpcSendFailure(); + const auto& response_state = RouteConfigurationResponseState(0); + EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED); + EXPECT_EQ(response_state.error_message, + "RouteAction weighted_cluster has incorrect total weight"); +} + +TEST_P(LdsRdsTest, RouteActionWeightedTargetClusterHasEmptyClusterName) { + ResetStub(/*failover_timeout=*/0, + /*expected_targets=*/"", + /*xds_resource_does_not_exist_timeout*/ 0, + /*xds_routing_enabled=*/true); + const size_t kWeight75 = 75; + RouteConfiguration route_config = + balancers_[0]->ads_service()->default_route_config(); + auto* route1 = route_config.mutable_virtual_hosts(0)->mutable_routes(0); + route1->mutable_match()->set_prefix("/grpc.testing.EchoTest1Service/"); + auto* weighted_cluster1 = + route1->mutable_route()->mutable_weighted_clusters()->add_clusters(); + weighted_cluster1->set_name(""); + weighted_cluster1->mutable_weight()->set_value(kWeight75); + route1->mutable_route() + ->mutable_weighted_clusters() + ->mutable_total_weight() + ->set_value(kWeight75); + auto* default_route = route_config.mutable_virtual_hosts(0)->add_routes(); + default_route->mutable_match()->set_prefix(""); + default_route->mutable_route()->set_cluster(kDefaultResourceName); + SetRouteConfiguration(0, route_config); + SetNextResolution({}); + SetNextResolutionForLbChannelAllBalancers(); + CheckRpcSendFailure(); + const auto& response_state = RouteConfigurationResponseState(0); + EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED); + EXPECT_EQ( + response_state.error_message, + "RouteAction weighted_cluster cluster contains empty cluster name."); +} + +TEST_P(LdsRdsTest, RouteActionWeightedTargetClusterHasNoWeight) { + ResetStub(/*failover_timeout=*/0, + /*expected_targets=*/"", + /*xds_resource_does_not_exist_timeout*/ 0, + /*xds_routing_enabled=*/true); + const size_t kWeight75 = 75; + const char* kNewCluster1Name = "new_cluster_1"; + RouteConfiguration route_config = + balancers_[0]->ads_service()->default_route_config(); + auto* route1 = route_config.mutable_virtual_hosts(0)->mutable_routes(0); + route1->mutable_match()->set_prefix("/grpc.testing.EchoTest1Service/"); + auto* weighted_cluster1 = + route1->mutable_route()->mutable_weighted_clusters()->add_clusters(); + weighted_cluster1->set_name(kNewCluster1Name); + route1->mutable_route() + ->mutable_weighted_clusters() + ->mutable_total_weight() + ->set_value(kWeight75); + auto* default_route = route_config.mutable_virtual_hosts(0)->add_routes(); + default_route->mutable_match()->set_prefix(""); + default_route->mutable_route()->set_cluster(kDefaultResourceName); + SetRouteConfiguration(0, route_config); + SetNextResolution({}); + SetNextResolutionForLbChannelAllBalancers(); + CheckRpcSendFailure(); + const auto& response_state = RouteConfigurationResponseState(0); + EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED); + EXPECT_EQ(response_state.error_message, + "RouteAction weighted_cluster cluster missing weight"); } // Tests that LDS client times out when no response received. @@ -2787,6 +2928,370 @@ TEST_P(LdsRdsTest, XdsRoutingPrefixMatching) { EXPECT_EQ(kNumEcho2Rpcs, backends_[3]->backend_service2()->request_count()); } +TEST_P(LdsRdsTest, XdsRoutingWeightedCluster) { + ResetStub(/*failover_timeout=*/0, + /*expected_targets=*/"", + /*xds_resource_does_not_exist_timeout*/ 0, + /*xds_routing_enabled=*/true); + const char* kNewCluster1Name = "new_cluster_1"; + const char* kNewCluster2Name = "new_cluster_2"; + const size_t kNumEcho1Rpcs = 1000; + const size_t kNumEchoRpcs = 10; + const size_t kWeight75 = 75; + const size_t kWeight25 = 25; + SetNextResolution({}); + SetNextResolutionForLbChannelAllBalancers(); + // Populate new EDS resources. + AdsServiceImpl::EdsResourceArgs args({ + {"locality0", GetBackendPorts(0, 1)}, + }); + AdsServiceImpl::EdsResourceArgs args1({ + {"locality0", GetBackendPorts(1, 2)}, + }); + AdsServiceImpl::EdsResourceArgs args2({ + {"locality0", GetBackendPorts(2, 3)}, + }); + balancers_[0]->ads_service()->SetEdsResource( + AdsServiceImpl::BuildEdsResource(args)); + balancers_[0]->ads_service()->SetEdsResource( + AdsServiceImpl::BuildEdsResource(args1, kNewCluster1Name)); + balancers_[0]->ads_service()->SetEdsResource( + AdsServiceImpl::BuildEdsResource(args2, kNewCluster2Name)); + // Populate new CDS resources. + Cluster new_cluster1 = balancers_[0]->ads_service()->default_cluster(); + new_cluster1.set_name(kNewCluster1Name); + balancers_[0]->ads_service()->SetCdsResource(new_cluster1); + Cluster new_cluster2 = balancers_[0]->ads_service()->default_cluster(); + new_cluster2.set_name(kNewCluster2Name); + balancers_[0]->ads_service()->SetCdsResource(new_cluster2); + // Populating Route Configurations for LDS. + RouteConfiguration new_route_config = + balancers_[0]->ads_service()->default_route_config(); + auto* route1 = new_route_config.mutable_virtual_hosts(0)->mutable_routes(0); + route1->mutable_match()->set_prefix("/grpc.testing.EchoTest1Service/"); + auto* weighted_cluster1 = + route1->mutable_route()->mutable_weighted_clusters()->add_clusters(); + weighted_cluster1->set_name(kNewCluster1Name); + weighted_cluster1->mutable_weight()->set_value(kWeight75); + auto* weighted_cluster2 = + route1->mutable_route()->mutable_weighted_clusters()->add_clusters(); + weighted_cluster2->set_name(kNewCluster2Name); + weighted_cluster2->mutable_weight()->set_value(kWeight25); + route1->mutable_route() + ->mutable_weighted_clusters() + ->mutable_total_weight() + ->set_value(kWeight75 + kWeight25); + auto* default_route = new_route_config.mutable_virtual_hosts(0)->add_routes(); + default_route->mutable_match()->set_prefix(""); + default_route->mutable_route()->set_cluster(kDefaultResourceName); + SetRouteConfiguration(0, new_route_config); + WaitForAllBackends(0, 1); + WaitForAllBackends(1, 3, true, RpcOptions().set_rpc_service(SERVICE_ECHO1)); + CheckRpcSendOk(kNumEchoRpcs); + CheckRpcSendOk(kNumEcho1Rpcs, RpcOptions().set_rpc_service(SERVICE_ECHO1)); + // Make sure RPCs all go to the correct backend. + EXPECT_EQ(kNumEchoRpcs, backends_[0]->backend_service()->request_count()); + EXPECT_EQ(0, backends_[0]->backend_service1()->request_count()); + EXPECT_EQ(0, backends_[1]->backend_service()->request_count()); + const int weight_75_request_count = + backends_[1]->backend_service1()->request_count(); + EXPECT_EQ(0, backends_[2]->backend_service()->request_count()); + const int weight_25_request_count = + backends_[2]->backend_service1()->request_count(); + const double kErrorTolerance = 0.2; + EXPECT_THAT(weight_75_request_count, + ::testing::AllOf(::testing::Ge(kNumEcho1Rpcs * kWeight75 / 100 * + (1 - kErrorTolerance)), + ::testing::Le(kNumEcho1Rpcs * kWeight75 / 100 * + (1 + kErrorTolerance)))); + EXPECT_THAT(weight_25_request_count, + ::testing::AllOf(::testing::Ge(kNumEcho1Rpcs * kWeight25 / 100 * + (1 - kErrorTolerance)), + ::testing::Le(kNumEcho1Rpcs * kWeight25 / 100 * + (1 + kErrorTolerance)))); +} + +TEST_P(LdsRdsTest, XdsRoutingWeightedClusterUpdateWeights) { + ResetStub(/*failover_timeout=*/0, + /*expected_targets=*/"", + /*xds_resource_does_not_exist_timeout*/ 0, + /*xds_routing_enabled=*/true); + const char* kNewCluster1Name = "new_cluster_1"; + const char* kNewCluster2Name = "anew_cluster_2"; + const char* kNewCluster3Name = "new_cluster_3"; + const size_t kNumEcho1Rpcs = 1000; + const size_t kNumEchoRpcs = 10; + const size_t kWeight75 = 75; + const size_t kWeight25 = 25; + const size_t kWeight50 = 50; + SetNextResolution({}); + SetNextResolutionForLbChannelAllBalancers(); + // Populate new EDS resources. + AdsServiceImpl::EdsResourceArgs args({ + {"locality0", GetBackendPorts(0, 1)}, + }); + AdsServiceImpl::EdsResourceArgs args1({ + {"locality0", GetBackendPorts(1, 2)}, + }); + AdsServiceImpl::EdsResourceArgs args2({ + {"locality0", GetBackendPorts(2, 3)}, + }); + AdsServiceImpl::EdsResourceArgs args3({ + {"locality0", GetBackendPorts(3, 4)}, + }); + balancers_[0]->ads_service()->SetEdsResource( + AdsServiceImpl::BuildEdsResource(args)); + balancers_[0]->ads_service()->SetEdsResource( + AdsServiceImpl::BuildEdsResource(args1, kNewCluster1Name)); + balancers_[0]->ads_service()->SetEdsResource( + AdsServiceImpl::BuildEdsResource(args2, kNewCluster2Name)); + balancers_[0]->ads_service()->SetEdsResource( + AdsServiceImpl::BuildEdsResource(args3, kNewCluster3Name)); + // Populate new CDS resources. + Cluster new_cluster1 = balancers_[0]->ads_service()->default_cluster(); + new_cluster1.set_name(kNewCluster1Name); + balancers_[0]->ads_service()->SetCdsResource(new_cluster1); + Cluster new_cluster2 = balancers_[0]->ads_service()->default_cluster(); + new_cluster2.set_name(kNewCluster2Name); + balancers_[0]->ads_service()->SetCdsResource(new_cluster2); + Cluster new_cluster3 = balancers_[0]->ads_service()->default_cluster(); + new_cluster3.set_name(kNewCluster3Name); + balancers_[0]->ads_service()->SetCdsResource(new_cluster3); + // Populating Route Configurations. + RouteConfiguration new_route_config = + balancers_[0]->ads_service()->default_route_config(); + auto* route1 = new_route_config.mutable_virtual_hosts(0)->mutable_routes(0); + route1->mutable_match()->set_prefix("/grpc.testing.EchoTest1Service/"); + auto* weighted_cluster1 = + route1->mutable_route()->mutable_weighted_clusters()->add_clusters(); + weighted_cluster1->set_name(kNewCluster1Name); + weighted_cluster1->mutable_weight()->set_value(kWeight75); + auto* weighted_cluster2 = + route1->mutable_route()->mutable_weighted_clusters()->add_clusters(); + weighted_cluster2->set_name(kNewCluster2Name); + weighted_cluster2->mutable_weight()->set_value(kWeight25); + route1->mutable_route() + ->mutable_weighted_clusters() + ->mutable_total_weight() + ->set_value(kWeight75 + kWeight25); + auto* default_route = new_route_config.mutable_virtual_hosts(0)->add_routes(); + default_route->mutable_match()->set_prefix(""); + default_route->mutable_route()->set_cluster(kDefaultResourceName); + SetRouteConfiguration(0, new_route_config); + WaitForAllBackends(0, 1); + WaitForAllBackends(1, 3, true, RpcOptions().set_rpc_service(SERVICE_ECHO1)); + CheckRpcSendOk(kNumEchoRpcs); + CheckRpcSendOk(kNumEcho1Rpcs, RpcOptions().set_rpc_service(SERVICE_ECHO1)); + // Make sure RPCs all go to the correct backend. + EXPECT_EQ(kNumEchoRpcs, backends_[0]->backend_service()->request_count()); + EXPECT_EQ(0, backends_[0]->backend_service1()->request_count()); + EXPECT_EQ(0, backends_[1]->backend_service()->request_count()); + const int weight_75_request_count = + backends_[1]->backend_service1()->request_count(); + EXPECT_EQ(0, backends_[1]->backend_service2()->request_count()); + EXPECT_EQ(0, backends_[2]->backend_service()->request_count()); + const int weight_25_request_count = + backends_[2]->backend_service1()->request_count(); + EXPECT_EQ(0, backends_[3]->backend_service()->request_count()); + EXPECT_EQ(0, backends_[3]->backend_service1()->request_count()); + const double kErrorTolerance = 0.2; + EXPECT_THAT(weight_75_request_count, + ::testing::AllOf(::testing::Ge(kNumEcho1Rpcs * kWeight75 / 100 * + (1 - kErrorTolerance)), + ::testing::Le(kNumEcho1Rpcs * kWeight75 / 100 * + (1 + kErrorTolerance)))); + EXPECT_THAT(weight_25_request_count, + ::testing::AllOf(::testing::Ge(kNumEcho1Rpcs * kWeight25 / 100 * + (1 - kErrorTolerance)), + ::testing::Le(kNumEcho1Rpcs * kWeight25 / 100 * + (1 + kErrorTolerance)))); + // Change Route Configurations: same clusters different weights. + weighted_cluster1->mutable_weight()->set_value(kWeight50); + weighted_cluster2->mutable_weight()->set_value(kWeight50); + // Change default route to a new cluster to help to identify when new polices + // are seen by the client. + default_route->mutable_route()->set_cluster(kNewCluster3Name); + SetRouteConfiguration(0, new_route_config); + ResetBackendCounters(); + WaitForAllBackends(3, 4); + CheckRpcSendOk(kNumEchoRpcs); + CheckRpcSendOk(kNumEcho1Rpcs, RpcOptions().set_rpc_service(SERVICE_ECHO1)); + // Make sure RPCs all go to the correct backend. + EXPECT_EQ(0, backends_[0]->backend_service()->request_count()); + EXPECT_EQ(0, backends_[0]->backend_service1()->request_count()); + EXPECT_EQ(0, backends_[1]->backend_service()->request_count()); + const int weight_50_request_count_1 = + backends_[1]->backend_service1()->request_count(); + EXPECT_EQ(0, backends_[2]->backend_service()->request_count()); + const int weight_50_request_count_2 = + backends_[2]->backend_service1()->request_count(); + EXPECT_EQ(kNumEchoRpcs, backends_[3]->backend_service()->request_count()); + EXPECT_EQ(0, backends_[3]->backend_service1()->request_count()); + EXPECT_THAT(weight_50_request_count_1, + ::testing::AllOf(::testing::Ge(kNumEcho1Rpcs * kWeight50 / 100 * + (1 - kErrorTolerance)), + ::testing::Le(kNumEcho1Rpcs * kWeight50 / 100 * + (1 + kErrorTolerance)))); + EXPECT_THAT(weight_50_request_count_2, + ::testing::AllOf(::testing::Ge(kNumEcho1Rpcs * kWeight50 / 100 * + (1 - kErrorTolerance)), + ::testing::Le(kNumEcho1Rpcs * kWeight50 / 100 * + (1 + kErrorTolerance)))); +} + +TEST_P(LdsRdsTest, XdsRoutingWeightedClusterUpdateClusters) { + ResetStub(/*failover_timeout=*/0, + /*expected_targets=*/"", + /*xds_resource_does_not_exist_timeout*/ 0, + /*xds_routing_enabled=*/true); + const char* kNewCluster1Name = "new_cluster_1"; + const char* kNewCluster2Name = "anew_cluster_2"; + const char* kNewCluster3Name = "new_cluster_3"; + const size_t kNumEcho1Rpcs = 1000; + const size_t kNumEchoRpcs = 10; + const size_t kWeight75 = 75; + const size_t kWeight25 = 25; + const size_t kWeight50 = 50; + SetNextResolution({}); + SetNextResolutionForLbChannelAllBalancers(); + // Populate new EDS resources. + AdsServiceImpl::EdsResourceArgs args({ + {"locality0", GetBackendPorts(0, 1)}, + }); + AdsServiceImpl::EdsResourceArgs args1({ + {"locality0", GetBackendPorts(1, 2)}, + }); + AdsServiceImpl::EdsResourceArgs args2({ + {"locality0", GetBackendPorts(2, 3)}, + }); + AdsServiceImpl::EdsResourceArgs args3({ + {"locality0", GetBackendPorts(3, 4)}, + }); + balancers_[0]->ads_service()->SetEdsResource( + AdsServiceImpl::BuildEdsResource(args)); + balancers_[0]->ads_service()->SetEdsResource( + AdsServiceImpl::BuildEdsResource(args1, kNewCluster1Name)); + balancers_[0]->ads_service()->SetEdsResource( + AdsServiceImpl::BuildEdsResource(args2, kNewCluster2Name)); + balancers_[0]->ads_service()->SetEdsResource( + AdsServiceImpl::BuildEdsResource(args3, kNewCluster3Name)); + // Populate new CDS resources. + Cluster new_cluster1 = balancers_[0]->ads_service()->default_cluster(); + new_cluster1.set_name(kNewCluster1Name); + balancers_[0]->ads_service()->SetCdsResource(new_cluster1); + Cluster new_cluster2 = balancers_[0]->ads_service()->default_cluster(); + new_cluster2.set_name(kNewCluster2Name); + balancers_[0]->ads_service()->SetCdsResource(new_cluster2); + Cluster new_cluster3 = balancers_[0]->ads_service()->default_cluster(); + new_cluster3.set_name(kNewCluster3Name); + balancers_[0]->ads_service()->SetCdsResource(new_cluster3); + // Populating Route Configurations. + RouteConfiguration new_route_config = + balancers_[0]->ads_service()->default_route_config(); + auto* route1 = new_route_config.mutable_virtual_hosts(0)->mutable_routes(0); + route1->mutable_match()->set_prefix("/grpc.testing.EchoTest1Service/"); + auto* weighted_cluster1 = + route1->mutable_route()->mutable_weighted_clusters()->add_clusters(); + weighted_cluster1->set_name(kNewCluster1Name); + weighted_cluster1->mutable_weight()->set_value(kWeight75); + auto* weighted_cluster2 = + route1->mutable_route()->mutable_weighted_clusters()->add_clusters(); + weighted_cluster2->set_name(kDefaultResourceName); + weighted_cluster2->mutable_weight()->set_value(kWeight25); + route1->mutable_route() + ->mutable_weighted_clusters() + ->mutable_total_weight() + ->set_value(kWeight75 + kWeight25); + auto* default_route = new_route_config.mutable_virtual_hosts(0)->add_routes(); + default_route->mutable_match()->set_prefix(""); + default_route->mutable_route()->set_cluster(kDefaultResourceName); + SetRouteConfiguration(0, new_route_config); + WaitForAllBackends(0, 1); + WaitForAllBackends(1, 2, true, RpcOptions().set_rpc_service(SERVICE_ECHO1)); + CheckRpcSendOk(kNumEchoRpcs); + CheckRpcSendOk(kNumEcho1Rpcs, RpcOptions().set_rpc_service(SERVICE_ECHO1)); + // Make sure RPCs all go to the correct backend. + EXPECT_EQ(kNumEchoRpcs, backends_[0]->backend_service()->request_count()); + int weight_25_request_count = + backends_[0]->backend_service1()->request_count(); + EXPECT_EQ(0, backends_[1]->backend_service()->request_count()); + int weight_75_request_count = + backends_[1]->backend_service1()->request_count(); + EXPECT_EQ(0, backends_[2]->backend_service()->request_count()); + EXPECT_EQ(0, backends_[2]->backend_service1()->request_count()); + EXPECT_EQ(0, backends_[3]->backend_service()->request_count()); + EXPECT_EQ(0, backends_[3]->backend_service1()->request_count()); + const double kErrorTolerance = 0.2; + EXPECT_THAT(weight_75_request_count, + ::testing::AllOf(::testing::Ge(kNumEcho1Rpcs * kWeight75 / 100 * + (1 - kErrorTolerance)), + ::testing::Le(kNumEcho1Rpcs * kWeight75 / 100 * + (1 + kErrorTolerance)))); + EXPECT_THAT(weight_25_request_count, + ::testing::AllOf(::testing::Ge(kNumEcho1Rpcs * kWeight25 / 100 * + (1 - kErrorTolerance)), + ::testing::Le(kNumEcho1Rpcs * kWeight25 / 100 * + (1 + kErrorTolerance)))); + // Change Route Configurations: new set of clusters with different weights. + weighted_cluster1->mutable_weight()->set_value(kWeight50); + weighted_cluster2->set_name(kNewCluster2Name); + weighted_cluster2->mutable_weight()->set_value(kWeight50); + SetRouteConfiguration(0, new_route_config); + ResetBackendCounters(); + WaitForAllBackends(2, 3, true, RpcOptions().set_rpc_service(SERVICE_ECHO1)); + CheckRpcSendOk(kNumEchoRpcs); + CheckRpcSendOk(kNumEcho1Rpcs, RpcOptions().set_rpc_service(SERVICE_ECHO1)); + // Make sure RPCs all go to the correct backend. + EXPECT_EQ(kNumEchoRpcs, backends_[0]->backend_service()->request_count()); + EXPECT_EQ(0, backends_[0]->backend_service1()->request_count()); + EXPECT_EQ(0, backends_[1]->backend_service()->request_count()); + const int weight_50_request_count_1 = + backends_[1]->backend_service1()->request_count(); + EXPECT_EQ(0, backends_[2]->backend_service()->request_count()); + const int weight_50_request_count_2 = + backends_[2]->backend_service1()->request_count(); + EXPECT_EQ(0, backends_[3]->backend_service()->request_count()); + EXPECT_EQ(0, backends_[3]->backend_service1()->request_count()); + EXPECT_THAT(weight_50_request_count_1, + ::testing::AllOf(::testing::Ge(kNumEcho1Rpcs * kWeight50 / 100 * + (1 - kErrorTolerance)), + ::testing::Le(kNumEcho1Rpcs * kWeight50 / 100 * + (1 + kErrorTolerance)))); + EXPECT_THAT(weight_50_request_count_2, + ::testing::AllOf(::testing::Ge(kNumEcho1Rpcs * kWeight50 / 100 * + (1 - kErrorTolerance)), + ::testing::Le(kNumEcho1Rpcs * kWeight50 / 100 * + (1 + kErrorTolerance)))); + // Change Route Configurations. + weighted_cluster1->mutable_weight()->set_value(kWeight75); + weighted_cluster2->set_name(kNewCluster3Name); + weighted_cluster2->mutable_weight()->set_value(kWeight25); + SetRouteConfiguration(0, new_route_config); + ResetBackendCounters(); + WaitForAllBackends(3, 4, true, RpcOptions().set_rpc_service(SERVICE_ECHO1)); + CheckRpcSendOk(kNumEchoRpcs); + CheckRpcSendOk(kNumEcho1Rpcs, RpcOptions().set_rpc_service(SERVICE_ECHO1)); + // Make sure RPCs all go to the correct backend. + EXPECT_EQ(kNumEchoRpcs, backends_[0]->backend_service()->request_count()); + EXPECT_EQ(0, backends_[0]->backend_service1()->request_count()); + EXPECT_EQ(0, backends_[1]->backend_service()->request_count()); + weight_75_request_count = backends_[1]->backend_service1()->request_count(); + EXPECT_EQ(0, backends_[2]->backend_service()->request_count()); + EXPECT_EQ(0, backends_[2]->backend_service1()->request_count()); + EXPECT_EQ(0, backends_[3]->backend_service()->request_count()); + weight_25_request_count = backends_[3]->backend_service1()->request_count(); + EXPECT_THAT(weight_75_request_count, + ::testing::AllOf(::testing::Ge(kNumEcho1Rpcs * kWeight75 / 100 * + (1 - kErrorTolerance)), + ::testing::Le(kNumEcho1Rpcs * kWeight75 / 100 * + (1 + kErrorTolerance)))); + EXPECT_THAT(weight_25_request_count, + ::testing::AllOf(::testing::Ge(kNumEcho1Rpcs * kWeight25 / 100 * + (1 - kErrorTolerance)), + ::testing::Le(kNumEcho1Rpcs * kWeight25 / 100 * + (1 + kErrorTolerance)))); +} + using CdsTest = BasicTest; // Tests that CDS client should send an ACK upon correct CDS response. From 2958c2b6228f2943e75fb97d1fbaf96782db9ec2 Mon Sep 17 00:00:00 2001 From: Alexander Polcyn Date: Tue, 12 May 2020 13:56:38 -0700 Subject: [PATCH 741/758] Revert "Incorporate changes to grpc_sockaddr_to_string API" This reverts commit 401f76e573b9b2d5dd561cac1f497bed3749f515. --- src/core/lib/iomgr/tcp_client_posix.cc | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/core/lib/iomgr/tcp_client_posix.cc b/src/core/lib/iomgr/tcp_client_posix.cc index a01600a0e3b..1953141a6db 100644 --- a/src/core/lib/iomgr/tcp_client_posix.cc +++ b/src/core/lib/iomgr/tcp_client_posix.cc @@ -294,14 +294,11 @@ static char* extract_source_ip(int fd) { resolved_address.len = sizeof(resolved_address.addr); char* out = nullptr; if (getsockname(fd, reinterpret_cast(&resolved_address.addr), - &resolved_address.len) != -1) { - std::string result = - grpc_sockaddr_to_string(&resolved_address, false /* normalize */); - out = gpr_strdup(result.c_str()); - } else { + &resolved_address.len) == -1 || + grpc_sockaddr_to_string(&out, &resolved_address, false /* normalize */) == + -1) { gpr_log(GPR_INFO, - "source address will be missing from logs and errors. gotsockname " - "errno: %d", + "source address will be missing from logs and errors. errno: %d", errno); out = gpr_strdup("source_address_extraction_failed"); } From 330a8a4efed3f56a42d22d9babaf3e93ab0dc07c Mon Sep 17 00:00:00 2001 From: Alexander Polcyn Date: Tue, 12 May 2020 13:57:53 -0700 Subject: [PATCH 742/758] Revert "Include source address in TCP posix connect errors" This reverts commit dee079811b88e88d6c783cbb0366f5e0f7b414cf. --- src/core/lib/iomgr/error.cc | 2 - src/core/lib/iomgr/error.h | 2 - src/core/lib/iomgr/tcp_client_posix.cc | 75 ++++++++------------------ 3 files changed, 22 insertions(+), 57 deletions(-) diff --git a/src/core/lib/iomgr/error.cc b/src/core/lib/iomgr/error.cc index 7118a14196c..dedc8376578 100644 --- a/src/core/lib/iomgr/error.cc +++ b/src/core/lib/iomgr/error.cc @@ -91,8 +91,6 @@ static const char* error_str_name(grpc_error_strs key) { return "description"; case GRPC_ERROR_STR_OS_ERROR: return "os_error"; - case GRPC_ERROR_STR_SOURCE_ADDRESS: - return "source_address"; case GRPC_ERROR_STR_TARGET_ADDRESS: return "target_address"; case GRPC_ERROR_STR_SYSCALL: diff --git a/src/core/lib/iomgr/error.h b/src/core/lib/iomgr/error.h index b6d1180f358..ac3ff876289 100644 --- a/src/core/lib/iomgr/error.h +++ b/src/core/lib/iomgr/error.h @@ -88,8 +88,6 @@ typedef enum { GRPC_ERROR_STR_OS_ERROR, /// syscall that generated this error GRPC_ERROR_STR_SYSCALL, - /// source address of the socket associated with this error - GRPC_ERROR_STR_SOURCE_ADDRESS, /// peer that we were trying to communicate when this error occurred GRPC_ERROR_STR_TARGET_ADDRESS, /// grpc status message associated with this error diff --git a/src/core/lib/iomgr/tcp_client_posix.cc b/src/core/lib/iomgr/tcp_client_posix.cc index 1953141a6db..4abf33bc223 100644 --- a/src/core/lib/iomgr/tcp_client_posix.cc +++ b/src/core/lib/iomgr/tcp_client_posix.cc @@ -57,8 +57,7 @@ typedef struct { int refs; grpc_closure write_closure; grpc_pollset_set* interested_parties; - char* remote_addr_str; - char* source_addr_str; + char* addr_str; grpc_endpoint** ep; grpc_closure* closure; grpc_channel_args* channel_args; @@ -104,8 +103,8 @@ static void tc_on_alarm(void* acp, grpc_error* error) { async_connect* ac = static_cast(acp); if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) { const char* str = grpc_error_string(error); - gpr_log(GPR_INFO, "CLIENT_CONNECT: %s: on_alarm: error=%s", - ac->remote_addr_str, str); + gpr_log(GPR_INFO, "CLIENT_CONNECT: %s: on_alarm: error=%s", ac->addr_str, + str); } gpr_mu_lock(&ac->mu); if (ac->fd != nullptr) { @@ -116,17 +115,15 @@ static void tc_on_alarm(void* acp, grpc_error* error) { gpr_mu_unlock(&ac->mu); if (done) { gpr_mu_destroy(&ac->mu); - gpr_free(ac->remote_addr_str); - gpr_free(ac->source_addr_str); + gpr_free(ac->addr_str); grpc_channel_args_destroy(ac->channel_args); gpr_free(ac); } } grpc_endpoint* grpc_tcp_client_create_from_fd( - grpc_fd* fd, const grpc_channel_args* channel_args, - const char* remote_addr_str) { - return grpc_tcp_create(fd, channel_args, remote_addr_str); + grpc_fd* fd, const grpc_channel_args* channel_args, const char* addr_str) { + return grpc_tcp_create(fd, channel_args, addr_str); } static void on_writable(void* acp, grpc_error* error) { @@ -143,8 +140,8 @@ static void on_writable(void* acp, grpc_error* error) { if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) { const char* str = grpc_error_string(error); - gpr_log(GPR_INFO, "CLIENT_CONNECT: %s: on_writable: error=%s", - ac->remote_addr_str, str); + gpr_log(GPR_INFO, "CLIENT_CONNECT: %s: on_writable: error=%s", ac->addr_str, + str); } gpr_mu_lock(&ac->mu); @@ -176,8 +173,7 @@ static void on_writable(void* acp, grpc_error* error) { switch (so_error) { case 0: grpc_pollset_set_del_fd(ac->interested_parties, fd); - *ep = grpc_tcp_client_create_from_fd(fd, ac->channel_args, - ac->remote_addr_str); + *ep = grpc_tcp_client_create_from_fd(fd, ac->channel_args, ac->addr_str); fd = nullptr; break; case ENOBUFS: @@ -219,8 +215,7 @@ finish: done = (--ac->refs == 0); // Create a copy of the data from "ac" to be accessed after the unlock, as // "ac" and its contents may be deallocated by the time they are read. - const grpc_slice remote_addr_str_slice = - grpc_slice_from_copied_string(ac->remote_addr_str); + const grpc_slice addr_str_slice = grpc_slice_from_copied_string(ac->addr_str); gpr_mu_unlock(&ac->mu); if (error != GRPC_ERROR_NONE) { char* error_descr; @@ -234,20 +229,15 @@ finish: gpr_free(error_descr); gpr_free(desc); error = grpc_error_set_str(error, GRPC_ERROR_STR_TARGET_ADDRESS, - remote_addr_str_slice /* takes ownership */); - const grpc_slice source_addr_str_slice = - grpc_slice_from_copied_string(ac->source_addr_str); - error = grpc_error_set_str(error, GRPC_ERROR_STR_SOURCE_ADDRESS, - source_addr_str_slice /* takes ownership */); + addr_str_slice /* takes ownership */); } else { - grpc_slice_unref_internal(remote_addr_str_slice); + grpc_slice_unref_internal(addr_str_slice); } if (done) { // This is safe even outside the lock, because "done", the sentinel, is // populated *inside* the lock. gpr_mu_destroy(&ac->mu); - gpr_free(ac->remote_addr_str); - gpr_free(ac->source_addr_str); + gpr_free(ac->addr_str); grpc_channel_args_destroy(ac->channel_args); gpr_free(ac); } @@ -285,26 +275,6 @@ grpc_error* grpc_tcp_client_prepare_fd(const grpc_channel_args* channel_args, return GRPC_ERROR_NONE; } -/* Fills in dest with a new string containing the human readable - * source address of fd. If source address extraction fails for any reason, - * this then fills in dest with "source_address_extraction_failed". */ -static char* extract_source_ip(int fd) { - grpc_resolved_address resolved_address; - memset(&resolved_address, 0, sizeof(resolved_address)); - resolved_address.len = sizeof(resolved_address.addr); - char* out = nullptr; - if (getsockname(fd, reinterpret_cast(&resolved_address.addr), - &resolved_address.len) == -1 || - grpc_sockaddr_to_string(&out, &resolved_address, false /* normalize */) == - -1) { - gpr_log(GPR_INFO, - "source address will be missing from logs and errors. errno: %d", - errno); - out = gpr_strdup("source_address_extraction_failed"); - } - return out; -} - void grpc_tcp_client_create_from_prepared_fd( grpc_pollset_set* interested_parties, grpc_closure* closure, const int fd, const grpc_channel_args* channel_args, const grpc_resolved_address* addr, @@ -317,17 +287,17 @@ void grpc_tcp_client_create_from_prepared_fd( } while (err < 0 && errno == EINTR); char* name; - char* remote_addr_str; - remote_addr_str = grpc_sockaddr_to_uri(addr); - gpr_asprintf(&name, "tcp-client:%s", remote_addr_str); + char* addr_str; + addr_str = grpc_sockaddr_to_uri(addr); + gpr_asprintf(&name, "tcp-client:%s", addr_str); grpc_fd* fdobj = grpc_fd_create(fd, name, true); gpr_free(name); - gpr_free(remote_addr_str); + gpr_free(addr_str); if (err >= 0) { - char* remote_addr_str = grpc_sockaddr_to_uri(addr); - *ep = grpc_tcp_client_create_from_fd(fdobj, channel_args, remote_addr_str); - gpr_free(remote_addr_str); + char* addr_str = grpc_sockaddr_to_uri(addr); + *ep = grpc_tcp_client_create_from_fd(fdobj, channel_args, addr_str); + gpr_free(addr_str); grpc_core::ExecCtx::Run(DEBUG_LOCATION, closure, GRPC_ERROR_NONE); return; } @@ -349,8 +319,7 @@ void grpc_tcp_client_create_from_prepared_fd( ac->ep = ep; ac->fd = fdobj; ac->interested_parties = interested_parties; - ac->remote_addr_str = grpc_sockaddr_to_uri(addr); - ac->source_addr_str = extract_source_ip(fd); + ac->addr_str = grpc_sockaddr_to_uri(addr); gpr_mu_init(&ac->mu); ac->refs = 2; GRPC_CLOSURE_INIT(&ac->write_closure, on_writable, ac, @@ -359,7 +328,7 @@ void grpc_tcp_client_create_from_prepared_fd( if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) { gpr_log(GPR_INFO, "CLIENT_CONNECT: %s: asynchronously connecting fd %p", - ac->remote_addr_str, fdobj); + ac->addr_str, fdobj); } gpr_mu_lock(&ac->mu); From f0f99b1b0548e4bc63fea1490a8c36ecf49cb863 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Tue, 12 May 2020 14:00:20 -0700 Subject: [PATCH 743/758] Clean up test logic --- .../tests_aio/unit/server_interceptor_test.py | 80 +++++++++++-------- 1 file changed, 46 insertions(+), 34 deletions(-) diff --git a/src/python/grpcio_tests/tests_aio/unit/server_interceptor_test.py b/src/python/grpcio_tests/tests_aio/unit/server_interceptor_test.py index c93fe1b7b0e..047e1401891 100644 --- a/src/python/grpcio_tests/tests_aio/unit/server_interceptor_test.py +++ b/src/python/grpcio_tests/tests_aio/unit/server_interceptor_test.py @@ -13,6 +13,7 @@ # limitations under the License. """Test the functionality of server interceptors.""" +import asyncio import functools import logging import unittest @@ -79,6 +80,43 @@ def _filter_server_interceptor(condition: Callable, return _GenericInterceptor(intercept_service) +class _CacheInterceptor(aio.ServerInterceptor): + """An interceptor that caches response based on request message.""" + + def __init__(self, cache_store=None): + self.cache_store = cache_store or {} + + async def intercept_service( + self, continuation: Callable[[grpc.HandlerCallDetails], Awaitable[ + grpc.RpcMethodHandler]], + handler_call_details: grpc.HandlerCallDetails + ) -> grpc.RpcMethodHandler: + # Get the actual handler + handler = await continuation(handler_call_details) + + # Only intercept unary call RPCs + if handler and (handler.request_streaming or + handler.response_streaming): + return handler + + def wrapper(behavior: Callable[ + [messages_pb2.SimpleRequest, aio. + ServicerContext], messages_pb2.SimpleResponse]): + + @functools.wraps(behavior) + async def wrapper(request: messages_pb2.SimpleRequest, + context: aio.ServicerContext + ) -> messages_pb2.SimpleResponse: + if request.response_size not in self.cache_store: + self.cache_store[request.response_size] = await behavior( + request, context) + return self.cache_store[request.response_size] + + return wrapper + + return wrap_server_method_handler(wrapper, handler) + + async def _create_server_stub_pair( *interceptors: aio.ServerInterceptor ) -> Tuple[aio.Server, test_pb2_grpc.TestServiceStub]: @@ -182,55 +220,29 @@ class TestServerInterceptor(AioTestBase): async def test_response_caching(self): # Prepares a preset value to help testing - cache_store = { + interceptor = _CacheInterceptor({ 42: messages_pb2.SimpleResponse(payload=messages_pb2.Payload( body=b'\x42')) - } - - async def intercept_and_cache( - continuation: Callable[[grpc.HandlerCallDetails], Awaitable[ - grpc.RpcMethodHandler]], - handler_call_details: grpc.HandlerCallDetails - ) -> grpc.RpcMethodHandler: - # Get the actual handler - handler = await continuation(handler_call_details) - - def wrapper(behavior: Callable[ - [messages_pb2.SimpleRequest, aio. - ServerInterceptor], messages_pb2.SimpleResponse]): - - @functools.wraps(behavior) - async def wrapper(request: messages_pb2.SimpleRequest, - context: aio.ServicerContext - ) -> messages_pb2.SimpleResponse: - if request.response_size not in cache_store: - cache_store[request.response_size] = await behavior( - request, context) - return cache_store[request.response_size] - - return wrapper - - return wrap_server_method_handler(wrapper, handler) + }) # Constructs a server with the cache interceptor - server, stub = await _create_server_stub_pair( - _GenericInterceptor(intercept_and_cache)) + server, stub = await _create_server_stub_pair(interceptor) # Tests if the cache store is used response = await stub.UnaryCall( messages_pb2.SimpleRequest(response_size=42)) - self.assertEqual(1, len(cache_store[42].payload.body)) - self.assertEqual(cache_store[42], response) + self.assertEqual(1, len(interceptor.cache_store[42].payload.body)) + self.assertEqual(interceptor.cache_store[42], response) # Tests response can be cached response = await stub.UnaryCall( messages_pb2.SimpleRequest(response_size=1337)) - self.assertEqual(1337, len(cache_store[1337].payload.body)) - self.assertEqual(cache_store[1337], response) + self.assertEqual(1337, len(interceptor.cache_store[1337].payload.body)) + self.assertEqual(interceptor.cache_store[1337], response) response = await stub.UnaryCall( messages_pb2.SimpleRequest(response_size=1337)) - self.assertEqual(cache_store[1337], response) + self.assertEqual(interceptor.cache_store[1337], response) async def test_interceptor_unary_stream(self): record = [] From b2b939d7475a3ddc74b5302beb2ad9f35c2ac522 Mon Sep 17 00:00:00 2001 From: Lidi Zheng Date: Tue, 12 May 2020 14:45:34 -0700 Subject: [PATCH 744/758] Make pytype happy --- .../grpcio_tests/tests_aio/unit/server_interceptor_test.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/python/grpcio_tests/tests_aio/unit/server_interceptor_test.py b/src/python/grpcio_tests/tests_aio/unit/server_interceptor_test.py index 047e1401891..f85e46c379a 100644 --- a/src/python/grpcio_tests/tests_aio/unit/server_interceptor_test.py +++ b/src/python/grpcio_tests/tests_aio/unit/server_interceptor_test.py @@ -95,8 +95,8 @@ class _CacheInterceptor(aio.ServerInterceptor): handler = await continuation(handler_call_details) # Only intercept unary call RPCs - if handler and (handler.request_streaming or - handler.response_streaming): + if handler and (handler.request_streaming or # pytype: disable=attribute-error + handler.response_streaming): # pytype: disable=attribute-error return handler def wrapper(behavior: Callable[ From 90f13f08f06993768b58cb3431d83ab2f5f5f5cc Mon Sep 17 00:00:00 2001 From: Alexander Polcyn Date: Tue, 5 May 2020 16:15:32 -0700 Subject: [PATCH 745/758] plumb recv_stats_op error_string field up to the ruby surface --- src/ruby/ext/grpc/rb_call.c | 10 +- src/ruby/lib/grpc/errors.rb | 145 ++++++++++++++++------- src/ruby/lib/grpc/generic/active_call.rb | 5 +- src/ruby/lib/grpc/structs.rb | 2 +- src/ruby/spec/debug_message_spec.rb | 134 +++++++++++++++++++++ 5 files changed, 249 insertions(+), 47 deletions(-) create mode 100644 src/ruby/spec/debug_message_spec.rb diff --git a/src/ruby/ext/grpc/rb_call.c b/src/ruby/ext/grpc/rb_call.c index b8d7025eacf..fe6158183d8 100644 --- a/src/ruby/ext/grpc/rb_call.c +++ b/src/ruby/ext/grpc/rb_call.c @@ -620,6 +620,7 @@ typedef struct run_batch_stack { int recv_cancelled; grpc_status_code recv_status; grpc_slice recv_status_details; + const char* recv_status_debug_error_string; unsigned write_flag; grpc_slice send_status_details; } run_batch_stack; @@ -729,6 +730,8 @@ static void grpc_run_batch_stack_fill_ops(run_batch_stack* st, VALUE ops_hash) { &st->recv_status; st->ops[st->op_num].data.recv_status_on_client.status_details = &st->recv_status_details; + st->ops[st->op_num].data.recv_status_on_client.error_string = + &st->recv_status_debug_error_string; break; case GRPC_OP_RECV_CLOSE_ON_SERVER: st->ops[st->op_num].data.recv_close_on_server.cancelled = @@ -780,7 +783,12 @@ static VALUE grpc_run_batch_stack_build_result(run_batch_stack* st) { (GRPC_SLICE_START_PTR(st->recv_status_details) == NULL ? Qnil : grpc_rb_slice_to_ruby_string(st->recv_status_details)), - grpc_rb_md_ary_to_h(&st->recv_trailing_metadata), NULL)); + grpc_rb_md_ary_to_h(&st->recv_trailing_metadata), + st->recv_status_debug_error_string == NULL + ? Qnil + : rb_str_new_cstr(st->recv_status_debug_error_string), + NULL)); + gpr_free((void*)st->recv_status_debug_error_string); break; case GRPC_OP_RECV_CLOSE_ON_SERVER: rb_struct_aset(result, sym_send_close, Qtrue); diff --git a/src/ruby/lib/grpc/errors.rb b/src/ruby/lib/grpc/errors.rb index 7a300eb2daa..1ab0811d327 100644 --- a/src/ruby/lib/grpc/errors.rb +++ b/src/ruby/lib/grpc/errors.rb @@ -30,18 +30,26 @@ module GRPC # https://github.com/grpc/grpc/blob/master/include/grpc/impl/codegen/status.h # for detailed descriptions of each status code. class BadStatus < StandardError - attr_reader :code, :details, :metadata + attr_reader :code, :details, :metadata, :debug_error_string include GRPC::Core::StatusCodes # @param code [Numeric] the status code # @param details [String] the details of the exception # @param metadata [Hash] the error's metadata - def initialize(code, details = 'unknown cause', metadata = {}) - super("#{code}:#{details}") + def initialize(code, + details = 'unknown cause', + metadata = {}, + debug_error_string = nil) + exception_message = "#{code}:#{details}" + if debug_error_string + exception_message += ". debug_error_string:#{debug_error_string}" + end + super(exception_message) @code = code @details = details @metadata = metadata + @debug_error_string = debug_error_string end # Converts the exception to a {Struct::Status} for use in the networking @@ -49,7 +57,7 @@ module GRPC # # @return [Struct::Status] with the same code and details def to_status - Struct::Status.new(code, details, metadata) + Struct::Status.new(code, details, metadata, debug_error_string) end # Converts the exception to a deserialized {Google::Rpc::Status} object. @@ -66,8 +74,10 @@ module GRPC nil end - def self.new_status_exception(code, details = 'unknown cause', - metadata = {}) + def self.new_status_exception(code, + details = 'unknown cause', + metadata = {}, + debug_error_string = nil) codes = {} codes[OK] = Ok codes[CANCELLED] = Cancelled @@ -88,129 +98,180 @@ module GRPC codes[DATA_LOSS] = DataLoss if codes[code].nil? - BadStatus.new(code, details, metadata) + BadStatus.new(code, details, metadata, debug_error_string) else - codes[code].new(details, metadata) + codes[code].new(details, metadata, debug_error_string) end end end # GRPC status code corresponding to status OK class Ok < BadStatus - def initialize(details = 'unknown cause', metadata = {}) - super(Core::StatusCodes::OK, details, metadata) + def initialize(details = 'unknown cause', + metadata = {}, + debug_error_string = nil) + super(Core::StatusCodes::OK, + details, metadata, debug_error_string) end end # GRPC status code corresponding to status CANCELLED class Cancelled < BadStatus - def initialize(details = 'unknown cause', metadata = {}) - super(Core::StatusCodes::CANCELLED, details, metadata) + def initialize(details = 'unknown cause', + metadata = {}, + debug_error_string = nil) + super(Core::StatusCodes::CANCELLED, + details, metadata, debug_error_string) end end # GRPC status code corresponding to status UNKNOWN class Unknown < BadStatus - def initialize(details = 'unknown cause', metadata = {}) - super(Core::StatusCodes::UNKNOWN, details, metadata) + def initialize(details = 'unknown cause', + metadata = {}, + debug_error_string = nil) + super(Core::StatusCodes::UNKNOWN, + details, metadata, debug_error_string) end end # GRPC status code corresponding to status INVALID_ARGUMENT class InvalidArgument < BadStatus - def initialize(details = 'unknown cause', metadata = {}) - super(Core::StatusCodes::INVALID_ARGUMENT, details, metadata) + def initialize(details = 'unknown cause', + metadata = {}, + debug_error_string = nil) + super(Core::StatusCodes::INVALID_ARGUMENT, + details, metadata, debug_error_string) end end # GRPC status code corresponding to status DEADLINE_EXCEEDED class DeadlineExceeded < BadStatus - def initialize(details = 'unknown cause', metadata = {}) - super(Core::StatusCodes::DEADLINE_EXCEEDED, details, metadata) + def initialize(details = 'unknown cause', + metadata = {}, + debug_error_string = nil) + super(Core::StatusCodes::DEADLINE_EXCEEDED, + details, metadata, debug_error_string) end end # GRPC status code corresponding to status NOT_FOUND class NotFound < BadStatus - def initialize(details = 'unknown cause', metadata = {}) - super(Core::StatusCodes::NOT_FOUND, details, metadata) + def initialize(details = 'unknown cause', + metadata = {}, + debug_error_string = nil) + super(Core::StatusCodes::NOT_FOUND, + details, metadata, debug_error_string) end end # GRPC status code corresponding to status ALREADY_EXISTS class AlreadyExists < BadStatus - def initialize(details = 'unknown cause', metadata = {}) - super(Core::StatusCodes::ALREADY_EXISTS, details, metadata) + def initialize(details = 'unknown cause', + metadata = {}, + debug_error_string = nil) + super(Core::StatusCodes::ALREADY_EXISTS, + details, metadata, debug_error_string) end end # GRPC status code corresponding to status PERMISSION_DENIED class PermissionDenied < BadStatus - def initialize(details = 'unknown cause', metadata = {}) - super(Core::StatusCodes::PERMISSION_DENIED, details, metadata) + def initialize(details = 'unknown cause', + metadata = {}, + debug_error_string = nil) + super(Core::StatusCodes::PERMISSION_DENIED, + details, metadata, debug_error_string) end end # GRPC status code corresponding to status UNAUTHENTICATED class Unauthenticated < BadStatus - def initialize(details = 'unknown cause', metadata = {}) - super(Core::StatusCodes::UNAUTHENTICATED, details, metadata) + def initialize(details = 'unknown cause', + metadata = {}, + debug_error_string = nil) + super(Core::StatusCodes::UNAUTHENTICATED, + details, metadata, debug_error_string) end end # GRPC status code corresponding to status RESOURCE_EXHAUSTED class ResourceExhausted < BadStatus - def initialize(details = 'unknown cause', metadata = {}) - super(Core::StatusCodes::RESOURCE_EXHAUSTED, details, metadata) + def initialize(details = 'unknown cause', + metadata = {}, + debug_error_string = nil) + super(Core::StatusCodes::RESOURCE_EXHAUSTED, + details, metadata, debug_error_string) end end # GRPC status code corresponding to status FAILED_PRECONDITION class FailedPrecondition < BadStatus - def initialize(details = 'unknown cause', metadata = {}) - super(Core::StatusCodes::FAILED_PRECONDITION, details, metadata) + def initialize(details = 'unknown cause', + metadata = {}, + debug_error_string = nil) + super(Core::StatusCodes::FAILED_PRECONDITION, + details, metadata, debug_error_string) end end # GRPC status code corresponding to status ABORTED class Aborted < BadStatus - def initialize(details = 'unknown cause', metadata = {}) - super(Core::StatusCodes::ABORTED, details, metadata) + def initialize(details = 'unknown cause', + metadata = {}, + debug_error_string = nil) + super(Core::StatusCodes::ABORTED, + details, metadata, debug_error_string) end end # GRPC status code corresponding to status OUT_OF_RANGE class OutOfRange < BadStatus - def initialize(details = 'unknown cause', metadata = {}) - super(Core::StatusCodes::OUT_OF_RANGE, details, metadata) + def initialize(details = 'unknown cause', + metadata = {}, + debug_error_string = nil) + super(Core::StatusCodes::OUT_OF_RANGE, + details, metadata, debug_error_string) end end # GRPC status code corresponding to status UNIMPLEMENTED class Unimplemented < BadStatus - def initialize(details = 'unknown cause', metadata = {}) - super(Core::StatusCodes::UNIMPLEMENTED, details, metadata) + def initialize(details = 'unknown cause', + metadata = {}, + debug_error_string = nil) + super(Core::StatusCodes::UNIMPLEMENTED, + details, metadata, debug_error_string) end end # GRPC status code corresponding to status INTERNAL class Internal < BadStatus - def initialize(details = 'unknown cause', metadata = {}) - super(Core::StatusCodes::INTERNAL, details, metadata) + def initialize(details = 'unknown cause', + metadata = {}, + debug_error_string = nil) + super(Core::StatusCodes::INTERNAL, + details, metadata, debug_error_string) end end # GRPC status code corresponding to status UNAVAILABLE class Unavailable < BadStatus - def initialize(details = 'unknown cause', metadata = {}) - super(Core::StatusCodes::UNAVAILABLE, details, metadata) + def initialize(details = 'unknown cause', + metadata = {}, + debug_error_string = nil) + super(Core::StatusCodes::UNAVAILABLE, + details, metadata, debug_error_string) end end # GRPC status code corresponding to status DATA_LOSS class DataLoss < BadStatus - def initialize(details = 'unknown cause', metadata = {}) - super(Core::StatusCodes::DATA_LOSS, details, metadata) + def initialize(details = 'unknown cause', + metadata = {}, + debug_error_string = nil) + super(Core::StatusCodes::DATA_LOSS, + details, metadata, debug_error_string) end end end diff --git a/src/ruby/lib/grpc/generic/active_call.rb b/src/ruby/lib/grpc/generic/active_call.rb index 688726ef4a8..11db1f448c0 100644 --- a/src/ruby/lib/grpc/generic/active_call.rb +++ b/src/ruby/lib/grpc/generic/active_call.rb @@ -23,13 +23,12 @@ class Struct # is non-nil and not OK. def check_status return nil if status.nil? - fail GRPC::Cancelled if status.code == GRPC::Core::StatusCodes::CANCELLED if status.code != GRPC::Core::StatusCodes::OK GRPC.logger.debug("Failing with status #{status}") # raise BadStatus, propagating the metadata if present. - md = status.metadata fail GRPC::BadStatus.new_status_exception( - status.code, status.details, md) + status.code, status.details, status.metadata, + status.debug_error_string) end status end diff --git a/src/ruby/lib/grpc/structs.rb b/src/ruby/lib/grpc/structs.rb index e57f1b69619..5f0608b07cc 100644 --- a/src/ruby/lib/grpc/structs.rb +++ b/src/ruby/lib/grpc/structs.rb @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -Struct.new('Status', :code, :details, :metadata) +Struct.new('Status', :code, :details, :metadata, :debug_error_string) diff --git a/src/ruby/spec/debug_message_spec.rb b/src/ruby/spec/debug_message_spec.rb new file mode 100644 index 00000000000..e07b9cdfa5a --- /dev/null +++ b/src/ruby/spec/debug_message_spec.rb @@ -0,0 +1,134 @@ +# Copyright 2015 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +require 'spec_helper' + +TEST_DEBUG_MESSAGE = 'raised by test server'.freeze + +# a test service that checks the cert of its peer +class DebugMessageTestService + include GRPC::GenericService + rpc :an_rpc_raises_abort, EchoMsg, EchoMsg + rpc :an_rpc_raises_standarderror, EchoMsg, EchoMsg + + def an_rpc_raises_abort(_req, _call) + fail GRPC::Aborted.new( + 'aborted', + {}, + TEST_DEBUG_MESSAGE) + end + + def an_rpc_raises_standarderror(_req, _call) + fail(StandardError, TEST_DEBUG_MESSAGE) + end +end + +DebugMessageTestServiceStub = DebugMessageTestService.rpc_stub_class + +describe 'surfacing and transmitting of debug messages' do + RpcServer = GRPC::RpcServer + + before(:all) do + server_opts = { + poll_period: 1 + } + @srv = new_rpc_server_for_testing(**server_opts) + @port = @srv.add_http2_port('0.0.0.0:0', :this_port_is_insecure) + @srv.handle(DebugMessageTestService) + @srv_thd = Thread.new { @srv.run } + @srv.wait_till_running + end + + after(:all) do + expect(@srv.stopped?).to be(false) + @srv.stop + @srv_thd.join + end + + it 'debug error message is not present BadStatus exceptions that dont set it' do + exception_message = '' + begin + fail GRPC::Unavailable('unavailable', {}) + rescue StandardError => e + p "Got exception: #{e.message}" + exception_message = e.message + end + expect(exception_message.empty?).to be(false) + expect(exception_message.include?('debug_error_string')).to be(false) + end + + it 'debug error message is present in locally generated errors' do + # Create a secure channel. This is just one way to force a + # connection handshake error, which shoud result in C-core + # generating a status and error message and surfacing them up. + test_root = File.join(File.dirname(__FILE__), 'testdata') + files = ['ca.pem', 'client.key', 'client.pem'] + creds = files.map { |f| File.open(File.join(test_root, f)).read } + creds = GRPC::Core::ChannelCredentials.new(creds[0], creds[1], creds[2]) + stub = DebugMessageTestServiceStub.new( + "localhost:#{@port}", creds) + begin + stub.an_rpc_raises_abort(EchoMsg.new) + rescue StandardError => e + p "Got exception: #{e.message}" + exception_message = e.message + # check that the RPC did actually result in a BadStatus exception + expect(e.is_a?(GRPC::BadStatus)).to be(true) + end + # just check that the debug_error_string is non-empty (we know that + # it's a JSON object, so the first character is '{'). + expect(exception_message.include?('. debug_error_string:{')).to be(true) + end + + it 'debug message is not transmitted from server to client' do + # in order to not accidentally leak internal details about a + # server to untrusted clients, avoid including the debug_error_string + # field of a BadStatusException raised at a server in the + # RPC status that it sends to clients. + stub = DebugMessageTestServiceStub.new( + "localhost:#{@port}", :this_channel_is_insecure) + exception_message = '' + begin + stub.an_rpc_raises_abort(EchoMsg.new) + rescue StandardError => e + p "Got exception: #{e.message}" + exception_message = e.message + # check that the status was aborted is an indirect way to + # tell that the RPC did actually get handled by the server + expect(e.is_a?(GRPC::Aborted)).to be(true) + end + # just assert that the contents of the server-side BadStatus + # debug_error_string field were *not* propagated to the client. + expect(exception_message.include?('. debug_error_string:{')).to be(true) + expect(exception_message.include?(TEST_DEBUG_MESSAGE)).to be(false) + end + + it 'standard_error messages are transmitted from server to client' do + # this test exists mostly in order to understand the test case + # above, by comparison. + stub = DebugMessageTestServiceStub.new( + "localhost:#{@port}", :this_channel_is_insecure) + exception_message = '' + begin + stub.an_rpc_raises_standarderror(EchoMsg.new) + rescue StandardError => e + p "Got exception: #{e.message}" + exception_message = e.message + expect(e.is_a?(GRPC::BadStatus)).to be(true) + end + # assert that the contents of the StandardError exception message + # are propagated to the client. + expect(exception_message.include?(TEST_DEBUG_MESSAGE)).to be(true) + end +end From 4918a51372f85f1d2bdba1fff82cc1e735f1bee9 Mon Sep 17 00:00:00 2001 From: pbatg <23102240+pbatg@users.noreply.github.com> Date: Sat, 9 May 2020 14:16:15 -0400 Subject: [PATCH 746/758] Moved GRPCTypes into its own grpc_objc_library. --- gRPC.podspec | 3 ++- src/objective-c/BUILD | 14 ++++++++++++-- src/objective-c/GRPCClient/GRPCCall.m | 5 ----- src/objective-c/GRPCClient/GRPCTypes.h | 2 ++ src/objective-c/GRPCClient/GRPCTypes.m | 24 ++++++++++++++++++++++++ templates/gRPC.podspec.template | 3 ++- 6 files changed, 42 insertions(+), 9 deletions(-) create mode 100644 src/objective-c/GRPCClient/GRPCTypes.m diff --git a/gRPC.podspec b/gRPC.podspec index 194ddcd9f0c..d57f0dcb07e 100644 --- a/gRPC.podspec +++ b/gRPC.podspec @@ -66,7 +66,8 @@ Pod::Spec.new do |s| "src/objective-c/GRPCClient/GRPCCall+OAuth2.h", "src/objective-c/GRPCClient/GRPCCall+Tests.h", "src/objective-c/GRPCClient/GRPCCallLegacy.h", - "src/objective-c/GRPCClient/GRPCTypes.h" + "src/objective-c/GRPCClient/GRPCTypes.h", + "src/objective-c/GRPCClient/GRPCTypes.m" ss.dependency "gRPC-RxLibrary/Interface", version ss.ios.deployment_target = '7.0' diff --git a/src/objective-c/BUILD b/src/objective-c/BUILD index fed3fb3f63b..122c0fa3315 100644 --- a/src/objective-c/BUILD +++ b/src/objective-c/BUILD @@ -64,10 +64,20 @@ grpc_objc_library( "GRPCClient/GRPCCall+OAuth2.h", "GRPCClient/GRPCCall+Tests.h", "GRPCClient/GRPCCallLegacy.h", - "GRPCClient/GRPCTypes.h", ], deps = [ - "rx_library_headers", + ":grpc_objc_interface_types", + ":rx_library_headers", + ], +) + +grpc_objc_library( + name = "grpc_objc_interface_types", + srcs = [ + "GRPCClient/GRPCTypes.m", + ], + hdrs = [ + "GRPCClient/GRPCTypes.h", ], ) diff --git a/src/objective-c/GRPCClient/GRPCCall.m b/src/objective-c/GRPCClient/GRPCCall.m index a707ceafea7..de725953e12 100644 --- a/src/objective-c/GRPCClient/GRPCCall.m +++ b/src/objective-c/GRPCClient/GRPCCall.m @@ -25,11 +25,6 @@ #import "GRPCTransport.h" #import "private/GRPCTransport+Private.h" -NSString *const kGRPCHeadersKey = @"io.grpc.HeadersKey"; -NSString *const kGRPCTrailersKey = @"io.grpc.TrailersKey"; - -NSString *const kGRPCErrorDomain = @"io.grpc"; - /** * The response dispatcher creates its own serial dispatch queue and target the queue to the * dispatch queue of a user provided response handler. It removes the requirement of having to use diff --git a/src/objective-c/GRPCClient/GRPCTypes.h b/src/objective-c/GRPCClient/GRPCTypes.h index a096a85c6a0..812f3460f75 100644 --- a/src/objective-c/GRPCClient/GRPCTypes.h +++ b/src/objective-c/GRPCClient/GRPCTypes.h @@ -16,6 +16,8 @@ * */ +#import + /** * gRPC error codes. * Note that a few of these are never produced by the gRPC libraries, but are of diff --git a/src/objective-c/GRPCClient/GRPCTypes.m b/src/objective-c/GRPCClient/GRPCTypes.m new file mode 100644 index 00000000000..b5cf6cb51a3 --- /dev/null +++ b/src/objective-c/GRPCClient/GRPCTypes.m @@ -0,0 +1,24 @@ +/* + * + * Copyright 2015 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#import "GRPCTypes.h" + +NSString *const kGRPCHeadersKey = @"io.grpc.HeadersKey"; +NSString *const kGRPCTrailersKey = @"io.grpc.TrailersKey"; + +NSString *const kGRPCErrorDomain = @"io.grpc"; diff --git a/templates/gRPC.podspec.template b/templates/gRPC.podspec.template index 6420045b104..29dd7244692 100644 --- a/templates/gRPC.podspec.template +++ b/templates/gRPC.podspec.template @@ -68,7 +68,8 @@ "src/objective-c/GRPCClient/GRPCCall+OAuth2.h", "src/objective-c/GRPCClient/GRPCCall+Tests.h", "src/objective-c/GRPCClient/GRPCCallLegacy.h", - "src/objective-c/GRPCClient/GRPCTypes.h" + "src/objective-c/GRPCClient/GRPCTypes.h", + "src/objective-c/GRPCClient/GRPCTypes.m" ss.dependency "gRPC-RxLibrary/Interface", version ss.ios.deployment_target = '7.0' From 912157fb9df355a68b67dc60595fad2c2eadf47f Mon Sep 17 00:00:00 2001 From: Hannah Shi Date: Wed, 13 May 2020 06:41:29 +0000 Subject: [PATCH 747/758] change docker/template and re-run generate --- templates/src/php/docker/php-future/Dockerfile.template | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/templates/src/php/docker/php-future/Dockerfile.template b/templates/src/php/docker/php-future/Dockerfile.template index f9abb2fc509..f7aebd151f0 100644 --- a/templates/src/php/docker/php-future/Dockerfile.template +++ b/templates/src/php/docker/php-future/Dockerfile.template @@ -14,11 +14,11 @@ # See the License for the specific language governing permissions and # limitations under the License. - FROM php:7.4.0RC1-buster + FROM php:7.4.5-buster RUN apt-get -qq update && apt-get -qq install -y ${'\\'} autoconf automake git libtool pkg-config ${'\\'} - wget zlib1g-dev + valgrind wget zlib1g-dev ARG MAKEFLAGS=-j8 @@ -29,4 +29,4 @@ <%include file="../pecl_ext_build_src.include" /> - CMD ["/github/grpc/src/php/bin/run_tests.sh", "--skip-persistent-channel-tests"] + CMD ["/github/grpc/src/php/bin/run_tests.sh", "--skip-persistent-channel-tests", "--ignore-valgrind-undef-errors"] From e59b42f7d17375267200b273b4538f4b65d685fa Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Tue, 24 Mar 2020 13:18:05 +0100 Subject: [PATCH 748/758] add script to create Win VM --- tools/gce/create_win2019_container_vm.sh | 46 ++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100755 tools/gce/create_win2019_container_vm.sh diff --git a/tools/gce/create_win2019_container_vm.sh b/tools/gce/create_win2019_container_vm.sh new file mode 100755 index 00000000000..02db428ebb3 --- /dev/null +++ b/tools/gce/create_win2019_container_vm.sh @@ -0,0 +1,46 @@ +#!/bin/bash +# Copyright 2017 gRPC authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Creates a worker for debugging/experiments. +# The worker will have all the prerequisites that are installed on kokoro +# windows workers. + +set -ex + +cd "$(dirname "$0")" + +CLOUD_PROJECT=grpc-testing +ZONE=us-central1-b + +if [ "$1" != "" ] +then + INSTANCE_NAME="$1" +else + INSTANCE_NAME="${USER}-win2019-for-containers-test1" +fi + +MACHINE_TYPE=e2-standard-8 + +# The image version might need updating. +gcloud compute instances create "$INSTANCE_NAME" \ + --project="$CLOUD_PROJECT" \ + --zone "$ZONE" \ + --machine-type "$MACHINE_TYPE" \ + --boot-disk-size=400GB \ + --boot-disk-type pd-ssd \ + --image-project=windows-cloud \ + --image-family=windows-2019-for-containers + +# or use --image-family=windows-2019-core-for-containers From cdb3d823fdc1f554ff04c758d6b847f1b8a9a14e Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Wed, 25 Mar 2020 11:41:47 +0100 Subject: [PATCH 749/758] migrate windows RBE to win2019 pool --- WORKSPACE | 5 + third_party/toolchains/BUILD | 13 ++- third_party/toolchains/README.md | 5 + .../Dockerfile | 96 +++++++++---------- tools/remote_build/windows.bazelrc | 6 +- 5 files changed, 66 insertions(+), 59 deletions(-) create mode 100644 third_party/toolchains/README.md rename third_party/toolchains/{bazel_0.26.0_rbe_windows => rbe_win2019}/Dockerfile (64%) diff --git a/WORKSPACE b/WORKSPACE index f1eeb514149..c3aa3b2aecc 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -39,6 +39,11 @@ rbe_autoconfig( # that want to use other machines (such as LARGE_MACHINE) will override # this value. gce_machine_type = "n1-highmem-2", + # WARNING: the os_family constraint has only been introduced recently + # and older release branches select workers solely based on gce_machine_type. + # Worker pools needs to be configured with care to avoid accidentally running + # linux jobs on windows pool and vice versa (which would lead to a test breakage) + os_family = "Linux", ), # use exec_properties instead of deprecated remote_execution_properties use_legacy_platform_definition = False, diff --git a/third_party/toolchains/BUILD b/third_party/toolchains/BUILD index a581d1fe1e3..d68f9f2c651 100644 --- a/third_party/toolchains/BUILD +++ b/third_party/toolchains/BUILD @@ -20,20 +20,23 @@ load("@bazel_toolchains//rules/exec_properties:exec_properties.bzl", "create_exe alias( name = "rbe_windows", - actual = ":rbe_windows_1803", + actual = ":rbe_windows_2019", ) # RBE Windows platform( - name = "rbe_windows_1803", + name = "rbe_windows_2019", constraint_values = [ "@bazel_tools//platforms:x86_64", "@bazel_tools//platforms:windows", - "@bazel_tools//tools/cpp:msvc", ], exec_properties = create_exec_properties_dict( - container_image = "docker://gcr.io/grpc-testing/rbe_windows_toolchain@sha256:75728e7d6d804090f71095e5fec627b18cfa1f47adc52096c209f2a687e06b2e", - gce_machine_type = "n1-highmem-2", + # See rbe_win2019/Dockerfile for image details + container_image = "docker://gcr.io/grpc-testing/rbe_windows2019_withdbg_toolchain@sha256:7b04ee7e29f942adbf4f70edd2ec4ba20a3e7237e1b54f5cae4b239c6ca41105", + + # Use a different machine type than used on linux to avoid accidentally scheduling linux jobs on windows workers and vice versa on older release branches + gce_machine_type = "n1-standard-2", os_family = "Windows", + labels = {"os": "windows_2019"}, ), ) diff --git a/third_party/toolchains/README.md b/third_party/toolchains/README.md new file mode 100644 index 00000000000..4a268256463 --- /dev/null +++ b/third_party/toolchains/README.md @@ -0,0 +1,5 @@ +# Windows RBE toolchain configuration + +- bazel_0.26.0_rbe_windows: The autogenerated toolchain for windows RBE. See go/rbe-windows-user-guide + +- rbe_win2019: The windows dockerfile to rebuild the docker image we use on RBE workers. See go/rbe-windows-user-guide \ No newline at end of file diff --git a/third_party/toolchains/bazel_0.26.0_rbe_windows/Dockerfile b/third_party/toolchains/rbe_win2019/Dockerfile similarity index 64% rename from third_party/toolchains/bazel_0.26.0_rbe_windows/Dockerfile rename to third_party/toolchains/rbe_win2019/Dockerfile index bbfce76436d..b6efe2fb0dc 100644 --- a/third_party/toolchains/bazel_0.26.0_rbe_windows/Dockerfile +++ b/third_party/toolchains/rbe_win2019/Dockerfile @@ -1,79 +1,76 @@ +# This dockerfile is taken from go/rbe-windows-user-guide +# (including the fix --compilation_mode=dbg) + # This Dockerfile creates an image that: # - Has the correct MTU setting for networking from inside the container to work. # - Has Visual Studio 2015 Build Tools installed. # - Has msys2 + git, curl, zip, unzip installed. # - Has Python 2.7 installed. -# - Has Bazel installed. - # TODO(jsharpe): Consider replacing "ADD $URI $DEST" with "Invoke-WebRequest -Method Get -Uri $URI -OutFile $DEST" - # Use the latest Windows Server Core image. # -# WARNING: What's the `:1803` about? There are two versions of Windows Server -# 2016: a "regular" one (corresponding to `microsoft/windowsservercore`) is on -# a slow release cadence, and a fast release cadence one (corresponding to -# `microsoft/windowsservercore:1803`). If you chose a different image than -# described above, probably omit the `:1803` or change it to a different -# number. -FROM microsoft/windowsservercore:1803 - +# WARNING: What's the `:ltsc2019` about? +# There are two versions of Windows Server 2019: +# 1. A "regular" one (corresponding to `mcr.microsoft.com/windows/servercore:ltsc2019`) +# is on a slow release cadence and is the Long-Term Servicing Channel. +# Mainstream support for this image will end on 1/9/2024. +# 2. A "fast" release cadence one (corresponding to +# `mcr.microsoft.com/windows/servercore:1909`) is the Semi-Annual Channel. +# Mainstream support for this image will end on 5/11/2021. +# +# If you choose a different +# image than described above, change the `:ltsc2019` tag. +# Start a temporary container in which we install 7-Zip to extract msys2 +FROM mcr.microsoft.com/windows/servercore:ltsc2019 as extract-msys2 SHELL ["powershell.exe", "-ExecutionPolicy", "Bypass", "-Command", "$ErrorActionPreference='Stop'; $ProgressPreference='SilentlyContinue'; $VerbosePreference = 'Continue';"] - -# TODO(b/112379377): Workaround until bug is fixed. -RUN netsh interface ipv4 set subinterface \"vEthernet (Ethernet)\" mtu=1460 store=persistent - -# Install Visual Studio 2015 Build Tools. -RUN Invoke-WebRequest "https://download.microsoft.com/download/5/f/7/5f7acaeb-8363-451f-9425-68a90f98b238/visualcppbuildtools_full.exe" \ - -OutFile visualcppbuildtools_full.exe -UseBasicParsing ; \ - Start-Process -FilePath 'visualcppbuildtools_full.exe' -ArgumentList '/quiet', '/NoRestart' -Wait ; \ - Remove-Item .\visualcppbuildtools_full.exe; - -# TODO(jsharpe): Alternate install for msys2: https://github.com/StefanScherer/dockerfiles-windows/issues/30 - # Install 7-Zip and add it to the path. ADD https://www.7-zip.org/a/7z1801-x64.msi C:\\TEMP\\7z.msi RUN Start-Process msiexec.exe -ArgumentList \"/i C:\\TEMP\\7z.msi /qn /norestart /log C:\\TEMP\\7z_install_log.txt\" -wait RUN $oldpath = (Get-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment' -Name PATH).path; \ $newpath = \"$oldpath;C:\Program Files\7-Zip\"; \ Set-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment' -Name PATH -Value $newPath - -# Install msys2, and add some extra tools. -ADD http://repo.msys2.org/distrib/x86_64/msys2-base-x86_64-20161025.tar.xz C:\\TEMP\\msys2.tar.xz +# Extract msys2 +ADD http://repo.msys2.org/distrib/x86_64/msys2-base-x86_64-20181211.tar.xz C:\\TEMP\\msys2.tar.xz RUN 7z x C:\TEMP\msys2.tar.xz -oC:\TEMP\msys2.tar RUN 7z x C:\TEMP\msys2.tar -oC:\tools +# Start building the actual image +FROM mcr.microsoft.com/windows/servercore:ltsc2019 +SHELL ["powershell.exe", "-ExecutionPolicy", "Bypass", "-Command", "$ErrorActionPreference='Stop'; $ProgressPreference='SilentlyContinue'; $VerbosePreference = 'Continue';"] +# TODO(b/112379377): Workaround until bug is fixed. +RUN Get-NetAdapter | Where-Object Name -like "*Ethernet*" | ForEach-Object { & netsh interface ipv4 set subinterface $_.InterfaceIndex mtu=1460 store=persistent } +# Enable Long Paths for Win32 File/Folder APIs. +RUN New-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem -Name LongPathsEnabled -Value 1 -PropertyType DWORD -Force + +# Install Visual Studio 2015 Build Tools. +RUN Invoke-WebRequest "https://download.microsoft.com/download/5/f/7/5f7acaeb-8363-451f-9425-68a90f98b238/visualcppbuildtools_full.exe" \ + -OutFile visualcppbuildtools_full.exe -UseBasicParsing ; \ + Start-Process -FilePath 'visualcppbuildtools_full.exe' -ArgumentList '/quiet', '/NoRestart', '/InstallSelectableItems "Win10SDK_VisibleV1"' -Wait ; \ + Remove-Item .\visualcppbuildtools_full.exe; +# Add ucrtbased.dll to the system directory to allow --compilation_mode=dbg to +# work. This DLL should be automatically copied to C:\Windows\System32 by the +# installer, but isn't when the installer is run on Docker, for some reason. +RUN Copy-Item \"C:\Program Files (x86)\Windows Kits\10\bin\x64\ucrt\ucrtbased.dll\" C:\Windows\System32 + + +# TODO(jsharpe): Alternate install for msys2: https://github.com/StefanScherer/dockerfiles-windows/issues/30 +# From the temporary extract-msys2 container, copy the tools directory to this container +COPY --from=extract-msys2 ["C:/tools", "C:/tools"] +# Add msys2 to the PATH variable RUN $oldpath = (Get-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment' -Name PATH).path; \ $newpath = \"$oldpath;C:\tools\msys64;C:\tools\msys64\usr\bin\"; \ Set-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment' -Name PATH -Value $newPath -RUN Start-Process msys2 -ArgumentList 'pacman -noconfirm -Syuu git curl zip unzip' -Wait - +# Bazel documentation says to use -Syuu but this doesn't work in Docker. See +# http://g/foundry-windows/PDMVXbGew7Y +RUN bash.exe -c \"pacman-key --init && pacman-key --populate msys2 && pacman-key --refresh-keys && pacman --noconfirm -Syy git curl zip unzip\" # Install Visual C++ Redistributable for Visual Studio 2015: ADD https://download.microsoft.com/download/9/3/F/93FCF1E7-E6A4-478B-96E7-D4B285925B00/vc_redist.x64.exe C:\\TEMP\\vc_redist.x64.exe RUN C:\TEMP\vc_redist.x64.exe /quiet /install - # Install Python 2.7. ADD https://www.python.org/ftp/python/2.7.14/python-2.7.14.amd64.msi C:\\TEMP\\python.msi RUN Start-Process msiexec.exe -ArgumentList \"/i C:\\TEMP\\python.msi /qn /norestart /log C:\\TEMP\\python_install_log.txt\" -wait RUN $oldpath = (Get-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment' -Name PATH).path; \ $newpath = \"$oldpath;C:\Python27\"; \ Set-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment' -Name PATH -Value $newPath - -# Install Bazel. -RUN Set-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment' -Name BAZEL_SH -Value \"C:\tools\msys64\usr\bin\bash.exe\" -RUN Set-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment' -Name BAZEL_VC -Value \"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\" -RUN [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls12; -ADD https://github.com/bazelbuild/bazel/releases/download/0.26.0/bazel-0.26.0-windows-x86_64.exe C:\\bin\\bazel.exe -RUN $oldpath = (Get-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment' -Name PATH).path; \ - $newpath = \"$oldpath;C:\bin\"; \ - Set-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment' -Name PATH -Value $newPath - -# TODO(jsharpe): This requires entropy so may be problematic on a headless machine: https://wiki.archlinux.org/index.php/Pacman/Package_signing#Initializing_the_keyring -RUN Start-Process msys2 -ArgumentList 'pacman-key --init' -Wait -# TODO(jsharpe): If you don't run this then the next command can't succeed since it needs to prompt to remove catgets. -RUN pacman --noconfirm -R libcatgets catgets -# Bazel documentation says to use -Syuu but this doesn't work in Docker. See -# http://g/foundry-windows/PDMVXbGew7Y -RUN pacman --noconfirm -Syy git curl zip unzip - RUN \ Add-Type -AssemblyName \"System.IO.Compression.FileSystem\"; \ $zulu_url = \"https://cdn.azul.com/zulu/bin/zulu8.28.0.1-jdk8.0.163-win_x64.zip\"; \ @@ -88,9 +85,10 @@ RUN \ [Environment]::SetEnvironmentVariable(\"PATH\", $env:PATH, \"Machine\"); \ $env:JAVA_HOME = $zulu_root; \ [Environment]::SetEnvironmentVariable(\"JAVA_HOME\", $env:JAVA_HOME, \"Machine\") - # Restore default shell for Windows containers. SHELL ["cmd.exe", "/s", "/c"] - # Default to PowerShell if no other command specified. CMD ["powershell.exe", "-NoLogo", "-ExecutionPolicy", "Bypass"] + + + diff --git a/tools/remote_build/windows.bazelrc b/tools/remote_build/windows.bazelrc index 4f6979478f9..c260670f069 100644 --- a/tools/remote_build/windows.bazelrc +++ b/tools/remote_build/windows.bazelrc @@ -1,9 +1,5 @@ startup --host_jvm_args=-Dbazel.DigestFunction=SHA256 -# TODO(jtattermusch): Currently building with --compilation_mode=dbg is broken on Windows RBE -# so we need to explicitly override it to use fastbuild. -build:windows_dbg --compilation_mode=fastbuild - build --remote_cache=grpcs://remotebuildexecution.googleapis.com build --remote_executor=grpcs://remotebuildexecution.googleapis.com @@ -26,7 +22,7 @@ build --strategy=Closure=remote build --genrule_strategy=remote build --remote_timeout=7200 # very large value to avoid problems like https://github.com/grpc/grpc/issues/20777 -build --remote_instance_name=projects/grpc-testing/instances/grpc-windows-rbe-test +build --remote_instance_name=projects/grpc-testing/instances/default_instance build --verbose_failures=true From 2de0e4c7df39e14ec85bf30fa32700f84cf2fb83 Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Wed, 25 Mar 2020 12:29:39 +0100 Subject: [PATCH 750/758] small fixup --- third_party/toolchains/BUILD | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/third_party/toolchains/BUILD b/third_party/toolchains/BUILD index d68f9f2c651..70b75900e63 100644 --- a/third_party/toolchains/BUILD +++ b/third_party/toolchains/BUILD @@ -37,6 +37,7 @@ platform( # Use a different machine type than used on linux to avoid accidentally scheduling linux jobs on windows workers and vice versa on older release branches gce_machine_type = "n1-standard-2", os_family = "Windows", - labels = {"os": "windows_2019"}, + # labels only supported starting from https://github.com/bazelbuild/bazel-toolchains/pull/748 + #labels = {"os": "windows_2019"}, ), ) From 7740ed281d858cc2674ed64b6632867e9ac0ce8a Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Wed, 13 May 2020 15:51:50 +0200 Subject: [PATCH 751/758] A few more improvements --- doc/command_line_tool.md | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/doc/command_line_tool.md b/doc/command_line_tool.md index 14f6f7866ab..c805b50ba71 100644 --- a/doc/command_line_tool.md +++ b/doc/command_line_tool.md @@ -63,15 +63,10 @@ $ cmake -DgRPC_BUILD_TESTS=ON ../.. Finally you can build the command line tool with the command: ``` +# run from cmake/build directory $ make grpc_cli ``` -To speed up compilation time on linux, you can use make with following flag: - -``` -$ make grpc_cli -j$(nproc) -``` - The main file can be found at https://github.com/grpc/grpc/blob/master/test/cpp/util/grpc_cli.cc From 436165a753d7de931baf9cbdad16aa2c2ec89c1c Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Wed, 13 May 2020 15:53:43 +0200 Subject: [PATCH 752/758] Simplify the instructions a bit more. --- doc/command_line_tool.md | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/doc/command_line_tool.md b/doc/command_line_tool.md index c805b50ba71..786825fde32 100644 --- a/doc/command_line_tool.md +++ b/doc/command_line_tool.md @@ -52,18 +52,12 @@ Mac systems with Homebrew: brew install gflags ``` -Once the prerequisites are satisfied, generate makefiles: +Once the prerequisites are satisfied, you can build with cmake: ``` $ mkdir -p cmake/build $ cd cmake/build $ cmake -DgRPC_BUILD_TESTS=ON ../.. -``` - -Finally you can build the command line tool with the command: - -``` -# run from cmake/build directory $ make grpc_cli ``` From 7d8f295ab0c0be7452ab6ce07300d7c3129fc5c4 Mon Sep 17 00:00:00 2001 From: Stanley Cheung Date: Wed, 13 May 2020 10:59:09 -0700 Subject: [PATCH 753/758] Fix run_tests pip install error --- templates/tools/dockerfile/gcp_api_libraries.include | 1 - templates/tools/dockerfile/python_debian10.include | 2 +- templates/tools/dockerfile/python_deps.include | 3 ++- templates/tools/dockerfile/python_stretch.include | 2 +- .../test/csharp_stretch_x64/Dockerfile.template | 2 +- .../dockerfile/test/cxx_buster_x64/Dockerfile.template | 2 +- .../dockerfile/test/cxx_jessie_x64/Dockerfile.template | 2 +- .../dockerfile/test/cxx_jessie_x86/Dockerfile.template | 2 +- .../test/cxx_sanitizers_jessie_x64/Dockerfile.template | 2 +- .../test/cxx_ubuntu1404_x64/Dockerfile.template | 2 +- .../test/cxx_ubuntu1604_x64/Dockerfile.template | 2 +- .../test/cxx_ubuntu1804_x64/Dockerfile.template | 2 +- .../tools/dockerfile/test/fuzzer/Dockerfile.template | 2 +- .../test/node_jessie_x64/Dockerfile.template | 2 +- .../test/php7_jessie_x64/Dockerfile.template | 2 +- .../dockerfile/test/php_jessie_x64/Dockerfile.template | 2 +- .../test/ruby_jessie_x64/Dockerfile.template | 2 +- tools/dockerfile/grpc_clang_tidy/Dockerfile | 3 ++- .../interoptest/grpc_interop_csharp/Dockerfile | 3 ++- .../interoptest/grpc_interop_csharpcoreclr/Dockerfile | 3 ++- .../dockerfile/interoptest/grpc_interop_cxx/Dockerfile | 3 ++- .../dockerfile/interoptest/grpc_interop_go/Dockerfile | 3 ++- .../interoptest/grpc_interop_go1.11/Dockerfile | 3 ++- .../interoptest/grpc_interop_go1.7/Dockerfile | 3 ++- .../interoptest/grpc_interop_go1.8/Dockerfile | 3 ++- .../interoptest/grpc_interop_http2/Dockerfile | 3 ++- .../interoptest/grpc_interop_node/Dockerfile | 3 ++- .../interoptest/grpc_interop_python/Dockerfile | 7 +++---- .../interoptest/grpc_interop_pythonasyncio/Dockerfile | 7 +++---- .../interoptest/grpc_interop_ruby/Dockerfile | 3 ++- tools/dockerfile/test/bazel/Dockerfile | 3 ++- tools/dockerfile/test/csharp_stretch_x64/Dockerfile | 10 +++++----- tools/dockerfile/test/cxx_buster_x64/Dockerfile | 10 +++++----- tools/dockerfile/test/cxx_jessie_x64/Dockerfile | 10 +++++----- tools/dockerfile/test/cxx_jessie_x86/Dockerfile | 10 +++++----- .../test/cxx_sanitizers_jessie_x64/Dockerfile | 10 +++++----- tools/dockerfile/test/cxx_ubuntu1404_x64/Dockerfile | 10 +++++----- tools/dockerfile/test/cxx_ubuntu1604_x64/Dockerfile | 10 +++++----- tools/dockerfile/test/cxx_ubuntu1804_x64/Dockerfile | 10 +++++----- tools/dockerfile/test/fuzzer/Dockerfile | 10 +++++----- tools/dockerfile/test/node_jessie_x64/Dockerfile | 10 +++++----- tools/dockerfile/test/php7_jessie_x64/Dockerfile | 10 +++++----- tools/dockerfile/test/php_jessie_x64/Dockerfile | 10 +++++----- .../dockerfile/test/python_stretch_2.7_x64/Dockerfile | 7 +++---- .../dockerfile/test/python_stretch_3.5_x64/Dockerfile | 7 +++---- .../dockerfile/test/python_stretch_3.6_x64/Dockerfile | 7 +++---- .../dockerfile/test/python_stretch_3.7_x64/Dockerfile | 7 +++---- .../dockerfile/test/python_stretch_3.8_x64/Dockerfile | 7 +++---- .../test/python_stretch_default_x64/Dockerfile | 7 +++---- tools/dockerfile/test/ruby_jessie_x64/Dockerfile | 10 +++++----- tools/dockerfile/test/sanity/Dockerfile | 7 +++---- 51 files changed, 133 insertions(+), 130 deletions(-) diff --git a/templates/tools/dockerfile/gcp_api_libraries.include b/templates/tools/dockerfile/gcp_api_libraries.include index 5a263649d2c..f93c24176f7 100644 --- a/templates/tools/dockerfile/gcp_api_libraries.include +++ b/templates/tools/dockerfile/gcp_api_libraries.include @@ -1,3 +1,2 @@ # Google Cloud platform API libraries -RUN apt-get update && apt-get install -y python-pip && apt-get clean RUN pip install --upgrade google-api-python-client oauth2client diff --git a/templates/tools/dockerfile/python_debian10.include b/templates/tools/dockerfile/python_debian10.include index 883ece20633..f65c9ff78ac 100644 --- a/templates/tools/dockerfile/python_debian10.include +++ b/templates/tools/dockerfile/python_debian10.include @@ -1,6 +1,6 @@ FROM debian:10 <%include file="./apt_get_basic.include"/> -<%include file="./gcp_api_libraries.include"/> <%include file="./apt_get_python_27.include"/> +<%include file="./gcp_api_libraries.include"/> <%include file="./run_tests_addons.include"/> diff --git a/templates/tools/dockerfile/python_deps.include b/templates/tools/dockerfile/python_deps.include index 8c3f32f0267..cdacfddfed9 100644 --- a/templates/tools/dockerfile/python_deps.include +++ b/templates/tools/dockerfile/python_deps.include @@ -6,9 +6,10 @@ RUN apt-get update && apt-get install -y ${'\\'} python-all-dev ${'\\'} python3-all-dev ${'\\'} - python-pip + python-setuptools # Install Python packages from PyPI +RUN curl https://bootstrap.pypa.io/get-pip.py | python2.7 RUN pip install --upgrade pip==19.3.1 RUN pip install virtualenv==16.7.9 RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.2.post1 six==1.10.0 twisted==17.5.0 diff --git a/templates/tools/dockerfile/python_stretch.include b/templates/tools/dockerfile/python_stretch.include index 8591e753d01..63ea6ae6c65 100644 --- a/templates/tools/dockerfile/python_stretch.include +++ b/templates/tools/dockerfile/python_stretch.include @@ -1,8 +1,8 @@ FROM debian:stretch <%include file="./apt_get_basic.include"/> -<%include file="./gcp_api_libraries.include"/> <%include file="./apt_get_python_27.include"/> +<%include file="./gcp_api_libraries.include"/> # Add Debian 'buster' repository, we will need it for installing newer versions of python RUN echo 'deb http://ftp.de.debian.org/debian buster main' >> /etc/apt/sources.list RUN echo 'APT::Default-Release "stretch";' | tee -a /etc/apt/apt.conf.d/00local diff --git a/templates/tools/dockerfile/test/csharp_stretch_x64/Dockerfile.template b/templates/tools/dockerfile/test/csharp_stretch_x64/Dockerfile.template index 1526d07fc63..355b47e18a0 100644 --- a/templates/tools/dockerfile/test/csharp_stretch_x64/Dockerfile.template +++ b/templates/tools/dockerfile/test/csharp_stretch_x64/Dockerfile.template @@ -17,8 +17,8 @@ FROM debian:stretch <%include file="../../apt_get_basic.include"/> - <%include file="../../gcp_api_libraries.include"/> <%include file="../../python_deps.include"/> + <%include file="../../gcp_api_libraries.include"/> <%include file="../../csharp_deps.include"/> <%include file="../../csharp_dotnetcli_deps.include"/> <%include file="../../run_tests_addons.include"/> diff --git a/templates/tools/dockerfile/test/cxx_buster_x64/Dockerfile.template b/templates/tools/dockerfile/test/cxx_buster_x64/Dockerfile.template index d3da8ab9410..5d398e4c4db 100644 --- a/templates/tools/dockerfile/test/cxx_buster_x64/Dockerfile.template +++ b/templates/tools/dockerfile/test/cxx_buster_x64/Dockerfile.template @@ -17,8 +17,8 @@ FROM debian:buster <%include file="../../apt_get_basic.include"/> - <%include file="../../gcp_api_libraries.include"/> <%include file="../../python_deps.include"/> + <%include file="../../gcp_api_libraries.include"/> <%include file="../../cxx_deps.include"/> <%include file="../../run_tests_addons.include"/> diff --git a/templates/tools/dockerfile/test/cxx_jessie_x64/Dockerfile.template b/templates/tools/dockerfile/test/cxx_jessie_x64/Dockerfile.template index 9d358a0cf25..1fa7c3b25c7 100644 --- a/templates/tools/dockerfile/test/cxx_jessie_x64/Dockerfile.template +++ b/templates/tools/dockerfile/test/cxx_jessie_x64/Dockerfile.template @@ -17,8 +17,8 @@ <%include file="../../debian_jessie_header.include"/> <%include file="../../apt_get_basic.include"/> - <%include file="../../gcp_api_libraries.include"/> <%include file="../../python_deps.include"/> + <%include file="../../gcp_api_libraries.include"/> <%include file="../../cxx_deps.include"/> <%include file="../../cmake_jessie_backports.include"/> <%include file="../../run_tests_addons.include"/> diff --git a/templates/tools/dockerfile/test/cxx_jessie_x86/Dockerfile.template b/templates/tools/dockerfile/test/cxx_jessie_x86/Dockerfile.template index fc79ecce190..064b2abae4f 100644 --- a/templates/tools/dockerfile/test/cxx_jessie_x86/Dockerfile.template +++ b/templates/tools/dockerfile/test/cxx_jessie_x86/Dockerfile.template @@ -18,8 +18,8 @@ RUN sed -i '/deb http:\/\/http.debian.net\/debian jessie-updates main/d' /etc/apt/sources.list <%include file="../../apt_get_basic.include"/> - <%include file="../../gcp_api_libraries.include"/> <%include file="../../python_deps.include"/> + <%include file="../../gcp_api_libraries.include"/> <%include file="../../cxx_deps.include"/> <%include file="../../run_tests_addons.include"/> <%include file="../../cmake_jessie_backports.include"/> diff --git a/templates/tools/dockerfile/test/cxx_sanitizers_jessie_x64/Dockerfile.template b/templates/tools/dockerfile/test/cxx_sanitizers_jessie_x64/Dockerfile.template index 7d173236ee3..8d2a40ab023 100644 --- a/templates/tools/dockerfile/test/cxx_sanitizers_jessie_x64/Dockerfile.template +++ b/templates/tools/dockerfile/test/cxx_sanitizers_jessie_x64/Dockerfile.template @@ -19,8 +19,8 @@ RUN sed -i '/deb http:\/\/httpredir.debian.org\/debian jessie-updates main/d' /etc/apt/sources.list <%include file="../../apt_get_basic.include"/> - <%include file="../../gcp_api_libraries.include"/> <%include file="../../python_deps.include"/> + <%include file="../../gcp_api_libraries.include"/> #================= # C++ dependencies (purposely excluding Clang because it's part of the base image) RUN apt-get update && apt-get -y install libgflags-dev libgtest-dev libc++-dev && apt-get clean diff --git a/templates/tools/dockerfile/test/cxx_ubuntu1404_x64/Dockerfile.template b/templates/tools/dockerfile/test/cxx_ubuntu1404_x64/Dockerfile.template index 3668c97bcdd..3e92dd1a811 100644 --- a/templates/tools/dockerfile/test/cxx_ubuntu1404_x64/Dockerfile.template +++ b/templates/tools/dockerfile/test/cxx_ubuntu1404_x64/Dockerfile.template @@ -17,8 +17,8 @@ FROM ubuntu:14.04 <%include file="../../apt_get_basic.include"/> - <%include file="../../gcp_api_libraries.include"/> <%include file="../../python_deps.include"/> + <%include file="../../gcp_api_libraries.include"/> <%include file="../../cxx_deps.include"/> <%include file="../../run_tests_addons.include"/> # Define the default command. diff --git a/templates/tools/dockerfile/test/cxx_ubuntu1604_x64/Dockerfile.template b/templates/tools/dockerfile/test/cxx_ubuntu1604_x64/Dockerfile.template index a311b12a254..2ab83793d9c 100644 --- a/templates/tools/dockerfile/test/cxx_ubuntu1604_x64/Dockerfile.template +++ b/templates/tools/dockerfile/test/cxx_ubuntu1604_x64/Dockerfile.template @@ -17,8 +17,8 @@ FROM ubuntu:16.04 <%include file="../../apt_get_basic.include"/> - <%include file="../../gcp_api_libraries.include"/> <%include file="../../python_deps.include"/> + <%include file="../../gcp_api_libraries.include"/> <%include file="../../cxx_deps.include"/> <%include file="../../run_tests_addons.include"/> diff --git a/templates/tools/dockerfile/test/cxx_ubuntu1804_x64/Dockerfile.template b/templates/tools/dockerfile/test/cxx_ubuntu1804_x64/Dockerfile.template index 76faebd98d5..dd833b983ef 100644 --- a/templates/tools/dockerfile/test/cxx_ubuntu1804_x64/Dockerfile.template +++ b/templates/tools/dockerfile/test/cxx_ubuntu1804_x64/Dockerfile.template @@ -17,8 +17,8 @@ FROM ubuntu:18.04 <%include file="../../apt_get_basic.include"/> - <%include file="../../gcp_api_libraries.include"/> <%include file="../../python_deps.include"/> + <%include file="../../gcp_api_libraries.include"/> <%include file="../../cxx_deps.include"/> <%include file="../../run_tests_addons.include"/> diff --git a/templates/tools/dockerfile/test/fuzzer/Dockerfile.template b/templates/tools/dockerfile/test/fuzzer/Dockerfile.template index 345da0804ad..8ad5b06de46 100644 --- a/templates/tools/dockerfile/test/fuzzer/Dockerfile.template +++ b/templates/tools/dockerfile/test/fuzzer/Dockerfile.template @@ -17,8 +17,8 @@ <%include file="../../debian_jessie_header.include"/> <%include file="../../apt_get_basic.include"/> - <%include file="../../gcp_api_libraries.include"/> <%include file="../../python_deps.include"/> + <%include file="../../gcp_api_libraries.include"/> <%include file="../../cxx_deps.include"/> <%include file="../../cmake_jessie_backports.include"/> <%include file="../../clang_update.include"/> diff --git a/templates/tools/dockerfile/test/node_jessie_x64/Dockerfile.template b/templates/tools/dockerfile/test/node_jessie_x64/Dockerfile.template index cd0513a1a4d..d5c4153c9ec 100644 --- a/templates/tools/dockerfile/test/node_jessie_x64/Dockerfile.template +++ b/templates/tools/dockerfile/test/node_jessie_x64/Dockerfile.template @@ -17,7 +17,6 @@ <%include file="../../debian_jessie_header.include"/> <%include file="../../apt_get_basic.include"/> - <%include file="../../gcp_api_libraries.include"/> # Install Electron apt dependencies RUN apt-get update && apt-get install -y ${'\\'} @@ -30,6 +29,7 @@ xvfb <%include file="../../python_deps.include"/> + <%include file="../../gcp_api_libraries.include"/> <%include file="../../node_deps.include"/> <%include file="../../run_tests_addons.include"/> # Install Mako to generate files in grpc/grpc-node diff --git a/templates/tools/dockerfile/test/php7_jessie_x64/Dockerfile.template b/templates/tools/dockerfile/test/php7_jessie_x64/Dockerfile.template index d29cd7e4e59..cf83681ecab 100644 --- a/templates/tools/dockerfile/test/php7_jessie_x64/Dockerfile.template +++ b/templates/tools/dockerfile/test/php7_jessie_x64/Dockerfile.template @@ -17,8 +17,8 @@ <%include file="../../debian_jessie_header.include"/> <%include file="../../php7_deps.include"/> - <%include file="../../gcp_api_libraries.include"/> <%include file="../../python_deps.include"/> + <%include file="../../gcp_api_libraries.include"/> <%include file="../../php_valgrind.include"/> <%include file="../../run_tests_addons.include"/> # Define the default command. diff --git a/templates/tools/dockerfile/test/php_jessie_x64/Dockerfile.template b/templates/tools/dockerfile/test/php_jessie_x64/Dockerfile.template index 3bd8f9c7c47..f3459f48ab8 100644 --- a/templates/tools/dockerfile/test/php_jessie_x64/Dockerfile.template +++ b/templates/tools/dockerfile/test/php_jessie_x64/Dockerfile.template @@ -17,8 +17,8 @@ <%include file="../../debian_jessie_header.include"/> <%include file="../../apt_get_basic.include"/> - <%include file="../../gcp_api_libraries.include"/> <%include file="../../python_deps.include"/> + <%include file="../../gcp_api_libraries.include"/> <%include file="../../php_deps.include"/> <%include file="../../run_tests_addons.include"/> # Define the default command. diff --git a/templates/tools/dockerfile/test/ruby_jessie_x64/Dockerfile.template b/templates/tools/dockerfile/test/ruby_jessie_x64/Dockerfile.template index 2fed02246bb..af90c937f75 100644 --- a/templates/tools/dockerfile/test/ruby_jessie_x64/Dockerfile.template +++ b/templates/tools/dockerfile/test/ruby_jessie_x64/Dockerfile.template @@ -17,8 +17,8 @@ <%include file="../../debian_jessie_header.include"/> <%include file="../../apt_get_basic.include"/> - <%include file="../../gcp_api_libraries.include"/> <%include file="../../python_deps.include"/> + <%include file="../../gcp_api_libraries.include"/> <%include file="../../ruby_deps.include"/> <%include file="../../run_tests_addons.include"/> # Define the default command. diff --git a/tools/dockerfile/grpc_clang_tidy/Dockerfile b/tools/dockerfile/grpc_clang_tidy/Dockerfile index 20e32941164..93c4e6d9257 100644 --- a/tools/dockerfile/grpc_clang_tidy/Dockerfile +++ b/tools/dockerfile/grpc_clang_tidy/Dockerfile @@ -29,9 +29,10 @@ ENV CLANG_TIDY=clang-tidy-6.0 RUN apt-get update && apt-get install -y \ python-all-dev \ python3-all-dev \ - python-pip + python-setuptools # Install Python packages from PyPI +RUN curl https://bootstrap.pypa.io/get-pip.py | python2.7 RUN pip install --upgrade pip==19.3.1 RUN pip install virtualenv==16.7.9 RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.2.post1 six==1.10.0 twisted==17.5.0 diff --git a/tools/dockerfile/interoptest/grpc_interop_csharp/Dockerfile b/tools/dockerfile/interoptest/grpc_interop_csharp/Dockerfile index 917d8a4bf45..39d26d4b01a 100644 --- a/tools/dockerfile/interoptest/grpc_interop_csharp/Dockerfile +++ b/tools/dockerfile/interoptest/grpc_interop_csharp/Dockerfile @@ -57,9 +57,10 @@ RUN apt-get update && apt-get install -y time && apt-get clean RUN apt-get update && apt-get install -y \ python-all-dev \ python3-all-dev \ - python-pip + python-setuptools # Install Python packages from PyPI +RUN curl https://bootstrap.pypa.io/get-pip.py | python2.7 RUN pip install --upgrade pip==19.3.1 RUN pip install virtualenv==16.7.9 RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.2.post1 six==1.10.0 twisted==17.5.0 diff --git a/tools/dockerfile/interoptest/grpc_interop_csharpcoreclr/Dockerfile b/tools/dockerfile/interoptest/grpc_interop_csharpcoreclr/Dockerfile index 917d8a4bf45..39d26d4b01a 100644 --- a/tools/dockerfile/interoptest/grpc_interop_csharpcoreclr/Dockerfile +++ b/tools/dockerfile/interoptest/grpc_interop_csharpcoreclr/Dockerfile @@ -57,9 +57,10 @@ RUN apt-get update && apt-get install -y time && apt-get clean RUN apt-get update && apt-get install -y \ python-all-dev \ python3-all-dev \ - python-pip + python-setuptools # Install Python packages from PyPI +RUN curl https://bootstrap.pypa.io/get-pip.py | python2.7 RUN pip install --upgrade pip==19.3.1 RUN pip install virtualenv==16.7.9 RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.2.post1 six==1.10.0 twisted==17.5.0 diff --git a/tools/dockerfile/interoptest/grpc_interop_cxx/Dockerfile b/tools/dockerfile/interoptest/grpc_interop_cxx/Dockerfile index d48dfb342d7..477618e5767 100644 --- a/tools/dockerfile/interoptest/grpc_interop_cxx/Dockerfile +++ b/tools/dockerfile/interoptest/grpc_interop_cxx/Dockerfile @@ -58,9 +58,10 @@ RUN apt-get update && apt-get install -y time && apt-get clean RUN apt-get update && apt-get install -y \ python-all-dev \ python3-all-dev \ - python-pip + python-setuptools # Install Python packages from PyPI +RUN curl https://bootstrap.pypa.io/get-pip.py | python2.7 RUN pip install --upgrade pip==19.3.1 RUN pip install virtualenv==16.7.9 RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.2.post1 six==1.10.0 twisted==17.5.0 diff --git a/tools/dockerfile/interoptest/grpc_interop_go/Dockerfile b/tools/dockerfile/interoptest/grpc_interop_go/Dockerfile index 09b72d03090..78f6a72249b 100644 --- a/tools/dockerfile/interoptest/grpc_interop_go/Dockerfile +++ b/tools/dockerfile/interoptest/grpc_interop_go/Dockerfile @@ -25,9 +25,10 @@ RUN ln -s /usr/local/go/bin/go /usr/local/bin RUN apt-get update && apt-get install -y \ python-all-dev \ python3-all-dev \ - python-pip + python-setuptools # Install Python packages from PyPI +RUN curl https://bootstrap.pypa.io/get-pip.py | python2.7 RUN pip install --upgrade pip==19.3.1 RUN pip install virtualenv==16.7.9 RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.2.post1 six==1.10.0 twisted==17.5.0 diff --git a/tools/dockerfile/interoptest/grpc_interop_go1.11/Dockerfile b/tools/dockerfile/interoptest/grpc_interop_go1.11/Dockerfile index ee37a0b944b..06787bc7e4b 100644 --- a/tools/dockerfile/interoptest/grpc_interop_go1.11/Dockerfile +++ b/tools/dockerfile/interoptest/grpc_interop_go1.11/Dockerfile @@ -25,9 +25,10 @@ RUN ln -s /usr/local/go/bin/go /usr/local/bin RUN apt-get update && apt-get install -y \ python-all-dev \ python3-all-dev \ - python-pip + python-setuptools # Install Python packages from PyPI +RUN curl https://bootstrap.pypa.io/get-pip.py | python2.7 RUN pip install --upgrade pip==19.3.1 RUN pip install virtualenv==16.7.9 RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.2.post1 six==1.10.0 twisted==17.5.0 diff --git a/tools/dockerfile/interoptest/grpc_interop_go1.7/Dockerfile b/tools/dockerfile/interoptest/grpc_interop_go1.7/Dockerfile index 95b8b2342ea..2467c1eeb02 100644 --- a/tools/dockerfile/interoptest/grpc_interop_go1.7/Dockerfile +++ b/tools/dockerfile/interoptest/grpc_interop_go1.7/Dockerfile @@ -25,9 +25,10 @@ RUN ln -s /usr/local/go/bin/go /usr/local/bin RUN apt-get update && apt-get install -y \ python-all-dev \ python3-all-dev \ - python-pip + python-setuptools # Install Python packages from PyPI +RUN curl https://bootstrap.pypa.io/get-pip.py | python2.7 RUN pip install --upgrade pip==19.3.1 RUN pip install virtualenv==16.7.9 RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.2.post1 six==1.10.0 twisted==17.5.0 diff --git a/tools/dockerfile/interoptest/grpc_interop_go1.8/Dockerfile b/tools/dockerfile/interoptest/grpc_interop_go1.8/Dockerfile index 09ab216ad21..e8384dd4ff8 100644 --- a/tools/dockerfile/interoptest/grpc_interop_go1.8/Dockerfile +++ b/tools/dockerfile/interoptest/grpc_interop_go1.8/Dockerfile @@ -25,9 +25,10 @@ RUN ln -s /usr/local/go/bin/go /usr/local/bin RUN apt-get update && apt-get install -y \ python-all-dev \ python3-all-dev \ - python-pip + python-setuptools # Install Python packages from PyPI +RUN curl https://bootstrap.pypa.io/get-pip.py | python2.7 RUN pip install --upgrade pip==19.3.1 RUN pip install virtualenv==16.7.9 RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.2.post1 six==1.10.0 twisted==17.5.0 diff --git a/tools/dockerfile/interoptest/grpc_interop_http2/Dockerfile b/tools/dockerfile/interoptest/grpc_interop_http2/Dockerfile index f04dc0851f7..d0232d6b340 100644 --- a/tools/dockerfile/interoptest/grpc_interop_http2/Dockerfile +++ b/tools/dockerfile/interoptest/grpc_interop_http2/Dockerfile @@ -25,9 +25,10 @@ RUN ln -s /usr/local/go/bin/go /usr/local/bin RUN apt-get update && apt-get install -y \ python-all-dev \ python3-all-dev \ - python-pip + python-setuptools # Install Python packages from PyPI +RUN curl https://bootstrap.pypa.io/get-pip.py | python2.7 RUN pip install --upgrade pip==19.3.1 RUN pip install virtualenv==16.7.9 RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.2.post1 six==1.10.0 twisted==17.5.0 diff --git a/tools/dockerfile/interoptest/grpc_interop_node/Dockerfile b/tools/dockerfile/interoptest/grpc_interop_node/Dockerfile index 100799515b7..cc9e2545353 100644 --- a/tools/dockerfile/interoptest/grpc_interop_node/Dockerfile +++ b/tools/dockerfile/interoptest/grpc_interop_node/Dockerfile @@ -58,9 +58,10 @@ RUN apt-get update && apt-get install -y time && apt-get clean RUN apt-get update && apt-get install -y \ python-all-dev \ python3-all-dev \ - python-pip + python-setuptools # Install Python packages from PyPI +RUN curl https://bootstrap.pypa.io/get-pip.py | python2.7 RUN pip install --upgrade pip==19.3.1 RUN pip install virtualenv==16.7.9 RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.2.post1 six==1.10.0 twisted==17.5.0 diff --git a/tools/dockerfile/interoptest/grpc_interop_python/Dockerfile b/tools/dockerfile/interoptest/grpc_interop_python/Dockerfile index 3583d783a81..8793d5f336e 100644 --- a/tools/dockerfile/interoptest/grpc_interop_python/Dockerfile +++ b/tools/dockerfile/interoptest/grpc_interop_python/Dockerfile @@ -49,14 +49,13 @@ RUN apt-get update && apt-get install -y \ # Build profiling RUN apt-get update && apt-get install -y time && apt-get clean -# Google Cloud platform API libraries -RUN apt-get update && apt-get install -y python-pip && apt-get clean -RUN pip install --upgrade google-api-python-client oauth2client - # Install Python 2.7 RUN apt-get update && apt-get install -y python2.7 python-all-dev RUN curl https://bootstrap.pypa.io/get-pip.py | python2.7 +# Google Cloud platform API libraries +RUN pip install --upgrade google-api-python-client oauth2client + # Add Debian 'buster' repository, we will need it for installing newer versions of python RUN echo 'deb http://ftp.de.debian.org/debian buster main' >> /etc/apt/sources.list RUN echo 'APT::Default-Release "stretch";' | tee -a /etc/apt/apt.conf.d/00local diff --git a/tools/dockerfile/interoptest/grpc_interop_pythonasyncio/Dockerfile b/tools/dockerfile/interoptest/grpc_interop_pythonasyncio/Dockerfile index 3583d783a81..8793d5f336e 100644 --- a/tools/dockerfile/interoptest/grpc_interop_pythonasyncio/Dockerfile +++ b/tools/dockerfile/interoptest/grpc_interop_pythonasyncio/Dockerfile @@ -49,14 +49,13 @@ RUN apt-get update && apt-get install -y \ # Build profiling RUN apt-get update && apt-get install -y time && apt-get clean -# Google Cloud platform API libraries -RUN apt-get update && apt-get install -y python-pip && apt-get clean -RUN pip install --upgrade google-api-python-client oauth2client - # Install Python 2.7 RUN apt-get update && apt-get install -y python2.7 python-all-dev RUN curl https://bootstrap.pypa.io/get-pip.py | python2.7 +# Google Cloud platform API libraries +RUN pip install --upgrade google-api-python-client oauth2client + # Add Debian 'buster' repository, we will need it for installing newer versions of python RUN echo 'deb http://ftp.de.debian.org/debian buster main' >> /etc/apt/sources.list RUN echo 'APT::Default-Release "stretch";' | tee -a /etc/apt/apt.conf.d/00local diff --git a/tools/dockerfile/interoptest/grpc_interop_ruby/Dockerfile b/tools/dockerfile/interoptest/grpc_interop_ruby/Dockerfile index 4866c7d9abb..b3becf17075 100644 --- a/tools/dockerfile/interoptest/grpc_interop_ruby/Dockerfile +++ b/tools/dockerfile/interoptest/grpc_interop_ruby/Dockerfile @@ -58,9 +58,10 @@ RUN apt-get update && apt-get install -y time && apt-get clean RUN apt-get update && apt-get install -y \ python-all-dev \ python3-all-dev \ - python-pip + python-setuptools # Install Python packages from PyPI +RUN curl https://bootstrap.pypa.io/get-pip.py | python2.7 RUN pip install --upgrade pip==19.3.1 RUN pip install virtualenv==16.7.9 RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.2.post1 six==1.10.0 twisted==17.5.0 diff --git a/tools/dockerfile/test/bazel/Dockerfile b/tools/dockerfile/test/bazel/Dockerfile index 229835a513b..e41f1ab5609 100644 --- a/tools/dockerfile/test/bazel/Dockerfile +++ b/tools/dockerfile/test/bazel/Dockerfile @@ -41,9 +41,10 @@ RUN apt-get update && apt-get -y install \ RUN apt-get update && apt-get install -y \ python-all-dev \ python3-all-dev \ - python-pip + python-setuptools # Install Python packages from PyPI +RUN curl https://bootstrap.pypa.io/get-pip.py | python2.7 RUN pip install --upgrade pip==19.3.1 RUN pip install virtualenv==16.7.9 RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.2.post1 six==1.10.0 twisted==17.5.0 diff --git a/tools/dockerfile/test/csharp_stretch_x64/Dockerfile b/tools/dockerfile/test/csharp_stretch_x64/Dockerfile index cc6ed85c1c6..684c26f45be 100644 --- a/tools/dockerfile/test/csharp_stretch_x64/Dockerfile +++ b/tools/dockerfile/test/csharp_stretch_x64/Dockerfile @@ -49,10 +49,6 @@ RUN apt-get update && apt-get install -y \ # Build profiling RUN apt-get update && apt-get install -y time && apt-get clean -# Google Cloud platform API libraries -RUN apt-get update && apt-get install -y python-pip && apt-get clean -RUN pip install --upgrade google-api-python-client oauth2client - #==================== # Python dependencies @@ -61,13 +57,17 @@ RUN pip install --upgrade google-api-python-client oauth2client RUN apt-get update && apt-get install -y \ python-all-dev \ python3-all-dev \ - python-pip + python-setuptools # Install Python packages from PyPI +RUN curl https://bootstrap.pypa.io/get-pip.py | python2.7 RUN pip install --upgrade pip==19.3.1 RUN pip install virtualenv==16.7.9 RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.2.post1 six==1.10.0 twisted==17.5.0 +# Google Cloud platform API libraries +RUN pip install --upgrade google-api-python-client oauth2client + #================ # C# dependencies diff --git a/tools/dockerfile/test/cxx_buster_x64/Dockerfile b/tools/dockerfile/test/cxx_buster_x64/Dockerfile index f5bacb8bc51..0c4324fe9a2 100644 --- a/tools/dockerfile/test/cxx_buster_x64/Dockerfile +++ b/tools/dockerfile/test/cxx_buster_x64/Dockerfile @@ -49,10 +49,6 @@ RUN apt-get update && apt-get install -y \ # Build profiling RUN apt-get update && apt-get install -y time && apt-get clean -# Google Cloud platform API libraries -RUN apt-get update && apt-get install -y python-pip && apt-get clean -RUN pip install --upgrade google-api-python-client oauth2client - #==================== # Python dependencies @@ -61,13 +57,17 @@ RUN pip install --upgrade google-api-python-client oauth2client RUN apt-get update && apt-get install -y \ python-all-dev \ python3-all-dev \ - python-pip + python-setuptools # Install Python packages from PyPI +RUN curl https://bootstrap.pypa.io/get-pip.py | python2.7 RUN pip install --upgrade pip==19.3.1 RUN pip install virtualenv==16.7.9 RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.2.post1 six==1.10.0 twisted==17.5.0 +# Google Cloud platform API libraries +RUN pip install --upgrade google-api-python-client oauth2client + #================= # C++ dependencies RUN apt-get update && apt-get -y install libgflags-dev libgtest-dev libc++-dev clang && apt-get clean diff --git a/tools/dockerfile/test/cxx_jessie_x64/Dockerfile b/tools/dockerfile/test/cxx_jessie_x64/Dockerfile index 8cb6af124b3..00f51cfe4f9 100644 --- a/tools/dockerfile/test/cxx_jessie_x64/Dockerfile +++ b/tools/dockerfile/test/cxx_jessie_x64/Dockerfile @@ -50,10 +50,6 @@ RUN apt-get update && apt-get install -y \ # Build profiling RUN apt-get update && apt-get install -y time && apt-get clean -# Google Cloud platform API libraries -RUN apt-get update && apt-get install -y python-pip && apt-get clean -RUN pip install --upgrade google-api-python-client oauth2client - #==================== # Python dependencies @@ -62,13 +58,17 @@ RUN pip install --upgrade google-api-python-client oauth2client RUN apt-get update && apt-get install -y \ python-all-dev \ python3-all-dev \ - python-pip + python-setuptools # Install Python packages from PyPI +RUN curl https://bootstrap.pypa.io/get-pip.py | python2.7 RUN pip install --upgrade pip==19.3.1 RUN pip install virtualenv==16.7.9 RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.2.post1 six==1.10.0 twisted==17.5.0 +# Google Cloud platform API libraries +RUN pip install --upgrade google-api-python-client oauth2client + #================= # C++ dependencies RUN apt-get update && apt-get -y install libgflags-dev libgtest-dev libc++-dev clang && apt-get clean diff --git a/tools/dockerfile/test/cxx_jessie_x86/Dockerfile b/tools/dockerfile/test/cxx_jessie_x86/Dockerfile index 104b6696150..ce5e074d9a7 100644 --- a/tools/dockerfile/test/cxx_jessie_x86/Dockerfile +++ b/tools/dockerfile/test/cxx_jessie_x86/Dockerfile @@ -50,10 +50,6 @@ RUN apt-get update && apt-get install -y \ # Build profiling RUN apt-get update && apt-get install -y time && apt-get clean -# Google Cloud platform API libraries -RUN apt-get update && apt-get install -y python-pip && apt-get clean -RUN pip install --upgrade google-api-python-client oauth2client - #==================== # Python dependencies @@ -62,13 +58,17 @@ RUN pip install --upgrade google-api-python-client oauth2client RUN apt-get update && apt-get install -y \ python-all-dev \ python3-all-dev \ - python-pip + python-setuptools # Install Python packages from PyPI +RUN curl https://bootstrap.pypa.io/get-pip.py | python2.7 RUN pip install --upgrade pip==19.3.1 RUN pip install virtualenv==16.7.9 RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.2.post1 six==1.10.0 twisted==17.5.0 +# Google Cloud platform API libraries +RUN pip install --upgrade google-api-python-client oauth2client + #================= # C++ dependencies RUN apt-get update && apt-get -y install libgflags-dev libgtest-dev libc++-dev clang && apt-get clean diff --git a/tools/dockerfile/test/cxx_sanitizers_jessie_x64/Dockerfile b/tools/dockerfile/test/cxx_sanitizers_jessie_x64/Dockerfile index d05b3508e15..08ed1da1a3d 100644 --- a/tools/dockerfile/test/cxx_sanitizers_jessie_x64/Dockerfile +++ b/tools/dockerfile/test/cxx_sanitizers_jessie_x64/Dockerfile @@ -51,10 +51,6 @@ RUN apt-get update && apt-get install -y \ # Build profiling RUN apt-get update && apt-get install -y time && apt-get clean -# Google Cloud platform API libraries -RUN apt-get update && apt-get install -y python-pip && apt-get clean -RUN pip install --upgrade google-api-python-client oauth2client - #==================== # Python dependencies @@ -63,13 +59,17 @@ RUN pip install --upgrade google-api-python-client oauth2client RUN apt-get update && apt-get install -y \ python-all-dev \ python3-all-dev \ - python-pip + python-setuptools # Install Python packages from PyPI +RUN curl https://bootstrap.pypa.io/get-pip.py | python2.7 RUN pip install --upgrade pip==19.3.1 RUN pip install virtualenv==16.7.9 RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.2.post1 six==1.10.0 twisted==17.5.0 +# Google Cloud platform API libraries +RUN pip install --upgrade google-api-python-client oauth2client + #================= # C++ dependencies (purposely excluding Clang because it's part of the base image) RUN apt-get update && apt-get -y install libgflags-dev libgtest-dev libc++-dev && apt-get clean diff --git a/tools/dockerfile/test/cxx_ubuntu1404_x64/Dockerfile b/tools/dockerfile/test/cxx_ubuntu1404_x64/Dockerfile index a3659d34e75..08cff8d3b2a 100644 --- a/tools/dockerfile/test/cxx_ubuntu1404_x64/Dockerfile +++ b/tools/dockerfile/test/cxx_ubuntu1404_x64/Dockerfile @@ -49,10 +49,6 @@ RUN apt-get update && apt-get install -y \ # Build profiling RUN apt-get update && apt-get install -y time && apt-get clean -# Google Cloud platform API libraries -RUN apt-get update && apt-get install -y python-pip && apt-get clean -RUN pip install --upgrade google-api-python-client oauth2client - #==================== # Python dependencies @@ -61,13 +57,17 @@ RUN pip install --upgrade google-api-python-client oauth2client RUN apt-get update && apt-get install -y \ python-all-dev \ python3-all-dev \ - python-pip + python-setuptools # Install Python packages from PyPI +RUN curl https://bootstrap.pypa.io/get-pip.py | python2.7 RUN pip install --upgrade pip==19.3.1 RUN pip install virtualenv==16.7.9 RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.2.post1 six==1.10.0 twisted==17.5.0 +# Google Cloud platform API libraries +RUN pip install --upgrade google-api-python-client oauth2client + #================= # C++ dependencies RUN apt-get update && apt-get -y install libgflags-dev libgtest-dev libc++-dev clang && apt-get clean diff --git a/tools/dockerfile/test/cxx_ubuntu1604_x64/Dockerfile b/tools/dockerfile/test/cxx_ubuntu1604_x64/Dockerfile index 37ed9b85d3c..380bc7ad622 100644 --- a/tools/dockerfile/test/cxx_ubuntu1604_x64/Dockerfile +++ b/tools/dockerfile/test/cxx_ubuntu1604_x64/Dockerfile @@ -49,10 +49,6 @@ RUN apt-get update && apt-get install -y \ # Build profiling RUN apt-get update && apt-get install -y time && apt-get clean -# Google Cloud platform API libraries -RUN apt-get update && apt-get install -y python-pip && apt-get clean -RUN pip install --upgrade google-api-python-client oauth2client - #==================== # Python dependencies @@ -61,13 +57,17 @@ RUN pip install --upgrade google-api-python-client oauth2client RUN apt-get update && apt-get install -y \ python-all-dev \ python3-all-dev \ - python-pip + python-setuptools # Install Python packages from PyPI +RUN curl https://bootstrap.pypa.io/get-pip.py | python2.7 RUN pip install --upgrade pip==19.3.1 RUN pip install virtualenv==16.7.9 RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.2.post1 six==1.10.0 twisted==17.5.0 +# Google Cloud platform API libraries +RUN pip install --upgrade google-api-python-client oauth2client + #================= # C++ dependencies RUN apt-get update && apt-get -y install libgflags-dev libgtest-dev libc++-dev clang && apt-get clean diff --git a/tools/dockerfile/test/cxx_ubuntu1804_x64/Dockerfile b/tools/dockerfile/test/cxx_ubuntu1804_x64/Dockerfile index d007738714b..724e41baa5a 100644 --- a/tools/dockerfile/test/cxx_ubuntu1804_x64/Dockerfile +++ b/tools/dockerfile/test/cxx_ubuntu1804_x64/Dockerfile @@ -49,10 +49,6 @@ RUN apt-get update && apt-get install -y \ # Build profiling RUN apt-get update && apt-get install -y time && apt-get clean -# Google Cloud platform API libraries -RUN apt-get update && apt-get install -y python-pip && apt-get clean -RUN pip install --upgrade google-api-python-client oauth2client - #==================== # Python dependencies @@ -61,13 +57,17 @@ RUN pip install --upgrade google-api-python-client oauth2client RUN apt-get update && apt-get install -y \ python-all-dev \ python3-all-dev \ - python-pip + python-setuptools # Install Python packages from PyPI +RUN curl https://bootstrap.pypa.io/get-pip.py | python2.7 RUN pip install --upgrade pip==19.3.1 RUN pip install virtualenv==16.7.9 RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.2.post1 six==1.10.0 twisted==17.5.0 +# Google Cloud platform API libraries +RUN pip install --upgrade google-api-python-client oauth2client + #================= # C++ dependencies RUN apt-get update && apt-get -y install libgflags-dev libgtest-dev libc++-dev clang && apt-get clean diff --git a/tools/dockerfile/test/fuzzer/Dockerfile b/tools/dockerfile/test/fuzzer/Dockerfile index 9394fc22abf..9f9f247c53c 100644 --- a/tools/dockerfile/test/fuzzer/Dockerfile +++ b/tools/dockerfile/test/fuzzer/Dockerfile @@ -50,10 +50,6 @@ RUN apt-get update && apt-get install -y \ # Build profiling RUN apt-get update && apt-get install -y time && apt-get clean -# Google Cloud platform API libraries -RUN apt-get update && apt-get install -y python-pip && apt-get clean -RUN pip install --upgrade google-api-python-client oauth2client - #==================== # Python dependencies @@ -62,13 +58,17 @@ RUN pip install --upgrade google-api-python-client oauth2client RUN apt-get update && apt-get install -y \ python-all-dev \ python3-all-dev \ - python-pip + python-setuptools # Install Python packages from PyPI +RUN curl https://bootstrap.pypa.io/get-pip.py | python2.7 RUN pip install --upgrade pip==19.3.1 RUN pip install virtualenv==16.7.9 RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.2.post1 six==1.10.0 twisted==17.5.0 +# Google Cloud platform API libraries +RUN pip install --upgrade google-api-python-client oauth2client + #================= # C++ dependencies RUN apt-get update && apt-get -y install libgflags-dev libgtest-dev libc++-dev clang && apt-get clean diff --git a/tools/dockerfile/test/node_jessie_x64/Dockerfile b/tools/dockerfile/test/node_jessie_x64/Dockerfile index 7cbe7b0f95b..30c278c9267 100644 --- a/tools/dockerfile/test/node_jessie_x64/Dockerfile +++ b/tools/dockerfile/test/node_jessie_x64/Dockerfile @@ -50,10 +50,6 @@ RUN apt-get update && apt-get install -y \ # Build profiling RUN apt-get update && apt-get install -y time && apt-get clean -# Google Cloud platform API libraries -RUN apt-get update && apt-get install -y python-pip && apt-get clean -RUN pip install --upgrade google-api-python-client oauth2client - # Install Electron apt dependencies RUN apt-get update && apt-get install -y \ @@ -73,13 +69,17 @@ RUN apt-get update && apt-get install -y \ RUN apt-get update && apt-get install -y \ python-all-dev \ python3-all-dev \ - python-pip + python-setuptools # Install Python packages from PyPI +RUN curl https://bootstrap.pypa.io/get-pip.py | python2.7 RUN pip install --upgrade pip==19.3.1 RUN pip install virtualenv==16.7.9 RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.2.post1 six==1.10.0 twisted==17.5.0 +# Google Cloud platform API libraries +RUN pip install --upgrade google-api-python-client oauth2client + #================== # Node dependencies diff --git a/tools/dockerfile/test/php7_jessie_x64/Dockerfile b/tools/dockerfile/test/php7_jessie_x64/Dockerfile index 55ea982b579..60fec1d47d6 100644 --- a/tools/dockerfile/test/php7_jessie_x64/Dockerfile +++ b/tools/dockerfile/test/php7_jessie_x64/Dockerfile @@ -61,10 +61,6 @@ RUN cd /var/local/git/php-src \ && make \ && make install -# Google Cloud platform API libraries -RUN apt-get update && apt-get install -y python-pip && apt-get clean -RUN pip install --upgrade google-api-python-client oauth2client - #==================== # Python dependencies @@ -73,13 +69,17 @@ RUN pip install --upgrade google-api-python-client oauth2client RUN apt-get update && apt-get install -y \ python-all-dev \ python3-all-dev \ - python-pip + python-setuptools # Install Python packages from PyPI +RUN curl https://bootstrap.pypa.io/get-pip.py | python2.7 RUN pip install --upgrade pip==19.3.1 RUN pip install virtualenv==16.7.9 RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.2.post1 six==1.10.0 twisted==17.5.0 +# Google Cloud platform API libraries +RUN pip install --upgrade google-api-python-client oauth2client + #================= # PHP Test dependencies diff --git a/tools/dockerfile/test/php_jessie_x64/Dockerfile b/tools/dockerfile/test/php_jessie_x64/Dockerfile index 94023bb2aba..5a19119d946 100644 --- a/tools/dockerfile/test/php_jessie_x64/Dockerfile +++ b/tools/dockerfile/test/php_jessie_x64/Dockerfile @@ -50,10 +50,6 @@ RUN apt-get update && apt-get install -y \ # Build profiling RUN apt-get update && apt-get install -y time && apt-get clean -# Google Cloud platform API libraries -RUN apt-get update && apt-get install -y python-pip && apt-get clean -RUN pip install --upgrade google-api-python-client oauth2client - #==================== # Python dependencies @@ -62,13 +58,17 @@ RUN pip install --upgrade google-api-python-client oauth2client RUN apt-get update && apt-get install -y \ python-all-dev \ python3-all-dev \ - python-pip + python-setuptools # Install Python packages from PyPI +RUN curl https://bootstrap.pypa.io/get-pip.py | python2.7 RUN pip install --upgrade pip==19.3.1 RUN pip install virtualenv==16.7.9 RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.2.post1 six==1.10.0 twisted==17.5.0 +# Google Cloud platform API libraries +RUN pip install --upgrade google-api-python-client oauth2client + #================= # PHP dependencies diff --git a/tools/dockerfile/test/python_stretch_2.7_x64/Dockerfile b/tools/dockerfile/test/python_stretch_2.7_x64/Dockerfile index 0bbc11a21b2..876c5dcd4af 100644 --- a/tools/dockerfile/test/python_stretch_2.7_x64/Dockerfile +++ b/tools/dockerfile/test/python_stretch_2.7_x64/Dockerfile @@ -49,14 +49,13 @@ RUN apt-get update && apt-get install -y \ # Build profiling RUN apt-get update && apt-get install -y time && apt-get clean -# Google Cloud platform API libraries -RUN apt-get update && apt-get install -y python-pip && apt-get clean -RUN pip install --upgrade google-api-python-client oauth2client - # Install Python 2.7 RUN apt-get update && apt-get install -y python2.7 python-all-dev RUN curl https://bootstrap.pypa.io/get-pip.py | python2.7 +# Google Cloud platform API libraries +RUN pip install --upgrade google-api-python-client oauth2client + # Add Debian 'buster' repository, we will need it for installing newer versions of python RUN echo 'deb http://ftp.de.debian.org/debian buster main' >> /etc/apt/sources.list RUN echo 'APT::Default-Release "stretch";' | tee -a /etc/apt/apt.conf.d/00local diff --git a/tools/dockerfile/test/python_stretch_3.5_x64/Dockerfile b/tools/dockerfile/test/python_stretch_3.5_x64/Dockerfile index bfedf432b78..5e4ca949a6e 100644 --- a/tools/dockerfile/test/python_stretch_3.5_x64/Dockerfile +++ b/tools/dockerfile/test/python_stretch_3.5_x64/Dockerfile @@ -49,14 +49,13 @@ RUN apt-get update && apt-get install -y \ # Build profiling RUN apt-get update && apt-get install -y time && apt-get clean -# Google Cloud platform API libraries -RUN apt-get update && apt-get install -y python-pip && apt-get clean -RUN pip install --upgrade google-api-python-client oauth2client - # Install Python 2.7 RUN apt-get update && apt-get install -y python2.7 python-all-dev RUN curl https://bootstrap.pypa.io/get-pip.py | python2.7 +# Google Cloud platform API libraries +RUN pip install --upgrade google-api-python-client oauth2client + # Add Debian 'buster' repository, we will need it for installing newer versions of python RUN echo 'deb http://ftp.de.debian.org/debian buster main' >> /etc/apt/sources.list RUN echo 'APT::Default-Release "stretch";' | tee -a /etc/apt/apt.conf.d/00local diff --git a/tools/dockerfile/test/python_stretch_3.6_x64/Dockerfile b/tools/dockerfile/test/python_stretch_3.6_x64/Dockerfile index 3d475849bb9..bc92bd6adcc 100644 --- a/tools/dockerfile/test/python_stretch_3.6_x64/Dockerfile +++ b/tools/dockerfile/test/python_stretch_3.6_x64/Dockerfile @@ -49,14 +49,13 @@ RUN apt-get update && apt-get install -y \ # Build profiling RUN apt-get update && apt-get install -y time && apt-get clean -# Google Cloud platform API libraries -RUN apt-get update && apt-get install -y python-pip && apt-get clean -RUN pip install --upgrade google-api-python-client oauth2client - # Install Python 2.7 RUN apt-get update && apt-get install -y python2.7 python-all-dev RUN curl https://bootstrap.pypa.io/get-pip.py | python2.7 +# Google Cloud platform API libraries +RUN pip install --upgrade google-api-python-client oauth2client + # Add Debian 'buster' repository, we will need it for installing newer versions of python RUN echo 'deb http://ftp.de.debian.org/debian buster main' >> /etc/apt/sources.list RUN echo 'APT::Default-Release "stretch";' | tee -a /etc/apt/apt.conf.d/00local diff --git a/tools/dockerfile/test/python_stretch_3.7_x64/Dockerfile b/tools/dockerfile/test/python_stretch_3.7_x64/Dockerfile index 6745055c14f..00edc458b73 100644 --- a/tools/dockerfile/test/python_stretch_3.7_x64/Dockerfile +++ b/tools/dockerfile/test/python_stretch_3.7_x64/Dockerfile @@ -49,14 +49,13 @@ RUN apt-get update && apt-get install -y \ # Build profiling RUN apt-get update && apt-get install -y time && apt-get clean -# Google Cloud platform API libraries -RUN apt-get update && apt-get install -y python-pip && apt-get clean -RUN pip install --upgrade google-api-python-client oauth2client - # Install Python 2.7 RUN apt-get update && apt-get install -y python2.7 python-all-dev RUN curl https://bootstrap.pypa.io/get-pip.py | python2.7 +# Google Cloud platform API libraries +RUN pip install --upgrade google-api-python-client oauth2client + # Add Debian 'buster' repository, we will need it for installing newer versions of python RUN echo 'deb http://ftp.de.debian.org/debian buster main' >> /etc/apt/sources.list RUN echo 'APT::Default-Release "stretch";' | tee -a /etc/apt/apt.conf.d/00local diff --git a/tools/dockerfile/test/python_stretch_3.8_x64/Dockerfile b/tools/dockerfile/test/python_stretch_3.8_x64/Dockerfile index 8d780f0ad78..3202eb0dcd9 100644 --- a/tools/dockerfile/test/python_stretch_3.8_x64/Dockerfile +++ b/tools/dockerfile/test/python_stretch_3.8_x64/Dockerfile @@ -49,14 +49,13 @@ RUN apt-get update && apt-get install -y \ # Build profiling RUN apt-get update && apt-get install -y time && apt-get clean -# Google Cloud platform API libraries -RUN apt-get update && apt-get install -y python-pip && apt-get clean -RUN pip install --upgrade google-api-python-client oauth2client - # Install Python 2.7 RUN apt-get update && apt-get install -y python2.7 python-all-dev RUN curl https://bootstrap.pypa.io/get-pip.py | python2.7 +# Google Cloud platform API libraries +RUN pip install --upgrade google-api-python-client oauth2client + # Add Debian 'buster' repository, we will need it for installing newer versions of python RUN echo 'deb http://ftp.de.debian.org/debian buster main' >> /etc/apt/sources.list RUN echo 'APT::Default-Release "stretch";' | tee -a /etc/apt/apt.conf.d/00local diff --git a/tools/dockerfile/test/python_stretch_default_x64/Dockerfile b/tools/dockerfile/test/python_stretch_default_x64/Dockerfile index 713fd6fe230..9cde17429ec 100644 --- a/tools/dockerfile/test/python_stretch_default_x64/Dockerfile +++ b/tools/dockerfile/test/python_stretch_default_x64/Dockerfile @@ -49,14 +49,13 @@ RUN apt-get update && apt-get install -y \ # Build profiling RUN apt-get update && apt-get install -y time && apt-get clean -# Google Cloud platform API libraries -RUN apt-get update && apt-get install -y python-pip && apt-get clean -RUN pip install --upgrade google-api-python-client oauth2client - # Install Python 2.7 RUN apt-get update && apt-get install -y python2.7 python-all-dev RUN curl https://bootstrap.pypa.io/get-pip.py | python2.7 +# Google Cloud platform API libraries +RUN pip install --upgrade google-api-python-client oauth2client + # Add Debian 'buster' repository, we will need it for installing newer versions of python RUN echo 'deb http://ftp.de.debian.org/debian buster main' >> /etc/apt/sources.list RUN echo 'APT::Default-Release "stretch";' | tee -a /etc/apt/apt.conf.d/00local diff --git a/tools/dockerfile/test/ruby_jessie_x64/Dockerfile b/tools/dockerfile/test/ruby_jessie_x64/Dockerfile index bfee9441984..12dc3850e57 100644 --- a/tools/dockerfile/test/ruby_jessie_x64/Dockerfile +++ b/tools/dockerfile/test/ruby_jessie_x64/Dockerfile @@ -50,10 +50,6 @@ RUN apt-get update && apt-get install -y \ # Build profiling RUN apt-get update && apt-get install -y time && apt-get clean -# Google Cloud platform API libraries -RUN apt-get update && apt-get install -y python-pip && apt-get clean -RUN pip install --upgrade google-api-python-client oauth2client - #==================== # Python dependencies @@ -62,13 +58,17 @@ RUN pip install --upgrade google-api-python-client oauth2client RUN apt-get update && apt-get install -y \ python-all-dev \ python3-all-dev \ - python-pip + python-setuptools # Install Python packages from PyPI +RUN curl https://bootstrap.pypa.io/get-pip.py | python2.7 RUN pip install --upgrade pip==19.3.1 RUN pip install virtualenv==16.7.9 RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.5.2.post1 six==1.10.0 twisted==17.5.0 +# Google Cloud platform API libraries +RUN pip install --upgrade google-api-python-client oauth2client + #================== # Ruby dependencies diff --git a/tools/dockerfile/test/sanity/Dockerfile b/tools/dockerfile/test/sanity/Dockerfile index 3666b26ef72..c5dd7d6dbdd 100644 --- a/tools/dockerfile/test/sanity/Dockerfile +++ b/tools/dockerfile/test/sanity/Dockerfile @@ -49,14 +49,13 @@ RUN apt-get update && apt-get install -y \ # Build profiling RUN apt-get update && apt-get install -y time && apt-get clean -# Google Cloud platform API libraries -RUN apt-get update && apt-get install -y python-pip && apt-get clean -RUN pip install --upgrade google-api-python-client oauth2client - # Install Python 2.7 RUN apt-get update && apt-get install -y python2.7 python-all-dev RUN curl https://bootstrap.pypa.io/get-pip.py | python2.7 +# Google Cloud platform API libraries +RUN pip install --upgrade google-api-python-client oauth2client + RUN mkdir /var/local/jenkins From 7a53004da71919db66852a0481faaf5ba879a91d Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Thu, 14 May 2020 09:58:09 +0200 Subject: [PATCH 754/758] =?UTF-8?q?Revert=20"Let=20the=20connectivity=20te?= =?UTF-8?q?st=20use=20local=20subchannel=20pool=20to=20create=20multipl?= =?UTF-8?q?=E2=80=A6"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../surface/sequential_connectivity_test.cc | 99 +++++++++---------- 1 file changed, 47 insertions(+), 52 deletions(-) diff --git a/test/core/surface/sequential_connectivity_test.cc b/test/core/surface/sequential_connectivity_test.cc index d0ed9a76ec0..ed20017d708 100644 --- a/test/core/surface/sequential_connectivity_test.cc +++ b/test/core/surface/sequential_connectivity_test.cc @@ -16,11 +16,8 @@ * */ -#include - #include #include -#include #include #include @@ -39,12 +36,16 @@ typedef struct test_fixture { const char* name; void (*add_server_port)(grpc_server* server, const char* addr); - // Have the creds here so all the channels will share the same one to enabled - // subchannel sharing if needed. - grpc_channel_credentials* creds; + grpc_channel* (*create_channel)(const char* addr); } test_fixture; +/* TODO(yashykt): When our macos testing infrastructure becomes good enough, we + * wouldn't need to reduce the number of connections on MacOS */ +#ifdef __APPLE__ #define NUM_CONNECTIONS 100 +#else +#define NUM_CONNECTIONS 1000 +#endif /* __APPLE__ */ typedef struct { grpc_server* server; @@ -60,31 +61,8 @@ static void server_thread_func(void* args) { GPR_ASSERT(ev.success == true); } -static grpc_channel* create_test_channel(const char* addr, - grpc_channel_credentials* creds, - bool share_subchannel) { - grpc_channel* channel = nullptr; - std::vector args; - args.push_back(grpc_channel_arg_integer_create( - const_cast(GRPC_ARG_USE_LOCAL_SUBCHANNEL_POOL), - !share_subchannel)); - if (creds != nullptr) { - args.push_back(grpc_channel_arg_string_create( - const_cast(GRPC_SSL_TARGET_NAME_OVERRIDE_ARG), - const_cast("foo.test.google.fr"))); - } - grpc_channel_args channel_args = {args.size(), args.data()}; - if (creds != nullptr) { - channel = grpc_secure_channel_create(creds, addr, &channel_args, nullptr); - } else { - channel = grpc_insecure_channel_create(addr, &channel_args, nullptr); - } - return channel; -} - -static void run_test(const test_fixture* fixture, bool share_subchannel) { - gpr_log(GPR_INFO, "TEST: %s sharing subchannel: %d", fixture->name, - share_subchannel); +static void run_test(const test_fixture* fixture) { + gpr_log(GPR_INFO, "TEST: %s", fixture->name); grpc_init(); @@ -105,8 +83,7 @@ static void run_test(const test_fixture* fixture, bool share_subchannel) { grpc_completion_queue* cq = grpc_completion_queue_create_for_next(nullptr); grpc_channel* channels[NUM_CONNECTIONS]; for (size_t i = 0; i < NUM_CONNECTIONS; i++) { - channels[i] = - create_test_channel(addr.c_str(), fixture->creds, share_subchannel); + channels[i] = fixture->create_channel(addr.c_str()); gpr_timespec connect_deadline = grpc_timeout_seconds_to_deadline(30); grpc_connectivity_state state; @@ -155,6 +132,16 @@ static void insecure_test_add_port(grpc_server* server, const char* addr) { grpc_server_add_insecure_http2_port(server, addr); } +static grpc_channel* insecure_test_create_channel(const char* addr) { + return grpc_insecure_channel_create(addr, nullptr, nullptr); +} + +static const test_fixture insecure_test = { + "insecure", + insecure_test_add_port, + insecure_test_create_channel, +}; + static void secure_test_add_port(grpc_server* server, const char* addr) { grpc_slice cert_slice, key_slice; GPR_ASSERT(GRPC_LOG_IF_ERROR( @@ -174,18 +161,7 @@ static void secure_test_add_port(grpc_server* server, const char* addr) { grpc_server_credentials_release(ssl_creds); } -int main(int argc, char** argv) { - grpc::testing::TestEnvironment env(argc, argv); - - const test_fixture insecure_test = { - "insecure", - insecure_test_add_port, - nullptr, - }; - - run_test(&insecure_test, /*share_subchannel=*/true); - run_test(&insecure_test, /*share_subchannel=*/false); - +static grpc_channel* secure_test_create_channel(const char* addr) { grpc_slice ca_slice; GPR_ASSERT(GRPC_LOG_IF_ERROR("load_file", grpc_load_file(CA_CERT_PATH, 1, &ca_slice))); @@ -194,12 +170,31 @@ int main(int argc, char** argv) { grpc_channel_credentials* ssl_creds = grpc_ssl_credentials_create(test_root_cert, nullptr, nullptr, nullptr); grpc_slice_unref(ca_slice); - const test_fixture secure_test = { - "secure", - secure_test_add_port, - ssl_creds, - }; - run_test(&secure_test, /*share_subchannel=*/true); - run_test(&secure_test, /*share_subchannel=*/false); + grpc_arg ssl_name_override = { + GRPC_ARG_STRING, + const_cast(GRPC_SSL_TARGET_NAME_OVERRIDE_ARG), + {const_cast("foo.test.google.fr")}}; + grpc_channel_args* new_client_args = + grpc_channel_args_copy_and_add(nullptr, &ssl_name_override, 1); + grpc_channel* channel = + grpc_secure_channel_create(ssl_creds, addr, new_client_args, nullptr); + { + grpc_core::ExecCtx exec_ctx; + grpc_channel_args_destroy(new_client_args); + } grpc_channel_credentials_release(ssl_creds); + return channel; +} + +static const test_fixture secure_test = { + "secure", + secure_test_add_port, + secure_test_create_channel, +}; + +int main(int argc, char** argv) { + grpc::testing::TestEnvironment env(argc, argv); + + run_test(&insecure_test); + run_test(&secure_test); } From 2fcb1ffe3ba5d2c0bb9dacc6e7c1efe870e19029 Mon Sep 17 00:00:00 2001 From: yang-g Date: Thu, 14 May 2020 11:42:12 -0700 Subject: [PATCH 755/758] Add a missing ref and fuzzer test case --- .../filters/message_size/message_size_filter.cc | 6 +----- .../fuzzers/client_fuzzer_corpus/error_refcount | Bin 0 -> 190 bytes 2 files changed, 1 insertion(+), 5 deletions(-) create mode 100644 test/core/end2end/fuzzers/client_fuzzer_corpus/error_refcount diff --git a/src/core/ext/filters/message_size/message_size_filter.cc b/src/core/ext/filters/message_size/message_size_filter.cc index 75f97d7aa08..6a6154a0c73 100644 --- a/src/core/ext/filters/message_size/message_size_filter.cc +++ b/src/core/ext/filters/message_size/message_size_filter.cc @@ -187,12 +187,8 @@ static void recv_message_ready(void* user_data, grpc_error* error) { grpc_error* new_error = grpc_error_set_int( GRPC_ERROR_CREATE_FROM_COPIED_STRING(message_string), GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_RESOURCE_EXHAUSTED); + error = grpc_error_add_child(GRPC_ERROR_REF(error), new_error); GRPC_ERROR_UNREF(calld->error); - if (error == GRPC_ERROR_NONE) { - error = new_error; - } else { - error = grpc_error_add_child(error, new_error); - } calld->error = GRPC_ERROR_REF(error); gpr_free(message_string); } else { diff --git a/test/core/end2end/fuzzers/client_fuzzer_corpus/error_refcount b/test/core/end2end/fuzzers/client_fuzzer_corpus/error_refcount new file mode 100644 index 0000000000000000000000000000000000000000..7a913149044062f92ecbbf5949cde04dab20d7ba GIT binary patch literal 190 zcmZQzU|?Z@09G)?$e2-5qQbxc<-r(GMJybQazJH_j{EQc29fllg5>1Xf->FIyyX1k a?@$X!rFcQcfQ?AW%u8oUugWYyGXelJsw7DO literal 0 HcmV?d00001 From 5872d49c83f6ce1bcce2dfb2ebc600a5d8f572d1 Mon Sep 17 00:00:00 2001 From: yang-g Date: Thu, 14 May 2020 12:24:40 -0700 Subject: [PATCH 756/758] generate projects --- tools/run_tests/generated/tests.json | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/tools/run_tests/generated/tests.json b/tools/run_tests/generated/tests.json index 8d568daff05..6c2bd4718cc 100644 --- a/tools/run_tests/generated/tests.json +++ b/tools/run_tests/generated/tests.json @@ -26494,6 +26494,29 @@ ], "uses_polling": false }, + { + "args": [ + "test/core/end2end/fuzzers/client_fuzzer_corpus/error_refcount" + ], + "ci_platforms": [ + "linux" + ], + "cpu_cost": 0.1, + "exclude_configs": [ + "tsan" + ], + "exclude_iomgrs": [ + "uv" + ], + "flaky": false, + "language": "c", + "name": "client_fuzzer_one_entry", + "platforms": [ + "mac", + "linux" + ], + "uses_polling": false + }, { "args": [ "test/core/end2end/fuzzers/client_fuzzer_corpus/f03120d1a8376638e071735bf4746454b6ede389" From 3c5b02b17c0fb7bc485bfde1dcc9832147db4fb3 Mon Sep 17 00:00:00 2001 From: Esun Kim Date: Thu, 14 May 2020 17:42:18 -0700 Subject: [PATCH 757/758] Removed unnecessary commands --- .../dockerfile/grpc_artifact_python_manylinux2010_x64/Dockerfile | 1 - .../dockerfile/grpc_artifact_python_manylinux2010_x86/Dockerfile | 1 - 2 files changed, 2 deletions(-) diff --git a/tools/dockerfile/grpc_artifact_python_manylinux2010_x64/Dockerfile b/tools/dockerfile/grpc_artifact_python_manylinux2010_x64/Dockerfile index 1bb658b8e42..390ab453136 100644 --- a/tools/dockerfile/grpc_artifact_python_manylinux2010_x64/Dockerfile +++ b/tools/dockerfile/grpc_artifact_python_manylinux2010_x64/Dockerfile @@ -27,5 +27,4 @@ RUN /opt/python/cp27-cp27mu/bin/pip install --upgrade cython RUN /opt/python/cp35-cp35m/bin/pip install --upgrade cython RUN /opt/python/cp36-cp36m/bin/pip install --upgrade cython RUN /opt/python/cp37-cp37m/bin/pip install --upgrade cython -RUN /opt/python/cp37-cp37m/bin/pip install --upgrade cython RUN /opt/python/cp38-cp38/bin/pip install --upgrade cython diff --git a/tools/dockerfile/grpc_artifact_python_manylinux2010_x86/Dockerfile b/tools/dockerfile/grpc_artifact_python_manylinux2010_x86/Dockerfile index 61c901e2f9c..6e5e43315e7 100644 --- a/tools/dockerfile/grpc_artifact_python_manylinux2010_x86/Dockerfile +++ b/tools/dockerfile/grpc_artifact_python_manylinux2010_x86/Dockerfile @@ -27,5 +27,4 @@ RUN /opt/python/cp27-cp27mu/bin/pip install --upgrade cython RUN /opt/python/cp35-cp35m/bin/pip install --upgrade cython RUN /opt/python/cp36-cp36m/bin/pip install --upgrade cython RUN /opt/python/cp37-cp37m/bin/pip install --upgrade cython -RUN /opt/python/cp37-cp37m/bin/pip install --upgrade cython RUN /opt/python/cp38-cp38/bin/pip install --upgrade cython From 2ba3f8e7f9c10dd118863aeb6e5b1f4cc0020a0d Mon Sep 17 00:00:00 2001 From: "Mark D. Roth" Date: Fri, 15 May 2020 09:10:58 -0700 Subject: [PATCH 758/758] Trigger xds routing support via env var instead of channel arg. --- include/grpc/impl/codegen/grpc_types.h | 5 - .../ext/filters/client_channel/xds/xds_api.cc | 20 ++- .../ext/filters/client_channel/xds/xds_api.h | 2 +- .../filters/client_channel/xds/xds_client.cc | 12 +- .../filters/client_channel/xds/xds_client.h | 2 - test/cpp/end2end/xds_end2end_test.cc | 126 ++++++------------ 6 files changed, 62 insertions(+), 105 deletions(-) diff --git a/include/grpc/impl/codegen/grpc_types.h b/include/grpc/impl/codegen/grpc_types.h index d8ccb5063d6..9e75ccdeb21 100644 --- a/include/grpc/impl/codegen/grpc_types.h +++ b/include/grpc/impl/codegen/grpc_types.h @@ -359,11 +359,6 @@ typedef struct { * The default is 15 seconds. */ #define GRPC_ARG_XDS_RESOURCE_DOES_NOT_EXIST_TIMEOUT_MS \ "grpc.xds_resource_does_not_exist_timeout_ms" -/* If set, enable xds routing policy. This boolean argument is currently - * disabled by default; however, it will be changed to enabled by default - * once the functionality proves stable. This arg will eventually - * be removed completely. */ -#define GRPC_ARG_XDS_ROUTING_ENABLED "grpc.xds_routing_enabled" /** If non-zero, grpc server's cronet compression workaround will be enabled */ #define GRPC_ARG_WORKAROUND_CRONET_COMPRESSION \ "grpc.workaround.cronet_compression" diff --git a/src/core/ext/filters/client_channel/xds/xds_api.cc b/src/core/ext/filters/client_channel/xds/xds_api.cc index b4186088496..1a30c43bc7b 100644 --- a/src/core/ext/filters/client_channel/xds/xds_api.cc +++ b/src/core/ext/filters/client_channel/xds/xds_api.cc @@ -31,6 +31,8 @@ #include #include "src/core/ext/filters/client_channel/xds/xds_api.h" +#include "src/core/lib/gpr/env.h" +#include "src/core/lib/gpr/string.h" #include "src/core/lib/gpr/useful.h" #include "src/core/lib/iomgr/error.h" #include "src/core/lib/iomgr/sockaddr_utils.h" @@ -127,10 +129,23 @@ const char* XdsApi::kCdsTypeUrl = "type.googleapis.com/envoy.api.v2.Cluster"; const char* XdsApi::kEdsTypeUrl = "type.googleapis.com/envoy.api.v2.ClusterLoadAssignment"; +namespace { + +bool XdsRoutingEnabled() { + char* value = gpr_getenv("GRPC_XDS_EXPERIMENTAL_ROUTING"); + bool parsed_value; + bool parse_succeeded = gpr_parse_bool_value(value, &parsed_value); + gpr_free(value); + return parse_succeeded && parsed_value; +} + +} // namespace + XdsApi::XdsApi(XdsClient* client, TraceFlag* tracer, const XdsBootstrap::Node* node) : client_(client), tracer_(tracer), + xds_routing_enabled_(XdsRoutingEnabled()), node_(node), build_version_(absl::StrCat("gRPC C-core ", GPR_PLATFORM_STRING, " ", grpc_version_string())), @@ -1566,7 +1581,6 @@ grpc_error* EdsResponseParse( grpc_error* XdsApi::ParseAdsResponse( const grpc_slice& encoded_response, const std::string& expected_server_name, const std::string& expected_route_config_name, - const bool xds_routing_enabled, const std::set& expected_cluster_names, const std::set& expected_eds_service_names, absl::optional* lds_update, @@ -1598,10 +1612,10 @@ grpc_error* XdsApi::ParseAdsResponse( // Parse the response according to the resource type. if (*type_url == kLdsTypeUrl) { return LdsResponseParse(client_, tracer_, response, expected_server_name, - xds_routing_enabled, lds_update, arena.ptr()); + xds_routing_enabled_, lds_update, arena.ptr()); } else if (*type_url == kRdsTypeUrl) { return RdsResponseParse(client_, tracer_, response, expected_server_name, - expected_route_config_name, xds_routing_enabled, + expected_route_config_name, xds_routing_enabled_, rds_update, arena.ptr()); } else if (*type_url == kCdsTypeUrl) { return CdsResponseParse(client_, tracer_, response, expected_cluster_names, diff --git a/src/core/ext/filters/client_channel/xds/xds_api.h b/src/core/ext/filters/client_channel/xds/xds_api.h index cb77cb0bc45..4fa7b2bed31 100644 --- a/src/core/ext/filters/client_channel/xds/xds_api.h +++ b/src/core/ext/filters/client_channel/xds/xds_api.h @@ -271,7 +271,6 @@ class XdsApi { const grpc_slice& encoded_response, const std::string& expected_server_name, const std::string& expected_route_config_name, - const bool xds_routing_enabled, const std::set& expected_cluster_names, const std::set& expected_eds_service_names, absl::optional* lds_update, @@ -296,6 +295,7 @@ class XdsApi { private: XdsClient* client_; TraceFlag* tracer_; + const bool xds_routing_enabled_; const XdsBootstrap::Node* node_; const std::string build_version_; const std::string user_agent_name_; diff --git a/src/core/ext/filters/client_channel/xds/xds_client.cc b/src/core/ext/filters/client_channel/xds/xds_client.cc index 49537dab8a2..d6f519f7ba5 100644 --- a/src/core/ext/filters/client_channel/xds/xds_client.cc +++ b/src/core/ext/filters/client_channel/xds/xds_client.cc @@ -1245,9 +1245,9 @@ void XdsClient::ChannelState::AdsCallState::OnResponseReceivedLocked() { (xds_client()->lds_result_.has_value() ? xds_client()->lds_result_->route_config_name : ""), - xds_client()->xds_routing_enabled_, ClusterNamesForRequest(), - EdsServiceNamesForRequest(), &lds_update, &rds_update, &cds_update_map, - &eds_update_map, &version, &nonce, &type_url); + ClusterNamesForRequest(), EdsServiceNamesForRequest(), &lds_update, + &rds_update, &cds_update_map, &eds_update_map, &version, &nonce, + &type_url); grpc_slice_unref_internal(response_slice); if (type_url.empty()) { // Ignore unparsable response. @@ -1802,11 +1802,6 @@ grpc_millis GetRequestTimeout(const grpc_channel_args& args) { {15000, 0, INT_MAX}); } -bool GetXdsRoutingEnabled(const grpc_channel_args& args) { - return grpc_channel_args_find_bool(&args, GRPC_ARG_XDS_ROUTING_ENABLED, - false); -} - } // namespace XdsClient::XdsClient(std::shared_ptr work_serializer, @@ -1816,7 +1811,6 @@ XdsClient::XdsClient(std::shared_ptr work_serializer, const grpc_channel_args& channel_args, grpc_error** error) : InternallyRefCounted(&grpc_xds_client_trace), request_timeout_(GetRequestTimeout(channel_args)), - xds_routing_enabled_(GetXdsRoutingEnabled(channel_args)), work_serializer_(std::move(work_serializer)), interested_parties_(interested_parties), bootstrap_( diff --git a/src/core/ext/filters/client_channel/xds/xds_client.h b/src/core/ext/filters/client_channel/xds/xds_client.h index f5386e100dc..133e99c4918 100644 --- a/src/core/ext/filters/client_channel/xds/xds_client.h +++ b/src/core/ext/filters/client_channel/xds/xds_client.h @@ -258,8 +258,6 @@ class XdsClient : public InternallyRefCounted { const grpc_millis request_timeout_; - const bool xds_routing_enabled_; - std::shared_ptr work_serializer_; grpc_pollset_set* interested_parties_; diff --git a/test/cpp/end2end/xds_end2end_test.cc b/test/cpp/end2end/xds_end2end_test.cc index 4a1841976fe..5f245fffc87 100644 --- a/test/cpp/end2end/xds_end2end_test.cc +++ b/test/cpp/end2end/xds_end2end_test.cc @@ -1177,8 +1177,7 @@ class XdsEnd2endTest : public ::testing::TestWithParam { void ResetStub(int failover_timeout = 0, const grpc::string& expected_targets = "", - int xds_resource_does_not_exist_timeout = 0, - bool xds_routing_enabled = false) { + int xds_resource_does_not_exist_timeout = 0) { ChannelArguments args; if (failover_timeout > 0) { args.SetInt(GRPC_ARG_PRIORITY_FAILOVER_TIMEOUT_MS, failover_timeout); @@ -1187,9 +1186,6 @@ class XdsEnd2endTest : public ::testing::TestWithParam { args.SetInt(GRPC_ARG_XDS_RESOURCE_DOES_NOT_EXIST_TIMEOUT_MS, xds_resource_does_not_exist_timeout); } - if (xds_routing_enabled) { - args.SetInt(GRPC_ARG_XDS_ROUTING_ENABLED, 1); - } // If the parent channel is using the fake resolver, we inject the // response generator for the parent here, and then SetNextResolution() // will inject the xds channel's response generator via the parent's @@ -2372,10 +2368,7 @@ TEST_P(LdsRdsTest, RouteMatchHasNonemptyPrefix) { // Tests that LDS client should send a NACK if route match has a prefix // string with no "/". TEST_P(LdsRdsTest, RouteMatchHasInvalidPrefixNonEmptyNoSlash) { - ResetStub(/*failover_timeout=*/0, - /*expected_targets=*/"", - /*xds_resource_does_not_exist_timeout*/ 0, - /*xds_routing_enabled=*/true); + gpr_setenv("GRPC_XDS_EXPERIMENTAL_ROUTING", "true"); RouteConfiguration route_config = balancers_[0]->ads_service()->default_route_config(); auto* route1 = route_config.mutable_virtual_hosts(0)->mutable_routes(0); @@ -2390,15 +2383,13 @@ TEST_P(LdsRdsTest, RouteMatchHasInvalidPrefixNonEmptyNoSlash) { const auto& response_state = RouteConfigurationResponseState(0); EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED); EXPECT_EQ(response_state.error_message, "Prefix does not start with a /"); + gpr_unsetenv("GRPC_XDS_EXPERIMENTAL_ROUTING"); } // Tests that LDS client should send a NACK if route match has a prefix // string does not end with "/". TEST_P(LdsRdsTest, RouteMatchHasInvalidPrefixNoEndingSlash) { - ResetStub(/*failover_timeout=*/0, - /*expected_targets=*/"", - /*xds_resource_does_not_exist_timeout*/ 0, - /*xds_routing_enabled=*/true); + gpr_setenv("GRPC_XDS_EXPERIMENTAL_ROUTING", "true"); RouteConfiguration route_config = balancers_[0]->ads_service()->default_route_config(); auto* route1 = route_config.mutable_virtual_hosts(0)->mutable_routes(0); @@ -2411,15 +2402,13 @@ TEST_P(LdsRdsTest, RouteMatchHasInvalidPrefixNoEndingSlash) { EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED); EXPECT_EQ(response_state.error_message, "Prefix not in the required format of /service/"); + gpr_unsetenv("GRPC_XDS_EXPERIMENTAL_ROUTING"); } // Tests that LDS client should send a NACK if route match has a prefix // string does not start with "/". TEST_P(LdsRdsTest, RouteMatchHasInvalidPrefixNoLeadingSlash) { - ResetStub(/*failover_timeout=*/0, - /*expected_targets=*/"", - /*xds_resource_does_not_exist_timeout*/ 0, - /*xds_routing_enabled=*/true); + gpr_setenv("GRPC_XDS_EXPERIMENTAL_ROUTING", "true"); RouteConfiguration route_config = balancers_[0]->ads_service()->default_route_config(); auto* route1 = route_config.mutable_virtual_hosts(0)->mutable_routes(0); @@ -2431,15 +2420,13 @@ TEST_P(LdsRdsTest, RouteMatchHasInvalidPrefixNoLeadingSlash) { const auto& response_state = RouteConfigurationResponseState(0); EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED); EXPECT_EQ(response_state.error_message, "Prefix does not start with a /"); + gpr_unsetenv("GRPC_XDS_EXPERIMENTAL_ROUTING"); } // Tests that LDS client should send a NACK if route match has a prefix // string with extra content outside of "/service/". TEST_P(LdsRdsTest, RouteMatchHasInvalidPrefixExtraContent) { - ResetStub(/*failover_timeout=*/0, - /*expected_targets=*/"", - /*xds_resource_does_not_exist_timeout*/ 0, - /*xds_routing_enabled=*/true); + gpr_setenv("GRPC_XDS_EXPERIMENTAL_ROUTING", "true"); RouteConfiguration route_config = balancers_[0]->ads_service()->default_route_config(); auto* route1 = route_config.mutable_virtual_hosts(0)->mutable_routes(0); @@ -2451,15 +2438,13 @@ TEST_P(LdsRdsTest, RouteMatchHasInvalidPrefixExtraContent) { const auto& response_state = RouteConfigurationResponseState(0); EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED); EXPECT_EQ(response_state.error_message, "Prefix does not end with a /"); + gpr_unsetenv("GRPC_XDS_EXPERIMENTAL_ROUTING"); } // Tests that LDS client should send a NACK if route match has a prefix // string "//". TEST_P(LdsRdsTest, RouteMatchHasInvalidPrefixNoContent) { - ResetStub(/*failover_timeout=*/0, - /*expected_targets=*/"", - /*xds_resource_does_not_exist_timeout*/ 0, - /*xds_routing_enabled=*/true); + gpr_setenv("GRPC_XDS_EXPERIMENTAL_ROUTING", "true"); RouteConfiguration route_config = balancers_[0]->ads_service()->default_route_config(); auto* route1 = route_config.mutable_virtual_hosts(0)->mutable_routes(0); @@ -2471,15 +2456,13 @@ TEST_P(LdsRdsTest, RouteMatchHasInvalidPrefixNoContent) { const auto& response_state = RouteConfigurationResponseState(0); EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED); EXPECT_EQ(response_state.error_message, "Prefix contains empty service name"); + gpr_unsetenv("GRPC_XDS_EXPERIMENTAL_ROUTING"); } // Tests that LDS client should send a NACK if route match has path // but it's empty. TEST_P(LdsRdsTest, RouteMatchHasInvalidPathEmptyPath) { - ResetStub(/*failover_timeout=*/0, - /*expected_targets=*/"", - /*xds_resource_does_not_exist_timeout*/ 0, - /*xds_routing_enabled=*/true); + gpr_setenv("GRPC_XDS_EXPERIMENTAL_ROUTING", "true"); RouteConfiguration route_config = balancers_[0]->ads_service()->default_route_config(); auto* route1 = route_config.mutable_virtual_hosts(0)->mutable_routes(0); @@ -2494,15 +2477,13 @@ TEST_P(LdsRdsTest, RouteMatchHasInvalidPathEmptyPath) { const auto& response_state = RouteConfigurationResponseState(0); EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED); EXPECT_EQ(response_state.error_message, "Path if set cannot be empty"); + gpr_unsetenv("GRPC_XDS_EXPERIMENTAL_ROUTING"); } // Tests that LDS client should send a NACK if route match has path // string does not start with "/". TEST_P(LdsRdsTest, RouteMatchHasInvalidPathNoLeadingSlash) { - ResetStub(/*failover_timeout=*/0, - /*expected_targets=*/"", - /*xds_resource_does_not_exist_timeout*/ 0, - /*xds_routing_enabled=*/true); + gpr_setenv("GRPC_XDS_EXPERIMENTAL_ROUTING", "true"); RouteConfiguration route_config = balancers_[0]->ads_service()->default_route_config(); auto* route1 = route_config.mutable_virtual_hosts(0)->mutable_routes(0); @@ -2517,15 +2498,13 @@ TEST_P(LdsRdsTest, RouteMatchHasInvalidPathNoLeadingSlash) { const auto& response_state = RouteConfigurationResponseState(0); EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED); EXPECT_EQ(response_state.error_message, "Path does not start with a /"); + gpr_unsetenv("GRPC_XDS_EXPERIMENTAL_ROUTING"); } // Tests that LDS client should send a NACK if route match has path // string that ends with "/". TEST_P(LdsRdsTest, RouteMatchHasInvalidPathEndsWithSlash) { - ResetStub(/*failover_timeout=*/0, - /*expected_targets=*/"", - /*xds_resource_does_not_exist_timeout*/ 0, - /*xds_routing_enabled=*/true); + gpr_setenv("GRPC_XDS_EXPERIMENTAL_ROUTING", "true"); RouteConfiguration route_config = balancers_[0]->ads_service()->default_route_config(); auto* route1 = route_config.mutable_virtual_hosts(0)->mutable_routes(0); @@ -2541,15 +2520,13 @@ TEST_P(LdsRdsTest, RouteMatchHasInvalidPathEndsWithSlash) { EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED); EXPECT_EQ(response_state.error_message, "Path not in the required format of /service/method"); + gpr_unsetenv("GRPC_XDS_EXPERIMENTAL_ROUTING"); } // Tests that LDS client should send a NACK if route match has path // string that misses "/" between service and method. TEST_P(LdsRdsTest, RouteMatchHasInvalidPathMissingMiddleSlash) { - ResetStub(/*failover_timeout=*/0, - /*expected_targets=*/"", - /*xds_resource_does_not_exist_timeout*/ 0, - /*xds_routing_enabled=*/true); + gpr_setenv("GRPC_XDS_EXPERIMENTAL_ROUTING", "true"); RouteConfiguration route_config = balancers_[0]->ads_service()->default_route_config(); auto* route1 = route_config.mutable_virtual_hosts(0)->mutable_routes(0); @@ -2565,15 +2542,13 @@ TEST_P(LdsRdsTest, RouteMatchHasInvalidPathMissingMiddleSlash) { EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED); EXPECT_EQ(response_state.error_message, "Path not in the required format of /service/method"); + gpr_unsetenv("GRPC_XDS_EXPERIMENTAL_ROUTING"); } // Tests that LDS client should send a NACK if route match has path // string that is missing service. TEST_P(LdsRdsTest, RouteMatchHasInvalidPathMissingService) { - ResetStub(/*failover_timeout=*/0, - /*expected_targets=*/"", - /*xds_resource_does_not_exist_timeout*/ 0, - /*xds_routing_enabled=*/true); + gpr_setenv("GRPC_XDS_EXPERIMENTAL_ROUTING", "true"); RouteConfiguration route_config = balancers_[0]->ads_service()->default_route_config(); auto* route1 = route_config.mutable_virtual_hosts(0)->mutable_routes(0); @@ -2588,15 +2563,13 @@ TEST_P(LdsRdsTest, RouteMatchHasInvalidPathMissingService) { const auto& response_state = RouteConfigurationResponseState(0); EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED); EXPECT_EQ(response_state.error_message, "Path contains empty service name"); + gpr_unsetenv("GRPC_XDS_EXPERIMENTAL_ROUTING"); } // Tests that LDS client should send a NACK if route match has path // string that is missing method. TEST_P(LdsRdsTest, RouteMatchHasInvalidPathMissingMethod) { - ResetStub(/*failover_timeout=*/0, - /*expected_targets=*/"", - /*xds_resource_does_not_exist_timeout*/ 0, - /*xds_routing_enabled=*/true); + gpr_setenv("GRPC_XDS_EXPERIMENTAL_ROUTING", "true"); RouteConfiguration route_config = balancers_[0]->ads_service()->default_route_config(); auto* route1 = route_config.mutable_virtual_hosts(0)->mutable_routes(0); @@ -2611,6 +2584,7 @@ TEST_P(LdsRdsTest, RouteMatchHasInvalidPathMissingMethod) { const auto& response_state = RouteConfigurationResponseState(0); EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED); EXPECT_EQ(response_state.error_message, "Path contains empty method name"); + gpr_unsetenv("GRPC_XDS_EXPERIMENTAL_ROUTING"); } // Tests that LDS client should send a NACK if route has an action other than @@ -2649,10 +2623,7 @@ TEST_P(LdsRdsTest, RouteActionUnsupportedClusterSpecifier) { } TEST_P(LdsRdsTest, RouteActionClusterHasEmptyClusterName) { - ResetStub(/*failover_timeout=*/0, - /*expected_targets=*/"", - /*xds_resource_does_not_exist_timeout*/ 0, - /*xds_routing_enabled=*/true); + gpr_setenv("GRPC_XDS_EXPERIMENTAL_ROUTING", "true"); RouteConfiguration route_config = balancers_[0]->ads_service()->default_route_config(); auto* route1 = route_config.mutable_virtual_hosts(0)->mutable_routes(0); @@ -2669,13 +2640,11 @@ TEST_P(LdsRdsTest, RouteActionClusterHasEmptyClusterName) { EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED); EXPECT_EQ(response_state.error_message, "RouteAction cluster contains empty cluster name."); + gpr_unsetenv("GRPC_XDS_EXPERIMENTAL_ROUTING"); } TEST_P(LdsRdsTest, RouteActionWeightedTargetHasIncorrectTotalWeightSet) { - ResetStub(/*failover_timeout=*/0, - /*expected_targets=*/"", - /*xds_resource_does_not_exist_timeout*/ 0, - /*xds_routing_enabled=*/true); + gpr_setenv("GRPC_XDS_EXPERIMENTAL_ROUTING", "true"); const size_t kWeight75 = 75; const char* kNewCluster1Name = "new_cluster_1"; RouteConfiguration route_config = @@ -2701,13 +2670,11 @@ TEST_P(LdsRdsTest, RouteActionWeightedTargetHasIncorrectTotalWeightSet) { EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED); EXPECT_EQ(response_state.error_message, "RouteAction weighted_cluster has incorrect total weight"); + gpr_unsetenv("GRPC_XDS_EXPERIMENTAL_ROUTING"); } TEST_P(LdsRdsTest, RouteActionWeightedTargetClusterHasEmptyClusterName) { - ResetStub(/*failover_timeout=*/0, - /*expected_targets=*/"", - /*xds_resource_does_not_exist_timeout*/ 0, - /*xds_routing_enabled=*/true); + gpr_setenv("GRPC_XDS_EXPERIMENTAL_ROUTING", "true"); const size_t kWeight75 = 75; RouteConfiguration route_config = balancers_[0]->ads_service()->default_route_config(); @@ -2733,13 +2700,11 @@ TEST_P(LdsRdsTest, RouteActionWeightedTargetClusterHasEmptyClusterName) { EXPECT_EQ( response_state.error_message, "RouteAction weighted_cluster cluster contains empty cluster name."); + gpr_unsetenv("GRPC_XDS_EXPERIMENTAL_ROUTING"); } TEST_P(LdsRdsTest, RouteActionWeightedTargetClusterHasNoWeight) { - ResetStub(/*failover_timeout=*/0, - /*expected_targets=*/"", - /*xds_resource_does_not_exist_timeout*/ 0, - /*xds_routing_enabled=*/true); + gpr_setenv("GRPC_XDS_EXPERIMENTAL_ROUTING", "true"); const size_t kWeight75 = 75; const char* kNewCluster1Name = "new_cluster_1"; RouteConfiguration route_config = @@ -2764,6 +2729,7 @@ TEST_P(LdsRdsTest, RouteActionWeightedTargetClusterHasNoWeight) { EXPECT_EQ(response_state.state, AdsServiceImpl::ResponseState::NACKED); EXPECT_EQ(response_state.error_message, "RouteAction weighted_cluster cluster missing weight"); + gpr_unsetenv("GRPC_XDS_EXPERIMENTAL_ROUTING"); } // Tests that LDS client times out when no response received. @@ -2782,10 +2748,7 @@ TEST_P(LdsRdsTest, Timeout) { // Tests that LDS client should choose the default route (with no matching // specified) after unable to find a match with previous routes. TEST_P(LdsRdsTest, XdsRoutingPathMatching) { - ResetStub(/*failover_timeout=*/0, - /*expected_targets=*/"", - /*xds_resource_does_not_exist_timeout*/ 0, - /*xds_routing_enabled=*/true); + gpr_setenv("GRPC_XDS_EXPERIMENTAL_ROUTING", "true"); const char* kNewCluster1Name = "new_cluster_1"; const char* kNewCluster2Name = "new_cluster_2"; const size_t kNumEcho1Rpcs = 10; @@ -2855,13 +2818,11 @@ TEST_P(LdsRdsTest, XdsRoutingPathMatching) { EXPECT_EQ(0, backends_[3]->backend_service()->request_count()); EXPECT_EQ(0, backends_[3]->backend_service1()->request_count()); EXPECT_EQ(kNumEcho2Rpcs, backends_[3]->backend_service2()->request_count()); + gpr_unsetenv("GRPC_XDS_EXPERIMENTAL_ROUTING"); } TEST_P(LdsRdsTest, XdsRoutingPrefixMatching) { - ResetStub(/*failover_timeout=*/0, - /*expected_targets=*/"", - /*xds_resource_does_not_exist_timeout*/ 0, - /*xds_routing_enabled=*/true); + gpr_setenv("GRPC_XDS_EXPERIMENTAL_ROUTING", "true"); const char* kNewCluster1Name = "new_cluster_1"; const char* kNewCluster2Name = "new_cluster_2"; const size_t kNumEcho1Rpcs = 10; @@ -2926,13 +2887,11 @@ TEST_P(LdsRdsTest, XdsRoutingPrefixMatching) { EXPECT_EQ(0, backends_[3]->backend_service()->request_count()); EXPECT_EQ(0, backends_[3]->backend_service1()->request_count()); EXPECT_EQ(kNumEcho2Rpcs, backends_[3]->backend_service2()->request_count()); + gpr_unsetenv("GRPC_XDS_EXPERIMENTAL_ROUTING"); } TEST_P(LdsRdsTest, XdsRoutingWeightedCluster) { - ResetStub(/*failover_timeout=*/0, - /*expected_targets=*/"", - /*xds_resource_does_not_exist_timeout*/ 0, - /*xds_routing_enabled=*/true); + gpr_setenv("GRPC_XDS_EXPERIMENTAL_ROUTING", "true"); const char* kNewCluster1Name = "new_cluster_1"; const char* kNewCluster2Name = "new_cluster_2"; const size_t kNumEcho1Rpcs = 1000; @@ -3009,13 +2968,11 @@ TEST_P(LdsRdsTest, XdsRoutingWeightedCluster) { (1 - kErrorTolerance)), ::testing::Le(kNumEcho1Rpcs * kWeight25 / 100 * (1 + kErrorTolerance)))); + gpr_unsetenv("GRPC_XDS_EXPERIMENTAL_ROUTING"); } TEST_P(LdsRdsTest, XdsRoutingWeightedClusterUpdateWeights) { - ResetStub(/*failover_timeout=*/0, - /*expected_targets=*/"", - /*xds_resource_does_not_exist_timeout*/ 0, - /*xds_routing_enabled=*/true); + gpr_setenv("GRPC_XDS_EXPERIMENTAL_ROUTING", "true"); const char* kNewCluster1Name = "new_cluster_1"; const char* kNewCluster2Name = "anew_cluster_2"; const char* kNewCluster3Name = "new_cluster_3"; @@ -3137,13 +3094,11 @@ TEST_P(LdsRdsTest, XdsRoutingWeightedClusterUpdateWeights) { (1 - kErrorTolerance)), ::testing::Le(kNumEcho1Rpcs * kWeight50 / 100 * (1 + kErrorTolerance)))); + gpr_unsetenv("GRPC_XDS_EXPERIMENTAL_ROUTING"); } TEST_P(LdsRdsTest, XdsRoutingWeightedClusterUpdateClusters) { - ResetStub(/*failover_timeout=*/0, - /*expected_targets=*/"", - /*xds_resource_does_not_exist_timeout*/ 0, - /*xds_routing_enabled=*/true); + gpr_setenv("GRPC_XDS_EXPERIMENTAL_ROUTING", "true"); const char* kNewCluster1Name = "new_cluster_1"; const char* kNewCluster2Name = "anew_cluster_2"; const char* kNewCluster3Name = "new_cluster_3"; @@ -3290,6 +3245,7 @@ TEST_P(LdsRdsTest, XdsRoutingWeightedClusterUpdateClusters) { (1 - kErrorTolerance)), ::testing::Le(kNumEcho1Rpcs * kWeight25 / 100 * (1 + kErrorTolerance)))); + gpr_unsetenv("GRPC_XDS_EXPERIMENTAL_ROUTING"); } using CdsTest = BasicTest;